diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index 942e9647..f329d1b6 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -185,17 +185,23 @@ SEEK ($12): CHS: D:0-6=Head,E=Sector,HL=Track LBA: DE:HL - Update target CHS or LBA for next I/O request on designated unit. - Physical seek is typically deferred until subsequent I/O operation. + Seek function establishes current sector for next I/O function for the specified + unit and invalidates the current sector for all other units. A seek must precede + read/write/verify function calls. Physical seek is typically deferred until + subsequent I/O operation. READ ($13) / WRITE ($14) / VERIFY ($15): BC=Function/Unit A=Result - HL=Buffer Address + HL=Buffer Address E=Blocks Read E=Block Count - Read, write, or verify sectors starting at current target sector. Current - target sector is incremented on each successful operation. On error, - target sector is sector where error occurred. + Read, write, or verify block count sectors to buffer address starting at current target + sector. Current sector must be established by prior seek function; however, multiple + read/write/verify function calls can be made after a seek function. Current sector is + incremented after each sector successfully read. On error, current sector is sector is + sector where error occurred. Blocks read indicates number of sectors successfully read. + Caller must ensure buffer address is large enough to contain data for all sectors + requested. FORMAT ($16): BC=Function/Unit A=Result diff --git a/Source/HBIOS/Config/RC_std.asm b/Source/HBIOS/Config/RC_std.asm index 3247ad42..f2fcb818 100644 --- a/Source/HBIOS/Config/RC_std.asm +++ b/Source/HBIOS/Config/RC_std.asm @@ -14,3 +14,4 @@ ACIAENABLE .SET TRUE ; TRUE TO AUTO-DETECT MOTOROLA 6850 ACIA ; IDEENABLE .SET TRUE ; TRUE FOR IDE DEVICE SUPPORT (CF MODULE) PPIDEENABLE .SET FALSE ; TRUE FOR PPIDE DEVICE SUPPORT (PPIDE MODULE) +PPIDEMODE .SET PPIDEMODE_RC ; TYPE OF CF MODULE: PPIDEMODE_RC, PPIDEMODE_SMB diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index be72a279..785cee3c 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -48,6 +48,7 @@ BS: .EQU 08H ; ASCII BACKSPACE CHARACTER ; DSKY_ENTRY: LD SP,MON_STACK ; SET THE STACK POINTER + EI ; INTS OK NOW CALL INITIALIZE ; INITIALIZE SYSTEM ;__FRONT_PANEL_STARTUP________________________________________________________ @@ -542,6 +543,7 @@ DSKY_ENTRY: ; UART_ENTRY: LD SP,MON_STACK ; SET THE STACK POINTER + EI ; INTS OK NOW CALL INITIALIZE ; INITIALIZE SYSTEM XOR A ;ZERO OUT ACCUMULATOR (ADDED) @@ -1403,6 +1405,13 @@ GOCPM: ; INITIALIZE: ; CALL CIOCON_DISP + (CF_INIT * 3) +#IF (PLATFORM == PLT_UNA) + ; INSTALL UNA INVOCATION VECTOR FOR RST 08 + LD A,$C3 ; JP INSTRUCTION + LD (8),A ; STORE AT 0x0008 + LD HL,($FFFE) ; UNA ENTRY VECTOR + LD (9),HL ; STORE AT 0x0009 +#ENDIF RET ; diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 9b521900..8876f040 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -790,16 +790,72 @@ FD_SEEK: FD_READ: LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,DOP_READ - JR FD_RUN + JR FD_RW ; FD_WRITE: LD (FD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,DOP_WRITE - JR FD_RUN + JR FD_RW +; +FD_RW: + LD (FCD_DOP),A ; SAVE REQUESTED DISK OPERATION + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT + + PUSH BC ; SAVE COUNTERS + CALL FD_GEOM ; E := SPT, D := HDS + POP BC ; RESTORE COUNTERS + JR NZ,FD_RW4 ; BAIL OUT ON ERROR + RES 7,D ; MAKE SURE LBA BIT IS CLEARED + LD (FD_CURGEOM),DE ; SAVE AS FD_CURSPT & FD_CURHDS + +FD_RW1: + PUSH BC ; SAVE COUNTERS + CALL FD_RUN ; PERFORM SECTOR READ/WRITE + JR NZ,FD_RW3 ; IF ERROR, SKIP INCREMENT + + ; INCREMENT SECTOR AND CHECK FOR TRACK OVERFLOW + LD HL,HSTSEC ; POINT TO CURRENT SECTOR + INC (HL) ; INCREMENT SECTOR + LD A,(FD_CURSPT) ; A := SECTORS PER TRACK + CP (HL) ; COMPARE SPT TO CURRENT SECTOR + JR NZ,FD_RW2 ; IF NO OVERFLOW, DONE + + ; RESET SECTOR, INCREMENT HEAD, AND CHECK FOR CYLINDER OVERFLOW + LD (HL),0 ; RESET SECTOR TO ZERO + LD HL,HSTHEAD ; POINT TO CURRENT HEAD + INC (HL) ; INCREMENT HEAD + LD A,(FD_CURHDS) ; A : = HEADS + CP (HL) ; COMPARE HEADS TO CUR HEAD + JR NZ,FD_RW2 ; IF NO OVERFLOW, DONE + + ; RESET HEAD AND INCREMENT TRACK + LD (HL),0 ; RESET HEAD TO ZERO + LD HL,(HSTTRK) ; GET CURRENT TRACK + INC HL ; INCREMENT + LD (HSTTRK),HL ; AND SAVE IT + +FD_RW2: + LD HL,FD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +FD_RW3: + POP BC ; RECOVER COUNTERS + JR NZ,FD_RW4 ; IF ERROR, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ FD_RW1 ; LOOP AS NEEDED +FD_RW4: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(FD_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE + ; FD_RUN: - LD (FCD_DOP),A - ; UPDATE DRIVE SELECTION ;LD A,(HSTDSK) ; GET THE NEW DRIVE SELECTION ;AND 0FH @@ -1868,4 +1924,7 @@ FDDS_MEDIAADR .DW 0 ; POINTER TO FDCUXMEDIA ABOVE ; GENERAL WORKING STORAGE ; FD_UNIT .DB 0 -FD_DSKBUF .DW 0 \ No newline at end of file +FD_DSKBUF .DW 0 +FD_CURGEOM .EQU $ ; TWO BYTES BELOW +FD_CURSPT .DB 0 ; CURRENT SECTORS PER TRACK +FD_CURHDS .DB 0 ; CURRENT HEADS \ No newline at end of file diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d16379c4..efebd0e4 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -768,24 +768,6 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; ; ANNOUNCE HBIOS ; - CALL NEWLINE2 - PRTX(STR_BANNER) - -; CALL PC_SPACE -; LD BC,(X1) -; CALL PRTHEXWORD - -; CALL PC_SPACE -; LD BC,(X2) -; CALL PRTHEXWORD - -; CALL PC_SPACE -; LD BC,(X3) -; CALL PRTHEXWORD - -; CALL PC_SPACE -; LD BC,(X4) -; CALL PRTHEXWORD ; ; IO PORT SCAN @@ -1007,13 +989,6 @@ INITSYS3: ; CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; -; -; -; CALL TSTPT -; LD HL,($FF00 + 2) -; CALL JPHL -; CALL TSTPT -; ; CHAIN TO OS LOADER ; #IFDEF ROMBOOT @@ -1037,17 +1012,7 @@ INITSYS3: LD HL,0 ; ENTER AT ADDRESS 0 CALL HBX_BNKCALL ; GO THERE HALT ; WE SHOULD NEVER COME BACK! - - -; ; SLIDE OS IMAGES BLOB DOWN TO $0000 -; LD HL,LDR_END ; SOURCE IS LOADER END -; LD BC,HB_END ; PLUS HBIOS IMAGE SIZE -; ADD HL,BC ; FINAL SOURCE ADDRESS -; LD DE,0 ; TARGET ADDRESS IS ZERO -; LD BC,BNKTOP ; MAX SIZE OF OS IMAGES -; LDIR ; DO IT -; ; JUMP TO START -; JP 0 ; AND CHAIN +; #ENDIF ; RET diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 675dc460..536b4e0d 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -99,8 +99,7 @@ HDSK_STATUS: ; ; HDSK_RESET: - XOR A ; ALWAYS OK - RET + JP HDSK_DSKRESET ; ; GET DISK CAPACITY ; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE @@ -158,92 +157,103 @@ HDSK_SEEK: ; ; HDSK_READ: - LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,HDSK_CMDREAD JR HDSK_RW ; ; ; HDSK_WRITE: - LD (HDSK_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS LD A,HDSK_CMDWRITE JR HDSK_RW ; ; ; HDSK_RW: - LD (HDSK_CMD),A - - ; CLEAR RESULTS - XOR A ; A = 0 - LD (HDSK_RC),A ; CLEAR RETURN CODE + LD (HDSK_CMD),A ; SET COMMAND BYTE + LD (HDSK_DMA),HL ; SAVE INITIAL DMA + LD A,E ; SECTOR COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT + LD A,(HDSK_UNIT) ; GET UNIT + ;AND $0F + LD (HDSK_DEV),A ; ... AND SAVE IT - ; INIT IF NEEDED + ; RESET HDSK INTERFACE IF NEEDED LD A,(HDSK_STAT) ; GET CURRENT STATUS OR A ; SET FLAGS + PUSH BC ; SAVE COUNTERS CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY + POP BC ; RESTORE COUNTERS + JR NZ,HDSK_RW6 ; ABORT ON FAILURE + +HDSK_RW0: + PUSH BC ; SAVE COUNTERS + XOR A ; A = 0 + LD (HDSK_RC),A ; CLEAR RETURN CODE + + ; CONVERT LBA HHHH:LLLL (4 BYTES) + ; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) + ; SAVING TO HDSK PARM BLOCK + LD A,(HSTLBA) ; LSB OF LBA + LD (HDSK_SEC),A ; ... SAVED TO SECTOR + LD HL,(HSTLBA+1) ; 2 MIDDLE BYTES OF LBA + LD (HDSK_TRK),HL ; ... SAVE TO TRACK - ; SET DEVICE - LD A,(HDSK_UNIT) - ;AND $0F - LD (HDSK_DEV),A + ; EXECUTE COMMAND + LD B,7 ; SIZE OF PARAMETER BLOCK + LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK + LD C,$FD ; HDSK CMD PORT + OTIR ; SEND IT -; ; INCOMING TRK:SEC ACTUALLY REPRESENTS 32 BIT LBA -; ; MAP TRK:SEC TO HDSK DRIVER AS TTSS:SS -; -; LD A,(HSTTRK) ; LSB OF TRACK -; LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK -; LD A,(HSTSEC + 1) ; MSB OF SECTOR -; LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK -; LD A,(HSTSEC) ; LSB OF SECTOR -; LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC - - ; INCOMING ADDRESS IS LBA - ; MAP HHHH:LLLL TO HDSK DRIVER AS HHLL:LL + ; GET RESULT + IN A,(C) ; GET RESULT CODE + LD (HDSK_RC),A ; SAVE IT + OR A ; SET FLAGS - LD A,(HSTLBAHI) ; LSB OF LBA HIGH - LD (HDSK_TRK + 1),A ; MAPS TO MSB OF HDSK TRK - LD A,(HSTLBALO + 1) ; MSB OF LBA LOW - LD (HDSK_TRK),A ; MAPS TO LSB OF HDSK TRK - LD A,(HSTLBALO) ; LSB OF LBA LOW - LD (HDSK_SEC),A ; MAPS TO LSB OF HDSK SEC +#IF (HDSKTRACE > 0) + PUSH AF ; SAVE RETURN CODE +#IF (HDSKTRACE == 1) + CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY +#ENDIF +#IF (HDSKTRACE >= 2) + CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS +#ENDIF + POP AF ; RESTORE RETURN CODE +#ENDIF - ; SET TRANSFER ADDRESS - LD BC,(HDSK_DSKBUF) - LD (HDSK_DMA),BC + JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR - ; EXECUTE COMMAND - LD B,7 ; SIZE OF PARAMETER BLOCK - LD HL,HDSK_PARMBLK ; START ADDRESS OF PARAMETER BLOCK -HDSK_RW1: - LD A,(HL) ; GET BYTE OF PARAMETER BLOCK - OUT ($FD),A ; SEND IT TO PORT - INC HL ; POINT TO NEXT BYTE - DJNZ HDSK_RW1 + ; INCREMENT LBA + LD HL,HSTLBA + PUSH HL + CALL LD32 + CALL INC32 + POP BC + CALL ST32 + + ; INCREMENT DMA + LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + + XOR A ; A := 0 SIGNALS SUCCESS - IN A,($FD) ; GET RESULT CODE - LD (HDSK_RC),A - OR A - JR Z,HDSK_OK - JR HDSK_ERR +HDSK_RW5: -HDSK_ERR: - XOR A - DEC A ; A=$FF TO SIGNAL ERROR - LD (HDSK_STAT),A ; SAVE IT -#IF (HDSKTRACE >= 1) - PUSH AF - CALL HDSK_PRT - POP AF -#ENDIF - RET + POP BC ; RECOVER COUNTERS + JR NZ,HDSK_RW6 ; IF ERROR, GET OUT + + INC C ; RECORD SECTOR COMPLETED + DJNZ HDSK_RW0 ; LOOP AS NEEDED -HDSK_OK: -#IF (HDSKTRACE >= 2) - CALL HDSK_PRT -#ENDIF - XOR A - RET +HDSK_RW6: + ; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL + LD E,C ; SECTOR READ COUNT TO E + LD HL,(HDSK_DMA) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE ; ; ; @@ -323,7 +333,7 @@ HDSK_PRTRW: LD A,(HDSK_SEC) CALL PRTHEXBYTE CALL PC_SPACE - LD BC,(HDSK_DSKBUF) + LD BC,(HDSK_DMA) CALL PRTHEXWORD CALL PC_SPACE @@ -373,7 +383,6 @@ HDSK_STAT .DB 0 HDSK_RC .DB 0 ; HDSK_UNIT .DB 0 -HDSK_DSKBUF .DW 0 ; HDSK_PARMBLK: HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 13b0ff07..93b18fa1 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -400,23 +400,60 @@ IDE_DEFMED: ; IDE_READ: LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS -#IF (IDETRACE == 1) - LD HL,IDE_PRTERR ; SET UP IDE_PRTERR - PUSH HL ; ... TO FILTER ALL EXITS -#ENDIF - CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - JP IDE_RDSEC + LD HL,IDE_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; IDE_WRITE: LD (IDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD HL,IDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC + LD (IDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + JR IDE_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +IDE_IO: + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT #IF (IDETRACE == 1) LD HL,IDE_PRTERR ; SET UP IDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + PUSH BC ; SAVE COUNTERS CALL IDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - JP IDE_WRSEC + CALL IDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS + POP BC ; RESTORE COUNTERS + RET NZ +IDE_IO1: + PUSH BC ; SAVE COUNTERS + LD HL,(IDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS + CALL JPHL ; ... AND CALL IT + JR NZ,IDE_IO2 ; IF ERROR, SKIP INCREMENT + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,IDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +IDE_IO2: + POP BC ; RECOVER COUNTERS + JR NZ,IDE_IO3 ; IF ERROR, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ IDE_IO1 ; LOOP AS NEEDED +IDE_IO3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(IDE_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE ; ; ; @@ -453,7 +490,7 @@ IDE_MEDIA: IDE_DPTR(IDE_STAT) ; POINT TO UNIT STATUS LD A,(HL) ; GET STATUS OR A ; SET FLAGS - JR NZ,IDE_MEDIA1 ; ERROR ACTIVE, TO RIGHT TO RESET + JR NZ,IDE_MEDIA1 ; ERROR ACTIVE, GO RIGHT TO RESET ; ; USE IDENTIFY COMMAND TO CHECK DEVICE LD HL,IDE_TIMEOUT ; POINT TO TIMEOUT @@ -556,8 +593,6 @@ IDE_IDENTIFY: ; ; IDE_RDSEC: - CALL IDE_CHKDEVICE - RET NZ ; #IF (IDETRACE >= 3) CALL IDE_PRTPREFIX @@ -578,8 +613,6 @@ IDE_RDSEC: ; ; IDE_WRSEC: - CALL IDE_CHKDEVICE - RET NZ ; #IF (IDETRACE >= 3) CALL IDE_PRTPREFIX @@ -1268,6 +1301,7 @@ IDE_TIMEOUT .DB IDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC IDE_TOSCALER .DW CPUMHZ * 961 ; WAIT FUNCS SCALER FOR CPU SPEED ; IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS +IDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 9ace1157..7b45e1c9 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -17,6 +17,10 @@ PPIDE_IO_BASE .EQU $60 PPIDE_IO_BASE .EQU $20 #ENDIF ; +#IF (PPIDEMODE == PPIDEMODE_SMB) +PPIDE_IO_BASE .EQU $E0 +#ENDIF +; #IF (PPIDEMODE == PPIDEMODE_MFP) PPIDE_IO_BASE .EQU $44 #ENDIF @@ -414,23 +418,61 @@ PPIDE_DEFMED: ; PPIDE_READ: LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS -#IF (PPIDETRACE == 1) - LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR - PUSH HL ; ... TO FILTER ALL EXITS -#ENDIF - CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - JP PPIDE_RDSEC + LD HL,PPIDE_RDSEC ; GET ADR OF SECTOR READ FUNC + LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; PPIDE_WRITE: LD (PPIDE_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS + LD HL,PPIDE_WRSEC ; GET ADR OF SECTOR WRITE FUNC + LD (PPIDE_IOFNADR),HL ; SAVE IT AS PENDING IO FUNC + JR PPIDE_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +PPIDE_IO: + LD A,E ; BLOCK COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT #IF (PPIDETRACE == 1) LD HL,PPIDE_PRTERR ; SET UP PPIDE_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF + PUSH BC ; SAVE COUNTERS CALL PPIDE_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT - JP PPIDE_WRSEC + CALL PPIDE_CHKDEVICE ; CHECK DEVICE AND CLEAR STATUS + POP BC ; RESTORE COUNTERS + RET NZ +PPIDE_IO1: + PUSH BC ; SAVE COUNTERS + LD HL,(PPIDE_IOFNADR) ; GET PENDING IO FUNCTION ADDRESS + CALL JPHL ; ... AND CALL IT + CALL PPIDE_RDSEC ; READ NEXT SECTOR + JR NZ,PPIDE_IO2 ; IF ERROR, SKIP INCREMENT + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,PPIDE_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +PPIDE_IO2: + POP BC ; RECOVER COUNTERS + JR NZ,PPIDE_IO3 ; IF ERROR, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ PPIDE_IO1 ; LOOP AS NEEDED +PPIDE_IO3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(PPIDE_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE ; ; ; @@ -1424,6 +1466,7 @@ PPIDE_TIMEOUT .DB PPIDE_TONORM ; WAIT FUNCS TIMEOUT IN TENTHS OF SEC PPIDE_TOSCALER .DW CPUMHZ * 218 ; WAIT FUNCS SCALER FOR CPU SPEED ; PPIDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS +PPIDE_IOFNADR .DW 0 ; PENDING IO FUNCTION ADDRESS PPIDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK ; PPIDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 4618b896..752b3530 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -10,6 +10,8 @@ MONIMG .EQU $1000 CPMIMG .EQU $2000 ZSYSIMG .EQU $5000 +; +INT_IM1 .EQU $FF20 ; .ORG 0 ; @@ -17,28 +19,31 @@ ZSYSIMG .EQU $5000 ; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE ;================================================================================================== ; - .FILL (000H - $),0FFH ; RST 0 - JP 0100H ; JUMP TO BOOT CODE - .FILL (008H - $),0FFH ; RST 8 + JP $100 ; RST 0: JUMP TO BOOT CODE + .FILL (008H - $),0FFH #IF (PLATFORM == PLT_UNA) - JP $FFFD ; INVOKE UBIOS FUNCTION + JP $FFFD ; RST 8: INVOKE UBIOS FUNCTION #ELSE - JP HB_INVOKE ; INVOKE HBIOS FUNCTION + JP HB_INVOKE ; RST 8: INVOKE HBIOS FUNCTION #ENDIF - .FILL (010H - $),0FFH ; RST 10 - RET - .FILL (018H - $),0FFH ; RST 18 - RET - .FILL (020H - $),0FFH ; RST 20 - RET - .FILL (028H - $),0FFH ; RST 28 - RET - .FILL (030H - $),0FFH ; RST 30 - RET - .FILL (038H - $),0FFH ; INT - RETI - .FILL (066H - $),0FFH ; NMI - RETN + .FILL (010H - $),0FFH + RET ; RST 10 + .FILL (018H - $),0FFH + RET ; RST 18 + .FILL (020H - $),0FFH + RET ; RST 20 + .FILL (028H - $),0FFH + RET ; RST 28 + .FILL (030H - $),0FFH + RET ; RST 30 + .FILL (038H - $),0FFH +#IF (PLATFORM == PLT_UNA) + RETI ; INT +#ELSE + JP INT_IM1 ; GO TO HBIOS IM1 INT HANDLER +#ENDIF + .FILL (066H - $),0FFH + RETN ; NMI ; .FILL (100H - $),0FFH ; PAD REMAINDER OF PAGE ZERO ; @@ -48,63 +53,50 @@ ZSYSIMG .EQU $5000 ;================================================================================================== ; DI ; NO INTERRUPTS -; LD SP,BL_STACK ; SETUP STACK ; -; COPY OURSELVES TO HI RAM FOR PHASE 2 -; - LD HL,0 ; COPY FROM START OF ROM IMAGE - LD DE,$8000 ; TO HIMEM $8000 - LD BC,$1000 ; COPY 4K - LDIR -; - JP PHASE2 ; CONTINUE EXECUTION IN HIMEM RAM -; -; THIS IS THE PHASE 2 CODE THAT MUST EXECUTE IN UPPER MEMORY -; - .ORG $ + $8000 ; SET ORG BASED ON OUR NEW LOCATION IN RAM -PHASE2: ; BANNER - ;CALL NEWLINE LD DE,STR_BANNER CALL WRITESTR - -#IFDEF PLTWBW - ; INIT DELAY FUNCTIONS - CALL DELAY_INIT +; +#IF (PLATFORM != PLT_UNA) + CALL DELAY_INIT ; INIT DELAY FUNCTIONS #ENDIF - - +; #IF (PLATFORM == PLT_UNA) - ; COPY UNA BIOS PAGE ZERO TO USER BANK, LEAVE USER BANK ACTIVE - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC) - CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) - ;PUSH DE ; SAVE PREVIOUS BANK - - LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO) - LD DE,$9000 ; USE $9000 AS BOUNCE BUFFER - LD BC,256 ; ONE PAGE IS 256 BYTES - LDIR ; DO IT - - LD BC,$01FB ; UNA FUNC = SET BANK - ;POP DE ; RECOVER OPERATING BANK - LD DE,BID_USR ; TO USER BANK - CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) - - LD HL,$9000 ; USE $9000 AS BOUNCE BUFFER - LD DE,0 ; TO PAGE ZERO OF OPERATING BANK - LD BC,256 ; ONE PAGE IS 256 BYTES - LDIR ; DO IT - - ; INSTALL UNA INVOCATION VECTOR FOR RST 08 - ; *** IS THIS REDUNDANT? *** - LD A,$C3 ; JP INSTRUCTION - LD (8),A ; STORE AT 0x0008 - LD HL,($FFFE) ; UNA ENTRY VECTOR - LD (9),HL ; STORE AT 0x0009 +; ; COPY UNA BIOS PAGE ZERO TO USER BANK, LEAVE USER BANK ACTIVE +; LD BC,$01FB ; UNA FUNC = SET BANK +; LD DE,BID_BIOS ; UBIOS_PAGE (SEE PAGES.INC) +; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +; PUSH DE ; SAVE PREVIOUS BANK +;; +; LD HL,0 ; FROM ADDRESS 0 (PAGE ZERO) +; LD DE,$9000 ; USE $9000 AS BOUNCE BUFFER +; LD BC,256 ; ONE PAGE IS 256 BYTES +; LDIR ; DO IT +;; +; LD BC,$01FB ; UNA FUNC = SET BANK +; ;POP DE ; RECOVER OPERATING BANK +; LD DE,BID_USR ; TO USER BANK +; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +;; +; LD HL,$9000 ; USE $9000 AS BOUNCE BUFFER +; LD DE,0 ; TO PAGE ZERO OF OPERATING BANK +; LD BC,256 ; ONE PAGE IS 256 BYTES +; LDIR ; DO IT +;; +;; ; INSTALL UNA INVOCATION VECTOR FOR RST 08 +;; ; *** IS THIS REDUNDANT? *** +;; LD A,$C3 ; JP INSTRUCTION +;; LD (8),A ; STORE AT 0x0008 +;; LD HL,($FFFE) ; UNA ENTRY VECTOR +;; LD (9),HL ; STORE AT 0x0009 +;; +; LD BC,$01FB ; UNA FUNC = SET BANK +; POP DE ; RECOVER OPERATING BANK +; CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) #ELSE - ; PREP THE USER BANK (SETUP DEFAULT PAGE ZERO) + ; PREP THE USER BANK (SETUP PAGE ZERO) LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY LD D,BID_USR ; D = DEST BANK = USER BANK LD E,BID_BIOS ; E = SRC BANK = BIOS BANK @@ -114,15 +106,9 @@ PHASE2: LD HL,0 ; COPY FROM BIOS ADDRESS 0 LD DE,0 ; TO USER ADDRESS 0 RST 08 ; DO IT - - ; NOW SWITCH TO USR BANK - LD B,BF_SYSSETBNK ; HBIOS FUNC: SETBNK - LD C,BID_USR ; USER BANK - RST 08 ; DO IT #ENDIF - EI - +; ; RUN THE BOOT LOADER MENU JP DOBOOTMENU ; @@ -155,7 +141,7 @@ DB_BOOTLOOP: JP Z,DB_CONEND CALL CINUC CP 'M' ; MONITOR - JP Z,GOMON + JP Z,GOMONSER CP 'C' ; CP/M BOOT FROM ROM JP Z,GOCPM CP 'Z' ; ZSYSTEM BOOT FROM ROM @@ -237,127 +223,80 @@ DB_INVALID: CALL WRITESTR JP DOBOOTMENU ; -GOMON: - CALL LDMON - ;LD HL,MON_SERIAL ; JUMP TO MONITOR, SERIAL ENTRY - ;JR EXECUSR - JP MON_SERIAL +GOMONSER: + LD HL,MON_SERIAL ; MONITOR SERIAL INTERFACE ENTRY ADDRESS TO HL + JR GOMON ; LOAD AND RUN MONITOR ; GOMONDSKY: - CALL LDMON - ;LD HL,MON_DSKY - ;JR EXECUSR - JP MON_DSKY + LD HL,MON_DSKY ; MONITOR DSKY INTERFACE ENTRY ADDRESS TO HL + JR GOMON ; LOAD AND RUN MONITOR ; -LDMON: - LD DE,STR_BOOTMON - CALL WRITESTR - ;LD HL,MONIMG - ;LD DE,MON_LOC - ;LD BC,MON_SIZ - ;LDIR -#IF (PLATFORM == PLT_UNA) - DI -; - ; SET LOW MEM TO OS IMAGE BANK - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,BID_OSIMG ; UBIOS_PAGE (SEE PAGES.INC) - CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) - ; COPY MEMORY - LD HL,MONIMG - LD DE,MON_LOC - LD BC,MON_SIZ - LDIR - ; RESET LOW MEM TO USER BANK - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,BID_USR ; TO USER BANK - CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) +GOMON: + LD DE,STR_BOOTMON ; DE POINTS TO MESSAGE + CALL WRITESTR ; WRITE IT TO CONSOLE ; - EI -#ELSE - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_OSIMG ; E = SRC BANK = OSIMG BANK - LD HL,MON_SIZ ; HL = COPY LEN - RST 08 ; DO IT - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,MONIMG ; COPY FROM MONITOR IMAGE LOCATION - LD DE,MON_LOC ; TO MONITOR EXECUTION LOCATION - RST 08 ; DO IT -#ENDIF - - RET + PUSH HL ; SAVE DESIRED MONITOR ENTRY ADDRESS ; -GOZSYS: - LD DE,STR_BOOTZSYS - CALL WRITESTR - LD HL,ZSYSIMG - JR GOCPM2 + ; COPY MONITOR IMAGE TO EXEC ADDRESS + LD HL,MONIMG ; HL := MONITOR IMAGE ADDRESS + LD DE,MON_LOC ; DE := MONITOR EXEC ADDRESS + LD BC,MON_SIZ ; BC := MONITOR SIZE + LDIR ; COPY MONITOR CODE TO EXEC ADDRESS +; + POP HL ; RECOVER ENTRY ADDRESS + JR CHAIN ; AND CHAIN TO IT ; GOCPM: - LD DE,STR_BOOTCPM - CALL WRITESTR - LD HL,CPMIMG -GOCPM2: - ;LD DE,CPM_LOC - ;LD BC,CPM_SIZ - ;LDIR - -#IF (PLATFORM == PLT_UNA) - DI - PUSH HL ; SAVE IMG LOCATION - ; SET LOW MEM TO OS IMAGE BANK - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,BID_OSIMG ; UBIOS_PAGE (SEE PAGES.INC) - CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) - ; COPY MEMORY - POP HL - LD DE,CPM_LOC - LD BC,CPM_SIZ - LDIR - ; RESET LOW MEM TO USER BANK - LD BC,$01FB ; UNA FUNC = SET BANK - LD DE,BID_USR ; TO USER BANK - CALL $FFFD ; DO IT (RST 08 NOT YET INSTALLED) - ; - EI -#ELSE - PUSH HL ; SAVE OS IMAGE ADDRESS - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - LD E,BID_OSIMG ; E = SRC BANK = OSIMG BANK - LD HL,CPM_SIZ ; HL = COPY LEN - RST 08 ; DO IT - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - POP HL ; FROM OS IMAGE ADDRESS - LD DE,CPM_LOC ; TO OS IMG EXECUTION LOCATION - RST 08 ; DO IT -#ENDIF + LD DE,STR_BOOTCPM ; DE POINTS TO MESSAGE + CALL WRITESTR ; WRITE IT TO CONSOLE + LD HL,CPMIMG ; SET HL TO CPM IMAGE ADDRESS + JR GOOS ; LOAD AND RUN OS +; +GOZSYS: + LD DE,STR_BOOTZSYS ; DE POINTS TO MESSAGE + CALL WRITESTR ; WRITE IT TO CONSOLE + LD HL,ZSYSIMG ; SET HL TO ZSYS IMAGE ADDRESS + JR GOOS ; LOAD AND RUN OS +; +GOOS: + ; COPY OS IMAGE TO EXEC ADDRESS + LD DE,CPM_LOC ; DE := MONITOR EXEC ADDRESS + LD BC,CPM_SIZ ; BC := MONITOR SIZE + LDIR ; COPY MONITOR CODE TO EXEC ADDRESS +; + LD HL,CPM_ENT + ;JR CHAIN ; CHAIN TO ENTRY ADDRESS IN USER BANK +; +CHAIN: + PUSH HL ; SAVE ENTRY ADDRESS ; #IF (PLATFORM == PLT_UNA) LD DE,-1 LD L,1 LD BC,$01FC ; UNA FUNC: SET BOOTSTRAP HISTORY RST 08 ; CALL UNA +; + ; HL IS ALREADY ON STACK AS REQUIRED BY UNA EXEC CHAIN CALL + LD DE,BID_USR ; TARGET BANK ID + PUSH DE ; ... ON STACK + DI ; ENTER WITH INTS DISABLED + JP $FFF7 ; UNA INTER-PAGE EXEC CHAIN + HALT #ELSE LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA - LD L,A ; ... AND SAVE AND BOOT BANK + LD L,A ; ... AND SAVE AS BOOT BANK LD DE,$0100 ; BOOT VOLUME (UNIT, SLICE) RST 08 +; + LD A,BID_USR ; ACTIVATE USER BANK + POP HL ; RECOVER ENTRY ADDRESS + DI ; ENTER WITH INTS DISABLED + CALL HB_BNKCALL ; AND GO + HALT ; WE SHOULD NEVER RETURN!!! #ENDIF - ;LD HL,CPM_ENT ; CPM ENTRY VECTOR - JP CPM_ENT ; CPM ENTRY VECTOR -; -;EXECUSR: -;#IF (PLATFORM == PLT_UNA) -; JP (HL) -;#ELSE -; LD A,BID_USR ; WITH USER BANK ACTIVE -; CALL HB_BNKCALL ; GO THERE -; CALL PANIC ; WE ARE NOT SUPPOSED TO RETURN -;#ENDIF + ; GOLIST: LD DE,STR_LIST @@ -376,6 +315,9 @@ GOBOOTDISK: ; BOOT FROM DISK DRIVE ; BOOTDISK: + LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE + CALL WRITESTR ; PRINT IT + #IF (PLATFORM == PLT_UNA) ; ; BOOT FROM UNA DISK DRIVE @@ -389,17 +331,63 @@ BOOTDISK: LD HL,2 ; LOAD STARTING INFO SECTOR 2 RST 08 ; SET LBA JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS ; LD C,$42 ; UNA FUNC: READ SECTORS LD DE,BL_INFOSEC ; DEST OF CPM IMAGE LD L,1 ; SECTORS TO READ RST 08 ; DO READ JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS +; +#ELSE + ; CHECK FOR VALID DRIVE LETTER + LD A,(BL_BOOTID) ; BOOT DEVICE TO A + PUSH AF ; SAVE BOOT DEVICE + LD B,BF_SYSGET + LD C,BF_SYSGET_DIOCNT + RST 08 ; E := DISK UNIT COUNT + POP AF ; RESTORE BOOT DEVICE + CP E ; CHECK MAX (INDEX - COUNT) + JP NC,DB_NODISK ; HANDLE INVALID SELECTION + + ; SET THE BOOT UNIT AND SLICE + LD A,(BL_BOOTID) ; GET BOOTID + LD (BL_DEVICE),A ; STORE IT + XOR A ; LU ALWAYS ZERO + LD (BL_LU),A ; STORE IT + + ; SENSE MEDIA + LD A,(BL_DEVICE) ; GET DEVICE/UNIT + LD C,A ; STORE IN C + LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA + LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY + RST 08 ; CALL HBIOS + JP NZ,DB_ERR ; HANDLE ERROR + + ; SEEK TO SECTOR 2 OF LU + LD A,(BL_LU) ; GET LU SPECIFIED + LD E,A ; LU INDEX + LD H,65 ; 65 TRACKS PER LU + CALL MULT8 ; HL := H * E + LD DE,$02 ; HEAD 0, SECTOR 2 + LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C + RST 08 ; DO IT + JP NZ,DB_ERR ; HANDLE ERROR + + ; READ + LD B,BF_DIOREAD ; FUNCTION IN B + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C + LD HL,BL_INFOSEC ; READ INTO INFO SEC BUFFER + LD DE,1 ; TRANSFER ONE SECTOR + RST 08 ; DO IT + JP NZ,DB_ERR ; HANDLE ERROR +; +#ENDIF ; ; CHECK SIGNATURE - CALL NEWLINE ; FORMATTING + ;CALL NEWLINE ; FORMATTING LD DE,(BB_SIG) ; GET THE SIGNATURE LD A,$A5 ; FIRST BYTE SHOULD BE $A5 CP D ; COMPARE @@ -441,28 +429,26 @@ BOOTDISK: LD DE,STR_LOADING ; LOADING MESSAGE CALL WRITESTR ; PRINT IT ; - LD A,(BL_BOOTID) ; GET BOOT DEVICE ID - LD B,A ; MOVE TO B -; - LD C,$41 ; UNA FUNC: SET LBA - LD DE,0 ; HI WORD OF LBA IS ALWAYS ZERO - LD HL,3 ; LOAD STARTING AT SECTOR 3 - RST 08 ; SET LBA - JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS -; - LD C,$42 ; UNA FUNC: READ SECTORS + ; COMPUTE NUMBER OF SECTORS TO LOAD LD HL,(BB_CPMEND) ; HL := END LD DE,(BB_CPMLOC) ; DE := START OR A ; CLEAR CARRY SBC HL,DE ; HL := LENGTH TO LOAD LD A,H ; DETERMINE 512 BYTE SECTOR COUNT RRCA ; ... BY DIVIDING MSB BY TWO - LD L,A ; SECTORS TO READ + LD (BL_COUNT),A ; ... AND SAVE IT +; +#IF (PLATFORM == PLT_UNA) +; + ; READ OS IMAGE INTO MEMORY + LD C,$42 ; UNA FUNC: READ SECTORS + LD A,(BL_BOOTID) ; GET BOOT DEVICE ID + LD B,A ; MOVE TO B LD DE,(BB_CPMLOC) ; DEST OF CPM IMAGE + LD A,(BL_COUNT) ; GET SECTORS TO READ + LD L,A ; SECTORS TO READ RST 08 ; DO READ JP NZ,DB_ERR ; HANDLE ERROR - CALL PC_PERIOD ; MARK PROGRESS ; ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT LD DE,-1 @@ -472,17 +458,116 @@ BOOTDISK: RST 08 ; CALL UNA ; ; JUMP TO COLD BOOT ENTRY - CALL NEWLINE ; FORMATTING LD HL,(BB_CPMENT) ; GET THE ENTRY POINT - ;JP EXECUSR ; ... AND GO + DI ; ENTER WITH INTS DISABLED JP (HL) ; ... AND GO ; +#ELSE +; + ; READ OS IMAGE INTO MEMORY + LD B,BF_DIOREAD ; FUNCTION IN B + LD A,(BL_DEVICE) ; GET BOOT DISK UNIT + LD C,A ; PUT IN C + LD HL,(BB_CPMLOC) ; LOAD ADDRESS + LD D,0 + LD A,(BL_COUNT) ; GET SECTORS TO READ + LD E,A ; NUMBER OF SECTORS TO LOAD + RST 08 + JP NZ,DB_ERR ; HANDLE ERRORS + + ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT + LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER + LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO + LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA + LD L,A ; ... AND SAVE AND BOOT BANK + LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT + LD D,A ; SAVE IN D + LD A,(BL_LU) ; LOAD BOOT LU + LD E,A ; SAVE IN E + RST 08 + JP NZ,DB_ERR ; HANDLE ERRORS + + ; JUMP TO COLD BOOT ENTRY + LD A,BID_USR ; ACTIVATE USER BANK + LD HL,(BB_CPMENT) ; OS ENTRY ADDRESS + DI ; ENTER WITH INTS DISABLED + CALL HB_BNKCALL ; AND GO + HALT ; WE SHOULD NEVER RETURN!!! +; +#ENDIF +; +DB_NODISK: + ; SELDSK DID NOT LIKE DRIVE SELECTION + LD DE,STR_NODISK + CALL WRITESTR + JP DOBOOTMENU + +DB_NOBOOT: + ; DISK IS NOT BOOTABLE + LD DE,STR_NOBOOT + CALL WRITESTR + JP DOBOOTMENU + +DB_ERR: + ; I/O ERROR DURING BOOT ATTEMPT + LD DE,STR_BOOTERR + CALL WRITESTR + JP DOBOOTMENU +; +#IF (DSKYENABLE) +; +; +;__SEGDISPLAY________________________________________________________________________________________ +; +; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP +;____________________________________________________________________________________________________ +; +SEGDISPLAY: + PUSH AF ; STORE AF + PUSH BC ; STORE BC + PUSH HL ; STORE HL + LD BC,0007H + ADD HL,BC + LD B,08H ; SET DIGIT COUNT + LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF + OUT (PPIC),A ; OUTPUT + CALL DLY2 ; WAIT + LD A,0F0H ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL) + +SEGDISPLAY1: ; + OUT (PPIA),A ; OUTPUT TO PORT + LD A,80H | 30H ; STROBE WRITE PULSE WITH CONTROL=1 + OUT (PPIC),A ; OUTPUT TO PORT + CALL DLY2 ; WAIT + LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF + OUT (PPIC),A ; OUTPUT + +SEGDISPLAY_LP: + LD A,(HL) ; GET DISPLAY DIGIT + OUT (PPIA),A ; OUT TO PPIA + LD A,00H | 30H ; SET WRITE STROBE + OUT (PPIC),A ; OUT TO PPIC + CALL DLY2 ; DELAY + LD A,40H | 30H ; SET CONTROL PORT OFF + OUT (PPIC),A ; OUT TO PPIC + CALL DLY2 ; WAIT + DEC HL ; INC POINTER + DJNZ SEGDISPLAY_LP ; LOOP FOR NEXT DIGIT + POP HL ; RESTORE HL + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET +#ENDIF + +#IF (PLATFORM == PLT_UNA) +; +; ; PRINT LIST OF ALL DRIVES UNDER UNA ; PRTALL: LD B,0 ; START WITH UNIT 0 ; -UPRTALL1: ; LOOP THRU ALL UNITS AVAILABLE +PRTALL1: ; LOOP THRU ALL UNITS AVAILABLE LD C,$48 ; UNA FUNC: GET DISK TYPE LD L,0 ; PRESET UNIT COUNT TO ZERO RST 08 ; CALL UNA, B IS ASSUMED TO BE UNTOUCHED!!! @@ -490,15 +575,15 @@ UPRTALL1: ; LOOP THRU ALL UNITS AVAILABLE OR A ; PAST END? RET Z ; WE ARE DONE PUSH BC ; SAVE UNIT - CALL UPRTDRV ; PROCESS THE UNIT + CALL PRTDRV ; PROCESS THE UNIT POP BC ; RESTORE UNIT INC B ; NEXT UNIT - JR UPRTALL1 ; LOOP + JR PRTALL1 ; LOOP ; ; PRINT THE UNA UNIT INFO ; ON INPUT B HAS UNIT ; -UPRTDRV: +PRTDRV: PUSH BC ; SAVE UNIT PUSH DE ; SAVE DISK TYPE LD DE,STR_PREFIX ; NEWLINE AND SPACING @@ -512,33 +597,33 @@ UPRTDRV: POP DE ; RECOVER DISK TYPE LD A,D ; DISK TYPE TO A CP $40 ; RAM/ROM? - JR Z,UPRTDRV1 ; HANDLE RAM/ROM - LD DE,UDEVIDE ; ASSUME IDE + JR Z,PRTDRV1 ; HANDLE RAM/ROM + LD DE,DEVIDE ; ASSUME IDE CP $41 ; IDE? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVPPIDE ; ASSUME PPIDE + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVPPIDE ; ASSUME PPIDE CP $42 ; PPIDE? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVSD ; ASSUME SD + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVSD ; ASSUME SD CP $43 ; SD? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVDSD ; ASSUME DSD + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVDSD ; ASSUME DSD CP $44 ; DSD? - JR Z,UPRTDRV2 ; PRINT IT - LD DE,UDEVUNK ; OTHERWISE UNKNOWN - JR UPRTDRV2 + JR Z,PRTDRV2 ; PRINT IT + LD DE,DEVUNK ; OTHERWISE UNKNOWN + JR PRTDRV2 ; -UPRTDRV1: ; HANDLE RAM/ROM +PRTDRV1: ; HANDLE RAM/ROM LD C,$45 ; UNA FUNC: GET DISK INFO - LD DE,$9000 ; 512 BYTE BUFFER *** FIX!!! *** + LD DE,BL_INFOSEC ; 512 BYTE BUFFER RST 08 ; CALL UNA BIT 7,B ; TEST RAM DRIVE BIT - LD DE,UDEVROM ; ASSUME ROM - JR Z,UPRTDRV2 ; IF SO, PRINT IT - LD DE,UDEVRAM ; OTHERWISE RAM - JR UPRTDRV2 ; PRINT IT + LD DE,DEVROM ; ASSUME ROM + JR Z,PRTDRV2 ; IF SO, PRINT IT + LD DE,DEVRAM ; OTHERWISE RAM + JR PRTDRV2 ; PRINT IT ; -UPRTDRV2: ; PRINT DEVICE +PRTDRV2: ; PRINT DEVICE POP BC ; RECOVER UNIT CALL WRITESTR ; PRINT DEVICE NAME LD A,B ; UNIT TO A @@ -548,215 +633,15 @@ UPRTDRV2: ; PRINT DEVICE CALL COUT ; PRINT IT RET ; DONE ; -UDEVRAM .DB "RAM$" -UDEVROM .DB "ROM$" -UDEVIDE .DB "IDE$" -UDEVPPIDE .DB "PPIDE$" -UDEVSD .DB "SD$" -UDEVDSD .DB "DSD$" -UDEVUNK .DB "UNK$" +DEVRAM .DB "RAM$" +DEVROM .DB "ROM$" +DEVIDE .DB "IDE$" +DEVPPIDE .DB "PPIDE$" +DEVSD .DB "SD$" +DEVDSD .DB "DSD$" +DEVUNK .DB "UNK$" ; #ELSE -; - LD DE,STR_BOOTDISK1 ; DISK BOOT MESSAGE - CALL WRITESTR ; PRINT IT - - ; CHECK FOR VALID DRIVE LETTER - LD A,(BL_BOOTID) ; BOOT DEVICE TO A - PUSH AF ; SAVE BOOT DEVICE - LD B,BF_SYSGET - LD C,BF_SYSGET_DIOCNT - RST 08 ; E := DISK UNIT COUNT - POP AF ; RESTORE BOOT DEVICE - CP E ; CHECK MAX (INDEX - COUNT) - JP NC,DB_NODISK ; HANDLE INVALID SELECTION - - ; SET THE BOOT UNIT AND SLICE - LD A,(BL_BOOTID) ; GET BOOTID - LD (BL_DEVICE),A ; STORE IT - XOR A ; LU ALWAYS ZERO - LD (BL_LU),A ; STORE IT - - ; SENSE MEDIA - LD A,(BL_DEVICE) ; GET DEVICE/UNIT - LD C,A ; STORE IN C - LD B,BF_DIOMEDIA ; DRIVER FUNCTION = DISK MEDIA - LD E,1 ; ENABLE MEDIA CHECK/DISCOVERY - RST 08 ; CALL HBIOS - ;LD A,E ; MOVE RESULTANT MEDIA ID TO A - ;OR A ; SET FLAGS - JP NZ,DB_ERR ; HANDLE ERROR - - ; ESTABLISH GEOMETRY - LD A,(BL_DEVICE) ; GET DEVICE/UNIT - LD C,A ; PUT IN C - LD B,BF_DIOGEOM ; HB FUNC: GET DISK GEOMETRY - RST 08 ; DO IT, D:=HEADS, E:=SECTORS - LD A,D ; GET HEADS PER CYLINCER - AND $7F ; CLEAR LBA CAPABILITY FLAG - LD (BL_HPC),A ; SAVE HEADS PER CYL - LD A,E ; GET SECTORS PER TRACK - LD (BL_SPT),A ; SAVE SECTORS PER TRACK - - ; DETERMINE STARTING TRACK FOR LU - LD A,(BL_LU) ; GET LU SPECIFIED - LD E,A ; LU INDEX - LD H,65 ; 65 TRACKS PER LU - CALL MULT8 ; HL := H * E - LD (BL_LUTRK),HL ; SAVE IT - - ; READ BOOT INFO SECTOR - LD HL,0 ; INITIAL TRACK (RELATIVE TO LU) - LD (BL_CURTRK),HL ; SAVE AS CURRENT TRACK - LD A,0 ; BOOT INFO IS HEAD 0 - LD (BL_CURHD),A ; SAVE AS CURRENT HEAD - LD A,2 ; BOOT INFO IS IN SECTOR 2 - LD (BL_CURSEC),A ; SAVE AS CURRENT SECTOR - LD HL,BL_INFOSEC ; WHERE TO PUT INFO SECTOR - LD (BL_CURDMA),HL ; ... AND SAVE IT - CALL DB_READSEC ; READ CURRENT SECTOR - JP NZ,DB_ERR ; HANDLE ERROR - - ; CHECK SIGNATURE - LD BC,(BB_SIG) - LD A,$A5 - CP B - JP NZ,DB_NOBOOT - LD A,$5A - CP C - JP NZ,DB_NOBOOT - - ; PRINT CPMLOC VALUE - CALL NEWLINE - LD DE,STR_CPMLOC - CALL WRITESTR - LD BC,(BB_CPMLOC) - CALL PRTHEXWORD - - ; PRINT CPMEND VALUE - CALL PC_SPACE - LD DE,STR_CPMEND - CALL WRITESTR - LD BC,(BB_CPMEND) - CALL PRTHEXWORD - - ; PRINT CPMENT VALUE - CALL PC_SPACE - LD DE,STR_CPMENT - CALL WRITESTR - LD BC,(BB_CPMENT) - CALL PRTHEXWORD - CALL PC_SPACE - - ; PRINT DISK LABEL - LD DE,STR_LABEL - CALL WRITESTR - LD DE,BB_LABEL ; if it is there, then a printable - LD A,(BB_TERM) ; Display Disk Label if Present - CP '$' ; (dwg 2/7/2012) - CALL Z,WRITESTR ; label is there as well even if spaces. - - ; COMPUTE NUMBER OF SECTORS TO LOAD - LD HL,(BB_CPMEND) ; HL := END - LD DE,(BB_CPMLOC) ; DE := START - OR A ; CLEAR CARRY - SBC HL,DE ; HL := LENGTH TO LOAD - LD A,H ; DETERMINE 512 BYTE SECTOR COUNT - RRCA ; ... BY DIVIDING MSB BY TWO - LD (BL_COUNT),A ; ... AND SAVE IT - - ; LOADING MESSAGE - CALL NEWLINE - LD DE,STR_LOADING - CALL WRITESTR - - ; SETUP FOR DATA LOAD - LD HL,(BB_CPMLOC) ; GET TARGET LOAD LOCATION - LD (BL_CURDMA),HL ; ... AND SAVE IT - -DB_LOOP: - ; READ NEXT SECTOR - CALL DB_NXTSEC ; BUMP TO NEXT SECTOR - CALL DB_READSEC ; READ SECTOR - JP NZ,DB_ERR ; HANDLE ERRORS - CALL PC_PERIOD ; SHOW PROGRESS -; - ; INCREMENT DMA ADDRESS BY SECTOR SIZE - LD HL,(BL_CURDMA) ; GET LOAD LOC - LD DE,512 ; 512 BYTES PER SECTOR - ADD HL,DE ; INCREMENT MEM POINTER - LD (BL_CURDMA),HL ; ... AND SAVE IT -; - ; INCREMENT COUNTER AND LOOP AS NEEDED - LD HL,BL_COUNT ; POINT TO COUNTER - DEC (HL) ; ... AND DECREMENT IT - JR NZ,DB_LOOP ; LOOP IF NEEDED - ;CALL NEWLINE ; FORMATTING - - ; PASS BOOT DEVICE/UNIT/LU TO CBIOS COLD BOOT - LD B,BF_SYSSET ; HB FUNC: SET HBIOS PARAMETER - LD C,BF_SYSSET_BOOTINFO ; HB SUBFUNC: SET BOOT INFO - LD A,(HB_CURBNK) ; GET CURRENT BANK ID FROM PROXY DATA - LD L,A ; ... AND SAVE AND BOOT BANK - LD A,(BL_DEVICE) ; LOAD BOOT DEVICE/UNIT - LD D,A ; SAVE IN D - LD A,(BL_LU) ; LOAD BOOT LU - LD E,A ; SAVE IN E - RST 08 - - ; JUMP TO COLD BOOT ENTRY - LD HL,(BB_CPMENT) - JP (HL) -; -; INCREMENT TO NEXT SECTOR -; -DB_NXTSEC: - ; INCREMENT SECTOR - LD HL,BL_CURSEC ; POINT TO CURRENT SECTOR - INC (HL) ; INCREMENT IT - LD A,(BL_SPT) ; GET SECTORS/TRACK - CP (HL) ; COMPARE TO CURRENT SECTOR - RET NZ ; RETURN IF SEC HAS NOT REACHED SPT - ; INCREMENT HEAD - LD (HL),0 ; RESET SECTOR TO ZERO - LD HL,BL_CURHD ; POINT TO CURRENT HEAD - INC (HL) ; INCREMENT IT - LD A,(BL_HPC) ; GET HEADS/CYLINDER - CP (HL) ; COMPARE TO CURRENT HEAD - RET NZ ; RETURN IF HEAD HAS NOT REACHED HPC - ; INCREMENT TRACK - LD (HL),0 ; RESET HEAD TO ZERO - LD HL,(BL_CURTRK) ; GET CURRENT TRACK VALUE - INC HL ; INCREMENT - LD (BL_CURTRK),HL ; AND SAVE NEW VALUE - RET ; DONE -; -; READ CURRENT SECTOR TO LOAD LOCATION -; -DB_READSEC: - ; SET HL=TRACK (ADD IN TRACK OFFSET) - LD DE,(BL_LUTRK) ; DE = TRACK OFFSET FOR LU SUPPORT - LD HL,(BL_CURTRK) ; HL = TRACK # - ADD HL,DE ; APPLY OFFSET FOR ACTIVE LU - ; SET HEAD AND SECTOR - LD A,(BL_CURHD) ; GET CURRENT HEAD - LD D,A ; PUT IN D - LD A,(BL_CURSEC) ; GET CURRENT SECTOR - LD E,A ; PUT IN E - ; SEEK - LD B,BF_DIOSEEK ; SETUP FOR NEW SEEK CALL - LD A,(BL_DEVICE) ; GET BOOT DISK UNIT - LD C,A ; PUT IN C - RST 08 ; DO IT - RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A - ; READ - LD B,BF_DIOREAD ; FUNCTION IN B - LD A,(BL_DEVICE) ; GET BOOT DISK UNIT - LD C,A ; PUT IN C - LD HL,(BL_CURDMA) ; GET BUFFER ADDRESS - LD DE,1 ; TRANSFER ONE SECTOR - RST 08 - RET ; ; PRINT LIST OF ALL DRIVES ; @@ -846,69 +731,6 @@ DEV15 .EQU DEVUNK ; #ENDIF ; -DB_NODISK: - ; SELDSK DID NOT LIKE DRIVE SELECTION - LD DE,STR_NODISK - CALL WRITESTR - JP DOBOOTMENU - -DB_NOBOOT: - ; DISK IS NOT BOOTABLE - LD DE,STR_NOBOOT - CALL WRITESTR - JP DOBOOTMENU - -DB_ERR: - ; I/O ERROR DURING BOOT ATTEMPT - LD DE,STR_BOOTERR - CALL WRITESTR - JP DOBOOTMENU -; -#IF (DSKYENABLE) -; -; -;__SEGDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP -;____________________________________________________________________________________________________ -; -SEGDISPLAY: - PUSH AF ; STORE AF - PUSH BC ; STORE BC - PUSH HL ; STORE HL - LD BC,0007H - ADD HL,BC - LD B,08H ; SET DIGIT COUNT - LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF - OUT (PPIC),A ; OUTPUT - CALL DLY2 ; WAIT - LD A,0F0H ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL) - -SEGDISPLAY1: ; - OUT (PPIA),A ; OUTPUT TO PORT - LD A,80H | 30H ; STROBE WRITE PULSE WITH CONTROL=1 - OUT (PPIC),A ; OUTPUT TO PORT - CALL DLY2 ; WAIT - LD A,40H | 30H ; SET CONTROL PORT 7218 TO OFF - OUT (PPIC),A ; OUTPUT - -SEGDISPLAY_LP: - LD A,(HL) ; GET DISPLAY DIGIT - OUT (PPIA),A ; OUT TO PPIA - LD A,00H | 30H ; SET WRITE STROBE - OUT (PPIC),A ; OUT TO PPIC - CALL DLY2 ; DELAY - LD A,40H | 30H ; SET CONTROL PORT OFF - OUT (PPIC),A ; OUT TO PPIC - CALL DLY2 ; WAIT - DEC HL ; INC POINTER - DJNZ SEGDISPLAY_LP ; LOOP FOR NEXT DIGIT - POP HL ; RESTORE HL - POP BC ; RESTORE BC - POP AF ; RESTORE AF - RET -#ENDIF -; ;__TEXT_STRINGS_________________________________________________________________________________________________________________ ; ; STRINGS @@ -929,7 +751,7 @@ STR_CPMENT .DB "ENT=$" STR_LABEL .DB "LABEL=$" STR_DRVLIST .DB "\r\nDisk Devices:\r\n$" STR_PREFIX .DB "\r\n $" -STR_LOADING .DB "\r\nLoading$" +STR_LOADING .DB "\r\nLoading...$" STR_NODISK .DB "\r\nNo disk!$" STR_NOBOOT .DB "\r\nDisk not bootable!$" STR_BOOTERR .DB "\r\nBoot failure!$" @@ -1005,11 +827,6 @@ CIN: ; CST: ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - CALL DLY64 - CALL DLY64 - CALL DLY64 - CALL DLY64 - CALL DLY64 PUSH BC PUSH DE PUSH HL @@ -1017,8 +834,6 @@ CST: ; GET CONSOLE INPUT STATUS VIA HBIOS LD C,CIODEV_CONSOLE ; CONSOLE UNIT TO C LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS - ;XOR A ; *DEBUG* - ;INC A ; *DEBUG* RST 08 ; HBIOS RETURNS STATUS IN A ; ; RESTORE REGISTERS (AF IS OUTPUT) @@ -1105,61 +920,56 @@ CINUC: RET ; ;================================================================================================== +; FILL REMAINDER OF BANK +;================================================================================================== +; +SLACK: .EQU ($1000 - $) + .FILL SLACK +; + .ECHO "LOADER space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" +; +;================================================================================================== ; WORKING DATA STORAGE ;================================================================================================== ; -BL_STACKSIZ .EQU 40H - .FILL BL_STACKSIZ,0 -BL_STACK .EQU $ -; -BL_HPC .DB 0 ; HEADS PER CYLINDER FOR LOAD DEVICE -BL_SPT .DB 16 ; SECTORS PER TRACK FOR LOAD DEVICE -BL_LUTRK .DW 0 ; STARTING TRACK FOR LU -BL_CURTRK .DW 0 ; CURRENT TRACK FOR LOAD -BL_CURHD .DB 0 ; CURRENT HEAD FOR LOAD -BL_CURSEC .DB 0 ; CURRENT SECTOR FOR LOAD -BL_CURDMA .DW 0 ; CURRENT MEM LOC BEING LOADED -BL_COUNT .DB 0 ; LOAD COUNTER -BL_TIMEOUT .DW 0 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER -BL_BOOTID .DB 0 ; BOOT DEVICE ID CHOSEN BY USER -BL_DEVICE .DB 0 ; DEVICE TO LOAD FROM -BL_LU .DB 0 ; LU TO LOAD FROM + .ORG $8000 +; + .DS 64 ; 32 LEVEL STACK +BL_STACK .EQU $ ; ... TOP IS HERE +; +BL_COUNT .DS 1 ; LOAD COUNTER +BL_TIMEOUT .DS 2 ; AUTOBOOT TIMEOUT COUNTDOWN COUNTER +BL_BOOTID .DS 1 ; BOOT DEVICE ID CHOSEN BY USER +BL_DEVICE .DS 1 ; DEVICE TO LOAD FROM +BL_LU .DS 1 ; LU TO LOAD FROM ; ; BOOT INFO SECTOR IS READ INTO AREA BELOW ; THE THIRD SECTOR OF A DISK DEVICE IS RESERVED FOR BOOT INFO ; BL_INFOSEC .EQU $ - .FILL (512 - 128),0 + .DS (512 - 128) BB_METABUF .EQU $ -BB_SIG .DW 0 ; SIGNATURE (WILL BE 0A55AH IF SET) -BB_PLATFORM .DB 0 ; FORMATTING PLATFORM -BB_DEVICE .DB 0 ; FORMATTING DEVICE -BB_FORMATTER .FILL 8,0 ; FORMATTING PROGRAM -BB_DRIVE .DB 0 ; PHYSICAL DISK DRIVE # -BB_LU .DB 0 ; LOGICAL UNIT (LU) - .DB 0 ; MSB OF LU, NOW DEPRECATED - .FILL (BB_METABUF + 128) - $ - 32,0 -BB_PROTECT .DB 0 ; WRITE PROTECT BOOLEAN -BB_UPDATES .DW 0 ; UPDATE COUNTER -BB_RMJ .DB 0 ; RMJ MAJOR VERSION NUMBER -BB_RMN .DB 0 ; RMN MINOR VERSION NUMBER -BB_RUP .DB 0 ; RUP UPDATE NUMBER -BB_RTP .DB 0 ; RTP PATCH LEVEL -BB_LABEL .FILL 16,0 ; 16 CHARACTER DRIVE LABEL -BB_TERM .DB 0 ; LABEL TERMINATOR ('$') -BB_BILOC .DW 0 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO) -BB_CPMLOC .DW 0 ; FINAL RAM DESTINATION FOR CPM/CBIOS -BB_CPMEND .DW 0 ; END ADDRESS FOR LOAD -BB_CPMENT .DW 0 ; CP/M ENTRY POINT (CBIOS COLD BOOT) +BB_SIG .DS 2 ; SIGNATURE (WILL BE 0A55AH IF SET) +BB_PLATFORM .DS 1 ; FORMATTING PLATFORM +BB_DEVICE .DS 1 ; FORMATTING DEVICE +BB_FORMATTER .DS 8 ; FORMATTING PROGRAM +BB_DRIVE .DS 1 ; PHYSICAL DISK DRIVE # +BB_LU .DS 1 ; LOGICAL UNIT (LU) + .DS 1 ; MSB OF LU, NOW DEPRECATED + .DS (BB_METABUF + 128) - $ - 32 +BB_PROTECT .DS 1 ; WRITE PROTECT BOOLEAN +BB_UPDATES .DS 2 ; UPDATE COUNTER +BB_RMJ .DS 1 ; RMJ MAJOR VERSION NUMBER +BB_RMN .DS 1 ; RMN MINOR VERSION NUMBER +BB_RUP .DS 1 ; RUP UPDATE NUMBER +BB_RTP .DS 1 ; RTP PATCH LEVEL +BB_LABEL .DS 16 ; 16 CHARACTER DRIVE LABEL +BB_TERM .DS 1 ; LABEL TERMINATOR ('$') +BB_BILOC .DS 2 ; LOC TO PATCH BOOT DRIVE INFO TO (IF NOT ZERO) +BB_CPMLOC .DS 2 ; FINAL RAM DESTINATION FOR CPM/CBIOS +BB_CPMEND .DS 2 ; END ADDRESS FOR LOAD +BB_CPMENT .DS 2 ; CP/M ENTRY POINT (CBIOS COLD BOOT) ; -;================================================================================================== -; FILL REMAINDER OF BANK -;================================================================================================== -; -SLACK: .EQU ($9000 - $) - .FILL SLACK -; - .ECHO "LOADER space remaining: " - .ECHO SLACK - .ECHO " bytes.\n" .END diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 94724bf2..0c3e82ae 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -503,30 +503,66 @@ SD_DEFMED: ; ; SD_READ: - LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS -#IF (SDTRACE == 1) - LD HL,SD_PRTERR ; SET UP SD_PRTERR - PUSH HL ; ... TO FILTER ALL EXITS -#ENDIF - CALL SD_SELUNIT - ; READ A SECTOR - LD C,SD_CMD_READ_SNGL_BLK ; SET READ_SINGLE_BLOCK COMMAND - JP SD_SECTIO ; DO SECTOR I/O + LD A,SD_CMD_READ_SNGL_BLK ; SETUP FOR SINGLE BLOCK READ CMD + JR SD_IO ; CONTINUE TO GENERIC IO ROUTINE ; ; ; SD_WRITE: + LD A,SD_CMD_WRITE_BLOCK ; SETUP FOR BLOCK WRITE CMD + JR SD_IO ; CONTINUE TO GENERIC IO ROUTINE +; +; +; +SD_IO: + LD (SD_CMDVAL),A ; SAVE THE SD CARD COMMAND + LD A,E ; GET BLOCK COUNT REQUESTED + LD (SD_BLKCNT),A ; ... AND SAVE IT LD (SD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS -#IF (SDTRACE == 1) +#IF (IDETRACE == 1) LD HL,SD_PRTERR ; SET UP SD_PRTERR PUSH HL ; ... TO FILTER ALL EXITS #ENDIF - CALL SD_SELUNIT - 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 - JP SD_SECTIO ; DO SECTOR I/O + CALL SD_SELUNIT ; HARDWARE SELECTION OF TARGET UNIT + RET NZ ; ABORT ON ERROR + LD A,(SD_CMDVAL) ; GET COMMAND VALUE + CP SD_CMD_READ_SNGL_BLK ; IS THIS A READ? + CALL NZ,SD_CHKWP ; CHECK FOR WRITE PROTECT IF NOT A READ + JP NZ,SD_WRTPROT ; HANDLE WRITE PROTECT ERR + LD A,(SD_BLKCNT) ; BLOCK COUNT TO A + LD E,A ; ... AND TO E IN CASE OF ZERO ERR BELOW + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT +SD_IO1: + PUSH BC ; SAVE COUNTERS + LD A,(SD_CMDVAL) ; SET COMMAND + LD C,A ; ... AND PUT IN C + CALL SD_SECTIO ; DO SECTOR I/O + JR NZ,SD_IO2 ; IF ERROR, SKIP INCREMENT + LD HL,HSTLBA ; POINT TO 32-BIT CURRENT LBA + PUSH HL ; SAVE POINTER + CALL LD32 ; LOAD 32-BIT LBA INTO DE:HL + CALL INC32 ; INCREMENT LBA FOR NEXT I/O + POP BC ; RECOVER LBA POINTER INTO BC + CALL ST32 ; AND SAVE IT + LD HL,SD_DSKBUF+1 ; POINT TO MSB OF BUFFER ADR + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + XOR A ; SIGNAL SUCCESS +SD_IO2: + POP BC ; RECOVER COUNTERS + JR NZ,SD_IO3 ; IF ERROR, BAIL OUT + INC C ; BUMP COUNT OF SECTORS READ + DJNZ SD_IO1 ; LOOP AS NEEDED +SD_IO3: + LD E,C ; SECTOR READ COUNT TO E + LD HL,(SD_DSKBUF) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET ; AND RETURN, A HAS RETURN CODE +; +; ; SD_STATUS: ; RETURN UNIT STATUS @@ -1692,6 +1728,8 @@ SD_STR_TYPESDXC .TEXT "SDXC$" ; SD_OPRVAL .DB 0 ; CURRENT OPR REG VALUE SD_LCNT .DB 0 ; LOOP COUNTER +SD_CMDVAL .DB 0 ; PENDING COMMAND FOR IO FUCNTIONS +SD_BLKCNT .DB 0 ; BLOCK COUNT REQUESTED FOR IO FUNCTIONS ; SD_BUF .FILL 16,0 ; WORK BUFFER ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 5b5894fc..8e8365b9 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -102,7 +102,8 @@ PPIDEMODE_SBC .EQU 1 ; STANDARD SBC PARALLEL PORT PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC -PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE +PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE STANDARD $20 IO BASE +PPIDEMODE_SMB .EQU 6 ; RC2014 PPIDE SMB $E0 IO BASE ; ; SD MODE SELECTIONS ; diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 8b5a7142..bb7e0682 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -900,3 +900,26 @@ ST32: LD (BC),A POP AF RET +; +; INC/ADD/DEC/SUB 32 BIT VALUE IN DE:HL +; FOR ADD/SUB, OPERAND IS IN BC +; +INC32: + LD BC,1 +ADD32: + ADD HL,BC + RET NC + INC DE + RET +; +DEC32: + LD BC,1 +SUB32: + OR A + SBC HL,BC + RET NC + DEC DE + RET + + +