From 6ac68029e4619e143b8b4b993fefe3ae2f683168 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 14 Dec 2021 16:02:23 -0800 Subject: [PATCH] VDC Test Programs - Add kbdtest, cvdtest, and cvdonly test programs. They apply to MBC platform only. - Display more boot info in CVDU and KBD drivers. - Separate floppy and hard disk content definition files. --- Source/Apps/Test/Build.cmd | 2 + Source/Apps/Test/Clean.cmd | 2 + Source/Apps/Test/Makefile | 2 +- Source/Apps/Test/kbdtest/Build.cmd | 11 + Source/Apps/Test/kbdtest/Clean.cmd | 6 + Source/Apps/Test/kbdtest/Makefile | 7 + Source/Apps/Test/kbdtest/kbdtest.asm | 353 ++++++ Source/Apps/Test/vdctest/Build.cmd | 12 + Source/Apps/Test/vdctest/Clean.cmd | 6 + Source/Apps/Test/vdctest/Makefile | 7 + Source/Apps/Test/vdctest/vdconly.asm | 1055 ++++++++++++++++++ Source/Apps/Test/vdctest/vdctest.asm | 1072 +++++++++++++++++++ Source/CPM3/Build.cmd | 2 + Source/HBIOS/cvdu.asm | 21 +- Source/HBIOS/kbd.asm | 7 + Source/Images/Build.cmd | 42 +- Source/Images/BuildDisk.ps1 | 12 +- Source/Images/Makefile | 18 +- Source/Images/ReadMe.txt | 5 +- Source/Images/fd_bp.txt | 51 + Source/Images/fd_cpm22.txt | 45 + Source/Images/fd_cpm3.txt | 52 + Source/Images/fd_nzcom.txt | 31 + Source/Images/fd_zpm3.txt | 49 + Source/Images/fd_zsdos.txt | 61 ++ Source/Images/{d_bp.txt => hd_bp.txt} | 8 - Source/Images/{d_cpm22.txt => hd_cpm22.txt} | 7 - Source/Images/{d_cpm3.txt => hd_cpm3.txt} | 7 - Source/Images/{d_nzcom.txt => hd_nzcom.txt} | 7 - Source/Images/{d_zpm3.txt => hd_zpm3.txt} | 7 - Source/Images/{d_zsdos.txt => hd_zsdos.txt} | 7 - Source/ver.inc | 2 +- Source/ver.lib | 2 +- 33 files changed, 2895 insertions(+), 83 deletions(-) create mode 100644 Source/Apps/Test/kbdtest/Build.cmd create mode 100644 Source/Apps/Test/kbdtest/Clean.cmd create mode 100644 Source/Apps/Test/kbdtest/Makefile create mode 100644 Source/Apps/Test/kbdtest/kbdtest.asm create mode 100644 Source/Apps/Test/vdctest/Build.cmd create mode 100644 Source/Apps/Test/vdctest/Clean.cmd create mode 100644 Source/Apps/Test/vdctest/Makefile create mode 100644 Source/Apps/Test/vdctest/vdconly.asm create mode 100644 Source/Apps/Test/vdctest/vdctest.asm create mode 100644 Source/Images/fd_bp.txt create mode 100644 Source/Images/fd_cpm22.txt create mode 100644 Source/Images/fd_cpm3.txt create mode 100644 Source/Images/fd_nzcom.txt create mode 100644 Source/Images/fd_zpm3.txt create mode 100644 Source/Images/fd_zsdos.txt rename Source/Images/{d_bp.txt => hd_bp.txt} (81%) rename Source/Images/{d_cpm22.txt => hd_cpm22.txt} (79%) rename Source/Images/{d_cpm3.txt => hd_cpm3.txt} (82%) rename Source/Images/{d_nzcom.txt => hd_nzcom.txt} (83%) rename Source/Images/{d_zpm3.txt => hd_zpm3.txt} (83%) rename Source/Images/{d_zsdos.txt => hd_zsdos.txt} (82%) diff --git a/Source/Apps/Test/Build.cmd b/Source/Apps/Test/Build.cmd index d15ea50d..5b703591 100644 --- a/Source/Apps/Test/Build.cmd +++ b/Source/Apps/Test/Build.cmd @@ -19,6 +19,8 @@ pushd ppidetst && call Build || exit /b & popd pushd ramtest && call Build || exit /b & popd pushd I2C && call Build || exit /b & popd pushd rzsz && call Build || exit /b & popd +pushd vdctest && call Build || exit /b & popd +pushd kbdtest && call Build || exit /b & popd goto :eof diff --git a/Source/Apps/Test/Clean.cmd b/Source/Apps/Test/Clean.cmd index ee9af6ad..ba1eb940 100644 --- a/Source/Apps/Test/Clean.cmd +++ b/Source/Apps/Test/Clean.cmd @@ -14,3 +14,5 @@ pushd ppidetst && call Clean || exit /b 1 & popd pushd ramtest && call Clean || exit /b 1 & popd pushd I2C && call Clean || exit /b 1 & popd pushd rzsz && call Clean || exit /b 1 & popd +pushd vdctest && call Clean || exit /b 1 & popd +pushd kbdtest && call Clean || exit /b 1 & popd diff --git a/Source/Apps/Test/Makefile b/Source/Apps/Test/Makefile index 61717011..ad967e08 100644 --- a/Source/Apps/Test/Makefile +++ b/Source/Apps/Test/Makefile @@ -1,5 +1,5 @@ OBJECTS = -SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz +SUBDIRS = DMAmon I2C inttest ppidetst ramtest tstdskng rzsz kbdtest vdctest DEST = ../../../Binary/Apps/Test TOOLS =../../../Tools diff --git a/Source/Apps/Test/kbdtest/Build.cmd b/Source/Apps/Test/kbdtest/Build.cmd new file mode 100644 index 00000000..5ae6b746 --- /dev/null +++ b/Source/Apps/Test/kbdtest/Build.cmd @@ -0,0 +1,11 @@ +@echo off +setlocal + +set TOOLS=../../../../Tools +set PATH=%TOOLS%\tasm32;%PATH% +set TASMTABS=%TOOLS%\tasm32 + +tasm -t180 -g3 -fFF kbdtest.asm kbdtest.com kbdtest.lst || exit /b + +copy /Y kbdtest.com ..\..\..\..\Binary\Apps\Test\ || exit /b + diff --git a/Source/Apps/Test/kbdtest/Clean.cmd b/Source/Apps/Test/kbdtest/Clean.cmd new file mode 100644 index 00000000..9ecb428f --- /dev/null +++ b/Source/Apps/Test/kbdtest/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/kbdtest/Makefile b/Source/Apps/Test/kbdtest/Makefile new file mode 100644 index 00000000..f83c46d4 --- /dev/null +++ b/Source/Apps/Test/kbdtest/Makefile @@ -0,0 +1,7 @@ +OBJECTS = kbdtest.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/kbdtest/kbdtest.asm b/Source/Apps/Test/kbdtest/kbdtest.asm new file mode 100644 index 00000000..06fd1594 --- /dev/null +++ b/Source/Apps/Test/kbdtest/kbdtest.asm @@ -0,0 +1,353 @@ +; +; Test program for Z80 KBDMSE on Retrobrewcomputer.org (Load with CPM). +; +; V0.1 ;Original version 2/23/2014 by John Monahan +; V0.2 ;Update for Z80 KBDMSE with VT82C42 PS/2 Keyboard Controller by Andrew Lynch +; +; Based on works by John Monahan S100Computers.com +; for S100 MSDOS Support Board with HT6542B Keyboard Controller +; Thanks to John for generously posting this program for others to use and adapt +; +; This is a simple test program to work with the Z80 KBDMSE board. It is written so +; the only other hardware use is the CP/M Console Port -- typically serial port interface. +; Note the data is displayed in crude (bulk) form. A proper scancode to ASCII translation +; routine must be written for practical use. See the IBM PC BIOS or SKEY.Z80 docs + + + +; PORT ASSIGNMENTS + +KEY_DATA .EQU 0E2H ;Port used to access keyboard & Mouse (also sometimes Controller itself) +KEY_CTRL .EQU 0E3H ;Port for VT82C42 PS/2 Keyboard & Mouse Controller + +ESC .EQU 1BH +CR .EQU 0DH +LF .EQU 0AH +TAB .EQU 09H +BELL .EQU 07H + + .ORG 0100H +START: + LD SP,STACK + + LD HL,SIGNON ; Signon + CALL PRINT_STRING + + LD C,0AAH ;Test PS/2 Controller + CALL KEY_OUT +CHK1: + CALL KEY_IN_STATUS ;wait for feedback + JR Z,CHK1 + IN A,(KEY_DATA) + CP 055H ;If not 55H then error + JR Z,DONE_INIT + LD HL,INIT_ERR ;Say error + CALL PRINT_STRING + HALT ;Just Halt! + +DONE_INIT: + LD HL,INIT_OK ;Say all OK + CALL PRINT_STRING + + LD C,0AEH ;Enable 1st PS/2 port + CALL KEY_OUT ;Send it + +LOOP: + CALL KEY_IN_STATUS ;See if keyboard key available + JR Z,LOOP + IN A,(KEY_DATA) + LD C,A ;Store in [C] + LD HL,SCAN_MSG + CALL PRINT_STRING ;No registers changed + + CALL A_HEXOUT ;Display Hex value of typed character + two spaces + + CP 0F0H ;Is it an UP key + JR NZ,DOWNKY ;Must be a down key stroke + LD HL,UPKEY_MSG ;Say Up Key + CALL PRINT_STRING + CALL ZCRLF + JR LOOP + +DOWNKY: + CP 58H ;Is it CAPS Lock key +; CP 3AH ;Is it CAPS Lock key + JR NZ,NOT_CAPSKEY + LD HL,CAPS_MSG ;Say Caps lock key + CALL PRINT_STRING + CALL ZCRLF + JR LOOP + +NOT_CAPSKEY: + CP 12H ;Is it a SHIFT key +; CP 2AH ;Is it a SHIFT key + JR Z,SHIFTKEY + CP 59H ;Is it the other SHIFT key +; CP 36H ;Is it the other SHIFT key + JR NZ,NOT_SHIFTKEY + +SHIFTKEY: + LD HL,SHIFT_MSG ;Say Shift key + CALL PRINT_STRING + CALL ZCRLF + JR LOOP + +NOT_SHIFTKEY: + CP 14H ;Is it the CTRL key +; CP 1DH ;Is it the CTRL key + JR NZ,NOT_CTRLKEY + LD HL,CTRL_MSG ;Say CTRL key + CALL PRINT_STRING + CALL ZCRLF + JR LOOP + +NOT_CTRLKEY: + CP 77H ;Is it the NUM LOCK key +; CP 45H ;Is it the NUM LOCK key + JR NZ,NOT_NUMKEY + LD HL,NUM_MSG ;Say Number key + CALL PRINT_STRING + CALL ZCRLF + JR LOOP + +NOT_NUMKEY: + PUSH BC ;Save Character + LD HL,IBM1_MSG ;Say Table 1 lookup + CALL PRINT_STRING + LD HL,IBM1TBL ;Point to lookup table for upper case + CALL SHOW_CHAR + + POP BC ;Get back character + LD HL,IBM2_MSG ;Say Table 2 lookup + CALL PRINT_STRING + LD HL,IBM2TBL ;Point to lookup table for upper case + CALL SHOW_CHAR + + CALL ZCRLF + JR LOOP + +SHOW_CHAR: + LD D,0 + LD E,C + ADD HL,DE ;Add in offset + LD C,(HL) + LD A,C + CP ESC + RET Z ;ESC messes up the screen display + CP CR + RET Z ;CR messes up the screen display + CP LF + RET Z ;LF messes up the screen display + CP TAB + RET Z ;TAB messes up the screen display + CALL ZCO ;Display on Screen + RET + +KEY_IN_STATUS: ;Ret NZ if character is available + IN A,(KEY_CTRL) + AND 1 + RET ;Ret NZ if character available + +KEY_OUT: ;Send a byte (in [C]) to Control port + IN A,(KEY_CTRL) + AND 2 + JR NZ,KEY_OUT ;Chip is not ready yet to receive character + LD A,C + OUT (KEY_CTRL),A + RET + + +; A_HEXOUT ;output the 2 hex digits in [A] +A_HEXOUT: ;No registers altered + push AF + push BC + push AF + srl a + srl a + srl a + srl a + call hexdigout + pop AF + call hexdigout ;get upper nibble + LD C,' ' + call ZCO ;Space for easy reading + call ZCO + pop BC + pop AF + ret + +hexdigout: + and 0fh ;convert nibble to ascii + add a,90h + daa + adc a,40h + daa + LD c,a + call ZCO + ret + +; Main console I/O routines +; + +ZCO: + PUSH HL + LD E,C + LD C,02H ;BDOS Function 2 Write Console Byte + CALL 0005H ;Call BDOS + POP HL + RET + +ZCI: + LD C,0BH ;BDOS Function 11 Read Console Status + CALL 0005H ;Call BDOS + JP Z,ZCI + LD C,01H ;BDOS Function 1 Read Console Byte + CALL 0005H ;Call BDOS + RET +; +; Send CR/LF to Console +; +ZCRLF: + PUSH AF + PUSH BC + LD C,CR + CALL ZCO + LD C,LF + CALL ZCO + POP BC + POP AF + RET + + +PRINT_STRING: + PUSH AF + push BC +print1: + LD a,(HL) ;Point to start of string + inc HL ;By using the CS over-ride we will always have + CP '$' ;a valid pointer to messages at the end of this monitor + JP z,print2 + CP 0 ;Also terminate with 0's + JP Z,print2 + LD C,A + call ZCO + jp print1 +print2: + pop BC + POP AF + ret + +;--------------------------------------------------------------------------------------------------- + +SIGNON: + .DB CR,LF,LF + .DB "Test VT82C42 PC Keyboard & Mouse controller chip on Z80 KBDMSE Board." + .DB CR,LF,"$" +INIT_ERR: + .DB CR,LF,BELL + .DB "Error: The 0xAA Test of Controller did nor return 0x55. Program Halted." + .DB CR,LF,"$" +INIT_OK: + .DB CR,LF + .DB "The 0xAA Test of Controller returned 0x55. Now enter keyboard keys." + .DB CR,LF,LF,"$" + +SCAN_MSG: + .DB "Scancode = $" +UPKEY_MSG: + .DB "(Up Keystroke)$" +CAPS_MSG: + .DB "(Caps Lock)$" +SHIFT_MSG: + .DB "(Shift Key)$" +CTRL_MSG: + .DB "(CTRL Key)$" +NUM_MSG: + .DB "(NUM Key)$" +IBM1_MSG: + .DB "Table 1 lookup -> $" +IBM2_MSG: + .DB " Table 2 lookup -> $" + + +IBM1TBL: ;The "Normal" table + ;00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f + .DB 0,"*", 0,"*","*","*","*","*", 0,"*","*","*","*",09H,"`",00H +; .DB 000,027,"1","2","3","4","5","6","7","8","9","0","-","=",008,009 ;00-0F + + ;10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f + .DB 0, 0, 0, 0, 0,"q","1", 0, 0, 0,"z","s","a","w","2",0 +; .DB "q","w","e","r","t","y","u","i","o","p","[","]",013,000,"a","s" ;10-1F + + ;20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2a, 2b, 2c, 2d, 2e, 2f + .DB 0,"c","x","d","e","4","3", 0, 0," ","v","f","t","r","5",0 +; .DB "d","f","g","h","j","k","l",";",27H,60H,000,092,"z","x","c","v" ;20-2F + + ;30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3a, 3b, 3c, 3d, 3e, 3f + .DB 0,"n","b","h","g","y","6", 0, 0, 0,"m","j","u","7","8",0 +; .DB "b","n","m",",",".","/",000,000,000," ",000,000,000,000,000,000 ;30-3F + + ;40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e, 4f + .DB 0,",","k","i","o","0","9", 0, 0,".","/","l",";","p","-",0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;40-4F + + ;50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 5a, 5b, 5c, 5d, 5e, 5f + .DB 0, 0,27H, 0,"[","=", 0, 0, 0, 0,0DH,"]", 0,5CH, 0,0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;50-5F + + ;60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 6a, 6b, 6c, 6d, 6e, 6f + .DB 0, 0, 0, 0, 0, 0,08H, 0, 0,11H, 0,13H,10H, 0, 0, 0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;60-6F + + ;70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 7a, 7b, 7c, 7d, 7e, 7f + .DB 0BH,7FH,03H,15H,04H,05H,1BH,00H,"*",02H,18H,16H,0CH,17H,"*",0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;70-7F + + ;80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 8a, 8b, 8c, 8d, 8e, 8f + .DB 0, 0, 0,"*", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;80-8F + + +IBM2TBL: ;If the SHIFT key or CAPS lock key is on + ;00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f + .DB 0, "*", 0,"*","*","*","*","*", 0,"*","*","*","*",09H,"~",00H +; .DB 000,027,"!","@","#","$","%","^","&","*","(",")","_","+",008,009 ;00-0F + + ;10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1a, 1b, 1c, 1d, 1e, 1f + .DB 0, 0, 0, 0, 0,"Q","!", 0, 0, 0,"Z","S","A","W","@",0 +; .DB "Q","W","E","R","T","Y","U","I","O","P","{","}",013,000,"A","S" ;10-1F + + ;20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2a, 2b, 2c, 2d, 2e, 2f + .DB 0,"C","X","D","E","$","#", 0, 0," ","V","F","T","R","%",0 +; .DB "D","F","G","H","J","K","L",":",034,"~",000,"|","Z","X","C","V" ;20-2F + + ;30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 3a, 3b, 3c, 3d, 3e, 3f + .DB 0,"N","B","H","G","Y","^", 0, 0, 0,"M","J","U","&","*",0 +; .DB "B","N","M","<",">","?",000,000,000," ",000,000,000,000,000,000 ;30-3F + + ;40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 4a, 4b, 4c, 4d, 4e, 4f + .DB 0,"<","K","I","O",29H,"(", 0, 0,">","?","L",":","P", "_",0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;40-4F + + ;50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 5a, 5b, 5c, 5d, 5e, 5f + .DB 0, 0,22H, 0,"{","+", 0, 0, 0, 0,0DH,"}", 0,"|", 0,0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;50-5F + + ;60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 6a, 6b, 6c, 6d, 6e, 6f + .DB 0, 0, 0, 0, 0, 0,08H, 0, 0,11H, 0,13H,10H, 0, 0, 0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;60-6F + + ;70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 7a, 7b, 7c, 7d, 7e, 7f + .DB 0BH,7FH,03H,15H,04H,05H,1BH,00H,"*",02H,18H,16H,0CH,17H,"*",0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;70-7F + + ;80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 8a, 8b, 8c, 8d, 8e, 8f + .DB 0, 0, 0,"*", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;80-8F + + + .FILL 040H,000H +STACK: .DB 0H + .FILL 19,000H + +.END diff --git a/Source/Apps/Test/vdctest/Build.cmd b/Source/Apps/Test/vdctest/Build.cmd new file mode 100644 index 00000000..814cb585 --- /dev/null +++ b/Source/Apps/Test/vdctest/Build.cmd @@ -0,0 +1,12 @@ +@echo off +setlocal + +set TOOLS=../../../../Tools +set PATH=%TOOLS%\tasm32;%PATH% +set TASMTABS=%TOOLS%\tasm32 + +tasm -t180 -g3 -fFF vdctest.asm vdctest.com vdctest.lst || exit /b +tasm -t180 -g3 -fFF vdconly.asm vdconly.com vdconly.lst || exit /b + +copy /Y vdctest.com ..\..\..\..\Binary\Apps\Test\ || exit /b +copy /Y vdconly.com ..\..\..\..\Binary\Apps\Test\ || exit /b diff --git a/Source/Apps/Test/vdctest/Clean.cmd b/Source/Apps/Test/vdctest/Clean.cmd new file mode 100644 index 00000000..9ecb428f --- /dev/null +++ b/Source/Apps/Test/vdctest/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/vdctest/Makefile b/Source/Apps/Test/vdctest/Makefile new file mode 100644 index 00000000..c182b787 --- /dev/null +++ b/Source/Apps/Test/vdctest/Makefile @@ -0,0 +1,7 @@ +OBJECTS = vdctest.com vdconly.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/vdctest/vdconly.asm b/Source/Apps/Test/vdctest/vdconly.asm new file mode 100644 index 00000000..6f7b54ca --- /dev/null +++ b/Source/Apps/Test/vdctest/vdconly.asm @@ -0,0 +1,1055 @@ +;__CVDUTEST________________________________________________________________________________________ +; +; CVDUTEST COLOR VDU TEST +; +; WRITTEN BY: DAN WERNER -- 11/4/2011 +;__________________________________________________________________________________________________ +; + +; DATA CONSTANTS +;__________________________________________________________________________________________________ +;IDE REGISTER IO PORT ; FUNCTION +M8563Status .EQU $E4 +M8563Register .EQU $E4 +M8563Data .EQU $E5 + +I8242Status .EQU $E3 +I8242Command .EQU $E3 +I8242Data .EQU $E2 + + + .ORG $0100 +;__________________________________________________________________________________________________ +; MAIN PROGRAM BEGINS HERE +;__________________________________________________________________________________________________ +INITVDU: + CALL VDU_INIT ; INIT VDU +; CALL KB_INITIALIZE ; INIT KB + + CALL DSPMATRIX ; DISPLAY INIT MATRIX SCREEN +; CALL WAIT_KBHIT ; WAIT FOR A KEYSTROKE + +LOOP1: +; CALL GET_KEY + LD A,27 ; SIMULATE KEYSTROKE TO END PROGRAM + + LD C,14 + CP 13 + JP Z,LOOP2 + CP 27 + JP Z,LOOP3 + CP '6' + JP Z,LOOP4 + CALL VDU_PutChar ; DUMP CHAR TO DISPLAY + JP LOOP1 +LOOP2: + LD A,0 ; YES, WRAP TO NEXT LINE + LD (TERM_X),A ; STORE X + LD A,(TERM_Y) ; A= Y COORD + INC A ; INC Y COORD + LD (TERM_Y),A ; STORE Y + CALL GOTO_XY ; YES, HANDLE SCROLLING + JP LOOP1 +LOOP3: + LD C,00H ; CP/M SYSTEM RESET CALL + CALL 0005H ; RETURN TO PROMPT + RET +LOOP4: + CALL REVERSE_SCROLL + JP LOOP1 + + +;__DO_SCROLL_______________________________________________________________________________________ +; +; SCROLL THE SCREEN UP ONE LINE +;__________________________________________________________________________________________________ +DO_SCROLL: + PUSH AF ; STORE AF +DO_SCROLLE1: + PUSH HL ; STORE HL + PUSH BC ; STORE BC + + LD B, 24 ; GET REGISTER 24 + CALL VDU_GREG ; + OR 80H ; TURN ON COPY BIT + LD D,A ; PARK IT + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD E,23 ; +DO_SCROLL1: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0050H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,D ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + DEC A + LD A,E ; + CP 00H ; + JP NZ,DO_SCROLL1 ; LOOP TILL DONE + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD BC,0820H ; + ADD HL,BC ; + LD E,23 +DO_SCROLL2: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0050H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,D ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + DEC E + LD A,E ; + CP 00H ; + JP NZ,DO_SCROLL2 ; LOOP TILL DONE + + + LD A,23 ; SET CURSOR TO BEGINNING OF LAST LINE + LD (TERM_Y),A ; + LD A,(TERM_X) ; + PUSH AF ; STORE X COORD + LD A,0 ; + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION TO BEGINNING OF LINE + POP AF ; RESTORE X COORD + POP BC ; RESTORE BC + CALL PERF_ERASE_EOL ; ERASE SCROLLED LINE + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION + POP HL ; RESTORE HL + POP AF ; RESTORE AF + RET ; + +;__REVERSE_SCROLL__________________________________________________________________________________ +; +; SCROLL THE SCREEN DOWN ONE LINE +;__________________________________________________________________________________________________ +REVERSE_SCROLL: + PUSH AF ; STORE AF + PUSH HL ; STORE HL + PUSH BC ; STORE BC + + LD B, 24 ; GET REGISTER 24 + CALL VDU_GREG ; + OR 80H ; TURN ON COPY BIT + LD E,A ; PARK IT + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD BC,0730H ; + ADD HL,BC + LD D,23 ; +REVERSE_SCROLL1: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0FFB0H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,E ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + + DEC D + LD A,D ; + CP 00H ; + JP NZ,REVERSE_SCROLL1 ; LOOP TILL DONE + + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD BC,0F50H ; + ADD HL,BC + LD D,23 ; +REVERSE_SCROLL2: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0FFB0H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,E ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + + DEC D + LD A,D ; + CP 00H ; + JP NZ,REVERSE_SCROLL2 ; LOOP TILL DONE + LD A,0 ; SET CURSOR TO BEGINNING OF FIRST LINE + LD (TERM_Y),A ; + LD A,(TERM_X) ; + PUSH AF ; STORE X COORD + LD A,0 ; + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION TO BEGINNING OF LINE + POP AF ; RESTORE AF + POP BC ; RESTORE BC + CALL PERF_ERASE_EOL ; ERASE SCROLLED LINE + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION + POP HL ; RESTORE HL + POP AF ; RESTORE AF + RET ; + +;__VDU_INIT_________________________________________________________________________________________ +; +; INITIALIZE VDU +;__________________________________________________________________________________________________ +VDU_INIT: + PUSH AF ; STORE AF + PUSH DE ; STORE DE + PUSH HL ; STORE HL + PUSH BC ; STORE BC + + CALL VDU_CRTInit ; INIT 8563 VDU CHIP + CALL VDU_LOADFONT ; + CALL PERF_CURSOR_HOME ; CURSOR HOME + LD C,14 ; + CALL PERF_ERASE_EOS ; CLEAR SCREEN + CALL VDU_CursorOn ; TURN ON CURSOR + + POP BC ; + POP HL ; + POP DE ; + POP AF ; + + RET + +;__PERF_CURSOR_HOME________________________________________________________________________________ +; +; PERFORM CURSOR HOME +;__________________________________________________________________________________________________ +PERF_CURSOR_HOME: + LD A,0 ; LOAD 0 INTO A + LD (TERM_X),A ; SET X COORD + LD (TERM_Y),A ; SET Y COORD + JP GOTO_XY ; MOVE CURSOR TO POSITION + +;__PERF_ERASE_EOS__________________________________________________________________________________ +; +; PERFORM ERASE FROM CURSOR POS TO END OF SCREEN +; C= DEFAULT COLOR +;__________________________________________________________________________________________________ +PERF_ERASE_EOS: + PUSH HL + PUSH AF + PUSH BC + + LD HL, (VDU_DisplayPos) ; GET CURRENT DISPLAY ADDRESS + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + CALL GOTO_XY ; MOVE CURSOR + LD DE,0820H ; SET SCREEN SIZE INTO HL +PERF_ERASE_EOS_LOOP: + LD A, ' ' ; MOVE SPACE CHARACTER INTO A + LD B,31 ; + CALL VDU_WREG ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS + DEC DE ; DEC COUNTER + LD A,D ; IS COUNTER 0 YET? + OR E ; + JP NZ,PERF_ERASE_EOS_LOOP ; NO, LOOP + LD DE,0820H ; SET SCREEN SIZE INTO HL +PERF_ERASE_EOS_CLOOP: + LD A, C ; MOVE COLOR INTO A + LD B,31 ; + CALL VDU_WREG ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS + DEC DE ; DEC COUNTER + LD A,D ; IS COUNTER 0 YET? + OR E ; + JP NZ,PERF_ERASE_EOS_CLOOP ; NO, LOOP + + CALL GOTO_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION + POP BC + POP AF + POP HL + RET + +;__PERF_ERASE_EOL__________________________________________________________________________________ +; +; PERFORM ERASE FROM CURSOR POS TO END OF LINE +; C=DEFAULT COLOR +;__________________________________________________________________________________________________ +PERF_ERASE_EOL: + PUSH HL + PUSH AF + PUSH BC + + LD A,(TERM_X) ; GET CURRENT CURSOR X COORD + LD D,A ; STORE IT IN C + LD A,80 ; MOVE CURRENT LINE WIDTH INTO A + SUB D ; GET REMAINING POSITIONS ON CURRENT LINE + LD B,A ; MOVE IT INTO B +PERF_ERASE_EOL_LOOP: + LD A, ' ' ; MOVE SPACE CHARACTER INTO A + CALL VDU_PutCharRAW ; + DJNZ PERF_ERASE_EOL_LOOP ; LOOP UNTIL DONE + CALL GOTO_XY ; MOVE CURSOR BACK TO ORIGINAL POSITION + POP BC + POP AF + POP HL + RET + +;__DSPMATRIX_______________________________________________________________________________________ +; +; DISPLAY INTRO SCREEN +;__________________________________________________________________________________________________ +DSPMATRIX: + CALL PERF_CURSOR_HOME ; RESET CURSOR TO HOME POSITION + LD HL,TESTMATRIX ; SET HL TO SCREEN IMAGE + LD DE, 1919 ; SET IMAGE SIZE +; LD C,00000011B ; SET COLOR + LD C,00001111B ; SET COLOR +DSPMATRIX_LOOP: + LD A,(HL) ; GET NEXT CHAR FROM IMAGE + call VDU_PutChar ; DUMP CHAR TO DISPLAY + INC HL ; INC POINTER + DEC DE ; DEC COUNTER + LD A,D ; IS COUNTER ZERO? + OR E ; + JP NZ,DSPMATRIX_LOOP ; NO, LOOP + CALL PERF_CURSOR_HOME ; YES, RESET CURSOR TO HOME POSITION + RET + +TESTMATRIX: + .TEXT "0 1 2 3 4 5 6 7 " + .TEXT "01234567890123456789012345678901234567890123456789012345678901234567890123456789" + .TEXT "2 " + .TEXT "3 " + .TEXT "4 ===================================================== " + .TEXT "5 " + .TEXT "6 **** * * **** * * **** * * " + .TEXT "7 * * * * * * * * * * * * " + .TEXT "8 * * * * * * * * * ** " + .TEXT "9 * * * * * * * * * ** " + .TEXT "10 * * * * * * * * * * * * " + .TEXT "11 **** * **** **** **** * * " + .TEXT "12 " + .TEXT "13 ===================================================== " + .TEXT "14 " + .TEXT "15 VDU TEST V0.1 VT-52 EMULATION " + .TEXT "16 " + .TEXT "17 ** PRESS ANY KEY TO ENTER TERMINAL MODE ** " + .TEXT "18 " + .TEXT "19 " + .TEXT "21 " + .TEXT "22 " + .TEXT "23 " + .TEXT "24 " + + +;__VDU_WREG________________________________________________________________________________________ +; +; WRITE VALUE IN A TO REGISTER IN B +; B: REGISTER TO UPDATE +; A: VALUE TO WRITE +;__________________________________________________________________________________________________ +VDU_WREG: + PUSH AF ; STORE AF +VDU_WREG_1: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_WREG_1 ; wait for ready + LD A,B ; + OUT (M8563Register),A ; select register +VDU_WREG_2: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_WREG_2 ; wait for ready + POP AF ; + OUT (M8563Data),A ; PUT DATA + RET + + +;__VDU_GREG________________________________________________________________________________________ +; +; GET VALUE FROM REGISTER IN B PLACE IN A +; B: REGISTER TO GET +; A: VALUE +;__________________________________________________________________________________________________ +VDU_GREG: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_GREG ; wait for ready + LD A,B ; + OUT (M8563Register) , A ; select register +VDU_GREG_1: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_GREG_1 ; wait for ready + IN A,(M8563Data) ; GET DATA + RET + + + +VDU_Init8563: + .DB 126,80,102,73,32,224,25,29,252,231,160,231,0,0,7,128 + .DB 18,23,15,208,8,32,120,232,32,71,240,0,47,231,79,7,15,208,125,100,245 + +;__VDU_CRTInit_____________________________________________________________________________________ +; +; INIT VDU CHIP +;__________________________________________________________________________________________________ +VDU_CRTInit: + PUSH AF ; STORE AF + PUSH BC ; STORE BC + PUSH HL ; STORE HL + + LD B,$00 ; B = 0 + LD HL,VDU_Init8563 ; HL = pointer to the default values + XOR A ; A = 0 +VDU_CRTInitLoop: + LD A,(HL) ; GET VALUE + CALL VDU_WREG ; WRITE IT + INC HL + INC B ; + LD A,B ; + CP 37 ; + JR NZ,VDU_CRTInitLoop ; LOOP UNTIL DONE + POP HL ; RESTORE HL + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET + + +;__VDU_CursorOn____________________________________________________________________________________ +; +; TURN ON CURSOR +;__________________________________________________________________________________________________ +VDU_CursorOn: + PUSH AF ; STORE AF + LD A, $60 ; SET CURSOR VALUE + JP VDU_CursorSet ; + +;__VDU_CursorOff___________________________________________________________________________________ +; +; TURN OFF CURSOR +;__________________________________________________________________________________________________ +VDU_CursorOff: + PUSH AF ; STORE AF + LD A, $20 ; SET CURSOR VALUE +VDU_CursorSet: + PUSH BC ; STORE BC + LD B,10 + CALL VDU_WREG ; WRITE IT + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET + +;__GOTO_XY_________________________________________________________________________________________ +; +; MOVE CURSOR TO POSITON IN TERM_X AND TERM_Y +;__________________________________________________________________________________________________ +GOTO_XY: + PUSH AF ; STORE AF + + LD A,(TERM_Y) ; PLACE Y COORD IN A + CP 24 ; IS 24? + JP Z,DO_SCROLLE1 ; YES, MUST SCROLL + + PUSH BC ; STORE BC + PUSH DE ; STORE DE + LD A,(TERM_X) ; + LD H,A ; + LD A,(TERM_Y) ; + LD L,A ; + PUSH HL ; STORE HL + LD B, A ; B = Y COORD + LD DE, 80 ; MOVE LINE LENGTH INTO DE + LD HL, 0 ; MOVE 0 INTO HL + LD A, B ; A=B + CP 0 ; Y=0? + JP Z, VDU_YLoopEnd ; THEN DO NOT MULTIPLY BY 80 +VDU_YLoop: ; HL = 80 * Y + ADD HL, DE ; HL=HL+DE + DJNZ VDU_YLoop ; LOOP +VDU_YLoopEnd: ; + POP DE ; DE = org HL + LD E, D ; E = X + LD D, 0 ; D = 0 + ADD HL, DE ; HL = HL + X + LD (VDU_DisplayPos), HL ; + PUSH HL ; + POP DE ; + LD HL,(VDU_DISPLAY_START) ; + ADD HL,DE ; + LD B, 18 ; SET UPDATE ADDRESS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE ADDRESS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 14 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 15 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + POP DE ; RESTORE DE + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET + +;__VDU_PutChar______________________________________________________________________________________ +; +; PLACE CHARACTER ON SCREEN +; A: CHARACTER TO OUTPUT +; C: COLOR +;__________________________________________________________________________________________________ +VDU_PutChar: + PUSH DE ; STORE DE + PUSH AF ; STORE AF + PUSH HL ; STORE HL + LD D,A ; STORE CHAR IN D + LD A,(TERM_X) ; PLACE X COORD IN A + INC A ; INC X COORD + LD (TERM_X),A ; STORE IN A + CP 80 ; IS 80? + JP NZ,VDU_PutChar1 ; NO, PLACE CHAR ON DISPLAY + LD A,0 ; YES, WRAP TO NEXT LINE + LD (TERM_X),A ; STORE X + LD A,(TERM_Y) ; A= Y COORD + INC A ; INC Y COORD + LD (TERM_Y),A ; STORE Y + CP 24 ; IS PAST END OF SCREEN? + CALL Z,GOTO_XY ; YES, HANDLE SCROLLING +VDU_PutChar1: ; + ; + LD HL, (VDU_DisplayPos) ; GET CURRENT DISPLAY ADDRESS + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,D ; RESTORE CHAR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + PUSH HL ; + LD DE,$0820 ; + ADD HL,DE ; + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,C ; GET COLOR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + POP HL ; RESTORE ADDRESS + INC HL ; INCREMENT IT + LD (VDU_DisplayPos), HL ; STORE CURRENT DISPLAY ADDRESS + PUSH HL ; MOVE HL TO DE + POP DE ; + LD HL,(VDU_DISPLAY_START) ; + ADD HL,DE ; + LD B, 14 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 15 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + POP HL ; RESTORE HL + POP AF ; RESTORE AF + POP DE ; RESTORE DE + RET + +VDU_PutCharRAW: + PUSH BC ; + LD D,A ; + LD HL, (VDU_DisplayPos) ; GET CURRENT DISPLAY ADDRESS + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,D ; RESTORE CHAR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + PUSH HL ; + LD DE,$0820 ; + ADD HL,DE ; + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,C ; GET COLOR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + POP HL ; RESTORE ADDRESS + INC HL ; INCREMENT IT + LD (VDU_DisplayPos), HL ; STORE CURRENT DISPLAY ADDRESS + POP BC + RET + +;__VDU_LOADFONT____________________________________________________________________________________ +; +; LOAD SCREEN FONT +;__________________________________________________________________________________________________ +VDU_LOADFONT: + PUSH AF + PUSH BC + + LD HL,$2000 ; SET FONT LOCATION + ; + LD B, 18 ; SET UPDATE ADDRESS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE ADDRESS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B,$00 ; FONT SIZE + LD C,$20 ; FONT SIZE + LD HL,FONT ; FONT DATA +VDU_LOADFONT_LOOP: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_LOADFONT_LOOP ; wait for ready + LD A,31 ; + OUT (M8563Register) , A ; select register +VDU_LOADFONT_LOOP_1: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_LOADFONT_LOOP_1 ; wait for ready + LD A,(HL) ; + OUT (M8563Data) , A ; PUT DATA + INC HL + DJNZ VDU_LOADFONT_LOOP ; + DEC C ; + JP NZ,VDU_LOADFONT_LOOP ; + POP BC + POP AF + RET + +;__KB_INITIALIZE___________________________________________________________________________________ +; +; INIT KEYBOARD CONTROLLER +;__________________________________________________________________________________________________ +KB_INITIALIZE: + LD C,0a7H ; + CALL I8242CommandPut ; + LD C,0aeH ; + CALL I8242CommandPut ; + LD C,0aaH ; + CALL I8242CommandPut ; + LD A,0 ; EMPTY KB QUEUE + LD (KB_QUEUE_PTR),A ; + RET + +;__I8242CommandPut_________________________________________________________________________________ +; +; WRITE VALUE IN A TO 8242 +; C: VALUE TO WRITE +;__________________________________________________________________________________________________ +I8242CommandPut: + IN A,(I8242Status) ; read status register + BIT 1,A ; if bit 1 = 1 + JR NZ,I8242CommandPut ; wait for ready + LD A,C ; + OUT (I8242Command),A ; select register + RET + +;__WAIT_KBHIT______________________________________________________________________________________ +; +; WAIT FOR A KEY PRESS +;__________________________________________________________________________________________________ +WAIT_KBHIT: + CALL KB_PROCESS ; call keyboard routine + LD A,(KB_QUEUE_PTR) ; IS QUEUE EMPTY? + OR A ; set flags + JP Z,WAIT_KBHIT ; if no keys waiting, try again + RET + +;__IS_KBHIT________________________________________________________________________________________ +; +; WAS A KEY PRESSED? +;__________________________________________________________________________________________________ +IS_KBHIT: + CALL KB_PROCESS ; call keyboard routine + LD A,(KB_QUEUE_PTR) ; ask if keyboard has key waiting + RET + +;__GET_KEY_________________________________________________________________________________________ +; +; GET KEY PRESS VALUE +;__________________________________________________________________________________________________ +GET_KEY: + CALL WAIT_KBHIT ; WAIT FOR A KEY + LD A,(KB_QUEUE_PTR) ; GET QUEUE POINTER + OR A ; + RET Z ; ABORT IF QUEUE EMPTY + PUSH BC ; STORE BC + LD B,A ; STORE QUEUE COUNT FOR LATER + PUSH HL ; STORE HL + LD A,(KB_QUEUE) ; GET TOP BYTE FROM QUEUE + PUSH AF ; STORE IT + LD HL,KB_QUEUE ; GET POINTER TO QUEUE +GET_KEY_LOOP: ; + INC HL ; POINT TO NEXT VALUE IN QUEUE + LD A,(HL) ; GET VALUE + DEC HL ; + LD (HL),A ; MOVE IT UP ONE + INC HL ; + DJNZ GET_KEY_LOOP ; LOOP UNTIL DONE + LD A,(KB_QUEUE_PTR) ; DECREASE QUEUE POINTER BY ONE + DEC A ; + LD (KB_QUEUE_PTR),A ; + POP AF ; RESTORE VALUE + POP HL ; RESTORE HL + POP BC ; RESTORE BC + RET + + +;__KB_PROCESS______________________________________________________________________________________ +; +; a=0 if want to know if a byte is available, and a=1 to ask for the byte +;__________________________________________________________________________________________________ +KB_PROCESS: + IN A,(I8242Status) ; read status register + BIT 0,A ; if bit 0 = 0 + RET Z ; EXIT + IN A,(I8242Data) ; GET BYTE + call KB_decodechar ; returns char or 0 for things like keyup, some return directly to cp/m + ret ; return to cp/m + +;__KB_waitbyte______________________________________________________________________________________ +; +; WAIT FOR byte TO BE available +;__________________________________________________________________________________________________ +KB_waitbyte: + IN A,(I8242Status) ; read status register + BIT 0,A ; if bit 0 = 0 + jp Z,KB_waitbyte ; LOOP + IN A,(I8242Data) ; GET BYTE + RET + +;__KB_decodechar____________________________________________________________________________________ +; +; decode character pass a and prints out the char +; on the LCD screen +;__________________________________________________________________________________________________ +KB_decodechar: + cp 0 ; is it zero + ret z ; return if a zero - no need to do anything + + ld c,a ; + cp 0AAh ; shift (down, because up would be trapped by 0F above) + jp z,shiftup ; + cp 0B6h ; other shift key + jp z,shiftup ; + cp 9Dh ; control key + jp z,controlup ; + AND 80H ; if bit 7 = 1 + RET nz ; ignore char up + ld a,C ; + cp 0E0h ; TWO BYTE + JP Z,twobyte ; + cp 03Ah ; caps lock so toggle + jp z,capstog ; + cp 2Ah ; shift (down, because up would be trapped by 0F above) + jp z,shiftdown ; + cp 36h ; other shift key + jp z,shiftdown ; + cp 01Dh ; control key + jp z,controldown ; + ld c,a ; + ld b,0 ; add bc to hl + ld hl,normalkeys ; offset to add + add hl,bc ; + ld a,(ctrl) ; + cp 0 ; is control being held down? + jR z,dc1 ; no so go back to test caps lock on + ld a,(hl) ; get the letter, should be smalls + sub 96 ; a=97 so subtract 96 a=1=^A + JP KB_ENQUEUE ; STORE ON KB QUEUE +dc1: ld a,(capslock) ; + cp 0 ; is it 0, if so then don't add the caps offset + jr z,dc2 ; + ld c,080h ; add another 50h to smalls to get caps + add hl,bc ; +dc2: ld a,(hl) ; + JP KB_ENQUEUE ; STORE ON KB QUEUE +twobyte:; already got EO so get the next character + call KB_waitbyte + cp 053h ; delete + jp z,deletekey ; + cp 01Ch ; return on number pad + jp z,returnkey ; + cp 050h ; + jp z,downarrow ; + cp 04Dh ; + jp z,rightarrow ; + cp 04Bh ; + jp z,leftarrow ; + cp 048h ; + jp z,uparrow ; + cp 052h ; + jp z,insert ; + cp 049h ; + jp z,pageup ; + cp 051h ; + jp z,pagedown ; + cp 047h ; + jp z,home ; + cp 04Fh ; + jp z,end ; + ld a,0 ; returns nothing + ret +home: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'w' ; w + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +end: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'q' ; q + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +downarrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'B' ; B + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +rightarrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'C' ; C + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +leftarrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'D' ; D + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +uparrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'A' ; A + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +insert: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'p' ; p + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +pageup: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'y' ; y + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +pagedown: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'s' ; s + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +controldown: ; same code as shiftdown but diff location + ld a,0ffh ; + ld (ctrl),a ; control down + ld a,0 ; + ret ; +controlup: ; control key up see shift for explanation + ld a,0 ; + ld (ctrl),a ; + ld a,0 ; + ret ; +returnkey: ; + ld a,13 ; + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +deletekey: ; + ld a,07fh ; delete key value that cp/m uses + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +capstog: ; + ld a,(capslock) ; + xor 11111111B ; swap all the bits + ld (capslock),a ; + ld a,0 ; returns nothing + ret ; +shiftdown: ; shift is special - hold it down and it autorepeats + ; so once it is down, turn caps on and ignore all further shifts + ; only an F0+shift turns caps lock off again + ld a,0ffh ; + ld (capslock),a ; + ld a,0 ; returns nothing + ret ; +shiftup: ; shiftup turns off caps lock definitely + ld a,0 ; + ld (capslock),a ; + ld a,0 ; returns nothing + ret ; + +;__KB_ENQUEUE______________________________________________________________________________________ +; +; STORE A BYTE IN THE KEYBOARD QUEUE +; A: BYTE TO ENQUEUE +;__________________________________________________________________________________________________ +KB_ENQUEUE: + PUSH DE ; STORE DE + PUSH HL ; STORE HL + PUSH AF ; STORE VALUE + LD A,(KB_QUEUE_PTR); PUT QUEUE POINTER IN A + CP 15 ; IS QUEUE FULL + JP P,KB_ENQUEUE_AB ; YES, ABORT + LD HL,KB_QUEUE ; GET QUEUE POINTER + PUSH HL ; MOVE HL TO BC + POP BC ; + LD H,0 ; ZERO OUT H + LD L,A ; PLACE QUEUE POINTER IN L + ADD HL,BC ; POINT HL AT THE NEXT LOACTION TO ADD VALUE + POP AF ; RESTORE VALUE + LD (HL),A ; ENQUEUE VALUE + LD A,(KB_QUEUE_PTR); GET QUEUE POINTER + INC A ; INC IT + LD (KB_QUEUE_PTR),A; STORE QUEUE POINTER +KB_ENQUEUE_AB: + POP HL ; RESTORE HL + POP DE ; RESTORE DE + RET + +normalkeys: ; The TI character codes, offset from label by keyboard scan code + .db 000,027,"1","2","3","4","5","6","7","8","9","0","-","=",008,009 ;00-0F + .DB "q","w","e","r","t","y","u","i","o","p","[","]",013,000,"a","s" ;10-1F + .DB "d","f","g","h","j","k","l",";",27H,60H,000,092,"z","x","c","v" ;20-2F + .DB "b","n","m",",",".","/",000,000,000," ",000,000,000,000,000,000 ;30-3F + .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;40-4F + .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;50-5F + .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;60-6F + .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;70-7F + .db 000,027,"!","@","#","$","%","^","&","*","(",")","_","+",008,009 + .DB "Q","W","E","R","T","Y","U","I","O","P","{","}",013,000,"A","S" + .DB "D","F","G","H","J","K","L",":",034,"~",000,"|","Z","X","C","V" + .DB "B","N","M","<",">","?",000,000,000," ",000,000,000,000,000,000 + .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + + .include "font.asm" + +;__________________________________________________________________________________________________ +; +; RAM STORAGE AREAS +;__________________________________________________________________________________________________ + +ALT_KEYPAD .DB 0 ; ALT KEYPAD ENABLED? +GR_MODE .DB 0 ; GRAPHICS MODE ENABLED? +TERM_X: .DB 0 ; CURSOR X +TERM_Y: .DB 0 ; CURSOR Y +TERMSTATE: .DB 0 ; TERMINAL STATE + ; 0 = NORMAL + ; 1 = ESC RCVD +VDU_DisplayPos: .DW 0 ; CURRENT DISPLAY POSITION +VDU_DISPLAY_START: + .DW 0 ; CURRENT DISPLAY POSITION +capslock .DB 0 ; location for caps lock, either 00000000 or 11111111 +ctrl .DB 0 ; location for ctrl on or off 00000000 or 11111111 +numlock .DB 0 ; location for num lock +skipcount .DB 0 ; only check some calls, speeds up a lot of cp/m + +KB_QUEUE .DB 0,0,0,0,0,0,0,0 ; 16 BYTE KB QUEUE + .DB 0,0,0,0,0,0,0,0 +KB_QUEUE_PTR .DB 0 ; POINTER TO QUEUE +PARKSTACK .DW 0000 ; SAVE STACK POINTER + + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; +TERMSTACK: .DB 0 ; + + + .end diff --git a/Source/Apps/Test/vdctest/vdctest.asm b/Source/Apps/Test/vdctest/vdctest.asm new file mode 100644 index 00000000..b3bbd949 --- /dev/null +++ b/Source/Apps/Test/vdctest/vdctest.asm @@ -0,0 +1,1072 @@ +;__CVDUTEST________________________________________________________________________________________ +; +; CVDUTEST COLOR VDU TEST +; +; WRITTEN BY: DAN WERNER -- 11/4/2011 +;__________________________________________________________________________________________________ +; + +; DATA CONSTANTS +;__________________________________________________________________________________________________ +;IDE REGISTER IO PORT ; FUNCTION +M8563Status .EQU $E4 +M8563Register .EQU $E4 +M8563Data .EQU $E5 + +I8242Status .EQU $E3 +I8242Command .EQU $E3 +I8242Data .EQU $E2 + + + .ORG $0100 +;__________________________________________________________________________________________________ +; MAIN PROGRAM BEGINS HERE +;__________________________________________________________________________________________________ +INITVDU: + CALL VDU_INIT ; INIT VDU + CALL KB_INITIALIZE ; INIT KB + + CALL DSPMATRIX ; DISPLAY INIT MATRIX SCREEN + CALL WAIT_KBHIT ; WAIT FOR A KEYSTROKE + +LOOP1: + CALL GET_KEY + LD C,14 + CP 13 + JP Z,LOOP2 + CP 27 + JP Z,LOOP3 + CP '6' + JP Z,LOOP4 + CALL VDU_PutChar ; DUMP CHAR TO DISPLAY + JP LOOP1 +LOOP2: + LD A,0 ; YES, WRAP TO NEXT LINE + LD (TERM_X),A ; STORE X + LD A,(TERM_Y) ; A= Y COORD + INC A ; INC Y COORD + LD (TERM_Y),A ; STORE Y + CALL GOTO_XY ; YES, HANDLE SCROLLING + JP LOOP1 +LOOP3: + LD C,00H ; CP/M SYSTEM RESET CALL + CALL 0005H ; RETURN TO PROMPT + RET +LOOP4: + CALL REVERSE_SCROLL + JP LOOP1 + + +;__DO_SCROLL_______________________________________________________________________________________ +; +; SCROLL THE SCREEN UP ONE LINE +;__________________________________________________________________________________________________ +DO_SCROLL: + PUSH AF ; STORE AF +DO_SCROLLE1: + PUSH HL ; STORE HL + PUSH BC ; STORE BC + + LD B, 24 ; GET REGISTER 24 + CALL VDU_GREG ; + OR 80H ; TURN ON COPY BIT + LD D,A ; PARK IT + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD E,23 ; +DO_SCROLL1: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0050H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,D ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + DEC A + LD A,E ; + CP 00H ; + JP NZ,DO_SCROLL1 ; LOOP TILL DONE + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD BC,0820H ; + ADD HL,BC ; + LD E,23 +DO_SCROLL2: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0050H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,D ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + DEC E + LD A,E ; + CP 00H ; + JP NZ,DO_SCROLL2 ; LOOP TILL DONE + + + LD A,23 ; SET CURSOR TO BEGINNING OF LAST LINE + LD (TERM_Y),A ; + LD A,(TERM_X) ; + PUSH AF ; STORE X COORD + LD A,0 ; + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION TO BEGINNING OF LINE + POP AF ; RESTORE X COORD + POP BC ; RESTORE BC + CALL PERF_ERASE_EOL ; ERASE SCROLLED LINE + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION + POP HL ; RESTORE HL + POP AF ; RESTORE AF + RET ; + +;__REVERSE_SCROLL__________________________________________________________________________________ +; +; SCROLL THE SCREEN DOWN ONE LINE +;__________________________________________________________________________________________________ +REVERSE_SCROLL: + PUSH AF ; STORE AF + PUSH HL ; STORE HL + PUSH BC ; STORE BC + + LD B, 24 ; GET REGISTER 24 + CALL VDU_GREG ; + OR 80H ; TURN ON COPY BIT + LD E,A ; PARK IT + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD BC,0730H ; + ADD HL,BC + LD D,23 ; +REVERSE_SCROLL1: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0FFB0H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,E ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + + DEC D + LD A,D ; + CP 00H ; + JP NZ,REVERSE_SCROLL1 ; LOOP TILL DONE + + + LD HL, (VDU_DISPLAY_START) ; GET UP START OF DISPLAY + LD BC,0F50H ; + ADD HL,BC + LD D,23 ; +REVERSE_SCROLL2: + LD B, 18 ; SET UPDATE(DEST) POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE(DEST) POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD BC,0FFB0H ; + ADD HL,BC ; + LD B, 32 ; SET SOURCE POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 33 ; SET SOURCE POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 24 ; SET COPY + LD A,E ; + CALL VDU_WREG ; WRITE IT + + LD B, 30 ; SET AMOUNT TO COPY + LD A,050H ; + CALL VDU_WREG ; WRITE IT + + DEC D + LD A,D ; + CP 00H ; + JP NZ,REVERSE_SCROLL2 ; LOOP TILL DONE + LD A,0 ; SET CURSOR TO BEGINNING OF FIRST LINE + LD (TERM_Y),A ; + LD A,(TERM_X) ; + PUSH AF ; STORE X COORD + LD A,0 ; + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION TO BEGINNING OF LINE + POP AF ; RESTORE AF + POP BC ; RESTORE BC + CALL PERF_ERASE_EOL ; ERASE SCROLLED LINE + LD (TERM_X),A ; + CALL GOTO_XY ; SET CURSOR POSITION + POP HL ; RESTORE HL + POP AF ; RESTORE AF + RET ; + + + +;__VDU_INIT_________________________________________________________________________________________ +; +; INITIALIZE VDU +;__________________________________________________________________________________________________ +VDU_INIT: + PUSH AF ; STORE AF + PUSH DE ; STORE DE + PUSH HL ; STORE HL + PUSH BC ; STORE BC + + CALL VDU_CRTInit ; INIT 8563 VDU CHIP + CALL VDU_LOADFONT ; + CALL PERF_CURSOR_HOME ; CURSOR HOME + LD C,14 ; + CALL PERF_ERASE_EOS ; CLEAR SCREEN + CALL VDU_CursorOn ; TURN ON CURSOR + + POP BC ; + POP HL ; + POP DE ; + POP AF ; + + RET + +;__PERF_CURSOR_HOME________________________________________________________________________________ +; +; PERFORM CURSOR HOME +;__________________________________________________________________________________________________ +PERF_CURSOR_HOME: + LD A,0 ; LOAD 0 INTO A + LD (TERM_X),A ; SET X COORD + LD (TERM_Y),A ; SET Y COORD + JP GOTO_XY ; MOVE CURSOR TO POSITION + +;__PERF_ERASE_EOS__________________________________________________________________________________ +; +; PERFORM ERASE FROM CURSOR POS TO END OF SCREEN +; C= DEFAULT COLOR +;__________________________________________________________________________________________________ +PERF_ERASE_EOS: + PUSH HL + PUSH AF + PUSH BC + + LD HL, (VDU_DisplayPos) ; GET CURRENT DISPLAY ADDRESS + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + CALL GOTO_XY ; MOVE CURSOR + LD DE,0820H ; SET SCREEN SIZE INTO HL +PERF_ERASE_EOS_LOOP: + LD A, ' ' ; MOVE SPACE CHARACTER INTO A + LD B,31 ; + CALL VDU_WREG ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS + DEC DE ; DEC COUNTER + LD A,D ; IS COUNTER 0 YET? + OR E ; + JP NZ,PERF_ERASE_EOS_LOOP ; NO, LOOP + LD DE,0820H ; SET SCREEN SIZE INTO HL +PERF_ERASE_EOS_CLOOP: + LD A, C ; MOVE COLOR INTO A + LD B,31 ; + CALL VDU_WREG ; WRITE IT TO SCREEN, VDU WILL AUTO INC TO NEXT ADDRESS + DEC DE ; DEC COUNTER + LD A,D ; IS COUNTER 0 YET? + OR E ; + JP NZ,PERF_ERASE_EOS_CLOOP ; NO, LOOP + + CALL GOTO_XY ; YES, MOVE CURSOR BACK TO ORIGINAL POSITION + POP BC + POP AF + POP HL + RET + +;__PERF_ERASE_EOL__________________________________________________________________________________ +; +; PERFORM ERASE FROM CURSOR POS TO END OF LINE +; C=DEFAULT COLOR +;__________________________________________________________________________________________________ +PERF_ERASE_EOL: + PUSH HL + PUSH AF + PUSH BC + + LD A,(TERM_X) ; GET CURRENT CURSOR X COORD + LD D,A ; STORE IT IN C + LD A,80 ; MOVE CURRENT LINE WIDTH INTO A + SUB D ; GET REMAINING POSITIONS ON CURRENT LINE + LD B,A ; MOVE IT INTO B +PERF_ERASE_EOL_LOOP: + LD A, ' ' ; MOVE SPACE CHARACTER INTO A + CALL VDU_PutCharRAW ; + DJNZ PERF_ERASE_EOL_LOOP ; LOOP UNTIL DONE + CALL GOTO_XY ; MOVE CURSOR BACK TO ORIGINAL POSITION + POP BC + POP AF + POP HL + RET + +;__DSPMATRIX_______________________________________________________________________________________ +; +; DISPLAY INTRO SCREEN +;__________________________________________________________________________________________________ +DSPMATRIX: + CALL PERF_CURSOR_HOME ; RESET CURSOR TO HOME POSITION + LD HL,TESTMATRIX ; SET HL TO SCREEN IMAGE + LD DE, 1919 ; SET IMAGE SIZE + LD C,00000011B ; SET COLOR +DSPMATRIX_LOOP: + LD A,(HL) ; GET NEXT CHAR FROM IMAGE + call VDU_PutChar ; DUMP CHAR TO DISPLAY + INC HL ; INC POINTER + DEC DE ; DEC COUNTER + LD A,D ; IS COUNTER ZERO? + OR E ; + JP NZ,DSPMATRIX_LOOP ; NO, LOOP + CALL PERF_CURSOR_HOME ; YES, RESET CURSOR TO HOME POSITION + RET + +TESTMATRIX: + .TEXT "0 1 2 3 4 5 6 7 " + .TEXT "01234567890123456789012345678901234567890123456789012345678901234567890123456789" + .TEXT "2 " + .TEXT "3 " + .TEXT "4 ===================================================== " + .TEXT "5 " + .TEXT "6 **** * * **** * * **** * * " + .TEXT "7 * * * * * * * * * * * * " + .TEXT "8 * * * * * * * * * ** " + .TEXT "9 * * * * * * * * * ** " + .TEXT "10 * * * * * * * * * * * * " + .TEXT "11 **** * **** **** **** * * " + .TEXT "12 " + .TEXT "13 ===================================================== " + .TEXT "14 " + .TEXT "15 VDU TEST V0.1 VT-52 EMULATION " + .TEXT "16 " + .TEXT "17 ** PRESS ANY KEY TO ENTER TERMINAL MODE ** " + .TEXT "18 " + .TEXT "19 " + .TEXT "21 " + .TEXT "22 " + .TEXT "23 " + .TEXT "24 " + + +;__VDU_WREG________________________________________________________________________________________ +; +; WRITE VALUE IN A TO REGISTER IN B +; B: REGISTER TO UPDATE +; A: VALUE TO WRITE +;__________________________________________________________________________________________________ +VDU_WREG: + PUSH AF ; STORE AF +VDU_WREG_1: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_WREG_1 ; wait for ready + LD A,B ; + OUT (M8563Register),A ; select register +VDU_WREG_2: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_WREG_2 ; wait for ready + POP AF ; + OUT (M8563Data),A ; PUT DATA + RET + + +;__VDU_GREG________________________________________________________________________________________ +; +; GET VALUE FROM REGISTER IN B PLACE IN A +; B: REGISTER TO GET +; A: VALUE +;__________________________________________________________________________________________________ +VDU_GREG: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_GREG ; wait for ready + LD A,B ; + OUT (M8563Register) , A ; select register +VDU_GREG_1: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_GREG_1 ; wait for ready + IN A,(M8563Data) ; GET DATA + RET + + + +VDU_Init8563: + .DB 126,80,102,73,32,224,25,29,252,231,160,231,0,0,7,128 + .DB 18,23,15,208,8,32,120,232,32,71,240,0,47,231,79,7,15,208,125,100,245 + +;__VDU_CRTInit_____________________________________________________________________________________ +; +; INIT VDU CHIP +;__________________________________________________________________________________________________ +VDU_CRTInit: + PUSH AF ; STORE AF + PUSH BC ; STORE BC + PUSH HL ; STORE HL + + LD B,$00 ; B = 0 + LD HL,VDU_Init8563 ; HL = pointer to the default values + XOR A ; A = 0 +VDU_CRTInitLoop: + LD A,(HL) ; GET VALUE + CALL VDU_WREG ; WRITE IT + INC HL + INC B ; + LD A,B ; + CP 37 ; + JR NZ,VDU_CRTInitLoop ; LOOP UNTIL DONE + POP HL ; RESTORE HL + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET + + +;__VDU_CursorOn____________________________________________________________________________________ +; +; TURN ON CURSOR +;__________________________________________________________________________________________________ +VDU_CursorOn: + PUSH AF ; STORE AF + LD A, $60 ; SET CURSOR VALUE + JP VDU_CursorSet ; + +;__VDU_CursorOff___________________________________________________________________________________ +; +; TURN OFF CURSOR +;__________________________________________________________________________________________________ +VDU_CursorOff: + PUSH AF ; STORE AF + LD A, $20 ; SET CURSOR VALUE +VDU_CursorSet: + PUSH BC ; STORE BC + LD B,10 + CALL VDU_WREG ; WRITE IT + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET + +;__GOTO_XY_________________________________________________________________________________________ +; +; MOVE CURSOR TO POSITON IN TERM_X AND TERM_Y +;__________________________________________________________________________________________________ +GOTO_XY: + PUSH AF ; STORE AF + + LD A,(TERM_Y) ; PLACE Y COORD IN A + CP 24 ; IS 24? + JP Z,DO_SCROLLE1 ; YES, MUST SCROLL + + PUSH BC ; STORE BC + PUSH DE ; STORE DE + LD A,(TERM_X) ; + LD H,A ; + LD A,(TERM_Y) ; + LD L,A ; + PUSH HL ; STORE HL + LD B, A ; B = Y COORD + LD DE, 80 ; MOVE LINE LENGTH INTO DE + LD HL, 0 ; MOVE 0 INTO HL + LD A, B ; A=B + CP 0 ; Y=0? + JP Z, VDU_YLoopEnd ; THEN DO NOT MULTIPLY BY 80 +VDU_YLoop: ; HL = 80 * Y + ADD HL, DE ; HL=HL+DE + DJNZ VDU_YLoop ; LOOP +VDU_YLoopEnd: ; + POP DE ; DE = org HL + LD E, D ; E = X + LD D, 0 ; D = 0 + ADD HL, DE ; HL = HL + X + LD (VDU_DisplayPos), HL ; + PUSH HL ; + POP DE ; + LD HL,(VDU_DISPLAY_START) ; + ADD HL,DE ; + LD B, 18 ; SET UPDATE ADDRESS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE ADDRESS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B, 14 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 15 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + POP DE ; RESTORE DE + POP BC ; RESTORE BC + POP AF ; RESTORE AF + RET + +;__VDU_PutChar______________________________________________________________________________________ +; +; PLACE CHARACTER ON SCREEN +; A: CHARACTER TO OUTPUT +; C: COLOR +;__________________________________________________________________________________________________ +VDU_PutChar: + PUSH DE ; STORE DE + PUSH AF ; STORE AF + PUSH HL ; STORE HL + LD D,A ; STORE CHAR IN D + LD A,(TERM_X) ; PLACE X COORD IN A + INC A ; INC X COORD + LD (TERM_X),A ; STORE IN A + CP 80 ; IS 80? + JP NZ,VDU_PutChar1 ; NO, PLACE CHAR ON DISPLAY + LD A,0 ; YES, WRAP TO NEXT LINE + LD (TERM_X),A ; STORE X + LD A,(TERM_Y) ; A= Y COORD + INC A ; INC Y COORD + LD (TERM_Y),A ; STORE Y + CP 24 ; IS PAST END OF SCREEN? + CALL Z,GOTO_XY ; YES, HANDLE SCROLLING +VDU_PutChar1: ; + ; + LD HL, (VDU_DisplayPos) ; GET CURRENT DISPLAY ADDRESS + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,D ; RESTORE CHAR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + PUSH HL ; + LD DE,$0820 ; + ADD HL,DE ; + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,C ; GET COLOR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + POP HL ; RESTORE ADDRESS + INC HL ; INCREMENT IT + LD (VDU_DisplayPos), HL ; STORE CURRENT DISPLAY ADDRESS + PUSH HL ; MOVE HL TO DE + POP DE ; + LD HL,(VDU_DISPLAY_START) ; + ADD HL,DE ; + LD B, 14 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 15 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + POP HL ; RESTORE HL + POP AF ; RESTORE AF + POP DE ; RESTORE DE + RET + +VDU_PutCharRAW: + PUSH BC ; + LD D,A ; + LD HL, (VDU_DisplayPos) ; GET CURRENT DISPLAY ADDRESS + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,D ; RESTORE CHAR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + PUSH HL ; + LD DE,$0820 ; + ADD HL,DE ; + LD B, 18 ; SET UPDATE CSR POS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE CSR POS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + LD A,C ; GET COLOR + LD B,31 ; + CALL VDU_WREG ; WRITE IT + POP HL ; RESTORE ADDRESS + INC HL ; INCREMENT IT + LD (VDU_DisplayPos), HL ; STORE CURRENT DISPLAY ADDRESS + POP BC + RET + +;__VDU_LOADFONT____________________________________________________________________________________ +; +; LOAD SCREEN FONT +;__________________________________________________________________________________________________ +VDU_LOADFONT: + PUSH AF + PUSH BC + + LD HL,$2000 ; SET FONT LOCATION + ; + LD B, 18 ; SET UPDATE ADDRESS IN VDU + LD A,H ; + CALL VDU_WREG ; WRITE IT + LD B, 19 ; SET UPDATE ADDRESS IN VDU + LD A,L ; + CALL VDU_WREG ; WRITE IT + + LD B,$00 ; FONT SIZE + LD C,$20 ; FONT SIZE + LD HL,FONT ; FONT DATA +VDU_LOADFONT_LOOP: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_LOADFONT_LOOP ; wait for ready + LD A,31 ; + OUT (M8563Register) , A ; select register +VDU_LOADFONT_LOOP_1: + IN A,(M8563Status) ; read address/status register + BIT 7,A ; if bit 7 = 1 than an update strobe has been occured + JR Z,VDU_LOADFONT_LOOP_1 ; wait for ready + LD A,(HL) ; + OUT (M8563Data) , A ; PUT DATA + INC HL + DJNZ VDU_LOADFONT_LOOP ; + DEC C ; + JP NZ,VDU_LOADFONT_LOOP ; + POP BC + POP AF + RET + +;__KB_INITIALIZE___________________________________________________________________________________ +; +; INIT KEYBOARD CONTROLLER +;__________________________________________________________________________________________________ +KB_INITIALIZE: + LD C,0a7H ; + CALL I8242CommandPut ; + LD C,0aeH ; + CALL I8242CommandPut ; + LD C,0aaH ; + CALL I8242CommandPut ; + LD A,0 ; EMPTY KB QUEUE + LD (KB_QUEUE_PTR),A ; + RET + +;__I8242CommandPut_________________________________________________________________________________ +; +; WRITE VALUE IN A TO 8242 +; C: VALUE TO WRITE +;__________________________________________________________________________________________________ +I8242CommandPut: + IN A,(I8242Status) ; read status register + BIT 1,A ; if bit 1 = 1 + JR NZ,I8242CommandPut ; wait for ready + LD A,C ; + OUT (I8242Command),A ; select register + RET + +;__WAIT_KBHIT______________________________________________________________________________________ +; +; WAIT FOR A KEY PRESS +;__________________________________________________________________________________________________ +WAIT_KBHIT: + CALL KB_PROCESS ; call keyboard routine + LD A,(KB_QUEUE_PTR) ; IS QUEUE EMPTY? + OR A ; set flags + JP Z,WAIT_KBHIT ; if no keys waiting, try again + RET + +;__IS_KBHIT________________________________________________________________________________________ +; +; WAS A KEY PRESSED? +;__________________________________________________________________________________________________ +IS_KBHIT: + CALL KB_PROCESS ; call keyboard routine + LD A,(KB_QUEUE_PTR) ; ask if keyboard has key waiting + RET + + +;__GET_KEY_________________________________________________________________________________________ +; +; GET KEY PRESS VALUE +;__________________________________________________________________________________________________ +GET_KEY: + CALL WAIT_KBHIT ; WAIT FOR A KEY + LD A,(KB_QUEUE_PTR) ; GET QUEUE POINTER + OR A ; + RET Z ; ABORT IF QUEUE EMPTY + PUSH BC ; STORE BC + LD B,A ; STORE QUEUE COUNT FOR LATER + PUSH HL ; STORE HL + LD A,(KB_QUEUE) ; GET TOP BYTE FROM QUEUE + PUSH AF ; STORE IT + LD HL,KB_QUEUE ; GET POINTER TO QUEUE +GET_KEY_LOOP: ; + INC HL ; POINT TO NEXT VALUE IN QUEUE + LD A,(HL) ; GET VALUE + DEC HL ; + LD (HL),A ; MOVE IT UP ONE + INC HL ; + DJNZ GET_KEY_LOOP ; LOOP UNTIL DONE + LD A,(KB_QUEUE_PTR) ; DECREASE QUEUE POINTER BY ONE + DEC A ; + LD (KB_QUEUE_PTR),A ; + POP AF ; RESTORE VALUE + POP HL ; RESTORE HL + POP BC ; RESTORE BC + RET + + +;__KB_PROCESS______________________________________________________________________________________ +; +; a=0 if want to know if a byte is available, and a=1 to ask for the byte +;__________________________________________________________________________________________________ +KB_PROCESS: + IN A,(I8242Status) ; read status register + BIT 0,A ; if bit 0 = 0 + RET Z ; EXIT + IN A,(I8242Data) ; GET BYTE + call KB_decodechar ; returns char or 0 for things like keyup, some return directly to cp/m + ret ; return to cp/m + +;__KB_waitbyte______________________________________________________________________________________ +; +; WAIT FOR byte TO BE available +;__________________________________________________________________________________________________ +KB_waitbyte: + IN A,(I8242Status) ; read status register + BIT 0,A ; if bit 0 = 0 + jp Z,KB_waitbyte ; LOOP + IN A,(I8242Data) ; GET BYTE + RET + + + +;__KB_decodechar____________________________________________________________________________________ +; +; decode character pass a and prints out the char +; on the LCD screen +;__________________________________________________________________________________________________ +KB_decodechar: + cp 0 ; is it zero + ret z ; return if a zero - no need to do anything + + ld c,a ; + cp 0AAh ; shift (down, because up would be trapped by 0F above) + jp z,shiftup ; + cp 0B6h ; other shift key + jp z,shiftup ; + cp 9Dh ; control key + jp z,controlup ; + AND 80H ; if bit 7 = 1 + RET nz ; ignore char up + ld a,C ; + cp 0E0h ; TWO BYTE + JP Z,twobyte ; + cp 03Ah ; caps lock so toggle + jp z,capstog ; + cp 2Ah ; shift (down, because up would be trapped by 0F above) + jp z,shiftdown ; + cp 36h ; other shift key + jp z,shiftdown ; + cp 01Dh ; control key + jp z,controldown ; + ld c,a ; + ld b,0 ; add bc to hl + ld hl,normalkeys ; offset to add + add hl,bc ; + ld a,(ctrl) ; + cp 0 ; is control being held down? + jR z,dc1 ; no so go back to test caps lock on + ld a,(hl) ; get the letter, should be smalls + sub 96 ; a=97 so subtract 96 a=1=^A + JP KB_ENQUEUE ; STORE ON KB QUEUE +dc1: ld a,(capslock) ; + cp 0 ; is it 0, if so then don't add the caps offset + jr z,dc2 ; + ld c,080h ; add another 50h to smalls to get caps + add hl,bc ; +dc2: ld a,(hl) ; + JP KB_ENQUEUE ; STORE ON KB QUEUE +twobyte:; already got EO so get the next character + call KB_waitbyte + cp 053h ; delete + jp z,deletekey ; + cp 01Ch ; return on number pad + jp z,returnkey ; + cp 050h ; + jp z,downarrow ; + cp 04Dh ; + jp z,rightarrow ; + cp 04Bh ; + jp z,leftarrow ; + cp 048h ; + jp z,uparrow ; + cp 052h ; + jp z,insert ; + cp 049h ; + jp z,pageup ; + cp 051h ; + jp z,pagedown ; + cp 047h ; + jp z,home ; + cp 04Fh ; + jp z,end ; + ld a,0 ; returns nothing + ret +home: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'w' ; w + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +end: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'q' ; q + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +downarrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'B' ; B + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +rightarrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'C' ; C + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +leftarrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'D' ; D + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +uparrow: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'A' ; A + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +insert: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'p' ; p + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +pageup: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'y' ; y + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +pagedown: ; + ld a,1BH ; ESC + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'?' ; ? + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ld a,'s' ; s + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +controldown: ; same code as shiftdown but diff location + ld a,0ffh ; + ld (ctrl),a ; control down + ld a,0 ; + ret ; +controlup: ; control key up see shift for explanation + ld a,0 ; + ld (ctrl),a ; + ld a,0 ; + ret ; +returnkey: ; + ld a,13 ; + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +deletekey: ; + ld a,07fh ; delete key value that cp/m uses + CALL KB_ENQUEUE ; STORE ON KB QUEUE + ret ; +capstog: ; + ld a,(capslock) ; + xor 11111111B ; swap all the bits + ld (capslock),a ; + ld a,0 ; returns nothing + ret ; +shiftdown: ; shift is special - hold it down and it autorepeats + ; so once it is down, turn caps on and ignore all further shifts + ; only an F0+shift turns caps lock off again + ld a,0ffh ; + ld (capslock),a ; + ld a,0 ; returns nothing + ret ; +shiftup: ; shiftup turns off caps lock definitely + ld a,0 ; + ld (capslock),a ; + ld a,0 ; returns nothing + ret ; + +;__KB_ENQUEUE______________________________________________________________________________________ +; +; STORE A BYTE IN THE KEYBOARD QUEUE +; A: BYTE TO ENQUEUE +;__________________________________________________________________________________________________ +KB_ENQUEUE: + PUSH DE ; STORE DE + PUSH HL ; STORE HL + PUSH AF ; STORE VALUE + LD A,(KB_QUEUE_PTR); PUT QUEUE POINTER IN A + CP 15 ; IS QUEUE FULL + JP P,KB_ENQUEUE_AB ; YES, ABORT + LD HL,KB_QUEUE ; GET QUEUE POINTER + PUSH HL ; MOVE HL TO BC + POP BC ; + LD H,0 ; ZERO OUT H + LD L,A ; PLACE QUEUE POINTER IN L + ADD HL,BC ; POINT HL AT THE NEXT LOACTION TO ADD VALUE + POP AF ; RESTORE VALUE + LD (HL),A ; ENQUEUE VALUE + LD A,(KB_QUEUE_PTR); GET QUEUE POINTER + INC A ; INC IT + LD (KB_QUEUE_PTR),A; STORE QUEUE POINTER +KB_ENQUEUE_AB: + POP HL ; RESTORE HL + POP DE ; RESTORE DE + RET + + + + +normalkeys: ; The TI character codes, offset from label by keyboard scan code +; .db 000,027,"1","2","3","4","5","6","7","8","9","0","-","=",008,009 ;00-0F +; .DB "q","w","e","r","t","y","u","i","o","p","[","]",013,000,"a","s" ;10-1F +; .DB "d","f","g","h","j","k","l",";",27H,60H,000,092,"z","x","c","v" ;20-2F +; .DB "b","n","m",",",".","/",000,000,000," ",000,000,000,000,000,000 ;30-3F +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;40-4F +; .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;50-5F +; .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;60-6F +; .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 ;70-7F +; .db 000,027,"!","@","#","$","%","^","&","*","(",")","_","+",008,009 +; .DB "Q","W","E","R","T","Y","U","I","O","P","{","}",013,000,"A","S" +; .DB "D","F","G","H","J","K","L",":",034,"~",000,"|","Z","X","C","V" +; .DB "B","N","M","<",">","?",000,000,000," ",000,000,000,000,000,000 +; .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 +; .DB 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 +; .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 +; .db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 + + + .DB 0,"*", 0,"*","*","*","*","*", 0,"*","*","*","*",09H,"`",00H + .DB 0, 0, 0, 0, 0,"q","1", 0, 0, 0,"z","s","a","w","2",0 + .DB 0,"c","x","d","e","4","3", 0, 0," ","v","f","t","r","5",0 + .DB 0,"n","b","h","g","y","6", 0, 0, 0,"m","j","u","7","8",0 + .DB 0,",","k","i","o","0","9", 0, 0,".","/","l",";","p","-",0 + .DB 0, 0,27H, 0,"[","=", 0, 0, 0, 0,0DH,"]", 0,5CH, 0,0 + .DB 0, 0, 0, 0, 0, 0,08H, 0, 0,11H, 0,13H,10H, 0, 0, 0 + .DB 0BH,7FH,03H,15H,04H,05H,1BH,00H,"*",02H,18H,16H,0CH,17H,"*",0 + .DB 0, 0, 0,"*", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + + + .include "font.asm" + +;__________________________________________________________________________________________________ +; +; RAM STORAGE AREAS +;__________________________________________________________________________________________________ + +ALT_KEYPAD .DB 0 ; ALT KEYPAD ENABLED? +GR_MODE .DB 0 ; GRAPHICS MODE ENABLED? +TERM_X: .DB 0 ; CURSOR X +TERM_Y: .DB 0 ; CURSOR Y +TERMSTATE: .DB 0 ; TERMINAL STATE + ; 0 = NORMAL + ; 1 = ESC RCVD +VDU_DisplayPos: .DW 0 ; CURRENT DISPLAY POSITION +VDU_DISPLAY_START: + .DW 0 ; CURRENT DISPLAY POSITION +capslock .DB 0 ; location for caps lock, either 00000000 or 11111111 +ctrl .DB 0 ; location for ctrl on or off 00000000 or 11111111 +numlock .DB 0 ; location for num lock +skipcount .DB 0 ; only check some calls, speeds up a lot of cp/m + +KB_QUEUE .DB 0,0,0,0,0,0,0,0 ; 16 BYTE KB QUEUE + .DB 0,0,0,0,0,0,0,0 +KB_QUEUE_PTR .DB 0 ; POINTER TO QUEUE +PARKSTACK .DW 0000 ; SAVE STACK POINTER + + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; + .DB 0,0,0,0,0,0,0,0 ; +TERMSTACK: .DB 0 ; + + + .end diff --git a/Source/CPM3/Build.cmd b/Source/CPM3/Build.cmd index 852c8266..24d69ca1 100644 --- a/Source/CPM3/Build.cmd +++ b/Source/CPM3/Build.cmd @@ -21,11 +21,13 @@ zx Z80ASM -UTIL/MF || exit /b copy optdsk.lib ldropts.lib || exit /b zx Z80ASM -BIOSLDR/MF || exit /b move /Y biosldr.rel biosldrd.rel || exit /b +move /Y biosldr.lst biosldrd.lst || exit /b zx LINK -CPMLDRD[L100]=CPMLDR,BIOSLDRD,UTIL || exit /b move /Y cpmldrd.com cpmldr.bin || exit /b copy optcmd.lib ldropts.lib || exit /b zx Z80ASM -BIOSLDR/MF || exit /b move /Y biosldr.rel biosldrc.rel || exit /b +move /Y biosldr.lst biosldrd.lst || exit /b zx LINK -CPMLDRC[L100]=CPMLDR,BIOSLDRC,UTIL || exit /b move /Y cpmldrc.com cpmldr.com || exit /b rem pause diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index 7c68ac72..b884fb8d 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -55,9 +55,24 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; CVDU_INIT: LD IY,CVDU_IDAT ; POINTER TO INSTANCE DATA - - CALL NEWLINE ; FORMATTING - PRTS("CVDU: IO=0x$") + + CALL NEWLINE + PRTS("CVDU: MODE=$") +#IF (CVDUMODE == CVDUMODE_ECB) + PRTS("ECB$") +#ENDIF +#IF (CVDUMODE == CVDUMODE_MBC) + PRTS("MBC$") +#ENDIF +; +#IF (CVDUMON == CVDUMON_CGA) + PRTS(" CGA$") +#ENDIF +#IF (CVDUMON == CVDUMON_EGA) + PRTS(" EGA$") +#ENDIF +; + PRTS(" IO=0x$") LD A,CVDU_STAT CALL PRTHEXBYTE CALL CVDU_PROBE ; CHECK FOR HW PRESENCE diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 2d39197c..4ae36c51 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -73,6 +73,13 @@ KBD_INIT: LD A,$AA ; CONTROLLER SELF TEST CALL KBD_PUTCMD ; SEND IT CALL KBD_GETDATA ; CONTROLLER SHOULD RESPOND WITH $55 (ACK) + + CP $55 ; IS IT THERE? + JR Z,KBD_INIT1 ; IF SO, CONTINUE + PRTS(" NOT PRESENT$") ; DIAGNOSE PROBLEM + RET ; BAIL OUT + +KBD_INIT1: LD A,$60 ; SET COMMAND REGISTER CALL KBD_PUTCMD ; SEND IT ; LD A,$60 ; XLAT ENABLED, MOUSE DISABLED, NO INTS diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 2f5672e1..63c6572d 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -1,30 +1,30 @@ @echo off setlocal -::call BuildDisk.cmd bp wbw_hd512 || exit /b +::call BuildDisk.cmd bp hd wbw_hd512 || exit /b ::goto :eof echo. echo Building Floppy Disk Images... echo. -call BuildDisk.cmd cpm22 wbw_fd144 ..\cpm22\cpm_wbw.sys || exit /b -call BuildDisk.cmd zsdos wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b -::call BuildDisk.cmd nzcom wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b -::call BuildDisk.cmd cpm3 wbw_fd144 ..\cpm3\cpmldr.sys || exit /b -::call BuildDisk.cmd zpm3 wbw_fd144 ..\cpm3\cpmldr.sys || exit /b -call BuildDisk.cmd ws4 wbw_fd144 || exit /b +call BuildDisk.cmd cpm22 fd wbw_fd144 ..\cpm22\cpm_wbw.sys || exit /b +call BuildDisk.cmd zsdos fd wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b +call BuildDisk.cmd nzcom fd wbw_fd144 ..\zsdos\zsys_wbw.sys || exit /b +call BuildDisk.cmd cpm3 fd wbw_fd144 ..\cpm3\cpmldr.sys || exit /b +call BuildDisk.cmd zpm3 fd wbw_fd144 ..\zpm3\zpmldr.sys || exit /b +call BuildDisk.cmd ws4 fd wbw_fd144 || exit /b echo. echo Building Hard Disk Images (512 directory entry format)... echo. -call BuildDisk.cmd cpm22 wbw_hd512 ..\cpm22\cpm_wbw.sys || exit /b -call BuildDisk.cmd zsdos wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b -call BuildDisk.cmd nzcom wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b -call BuildDisk.cmd cpm3 wbw_hd512 ..\cpm3\cpmldr.sys || exit /b -call BuildDisk.cmd zpm3 wbw_hd512 ..\zpm3\zpmldr.sys || exit /b -call BuildDisk.cmd ws4 wbw_hd512 || exit /b +call BuildDisk.cmd cpm22 hd wbw_hd512 ..\cpm22\cpm_wbw.sys || exit /b +call BuildDisk.cmd zsdos hd wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b +call BuildDisk.cmd nzcom hd wbw_hd512 ..\zsdos\zsys_wbw.sys || exit /b +call BuildDisk.cmd cpm3 hd wbw_hd512 ..\cpm3\cpmldr.sys || exit /b +call BuildDisk.cmd zpm3 hd wbw_hd512 ..\zpm3\zpmldr.sys || exit /b +call BuildDisk.cmd ws4 hd wbw_hd512 || exit /b -if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp wbw_hd512 || exit /b +if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp hd wbw_hd512 || exit /b echo. echo Building Combo Disk (512 directory entry format) Image... @@ -33,14 +33,14 @@ copy /b ..\..\Binary\hd512_cpm22.img + ..\..\Binary\hd512_zsdos.img + ..\..\Bina echo. echo Building Hard Disk Images (1024 directory entry format)... echo. -call BuildDisk.cmd cpm22 wbw_hd1024 ..\cpm22\cpm_wbw.sys || exit /b -call BuildDisk.cmd zsdos wbw_hd1024 ..\zsdos\zsys_wbw.sys || exit /b -call BuildDisk.cmd nzcom wbw_hd1024 ..\zsdos\zsys_wbw.sys || exit /b -call BuildDisk.cmd cpm3 wbw_hd1024 ..\cpm3\cpmldr.sys || exit /b -call BuildDisk.cmd zpm3 wbw_hd1024 ..\zpm3\zpmldr.sys || exit /b -call BuildDisk.cmd ws4 wbw_hd1024 || exit /b +call BuildDisk.cmd cpm22 hd wbw_hd1024 ..\cpm22\cpm_wbw.sys || exit /b +call BuildDisk.cmd zsdos hd wbw_hd1024 ..\zsdos\zsys_wbw.sys || exit /b +call BuildDisk.cmd nzcom hd wbw_hd1024 ..\zsdos\zsys_wbw.sys || exit /b +call BuildDisk.cmd cpm3 hd wbw_hd1024 ..\cpm3\cpmldr.sys || exit /b +call BuildDisk.cmd zpm3 hd wbw_hd1024 ..\zpm3\zpmldr.sys || exit /b +call BuildDisk.cmd ws4 hd wbw_hd1024 || exit /b -if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp wbw_hd1024 || exit /b +if exist ..\BPBIOS\bpbio-ww.rel call BuildDisk.cmd bp hd wbw_hd1024 || exit /b copy hd1024_prefix.dat ..\..\Binary\ || exit /b diff --git a/Source/Images/BuildDisk.ps1 b/Source/Images/BuildDisk.ps1 index b0ff3808..dd2805d1 100644 --- a/Source/Images/BuildDisk.ps1 +++ b/Source/Images/BuildDisk.ps1 @@ -1,4 +1,4 @@ -Param($Disk, $Format="", $SysFile="") +Param($Disk, $Type="", $Format="", $SysFile="") $ErrorAction = 'Stop' @@ -6,6 +6,12 @@ $CpmToolsPath = '../../Tools/cpmtools' $env:PATH = $CpmToolsPath + ';' + $env:PATH +if ($Type.Length -eq 0) +{ + Write-Error "No disk type specified!" -ErrorAction Stop + return +} + if ($Format.Length -eq 0) { Write-Error "No disk format specified!" -ErrorAction Stop @@ -75,9 +81,9 @@ for ($Usr=0; $Usr -lt 16; $Usr++) } } -if (Test-Path("d_${Disk}.txt")) +if (Test-Path("${Type}_${Disk}.txt")) { - foreach($Line in Get-Content "d_${Disk}.txt") + foreach($Line in Get-Content "${Type}_${Disk}.txt") { $Spec = $Line.Trim() if (($Spec.Length -gt 0) -and ($Spec.Substring(0,1) -ne "#")) diff --git a/Source/Images/Makefile b/Source/Images/Makefile index 444293d6..bda9e88b 100644 --- a/Source/Images/Makefile +++ b/Source/Images/Makefile @@ -3,7 +3,8 @@ # SYSTEMS = ../CPM22/cpm_wbw.sys ../ZSDOS/zsys_wbw.sys ../CPM3/cpmldr.sys ../ZPM3/zpmldr.sys -FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_ws4.img +FDIMGS = fd144_cpm22.img fd144_zsdos.img fd144_nzcom.img \ + fd144_cpm3.img fd144_zpm3.img fd144_ws4.img HD512IMGS = hd512_cpm22.img hd512_zsdos.img hd512_nzcom.img \ hd512_cpm3.img hd512_zpm3.img hd512_ws4.img # HDIMGS += hd512_bp.img @@ -42,7 +43,7 @@ hd1024_combo.img: $(HD1024PREFIX) $(HD1024IMGS) # at build time, a few variables are set (sys, fmt, type, size, d) based on the # target to build. first, we build an empty image using the a tr, dd pipeline. # we then scan the d_{d}/u* directories, copying in files to user numbers -# then process the d_{d}.txt file, copying in those files, and finally maybe put +# then process the ?d_{d}.txt file, copying in those files, and finally maybe put # an OS at the start of each image # @@ -75,13 +76,13 @@ blankhd1024: (*zpm3*) sys=../ZPM3/zpmldr.sys;; \ esac ; \ if echo $@ | grep -q ^fd144_ ; then \ - fmt=wbw_fd144 ; type=fd144_ ; proto=blank144 ; \ + fmt=wbw_fd144 ; dtype=fd ; type=fd144_ ; proto=blank144 ; \ fi ; \ if echo $@ | grep -q ^hd512_ ; then \ - fmt=wbw_hd512 ; type=hd512_ ; proto=blankhd512 ; \ + fmt=wbw_hd512 ; dtype=hd ; type=hd512_ ; proto=blankhd512 ; \ fi ; \ if echo $@ | grep -q ^hd1024_ ; then \ - fmt=wbw_hd1024 ; type=hd1024_ ; proto=blankhd1024 ; \ + fmt=wbw_hd1024 ; dtype=hd ; type=hd1024_ ; proto=blankhd1024 ; \ fi ; \ d=$$(echo $(basename $@) | sed s/$$type//) ; \ echo Generating $@ ; \ @@ -101,9 +102,10 @@ blankhd1024: done ; \ fi ; \ done ; \ - if [ -f d_$$d.txt ] ; then \ - echo " " copying files from d_$$d.txt ; \ - grep -v ^# d_$$d.txt | tr -d '\r' | while read file user ; do \ + echo $${dtype}_$$d.txt ; \ + if [ -f $${dtype}_$$d.txt ] ; then \ + echo " " copying files from $${dtype}_$$d.txt ; \ + grep -v ^# $${dtype}_$$d.txt | tr -d '\r' | while read file user ; do \ rf=$$($(CASEFN) $$file | sort -V) ; \ echo " " $$rf ; \ if [ -z "$$rf" ] ; then \ diff --git a/Source/Images/ReadMe.txt b/Source/Images/ReadMe.txt index 3954af2f..29e4a583 100644 --- a/Source/Images/ReadMe.txt +++ b/Source/Images/ReadMe.txt @@ -98,11 +98,12 @@ command prompt and navigate to the Images directory. Use the command "Build" to build both the floppy and hard disk images in one run. You can build a single disk image by running BuildDisk.cmd: - BuildDisk [] + BuildDisk [] where: specifies the disk contents (e.g., "cpm22") + specifies disk type ("fd" for floppy, or "hd" for hard disk) specifies the disk format which must be one of: - "fd144": 1.44M floppy disk - "hd512": hard disk with 512 directory entries @@ -112,7 +113,7 @@ where: For example: - | BuildDisk.cmd cpm22 wbw_hd512 ..\cpm22\cpm_wbw.sys + | BuildDisk.cmd cpm22 hd wbw_hd512 ..\cpm22\cpm_wbw.sys will create a hard disk image (512 directory entry format) with the CP/M 2.2 files from the d_cpm22 directory tree and will place the diff --git a/Source/Images/fd_bp.txt b/Source/Images/fd_bp.txt new file mode 100644 index 00000000..88605d3f --- /dev/null +++ b/Source/Images/fd_bp.txt @@ -0,0 +1,51 @@ +# +# Add ZSystem images +# +../BPBIOS/*.img 0: +../BPBIOS/*.rel 0: +../BPBIOS/*.zrl 0: +../BPBIOS/*.zex 0: +../BPBIOS/bpbuild.com 0: +# +# Add RomWBW utilities +# +#../../Binary/Apps/*.com 15: +../../Binary/Apps/assign.com 15: +../../Binary/Apps/fat.com 15: +../../Binary/Apps/fdu.com 15: +../../Binary/Apps/fdu.doc 15: +../../Binary/Apps/format.com 15: +../../Binary/Apps/mode.com 15: +../../Binary/Apps/rtc.com 15: +../../Binary/Apps/survey.com 15: +../../Binary/Apps/syscopy.com 15: +../../Binary/Apps/sysgen.com 15: +../../Binary/Apps/talk.com 15: +../../Binary/Apps/tbasic.com 15: +../../Binary/Apps/timer.com 15: +../../Binary/Apps/tune.com 15: +../../Binary/Apps/xm.com 15: +../../Binary/Apps/zmp.com 15: +../../Binary/Apps/zmp.hlp 15: +../../Binary/Apps/zmp.doc 15: +../../Binary/Apps/zmxfer.ovr 15: +../../Binary/Apps/zmterm.ovr 15: +../../Binary/Apps/zminit.ovr 15: +../../Binary/Apps/zmconfig.ovr 15: +../../Binary/Apps/zmd.com 15: +# +# Add Tune sample files +# +../../Binary/Apps/Tunes/*.pt? 3: +../../Binary/Apps/Tunes/*.mym 3: +# +# Add Common Applications +# +Common/All/*.* 15: +Common/CPM22/*.* 15: +#Common/Z/u10/*.* 10: +Common/Z/u14/*.* 14: +Common/Z/u15/*.* 15: +Common/Z3/u10/*.* 10: +Common/Z3/u14/*.* 14: +Common/Z3/u15/*.* 15: diff --git a/Source/Images/fd_cpm22.txt b/Source/Images/fd_cpm22.txt new file mode 100644 index 00000000..44a39734 --- /dev/null +++ b/Source/Images/fd_cpm22.txt @@ -0,0 +1,45 @@ +# +# Add the ReadMe document +# +d_cpm22/ReadMe.txt 0: +# +# Add RomWBW utilities +# +#../../Binary/Apps/*.com 0: +../../Binary/Apps/assign.com 0: +../../Binary/Apps/fat.com 0: +../../Binary/Apps/fdu.com 0: +../../Binary/Apps/fdu.doc 0: +../../Binary/Apps/format.com 0: +../../Binary/Apps/mode.com 0: +../../Binary/Apps/rtc.com 0: +../../Binary/Apps/survey.com 0: +../../Binary/Apps/syscopy.com 0: +../../Binary/Apps/sysgen.com 0: +../../Binary/Apps/talk.com 0: +../../Binary/Apps/tbasic.com 0: +../../Binary/Apps/timer.com 0: +../../Binary/Apps/tune.com 0: +../../Binary/Apps/xm.com 0: +../../Binary/Apps/zmp.com 0: +../../Binary/Apps/zmp.hlp 0: +../../Binary/Apps/zmp.doc 0: +../../Binary/Apps/zmxfer.ovr 0: +../../Binary/Apps/zmterm.ovr 0: +../../Binary/Apps/zminit.ovr 0: +../../Binary/Apps/zmconfig.ovr 0: +../../Binary/Apps/zmd.com 0: +# +# Add Tune sample files +# +../../Binary/Apps/Tunes/*.pt? 3: +../../Binary/Apps/Tunes/*.mym 3: +# +# Add OS image +# +../CPM22/cpm_wbw.sys 0:cpm.sys +# +# Add Common Applications +# +Common/All/*.* 0: +Common/CPM22/*.* 0: diff --git a/Source/Images/fd_cpm3.txt b/Source/Images/fd_cpm3.txt new file mode 100644 index 00000000..f324e5a9 --- /dev/null +++ b/Source/Images/fd_cpm3.txt @@ -0,0 +1,52 @@ +# +# Add files from CPM3 build +# +../CPM3/cpmldr.com 0: +../CPM3/cpmldr.sys 0: +../CPM3/ccp.com 0: +../CPM3/gencpm.com 0: +../CPM3/genres.dat 0: +../CPM3/genbnk.dat 0: +../CPM3/bios3.spr 0: +../CPM3/bnkbios3.spr 0: +../CPM3/bdos3.spr 0: +../CPM3/bnkbdos3.spr 0: +../CPM3/resbdos3.spr 0: +../CPM3/cpm3res.sys 0: +../CPM3/cpm3bnk.sys 0: +../CPM3/gencpm.dat 0: +../CPM3/cpm3.sys 0: +../CPM3/readme.1st 0: +../CPM3/cpm3fix.pat 0: +# +# Add RomWBW utilities +# +#../../Binary/Apps/*.com 0: +../../Binary/Apps/assign.com 0: +../../Binary/Apps/fat.com 0: +../../Binary/Apps/fdu.com 0: +../../Binary/Apps/fdu.doc 0: +../../Binary/Apps/format.com 0: +../../Binary/Apps/mode.com 0: +../../Binary/Apps/rtc.com 0: +../../Binary/Apps/survey.com 0: +../../Binary/Apps/syscopy.com 0: +#../../Binary/Apps/sysgen.com 0: +#../../Binary/Apps/talk.com 0: +../../Binary/Apps/tbasic.com 0: +../../Binary/Apps/timer.com 0: +../../Binary/Apps/tune.com 0: +../../Binary/Apps/xm.com 0: +../../Binary/Apps/zmp.com 0: +../../Binary/Apps/zmp.hlp 0: +../../Binary/Apps/zmp.doc 0: +../../Binary/Apps/zmxfer.ovr 0: +../../Binary/Apps/zmterm.ovr 0: +../../Binary/Apps/zminit.ovr 0: +../../Binary/Apps/zmconfig.ovr 0: +../../Binary/Apps/zmd.com 0: +# +# Add Common Applications +# +Common/All/*.* 0: +Common/CPM3/*.* 0: diff --git a/Source/Images/fd_nzcom.txt b/Source/Images/fd_nzcom.txt new file mode 100644 index 00000000..5a4dfb46 --- /dev/null +++ b/Source/Images/fd_nzcom.txt @@ -0,0 +1,31 @@ +# +# Add the ReadMe document +# +d_nzcom/ReadMe.txt 0: +# +# Add RomWBW utilities +# +#../../Binary/Apps/*.com 0: +../../Binary/Apps/assign.com 0: +../../Binary/Apps/fat.com 0: +../../Binary/Apps/fdu.com 0: +../../Binary/Apps/rtc.com 0: +../../Binary/Apps/syscopy.com 0: +../../Binary/Apps/talk.com 0: +../../Binary/Apps/timer.com 0: +../../Binary/Apps/xm.com 0: +# +# Add OS images +# +../ZSDOS/zsys_wbw.sys 0:zsys.sys +# +# Add Common Applications +# +Common/All/*.* 0: +Common/CPM22/*.* 0: +#Common/Z/u10/*.* 0: +Common/Z/u14/*.* 0: +Common/Z/u15/*.* 0: +Common/Z3/u10/*.* 0: +Common/Z3/u14/*.* 0: +Common/Z3/u15/*.* 0: diff --git a/Source/Images/fd_zpm3.txt b/Source/Images/fd_zpm3.txt new file mode 100644 index 00000000..dcec6bfa --- /dev/null +++ b/Source/Images/fd_zpm3.txt @@ -0,0 +1,49 @@ +# +# Add files from ZPM3 build +# +../ZPM3/zpmldr.com 0: +../ZPM3/zpmldr.sys 0: +../CPM3/cpmldr.com 0: +../CPM3/cpmldr.sys 0: +../ZPM3/autotog.com 15: +../ZPM3/clrhist.com 15: +../ZPM3/setz3.com 15: +../ZPM3/cpm3.sys 0: +../ZPM3/zccp.com 0: +../ZPM3/zinstal.zpm 0: +../ZPM3/startzpm.com 0: +../ZPM3/makedos.com 0: +../ZPM3/gencpm.dat 0: +../ZPM3/bnkbios3.spr 0: +../ZPM3/bnkbdos3.spr 0: +../ZPM3/resbdos3.spr 0: +# +# Add RomWBW utilities +# +#../../Binary/Apps/*.com 15: +../../Binary/Apps/assign.com 15: +../../Binary/Apps/fat.com 15: +../../Binary/Apps/fdu.com 15: +../../Binary/Apps/fdu.doc 15: +../../Binary/Apps/format.com 15: +../../Binary/Apps/mode.com 15: +../../Binary/Apps/rtc.com 15: +../../Binary/Apps/survey.com 15: +../../Binary/Apps/syscopy.com 15: +../../Binary/Apps/sysgen.com 15: +../../Binary/Apps/talk.com 15: +../../Binary/Apps/tbasic.com 15: +../../Binary/Apps/timer.com 15: +../../Binary/Apps/tune.com 15: +../../Binary/Apps/xm.com 15: +# +# Add Common Applications +# +Common/All/*.* 15: +Common/CPM3/*.* 15: +#Common/Z/u10/*.* 10: +Common/Z/u14/*.* 14: +Common/Z/u15/*.* 15: +Common/Z3/u10/*.* 10: +Common/Z3/u14/*.* 14: +Common/Z3/u15/*.* 15: diff --git a/Source/Images/fd_zsdos.txt b/Source/Images/fd_zsdos.txt new file mode 100644 index 00000000..09af8c9f --- /dev/null +++ b/Source/Images/fd_zsdos.txt @@ -0,0 +1,61 @@ +# +# Add the ReadMe document +# +d_zsdos/ReadMe.txt 0: +# +# Include selected CP/M 2.2 files +# +d_cpm22/u0/ASM.COM 0: +d_cpm22/u0/LIB.COM 0: +d_cpm22/u0/LINK.COM 0: +d_cpm22/u0/LOAD.COM 0: +d_cpm22/u0/MAC.COM 0: +#d_cpm22/u0/PIP.COM 0: ??? +d_cpm22/u0/RMAC.COM 0: +d_cpm22/u0/STAT.COM 0: +d_cpm22/u0/SUBMIT.COM 0: +d_cpm22/u0/XSUB.COM 0: +# +# Add RomWBW utilities +# +#../../Binary/Apps/*.com 0: +../../Binary/Apps/assign.com 0: +../../Binary/Apps/fat.com 0: +../../Binary/Apps/fdu.com 0: +../../Binary/Apps/fdu.doc 0: +../../Binary/Apps/format.com 0: +../../Binary/Apps/mode.com 0: +../../Binary/Apps/rtc.com 0: +../../Binary/Apps/survey.com 0: +../../Binary/Apps/syscopy.com 0: +../../Binary/Apps/sysgen.com 0: +../../Binary/Apps/talk.com 0: +../../Binary/Apps/tbasic.com 0: +../../Binary/Apps/timer.com 0: +../../Binary/Apps/tune.com 0: +../../Binary/Apps/xm.com 0: +../../Binary/Apps/zmp.com 0: +../../Binary/Apps/zmp.hlp 0: +../../Binary/Apps/zmp.doc 0: +../../Binary/Apps/zmxfer.ovr 0: +../../Binary/Apps/zmterm.ovr 0: +../../Binary/Apps/zminit.ovr 0: +../../Binary/Apps/zmconfig.ovr 0: +../../Binary/Apps/zmd.com 0: +# +# Add Tune sample files +# +../../Binary/Apps/Tunes/*.pt? 3: +../../Binary/Apps/Tunes/*.mym 3: +# +# Add OS image +# +../ZSDOS/zsys_wbw.sys 0:zsys.sys +# +# Add Common Applications +# +Common/All/*.* 0: +Common/CPM22/*.* 0: +#Common/Z/u10/*.* 0: +Common/Z/u14/*.* 0: +Common/Z/u15/*.* 0: diff --git a/Source/Images/d_bp.txt b/Source/Images/hd_bp.txt similarity index 81% rename from Source/Images/d_bp.txt rename to Source/Images/hd_bp.txt index c613ebc7..ea4ba8ef 100644 --- a/Source/Images/d_bp.txt +++ b/Source/Images/hd_bp.txt @@ -33,15 +33,7 @@ ../../Binary/Apps/zminit.ovr 15: ../../Binary/Apps/zmconfig.ovr 15: ../../Binary/Apps/zmd.com 15: - # -#../../Binary/Apps/i2clcd.com 2: -#../../Binary/Apps/i2cscan.com 2: -#../../Binary/Apps/rtcds7.com 2: -#../../Binary/Apps/rtchb.com 2: -#../../Binary/Apps/ppidetst.com 2: -#../../Binary/Apps/ramtest.com 2: -#../../Binary/Apps/tstdskng.com 2: ../../Binary/Apps/Test/*.com 2: Test/*.* 2: # diff --git a/Source/Images/d_cpm22.txt b/Source/Images/hd_cpm22.txt similarity index 79% rename from Source/Images/d_cpm22.txt rename to Source/Images/hd_cpm22.txt index 0be74e3d..11372530 100644 --- a/Source/Images/d_cpm22.txt +++ b/Source/Images/hd_cpm22.txt @@ -30,13 +30,6 @@ d_cpm22/ReadMe.txt 0: ../../Binary/Apps/zmconfig.ovr 0: ../../Binary/Apps/zmd.com 0: # -#../../Binary/Apps/i2clcd.com 2: -#../../Binary/Apps/i2cscan.com 2: -#../../Binary/Apps/rtcds7.com 2: -#../../Binary/Apps/rtchb.com 2: -#../../Binary/Apps/ppidetst.com 2: -#../../Binary/Apps/ramtest.com 2: -#../../Binary/Apps/tstdskng.com 2: ../../Binary/Apps/Test/*.com 2: Test/*.* 2: # diff --git a/Source/Images/d_cpm3.txt b/Source/Images/hd_cpm3.txt similarity index 82% rename from Source/Images/d_cpm3.txt rename to Source/Images/hd_cpm3.txt index da74a74b..3c8c78c0 100644 --- a/Source/Images/d_cpm3.txt +++ b/Source/Images/hd_cpm3.txt @@ -46,13 +46,6 @@ ../../Binary/Apps/zmconfig.ovr 0: ../../Binary/Apps/zmd.com 0: # -#../../Binary/Apps/i2clcd.com 2: -#../../Binary/Apps/i2cscan.com 2: -#../../Binary/Apps/rtcds7.com 2: -#../../Binary/Apps/rtchb.com 2: -#../../Binary/Apps/ppidetst.com 2: -#../../Binary/Apps/ramtest.com 2: -#../../Binary/Apps/tstdskng.com 2: ../../Binary/Apps/Test/*.com 2: Test/*.* 2: # diff --git a/Source/Images/d_nzcom.txt b/Source/Images/hd_nzcom.txt similarity index 83% rename from Source/Images/d_nzcom.txt rename to Source/Images/hd_nzcom.txt index e0fa9c63..0c904109 100644 --- a/Source/Images/d_nzcom.txt +++ b/Source/Images/hd_nzcom.txt @@ -47,13 +47,6 @@ d_zsdos/u0/*.* 0: ../../Binary/Apps/zmconfig.ovr 0: ../../Binary/Apps/zmd.com 0: # -#../../Binary/Apps/i2clcd.com 2: -#../../Binary/Apps/i2cscan.com 2: -#../../Binary/Apps/rtcds7.com 2: -#../../Binary/Apps/rtchb.com 2: -#../../Binary/Apps/ppidetst.com 2: -#../../Binary/Apps/ramtest.com 2: -#../../Binary/Apps/tstdskng.com 2: ../../Binary/Apps/Test/*.com 2: Test/*.* 2: # diff --git a/Source/Images/d_zpm3.txt b/Source/Images/hd_zpm3.txt similarity index 83% rename from Source/Images/d_zpm3.txt rename to Source/Images/hd_zpm3.txt index 878159bf..61bcd4de 100644 --- a/Source/Images/d_zpm3.txt +++ b/Source/Images/hd_zpm3.txt @@ -45,13 +45,6 @@ ../../Binary/Apps/zmconfig.ovr 15: ../../Binary/Apps/zmd.com 15: # -#../../Binary/Apps/i2clcd.com 2: -#../../Binary/Apps/i2cscan.com 2: -#../../Binary/Apps/rtcds7.com 2: -#../../Binary/Apps/rtchb.com 2: -#../../Binary/Apps/ppidetst.com 2: -#../../Binary/Apps/ramtest.com 2: -#../../Binary/Apps/tstdskng.com 2: ../../Binary/Apps/Test/*.com 2: Test/*.* 2: # diff --git a/Source/Images/d_zsdos.txt b/Source/Images/hd_zsdos.txt similarity index 82% rename from Source/Images/d_zsdos.txt rename to Source/Images/hd_zsdos.txt index 72106517..806d879a 100644 --- a/Source/Images/d_zsdos.txt +++ b/Source/Images/hd_zsdos.txt @@ -43,13 +43,6 @@ d_cpm22/u0/XSUB.COM 0: ../../Binary/Apps/zmconfig.ovr 0: ../../Binary/Apps/zmd.com 0: # -#../../Binary/Apps/i2clcd.com 2: -#../../Binary/Apps/i2cscan.com 2: -#../../Binary/Apps/rtcds7.com 2: -#../../Binary/Apps/rtchb.com 2: -#../../Binary/Apps/ppidetst.com 2: -#../../Binary/Apps/ramtest.com 2: -#../../Binary/Apps/tstdskng.com 2: ../../Binary/Apps/Test/*.com 2: Test/*.* 2: # diff --git a/Source/ver.inc b/Source/ver.inc index 69e8e59f..ceed10a9 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.144" +#DEFINE BIOSVER "3.1.1-pre.145" diff --git a/Source/ver.lib b/Source/ver.lib index 0e84f405..b732a155 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.144" + db "3.1.1-pre.145" endm