;LCD1LJ.DO for M100/T102 V4 03/17/07 ; (c) Robert H. Pigford 2001 ;Envoked using Grph+Esc after loading. ;Deactivates after printing. Have to ;reload above HIMEM for each LCD dump. ;Ref: DMP100 by G.W. Flanders 1989 ;Program development - ;from PIDPLJ.DO(T200) w/M100 ROM addrs ;For LaserJet III and PCL4+ support ;From GRF202.DO 11/21/92 for Epson Prt. ;from GRF200 v0.1 (c) 5/91 RHP ;for T200, adapted from GRAFIX.CO(c)RHP ;for M100 (c) 1989 RHPigford ;for use with SKT200.BA (SKETCH.BA) ; M100 ; ---- CURSON: EQU 16969 ;4249H ESC "P" CUROFF: EQU 16974 ;424EH ESC "Q" TOPRT: EQU 27967 ;6D3FH A to LPT PLOT: EQU 29772 ;744CH pixel on UNPLOT: EQU 29773 ;744DH pixel off POSIT: EQU 17020 ;427CH H=col,L=row SCRLON: EQU 16964 SCRLOF: EQU 16959 LCD: EQU 19268 ;4B44H A to LCD, ret KYREAD: EQU 29250 ;7242H INKEY$ CAPS: EQU 4072 ;0FE8H 2/89 P100 pg22 BEEP: EQU 16937 ;4229H ruins BC PUTTXT: EQU 4514 ;11A2H to LCD pointed ;to by HL, ended by 0 ERAEOL: EQU 16989 ;425DH Opndl pg225 CURVAL: EQU 65516 HOOK: EQU 64222 ;RST 7 + 4 bytes ;keystroke vector ;--[ start MENU loop ]----------------- ORG 61750 ;approx 1125 bytes LHLD HOOK ;CHGET's RST 7 adrs SHLD HOOKBF ;save the old adrs LXI H,NUHOOK;fetch this prog SHLD HOOK ;put my adrs in FADEh RET ;now my prog is called NUHOOK: PUSH PSW ;save keystroke &flags LDA 65431 ;chk specl key matrix CPI 8 ;is it ESC? JNZ RESET ;no - forget it LDA 65433 ;chk for Grph or Code CPI 4 ;is it the Grph key? JZ START ;yes - run LCD1LJ.CO JNZ RESET ;no -forget it, bail ;====================================== START: LXI H,0 ;from Paul Globman DAD SP ;article in P100 SHLD MENU+1 MENU: LXI SP,0 MVI A,1 STA PRFLAG LXI H,0108H ;row 01D,col 08D CALL SCRLOF ;LCD no scroll CALL GETROW MENU1: CALL CLR8 LXI H,MSG1 CALL PUTTXT MENU2: CALL GETKY CPI 'P' JZ PSXY CPI 'Q' JZ MENU3 JMP MENU2 MENU3: CALL RSL1P ;clean up and quit MVI E,56 CALL PUTROW CALL SCRLON ;enable LCD scroll LHLD HOOKBF ;get old pntr SHLD HOOK ;put it back in FADEh RESET: POP PSW RET ;progrem exit point ;end Menu MSG1: DB 27,'pLCD1LJ',27,'q',' ',171, DB 'RHP

rint to LazrJet ' DB 'uit',0 ;= GETKY: ORA A ;clear carry CALL KYREAD JZ GETKY CALL CAPS RET ;= CLR8: LXI H,0108H ;col 1, row 8 CALL POSIT CALL ERAEOL RET ;= ; PIDPLJ (c)1997 RHP ; Store val from last row, send prompt. PSXY: CALL CLR8 LXI H,RESMSG CALL PUTTXT PSXYH: CALL GETKY CPI 'Q' JNZ PSXYH1 CALL RSL1P MVI E,56 CALL PUTROW JMP MENU PSXYH1: CPI '1' JM PSXYH CPI '5' JP PSXYH SUI 30H STA PRFLAG CALL CLR8 LXI H,MGNMSG ;margin question CALL PUTTXT PSXYMR: CALL GETKY CPI '0' JM PSXYMR CPI '6' JP PSXYMR CPI '3' JZ PSXYMR CPI '4' JZ PSXYMR STA MGNVAL CALL STMGN ; --- Start the printing from here --- LXI H,LJPRES ;set rsn to portra CALL LJCMD CALL RSL1P MVI E,56 CALL PUTROW ;restore last row CALL PIKRES ;set rast gra mode LXI H,STRTRG ;start …raphics CALL LJCMD LXI H,0101H ;H=col 1; L=row 1 SCNROW: CALL GETROW PUSH H CALL PRTLJ ;if any PRFLAG set ENDROW: POP H NXTROW: INR L MVI A,09H ;09h=09d CMP L JZ FINISH MVI H,01H JMP SCNROW ; --- End main printing loop ------ ;===================================== ; PIKRES checks PRFLAG, 1,2 3, or 4 ; sends raster graphics command ; resoln msg to LJ printer. ; Somewhat CRUDE CODE, but it works. PIKRES: LDA PRFLAG ;a 1 or a 2 CPI 1 JZ PIKRS1 CPI 2 JZ PIKRS2 CPI 3 JZ PIKRS3 CPI 4 JZ PIKRS4 RET ;just in case it falls thru PIKRS1: LXI H,LJRES1 JMP PIKRS5 PIKRS2: LXI H,LJRES2 ;if not, must be 2 JMP PIKRS5 PIKRS3: LXI H,LJRES3 JMP PIKRS5 PIKRS4: LXI H,LJRES4 PIKRS5: CALL LJCMD RET LJRES1: DB 27,'*t300R',255 LJRES2: DB 27,'*t150R',255 LJRES3: DB 27,'*t100R',255 LJRES4: DB 27,'*t75R',255 ;==================================== ; Set Left Margin to preset values STMGN: LDA MGNVAL CPI '0' JZ STMGN0 CPI '5' JZ STMGN5 CPI '1' JZ STMGN1 CPI '2' JZ STMGN2 RET ;just in case it falls thru STMGN0: LXI H,MGN0 JMP STMGN9 STMGN5: LXI H,MGN5 JMP STMGN9 STMGN1: LXI H,MGN10 JMP STMGN9 STMGN2: LXI H,MGN20 STMGN9: CALL LJCMD RET MGNVAL: DS 1 MGN0: DB 27,'&a0C',255 MGN5: DB 27,'&a5C',255 MGN10: DB 27,'&a10C',255 MGN20: DB 27,'&a20C',255 MGNMSG: DB 'Left Margin? <0> <5> ' DB '<1>0 <2>0',0 ;==== Messages ======================== RESMSG: DB 'LJP Resoln? ' DB '<1>X <2>X <3>X <4>X' DB ' or uit',0 ; LJPRES: DB 27,'*r0F',255 ; STRTRG: DB 27,'*r1A',255 ;at curs ; TRNRSD: DB 27,'*b' DB '60' ;60 bytes of values DB 'W',255 ; ENDRG: DB 27,'*rB',255 ;==== send cmd strings to LaserJet === LJCMD: MOV A,M CPI 255 RZ ORA A ;clear carry bit CALL TOPRT ;consider using ;existing print routine ;with Crtl-C test JC FINISH ;printer error INX H JMP LJCMD ;====================================== ; PRTLJ ; -- test 240 BUFFFER bytes, make 60 ; -- new bytes & send to LzrJet Prt ; B - the test bit/row for test across ; C - build new byte ; D - keep 8 tests of BUFF bit count ; BYTCNT - keep 60 byte count ; E - move the "or" bit with BUFF Mem ; PIXROW 8>0 count of test byte usage ; PRTLJ: MVI A, 9 ;do 8 rows of pixels STA PIXROW ;row grphs line cnt MVI A,00000001B MOV B,A ;set test byte in B ROWCNT: MVI A,2 STA ROWPAS ;# times row printed LDA PIXROW ;get the row count DCR A ;subtract 1 RZ ;done 8 if ln#=0, go ;back to base prog to ;refill buffer w/ LCD ;data STA PIXROW ;if not go on MOV A,B ;get test byte RRC ;start first w/ MSB MOV B,A ;save test byte ROWAGN: LXI H,TRNRSD ;trans rast data CALL LJCMD ;prep for 60 bytes LXI H,BUFFER-1 ;LCD data area MVI A,61 STA BYTCNT DOLIN: LDA BYTCNT DCR A ;prt 60 bytes yet? JNZ DOLIN1 ;not yet LDA ROWPAS ;yes, chk for twice DCR A JZ ROWCNT ;yes, done row twice STA ROWPAS ;no, repeat JMP ROWAGN ;since yet not twice DOLIN1: STA BYTCNT DOBYT: MVI A,0 MOV C,A ;clear new byte val MVI A,5 ;test only 4 bytes MOV D,A ;bit test counter MVI A,00000011B MOV E,A ;set "OR" byte's bits DOBYT1 MOV A,E ;positioned "or" bit RRC RRC MOV E,A DCR D ;done all pick offs ;4 bits of BUFFER vals JZ DOBYT3 ;if yes, print INX H ;if no, do next LCD val MOV A,M ;get a byte from buffer ANA B ;is this bit/row a 1? ;If yes, add 2 bits to ;the new byte in C JZ DOBYT2 ;not a 1, skip over, ;leave the 0 bit in C ;unchanged MOV A,C ;get the new byte ORA E ;add the bit in slot MOV C,A DOBYT2: JMP DOBYT1 DOBYT3: MOV A,C ;get the good new byte CALL TOPRT JMP DOLIN ;go to next bit row ;===================================== PIXROW: DS 1 BYTCNT: DS 1 ROWPAS: DS 1 PRFLAG: DS 1 ;====================================== ; GETROW store row graphic vals ; starts w/ H=col 1-40, L=row 1-8 ; target set by other routines GETROW: CALL RSL1P CALL CURSON NXTCOL: CALL POSIT PUSH PSW CALL TIMER POP PSW PUSH H CALL FLIPR2;TWSTCR POP H INR H MVI A,41 CMP H JNZ NXTCOL CALL CUROFF RET ;===================================== ;PUTROW puts the graphics back by pixs ; assumes E = start row (0-56) for 8 ; rows of pixels PUTROW: MVI B,10000000B MVI C,0 NXTY: MVI D,0 LHLD L1PNTR INR C MOV A,C CPI 9 RZ BYTE: PUSH H MOV A,M ANA B PUSH D PUSH B JNZ PSET JZ PRESET BACK: POP B POP D POP H INX H INR D MOV A,D CPI 240 JNZ BYTE MOV A,B RRC MOV B,A INR E JMP NXTY PSET: CALL PLOT JMP BACK PRESET: CALL UNPLOT JMP BACK ;==== FLIPR2 ========================= ;turn the 6 CURSOR values upside ;down to rightside up and place in ;BUFFER memory. Leave L1PNTR pointing ;to the next BUFFER address to be used. FLIPR2: LXI H,CURVAL SHLD CBPNTR MVI D,6 NX_BYT: XRA A ;sets A=0 LHLD L1PNTR MOV M,A ;put a 0 to clear it MVI E,8 ;bit counter MVI B,00000001B MVI C,10000000B NX_BIT: LHLD CBPNTR MOV A,M ANA B ;is it on? JZ BYPASS PUSH H LHLD L1PNTR MOV A,M ORA C MOV M,A POP H BYPASS: MOV A,C RRC MOV C,A MOV A,B RLC MOV B,A DCR E JNZ NX_BIT LHLD L1PNTR MOV A,M REVRSE: CMA MOV M,A INX H SHLD L1PNTR LHLD CBPNTR INX H SHLD CBPNTR DCR D JNZ NX_BYT RET ; CBPNTR: DS 2 ;pointer to CBUF ; ;==== time to illuminate TIMER: MVI A,255 TIME?: NOP NOP NOP NOP NOP DCR A RZ JMP TIME? BRKOUT: POP H ;if BRK from GMODE CALL BEEP CALL BEEP JMP MENU FINISH: LXI H,ENDRG ;reset out of ;raster graphics CALL LJCMD BEEP1: CALL BEEP CALL CUROFF JMP MENU ;= reset mem pointer RSL1P: PUSH H LDA PRFLAG ORA A ;was ANA A JZ RSL11 LXI H,BUFFER SHLD L1PNTR RSL11: POP H RET L1PNTR: DS 2 HOOKBF: DW 0 ;hold orig keybd vector BUFFER: DS 240 ;only need for 1 row of ;LCD byte values END: END