From b6aa769f120668c0d4de7c8fdc4c73c6ad9cb00b Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 1 Feb 2022 17:42:31 -0800 Subject: [PATCH] Finalize CPUSPD The CPUSPD app is now considered stable and fully supported. I have added the application and the API's to the documentation. --- Doc/ROM Applications.pdf | Bin 193895 -> 193897 bytes Doc/RomWBW Applications.pdf | Bin 229563 -> 241325 bytes Doc/RomWBW Architecture.pdf | Bin 451133 -> 451481 bytes Doc/RomWBW Disk Catalog.pdf | Bin 134793 -> 134793 bytes Doc/RomWBW Getting Started.pdf | Bin 272619 -> 272620 bytes ReadMe.md | 4 +- ReadMe.txt | 4 +- Source/Apps/Build.cmd | 1 + Source/Apps/Clean.cmd | 1 + Source/Apps/Makefile | 2 +- Source/Apps/Test/Build.cmd | 1 - Source/Apps/Test/Clean.cmd | 1 - Source/Apps/Test/Makefile | 2 +- Source/Apps/Test/cpuspd/Makefile | 7 - Source/Apps/{Test => }/cpuspd/Build.cmd | 2 +- Source/Apps/{Test => }/cpuspd/Clean.cmd | 0 Source/Apps/cpuspd/Makefile | 7 + Source/Apps/{Test => }/cpuspd/cpuspd.asm | 227 ++++++++++++++-- Source/Doc/Applications.md | 70 ++++- Source/Doc/Architecture.md | 16 +- Source/Doc/GettingStarted.md | 3 +- Source/HBIOS/hbios.asm | 315 ++++++++++++++++++----- Source/Images/fd_bp.txt | 1 + Source/Images/fd_cpm22.txt | 1 + Source/Images/fd_cpm3.txt | 1 + Source/Images/fd_nzcom.txt | 1 + Source/Images/fd_zpm3.txt | 1 + Source/Images/fd_zsdos.txt | 1 + Source/Images/hd_bp.txt | 1 + Source/Images/hd_cpm22.txt | 1 + Source/Images/hd_cpm3.txt | 1 + Source/Images/hd_nzcom.txt | 1 + Source/Images/hd_zpm3.txt | 1 + Source/Images/hd_zsdos.txt | 1 + Source/RomDsk/Build.cmd | 2 +- Source/RomDsk/Makefile | 2 +- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 38 files changed, 582 insertions(+), 101 deletions(-) delete mode 100644 Source/Apps/Test/cpuspd/Makefile rename Source/Apps/{Test => }/cpuspd/Build.cmd (71%) rename Source/Apps/{Test => }/cpuspd/Clean.cmd (100%) create mode 100644 Source/Apps/cpuspd/Makefile rename Source/Apps/{Test => }/cpuspd/cpuspd.asm (51%) diff --git a/Doc/ROM Applications.pdf b/Doc/ROM Applications.pdf index 62badcd653f20aefc5e0f14e0be67b3f3ffe85de..5d7c2dacdf8c3183bad07b8a7c328372f3460a03 100644 GIT binary patch delta 11921 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 diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index e1e22c70906cba88cce9e2243cae46b525d5280f..bb6a0000440b7909589057f3abefcf8149169fd5 100644 GIT binary patch delta 51252 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 B@&Et; delta 41231 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 diff --git a/Doc/RomWBW Architecture.pdf b/Doc/RomWBW Architecture.pdf index fcc7429803501b9db7cafbec21f8cdc3cb3630a6..8a8dd61e19b7a43b9c1be99ea980e4f5a3f8a2b7 100644 GIT binary patch delta 16198 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 D2QS4z delta 15895 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 U-hmbJu%t%!)ap$6^$10Yvapa1{> diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 5853df285d8d123146dd46b31f3eb6a7a7b2c1de..c5255721f4b15c8e09e9fcab555d2a9a2f971b42 100644 GIT binary patch delta 510 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 diff --git a/ReadMe.md b/ReadMe.md index 979af801..7d626167 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ author: "Wayne Warthen (mailto:wwarthen@gmail.com)" classoption: - oneside colorlinks: true -date: 26 Jan 2022 +date: 01 Feb 2022 documentclass: book fontfamily: helvet fontsize: 12pt @@ -44,7 +44,7 @@ toc-depth: 1 ## Z80/Z180 System Software Version 3.1 Pre-release -26 Jan 2022 +01 Feb 2022 Wayne Warthen diff --git a/ReadMe.txt b/ReadMe.txt index ca05cffe..b94fb4d5 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW Getting Started Wayne Warthen (mailto:wwarthen@gmail.com) -26 Jan 2022 +01 Feb 2022 @@ -17,7 +17,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -26 Jan 2022 +01 Feb 2022 Wayne Warthen wwarthen@gmail.com diff --git a/Source/Apps/Build.cmd b/Source/Apps/Build.cmd index 0e27703a..cbcf8a01 100644 --- a/Source/Apps/Build.cmd +++ b/Source/Apps/Build.cmd @@ -35,6 +35,7 @@ pushd ZMP && call Build || exit /b & popd pushd ZMD && call Build || exit /b & popd pushd Dev && call Build || exit /b & popd pushd VGM && call Build || exit /b & popd +pushd cpuspd && call Build || exit /b & popd copy *.com %APPBIN%\ || exit /b diff --git a/Source/Apps/Clean.cmd b/Source/Apps/Clean.cmd index 0ee31190..198f461d 100644 --- a/Source/Apps/Clean.cmd +++ b/Source/Apps/Clean.cmd @@ -16,3 +16,4 @@ pushd ZMP && call Clean || exit /b 1 & popd pushd ZMD && call Clean || exit /b 1 & popd pushd Dev && call Clean || exit /b 1 & popd pushd VGM && call Clean || exit /b 1 & popd +pushd cpuspd && call Clean || exit /b 1 & popd diff --git a/Source/Apps/Makefile b/Source/Apps/Makefile index 51060be0..96d2411c 100644 --- a/Source/Apps/Makefile +++ b/Source/Apps/Makefile @@ -1,7 +1,7 @@ OBJECTS = sysgen.com survey.com \ syscopy.com assign.com format.com talk.com mode.com rtc.com \ timer.com rtchb.com -SUBDIRS = XM FDU FAT Tune Test ZMP ZMD Dev VGM +SUBDIRS = XM FDU FAT Tune Test ZMP ZMD Dev VGM cpuspd DEST = ../../Binary/Apps TOOLS =../../Tools diff --git a/Source/Apps/Test/Build.cmd b/Source/Apps/Test/Build.cmd index f8e126d4..fb322d6b 100644 --- a/Source/Apps/Test/Build.cmd +++ b/Source/Apps/Test/Build.cmd @@ -22,7 +22,6 @@ pushd rzsz && call Build || exit /b & popd pushd vdctest && call Build || exit /b & popd pushd kbdtest && call Build || exit /b & popd pushd ps2info && call Build || exit /b & popd -pushd cpuspd && call Build || exit /b & popd goto :eof diff --git a/Source/Apps/Test/Clean.cmd b/Source/Apps/Test/Clean.cmd index 7cedf243..9e1f36d9 100644 --- a/Source/Apps/Test/Clean.cmd +++ b/Source/Apps/Test/Clean.cmd @@ -17,4 +17,3 @@ pushd rzsz && call Clean || exit /b 1 & popd pushd vdctest && call Clean || exit /b 1 & popd pushd kbdtest && call Clean || exit /b 1 & popd pushd ps2info && call Clean || exit /b 1 & popd -pushd cpuspd && call Clean || exit /b 1 & popd diff --git a/Source/Apps/Test/Makefile b/Source/Apps/Test/Makefile index db9b6b34..aed32df2 100644 --- a/Source/Apps/Test/Makefile +++ b/Source/Apps/Test/Makefile @@ -1,5 +1,5 @@ OBJECTS = -SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info cpuspd +SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info DEST = ../../../Binary/Apps/Test TOOLS =../../../Tools diff --git a/Source/Apps/Test/cpuspd/Makefile b/Source/Apps/Test/cpuspd/Makefile deleted file mode 100644 index aedcb761..00000000 --- a/Source/Apps/Test/cpuspd/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -OBJECTS = cpuspd.com -DEST = ../../../../Binary/Apps/Test -TOOLS =../../../../Tools - -USETASM=1 - -include $(TOOLS)/Makefile.inc \ No newline at end of file diff --git a/Source/Apps/Test/cpuspd/Build.cmd b/Source/Apps/cpuspd/Build.cmd similarity index 71% rename from Source/Apps/Test/cpuspd/Build.cmd rename to Source/Apps/cpuspd/Build.cmd index c99af191..19b3439e 100644 --- a/Source/Apps/Test/cpuspd/Build.cmd +++ b/Source/Apps/cpuspd/Build.cmd @@ -7,4 +7,4 @@ set TASMTABS=%TOOLS%\tasm32 tasm -t180 -g3 -fFF cpuspd.asm cpuspd.com cpuspd.lst || exit /b -copy /Y cpuspd.com ..\..\..\..\Binary\Apps\Test\ || exit /b +copy /Y cpuspd.com ..\..\..\Binary\Apps\ || exit /b diff --git a/Source/Apps/Test/cpuspd/Clean.cmd b/Source/Apps/cpuspd/Clean.cmd similarity index 100% rename from Source/Apps/Test/cpuspd/Clean.cmd rename to Source/Apps/cpuspd/Clean.cmd diff --git a/Source/Apps/cpuspd/Makefile b/Source/Apps/cpuspd/Makefile new file mode 100644 index 00000000..c8025816 --- /dev/null +++ b/Source/Apps/cpuspd/Makefile @@ -0,0 +1,7 @@ +OBJECTS = cpuspd.com +DEST = ../../../Binary/Apps +TOOLS =../../../Tools + +USETASM=1 + +include $(TOOLS)/Makefile.inc \ No newline at end of file diff --git a/Source/Apps/Test/cpuspd/cpuspd.asm b/Source/Apps/cpuspd/cpuspd.asm similarity index 51% rename from Source/Apps/Test/cpuspd/cpuspd.asm rename to Source/Apps/cpuspd/cpuspd.asm index 71a22684..0aecb7f8 100644 --- a/Source/Apps/Test/cpuspd/cpuspd.asm +++ b/Source/Apps/cpuspd/cpuspd.asm @@ -8,12 +8,14 @@ ; ;======================================================================= ; -#include "../../../HBIOS/hbios.inc" +#include "../../HBIOS/hbios.inc" ; ; General operational equates (should not requre adjustment) ; stksiz .equ $40 ; Working stack size ; +cpumhz .equ 30 ; for time delay calculations (not critical) +; rtc_port .equ $70 ; RTC latch port adr ; restart .equ $0000 ; CP/M restart vector @@ -46,21 +48,64 @@ exit: ;======================================================================= ; main: -; -; Get HBIOS platform ID -; - ; Use first char of FCB for speed selection - ld a,($5D) - cp ' ' - jr z,show_spd - and $5F ; make upper case - cp 'D' ; double - jr z,set_dbl - cp 'F' ; full - jr z,set_full - cp 'H' ; half + ; skip to start of first parm + ld ix,$81 ; point to start of parm area (past len byte) + call nonblank ; skip to next non-blank char + jp z,show_spd ; no parms, show current settings +; +main1: + ; process options (if any) + cp '/' ; option prefix? + jr nz,main2 ; not an option, continue + call option ; process option + ret nz ; some options mean we are done (e.g., "/?") + inc ix ; skip option character + call nonblank ; skip whitespace + jr main1 ; continue option checking +; +main2: + ; parse speed string (half, full, double) + call getalpha ; extract speed ("HALF", "FULL", "DOUBLE") +; + call nonblank ; skip whitespace + jp z,set_spd ; if nothing else, set new speed + cp ',' ; parm separator + jp nz,err_parm ; invalid format, show usage and abort + inc ix ; pass separator + call nonblank ; skip whitespace + jp z,set_spd ; if nothing else, set new speed + call isnum ; start of parm? + jr c,main3 ; nope, try skipping this parm + call getnum ; get memory wait states + jp c,err_parm ; if overflow, show usage and abort + ld (ws_mem),a ; save memory wait states +; +main3: + call nonblank ; skip whitespace + jp z,set_spd ; if nothing else, set new speed + cp ',' ; parm separator + jp nz,err_parm ; invalid format, show usage and abort + inc ix ; pass separator + call nonblank ; skip whitespace + jp z,set_spd ; if nothing else, set new speed + call getnum ; get I/O wait states + jp c,err_parm ; if overflow, show usage and abort + ld (ws_io),a ; save memory wait states +; + call nonblank ; skip whitespace + jp nz,err_parm ; invalid format, show usage and abort + ; +; +set_spd: + ld a,(tmpstr) + cp 'H' jr z,set_half - jr usage + cp 'F' + jr z,set_full + cp 'D' + jr z,set_dbl + jp err_parm + ret ; set_half: ld l,0 @@ -75,8 +120,13 @@ set_dbl: jr new_spd ; new_spd: + call delay ld b,BF_SYSSET ld c,BF_SYSSET_CPUSPD + ld a,(ws_mem) + ld d,a + ld a,(ws_io) + ld e,a rst 08 jp nz,err_not_sup call show_spd @@ -129,6 +179,16 @@ show_spd2: show_spd3: ret ; +; Handle special options +; +option: +; + inc ix ; next char + ld a,(ix) ; get it + cp '?' ; is it a '?' as expected? + jp z,usage ; yes, display usage + jp err_parm ; anything else is an error + usage: call crlf2 ld de,str_usage @@ -138,6 +198,9 @@ usage: ; ; Error Handlers ; +err_parm: + ld de,str_err_parm + jr err_ret err_not_sup: ld de,str_err_not_sup jr err_ret @@ -327,6 +390,99 @@ prtdec2: call prtchr ret ; +; Get the next non-blank character from (HL). +; +nonblank: + ld a,(ix) ; load next character + or a ; string ends with a null + ret z ; if null, return pointing to null + cp ' ' ; check for blank + ret nz ; return if not blank + inc ix ; if blank, increment character pointer + jr nonblank ; and loop +; +; Get alpha chars and save in tmpstr +; Length of string returned in A +; +getalpha: +; + ld hl,tmpstr ; location to save chars + ld b,8 ; length counter (tmpstr max chars) + ld c,0 ; init character counter +; +getalpha1: + ld a,(ix) ; get active char + call ucase ; lower case -> uppper case, if needed + cp 'A' ; check for start of alpha range + jr c,getalpha2 ; not alpha, get out + cp 'Z' + 1 ; check for end of alpha range + jr nc,getalpha2 ; not alpha, get out + ; handle alpha char + ld (hl),a ; save it + inc c ; bump char count + inc hl ; inc string pointer + inc ix ; increment buffer ptr + djnz getalpha1 ; if space, loop for more chars +; +getalpha2: ; non-alpha, clean up and return + ld (hl),0 ; terminate string + ld a,c ; string length to A + or a ; set flags + ret ; and return +; +; Determine if byte in A is a numeric '0'-'9' +; Return with CF clear if it is numeric +; +isnum: + cp '0' + jr c,isnum1 ; too low + cp '9' + 1 + jr nc,isnum1 ; too high + or a ; clear CF + ret +isnum1: + or a ; clear CF + ccf ; set CF + ret + +; +; Get numeric chars and convert to number returned in A +; Carry flag set on overflow +; +getnum: + ld c,0 ; C is working register +getnum1: + ld a,(ix) ; get the active char + cp '0' ; compare to ascii '0' + jr c,getnum2 ; abort if below + cp '9' + 1 ; compare to ascii '9' + jr nc,getnum2 ; abort if above +; + ; valid digit, add new digit to C + ld a,c ; get working value to A + rlca ; multiply by 10 + ret c ; overflow, return with carry set + rlca ; ... + ret c ; overflow, return with carry set + add a,c ; ... + ret c ; overflow, return with carry set + rlca ; ... + ret c ; overflow, return with carry set + ld c,a ; back to C + ld a,(ix) ; get new digit + sub '0' ; make binary + add a,c ; add in working value + ret c ; overflow, return with carry set + ld c,a ; back to C +; + inc ix ; bump to next char + jr getnum1 ; loop +; +getnum2: ; return result + ld a,c ; return result in A + or a ; with flags set, CF is cleared + ret +; ; Start a new line ; crlf2: @@ -340,6 +496,16 @@ crlf: pop af ; restore AF ret ; +; Convert character in A to uppercase +; +ucase: + cp 'a' ; if below 'a' + ret c ; ... do nothing and return + cp 'z' + 1 ; if above 'z' + ret nc ; ... do nothing and return + res 5,a ; clear bit 5 to make lower case -> upper case + ret ; and return +; ; Add hl,a ; ; A register is destroyed! @@ -351,21 +517,41 @@ addhla: inc h ret ; +; Delay ~10ms +; +delay: + push af + push de + ld de,625 ; 10000us/16us +delay0: + ld a,cpumhz - 2 +delay1: + dec a + jr nz,delay1 + dec de + ld a,d + or e + jp nz,delay0 + pop de + pop af + ret +; ; ;======================================================================= ; Constants ;======================================================================= ; -str_banner .db "RomWBW CPU Speed Selector v0.2, 26-Jan-2022",0 +str_banner .db "RomWBW CPU Speed Selector v0.4, 31-Jan-2022",0 str_spacer .db " ",0 str_slow .db " CPU speed is HALF",0 str_full .db " CPU speed is FULL",0 str_dbl .db " CPU speed is DOUBLE",0 str_memws .db " Memory Wait State(s)",0 str_iows .db " I/O Wait State(s)",0 +str_err_parm .db " Parameter error (CPUSPD /? for usage)",0 str_err_not_sup .db " ERROR: Platform or configuration not supported!",0 str_err_invalid .db " ERROR: Invalid configuration!",0 -str_usage .db " Usage: CPUSPD [Half|Full|Double]",0 +str_usage .db " Usage: CPUSPD [(Half|Full|Double)[,[,]]]",0 ; ;======================================================================= ; Working data @@ -374,6 +560,13 @@ str_usage .db " Usage: CPUSPD [Half|Full|Double]",0 stksav .dw 0 ; stack pointer saved at start .fill stksiz,0 ; stack stack .equ $ ; stack top +; +; +tmpstr .fill 9,0 ; temp string (8 chars, 0 term) +ws_mem .db $FF ; memory wait states +ws_io .db $FF ; I/O wait states + + ; ;======================================================================= ; diff --git a/Source/Doc/Applications.md b/Source/Doc/Applications.md index 4a2d6a2e..c4680d04 100644 --- a/Source/Doc/Applications.md +++ b/Source/Doc/Applications.md @@ -47,7 +47,8 @@ found: | TALK | Yes | Yes | Yes | | RTC | Yes | Yes | Yes | | TIMER | Yes | Yes | Yes | -| INTTEST | Yes | Yes | Yes | +| CPUSPD | Yes | Yes | Yes | +| INTTEST | No | Yes | Yes | | FAT | No | Yes | Yes | | TUNE | No | Yes | Yes | @@ -955,3 +956,70 @@ player code is from MYMPLAY 0.4 by Lieves!Tuore and the PT player code is (c)2004-2007 S.V.Bulba . The source code is provided in the RomWBW distribution. + +# CPUSPD + +The `CPUSPD` application is used to change the running speed and wait +states of a RomWBW system. + + The functionality is highly dependent on +the capabilities of your system. + +At present, all Z180 systems can change their CPU speed and their +wait states. SBC and MBC systems may be able to change their CPU +speed if the hardware supports it and it is enabled in the HBIOS +configuration. + +## Syntax + +| `CPUSPD [`*``*`[,[`*``*`][,[`*``*`]]]` + +*``* is one of HALF, FULL, or DOUBLE. +*``* is a number specifying the desired memory wait states. +*``* is a number specifying the desired I/O wait states. + +## Usage + +Entering `CPUSPD` with no parameters will display the current CPU speed +and wait state information of the running system. Wait state +information is not available for all systems. + +To modify the running speed of a system, you can specify the +`*``*` parameter. To modify either or both of the wait +states, you can enter the desired number. Either or both of the wait +state parameters may be omitted and the current wait state settings +will remain in effect. + +## Notes + +The ability to modify the running speed and wait states of a system +varies widely depending on the hardware capabilities and the HBIOS +configuration settings. + +Note that it is frequently impossible to tell if a system is capable +of dynamic speed changes. This function makes the changes blindly. +If an attempt is made to change the speed of a system +that is definitely incapable of doing so, then an error result is +returned. + +The `CPUSPD` command makes no attempt to ensure that the new CPU +speed will actually work on the current hardware. Setting a CPU +speed that exceeds the capabilities of the system will result in +unstable operation or a system stall. + +Some peripherals are dependant on the CPU speed. For example, the Z180 +ASCI baud rate and system timer are derived from the CPU speed. The +CPUSPD applicastion will attempt to adjust these peripherals for +correct operation after modifying the CPU speed. However, in some +cases this may not be possible. The baud rate of ASCI ports have a +limited set of divisors. If there is no satisfactory divisor to +retain the existing baud rate under the new CPU speed, then the baud +rate of the ASCI port(s) will be affected. + +## Etymology + +The `CPUSPD` application was custom written for RomWBW. All of the +hardware interface code is specific to RomWBW and the application will +not operate correctly on non-RomWBW systems. + +The source code is provided in the RomWBW distribution. diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index a761c02d..6d542843 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -2034,10 +2034,18 @@ This function will modify the running CPU speed attributes of a system. Note that it is frequently impossible to tell if a system is capable of dynamic speed changes. This function makes the changes blindly. You can specify 0xFF for either of the wait state settings to have them -left alone. - -In the case of the Z180, the SIO port buad rate is derived from the CPU -speed. So, when the speed is changed the baud rate will change. +left alone. If an attempt is made to change the speed of a system +that is definitely incapable of doing so, then an error result is +returned. + +Some peripherals are dependant on the CPU speed. For example, the Z180 +ASCI baud rate and system timer are derived from the CPU speed. The +Set CPU Speed function will attempt to adjust these peripherals for +correct operation after modifying the CPU speed. However, in some +cases this may not be possible. The baud rate of ASCI ports have a +limited set of divisors. If there is no satisfactory divisor to +retain the existing baud rate under the new CPU speed, then the baud +rate of the ASCI port(s) will be affected. ### Function 0xFA -- System Peek (SYSPEEK) diff --git a/Source/Doc/GettingStarted.md b/Source/Doc/GettingStarted.md index 1c31f15b..899b8c34 100644 --- a/Source/Doc/GettingStarted.md +++ b/Source/Doc/GettingStarted.md @@ -424,7 +424,7 @@ therefore, globally available. | TALK | Direct console I/O to a specified character device. | | RTC | Manage and test the Real Time Clock hardware. | | TIMER | Display value of running periodic system timer. | -| INTTEST | Test interrupt vector hooking. | +| CPUSPD | Change the running CPU speed and wait states of the system. | Some custom applications do not fit on the ROM disk. They are found on the disk image files or the individual files can be found in the Binary\\Apps @@ -434,6 +434,7 @@ directory of the distribution. | ----------- | -------------------------------------------------------------- | | TUNE | Play .PT2, .PT3, .MYM audio files. | | FAT | Access MS-DOS FAT filesystems from RomWBW (based on FatFs). | +| INTTEST | Test interrupt vector hooking. | Additional documentation on all of these applications can be found in "RomWBW Applications.pdf" in the Doc directory of the distribution. diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 18f9a886..5e6cfe42 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -70,8 +70,6 @@ ; #DEFINE HBIOS ; -;;;#DEFINE TESTING -; ; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. ; MODCNT .EQU 0 @@ -188,19 +186,11 @@ RTCDEF .SET RTCDEF | %00000001 ; SC128 I2C SCL BIT #ENDIF ; #IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC)) - #IF (CPUSPDDEF==SPD_HIGH) -RTCDEF .SET RTCDEF | %00001000 ; DEFAULT SPEED HIGH - #ELSE -RTCDEF .SET RTCDEF & ~%00001000 ; DEFAULT SPEED LOW - #ENDIF +RTCDEF .SET RTCDEF & ~%00001000 ; INITIAL SPEED LOW #ENDIF ; #IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_SBC)) - #IF (CPUSPDDEF==SPD_HIGH) -RTCDEF .SET RTCDEF & ~%00001000 ; DEFAULT SPEED HIGH - #ELSE -RTCDEF .SET RTCDEF | %00001000 ; DEFAULT SPEED LOW - #ENDIF +RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW #ENDIF ; ; @@ -1775,56 +1765,119 @@ HB_CPU1: OUT ($6D),A ; IMPLEMENT IT ; #ENDIF +; + DIAG(%00011111) +; +; INIT OSCILLATOR SPEED FROM CONFIG +; + LD HL,CPUOSC / 1000 + LD (HB_CPUOSC),HL +; +; ATTEMPT DYNAMIC CPU SPEED DERIVATION +; NOTE THAT FOR PLATFORMS WITH SOFTWARE SELECTABLE CPU SPEED, +; THIS IS BEING DONE WITH THE CPU SPEED SET TO THE LOWEST +; POSSIBLE SETTING. THE FINAL CPU SPEED WILL BE ADJUSTED +; LATER. +; + CALL HB_CPUSPD ; CPU SPEED DETECTION + JR NZ,HB_CPUSPD2 ; SKIP IF FAILED +; +; RECORD THE UPDATED CPU OSCILLATOR SPEED +; +#IF ((CPUFAM == CPU_Z180) | (CPUSPDCAP == SPD_HILO)) + ; SPEED MEASURED WILL BE HALF OSCILLATOR SPEED + ; SO RECORD DOUBLE THE MEASURED VALUE + SLA L + RL H + LD (HB_CPUOSC),HL +#ENDIF +; +HB_CPUSPD2: +; +; INIT CPUKHZ BASED ON OSCILLATOR SPEED +; + LD HL,(HB_CPUOSC) +; +; TRANSITION TO FINAL DESIRED CPU SPEED FOR THOSE PLATFORMS +; THAT SUPPORT SOFTWARE SELECTABLE CPU SPEED. UPDATE CB_CPUKHZ +; IN HCB AS WE DO THIS. +; +#IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC) & (CPUSPDDEF==SPD_HIGH)) + ; SET HIGH SPEED VIA RTC LATCH + LD A,(HB_RTCVAL) + OR %00001000 ; SET HI SPEED BIT + LD (HB_RTCVAL),A ; SAVE SHADOW + OUT (RTCIO),A ; IMPLEMENT + ; HL IS ALREADY CORRECT FOR FULL SPEED OPERATION +#ELSE + ; ADJUST HL TO REFLECT HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION +#ENDIF +; +#IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_SBC) & (CPUSPDDEF==SPD_HIGH)) + ; SET HIGH SPEED VIA RTC LATCH + LD A,(HB_RTCVAL) + AND ~%00001000 ; CLEAR HI SPEED BIT + LD (HB_RTCVAL),A ; SAVE SHADOW + OUT (RTCIO),A ; IMPLEMENT + ; HL IS ALREADY CORRECT FOR FULL SPEED OPERATION +#ELSE + ; ADJUST HL TO REFLECT HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION +#ENDIF ; #IF (CPUFAM == CPU_Z180) ; - ; AT BOOT, Z180 PHI IS OSC / 2 - LD C,(CPUOSC / 2) / 1000000 - LD DE,(CPUOSC / 2) / 1000 + LD HL,(HB_CPUOSC) ; INIT HL TO CPU OSC FREQ (KHZ) ; - #IF (Z180_CLKDIV >= 1) + #IF (Z180_CLKDIV == 0) + ; ADJUST HL TO REFLECT HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION + #ENDIF +; + #IF (Z180_CLKDIV == 1) LD A,(HB_CPUTYPE) ; GET CPU TYPE CP 2 ; Z8S180 REV K OR BETTER? - JR C,HB_CPU2 ; IF NOT, NOT POSSIBLE! + JR C,HB_CPU3 ; IF NOT, NOT POSSIBLE! ; SET CLOCK DIVIDE TO 1 RESULTING IN FULL XTAL SPEED LD A,$80 OUT0 (Z180_CCR),A - ; REFLECT SPEED CHANGE - LD C,CPUOSC / 1000000 - LD DE,CPUOSC / 1000 + ; HL ALREADY REFLECTS FULL SPEED OPERATION #ENDIF - +; #IF (Z180_CLKDIV >= 2) LD A,(HB_CPUTYPE) ; GET CPU TYPE CP 3 ; Z8S180 REV N OR BETTER? - JR C,HB_CPU2 ; IF NOT, NOT POSSIBLE! + JR C,HB_CPU3 ; IF NOT, NOT POSSIBLE! ; SET CPU MULTIPLIER TO 1 RESULTING IN XTAL * 2 SPEED ; ALSO SET CCR AGAIN BECAUSE OF REPORTS THAT CCR ; *MUST* BE SET AFTER CMR. LD A,$80 OUT0 (Z180_CMR),A ; CPU MULTIPLIER OUT0 (Z180_CCR),A ; CLOCK DIVIDE - ; REFLECT SPEED CHANGE - LD C,(CPUOSC * 2) / 1000000 - LD DE,(CPUOSC * 2) / 1000 + ; ADJUST HL TO REFLECT DOUBLE SPEED OPERATION + SLA L + RL H #ENDIF ; -HB_CPU2: - ; SAVE CPU SPEED IN CONFIG BLOCK - LD A,C - LD (CB_CPUMHZ),A - LD (CB_CPUKHZ),DE -; +HB_CPU3: #ENDIF ; - DIAG(%00011111) -; -; PERFORM DYNAMIC CPU SPEED DERIVATION +; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. +; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. ; - CALL HB_CPUSPD ; CPU SPEED DETECTION -; - LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT - CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY + LD (CB_CPUKHZ),HL ; UPDATE CPUKHZ + LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ + CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER + LD DE,500 ; SET UP TO ROUND UP + XOR A ; IF WITHIN 500 KHZ + SBC HL,DE ; REMAINDER - 500 + CCF ; COMPLEMENT CF + ADC A,C ; C -> A; ADD CF FOR ROUNDING + LD (CB_CPUMHZ),A ; SAVE IT ; #IF (CPUFAM == CPU_Z180) ; @@ -1855,6 +1908,9 @@ HB_CPU2: LDCTL (C),HL ; #ENDIF +; + LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT + CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY ; #IF (INTMODE == 2) ; SETUP Z80 IVT AND INT MODE 2 @@ -1931,6 +1987,8 @@ HB_CPU2: ; NOW IF DIVIDE BOTH SIDES BY 1000, WE CAN USE ; CPUKHZ VALUE AND SIMPLIFY TO ; RLDR = CPUKHZ + XOR A ; ALL BITS ZERO + OUT0 (Z180_TCR),A ; ... INHIBITS TIMER OPERATION LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ OUT0 (Z180_TMDR0L),L ; INITIALIZE TIMER 0 DATA REGISTER OUT0 (Z180_TMDR0H),H @@ -1997,6 +2055,7 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT CALL FILL ; DO IT ; DIAG(%00111111) +; #IF FALSE ; ; TEST DEBUG *************************************************************************************** @@ -2025,8 +2084,6 @@ NOT_REC_M0: CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE ; #IF (DSKYENABLE) - ;CALL DSKY_PREINIT - LD HL,MSG_HBVER + 5 LD A,(DSKY_HEXMAP + RMJ) OR $80 @@ -3812,14 +3869,18 @@ SYS_GETBNKINFO: ; SYS_GETCPUSPD: ; -#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) +#IF (((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) & (CPUSPDCAP==SPD_HILO)) LD A,(HB_RTCVAL) BIT 3,A +#IF (PLATFORM == PLT_SBC) + XOR %00001000 ; SBC SPEED BIT IS INVERTED +#ENDIF LD L,0 ; ASSUME HALF SPEED JR Z,SYS_GETCPUSPD1 LD L,1 SYS_GETCPUSPD1: LD DE,$FFFF ; UNKNOWN WAIT STATES +; XOR A RET #ENDIF @@ -4040,9 +4101,9 @@ SYS_SETSECS: ; SYS_SETCPUSPD: ; -#IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) +#IF (((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) & (CPUSPDCAP==SPD_HILO)) ; -; WAIT STATE SETTINGS ARE IGNORED FOR Z80 +; NOTE: WAIT STATE SETTINGS ARE IGNORED FOR Z80 ; LD A,L ; CLK SPD TO ACCUM LD C,%00000000 ; HALF SPEED @@ -4056,24 +4117,69 @@ SYS_SETCPUSPD1: LD A,(HB_RTCVAL) AND ~%00001000 ; CLEAR SPEED BIT OR C ; IMPLEMENT NEW SPEED BIT +#IF (PLATFORM == PLT_SBC) + ; SBC SPEED BIT IS INVERTED, ADJUST IT + LD A,C + XOR %00001000 + LD C,A +#ENDIF LD (HB_RTCVAL),A ; SAVE IN SHADOW REGISTER OUT (RTCIO),A ; UPDATE HARDWARE REGISTER +; + ; UPDATE THE CURRENT CPU SPEED IN HCB! + LD A,L + LD HL,(HB_CPUOSC) ; ASSUME FULL SPEED + CP 1 ; CHECK FOR 1 (FULL SPEED) + JR Z,SYS_SETCPUSPD2 ; IF SO, ALL DONE + ; ADJUST HL TO REFLECT HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION +; +SYS_SETCPUSPD2: +; +; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. +; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. +; + LD (CB_CPUKHZ),HL ; UPDATE CPUKHZ + LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ + CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER + LD DE,500 ; SET UP TO ROUND UP + XOR A ; IF WITHIN 500 KHZ + SBC HL,DE ; REMAINDER - 500 + CCF ; COMPLEMENT CF + ADC A,C ; C -> A; ADD CF FOR ROUNDING + LD (CB_CPUMHZ),A ; SAVE IT +; + ; REINIT DELAY ROUTINE + LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT + CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY +; XOR A RET #ENDIF ; #IF (CPUFAM == CPU_Z180) + PUSH DE ; SAVE WAIT STATES FOR NOW LD A,L ; CLK SPD TO ACCUM LD B,0 ; B HAS BIT FOR CMR LD C,0 ; C HAS BIT FOR CCR CP 2 ; DOUBLE SPEED? - JR C,SYS_SETCPUSPD1 - LD B,%10000000 + JR C,SYS_SETCPUSPD1 ; <2?, SKIP AHEAD + LD B,%10000000 ; SET CMR BIT SYS_SETCPUSPD1: - CP 1 - JR C,SYS_SETCPUSPD2 - LD C,%10000000 + CP 1 ; FULL SPEED? + JR C,SYS_SETCPUSPD2 ; <1?, SKIP AHEAD + LD C,%10000000 ; SET CCR BIT SYS_SETCPUSPD2: + ; BEFORE IMPLEMENTING THE NEW CPU SPEED, WE SWITCH THE + ; WAIT STATES TO MAXIMUM BECAUSE WE MAY BE IMPLEMENTING + ; SLOWER WAIT STATES REQUIRED BY THE NEW SPEED. WE SAVE + ; THE ORIGINAL WAIT STATES REGISTER VALUE ON STACK + IN0 A,(Z180_DCNTL) ; GET CURRENT REGISTER VALUE + LD E,A ; PUT IN L + PUSH DE ; SAVE FOR LATER + OR %11110000 ; MAX WAIT STATES + OUT0 (Z180_DCNTL),A ; DO IT ; IN0 A,(Z180_CMR) AND ~%10000000 @@ -4084,6 +4190,105 @@ SYS_SETCPUSPD2: AND ~%10000000 OR C OUT0 (Z180_CCR),A +; + ; UPDATE THE CURRENT CPU SPEED IN HCB! + LD A,L ; SETTING TO A + LD HL,(HB_CPUOSC) ; START WITH CPU OSC VALUE + ; ADJUST HL TO REFLECT HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION + OR A ; CHECK FOR HALF SPEED + JR Z,SETCPUSPD2A ; IF SO, DONE + ; ADJUST HL TO REFLECT FULL SPEED OPERATION + SLA L + RL H + CP 1 ; CHECK FOR FULL SPEED + JR Z,SETCPUSPD2A ; IF SO DONE + ; ADJUST HL TO REFLECT DOUBLE SPEED OPERATION + SLA L + RL H +; +SETCPUSPD2A: +; +; HL SHOULD NOW HAVE FINAL CPU RUNNING SPEED IN KHZ. +; UPDATE CB_CPUMHZ/CB_CPUKHZ WITH THIS VALUE. +; + LD (CB_CPUKHZ),HL ; UPDATE CPUKHZ + LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ + CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER + LD DE,500 ; SET UP TO ROUND UP + XOR A ; IF WITHIN 500 KHZ + SBC HL,DE ; REMAINDER - 500 + CCF ; COMPLEMENT CF + ADC A,C ; C -> A; ADD CF FOR ROUNDING + LD (CB_CPUMHZ),A ; SAVE IT +; + ; NOW IMPLEMENT ANY WAIT STATE CHANGES. + POP HL ; INIT L WITH ORIG VALUE + POP DE ; RECOVER WAIT STATES + LD A,D ; GET MEM WS + CP $FF ; SKIP? + JR Z,SYS_SETCPUSPD3 ; IF SO, GO AHEAD + AND %00000011 ; JUST TWO BITS + RRCA ; MEM WS IS TOP TWO BITS + RRCA + LD H,A ; MOVE WS BITS TO H + LD A,L ; CUR VALUE TO A + AND %00111111 ; MASK OFF MEM WS BITS + OR H ; SET NEW MEM WS BITS + LD L,A ; BACK TO L +; +SYS_SETCPUSPD3: +; + LD A,E ; GET I/O WS + CP $FF ; SKIP? + JR Z,SYS_SETCPUSPD4 ; IF SO, GO AHEAD + DEC A ; ADJUST FOR BUILT-IN I/O WS + AND %00000011 ; JUST TWO BITS + RRCA ; I/O WS IS BITS 5-4 + RRCA + RRCA + RRCA + LD H,A ; MOVE WS BITS TO H + LD A,L ; CUR VALUE TO A + AND %11001111 ; MASK OFF I/O WS BITS + OR H ; SET NEW I/O WS BITS + LD L,A ; BACK TO L +; +SYS_SETCPUSPD4: + LD A,L ; WORKING VALUE TO A + OUT0 (Z180_DCNTL),A ; IMPLEMENT NEW VALUE +; + ; REINIT DELAY ROUTINE + LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT + CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY +; + #IF ((INTMODE == 2) & (Z180_TIMER)) + ; THE Z180 TIMER IS BASED ON CPU SPEED. SO HERE + ; WE RECOMPUTE THE TIMER CONSTANTS BASED ON THE NEW SPEED. + XOR A ; ALL BITS ZERO + OUT0 (Z180_TCR),A ; ... INHIBITS TIMER OPERATION + LD HL,(CB_CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ + OUT0 (Z180_TMDR0L),L ; INITIALIZE TIMER 0 DATA REGISTER + OUT0 (Z180_TMDR0H),H + DEC HL ; RELOAD OCCURS *AFTER* ZERO + OUT0 (Z180_RLDR0L),L ; INITIALIZE TIMER 0 RELOAD REGISTER + OUT0 (Z180_RLDR0H),H + LD A,%00010001 ; ENABLE TIMER0 INT AND DOWN COUNTING + OUT0 (Z180_TCR),A + #ENDIF +; + #IF (ASCIENABLE) + ; RESET THE ASCI PORTS IN CASE SPEED CHANGED! + ; N.B., THIS WILL FAIL IF THE CURRENT BAUD RATE + ; IS IMPOSSIBLE TO IMPLEMENT AT THE NEW CPU SPEED!!! + LD DE,-1 + LD IY,ASCI0_CFG + CALL ASCI_INITDEV + LD DE,-1 + LD IY,ASCI1_CFG + CALL ASCI_INITDEV + #ENDIF ; XOR A RET @@ -5595,16 +5800,8 @@ HB_CPUSPD1: SLA L RL H ; - LD (CB_CPUKHZ),HL ; HL=CPU SPEED IN KHZ - LD DE,1000 ; SET UP TO DIV BY 1000 FOR MHZ - CALL DIV16 ; BC=CPU MHZ, HL=REMAINDER - LD DE,500 ; SET UP TO ROUND UP - XOR A ; IF WITHIN 500 KHZ - SBC HL,DE ; REMAINDER - 500 - CCF ; COMPLEMENT CF - ADC A,C ; C -> A; ADD CF FOR ROUNDING - LD (CB_CPUMHZ),A ; SAVE IT -; + ; RETURN CURRENT CPU SPD (KHZ) IN HL + XOR A ; SIGNAL SUCCESS RET ; HB_WAITSEC: @@ -5657,6 +5854,7 @@ HB_RDSEC: ; #ELSE ; + OR $FF ; SIGNAL ERROR RET ; NO RTC, ABORT ; #ENDIF @@ -6536,6 +6734,7 @@ HB_SECTCK .DB TICKFREQ ; TICK COUNTER FOR FRACTIONAL SECONDS HB_SECS .FILL 4,0 ; 32 BIT SECONDS COUNTER ; HB_CPUTYPE .DB 0 ; 0=Z80, 1=80180, 2=SL1960, 3=ASCI BRG +HB_CPUOSC .DW CPUOSC ; ACTUAL CPU HARDWARE OSC FREQ IN KHZ ; IOPRVAL .DW 0 ; TEMP STORAGE FOR IOPR ; diff --git a/Source/Images/fd_bp.txt b/Source/Images/fd_bp.txt index fa97b717..6b251b2a 100644 --- a/Source/Images/fd_bp.txt +++ b/Source/Images/fd_bp.txt @@ -11,6 +11,7 @@ # #../../Binary/Apps/*.com 15: ../../Binary/Apps/assign.com 15: +../../Binary/Apps/cpuspd.com 15: ../../Binary/Apps/fat.com 15: ../../Binary/Apps/fdu.com 15: ../../Binary/Apps/fdu.doc 15: diff --git a/Source/Images/fd_cpm22.txt b/Source/Images/fd_cpm22.txt index 525717c8..859b7e30 100644 --- a/Source/Images/fd_cpm22.txt +++ b/Source/Images/fd_cpm22.txt @@ -7,6 +7,7 @@ d_cpm22/ReadMe.txt 0: # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/Images/fd_cpm3.txt b/Source/Images/fd_cpm3.txt index 92eb3860..43c3e8ba 100644 --- a/Source/Images/fd_cpm3.txt +++ b/Source/Images/fd_cpm3.txt @@ -23,6 +23,7 @@ # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/Images/fd_nzcom.txt b/Source/Images/fd_nzcom.txt index 5a4dfb46..a569b365 100644 --- a/Source/Images/fd_nzcom.txt +++ b/Source/Images/fd_nzcom.txt @@ -7,6 +7,7 @@ d_nzcom/ReadMe.txt 0: # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/rtc.com 0: diff --git a/Source/Images/fd_zpm3.txt b/Source/Images/fd_zpm3.txt index dcec6bfa..a7077906 100644 --- a/Source/Images/fd_zpm3.txt +++ b/Source/Images/fd_zpm3.txt @@ -22,6 +22,7 @@ # #../../Binary/Apps/*.com 15: ../../Binary/Apps/assign.com 15: +../../Binary/Apps/cpuspd.com 15: ../../Binary/Apps/fat.com 15: ../../Binary/Apps/fdu.com 15: ../../Binary/Apps/fdu.doc 15: diff --git a/Source/Images/fd_zsdos.txt b/Source/Images/fd_zsdos.txt index 333d6526..1b7acc71 100644 --- a/Source/Images/fd_zsdos.txt +++ b/Source/Images/fd_zsdos.txt @@ -20,6 +20,7 @@ d_cpm22/u0/XSUB.COM 0: # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/Images/hd_bp.txt b/Source/Images/hd_bp.txt index 7449e46d..340f07d3 100644 --- a/Source/Images/hd_bp.txt +++ b/Source/Images/hd_bp.txt @@ -11,6 +11,7 @@ # #../../Binary/Apps/*.com 15: ../../Binary/Apps/assign.com 15: +../../Binary/Apps/cpuspd.com 15: ../../Binary/Apps/fat.com 15: ../../Binary/Apps/fdu.com 15: ../../Binary/Apps/fdu.doc 15: diff --git a/Source/Images/hd_cpm22.txt b/Source/Images/hd_cpm22.txt index e98400cc..a57d2283 100644 --- a/Source/Images/hd_cpm22.txt +++ b/Source/Images/hd_cpm22.txt @@ -7,6 +7,7 @@ d_cpm22/ReadMe.txt 0: # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/Images/hd_cpm3.txt b/Source/Images/hd_cpm3.txt index 40feb417..2cc80492 100644 --- a/Source/Images/hd_cpm3.txt +++ b/Source/Images/hd_cpm3.txt @@ -23,6 +23,7 @@ # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/Images/hd_nzcom.txt b/Source/Images/hd_nzcom.txt index 2f561e07..95968469 100644 --- a/Source/Images/hd_nzcom.txt +++ b/Source/Images/hd_nzcom.txt @@ -24,6 +24,7 @@ d_zsdos/u0/*.* 0: # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/Images/hd_zpm3.txt b/Source/Images/hd_zpm3.txt index 3d52e4b7..55853d5b 100644 --- a/Source/Images/hd_zpm3.txt +++ b/Source/Images/hd_zpm3.txt @@ -22,6 +22,7 @@ # #../../Binary/Apps/*.com 15: ../../Binary/Apps/assign.com 15: +../../Binary/Apps/cpuspd.com 15: ../../Binary/Apps/fat.com 15: ../../Binary/Apps/fdu.com 15: ../../Binary/Apps/fdu.doc 15: diff --git a/Source/Images/hd_zsdos.txt b/Source/Images/hd_zsdos.txt index 4d8c8e06..e23d5c4a 100644 --- a/Source/Images/hd_zsdos.txt +++ b/Source/Images/hd_zsdos.txt @@ -20,6 +20,7 @@ d_cpm22/u0/XSUB.COM 0: # #../../Binary/Apps/*.com 0: ../../Binary/Apps/assign.com 0: +../../Binary/Apps/cpuspd.com 0: ../../Binary/Apps/fat.com 0: ../../Binary/Apps/fdu.com 0: ../../Binary/Apps/fdu.doc 0: diff --git a/Source/RomDsk/Build.cmd b/Source/RomDsk/Build.cmd index 1a5295b9..8c6faf12 100644 --- a/Source/RomDsk/Build.cmd +++ b/Source/RomDsk/Build.cmd @@ -12,7 +12,7 @@ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ set RomApps1=assign mode rtc syscopy xm -set RomApps2=fdu format survey sysgen talk timer +set RomApps2=fdu format survey sysgen talk timer cpuspd :: :: Make all variants of the ROM Disk contents image. Three sizes are diff --git a/Source/RomDsk/Makefile b/Source/RomDsk/Makefile index 4f899321..c94e9ab7 100644 --- a/Source/RomDsk/Makefile +++ b/Source/RomDsk/Makefile @@ -7,7 +7,7 @@ include $(TOOLS)/Makefile.inc .SHELLFLAGS = -ce ROMAPPS1 := assign mode rtc syscopy xm -ROMAPPS2 := fdu format survey sysgen talk timer +ROMAPPS2 := fdu format survey sysgen talk timer cpuspd rom256_%.dat: ROMSIZ=256 rom512_%.dat: ROMSIZ=512 diff --git a/Source/ver.inc b/Source/ver.inc index 0f82f97b..c670d283 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.151" +#DEFINE BIOSVER "3.1.1-pre.152" diff --git a/Source/ver.lib b/Source/ver.lib index 61894d78..4c6b0ca3 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.151" + db "3.1.1-pre.152" endm