;ZXIDEROM source rutines ;BLOK1 for Harddisk ;LBA version for CF ;I/O port adresses DAT EQU #2B PAR EQU #2F SEC EQU #6B STA EQU #6F ZYL EQU #AB ZYH EQU #AF HEA EQU #EB COM EQU #EF ;some error codes DIER EQU #1E ECC EQU #1F ORG #4C2 RET ;Skip calls of cassette rut.. CALC OR A ;avoids zero sector count - it transfers 256 sectors! JR NZ,CONTIN RST 8 DEFB #19 ; parameter error CONTIN DI PUSH HL PUSH DE LD E,A ISBYS IN A,(COM) BIT 7,A JR NZ,ISBYS ; Wait until not busy LD A,#E0 ; LBA mode set, bits 24-27 always zero, still up to 8GB OUT (HEA),A POP HL LD A,H LD H,L LD L,0 ADD HL,BC JR NC,NOCAR INC A ; Advance high byte NOCAR OUT (ZYH),A LD A,H OUT (ZYL),A LD A,L OUT (STA),A LD A,E OUT (SEC),A POP HL RET ;Enter param: HL adress,BC start sector,A count, DE cyl. offset ;Out param:Z set=OK,NZ=error ;Verify ORG #503 VERBL CALL CALC LD A,#41 OUT (COM),A LD BC,50000 VTIL IN A,(COM) BIT 7,A JR Z,VERF DEC BC LD A,B OR C JR NZ,VTIL RST 8 DEFB DIER VERF BIT 0,A RET Z RST 8 DEFB DIER REABE ;STACK OVERLAP CHECK PUSH BC PUSH DE PUSH HL LD E,A LD B,9 MU512 SLA E RL D DJNZ MU512 LD BC,(#5CB2) SCF SBC HL,BC JR NC,OK POP HL PUSH HL ADD HL,DE JR C,SO LD BC,12 ADD HL,BC JR C,SO SBC HL,SP JR C,OK SO RST 8 DEFB #1D ;stack overlap OK POP HL POP DE POP BC CALL REABL ERRT ;error test & RST 8 EI RET Z ;If no error IN A,(PAR) BIT 6,A JR NZ,CRCE RST 8 DEFB DIER ;Disk error FILL RET RET ;Adr #556 -skip cassette load CRCE RST 8 DEFB ECC ;ECC error REABL CALL CALC LD A,#20 OUT (COM),A CWR CALL WAIDR SELL INI INI INI INI INI INI INI INI DJNZ SELL IN A,(COM) BIT 0,A RET NZ DEC E JR NZ,CWR RET WRIBE CALL WRIBL JR ERRT WRIBL CALL CALC LD A,#30 OUT (COM),A WRIT CALL WAIDR SWRL OUTI OUTI OUTI OUTI OUTI OUTI OUTI OUTI DJNZ SWRL IN A,(COM) BIT 0,A RET NZ DEC E JR NZ,WRIT RET WAIDR LD BC,50000 WAIDL IN A,(COM) BIT 3,A JR NZ,SET64 DEC BC LD A,B OR C JR NZ,WAIDL POP DE ;Drop call. INC A ;reset zero flag RET SET64 LD BC,#402B RET ;some error codes EIVFN EQU #E EFINF EQU #20 ENAME EQU #21 ENORO EQU #22 ECATF EQU #23 ENOTL EQU #24 ;test free mem. RTMONM CALL #1F1A LD HL,-560 OR A SBC HL,BC JR C,USESCR LD BC,543 RST #30 JR TOIX USESCR LD DE,#55E0 TOIX LD B,6 GO6 INC DE DJNZ GO6 PUSH DE POP IX LD B,16 LD A,32 SABLAN LD (DE),A INC DE DJNZ SABLAN CALL #2BF1 ;test first char is A-Z or 1-9 LD A,(DE) ;test first char CALL ISVABC JR NZ,WBGC LD HL,#FFF1 DEC BC ADD HL,BC INC BC JR NC,SANAME WBGC RST 8 DEFB EIVFN SANAME PUSH IX POP HL INC HL EX DE,HL LDIR RET ;SAVE, LOAD & VERIFY ;COMMAND ROUTINES SAVETC POP AF LD A,(TADR) SUB #E0 LD (TADR),A CALL #1C8C CALL #2530 JR Z,SACODE CALL RTMONM SACODE RST #18 CP #AF JR NZ,SALINE LD A,(TADR) CP 3 REPC JP Z,#1C8A RST #20 CALL #2048 JR NZ,SAC1 LD A,(TADR) AND A JR Z,REPC CALL #1CE6 JR SAC2 SAC1 CALL #1C82 RST #18 CP #2C JR Z,SAC3 LD A,(TADR) AND A JR Z,REPC SAC2 CALL #1CE6 JR SAC4 SAC3 RST #20 CALL #1C82 SAC4 CALL #1BEE CALL #1E99 LD (IX+16),C LD (IX+17),B CALL #1E99 LD (IX+18),C LD (IX+19),B LD H,B LD L,C LD (IX+0),3 ;TYPE JR SAALL SALINE CP #CA JR Z,SAL1 CALL #1BEE LD (IX+19),128 JR SATY0 SAL1 LD A,(TADR) AND A JP NZ,#1C8A RST #20 CALL #1C82 CALL #1BEE CALL #1E99 LD (IX+18),C LD (IX+19),B SATY0 LD (IX+0),0 LD HL,(ELINE) LD DE,(PROG) SCF SBC HL,DE LD (IX+16),L LD (IX+17),H LD HL,(VARS) SBC HL,DE LD (IX+20),L LD (IX+21),H EX DE,HL SAALL LD A,(TADR) AND A JP Z,SACONT PUSH HL CALL LDCAT ;this incr. IX by 25 LD A,(IX+0) CP 3 JR Z,VERCNT LD A,(TADR) DEC A JR Z,LDCONT ;LOAD " " CODE MUST COM ;MERGE OUT VERCNT LD L,(IX-9) LD H,(IX-8) LD E,(IX+16) LD D,(IX+17) LD A,H OR L JR Z,VER1 SBC HL,DE JR NC,VER1 ADD HL,DE SRL H RR L JR C,OV JR Z,NOV OV INC H NOV LD E,H LD (IX+26),0 ;avoid loadpos JR LB3A01 VER1 LD E,(IX+24) LB3A01 POP HL LD A,H ;missed in BLOK1 10 OR L JR NZ,VER2 LD A,(TADR) CP 2 JR Z,VER2 LD A,(IX+26) OR A JR Z,NOTCM LD H,A LD L,(IX+25) DI LD SP,HL NOTCM LD L,(IX+18) LD H,(IX+19) OR A JR NZ,VER3 VER2 XOR A VER3 LD C,(IX+22) LD B,(IX+23) LD D,(IX-30) OR A JR Z,CHFVER LD A,E LD E,(IX-31) ;Cyl offset CALL REABL JP RESTR CHFVER LD A,(TADR) CP 2 JR Z,TOVER ;ret via or RST 8 by error TOREAB LD A,E LD E,(IX-31) JP REABE ;error test in subrut, ret via TOVER LD A,E LD E,(IX-31) JP VERBL ; LDCONT LD E,(IX+16) LD D,(IX+17) POP HL PUSH HL LD L,(IX-9) LD H,(IX-8) EX DE,HL SCF SBC HL,DE JR C,LDPRG LD DE,5 ADD HL,DE LD B,H LD C,L CALL #1F05 LDPRG POP HL EX DE,HL LD HL,(ELINE) DEC HL LD (XPTR),IX LD C,(IX+16) LD B,(IX+17) PUSH BC CALL #19E5 POP BC PUSH HL PUSH BC CALL #1655 LD IX,(XPTR) INC HL LD C,(IX+20) LD B,(IX+21) ADD HL,BC LD (VARS),HL LD H,(IX+19) LD A,H AND #C0 JR NZ,LDPRG1 LD L,(IX+18) LD (NEWPPC),HL LD (IY+10),0 LDPRG1 POP DE POP HL LD E,(IX+24) JP VER2 SACONT PUSH HL CALL SACAT CALL SACAT2 POP HL SADB LD A,(IX-1) SADB1 LD B,(IX-2) LD C,(IX-3) JP WRIP ;ret via SACAT PUSH IX CALL LDMASC LD BC,1 SACOL PUSH IX POP HL PUSH BC CALL FINDNM POP BC CP 16 JR C,NAMF JR NZ,CATEND INC C LD A,(IX-29) CP C JR NZ,SACOL RST 8 DEFB ECATF NAMF RST 8 DEFB ENAME CATEND SUB 20 PUSH AF PUSH BC PUSH IX POP HL LD BC,0 LD A,1 CALL REAP LD C,(IX+0) LD B,(IX+1) LD (IX-3),C LD (IX-2),B LD L,(IX-28) LD H,(IX-27) OR A SBC HL,BC LD E,(IX-9) LD D,(IX-8) OR A LD A,D SRL A JR C,PL1 LD D,A LD A,E OR A LD A,D JR Z,ETOA PL1 INC A ETOA LD E,A LD (IX-1),E LD D,0 SBC HL,DE JR NC,ROOMOK RST 8 DEFB ENORO ROOMOK PUSH IX POP HL LD C,(HL) INC HL LD B,(HL) EX DE,HL ADD HL,BC EX DE,HL LD (HL),D DEC HL LD (HL),E LD BC,0 LD A,1 PUSH HL CALL WRIP POP HL POP BC PUSH BC PUSH HL LD A,1 CALL REAP POP HL POP BC POP AF LD B,5 MUAL SLA A DJNZ MUAL LD D,B RL D LD E,A ADD HL,DE EX DE,HL POP HL PUSH BC LD BC,25 LDIR POP BC RET SACAT2 PUSH IX POP HL LD B,0 LD A,1 JP WRIP ELINE EQU #5C59 XPTR EQU #5C5F VARS EQU #5C4B NEWPPC EQU #5C42 PROG EQU #5C53 TADR EQU #5C74 RESTR EQU #3A4C LDCAT1 CALL LDMASC LD BC,1 ;CAT SECTOR 1 LOOKH PUSH IX POP HL PUSH BC CALL FINDNM POP BC CP 16 JR C,FOUND JR NZ,FILENF INC C LD A,(IX-29) ;this is first data sector # CP C JR NZ,LOOKH FILENF RST 8 DEFB EFINF FOUND LD B,5 MUA32 SLA A DJNZ MUA32 RL B PUSH IX POP HL RET LDMASC ;first load master cat LD BC,25 ADD IX,BC ;base for load LD BC,0 LDMAC2 LD DE,0 PUSH IX POP HL LD A,1 CALL REABE LD A,(IX-24) CP "a" JR C,NOTLC RES 5,A NOTLC LD B,36 PUSH IX POP HL LD DE,12 BEGLL CP (HL) JR Z,BEGLM ADD HL,DE DJNZ BEGLL RST 8 DEFB EIVFN BEGLM INC HL PUSH HL PUSH IX POP HL LD DE,-31 ADD HL,DE EX DE,HL POP HL LD BC,5 LDIR ;this copyes cyl. offset, ;first data sector & area len to begin of workarea RET LDCAT CALL LDCAT1 LD C,A LD A,(DE) CP (IX-25) JR Z,TYPOK PARER RST 8 DEFB #19 TYPOK LD D,H LD E,L ADD HL,BC LD BC,32 LDIR RET ;FIND NAME FINDNM PUSH HL LD A,1 CALL REAP POP HL LD C,0 BLOOP LD D,H LD E,L INC HL LD A,(HL) OR A JR Z,CATEF LD B,15 PUSH IX INC IX RLOOP LD A,(HL) CP (IX-25) JR NZ,NOTEQ INC HL INC IX DJNZ RLOOP POP IX LD A,C RET NOTEQ LD H,D LD L,E LD DE,32 ADD HL,DE POP IX INC C LD A,16 CP C JR NZ,BLOOP RET CATEF LD A,C ADD A,20 RET ;ERASE COMMAND ERASE CALL RTMONM CALL LDCAT1 CP #E0 JR NZ,NOTLR1 DEC B JR NZ,NOTLR LD A,(IX-29) DEC A CP C JR Z,EROK2 INC C ;To next sector LD A,1 PUSH HL PUSH BC CALL REAP POP BC POP HL DEC C INC HL LD A,(HL) OR A JR Z,OKER REPH25 RST 8 DEFB ENOTL OKER LD A,1 DEC HL PUSH HL PUSH BC CALL REAP POP BC POP HL EROK2 LD D,C LD BC,#1E0 ADD HL,BC JR EROK NOTLR INC B NOTLR1 LD D,C LD C,A ADD HL,BC LD BC,33 ADD HL,BC LD A,(HL) OR A JR NZ,REPH25 SBC HL,BC EROK LD BC,22 ADD HL,BC LD E,(HL) INC HL LD A,(HL) INC BC OR A SBC HL,BC LD C,D LD D,A LD B,32 ERAL LD (HL),0 INC HL DJNZ ERAL PUSH IX POP HL PUSH DE PUSH HL LD A,1 CALL WRIP POP HL LD A,1 LD BC,0 PUSH HL CALL REAP POP HL POP DE LD (HL),E INC HL LD (HL),D DEC HL LD BC,0 LD A,1 WRIP LD E,(IX-31) LD D,(IX-30) JP WRIBE ;ret via REAP LD E,(IX-31) LD D,(IX-30) JP REABE ISVABC CP "0" RET C CP ":" JR C,BGCN RES 5,A ;lower to cap. CP "A" RET C CP #5B JR NC,IBGC BGCN CP A ;SET Z flag RET IBGC OR A ;reset Z flag RET ;EXTERN COMMAND BASE EQU 64500 LDMAC2 EQU #884 REABE EQU #51F ORG #EC0 CALL #2530 JR NZ,NOSY RST #20 JP #1BF3 NOSY LD (BASE+7),A LD IX,BASE+31 LD BC,2 ;abs sector 2 CALL LDMAC2 LD A,(BASE+4) LD BC,(BASE+2) LD HL,(BASE) LD DE,1014 PUSH HL CALL REABE RST #20 RET ;JP to mc. ;CAT COMMAND LDMASC EQU #87C REAP EQU #987 ORG #1391 ;class 5 CALL #2530 JR NZ,NOCSY RST #20 TOSMN JP #1BF3 NOCSY PUSH AF LD A,2 CALL #1601 XOR A LD DE,FIRM CALL #C0A LD BC,550 RST #30 PUSH DE POP IX LD DE,6 ADD IX,DE POP AF LD (IX+1),A CALL LDMASC PUSH IX POP HL LD BC,1 CATBL PUSH HL LD A,1 PUSH BC PUSH HL CALL REAP POP HL LD E,16 CATPL INC HL LD A,(HL) OR A JP Z,CATEND LD BC,14 ADD HL,BC LD D,1 ZTL LD A,(HL) CP 32 JR NZ,NOTSP INC D DEC HL DEC C JR NZ,ZTL NOTSP OR A SBC HL,BC LD B,15 SPET LD A,B CP D JR NC,NAML LD A,"-" JR CRST NAML LD A,(HL) CRST RST 16 INC HL DJNZ SPET LD A,32 RST 16 LD BC,16 OR A SBC HL,BC LD A,(HL) LD D,A ;Save type OR A JR Z,PRG CP 3 JR Z,CODE LD A,"H" RST 16 LD A,":" RST 16 LD A,"?" RST 16 INC HL INC HL INC HL JR SPBLEN PRG LD A,"P" JR PRTSP CODE LD A,"B" PRTSP RST 16 LD A,":" RST 16 ADD HL,BC INC HL INC HL LD C,(HL) INC HL LD B,(HL) LD A,D OR A JR NZ,NOTPRG LD A,B CP #80 JR NZ,NOTPRG LD A,"-" RST 16 LD B,4 PFSPL LD A," " RST 16 DJNZ PFSPL JR SPBLEN NOTPRG CALL BCOUT5 SPBLEN LD A,32 RST 16 LD A,"L" RST 16 LD A,":" RST 16 DEC HL DEC HL LD B,(HL) DEC HL LD C,(HL) CALL BCOUT5 LD A,13 RST 16 LD BC,16 ADD HL,BC DEC E JP NZ,CATPL POP BC POP HL INC C LD A,C CP (IX-29) JP NZ,CATBL JR CEND CATEND POP BC POP HL CEND LD BC,0 LD A,1 PUSH HL CALL REAP POP HL PUSH HL POP IX LD DE,CUST XOR A CALL #C0A LD E,(IX+4) LD D,0 LD H,(IX+1) LD L,(IX+0) PUSH HL OR A SBC HL,DE CALL DI2BCO LD DE,FRT XOR A CALL #C0A LD H,(IX+3) LD L,(IX+2) POP DE OR A SBC HL,DE CALL DI2BCO LD DE,SECM XOR A CALL #C0A RST #20 RET ORG #3CA8 DI2BCO LD B,H LD C,L SRL B RR C PUSH AF CALL BCOUT5 POP AF JR NC,TWOSP JP PRC5 TWOSP LD A," " RST 16 LD A," " RST 16 RET ;IN:BC value,A:number of digits BCOUT4 LD A,4 JR BCOUT BCOUT3 LD A,3 JR BCOUT BCOUT5 LD A,5 BCOUT PUSH HL PUSH DE PUSH IX LD IX,DTABL LD H,B LD L,C DEC A LD B,A LD A,4 SUB B LD D,0 LD E,A ADD IX,DE ADD IX,DE LD C,0 ;lead zero flag CD10 LD E,(IX+0) INC IX LD D,(IX+0) INC IX CALL DIV10 DJNZ CD10 LD A,L ADD A,"0" RST 16 POP IX POP DE POP HL RET ORG #9A8 DIV10 LD A,-1 D10L INC A ADD HL,DE JR C,D10L SBC HL,DE OR A JR NZ,NMLZ OR C JR Z,LEASP XOR A JR ADDA0 LEASP LD A,32 JR DOUP NMLZ LD C,A ADDA0 ADD A,"0" DOUP RST 16 RET DTABL DEFW 55536 DEFW 64536 DEFW 65436 DEFW 65526 PRC5 LD A,"." RST 16 LD A,"5" RST 16 FIRM RET DEFB 13 DEFM " Files:" SECM DEFB 128+13 DEFM " KB" CUST DEFB 141,13 DEFM " Used" FRT DEFB ":"+128 DEFM " free" DEFB ":"+128 ;MOVE NMI SACAT EQU #7AF SACAT2 EQU #849 RTMONM EQU #5C5 WRIP EQU #97E REABE EQU #51F SADB1 EQU #7A6 WRIBL EQU #583 ORG #386E ;MOVE COMMAND MOVE CALL RTMONM LD HL,#C000 LD (IX+16),L LD (IX+17),H LD HL,#4000 LD (IX+18),L LD (IX+19),H LD (IX+0),3 CALL SACAT EX DE,HL LD DE,(26600) LD (HL),E INC HL LD (HL),D CALL SACAT2 LD L,(IX-3) LD H,(IX-2) LD BC,20 ADD HL,BC LD B,H LD C,L LD A,76 LD HL,26624 CALL WRIP LD BC,20 LD A,20 LD HL,26624 LD DE,0 CALL REABE LD A,20 LD HL,26624 JP SADB1 ;NMI HERE ORG #3A01 NMIHER PUSH AF NMIL LD A,4 OUT (#FE),A LD A,#FE IN A,(#FE) BIT 3,A JR NZ,KT POP AF RETN KT LD A,#7F IN A,(#FE) BIT 4,A JP Z,BASIC BIT 2,A LD A,2 OUT (#FE),A JR NZ,NMIL ;SAVE ALL TO DISK LD A,I PUSH AF EX AF,AF' PUSH AF PUSH BC PUSH DE PUSH HL EXX PUSH BC PUSH DE PUSH HL PUSH IX PUSH IY LD HL,RESTR PUSH HL LD HL,#4000 LD BC,20 LD A,20 LD DE,0 CALL WRIBL POP HL JR NZ,RESTR2 LD (26600),SP RST 0 RESTR JR NZ,BASIC RESTR2 POP IY POP IX POP HL POP DE POP BC EXX POP HL POP DE POP BC POP AF EX AF,AF' POP AF LD I,A JP PO,DISABL EI DISABL CP #3F IM 1 JR Z,MODE1 IM 2 MODE1 POP AF RET BASIC PUSH HL PUSH DE LD HL,(#5CB2) LD DE,#5D8E SBC HL,DE JR NC,NOTLOW POP DE POP HL JP NMIL NOTLOW LD SP,(#5CB2) DEC SP LD HL,#1303 PUSH HL LD (#5C3D),SP LD A,(#5C48) RRA RRA RRA AND 7 CALL #229B LD A,#3F LD I,A RST 8 DEFB #1C