Browse Source

Add HBIOS Heap Memory

- New heap memory functions
- Restructured new disk I/O functions
pull/3/head
Wayne Warthen 10 years ago
parent
commit
b67106889e
  1. BIN
      Doc/Source/Build.docx
  2. 46
      Source/CBIOS/cbios.asm
  3. 3
      Source/HBIOS/Build.ps1
  4. 40
      Source/HBIOS/fd.asm
  5. 133
      Source/HBIOS/hbios.asm
  6. 27
      Source/HBIOS/hbios.inc
  7. 52
      Source/HBIOS/hdsk.asm
  8. 62
      Source/HBIOS/ide.asm
  9. 9
      Source/HBIOS/loader.asm
  10. 54
      Source/HBIOS/md.asm
  11. 80
      Source/HBIOS/ppide.asm
  12. 38
      Source/HBIOS/ppp.asm
  13. 41
      Source/HBIOS/prp.asm
  14. 38
      Source/HBIOS/rf.asm
  15. 121
      Source/HBIOS/sd.asm

BIN
Doc/Source/Build.docx

Binary file not shown.

46
Source/CBIOS/cbios.asm

@ -337,18 +337,31 @@ WBOOT:
;
;__________________________________________________________________________________________________
GOCPM:
#IFDEF PLTUNA
; USE A DEDICATED BUFFER FOR UNA PHYSICAL DISK I/O
LD HL,SECBUF ; ADDRESS OF PHYSICAL SECTOR BUFFER
LD (BUFADR),HL ; SAVE IT IN BUFADR FOR LATER
LD (DSKBUF),HL ; SAVE IT IN DSKBUF FOR LATER
#ELSE
; CALL BF_DIOSETBUF WITH A PARM OF ZERO TO CAUSE IT TO RESET
; THE PHYSICAL DISK BUFFER TO THE DEFAULT LOCATION PRE-ALLOCATED
; INSIDE OF THE HBIOS BANK. THE ADDRESS IS RETURNED IN HL AND SAVED.
LD B,BF_DIOSETBUF ; GET DISK BUFFER ADR IN HBIOS DRIVER BANK
LD HL,0
RST 08 ; MAKE HBIOS CALL
LD (BUFADR),HL ; RECORD THE BUFFER ADDRESS
;; CALL BF_DIOSETBUF WITH A PARM OF ZERO TO CAUSE IT TO RESET
;; THE PHYSICAL DISK BUFFER TO THE DEFAULT LOCATION PRE-ALLOCATED
;; INSIDE OF THE HBIOS BANK. THE ADDRESS IS RETURNED IN HL AND SAVED.
;LD B,BF_DIOSETBUF ; GET DISK BUFFER ADR IN HBIOS DRIVER BANK
;LD HL,0
;RST 08 ; MAKE HBIOS CALL
;LD (DSKBUF),HL ; RECORD THE BUFFER ADDRESS
; ALLOCATE A SINGLE SECTOR DISK BUFFER ON THE HBIOS HEAP
LD B,BF_SYSALLOC ; BIOS FUNC: ALLOCATE HEAP MEMORY
LD HL,512 ; 1 SECTOR, 512 BYTES
RST 08 ; DO IT
CALL NZ,PANIC ; HANDLE ERROR
LD (DSKBUF),HL ; RECORD THE BUFFER ADDRESS
; TEMPORARY!!! LET HBIOS KNOW THE DISK BUFFER
LD B,BF_DIOSETBUF
RST 08
#ENDIF
;
LD A,$C3 ; LOAD A WITH 'JP' INSTRUCTION (USED BELOW)
@ -1107,7 +1120,7 @@ BLK_SETUP:
RRCA
LD E,A ; INTO LOW ORDER BYTE OF DESTINATION
LD D,0 ; HIGH ORDER BYTE IS ZERO
LD HL,(BUFADR) ; HL = START OF SEC BUF
LD HL,(DSKBUF) ; HL = START OF SEC BUF
ADD HL,DE ; ADD IN COMPUTED OFFSET
ADD HL,DE ; HL NOW = INDEX * 128 (SOURCE)
LD DE,(DMAADR) ; DE = DESTINATION = DMA BUF
@ -1291,7 +1304,7 @@ DSK_IO2:
LD E,C ; UNIT TO E
LD C,B ; FUNC TO C
LD B,E ; UNIT TO B
LD DE,(BUFADR) ; SET BUFFER ADDRESS
LD DE,(DSKBUF) ; SET BUFFER ADDRESS
LD HL,1 ; 1 SECTOR
; DISPATCH TO UBIOS
RST 08
@ -1449,7 +1462,7 @@ STR_SEC .DB " SEC=$"
;
SECADR .DW 0 ; ADDRESS OF SECTOR IN ROM/RAM PAGE
DEFDRIVE .DB 0 ; DEFAULT DRIVE
CCPBUF .DW $7000 ; ADDRESS OF CCP BUF IN BIOS BANK
CCPBUF .DW 0 ; ADDRESS OF CCP BUF IN BIOS BANK
;
#IFDEF PLTWBW
BNKBIOS .DB 0 ; BIOS BANK ID
@ -1462,7 +1475,7 @@ DSKOP .DB 0 ; DISK OPERATION (DOP_READ/DOP_WRITE)
WRTYPE .DB 0 ; WRITE TYPE (0=NORMAL, 1=DIR (FORCE), 2=FIRST RECORD OF BLOCK)
DMAADR .DW 0 ; DIRECT MEMORY ADDRESS
HSTWRT .DB 0 ; TRUE = BUFFER IS DIRTY
BUFADR .DW $8000-$0400 ; ADDRESS OF PHYSICAL SECTOR BUFFER (DEFAULT MATCHES HBIOS)
DSKBUF .DW 0 ; ADDRESS OF PHYSICAL SECTOR BUFFER
;
; LOGICAL DISK I/O REQUEST PENDING
;
@ -1854,6 +1867,11 @@ INIT:
RST 08 ; DO IT
#ELSE
; SAVE COMMAND PROCESSOR TO DEDICATED CACHE IN RAM BANK 1
LD B,BF_SYSALLOC ; HBIOS FUNC: ALLOCATE HEAP MEMORY
LD HL,CCP_SIZ ; SIZE TO ALLOC (SIZE OF CCP)
RST 08 ; DO IT
CALL NZ,PANIC ; BIG PROBLEM
LD (CCPBUF),HL ; SAVE THE ADDRESS (IN BIOS MEM)
LD B,BF_SYSXCPY ; HBIOS FUNC: SYSTEM EXTENDED COPY
LD A,(BNKUSER) ; GET USER BANK
LD E,A ; E = SOURCE (USER BANK)
@ -1862,7 +1880,7 @@ INIT:
RST 08 ; DO IT
LD B,BF_SYSCPY ; HBIOS FUNC: SYSTEM COPY
LD HL,CCP_LOC ; COPY FROM CCP LOCATION IN USR BANK
LD DE,(CCPBUF) ; TO FIXED LOCATION IN HB BANK
LD DE,(CCPBUF) ; TO ALLOCATED LOCATION IN HB BANK
LD IX,CCP_SIZ ; COPY CONTENTS OF COMMAND PROCESSOR
RST 08 ; DO IT
#ENDIF
@ -2591,7 +2609,7 @@ ALLOC:
; ADDRESS IN HL. LEAVE ALL OTHER REGS ALONE EXCEPT A
; Z FOR SUCCESS, NZ FOR FAILURE
;
PUSH BC ; SAVE ORIGINAL HL
PUSH BC ; SAVE ORIGINAL BC
LD BC,(HEAPTOP) ; BC := CURRENT HEAP TOP
PUSH BC ; SAVE AS START OF REQUESTED BUFFER
ADD HL,BC ; HL := NEW HEAP TOP

3
Source/HBIOS/Build.ps1

@ -54,7 +54,8 @@ if ($Platform -eq "UNA") {$CBiosFile = '../CBIOS/cbios_una.bin'} else {$CBiosFil
"Building ${RomName}: ${ROMSize}KB ROM configuration ${Config} for Z${CPUType}..."
""
$TimeStamp = '"' + (Get-Date -Format 'dd-MMM-yyyy') + '"'
# $TimeStamp = '"' + (Get-Date -Format 'dd-MMM-yyyy') + '"'
$TimeStamp = '"' + (Get-Date -Format 'yyyy-MM-dd') + '"'
Function Asm($Component, $Opt, $Architecture=$CPUType, $Output="${Component}.bin")
{

40
Source/HBIOS/fd.asm

@ -376,23 +376,34 @@ FD_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,FD_SEEK ; SUB-FUNC 0: SEEK
JP Z,FD_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,FD_READ ; SUB-FUNC 1: READ
JP Z,FD_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,FD_WRITE ; SUB-FUNC 2: WRITE
JP Z,FD_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,FD_STATUS ; SUB-FUNC 3: STATUS
JP Z,FD_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,FD_RESET ; SUB-FUNC 4: RESET
JP Z,FD_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,FD_CAP ; SUB-FUNC 5: GET CAPACITY
JP Z,FD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,FD_GEOM ; SUB-FUNC 6: GET GEOMETRY
JP Z,FD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,FD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
JP Z,FD_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,FD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
JP Z,FD_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,FD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,FD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,FD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
FD_VERIFY:
FD_FORMAT:
FD_GETPAR:
FD_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;;
; LD A,B ; GET REQUESTED FUNCTION
@ -410,9 +421,9 @@ FD_DISPATCH:
; JP Z,FD_GEOM
; CALL PANIC
;
; FD_GETPAR
; FD_SENSE
;
FD_GETPAR:
FD_SENSE:
;CALL FD_SELECTUNIT
#IF (FDMAUTO)
@ -493,13 +504,6 @@ FD_MEDIA3:
;
;
;
FD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
FD_CAP:
CALL FD_GEOM ; GET GEOMETRY
; HL=TRACKS, D=HEADS, E=SECTORS

133
Source/HBIOS/hbios.asm

@ -57,7 +57,6 @@ HCB .FILL $100,$FF ; RESERVED FOR HBIOS CONTROL BLOCK
;==================================================================================================
;
; THE FOLLOWING CODE IS RELOCATED TO THE TOP OF MEMORY TO HANDLE INVOCATION DISPATCHING
; AFTER RELOCATION THIS AREA (1K) IS REUSED AS THE HBIOS PHYSICAL DISK READ/WRITE BUFFER
;
.FILL (HBX_IMG - $) ; FILL TO START OF PROXY IMAGE START
.ORG HBX_LOC ; ADJUST FOR RELOCATION
@ -511,10 +510,37 @@ 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
; INITIALIZE HEAP STORAGE VARIABLES
;
LD DE,HB_END ; GET ADDRESS OF START OF HEAP
;
; HEAP STARTS AT END OF HBIOS
LD HL,HCB + HCB_HEAP ; POINT TO HEAP START ADDRESS VARIABLE
LD (HL),E ; SAVE LSB
INC HL ; BUMP
LD (HL),D ; SAVE MSB
;
; INIT HEAP TOP TO HEAP START
LD HL,HCB + HCB_HEAPTOP ; POINT TO HEAP TOP ADDRESS VARIABLE
LD (HL),E ; SAVE LSB
INC HL ; BUMP
LD (HL),D ; SAVE MSB
;
; CLEAR HEAP
LD HL,HB_END ; START OF HEAP
LD BC,BNKTOP - HB_END ; MAX SIZE OF HEAP
LD A,$FF ; FILL WITH $FF
CALL FILL ; DO IT
;;
;;
;; ALLOCATE THE DEFAULT DISK BUFFER ADDRESS
;;
; LD HL,512 ; 512 BYTES
; CALL HB_ALLOC ; ALLOCATE SPACE ON HEAP
; CALL NZ,PANIC ; PANIC ON ERROR
;;
; LD (DIOBUFDEF),HL ; SET DEFAULT
; LD (DIOBUF),HL ; INIT CURRENT BUF ADDRESS
;
; PERFORM DEVICE INITIALIZATION
;
@ -850,6 +876,9 @@ DIO_RW:
POP BC ; RESTORE INCOMING FUNCTION, DEVICE/UNIT
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL,(DIOBUF) ; GET BUFFER ADDRESS
LD A,H ; TEST DIOBUF
OR L ; FOR VALUE OF ZERO
CALL Z,PANIC ; ERROR IF DIOBUF NOT SET
LD DE,1 ; TRANSFER ONE SECTOR
JR NDIO_DISPATCH ; RETURN VIA DISPATCHER
@ -857,13 +886,13 @@ DIO_RW:
; DISK: SHIM FOR OLD STYLE STATUS CALL
;
DIO_STAT:
LD B,BF_NDIOSTAT
LD B,BF_NDIOSTATUS
JR NDIO_DISPATCH
;
; DISK: SHIM FOR OLD STYLE MEDIA CALL
;
DIO_MEDIA:
LD B,BF_NDIOGETPAR
LD B,BF_NDIOSENSE
CALL NDIO_DISPATCH
LD A,E
OR A
@ -881,9 +910,10 @@ DIO_GETBUF:
DIO_SETBUF:
LD A,H ; TEST HL
OR L ; ... FOR ZERO
JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR
LD HL,HB_BUF ; IF ZERO, SET TO DEFAULT ADR
DIO_SETBUF1:
CALL Z,PANIC ; NO LONGER SUPPORT DEFAULT BUFFER!
;JR NZ,DIO_SETBUF1 ; IF NOT, PROCEED TO SET BUF ADR
;LD HL,(DIOBUFDEF) ; IF ZERO, SET TO DEFAULT PREALLOCATED ADR
;DIO_SETBUF1:
LD (DIOBUF),HL ; RECORD NEW DISK BUFFER ADDRESS
XOR A ; SIGNALS SUCCESS
RET
@ -1212,6 +1242,7 @@ SYS_DISPATCH:
JP Z,SYS_XCOPY ; $F3
DEC A
;JR Z,SYS_ATTR ; $F4
JR Z,SYS_ALLOC ; $F4
DEC A
;JR Z,SYS_XXXX ; $F5
DEC A
@ -1267,6 +1298,15 @@ SYS_XCOPY:
XOR A
RET
;
; ALLOCATE HL BYTES OF MEMORY FROM HBIOS HEAP
; RETURNS POINTER TO ALLOCATED MEMORY IN HL
; ON SUCCESS RETURN A == 0, AND Z SET
; ON FAILURE A <> 0 AND NZ SET AND HL TRASHED
; ALL OTHER REGISTERS PRESERVED
;
SYS_ALLOC:
JP HB_ALLOC
;
; GET THE CURRENT HBIOS VERSION
; RETURNS VERSION IN DE AS BCD
; D: MAJOR VERION IN TOP 4 BITS, MINOR VERSION IN LOW 4 BITS
@ -1356,6 +1396,66 @@ HB_BADINT:
;
BNKCPY .EQU HB_BNKCPY
;
; ALLOCATE HL BYTES OF MEMORY ON THE HEAP
; RETURNS POINTER TO ALLOCATED SPACE IN HL
; ON SUCCESS RETURN A == 0, AND Z SET
; ON FAILURE A <> 0 AND NZ SET AND HL TRASHED
; ALL OTHER REGISTERS PRESERVED
;
; A 4 BYTE HEADER IS PLACED IN FRONT OF THE ALLOCATED MEMORY
; - DWORD: SIZE OF MEMROY ALLOCATED (DOES NOT INCLUDE 4 BYTE HEADER)
; - DWORD: ADDRESS WHERE ALLOC WAS CALLED (VALUE ON TOP OF STACK AT CALL)
;
HB_ALLOC:
; SAVE ALLOC SIZE AND REFERENCE ADR FOR SUBSEQUENT HEADER CONSTRUCTION
LD (HB_TMPSZ),HL ; SAVE INCOMING SIZE REQUESTED
POP HL ; GET RETURN ADDRESS
LD (HB_TMPREF),HL ; SAVE AS REFERENCE
PUSH HL ; PUT IT BACK ON STACK
LD HL,(HB_TMPSZ) ; RECOVER INCOMING MEM SIZE PARM
;
; CALC NEW HEAP TOP AND HANDLE OUT-OF-SPACE ERROR
PUSH DE ; SAVE INCOMING DE
LD DE,4 ; SIZE OF HEADER
ADD HL,DE ; ADD IT IN
JR C,HB_ALLOC1 ; ERROR ON OVERFLOW
LD DE,(HCB + HCB_HEAPTOP) ; CURRENT HEAP TOP
ADD HL,DE ; ADD IT IN, HL := NEW HEAP TOP
JR C,HB_ALLOC1 ; ERROR ON OVERFLOW
BIT 7,H ; TEST PAST END OF BANK (>= 32K)
JR NZ,HB_ALLOC1 ; ERROR IF PAST END
;
; SAVE NEW HEAP TOP
LD DE,(HCB + HCB_HEAPTOP) ; GET ORIGINAL HEAP TOP
LD (HCB + HCB_HEAPTOP),HL ; SAVE NEW HEAP TOP
;
; SET HEADER VALUES
EX DE,HL ; HEADER ADR TO HL
LD DE,(HB_TMPSZ) ; GET THE ORIG SIZE REQUESTED
LD (HL),E ; SAVE SIZE (LSB)
INC HL ; BUMP HEADER POINTER
LD (HL),D ; SAVE SIZE (MSB)
INC HL ; BUMP HEADER POINTER
LD DE,(HB_TMPREF) ; GET THE REFERENCE ADR
LD (HL),E ; SAVE REF ADR (LSB)
INC HL ; BUMP HEADER POINTER
LD (HL),D ; SAVE REF ADR (MSB)
INC HL ; BUMP HEADER POINTER
;
; RETURN SUCCESS, HL POINTS TO START OF ALLOCATED MEMORY (PAST HEADER)
POP DE ; RESTORE INCOMING DE
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN
;
HB_ALLOC1:
; ERROR RETURN
POP DE ; RESTORE INCOMING DE
OR $FF ; SIGNAL ERROR
RET ; AND RETURN
;
HB_TMPSZ .DW 0
HB_TMPREF .DW 0
;
;==================================================================================================
; DEVICE DRIVERS
;==================================================================================================
@ -1801,13 +1901,14 @@ IDLECOUNT .DB 0
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
HSTTRK .DW 0 ; CYLINDER (0-65535)
; LBA HIGH WORD -OR- HEAD/SECTOR
HSTLBAHI .EQU $ ; BLOCK ADDRESS LBA HIGH WORD
HSTSEC .DB 0 ; BLOCK ADDRESS SECTOR
HSTHEAD .DB 0 ; BLOCK ADDRESS HEAD
HSTSEC .DB 0 ; SECTOR (0-255)
HSTHEAD .DB 0 ; HEAD (0-255)
;
DIOBUF .DW HB_BUF ; PTR TO 1024 BYTE DISK XFR BUFFER
DIOBUF .DW 0 ; PTR TO CURRENT DISK XFR BUFFER
;DIOBUFDEF .DW 0 ; PTR TO DEFAULT PREALLOCATED DISK XFR BUFFER
;
HB_INTSTKSAV .DW 0 ; SAVED STACK POINTER DURING INT PROCESSING
.FILL $40,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING
@ -1816,11 +1917,11 @@ HB_INTSTK .EQU $ ; TOP OF INTERRUPT PROCESSING STACK
;
STR_BANNER .DB "SBC HBIOS v", BIOSVER, ", ", TIMESTAMP, "$"
STR_PLATFORM .DB PLATFORM_NAME, "$"
STR_SWITCH .DB "*** Console switch to CRT device ***$"
STR_SWITCH .DB "*** Activating CRT Console ***$"
;
HB_TMPBUF .FILL 512,0 ; INTERNAL DISK BUFFER
;
HB_BUF .EQU $ ; PHYSICAL DISK BUFFER
;HB_BUF .EQU $ ; PHYSICAL DISK BUFFER
HB_END .EXPORT HB_END ; EXPORT ENDING ADDRESS
;
SLACK .EQU BNKTOP - $

27
Source/HBIOS/hbios.inc

@ -23,15 +23,18 @@ BF_DIOGETCNT .EQU BF_DIO + 10 ; DISK DEVICE COUNT
BF_DIOGETINF .EQU BF_DIO + 11 ; DISK DEVICE INFO
;
BF_NDIO .EQU $50
BF_NDIOSEEK .EQU BF_DIO + 0 ; DISK SEEK
BF_NDIOREAD .EQU BF_DIO + 1 ; DISK READ
BF_NDIOWRITE .EQU BF_DIO + 2 ; DISK WRITE
BF_NDIOSTAT .EQU BF_DIO + 3 ; DISK STATUS
BF_NDIORESET .EQU BF_DIO + 4 ; DISK RESET
BF_NDIOCAP .EQU BF_DIO + 5 ; GET DISK CAPACITY
BF_NDIOGEOM .EQU BF_DIO + 6 ; GET DISK GEOMETRY
BF_NDIOGETPAR .EQU BF_DIO + 7 ; GET DISK PARAMS
BF_NDIOSETPAR .EQU BF_DIO + 8 ; SET DISK PARAMS
BF_NDIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS
BF_NDIORESET .EQU BF_DIO + 1 ; DISK RESET
BF_NDIOSEEK .EQU BF_DIO + 2 ; DISK SEEK
BF_NDIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS
BF_NDIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS
BF_NDIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS
BF_NDIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK
BF_NDIOSENSE .EQU BF_DIO + 7 ; DISK SENSE MEDIA
BF_NDIOCAP .EQU BF_DIO + 8 ; GET DISK CAPACITY
BF_NDIOGEOM .EQU BF_DIO + 9 ; GET DISK GEOMETRY
BF_NDIOGETPAR .EQU BF_DIO + 10 ; GET DISK PARAMS
BF_NDIOSETPAR .EQU BF_DIO + 11 ; SET DISK PARAMS
;
BF_RTC .EQU $20
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME
@ -71,6 +74,7 @@ BF_SYSSETBNK .EQU BF_SYS + 0 ; SET CURRENT BANK
BF_SYSGETBNK .EQU BF_SYS + 1 ; GET CURRENT BANK
BF_SYSCPY .EQU BF_SYS + 2 ; COPY TO/FROM RAM/ROM MEMORY BANK
BF_SYSXCPY .EQU BF_SYS + 3 ; EXTENDED COPY SETUP
BF_SYSALLOC .EQU BF_SYS + 4 ; ALLOC HBIOS HEAP MEMORY
BF_SYSGETVER .EQU BF_SYS + 6 ; GET VERSION OF HBIOS
BF_SYSHCBGETB .EQU BF_SYS + 8 ; GET HCB BYTE VALUE
BF_SYSHCBPUTB .EQU BF_SYS + 9 ; PUT HCB BYTE VALUE
@ -130,7 +134,10 @@ HCB_CRTDEV .EQU $0E ; CRT DISPLAY DEVICE/UNIT (BYTE)
HCB_CONDEV .EQU $0F ; ACTIVE CONSOLE DEVICE/UNIT (BYTE)
HCB_CUREMU .EQU $10 ; CURRENT VDA TERMINAL EMULATION
HCB_CURVDA .EQU $11 ; CURRENT VDA TARGET FOR EMULATION
;
HCB_HEAP .EQU $20 ; DWORD ADDRESS OF START OF HEAP
HCB_HEAPTOP .EQU $22 ; DWORD ADDRESS OF TOP OF HEAP
;
; MEMORY BANK IDS (ONE BYTE EACH)
HCB_BIDCOM .EQU $D8 ; COMMON BANK (UPPER 32K)
HCB_BIDUSR .EQU $D9 ; USER BANK (TPA)

52
Source/HBIOS/hdsk.asm

@ -44,23 +44,34 @@ HDSK_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,HDSK_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
JP Z,HDSK_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,HDSK_READ ; SUB-FUNC 1: READ
JP Z,HDSK_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,HDSK_WRITE ; SUB-FUNC 2: WRITE
JP Z,HDSK_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,HDSK_STATUS ; SUB-FUNC 3: STATUS
JP Z,HDSK_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,HDSK_RESET ; SUB-FUNC 4: RESET
JP Z,HDSK_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,HDSK_CAP ; SUB-FUNC 5: GET CAPACITY
JP Z,HDSK_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,HDSK_GEOM ; SUB-FUNC 6: GET GEOMETRY
JP Z,HDSK_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,HDSK_GETPAR ; SUB-FUNC 7: GET PARAMETERS
JP Z,HDSK_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,HDSK_SETPAR ; SUB-FUNC 8: SET PARAMETERS
JP Z,HDSK_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,HDSK_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,HDSK_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,HDSK_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
HDSK_VERIFY:
HDSK_FORMAT:
HDSK_GETPAR:
HDSK_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
@ -76,6 +87,14 @@ HDSK_RESET:
XOR A ; ALWAYS OK
RET
;
;
;
HDSK_SENSE:
LD A,MID_HD ; HARD DISK MEDIA
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
; GET DISK CAPACITY
; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE
; SLICE C/H/S = 65/16/16 OR 16,640 TOTAL SECTORS
@ -103,21 +122,6 @@ HDSK_GEOM:
;
;
;
HDSK_GETPAR:
LD A,MID_HD ; HARD DISK MEDIA
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
HDSK_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
HDSK_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA

62
Source/HBIOS/ide.asm

@ -301,26 +301,37 @@ IDE_DISPATCH:
;CALL IDE_SELUNIT ; SELECT DESIRED UNIT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,IDE_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,IDE_READ ; SUB-FUNC 1: READ
DEC A
JP Z,IDE_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,IDE_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,IDE_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,IDE_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,IDE_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,IDE_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,IDE_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,IDE_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,IDE_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,IDE_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,IDE_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,IDE_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,IDE_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,IDE_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,IDE_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,IDE_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,IDE_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,IDE_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,IDE_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
IDE_VERIFY:
IDE_FORMAT:
IDE_GETPAR:
IDE_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
@ -353,9 +364,9 @@ IDE_STATUS:
OR A ; SET FLAGS
RET ; AND RETURN
;
; IDE_MEDIA
; IDE_SENSE
;
IDE_GETPAR:
IDE_SENSE:
; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET
; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT
; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND
@ -380,13 +391,6 @@ IDE_GETPAR:
;
;
;
IDE_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
IDE_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA

9
Source/HBIOS/loader.asm

@ -35,7 +35,13 @@ CB_CONDEV .DB SERDEV
;
CB_CUREMU .DB VDAEMU ; CURRENT VDA TERMINAL EMULATION
CB_CURVDA .DB VDADEV ; CURRENT VDA TARGET FOR EMULATION
;
; MEMORY MANAGEMENT VARIABLES START AT $20
;
.FILL (CB + $20 - $),0
;
CB_HEAP .DW 0
CB_HEAPTOP .DW 0
;
; STANDARD BANK ID'S START AT $D8
;
@ -49,7 +55,6 @@ CB_BIDRAMD0 .DB BID_RAMD0
CB_BIDRAMDN .DB BID_RAMDN
CB_BIDROMD0 .DB BID_ROMD0
CB_BIDROMDN .DB BID_ROMDN
;
; DEVICE LISTS START AT $E0
;

54
Source/HBIOS/md.asm

@ -32,23 +32,34 @@ MD_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,MD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
JP Z,MD_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,MD_READ ; SUB-FUNC 1: READ
JP Z,MD_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,MD_WRITE ; SUB-FUNC 2: WRITE
JP Z,MD_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,MD_STATUS ; SUB-FUNC 3: STATUS
JP Z,MD_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,MD_RESET ; SUB-FUNC 4: RESET
JP Z,MD_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,MD_CAP ; SUB-FUNC 5: GET CAPACITY
JP Z,MD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,MD_GEOM ; SUB-FUNC 6: GET GEOMETRY
JP Z,MD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,MD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
JP Z,MD_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,MD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
JP Z,MD_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,MD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,MD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,MD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
MD_VERIFY:
MD_FORMAT:
MD_GETPAR:
MD_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
@ -65,6 +76,15 @@ MD_RESET:
;
;
;
MD_SENSE:
LD A,C ; DEVICE/UNIT IS IN C
ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
MD_CAP:
LD A,C ; DEVICE/UNIT IS IN C
AND $0F ; ISOLATE UNIT NUM
@ -104,22 +124,6 @@ MD_GEOM1:
;
;
;
MD_GETPAR:
LD A,C ; DEVICE/UNIT IS IN C
ADD A,MID_MDROM ; SET CORRECT MEDIA VALUE
LD E,A ; VALUE TO E
XOR A ; SIGNAL SUCCESS
RET
;
;
;
MD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
MD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA

80
Source/HBIOS/ppide.asm

@ -156,11 +156,11 @@ PPIDE_UNITCNT .EQU 2 ; ASSUME ONLY PRIMARY INTERFACE
;
; COMMAND BYTES
;
PPIDE_CMD_RECAL .EQU $10
PPIDE_CMD_READ .EQU $20
PPIDE_CMD_WRITE .EQU $30
PPIDE_CMD_IDDEV .EQU $EC
PPIDE_CMD_SETFEAT .EQU $EF
PPIDE_CPPIDE_RECAL .EQU $10
PPIDE_CPPIDE_READ .EQU $20
PPIDE_CPPIDE_WRITE .EQU $30
PPIDE_CPPIDE_IDDEV .EQU $EC
PPIDE_CPPIDE_SETFEAT .EQU $EF
;
; FEATURE BYTES
;
@ -292,26 +292,37 @@ PPIDE_DISPATCH:
;CALL PPIDE_SELUNIT ; SELECT DESIRED UNIT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PPIDE_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,PPIDE_READ ; SUB-FUNC 1: READ
DEC A
JP Z,PPIDE_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,PPIDE_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,PPIDE_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,PPIDE_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,PPIDE_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,PPIDE_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,PPIDE_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PPIDE_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,PPIDE_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,PPIDE_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,PPIDE_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,PPIDE_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,PPIDE_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,PPIDE_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,PPIDE_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,PPIDE_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,PPIDE_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,PPIDE_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,PPIDE_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
PPIDE_VERIFY:
PPIDE_FORMAT:
PPIDE_GETPAR:
PPIDE_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
@ -342,9 +353,9 @@ PPIDE_STATUS:
OR A ; SET FLAGS
RET ; AND RETURN
;
; PPIDE_MEDIA
; PPIDE_SENSE
;
PPIDE_GETPAR:
PPIDE_SENSE:
; THE ONLY WAY TO RESET AN IDE DEVICE IS TO RESET
; THE ENTIRE INTERFACE. SO, TO HANDLE POSSIBLE HOT
; SWAP WE DO THAT, THEN RESELECT THE DESIRED UNIT AND
@ -369,13 +380,6 @@ PPIDE_GETPAR:
;
;
;
PPIDE_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
PPIDE_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
@ -431,7 +435,7 @@ PPIDE_SETFEAT:
.DB PPIDE_REG_FEAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
LD A,PPIDE_CMD_SETFEAT ; CMD = SETFEAT
LD A,PPIDE_CPPIDE_SETFEAT ; CMD = SETFEAT
LD (PPIDE_CMD),A ; SAVE IT
JP PPIDE_RUNCMD ; RUN COMMAND AND EXIT
;
@ -448,7 +452,7 @@ PPIDE_IDENTIFY:
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
LD A,PPIDE_CMD_IDDEV
LD A,PPIDE_CPPIDE_IDDEV
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
@ -472,7 +476,7 @@ PPIDE_RDSEC:
DCALL PC_SPACE
DCALL PRTHEXBYTE
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,PPIDE_CMD_READ
LD A,PPIDE_CPPIDE_READ
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ
@ -494,7 +498,7 @@ PPIDE_WRSEC:
DCALL PC_SPACE
DCALL PRTHEXBYTE
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,PPIDE_CMD_WRITE
LD A,PPIDE_CPPIDE_WRITE
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
RET NZ

38
Source/HBIOS/ppp.asm

@ -379,23 +379,34 @@ PPPSD_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PPPSD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
JP Z,PPPSD_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,PPPSD_READ ; SUB-FUNC 1: READ
JP Z,PPPSD_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,PPPSD_WRITE ; SUB-FUNC 2: WRITE
JP Z,PPPSD_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,PPPSD_STATUS ; SUB-FUNC 3: STATUS
JP Z,PPPSD_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,PPPSD_RESET ; SUB-FUNC 4: RESET
JP Z,PPPSD_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,PPPSD_CAP ; SUB-FUNC 5: GET CAPACITY
JP Z,PPPSD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,PPPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY
JP Z,PPPSD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,PPPSD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
JP Z,PPPSD_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,PPPSD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
JP Z,PPPSD_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,PPPSD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,PPPSD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,PPPSD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
PPPSD_VERIFY:
PPPSD_FORMAT:
PPPSD_GETPAR:
PPPSD_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
; READ AN LBA BLOCK FROM THE SD CARD
@ -535,7 +546,7 @@ PPPSD_RESET:
; SETUP FOR SUBSEQUENT ACCESS
; INIT CARD IF NOT READY OR ON DRIVE LOG IN
;
PPPSD_GETPAR:
PPPSD_SENSE:
; REINITIALIZE THE CARD HERE TO DETERMINE PRESENCE
CALL PPPSD_INITCARD
#IF (PPPSDTRACE == 1)
@ -548,13 +559,6 @@ PPPSD_GETPAR:
;
;
;
PPPSD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
PPPSD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA

41
Source/HBIOS/prp.asm

@ -273,27 +273,39 @@ PRPSD_DISPATCH:
CP PRPSD_UNITCNT
CALL NC,PANIC ; PANIC IF TOO HIGH
LD (PRPSD_UNIT),A ; SAVE IT
;
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,PRPSD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
JP Z,PRPSD_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,PRPSD_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,PRPSD_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,PRPSD_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,PRPSD_READ ; SUB-FUNC 1: READ
JP Z,PRPSD_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,PRPSD_WRITE ; SUB-FUNC 2: WRITE
JP Z,PRPSD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,PRPSD_STATUS ; SUB-FUNC 3: STATUS
JP Z,PRPSD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,PRPSD_RESET ; SUB-FUNC 4: RESET
JP Z,PRPSD_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,PRPSD_CAP ; SUB-FUNC 5: GET CAPACITY
JP Z,PRPSD_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,PRPSD_GEOM ; SUB-FUNC 6: GET GEOMETRY
JP Z,PRPSD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,PRPSD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
JP Z,PRPSD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,PRPSD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
JP Z,PRPSD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
PRPSD_VERIFY:
PRPSD_FORMAT:
PRPSD_GETPAR:
PRPSD_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
@ -394,9 +406,9 @@ PRPSD_RESET:
XOR A ; ALWAYS OK
RET
;
; PRPSD_GETPAR
; PRPSD_SENSE
;
PRPSD_GETPAR:
PRPSD_SENSE:
; REINITIALIZE THE CARD HERE
CALL PRPSD_INITCARD
#IF (PRPSDTRACE == 1)
@ -409,13 +421,6 @@ PRPSD_GETPAR:
;
;
;
PRPSD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
PRPSD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA

38
Source/HBIOS/rf.asm

@ -38,28 +38,39 @@ RF_DISPATCH:
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,RF_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
JP Z,RF_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,RF_READ ; SUB-FUNC 1: READ
JP Z,RF_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,RF_WRITE ; SUB-FUNC 2: WRITE
JP Z,RF_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,RF_STATUS ; SUB-FUNC 3: STATUS
JP Z,RF_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,RF_RESET ; SUB-FUNC 4: RESET
JP Z,RF_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,RF_CAP ; SUB-FUNC 5: GET CAPACITY
JP Z,RF_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,RF_GEOM ; SUB-FUNC 6: GET GEOMETRY
JP Z,RF_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,RF_GETPAR ; SUB-FUNC 7: GET PARAMETERS
JP Z,RF_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,RF_SETPAR ; SUB-FUNC 8: SET PARAMETERS
JP Z,RF_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,RF_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,RF_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,RF_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
RF_VERIFY:
RF_FORMAT:
RF_GETPAR:
RF_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
RF_GETPAR:
RF_SENSE:
LD A,C ; DEVICE/UNIT IS IN C
ADD A,MID_RF ; SET CORRECT MEDIA VALUE
LD E,A ; VALUE TO E
@ -68,13 +79,6 @@ RF_GETPAR:
;
;
;
RF_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
RF_STATUS:
XOR A ; STATUS ALWAYS OK
RET

121
Source/HBIOS/sd.asm

@ -160,21 +160,21 @@ SD_TRDR .EQU Z180_TRDR
;
; SD CARD COMMANDS
;
SD_CMD_GO_IDLE_STATE .EQU $40 + 0 ; $40, CMD0 -> R1
SD_CMD_SEND_OP_COND .EQU $40 + 1 ; $41, CMD1 -> R1
SD_CMD_SEND_IF_COND .EQU $40 + 8 ; $48, CMD8 -> R7
SD_CMD_SEND_CSD .EQU $40 + 9 ; $49, CMD9 -> R1
SD_CMD_SEND_CID .EQU $40 + 10 ; $4A, CMD10 -> R1
SD_CMD_SET_BLOCKLEN .EQU $40 + 16 ; $50, CMD16 -> R1
SD_CMD_READ_SNGL_BLK .EQU $40 + 17 ; $51, CMD17 -> R1
SD_CMD_WRITE_BLOCK .EQU $40 + 24 ; $58, CMD24 -> R1
SD_CMD_APP_CMD .EQU $40 + 55 ; $77, CMD55 -> R1
SD_CMD_READ_OCR .EQU $40 + 58 ; $7A, CMD58 -> R3
SD_CSD_GO_IDLE_STATE .EQU $40 + 0 ; $40, CMD0 -> R1
SD_CSD_SEND_OP_COND .EQU $40 + 1 ; $41, CMD1 -> R1
SD_CSD_SEND_IF_COND .EQU $40 + 8 ; $48, CMD8 -> R7
SD_CSD_SEND_CSD .EQU $40 + 9 ; $49, CMD9 -> R1
SD_CSD_SEND_CID .EQU $40 + 10 ; $4A, CMD10 -> R1
SD_CSD_SET_BLOCKLEN .EQU $40 + 16 ; $50, CMD16 -> R1
SD_CSD_READ_SNGL_BLK .EQU $40 + 17 ; $51, CMD17 -> R1
SD_CSD_WRITE_BLOCK .EQU $40 + 24 ; $58, CMD24 -> R1
SD_CSD_APP_CMD .EQU $40 + 55 ; $77, CMD55 -> R1
SD_CSD_READ_OCR .EQU $40 + 58 ; $7A, CMD58 -> R3
;
; SD CARD APPLICATION COMMANDS (PRECEDED BY APP_CMD COMMAND)
;
SD_ACMD_SEND_OP_COND .EQU $40 + 41 ; $69, ACMD41 -> R1
SD_ACMD_SEND_SCR .EQU $40 + 51 ; $73, ACMD51 -> R1
SD_ACSD_SEND_OP_COND .EQU $40 + 41 ; $69, ACMD41 -> R1
SD_ACSD_SEND_SCR .EQU $40 + 51 ; $73, ACMD51 -> R1
;
; SD CARD TYPE
;
@ -353,7 +353,7 @@ SD_INITUNIT1:
CALL WRITESTR
; GET CID (WHICH CONTAINS PRODUCT NAME)
LD A,SD_CMD_SEND_CID ; SEND_CID
LD A,SD_CSD_SEND_CID ; SEND_CID
CALL SD_INITCMD ; SETUP COMMAND BUFFER
CALL SD_EXECCMD ; RUN COMMAND
RET NZ ; ABORT ON ERROR
@ -415,26 +415,37 @@ SD_DISPATCH:
;CALL SD_SELUNIT ; SELECT DESIRED UNIT
;
; DISPATCH ACCORDING TO DISK SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,SD_SEEK ; SUB-FUNC 0: SEEK, USE HBIOS FOR NOW
DEC A
JP Z,SD_READ ; SUB-FUNC 1: READ
DEC A
JP Z,SD_WRITE ; SUB-FUNC 2: WRITE
DEC A
JP Z,SD_STATUS ; SUB-FUNC 3: STATUS
DEC A
JP Z,SD_RESET ; SUB-FUNC 4: RESET
DEC A
JP Z,SD_CAP ; SUB-FUNC 5: GET CAPACITY
DEC A
JP Z,SD_GEOM ; SUB-FUNC 6: GET GEOMETRY
DEC A
JP Z,SD_GETPAR ; SUB-FUNC 7: GET PARAMETERS
DEC A
JP Z,SD_SETPAR ; SUB-FUNC 8: SET PARAMETERS
CALL PANIC ; INVALID SUB-FUNCTION
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,SD_STATUS ; SUB-FUNC 0: STATUS
DEC A
JP Z,SD_RESET ; SUB-FUNC 1: RESET
DEC A
JP Z,SD_SEEK ; SUB-FUNC 2: SEEK
DEC A
JP Z,SD_READ ; SUB-FUNC 3: READ SECTORS
DEC A
JP Z,SD_WRITE ; SUB-FUNC 4: WRITE SECTORS
DEC A
JP Z,SD_VERIFY ; SUB-FUNC 5: VERIFY SECTORS
DEC A
JP Z,SD_FORMAT ; SUB-FUNC 6: FORMAT TRACK
DEC A
JP Z,SD_SENSE ; SUB-FUNC 7: SENSE MEDIA
DEC A
JP Z,SD_CAP ; SUB-FUNC 8: GET DISK CAPACITY
DEC A
JP Z,SD_GEOM ; SUB-FUNC 9: GET DISK GEOMETRY
DEC A
JP Z,SD_GETPAR ; SUB-FUNC 10: GET DISK PARAMETERS
DEC A
JP Z,SD_SETPAR ; SUB-FUNC 11: SET DISK PARAMETERS
;
SD_VERIFY:
SD_FORMAT:
SD_GETPAR:
SD_SETPAR:
CALL PANIC ; INVALID SUB-FUNCTION
;
;
;
@ -446,7 +457,7 @@ SD_READ:
#ENDIF
CALL SD_SELUNIT
; READ A SECTOR
LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND
LD C,SD_CSD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND
JP SD_SECTIO ; DO SECTOR I/O
;
;
@ -461,7 +472,7 @@ SD_WRITE:
CALL SD_CHKWP ; CHECK FOR WRITE PROTECT
JP NZ,SD_WRTPROT ; HANDLE IT IF SO
; WRITE A SECTOR
LD C,SD_CMD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND
LD C,SD_CSD_WRITE_BLOCK ; SET WRITE_BLOCK COMMAND
JP SD_SECTIO ; DO SECTOR I/O
;
SD_STATUS:
@ -479,7 +490,7 @@ SD_RESET:
;
;
;
SD_GETPAR:
SD_SENSE:
CALL SD_SELUNIT ; SET CUR UNIT
; RE-INITIALIZE THE SD CARD TO ACCOMMODATE HOT SWAPPING
CALL SD_INITCARD ; RE-INIT SELECTED UNIT
@ -493,13 +504,6 @@ SD_GETPAR:
;
;
;
SD_SETPAR:
; NOT IMPLEMENTED
XOR A
RET
;
;
;
SD_SEEK:
BIT 7,D ; CHECK FOR LBA FLAG
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
@ -568,7 +572,7 @@ SD_INITCARD2:
;
; CMD8 IS REQUIRED FOR V2 CARDS. FAILURE HERE IS OK AND
; JUST MEANS THAT IT IS A V1 CARD
LD A,SD_CMD_SEND_IF_COND ; SEND_IF_COND
LD A,SD_CSD_SEND_IF_COND ; SEND_IF_COND
CALL SD_INITCMD ; SETUP COMMAND BUFFER
LD HL,SD_CMDP2 ; POINT TO 3RD PARM BYTE
LD (HL),1 ; VHS=1, 2.7-3.6V
@ -593,7 +597,7 @@ SD_INITCARD3:
OR A ; SET FLAGS
RET NZ ; ABORT IF ANY OTHER ERROR
; SEND APP_OP_COND
LD A,SD_ACMD_SEND_OP_COND ; SD_APP_OP_COND
LD A,SD_ACSD_SEND_OP_COND ; SD_APP_OP_COND
CALL SD_INITCMD ; SETUP COMMAND BUFFER
LD A,$40 ; P0 = $40 INDICATES WE SUPPORT V2 CARDS
LD (SD_CMDP0),A ; SET COMMAND PARM 0
@ -619,7 +623,7 @@ SD_INITCARD3B:
LD DE,300 ; 16US * 300 = ~5MS
CALL VDELAY ; CPU SPEED NORMALIZED DELAY
; SEND OP_COND COMMAND
LD A,SD_CMD_SEND_OP_COND ; SD_OP_COND
LD A,SD_CSD_SEND_OP_COND ; SD_OP_COND
CALL SD_INITCMD ; SETUP COMMAND BUFFER
CALL SD_EXECCMDND ; EXEC COMMAND WITH NO DATA
RET NZ ; ABORT ON ERROR
@ -641,7 +645,7 @@ SD_INITCARD3C:
SD_INITCARD4:
; CMD58 RETURNS THE 32 BIT OCR REGISTER (R3), WE WANT TO CHECK
; BIT 30, IF SET THIS IS SDHC/XC CARD
LD A,SD_CMD_READ_OCR ; READ_OCR
LD A,SD_CSD_READ_OCR ; READ_OCR
CALL SD_INITCMD ; SETUP COMMAND BUFFER
CALL SD_EXECCMD ; EXECUTE COMMAND
RET NZ ; ABORT ON ERROR
@ -657,7 +661,7 @@ SD_INITCARD4A:
; SD_SPEC3 (BIT 47) IS SET IF CARD IS SDXC OR GREATER
CALL SD_EXECACMD ; SEND APP COMMAND INTRODUCER
RET NZ ; ABORT ON ERROR (THIS SHOULD ALWAYS WORK)
LD A,SD_ACMD_SEND_SCR ; APP CMD SEND_SCR
LD A,SD_ACSD_SEND_SCR ; APP CMD SEND_SCR
CALL SD_INITCMD ; SETUP COMMAND BUFFER
CALL SD_EXECCMD ; EXECUTE COMMAND
RET NZ ; ABORT ON ERROR (THIS SHOULD ALWAYS WORK)
@ -699,7 +703,7 @@ SD_INITCARD5:
#ENDIF
; SET OUR DESIRED BLOCK LENGTH (512 BYTES)
LD A,SD_CMD_SET_BLOCKLEN ; SET_BLOCKLEN
LD A,SD_CSD_SET_BLOCKLEN ; SET_BLOCKLEN
CALL SD_INITCMD ; SETUP COMMAND BUFFER
LD DE,512 ; 512 BYTE BLOCK LENGTH
LD HL,SD_CMDP2 ; PUT VALUE INTO PARMS
@ -718,7 +722,7 @@ SD_INITCARD5:
#ENDIF
;
; ISSUE SEND_CSD (TO DERIVE CARD CAPACITY)
LD A,SD_CMD_SEND_CSD ; SEND_CSD
LD A,SD_CSD_SEND_CSD ; SEND_CSD
CALL SD_INITCMD ; SETUP COMMAND BUFFER
CALL SD_EXECCMD ; EXECUTE COMMAND
RET NZ ; ABORT ON ERROR
@ -848,9 +852,9 @@ SD_SECTIO:
LD HL,(SD_DSKBUF)
LD BC,512 ; LENGTH TO READ
LD A,(SD_CMD) ; GET THE COMMAND
CP SD_CMD_READ_SNGL_BLK ; READ_SINGLE_BLOCK?
CP SD_CSD_READ_SNGL_BLK ; READ_SINGLE_BLOCK?
JR Z,SD_SECTIO1 ; HANDLE READ
CP SD_CMD_WRITE_BLOCK ; WRITE_BLOCK?
CP SD_CSD_WRITE_BLOCK ; WRITE_BLOCK?
JR Z,SD_SECTIO2 ; HANDLE WRITE
CALL PANIC ; PANIC ON ANYTHING ELSE
SD_SECTIO1:
@ -937,7 +941,7 @@ SD_GOIDLE1:
;CALL VDELAY ; CPU SPEED NORMALIZED DELAY
; PUT CARD IN IDLE STATE
LD A,SD_CMD_GO_IDLE_STATE ; CMD0 = ENTER IDLE STATE
LD A,SD_CSD_GO_IDLE_STATE ; CMD0 = ENTER IDLE STATE
CALL SD_INITCMD ; INIT COMMAND BUFFER
LD A,$95 ; CRC FOR GO_IDLE_STATE COMMAND IS $95
LD (SD_CMDCRC),A ; SET CRC
@ -967,7 +971,7 @@ SD_INITCMD1:
; EXECUTE APP COMMAND
;
SD_EXECACMD:
LD A,SD_CMD_APP_CMD ; APP_CMD, AN APP CMD IS NEXT
LD A,SD_CSD_APP_CMD ; APP_CMD, AN APP CMD IS NEXT
CALL SD_INITCMD ; SETUP COMMAND BUFFER
JR SD_EXECCMDND ; EXEC COMMAND W/ NO DATA RETURNED
;
@ -1281,6 +1285,8 @@ SD_WAITRX:
JR NZ,SD_WAITRX
RET
;
#ENDIF
;
; SEND ONE BYTE
;
SD_PUT:
@ -1354,9 +1360,9 @@ SD_GET1:
LD A,C ; GET BYTE RECEIVED INTO A
#IF (SDMODE == SDMODE_UART)
XOR $FF ; DO IS INVERTED ON UART
#ENDIF
#ENDIF
RET
#ENDIF
;
;=============================================================================
; ERROR HANDLING AND DIAGNOSTICS
@ -1643,7 +1649,7 @@ SD_DPTRIMP:
; MSB<-->LSB MIRROR BITS IN A, RESULT IN C
;
MIRROR:
#IF (SDCSIOFAST) ; SLOW SPEED, LEAST CODE SPACE
#IF (SDCSIOFAST) ; SLOW SPEED, LEAST CODE SPACE
LD BC,MIRTAB ; 256 BYTE MIRROR TABLE
ADD A,C ; ADD OFFSET
LD C,A
@ -1653,14 +1659,13 @@ MIRROR2:
LD A,(BC) ; GET RESULT
LD C,A ; RETURN RESULT IN C
RET
#ELSE ; FASTEST BUT USES MOST CODE SPACE
#ELSE ; FASTEST BUT USES MOST CODE SPACE
LD B,8 ; BIT COUNTER
MIRROR1:
RLA ; ROTATE BIT 7 INTO CARRY
RR C ; ROTATE CARRY INTO RESULT
DJNZ MIRROR1 ; DO ALL 8 BITS
RET
#ENDIF
#ENDIF
;
; LOOKUP TABLE TO MIRROR BITS IN A BYTE

Loading…
Cancel
Save