M EQU Byte Ptr 0[BX] TITLE 'EPSPRTR.A86' ; ; USE ASM86 TO ASSEMBLE ; THEN GENCMD EPSPRTR 8080 ; ;*********************************************************** ; * ; EPSPRTR is a menu-driven utility to set printer op- * ; tions for MX printers with Graftrax +. This program * ; is derived from the October 1983 Microsystems article * ; "Write a Menu-Driven Utility to Set Printer Options" * ; written by Robert L. LaFara of Castle Oaks Computer * ; Services, Indianapolis, IN. Assemble with MAC or ASM. * ; * ; ------------------------------------------------------ * ; * ; Version 1.1 by David J. Raibert, December 3, 1983 * ; XLT86 translation by Steve Leon, March 16, 1984 * ;*********************************************************** ;SET EQUATES FOR CP/M BDOS FUNCTION & CALLS CONOUT EQU 2 ;OUTPUT TO CONSOLE BDOS EQU 5 LST EQU 5 ;OUTPUT TO THE LST: DEVICE CONDIR EQU 6 ;DIRECT INPUT FROM THE CONSOLE PRTSTR EQU 9 ;OUTPUT A STRING TO THE CONSOLE ;SET EQUATES FOR CONTROL CODE ;(NON ESCAPE SEQUENCE) OUTPUTS LF EQU 8AH ;LINE FEED TOF EQU 0CH ;FORM FEED CR EQU 0DH ;CARRIAGE RETURN SM EQU 8FH ;COMPRESSED PRINT DC2 EQU 92H ;TURN OFF COMPRESSED PRINT ESC EQU 1BH ;ESCAPE CHARACTER ;INITIALIZE PROGRAM & SET STACK COUNTER ORG 100H MOV SP,(Offset STACK) ;SET STACK COUNTER ;PRINT THE MENU MENU: MOV CL,PRTSTR ;PREPARE BDOS TO OUTPUT MENU STRING MOV DX,(Offset MENDAT) ;POINT TO BEGINNING OF MENU STRING INT 224 ;PRINT THE MENU STRING ;INPUT THE CHARACTER FROM THE MENU ;STORE IT, ECHO IT TO CONSOLE CHARIN: MOV CL,CONDIR ;PREPARE BDOS MOV DL,0FFH ; FOR DIRECT CON- INT 224 ; SOLE INPUT CMP AL,0 ;CHARACTER RECEIVED? JZ CHARIN ;IF NOT, LOOP BACK AND TRY AGAIN MOV Byte Ptr CHAR,AL ;SAVE IT FOR LATER MOV CL,CONOUT ;ECHO MOV DL,AL ; IT TO INT 224 ; CONSOLE ;TEST FOR MENU OPTION SELECTED & JUMP TO ES- ;CAPE OR CONTROL CODE. OTHER CHARACTERS CAN ;BE USED IF < + ^ > OR @ ARE NOT AVAILABLE MOV AL,Byte Ptr CHAR ;GET OPTION CHARACTER STORED AT CHAR: CMP AL,'3' ;3 LINES PER INCH JNZ L_1 JMP V3 L_1: CMP AL,'4' ;4 LINES PER INCH JNZ L_2 JMP V4 L_2: CMP AL,'6' ;6 LINES PER INCH JNZ L_3 JMP V6 L_3: CMP AL,'8' ;8 LINES PER INCH JNZ L_4 JMP V8 L_4: CMP AL,'>' ;CANCEL COMPRESSED JNZ L_5 JMP CANCEL L_5: CMP AL,'<' ;CANCEL DOUBLE WIDTH JNZ L_6 JMP VV L_6: CMP AL,'^' ;CANCEL UNDERLINE JNZ L_7 JMP VM L_7: CMP AL,'@' ;RESET TO POWER UP INCL TOF JNZ L_8 JMP V@ L_8: CMP AL,'+' ;CANCEL UNIDIRECTIONAL JNZ L_9 JMP VB L_9: AND AL,5FH ;DISCARD LOWER CASE BIT CMP AL,'F' ;FORM FEED JNZ L_10 JMP FMFD L_10: CMP AL,'K' ;SKIP OVER PERF JNZ L_11 JMP VK L_11: CMP AL,'L' ;LINE FEED JNZ L_12 JMP LINEF L_12: CMP AL,'C' ;COMPRESSED PRINT JNZ L_13 JMP CPRD L_13: CMP AL,'W' ;DOUBLE WIDTH JNZ L_14 JMP VW L_14: ;DO NOT IMPLEMENT ITALICS OR SUBSCRIPT IF ; GRAFTRAX+ IS NOT INSTALLED IN THE PRINTER CMP AL,'I' ;ITALICS JZ VI CMP AL,'J' ;CANCEL ITALICS JZ VJ CMP AL,'S' ;SUBSCRIPT JZ VS CMP AL,'R' ;CANCEL SUBSCRIPT JZ VR CMP AL,'D' ;DOUBLESTRIKE JNZ L_15 JMP VD L_15: CMP AL,'H' ;CANCEL DOUBLESTRIKE & SUBSCRIPT JNZ L_16 JMP VH L_16: CMP AL,'E' ;EMPHASIZED JNZ L_17 JMP VE L_17: CMP AL,'Z' ;CANCEL EMPHASIZED JNZ L_18 JMP VZ L_18: CMP AL,'U' ;UNDERLINE JNZ L_19 JMP VU L_19: CMP AL,'V' ;UNIDIRECTIONAL JNZ L_20 JMP VA L_20: CMP AL,'Q' ;QUIT JNZ L_21 JMP QUIT L_21: CMP AL,'T' ;TEST JNZ L_22 JMP TES L_22: ;PRINT ERROR MESSAGE MOV CL,PRTSTR ;PREPARE BDOS TO OUTPUT THE ERROR ;MESSAGE STRING MOV DX,(Offset ERRMSG) ;POINT TO ERROR MESSAGE INT 224 ;PRINT IT AND JMP MENU ; GO BACK TO MENU ;STORE ESCAPE CODES FOR PROCESSING AT ;LABEL VERT:, JUMP TO SET UP ESCAPE STRING. ;NOTE THAT SINCE ESCAPE CODES ARE VARIABLE ;IN LENGTH, E. G. [ESC 'T'][ESC 'A'18], ;SINGLE ESCAPE CODES ARE PADDED WITH A '$'. V3: MOV AL,'A' ;ESC 'A' 24 (/72nds) MOV CH,24 ;3 LINES PER INCH JMP VERT V4: MOV AL,'A' ;ESC 'A' 18 (/72nds) MOV CH,18 ;4 LINES PER INCH JMPS VERT V6: MOV AL,'2' ;ESC '2' MOV CH,'$' ;RESET TO 6 LINES PER INCH JMPS VERT V8: MOV AL,'0' ;ESC 'A' 0 MOV CH,'$' ;SET FOR 8 LINES PER INCH JMPS VERT VK: MOV AL,'N' ;ESC 'N' 6 MOV CH,06 ;SET SKIP OVER PERF - 6 LINES JMPS VERT VI: MOV AL,'4' ;ESC '4' MOV CH,'$' ;ITALICS JMPS VERT VJ: MOV AL,'5' ;ESC '5' MOV CH,'$' ;CANCEL ITALICS JMPS VERT VS: MOV AL,'S' ;ESC 'S' 1 MOV CH,01 ;SUBSCRIPT JMPS VERT VR: MOV AL,'T' ;ESC 'T' MOV CH,'$' ;CANCEL SUBSCRIPT & UNIDIRECTIONAL JMPS VERT VW: MOV AL,'W' ;ESC 'W' 1 MOV CH,01 ;DOUBLE WIDTH JMPS VERT VV: MOV AL,'W' ;ESC 'W' 0 MOV CH,00 ;CANCEL DOUBLE WIDTH JMPS VERT VD: MOV AL,'G' ;ESC 'G' MOV CH,'$' ;DOUBLESTRIKE JMPS VERT VH: MOV AL,'H' ;ESC 'H' MOV CH,'$' ;CANCEL DOUBLESTRIKE & SUBSCRIPT JMPS VERT VE: MOV AL,'E' ;ESC 'E' MOV CH,'$' ;EMPHASIZED JMPS VERT VZ: MOV AL,'F' ;ESC 'F' MOV CH,'$' ;CANCEL EMPHASIZED JMPS VERT VU: MOV AL,'-' ;UNDERLINE MOV CH,01 JMPS VERT VM: MOV AL,'-' ;CANCEL UNDERLINE MOV CH,00 JMPS VERT VA: MOV AL,'U' ;UNIDIRECTIONAL MOV CH,01 JMPS VERT VB: MOV AL,'U' ;CANCEL UNIDIRECTIONAL MOV CH,00 V@: MOV AL,'@' ;ESC '@' MOV CH,'$' ;RESET ALL JMPS VERT ;STORE ESCAPE SEQUENCE CODE CHARACTERS AT ;LABEL VSTR: FOR LATER OUTPUT THRU TEST1 VERT: MOV Byte Ptr VSTR+1,AL ;STORE 1st ESCAPE CHARACTER ;ESC (1BH) IS PROVIDED AT VSTR + 0 MOV AL,CH ;STORE 2nd CHARACTER OR THE MOV Byte Ptr VSTR+2,AL ; PADDING '$' TERMINATOR MOV AL,'$' ;HERE IS THE OTHER '$' YOU MAY NEED MOV Byte Ptr VSTR+3,AL ; TERMINATE THE ESCAPE STRING MOV BX,(Offset VSTR) ;SET PC TO ESCAPE SEQUENCE STRING JMPS TES1 ;TEST FOR CHARACTERS & TERMINATOR ;SET UP CONTROL CODES FOR OUTPUT LINEF: MOV DL,LF ;LINE FEED JMPS OUTPUT FMFD: MOV DL,TOF ;FORM FEED JMPS OUTPUT CPRD: MOV DL,SM ;COMPRESSED JMPS OUTPUT CANCEL: MOV DL,DC2 ;CANCEL COMPRESSED JMPS OUTPUT ;OUTPUT CONTROL CODES TO PRINTER OUTPUT: MOV CL,LST ;PREPARE BDOS TO OUTPUT TO LST: INT 224 ; MOVE CHARACTER OUT TO PRINTER MOV DL,CR ;DUMP THE PRINTER INT 224 ; BUFFER (EMPTY IT WITH ) JMP MENU ;GO BACK TO THE MENU FOR ANOTHER TES: MOV BX,(Offset TSTR) ;POINT TO THE BEGINNING OF THE ;PRINTER TEST STRING ;THE ESCAPE CODES ARE PROCESSED HERE TES1: MOV Word Ptr INDEX,BX ;STORE THE V-STRING ADDRESS INTO STORAGE MOV DL,M ;PUT CHARACTER TO PRINT INTO E FOR OUTPUT MOV AL,DL ;MOVE CHAR INTO REG 'A' TO LOOK FOR '$' CMP AL,'$' ;IS IT STRING TERMINATOR '$'? JNZ L_23 JMP MENU ;IF SO, END TEST AND GOTO MENU L_23: MOV CL,LST ;PRINT INT 224 ; CHARACTER MOV BX,Word Ptr INDEX ;GO BACK TO STORAGE FOR STRING ADDRESS INC BX ;INCREMENT PC TO NEXT CHARACTER JMPS TES1 ;PRINT IT QUIT: MOV CL,0 ;BACK TO INT 224 ; OPERATING SYSTEM ;SET UP MENU TABLE AND STRING OUTPUT DATA MENDAT DB CR,LF,'PRINTER OPTIONS MENU',CR,LF,LF DB ' 3 = THREE (3) LINES PER INCH 4 = FOUR (4) LINES',CR,LF DB ' 8 = EIGHT (8) LINES PER INCH 6 = RESET LINES',CR,LF,LF DB ' F = FORM FEED L = LINE FEED',CR,LF DB ' K = SKIP (SIX) OVER PERF',CR,LF DB ' TO CANCEL OPTION',CR,LF DB ' C = COMPRESSED PRINT-17 CPI ## >',CR,LF DB ' W = DOUBLE WIDTH-5 CPI (+C=8.5) <',CR,LF DB ' I = ITALICS J',CR,LF DB ' S = FINE PRINT## R & H',CR,LF DB ' D = DOUBLESTRIKE H',CR,LF DB ' E = EMPHASIZED** Z',CR,LF DB ' U = UNDERLINE ^',CR,LF DB ' V = UNIDIRECTIONAL L ->R +',CR,LF DB ' @ = RESET TO POWER-UP INCL TOF',CR,LF DB '** > DO NOT USE WITH "C" OR "S" SEE ## ABOVE',CR,LF,LF DB ' T = TEST PRINTER Q = QUIT',CR,LF,LF DB 'ENTER OPTION ','$' ERRMSG DB CR,LF,'NO SUCH OPTION - TRY AGAIN!' DB CR,LF,'$' VSTR DB ESC ;PROVIDE THE 1B HEX CHARACTER HERE RS 3 ;RESERVE SPACE FOR THE NEXT 2 OR 3 TSTR DB CR,LF,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',CR,LF DB 'abcdefghijklmnopqrstuvwxyz',CR,LF DB '1234567890-=`!@#%^&*()_+~',CR,LF DB '[]\|/;:''"{},.?<>',CR,LF,'$' ;RESERVE MEMORY FOR DATA AND STACK CHAR RS 1 ;RESERVE MEMORY FOR INPUT ;OF THE OPTION CHARACTER INDEX RS 2 ;RESERVE MEMORY FOR "VSTR" ;ADRESS WHEN STORED AT TES1 RS 32 ;DEFINE STACK - 16 LEVEL STACK: ;TOP OF STACK END