diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 2b72545a..2f7c0b98 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -3,6 +3,7 @@ Version 3.1.1 - WBW: Version bumped due to pervasive changes - WBW: Preliminary hard disk partition support (backward compatible) - WBW: Change Propeller VGA signal timings to 60Hz refresh +- WBW: Enhanced SYSTEM RESET function to allow a warm start back to boot loader Version 3.1 ----------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index 6ab7d2a4..ed28704b 100644 Binary files a/Doc/RomWBW Applications.pdf and b/Doc/RomWBW Applications.pdf differ diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index c6a984a4..fa9ec503 100644 Binary files a/Doc/RomWBW Architecture.pdf and b/Doc/RomWBW Architecture.pdf differ diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 2d688b63..1d9cf04e 100644 Binary files a/Doc/RomWBW Disk Catalog.pdf and b/Doc/RomWBW Disk Catalog.pdf differ diff --git a/Doc/RomWBW Getting Started.pdf b/Doc/RomWBW Getting Started.pdf index 426d0b32..8f0d1348 100644 Binary files a/Doc/RomWBW Getting Started.pdf and b/Doc/RomWBW Getting Started.pdf differ diff --git a/Source/Apps/RTC.asm b/Source/Apps/RTC.asm index 5d731612..30e08e21 100644 --- a/Source/Apps/RTC.asm +++ b/Source/Apps/RTC.asm @@ -25,6 +25,8 @@ ; ;[2020/02/02] v1.5 PMS Basic command line support ; +;[2020/05/15] v1.6 Added Warm Start option +; ; Constants ; mask_data .EQU %10000000 ; RTC data line @@ -46,6 +48,12 @@ FCB .EQU 05CH ; Start of command line BID_BOOT .EQU $00 HB_BNKCALL .EQU $FFF9 +BF_SYSRESET .EQU $F0 ; RESTART SYSTEM + +BF_SYSRES_INT .EQU $00 ; RESET HBIOS INTERNAL +BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER) +BF_SYSRES_COLD .EQU $02 ; COLD START + ; ; Program ; @@ -1273,6 +1281,9 @@ RTC_UCL: CP 'B' JP Z,RTC_TOP_LOOP_BOOT + CP 'W' + JP Z,RTC_TOP_LOOP_WARMSTART + CP 'C' JP Z,RTC_TOP_LOOP_CHARGE @@ -1324,6 +1335,11 @@ DELAY_LOOP: ; LOOP IS 26TS LD HL,0 ; ADDRESS ZERO CALL HB_BNKCALL ; DOES NOT RETURN +RTC_TOP_LOOP_WARMSTART: + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS + RTC_TOP_LOOP_CHARGE: LD DE,RTC_TOP_LOOP1_CHARGE LD C,09H ; CP/M write string to console call @@ -1580,7 +1596,7 @@ RTC_HELP_MSG: .DB 0Ah, 0Dh ; line feed and carriage return .TEXT "RTC: Version 1.5" .DB 0Ah, 0Dh ; line feed and carriage return - .TEXT "Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot H)elp" + .TEXT "Commands: E)xit T)ime st(A)rt S)et R)aw L)oop C)harge N)ocharge D)elay I)nit G)et P)ut B)oot W)arm-start H)elp" .DB 0Ah, 0Dh ; line feed and carriage return .DB "$" ; Line terminator diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index a1036ccd..47018547 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -336,9 +336,12 @@ REBOOT: CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE) #ENDIF #IFDEF PLTWBW - DI ; NO INTERRUPTS - LD A,0 ; ROM BOOT BANK - CALL HB_BNKSEL ; SELECT IT INTO LOW MEMORY + ;DI ; NO INTERRUPTS + ;LD A,0 ; ROM BOOT BANK + ;CALL HB_BNKSEL ; SELECT IT INTO LOW MEMORY + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS #ENDIF ; ; JUMP TO RESTART ADDRESS diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index b9f58bc7..4f55b627 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -678,7 +678,7 @@ signon$msg db 13,10,'ZPM3' if banked db ' [BANKED]' endif - db ' on HBIOS v' + db ' for HBIOS v' biosver db 13,10,13,10,0 @@ -697,7 +697,7 @@ signon$msg db 13,10,'CP/M v3.0' if banked db ' [BANKED]' endif - db ' on HBIOS v' + db ' for HBIOS v' biosver db 13,10,13,10,0 diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index f3e20ea3..8db85458 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1532,13 +1532,47 @@ System (SYS) | _Entry Parameters_ | B: 0xF0 +| C: Subfunction (see below) | _Exit Results_ | A: Status (0=OK, else error) +This function performs various forms of a system reset depending on +the value of the subfucntion. See subfunctions below. + +#### SYSRESET Subfunction 0x00 -- Internal HBIOS Reset (RESINT) + +| _Entry Parameters_ +| BC: 0xFD00 + +| _Returned Values_ +| A: Status (0=OK, else error) + Perform a soft reset of HBIOS. Releases all HBIOS memory allocated by current OS. Does not reinitialize physical devices. +#### SYSRESET Subfunction 0x01 -- Warm Start System (RESWARM) + +| _Entry Parameters_ +| BC: 0xFD01 + +| _Returned Values_ +| + +Warm start the system returning to the boot loader prompt. Does not +reinitialize physical devices. + +#### SYSRESET Subfunction 0x02 -- Cold Start System (RESCOLD) + +| _Entry Parameters_ +| BC: 0xFD02 + +| _Returned Values_ +| + +Perform a system cold start (like a power on). All devices are +reinitialized. + ### Function 0xF1 -- System Version (SYSVER) | _Entry Parameters_ diff --git a/Source/Forth/camel80.azm b/Source/Forth/camel80.azm index c74af4fc..3b8c9462 100644 --- a/Source/Forth/camel80.azm +++ b/Source/Forth/camel80.azm @@ -4,6 +4,12 @@ CIOOUT EQU 01h ; CHARACTER OUTPUT CIOIST EQU 02h ; CHARACTER INPUT STATUS BID_BOOT EQU 00h HB_BNKCALL EQU 0fff9h +BF_SYSRESET EQU 0F0h ; RESTART SYSTEM + +BF_SYSRES_INT EQU 00h ; RESET HBIOS INTERNAL +BF_SYSRES_WARM EQU 01h ; WARM START (RESTART BOOT LOADER) +BF_SYSRES_COLD EQU 02h ; COLD START + ; THE FOLLOWING NEED TO BE SYNCED WITH STD.ASM SO ROMLDR ; KNOWS WHERE THIS EXECUTES AT @@ -332,9 +338,13 @@ KEY2: DW SAVEKEY,CFETCH,LIT,0,SAVEKEY,CSTORE ;X BYE i*x -- return to CP/M head bye,3,bye,docode - LD A,BID_BOOT ; BOOT BANK - LD HL,0 ; ADDRESS ZERO - CALL HB_BNKCALL ; DOES NOT RETURN + ;LD A,BID_BOOT ; BOOT BANK + ;LD HL,0 ; ADDRESS ZERO + ;CALL HB_BNKCALL ; DOES NOT RETURN + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL 0FFF0h ; CALL HBIOS + HALT ; STACK OPERATIONS ============================== diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 0e3c7c5d..deec80d3 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -132,7 +132,7 @@ AY_FND: LD IY, AY_IDAT ; SETUP FUNCTION TABLE LD A, TICKFREQ / 3 ; SCHEDULE IN 1/3 SECOND TO TURN OFF SOUND LD (AY_TIMTIK), A - LD HL, (VEC_TICK + 1) ; GET CUR SECONDS VECTOR + LD HL, (VEC_TICK + 1) ; GET CUR TICKS VECTOR LD (AY_TIMHOOK), HL ; SAVE IT INTERNALLY LD HL, AY_TIMER ; INSTALL TIMER HOOK HANDLER LD (VEC_TICK + 1), HL diff --git a/Source/HBIOS/cfg_state.inc b/Source/HBIOS/cfg_state.inc index d7d1ab3f..007879b0 100644 --- a/Source/HBIOS/cfg_state.inc +++ b/Source/HBIOS/cfg_state.inc @@ -1,30 +1,29 @@ - -#IFNDEF CFG_STATE -#DEFINE CFG_STATE - -SYSTIMEN .EQU FALSE - -#IF (CTCENABLE & (INTMODE == 2) & (CTCTIMER)) -SYSTIMEN .SET TRUE -#ENDIF - -#IF (TMSENABLE & (INTMODE == 1) & TMSTIMENABLE) -SYSTIMEN .SET TRUE -#ENDIF - -#IF ((INTMODE == 1) & (PLATFORM == PLT_SBC) & HTIMENABLE) -SYSTIMEN .SET TRUE -#ENDIF - -#IF ((INTMODE == 2) & (CPUFAM == CPU_Z180)) -SYSTIMEN .SET TRUE -#ENDIF - - .ECHO "TIMER INTERRUPT " -#IF SYSTIMEN - .ECHO "ACTIVE\n" -#ELSE - .ECHO "NOT ACTIVE\n" -#ENDIF - -#ENDIF +#IFNDEF CFG_STATE + #DEFINE CFG_STATE + +SYSTIMEN .EQU FALSE + + #IF (CTCENABLE & (INTMODE == 2) & (CTCTIMER)) +SYSTIMEN .SET TRUE + #ENDIF + + #IF (TMSENABLE & (INTMODE == 1) & TMSTIMENABLE) +SYSTIMEN .SET TRUE + #ENDIF + + #IF ((INTMODE == 1) & (PLATFORM == PLT_SBC) & HTIMENABLE) +SYSTIMEN .SET TRUE + #ENDIF + + #IF ((INTMODE == 2) & (CPUFAM == CPU_Z180)) +SYSTIMEN .SET TRUE + #ENDIF + + .ECHO "TIMER INTERRUPT " + #IF SYSTIMEN + .ECHO "ACTIVE\n" + #ELSE + .ECHO "NOT ACTIVE\n" + #ENDIF + +#ENDIF diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index 7091f309..f0c57b42 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -104,8 +104,10 @@ SERIALCMDLOOP: JP Z,FILLMEM ; FILL MEMORY COMMAND CP 'H' ; IS IT A "H" (Y/N) JP Z,HELP ; HELP COMMAND + CP 'S' ; IS IT A "H" (Y/N) + JP Z,STOP ; STOP COMMAND CP 'X' ; IS IT A "X" (Y/N) - JP Z,HALT ; HALT COMMAND + JP Z,EXIT ; EXIT COMMAND LD HL,TXT_COMMAND ; POINT AT ERROR TEXT CALL PRTSTRH ; PRINT COMMAND LABEL @@ -148,17 +150,34 @@ BOOT: CALL $FFFD ; DO IT (RST 08 NOT SAFE HERE) JP 0 ; JUMP TO RESTART ADDRESS #ELSE - LD A,BID_BOOT ; BOOT BANK - LD HL,0 ; ADDRESS ZERO - CALL HB_BNKCALL ; DOES NOT RETURN + ;LD A,BID_BOOT ; BOOT BANK + ;LD HL,0 ; ADDRESS ZERO + ;CALL HB_BNKCALL ; DOES NOT RETURN + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_COLD ; COLD START + CALL $FFF0 ; CALL HBIOS #ENDIF ; -;__HALT_______________________________________________________________________ +;__EXIT_______________________________________________________________________ ; -; PERFORM HALT ACTION +; PERFORM EXIT ACTION ;_____________________________________________________________________________ ; -HALT: +EXIT: +#IF (BIOS == BIOS_UNA) + JR BOOT +#ELSE + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS +#ENDIF +; +;__STOP_______________________________________________________________________ +; +; PERFORM STOP ACTION (HALT SYSTEM) +;_____________________________________________________________________________ +; +STOP: DI HALT ; @@ -924,7 +943,8 @@ TXT_HELP .TEXT "\r\nMonitor Commands (all values in hex):" .TEXT "\r\nO xx yy - Output to port xx value yy" .TEXT "\r\nP xxxx - Program RAM at xxxx" .TEXT "\r\nR xxxx - Run code at xxxx" - .TEXT "\r\nX - Halt system" + .TEXT "\r\nS - Stop system (HALT)" + .TEXT "\r\nX - Exit monitor" .TEXT "$" ; #IF DSKYENABLE diff --git a/Source/HBIOS/eastaegg.asm b/Source/HBIOS/eastaegg.asm index 35c4c982..7d291165 100644 --- a/Source/HBIOS/eastaegg.asm +++ b/Source/HBIOS/eastaegg.asm @@ -179,10 +179,15 @@ waitch LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR RST 08 ; DO IT - ; RETURN TO THE LOADER - LD A,BID_BOOT ; BOOT BANK - LD HL,0 ; ADDRESS ZERO - CALL HB_BNKCALL ; DOES NOT RETURN + ;; RETURN TO THE LOADER + ;LD A,BID_BOOT ; BOOT BANK + ;LD HL,0 ; ADDRESS ZERO + ;CALL HB_BNKCALL ; DOES NOT RETURN + + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS + HALT #ENDIF #IF (BIOS == BIOS_UNA) diff --git a/Source/HBIOS/game.asm b/Source/HBIOS/game.asm index 8bbce38b..43d90b87 100644 --- a/Source/HBIOS/game.asm +++ b/Source/HBIOS/game.asm @@ -300,9 +300,14 @@ EXIT: ; CALL BDOS CALL PRTSTRDE - LD A,00H - LD HL,0000H - JP 0FFF9H + ;LD A,00H + ;LD HL,0000H + ;JP 0FFF9H + + LD B,0F0H + LD C,01H + CALL 0FFF0H + ; RET ISOVER: diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index fe3303e0..b136e875 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2325,16 +2325,50 @@ SYS_DISPATCH: JP Z,SYS_POKE ; $FB DEC A JP Z,SYS_INT ; $FC - CALL PANIC ; INVALID + DEC A ; -; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS +; RESTART SYSTEM +; SUBFUNCTION IN C ; SYS_RESET: + LD A,C ; GET REQUESTED SUB-FUNCTION + CP BF_SYSRES_INT + JR Z,SYS_RESINT + CP BF_SYSRES_WARM + JR Z,SYS_RESWARM + CP BF_SYSRES_COLD + JR Z,SYS_RESCOLD + OR $FF ; SIGNAL ERROR + RET +; +; SOFT RESET HBIOS, RELEASE HEAP MEMORY NOT USED BY HBIOS +; +SYS_RESINT: LD HL,(HEAPCURB) ; GET HBIOS HEAP THRESHOLD LD (CB_HEAPTOP),HL ; RESTORE HEAP TOP XOR A RET ; +; GO BACK TO ROM BOOT LOADER +; +SYS_RESWARM: + CALL SYS_RESINT + ; PERFORM BANK CALL TO OS IMAGES BANK IN ROM + LD SP,HBX_LOC ; STACK JUST BELOW HBIOS PROXY + LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK + LD HL,0 ; ENTER AT ADDRESS 0 + CALL HBX_BNKCALL ; GO THERE + HALT ; WE SHOULD NEVER COME BACK! +; +; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON +; +SYS_RESCOLD: + DI + LD SP,HBX_LOC ; STACK JUST BELOW HBIOS PROXY + LD A,BID_BOOT ; BOOT BANK + LD HL,0 ; ADDRESS ZERO + CALL HB_BNKCALL ; DOES NOT RETURN +; ; GET THE CURRENT HBIOS VERSION ; ON INPUT, C=0 ; RETURNS VERSION IN DE AS BCD diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 068114c3..fadb8345 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -90,6 +90,10 @@ BF_SYSPEEK .EQU BF_SYS + 10 ; GET A BYTE VALUE FROM ALT BANK BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS ; +BF_SYSRES_INT .EQU $00 ; RESET HBIOS INTERNAL +BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER) +BF_SYSRES_COLD .EQU $02 ; COLD START +; BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT diff --git a/Source/HBIOS/nascom.asm b/Source/HBIOS/nascom.asm index 1449c741..6b9e7297 100644 --- a/Source/HBIOS/nascom.asm +++ b/Source/HBIOS/nascom.asm @@ -4715,9 +4715,13 @@ MONOUT: POP AF RET -MONITR: LD A,BID_BOOT ; BOOT BANK - LD HL,0 ; ADDRESS ZERO - CALL HB_BNKCALL ; DOES NOT RETURN +MONITR: ;LD A,BID_BOOT ; BOOT BANK + ;LD HL,0 ; ADDRESS ZERO + ;CALL HB_BNKCALL ; DOES NOT RETURN + + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS INITST: LD A,0 ; Clear break flag LD (BRKFLG),A diff --git a/Source/HBIOS/tastybasic.asm b/Source/HBIOS/tastybasic.asm index 243cce39..75162e67 100644 --- a/Source/HBIOS/tastybasic.asm +++ b/Source/HBIOS/tastybasic.asm @@ -1250,9 +1250,12 @@ st4: #ifndef ZEMU bye: call endchk ; ** Reboot ** - LD A,BID_BOOT ; BOOT BANK - LD HL,0 ; ADDRESS ZERO - CALL HB_BNKCALL ; DOES NOT RETURN + ;LD A,BID_BOOT ; BOOT BANK + ;LD HL,0 ; ADDRESS ZERO + ;CALL HB_BNKCALL ; DOES NOT RETURN + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS HALT #endif new: diff --git a/Source/HBIOS/usrrom.asm b/Source/HBIOS/usrrom.asm index 9a03a38d..c230e0f9 100644 --- a/Source/HBIOS/usrrom.asm +++ b/Source/HBIOS/usrrom.asm @@ -13,9 +13,12 @@ LF .EQU 0AH CALL CIN ; DO STUFF ; - LD A,00H ; RETURN TO ROM LOADER - LD HL,0000H - JP 0FFF9H + ;LD A,00H ; RETURN TO ROM LOADER + ;LD HL,0000H + ;JP 0FFF9H + LD B,BF_SYSRESET ; SYSTEM RESTART + LD C,BF_SYSRES_WARM ; WARM START + CALL $FFF0 ; CALL HBIOS ; RET ; ; diff --git a/Source/Images/hdnew_prefix.bin b/Source/Images/hdnew_prefix.bin index 8ab54de5..5ddb7549 100644 Binary files a/Source/Images/hdnew_prefix.bin and b/Source/Images/hdnew_prefix.bin differ diff --git a/Source/ver.inc b/Source/ver.inc index bd32d35c..863b88bf 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.9" +#DEFINE BIOSVER "3.1.1-pre.10" diff --git a/Source/ver.lib b/Source/ver.lib index 2fd6a46f..d8f586c1 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.9" + db "3.1.1-pre.10" endm