From d05c1af35c495c6c2968c4d082681075e107c4c3 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 10 Dec 2025 16:59:59 -0800 Subject: [PATCH] Add 5380 SCSI Support Thanks and credit to Jay Cotton for providing the SCSI transport code upon which this driver is based. --- Doc/RomWBW Applications.pdf | Bin 413851 -> 413850 bytes Doc/RomWBW Disk Catalog.pdf | Bin 257563 -> 257563 bytes Doc/RomWBW Hardware.pdf | Bin 388275 -> 388302 bytes Doc/RomWBW Introduction.pdf | Bin 96448 -> 96561 bytes Doc/RomWBW System Guide.pdf | Bin 633849 -> 634003 bytes Doc/RomWBW User Guide.pdf | Bin 572567 -> 572567 bytes ReadMe.md | 5 +- ReadMe.txt | 5 +- Source/Apps/assign/assign.asm | 12 +- Source/CBIOS/cbios.asm | 5 +- Source/Doc/Hardware.md | 1 + Source/Doc/Introduction.md | 3 + Source/Doc/SystemGuide.md | 1 + Source/HBIOS/Config/SZ180_std.asm | 2 + Source/HBIOS/Config/SZ80_std.asm | 2 + Source/HBIOS/Config/SZ80_t35.asm | 2 + Source/HBIOS/cfg_DUO.asm | 2 + Source/HBIOS/cfg_DYNO.asm | 2 + Source/HBIOS/cfg_EPITX.asm | 2 + Source/HBIOS/cfg_EZZ80.asm | 2 + Source/HBIOS/cfg_GMZ180.asm | 2 + Source/HBIOS/cfg_HEATH.asm | 2 + Source/HBIOS/cfg_MASTER.asm | 7 + Source/HBIOS/cfg_MBC.asm | 2 + Source/HBIOS/cfg_MK4.asm | 2 + Source/HBIOS/cfg_MON.asm | 2 + Source/HBIOS/cfg_MSX.asm | 2 + Source/HBIOS/cfg_N8.asm | 2 + Source/HBIOS/cfg_N8PC.asm | 2 + Source/HBIOS/cfg_NABU.asm | 2 + Source/HBIOS/cfg_RCEZ80.asm | 2 + Source/HBIOS/cfg_RCZ180.asm | 2 + Source/HBIOS/cfg_RCZ280.asm | 2 + Source/HBIOS/cfg_RCZ80.asm | 2 + Source/HBIOS/cfg_RPH.asm | 2 + Source/HBIOS/cfg_SBC.asm | 2 + Source/HBIOS/cfg_SCZ180.asm | 2 + Source/HBIOS/cfg_SZ180.asm | 7 + Source/HBIOS/cfg_SZ80.asm | 7 + Source/HBIOS/cfg_Z80RETRO.asm | 2 + Source/HBIOS/cfg_ZETA.asm | 2 + Source/HBIOS/cfg_ZETA2.asm | 2 + Source/HBIOS/hbios.asm | 12 + Source/HBIOS/hbios.inc | 1 + Source/HBIOS/invntdev.asm | 4 +- Source/HBIOS/scsi.asm | 808 ++++++++++++++++++++++++++++++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 48 files changed, 922 insertions(+), 12 deletions(-) create mode 100644 Source/HBIOS/scsi.asm diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index a225010b0f07cb66d468ba9f8b086d0d9ac64291..8ab31688e4cf74202decc21c08e6a8701a604371 100644 GIT binary patch delta 19472 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 delta 19312 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 J&C4&``G3W^>)!wX diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 60c65b0b4c71fcd5f5cb2de0249b8cbee072e5af..79b6d053c9b9cf03702baeb6c80ddb00b83653c5 100644 GIT binary patch delta 566 zcmbPzhky1R{t4~%d3OwW_WaiV!o2#!Lh;4}2X@V7Ijh^4@9NJu>++(E|NjGuRBwJ- zD^hnLQd`w$9nd85@V0Zdk0p*{EOn8=+MXtFl`EX-d zCiA7eC4yqBC1+nUm)x+af0Ob0pxl|K1wT!b%+t|cx_^G}?cb*zCf78)nb4fIl~+Zt z_UuWv`quQUw_=Ev;bv2&c2g!sAZFTb%Ea8Z zUE9#W(A3n-*ihHNLfybXT~k5dH$TNCu_RSN!^O(Tz{u3l2&QEFvz^RWjGYXeEZy8p pTpbM@jU8PqEliwUEsaf$%`FUE91RRyT;1#xYzQcs{^u>TJOIaV_tpRa delta 566 zcmbPzhky1R{t4~%U3U$5?mpN4!+d>ldwi2(!R0eNZ`Y~rzI4?gy;Sq?)n_X+0o!bLqmOOGiviJV7`@+8_XiSxo+n2pzZdTv&^X4V5 z*S}nCXIo-;SZCVt$ctxB_?DfSQi_Wk3x!kSAW>pEx zi*A`&5)}atj0(hWzh^b+%Dx}i|GeIIUQ}P?OO-?WJ&!z!v_9go&w#giWvtli61R$V zv9}sZ^kZ9&W*uAhC6;Z?o5eC`R)*aa($KT%OF7UK-C_CY}^%lF( z^nK4#nhkHdSMk3&tXv)ZwtkPamc09Pw{L%%3%lk8l}xJDJ8rVk*YIm~rc^=3i%ZXR zF5GO&)Nabe2*ga=O_`Y6 zwrd+$8k!qg7+UBWSg0EqsB0?d`{t*(B$lKqXt-Dz85o%w8o`uof3}nPim{Wcg_Db+ qfwQ5rv#EuViK~l+qmhBRxr?i*tC6v(iJP09f(-#B)Bn6>mIna#`u)=Y diff --git a/Doc/RomWBW Hardware.pdf b/Doc/RomWBW Hardware.pdf index 00d4940ff3d6306d9ddcc12016f81f69214610c6..677e1b422fca3a0ad005d35b12ccebea2de2c568 100644 GIT binary patch delta 22964 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 diff --git a/Doc/RomWBW Introduction.pdf b/Doc/RomWBW Introduction.pdf index 43e429cb855fe7adf28c621cb5ee2ff5ba806438..86988212bc748975dd9a2dfc9f1be51eaea1da54 100644 GIT binary patch delta 6542 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 KL!2f{CI18NGESWU delta 6431 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 diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index a56c19ffc8cb1c93674aac054898ffef93efb670..b596f10edfe1a9a5f32529002fa32106d0fe7a8f 100644 GIT binary patch delta 44416 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%0D8D83<3te8aWWa7ckdB#C4MZ;dyO$2(-|(-2unO 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 delta 43037 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 vj+GDQ`QTs*mn>9b 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 diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 8da07e31204299b21de9aba3fbc5a4d7d01a8049..c96b2056b8159a0c7bd7382561c826837a3191f0 100644 GIT binary patch delta 603 zcmbRKQ)&87r3roYKbTKX5LwB-!9YMg^TNHTA7Nia7Fg>y%$##Fei(-(5{=RuN_Vt3EYs&r@)@KF? zO;nMXzhKhB$*l@)a~`vWcIXIZZY|u?A!aYiZfbuqJ$`4Eb%mIK6Q|=P!5GgCQ(kn6 zTE4T9cYpYr>z=UX64v;j$*SKs&ENE+>ds_?DYUe}NOoB8?ptM_HAL;m~LA2MRoI-r?&^5=z#VX1K`DZ935WvBnyy++B$ba|-Q z%F_pW_fDN#IXSC)&bbNROZ0T4m)gIddwctJW?#ppEOC>vQ?-3(Uo$;+YlhbEiT7ly z_ol~({_ZGu=ly+kpd2zM%@`=fNQwXV) zS6-gbf8-?V=IvLjyN}f9pQ~@!D_weNSy(-9%(0nKXLp+|Z+idsw9OyZ(sj=kO@BC# zUAWnssok525r{!FGZ3=?F)I+W0Wte_Zzhfl;o61Y57rzWFIG zi6yBD8ZK5w21cfaMldDY-J&=?Bsv?Im^qs`nL8R88ksx0x|q3ISXvmGIGekfI9ixl Rn48%t*bq`Oy>btS8~|zt{2u@S delta 603 zcmbRKQ)&87r3roYUzkr%5LwB-!9d`BUh}hShqfy$XE>V~sPeyFBlV=e2q(|XO&+}M z&Qf=GJAc3O@ZhAq7bhzF_*pVOdvovIU3YhdM(0)U&hE3iy|(PbhtGcRer^Aqdj5@- z=#k58MH0K)=h+6WBR(!;^+VE_~G2GS++9dU%kJRaK)Lvq?S3CmML#NWpdJ^VqNI8b2rN8xk`BX z>FOj+Zq%witNmH)s*vRy#pNC|Bf`Aqzwf>MemSo%+rbxWR4#j^&$2qRnt!RG>o?uK z%+;2g^jFm$-@WkH*H;%#y!)?{xbbF~d(LL%Z0q)UPCJ*@zU-Y=_%M@cwp{iBn~l%i zbRS;I_)z|63D3z}S$kPkthzq4ZYW*sb1UGre&c0}= 1) +; +SCSI0_CFG: + .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB SCSIBASE ; IO BASE ADDRESS + .DB SCSI0_LUN ; SCSI TARGET LUN + .DB SCSI_STNOTRDY ; DEVICE STATUS + .DW $0000,$0020 ; DEVICE CAPACITY (BLOCKS) + .DW 0,0 ; CURRENT LBA +; + DEVECHO "SCSI: IO=" + DEVECHO SCSIBASE + DEVECHO ", LUN=" + DEVECHO SCSI0_LUN + DEVECHO "\n" +#ENDIF +; +#IF (SCSICNT >= 2) + .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) + .DB SCSIBASE ; IO BASE ADDRESS + .DB SCSI1_LUN ; SCSI TARGET LUN + .DB SCSI_STNOTRDY ; DEVICE STATUS + .DW $0000,$0020 ; DEVICE CAPACITY (BLOCKS) + .DW 0,0 ; CURRENT LBA +; + DEVECHO "SCSI: IO=" + DEVECHO SCSIBASE + DEVECHO ", LUN=" + DEVECHO SCSI1_LUN + DEVECHO "\n" +#ENDIF +; +#IF ($ - SCSI_CFGTBL) != (SCSICNT * 2 * SCSI_CFGSIZ) + .ECHO "*** INVALID SCSI CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END OF TABLE MARKER +; +;============================================================================= +; INITIALIZATION ENTRY POINT +;============================================================================= +; +SCSI_INIT: + CALL NEWLINE ; FORMATTING + PRTS("SCSI:$") ; TAG +; + PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS + LD A,SCSIBASE ; GET IO BASE ADDRES + CALL PRTHEXBYTE ; DISPLAY IT +; + CALL SCSI_DETECT ; DETECT THE SCSI INTERFACE + JR Z,SCSI_INIT1 ; IF FOUND CONTINUE + PRTS(" NOT PRESENT$") ; SHOW NOT PRESENT + XOR A ; SUCCESS + RET ; AND BAIL OUT +; +SCSI_INIT1: + XOR A ; ZERO ACCUM + LD (SCSI_DEVNUM),A ; INIT DEV UNIT NUM FOR DYNAMIC ASSIGNMENT + LD IY,SCSI_CFGTBL ; POINT TO START OF CONFIG TABLE +; +SCSI_INIT2: + LD A,(IY) ; LOAD FIRST BYTE TO CHECK FOR END + CP $FF ; CHECK FOR END OF TABLE VALUE + RET Z ; RETURN IF DONE +; + CALL SCSI_INIT3 ; REGISTER & INIT DEVICE +; + LD DE,SCSI_CFGSIZ ; SIZE OF CFG TABLE ENTRY + ADD IY,DE ; BUMP POINTER + JP SCSI_INIT2 ; AND LOOP +; +SCSI_INIT3: + ; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE + LD A,(SCSI_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN + LD (IY+SCSI_DEV),A ; UPDATE IT + INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN + LD (SCSI_DEVNUM),A ; SAVE IT +; + ; ADD UNIT TO GLOBAL DISK UNIT TABLE + LD BC,SCSI_FNTBL ; BC := FUNC TABLE ADR + PUSH IY ; CFG ENTRY POINTER + POP DE ; COPY TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE +; + CALL SCSI_PRTPREFIX ; TAG FOR ACTIVE DEVICE +; + PRTS(" LUN=$") ; LUN LABEL + LD A,(IY+SCSI_LUN) ; LOAD LUN + CALL PRTDEC8 ; DISPLAY IT +; + CALL SCSI_INITDEV ; INITIALIZE DEVICE +#IF (SCSITRACE < 2) + JP NZ,SCSI_PRTSTAT +#ENDIF + RET NZ +; + ; PRINT STORAGE CAPACITY (BLOCK COUNT) + PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL + LD A,SCSI_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CAPACITY VALUE + CALL PRTHEX32 ; PRINT HEX VALUE +; + ; PRINT STORAGE SIZE IN MB + PRTS(" SIZE=$") ; PRINT FIELD LABEL + LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB + CALL SRL32 ; RIGHT SHIFT + CALL PRTDEC32 ; PRINT DWORD IN DECIMAL + PRTS("MB$") ; PRINT SUFFIX +; + XOR A ; SUCCESS + RET +; +;============================================================================= +; DRIVER FUNCTION TABLE +;============================================================================= +; +SCSI_FNTBL: + .DW SCSI_STATUS + .DW SCSI_RESET + .DW SCSI_SEEK + .DW SCSI_READ + .DW SCSI_WRITE + .DW SCSI_VERIFY + .DW SCSI_FORMAT + .DW SCSI_DEVICE + .DW SCSI_MEDIA + .DW SCSI_DEFMED + .DW SCSI_CAP + .DW SCSI_GEOM +#IF (($ - SCSI_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID SCSI FUNCTION TABLE ***\n" +#ENDIF +; +SCSI_VERIFY: +SCSI_FORMAT: +SCSI_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED + RET +; +; +; +SCSI_READ: + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + LD A,$08 ; SETUP READ COMMAND + JR SCSI_IO ; DO THE IO +; +; +; +SCSI_WRITE: + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + LD A,$0A ; SETUP WRITE COMMAND + JR SCSI_IO ; DO THE IO +; +; +; +SCSI_IO: + LD (SCSI_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + ; SETUP SCSI COMMAND + LD (SCSI_S_CDB),A ; SET SCSI COMMAND + ; SETUP DISK BUFFER POINTERS + LD (SCSI_BUF_OUT),HL ; INPUT BUFFER + LD (SCSI_BUF_IN),HL ; OUTPUT BUFFER + ; SETUP LUN/LBA + LD A,(IY+SCSI_LUN) ; PUT LUN IN ACCUM + RRCA ; MOVE TO TOP 3 BITS + RRCA ; ... + RRCA ; ... + OR (IY+SCSI_LBA+2) ; MERGE WITH TOP OF LBA + LD (SCSI_CUR_LUN),A ; PUT IN CDB + LD A,(IY+SCSI_LBA+1) ; LBA MID + LD (SCSI_CUR_LBN),A ; PUT IN CDB + LD A,(IY+SCSI_LBA+0) ; LBA MID + LD (SCSI_CUR_LBN+1),A ; PUT IN CDB + PUSH IX ; SAVE IX + LD IX,SCSI_S_IOT ; SET POINTER + CALL SCSI_GO ; DO THE SCSI TRANSACTION + POP IX ; RESTORE IX + JR NZ,SCSI_IO1 ; IF ERROR, SKIP INCREMENT + ; INCREMENT LBA + LD A,SCSI_LBA ; LBA OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + ; INCREMENT DMA + LD HL,SCSI_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +SCSI_IO1: + LD HL,(SCSI_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS + RET Z ; DONE IF NO ERROR + LD A,ERR_IO ; SIGNAL IO ERROR + OR A ; SET FLAGS + RET ; AND DONE +; +; +; +SCSI_STATUS: + LD A,(IY+SCSI_STAT) ; GET STATUS OF SELECTED DEVICE + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +SCSI_RESET: + CALL SCSI_INITDEV ; REINITIALIZE UNIT + OR A ; SET RESULT FLAGS + RET +; +; +; +SCSI_DEVICE: + LD D,DIODEV_SCSI ; D := DEVICE TYPE + LD E,(IY+SCSI_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%00110000 ; C := GENERIC HARD DISK ATTRIBUTES + LD H,0 ; H := MODE + LD L,(SCSI_IOBASE) ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; +; +SCSI_MEDIA: + LD A,E ; GET FLAGS + OR A ; SET FLAGS + JR Z,SCSI_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA + CALL SCSI_INITDEV ; REINITIALIZE DEVICE +; +SCSI_MEDIA1: + LD A,(IY+SCSI_STAT) ; GET STATUS + OR A ; SET FLAGS + LD D,0 ; NO MEDIA CHANGE DETECTED + LD E,MID_HD ; ASSUME WE ARE OK + RET Z ; RETURN IF GOOD INIT + LD E,MID_NONE ; SIGNAL NO MEDIA + LD A,ERR_NOMEDIA ; NO MEDIA ERROR + OR A ; SET FLAGS + RET ; AND RETURN +; +; +; +SCSI_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+SCSI_LBA+0),L ; SAVE NEW LBA + LD (IY+SCSI_LBA+1),H ; ... + LD (IY+SCSI_LBA+2),E ; ... + LD (IY+SCSI_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +SCSI_CAP: + LD A,(IY+SCSI_STAT) ; GET STATUS + PUSH AF ; SAVE IT + LD A,SCSI_MEDCAP ; OFFSET TO CAPACITY FIELD + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL + LD BC,512 ; 512 BYTES PER BLOCK + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; +; +SCSI_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL SCSI_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT + LD E,16 ; SECTORS / TRACK = 16 + RET ; DONE, A STILL HAS SCSI_CAP STATUS +; +;============================================================================= +; FUNCTION SUPPORT ROUTINES +;============================================================================= +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +SCSI_DETECT: + LD A,$05 + OUT (SCSIBASE+3),A + IN A,(SCSIBASE+3) + CP $05 + RET NZ + LD A,$0A + OUT (SCSIBASE+3),A + IN A,(SCSIBASE+3) + CP $0A + RET +; +; INITIALIZE DEVICE +; +SCSI_INITDEV: + XOR A + LD (IY+SCSI_STAT),A + RET +; +;============================================================================= +; COMMAND PROCESSING +;============================================================================= +; +;---------------------------------------------------------------- +;WRITE LOGICAL BLOCK TO DISK +;CUR_TID,CUR_LUN,CUR_LBN ALREADY SET +;EXIT WITH ZERO STATUS IF OK +;---------------------------------------------------------------- +; +WR_PHY: + LD A,0AH ;WRITE COMMAND + JR PHY_COM ;FINISH SAME AS READ + +;---------------------------------------------------------------- +;READ LOGICAL BLOCK FROM DISK +;CUR_TID,CUR_LUN,CUR_LBN ALREADY SET +;EXIT WITH ZERO STATUS IF OK +;---------------------------------------------------------------- +; +RD_PHY: + LD A,8 ;READ COMMAND +PHY_COM: + LD (SCSI_S_CDB),A ;SET IN COMMAND BLOCK + LD IX,SCSI_S_IOT ;POINT TO IO TABLE + CALL SCSI_GO + AND 02H ;MASK TO ERROR BIT + RET +;------------------------------------------------------------------------------- +;DO SCSI TRANSACTION +; IX=SCSI IO BLOCK +;------------------------------------------------------------------------------- +SCSI_GO: + LD A,$FF ;PRESET ERROR STATUS + LD L,(IX+4) ;POINT TO STATUS ADDRESS + LD H,(IX+5) ;POINT TO STATUS ADDRESS + LD (HL),A ;SET ERROR +; + XOR A ; + OUT (SCSI_SR_MR),A ;RESET CONTROL REG + OUT (SCSI_SR_TCR),A ;CLEAR COMMAND REG. + OUT (SCSI_SR_ICR),A ; + LD A,(IX) ;GET TID + BIT 7,A ; TURN ON MY ID + OUT (SCSI_SR_ODR),A ;SET TARGET ID + LD A,$01 ;DRIVE BUS + OUT (SCSI_SR_ICR),A ; + LD A,$05 ;SET SEL AND DRIVE BUS + OUT (SCSI_SR_ICR),A ; +; +;WAIT FOR SCSI BUSY + LD BC,0 ;INIT TIMEOUT +S_SWT: + IN A,(SCSI_SR_CSBS) ;GET BUS STATUS + AND SCSI_SM_BSY ;MASK TO BUSY BIT + JR NZ,S_BSYA ;JMP IF BUSY ACTIVE + NOP ;KILL A LITTLE TIME + NOP + NOP + NOP + DEC BC ;DEC TIMEOUT + LD A,B ;TEST TIMEOUT=0 + OR C + JR NZ,S_SWT ;JMP IF NO TIMEOUT + XOR A ;CLEAR A + OUT (SCSI_SR_ICR),A ;CLEAR SEL AND DATA + JR S_EXIT ;ERROR EXIT +; +;BUSY IS ACTIVE +S_BSYA: + XOR A ;CLEAR A + OUT (SCSI_SR_ICR),A ;CLEAR SEL AND DATA + +;------------------------------------------------------------------------------- +; +;TARGET IS SELECTED SO TEST BSY AND REQ +;THEN DECODE REQUESTED PHASE +; +;------------------------------------------------------------------------------- +PHASE: + XOR A + OUT (SCSI_SR_ICR),A ;RESET INITIATOR +; +S_WTREQ: + IN A,(SCSI_SR_CSBS) ;GET BUS STATUS + LD B,A ;SAVE COPY + AND SCSI_SM_BSY ;MASK TO BUSY BIT + JR NZ,S_WTRQ1 ;STILL BUSY SO CONT. + +;------------------------------------------------------------------------------- +;BUSY LOST SO EXIT +;------------------------------------------------------------------------------- +S_EXIT: + LD L,(IX+4) ;GET STATUS POINTER + LD H,(IX+5) ;GET STATUS POINTER + LD A,(HL) + RET ;BUSY LOST? WERE DONE +; +S_WTRQ1: + LD A,B ;RECOVER STATUS + AND SCSI_SM_REQ ;REQUEST ACTIVE? + JR Z,S_WTREQ ;LOOP TILL REQUEST + +;------------------------------------------------------------------------------- +;REQUEST IS ACTIVE SO SET 5380 TO REQUESTED PHASE +;------------------------------------------------------------------------------- + LD A,B ;RECOVER BUS STATUS + RR A ;SHIFT STATUS TO PHASE BITS + RR A + AND $07 ;MASK TO PHASE BITS + OUT (SCSI_SR_TCR),A ;SET PHASE +; +;JUMP TO PHASE HANDLER +; + LD A,B ;RECOVER BUS STATUS + RR A + AND $0E ;MASK TO PHASE BITS + LD E,A ; + LD D,0 + LD HL,PHTABL ;POINT TO TABLE + ADD HL,DE ;OFFSET INTO TABLE + LD E,(HL) ;GET EXECUTION ADDRESS + INC HL + LD D,(HL) + PUSH DE + RET ;EXECUTE PHASE + +;------------------------------------------------------------------------------- +;PHASE TABLE +;------------------------------------------------------------------------------- +PHTABL: + .WORD PHASE0 ;DATA OUT + .WORD PHASE1 ;DATA IN + .WORD PHASE2 ;CMD OUT + .WORD PHASE3 ;STATUS IN + .WORD S_EXIT ;UNUSED + .WORD S_EXIT ;UNUSED + .WORD PHASE6 ;MESSAGE OUT + .WORD PHASE7 ;MESSAGE IN + +;------------------------------------------------------------------------------- +;PHASE HANDLERS +;------------------------------------------------------------------------------- +; +;DATA OUT +PHASE0: + LD L,(IX+6) ;GET POINTER + LD H,(IX+7) + JP S_WRIT ;WRITE BYTES +; +;DATA IN +PHASE1: + LD L,(IX+8) ;GET POINTER + LD H,(IX+9) + JP S_READ ;READ BYTES +; +;CMD OUT +PHASE2: + LD L,(IX+2) + LD H,(IX+3) + JP S_WRIT +; +;STATUS IN +PHASE3: + LD L,(IX+4) + LD H,(IX+5) + JP S_READ +; +;MSG OUT +PHASE6: + LD L,(IX+10) + LD H,(IX+11) + JP S_WRIT +; +;MSG IN +PHASE7: + LD L,(IX+12) + LD H,(IX+13) + JP S_READ +;------------------------------------------------------------------------------- +;SCSI WRITE ROUTINE (SEND BYTES TO TARGET) +;BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH +;------------------------------------------------------------------------------- +S_WRIT: + LD A,1 ;DRIVE SCSI DATA BUS + OUT (SCSI_SR_ICR),A +; +;WAIT FOR REQ WHILE CHECKING BUSY +; +S_WWREQ: + IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT + LD B,A ;SAVE IT + AND SCSI_SM_REQ ;REQUEST ACTIVE? + JR NZ,S_WNXT ; +; + LD A,B ;RECOVER CURRENT BUS STAT + AND SCSI_SM_BSY ;STILL BUSY? + JP NZ,S_WWREQ ;LOOP IF STILL BUSY + JP PHASE ; +; +;REQUEST ACTIVE SO CHECK PHASE +; +S_WNXT: + IN A,(SCSI_SR_BSR) ;GET STATUS + AND SCSI_SM_PHM ;MASK TO PHASE MATCH + JP Z,PHASE ;JMP IF PHASE MISMATCH +; +;REQUEST ACTIVE AND PHASE MATCH SO SEND DATA +; + LD A,(HL) ;GET BYTE + OUT (SCSI_SR_ODR),A ;SEND DATA + LD A,$11 ;ACK + DRIVE BUS + OUT (SCSI_SR_ICR),A ;SET ACK,DRIVE SCSI BUS + INC HL ;ADVANCE BUF POINTER +; +;WAIT FOR REQUEST TO DROP +; +S_WNREQ: + IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS + AND SCSI_SM_REQ + JR NZ,S_WNREQ ;LOOP TILL REQ DROPS +; + LD A,$1 ;DROP ACK,ASSERT DATA + OUT (SCSI_SR_ICR),A ;DROP ACK + JP S_WWREQ ;LOOP FOR NEXT BYTE/PHASE +;------------------------------------------------------------------------------- +;SCSI READ ROUTINE (GET BYTES FROM TARGET) +;BUS PHASE ALREADY SET. RETURN ON PHASE MISMATCH +;------------------------------------------------------------------------------- +; +S_READ: +; +;WAIT FOR REQ WHILE CHECKING BUSY +; +S_RWREQ: + IN A,(SCSI_SR_CSBS) ;GET CURRENT BUS STAT + LD B,A ;SAVE IT + AND SCSI_SM_REQ ;REQUEST ACTIVE? + JR NZ,S_RNXT ; +; + LD A,B ;RECOVER CURRENT BUS STAT + AND SCSI_SM_BSY ;STILL BUSY? + JP NZ,S_RWREQ ;LOOP IF STIL BUSY + JP PHASE ; +; +;REQUEST ACTIVE SO CHECK PHASE +S_RNXT: + IN A,(SCSI_SR_BSR) ;GET STATUS + AND SCSI_SM_PHM ;MASK TO PHASE MATCH + JP Z,PHASE ;JMP IF PHASE MISMATCH + +;REQUEST ACTIVE AND PHASE MATCH SO GET DATA +; + IN A, (SCSI_SR_CSD) ;GET DATA + LD (HL),A ;SAVE DATA + LD A,$10 + OUT (SCSI_SR_ICR),A ;SET ACK + INC HL ;ADVANCE BUF POINTER +; +;WAIT FOR REQUEST TO DROP +; +S_RNREQ: + IN A,(SCSI_SR_CSBS) ;GET CURRENT STATUS + AND SCSI_SM_REQ + JR NZ,S_RNREQ ;LOOP TILL REQ DROPS + XOR A + OUT (SCSI_SR_ICR),A ;DROP ACK + JP S_READ ;LOOP FOR NEXT BYTE/PHASE + +; +;============================================================================= +; HARDWARE INTERFACE ROUTINES +;============================================================================= +; +;============================================================================= +; ERROR HANDLING AND DIAGNOSTICS +;============================================================================= +; +; ERROR HANDLERS +; +SCSI_NOMEDIA: + LD A,SCSI_STNOMEDIA + JR SCSI_ERR +; +SCSI_IOERR: + LD A,SCSI_STIOERR + JR SCSI_ERR +; +SCSI_TO: + LD A,SCSI_STTO + JR SCSI_ERR +; +SCSI_NOTRDY: + LD A,SCSI_STNOTRDY + JR SCSI_ERR +; +SCSI_ERR: + LD (IY+SCSI_STAT),A ; SAVE NEW STATUS +; +#IF (SCSITRACE >= 2) + CALL SCSI_PRTSTAT +#ENDIF + OR A ; SET FLAGS + RET +; +; +; +SCSI_PRTERR: + RET Z ; DONE IF NO ERRORS + ; FALL THRU TO SCSI_PRTSTAT +; +; PRINT FULL DEVICE STATUS LINE +; +SCSI_PRTSTAT: + PUSH AF + PUSH DE + PUSH HL + LD A,(IY+SCSI_STAT) + CALL SCSI_PRTPREFIX ; PRINT UNIT PREFIX + JR SCSI_PRTSTAT3 +SCSI_PRTSTAT2: + CALL NEWLINE + PRTS("SCSI:$") ; NO UNIT NUM IN PREFIX FOR INVALID UNIT +SCSI_PRTSTAT3: + CALL PC_SPACE ; FORMATTING + CALL SCSI_PRTSTATSTR + POP HL + POP DE + POP AF + RET +; +; PRINT STATUS STRING +; +SCSI_PRTSTATSTR: + PUSH AF + PUSH DE + LD A,(IY+SCSI_STAT) + OR A + LD DE,SCSI_STR_STOK + JR Z,SCSI_PRTSTATSTR1 + INC A + LD DE,SCSI_STR_STNOMEDIA + JR Z,SCSI_PRTSTATSTR1 + INC A + LD DE,SCSI_STR_STIOERR + JR Z,SCSI_PRTSTATSTR1 + INC A + LD DE,SCSI_STR_STTO + JR Z,SCSI_PRTSTATSTR1 + INC A + LD DE,SCSI_STR_STNOTRDY + JR Z,SCSI_PRTSTATSTR1 + LD DE,SCSI_STR_STUNK +SCSI_PRTSTATSTR1: + CALL WRITESTR + POP DE + POP AF + RET +; +; PRINT DIAGNONSTIC PREFIX +; +SCSI_PRTPREFIX: + PUSH AF + CALL NEWLINE + PRTS("SCSI$") + LD A,(IY+SCSI_DEV) ; GET CURRENT DEVICE NUM + CP $FE ; NOT YET ASSIGNED? + JR Z,SCSI_PRTPREFIX1 ; SKIP DEV NUM IF SO + CALL PRTDECB +SCSI_PRTPREFIX1: + CALL PC_COLON + POP AF + RET +; +;============================================================================= +; STRING DATA +;============================================================================= +; +SCSI_STR_STOK .TEXT "OK$" +SCSI_STR_STNOMEDIA .TEXT "NO MEDIA$" +SCSI_STR_STIOERR .TEXT "IO ERROR$" +SCSI_STR_STTO .TEXT "TIMEOUT$" +SCSI_STR_STNOTRDY .TEXT "NOT READY$" +SCSI_STR_STUNK .TEXT "UNKNOWN ERROR$" +; +;============================================================================= +; DATA STORAGE +;============================================================================= +; +SCSI_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT +SCSI_DSKBUF .DW 0 ; ACTIVE DISK BUFFER +; +;---------------------------------------------------------------- +;SCSI COMMAND DESCRIPTOR FOR READ/WRITE +;DO NOT USE THIS FOR DIRECT SCSI I/O +;YOU WILL MESS UP BLOCK/DEBLOCK +; +SCSI_S_CDB: + .DB 8 ; COMMAND +SCSI_CUR_LUN: + .DB 0 << 5 ; LUN/LBA HI +SCSI_CUR_LBN: + .DB 0 ; LBA MID + .DB 0 ; LBA LOW + .DB 1 ; COUNT + .DB 0 ; FLAGS +; +;---------------------------------------------------------------- +;SCSI I/O ADDRESS TABLE FOR READ/WRITE +;DONT MESS WITH THIS EITHER +SCSI_S_IOT: +SCSI_CUR_TID .DB 1 << SCSI_TID ;TARGET + .DB 0 ;UNUSED + .DW SCSI_S_CDB ;CDB POINTER + .DW SCSI_S_STAT ;STATUS POINTER +SCSI_BUF_OUT .DW HB_WRKBUF ;DATA OUT POINTER +SCSI_BUF_IN .DW HB_WRKBUF ;DATA IN POINTER + .DW SCSI_S_MSG ;MSG OUT POINTER + .DW SCSI_S_MSG ;MSG IN POINTER +; +;---------------------------------------------------------------- +;THIS IS THE END OF INITIALIZED DATA +;EVERYTHING FOLLOWING MUST HAVE MEMORY SPACE AVAILABLE +;BUT IS NOT PART OF THE BOOT IMAGE +;---------------------------------------------------------------- +; +; UNINITIALIZED DATA AREA +; +SCSI_S_STAT .DW 0 ;SCSI ENDING STATUS +SCSI_S_MSG .DW 0 ;SCSI MESSAGE +; diff --git a/Source/ver.inc b/Source/ver.inc index 6768e9d3..ab3717be 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.43" +#DEFINE BIOSVER "3.6.0-dev.44" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 7a815ab0..d6ff2e4d 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.43" + db "3.6.0-dev.44" endm