;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