From 883dab7e9721509d82cb1514f671982274f5d5f3 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 1 Oct 2023 17:22:19 -0700 Subject: [PATCH] ROMless Operation Overhaul - Implement new approach to ROMless boot and operation. Still missing the ability to seed the RAM disk. - Tweaks to CH driver --- Source/CBIOS/cbios.asm | 33 ++-- Source/CPM3/diskio.z80 | 42 ++--- Source/CPM3/genbnk.dat | 70 ++++----- Source/CPM3/genres.dat | 2 +- Source/CPM3/move.z80 | 25 ++- Source/HBIOS/Bank Layout.txt | 65 ++++++++ Source/HBIOS/Build.cmd | 10 +- Source/HBIOS/Makefile | 12 +- Source/HBIOS/ROM Layout.txt | 39 ----- Source/HBIOS/ch.asm | 293 ++++++++++++++++++++--------------- Source/HBIOS/dsrtc.asm | 2 + Source/HBIOS/hbios.asm | 91 ++--------- Source/HBIOS/hbios.inc | 4 +- Source/HBIOS/md.asm | 41 +++-- Source/HBIOS/romldr.asm | 7 +- Source/HBIOS/std.asm | 75 +++++---- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 18 files changed, 408 insertions(+), 407 deletions(-) create mode 100644 Source/HBIOS/Bank Layout.txt delete mode 100644 Source/HBIOS/ROM Layout.txt diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index b296bb0d..6a52d97a 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -2529,24 +2529,21 @@ MD_INIT: ; UDPATE THE RAM/ROM DPB STRUCTURES BASED ON HARDWARE ; #IFDEF PLTWBW - ; TODO: HANDLE DISABLED RAM/ROM DISK BETTER. - ; IF RAM OR ROM DISK ARE DISABLED, BELOW WILL STILL - ; TRY TO ADJUST THE DPB BASED ON RAM BANK CALCULATIONS. - ; IT SHOULD NOT MATTER BECAUSE THE DPB SHOULD NEVER BE - ; USED. IT WOULD BE BETTER TO GET RAMD0/ROMD0 AND - ; RAMDN/ROMDN FROM THE HCB AND USE THOSE TO CALC THE - ; DPB ADJUSTMENT. IF DN-D0=0, BYPASS ADJUSTMENT. - LD A,(HCB + HCB_ROMBANKS) ; ROM BANK COUNT - SUB 4 ; REDUCE BANK COUNT BY RESERVED PAGES - LD IX,DPB_ROM ; ADDRESS OF DPB - CALL MD_INIT1 ; FIX IT UP -; - LD A,(HCB + HCB_RAMBANKS) ; RAM BANK COUNT - SUB 8 ; REDUCE BANK COUNT BY RESERVED PAGES - LD IX,DPB_RAM ; ADDRESS OF DPB - CALL MD_INIT1 ; FIX IT UP -; - JR MD_INIT4 ; DONE + ; NOTE: ROM AND/OR RAM DISK MAY NOT BE ACTIVE, BUT WE GO + ; AHEAD AND UPDATE BOTH DPBS ANYWAY. IT CAUSES NO HARM SINCE + ; INACTIVE RAM/ROM DISK WILL NEVER BE ACCESSED. +; + ; ROM DISK + LD A,(HCB + HCB_ROMD_BNKS) ; ROM DISK SIZE IN BANKS + LD IX,DPB_ROM ; ADDRESS OF DPB + CALL MD_INIT1 ; FIX IT UP +; + ; RAM DISK + LD A,(HCB + HCB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS + LD IX,DPB_RAM ; ADDRESS OF DPB + CALL MD_INIT1 ; FIX IT UP +; + JR MD_INIT4 ; DONE ; MD_INIT1: ; diff --git a/Source/CPM3/diskio.z80 b/Source/CPM3/diskio.z80 index 2d87a132..08ee1554 100644 --- a/Source/CPM3/diskio.z80 +++ b/Source/CPM3/diskio.z80 @@ -355,38 +355,30 @@ dpb$hdnew: ; 8MB Hard Disk Drive (new format) ; called for first time initialization. dsk$init: - ; TODO: Handle disabled RAM/ROM disk better. - ; If RAM or ROM disk are disabled, below will still - ; try to adjust the DPB based on RAM bank calculations. - ; It should not matter because the DPB should never be - ; used. It would be better to get RAMD0/ROMD0 and - ; RAMDN/ROMDN from the HCB and use those to calc the - ; DPB adjustment. If DN-D0=0, bypass adjustment. - ld b,0FAh ; HBIOS Peek Function - ld a,(@hbbio) ; HBIOS bank id - ld d,a ; ... goes in D - ld hl,10Ch ; Offset 10Ch is ROM bank cnt - rst 08 ; Call HBIOS, value in E - ld a,e ; move count to accum - sub 4 ; reduce by # reserved banks - ld ix,dpb$rom ; address of DPB + + ; NOTE: ROM and/or RAM disk may not be active, but we go + ; ahead and update both DPBs anyway. It causes no harm since + ; inactive RAM/ROM disk will never be accessed. + + ld hl,1DFh ; ROM disk bank cnt in HCB + ld ix,dpb$rom ; address of ROM Disk DPB call dsk$init1 ; fix it up - + ld hl,1DDh ; RAM dsik bank cnt in HCB + ld ix,dpb$ram ; address of RAM Disk DPB + call dsk$init1 ; fix it up + ret ; done + +dsk$init1: + ; Get bank count of RAM/ROM disk ld b,0FAh ; HBIOS Peek Function ld a,(@hbbio) ; HBIOS bank id ld d,a ; ... goes in D - ld hl,10Bh ; Offset 10Bh is RAM bank cnt rst 08 ; Call HBIOS, value in E - ld a,e ; move count to accum - sub 8 ; reduce by # reserved banks - ld ix,dpb$ram ; address of DPB - call dsk$init1 ; fix it up + ;ld a,e ; move count to accum - ret ; done - -dsk$init1: ; Setup HL with bank count - ld l,a ; lsb + ;ld l,a ; lsb + ld l,e ; lsb ld h,0 ; msb is always zero ; Update EXM field diff --git a/Source/CPM3/genbnk.dat b/Source/CPM3/genbnk.dat index 4dccf1fb..cd362fb3 100644 --- a/Source/CPM3/genbnk.dat +++ b/Source/CPM3/genbnk.dat @@ -8,12 +8,12 @@ MEMTOP = FD BNKSWT = Y COMBAS = 80 LERROR = Y -NUMSEGS = 04 +NUMSEGS = 02 MEMSEG00 = 01,17,00 MEMSEG01 = 0E,72,02 MEMSEG02 = 01,7F,03 -MEMSEG03 = 01,7F,04 -MEMSEG04 = 01,7F,05 +MEMSEG03 = 00,C0,04 +MEMSEG04 = 00,C0,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 @@ -25,38 +25,38 @@ MEMSEG0C = 00,C0,0D MEMSEG0D = 00,C0,0E MEMSEG0E = 00,C0,0F MEMSEG0F = 00,C0,10 -HASHDRVA = Y -HASHDRVB = Y -HASHDRVC = Y -HASHDRVD = Y -HASHDRVE = Y -HASHDRVF = Y -HASHDRVG = Y -HASHDRVH = Y -HASHDRVI = Y -HASHDRVJ = Y -HASHDRVK = Y -HASHDRVL = Y -HASHDRVM = Y -HASHDRVN = Y -HASHDRVO = Y -HASHDRVP = Y -ALTBNKSA = Y -ALTBNKSB = Y -ALTBNKSC = Y -ALTBNKSD = Y -ALTBNKSE = Y -ALTBNKSF = Y -ALTBNKSG = Y -ALTBNKSH = Y -ALTBNKSI = Y -ALTBNKSJ = Y -ALTBNKSK = Y -ALTBNKSL = Y -ALTBNKSM = Y -ALTBNKSN = Y -ALTBNKSO = Y -ALTBNKSP = Y +HASHDRVA = N +HASHDRVB = N +HASHDRVC = N +HASHDRVD = N +HASHDRVE = N +HASHDRVF = N +HASHDRVG = N +HASHDRVH = N +HASHDRVI = N +HASHDRVJ = N +HASHDRVK = N +HASHDRVL = N +HASHDRVM = N +HASHDRVN = N +HASHDRVO = N +HASHDRVP = N +ALTBNKSA = N +ALTBNKSB = N +ALTBNKSC = N +ALTBNKSD = N +ALTBNKSE = N +ALTBNKSF = N +ALTBNKSG = N +ALTBNKSH = N +ALTBNKSI = N +ALTBNKSJ = N +ALTBNKSK = N +ALTBNKSL = N +ALTBNKSM = N +ALTBNKSN = N +ALTBNKSO = N +ALTBNKSP = N NDIRRECA = 08 NDIRRECB = 00 NDIRRECC = 00 diff --git a/Source/CPM3/genres.dat b/Source/CPM3/genres.dat index d1e1103d..f08fb7f0 100644 --- a/Source/CPM3/genres.dat +++ b/Source/CPM3/genres.dat @@ -8,7 +8,7 @@ MEMTOP = FD BNKSWT = N COMBAS = 00 LERROR = Y -NUMSEGS = 03 +NUMSEGS = 01 MEMSEG00 = 00,80,00 MEMSEG01 = 00,C0,02 MEMSEG02 = 00,C0,03 diff --git a/Source/CPM3/move.z80 b/Source/CPM3/move.z80 index 73cc13bb..19ebbdff 100644 --- a/Source/CPM3/move.z80 +++ b/Source/CPM3/move.z80 @@ -65,12 +65,11 @@ xbnkmov: ; ------------ -------------- ------- ; COMMON BID_COM 8Fh ; 0: OS/BUFS BID_USR 8Eh -; BID_BIOS 8Dh -; 1: TPA BID_AUX 8Ch -; 2: BUFS BID_AUX-1 8Bh -; 3: BUFS BID_AUX-2 8Ah -; 4: BUFS BID_AUX-3 89h -; 5: BUFS BID_AUX-4 88h +; 1: TPA BID_AUX 8Dh +; 2: BUFS BID_AUX-1 8Ch +; 3: BUFS BID_AUX-2 8Bh +; 4: BUFS BID_AUX-3 8Ah +; 5: BUFS BID_AUX-4 89h ; ; N.B., Below BID_AUX is considered RAM disk bank. Need to ; make sure RAM disk is kept small enough to stay below @@ -80,17 +79,13 @@ xbnkmov: ; to adjust for real size of RAM in system ; ?bnkxlt: - or a - jr z,bank0 - neg ; 2 -> -2 - add a,8Dh ; 8Dh - 2 = 8Bh -@hbbio equ $ - 1 ; BID_BIOS - ret -bank0: - ld a,8Eh ; 0 -> 8Eh + neg ; ex: 2 -> -2 + add a,8Eh ; ex: 8Eh - 2 = 8Ch @hbusr equ $ - 1 ; BID_USR ret - + +@hbbio db 0 ; BID_BIOS + movtyp db 0 ; non-zero for interbank move movbnks: diff --git a/Source/HBIOS/Bank Layout.txt b/Source/HBIOS/Bank Layout.txt new file mode 100644 index 00000000..ac746b39 --- /dev/null +++ b/Source/HBIOS/Bank Layout.txt @@ -0,0 +1,65 @@ +ROM Bank Layout + +Bank ID Module Start Size +------ ------ ------ ------ +0x00 hbios 0x0000 0x8000 + 0x8000 + +0x01 loader 0x0000 0x1000 + dbgmon 0x1000 0x2000 + cpm22 0x2000 0x3000 + zsys 0x5000 0x3000 + 0x8000 + +0x02 forth 0x0000 0x1700 + basic 0x1700 0x2000 + tbasic 0x3700 0x0900 + game 0x4000 0x0900 + egg 0x4900 0x0200 + netboot 0x4B00 0x1000 + updater 0x5B00 0x0D00 + usrrom 0x6800 0x1800 + 0x8000 + +0x03 imgpad2 0x0000 0x8000 + 0x8000 + +0x04 - N ROM Disk Data + + +RAM Bank Layout + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81-0x8B RAM Disk Data +0x8C CP/M 3 Buffers +0x8D CP/M 3 OS +0x8E User TPA +0x8F Common + + +ROMless Bank Layout + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81 Loader, DbgMon, CP/M 2.2, ZSDOS +0x82 ROM Apps +0x83 More ROM Apps +0x84-0x8B RAM Disk Data +0x8C CP/M 3 Buffers +0x8D CP/M 3 OS +0x8E User TPA +0x8F Common + + +ROMless Tiny Bank Layout (128K) +NOTE: No ROM Apps, No CP/M 3 support + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81 Loader, DbgMon, CP/M 2.2, ZSDOS +0x82 User TPA +0x83 Common diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 3807e580..200a471b 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -110,10 +110,8 @@ copy /b romldr.bin + dbgmon.bin + ..\zsdos\zsys_wbw.bin osimg_small.bin || exit :: should yield a result of zero. :: -if %ROMSize% gtr 0 ( - for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do ( - "%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o %%f -Binary || exit /b - ) +for %%f in (hbios_rom.bin osimg.bin osimg1.bin osimg2.bin) do ( + "%TOOLS%\srecord\srec_cat.exe" %%f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o %%f -Binary || exit /b ) :: @@ -137,8 +135,8 @@ if %ROMSize% gtr 0 ( copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b ) else ( - copy /b hbios_rom.bin + osimg_small.bin %ROMName%.rom || exit /b - copy /b hbios_rom.bin + osimg_small.bin %ROMName%.upd || exit /b + copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.rom || exit /b + copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b ) diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index fbb67d93..1eb3302d 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -67,11 +67,9 @@ $(OBJECTS) : $(ROMDEPS) else \ cat imgpad2.bin >osimg2.bin ; \ fi ; \ - if [ $(ROMSIZE) -gt 0 ] ; then \ - for f in hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ; do \ - srec_cat $$f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $$f -Binary ; \ - done \ - fi \ + for f in hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ; do \ + srec_cat $$f -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $$f -Binary ; \ + done \ fi if [ $(ROM_PLATFORM) = UNA ] ; then \ cp osimg.bin $(DEST)/UNA_WBW_SYS.bin ; \ @@ -83,8 +81,8 @@ $(OBJECTS) : $(ROMDEPS) cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \ cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \ else \ - cat hbios_rom.bin osimg_small.bin > $(ROMNAME).rom ; \ - cat hbios_rom.bin osimg_small.bin > $(ROMNAME).upd ; \ + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).rom ; \ + cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \ cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \ fi \ fi diff --git a/Source/HBIOS/ROM Layout.txt b/Source/HBIOS/ROM Layout.txt deleted file mode 100644 index 5fb0a7b4..00000000 --- a/Source/HBIOS/ROM Layout.txt +++ /dev/null @@ -1,39 +0,0 @@ -RomWBW ROM Layout - -Bank Module Start Size ------- ------ ------ ------ -0 hbios 0x0000 0x8000 - 0x8000 - -1 loader 0x0000 0x1000 - dbgmon 0x1000 0x2000 - cpm22 0x2000 0x3000 - zsys 0x5000 0x3000 - 0x8000 - -2 forth 0x0000 0x1700 - basic 0x1700 0x2000 - tbasic 0x3700 0x0900 - game 0x4000 0x0900 - egg 0x4900 0x0200 - netboot 0x4B00 0x1000 - updater 0x5B00 0x0D00 - usrrom 0x6800 0x1800 - 0x8000 - -3 imgpad2 0x0000 0x8000 - 0x8000 - -4 - N ROM Disk Data - - -RomWBW RAM Layout - -Bank ID Usage Physical Address -------- ------ ---------------- -0x80-0x87 RAM Disk Data 0x80000-0xBFFFF -0x88-0x8B CP/M 3 Buffers 0xC0000-0xDFFFF -0x8C CP/M 3 OS 0xE0000-0xE7FFF -0x8D RomWBW HBIOS 0xE8000-0xEFFFF -0x8E User TPA 0xF0000-0xF7FFF -0x8F Common 0xF8000-0xFFFFF diff --git a/Source/HBIOS/ch.asm b/Source/HBIOS/ch.asm index 66191aa8..8e4eca04 100644 --- a/Source/HBIOS/ch.asm +++ b/Source/HBIOS/ch.asm @@ -17,13 +17,6 @@ ; on CH376) resolved the issue for some devices, so that has been ; added to the RESET routine when using CH376. ; -; - The CH37x can get in an inconsistent state. The RESET_ALL command -; will clear this, but the RESET_ALL command is very problematic on -; the CH376. On the CH376, the hardware reset takes a very long -; time (much longer than the documentation suggests). It seems to -; work fine on the CH375, but since you don't know what chip you -; are dealing with at that point, I have given up on using it. -; ; TODO: ; - Implement auto-recovery on error status. ; @@ -45,8 +38,12 @@ CHTYP_376 .EQU 2 ; CH376 CH_CMD_VER .EQU $01 ; GET IC VER CH_CMD_RESET .EQU $05 ; FULL CH37X RESET CH_CMD_EXIST .EQU $06 ; CHECK EXISTS +CH_CMD_MAXLUN .EQU $0A ; GET MAX LUN NUMBER CH_CMD_PKTSEC .EQU $0B ; SET PACKETS PER SECTOR +CH_CMD_SETRETRY .EQU $0B ; SET RETRIES CH_CMD_MODE .EQU $15 ; SET USB MODE +CH_CMD_TSTCON .EQU $16 ; TEST CONNECT +CH_CMD_ABRTNAK .EQU $17 ; ABORT DEVICE NAK RETRIES CH_CMD_STAT .EQU $22 ; GET STATUS CH_CMD_RD6 .EQU $27 ; READ USB DATA (375 & 376) CH_CMD_RD5 .EQU $28 ; READ USB DATA (375) @@ -56,6 +53,7 @@ CH_CMD_DSKMNT .EQU $31 ; DISK MOUNT CH_CMD_DSKCAP .EQU $3E ; DISK CAPACITY CH_CMD_AUTOSET .EQU $4D ; USB AUTO SETUP CH_CMD_DSKINIT .EQU $51 ; DISK INIT +CH_CMD_DSKRES .EQU $52 ; DISK RESET CH_CMD_DSKSIZ .EQU $53 ; DISK SIZE CH_CMD_DSKRD .EQU $54 ; DISK READ CH_CMD_DSKRDGO .EQU $55 ; CONTINUE DISK READ @@ -132,7 +130,7 @@ CH_INIT2: CALL PRTHEXBYTE ; DISPLAY IT ; ;CALL CH_FLUSH ; FLUSH DEVICE OUTPUT QUEUE - ;CALL CH_RESET ; FULL CH37X RESET + CALL CH_RESET ; FULL CH37X RESET CALL CH_DETECT ; DETECT CHIP PRESENCE JR Z,CH_INIT3 ; GO AHEAD IF CHIP FOUND LD DE,CH_STR_NOHW ; NOT PRESENT @@ -226,18 +224,18 @@ CH_WR: ; SMALL DELAY REQUIRED AT STRATEGIC LOCATIONS ; CH_NAP: - ;CALL DELAY ; *DEBUG* - ;CALL DELAY ; *DEBUG* - ;CALL DELAY ; *DEBUG* JP DELAY ; ; POLL WAITING FOR INTERRUPT ; CH_POLL: + PUSH BC ; SAVE BC PUSH HL ; SAVE HL CALL CH_NAP ; SMALL DELAY - LD HL,$8000 ; POLL LOOP COUNTER - LD HL,0 ; *DEBUG* + LD A,(CB_CPUMHZ) ; USE CPU SPEED AS CPU + LD B,A ; ... SPEED COMP COUNTER +CH_POLL0: + LD HL,$8000 ; PRIMARY LOOP COUNTER CH_POLL1: CALL CH_STAT ; GET INT STATUS BIT 7,A ; CHECK BIT @@ -245,9 +243,10 @@ CH_POLL1: DEC HL ; DECREMENT COUNTER LD A,H ; CHECK OR L ; ... LOOP COUNTER - JR NZ,CH_POLL1 ; LOOP AS NEEDED - ;CALL PC_ASTERISK ; *DEBUG* + JR NZ,CH_POLL1 ; INNER LOOP AS NEEDED + DJNZ CH_POLL0 ; OUTER LOOP AS NEEDED POP HL ; RESTORE HL + POP BC ; RESTORE BC OR $FF ; FLAG TIMEOUT RET ; AND RETURN CH_POLL2: @@ -255,7 +254,15 @@ CH_POLL2: CALL CH_CMD ; SEND IT CALL CH_NAP ; SMALL DELAY CALL CH_RD ; GET RESULT + ;PUSH AF ; *DEBUG* + ;LD A,B ; *DEBUG* + ;CALL PC_SPACE ; *DEBUG* + ;CALL PC_LBKT ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + ;CALL PC_RBKT ; *DEBUG* + ;POP AF ; *DEBUG* POP HL ; RESTORE HL + POP BC ; RESTORE BC RET ; AND RETURN ; ; SEND READ USB DATA COMMAND @@ -294,17 +301,12 @@ CH_CMD_WR1: ; ; PERFORM A FULL HARDWARE RESET ON CH37X ; -; WARNING: CH376 CAN TAKE A VERY LONG TIME TO PROCESS THIS -; COMMAND. PROBABLY DON'T WANT TO USE THIS. -; CH_RESET: ;PRTS("\r\nHW RESET:$") ; *DEBUG* PUSH DE LD A,CH_CMD_RESET CALL CH_CMD - ; DOC SAYS 40MS, BUT I FOUND THAT TO BE INSUFFICIENT - ;LD DE,2500 ; 16US * 2500 = 40MS - LD DE,10000 ; 16US * 10000 = 160MS + LD DE,2500 ; 16US * 2500 = 40MS CALL VDELAY ;CALL CH_RD ; *DEBUG* ;CALL PC_SPACE ; *DEBUG* @@ -658,20 +660,33 @@ CHUSB_RESET: ; INITIALIZE DISK LD B,24 ; TRY A FEW TIMES CHUSB_RESET1: + ;PRTS("\n\rDSKINIT:$") ; *DEBUG* LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND CALL CH_CMD ; SEND IT - LD DE,10000 ; 10000 * 16 = 160MS ??? + LD DE,10000 ; 10000 * 16 = 160US ??? + LD DE,20000 ; 10000 * 16 = 160US ??? + LD DE,12500 ; 1250 * 16 = 200US ??? CALL VDELAY ; DELAY CALL CH_POLL ; WAIT FOR RESULT ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* CP $14 ; SUCCESS? - JR Z,CHUSB_RESET2 ; IF SO, MOVE ON + JR Z,CHUSB_RESET2 ; IF SO, CONTINUE + ;JR Z,CHUSB_RESET1A ; IF SO, CHECK READY CP $16 ; NO MEDIA JP Z,CHUSB_NOMEDIA ; HANDLE IT CALL CH_NAP ; SMALL DELAY DJNZ CHUSB_RESET1 ; LOOP AS NEEDED JP CHUSB_TO ; HANDLE TIMEOUT +;;;; +;;;CHUSB_RESET1A: +;;; CALL CHUSB_DSKRES ; DISK RESET +;;; CP $14 ; GOOD? +;;; JR Z,CHUSB_RESET2 +;;; CALL CHUSB_DSKRDY ; CHECK IF DISK READY +;;; CP $14 ; GOOD? +;;; JR Z,CHUSB_RESET2 ; IF SO, MOVE ON +;;; DJNZ CHUSB_RESET1 ; KEEP TRYING ; CHUSB_RESET2: ; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE @@ -680,95 +695,13 @@ CHUSB_RESET2: CP CHTYP_376 ; IS CH376? CALL Z,CHUSB_DSKMNT ; IF SO, ISSUE MOUNT ;CALL CHUSB_AUTOSET ; *DEBUG* -; - ; GET AND STORE DISK CAPACITY - ;JP CHUSB_RESET2D ; *DEBUG* - ;LD A,(IY+CH_TYPE) ; GET DEVICE TYPE - ;CP CHTYP_375 - ;JR CHUSB_RESET2A - ;CP CHTYP_376 - ;JR CHUSB_RESET2B - ;JP CHUSB_CMDERR -; -CHUSB_RESET2A: - ; CH375 DISK SIZE - LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND - CALL CH_CMD ; SEND IT - CALL CH_POLL ; WAIT FOR RESULT - ;CALL PC_SPACE ; *DEBUG* - ;CALL PRTHEXBYTE ; *DEBUG* - CP $14 ; SUCCESS? - ;JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR - JR NZ,CHUSB_RESET2D ; FAKE THE CAPACITY - CALL CH_CMD_RD ; SEND READ USB DATA CMD - CALL CH_RD ; GET RD DATA LEN - ;CALL PC_SPACE ; *DEBUG* - ;CALL PRTHEXBYTE ; *DEBUG* - CP $08 ; MAKE SURE IT IS 8 - JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR - LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET - CALL LDHLIYA ; HL := IY + A, REG A TRASHED - PUSH HL ; SAVE ADDRESS - CALL CH_RD - LD D,A - CALL CH_RD - LD E,A - CALL CH_RD - LD H,A - CALL CH_RD - LD L,A - CALL CH_RD - CALL CH_RD - CALL CH_RD - CALL CH_RD - POP BC ; RECOVER ADDRESS TO BC - CALL ST32 ; STORE IT - CALL CH_FLUSH ; DISCARD REMAINING CHARS - JR CHUSB_RESET3 ; CONTINUE -; -CHUSB_RESET2B: - ; CH376 DISK CAPACITY - LD A,CH_CMD_DSKCAP ; DISK CAPACITY COMMAND - CALL CH_CMD ; SEND IT - CALL CH_POLL ; WAIT FOR RESULT - ;CALL PC_SPACE ; *DEBUG* - ;CALL PRTHEXBYTE ; *DEBUG* - CP $14 ; SUCCESS? - ;JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR - JR NZ,CHUSB_RESET2D ; FAKE THE CAPACITY - CALL CH_CMD_RD ; SEND USB READ DATA - CALL CH_RD ; GET RD DATA LEN - ;CALL PC_SPACE ; *DEBUG* - ;CALL PRTHEXBYTE ; *DEBUG* - CP $04 ; MAKE SURE IT IS 8 - JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR - LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET - CALL LDHLIYA ; HL := IY + A, REG A TRASHED - CALL CH_RD - LD B,4 ; 4 BYTES -CHUSB_RESET2C: - LD (HL),A - INC HL - CALL CH_RD - DJNZ CHUSB_RESET2C - JR CHUSB_RESET3 ; CONTINUE -; -CHUSB_RESET2D: - ; OLDER USB STICKS SEEM TO FAIL (PRIMARILY ON CH375). - ; FAILURE TO GET A DISK CAPACITY SHOULD NOT PREVENT THE - ; USE OF THE DISK. SO, WE PUNT, AND JUST PLUG IN 1GB. - LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET - CALL LDHLIYA ; HL := IY + A, REG A TRASHED - PUSH HL ; SAVE POINTER - LD DE,$0020 ; 1GB IS $20000 SECTORS - LD HL,$0000 - POP BC ; RECOVER POINTER - CALL ST32 ; SAVE FAKE CAPACITY - ; FALL THRU -; -CHUSB_RESET3: + ;CALL CHUSB_TSTCON ; *DEBUG* + ;CALL CHUSB_MAXLUN ; *DEBUG* ;CALL CHUSB_DSKRDY ; *DEBUG* ;CALL CHUSB_DSKINQ ; *DEBUG* +;; + CALL CHUSB_DSKSIZ ; GET AND RECORD DISK SIZE + RET NZ ; ABORT ON ERROR ; ; SET STATUS AND RETURN XOR A ; CLEAR STATUS @@ -847,12 +780,11 @@ CHUSB_GEOM: ; CH37X HELPER ROUTINES ; ; -; PERFORM DISK INQUIRY -; BASICALLY THE SCSI INQUIRY COMMAND +; PERFORM DISK MOUNT ; -CHUSB_DSKINQ: - ;PRTS("\n\rINQUIRY:$") ; *DEBUG* - LD A,CH_CMD_DSKINQ ; DISK QUERY +CHUSB_DSKMNT: + ;PRTS("\n\rMOUNT:$") ; *DEBUG* + LD A,CH_CMD_DSKMNT ; DISK QUERY CALL CH_CMD ; DO IT CALL CH_POLL ; WAIT FOR RESPONSE ;CALL PC_SPACE ; *DEBUG* @@ -863,11 +795,11 @@ CHUSB_DSKINQ: CALL CH_RD ; GET LENGTH LD B,A ; LOOP COUNTER LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA -DSKINQ1: +DSKMNT1: CALL CH_RD ; GET A BYTE LD (HL),A ; SAVE IT INC HL ; BUMP BUF PTR - DJNZ DSKINQ1 ; LOOP FOR ALL DATA + DJNZ DSKMNT1 ; LOOP FOR ALL DATA ; ;LD DE,HB_WRKBUF ; *DEBUG* ;CALL DUMP_BUFFER ; *DEBUG* @@ -875,19 +807,59 @@ DSKINQ1: ;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX ;LD HL,HB_WRKBUF + 8 ;LD B,28 -DSKINQ2: +DSKMNT2: ;LD A,(HL) ;INC HL ;CALL COUT - ;DJNZ DSKINQ2 + ;DJNZ DSKMNT2 ; RET ; -; PERFORM DISK MOUNT +; PERFORM DISK SIZE ; -CHUSB_DSKMNT: - ;PRTS("\n\rMOUNT:$") ; *DEBUG* - LD A,CH_CMD_DSKMNT ; DISK QUERY +CHUSB_DSKSIZ: + ;PRTS("\n\rDSKSIZ:$") ; *DEBUG* + LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND + CALL CH_CMD ; SEND IT + CALL CH_POLL ; WAIT FOR RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; SUCCESS? + JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + CALL CH_CMD_RD ; SEND READ USB DATA CMD + CALL CH_RD ; GET RD DATA LEN + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* + CP $08 ; MAKE SURE IT IS 8 + JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR + LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + PUSH HL ; SAVE ADDRESS + CALL CH_RD + LD D,A + CALL CH_RD + LD E,A + CALL CH_RD + LD H,A + CALL CH_RD + LD L,A + CALL CH_RD + CALL CH_RD + CALL CH_RD + CALL CH_RD + POP BC ; RECOVER ADDRESS TO BC + CALL ST32 ; STORE IT + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +#IF FALSE +; +; PERFORM DISK INQUIRY +; BASICALLY THE SCSI INQUIRY COMMAND +; +CHUSB_DSKINQ: + ;PRTS("\n\rINQUIRY:$") ; *DEBUG* + LD A,CH_CMD_DSKINQ ; DISK QUERY CALL CH_CMD ; DO IT CALL CH_POLL ; WAIT FOR RESPONSE ;CALL PC_SPACE ; *DEBUG* @@ -898,11 +870,11 @@ CHUSB_DSKMNT: CALL CH_RD ; GET LENGTH LD B,A ; LOOP COUNTER LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA -DSKMNT1: +DSKINQ1: CALL CH_RD ; GET A BYTE LD (HL),A ; SAVE IT INC HL ; BUMP BUF PTR - DJNZ DSKMNT1 ; LOOP FOR ALL DATA + DJNZ DSKINQ1 ; LOOP FOR ALL DATA ; ;LD DE,HB_WRKBUF ; *DEBUG* ;CALL DUMP_BUFFER ; *DEBUG* @@ -910,23 +882,56 @@ DSKMNT1: ;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX ;LD HL,HB_WRKBUF + 8 ;LD B,28 -DSKMNT2: +DSKINQ2: ;LD A,(HL) ;INC HL ;CALL COUT - ;DJNZ DSKMNT2 + ;DJNZ DSKINQ2 +; + RET +; +; PERFORM SET RETRIES +; +CHUSB_SETRETRY: + ;PRTS("\n\rSETRETRY:$") ; *DEBUG* + LD A,CH_CMD_SETRETRY ; DISK READY + CALL CH_CMD ; DO IT + CALL CH_NAP + LD A,$25 ; CONSTANT + CALL CH_WR ; SEND IT + CALL CH_NAP + LD A,$BF ; MAX + CALL CH_WR + CALL CH_NAP + CALL CH_RD ; GET RESULT + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM DISK RESET +; +CHUSB_DSKRES: + ;PRTS("\n\rDSKRES:$") ; *DEBUG* + LD A,CH_CMD_DSKRES ; DISK READY + CALL CH_CMD ; DO IT + CALL CH_POLL ; WAIT FOR RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* ; RET ; ; PERFORM DISK READY ; CHUSB_DSKRDY: - ;PRTS("\n\rREADY:$") ; *DEBUG* + ;PRTS("\n\rDSKRDY:$") ; *DEBUG* LD A,CH_CMD_DSKRDY ; DISK READY CALL CH_CMD ; DO IT CALL CH_POLL ; WAIT FOR RESPONSE ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* + CP $14 ; *DEBUG* + JR NZ,CHUSB_DSKRDY ; *DEBUG* ; RET ; @@ -936,12 +941,44 @@ CHUSB_AUTOSET: ;PRTS("\n\rAUTOSET:$") ; *DEBUG* LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB CALL CH_CMD ; DO IT + CALL LDELAY ; *DEBUG* CALL CH_POLL ; WAIT FOR RESPONSE ;CALL PC_SPACE ; *DEBUG* ;CALL PRTHEXBYTE ; *DEBUG* ; RET ; +; PERFORM TEST CONNECT +; +CHUSB_TSTCON: + ;PRTS("\n\rTSTCON:$") ; *DEBUG* + LD A,CH_CMD_TSTCON ; TEST USB DEVICE CONNECT + CALL CH_CMD ; DO IT + CALL CH_NAP ; WAIT A BIT + CALL CH_RD ; GET RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +; PERFORM GET MAX LUN +; +CHUSB_MAXLUN: + ;PRTS("\n\rMAXLUN:$") ; *DEBUG* + LD A,CH_CMD_MAXLUN ; TEST USB DEVICE CONNECT + CALL CH_CMD ; DO IT + CALL CH_NAP ; WAIT A BIT + LD A,$38 ; CONSTANT + CALL CH_WR ; SEND IT + CALL CH_NAP + CALL CH_RD ; GET RESPONSE + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* +; + RET +; +#ENDIF +; ; ERROR HANDLERS ; ; diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index be29dc5e..d3afd65e 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -145,6 +145,8 @@ DSRTC_PREINIT: ;OR DSRTC_IDLE ; SET OUR IDLE BITS ;LD (DSRTC_OPRVAL),A ; SAVE IT ; + XOR A ; ZERO + LD (DSRTC_STAT),A ; CLEAR STATUS CALL DSRTC_DETECT ; HARDWARE DETECTION LD (DSRTC_STAT),A ; SAVE RESULT RET NZ ; ABORT IF ERROR diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 5993664a..9458d9a0 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -318,9 +318,9 @@ CB_BIDUSR .DB BID_USR CB_BIDBIOS .DB BID_BIOS CB_BIDAUX .DB BID_AUX CB_BIDRAMD0 .DB BID_RAMD0 -CB_BIDRAMDN .DB BID_RAMDN +CB_RAMD_BNKS .DB RAMD_BNKS CB_BIDROMD0 .DB BID_ROMD0 -CB_BIDROMDN .DB BID_ROMDN +CB_ROMD_BNKS .DB ROMD_BNKS ; .FILL (HCB + HCB_SIZ - $),0 ; PAD REMAINDER OF HCB ; @@ -1435,7 +1435,7 @@ S100MON_SKIP: ; ; THIS VALUE IS TEMPORARILY STORED AT HBX_LOC - 2 ; BECAUSE WE ARE CURRENTLY RUNNING IN ROM. AFTER WE TRANSITION HBIOS -; TO RAM, THE VALUE IS MOVED TO IT'S REAL LCOATION AT HB_APPBNK. +; TO RAM, THE VALUE IS MOVED TO IT'S REAL LOCATION AT HB_APPBNK. ; LD A,(HB_CURBNK) ; GET HB_CURBNK LD (HBX_LOC - 2),A ; ... AND SAVE TEMP FOR APPBNK @@ -1607,63 +1607,10 @@ MBC_SINGLE: ; #ENDIF ; -; IF THIS IS A ROM-LESS SYSTEM, THEN WE NEED TO COPY THE PAYLOAD -; (LOADER, MONITOR, ZSDOS) THAT HAS BEEN LOADED TO PHYSICAL RAM -; BANKS 0 AND 1 TO THE USER TPA BANK TO RUN AFTER BOOT. -; IT IS DONE PRIOR TO COPYING HBIOS TO IT'S FINAL BANK BECAUSE -; THE PAYLOAD MAY EXTEND INTO THE HBIOS OPERATING BANK. THIS -; HAPPENS PRIMARILY IN THE CASE WHERE THE -; SYSTEM HAS THE MINIMUM 128KB OF RAM. -; -#IFDEF ROMBOOT - #IF (ROMSIZE == 0) - ; - ; THE PAYLOAD IS LIKELY TO CROSS OVER THE RAM BANK 0/1 - ; BOUNDARY. BNKCPY DOES NOT HANDLE THIS BECAUSE IT ASSUMES - ; THE COMMON BANK IS USED AFTER PASSING OVER THE BANK - ; BOUNDARY. WE WORK AROUND THAT HERE BY DOING TWO COPIES. - ; THE FIRST ONE HANDLES THE PORTION OF THE PAYLOAD FROM THE - ; END OF HBIOS TO THE BANK BOUNDARY ($8000). THE SECOND - ; ONE HANDLES THE PORTION THAT EXTENDS INTO THE SECOND - ; PHYSICAL RAM BANK. -; - ; COPY PORTION OF PAYLOAD FOLLOWING HBIOS TO THE BANK - ; BOUNDARY AT $8000 INTO START OF TPA. - LD A,BID_RAM0 - LD (HB_SRCBNK),A - LD A,BID_USR - LD (HB_DSTBNK),A - LD HL,HB_END - LD DE,0 - LD BC,$8000-HB_END -; - #IF (MEMMGR == MM_Z280) - CALL Z280_BNKCPY - #ELSE - CALL HBX_BNKCPY - #ENDIF -; - ; COPY REMAINDER OF PAYLOAD EXTENDING INTO THE SECOND PHYSICAL - ; RAM BANK. NOTE THAT THE DESTINATION ADDRESS (DE) IS - ; ALREADY CORRECT FROM THE PRIOR COPY. - LD A,BID_RAM0+1 - LD (HB_SRCBNK),A - LD HL,$0000 - ; DE IS ALREADY CORRECT - LD BC,$8000-($8000-HB_END) -; - #IF (MEMMGR == MM_Z280) - CALL Z280_BNKCPY - #ELSE - CALL HBX_BNKCPY - #ENDIF -; - #ENDIF -; -#ENDIF -; ; IF ALREADY EXECUTING IN RAM, BYPASS RAM BANK INSTALLATION ; + LD A,TRUE + LD (HB_RAMFLAG),A LD A,(HB_RAMFLAG) OR A JR NZ,HB_START1 @@ -1712,10 +1659,6 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK ; NOTIFY THAT WE MADE THE TRANSITION! DIAG(DIAG_03) LED(%00000010) -; - ; SET THE IN-RAM FLAG - LD A,TRUE ; ACCUM := TRUE - LD (HB_RAMFLAG),A ; SET RAMFLAG ; ; RECOVER DATA PASSED PRIOR TO RAM TRANSITION ; (HBX_LOC - 1) = BATCOND, (HBX_LOC - 2) = APPBNK @@ -1914,6 +1857,14 @@ HB_CPU1: LD A,L LD (HB_CPUTYPE),A ; +; CLEAR DISPATCH TABLE ENTRIES +; + XOR A ; ZERO + LD (CIO_CNT),A ; CIO DEVICES + LD (DIO_CNT),A ; DIO DEVICES + LD (VDA_CNT),A ; VDA DEVICES + LD (SND_CNT),A ; SND DEVICES +; #IF (DSRTCENABLE) CALL DSRTC_PREINIT #ENDIF @@ -3104,11 +3055,7 @@ INITSYS4: ; CHAIN TO LOADER ; #IFDEF ROMBOOT - #IF (ROMSIZE > 0) LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK - #ELSE - LD A,BID_USR ; CHAIN TO USER BANK - #ENDIF #ELSE LD A,BID_USR ; CHAIN TO USER BANK #ENDIF @@ -4149,10 +4096,6 @@ SYS_RESINT: ; GO BACK TO ROM BOOT LOADER ; SYS_RESWARM: -; -#IF (ROMSIZE == 0) - JR SYS_RESCOLD -#ENDIF ; CALL SYS_RESINT ; @@ -4171,13 +4114,6 @@ SYS_RESWARM: ; SYS_RESCOLD: ; -#IF (ROMSIZE == 0) - LD DE,STR_RESTART - CALL Z,WRITESTR - DI - HALT -#ENDIF -; #IF (MEMMGR == MM_Z280) JP Z280_RESTART #ELSE @@ -7804,7 +7740,6 @@ STR_LOWBAT .DB "\r\n\r\n+++ LOW BATTERY +++$" STR_PANIC .TEXT "\r\n>>> PANIC: $" STR_SYSCHK .TEXT "\r\n>>> SYSCHK: $" STR_CONTINUE .TEXT "\r\nContinue (Y/N)? $" -STR_RESTART .TEXT "\r\n\r\n>>> Press hardware reset button to restart system\r\n\r\n$" ; #IF (DSKYENABLE) ; 'H','B','I','O',' ',' ',' ',' ' MSG_HBVER .DB $76,$7F,$30,$3F,$00,$00,$00,$00 ; "HBIO " diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 831092c2..a8233cc4 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -435,9 +435,9 @@ HCB_BIDUSR .EQU $D9 ; USER BANK (TPA) HCB_BIDBIOS .EQU $DA ; BIOS BANK (HBIOS, UBIOS) HCB_BIDAUX .EQU $DB ; AUX BANK (BPBIOS) HCB_BIDRAMD0 .EQU $DC ; FIRST BANK OF RAM DRIVE -HCB_BIDRAMDN .EQU $DD ; LAST BANK OF RAM DRIVE +HCB_RAMD_BNKS .EQU $DD ; RAM DRIVE BANK COUNT HCB_BIDROMD0 .EQU $DE ; FIRST BANK OF ROM DRIVE -HCB_BIDROMDN .EQU $DF ; LAST BANK OF ROM DRIVE +HCB_ROMD_BNKS .EQU $DF ; ROM DRIVE BANK COUNT ; ; HBIOS PROXY COMMON DATA BLOCK ; EXACTLY 32 BYTES AT $FFE0-$FFFF diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index dd5d1d79..b6f806a0 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -72,32 +72,30 @@ MD_INIT: ; #IF (MDROM) PRTS(" ROMDISK=$") -; LD HL,ROMSIZE - 128 - LD A,(HCB + HCB_ROMBANKS) ; GET NUMBER OF BANKS - SUB (TOT_ROM_RB) - LD L,A - LD H,0 ; CALCULATE RAM SIZE + LD A,(CB_ROMD_BNKS) ; ROM DISK SIZE IN BANKS + LD L,A ; PUT IN L + LD H,0 ; CALCULATE ROM DISK SIZE ADD HL,HL ; X2 ADD HL,HL ; X4 ADD HL,HL ; X8 ADD HL,HL ; X16 ADD HL,HL ; X32 + LD (MD_ROMDSIZE),HL ; SAVE ROM DISK SIZE CALL PRTDEC PRTS("KB$") #ENDIF ; #IF (MDRAM) PRTS(" RAMDISK=$") -; LD HL,RAMSIZE - 256 - LD A,(HCB + HCB_RAMBANKS) ; GET NUMBER OF BANKS - SUB (TOT_RAM_RB) ; LESS RESERVED BANKS - LD L,A - LD H,0 ; CALCULATE RAM SIZE + LD A,(CB_RAMD_BNKS) ; RAM DISK SIZE IN BANKS + LD L,A ; PUT IN L + LD H,0 ; CALCULATE RAM DISK SIZE ADD HL,HL ; X2 ADD HL,HL ; X4 ADD HL,HL ; X8 ADD HL,HL ; X16 ADD HL,HL ; X32 + LD (MD_RAMDSIZE),HL ; SAVE RAM DISK SIZE CALL PRTDEC PRTS("KB$") #ENDIF @@ -183,21 +181,18 @@ MD_CAP: ; ASSUMES THAT UNIT 0 IS RAM, UNIT 1 IS ROM SYSCHKERR(ERR_NOUNIT) ; INVALID UNIT RET MD_CAP0: - LD A,(HCB + HCB_RAMBANKS) ; POINT TO RAM BANK COUNT - LD B,TOT_RAM_RB ; SET # RESERVED RAM BANKS - JR MD_CAP2 + ; RAM DISK SIZE + LD HL,(MD_RAMDSIZE) ; SIZE IN KB + JR MD_CAP2 ; CONTINUE MD_CAP1: - LD A,(HCB + HCB_ROMBANKS) ; POINT TO ROM BANK COUNT - LD B,TOT_ROM_RB ; SET # RESERVED ROM BANKS + ; ROM DISK SIZE + LD HL,(MD_ROMDSIZE) ; SIZE IN KB MD_CAP2: - SUB B ; SUBTRACT OUT RESERVED BANKS - LD H,A ; H := # BANKS - LD E,64 ; # 512 BYTE BLOCKS / BANK - CALL MULT8 ; HL := TOTAL # 512 BYTE BLOCKS - LD DE,0 ; NEVER EXCEEDS 64K, ZERO HIGH WORD + ADD HL,HL ; CONVERT TO BLOCK COUNT + LD DE,0 ; FILL IN HIGH WORD LD BC,512 ; 512 BYTE SECTOR - XOR A - RET + XOR A ; SIGNAL SUCCESS + RET ; DONE ; ; ; @@ -1032,6 +1027,8 @@ MD_FFSEN .DB 00h ; FLASH FILES SYSTEM ENABLE ; #ENDIF ; +MD_ROMDSIZE .DW 0 +MD_RAMDSIZE .DW 0 MD_RWFNADR .DW 0 MD_DSKBUF .DW 0 MD_SRCBNK .DB 0 diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 2dfe29bb..89479466 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -140,7 +140,8 @@ start: rst 08 ; do it ld a,c ; previous bank to A ld (bid_ldr),a ; save previous bank for later - bit 7,a ; starting from ROM? + ;;;bit 7,a ; starting from ROM? + cp BID_IMG0 ; ROM startup? #endif ; #if (BIOS == BIOS_UNA) @@ -2189,7 +2190,9 @@ err: ld hl,str_err_prefix call pstr pop hl - jp pstr + call pstr + or $ff ; signal error + ret ; done ; str_err_prefix .db bel,"\r\n\r\n*** ",0 str_err_invcmd .db "Invalid command",0 diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 5bc680d0..651d3f6e 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -566,10 +566,8 @@ SYSTIM .SET TM_Z280 ; ; MEMORY BANK CONFIGURATION ; -WBW_ROM_R .EQU 128 ; 128K ; RESERVED ROM REQUIRED FOR ROMWBW -WBW_RAM_R .EQU 256 ; 256K ; RESERVED RAM REQUIRED FOR ROMWBW -TOT_ROM_RB .EQU (WBW_ROM_R / 32) ; TOTAL ROM BANKS RESERVED -TOT_RAM_RB .EQU (WBW_RAM_R / 32) ; TOTAL RAM BANKS RESERVED +ROMBANKS .EQU (ROMSIZE / 32) ; TOTAL ROM BANKS +RAMBANKS .EQU (RAMSIZE / 32) ; TOTAL RAM BANKS ; #IF (BIOS == BIOS_UNA) BID_ROM0 .EQU $0000 @@ -580,26 +578,45 @@ BID_RAM0 .EQU $8000 BID_ROM0 .EQU $00 BID_RAM0 .EQU $80 #ENDIF - -BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1)) -BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) -; -BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK ^ RAM -BID_RAMDN .EQU BID_RAMN - TOT_RAM_RB ; LAST RAM DRIVE BANK | DRIVE -; ; OS BUFFERS CP/M3? -+ THESE CPM3 BNK 5 (BUF) -; ; OS BUFFERS CP/M3? | MAKE CPM3 BNK 4 (BUF) -; ; OS BUFFERS CP/M3? | UP CPM3 BNK 3 (BUF) -; ; OS BUFFERS CP/M3? | THE CPM3 BNK 2 (BUF) -BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) | 256KB CPM3 BNK 1 (TPA) -BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK | RESERVED -BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) | RAM CPM3 BNK 0 (OS) -BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K -+ BANKS -BID_BOOT .EQU BID_ROM0 + 0 ; BOOT BANK -+ THESE MAKE -BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK | UP THE 128KB -BID_IMG1 .EQU BID_ROM0 + 2 ; SECOND IMAGES BANK | RESERVED -BID_IMG2 .EQU BID_ROM0 + 3 ; NETWORK BOOT -+ ROM BANKS -BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK | ROM -BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK V DRIVE +; +BID_ROMN .EQU (BID_ROM0 + ROMBANKS - 1) +BID_RAMN .EQU (BID_RAM0 + RAMBANKS - 1) +; +#IF (ROMSIZE > 0) +; -- TYPICAL -- +BID_BOOT .EQU BID_ROM0 + 0 ; BOOT BANK 0x00 +BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK 0x01 +BID_IMG1 .EQU BID_ROM0 + 2 ; SECOND IMAGES BANK 0x02 +BID_IMG2 .EQU BID_ROM0 + 3 ; RESERVED 0x03 +BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK 0x04 +BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK 0x0F +; +BID_BIOS .EQU BID_RAM0 ; HBIOS BANK 0x80 +BID_RAMD0 .EQU BID_RAM0 + 1 ; FIRST RAM DRIVE BANK 0x81 +BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK 0x8B +BID_BUF .EQU BID_RAMN - 3 ; OS BUFFERS (CP/M3) 0x8C +BID_AUX .EQU BID_RAMN - 2 ; AUX BANK (CP/M 3, BPBIOS, ETC.) 0x8D +BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) 0x8E +BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K 0x8F +; +#ELSE +; -- TYPICAL -- +BID_BOOT .EQU BID_RAM0 + 0 ; BOOT BANK 0x80 +BID_IMG0 .EQU BID_RAM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK 0x81 +BID_IMG1 .EQU BID_RAM0 + 2 ; SECOND IMAGES BANK 0x82 +BID_IMG2 .EQU BID_RAM0 + 3 ; RESERVED 0x83 +BID_RAMD0 .EQU BID_RAM0 + 4 ; FIRST RAM DRIVE BANK 0x84 +BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK 0x8B +BID_BUF .EQU BID_RAMN - 3 ; OS BUFFERS (CP/M3) 0x8C +BID_AUX .EQU BID_RAMN - 2 ; AUX BANK (CP/M 3, BPBIOS, ETC.) 0x8D +BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) 0x8E +BID_COM .EQU BID_RAMN - 0 ; COMMON BANK, UPPER 32K 0x8F +; +BID_BIOS .EQU BID_BOOT ; HBIOS BANK 0x80 +BID_ROMD0 .EQU 0 ; NO ROM DRIVE +BID_ROMDN .EQU $FF ; NO ROM DRIVE +; +#ENDIF ; #IF (ROMSIZE == 0) BID_BOOT .SET BID_RAM0 ; SPECIAL CASE ROM-LESS SYSTEM @@ -609,17 +626,21 @@ BID_BOOT .SET BID_RAM0 ; SPECIAL CASE ROM-LESS SYSTEM ; #IF (!MDRAM) BID_RAMD0 .SET $FF ; RAM DRIVE DISABLED -BID_RAMDN .SET $FF ; RAM DRIVE DISABLED +BID_RAMDN .SET 0 ; RAM DRIVE DISABLED #ENDIF ; #IF (!MDROM) BID_ROMD0 .SET $FF ; ROM DRIVE DISABLED -BID_ROMDN .SET $FF ; ROM DRIVE DISABLED +BID_ROMDN .SET 0 ; ROM DRIVE DISABLED #ENDIF ; +ROMD_BNKS .EQU (BID_ROMDN - BID_ROMD0 + 1) +RAMD_BNKS .EQU (BID_RAMDN - BID_RAMD0 + 1) +; #ENDIF ; -#IF FALSE +#IF TRUE + .ECHO "BID_BUF: " \ .ECHO BID_BUF \ .ECHO "\n" .ECHO "BID_AUX: " \ .ECHO BID_AUX \ .ECHO "\n" .ECHO "BID_BIOS: " \ .ECHO BID_BIOS \ .ECHO "\n" .ECHO "BID_USR: " \ .ECHO BID_USR \ .ECHO "\n" diff --git a/Source/ver.inc b/Source/ver.inc index 94bc5543..0ebdd56b 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 3 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.3.0-dev.57" +#DEFINE BIOSVER "3.3.0-dev.58" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index ddb02759..b4d676ff 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 3 rup equ 0 rtp equ 0 biosver macro - db "3.3.0-dev.57" + db "3.3.0-dev.58" endm