; Printer Setup Utility for Okidata 92 ; Written by R. Dreas Nielsen ; History -- ; Version Date Updates ; ------- ------ --------- ; 1.0 4/26/85 Off the ground ; 1.1 4/30/85 Added 'italics on' toggle ; ; VERS EQU 11 ; ; SYSLIB Routines Used ; EXT PAFDC,LOUT,LA3DC,EVAL10,ISSP,SKSP,ISALNUM,ISDIGIT,COUT,PRINT CSEG .Z80 ; ; Misc. constants ; ESC EQU 27 CR EQU 13 LF EQU 10 BS EQU 8 TAB EQU 9 BELL EQU 7 CMDLIN EQU 0080H ; CP/M command line ; ; Define Printer Control Codes ; MTBUF MACRO ; clears printer buffer DB 24 ENDM ; CQ MACRO ; turns on letter-quality characters DB ESC,'1' ENDM ; DP MACRO ; turns on data-processing characters DB ESC,'0' ENDM ; BLDFC MACRO ; horizontal half-dot overlap DB ESC,'T' ENDM ; NOBOLD MACRO ; offs horizontal half-dot DB ESC,'I' ENDM ; CPI10 MACRO ; 10 chars per inch DB 30 ENDM ; CPI12 MACRO ; 12 chars per inch DB 28 ENDM ; CPI17 MACRO ; 17 chars per inch DB 29 ENDM ; DBL MACRO ; double-wide chars DB 31 ENDM ; LPI6 MACRO ; 6 lines per inch DB ESC,'6' ENDM ; LPI8 MACRO ; 8 lines per inch DB ESC,'8' ENDM ; MARG MACRO ; left margin prefix DB ESC,'%C' ENDM ; TABS MACRO ; tab-set prefix DB ESC,9 ENDM ; ITALON MACRO ; to enable alternate (italic) char set DB ESC,'2' ENDM ; START: CALL PRINT DB LF,'OKISET v. ',(VERS/10)+'0','.',(VERS MOD 10)+'0' DB ' -RDN',CR,CR,LF,0 ; ; No parameters? ; LD HL,CMDLIN ; point to count of chars in CL tail LD A,(HL) OR A JP Z,HELP LD B,A ; non-zero # of chars QP1: INC HL LD A,(HL) CALL ISALNUM JR Z,PARSE DJNZ QP1 JP HELP ; because no alphanums in CL tail ; ; Parse Command Line tail ; PARSE: LD HL,CMDLIN ; make string SYSLIB compatible LD E,L LD D,0 INC HL ADD HL,DE XOR A LD (HL),A ; LD HL,CMDLIN INC HL PARSE1: CALL SKSP ; locate command characters LD A,(HL) INC HL ; point to char after command OR A ; if Z, end of string: done RET Z CALL SCNTBL ; is legal char? JR Z,PARSE2 CALL PRINT DB 'Invalid option: ',0 CALL COUT CALL PRINT DB CR,LF,0 JR PARSE1 PARSE2: PUSH HL ; save string pointer LD A,C ; compute offset into address table ADD A,C LD E,A LD D,0 LD HL,ADRTBL ADD HL,DE LD E,(HL) ; get addr INC HL LD D,(HL) LD HL,PARSE1 ; return address EX (SP),HL ; push ret addr & get string ptr EX DE,HL ; str ptr in DE, routine addr in HL JP (HL) ; run routine ; ; Table of commands ; CMDTBL: DB NCTBL-$ ; number of entries DB 'M' ; margin DB 'D' ; draft mode DB 'Q' ; letter-quality mode DB 'T' ; tab spacing DB 'C' ; chars-per-inch DB 'L' ; line spacing DB 'B' ; boldface DB 'P' ; purge printer buffer DB 'W' ; double width chars DB '/' ; possibly help DB 'I' ; load italic set NCTBL EQU $ ; ; Table of addresses of routines corresponding to commands in CMDTBL ; ADRTBL: DW MARGIN DW DRAFT DW LETTQ DW TABSPC DW CPI DW LPI DW BOLD DW CANCEL DW WIDE DW QHELP DW ITAL ; ; Print help message and exit ; HELP: CALL PRINT DB ' Command Line Parameters:',CR,LF DB ' M Margin, in dot columns.',CR,LF DB ' D Draft mode.',CR,LF DB ' Q Letter Quality mode.',CR,LF DB ' T Tab spacing.',CR,LF DB ' C Characters per inch. = 10,12,17',CR,LF DB ' L Lines per inch. = 6 or 8',CR,LF DB ' B Boldface. = O (on) or F (off)',CR,LF DB ' P Purge printer buffer.',CR,LF DB ' W Double width of current chars.',CR,LF DB ' I Italic characters. = L (load) or ' DB 'E (enable)',CR,LF DB LF,0 RET ; ; Routine to scan the table of command characters (CMDTBL) for a ; match to the character in 'A'. The Z flag is set if a match is ; found, and register C holds the offset from the beginning of the ; table of the matching character. Registers affected: B, C, and F. ; SCNTBL: PUSH HL LD HL,CMDTBL LD B,(HL) ; number of command chars LD C,0 ; counter INC HL ; point to first char SCTBL1: CP (HL) JR Z,SCTBL2 INC C INC HL DJNZ SCTBL1 SCTBL2: POP HL RET ; ; Routine to print string at return address on the LST: device. ; The string must be terminated by a binary zero. Control is ; returned to the first character following the string. ; Registers affected: none ; LPTOUT: EX (SP),HL PUSH AF LPTO1: LD A,(HL) OR A JR Z,LPTO2 CALL LOUT INC HL JR LPTO1 ; LPTO2: INC HL POP AF EX (SP),HL RET ; ; Printer Routines ; Enter with DE = pointer to next char in command line ; Return with HL = pointer to char after that used by the routine ; MARGIN: EX DE,HL CALL LPTOUT MARG ; macro contains margin set init string DB 0 CALL SKSP CALL EVAL10 CALL LA3DC ; to LST: as 0-filled 3-digit decimal # CALL PRINT DB 'Margin set.',CR,LF,0 RET ; DRAFT: EX DE,HL CALL LPTOUT DP ; macro w/ string DB 0 CALL PRINT DB 'Draft mode set.',CR,LF,0 RET ; LETTQ: EX DE,HL CALL LPTOUT CQ ; macro DB 0 CALL PRINT DB 'Letter-quality mode set.',CR,LF,0 RET ; TABSPC: EX DE,HL CALL LPTOUT TABS ; macro DB 0 CALL SKSP CALL EVAL10 PUSH BC ; save until ret LD B,A CALL LA3DC TBSPC1: ADD A,B CP 132 JR NC,TBSPC2 PUSH AF LD A,',' CALL LOUT POP AF CALL LA3DC JR TBSPC1 ; TBSPC2: LD A,CR CALL LOUT CALL PRINT DB 'Tabs set.',CR,LF,0 POP BC RET ; CPI: EX DE,HL CALL SKSP CALL EVAL10 CP 10 JR NZ,CPI1 CALL LPTOUT CPI10 ; macro DB 0 LD A,10 CALL PAFDC JR CPI4 CPI1: CP 12 JR NZ,CPI2 CALL LPTOUT CPI12 ; macro DB 0 LD A,12 CALL PAFDC JR CPI4 CPI2: CP 17 JR NZ,CPI3 CALL LPTOUT CPI17 ; macro DB 0 LD A,17 CALL PAFDC JR CPI4 CPI3: CALL PRINT DB 'Error in chars-per-inch: ',0 CALL PAFDC CALL PRINT DB CR,LF,0 RET CPI4: CALL PRINT DB ' chars per inch.',CR,LF,0 RET ; LPI: EX DE,HL CALL SKSP CALL EVAL10 CP 6 JR NZ,LPI1 CALL LPTOUT LPI6 ; macro DB 0 CALL PRINT DB '6 lines per inch.',CR,LF,0 RET LPI1: CP 8 JR NZ,LPI2 CALL LPTOUT LPI8 DB 0 CALL PRINT DB '8 lines per inch.',CR,LF,0 RET LPI2: CALL PRINT DB 'Error in lines-per-inch: ',0 CALL PAFDC CALL PRINT DB CR,LF,0 RET ; BOLD: EX DE,HL CALL SKSP LD A,(HL) INC HL CP 'O' JR NZ,BOLD1 CALL LPTOUT BLDFC ; macro DB 0 CALL PRINT DB 'Boldface on.',CR,LF,0 RET BOLD1: CP 'F' JR NZ,BOLD2 CALL LPTOUT NOBOLD DB 0 CALL PRINT DB 'Boldface off.',CR,LF,0 RET BOLD2: CALL PRINT DB 'Error in boldface toggle: ',0 CALL COUT CALL PRINT DB CR,LF,0 RET ; CANCEL: EX DE,HL CALL LPTOUT MTBUF ; macro DB 0 CALL PRINT DB 'Printer buffer emptied.',CR,LF,0 RET ; WIDE: EX DE,HL CALL LPTOUT DBL ; macro DB 0 CALL PRINT DB 'Character width doubled.',CR,LF,0 RET ; QHELP: EX DE,HL CALL SKSP LD A,(HL) INC HL CP '/' CALL Z,HELP RET ; ITAL: EX DE,HL CALL SKSP LD A,(HL) INC HL CP 'L' JR Z,LDITAL CP 'E' JR NZ,ITAL1 CALL LPTOUT ITALON ; macro to turn on italics DB 0 CALL PRINT DB 'Italic set enabled.',CR,LF,0 RET ITAL1: CALL PRINT DB 'Error in italic argument: ',0 CALL COUT CALL PRINT DB CR,LF,0 RET ; LDITAL: PUSH HL LD HL,ITALS LDIT1: LD A,(HL) CP 0FFH JR Z,LDIT2 CALL LOUT INC HL JR LDIT1 LDIT2: CALL PRINT DB 'Italic set loaded.',CR,LF,0 POP HL RET ; ITALS: DEFB ESC,'%Aa',0,0,96,16,68,16,68,32,84,8,0 DEFB ESC,'%Ab',0,64,48,76,3,64,4,64,36,24,0 DEFB ESC,'%Ac',0,0,48,72,4,64,4,64,4,8,0 DEFB ESC,'%Ad',0,0,48,72,4,64,4,48,76,3,0 DEFB ESC,'%Ae',0,0,48,72,20,64,20,64,20,8,0 DEFB ESC,'%Af',0,0,0,68,48,12,2,9,0,1,2 DEFB ESC,'%Dg',32,64,12,82,1,80,33,16,9,6,0 DEFB ESC,'%Ah',0,0,64,48,12,3,4,64,52,8,0 DEFB ESC,'%Ai',0,0,0,0,64,32,84,8,5,0,0 DEFB ESC,'%Dj',0,0,32,64,0,64,49,12,3,0,0 DEFB ESC,'%Ak',0,0,64,48,12,3,8,116,0,6,0 DEFB ESC,'%Al',0,0,0,0,64,48,12,3,0,0,0 DEFB ESC,'%Am',0,64,52,8,64,52,8,64,52,8,0 DEFB ESC,'%An',0,64,52,8,4,0,4,64,52,8,0 DEFB ESC,'%Ao',0,48,72,0,68,0,68,0,36,24,0 DEFB ESC,'%Dp',0,64,48,12,3,16,1,16,9,6,0 DEFB ESC,'%Dq',0,12,18,1,16,97,16,77,2,1,0 DEFB ESC,'%Ar',0,64,52,8,4,0,4,0,4,8,0 DEFB ESC,'%As',0,32,0,88,4,80,4,80,36,8,0 DEFB ESC,'%At',0,0,32,84,8,68,11,32,0,0,0 DEFB ESC,'%Au',0,48,76,0,64,0,64,48,76,0,0 DEFB ESC,'%Av',0,0,0,60,64,32,16,8,4,0,0 DEFB ESC,'%Aw',0,60,64,32,16,44,64,32,16,8,4 DEFB ESC,'%Ax',0,64,0,64,44,16,104,4,0,4,0 DEFB ESC,'%Dy',0,32,64,12,67,16,64,48,12,3,0 DEFB ESC,'%Az',0,64,0,100,0,84,0,76,0,4,0 DEFB ESC,'%AA',0,96,16,8,4,10,1,14,112,0,0 DEFB ESC,'%AB',0,96,16,76,3,64,9,64,41,22,0 DEFB ESC,'%AC',0,48,76,2,65,0,65,32,1,2,0 DEFB ESC,'%AD',0,64,48,76,3,64,1,64,49,14,0 DEFB ESC,'%AE',0,64,48,76,3,72,1,72,1,0,1 DEFB ESC,'%AF',0,64,48,12,3,8,1,8,1,0,1 DEFB ESC,'%AG',0,48,76,2,65,16,65,48,1,2,0 DEFB ESC,'%AH',0,0,64,48,12,3,72,48,12,3,0 DEFB ESC,'%AI',0,0,64,0,64,49,76,3,0,1,0 DEFB ESC,'%AJ',0,48,64,0,64,49,12,3,0,1,0 DEFB ESC,'%AK',0,64,48,12,3,8,112,4,3,0,0 DEFB ESC,'%AL',0,0,64,48,76,3,64,1,96,0,0 DEFB ESC,'%AM',64,48,12,3,4,8,4,64,50,12,3 DEFB ESC,'%AN',0,64,48,12,3,4,56,64,48,12,3 DEFB ESC,'%AO',0,48,76,2,65,0,65,32,25,6,0 DEFB ESC,'%AP',0,64,48,12,3,8,1,8,1,6,0 DEFB ESC,'%AQ',0,48,76,2,81,0,81,32,25,70,0 DEFB ESC,'%AR',0,64,48,12,3,8,113,8,1,6,0 DEFB ESC,'%AS',0,32,64,6,73,0,73,48,1,2,0 DEFB ESC,'%AT',0,0,1,64,49,12,3,0,1,0,1 DEFB ESC,'%AU',0,48,76,3,64,0,64,48,12,3,0 DEFB ESC,'%AV',0,0,63,64,32,16,8,4,2,1,0 DEFB ESC,'%AW',0,63,64,32,24,64,32,16,8,4,3 DEFB ESC,'%AX',64,32,0,19,4,8,16,100,0,2,1 DEFB ESC,'%AY',0,0,0,7,104,16,8,4,3,0,0 DEFB ESC,'%AZ',64,32,64,18,65,8,65,36,1,2,1 DEFB ESC,'%D.',0,0,0,0,24,0,24,0,0,0,0 DEFB ESC,'%D,',0,0,0,0,24,64,56,0,0,0,0 DB 0FFH ; ; END START