diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 31dabe89..e11ca7a0 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1769,6 +1769,8 @@ STR_BANNER .DB "SBC HBIOS v", BIOSVER, ", ", TIMESTAMP, "$" STR_PLATFORM .DB PLATFORM_NAME, "$" STR_SWITCH .DB "*** Console switch to CRT device ***$" ; +HB_TMPBUF .FILL 512,0 ; INTERNAL DISK BUFFER +; HB_BUF .EQU $ ; PHYSICAL DISK BUFFER HB_END .EXPORT HB_END ; EXPORT ENDING ADDRESS ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index e4ca5844..3c21a0e2 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -219,62 +219,41 @@ IDE_INIT: PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS LD A,IDE_IO_DATA ; GET IO ADDRESS CALL PRTHEXBYTE ; PRINT IT -; - ; CLEAR OUT ALL DATA (FOR ALL UNITS) - LD HL,IDE_UDATA - LD BC,IDE_UDLEN - XOR A - CALL FILL -; - ; INITIALIZE THE IDE INTERFACE NOW - CALL IDE_RESET ; DO HARDWARE SETUP/INIT - JR NZ,IDE_INIT2 ; SKIP PROBING IF INTERFACE SETUP FAILS -; - ; INITIAL DEVICE PROBING (CHECKING SIGNATURES) - LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY - LD C,0 ; UNIT INDEX FOR LOOP -IDE_INIT1: - LD A,C ; UNIT NUMBER TO A - DCALL PC_SPACE ; IF DEBUGGING, PRINT A SPACE - DCALL PC_LBKT ; IF DEBUGGING, PRINT LEFT BRACKET - PUSH BC - CALL IDE_PROBE ; PROBE FOR DEVICE PRESENCE - POP BC - DCALL PC_RBKT ; IF DEBUGGING, PRINT A RIGHT BRACKET - INC C ; NEXT UNIT - DJNZ IDE_INIT1 ; LOOP AS NEEDED ; ; PRINT UNIT COUNT PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT LD A,IDE_UNITCNT ; GET UNIT COUNT CALL PRTDECB ; PRINT IT IN DECIMAL ; -IDE_INIT2: - ; CHECK FOR ZERO UNITS AND GET OUT IF SO! + ; INITIALIZE THE IDE INTERFACE NOW + CALL IDE_RESET ; DO HARDWARE SETUP/INIT + RET NZ ; ABORT IF RESET FAILS ; - ; DEVICE SETUP LOOP - LD B,A ; LOOP ONCE PER UNIT + ; DEVICE DISPLAY LOOP + LD B,IDE_UNITCNT ; LOOP ONCE PER UNIT LD C,0 ; C IS UNIT INDEX -IDE_INIT3: - PUSH BC ; SAVE LOOP CONTROL +IDE_INIT1: LD A,C ; UNIT NUM TO ACCUM - CALL IDE_INITUNIT ; IF EXISTS (NZ), INIT UNIT + PUSH BC ; SAVE LOOP CONTROL + CALL IDE_INIT2 ; DISPLAY UNIT INFO #IF (IDETRACE < 2) CALL NZ,IDE_PRTSTAT ; IF ERROR, NOTIFY USER IF NOT DONE PREVIOUSLY #ENDIF POP BC ; RESTORE LOOP CONTROL INC C ; INCREMENT UNIT INDEX - DJNZ IDE_INIT3 ; LOOP UNTIL DONE - RET ; INIT FINISHED + DJNZ IDE_INIT1 ; LOOP UNTIL DONE + RET ; DONE ; -; INITIALIZE UNIT DESIGNATED IN ACCUM -; -IDE_INITUNIT: +IDE_INIT2: + ; DISPLAY DEVICE INFO CALL IDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT ON ERROR ; - CALL IDE_INITDEV ; INIT DEVICE; FILL DIOBUF W/ IDENTIFY RESULTS - RET NZ ; ABORT ON ERROR + ; CHECK FOR BAD STATUS + IDE_DPTR(IDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED + LD A,(HL) + OR A + JP NZ,IDE_PRTSTAT ; CALL IDE_PRTPREFIX ; PRINT DEVICE PREFIX ; @@ -284,7 +263,7 @@ IDE_INITUNIT: ; ; PRINT LBA/NOLBA CALL PC_SPACE ; FORMATTING - LD HL,(DIOBUF) ; POINT TO BUFFER START + LD HL,HB_TMPBUF ; POINT TO BUFFER START LD DE,98+1 ; OFFSET OF BYTE CONTAINING LBA FLAG ADD HL,DE ; POINT TO FINAL BUFFER ADDRESS LD A,(HL) ; GET THE BYTE @@ -355,7 +334,14 @@ IDE_STATUS: ; IDE_MEDIA ; IDE_MEDIA: - CALL IDE_INITDEV ; RE-INIT SELECTED UNIT + LD A,(IDE_UNIT) ; GET UNIT SELECTION + PUSH AF ; SAVE UNIT SELECTION + CALL IDE_RESET ; RESET ALL DEVICES ON BUS + POP AF ; RECOVER UNIT SELECTION + CALL IDE_SELUNIT ; RESELECT DESIRED UNIT + IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS + LD A,(HL) ; GET STATUS + OR A ; SET FLAGS LD A,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT LD A,MID_NONE ; SIGNAL NO MEDA @@ -388,59 +374,6 @@ IDE_GEOM: ; FUNCTION SUPPORT ROUTINES ;============================================================================= ; -; (RE)INITIALIZE DEVICE -; -IDE_INITDEV: -; - IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED - LD A,(HL) ; GET THE DEVICE TYPE - OR A ; SET FLAGS - JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS -; - ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING - ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE - ; PROBES WHEN THE IDE BUS WAS RESET - PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE - PUSH HL ; SAVE UNIT TYPE FIELD POINTER - IDE_DPTR(0) ; SET HL TO START OF UNIT DATA - LD BC,IDE_UDLEN - XOR A - CALL FILL - POP HL ; RECOVER UNIT TYPE FIELD POINTER - POP AF ; RECOVER UNIT TYPE VALUE - LD (HL),A ; AND PUT IT BACK -; -#IF (IDE8BIT) - LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO - CALL IDE_SETFEAT ; SET FEATURE - RET NZ ; BAIL OUT ON ERROR -#ENDIF -; - CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND - RET NZ ; BAIL OUT ON ERROR -; - LD DE,(DIOBUF) ; POINT TO BUFFER - CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING -; - ; GET DEVICE CAPACITY AND SAVE IT - IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD - PUSH HL ; SAVE POINTER - LD HL,(DIOBUF) ; POINT TO BUFFER START - LD A,120 ; OFFSET OF SECTOR COUNT - CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT - CALL LD32 ; LOAD IT TO DE:HL - POP BC ; RECOVER POINTER TO CAPACITY ENTRY - CALL ST32 ; SAVE CAPACITY -; - ; RESET CARD STATUS TO 0 (OK) - IDE_DPTR(IDE_STAT) ; HL := ADR OF STATUS, AF TRASHED - XOR A ; A := 0 (STATUS = OK) - LD (HL),A ; SAVE IT -; - RET ; RETURN, A=0, Z SET -; -; -; IDE_SETFEAT: PUSH AF #IF (IDETRACE >= 3) @@ -474,6 +407,7 @@ IDE_IDENTIFY: LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ + LD HL,HB_TMPBUF JP IDE_GETBUF ; EXIT THRU BUFRD ; ; @@ -495,6 +429,7 @@ IDE_RDSEC: LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ + LD HL,(DIOBUF) JP IDE_GETBUF ; ; @@ -516,6 +451,7 @@ IDE_WRSEC: LD (IDE_CMD),A CALL IDE_RUNCMD RET NZ + LD HL,(DIOBUF) JP IDE_PUTBUF ; ; @@ -590,25 +526,21 @@ IDE_GETBUF: CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT - LD HL,(DIOBUF) + ;LD HL,(DIOBUF) LD B,0 #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) LD C,IDE_IO_DATA -; INIR -; INIR -IDE_GETBUF1: - ;IN A,(IDE_IO_DATA) - ;CALL PRTHEXBYTE - CALL DELAY - INI - JR NZ,IDE_GETBUF1 -IDE_GETBUF2: - ;IN A,(IDE_IO_DATA) - ;CALL PRTHEXBYTE - CALL DELAY - INI - JR NZ,IDE_GETBUF2 + INIR + INIR +;X1: +; NOP +; INI +; JR NZ,X1 +;X2: +; NOP +; INI +; JR NZ,X2 #ELSE LD C,IDE_IO_DATAHI IDE_GETBUF1: @@ -618,6 +550,7 @@ IDE_GETBUF1: INI ; READ AND SAVE HI BYTE, INC HL, DEC B JP NZ,IDE_GETBUF1 ; LOOP AS NEEDED #ENDIF + CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET @@ -631,8 +564,8 @@ IDE_PUTBUF: CALL IDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT - - LD HL,(DIOBUF) +; + ;LD HL,(DIOBUF) LD B,0 #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) @@ -648,6 +581,7 @@ IDE_PUTBUF1: OUT (IDE_IO_DATALO),A ; NOW WRITE THE SAVED LO BYTE TO LO BYTE JP NZ,IDE_PUTBUF1 ; LOOP AS NEEDED #ENDIF + CALL IDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! CALL IDE_GETRES JP NZ,IDE_IOERR RET @@ -671,7 +605,7 @@ IDE_GETRES: ; HARDWARE INTERFACE ROUTINES ;============================================================================= ; -; SOFT RESET OF ALL DEVICES ON BUS +; RESET ALL DEVICES ON BUS ; IDE_RESET: ; @@ -689,12 +623,44 @@ IDE_RESET: ; LD DE,16 ; DELAY ~250US CALL VDELAY +; LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET OUT (IDE_IO_CTRL),A - LD DE,16 ; DELAY ~250US +; + ;CALL LDELAY + LD DE,$2000 ; DELAY N * 16US (~128MS) CALL VDELAY +; + ; CLEAR OUT ALL DATA (FOR ALL UNITS) + LD HL,IDE_UDATA + LD BC,IDE_UDLEN + XOR A + CALL FILL +; + ; PROBE / INITIALIZE ALL UNITS + LD B,IDE_UNITCNT ; NUMBER OF UNITS TO TRY + LD C,0 ; UNIT INDEX FOR LOOP +IDE_RESET1: + LD A,C ; UNIT NUMBER TO A + PUSH BC + CALL IDE_INITUNIT ; PROBE/INIT UNIT + POP BC + INC C ; NEXT UNIT + DJNZ IDE_RESET1 ; LOOP AS NEEDED +; XOR A ; SIGNAL SUCCESS - RET ; RETURN + RET ; AND DONE +; +; +; +IDE_INITUNIT: + CALL IDE_SELUNIT ; SELECT UNIT + RET NZ ; ABORT IF ERROR + + CALL IDE_PROBE ; DO PROBE + RET NZ ; ABORT IF ERROR + + JP IDE_INITDEV ; INIT DEVICE AND RETURN ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; UNIT IS SPECIFIED IN A @@ -730,24 +696,17 @@ IDE_SELUNIT: ; ; IDE_PROBE: - CALL IDE_SELUNIT ; SELECT UNIT - RET NZ ; ABORT ON ERROR -; - ;CALL LDELAY - LD DE,$2000 ; DELAY N * 16US (~128MS) - CALL VDELAY -; - ;; WAIT FOR READY... - ;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR - ;RET NZ ; ABORT ON TIMEOUT +#IF (IDETRACE >= 3) + CALL IDE_PRTPREFIX + PRTS(" PROBE$") ; LABEL FOR IO ADDRESS +#ENDIF ; ; CHECK STATUS IN A,(IDE_IO_STAT) ; GET STATUS + DCALL PC_SPACE DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS OR A ; SET FLAGS TO TEST FOR ZERO - JR NZ,IDE_PROBE0 ; CONTINUE IF NON-ZERO - DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR - RET ; AND DONE + JP Z,IDE_NOMEDIA ; IDE_PROBE0: ;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR @@ -767,22 +726,22 @@ IDE_PROBE1: IN A,(IDE_IO_COUNT) DCALL PRTHEXBYTE CP $01 - RET NZ + JP NZ,IDE_NOMEDIA DCALL PC_SPACE IN A,(IDE_IO_SECT) DCALL PRTHEXBYTE CP $01 - RET NZ + JP NZ,IDE_NOMEDIA DCALL PC_SPACE IN A,(IDE_IO_CYLLO) DCALL PRTHEXBYTE CP $00 - RET NZ + JP NZ,IDE_NOMEDIA DCALL PC_SPACE IN A,(IDE_IO_CYLHI) DCALL PRTHEXBYTE CP $00 - RET NZ + JP NZ,IDE_NOMEDIA ; ; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED @@ -790,6 +749,59 @@ IDE_PROBE1: XOR A ; SIGNAL SUCCESS RET ; DONE, NOTE THAT A=0 AND Z IS SET ; +; (RE)INITIALIZE DEVICE +; +IDE_INITDEV: +; + IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED + LD A,(HL) ; GET THE DEVICE TYPE + OR A ; SET FLAGS + JP Z,IDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS +; + ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING + ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE + ; PROBES WHEN THE IDE BUS WAS RESET + PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE + PUSH HL ; SAVE UNIT TYPE FIELD POINTER + IDE_DPTR(0) ; SET HL TO START OF UNIT DATA + LD BC,IDE_UDLEN + XOR A + CALL FILL + POP HL ; RECOVER UNIT TYPE FIELD POINTER + POP AF ; RECOVER UNIT TYPE VALUE + LD (HL),A ; AND PUT IT BACK +; +#IF (IDE8BIT) + LD A,IDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO +#ELSE + LD A,IDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO +#ENDIF + CALL IDE_SETFEAT ; SET FEATURE + RET NZ ; BAIL OUT ON ERROR +; + CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND + RET NZ ; BAIL OUT ON ERROR +; + LD DE,HB_TMPBUF ; POINT TO BUFFER + DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING +; + ; GET DEVICE CAPACITY AND SAVE IT + IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD + PUSH HL ; SAVE POINTER + LD HL,HB_TMPBUF ; POINT TO BUFFER START + LD A,120 ; OFFSET OF SECTOR COUNT + CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT + CALL LD32 ; LOAD IT TO DE:HL + POP BC ; RECOVER POINTER TO CAPACITY ENTRY + CALL ST32 ; SAVE CAPACITY +; + ; RESET CARD STATUS TO 0 (OK) + IDE_DPTR(IDE_STAT) ; HL := ADR OF STATUS, AF TRASHED + XOR A ; A := 0 (STATUS = OK) + LD (HL),A ; SAVE IT +; + RET ; RETURN, A=0, Z SET +; ; ; IDE_CHKDEVICE: diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 885d46f5..b0d418b0 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -152,7 +152,7 @@ PPIDE_REG_DRVADR .EQU PPIDE_CTL_CS3FX | $07 ; DRIVE ADDRESS REGISTER (R) ; PPIDE2: SECONDARY MASTER ; PPIDE3: SECONDARY SLAVE ; -PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE +PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE ; ; COMMAND BYTES ; @@ -215,62 +215,36 @@ PPIDE_INIT: PRTS(" UNITS=$") LD A,PPIDE_UNITCNT CALL PRTDECB -; - ; CLEAR OUT ALL DATA (FOR ALL UNITS) - LD HL,PPIDE_UDATA - LD BC,PPIDE_UDLEN - XOR A - CALL FILL ; ; INITIALIZE THE PPIDE INTERFACE NOW CALL PPIDE_RESET ; DO HARDWARE SETUP/INIT - JR NZ,PPIDE_INIT2 ; SKIP PROBING IF INTERFACE SETUP FAILS -; - ; INITIAL DEVICE PROBING (CHECKING SIGNATURES) - LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY - LD C,0 ; UNIT INDEX FOR LOOP -PPIDE_INIT1: - LD A,C ; UNIT NUMBER TO A - DCALL PC_SPACE ; IF DEBUGGING, PRINT A SPACE - DCALL PC_LBKT ; IF DEBUGGING, PRINT LEFT BRACKET - PUSH BC - CALL PPIDE_PROBE ; PROBE FOR DEVICE PRESENCE - POP BC - DCALL PC_RBKT ; IF DEBUGGING, PRINT A RIGHT BRACKET - INC C ; NEXT UNIT - DJNZ PPIDE_INIT1 ; LOOP AS NEEDED -; - ; PRINT UNIT COUNT - PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT - LD A,PPIDE_UNITCNT ; GET UNIT COUNT - CALL PRTDECB ; PRINT IT IN DECIMAL + RET NZ ; ABORT IF RESET FAILS ; -PPIDE_INIT2: - ; CHECK FOR ZERO UNITS AND GET OUT IF SO! -; - ; DEVICE SETUP LOOP - LD B,A ; LOOP ONCE PER UNIT + ; DEVICE DISPLAY LOOP + LD B,PPIDE_UNITCNT ; LOOP ONCE PER UNIT LD C,0 ; C IS UNIT INDEX -PPIDE_INIT3: - PUSH BC ; SAVE LOOP CONTROL +PPIDE_INIT1: LD A,C ; UNIT NUM TO ACCUM - CALL PPIDE_INITUNIT ; IF EXISTS (NZ), INIT UNIT -#IF (PPIDETRACE < 2) - CALL NZ,PPIDE_PRTSTAT ; IF ERROR, NOTIFY USER IF NOT DONE PREVIOUSLY + PUSH BC ; SAVE LOOP CONTROL + CALL PPIDE_INIT2 ; DISPLAY UNIT INFO +#IF (IDETRACE < 2) + CALL NZ,PPIDE_PRTSTAT ; IF ERROR, NOTIFY USER IF NOT DONE PREVIOUSLY #ENDIF POP BC ; RESTORE LOOP CONTROL INC C ; INCREMENT UNIT INDEX - DJNZ PPIDE_INIT3 ; LOOP UNTIL DONE - RET ; INIT FINISHED -; -; INITIALIZE UNIT DESIGNATED IN ACCUM + DJNZ PPIDE_INIT1 ; LOOP UNTIL DONE + RET ; DONE ; -PPIDE_INITUNIT: +PPIDE_INIT2: + ; DISPLAY DEVICE INFO CALL PPIDE_SELUNIT ; SELECT UNIT RET NZ ; ABORT ON ERROR ; - CALL PPIDE_INITDEV ; INIT DEVICE; FILL DIOBUF W/ IDENTIFY RESULTS - RET NZ ; ABORT ON ERROR + ; CHECK FOR BAD STATUS + PPIDE_DPTR(PPIDE_STAT) ; GET STATUS ADR IN HL, AF TRASHED + LD A,(HL) + OR A + JP NZ,PPIDE_PRTSTAT ; CALL PPIDE_PRTPREFIX ; PRINT DEVICE PREFIX ; @@ -280,7 +254,7 @@ PPIDE_INITUNIT: ; ; PRINT LBA/NOLBA CALL PC_SPACE ; FORMATTING - LD HL,(DIOBUF) ; POINT TO BUFFER START + LD HL,HB_TMPBUF ; POINT TO BUFFER START LD DE,98+1 ; OFFSET OF BYTE CONTAINING LBA FLAG ADD HL,DE ; POINT TO FINAL BUFFER ADDRESS LD A,(HL) ; GET THE BYTE @@ -291,7 +265,7 @@ PPIDE_INITUNIT: ; ; PRINT STORAGE CAPACITY (BLOCK COUNT) PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL - PPIDE_DPTR(PPIDE_CAPACITY) ; SET HL TO ADR OF DEVICE CAPACITY + PPIDE_DPTR(PPIDE_CAPACITY) ; SET HL TO ADR OF DEVICE CAPACITY CALL LD32 ; GET THE CAPACITY VALUE CALL PRTHEX32 ; PRINT HEX VALUE ; @@ -351,7 +325,14 @@ PPIDE_STATUS: ; PPIDE_MEDIA ; PPIDE_MEDIA: - CALL PPIDE_INITDEV ; RE-INIT SELECTED UNIT + LD A,(PPIDE_UNIT) ; GET UNIT SELECTION + PUSH AF ; SAVE UNIT SELECTION + CALL PPIDE_RESET ; RESET ALL DEVICES ON BUS + POP AF ; RECOVER UNIT SELECTION + CALL PPIDE_SELUNIT ; RESELECT DESIRED UNIT + PPIDE_DPTR(PPIDE_STAT) ; POINT TO UNIT STATUS + LD A,(HL) ; GET STATUS + OR A ; SET FLAGS LD A,MID_HD ; ASSUME WE ARE OK RET Z ; RETURN IF GOOD INIT LD A,MID_NONE ; SIGNAL NO MEDA @@ -361,7 +342,7 @@ PPIDE_MEDIA: ; ; PPIDE_CAP: - PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT + PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO CAPACITY OF CUR UNIT CALL LD32 ; GET THE CURRENT CAPACITY DO DE:HL LD BC,512 ; 512 BYTES PER BLOCK XOR A ; SIGNAL SUCCESS @@ -372,7 +353,7 @@ PPIDE_CAP: PPIDE_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 PPIDE_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + CALL PPIDE_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC LD L,H ; DIVPPIDE BY 256 FOR # TRACKS LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT @@ -384,59 +365,6 @@ PPIDE_GEOM: ; FUNCTION SUPPORT ROUTINES ;============================================================================= ; -; (RE)INITIALIZE DEVICE -; -PPIDE_INITDEV: -; - PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED - LD A,(HL) ; GET THE DEVICE TYPE - OR A ; SET FLAGS - JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS -; - ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING - ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE - ; PROBES WHEN THE PPIDE BUS WAS RESET - PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE - PUSH HL ; SAVE UNIT TYPE FIELD POINTER - PPIDE_DPTR(0) ; SET HL TO START OF UNIT DATA - LD BC,PPIDE_UDLEN - XOR A - CALL FILL - POP HL ; RECOVER UNIT TYPE FIELD POINTER - POP AF ; RECOVER UNIT TYPE VALUE - LD (HL),A ; AND PUT IT BACK -; -#IF (PPIDE8BIT) - LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO -#ELSE - LD A,PPIDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO -#ENDIF - CALL PPIDE_SETFEAT ; SET FEATURE - RET NZ ; BAIL OUT ON ERROR -; - CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND - RET NZ ; BAIL OUT ON ERROR -; - LD DE,(DIOBUF) ; POINT TO BUFFER - DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING -; - ; GET DEVICE CAPACITY AND SAVE IT - PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD - PUSH HL ; SAVE POINTER - LD HL,(DIOBUF) ; POINT TO BUFFER START - LD A,120 ; OFFSET OF SECTOR COUNT - CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT - CALL LD32 ; LOAD IT TO DE:HL - POP BC ; RECOVER POINTER TO CAPACITY ENTRY - CALL ST32 ; SAVE CAPACITY -; - ; RESET CARD STATUS TO 0 (OK) - PPIDE_DPTR(PPIDE_STAT) ; HL := ADR OF STATUS, AF TRASHED - XOR A ; A := 0 (STATUS = OK) - LD (HL),A ; SAVE IT -; - RET ; RETURN, A=0, Z SET -; ; ; PPIDE_SETFEAT: @@ -452,7 +380,7 @@ PPIDE_SETFEAT: DCALL PC_SPACE DCALL PRTHEXBYTE POP AF - ;OUT (PPIDE_REG_FEAT),A ; SET THE FEATURE VALUE + ;OUT (PPIDE_REG_FEAT),A ; SET THE FEATURE VALUE CALL PPIDE_OUT .DB PPIDE_REG_FEAT DCALL PC_SPACE @@ -478,6 +406,7 @@ PPIDE_IDENTIFY: LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ + LD HL,HB_TMPBUF JP PPIDE_GETBUF ; EXIT THRU BUFRD ; ; @@ -496,26 +425,12 @@ PPIDE_RDSEC: .DB PPIDE_REG_DRVHD DCALL PC_SPACE DCALL PRTHEXBYTE - - ;LD HL,HSTLBA - ;CALL LD32 - ;CALL PRTHEX32 - CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD LD A,PPIDE_CMD_READ LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ - - ;CALL NEWLINE - ;CALL PPIDE_REGDUMP - ;CALL PPIDE_GETBUF - ;LD DE,(DIOBUF) ; POINT TO BUFFER - ;CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING - ;CALL NEWLINE - ;CALL PPIDE_REGDUMP - ;CALL PANIC - + LD HL,(DIOBUF) JP PPIDE_GETBUF ; ; @@ -537,6 +452,7 @@ PPIDE_WRSEC: LD (PPIDE_CMD),A CALL PPIDE_RUNCMD RET NZ + LD HL,(DIOBUF) JP PPIDE_PUTBUF ; ; @@ -583,7 +499,7 @@ PPIDE_RUNCMD: LD A,(PPIDE_CMD) ; GET THE COMMAND DCALL PC_SPACE DCALL PRTHEXBYTE - ;OUT (PPIDE_REG_CMD),A ; SEND IT (STARTS EXECUTION) + ;OUT (PPIDE_REG_CMD),A ; SEND IT (STARTS EXECUTION) CALL PPIDE_OUT .DB PPIDE_REG_CMD #IF (PPIDETRACE >= 3) @@ -620,7 +536,7 @@ PPIDE_GETBUF: LD D,A ; D := READ ASSERTED ; ; LOOP SETUP - LD HL,(DIOBUF) ; LOCATION OF BUFFER + ;LD HL,(DIOBUF) ; LOCATION OF BUFFER LD B,0 ; 256 ITERATIONS LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) ; @@ -635,6 +551,8 @@ PPIDE_GETBUF: ;XOR A ; ZERO A ;OUT (PPIDE_IO_CTL),A ; RELEASE ALL BUS SIGNALS ; + CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! + RET NZ CALL PPIDE_GETRES JP NZ,PPIDE_IOERR RET @@ -664,7 +582,6 @@ PPIDE_PUTBUF: ; WAIT FOR BUFFER CALL PPIDE_WAITDRQ ; WAIT FOR BUFFER READY RET NZ ; BAIL OUT IF TIMEOUT - ; ; SETUP PPI TO WRITE LD A,PPIDE_DIR_WRITE ; SET DATA BUS DIRECTION TO WRITE @@ -678,7 +595,7 @@ PPIDE_PUTBUF: LD D,A ; D := WRITE ASSERTED ; ; LOOP SETUP - LD HL,(DIOBUF) ; LOCATION OF BUFFER + ;LD HL,(DIOBUF) ; LOCATION OF BUFFER LD B,0 ; 256 ITERATIONS LD C,PPIDE_IO_DATALO ; SETUP C WITH IO PORT (LSB) ; @@ -693,6 +610,8 @@ PPIDE_PUTBUF: ;XOR A ; ZERO A ;OUT (PPIDE_IO_CTL),A ; RELEASE ALL BUS SIGNALS ; + CALL PPIDE_WAITRDY ; PROBLEMS IF THIS IS REMOVED! + RET NZ CALL PPIDE_GETRES JP NZ,PPIDE_IOERR RET @@ -715,7 +634,7 @@ PPIDE_PUTBUF1: ; START OF READ LOOP ; ; PPIDE_GETRES: - ;IN A,(PPIDE_REG_STAT) ; READ STATUS + ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT DCALL PC_SPACE @@ -723,7 +642,7 @@ PPIDE_GETRES: AND %00000001 ; ERROR BIT SET? RET Z ; NOPE, RETURN WITH ZF ; - ;IN A,(PPIDE_REG_ERR) ; READ ERROR REGISTER + ;IN A,(PPIDE_REG_ERR) ; READ ERROR REGISTER CALL PPIDE_IN .DB PPIDE_REG_ERR DCALL PC_SPACE @@ -738,10 +657,11 @@ PPIDE_GETRES: ; SOFT RESET OF ALL DEVICES ON BUS ; PPIDE_RESET: +; ; SETUP PPI TO READ LD A,PPIDE_DIR_READ ; SET DATA BUS DIRECTION TO READ OUT (PPIDE_IO_PPI),A ; DO IT - +; LD A,PPIDE_CTL_RESET OUT (PPIDE_IO_CTL),A LD DE,16 @@ -752,32 +672,46 @@ PPIDE_RESET: LD DE,16 ;LD DE,1024 CALL VDELAY - +; LD A,%00001010 ; SET ~IEN, NO INTERRUPTS ;OUT (PPIDE_REG_CTRL),A CALL PPIDE_OUT .DB PPIDE_REG_CTRL - +; + ;CALL LDELAY + LD DE,$2000 ; DELAY N * 16US (~128MS) + CALL VDELAY +; + ; CLEAR OUT ALL DATA (FOR ALL UNITS) + LD HL,PPIDE_UDATA + LD BC,PPIDE_UDLEN XOR A - RET + CALL FILL +; + ; PROBE / INITIALIZE ALL UNITS + LD B,PPIDE_UNITCNT ; NUMBER OF UNITS TO TRY + LD C,0 ; UNIT INDEX FOR LOOP +PPIDE_RESET1: + LD A,C ; UNIT NUMBER TO A + PUSH BC + CALL PPIDE_INITUNIT ; PROBE/INIT UNIT + POP BC + INC C ; NEXT UNIT + DJNZ PPIDE_RESET1 ; LOOP AS NEEDED +; + XOR A ; SIGNAL SUCCESS + RET ; AND DONE ; - ;LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES - ;;OUT (PPIDE_REG_CTRL),A - ;CALL PPIDE_OUT - ;.DB PPIDE_REG_CTRL - ;LD DE,16 ; DELAY ~250US - ;CALL VDELAY - ;;LD DE,1024 - ;;CALL VDELAY - ;LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET - ;;OUT (PPIDE_REG_CTRL),A - ;CALL PPIDE_OUT - ;.DB PPIDE_REG_CTRL - ;CALL DELAY ; SMALL DELAY - ;;LD DE,1024 - ;;CALL VDELAY - ;XOR A ; SIGNAL SUCCESS - ;RET ; RETURN +; +; +PPIDE_INITUNIT: + CALL PPIDE_SELUNIT ; SELECT UNIT + RET NZ ; ABORT IF ERROR + + CALL PPIDE_PROBE ; DO PROBE + RET NZ ; ABORT IF ERROR + + JP PPIDE_INITDEV ; INIT DEVICE AND RETURN ; ; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT ; UNIT IS SPECIFIED IN A @@ -788,7 +722,7 @@ PPIDE_SELUNIT: ;RET Z ; IF SO, NOTHING MORE TO DO CP PPIDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?) - JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT + JP NC,PPIDE_INVUNIT ; HANDLE INVALID UNIT ; ; NEW UNIT SELECTED, IMPLEMENT IT LD (PPIDE_UNIT),A ; RECORD NEW UNIT NUMBER @@ -811,33 +745,26 @@ PPIDE_SELUNIT: ; ; PPIDE_PROBE: - CALL PPIDE_SELUNIT ; SELECT UNIT - RET NZ ; ABORT ON ERROR -; - ;CALL LDELAY - LD DE,$2000 ; DELAY N * 16US (~128MS) - CALL VDELAY -; - ;; WAIT FOR READY... - ;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR - ;RET NZ ; ABORT ON TIMEOUT +#IF (PPIDETRACE >= 3) + CALL PPIDE_PRTPREFIX + PRTS(" PROBE$") ; LABEL FOR IO ADDRESS +#ENDIF ; ; CHECK STATUS ; IN A,(PPIDE_REG_STAT) ; GET STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT + DCALL PC_SPACE DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS OR A ; SET FLAGS TO TEST FOR ZERO - JR NZ,PPIDE_PROBE0 ; CONTINUE IF NON-ZERO - DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR - RET ; AND DONE + JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO ; PPIDE_PROBE0: ;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR ;RET NZ ; ABORT ON TIMEOUT ; ;; CHECK STATUS - ;IN A,(PPIDE_REG_STAT) ; GET STATUS + ;IN A,(PPIDE_REG_STAT) ; GET STATUS ;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS ;OR A ; SET FLAGS TO TEST FOR ZERO ;JR NZ,PPIDE_PROBE1 ; CONTINUE IF NON-ZERO @@ -852,28 +779,28 @@ PPIDE_PROBE1: .DB PPIDE_REG_COUNT DCALL PRTHEXBYTE CP $01 - RET NZ + JP NZ,PPIDE_NOMEDIA DCALL PC_SPACE ;IN A,(PPIDE_REG_SECT) CALL PPIDE_IN .DB PPIDE_REG_SECT DCALL PRTHEXBYTE CP $01 - RET NZ + JP NZ,PPIDE_NOMEDIA DCALL PC_SPACE ;IN A,(PPIDE_REG_CYLLO) CALL PPIDE_IN .DB PPIDE_REG_CYLLO DCALL PRTHEXBYTE CP $00 - RET NZ + JP NZ,PPIDE_NOMEDIA DCALL PC_SPACE ;IN A,(PPIDE_REG_CYLHI) CALL PPIDE_IN .DB PPIDE_REG_CYLHI DCALL PRTHEXBYTE CP $00 - RET NZ + JP NZ,PPIDE_NOMEDIA ; ; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED @@ -881,6 +808,59 @@ PPIDE_PROBE1: XOR A ; SIGNAL SUCCESS RET ; DONE, NOTE THAT A=0 AND Z IS SET ; +; (RE)INITIALIZE DEVICE +; +PPIDE_INITDEV: +; + PPIDE_DPTR(PPIDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED + LD A,(HL) ; GET THE DEVICE TYPE + OR A ; SET FLAGS + JP Z,PPIDE_NOMEDIA ; EXIT SETTING NO MEDIA STATUS +; + ; CLEAR OUT UNIT SPECIFIC DATA, BUT PRESERVE THE EXISTING + ; VALUE OF THE UNIT TYPE WHICH WAS ESTABLISHED BY THE DEVICE + ; PROBES WHEN THE PPIDE BUS WAS RESET + PUSH AF ; SAVE UNIT TYPE VALUE FROM ABOVE + PUSH HL ; SAVE UNIT TYPE FIELD POINTER + PPIDE_DPTR(0) ; SET HL TO START OF UNIT DATA + LD BC,PPIDE_UDLEN + XOR A + CALL FILL + POP HL ; RECOVER UNIT TYPE FIELD POINTER + POP AF ; RECOVER UNIT TYPE VALUE + LD (HL),A ; AND PUT IT BACK +; +#IF (PPIDE8BIT) + LD A,PPIDE_FEAT_ENABLE8BIT ; FEATURE VALUE = ENABLE 8-BIT PIO +#ELSE + LD A,PPIDE_FEAT_DISABLE8BIT ; FEATURE VALUE = DISABLE 8-BIT PIO +#ENDIF + CALL PPIDE_SETFEAT ; SET FEATURE + RET NZ ; BAIL OUT ON ERROR +; + CALL PPIDE_IDENTIFY ; EXECUTE PPIDENTIFY COMMAND + RET NZ ; BAIL OUT ON ERROR +; + LD DE,HB_TMPBUF ; POINT TO BUFFER + DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING +; + ; GET DEVICE CAPACITY AND SAVE IT + PPIDE_DPTR(PPIDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD + PUSH HL ; SAVE POINTER + LD HL,HB_TMPBUF ; POINT TO BUFFER START + LD A,120 ; OFFSET OF SECTOR COUNT + CALL ADDHLA ; POINT TO ADDRESS OF SECTOR COUNT + CALL LD32 ; LOAD IT TO DE:HL + POP BC ; RECOVER POINTER TO CAPACITY ENTRY + CALL ST32 ; SAVE CAPACITY +; + ; RESET CARD STATUS TO 0 (OK) + PPIDE_DPTR(PPIDE_STAT) ; HL := ADR OF STATUS, AF TRASHED + XOR A ; A := 0 (STATUS = OK) + LD (HL),A ; SAVE IT +; + RET ; RETURN, A=0, Z SET +; ; ; PPIDE_CHKDEVICE: @@ -900,7 +880,7 @@ PPIDE_WAITRDY: PPIDE_WAITRDY1: LD DE,-1 ; ~1 SECOND INNER LOOP PPIDE_WAITRDY2: - ;IN A,(PPIDE_REG_STAT) ; READ STATUS + ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT LD C,A ; SAVE IT @@ -911,7 +891,7 @@ PPIDE_WAITRDY2: DEC DE LD A,D OR E - JR NZ,PPIDE_WAITRDY2 ; INNER LOOP RETURN + JR NZ,PPIDE_WAITRDY2 ; INNER LOOP RETURN DJNZ PPIDE_WAITRDY1 ; OUTER LOOP RETURN JP PPIDE_RDYTO ; EXIT WITH RDYTO ERR ; @@ -922,7 +902,7 @@ PPIDE_WAITDRQ: PPIDE_WAITDRQ1: LD DE,-1 ; ~1 SECOND INNER LOOP PPIDE_WAITDRQ2: - ;IN A,(PPIDE_REG_STAT) ; READ STATUS + ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT LD C,A ; SAVE IT @@ -944,7 +924,7 @@ PPIDE_WAITBSY: PPIDE_WAITBSY1: LD DE,-1 ; ~1 SECOND INNER LOOP PPIDE_WAITBSY2: - ;IN A,(PPIDE_REG_STAT) ; READ STATUS + ;IN A,(PPIDE_REG_STAT) ; READ STATUS CALL PPIDE_IN .DB PPIDE_REG_STAT LD C,A ; SAVE IT @@ -1023,6 +1003,7 @@ PPIDE_IOERR: JR PPIDE_ERR ; PPIDE_RDYTO: + CALL PC_COLON LD A,PPIDE_STRDYTO JR PPIDE_ERR ; @@ -1060,7 +1041,7 @@ PPIDE_PRTSTAT: JR Z,PPIDE_PRTSTAT1 INC A LD DE,PPIDE_STR_STINVUNIT - JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE + JR Z,PPIDE_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE INC A LD DE,PPIDE_STR_STNOMEDIA JR Z,PPIDE_PRTSTAT1 @@ -1164,10 +1145,10 @@ PPIDE_STR_STOK .TEXT "OK$" PPIDE_STR_STINVUNIT .TEXT "INVALID UNIT$" PPIDE_STR_STNOMEDIA .TEXT "NO MEDIA$" PPIDE_STR_STCMDERR .TEXT "COMMAND ERROR$" -PPIDE_STR_STIOERR .TEXT "IO ERROR$" -PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$" -PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$" -PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" +PPIDE_STR_STIOERR .TEXT "IO ERROR$" +PPIDE_STR_STRDYTO .TEXT "READY TIMEOUT$" +PPIDE_STR_STDRQTO .TEXT "DRQ TIMEOUT$" +PPIDE_STR_STBSYTO .TEXT "BUSY TIMEOUT$" PPIDE_STR_STUNK .TEXT "UNKNOWN ERROR$" ; PPIDE_STR_NO .TEXT "NO$" @@ -1176,14 +1157,14 @@ PPIDE_STR_NO .TEXT "NO$" ; DATA STORAGE ;============================================================================= ; -PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS +PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO ; ; UNIT SPECIFIC DATA STORAGE ; -PPIDE_UDATA .FILL PPIDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES +PPIDE_UDATA .FILL PPIDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES PPIDE_DLEN .EQU $ - PPIDE_UDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS PPIDE_UDLEN .EQU PPIDE_DLEN / PPIDE_UNITCNT ; LENGTH OF PER UNIT DATA ;