Browse Source

Refactor SD driver

pull/3/head
Wayne Warthen 10 years ago
parent
commit
803bb6a87d
  1. 113
      Source/HBIOS/Config/mk4_dsd.asm
  2. 20
      Source/HBIOS/Config/mk4_std.asm
  3. 12
      Source/HBIOS/hbios.asm
  4. 12
      Source/HBIOS/hdsk.asm
  5. 182
      Source/HBIOS/ide.asm
  6. 3
      Source/HBIOS/loader.asm
  7. 2201
      Source/HBIOS/sd.asm
  8. 67
      Source/HBIOS/util.asm
  9. BIN
      Source/RomDsk/mk4_dsd/RTC.COM
  10. BIN
      Source/RomDsk/mk4_dsd/XM-A0.COM
  11. BIN
      Source/RomDsk/mk4_dsd/XM-A1.COM
  12. BIN
      Source/RomDsk/mk4_dsd/XM5-A0.COM
  13. BIN
      Source/RomDsk/mk4_dsd/XM5-A1.COM

113
Source/HBIOS/Config/mk4_dsd.asm

@ -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

20
Source/HBIOS/Config/mk4_std.asm

@ -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

12
Source/HBIOS/hbios.asm

@ -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

12
Source/HBIOS/hdsk.asm

@ -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

182
Source/HBIOS/ide.asm

@ -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
;
IDE_INIT3:
CALL NEWLINE
LD DE,IDESTR_PREFIX
CALL WRITESTR
LD A,C
CALL PRTDECB
CALL PC_COLON
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: ; 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
;
;
;
;

3
Source/HBIOS/loader.asm

@ -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)

2201
Source/HBIOS/sd.asm

File diff suppressed because it is too large

67
Source/HBIOS/util.asm

@ -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

Binary file not shown.

BIN
Source/RomDsk/mk4_dsd/XM-A0.COM

Binary file not shown.

BIN
Source/RomDsk/mk4_dsd/XM-A1.COM

Binary file not shown.

BIN
Source/RomDsk/mk4_dsd/XM5-A0.COM

Binary file not shown.

BIN
Source/RomDsk/mk4_dsd/XM5-A1.COM

Binary file not shown.
Loading…
Cancel
Save