diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 287f4059..c747390b 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -28,7 +28,7 @@ Version 2.9.2 - WBW: Updated FAT to add MD and FORMAT commands - WBW: Add CP/M 3 (experimental) - M?T: Support Shift register SPI WIZNET for RC2014 -- WBW: Added seconds register in HBIOS +- P?S: Added seconds register in HBIOS Version 2.9.1 ------------- diff --git a/Source/Apps/Timer.asm b/Source/Apps/Timer.asm index e4ed216b..57fd8a1e 100644 --- a/Source/Apps/Timer.asm +++ b/Source/Apps/Timer.asm @@ -139,6 +139,10 @@ process1a: ld c,bf_sysgetsecs ; SECONDS subfunction rst 08 ; call HBIOS, DE:HL := seconds value call prthex32 ; display it + ld a,'.' ; fraction separator + call prtchr ; print it + ld a,c ; get fractional component + call prthex ; print it ld de,strsec ; tag call prtstr ; display it ; @@ -476,7 +480,7 @@ stack .equ $ ; stack top ; ; Messages ; -msgban .db "TIMER v1.1, 8-Nov-2019",13,10 +msgban .db "TIMER v1.1, 10-Nov-2019",13,10 .db "Copyright (C) 2019, Wayne Warthen, GNU GPL v3",0 msguse .db "Usage: TIMER [/C] [/?]",13,10 .db " ex. TIMER (display current timer value)",13,10 diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 7f7851bc..e8677023 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -20,7 +20,6 @@ BOOT_TIMEOUT .EQU 20 ; AUTO BOOT TIMEOUT IN SECONDS, 0 FOR IMMEDIATE BOOT BOOT_DEFAULT .EQU 'Z' ; AUTO BOOT SELECTION TO INVOKE AT TIMEOUT ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ -TICKSPERSEC .EQU 50 ; TICKS PER SECOND INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; diff --git a/Source/HBIOS/dbgmon.asm b/Source/HBIOS/dbgmon.asm index e93e6c38..4698655f 100644 --- a/Source/HBIOS/dbgmon.asm +++ b/Source/HBIOS/dbgmon.asm @@ -42,6 +42,7 @@ BUFLEN .EQU 40 ; INPUT LINE LENGTH UART_ENTRY: LD SP,MON_STACK ; SET THE STACK POINTER EI ; INTS OK NOW + LD HL,UART_ENTRY ; RESTART ADDRESS CALL INITIALIZE ; INITIALIZE SYSTEM LD HL,TXT_READY ; POINT AT TEXT @@ -108,9 +109,14 @@ SERIALCMDLOOP: ;__INITIALIZE_________________________________________________________________ ; ; INITIALIZE SYSTEM +; AT ENTRY, HL SHOULD HAVE ADDRESS OF DESIRED RESTART ADDRESS ;_____________________________________________________________________________ ; INITIALIZE: + LD A,$C3 ; JP OPCODE + LD (0),A ; STORE AT $0000 + LD (1),HL ; STORE AT $0001 + #IF (BIOS == BIOS_UNA) ; INSTALL UNA INVOCATION VECTOR FOR RST 08 LD A,$C3 ; JP INSTRUCTION @@ -932,6 +938,7 @@ KY_PW .EQU KY_BK ; USE [BW] FOR [PW] (PORT WRITE) DSKY_ENTRY: LD SP,MON_STACK ; SET THE STACK POINTER EI ; INTS OK NOW + LD HL,DSKY_ENTRY ; RESTART ADDRESS CALL INITIALIZE ; ;__FRONT_PANEL_STARTUP________________________________________________________ @@ -1381,5 +1388,13 @@ MON_STACK .EQU $ .ECHO "DBGMON space remaining: " .ECHO SLACK .ECHO " bytes.\n" - +; +; DBGMON CURRENTLY OCCUPIES $F000-$FDFF BECAUSE THE +; HBIOS PROXY OCCUPIES $FE00-$FFFF. HOWEVER THE DBGMON +; IMAGE MUST OCCUPY A FULL $1000 BYTES IN THE ROM. +; BELOW WE JUST PAD OUT THE IMAGE BY $200 SO IT +; OCCUPIES THE FULL $1000 BYTES IN ROM. +; + .FILL $200,$00 +; .END diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index fc42fd30..16b76ac3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1245,13 +1245,15 @@ HB_CPU1: LD (IVT(INT_TIM0)),HL ; Z180 TIMER 0 ; SETUP PERIODIC TIMER INTERRUPT ON TIMER 0 - LD HL,CPUOSC/TICKSPERSEC/20-1 ; 50HZ = 18432000 / 50 / 20 - LD B,0 - LD C,Z180_RLDR0L ; INITIALIZE TIMER 0 RELOAD REGISTER +; LD HL,CPUOSC/TICKSPERSEC/20-1 ; 50HZ = 18432000 / 50 / 20 + LD HL,(CPUKHZ) ; 50HZ = 18432000 / 20 / 50 / X, SO X = CPU KHZ + LD B,0 ; 16-BIT I/O ADDRESS + LD C,Z180_TMDR0L ; INITIALIZE TIMER 0 DATA REGISTER OUT (C),L INC C OUT (C),H - LD C,Z180_TMDR0L ; INITIALIZE TIMER 0 DATA REGISTER + DEC HL ; RELOAD OCCURS *AFTER* ZERO + LD C,Z180_RLDR0L ; INITIALIZE TIMER 0 RELOAD REGISTER OUT (C),L INC C OUT (C),H @@ -2396,24 +2398,16 @@ SYS_GETTIMER: ; GET SECONDS ; RETURNS: ; DE:HL: SECONDS VALUE (32 BIT) -; C TICKS OF TICKSPERSEC (8 BIT) +; C: NUM TICKS WITHIN CURRENT SECOND ; SYS_GETSECS: - LD HL,HB_SECTCK - LD A,TICKSPERSEC + LD HL,HB_SECS HB_DI - SUB (HL) - INC HL ; NOW POINTING TO HB_SECS - LD C,(HL) - INC HL - LD B,(HL) - INC HL - LD E,(HL) - INC HL - LD D,(HL) + CALL LD32 + LD A,(HB_SECTCK) HB_EI - LD L,C - LD H,B + NEG ; CONVERT DOWNCOUNTER TO UPCOUNTER + ADD A,TICKSPERSEC LD C,A XOR A RET @@ -2533,7 +2527,7 @@ SYS_SETTIMER: ; ; SET SECS ; ON ENTRY: -; DE:HL: TIMER VALUE (32 BIT) +; DE:HL: SECONDS VALUE (32 BIT) ; SYS_SETSECS: LD BC,HB_SECS diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index aa385538..625c0f98 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -297,20 +297,22 @@ FORCECON .EQU 0 ; DEFAULT IS TO FOLLOW NORMAL SEQUENCE ; ; SETUP DEFAULT CPU SPEED VALUES ; -CPUKHZ .EQU CPUOSC / 1000 ; CPU FREQ IN KHZ +CPUKHZ .EQU CPUOSC / 1000 ; CPU FREQ IN KHZ ; #IF (BIOS == BIOS_WBW) #IF (CPUFAM == CPU_Z180) #IF (Z180_CLKDIV == 0) -CPUKHZ .SET CPUKHZ / 2 ; ADJUST FOR HALF SPEED OPERATION +CPUKHZ .SET CPUKHZ / 2 ; ADJUST FOR HALF SPEED OPERATION #ENDIF #IF (Z180_CLKDIV == 2) -CPUKHZ .SET CPUKHZ * 2 ; ADJUST FOR DOUBLE SPEED OPERATION +CPUKHZ .SET CPUKHZ * 2 ; ADJUST FOR DOUBLE SPEED OPERATION #ENDIF #ENDIF #ENDIF ; -CPUMHZ .EQU CPUKHZ / 1000 ; CPU FREQ IN MHZ +CPUMHZ .EQU CPUKHZ / 1000 ; CPU FREQ IN MHZ +; +TICKSPERSEC .EQU 50 ; ; MEMORY BANK CONFIGURATION ; @@ -371,8 +373,8 @@ CPM_ENT .EQU CBIOS_LOC ; CPM ENTRY POINT (IN CBIOS) LDR_SIZ .EQU $0E00 -MON_LOC .EQU $C000 ; LOCATION OF MONITOR FOR RUNNING SYSTEM -MON_SIZ .EQU $1000 ; SIZE OF MONITOR BINARY IMAGE +MON_LOC .EQU $F000 ; LOCATION OF MONITOR FOR RUNNING SYSTEM +MON_SIZ .EQU $0E00 ; SIZE OF MONITOR BINARY IMAGE MON_END .EQU MON_LOC + MON_SIZ ; END OF MONITOR BAS_LOC .EQU $0200 ; NASCOM BASIC