From 84374c86e6f4a39cde369e13f0d3f6ad712cca9f Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 6 Jun 2023 16:21:56 -0700 Subject: [PATCH] Cleanup and Optimizations for PPA/IMM/SYQ Drivers --- Source/HBIOS/hbios.asm | 46 ++++++++ Source/HBIOS/imm.asm | 254 +++++++++++++++++++++++++--------------- Source/HBIOS/ppa.asm | 252 +++++++++++++++++++++++---------------- Source/HBIOS/syq.asm | 260 ++++++++++++++++++++++++++++------------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 6 files changed, 542 insertions(+), 274 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 5c29e50a..6dce028d 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -7583,6 +7583,52 @@ HB_HASFP .DB 0 ; NON-ZERO MEANS FP EXISTS ; HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER ; +; +; +#IFDEF MG014_MAP +; + .FILL 32 - ($ & (32 - 1)) ; ALIGN TO 32 BYTE BOUNDARY + +MG014_STATMAPLO: + ; LOWER NIBBLE + .DB $08 ; 00 + .DB $0C ; 01 + .DB $00 ; 02 + .DB $04 ; 03 + .DB $0A ; 04 + .DB $0E ; 05 + .DB $02 ; 06 + .DB $06 ; 07 + .DB $09 ; 08 + .DB $0D ; 09 + .DB $01 ; 0A + .DB $05 ; 0B + .DB $0B ; 0C + .DB $0F ; 0D + .DB $03 ; 0E + .DB $07 ; 0F +; +MG014_STATMAPHI: + ; UPPER NIBBLE + .DB $80 ; 00 + .DB $C0 ; 01 + .DB $00 ; 02 + .DB $40 ; 03 + .DB $A0 ; 04 + .DB $E0 ; 05 + .DB $20 ; 06 + .DB $60 ; 07 + .DB $90 ; 08 + .DB $D0 ; 09 + .DB $10 ; 0A + .DB $50 ; 0B + .DB $B0 ; 0C + .DB $F0 ; 0D + .DB $30 ; 0E + .DB $70 ; 0F +; +#ENDIF +; HB_END .EQU $ ; SLACK .EQU BNKTOP - $ diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 19c1b54a..a579c6ec 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -10,10 +10,13 @@ ; ; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. ; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). +; - https://github.com/EtchedPixels/FUZIX +; - https://github.com/torvalds/linux ; -; 5/23/2023 WBW - INITIAL RELEASE -; 5/26/2023 WBW - CLEAN UP, LED ACTIVITY -; 5/27/2023 WBW - ADDED SPP MODE +; 05/23/2023 WBW - INITIAL RELEASE +; 05/26/2023 WBW - CLEAN UP, LED ACTIVITY +; 05/27/2023 WBW - ADDED SPP MODE +; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE ; ;============================================================================= ; @@ -71,8 +74,6 @@ ; ; TODO: ; -; - OPTIMIZE READ/WRITE LOOPS -; ; NOTES: ; ; - THIS DRIVER IS FOR THE ZIP DRIVE IMM INTERFACE. IT WILL SIMPLY @@ -135,6 +136,12 @@ IMM_LBA .EQU 8 ; OFFSET OF LBA (DWORD) #DEFINE IMM_WCTL(VAL) LD A,VAL \ CALL IMM_WRITECTRL #DEFINE IMM_WDATA(VAL) LD A,VAL \ CALL IMM_WRITEDATA ; +; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE +; +#IF (IMMMODE == IMMMODE_MG014) + #DEFINE MG014_MAP +#ENDIF +; ;============================================================================= ; INITIALIZATION ENTRY POINT ;============================================================================= @@ -227,6 +234,8 @@ IMM_DETECT: #IF (IMMTRACE >= 3) PRTS("\r\nDETECT:$") #ENDIF +; +#IF (IMMMODE == IMMMODE_MG014) ; INITIALIZE 8255 LD A,(IY+IMM_IOBASE) ; BASE PORT ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT @@ -234,6 +243,7 @@ IMM_DETECT: LD A,$82 ; CONFIG A OUT, B IN, C OUT OUT (C),A ; DO IT CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE +#ENDIF ; ; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND ; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE @@ -349,7 +359,7 @@ IMM_IO: ; ; DO SCSI IO LD DE,(IMM_DSKBUF) ; DISK BUFFER TO DE - LD BC,512 ; ONE SECTOR, 512 BYTES + LD A,1 ; BLOCK I/O, ONE SECTOR LD HL,IMM_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE CALL IMM_RUNCMD ; RUN THE SCSI ENGINE CALL Z,IMM_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS @@ -631,8 +641,7 @@ IMM_SELECT: #ENDIF IMM_WCTL($0C) ; - LD HL,500 ; TIMEOUT COUNTER -; + LD B,0 ; TIMEOUT COUNTER IMM_SELECT1: CALL IMM_READSTATUS #IF (IMMTRACE >= 3) @@ -641,11 +650,8 @@ IMM_SELECT1: #ENDIF AND $08 JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON - DEC HL - LD A,H - OR L - JP Z,IMM_CMD_TIMEOUT ; TIMEOUT - JR IMM_SELECT1 + DJNZ IMM_SELECT1 + JP IMM_CMD_TIMEOUT ; TIMEOUT ; IMM_SELECT2: IMM_WCTL($04) @@ -655,8 +661,7 @@ IMM_SELECT2: IMM_WCTL($0C) IMM_WCTL($0D) ; - LD HL,500 ; TIMEOUT COUNTER -; + LD B,0 ; TIMEOUT COUNTER IMM_SELECT3: CALL IMM_READSTATUS #IF (IMMTRACE >= 3) @@ -665,11 +670,8 @@ IMM_SELECT3: #ENDIF AND $08 JR NZ,IMM_SELECT4 ; IF SET, MOVE ON - DEC HL - LD A,H - OR L - JP Z,IMM_CMD_TIMEOUT ; TIMEOUT - JR IMM_SELECT3 + DJNZ IMM_SELECT3 + JP IMM_CMD_TIMEOUT ; TIMEOUT ; IMM_SELECT4: IMM_WCTL($0C) @@ -845,21 +847,20 @@ IMM_GETBYTE: RET ; ; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR -; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE -; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS -; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN +; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS +; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN ; CHECK IN THIS CASE). ; ; THIS IS A NIBBLE READ. ; ; DE=BUFFER -; HL=LENGTH (0 FOR VARIABLE) +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) ; IMM_GETDATA: ; BRANCH TO CORRECT ROUTINE - LD A,H - OR L ; IF ZERO - JR NZ,IMM_GETDATALEN ; DO BURST READ + OR A + JR NZ,IMM_GETBLOCK ; DO BLOCK READ ; #IF (IMMTRACE >= 3) PRTS("\r\nGETDATA:$") @@ -871,7 +872,6 @@ IMM_GETDATA1: POP HL ; RESTORE BYTE COUNTER CP $98 ; CHECK FOR READ PHASE JR NZ,IMM_GETDATA2 ; IF NOT, ASSUME WE ARE DONE - IMM_WCTL($04) IMM_WCTL($06) CALL IMM_READSTATUS ; GET FIRST NIBBLE AND $F0 ; ISOLATE BITS @@ -888,8 +888,7 @@ IMM_GETDATA1: LD (DE),A ; AND SAVE THE FULL BYTE VALUE INC DE ; NEXT BUFFER POS INC HL ; INCREMENT BYTES COUNTER - IMM_WCTL($04) - IMM_WCTL($0C) + ;IMM_WCTL($04) JR IMM_GETDATA1 ; LOOP TILL DONE ; IMM_GETDATA2: @@ -900,57 +899,111 @@ IMM_GETDATA2: PRTS(" BYTES$") #ENDIF ; + IMM_WCTL($0C) RET ; -IMM_GETDATALEN: +IMM_GETBLOCK: ; #IF (IMMTRACE >= 3) - PRTS("\r\nGETDLEN:$") - CALL PC_SPACE - CALL PRTHEXWORDHL - PRTS(" BYTES$") + PRTS("\r\nGETBLK:$") #ENDIF ; IMM_WCTL($04) -IMM_GETDATALEN1: - IMM_WCTL($06) - CALL IMM_READSTATUS ; GET FIRST NIBBLE - AND $F0 ; ISOLATE BITS - RRCA ; MOVE TO LOW NIBBLE - RRCA - RRCA - RRCA - PUSH AF ; SAVE WORKING VALUE - IMM_WCTL($05) - CALL IMM_READSTATUS ; GET SECOND NIBBLE - AND $F0 ; ISOLATE BITS - POP BC ; RECOVER FIRST NIBBLE - OR B ; COMBINE - LD (DE),A ; SAVE FINAL BYTE VALUE - INC DE ; NEXT BUFFER POS - DEC HL ; DEC LOOP COUNTER - IMM_WCTL($04) - LD A,H ; CHECK LOOP COUNTER - OR L - JR NZ,IMM_GETDATALEN1 ; LOOP IF NOT DONE + LD B,0 ; LOOP COUNTER + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + ; SAVE ALT REGS + PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; C: PORT C + LD A,(IY+IMM_IOBASE) ; BASE PORT + INC A ; STATUS PORT + LD (IMM_GETBLOCK_A),A ; FILL IN + LD (IMM_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; DE: CLOCK VALUES +#IF (IMMMODE == IMMMODE_MG014) + LD D,$06 ^ ($0B | $80) + LD E,$05 ^ ($0B | $80) +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + LD D,$06 + LD E,$05 +#ENDIF + ; HL: STATMAP + LD H,MG014_STATMAPLO >> 8 + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + CALL IMM_GETBLOCK1 ; LOOP TWICE + CALL IMM_GETBLOCK1 ; ... FOR 512 BYTES + ; RESTORE ALT REGS + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + POP HL + POP DE + POP BC + POP AF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF IMM_WCTL($0C) RET ; +IMM_GETBLOCK1: + EXX ; ALT REGS + OUT (C),D ; SEND FIRST CLOCK +IMM_GETBLOCK_A .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (IMMMODE == IMMMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP LOW NIBBLE VALUE + EX AF,AF' ; ALT AF, SAVE NIBBLE +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SEND SECOND CLOCK +IMM_GETBLOCK_B .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (IMMMODE == IMMMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE + OR (HL) ; COMBINE WITH HIGH NIB VALUE +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI REGS + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR + DJNZ IMM_GETBLOCK1 ; LOOP + RET ; DONE +; ; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR -; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE -; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS +; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS ; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN ; CHECK IN THIS CASE). ; -; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES. -; ; DE=BUFFER -; HL=LENGTH (0 FOR VARIABLE) +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) ; IMM_PUTDATA: - LD A,H - OR L - JR NZ,IMM_PUTDATALEN + ; BRANCH TO CORRECT ROUTINE + OR A + JR NZ,IMM_PUTBLOCK ; DO BLOCK WRITE ; #IF (IMMTRACE >= 3) PRTS("\r\nPUTDATA:$") @@ -962,7 +1015,7 @@ IMM_PUTDATA1: POP HL ; RESTORE BYTE COUNTER CP $88 ; CHECK FOR WRITE PHASE JR NZ,IMM_PUTDATA2 ; IF NOT, ASSUME WE ARE DONE - IMM_WCTL($04) + ;IMM_WCTL($04) LD A,(DE) ; GET NEXT BYTE TO WRITE (FIRST OF PAIR) CALL IMM_WRITEDATA ; PUT ON BUS INC DE ; BUMP TO NEXT BUF POS @@ -986,33 +1039,47 @@ IMM_PUTDATA2: ; RET ; -IMM_PUTDATALEN: +IMM_PUTBLOCK: ; #IF (IMMTRACE >= 3) - PRTS("\r\nPUTDLEN:$") - CALL PC_SPACE - CALL PRTHEXWORDHL - PRTS(" BYTES$") + PRTS("\r\nPUTBLK:$") #ENDIF ; IMM_WCTL($04) -IMM_PUTDATALEN1: - LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR) - CALL IMM_WRITEDATA ; PUT ON BUS - INC DE ; INCREMENT BUF POS - DEC HL ; DEC LOOP COUNTER - IMM_WCTL($05) - LD A,(DE) ; GET NEXT BYTE (SECOND OF PAIR) - CALL IMM_WRITEDATA ; PUT ON BUS - INC DE ; INCREMENT BUF POS - DEC HL ; DEC LOOP COUNTER - IMM_WCTL($00) - LD A,H ; CHECK LOOP COUNTER - OR L - JR NZ,IMM_PUTDATALEN1 ; LOOP TILL DONE + LD B,0 ; LOOP COUNTER + LD A,(IY+IMM_IOBASE) ; GET BASE IO ADR + LD (IMM_PUTBLOCK_A),A ; FILL IN + LD (IMM_PUTBLOCK_B),A ; ... DYNAMIC BITS OF CODE + INC A ; STATUS PORT + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: CLOCK VALUES +#IF (IMMMODE == IMMMODE_MG014) + LD H,$05 ^ ($0B | $80) + LD L,$00 ^ ($0B | $80) +#ENDIF +#IF (IMMMODE == IMMMODE_SPP) + LD H,$05 + LD L,$00 +#ENDIF + CALL IMM_PUTBLOCK1 ; ONE LOOP CUZ BYTE PAIRS IMM_WCTL($04) RET ; +IMM_PUTBLOCK1: + LD A,(DE) ; GET NEXT BYTE +IMM_PUTBLOCK_A .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),H ; FIRST CLOCK + LD A,(DE) ; GET NEXT BYTE +IMM_PUTBLOCK_B .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),L ; SECOND CLOCK + DJNZ IMM_PUTBLOCK1 ; LOOP + RET ; DONE +; ; READ SCSI COMMAND STATUS ; IMM_GETSTATUS: @@ -1056,7 +1123,7 @@ IMM_ENDREAD: ; ; HL: COMMAND BUFFER ; DE: TRANSFER BUFFER -; BC: TRANSFER LENGTH (0=VARIABLE) +; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK) ; IMM_RUNCMD: ; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT @@ -1065,7 +1132,7 @@ IMM_RUNCMD: ; SEE IMM_CMD_ERR BELOW. LD (IMM_CMDSTK),SP ; FOR ERROR ABORTS LD (IMM_DSKBUF),DE ; SAVE BUF PTR - LD (IMM_XFRLEN),BC ; SAVE XFER LEN + LD (IMM_XFRMODE),A ; SAVE XFER LEN PUSH HL CALL IMM_CONNECT ; PARALLEL PORT BUS CONNECT CALL IMM_SELECT ; SELECT TARGET DEVICE @@ -1096,7 +1163,7 @@ IMM_RUNCMD_PHASE: ; IMM_RUNCMD_WRITE: LD DE,(IMM_DSKBUF) ; XFER BUFFER - LD HL,(IMM_XFRLEN) ; XFER LENGTH + LD A,(IMM_XFRMODE) ; XFER MODE CALL IMM_PUTDATA ; SEND DATA NOW JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH ; @@ -1105,7 +1172,7 @@ IMM_RUNCMD_READ: CALL IMM_WAIT ; WAIT TILL READY ; CHECK FOR STATUS $98??? LD DE,(IMM_DSKBUF) ; XFER BUFFER - LD HL,(IMM_XFRLEN) ; XFER LENGTH + LD A,(IMM_XFRMODE) ; XFER MODE CALL IMM_GETDATA ; GET THE DATA NOW CALL IMM_ENDREAD ; TERMINATE THE READ JR IMM_RUNCMD_PHASE ; BACK TO DISPATCH @@ -1162,7 +1229,7 @@ IMM_CHKCMD: IMM_CHKCMD1: ; USE REQUEST SENSE CMD TO GET ERROR DETAILS LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF - LD BC,0 ; VARIABLE LENGTH REQUEST + LD A,0 ; VARIABLE LENGTH REQUEST LD HL,IMM_CMD_SENSE ; REQUEST SENSE CMD CALL IMM_RUNCMD ; DO IT JP NZ,IMM_IOERR ; BAIL IF ERROR IN CMD @@ -1199,6 +1266,8 @@ IMM_CHKERR: ; (RE)INITIALIZE DEVICE ; IMM_INITDEV: +; +#IF (IMMMODE == IMMMODE_MG014) ; INITIALIZE 8255 LD A,(IY+IMM_IOBASE) ; BASE PORT ADD A,IMM_IOSETUP ; BUMP TO SETUP PORT @@ -1206,6 +1275,7 @@ IMM_INITDEV: LD A,$82 ; CONFIG A OUT, B IN, C OUT OUT (C),A ; DO IT CALL DELAY ; SHORT DELAY FOR BUS SETTLE +#ENDIF ; CALL IMM_DISCONNECT ; DISCONNECT FIRST JUST IN CASE CALL IMM_CONNECT ; NOW CONNECT TO BUS @@ -1227,7 +1297,7 @@ IMM_INITDEV1: ; ; REQUEST SENSE COMMAND LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA - LD BC,0 ; READ WHATEVER IS SENT + LD A,0 ; READ WHATEVER IS SENT LD HL,IMM_CMD_SENSE ; POINT TO CMD BUFFER CALL IMM_RUNCMD ; RUN THE SCSI ENGINE JR NZ,IMM_INITDEV2 ; CMD PROC ERROR @@ -1257,7 +1327,7 @@ IMM_INITDEV2: IMM_INITDEV3: ; READ & RECORD DEVICE CAPACITY LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE - LD BC,0 ; READ WHATEVER IS SENT + LD A,0 ; READ WHATEVER IS SENT LD HL,IMM_CMD_RDCAP ; POINT TO READ CAPACITY CMD CALL IMM_RUNCMD ; RUN THE SCSI ENGINE CALL Z,IMM_CHKCMD ; CHECK AND RECORD ANY ERRORS @@ -1420,7 +1490,7 @@ IMM_STR_NOHW .TEXT "NOT PRESENT$" IMM_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT IMM_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING IMM_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER -IMM_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH +IMM_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES) IMM_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS ; ; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index 38d5cc7a..af4bb390 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -10,10 +10,13 @@ ; ; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. ; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). +; - https://github.com/EtchedPixels/FUZIX +; - https://github.com/torvalds/linux ; -; 5/23/2023 WBW - INITIAL RELEASE -; 5/26/3023 WBW - CLEAN UP, LED ACTIVITY -; 5/27/2023 WBW - ADDED SPP MODE +; 05/23/2023 WBW - INITIAL RELEASE +; 05/26/3023 WBW - CLEAN UP, LED ACTIVITY +; 05/27/2023 WBW - ADDED SPP MODE +; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE ; ;============================================================================= ; @@ -71,8 +74,6 @@ ; ; TODO: ; -; - OPTIMIZE READ/WRITE LOOPS -; ; NOTES: ; ; - THIS DRIVER IS FOR THE ZIP DRIVE PPA INTERFACE. IT WILL SIMPLY @@ -138,6 +139,12 @@ PPA_LBA .EQU 8 ; OFFSET OF LBA (DWORD) #DEFINE PPA_DPUL(VAL) LD A,VAL \ CALL PPA_DPULSE #DEFINE PPA_CPUL(VAL) LD A,VAL \ CALL PPA_CPULSE ; +; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE +; +#IF (IMMMODE == IMMMODE_MG014) + #DEFINE MG014_MAP +#ENDIF +; ;============================================================================= ; INITIALIZATION ENTRY POINT ;============================================================================= @@ -231,6 +238,8 @@ PPA_DETECT: #IF (PPATRACE >= 3) PRTS("\r\nDETECT:$") #ENDIF +; +#IF (PPAMODE == PPAMODE_MG014) ; INITIALIZE 8255 LD A,(IY+PPA_IOBASE) ; BASE PORT ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT @@ -238,6 +247,7 @@ PPA_DETECT: LD A,$82 ; CONFIG A OUT, B IN, C OUT OUT (C),A ; DO IT CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE +#ENDIF ; PPA_WDATA($AA) CALL PPA_DISCONNECT @@ -345,7 +355,7 @@ PPA_IO: ; ; DO SCSI IO LD DE,(PPA_DSKBUF) ; DISK BUFFER TO DE - LD BC,512 ; ONE SECTOR, 512 BYTES + LD A,1 ; BLOCK I/O, ONE SECTOR LD HL,PPA_CMD_RW ; POINT TO READ/WRITE CMD TEMPLATE CALL PPA_RUNCMD ; RUN THE SCSI ENGINE CALL Z,PPA_CHKCMD ; IF EXIT OK, CHECK SCSI RESULTS @@ -599,21 +609,17 @@ PPA_SELECT: CALL PPA_WRITEDATA PPA_WCTL($08) ; - LD HL,500 ; TIMEOUT COUNTER -; + LD B,0 ; TIMEOUT COUNTER PPA_SELECT1: -#IF (PPATRACE >= 3) CALL PPA_READSTATUS +#IF (PPATRACE >= 3) CALL PC_SPACE CALL PRTHEXBYTE #ENDIF AND $40 CP $40 RET Z - DEC HL - LD A,H - OR L - JR NZ,PPA_SELECT1 + DJNZ PPA_SELECT1 JP PPA_CMD_TIMEOUT ; ; SEND SCSI CMD BYTE STRING. AT ENTRY, HL POINTS TO START OF @@ -677,14 +683,7 @@ PPA_WAIT: LD HL,500 ; GOOD VALUE??? PPA_WCTL($0C) CALL PPA_WAITLOOP - - ;CALL PC_SPACE - ;CALL PRTHEXBYTE - JP Z,PPA_CMD_TIMEOUT ; HANDLE TIMEOUT - ;PUSH AF - ;PPA_WCTL($04) - ;POP AF AND $F0 RET ; RETURN W/ RESULT IN A ; @@ -698,10 +697,6 @@ PPA_LONGWAIT1: CALL PPA_WAITLOOP JR NZ,PPA_LONGWAIT2 ; HANDLE SUCCESS DJNZ PPA_LONGWAIT1 ; LOOP TILL COUNTER EXHAUSTED - - ;CALL PC_SPACE - ;CALL PRTHEXBYTE - JP PPA_CMD_TIMEOUT ; HANDLE TIMEOUT ; PPA_LONGWAIT2: @@ -718,11 +713,6 @@ PPA_LONGWAIT2: POP AF #ENDIF ; - ;POP AF - - ;CALL PC_SPACE - ;CALL PRTHEXBYTE - AND $F0 RET ; RETURN W/ RESULT IN A ; @@ -750,21 +740,20 @@ PPA_GETBYTE: RET ; ; GET A CHUNK OF DATA FROM SCSI BUS. THIS IS SPECIFICALLY FOR -; READ PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE -; DATA IS BURST READ. IF NO LENGTH SPECIFIED, DATA IS READ AS -; LONG AS SCSI DEVICE WANTS TO CONTINUE SENDING (NO OVERRUN +; READ PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE READ. OTHERWISE, DATA IS WRITTEN AS +; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN ; CHECK IN THIS CASE). ; ; THIS IS A NIBBLE READ. ; ; DE=BUFFER -; HL=LENGTH (0 FOR VARIABLE) +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) ; PPA_GETDATA: ; BRANCH TO CORRECT ROUTINE - LD A,H - OR L ; IF ZERO - JR NZ,PPA_GETDATALEN ; DO BURST READ + OR A + JR NZ,PPA_GETBLOCK ; DO BLOCK READ ; #IF (PPATRACE >= 3) PRTS("\r\nGETDATA:$") @@ -805,53 +794,105 @@ PPA_GETDATA2: PPA_WCTL($0C) RET ; -PPA_GETDATALEN: +PPA_GETBLOCK: ; #IF (PPATRACE >= 3) - PRTS("\r\nGETDLEN:$") - CALL PC_SPACE - CALL PRTHEXWORDHL - PRTS(" BYTES$") + PRTS("\r\nGETBLK:$") #ENDIF -; -PPA_GETDATALEN1: - PPA_WCTL($04) - CALL PPA_READSTATUS ; GET FIRST NIBBLE - AND $F0 ; ISOLATE BITS - PUSH AF ; SAVE WORKING VALUE - PPA_WCTL($06) - CALL PPA_READSTATUS ; GET SECOND NIBBLE - AND $F0 ; ISOLATE BITS - RRCA ; MOVE TO LOW NIBBLE - RRCA - RRCA - RRCA - POP BC ; RECOVER FIRST NIBBLE - OR B ; COMBINE - LD (DE),A ; SAVE FINAL BYTE VALUE - INC DE ; NEXT BUFFER POS - DEC HL ; DEC LOOP COUNTER - LD A,H ; CHECK LOOP COUNTER - OR L - JR NZ,PPA_GETDATALEN1 ; LOOP IF NOT DONE - PPA_WCTL($0C) + LD B,0 ; LOOP COUNTER + EXX ; SWITCH TO ALT + EX AF,AF' ; SWITCH TO ALT AF + ; SAVE ALT REGS + PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; C: PORT C + LD A,(IY+PPA_IOBASE) ; BASE PORT + INC A ; STATUS PORT + LD (PPA_GETBLOCK_A),A ; FILL IN + LD (PPA_GETBLOCK_B),A ; ... DYNAMIC BITS OF CODE + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; DE: CLOCK VALUES +#IF (PPAMODE == PPAMODE_MG014) + LD D,$04 ^ ($0B | $80) + LD E,$06 ^ ($0B | $80) +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + LD D,$04 + LD E,$06 +#ENDIF + ; HL: STATMAP + LD H,MG014_STATMAPLO >> 8 + EXX ; SWITCH TO PRI + CALL PPA_GETBLOCK1 ; LOOP TWICE + CALL PPA_GETBLOCK1 ; ... FOR 512 BYTES + ; RESTORE ALT REGS + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + POP HL + POP DE + POP BC + POP AF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF RET ; +; +PPA_GETBLOCK1: + EXX ; ALT REGS + OUT (C),D ; SEND FIRST CLOCK +PPA_GETBLOCK_A .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (PPAMODE == PPAMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP HIGH NIBBLE VALUE + EX AF,AF' ; SAVE NIBBLE +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SEND SECOND CLOCK +PPA_GETBLOCK_B .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (PPAMODE == PPAMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; RECOVER HIGH NIBBLE VALUE + OR (HL) ; COMBINE WITH LOW NIB VALUE +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR + DJNZ PPA_GETBLOCK1 ; LOOP + RET ; DONE +; ; PUT A CHUNK OF DATA TO THE SCSI BUS. THIS IS SPECIFICALLY FOR -; WRITE PHASE. IF A LENGTH IS SPECIFIED (NON-ZERO HL), THEN THE -; DATA IS BURST WRITTEN. IF NO LENGTH SPECIFIED, DATA IS WRITTEN AS +; WRITE PHASE. IF TRANSFER MODE IS NON-ZERO, THEN A BLOCK (512 BYTES) +; OF DATA WILL BE WRITTEN. OTHERWISE, DATA IS WRITTEN AS ; LONG AS SCSI DEVICE WANTS TO CONTINUE RECEIVING (NO OVERRUN ; CHECK IN THIS CASE). ; -; READS ARE DONE AS BYTE PAIRS. EACH LOOP READS 2 BYTES. -; ; DE=BUFFER -; HL=LENGTH (0 FOR VARIABLE) +; A=TRANSFER MODE (0=VARIABLE, 1=BLOCK) ; PPA_PUTDATA: - LD A,H - OR L - JR NZ,PPA_PUTDATALEN + ; BRANCH TO CORRECT ROUTINE + OR A + JR NZ,PPA_PUTBLOCK ; DO BLOCK WRITE ; #IF (PPATRACE >= 3) PRTS("\r\nPUTDATA:$") @@ -882,27 +923,41 @@ PPA_PUTDATA2: ; RET ; -PPA_PUTDATALEN: +PPA_PUTBLOCK: ; #IF (PPATRACE >= 3) - PRTS("\r\nPUTDLEN:$") - CALL PC_SPACE - CALL PRTHEXWORDHL - PRTS(" BYTES$") + PRTS("\r\nPUTBLK:$") #ENDIF ; -PPA_PUTDATALEN1: - LD A,(DE) ; GET NEXT BYTE (FIRST OF PAIR) - CALL PPA_WRITEDATA ; PUT ON BUS - INC DE ; INCREMENT BUF POS - DEC HL ; DEC LOOP COUNTER - PPA_WCTL($0E) - PPA_WCTL($0C) - LD A,H ; CHECK LOOP COUNTER - OR L - JR NZ,PPA_PUTDATALEN1 ; LOOP TILL DONE + LD B,0 ; LOOP COUNTER + LD A,(IY+PPA_IOBASE) ; GET BASE IO ADR + LD (PPA_PUTBLOCK_A),A ; FILL IN + INC A ; STATUS PORT + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: CLOCK VALUES +#IF (PPAMODE == PPAMODE_MG014) + LD H,$0E ^ ($0B | $80) + LD L,$0C ^ ($0B | $80) +#ENDIF +#IF (PPAMODE == PPAMODE_SPP) + LD H,$0E + LD L,$0C +#ENDIF + CALL PPA_PUTBLOCK1 ; DO BELOW TWICE + CALL PPA_PUTBLOCK1 ; ... FOR 512 BYTES RET ; +PPA_PUTBLOCK1: + LD A,(DE) ; GET NEXT BYTE +PPA_PUTBLOCK_A .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),H ; FIRST CLOCK + OUT (C),L ; SECOND CLOCK + DJNZ PPA_PUTBLOCK1 ; LOOP + RET ; DONE +; ; READ SCSI COMMAND STATUS ; PPA_GETSTATUS: @@ -937,7 +992,7 @@ PPA_GETSTATUS: ; ; HL: COMMAND BUFFER ; DE: TRANSFER BUFFER -; BC: TRANSFER LENGTH (0=VARIABLE) +; A: TRANSFER MODE (0=VARIABLE, 1=BLOCK) ; PPA_RUNCMD: ; THERE ARE MANY PLACES NESTED WITHIN THE ROUTINES THAT @@ -946,7 +1001,7 @@ PPA_RUNCMD: ; SEE PPA_CMD_ERR BELOW. LD (PPA_CMDSTK),SP ; FOR ERROR ABORTS LD (PPA_DSKBUF),DE ; SAVE BUF PTR - LD (PPA_XFRLEN),BC ; SAVE XFER LEN + LD (PPA_XFRMODE),A ; SAVE XFER LEN PUSH HL CALL PPA_CONNECT ; PARALLEL PORT BUS CONNECT CALL PPA_SELECT ; SELECT TARGET DEVICE @@ -977,24 +1032,18 @@ PPA_RUNCMD_PHASE: ; PPA_RUNCMD_WRITE: LD DE,(PPA_DSKBUF) ; XFER BUFFER - LD HL,(PPA_XFRLEN) ; XFER LENGTH + LD A,(PPA_XFRMODE) ; XFER MODE CALL PPA_PUTDATA ; SEND DATA NOW JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH ; PPA_RUNCMD_READ: - ;CALL PPA_NEGOTIATE ; NEGOTIATE FOR READ - ;CALL PPA_WAIT ; WAIT TILL READY LD DE,(PPA_DSKBUF) ; XFER BUFFER - LD HL,(PPA_XFRLEN) ; XFER LENGTH + LD A,(PPA_XFRMODE) ; XFER MODE CALL PPA_GETDATA ; GET THE DATA NOW - ;CALL PPA_ENDREAD ; TERMINATE THE READ JR PPA_RUNCMD_PHASE ; BACK TO DISPATCH ; PPA_RUNCMD_END: - ;CALL PPA_NEGOTIATE ; NEGOTIATE FOR READ (STATUS) - ;CALL PPA_WAIT ; WAIT TILL READY CALL PPA_GETSTATUS ; READ STATUS BYTES - ;CALL PPA_ENDREAD ; TERMINATE THE READ CALL PPA_DISCONNECT ; PARALLEL PORT BUS DISCONNECT XOR A ; SIGNAL SUCCESS RET @@ -1041,7 +1090,7 @@ PPA_CHKCMD: PPA_CHKCMD1: ; USE REQUEST SENSE CMD TO GET ERROR DETAILS LD DE,HB_WRKBUF ; PUT DATA IN WORK BUF - LD BC,0 ; VARIABLE LENGTH REQUEST + LD A,0 ; VARIABLE LENGTH READ LD HL,PPA_CMD_SENSE ; REQUEST SENSE CMD CALL PPA_RUNCMD ; DO IT JP NZ,PPA_IOERR ; BAIL IF ERROR IN CMD @@ -1078,6 +1127,8 @@ PPA_CHKERR: ; (RE)INITIALIZE DEVICE ; PPA_INITDEV: +; +#IF (PPAMODE == PPAMODE_MG014) ; INITIALIZE 8255 LD A,(IY+PPA_IOBASE) ; BASE PORT ADD A,PPA_IOSETUP ; BUMP TO SETUP PORT @@ -1085,6 +1136,7 @@ PPA_INITDEV: LD A,$82 ; CONFIG A OUT, B IN, C OUT OUT (C),A ; DO IT CALL DELAY ; SHORT DELAY FOR BUS SETTLE +#ENDIF ; ; BUS RESET CALL PPA_CONNECT @@ -1106,7 +1158,7 @@ PPA_INITDEV1: ; ; REQUEST SENSE COMMAND LD DE,HB_WRKBUF ; BUFFER FOR SENSE DATA - LD BC,0 ; READ WHATEVER IS SENT + LD A,0 ; READ WHATEVER IS SENT LD HL,PPA_CMD_SENSE ; POINT TO CMD BUFFER CALL PPA_RUNCMD ; RUN THE SCSI ENGINE JR NZ,PPA_INITDEV2 ; CMD PROC ERROR @@ -1131,7 +1183,7 @@ PPA_INITDEV2: PPA_INITDEV3: ; READ & RECORD DEVICE CAPACITY LD DE,HB_WRKBUF ; BUFFER TO CAPACITY RESPONSE - LD BC,0 ; READ WHATEVER IS SENT + LD A,0 ; READ WHATEVER IS SENT LD HL,PPA_CMD_RDCAP ; POINT TO READ CAPACITY CMD CALL PPA_RUNCMD ; RUN THE SCSI ENGINE CALL Z,PPA_CHKCMD ; CHECK AND RECORD ANY ERRORS @@ -1295,7 +1347,7 @@ PPA_STR_NOHW .TEXT "NOT PRESENT$" PPA_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT PPA_CMDSTK .DW 0 ; STACK PTR FOR CMD ABORTING PPA_DSKBUF .DW 0 ; WORKING DISK BUFFER POINTER -PPA_XFRLEN .DW 0 ; WORKING TRANSFER LENGTH +PPA_XFRMODE .DB 0 ; 0=VARIABLE, 1=BLOCK (512 BYTES) PPA_CMDSTAT .DB 0, 0 ; CMD RESULT STATUS ; ; SCSI COMMAND TEMPLATES (LENGTH PREFIXED) diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm index ffea9b32..ca31255f 100644 --- a/Source/HBIOS/syq.asm +++ b/Source/HBIOS/syq.asm @@ -10,8 +10,11 @@ ; ; CREATED BY WAYNE WARTHEN FOR ROMWBW HBIOS. ; MUCH OF THE CODE IS DERIVED FROM LINUX AND FUZIX (ALAN COX). +; - https://github.com/EtchedPixels/FUZIX +; - https://github.com/torvalds/linux ; -; 5/29/2023 WBW - INITIAL RELEASE +; 05/29/2023 WBW - INITIAL RELEASE +; 06/06/2023 WBW - OPTIMIZE BLOCK READ AND WRITE ; ;============================================================================= ; @@ -71,9 +74,9 @@ ; ; - STRAIGHTEN OUT TIMEOUTS ; -; - CODE NEEDS TO BE REORGANIZED +; - REVIEW/ADD CODE COMMENTS ; -; - OPTIMIZE READ/WRITE LOOPS +; - CODE NEEDS TO BE REORGANIZED ; ; NOTES: ; @@ -194,6 +197,12 @@ SYQ_TOPICO .EQU 50 ; RC2014 SD PICO (5 SECONDS) #DEFINE SYQ_WR(REG,VAL) LD C,REG \ LD A,VAL \ CALL SYQ_WRITEREG #DEFINE SYQ_RR(REG) LD C,REG \ CALL SYQ_READREG ; +; INCLUDE MG014 NIBBLE MAP FOR MG014 MODE +; +#IF (SYQMODE == SYQMODE_MG014) + #DEFINE MG014_MAP +#ENDIF +; ;============================================================================= ; INITIALIZATION ENTRY POINT ;============================================================================= @@ -288,6 +297,7 @@ SYQ_DETECT: PRTS("\r\nDETECT:$") #ENDIF ; +#IF (SYQMODE == SYQMODE_MG014) ; INITIALIZE 8255 LD A,(IY+SYQ_IOBASE) ; BASE PORT ADD A,SYQ_IOSETUP ; BUMP TO SETUP PORT @@ -295,6 +305,7 @@ SYQ_DETECT: LD A,$82 ; CONFIG A OUT, B IN, C OUT OUT (C),A ; DO IT CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE +#ENDIF ; ; WE USE THIS SEQUENCE TO DETECT AN ACTUAL SYQ DEVICE ON THE ; PARALLEL PORT. THE VALUES RECORDED IN THE FINAL CALL TO @@ -557,7 +568,7 @@ SYQ_READSTATUS: INC C ; BUMP TO STATUS PORT IN A,(C) ; READ IT ; -#IF (SYQMODE == SYQMODE_MG014) +#IF (SYQMODE == SYQMODE_MG014 ; ; SHUFFLE BITS ON MG014 LD C,0 ; INIT RESULT @@ -869,110 +880,197 @@ SYQ_GETRES: #ENDIF JP SYQ_CMD_CMDERR ; -; HL= BUFFER +; ; SYQ_GETBUF: SYQ_W0(7) SYQ_W2(1) SYQ_W2(3) SYQ_W0($FF) + + LD B,0 ; LOOP COUNTER + LD DE,(SYQ_DSKBUF) ; INIT BUFFER PTR + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + ; SAVE ALT REGS + PUSH AF + PUSH BC + PUSH DE + PUSH HL + ; C: PORT C + LD A,(IY+SYQ_IOBASE) ; BASE PORT + INC A ; STATUS PORT + LD (SYQ_GETBUF_A),A ; FILL IN + LD (SYQ_GETBUF_B),A ; ... DYNAMIC BITS OF CODE + LD (SYQ_GETBUF_C),A ; + LD (SYQ_GETBUF_D),A ; + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: STATMAP + LD H,MG014_STATMAPLO >> 8 + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + CALL SYQ_GETBUF1 ; 256 WORDS + ; RESTORE ALT REGS + EXX ; SWITCH TO ALT REGS + EX AF,AF' ; SWITCH TO ALT AF + POP HL + POP DE + POP BC + POP AF + EXX ; SWITCH TO PRI REGS + EX AF,AF' ; SWITCH TO PRI AF + SYQ_W0(0) + SYQ_W2(4) +; + XOR A ; SIGNAL SUCCESS + RET ; - LD HL,(SYQ_DSKBUF) ; INIT BUFFER PTR - LD B,0 ; READ 256 WORDS SYQ_GETBUF1: ; ; FIRST BYTE - SYQ_W2(6) - SYQ_R1 ; GET LOW NIBBLE - PUSH AF ; SAVE NIBBLE -; BIT 3,A ; IF BIT SET -; JR NZ,SYQ_GETBUF2 ; USE SAVE VALUE FOR NEXT NIBBLE - SYQ_W2(4) - SYQ_R1 ; GET HIGH NIBBLE -;SYQ_GETBUF2: - AND $F0 ; TOP BITS FOR SECOND NIBBLE - LD C,A ; SAVE IN C - POP AF ; RECOVER FIRST NIBBLE - RRCA ; MOVE TO LOW BITS - RRCA - RRCA - RRCA - AND $0F ; ONLY LOW BITS - OR C ; COMBINE - LD (HL),A ; SAVE IT - INC HL ; BUMP BUF PTR - ;CALL PC_SPACE - ;CALL PRTHEXBYTE -; - ; SPECIAL HANDLING FOR LAST BYTE - LD A,B ; GET ITERATION COUNTER - CP 1 ; LAST ITERATION? - JR NZ,SYQ_GETBUF3 ; IF NOT, BYPASS - SYQ_W0($FD) ; LAST BYTE ACTION -SYQ_GETBUF3: + EXX ; ALT REGS +; + ; DE: CLOCK VALUES FOR FIRST BYTE +#IF (SYQMODE == SYQMODE_MG014) + LD D,$06 ^ ($0B | $80) + LD E,$04 ^ ($0B | $80) +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + LD D,$06 + LD E,$04 +#ENDIF + OUT (C),D ; FIRST CLOCK +SYQ_GETBUF_A .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP LOW NIBBLE VALUE + EX AF,AF' ; ALT AF, SAVE NIBBLE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SECOND CLOCK +SYQ_GETBUF_B .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE + OR (HL) ; COMBINE WITH HIGH NIB VALUE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI REGS + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR ; ; SECOND BYTE - SYQ_W2(7) - SYQ_R1 ; GET LOW NIBBLE - PUSH AF ; SAVE NIBBLE -; BIT 3,A ; IF BIT SET -; JR NZ,SYQ_GETBUF4 ; USE SAVE VALUE FOR NEXT NIBBLE - SYQ_W2(5) - SYQ_R1 ; GET HIGH NIBBLE -;SYQ_GETBUF4: - AND $F0 ; TOP BITS FOR SECOND NIBBLE - LD C,A ; SAVE IN C - POP AF ; RECOVER FIRST NIBBLE - RRCA ; MOVE TO LOW BITS - RRCA - RRCA - RRCA - AND $0F ; ONLY LOW BITS - OR C ; COMBINE - LD (HL),A ; SAVE IT - INC HL ; BUMP BUF PTR - ;CALL PC_SPACE - ;CALL PRTHEXBYTE + EXX ; ALT REGS ; - DJNZ SYQ_GETBUF1 ; LOOP TILL DONE + ; DE: CLOCK VALUES FOR SECOND BYTE +#IF (SYQMODE == SYQMODE_MG014) + LD D,$07 ^ ($0B | $80) + LD E,$05 ^ ($0B | $80) +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + LD D,$07 + LD E,$05 +#ENDIF + OUT (C),D ; FIRST CLOCK +SYQ_GETBUF_C .EQU $+1 + IN A,($FF) ; GET LOW NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPLO & $FF ; LOW BYTE OF MAP PTR + LD L,A ; PUT IN L + LD A,(HL) ; LOOKUP LOW NIBBLE VALUE + EX AF,AF' ; ALT AF, SAVE NIBBLE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + RLCA ; MOVE TO LOW NIBBLE + LD L,A ; SAVE NIBBLE IN L +#ENDIF + OUT (C),E ; SECOND CLOCK +SYQ_GETBUF_D .EQU $+1 + IN A,($FF) ; GET HIGH NIBBLE +#IF (SYQMODE == SYQMODE_MG014) + AND $0F ; RELEVANT BITS ONLY + ADD A,MG014_STATMAPHI & $FF ; HIGH BYTE OF MAP PTR + LD L,A ; PUT IN L + EX AF,AF' ; PRI AF, RECOVER LOW NIBBLE VALUE + OR (HL) ; COMBINE WITH HIGH NIB VALUE +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + AND $F0 ; RELEVANT BITS ONLY + OR L ; COMBINE WITH HIGH NIB VALUE +#ENDIF + EXX ; SWITCH TO PRI REGS + LD (DE),A ; SAVE BYTE + INC DE ; BUMP BUF PTR ; - SYQ_W0(0) - SYQ_W2(4) + DJNZ SYQ_GETBUF1 ; LOOP + RET ; DONE ; - XOR A ; SIGNAL SUCCESS - RET ; -; HL= BUFFER ; SYQ_PUTBUF: SYQ_W0($67) SYQ_W2(1) SYQ_W2(5) ; - LD HL,(SYQ_DSKBUF) ; INIT BUFFER PTR + LD DE,(SYQ_DSKBUF) ; INIT BUFFER PTR LD B,0 ; READ 256 WORDS -SYQ_PUTBUF1: -; - ; FIRST BYTE - LD A,(HL) - INC HL - CALL SYQ_WRITEDATA - SYQ_W2(4) -; - ; SECOND BYTE - LD A,(HL) - INC HL - CALL SYQ_WRITEDATA - SYQ_W2(5) -; - DJNZ SYQ_PUTBUF1 -; + LD A,(IY+SYQ_IOBASE) ; GET BASE IO ADR + LD (SYQ_PUTBUF_A),A ; FILL IN + LD (SYQ_PUTBUF_B),A ; ... DYNAMIC BITS OF CODE + INC A ; STATUS PORT + INC A ; CONTROL PORT + LD C,A ; ... TO C + ; HL: CLOCK VALUES +#IF (SYQMODE == SYQMODE_MG014) + LD H,$04 ^ ($0B | $80) + LD L,$05 ^ ($0B | $80) +#ENDIF +#IF (SYQMODE == SYQMODE_SPP) + LD H,$04 + LD L,$05 +#ENDIF + CALL SYQ_PUTBUF1 ; ONE LOOP CUZ BYTE PAIRS SYQ_W2(7) SYQ_W2(4) ; XOR A RET - +; +SYQ_PUTBUF1: + LD A,(DE) ; GET NEXT BYTE +SYQ_PUTBUF_A .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),H ; FIRST CLOCK + LD A,(DE) ; GET NEXT BYTE +SYQ_PUTBUF_B .EQU $+1 + OUT ($FF),A ; PUT ON BUS + INC DE ; INCREMENT BUF POS + OUT (C),L ; SECOND CLOCK + DJNZ SYQ_PUTBUF1 ; LOOP + RET ; DONE ; ; CHECK CURRENT DEVICE FOR ERROR STATUS AND ATTEMPT TO RECOVER ; VIA RESET IF DEVICE IS IN ERROR. @@ -991,6 +1089,7 @@ SYQ_INITDEV: PRTS("\r\nINITDEV:$") #ENDIF ; +#IF (SYQMODE == SYQMODE_MG014) ; INITIALIZE 8255 LD A,(IY+SYQ_IOBASE) ; BASE PORT ADD A,SYQ_IOSETUP ; BUMP TO SETUP PORT @@ -998,6 +1097,7 @@ SYQ_INITDEV: LD A,$82 ; CONFIG A OUT, B IN, C OUT OUT (C),A ; DO IT CALL DELAY ; SHORT DELAY FOR BUS SETTLE +#ENDIF ; CALL SYQ_CONNECT ; NOW CONNECT TO BUS CALL SYQ_DISCONNECT ; DISCONNECT FIRST JUST IN CASE diff --git a/Source/ver.inc b/Source/ver.inc index b905ecf4..189b5f35 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 3 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.3.0-dev.20" +#DEFINE BIOSVER "3.3.0-dev.21" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 6a478d3e..698bc076 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 3 rup equ 0 rtp equ 0 biosver macro - db "3.3.0-dev.20" + db "3.3.0-dev.21" endm