
	.z80
	cseg
	.phase	60000		;Load this program at 60000
;
	JP	CPYZX
;
SYSVAD:	DEFW	0		;60003-60004: Address of ZX81 sysvars
ZXLEN:	DEFW	0		;60005-60006: Length of ZX81 file (excl. name).
		;ZX81 program will be at (SYSVAD) - (SYSVAD)+(ZXLEN)

BREAK:	EI
	LD	A,(23624)
	RRCA
	RRCA
	RRCA
	AND	7
	OUT	(0FEH),A
	RST	8
	DEFB	0Ch	;D BREAK
;
CPYZX:	DI
	LD	HL,8000h	;ZX81 program is loaded at 8000h
CPZX1:	CALL	BYTI1		;Load the ZX81 program.
	LD	(HL),C
	INC	HL
	BIT	7,C
	JR	Z,CPZX1		;Until name loaded.
	LD	(SYSVAD),HL
	LD	B,114		;Load sysvars
CPZX2:	PUSH	BC
	CALL	BYTI1
	LD	(HL),C
	POP	BC
	INC	HL
	DJNZ	CPZX2
	PUSH	HL	;Load address for next section.
	LD	DE,19
	LD	HL,(SYSVAD)
	ADD	HL,DE
	LD	E,(HL)
	INC	HL
	LD	D,(HL)	;DE=STKEND
	EX	DE,HL
	LD	DE,16509
	OR	A
	SBC	HL,DE	;HL=length of file (bytes)
	LD	(ZXLEN),HL
	EX	DE,HL	;DE=length of file, bytes
	POP	HL
CPZX3:	PUSH	DE
	CALL	BYTI1
	LD	(HL),C
	POP	DE
	INC	HL
	DEC	DE
	LD	A,D
	OR	E
	JR	NZ,CPZX3
	LD	DE,8000h
	OR	A
	SBC	HL,DE		;End-start=length
	LD	B,H
	LD	C,L
	RET
;
BIBDR:	DEFB	8
;
BYTI1:	LD	A,(BIBDR)
	XOR	48
	LD	(BIBDR),A
	LD	(22561),A
	LD	(22562),A
	LD	(22593),A
	LD	(22594),A
BYTIN:	LD	C,1
LA424:	LD	B,0
LA426:	LD	A,7FH
	IN	A,(0FEH)
	NOP
	RRA
	JP	NC,BREAK
	RLA
	RLA
	RLA
	JR	C,LA439
	DJNZ	LA426
	JP	BYTIN
;
LA439:	LD	E,94H
LA43B:	LD	B,1AH
LA43D:	DEC	E
	IN	A,(0FEH)
	RLA
	RLA
	BIT	7,E
	LD	A,E
	JR	C,LA43B
	DJNZ	LA43D
	JR	NZ,LA44F	;Bit read.
	CP	56H
	JR	NC,LA424	;0 or 1?
LA44F:	CCF
	RL	C
	JR	NC,LA424
	RET

