diff --git a/Doc/Source/Build.docx b/Doc/Source/Build.docx new file mode 100644 index 00000000..31c11c39 Binary files /dev/null and b/Doc/Source/Build.docx differ diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index dacf7537..b521fbbf 100644 --- a/Source/CBIOS/cbios.asm +++ b/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 diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 0958a2e3..b0c627b1 100644 --- a/Source/HBIOS/Build.ps1 +++ b/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") { diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index a17b324d..eaf3e0f4 100644 --- a/Source/HBIOS/fd.asm +++ b/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 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 4b7d7fc3..996ccb78 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 - $ diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 294127d6..55ca8a8d 100644 --- a/Source/HBIOS/hbios.inc +++ b/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) diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index ba2ecacc..213bfc9d 100644 --- a/Source/HBIOS/hdsk.asm +++ b/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 diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 545fe795..b0a756c5 100644 --- a/Source/HBIOS/ide.asm +++ b/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 diff --git a/Source/HBIOS/loader.asm b/Source/HBIOS/loader.asm index 89b975c1..50bf6ffa 100644 --- a/Source/HBIOS/loader.asm +++ b/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 ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 8f99d34a..de8da278 100644 --- a/Source/HBIOS/md.asm +++ b/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 diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 07d9bb45..fbe774e5 100644 --- a/Source/HBIOS/ppide.asm +++ b/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 diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 7d8fa521..6854e8ed 100644 --- a/Source/HBIOS/ppp.asm +++ b/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 diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 812dd6d1..b71d561c 100644 --- a/Source/HBIOS/prp.asm +++ b/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 diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 500d2cf4..df862694 100644 --- a/Source/HBIOS/rf.asm +++ b/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 diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 7ba184c4..10e8d4a0 100644 --- a/Source/HBIOS/sd.asm +++ b/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