From 92399fe537cd8f7cd77f380108296a84a18ee85d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 2 Feb 2022 17:08:55 -0800 Subject: [PATCH] More CPUSPD Tweaks I know I said I was done, but I found a few more things I decided to tweak. Functionality is unchanged. --- Doc/ROM Applications.pdf | Bin 193897 -> 193897 bytes Doc/RomWBW Applications.pdf | Bin 241325 -> 241324 bytes Doc/RomWBW Architecture.pdf | Bin 451481 -> 451608 bytes Doc/RomWBW Disk Catalog.pdf | Bin 134793 -> 134794 bytes Doc/RomWBW Getting Started.pdf | Bin 272620 -> 272671 bytes ReadMe.md | 7 +- ReadMe.txt | 7 +- Source/Apps/cpuspd/cpuspd.asm | 214 +++++++++++++++++++++++++++------ Source/Doc/Architecture.md | 1 + Source/HBIOS/API.txt | 1 + Source/HBIOS/hbios.asm | 31 +++-- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 13 files changed, 206 insertions(+), 59 deletions(-) diff --git a/Doc/ROM Applications.pdf b/Doc/ROM Applications.pdf index 5d7c2dacdf8c3183bad07b8a7c328372f3460a03..26d4f1a67644222392be853f11ccd23f757325e4 100644 GIT binary patch delta 258 zcmaF)iu>g&?hW;f^)Gey<@O}ReRi9CO|_mo=VHWqeN~UIDNCMja}~nT0_Z7yZO@orpqM%MqQX~ zuCZI{_!iwGfBGG-Bn4L`GZ{_4XY=RQ+wZ$IcUM^P9+s(<-FilT_bYuX=9!DuH#0J| zGcqx5XJlepa+KZ3(9Foh&|tD3yEu=LkpU1w1h$_)&Sa(QZ0TreX<*`P=;UfYHDO+V5eY1NXc}cuS~K4HGgI7 delta 258 zcmaF)iu>g&?hW;f^`akhlUY8`GM}|Y?`L#E_pz#4O~+O0%C_5eCq|9#(^M=xheJbUqaMe4sBq4kWG%o7)_Yi49> zXJlgB&d9{HE%-x(F&CQHVEnOX*9PJcr2q~HF^OZ>!0BrqeZvX%Q diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index bb6a0000440b7909589057f3abefcf8149169fd5..9810891d98d568daf230a332ad2c37fe88eb20f6 100644 GIT binary patch delta 16512 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 ACIA2c delta 16606 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 R17?;G1SKDzl9n>%{|7OQmc#%6 delta 19761 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 F{{Y2sD&6 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 @@ -455,7 +455,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 @@ -465,6 +465,7 @@ Binary\\Apps 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/ReadMe.txt b/ReadMe.txt index b94fb4d5..92cfdabb 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW Getting Started Wayne Warthen (mailto:wwarthen@gmail.com) -01 Feb 2022 +02 Feb 2022 @@ -17,7 +17,7 @@ RomWBW Z80/Z180 System Software Version 3.1 Pre-release -01 Feb 2022 +02 Feb 2022 Wayne Warthen wwarthen@gmail.com @@ -460,7 +460,7 @@ therefore, globally available. 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 @@ -471,6 +471,7 @@ Binary\Apps 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/Apps/cpuspd/cpuspd.asm b/Source/Apps/cpuspd/cpuspd.asm index 0aecb7f8..363c4e75 100644 --- a/Source/Apps/cpuspd/cpuspd.asm +++ b/Source/Apps/cpuspd/cpuspd.asm @@ -21,6 +21,11 @@ rtc_port .equ $70 ; RTC latch port adr restart .equ $0000 ; CP/M restart vector bdos .equ $0005 ; BDOS invocation vector ; +ident .equ $FFFE ; loc of RomWBW HBIOS ident ptr +; +rmj .equ 3 ; intended CBIOS version - major +rmn .equ 1 ; intended CBIOS version - minor +; ;======================================================================= ; .org $100 ; standard CP/M executable @@ -33,6 +38,10 @@ bdos .equ $0005 ; BDOS invocation vector call crlf ld de,str_banner ; banner call prtstr +; + ; initialization + call init ; initialize + jr nz,exit ; abort if init fails ; call main ; do the real work ; @@ -47,6 +56,46 @@ exit: ; Main Program ;======================================================================= ; +; +; Initialization +; +init: + ; check for UNA (UBIOS) + ld a,($FFFD) ; fixed location of UNA API vector + cp $C3 ; jp instruction? + jr nz,initwbw ; if not, not UNA + ld hl,($FFFE) ; get jp address + ld a,(hl) ; get byte at target address + cp $FD ; first byte of UNA push ix instruction + jr nz,initwbw ; if not, not UNA + inc hl ; point to next byte + ld a,(hl) ; get next byte + cp $E5 ; second byte of UNA push ix instruction + jr nz,initwbw ; if not, not UNA + jp err_una ; UNA not supported +; +initwbw: + ; get location of config data and verify integrity + ld hl,(ident) ; HL := adr or RomWBW HBIOS ident + ld a,(hl) ; get first byte of RomWBW marker + cp 'W' ; match? + jp nz,err_inv ; abort with invalid config block + inc hl ; next byte (marker byte 2) + ld a,(hl) ; load it + cp ~'W' ; match? + jp nz,err_inv ; abort with invalid config block + inc hl ; next byte (major/minor version) + ld a,(hl) ; load it + cp rmj << 4 | rmn ; match? + jp nz,err_ver ; abort with invalid os version +; +initz: + ; initialization complete + xor a ; signal success + ret ; return +; +; +; main: ; skip to start of first parm ld ix,$81 ; point to start of parm area (past len byte) @@ -64,13 +113,19 @@ main1: jr main1 ; continue option checking ; main2: + ret z ; if end, nothing to do + cp ',' ; no new speed? + jr z,main2a ; go to wait states ; parse speed string (half, full, double) call getalpha ; extract speed ("HALF", "FULL", "DOUBLE") -; + call parse_spd ; parse to numeric + jp c,err_parm ; if invalid, abort + ld (new_cpu_spd),a ; save it 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 +main2a: inc ix ; pass separator call nonblank ; skip whitespace jp z,set_spd ; if nothing else, set new speed @@ -78,7 +133,7 @@ main2: 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 + ld (new_ws_mem),a ; save memory wait states ; main3: call nonblank ; skip whitespace @@ -90,42 +145,40 @@ main3: 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 + ld (new_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 - cp 'F' - jr z,set_full - cp 'D' - jr z,set_dbl - jp err_parm + jp set_spd ; set new speed and return +; +parse_spd: + ld a,(tmpstr) ; first byte of string + ld c,0 ; assume half speed + cp 'H' ; check it + jr z,parse_spd1 ; if equal, done + ld c,1 ; assume full speed + cp 'F' ; check it + jr z,parse_spd1 ; if equal, done + ld c,2 ; assume double speed + cp 'D' ; check it + jr z,parse_spd1 ; if equal, done + or a ; clear CF + ccf ; set CF to indicate error + ret +parse_spd1: + ld a,c ; result to a + or a ; clear CF ret ; -set_half: - ld l,0 - jr new_spd -; -set_full: - ld l,1 - jr new_spd -; -set_dbl: - ld l,2 - jr new_spd -; -new_spd: +set_spd: call delay ld b,BF_SYSSET ld c,BF_SYSSET_CPUSPD - ld a,(ws_mem) + ld a,(new_cpu_spd) + ld l,a + ld a,(new_ws_mem) ld d,a - ld a,(ws_io) + ld a,(new_ws_io) ld e,a rst 08 jp nz,err_not_sup @@ -134,6 +187,19 @@ new_spd: ret ; show_spd: + ld b,BF_SYSGET + ld c,BF_SYSGET_CPUINFO + rst 08 + jp nz,err_not_sup + call crlf2 + push de ; save CPU speed for now + push bc ; Oscillator speed to HL + pop hl + ld de,str_spacer + call prtstr + call prtd3m ; print it + ld de,str_oscspd + call prtstr ld b,BF_SYSGET ld c,BF_SYSGET_CPUSPD rst 08 @@ -151,10 +217,15 @@ show_spd: jr z,show_spd1 jp err_invalid show_spd1: - call crlf2 + call crlf + call prtstr + pop bc ; recover wait states + pop hl ; recover CPU speed + push bc ; resave wait states + call prtd3m + ld de,str_cpuspd call prtstr pop hl -; ld a,h ; memory wait states cp $FF jr z,show_spd2 @@ -198,6 +269,15 @@ usage: ; ; Error Handlers ; +err_una: + ld de,str_err_una + jr err_ret +err_inv: + ld de,str_err_inv + jr err_ret +err_ver: + ld de,str_err_ver + jr err_ret err_parm: ld de,str_err_parm jr err_ret @@ -235,8 +315,9 @@ prtchr: pop af ret ; -prtdot: +; Print a dot character without destroying any registers ; +prtdot: ; shortcut to print a dot preserving all regs push af ; save af ld a,'.' ; load dot char @@ -389,6 +470,46 @@ prtdec2: ld e,0 call prtchr ret +; +; Print value of HL as thousandths, ie. 0.000 +; +prtd3m: + push bc + push de + push hl + ld e,'0' + ld bc,-10000 + call prtd3m1 + ld e,0 + ld bc,-1000 + call prtd3m1 + call prtdot + ld bc,-100 + call prtd3m1 + ld c,-10 + call prtd3m1 + ld c,-1 + call prtd3m1 + pop hl + pop de + pop bc + ret +prtd3m1: + ld a,'0' - 1 +prtd3m2: + inc a + add hl,bc + jr c,prtd3m2 + sbc hl,bc + cp e + jr z,prtd3m3 + ld e,0 + call prtchr +prtd3m3: + ret + + + ; ; Get the next non-blank character from (HL). ; @@ -541,17 +662,29 @@ delay1: ; Constants ;======================================================================= ; -str_banner .db "RomWBW CPU Speed Selector v0.4, 31-Jan-2022",0 +str_banner .db "RomWBW CPU Speed Selector v0.5, 2-Feb-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_oscspd .db " MHz Oscillator",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_cpuspd .db " MHz)",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_una .db " ERROR: UNA not supported by application",0 +str_err_inv .db " ERROR: Invalid BIOS (signature missing)",0 +str_err_ver .db " ERROR: Unexpected HBIOS version",0 +str_err_parm .db " ERROR: 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 ,,\r\n" + .db "\r\n" + .db " : \"Half\", \"Full\", or \"Double\"\r\n" + .db " : Memory wait states\r\n" + .db " : I/O wait states\r\n" + .db "\r\n" + .db " Any parameter may be omitted\r\n" + .db " Ability to set values varies by system\r\n",0 ; ;======================================================================= ; Working data @@ -563,8 +696,9 @@ 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 +new_cpu_spd .db $FF ; new CPU speed +new_ws_mem .db $FF ; new memory wait states +new_ws_io .db $FF ; new I/O wait states ; diff --git a/Source/Doc/Architecture.md b/Source/Doc/Architecture.md index 6d542843..cff5522d 100644 --- a/Source/Doc/Architecture.md +++ b/Source/Doc/Architecture.md @@ -1938,6 +1938,7 @@ lookup. | H: Z80 CPU Variant | L: CPU Speed in MHz | DE: CPU Speed in KHz +| BC: Oscillator Speed in KHz #### SYSGET Subfunction 0xF1 -- Get Memory Information (MEMINFO) diff --git a/Source/HBIOS/API.txt b/Source/HBIOS/API.txt index aeae56e9..af68ecfe 100644 --- a/Source/HBIOS/API.txt +++ b/Source/HBIOS/API.txt @@ -100,6 +100,7 @@ GET ($F8): H=Z80 CPU Variant L=CPU Speed in MHz DE=CPU Speed in KHz + BC=Oscillator Freq in KHz MEMINFO ($F1): BC=FuSnction/Subfunction A=Result diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 5e6cfe42..f8146f48 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3832,6 +3832,7 @@ SYS_GETCPUINFO: LD A,(CB_CPUMHZ) LD L,A LD DE,(CB_CPUKHZ) + LD BC,(HB_CPUOSC) XOR A RET ; @@ -4106,6 +4107,8 @@ SYS_SETCPUSPD: ; NOTE: WAIT STATE SETTINGS ARE IGNORED FOR Z80 ; LD A,L ; CLK SPD TO ACCUM + CP $FF ; NO CHANGE? + JR Z,SYS_SETCPUSPD3 ; DONE IF SO LD C,%00000000 ; HALF SPEED CP 0 JR Z,SYS_SETCPUSPD1 @@ -4154,13 +4157,27 @@ SYS_SETCPUSPD2: LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY ; +SYS_SETCPUSPD3: XOR A RET #ENDIF ; #IF (CPUFAM == CPU_Z180) PUSH DE ; SAVE WAIT STATES FOR NOW - LD A,L ; CLK SPD TO ACCUM + ; 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 E + PUSH DE ; SAVE FOR LATER + OR %11110000 ; MAX WAIT STATES + OUT0 (Z180_DCNTL),A ; DO IT +; + LD A,L ; NEW CLK SPD TO ACCUM + CP $FF ; NO CHANGE? + JR Z,SYS_SETCPUSPD2B ; IF SO, SKIP TO WAIT STATES +; LD B,0 ; B HAS BIT FOR CMR LD C,0 ; C HAS BIT FOR CCR CP 2 ; DOUBLE SPEED? @@ -4171,15 +4188,6 @@ SYS_SETCPUSPD1: 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 @@ -4223,8 +4231,9 @@ SETCPUSPD2A: ADC A,C ; C -> A; ADD CF FOR ROUNDING LD (CB_CPUMHZ),A ; SAVE IT ; +SYS_SETCPUSPD2B: ; NOW IMPLEMENT ANY WAIT STATE CHANGES. - POP HL ; INIT L WITH ORIG VALUE + POP HL ; INIT L WITH ORIG DCNTL VALUE POP DE ; RECOVER WAIT STATES LD A,D ; GET MEM WS CP $FF ; SKIP? diff --git a/Source/ver.inc b/Source/ver.inc index c670d283..0ed9e30c 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.152" +#DEFINE BIOSVER "3.1.1-pre.153" diff --git a/Source/ver.lib b/Source/ver.lib index 4c6b0ca3..06000c8a 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.152" + db "3.1.1-pre.153" endm