From e84a1bc3eab77d6bb22c148b2c5fd0e1262d8b75 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 11 Apr 2020 13:32:55 -0700 Subject: [PATCH] ROMLDR Improvements .com files can now be started from CP/M and size of .com files has been reduced so they always fit. --- Doc/ChangeLog.txt | 2 ++ Doc/RomWBW Applications.pdf | Bin 140215 -> 140215 bytes Doc/RomWBW Architecture.pdf | Bin 371105 -> 371105 bytes Doc/RomWBW Getting Started.pdf | Bin 166714 -> 166095 bytes ReadMe.md | 10 +------ ReadMe.txt | 10 +------ Source/Doc/GettingStarted.md | 8 ----- Source/HBIOS/Build.ps1 | 9 ++++-- Source/HBIOS/Build.sh | 5 ++-- Source/HBIOS/dsrtc.asm | 44 +++++++++++++++------------ Source/HBIOS/romldr.asm | 53 +++++++++++++++++++++++---------- Source/HBIOS/sd.asm | 5 ++-- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 14 files changed, 81 insertions(+), 69 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index c43442dc..c92bcd57 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -3,6 +3,8 @@ Version 3.1 - WBW: Refactored ROM Loader - WBW: INTRTC periodic timer based clock - WBW: FDISK80 updated to allow reserving up to 256 slices +- WBW: Added support dual 16C550 UART on RC2014 platform +- WBW: Made .com images smaller (contain only Z-System now) Version 3.0.1 ------------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index d15a52753cc8c7168abef2be57f1108859ed2808..ed1cd38b7583a0bc5acf95f7c116d582d8ea70c9 100644 GIT binary patch delta 113 zcmdmfoMZcOj)pCa>c2P)4GoQr42&$N>;GbuhV!-u{bFR*bT%^IFb9J(GbG1{jA*5vbEM+EH02l}zRR910 delta 113 zcmdmfoMZcOj)pCa>c2P)Obty<4Gm4E>;GbuhV!-u{bFR*bT&0Mws3SdwXkq@G%#^? gHnTJ}cC#=rGIugDG&6NJGPF~$A*5vbEM+EH02>`09RL6T diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index e12f8ade34a2f838633060740bd9c508c97bc2d5..10bbc1233c25288f9b3d82a1427f1a2d9fc43bec 100644 GIT binary patch delta 192 zcmZ2@S#05Du?;dQd}e7T7RiRj$%aOjDQU*dS}EJLQW)bq(Zt)QzhwksCLm_sKK(7r zx^50bLqlUD17qXqzLl)faNhQUO4f_|35MntMo!Ldj%JP)&aRGT1_mz1j*h107UpIa rF2-)=mUap@1eL@p*x7Lvmn0UIR1~GAaT%LhSeO}esj9mAyKw;k$Hg~# delta 192 zcmZ2@S#05Du?;dQe5S^!mKKSYMyaM2CI(5(S}EJLQW)bq(Zt)QzhwksCLm_sKK(7r zx^4~wQ$tfzLqp5yzLl)faNhQUO4f_|39im2Zbp{oCMK5VX2zzDE@nn9ZpIdF7G`G7 r7N#an=5`7;1eL@p*x7Lvmn0UIR1~GAaT%LhSeO}esj9mAyKw;klUX+s diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 5e39d55a98f30f843bb51a44beebe60bc9e4ea29..dabf18a4d44646f94b1d1b8bda65530849dab334 100644 GIT binary patch delta 16498 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 z zF{+0V8x1@L5JV;182J}R<|6|_)zRdn#V*bX{ zz@riHNJJov1geDa-jNU(Q7#}ML{C#tV7~sf1pPM&kq|V&Oar4KVQkBmz|jBoh8% zG+5bIT}2fFQ-cAnsh(58pw%Gi7*&WmR!tpw4xtVNTR}kn|I1<}0DQ0HbKTDSdVsf+ SGtF^P!{Ia{B5L~TH2)8aN?or2 delta 17280 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 bdiz*=`S^R;*;5|hf+Jy+0s?C1)hYiUZllA~ diff --git a/ReadMe.md b/ReadMe.md index c321ce02..8c4346c4 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ ## Z80/Z180 System Software Version 3.1 Pre-release -Monday 30 March 2020 +Saturday 11 April 2020 Wayne Warthen @@ -1007,14 +1007,6 @@ through the normal startup process just like it was started from ROM. However, your ROM has not been updated and the next time you boot your system, it will revert to the system image contained in ROM. -There are two restrictions to be aware of related to loading a system -image as a .com application. First, this is only supported under -Z-System and CP/M 2.2. You must boot into one of these OSes before -attempting to launch the .com file. Second, you may find that you are -unable to load the .com file because it is too large to fit in available -application RAM (TPA). Your only recourse in this situation is to build -a custom ROM with fewer features. - If you do not have easy access to a ROM programmer, it is usually possible to reprogram your system ROM using the FLASH utility from Will Sowerbutts. This application, called FLASH.COM, can be found on the ROM diff --git a/ReadMe.txt b/ReadMe.txt index c9b01d5c..f47dcf47 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -3,7 +3,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -Monday 30 March 2020 +Saturday 11 April 2020 Wayne Warthen wwarthen@gmail.com @@ -1031,14 +1031,6 @@ through the normal startup process just like it was started from ROM. However, your ROM has not been updated and the next time you boot your system, it will revert to the system image contained in ROM. -There are two restrictions to be aware of related to loading a system -image as a .com application. First, this is only supported under -Z-System and CP/M 2.2. You must boot into one of these OSes before -attempting to launch the .com file. Second, you may find that you are -unable to load the .com file because it is too large to fit in available -application RAM (TPA). Your only recourse in this situation is to build -a custom ROM with fewer features. - If you do not have easy access to a ROM programmer, it is usually possible to reprogram your system ROM using the FLASH utility from Will Sowerbutts. This application, called FLASH.COM, can be found on the ROM diff --git a/Source/Doc/GettingStarted.md b/Source/Doc/GettingStarted.md index ba84859b..345c768b 100644 --- a/Source/Doc/GettingStarted.md +++ b/Source/Doc/GettingStarted.md @@ -1058,14 +1058,6 @@ through the normal startup process just like it was started from ROM. However, your ROM has not been updated and the next time you boot your system, it will revert to the system image contained in ROM. -There are two restrictions to be aware of related to loading a system -image as a .com application. First, this is only supported under -Z-System and CP/M 2.2. You must boot into one of these OSes before -attempting to launch the .com file. Second, you may find that you -are unable to load the .com file because it is too large to fit in -available application RAM (TPA). Your only recourse in this -situation is to build a custom ROM with fewer features. - If you do not have easy access to a ROM programmer, it is usually possible to reprogram your system ROM using the FLASH utility from Will Sowerbutts. This application, called FLASH.COM, can be found on the diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index ff098d8e..e82b67aa 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -184,9 +184,12 @@ if ($Platform -ne "UNA") # "Building ${RomName} output files..." -# Build 32K OS chunk containing the loader, debug monitor, and OS images +# Build 32K OS chunk containing the loader, debug monitor, and two OS images Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', "..\cpm22\cpm_${Bios}.bin", "..\zsdos\zsys_${Bios}.bin" osimg.bin +# Build 20K OS chunk containing the loader, debug monitor, and one OS image +Concat 'romldr.bin', 'eastaegg.bin','dbgmon.bin', "..\zsdos\zsys_${Bios}.bin" osimg_small.bin + # Build second 32K chunk containing supplemental ROM apps (not for UNA) if ($Platform -ne "UNA") { @@ -237,8 +240,8 @@ if ($Platform -eq "UNA") else { Concat 'hbios_rom.bin','osimg.bin','osimg1.bin','osimg.bin',$RomDiskFile $RomFile - Concat 'hbios_app.bin','osimg.bin' $ComFile - # Concat 'hbios_img.bin','osimg.bin' $ImgFile + Concat 'hbios_app.bin','osimg_small.bin' $ComFile + # Concat 'hbios_img.bin','osimg_small.bin' $ImgFile } # Remove the temporary working ROM disk file diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 24abfa41..86f8c05a 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -100,6 +100,7 @@ fi echo "Building $romname output files..." cat romldr.bin eastaegg.bin dbgmon.bin ../CPM22/cpm_$BIOS.bin ../ZSDOS/zsys_$BIOS.bin >osimg.bin +cat romldr.bin eastaegg.bin dbgmon.bin ../ZSDOS/zsys_$BIOS.bin >osimg_small.bin if [ $platform != UNA ] ; then cat camel80.bin nascom.bin tastybasic.bin game.bin imgpad0.bin usrrom.bin >osimg1.bin @@ -146,8 +147,8 @@ if [ $platform = UNA ] ; then cat ../UBIOS/UNA-BIOS.BIN osimg.bin ../UBIOS/FSFAT.BIN $romdiskfile >$romname.rom else cat hbios_rom.bin osimg.bin osimg1.bin osimg.bin $romdiskfile >$romname.rom - cat hbios_app.bin osimg.bin > $romname.com - cat hbios_img.bin osimg.bin > $romname.img + cat hbios_app.bin osimg_small.bin > $romname.com + # cat hbios_img.bin osimg_small.bin > $romname.img fi #rm $romdiskfile diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index 0f8c52ef..607cc6aa 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -85,7 +85,7 @@ ; #IF (DSRTCMODE == DSRTCMODE_STD) ; -DSRTC_BASE .EQU RTCIO ; RTC PORT +DSRTC_IO .EQU RTCIO ; RTC PORT ; DSRTC_DATA .EQU %10000000 ; BIT 7 IS RTC DATA OUT DSRTC_CLK .EQU %01000000 ; BIT 6 IS RTC CLOCK (CLK) @@ -95,6 +95,10 @@ DSRTC_CE .EQU %00010000 ; BIT 4 IS CHIP ENABLE (CE) DSRTC_MASK .EQU %11110000 ; MASK FOR BITS WE OWN IN RTC LATCH PORT DSRTC_IDLE .EQU %00100000 ; QUIESCENT STATE ; +RTCDEF .SET DSRTC_IDLE ; FOR HBIOS MAINLINE +; +#DEFINE DSRTC_OPRVAL RTCVAL +; ; VALUES FOR DIFFERENT BATTERY OR SUPERCAPACITOR CHARGE RATES ; DS1d2k .EQU %10100101 ; 1 DIODE 2K RESISTOR (DEFAULT) @@ -108,7 +112,7 @@ DS2d8k .EQU %10101011 ; 2 DIODES 8K RESISTOR ; #IF (DSRTCMODE == DSRTCMODE_MFPIC) ; -DSRTC_BASE .EQU $43 ; RTC PORT ON MF/PIC +DSRTC_IO .EQU $43 ; RTC PORT ON MF/PIC ; DSRTC_DATA .EQU %00000001 ; BIT 0 IS RTC DATA OUT DSRTC_CLK .EQU %00000100 ; BIT 2 IS RTC CLOCK (CLK) @@ -116,11 +120,11 @@ DSRTC_WR .EQU %00000010 ; BIT 1 IS DATA DIRECTION (WE) DSRTC_CE .EQU %00001000 ; BIT 3 CHIP ENABLE (/CE) ; DSRTC_MASK .EQU %00001111 ; MASK FOR BITS WE OWN IN RTC LATCH PORT -DSRTC_IDLE .EQU %00101000 ; QUIESCENT STATE +DSRTC_IDLE .EQU %00001000 ; QUIESCENT STATE ; -#ENDIF +#DEFINE DSRTC_OPRVAL DSRTC_RTCVAL ; -RTCDEF .SET DSRTC_IDLE ; FOR HBIOS MAINLINE +#ENDIF ; DSRTC_BUFSIZ .EQU 7 ; 7 BYTE BUFFER (YYMMDDHHMMSSWW) ; @@ -130,10 +134,10 @@ DSRTC_PREINIT: ; ; SET RELEVANT BITS IN RTC LATCH SHADOW REGISTER ; TO THEIR QUIESENT STATE - LD A,(RTCVAL) ; GET CURRENT SHADOW REG VAL + LD A,(DSRTC_OPRVAL) ; GET CURRENT SHADOW REG VAL AND ~DSRTC_MASK ; CLEAR OUR BITS OR DSRTC_IDLE ; SET OUR IDLE BITS - LD (RTCVAL),A ; SAVE IT + LD (DSRTC_OPRVAL),A ; SAVE IT ; CALL DSRTC_DETECT ; HARDWARE DETECTION LD (DSRTC_STAT),A ; SAVE RESULT @@ -167,7 +171,7 @@ DSRTC_INIT: ; ; PRINT RTC LATCH PORT ADDRESS PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS - LD A,DSRTC_BASE ; GET IO ADDRESS + LD A,DSRTC_IO ; GET IO ADDRESS CALL PRTHEXBYTE ; PRINT IT ; ; CHECK PRESENCE STATUS @@ -541,15 +545,15 @@ DSRTC_WRCLK1: ; 5) PUT COMMAND ; DSRTC_CMD: - LD A,(RTCVAL) ; INIT A WITH QUIESCENT STATE - OUT (DSRTC_BASE),A ; WRITE TO PORT + LD A,(DSRTC_OPRVAL) ; INIT A WITH QUIESCENT STATE + OUT (DSRTC_IO),A ; WRITE TO PORT CALL DLY2 ; DELAY 2 * 27 T-STATES #IF (DSRTCMODE == DSRTCMODE_MFPIC) AND ~DSRTC_CE ; ASSERT CE (LOW) #ELSE OR DSRTC_CE ; ASSERT CE (HIGH) #ENDIF - OUT (DSRTC_BASE),A ; WRITE TO RTC PORT + OUT (DSRTC_IO),A ; WRITE TO RTC PORT CALL DLY2 ; DELAY 2 * 27 T-STATES CALL DSRTC_PUT ; WRITE IT RET @@ -577,7 +581,7 @@ DSRTC_PUT: #ENDIF DSRTC_PUT1: AND ~DSRTC_CLK ; SET CLOCK LOW - OUT (DSRTC_BASE),A ; DO IT + OUT (DSRTC_IO),A ; DO IT CALL DLY1 ; DELAY 27 T-STATES #IF (DSRTCMODE == DSRTCMODE_MFPIC) @@ -589,9 +593,9 @@ DSRTC_PUT1: RR E ; ROTATE NEXT BIT TO SEND INTO CARRY RRA ; ROTATE BITS BACK TO CORRECT POSTIIONS #ENDIF - OUT (DSRTC_BASE),A ; ASSERT DATA BIT ON BUS + OUT (DSRTC_IO),A ; ASSERT DATA BIT ON BUS OR DSRTC_CLK ; SET CLOCK HI - OUT (DSRTC_BASE),A ; DO IT + OUT (DSRTC_IO),A ; DO IT CALL DLY1 ; DELAY 27 T-STATES DJNZ DSRTC_PUT1 ; LOOP IF NOT DONE RET @@ -620,15 +624,15 @@ DSRTC_GET: #ENDIF DSRTC_GET1: AND ~DSRTC_CLK ; SET CLK LO - OUT (DSRTC_BASE),A ; WRITE TO RTC PORT + OUT (DSRTC_IO),A ; WRITE TO RTC PORT CALL DLY1 ; DELAY 2 * 27 T-STATES PUSH AF ; SAVE PORT VALUE - IN A,(DSRTC_BASE) ; READ THE RTC PORT + IN A,(DSRTC_IO) ; READ THE RTC PORT RRA ; DATA BIT TO CARRY RR E ; SHIFT INTO WORKING VALUE POP AF ; RESTORE PORT VALUE OR DSRTC_CLK ; CLOCK BACK TO HI - OUT (DSRTC_BASE),A ; WRITE TO RTC PORT + OUT (DSRTC_IO),A ; WRITE TO RTC PORT CALL DLY1 ; DELAY 27 T-STATES DJNZ DSRTC_GET1 ; LOOP IF NOT DONE (13) RET @@ -640,8 +644,8 @@ DSRTC_GET1: ; 1) SET ALL LINES BACK TO QUIESCENT STATE ; DSRTC_END: - LD A,(RTCVAL) ; INIT A WITH QUIESCENT STATE - OUT (DSRTC_BASE),A ; WRITE TO PORT + LD A,(DSRTC_OPRVAL) ; INIT A WITH QUIESCENT STATE + OUT (DSRTC_IO),A ; WRITE TO PORT RET ; RETURN ; ; WORKING VARIABLES @@ -649,6 +653,8 @@ DSRTC_END: DSRTC_STAT .DB 0 ; DEVICE STATUS (0=OK) DSRTC_TEMP .DB 0 ; TEMP VALUE STORAGE ; +DSRTC_RTCVAL .DB DSRTC_IDLE ; LOCAL LATCH SHADOW FOR MFPIC +; ; DSRTC_BUF IS USED FOR BURST READ/WRITE OF CLOCK DATA TO DS-1302 ; FIELDS BELOW MATCH ORDER OF DS-1302 FIELDS (BCD) ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index c2f1af35..747dd032 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -115,7 +115,7 @@ start: di #endif ; -; Switch banked memory to user RAM bank and setup page zero. +; Switch to user RAM bank ; #if (BIOS == BIOS_WBW) ld b,BF_SYSSETBNK ; HBIOS func: set bank @@ -123,15 +123,24 @@ start: rst 08 ; do it ld a,c ; previous bank to A ld (bid_ldr),a ; save previous bank for later + cp BID_IMG0 ; starting from ROM? #endif ; #if (BIOS == BIOS_UNA) ld bc,$01FB ; UNA func: set bank ld de,BID_USR ; select user bank rst 08 ; do it - ld a,c ; save previous bank ld (bid_ldr),de ; ... for later + ld a,d ; starting from ROM? + or e ; ... bank == 0? #endif +; + ; For app mode startup, use alternate table + ld hl,ra_tbl ; assume ROM startup + jr z,start1 ; if so, ra_tbl OK, skip ahead + ld hl,ra_tbl_app ; not ROM boot, get app tbl loc +start1: + ld (ra_tbl_loc),hl ; and overlay pointer ; ; Copy original page zero into user page zero ; @@ -274,7 +283,7 @@ runcmd: jp z,reboot ; if so, do it ; ; Attempt ROM application launch - ld ix,ra_tbl ; point to start of ROM app tbl + ld ix,(ra_tbl_loc) ; point to start of ROM app tbl ld c,a ; save command in C runcmd1: ld a,(ix+ra_conkey) ; get match char @@ -334,7 +343,7 @@ dskycmd: jp z,reboot ; if so, do it ; ; Attempt ROM application launch - ld ix,ra_tbl ; point to start of ROM app tbl + ld ix,(ra_tbl_loc) ; point to start of ROM app tbl ld c,a ; save DSKY key in C dskycmd1: ld a,(ix+ra_dskykey) ; get match char @@ -374,7 +383,7 @@ applst: ld hl,str_applst call pstr call nl - ld ix,ra_tbl + ld ix,(ra_tbl_loc) applst1: ; check for end of table ld a,(ix) @@ -1493,25 +1502,26 @@ ra_ent .equ 12 ; *_SIZ *_END and any code generated which does not include std.asm is ; synced. ; -; Note: The loadable ROM images are placed in ROM banks bid_img0 and -; bid_img1. However, RomWBW supports a mechanism to load a complete +; Note: The loadable ROM images are placed in ROM banks BID_IMG0 and +; BID_IMG1. However, RomWBW supports a mechanism to load a complete ; new system dynamically as a runnable application (see appboot and -; imgboot in hbios.asm). In this case, the contents of bid_img0 will +; imgboot in hbios.asm). In this case, the contents of BID_IMG0 will ; be pre-loaded into the currently executing ram bank thereby allowing ; those images to be dynamically loaded as well. To support this ; concept, a pseudo-bank called bid_cur is used to specify the images -; normally found in bid_img0. In romload, this special value will cause +; normally found in BID_IMG0. In romload, this special value will cause ; the associated image to be loaded from the currently executing bank ; which will be correct regardless of the load mode. Images in other -; banks (bid_img1) will always be loaded directly from ROM. +; banks (BID_IMG1) will always be loaded directly from ROM. ; ra_tbl: +; ; Name Key Dsky Bank Src Dest Size Entry ; --------- ------- ----- -------- ----- ------- ------- ---------- -ra_ent(str_mon, 'M', KY_CL, bid_cur, $1000, MON_LOC, MON_SIZ, MON_SERIAL) +ra_ent(str_mon, 'M', KY_CL, BID_IMG0, $1000, MON_LOC, MON_SIZ, MON_SERIAL) ra_entsiz .equ $ - ra_tbl -ra_ent(str_cpm22, 'C', KY_BK, bid_cur, $2000, CPM_LOC, CPM_SIZ, CPM_ENT) -ra_ent(str_zsys, 'Z', KY_FW, bid_cur, $5000, CPM_LOC, CPM_SIZ, CPM_ENT) +ra_ent(str_cpm22, 'C', KY_BK, BID_IMG0, $2000, CPM_LOC, CPM_SIZ, CPM_ENT) +ra_ent(str_zsys, 'Z', KY_FW, BID_IMG0, $5000, CPM_LOC, CPM_SIZ, CPM_ENT) #if (BIOS == BIOS_WBW) ra_ent(str_fth, 'F', KY_EX, BID_IMG1, $0000, FTH_LOC, FTH_SIZ, FTH_LOC) ra_ent(str_bas, 'B', KY_DE, BID_IMG1, $1700, BAS_LOC, BAS_SIZ, BAS_LOC) @@ -1520,9 +1530,21 @@ ra_ent(str_play, 'P', $FF, BID_IMG1, $4000, GAM_LOC, GAM_SIZ, GAM_LOC) ra_ent(str_user, 'U', $FF, BID_IMG1, $7000, USR_LOC, USR_SIZ, USR_LOC) #endif #if (DSKYENABLE) -ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, $1000, MON_LOC, MON_SIZ, MON_DSKY) +ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, $1000, MON_LOC, MON_SIZ, MON_DSKY) +#endif +ra_ent(str_egg, 'E'+$80, $FF , bid_cur, $0E00, EGG_LOC, EGG_SIZ, EGG_LOC) + .dw 0 ; table terminator +; +ra_tbl_app: +; +; Name Key Dsky Bank Src Dest Size Entry +; --------- ------- ----- -------- ----- ------- ------- ---------- +ra_ent(str_mon, 'M', KY_CL, bid_cur, $1000, MON_LOC, MON_SIZ, MON_SERIAL) +ra_ent(str_zsys, 'Z', KY_FW, bid_cur, $2000, CPM_LOC, CPM_SIZ, CPM_ENT) +#if (DSKYENABLE) +ra_ent(str_dsky, 'Y'+$80, KY_GO, bid_cur, $1000, MON_LOC, MON_SIZ, MON_DSKY) #endif -ra_ent(str_egg, 'E'+$80, $FF , bid_cur, $0E00, EGG_LOC, EGG_SIZ, EGG_LOC) +ra_ent(str_egg, 'E'+$80, $FF , bid_cur, $0E00, EGG_LOC, EGG_SIZ, EGG_LOC) .dw 0 ; table terminator ; str_mon .db "Monitor",0 @@ -1562,6 +1584,7 @@ bid_ldr .ds 2 ; bank at startup loadlba .ds 4 ; lba for load, dword #endif ; +ra_tbl_loc .ds 2 ; points to active ra_tbl bootunit .ds 1 ; boot disk unit bootslice .ds 1 ; boot disk slice loadcnt .ds 1 ; num disk sectors to load diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index dc86ff13..b0b2e379 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -20,8 +20,8 @@ ; ; CS = CHIP SELECT (AKA DAT3 FOR NON-SPI MODE) ; CLK = CLOCK -; DI = DATA IN (HOST -> CARD, AKA CMD FOR NON-SPI MODE) -; DO = DATA OUT (HOST <- CARD, AKA DAT0 FOR NON-SPI MODE) +; DI = MOSI = DATA IN (HOST -> CARD, AKA CMD FOR NON-SPI MODE) +; DO = MISO = DATA OUT (HOST <- CARD, AKA DAT0 FOR NON-SPI MODE) ; ; NOTES: ; 1) SIGNAL NAMES ARE FROM THE SD CARD SPEC AND ARE NAMED FROM THE @@ -570,6 +570,7 @@ SD_INITUNIT2: RET Z ; IF NOT, DONE PRTS(" WP$") ; NOTIFY USER ; + XOR A ; SIGNAL SUCCESS RET ; DONE ; ;---------------------------------------------------------------------- diff --git a/Source/ver.inc b/Source/ver.inc index b88f2500..91ca16d7 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1-pre.1" +#DEFINE BIOSVER "3.1-pre.2" diff --git a/Source/ver.lib b/Source/ver.lib index f16bd9f4..bc39cfbf 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 0 rtp equ 0 biosver macro - db "3.1-pre.1" + db "3.1-pre.2" endm