New ZxPrinter HRG Driver !

Anything Sinclair ZX Basic related; history, development, tips - differences between BASIC on the ZX80 and ZX81
Post Reply
User avatar
XavSnap
Posts: 1940
Joined: Sat May 10, 2008 4:23 pm
Location: 'Zx81 France' Fb group.

New ZxPrinter HRG Driver !

Post by XavSnap »

HI,

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.
Image

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]
Image

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
Xavier ...on the Facebook groupe : "Zx81 France"(fr)
User avatar
siggi
Posts: 988
Joined: Thu May 08, 2008 9:30 am
Location: Wetterau, Germany
Contact:

Re: New ZxPrinter HRG Driver !

Post by siggi »

XavSnap wrote:HI,
But, it wasn't tested on a true ZxPrinter.
Is there anyone to run it on a true printer?
Hi Xav,
I tested with a GP50-S and it works fine:
P1030869_800x600.JPG
(97.84 KiB) Downloaded 1499 times
Siggi
My ZX81 web-server: online since 2007, running since dec. 2020 using ZeddyNet hardware
http://zx81.ddns.net/ZxTeaM
Post Reply