Daniel sent me a loom emulator on a ZX81.
http://zx81.ordi5.free.fr/daniel/zxprinter_hr.djvu
My idea was to print all paterns on the ZxPrinter in the HRG mode.
My driver is ready!
But, it wasn't tested on a true ZxPrinter.
Is there anyone to run it on a true printer?
Tested on EO and the XuR (with the QS HRG graphic card) emulators.
Driver Description:
It's a "copy" like function, to rebuild an HRG buffer located at 7000h.
In the Demo#2, the buffer is located at 6000h to store a 256x192 pixels picture.
The demo#1, reduce the screen by 4.
The chr$(128) (black space) will take 4bits:
1|2 : on the first line.
3|4 : on the secound line.
The driver apply a AND$07 on all ASCII characters.(CHR$(0) to CHR$(7) and CHR$(128) to CHR$(135))
We able to throw 4 graphics screen (Print or Plot commands) to the ZxPrinter.(4x64pixels)
[picture 0]+[picture 1]+[picture 2]+[picture 3]
Poke 16514,0 : copy the current screen to the picture 0 location.
Poke 16514,1 : copy the current screen to the picture 1 location.
Poke 16514,2 : copy the current screen to the picture 2 location.
Poke 16514,3 : copy the current screen to the picture 3 location.
(each copy will be validate by a RAND USR 16515)
Poke 16514,4 : Start the ZxPrinerHRG printing.
(validate by a RAND USR 16515)
Poke 16514,5 : Erase the HRG buffer.
(validate by a RAND USR 16515)
Download:
http://zx81.ordi5.free.fr/xavsnap/downl ... ER_HRG.zip
Have Fun.
Thanks to André*** (pictures).
ZxPrinter routine from the QS HRG graphic card rom.
Code: Select all
.ORG $4082
LbDATAPAGE:
.db $00 ; 0-3 : 4=PRINT.
LbStart:
LD HL,$7000
LD DE,$08
LD A,(LbDATAPAGE)
CP $01
JR Z,LbSec1
CP $02
JR Z,LbSec2
CP $03
JR Z,LbSec3
CP $04
JP Z,PRINT
CP $05
JP Z,LbCLS
JR LbSec0
LbSec3:
ADD HL,DE
LbSec2:
ADD HL,DE
LbSec1:
ADD HL,DE
LbSec0:
LD (Lb40D5),HL ; Init HR address.
LD HL,($400C) ; GET D-FILE
INC HL
LD A,(HL)
LD (Lb40D9),HL
LD (Lb40E0),A
LD E,$00 ; Columns Decay.
LD BC,$04B0
RetByte:
LbNxtchar:
LD A,(Lb40E0)
CP $76
JR NZ, LbNewLine
;Next D_File screen line.
LD HL,(Lb40D5)
LD DE,$0038
ADD HL,DE
LD (Lb40D5),HL ; ReInit HR address.
LD HL,(Lb40D9)
INC HL
LD A,(HL)
LD (Lb40E0),A
LD (Lb40D9),HL
JR LbNxtchar
LbNewLine:
LD H,$1E
LD L,$00
AND $07
CP $00
JR Z,Lb4097
PUSH BC
LD B,A
LD DE,$08
LbLoopUDG:
ADD HL,DE
DJNZ LbLoopUDG
POP BC
Lb4097: ; Upper bits (stored at Lb40D7)
CALL LbRresH
CALL LbGetUDG
BIT 7,A
JR Z,LbFline1
CALL LbRsetH1
LbFline1:
CALL LbGetUDG
BIT 0,A
JR Z,LbFline2
CALL LbRsetH2
LbFline2:
; Lower bits (stored at Lb40D8) HL+7
LD DE,$0007
ADD HL,DE
CALL LbRresL
CALL LbGetUDG
BIT 7,A
JR Z,LbSline1
CALL LbRsetL1
LbSline1:
CALL LbGetUDG
BIT 0,A
JR Z,LbNXTchar
CALL LbRsetL2
LbNXTchar:
; End of caracter scan.
LD HL,(Lb40D9)
INC HL
LD A,(HL)
LD (Lb40E0),A
LD (Lb40D9),HL
DEC B
LD A,B
JP NZ, RetByte; Read 4 BYTES ON THE SCREEN.
; The buffer byte is ready ( 4 caracters )...
LD HL,(Lb40D5) ; Read HR address.
; Save HRG Byte
LD A,(Lb40D7)
LD (HL),A
LD DE,$0020
ADD HL,DE
LD A,(Lb40D8)
LD (HL),A
SBC HL,DE
INC HL
LD (Lb40D5),HL ; Inc HR address.
LD HL,(Lb40D9)
LD A,(HL)
LD B,$04
LD A,C
DEC C
CP $00
JP NZ,RetByte
RET ; ==========================
LbGetUDG:
LD A,(Lb40E0)
BIT 7,A
JR Z,LbGetUDG1
; (Lb40E0)>$3F : Inverted.
LD A,(HL)
XOR $FF
RET
LbGetUDG1:
; (Lb40E0)<$3F : not Inverted.
LD A,(HL)
RET
LbRresH:
LD A,(Lb40D7)
RL A
RL A
RES 0,A
RES 1,A
LD (Lb40D7),A
RET
LbRresL:
LD A,(Lb40D8)
RL A
RL A
RES 0,A
RES 1,A
LD (Lb40D8),A
RET
LbRsetH1:
LD A,(Lb40D7)
SET 1,A
LD (Lb40D7),A
RET
LbRsetH2:
LD A,(Lb40D7)
SET 0,A
LD (Lb40D7),A
RET
LbRsetL1:
LD A,(Lb40D8)
SET 1,A
LD (Lb40D8),A
RET
LbRsetL2:
LD A,(Lb40D8)
SET 0,A
LD (Lb40D8),A
RET
Lb40D5:
.db $00, $00 ; Store HL UDG.
Lb40D7:
.db $00 ; First LINE.
Lb40D8:
.db $00 ; Secound LINE.
Lb40D9:
.db $00, $00 ; Character Memory Offset in D_File.
Lb40E0:
.db $00 ; Char value.
; ZxPrinter
PRINT:
CALL $02E7 ; [SET-FAST]
LD HL,$7000
LD D,$30
LD C,$00
Lb2C43:
LD E,$20
LD A,C
OUT ($FB),A ; ZxPrinter port
Lb2C48:
IN A,($FB) ; ZxPrinter Port.
ADD A,A
; JP M, Lb2C80 ; [11392]
JR NC, Lb2C48 ; [$2C48:11336]
LD B,$0B
Lb2C52:
DJNZ Lb2C52 ; [$2C52:11346]
Lb2C54:
LD B,$08
PUSH DE
LD E,(HL)
Lb2C58:
SUB A
SLA E
RRA
OR C
LD D,A
Lb2C5E:
IN A,($FB) ; ZxPrinter Port.
AND $01
JR Z, Lb2C5E ; [$2C5E:11358]
LD A,D
OUT ($FB),A ; ZxPrinter port
DJNZ Lb2C58 ; [$2C58:11352]
POP DE
INC HL
DEC E
JR NZ, Lb2C54 ; [$2C54:11348]
Lb2C6E:
IN A,($FB) ; ZxPrinter Port.
AND $80
; JR NZ, Lb2C6E ; [$2C6E:11374]
JR Z, Lb2C6E ; [$2C6E:11374]
DEC D
JR Z, Lb2C80 ; [$2C80:11392]
LD A,D
CP $02
JR NZ, Lb2C43 ; [$2C43:11331]
LD C,$02
JR Lb2C43 ; [$2C43:11331]
Lb2C80:
LD A,$04
OUT ($FB),A ; ZxPrinter port
CALL $0207 ; [SLOW/FAST]
RET ; ==========================
LbCLS:
LD (HL),$00
LD DE,$7001
LD BC,$700
LDIR
RET
;------------ Labels errors ------------
.end