mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:13:13 -06:00
Refactor SD driver
This commit is contained in:
113
Source/HBIOS/Config/mk4_dsd.asm
Normal file
113
Source/HBIOS/Config/mk4_dsd.asm
Normal file
@@ -0,0 +1,113 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; ROMWBW 2.X CONFIGURATION FOR N8 2312
|
||||
;==================================================================================================
|
||||
;
|
||||
; BUILD CONFIGURATION OPTIONS
|
||||
;
|
||||
CPUOSC .EQU 18432000 ; CPU OSC FREQ
|
||||
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB, MUST MATCH YOUR HARDWARE!!!
|
||||
CONBAUD .EQU 38400 ; DEFAULT BAUDRATE USED BELOW
|
||||
;
|
||||
SERDEV .EQU CIODEV_ASCI ; PRIMARY SERIAL DEVICE FOR BOOT/DEBUG/MONITOR (TYPICALLY CIODEV_UART OR CIODEV_ASCI)
|
||||
CRTDEV .EQU CIODEV_VDA ; CRT DEVICE (CIODEV_PRPCON, CIODEV_PPPCON, CIODEV_VDA), USE CIODEV_NUL IF NO CRT
|
||||
CRTACT .EQU FALSE ; CRT ACTIVATION AT STARTUP
|
||||
VDADEV .EQU VDADEV_CVDU ; CRT VDA DEVICE (VDADEV_NONE, VDADEV_VDU, VDADEV_CVDU, VDADEV_N8V, VDADEV_UPD7220)
|
||||
VDAEMU .EQU EMUTYP_ANSI ; DEFAULT VDA EMULATION (EMUTYP_TTY, EMUTYP_ANSI, ...)
|
||||
;
|
||||
DSKYENABLE .EQU FALSE ; TRUE FOR DSKY SUPPORT (DO NOT COMBINE WITH PPIDE)
|
||||
;
|
||||
SIMRTCENABLE .EQU FALSE ; SIMH CLOCK DRIVER
|
||||
DSRTCENABLE .EQU TRUE ; DS-1302 CLOCK DRIVER
|
||||
;
|
||||
UARTENABLE .EQU FALSE ; TRUE FOR UART SUPPORT (N8 USES ASCI DRIVER)
|
||||
UARTCNT .EQU 0 ; NUMBER OF UARTS
|
||||
;
|
||||
ASCIENABLE .EQU TRUE ; TRUE FOR Z180 ASCI SUPPORT
|
||||
ASCI0BAUD .EQU CONBAUD ; ASCI0 BAUDRATE (IMPLEMENTED BY Z180_ASCIB0)
|
||||
ASCI1BAUD .EQU CONBAUD ; ASCI1 BAUDRATE (IMPLEMENTED BY Z180_ASCIB1)
|
||||
;
|
||||
VDUENABLE .EQU FALSE ; TRUE FOR VDU BOARD SUPPORT
|
||||
CVDUENABLE .EQU FALSE ; TRUE FOR CVDU BOARD SUPPORT
|
||||
UPD7220ENABLE .EQU FALSE ; TRUE FOR uPD7220 BOARD SUPPORT
|
||||
N8VENABLE .EQU FALSE ; TRUE FOR N8 (TMS9918) VIDEO/KBD SUPPORT
|
||||
;
|
||||
MDENABLE .EQU TRUE ; TRUE FOR ROM/RAM DISK SUPPORT (ALMOST ALWAYS WANT THIS ENABLED)
|
||||
MDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF MDENABLE = TRUE)
|
||||
;
|
||||
FDENABLE .EQU FALSE ; TRUE FOR FLOPPY SUPPORT
|
||||
FDMODE .EQU FDMODE_N8 ; FDMODE_DIO, FDMODE_ZETA, FDMODE_DIDE, FDMODE_N8, FDMODE_DIO3
|
||||
FDTRACE .EQU 1 ; 0=SILENT, 1=FATAL ERRORS, 2=ALL ERRORS, 3=EVERYTHING (ONLY RELEVANT IF FDENABLE = TRUE)
|
||||
FDMEDIA .EQU FDM144 ; FDM720, FDM144, FDM360, FDM120 (ONLY RELEVANT IF FDENABLE = TRUE)
|
||||
FDMEDIAALT .EQU FDM720 ; ALTERNATE MEDIA TO TRY, SAME CHOICES AS ABOVE (ONLY RELEVANT IF FDMAUTO = TRUE)
|
||||
FDMAUTO .EQU TRUE ; SELECT BETWEEN MEDIA OPTS ABOVE AUTOMATICALLY
|
||||
;
|
||||
RFENABLE .EQU FALSE ; TRUE FOR RAM FLOPPY SUPPORT
|
||||
RFCNT .EQU 1 ; NUMBER OF RAM FLOPPY UNITS
|
||||
;
|
||||
IDEENABLE .EQU TRUE ; TRUE FOR IDE SUPPORT
|
||||
IDEMODE .EQU IDEMODE_MK4 ; IDEMODE_DIO, IDEMODE_DIDE, IDEMODE_MK4
|
||||
IDECNT .EQU 1 ; NUMBER OF IDE UNITS
|
||||
IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
IDE8BIT .EQU TRUE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
PPIDEIOB .EQU $60 ; PPIDE IOBASE
|
||||
PPIDECNT .EQU 1 ; NUMBER OF PPIDE UNITS
|
||||
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
|
||||
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
PPIDESLOW .EQU FALSE ; ADD DELAYS TO HELP PROBLEMATIC HARDWARE (TRY THIS IF PPIDE IS UNRELIABLE)
|
||||
;
|
||||
SDENABLE .EQU TRUE ; TRUE FOR SD SUPPORT
|
||||
SDMODE .EQU SDMODE_DSD ; SDMODE_JUHA, SDMODE_CSIO, SDMODE_UART, SDMODE_PPI, SDMODE_DSD, SDMODE_MK4
|
||||
SDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
SDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
SDCSIOFAST .EQU TRUE ; TABLE-DRIVEN BIT INVERTER
|
||||
;
|
||||
PRPENABLE .EQU FALSE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
|
||||
PRPIOB .EQU $A8 ; PORT IO ADDRESS BASE
|
||||
PRPSDENABLE .EQU TRUE ; TRUE FOR PROPIO SD SUPPORT (FOR N8VEM PROPIO ONLY!)
|
||||
PRPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PRPSDENABLE = TRUE)
|
||||
PRPSDCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
PRPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
|
||||
;
|
||||
PPPENABLE .EQU FALSE ; TRUE FOR PARPORTPROP SUPPORT
|
||||
PPPSDENABLE .EQU TRUE ; TRUE FOR PARPORTPROP SD SUPPORT
|
||||
PPPSDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPPENABLE = TRUE)
|
||||
PPPSDCAPACITY .EQU 64 ; CAPACITY OF PPP SD DEVICE (IN MB)
|
||||
PPPCONENABLE .EQU TRUE ; TRUE FOR PROPIO CONSOLE SUPPORT (PS/2 KBD & VGA VIDEO)
|
||||
;
|
||||
HDSKENABLE .EQU FALSE ; TRUE FOR SIMH HDSK SUPPORT
|
||||
HDSKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
HDSKCAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
PPKENABLE .EQU FALSE ; TRUE FOR PARALLEL PORT KEYBOARD
|
||||
PPKTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPKENABLE = TRUE)
|
||||
KBDENABLE .EQU FALSE ; TRUE FOR PS/2 KEYBOARD ON I8242
|
||||
KBDTRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF KBDENABLE = TRUE)
|
||||
;
|
||||
TTYENABLE .EQU FALSE ; INCLUDE TTY EMULATION SUPPORT
|
||||
ANSIENABLE .EQU FALSE ; INCLUDE ANSI EMULATION SUPPORT
|
||||
ANSITRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF ANSIENABLE = TRUE)
|
||||
;
|
||||
BOOTTYPE .EQU BT_MENU ; BT_MENU (WAIT FOR KEYPRESS), BT_AUTO (BOOT_DEFAULT AFTER BOOT_TIMEOUT SECS)
|
||||
BOOT_TIMEOUT .EQU 20 ; APPROX TIMEOUT IN SECONDS FOR AUTOBOOT, 0 FOR IMMEDIATE
|
||||
BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
; 18.432MHz OSC @ FULL SPEED, 38.4Kbps
|
||||
;
|
||||
;Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; 18.432MHz OSC @ DOUBLE SPEED, 38.4Kbps
|
||||
;
|
||||
Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
@@ -98,16 +98,16 @@ BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
; 18.432MHz OSC @ FULL SPEED, 38.4Kbps
|
||||
;
|
||||
Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; 18.432MHz OSC @ DOUBLE SPEED, 38.4Kbps
|
||||
;
|
||||
;Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
|
||||
@@ -511,6 +511,11 @@ HB_START:
|
||||
CALL PRTDEC
|
||||
PRTS("KB$")
|
||||
;
|
||||
; SET UP THE DEFAULT DISK BUFFER ADDRESS
|
||||
;
|
||||
LD HL,HB_BUF ; DEFAULT DISK XFR BUF ADDRESS
|
||||
LD (DIOBUF),HL ; SAVE IT
|
||||
;
|
||||
; PERFORM DEVICE INITIALIZATION
|
||||
;
|
||||
LD B,HB_INITTBLLEN
|
||||
@@ -530,11 +535,6 @@ INITSYS1:
|
||||
POP DE
|
||||
DJNZ INITSYS1
|
||||
;
|
||||
; SET UP THE DEFAULT DISK BUFFER ADDRESS
|
||||
;
|
||||
LD HL,HB_BUF ; DEFAULT DISK XFR BUF ADDRESS
|
||||
LD (DIOBUF),HL ; SAVE IT
|
||||
;
|
||||
; NOW SWITCH TO CRT CONSOLE IF CONFIGURED
|
||||
;
|
||||
#IF CRTACT
|
||||
@@ -1748,6 +1748,8 @@ IDLECOUNT .DB 0
|
||||
;
|
||||
; DISK DEVICE/UNIT ID
|
||||
HSTDSK .DB 0 ; DISK DEVICE/UNIT ID
|
||||
; FULL 32 BIT LBA
|
||||
HSTLBA .EQU $ ; REFERS TO START OF 32-BIT LBA
|
||||
; LBA LOW WORD -OR- TRACK
|
||||
HSTLBALO .EQU $ ; BLOCK ADDRESS LBA LOW WORD
|
||||
HSTTRK .DW 0 ; BLOCK ADDRESS TRACK
|
||||
|
||||
@@ -68,13 +68,13 @@ HDSK_STATUS:
|
||||
RET
|
||||
;
|
||||
; GET DISK CAPACITY
|
||||
; RETURN HL:DE=BLOCK COUNT, BC=BLOCK SIZE
|
||||
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE
|
||||
; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS
|
||||
; ASSUME 8 SLICES, SO 65 X 8 = 520 CYLS OR 16,640 * 8 = 133,120 TOTAL SECTORS
|
||||
; ASSUME 8 SLICES, SO 16640 X 8 = 133,120 TOTAL SECTORS
|
||||
;
|
||||
HDSK_CAP:
|
||||
LD HL,133120 >> 16 ; BLOCK COUNT MSW
|
||||
LD DE,133120 & $FFFF ; BLOCK COUNT LSW
|
||||
LD DE,133120 >> 16 ; BLOCK COUNT MSW
|
||||
LD HL,133120 & $FFFF ; BLOCK COUNT LSW
|
||||
LD BC,512 ; 512 BYTE SECTOR
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
@@ -83,8 +83,8 @@ HDSK_CAP:
|
||||
; RETURN HL:DE=CYLINDERS, B=HEADS, C=SECTORS
|
||||
;
|
||||
HDSK_GEOM:
|
||||
LD HL,0 ; CYLINDER COUNT MSW
|
||||
LD DE,520 ; CYLINDER COUNT LSW
|
||||
LD DE,0 ; CYLINDER COUNT MSW
|
||||
LD HL,520 ; CYLINDER COUNT LSW
|
||||
LD B,16 ; HEADS / CYLINDER
|
||||
LD C,16 ; SECTORS / TRACK
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
|
||||
@@ -62,82 +62,144 @@ IDE_RCBSYTO .EQU 4
|
||||
;
|
||||
; UNIT CONFIGURATION
|
||||
;
|
||||
IDE_DEVLIST:
|
||||
IDE_DEVICES:
|
||||
IDE_DEVICE0 .DB %11100000 ; LBA, MASTER DEVICE
|
||||
IDE_DEVICE1 .DB %11110000 ; LBA, SLAVE DEVICE
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_INIT:
|
||||
PRTS("IDE: IO=0x$")
|
||||
LD A,IDEDATA
|
||||
CALL PRTHEXBYTE
|
||||
|
||||
CALL IDE_RESET ; INTERFACE RESET
|
||||
CALL DELAY
|
||||
|
||||
XOR A ; STATUS OK
|
||||
LD (IDE_STAT),A ; INITIALIZE IT
|
||||
|
||||
LD A,(IDE_DEVICE0) ; DEVICE 0
|
||||
DCALL PC_SPACE
|
||||
DCALL PC_LBKT
|
||||
CALL IDE_PROBE
|
||||
DCALL PC_RBKT
|
||||
JR NZ,IDE_INIT1
|
||||
LD HL,IDE_UNITCNT
|
||||
INC (HL)
|
||||
LD A,(IDE_DEVICE1) ; DEVICE 1
|
||||
DCALL PC_SPACE
|
||||
DCALL PC_LBKT
|
||||
CALL IDE_PROBE
|
||||
DCALL PC_RBKT
|
||||
JR NZ,IDE_INIT1
|
||||
LD HL,IDE_UNITCNT
|
||||
INC (HL)
|
||||
PRTS("IDE:$") ; LABEL FOR IO ADDRESS
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_DIO)
|
||||
PRTS(" MODE=DIO$")
|
||||
#ENDIF
|
||||
#IF (IDEMODE == IDEMODE_DIDE)
|
||||
PRTS(" MODE=DIDE$")
|
||||
#ENDIF
|
||||
#IF (IDEMODE == IDEMODE_MK4)
|
||||
PRTS(" MODE=MK4$")
|
||||
#ENDIF
|
||||
; PRINT IDE INTERFACE PORT ADDRESS
|
||||
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS
|
||||
LD A,IDEDATA ; GET IO ADDRESS
|
||||
CALL PRTHEXBYTE ; PRINT IT
|
||||
;
|
||||
; RESET INTERFACE
|
||||
CALL IDE_RESET ; INTERFACE RESET
|
||||
CALL DELAY ; SMALL DELAY
|
||||
;
|
||||
; SET GLOBAL STATUS TO OK (ZERO)
|
||||
XOR A ; STATUS OK
|
||||
LD (IDE_STAT),A ; INITIALIZE IT
|
||||
;
|
||||
; PROBE FOR DEVICE(S)
|
||||
LD A,(IDE_DEVICE0) ; DEVICE 0
|
||||
DCALL PC_SPACE ; IF DEBUGGING, PRINT A SPACE
|
||||
DCALL PC_LBKT ; IF DEBUGGING, PRINT LEFT BRACKET
|
||||
CALL IDE_PROBE ; PROBE FOR DEVICE 0 PRESENCE
|
||||
DCALL PC_RBKT ; IF DEBUGGING, PRINT A RIGHT BRACKET
|
||||
JR NZ,IDE_INIT1 ; IF DEVCIE 0 NOT PRESENT, SKIP DEVICE 1 PROBE
|
||||
LD HL,IDE_UNITCNT ; POINT TO UNIT COUNT
|
||||
INC (HL) ; INCREMENT IT
|
||||
LD A,(IDE_DEVICE1) ; DEVICE 1
|
||||
DCALL PC_SPACE ; IF DEBUGGING, PRINT A SPACE
|
||||
DCALL PC_LBKT ; IF DEBUGGING, PRINT A LEFT BRACKET
|
||||
CALL IDE_PROBE ; PROBE FOR DEVICE 1 PRESENT
|
||||
DCALL PC_RBKT ; IF DEBUGGING, PRINT A RIGHT BRACKET
|
||||
JR NZ,IDE_INIT1 ; IF DEVICE 1 NOT PRESENT, SKIP
|
||||
LD HL,IDE_UNITCNT ; POINT TO UNIT COUNT
|
||||
INC (HL) ; INCREMENT IT
|
||||
;
|
||||
IDE_INIT1:
|
||||
LD A,(IDE_DEVICE0) ; DEVICE 0
|
||||
OUT (IDEDEVICE),A ; SELECT IT
|
||||
CALL DELAY
|
||||
|
||||
PRTS(" UNITS=$")
|
||||
LD A,(IDE_UNITCNT)
|
||||
CALL PRTDECB
|
||||
; RESTORE DEFAULT DEVICE SELECTION (DEVICE 0)
|
||||
LD A,(IDE_DEVICE0) ; DEVICE 0
|
||||
OUT (IDEDEVICE),A ; SELECT IT
|
||||
CALL DELAY ; SMALL DELAY AFTER SELECT
|
||||
;
|
||||
; PRINT UNIT COUNT
|
||||
PRTS(" UNITS=$") ; PRINT LABEL FOR UNIT COUNT
|
||||
LD A,(IDE_UNITCNT) ; GET UNIT COUNT
|
||||
CALL PRTDECB ; PRINT IT IN DECIMAL
|
||||
;
|
||||
; CHECK FOR ZERO DEVICES AND BAIL OUT IF SO
|
||||
LD A,(IDE_UNITCNT) ; GET UNIT COUNT
|
||||
OR A ; SET FLAGS
|
||||
RET Z ; IF ZERO, WE ARE DONE
|
||||
;
|
||||
; DEVICE SETUP LOOP
|
||||
LD B,A ; LOOP ONCE PER UNIT
|
||||
LD C,0 ; C IS INDEX TO DEVICE LIST
|
||||
LD C,0 ; C IS UNIT INDEX
|
||||
IDE_INIT2:
|
||||
PUSH BC
|
||||
CALL IDE_INIT3
|
||||
POP BC
|
||||
INC C
|
||||
DJNZ IDE_INIT2
|
||||
RET
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
CALL IDE_INIT3 ; HANDLE THE NEXT UNIT
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
INC C ; INCREMENT UNIT INDEX
|
||||
DJNZ IDE_INIT2 ; LOOP UNTIL DONE
|
||||
RET ; INIT FINISHED
|
||||
;
|
||||
IDE_INIT3:
|
||||
CALL NEWLINE
|
||||
LD DE,IDESTR_PREFIX
|
||||
CALL WRITESTR
|
||||
LD A,C
|
||||
CALL PRTDECB
|
||||
CALL PC_COLON
|
||||
IDE_INIT3: ; SUBROUTINE TO QUERY A DEVICE
|
||||
|
||||
; PRINT PREFIX FOR UNIT INFO "IDE#:"
|
||||
CALL NEWLINE ; FORMATTING: START A NEW LINE
|
||||
LD DE,IDESTR_PREFIX ; POINT TO STRING "IDE"
|
||||
CALL WRITESTR ; PRINT STRING
|
||||
LD A,C ; UNIT NUMBER TO ACCUM
|
||||
LD (IDE_CURUNIT),A ; SAVE THE CURRENT UNIT
|
||||
CALL PRTDECB ; PRINT IT IN DECIMAL
|
||||
CALL PC_COLON ; PRINT THE ENDING COLON
|
||||
;
|
||||
LD A,C
|
||||
CALL IDE_SELECT
|
||||
LD A,C ; UNIT NUMBER TO ACCUM
|
||||
CALL IDE_SELECT ; SELECT THE CORRECT DEVICE
|
||||
;
|
||||
#IF (IDE8BIT)
|
||||
PRTS(" 8BIT$")
|
||||
CALL IDE_SET8BIT
|
||||
RET NZ
|
||||
CALL IDE_SET8BIT ; SET 8BIT TRANSFER FEATURE
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
#ENDIF
|
||||
CALL IDE_IDENTIFY
|
||||
RET NZ
|
||||
LD DE,(DIOBUF)
|
||||
DCALL DUMP_BUFFER
|
||||
;
|
||||
CALL IDE_IDENTIFY ; EXECUTE IDENTIFY COMMAND
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
LD DE,(DIOBUF) ; POINT TO BUFFER
|
||||
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
|
||||
;
|
||||
; PRINT LBA/NOLBA
|
||||
CALL PC_SPACE ; SPACING
|
||||
LD HL,(DIOBUF) ; 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
|
||||
BIT 1,A ; CHECK THE LBA BIT
|
||||
LD DE,IDESTR_NO ; POINT TO "NO" STRING
|
||||
CALL Z,WRITESTR ; PRINT "NO" BEFORE "LBA" IF LBA NOT SUPPORTED
|
||||
PRTS("LBA$") ; PRINT "LBA" REGARDLESS
|
||||
;
|
||||
; PRECOMPUTE LOC TO STORE 32-BIT CAPACITY
|
||||
LD HL,IDE_CAPLIST ; POINT TO CAPACITY ARRAY
|
||||
LD A,(IDE_CURUNIT) ; GET CUR UNIT NUM
|
||||
RLCA ; MULTIPLY BY 4
|
||||
RLCA ; ... TO OFFSET BY DWORDS
|
||||
CALL ADDHLA ; ADD OFFSET TO POINTER
|
||||
PUSH HL ; SAVE POINTER
|
||||
;
|
||||
; GET, SAVE, AND PRINT STORAGE CAPACITY (BLOCK COUNT)
|
||||
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
|
||||
LD HL,(DIOBUF) ; POINT TO BUFFER START
|
||||
LD DE,120 ; OFFSET OF SECGTOR COUNT
|
||||
ADD HL,DE ; POINT TO ADDRESS OF SECTOR COUNT
|
||||
CALL LD32 ; LOAD IT TO DE:HL
|
||||
POP BC ; RECOVER POINTER TO CAPACITY ARRAY ENTRY
|
||||
CALL ST32 ; SAVE CAPACITY
|
||||
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 PRTDEC ; PRINT LOW WORD IN DECIMAL (HIGH WORD DISCARDED)
|
||||
PRTS("MB$") ; PRINT SUFFIX
|
||||
;
|
||||
RET
|
||||
;
|
||||
;
|
||||
@@ -267,7 +329,7 @@ IDE_RESET:
|
||||
; SELECT DEVICE IN A
|
||||
;
|
||||
IDE_SELECT:
|
||||
LD HL,IDE_DEVLIST
|
||||
LD HL,IDE_DEVICES
|
||||
CALL ADDHLA
|
||||
LD A,(HL) ; LOAD DEVICE
|
||||
LD (IDE_DEVICE),A ; SHADOW REGISTER
|
||||
@@ -622,12 +684,14 @@ IDESTR_RCRDYTO .TEXT "READY TIMEOUT$"
|
||||
IDESTR_RCBUFTO .TEXT "BUFFER TIMEOUT$"
|
||||
IDESTR_RCBSYTO .TEXT "BUSY TIMEOUT$"
|
||||
IDESTR_RCUNK .TEXT "UNKNOWN ERROR$"
|
||||
IDESTR_NO .TEXT "NO$"
|
||||
;
|
||||
;==================================================================================================
|
||||
; IDE DISK DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
IDE_UNITCNT .DB 0
|
||||
IDE_CURUNIT .DB 0
|
||||
IDE_STAT .DB 0
|
||||
;
|
||||
IDE_CMD .DB 0
|
||||
@@ -638,6 +702,8 @@ IDE_SEC .DB 0
|
||||
IDE_STTS .DB 0
|
||||
IDE_ERRS .DB 0
|
||||
;
|
||||
IDE_CAPLIST .FILL 2 * 4,0 ; CAPACITY OF EACH UNIT IN BLOCKS, 1 DWORD PER UNIT
|
||||
;
|
||||
;
|
||||
;
|
||||
;
|
||||
|
||||
@@ -153,6 +153,9 @@ CB_DDL: ; START OF LIST
|
||||
;
|
||||
#IF SDENABLE
|
||||
.DB DIODEV_SD + 0 ; SD0: (SD CARD DISK)
|
||||
#IF (SDMODE == SDMODE_DSD)
|
||||
.DB DIODEV_SD + 1 ; SD1: (SD CARD DISK)
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (PRPENABLE & PRPSDENABLE)
|
||||
|
||||
2175
Source/HBIOS/sd.asm
2175
Source/HBIOS/sd.asm
File diff suppressed because it is too large
Load Diff
@@ -180,6 +180,19 @@ PRTHEXWORD:
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT THE HEX DWORD VALUE IN DE:HL
|
||||
;
|
||||
PRTHEX32:
|
||||
PUSH BC
|
||||
PUSH DE
|
||||
POP BC
|
||||
CALL PRTHEXWORD
|
||||
PUSH HL
|
||||
POP BC
|
||||
CALL PRTHEXWORD
|
||||
POP BC
|
||||
RET
|
||||
;
|
||||
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE
|
||||
;
|
||||
HEXASCII:
|
||||
@@ -861,6 +874,60 @@ PRTDEC2:
|
||||
PRTDEC3:
|
||||
RET
|
||||
;
|
||||
; SHIFT HL:DE BY B BITS
|
||||
;
|
||||
SRL32:
|
||||
; ROTATE RIGHT 32 BITS, HIGH ORDER BITS BECOME ZERO
|
||||
SRL D
|
||||
RR E
|
||||
RR H
|
||||
RR L
|
||||
DJNZ SRL32
|
||||
RET
|
||||
;
|
||||
SLA32:
|
||||
; ROTATE LEFT 32 BITS, LOW ORDER BITS BECOME ZERO
|
||||
SLA L
|
||||
RL H
|
||||
RL E
|
||||
RL D
|
||||
DJNZ SLA32
|
||||
RET
|
||||
;
|
||||
; LOAD OR STORE DE:HL
|
||||
;
|
||||
LD32:
|
||||
; LD DE:HL,(HL)
|
||||
PUSH AF
|
||||
LD E,(HL)
|
||||
INC HL
|
||||
LD D,(HL)
|
||||
INC HL
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
LD H,(HL)
|
||||
LD L,A
|
||||
POP AF
|
||||
EX DE,HL
|
||||
RET
|
||||
;
|
||||
ST32:
|
||||
; LD (BC),DE:HL
|
||||
PUSH AF
|
||||
LD A,L
|
||||
LD (BC),A
|
||||
INC BC
|
||||
LD A,H
|
||||
LD (BC),A
|
||||
INC BC
|
||||
LD A,E
|
||||
LD (BC),A
|
||||
INC BC
|
||||
LD A,D
|
||||
LD (BC),A
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
;==================================================================================================
|
||||
; DSKY KEYBOARD ROUTINES
|
||||
;==================================================================================================
|
||||
|
||||
BIN
Source/RomDsk/mk4_dsd/RTC.COM
Normal file
BIN
Source/RomDsk/mk4_dsd/RTC.COM
Normal file
Binary file not shown.
BIN
Source/RomDsk/mk4_dsd/XM-A0.COM
Normal file
BIN
Source/RomDsk/mk4_dsd/XM-A0.COM
Normal file
Binary file not shown.
BIN
Source/RomDsk/mk4_dsd/XM-A1.COM
Normal file
BIN
Source/RomDsk/mk4_dsd/XM-A1.COM
Normal file
Binary file not shown.
BIN
Source/RomDsk/mk4_dsd/XM5-A0.COM
Normal file
BIN
Source/RomDsk/mk4_dsd/XM5-A0.COM
Normal file
Binary file not shown.
BIN
Source/RomDsk/mk4_dsd/XM5-A1.COM
Normal file
BIN
Source/RomDsk/mk4_dsd/XM5-A1.COM
Normal file
Binary file not shown.
Reference in New Issue
Block a user