diff --git a/Source/Apps/Test/Build.cmd b/Source/Apps/Test/Build.cmd index e56d13b3..def4c1fc 100644 --- a/Source/Apps/Test/Build.cmd +++ b/Source/Apps/Test/Build.cmd @@ -25,6 +25,7 @@ pushd piomon && call Build || exit /b & popd pushd banktest && call Build || exit /b & popd pushd portscan && call Build || exit /b & popd pushd sound && call Build || exit /b & popd +pushd testh8p && call Build || exit /b & popd goto :eof diff --git a/Source/Apps/Test/Clean.cmd b/Source/Apps/Test/Clean.cmd index 4e81e284..733b934e 100644 --- a/Source/Apps/Test/Clean.cmd +++ b/Source/Apps/Test/Clean.cmd @@ -22,3 +22,4 @@ pushd piomon && call Clean || exit /b 1 & popd pushd banktest && call Clean || exit /b 1 & popd pushd portscan && call Clean || exit /b 1 & popd pushd sound && call Clean || exit /b 1 & popd +pushd testh8p && call Clean || exit /b 1 & popd diff --git a/Source/Apps/Test/Makefile b/Source/Apps/Test/Makefile index 7d70c01b..2eb38d98 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 2piotst piomon banktest portscan sound +SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz vdctest kbdtest ps2info 2piotst piomon banktest portscan sound testh8p DEST = ../../../Binary/Apps/Test TOOLS =../../../Tools diff --git a/Source/Apps/Test/testh8p/Build.cmd b/Source/Apps/Test/testh8p/Build.cmd new file mode 100644 index 00000000..d22386d9 --- /dev/null +++ b/Source/Apps/Test/testh8p/Build.cmd @@ -0,0 +1,10 @@ +@echo off +setlocal + +set TOOLS=../../../../Tools +set PATH=%TOOLS%\tasm32;%PATH% +set TASMTABS=%TOOLS%\tasm32 + +tasm -t80 -g3 -fFF testh8p.asm testh8p.com testh8p.lst || exit /b + +copy /Y testh8p.com ..\..\..\..\Binary\Apps\Test\ || exit /b diff --git a/Source/Apps/Test/testh8p/Clean.cmd b/Source/Apps/Test/testh8p/Clean.cmd new file mode 100644 index 00000000..9ecb428f --- /dev/null +++ b/Source/Apps/Test/testh8p/Clean.cmd @@ -0,0 +1,6 @@ +@echo off +setlocal + +if exist *.com del *.com +if exist *.lst del *.lst +if exist *.bin del *.bin diff --git a/Source/Apps/Test/testh8p/Makefile b/Source/Apps/Test/testh8p/Makefile new file mode 100644 index 00000000..d8e7dd1d --- /dev/null +++ b/Source/Apps/Test/testh8p/Makefile @@ -0,0 +1,9 @@ +OBJECTS = testh8p.com +# DOCS = testh8p.doc +DEST = ../../../../Binary/Apps/Test +DOCDEST = ../../../../Binary/Apps/Test +TOOLS =../../../../Tools + +USETASM=1 + +include $(TOOLS)/Makefile.inc \ No newline at end of file diff --git a/Source/Apps/Test/testh8p/testh8p.asm b/Source/Apps/Test/testh8p/testh8p.asm new file mode 100644 index 00000000..ada91ca3 --- /dev/null +++ b/Source/Apps/Test/testh8p/testh8p.asm @@ -0,0 +1,238 @@ +;=============================================================================== +; H8 Panel Test +;=============================================================================== +; +; AUTHOR: WAYNE WARTHEN (wwarthen@gmail.com) +;_______________________________________________________________________________ +; +; +; Trivial utility to test the register pair display functionality of the +; Heath H8 Front Panel. +; +; Program will display a set of known register values on the console, +; then go into an infinite loop. The H8 panel can then be checked to +; see if the correct values are displayed. +; +; There is no way to exit this program. You must reset your system. +; +;=============================================================================== +; Definitions +;=============================================================================== +; +stksiz .equ $40 ; Working stack size +; +restart .equ $0000 ; CP/M restart vector +bdos .equ $0005 ; BDOS invocation vector +; +regA .equ $11 +regBC .equ $2233 +regDE .equ $4455 +regHL .equ $6677 +; +;=============================================================================== +; Code Section +;=============================================================================== +; +; + .org $100 +; + ; setup stack (save old value) + ld (stksav),sp ; save stack + ld sp,stack ; set new stack +; + ld de,str_prefix + call prtstr +; + ld de,str_A + ld hl,regA + call prtreg + ld de,str_BC + ld hl,regBC + call prtreg + ld de,str_DE + ld hl,regDE + call prtreg + ld de,str_HL + ld hl,regHL + call prtreg + ld de,str_SP + ld hl,regSP + call prtreg + ld de,str_PC + ld hl,regPC + call prtreg +; + ld a,regA + ld bc,regBC + ld de,regDE + ld hl,regHL +regPC: jr $ +; +; +; +prtreg: + call prtstr ; print label + ld a,h ; first byte + call prtoctbyte ; print it + ld a,'.' ; separator + call prtchr ; print it + ld a,l ; second byte + call prtoctbyte ; print it + ret +; +; +; +prtoctbyte: + rlca ; 2 ms bits + rlca + push af + and %00000011 ; isolate + add a,'0' ; make char + call prtchr ; show it + pop af + rlca ; next 3 bits + rlca + rlca + push af + and %00000111 ; isolate + add a,'0' ; make char + call prtchr ; show it + pop af + rlca ; next 3 bits + rlca + rlca + push af + and %00000111 ; isolate + add a,'0' ; make char + call prtchr ; show it + pop af + ret +; +; Print character in A without destroying any registers +; +prtchr: + push bc ; save registers + push de + push hl + ld e,a ; character to print in E + ld c,$02 ; BDOS function to output a character + call bdos ; do it + pop hl ; restore registers + pop de + pop bc + ret +; +; Print a zero terminated string at (DE) without destroying any registers +; +prtstr: + push de +; +prtstr1: + ld a,(de) ; get next char + or a + jr z,prtstr2 + call prtchr + inc de + jr prtstr1 +; +prtstr2: + pop de ; restore registers + ret +; +; Start a new line +; +crlf2: + call crlf ; two of them +crlf: + push af ; preserve AF + ld a,13 ; + call prtchr ; print it + ld a,10 ; + call prtchr ; print it + pop af ; restore AF + ret +; +; Print the value in A in hex without destroying any registers +; +prthex: + push af ; save AF + push de ; save DE + call hexascii ; convert value in A to hex chars in DE + ld a,d ; get the high order hex char + call prtchr ; print it + ld a,e ; get the low order hex char + call prtchr ; print it + pop de ; restore DE + pop af ; restore AF + ret ; done +; +; print the hex word value in hl +; +prthexword: + push af + ld a,h + call prthex + ld a,l + call prthex + pop af + ret +; +; print the hex dword value in de:hl +; +prthex32: + push bc + push de + pop bc + call prthexword + push hl + pop bc + call prthexword + pop bc + ret +; +; Convert binary value in A to ascii hex characters in DE +; +hexascii: + ld d,a ; save A in D + call hexconv ; convert low nibble of A to hex + ld e,a ; save it in E + ld a,d ; get original value back + rlca ; rotate high order nibble to low bits + rlca + rlca + rlca + call hexconv ; convert nibble + ld d,a ; save it in D + ret ; done +; +; Convert low nibble of A to ascii hex +; +hexconv: + and $0F ; low nibble only + add a,$90 + daa + adc a,$40 + daa + ret +; +;=============================================================================== +; Storage Section +;=============================================================================== +; +rtcbuf .fill 6,$FF ; RTC data buffer +; +str_prefix .db "\r\n\r\nRegisters: ",0 +; +str_A .db "A=",0 +str_BC .db ", BC=",0 +str_DE .db ", DE=",0 +str_HL .db ", HL=",0 +str_SP .db ", SP=",0 +str_PC .db ", PC=",0 +; +stksav .dw 0 ; stack pointer saved at start + .fill stksiz,0 ; stack +stack .equ $ ; stack top +regSP: +; + .end diff --git a/Source/HBIOS/h8p.asm b/Source/HBIOS/h8p.asm index e697c9cb..67e8aade 100644 --- a/Source/HBIOS/h8p.asm +++ b/Source/HBIOS/h8p.asm @@ -540,9 +540,11 @@ H8P_KEYPADPLUS3: OR A RET Z DEC A - LD (H8P_SPEED),A - OUT (H8P_SPDIO),A - RET + ;;;LD (H8P_SPEED),A + ;;;OUT (H8P_SPDIO),A + ;;;RET + ; EXIT VIA HBIOS SPEED CHANGE, W/ L=NEW SPEED + JP H8P_SETSPD ; SEE HBIOS.ASM ; MEM/SPEED DECREASE H8P_KEYPADMINUS: LD A,(H8P_STATE) @@ -559,9 +561,11 @@ H8P_KEYPADMINUS3: CP 3 RET Z INC A - LD (H8P_SPEED),A - OUT (H8P_SPDIO),A - RET + ;;;LD (H8P_SPEED),A + ;;;OUT (H8P_SPDIO),A + ;;;RET + ; EXIT VIA HBIOS H8P SPEED CHANGE, W/ A=NEW SPEED + JP H8P_SETSPD ; SEE HBIOS.ASM ; ; HANDLE FRONT PANEL STATE ; @@ -620,29 +624,84 @@ H8P_HDLREGDE: JP H8P_UPDLEDS H8P_HDLREGHL: CALL H8P_UPDLEDS - LD HL,(HBX_INT_SP) - LD A,(HL) - LD (H8P_HLVAL),A - INC HL - LD A,(HL) - LD (H8P_HLVAL+1),A +; + ;;;LD HL,(HBX_INT_SP) + ;;;LD A,(HL) + ;;;LD (H8P_HLVAL),A + ;;;INC HL + ;;;LD A,(HL) + ;;;LD (H8P_HLVAL+1),A +; + LD A,(HB_CURBNK) ; GET PRE-INT BANK + LD D,A ; PUT IN D +; + ; HORRIBLE HACK TO MAKE PEEK RETURN TO OUR BANK!!! + PUSH AF ; SAVE ORIG HB_CURBNK + LD A,BID_BIOS ; MAKE IT OUR BANK + LD (HB_CURBNK),A ; OVERRIDE FOR PEEK +; + ; FOLLOW STACK TO GET PC, USE PEEK IN CASE STACK IN ALT BANK + LD HL,(HBX_INT_SP) ; PRE-INT SP HAS HL AT TOS + CALL HBX_PEEK ; GET LSB TO E + LD C,E ; PUT IN C + INC HL ; POINT TO MSB + CALL HBX_PEEK ; GET MSB TO E + LD B,E ; PUT IN B + LD (H8P_HLVAL),BC ; SAVE FOR DISPLAY +; + ; UNDO HACK!!! + POP AF ; RECOVER HB_CURBNK + LD (HB_CURBNK),A ; SAVE RESTORE IT +; LD BC,H8P_HLVAL LD HL,H8P_SEGBUF JP H8P_FILLOCT H8P_HDLREGSP: - LD BC,HBX_INT_SP - CALL H8P_FILLOCT - JP H8P_UPDLEDS + CALL H8P_UPDLEDS + LD HL,(HBX_INT_SP) ; GET INT SAVED SP + INC HL ; BUMP TO VAL + INC HL ; ... OF SP + INC HL ; ... AT TIME + INC HL ; ... OF INTERRUPT + LD (H8P_SPVAL),HL ; SAVE FOR DISPLAY + LD BC,H8P_SPVAL + LD HL,H8P_SEGBUF + JP H8P_FILLOCT H8P_HDLREGPC: CALL H8P_UPDLEDS - LD HL,(HBX_INT_SP) ; (HL)=HL LOW - INC HL ; (HL)=HL HIGH - INC HL ; (HL)=PC LOW - LD A,(HL) - LD (H8P_PCVAL),A - INC HL ; (HL)=PC HIGH - LD A,(HL) - LD (H8P_PCVAL+1),A +; + ;;;LD HL,(HBX_INT_SP) ; (HL)=HL LOW + ;;;INC HL ; (HL)=HL HIGH + ;;;INC HL ; (HL)=PC LOW + ;;;LD A,(HL) + ;;;LD (H8P_PCVAL),A + ;;;INC HL ; (HL)=PC HIGH + ;;;LD A,(HL) + ;;;LD (H8P_PCVAL+1),A +; + LD A,(HB_CURBNK) ; GET PRE-INT BANK + LD D,A ; PUT IN D +; + ; HORRIBLE HACK TO MAKE PEEK RETURN TO OUR BANK!!! + PUSH AF ; SAVE ORIG HB_CURBNK + LD A,BID_BIOS ; MAKE IT OUR BANK + LD (HB_CURBNK),A ; OVERRIDE FOR PEEK +; + ; FOLLOW STACK TO GET PC, USE PEEK IN CASE STACK IN ALT BANK + LD HL,(HBX_INT_SP) ; PRE-INT SP + INC HL ; REMOVE 1 LEVEL TO + INC HL ; ... POINT TO PRE-INT PC + CALL HBX_PEEK ; GET LSB TO E + LD C,E ; PUT IN C + INC HL ; POINT TO MSB + CALL HBX_PEEK ; GET MSB TO E + LD B,E ; PUT IN B + LD (H8P_PCVAL),BC ; SAVE FOR DISPLAY +; + ; UNDO HACK!!! + POP AF ; RECOVER HB_CURBNK + LD (HB_CURBNK),A ; SAVE RESTORE IT +; LD BC,H8P_PCVAL LD HL,H8P_SEGBUF JP H8P_FILLOCT @@ -865,6 +924,8 @@ H8P_MEMADRIDX: .DB 0 H8P_MEMENTER: .DB 0 +H8P_SPVAL: + .DW 0 H8P_AFVAL: .DW 0 H8P_BCVAL: diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 7153d645..bc70d828 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1014,7 +1014,8 @@ HBX_BNKCALL_ADR: ; HBX_PEEK: LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK + ;;;LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK + LD SP,HBX_BUF_END - $20 ; BORROW HBX_BUF FOR TEMP STACK LD A,(HB_CURBNK) PUSH AF LD A,D @@ -1024,7 +1025,8 @@ HBX_PEEK: ; HBX_POKE: LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK + ;;;LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK + LD SP,HBX_BUF_END - $20 ; BORROW HBX_BUF FOR TEMP STACK LD A,(HB_CURBNK) PUSH AF LD A,D @@ -5459,6 +5461,8 @@ SYS_SETCPUSPD3: LD A,L ; REQUESTED SPEED TO ACCUM XOR $03 ; CONVERT TO HEATH BITS AND $03 ; ONLY 2 LS BITS +; +H8P_SETSPD: ; INVOKED BY H8P.ASM WHEN SPEED CHANGED VIA FRONT PANEL OUT (H8P_SPDIO),A ; DO IT LD (H8P_SPEED),A ; UPDATE FP SHADOW ; diff --git a/Source/ver.inc b/Source/ver.inc index 90137216..0347982f 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.81" +#DEFINE BIOSVER "3.5.0-dev.82" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 5d55ee91..4eb00a17 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.81" + db "3.5.0-dev.82" endm