From 45ea46b10553a5b0e72b9582d72a8e07cd607930 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 3 Jun 2023 14:27:33 -0700 Subject: [PATCH] Small Bug Fix for PPA/IMM/SYQ Drivers Credit to Mark Elkin for testing and finding this issue. --- Doc/ChangeLog.txt | 4 +- Source/HBIOS/imm.asm | 81 ++++++++++++++++----------- Source/HBIOS/ppa.asm | 5 +- Source/HBIOS/syq.asm | 8 ++- Source/Images/Common/All/FDISK80.COM | Bin 17024 -> 17024 bytes Source/RomDsk/ROM_1024KB/FDISK80.COM | Bin 17024 -> 17024 bytes Source/RomDsk/ROM_512KB/FDISK80.COM | Bin 17024 -> 17024 bytes Source/ver.inc | 2 +- Source/ver.lib | 2 +- 9 files changed, 61 insertions(+), 41 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 540fd2a2..9c7d7591 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -7,7 +7,9 @@ Version 3.3 - WBW: Support per-drive floppy configuration - WBW: Support for Bill Shen's VGARC - WBW: Support for MG014 Parallel Port module + printer -- WBW: Support for Zip Drive on emm interface (much inspiration from Alan Cox) +- WBW: Support for EMM Zip Drive on PPI interface (much inspiration from Alan Cox) +- WBW: Support for PPA Zip Drive on PPI interface (much inspiration from Alan Cox) +- WBW: Support for SyQuest SparQ Drive on PPI interface (much inspiration from Alan Cox) Version 3.2.1 ------------- diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 7e59d1db..19c1b54a 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -235,28 +235,51 @@ IMM_DETECT: OUT (C),A ; DO IT CALL DELAY ; BRIEF DELAY FOR GOOD MEASURE ; - ; WE USE THIS SEQUENCE TO DETECT AN ACTUAL IMM DEVICE ON THE - ; PARALLEL PORT. THE VALUES RECORDED IN THE FINAL CALL TO - ; IMM_DISCONNECT ARE USED TO CONFIRM DEVICE PRESENCE. - ; NO ACTUAL SCSI COMMANDS ARE USED. + ; ATTEMPT TO ESTABLISH A CONNECTION TO THE IMM DEVICE AND + ; ISSUE A SCSI BUS RESET. WE DON'T KNOW IF DEVICE IS THERE + ; YET. THIS IS DONE BLIND ASSUMING IT IS THERE. CALL IMM_DISCONNECT CALL IMM_CONNECT - CALL IMM_DISCONNECT + CALL IMM_RESETPULSE ; ISSUE A SCSI BUS RESET + LD DE,62 ; WAIT A BIT + CALL VDELAY ; - ; THE IMM_SN VALUES ARE RECORDED IN THE CPP ROUTINE USED BY - ; IMM_CONNECT/DISCONNECT. - ; EXPECTING S1=$B8, S2=$18, S3=$38 - LD A,(IMM_S1) - CP $B8 - RET NZ - LD A,(IMM_S2) - CP $18 - RET NZ - LD A,(IMM_S3) - CP $38 - RET NZ + ; USE AN ABBREVIATED VERSION OF SELECT PROCESSING TO + ; CHECK IF DEVICE EXISTS. + IMM_WCTL($0C) + CALL IMM_READSTATUS ; - XOR A +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + ; READY FOR SELECT? + AND $08 + CP $00 + JR NZ,IMM_DETECT1 +; + IMM_WCTL($04) + LD A,$80 | (1 << IMM_TGT) + CALL IMM_WRITEDATA + IMM_WCTL($0C) + IMM_WCTL($0D) + CALL DELAY + CALL IMM_READSTATUS +; +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF +; + ; DID SELECT SUCCEED? + AND $08 + CP $08 +; +IMM_DETECT1: + PUSH AF + CALL IMM_DISCONNECT + POP AF RET ; ;============================================================================= @@ -305,10 +328,12 @@ IMM_WRITE: ; ; IMM_IO: - LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + PUSH HL CALL IMM_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + POP HL JR NZ,IMM_IO3 ; BAIL OUT ON ERROR ; + LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; SETUP LBA ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IMM_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB) @@ -610,6 +635,10 @@ IMM_SELECT: ; IMM_SELECT1: CALL IMM_READSTATUS +#IF (IMMTRACE >= 3) + CALL PC_SPACE + CALL PRTHEXBYTE +#ENDIF AND $08 JR Z,IMM_SELECT2 ; IF CLEAR, MOVE ON DEC HL @@ -623,22 +652,8 @@ IMM_SELECT2: ; PLACE HOST AND TARGET BIT ON DATA BUS LD A,$80 | (1 << IMM_TGT) CALL IMM_WRITEDATA - CALL DELAY ; CONFIRM DELAY TIME? IMM_WCTL($0C) -; -#IF (IMMTRACE >= 3) - CALL IMM_READSTATUS - CALL PC_SPACE - CALL PRTHEXBYTE -#ENDIF -; IMM_WCTL($0D) -; -#IF (IMMTRACE >= 3) - CALL IMM_READSTATUS - CALL PC_SPACE - CALL PRTHEXBYTE -#ENDIF ; LD HL,500 ; TIMEOUT COUNTER ; diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index 94bc5243..38d5cc7a 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -324,10 +324,12 @@ PPA_WRITE: ; ; PPA_IO: - LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + PUSH HL CALL PPA_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + POP HL JR NZ,PPA_IO3 ; BAIL OUT ON ERROR ; + LD (PPA_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; SETUP LBA ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPA_CMD_RW+1 ; START OF LBA FIELD IN CDB (MSB) @@ -595,7 +597,6 @@ PPA_SELECT: PPA_WCTL($0C) LD A,1 << PPA_SELF CALL PPA_WRITEDATA - LD A,$08 \ CALL PPA_WRITECTRL PPA_WCTL($08) ; LD HL,500 ; TIMEOUT COUNTER diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm index a503c808..ffea9b32 100644 --- a/Source/HBIOS/syq.asm +++ b/Source/HBIOS/syq.asm @@ -393,15 +393,17 @@ SYQ_WRITE: ; ; SYQ_IO: - LD (SYQ_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS - LD A,B ; XFR MODE TO ACCUM - LD (SYQ_XFRMODE),A ; AND SAVE IT FOR CMD ; PUSH BC ; SAVE MODE/COMMAND + PUSH HL ; SAVE DISK BUF PTR CALL SYQ_CHKERR ; CHECK FOR ERR STATUS AND RESET IF SO + POP HL ; RECOVER DISK BUF PTR POP BC ; RECOVER MODE/COMMAND JR NZ,SYQ_IO1 ; BAIL OUT ON ERROR ; + LD A,B ; XFR MODE TO ACCUM + LD (SYQ_XFRMODE),A ; AND SAVE IT FOR CMD + LD (SYQ_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,SYQ_LBA ; LBA OFFSET IN CONFIG CALL LDHLIYA ; POINT TO LBA DWORD CALL LD32 ; SET DE:HL TO LBA diff --git a/Source/Images/Common/All/FDISK80.COM b/Source/Images/Common/All/FDISK80.COM index 7e862d67ad7a5fc3d1a590592acc0bab94b74bf1..2a565dae02b34c6361ba6c7fd9e45e65a0ae102e 100644 GIT binary patch delta 2975 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 VLd&Q_mkqJfn;wu|5AWC3{0nB+J@Ehl delta 2925 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 VLd&Q_mkqJfn;wu|5AWC3{0nB+J@Ehl delta 2925 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 VLd&Q_mkqJfn;wu|5AWC3{0nB+J@Ehl delta 2925 zcmcImYj6|S72Xw+Oc*xi?dL_3zabuI znUb~*G9a7c&{i?(mT+vG;dz_vPDs7Z)DeGHahZX03Kg<`tmo0K%jT*s^A3u|{<;gd z6$#Rm_=U6_dj)sO}-zx$X_czc`MDs4e~()-;36bqmBe>8%Kde zJjzbyW9M7PQFkIZG<>xfdK4YaSBsNic_`_nsHB(1ACV#Hok0T?pLmLM1Uw`_<j|GPe-6G_k&N(SlVdsM7Nje=s-JC1@9)SI})$rO}2I23DvKPldiXI82- zkpZ+Qt15K>Jdwmb~!};ot!l7o| zVm{8{qVQ)9$F{=rY6T5oRNdmdq`|mj8nEJBV_OJJXgIc?0qxWsK=pC#M>NmZQhnF< zSaX3zOA7I7R?Hq`5{U$uo;J3JYL|wt9Ekl}%N{L2yQa|2>BVz%$bhU8S%FS9Lsq1V z#=%$#b_zexd`E}0IM_X{y*;YFVE^*{l5-iy{-vm1!HkPa-EjU%;)11~tQQH&>Oh;L1 zN`H$!tHT5BhkS`L2hSsc=YhP594OaqqYL0cU5izwC*DZI@H8Kz?qqPt+5>Vab(~}8 z>G%;)ka~spbk&kl0*3Zdjl4jAhpl6HRUUBbIZ!UhSC%#u4l<}si~^GEAwvncB#7J1 z4Ktx0H{xx59K;0?U%HYcy+FSXAJU)covPM3Bm=bTG1{3#JEl<2Gzw-8#SX*!`f4(D ztHFVh9R@F9UNtB&bH?z35|?zBl=L)YViw7;-E4=;fI(w2;;=p=+B${0r#X;oPSqOu zVir6KO0(^l$3+nKBB+qG5Hwb4feKQJ!I-v88K)M%o&Lz(GR z@c=>L4q`W8_$eT2s*t`l3&%faf)7otIY7yy34HL|Hub{u4h9Bi{Z@`Q>zUkdT2i?; zC>ku-Zm}f}GRxAwuUp_-=5nnC^EhLgqGUAHDE?I=^`qObVen+s0zWnT^8QQ=uUkL| z!9j=R{7kaE_6;F=txZ^j&n@*CucTfbWvl$h|5IJDayje<*9N1E{A=1!X}3;)ZyL+U8UhIO#dHajnMB#A$m*X9>wb@P}Ip`wxE@yGpgo^|B1#XGcYs+#AEwVosiUeJ(SNqkK zVa-U35;o9)G5zqY(<0sCnrezoRKn}d+4UP;arU2PKC%VVCOx6-kup5zuk{mG`QeOo z_s1%6f>$deTi~Kf^|#&!ylMrTu&LU~1@m!8HJ`mlk8>e95Brkl-1|Si z?RR0*WiE~b%_JLg{&BOOPi3FB&jej5zV;Jx=`F7W+XxTY%1#Ai*x0ja{mxBYhHA&+ z^?MwQi*behE(tBUh%qg2k-I$ow$HuM*vVj-hn(=sKuq~K^1!!SRJfo8C8QaZhGQb~ zD*o0;oJ+8yPv0Y>46I_TqG%Ib%e0Heo8UR7g4V&mF-BS!o@S(U)<6>qPG2(*?}hoE z-TC89d=>Ic4i9*c=TT$;p71Qqn)D#=C>@#fz%M*{9p*6JX;7eG0-gD?et6Pz4u2z| z-Y*HFVz%YL2`@pE$G$I6hjlMu{jmXoZHfI{pmSqcJ|Yjq%mSSsOF3>$%NL~iMb?!B zwj?GOVC}Ka8p1D&jR|g+r(r8%YC*p$rmqxU)?h`X+=sk(N#@9VFGcRB2%jPk2s!Sp zc~bT&A1QkkoaeQP5>2qj+eLczv3G99m1;b7H8fV6h-6+hGkcY94?6L9H#(L43pNWr zKDGn}ldsR)+?liQVr-Ew8b@0*P`8w8G$g80zi?P=dA8bX5SrXJi2{#iM85*gxMLQ-@&m*+`F?unHu8aj@3K*_gPyZAa`K$^&xK!Ba zGeMX7bVXPZyp4JvqTn6WJAtn7f!KSs@SyKG(ZxFWS06)2PVF}_32&~&KkmX+@I>7( zDRxbL10iqJ`v|#O?-4Ii0xRUiX@p(4-NaIg`1#v}L{97Da6C^(LKAE7IE z1F-?v(^y&jB)R|Y$x@#Z{;5&%WD4o!3-gUPY5F7_X|ASEhO_1