.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