diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 0ed87fd8..4c990851 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -30,6 +30,12 @@ Version 3.1.1 - J?C: Added FIND application from Jay Cotton - PMS: Preliminary support for I2C-based DS1307 clock - WBW: FD driver auto hardware detect (thanks Alan Cox) +- D?N: Added support for TMS V9958 VDU +- D?N: Added support for MSX keyboard +- D?N: Added support for RP5C01 RTC +- L?N: Slightly enhanced ZCPRD&J w/ a couple bug fixes +- L?N: UNZIPZ4 which handles most modern ZIP file compression algorithms +- AJL: Preliminary support for MBC systems Version 3.1 ----------- diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index c0380d6b..669bdd3e 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -36,6 +36,7 @@ SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_RCV9958 ; TMS: DRIVER MODE: TMSMODE_[RC/RCV9958] ; FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] @@ -45,3 +46,7 @@ IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +; +RP5RTCENABLE .SET FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) diff --git a/Source/HBIOS/Config/SBC_mbc.asm b/Source/HBIOS/Config/SBC_mbc.asm new file mode 100644 index 00000000..1baa71aa --- /dev/null +++ b/Source/HBIOS/Config/SBC_mbc.asm @@ -0,0 +1,33 @@ +; +;================================================================================================== +; MBC CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "SBC" +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_sbc.asm" +; +INTMODE .SET 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +MEMMGR .SET MM_MBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] +; +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) diff --git a/Source/HBIOS/Makefile b/Source/HBIOS/Makefile index e9e362a4..d98c460f 100644 --- a/Source/HBIOS/Makefile +++ b/Source/HBIOS/Makefile @@ -22,8 +22,9 @@ else OBJECTS += RCZ80_std.rom RCZ80_std.com RCZ80_std.upd OBJECTS += RCZ80_skz.rom RCZ80_skz.com RCZ80_skz.upd OBJECTS += RCZ80_zrc.rom RCZ80_zrc.com RCZ80_zrc.upd - OBJECTS += SBC_simh.rom SBC_simh.com SBC_simh.upd OBJECTS += SBC_std.rom SBC_std.com SBC_std.upd + OBJECTS += SBC_simh.rom SBC_simh.com SBC_simh.upd + OBJECTS += SBC_mbc.rom SBC_mbc.com SBC_mbc.upd OBJECTS += SCZ180_126.rom SCZ180_126.com SCZ180_126.upd OBJECTS += SCZ180_130.rom SCZ180_130.com SCZ180_130.upd OBJECTS += SCZ180_131.rom SCZ180_131.com SCZ180_131.upd diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 43255017..35aad31c 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) @@ -72,6 +72,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) ; DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -82,6 +83,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -176,11 +179,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index b247529f..853e2f3f 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 10000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -73,6 +73,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -83,6 +85,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -210,11 +214,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 3b0b428b..15f4c167 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -21,13 +21,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_NONE ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) @@ -104,6 +104,8 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU FALSE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -114,6 +116,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -192,7 +196,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] @@ -278,11 +282,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 892f05bc..11dee64f 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; @@ -79,6 +79,8 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -89,6 +91,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -126,7 +130,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] @@ -210,11 +214,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 3948fc0e..85c47a57 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_N8 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMBIAS .EQU 0 ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE RAMLOC .EQU 0 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE ; @@ -82,6 +82,8 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -92,6 +94,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -129,7 +133,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] @@ -210,11 +214,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) FIFO_BASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - -AY38910ENABLE .EQU TRUE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +; +AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index a2f45aad..3bfccfcc 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) @@ -75,6 +75,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -85,6 +87,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -146,7 +150,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; @@ -223,11 +227,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index bd0e0281..9313f04b 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 24000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) @@ -80,6 +80,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -90,6 +92,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -162,7 +166,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; @@ -239,11 +243,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER -SN7CLK .EQU 7372800 / 4 ; DEFAULT TO CPUOSC / 4 - +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER -AY_CLK .EQU 7372800 / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 5c2a0c7a..d57b3e13 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 7372800 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -74,6 +74,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -84,6 +86,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -151,7 +155,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; @@ -228,11 +232,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 967b196d..6736e21f 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; @@ -74,6 +74,8 @@ PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -84,6 +86,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -128,7 +132,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] @@ -211,11 +215,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 ; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index b6fe1c51..1ccc3846 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_115200_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] RAMLOC .EQU 19 ; START OF RAM AS POWER OF 2 (2^N) IN PHYSICAL ADDRESS SPACE RAMBIAS .EQU (1 << (RAMLOC - 10)) ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE ; @@ -70,6 +70,8 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -80,6 +82,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -141,7 +145,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8] +TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) ; @@ -218,11 +222,12 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - +; AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] +; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_una.asm b/Source/HBIOS/cfg_una.asm index b815f41b..8f589937 100644 --- a/Source/HBIOS/cfg_una.asm +++ b/Source/HBIOS/cfg_una.asm @@ -19,7 +19,7 @@ BIOS .EQU BIOS_UNA ; HARDWARE BIOS: BIOS_[WBW|UNA] BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 6eca0583..127a24b0 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 0 ; INTERRUPT MODE: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_SBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) ; @@ -62,6 +62,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -72,6 +73,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -153,11 +156,6 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER -SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER -AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 5be06627..7bd79fc7 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -24,13 +24,13 @@ TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE ; CPUOSC .EQU 20000000 ; CPU OSC FREQ IN MHZ -INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2 +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) -MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) @@ -73,6 +73,7 @@ BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) ; DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] @@ -83,6 +84,8 @@ BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS ; INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) ; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) ; @@ -164,11 +167,6 @@ PPI_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP ; UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) ; -AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN76489ENABLE .EQU FALSE ; SN76489 SOUND DRIVER -SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 - AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER -AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG/N8/RCZ80/RCZ180] SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index 45ed35a9..f2470378 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -743,7 +743,14 @@ FD_INIT0: ; DOES NOT ATTEMPT TO DETERMINE THE ACTUAL VARIANT. ; FD_DETECT: + ; BLINDLY RESET FDC (WHICH MAY OR MAY NOT EXIST) + LD A,DOR_INIT ; MAKE SURE INITIAL DOR VALUE IS SETUP + LD (FST_DOR),A ; AND PUT IN SHADOW REGISTER + CALL FC_RESETFDC ; RESET FDC + IN A,(FDC_MSR) ; READ MSR + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* CP $80 JR Z,FD_DETECT1 ; $80 IS OK CP $D0 @@ -751,7 +758,10 @@ FD_DETECT: RET ; NOPE, ABORT WITH ZF=NZ ; FD_DETECT1: + CALL DLY32 ; WAIT A BIT FOR FDC IN A,(FDC_MSR) ; READ MSR AGAIN + ;CALL PC_SPACE ; *DEBUG* + ;CALL PRTHEXBYTE ; *DEBUG* CP $80 RET ; $80 OK, ELSE NOT PRESENT ; @@ -1309,7 +1319,7 @@ FC_SETUPSPECIFY: ; ; SET FST_DOR ; -FC_SETDOR +FC_SETDOR: LD (FST_DOR),A OUT (FDC_DOR),A #IF (FDTRACE >= 3) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index f214d920..81761114 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -116,8 +116,6 @@ MODCNT .SET MODCNT + 1 #IF (INTMODE == 3) ; Z280 MODE 3 INTERRUPT HANDLING (INTA, C/T 0, & UART RCVR ENABLED) #DEFINE HB_DI DI -;#DEFINE HB_DI .DB $ED,$77,$7F -;#DEFINE HB_EI EI #DEFINE HB_EI .DB $ED,$7F,$0B #ELSE ; Z280 MODE 1/2 INTERRUPT HANDLING @@ -327,13 +325,13 @@ HBX_INVOKE: ; LD A,(HB_CURBNK) ; GET CURRENT BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK -; +; LD A,BID_BIOS ; HBIOS BANK LD (HB_CURBNK),A ; SET AS CURRENT BANK ; .DB $ED,$71 ; SC .DW HB_DISPATCH ; SC PARAMETER -; +; PUSH AF LD A,(HB_INVBNK) LD (HB_CURBNK),A @@ -486,6 +484,39 @@ HBX_ROM: RET ; DONE #ENDIF ; +#IF (MEMMGR == MM_MBC) +; + #IF (INTMODE == 1) + LD (HBX_MMA),A ; SAVE ACCUM + LD A,I ; GET INT CTL REG + HB_DI ; DISABLE INTS + PUSH AF ; SAVE INT CTL REG + LD A,(HBX_MMA) ; RESTORE ACCUM + #ENDIF +; + OR A ; SET FLAGS + JP P,HBX_ROM ; BIT 7 INDICATES RAM + OUT (MPCL_ROM),A ; ENSURE ROM PAGE OUT OF MEMORY BEFORE SWITCH + OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR + JR HBX_RAMX +HBX_ROM: + OUT (MPCL_RAM),A ; ENSURE RAM PAGE OUT OF MEMORY BEFORE SWITCH + OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR + +HBX_RAMX: +; + #IF (INTMODE == 1) + POP AF ; RESTORE INT CTL REG + JP PO,$+4 ; WERE INTS DISABLED AT ENTRY? + EI ; *** DO NOT USE HB_EI HERE *** + LD A,(HBX_MMA) ; RESTORE INCOMING ACCUM + #ENDIF +; + RET +; +HBX_MMA .DB 0 ; TEMPORARY STORAGE FOR REG A +#ENDIF +; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Copy Data - Possibly between banks. This resembles CP/M 3, but ; usage of the HL and DE registers is reversed. @@ -788,7 +819,7 @@ HBX_INT: ; COMMON INTERRUPT ROUTING CODE ; SYSTEM OR USER MODE WAS ACTIVE AT THE TIME OF THE INTERRUPT. ; EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET - + ; SAVE STATE (HL SAVED PREVIOUSLY ON ORIGINAL STACK FRAME) PUSH AF ; SAVE AF PUSH BC ; SAVE BC @@ -814,7 +845,7 @@ HBX_INT: ; COMMON INTERRUPT ROUTING CODE CALL HBX_RETI ; RETI FOR Z80 PERIPHERALS RETIL ; -HBX_RETI: +HBX_RETI: RETI ; #ELSE @@ -859,7 +890,7 @@ HBX_INT_SP .EQU $ - 2 RETI ; AND RETURN ; #ENDIF - + #ENDIF ; ; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY @@ -1095,13 +1126,13 @@ Z280_BOOTPDRTBL: ; Z280_INITZ: ; - #ENDIF + #ENDIF ; ; RESTORE I/O PAGE TO $00 LD L,$00 ; NORMAL I/O REG IS $00 LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER LDCTL (C),HL -; +; #ENDIF ; #IF (CPUFAM == CPU_Z180) @@ -1152,7 +1183,7 @@ Z280_INITZ: ; ; SET DEFAULT CSIO SPEED (INTERNAL CLOCK, SLOW AS POSSIBLE) LD A,Z180_CNTR_DEF ; DIV 1280, 14KHZ @ 18MHZ CLK - OUT0 (Z180_CNTR),A + OUT0 (Z180_CNTR),A #ENDIF ; #ENDIF @@ -1588,8 +1619,7 @@ HB_CPU2: #ENDIF ; #IF (KIOENABLE) - LD A,%11111001 ; RESET ALL DEVICES, SET DAISYCHAIN - OUT (KIOBASE+$0E),A ; DO IT + CALL KIO_PREINIT #ENDIF ; #IF (CTCENABLE) @@ -1738,7 +1768,7 @@ NOT_REC_M0: ; XOR A ; FAILSAFE VALUE FOR BOOT CONSOLE DEVICE LD (CB_CONDEV),A ; SAVE IT -; +; LD A,(CIO_CNT) ; GET COUNT OF CHAR DEVICES CP BOOTCON + 1 ; COUNT - (DEVICE + 1) JR C,HB_CONRDY ; IF TOO HIGH, JUST USE FAILSAFE @@ -1881,7 +1911,7 @@ HB_Z280BUS1: ; DISPLAY CPU CONFIG ; CALL NEWLINE - + #IF (CPUFAM == CPU_Z280) LD A,Z280_MEMLOWAIT CALL PRTDECB @@ -2239,6 +2269,9 @@ HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2) ;================================================================================================== ; HB_INITTBL: +#IF (KIOENABLE) + .DW KIO_INIT +#ENDIF #IF (CTCENABLE) .DW CTC_INIT #ENDIF @@ -2285,6 +2318,9 @@ HB_INITTBL: .DW PCF8584_INIT .DW DS7RTC_INIT #ENDIF +#IF (RP5RTCENABLE) + .DW RP5RTC_INIT +#ENDIF #IF (VDUENABLE) .DW VDU_INIT #ENDIF @@ -2963,7 +2999,7 @@ SYS_RESINT: ; SYS_RESWARM: CALL SYS_RESINT -; +; #IF (MEMMGR == MM_Z280) JP INITSYS4 #ELSE @@ -3752,6 +3788,10 @@ HB_TICK1: ; PULSE WATCHDOG OUT (WDOGIO),A ; VALUE IS IRRELEVANT #ENDIF +; +#IF MKYENABLE + CALL MKY_INT +#ENDIF ; OR $FF ; NZ SET TO INDICATE INT HANDLED RET @@ -3909,13 +3949,13 @@ Z280_PRIVINST: LD (HB_MSRSAV),HL ; SAVE IT POP HL ; RECOVER HL, POP STACK EX (SP),HL ; GET ADR, SAVE HL -; +; PUSH AF PUSH BC PUSH DE -; +; .DB $ED,$96 ; LDUP A,(HL) -; +; ; HANDLE DI CP $F3 ; DI? JR NZ,Z280_PRIVINST2 @@ -4251,7 +4291,7 @@ Z280_BNKSEL: PUSH HL ; SAVE IT LD L,$FF ; NEW I/O PAGE LDCTL (C),HL -; +; ; CONVERT BANK ID TO TOP 12 BITS OF PHYSICAL ADDRESS ; WITH $0A IN THE LOW ORDER NIBBLE: ; BANK ID: R000 BBBB @@ -4263,7 +4303,7 @@ Z280_BNKSEL: JR Z,Z280_BNKSEL2 ; IF NOT, ALL DONE RES 6,H ; OTHERWISE, MOVE RAM BIT SET RAMLOC-16,H ; HL=0000 RBBB B000 0000 -; +; Z280_BNKSEL2: ; ; SET LOW NIBBLE @@ -4332,19 +4372,19 @@ Z280_BNKCPY: ; PUSH BC ; SAVE COUNT PUSH HL ; SAVE SOURCE ADDRESS -; +; ; SELECT I/O PAGE $FF LD C,Z280_IOPR ; I/O PAGE REGISTER LDCTL HL,(C) ; GET CURRENT I/O PAGE LD (IOPRVAL),HL ; SAVE IT LD L,$FF ; I/O PAGE $FF LDCTL (C),HL -; +; LD C,Z280_DMA0_DSTL ; START WITH DEST REG LO ; LD A,(HB_DSTBNK) ; DEST BANK TO ACCUM CALL Z2DMAADR ; SETUP DEST ADR REGS -; +; POP DE ; SRC ADR TO DE LD A,(HB_SRCBNK) ; DEST BANK TO ACCUM CALL Z2DMAADR ; SETUP SOURCE ADR REGS @@ -4399,7 +4439,7 @@ Z2DMAADR1: LD A,$0F ; A=0000 1111 OR L ; A=BAAA 1111 LD L,A ; L=BAAA 1111 -; +; ; MOVE THE RAM/ROM BIT. ; RC2014 DMA HI=0000 RBBB BAAA 1111 LO=1111 AAAA AAAA AAAA ; ZZ80MB DMA HI=R000 0BBB BAAA 1111 LO=1111 AAAA AAAA AAAA @@ -4425,7 +4465,7 @@ Z2DMAADR2: POP HL ; RECOVER THE HI VAL OUTW (C),HL INC C ; BUMP TO NEXT REG -; +; RET #ENDIF ; @@ -4499,6 +4539,14 @@ SIZ_INTRTC .EQU $ - ORG_INTRTC .ECHO " bytes.\n" #ENDIF ; +#IF (RP5RTCENABLE) +ORG_RP5RTC .EQU $ + #INCLUDE "rp5rtc.asm" +SIZ_RP5RTC .EQU $ - ORG_RP5RTC + .ECHO "RP5RTC occupies " + .ECHO SIZ_RP5RTC + .ECHO " bytes.\n" +#ENDIF #IF (ASCIENABLE) ORG_ASCI .EQU $ #INCLUDE "asci.asm" @@ -4657,6 +4705,15 @@ SIZ_PPK .EQU $ - ORG_PPK .ECHO " bytes.\n" #ENDIF ; +#IF (MKYENABLE) +ORG_MKY .EQU $ + #INCLUDE "mky.asm" +SIZ_MKY .EQU $ - ORG_MKY + .ECHO "MKY occupies " + .ECHO SIZ_MKY + .ECHO " bytes.\n" +#ENDIF +; #IF (PRPENABLE) ORG_PRP .EQU $ #INCLUDE "prp.asm" @@ -4774,6 +4831,14 @@ SIZ_UF .EQU $ - ORG_UF .ECHO SIZ_UF .ECHO " bytes.\n" #ENDIF +#IF (KIOENABLE) +ORG_KIO .EQU $ + #INCLUDE "kio.asm" +SIZ_KIO .EQU $ - ORG_KIO + .ECHO "KIO occupies " + .ECHO SIZ_KIO + .ECHO " bytes.\n" +#ENDIF #IF (CTCENABLE) ORG_CTC .EQU $ #INCLUDE "ctc.asm" @@ -4944,7 +5009,7 @@ SYSCHK: CP DL_ERROR ; >= ERROR LEVEL JR C,SYSCHK1 ; IF NOT, GO HOME POP AF ; RESTORE INCOMING AF VALUE -; +; ; DISPLAY SYSCHK MESSAGE PUSH DE ; PRESERVE DE VALUE LD DE,STR_SYSCHK ; POINT TO PREFIX STRING @@ -5151,7 +5216,7 @@ PS_PRTDC: CP 5 ; RAM DISK? JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB CP 7 ; FLASH DISK? - JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB + JR Z,PS_PRTDC1 ; PRINT CAPACITY IN KB ; ; PRINT HARD DISK STORAGE SIZE IN MB LD B,BF_DIOCAP ; HBIOS FUNC: GET CAPACTIY @@ -5416,8 +5481,8 @@ PS_SOUND: PRTS(" $") ; PAD TO NEXT COLUMN ; DEVICE COLUMN - - PUSH BC ; + + PUSH BC ; LD E,C XOR A LD DE,PS_SDSND ; POINT TO DEVICE TYPE NAME TABLE diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index b52536d8..897cc8cc 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -131,7 +131,7 @@ ERR_RANGE .EQU -6 ; PARAMETER OUT OF RANGE ERR_NOMEDIA .EQU -7 ; MEDIA NOT PRESENT ERR_NOHW .EQU -8 ; HARDWARE NOT PRESENT ERR_IO .EQU -9 ; I/O ERROR -ERR_READONLY .EQU -10 ; WRITE REQUEST TO READ-ONLY MEDIA +ERR_READONLY .EQU -10 ; WRITE REQUEST TO READ-ONLY MEDIA ERR_TIMEOUT .EQU -11 ; DEVICE TIMEOUT ERR_BADCFG .EQU -12 ; INVALID CONFIGURATION ERR_INTERNAL .EQU -13 ; INTERNAL ERROR @@ -191,6 +191,7 @@ RTCDEV_BQ .EQU $10 ; BQ4845P RTCDEV_SIMH .EQU $20 ; SIMH RTCDEV_INT .EQU $30 ; PERIODIC INT TIMER RTCDEV_DS7 .EQU $40 ; DS1302 (I2C) +RTCDEV_RP5 .EQU $50 ; RP5C01 ; ; VIDEO DEVICE IDS ; @@ -199,6 +200,7 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 +;VDADEV_V9958 .EQU $50 ; V9958 VDU ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/kio.asm b/Source/HBIOS/kio.asm new file mode 100644 index 00000000..8c7867c7 --- /dev/null +++ b/Source/HBIOS/kio.asm @@ -0,0 +1,92 @@ +;___KIO________________________________________________________________________________________________________________ +; +; Z80 KIO +; +; DISPLAY CONFIGURATION DETAILS +;______________________________________________________________________________________________________________________ +; +; +; +KIO_PIOADAT .EQU KIOBASE + $00 +KIO_PIOACMD .EQU KIOBASE + $01 +KIO_PIOBDAT .EQU KIOBASE + $02 +KIO_PIOBCMD .EQU KIOBASE + $03 +KIO_CTC0 .EQU KIOBASE + $04 +KIO_CTC1 .EQU KIOBASE + $05 +KIO_CTC2 .EQU KIOBASE + $06 +KIO_CTC3 .EQU KIOBASE + $07 +KIO_SIOADAT .EQU KIOBASE + $08 +KIO_SIOACMD .EQU KIOBASE + $09 +KIO_SIOBDAT .EQU KIOBASE + $0A +KIO_SIOBCMD .EQU KIOBASE + $0B +KIO_PIACDAT .EQU KIOBASE + $0C +KIO_PIACCMD .EQU KIOBASE + $0D +KIO_KIOCMD .EQU KIOBASE + $0E +KIO_KIOCMDB .EQU KIOBASE + $0F +; +; +; +KIO_PREINIT: + CALL KIO_DETECT + RET NZ +; + ; RECORD PRESENCE + LD A,$FF + LD (KIO_EXISTS),A + ; INITIALIZE KIO + LD A,%11111001 ; RESET ALL DEVICES, SET DAISYCHAIN + OUT (KIO_KIOCMD),A ; DO IT +; + XOR A + RET +; +; +; +KIO_INIT: + ; ANNOUNCE PORT + CALL NEWLINE ; FORMATTING + PRTS("KIO:$") ; FORMATTING +; + PRTS(" IO=0x$") ; FORMATTING + LD A,KIOBASE ; GET BASE PORT + CALL PRTHEXBYTE ; PRINT BASE PORT +; + LD A,(KIO_EXISTS) + OR A + JR Z,KIO_INIT2 +; + PRTS(" ENABLED$") ; DISPLAY ENABLED + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +KIO_INIT2: + PRTS(" NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT + OR $FF ; SIGNAL FAILURE + RET ; BAIL OUT +; +; +; +KIO_DETECT: + LD C,KIO_SIOBCMD ; USE SIOB COMMAND PORT + LD B,2 ; SIO REG 2 +; + OUT (C),B + XOR A ; ZERO + OUT (C),A ; WRITE IT + OUT (C),B + IN A,(C) + AND $F0 ; TOP NIBBLE ONLY + RET NZ ; FAIL IF NOT ZERO +; + OUT (C),B + LD A,$FF ; $FF + OUT (C),A ; WRITE IT + OUT (C),B + IN A,(C) + AND $F0 ; TOP NIBBLE ONLY + CP $F0 ; COMPARE + RET ; DONE, Z IF FOUND, NZ IF MISCOMPARE +; +; +; +KIO_EXISTS .DB 0 diff --git a/Source/HBIOS/mky.asm b/Source/HBIOS/mky.asm new file mode 100644 index 00000000..0a86dd16 --- /dev/null +++ b/Source/HBIOS/mky.asm @@ -0,0 +1,1155 @@ +;====================================================================== +; MSX 8255 PPI KEYBOARD COMPATIBLE DRIVER +; +; CREATED BY: DEAN NETHERTON +; KBD.ASM DRIVER USED AS TEMPLATE +; +;====================================================================== +; USAGE: +; THIS DRIVER CAN BE ACTIVED WITHIN THE TMS VIDEO DRIVER +; ADD THE OPTION TO YOUR BUILD CONFIGURATION TO ACTIVATE THE KEYBOARD +; DRIVER: +; MKYENABLE .SET TRUE +; +;====================================================================== +; +; TODO: +; IMPLEMENT MULTIBYTE SCAN CODES (ARROW KEYS, ETC) +; BACKSPACE DOES NOT AUTO-REPEAT +; AUTO DETECT PPI +; +#IF (SYSTIM == TM_NONE) + .ECHO "*** ERROR: MKY REQUIRES SYSTEM TIMER -- NONE CONFIGURED!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR +#ENDIF +; +;====================================================================== +; DRIVER - CONSTANTS +;====================================================================== +; +MKY_REGA .EQU $A8 +MKY_REGB .EQU $A9 +MKY_REGC .EQU $AA +MKY_REGCMD .EQU $AB + +PPICMD_CLOW_IN .EQU 1 +PPICMD_CLOW_OUT .EQU 0 +PPICMD_B_IN .EQU 2 +PPICMD_B_OUT .EQU 0 +PPICMD_GB_MODE_0 .EQU 0 +PPICMD_GB_MODE_1 .EQU 4 +PPICMD_CHIGH_IN .EQU 8 +PPICMD_CHIGH_OUT .EQU 0 +PPICMD_A_IN .EQU 16 +PPICMD_A_OUT .EQU 0 +PPICMD_GA_MODE_0 .EQU 0 +PPICMD_GA_MODE_1 .EQU 32 +PPICMD_GA_MODE_2 .EQU 64 +PPICMD_COMMAND .EQU 128 + +; COUNT FOR PERIOD TO START REPEATING CHARACTERS +KEY_REPEAT_INIT: .EQU 30 + +; COUNT FOR PERIOD BETWEEN AUTO REPEATING CHARACTERS +KEY_REPEAT_PERIOD: .EQU 3 + +; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) +SCAN_INT_PERIOD: .EQU 3 + +; NUMBER OF ROWS SUPPORTED BY THE KEYBOARD +MATRIX_ROW_COUNT: .EQU 9 + +; ASSEMBLER SEEMS TO HAVE WEIRD PROBLEM WITH "'" +SINGLE_QUOTE .EQU 39 + +; SPECIAL MADE UP VALUE TO MAP FOR CAPS LOCK +CAPS_CODE: .EQU $D8 + +; TIMING CONSTANTS +; +MKY_WAITTO .EQU 0 ; 0 IS MAX WAIT (256) +; +; STATUS BITS (FOR MKY_STATUS) +; +MKY_EXT .EQU 01H ; BIT 0, EXTENDED SCANCODE ACTIVE +MKY_BREAK .EQU 02H ; BIT 1, THIS IS A KEY UP (BREAK) EVENT +MKY_KEYRDY .EQU 80H ; BIT 7, INDICATES A DECODED KEYCODE IS READY +; +; STATE BITS (FOR MKY_STATE, MKY_LSTATE, MKY_RSTATE) +; +MKY_SHIFT .EQU 01H ; BIT 0, SHIFT ACTIVE (PRESSED) +MKY_CTRL .EQU 02H ; BIT 1, CONTROL ACTIVE (PRESSED) +MKY_ALT .EQU 04H ; BIT 2, ALT ACTIVE (PRESSED) +MKY_WIN .EQU 08H ; BIT 3, WIN ACTIVE (PRESSED) +MKY_SCRLCK .EQU 10H ; BIT 4, CAPS LOCK ACTIVE (TOGGLED ON) +MKY_NUMLCK .EQU 20H ; BIT 5, NUM LOCK ACTIVE (TOGGLED ON) +MKY_CAPSLCK .EQU 40H ; BIT 6, SCROLL LOCK ACTIVE (TOGGLED ON) +MKY_NUMPAD .EQU 80H ; BIT 7, NUM PAD KEY (KEY PRESSED IS ON NUM PAD) +; +MKY_DEFRPT .EQU $40 ; DEFAULT REPEAT RATE (.5 SEC DELAY, 30CPS) +MKY_DEFSTATE .EQU MKY_NUMLCK ; DEFAULT STATE (NUM LOCK ON) + +; --------------.----------------------- +; SCAN CODE TABL.ES + +S_A .EQU $1C +S_B .EQU $32 +S_C .EQU $21 +S_D .EQU $23 +S_E .EQU $24 +S_F .EQU $2B +S_G .EQU $34 +S_H .EQU $33 +S_I .EQU $43 +S_J .EQU $3B +S_K .EQU $42 +S_L .EQU $4B +S_M .EQU $3A +S_N .EQU $31 +S_O .EQU $44 +S_P .EQU $4D +S_Q .EQU $15 +S_R .EQU $2D +S_S .EQU $1B +S_T .EQU $2C +S_U .EQU $3C +S_V .EQU $2A +S_W .EQU $1D +S_X .EQU $22 +S_Y .EQU $35 +S_Z .EQU $1A +S_0 .EQU $45 +S_1 .EQU $16 +S_2 .EQU $1E +S_3 .EQU $26 +S_4 .EQU $25 +S_5 .EQU $2E +S_6 .EQU $36 +S_7 .EQU $3D +S_8 .EQU $3E +S_9 .EQU $46 +S_SEMICOLON .EQU $4C +S_RBRACKET .EQU $5B +S_LBRACKET .EQU $54 +S_BSLASH .EQU $5D +S_EQUALS .EQU $55 +S_MINUS .EQU $4E +S_SLASH .EQU $4A +S_PERIOD .EQU $49 +S_COMMA .EQU $41 +S_TILDA .EQU $0E +S_QUOTE .EQU $52 +S_SHIFT .EQU $12 +S_CTRL .EQU $14 +S_CAPSLOCK .EQU $58 +S_DEAD .EQU $00 +S_GRAPH .EQU $00 +S_CODE .EQU $00 ; perhaps can be mapped to RIGHT ALT +S_F1 .EQU $05 +S_F2 .EQU $06 +S_F3 .EQU $04 +S_F4 .EQU $0C +S_F5 .EQU $03 +S_ESC .EQU $76 +S_TAB .EQU $0D +S_STOP .EQU $00 ; MAKE -> E0 69, BREAK -> E0 F0 69 +S_BACKSPACE .EQU $66 +S_SELECT .EQU $00 +S_RETURN .EQU $5A + +S_RIGHT .EQU $00 ; E0 74 --- E0 F0 74 +S_DOWN .EQU $00 ; E0 72 --- E0 F0 72 +S_UP .EQU $00 ; E0 75 --- E0 F0 75 +S_LEFT .EQU $00 ; E0 6B --- E0 F0 6B +S_DELETE .EQU $00 ; E0 71 --- E0 F0 71 +S_INSERT .EQU $00 ; E0 70 --- E0 F0 70 +S_HOME .EQU $00 ; E0 6C --- E0 F0 6C +S_SPACE .EQU $29 + +SCANCODE_TBL: + .DB S_7, S_6, S_5, S_4, S_3, S_2, S_1, S_0 ; 00 + .DB S_SEMICOLON, S_RBRACKET, S_LBRACKET, S_BSLASH, S_EQUALS, S_MINUS, S_9, S_8 ; 01 + .DB S_B, S_A, S_DEAD, S_SLASH, S_PERIOD, S_COMMA, S_TILDA, S_QUOTE ; 02 + .DB S_J, S_I, S_H, S_G, S_F, S_E, S_D, S_C ; 03 + .DB S_R, S_Q, S_P, S_O, S_N, S_M, S_L, S_K ; 04 + .DB S_Z, S_Y, S_X, S_W, S_V, S_U, S_T, S_S ; 05 + .DB S_F3, S_F2, S_F1, S_CODE, S_CAPSLOCK, S_GRAPH, S_CTRL, S_SHIFT ; 06 + .DB S_RETURN, S_SELECT, S_BACKSPACE, S_STOP, S_TAB, S_ESC, S_F5, S_F4 ; 07 + .DB S_RIGHT, S_DOWN, S_UP, S_LEFT, S_DELETE, S_INSERT, S_HOME, S_SPACE ; 08 + +;__________________________________________________________________________________________________ +; KEYBOARD INITIALIZATION +;__________________________________________________________________________________________________ +; + +MKY_INIT: + CALL NEWLINE ; FORMATTING + PRTS("MSXKYB: IO=0x$") + LD A, MKY_REGA + CALL PRTHEXBYTE + CALL PC_SPACE ; FORMATTING + +#IF (MKYKBLOUT == KBD_US) + PRTS("US LAYOUT$") +#ELSE +#IF (MKYKBLOUT == KBD_DE) + PRTS("GERMAN LAYOUT$") +#ELSE + FAIL !!! + UKNOWN KEYBOARD TYPE +#ENDIF +#ENDIF + + ; CONFIGURE 8255 PPI PORTS + ; A - INPUT (NOT USED) + ; B - INPUT (COLUMN LINES) + ; C - OUTPUT (ROW LINE SELECTION) + + LD A, PPICMD_COMMAND | PPICMD_GA_MODE_0 | PPICMD_GB_MODE_0 | PPICMD_A_IN | PPICMD_B_IN | PPICMD_CLOW_OUT | PPICMD_CHIGH_OUT + OUT (MKY_REGCMD), A + LD A, 64 ; CAPS OFF + OUT (MKY_REGC), A + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD FLUSH +;__________________________________________________________________________________________________ +; +MKY_FLUSH: + XOR A ; A = 0 + LD (MKY_STATUS),A ; CLEAR STATUS + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD STATUS +;__________________________________________________________________________________________________ +; +MKY_STAT: + CALL MKY_SCAN ; SCAN AND SET SCANCODE FOR DETECTED KEY EVENT + CALL MKY_DECODE ; DECODE THE SCANCODE INTO A KEYCODE + JP Z, CIO_IDLE ; RET VIA IDLE PROCESSING IF NO KEY + RET +; +;__________________________________________________________________________________________________ +; KEYBOARD READ +; +; RETURNS ASCII VALUE IN E. SEE END OF FILE FOR VALUES RETURNED FOR SPECIAL KEYS +; LIKE PGUP, ARROWS, FUNCTION KEYS, ETC. +;__________________________________________________________________________________________________ +; +MKY_READ: + CALL MKY_STAT ; KEY READY? +; + JR Z, MKY_READ ; NOT READY, KEEP TRYING + LD A, (MKY_STATE) ; GET STATE + AND $01 ; ISOLATE EXTENDED SCANCODE BIT + RRCA ; ROTATE IT TO HIGH ORDER BIT + LD E, A ; SAVE IT IN E FOR NOW + LD A, (MKY_SCANCODE) ; GET SCANCODE + OR E ; COMBINE WITH EXTENDED BIT + LD C, A ; STORE IT IN C FOR RETURN + LD A, (MKY_KEYCODE) ; GET KEYCODE + LD E, A ; SAVE IT IN E + LD A, (MKY_STATE) ; GET STATE FLAGS + LD D, A ; SAVE THEM IN D + XOR A ; SIGNAL SUCCESS + LD (MKY_STATUS), A ; CLEAR STATUS TO INDICATE BYTE RECEIVED + RET +; +;__________________________________________________________________________________________________ +; RETRIEVE THE NEXT SCAN BYTES AVAILABLE +; +; RETURNS +; ; SUCUESS/FAILURE IN A +; ; NUMBER OF BYTES RETURNED IN B (ZERO IF NO SCAN CODES AVAILABLE) +; ; SCAN CODE BYTES IN D, E, H, L, C +; WORK - IN - PROGRESS +;__________________________________________________________________________________________________ +MKY_RDSCAN: + LD A, (MKY_SCANBUFFLEN) + CALL Z, MKY_GENSCODE + LD A, (MKY_SCANBUFFLEN) + LD B, A + LD A, (MKY_SCANBUFF) + LD D, A + LD A, (MKY_SCANBUFF+1) + LD E, A + LD A, (MKY_SCANBUFF+2) + LD H, A + LD A, (MKY_SCANBUFF+3) + LD L, A + LD A, (MKY_SCANBUFF+4) + LD C, A + + XOR A + LD (MKY_SCANBUFFLEN), A + RET + +MKY_SCAN: + LD A, (MKY_SCANNED) ; NEED TO WAIT UNTIL A NEW SCAN HAS COMPLETED (MKY_INT) + OR A + RET Z + + DI ; CAPTURE THE LATEST KEYBOARD SCANNED STATE + XOR A ; CLEAR SCANNED STATE + LD (MKY_SCANNED), A + + LD DE, MKY_SCNKEY ; COPY NEWKEY TO SCNKEY + LD HL, MKY_NEWKEY ; AND RESET NEWKEY TO $FF + LD B, MATRIX_ROW_COUNT + LD C, 255 +MKY_SCAN_LP1: + LD A, (HL) + LD (DE), A + LD (HL), C + INC HL + INC DE + DJNZ MKY_SCAN_LP1 + EI + + EX AF, AF' + PUSH AF + CALL MKY_GENSCODE + CALL MKY_RPTGEN + POP AF + EX AF, AF' + RET +; +;__________________________________________________________________________________________________ +; HARDWARE INTERFACE +; +; +; KEYBOARD INPUT STATUS +; A=0, Z SET FOR NOTHING PENDING, OTHERWISE DATA PENDING +; +#define MKY_IST LD A, (MKY_SCANBUFFLEN) \ OR A +;__________________________________________________________________________________________________ +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH TIMEOUT +; +MKY_GETDATA: + LD B, MKY_WAITTO ; SETUP TO LOOP +MKY_GETDATA0: + MKY_IST ; GET INPUT REGISTER STATUS + JR NZ, MKY_GETDATA1 ; BYTE PENDING, GO GET IT + CALL DELAY ; WAIT A BIT + DJNZ MKY_GETDATA0 ; LOOP UNTIL COUNTER EXHAUSTED + XOR A ; NO DATA, RETURN ZERO + RET +MKY_GETDATA1: + CALL MKY_READBYT + OR A ; SET FLAGS + RET +;__________________________________________________________________________________________________ +; +; GET A RAW DATA BYTE FROM KEYBOARD INTERFACE INTO A WITH NOTIMEOUT +; +MKY_GETDATAX: + MKY_IST ; GET INPUT REGISTER STATUS + RET Z ; NOTHING THERE, DONE + JR MKY_GETDATA1 ; GO GET IT + +;__________________________________________________________________________________________________ +; UPDATE KEYBOARD LEDS BASED ON CURRENT TOGGLE FLAGS +;__________________________________________________________________________________________________ +; +MKY_SETLEDS: + LD A,(MKY_STATE) ; LOAD THE STATE FLAGS + AND MKY_CAPSLCK ; CHECK CAPS LOCK + JR Z, MKY_LEDCAPSOFF +; +;__________________________________________________________________________________________________ +; +; TURN THE CAPS LED LIGHT ON +; +MKY_LEDCAPSON: + IN A, (MKY_REGC) + RES 6, A + OUT (MKY_REGC), A + RET +; +;__________________________________________________________________________________________________ +; +; TURN THE CAPS LED LIGHT OFF +; +MKY_LEDCAPSOFF: + IN A, (MKY_REGC) + SET 6, A + OUT (MKY_REGC), A + RET + +;__________________________________________________________________________________________________ +; DECODING ENGINE +;__________________________________________________________________________________________________ +MKY_DECODE: +; +; RUN THE DECODING ENGINE UNTIL EITHER: 1) NO MORE SCANCODES ARE AVAILABLE +; FROM THE KEYBOARD, OR 2) A DECODED KEY VALUE IS AVAILABLE +; +; RETURNS A=0 AND Z SET IF NO KEYCODE READY, OTHERWISE A DECODED KEY VALUE IS AVAILABLE. +; THE DECODED KEY VALUE AND KEY STATE IS STORED IN MKY_KEYCODE AND MKY_STATE. +; +; MKY_STATUS IS NOT CLEARED AT START. IT IS THE CALLER'S RESPONSIBILITY +; TO CLEAR MKY_STATUS WHEN IT HAS RETRIEVED A PENDING VALUE. IF DECODE IS CALLED +; WITH A KEYCODE STILL PENDING, IT WILL JUST RETURN WITHOUT DOING ANYTHING. +; +; Step 0: Check keycode buffer +; if status[keyrdy] +; return +; +; Step 1: Get scancode +; if no scancode ready +; return +; read scancode +; +; Step 2: Detect and handle special keycodes +; if scancode == $AA +; *** handle hot insert somehow *** +; +; Step 3: Detect and handle scancode prefixes +; if scancode == $E0 +; set status[extended] +; goto Step 1 +; +; if scancode == $E1 +; *** handle pause key somehow *** +; +; Step 4: Detect and flag break event +; *** scancode set #1 variation *** +; set status[break] = high bit of scancode +; clear high order bit +; continue to Step 5 +; *** scancode set #2 variation *** +; if scancode == $F0 +; set status[break] +; goto Step 1 +; +; Step 5: Map scancode to keycode +; if status[extended] +; apply extended-map[scancode] -> keycode +; else if state[shifted] +; apply shifted-map[scancode] -> keycode +; else +; apply normal-map[scancode] -> keycode +; +; Step 6: Handle modifier keys +; if keycode is modifier (shift, ctrl, alt, win) +; set (l/r)state[] = not status[break] +; clear modifier bits in state +; set state = (lstate OR rstate OR state) +; goto New Key +; +; Step 7: Complete procesing of key break events +; if status[break] +; goto New Key +; +; Step 8: Handle toggle keys +; if keycode is toggle (capslock, numlock, scrolllock) +; invert (XOR) state[] +; update keyboard LED's +; goto New Key +; +; Step 9: Adjust keycode for control modifier +; if state[ctrl] +; if keycode is 'a'-'z' +; subtract 20 (clear bit 5) from keycode +; if keycode is '@'-'_' +; subtract 40 (clear bit 6) from keycode +; +; Step 10: Adjust keycode for caps lock +; if state[capslock] +; if keycode is 'a'-'z' OR 'A'-'Z' +; toggle (XOR) bit 5 of keycode +; +; Step 11: Handle num pad keys +; REMOVED +; +; Step 12: Detect unknown/invalid keycodes +; if keycode == $FF +; goto New Key +; +; Step 13: Done +; set status[keyrdy] +; return +; +; New Key: +; clear status +; goto Step 1 +; +MKY_DEC0: ; CHECK KEYCODE BUFFER + LD A,(MKY_STATUS) ; GET CURRENT STATUS + AND MKY_KEYRDY ; ISOLATE KEY READY FLAG + RET NZ ; ABORT IF KEY IS ALREADY PENDING + +MKY_DEC1: ; PROCESS NEXT SCANCODE + CALL MKY_GETDATAX ; GET THE SCANCODE + RET Z ; NO KEY READY, RETURN WITH A=0, Z SET + LD (MKY_SCANCODE),A ; SAVE SCANCODE + +MKY_DEC2: ; DETECT AND HANDLE SPECIAL KEYCODES + LD A,(MKY_SCANCODE) ; GET THE CURRENT SCANCODE + CP $AA ; KEYBOARD INSERTION? + JR NZ,MKY_DEC3 ; NOPE, BYPASS + CALL MKY_SETLEDS ; SET LEDS + JP MKY_DECNEW ; RESTART THE ENGINE + +MKY_DEC3: ; DETECT AND HANDLE SCANCODE PREFIXES + LD A,(MKY_SCANCODE) ; GET THE CURRENT SCANCODE + +MKY_DEC3A: ; HANDLE SCANCODE PREFIX $E0 (EXTENDED SCANCODE FOLLOWS) + CP $E0 ; EXTENDED KEY PREFIX $E0? + JR NZ,MKY_DEC3B ; NOPE MOVE ON + LD A,(MKY_STATUS) ; GET STATUS + OR MKY_EXT ; SET EXTENDED BIT + LD (MKY_STATUS),A ; SAVE STATUS + JR MKY_DEC1 ; LOOP TO DO NEXT SCANCODE + +MKY_DEC3B: ; HANDLE SCANCODE PREFIX $E1 (PAUSE KEY) + CP $E1 ; EXTENDED KEY PREFIX $E1 + JR NZ,MKY_DEC4 ; NOPE MOVE ON + LD A,$EE ; MAP TO KEYCODE $EE + LD (MKY_KEYCODE),A ; SAVE IT + ; SWALLOW NEXT 7 SCANCODES + LD B,7 ; LOOP 5 TIMES +MKY_DEC3B1: + PUSH BC + CALL MKY_GETDATA ; RETRIEVE NEXT SCANCODE + POP BC + DJNZ MKY_DEC3B1 ; LOOP AS NEEDED + JP MKY_DEC6 ; RESUME AFTER MAPPING + +MKY_DEC4: ; DETECT AND FLAG BREAK EVENT + CP $F0 ; BREAK (KEY UP) PREFIX? + JR NZ,MKY_DEC5 ; NOPE MOVE ON + LD A,(MKY_STATUS) ; GET STATUS + OR MKY_BREAK ; SET BREAK BIT + LD (MKY_STATUS),A ; SAVE STATUS + JR MKY_DEC1 ; LOOP TO DO NEXT SCANCODE + +MKY_DEC5: ; MAP SCANCODE TO KEYCODE + LD A,(MKY_STATUS) ; GET STATUS + AND MKY_EXT ; EXTENDED BIT SET? + JR Z,MKY_DEC5C ; NOPE, MOVE ON + + ; PERFORM EXTENDED KEY MAPPING + LD A,(MKY_SCANCODE) ; GET SCANCODE + LD E,A ; STASH IT IN E + LD HL,MKY_MAPEXT ; POINT TO START OF EXT MAP TABLE +MKY_DEC5A: + LD A,(HL) ; GET FIRST BYTE OF PAIR + CP $00 ; END OF TABLE? + JP Z,MKY_DECNEW ; UNKNOWN OR BOGUS, START OVER + INC HL ; INC HL FOR FUTURE + CP E ; DOES MATCH BYTE EQUAL SCANCODE? + JR Z,MKY_DEC5B ; YES! JUMP OUT + INC HL ; BUMP TO START OF NEXT PAIR + JR MKY_DEC5A ; LOOP TO CHECK NEXT TABLE ENTRY +MKY_DEC5B: + LD A,(HL) ; GET THE KEYCODE VIA MAPPING TABLE + LD (MKY_KEYCODE),A ; SAVE IT + JR MKY_DEC6 + +MKY_DEC5C: ; PERFORM REGULAR KEY (NOT EXTENDED) KEY MAPPING + LD A,(MKY_SCANCODE) ; GET THE SCANCODE + CP MKY_MAPSIZ ; COMPARE TO SIZE OF TABLE + JR NC,MKY_DEC6 ; PAST END, SKIP OVER LOOKUP + + ; SETUP POINTER TO MAPPING TABLE BASED ON SHIFTED OR UNSHIFTED STATE + LD A,(MKY_STATE) ; GET STATE + AND MKY_SHIFT ; SHIFT ACTIVE? + LD HL,MKY_MAPSTD ; LOAD ADDRESS OF NON-SHIFTED MAPPING TABLE + JR Z,MKY_DEC5D ; NON-SHIFTED, MOVE ON + LD HL,MKY_MAPSHIFT ; LOAD ADDRESS OF SHIFTED MAPPING TABLE +MKY_DEC5D: + LD A,(MKY_SCANCODE) ; GET THE SCANCODE + LD E,A ; SCANCODE TO E FOR TABLE OFFSET + LD D,0 ; D -> 0 + ADD HL,DE ; COMMIT THE TABLE OFFSET TO HL + LD A,(HL) ; GET THE KEYCODE VIA MAPPING TABLE + LD (MKY_KEYCODE),A ; SAVE IT + +MKY_DEC6: ; HANDLE MODIFIER KEYS + LD A,(MKY_KEYCODE) ; MAKE SURE WE HAVE KEYCODE + CP $B8 ; END OF MODIFIER KEYS + JR NC,MKY_DEC7 ; BYPASS MODIFIER KEY CHECKING + CP $B0 ; START OF MODIFIER KEYS + JR C,MKY_DEC7 ; BYPASS MODIFIER KEY CHECKING + + LD B,4 ; LOOP COUNTER TO LOOP THRU 4 MODIFIER BITS + LD E,$80 ; SETUP E TO ROATE THROUGH MODIFIER STATE BITS + SUB $B0 - 1 ; SETUP A TO DECREMENT THROUGH MODIFIER VALUES + +MKY_DEC6A: + RLC E ; SHIFT TO NEXT MODIFIER STATE BIT + DEC A ; L-MODIFIER? + JR Z,MKY_DEC6B ; YES, HANDLE L-MODIFIER MAKE/BREAK + DEC A ; R-MODIFIER? + JR Z,MKY_DEC6C ; YES, HANDLE R-MODIFIER MAKE/BREAK + DJNZ MKY_DEC6A ; LOOP THRU 4 MODIFIER BITS + JR MKY_DEC7 ; FAILSAFE, SHOULD NEVER GET HERE! + +MKY_DEC6B: ; LEFT STATE KEY MAKE/BREAK (STATE BIT TO SET/CLEAR IN E) + LD HL,MKY_LSTATE ; POINT TO LEFT STATE BYTE + JR MKY_DEC6D ; CONTINUE + +MKY_DEC6C: ; RIGHT STATE KEY MAKE/BREAK (STATE BIT TO SET/CLEAR IN E) + LD HL,MKY_RSTATE ; POINT TO RIGHT STATE BYTE + JR MKY_DEC6D ; CONTINUE + +MKY_DEC6D: ; BRANCH BASED ON WHETHER THIS IS A MAKE OR BREAK EVENT + LD A,(MKY_STATUS) ; GET STATUS FLAGS + AND MKY_BREAK ; BREAK EVENT? + JR Z,MKY_DEC6E ; NO, HANDLE A MODIFIER KEY MAKE EVENT + JR MKY_DEC6F ; YES, HANDLE A MODIFIER BREAK EVENT + +MKY_DEC6E: ; HANDLE STATE KEY MAKE EVENT + LD A,E ; GET THE BIT TO SET + OR (HL) ; OR IN THE CURRENT BITS + LD (HL),A ; SAVE THE RESULT + JR MKY_DEC6G ; CONTINUE + +MKY_DEC6F: ; HANDLE STATE KEY BREAK EVENT + LD A,E ; GET THE BIT TO CLEAR + XOR $FF ; FLIP ALL BITS TO SETUP FOR A CLEAR OPERATION + AND (HL) ; AND IN THE FLIPPED BITS TO CLEAR DESIRED BIT + LD (HL),A ; SAVE THE RESULT + JR MKY_DEC6G ; CONTINUE + +MKY_DEC6G: ; COALESCE L/R STATE FLAGS + LD A,(MKY_STATE) ; GET EXISTING STATE BITS + AND $F0 ; GET RID OF OLD MODIFIER BITS + LD DE,(MKY_LSTATE) ; LOAD BOTH L/R STATE BYTES IN D/E + OR E ; MERGE IN LEFT STATE BITS + OR D ; MERGE IN RIGHT STATE BITS + LD (MKY_STATE),A ; SAVE IT + JP MKY_DECNEW ; DONE WITH CURRENT KEYSTROKE + +MKY_DEC7: ; COMPLETE PROCESSING OF EXTENDED AND KEY BREAK EVENTS + LD A,(MKY_STATUS) ; GET CURRENT STATUS FLAGS + AND MKY_BREAK ; IS THIS A KEY BREAK EVENT? + JP NZ,MKY_DECNEW ; PROCESS NEXT KEY + +MKY_DEC8: ; HANDLE TOGGLE KEYS + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE INTO A + LD E,MKY_CAPSLCK ; SETUP E WITH CAPS LOCK STATE BIT + CP $BC ; IS THIS THE CAPS LOCK KEY? + JR Z,MKY_DEC8A ; YES, GO TO BIT SET ROUTINE + LD E,MKY_NUMLCK ; SETUP E WITH NUM LOCK STATE BIT + CP $BD ; IS THIS THE NUM LOCK KEY? + JR Z,MKY_DEC8A ; YES, GO TO BIT SET ROUTINE + LD E,MKY_SCRLCK ; SETUP E WITH SCROLL LOCK STATE BIT + CP $BE ; IS THIS THE SCROLL LOCK KEY? + JR Z,MKY_DEC8A ; YES, GO TO BIT SET ROUTINE + JR MKY_DEC9 ; NOT A TOGGLE KEY, CONTINUE + +MKY_DEC8A: ; RECORD THE TOGGLE + LD A,(MKY_STATE) ; GET THE CURRENT STATE FLAGS + XOR E ; SET THE TOGGLE KEY BIT FROM ABOVE + LD (MKY_STATE),A ; SAVE IT + CALL MKY_SETLEDS ; UPDATE LED LIGHTS ON KBD + JP MKY_DECNEW ; RESTART DECODER FOR A NEW KEY + +MKY_DEC9: ; ADJUST KEYCODE FOR CONTROL MODIFIER + LD A,(MKY_STATE) ; GET THE CURRENT STATE BITS + AND MKY_CTRL ; CHECK THE CONTROL BIT + JR Z,MKY_DEC10 ; CONTROL KEY NOT PRESSED, MOVE ON + LD A,(MKY_KEYCODE) ; GET CURRENT KEYCODE IN A + CP 'a' ; COMPARE TO LOWERCASE A + JR C,MKY_DEC9A ; BELOW IT, BYPASS + CP 'z' + 1 ; COMPARE TO LOWERCASE Z + JR NC,MKY_DEC9A ; ABOVE IT, BYPASS + RES 5,A ; KEYCODE IN LOWERCASE A-Z RANGE CLEAR BIT 5 TO MAKE IT UPPERCASE +MKY_DEC9A: + CP '@' ; COMPARE TO @ + JR C,MKY_DEC10 ; BELOW IT, BYPASS + CP '_' + 1 ; COMPARE TO _ + JR NC,MKY_DEC10 ; ABOVE IT, BYPASS + RES 6,A ; CONVERT TO CONTROL VALUE BY CLEARING BIT 6 + LD (MKY_KEYCODE),A ; UPDATE KEYCODE TO CONTROL VALUE + +MKY_DEC10: ; ADJUST KEYCODE FOR CAPS LOCK + LD A,(MKY_STATE) ; LOAD THE STATE FLAGS + AND MKY_CAPSLCK ; CHECK CAPS LOCK + JR Z,MKY_DEC12 ; CAPS LOCK NOT ACTIVE, MOVE ON + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE VALUE + CP 'a' ; COMPARE TO LOWERCASE A + JR C,MKY_DEC10A ; BELOW IT, BYPASS + CP 'z' + 1 ; COMPARE TO LOWERCASE Z + JR NC,MKY_DEC10A ; ABOVE IT, BYPASS + JR MKY_DEC10B ; IN RANGE LOWERCASE A-Z, GO TO CASE SWAPPING LOGIC +MKY_DEC10A: + CP 'A' ; COMPARE TO UPPERCASE A + JR C,MKY_DEC12 ; BELOW IT, BYPASS + CP 'Z' + 1 ; COMPARE TO UPPERCASE Z + JR NC,MKY_DEC12 ; ABOVE IT, BYPASS + JR MKY_DEC10B ; IN RANGE UPPERCASE A-Z, GO TO CASE SWAPPING LOGIC +MKY_DEC10B: + LD A,(MKY_KEYCODE) ; GET THE CURRENT KEYCODE + XOR $20 ; FLIP BIT 5 TO SWAP UPPER/LOWER CASE + LD (MKY_KEYCODE),A ; SAVE IT + +MKY_DEC12: ; DETECT UNKNOWN/INVALID KEYCODES + LD A,(MKY_KEYCODE) ; GET THE FINAL KEYCODE + CP $FF ; IS IT $FF (UNKNOWN/INVALID) + JP Z,MKY_DECNEW ; IF SO, JUST RESTART THE ENGINE + +MKY_DEC13: ; DONE - RECORD RESULTS + LD A,(MKY_STATUS) ; GET CURRENT STATUS + OR MKY_KEYRDY ; SET KEY READY BIT + LD (MKY_STATUS),A ; SAVE IT + XOR A ; A=0 + INC A ; SIGNAL SUCCESS WITH A=1 + RET + +MKY_DECNEW: ; START NEW KEYPRESS (CLEAR ALL STATUS BITS) + XOR A ; A = 0 + LD (MKY_STATUS),A ; CLEAR STATUS + JP MKY_DEC1 ; RESTART THE ENGINE + +; +;__________________________________________________________________________________________________ +; INTERRUPT HANDLER +; +; SCAN KEYBOARD AND IN THE NEWKEY SCAN STATS +; +;__________________________________________________________________________________________________ +; +MKY_INT: + LD A, (MKY_RPTACTIVE) ; NO REPEAT KEY IS HELD? + OR A + JR Z, MKY_INTSCAN1 + LD A, (MKY_RPTCNT) ; DECREMENT REPEAT COUNTER + DEC A ; DOWN TO ZERO + CP $FF + JR Z, MKY_INTSCAN1 + LD (MKY_RPTCNT), A + +MKY_INTSCAN1: + LD A, (MKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + DEC A + LD (MKY_SCNCNT), A + RET NZ + + LD A, SCAN_INT_PERIOD + LD (MKY_SCNCNT), A + +; SCAN KEYBOARD AND STORE ALL COLUMN RESULTS PER ROW AT MKY_NEWKEY +; + IN A, (MKY_REGC) ; READ AND MASK THE CURRENT STATE OF PPI PORT C + AND $F0 + LD D, A + LD B, MATRIX_ROW_COUNT ; PREPARE TO LOOP THRU THE SCAN ROWS + LD HL, MKY_NEWKEY + LD C, MKY_REGC +MKY_SCAN_LP: + OUT (C), D ; SET ACTIVE ROW + IN A, (MKY_REGB) ; READ ACTIVE COLUMN DATA + LD (HL), A ; STORE COLUMN READ VALUE + INC HL + INC D + DJNZ MKY_SCAN_LP ; LOOP UNTIL ALL ROWS READ + + LD A, $FF ; NOTE THAT A SCAN HAS BEEN DONE + LD (MKY_SCANNED), A + RET + +; +;__________________________________________________________________________________________________ +; COMPARE MKY_OLDKEY O MKY_NEWKEY +; GENERATE SCAN CODES +; +; FOR EACH BIT IN MKY_OLDKEY CP WITH CORRESPONDING BIT IN MKY_SCNKEY +; IF BOTH = 1, THEN NO KEY PRESS - NOTHING CHANGED +; IF BOTH = 0, THEN KEY WAS AND IS STILL PRESSED - NOTHING CHANGED +; IF OLD = 1 AND SCN = 0, KEY WAS PRESSED +; IF OLD = 0 AND SCN = 1, KEY WAS RELEASED +; STOP OF FIRST CHANGE - STORE IN BUFFER, AND RESET/CLEAR BIT IN MKY_OLDKEY +; ALSO SET MKY_RPTACTIVE. NZ -> A KEY IS HELD DOWN, ZERO -> NO KEYS HELD DOWN +; +MKY_GENSCODE: + XOR A + LD (MKY_RPTACTIVE), A ; CLEAR FLAG TO INDICATE A KEYHOLD STATE + + LD HL, MKY_OLDKEY + LD DE, MKY_SCNKEY + XOR A + EX AF, AF' ; ROW COUNT IN A' + +MKY_GENSCODE_LPR: + LD C, (HL) + LD A, (DE) + + AND C + CP $FF + JR Z, MKY_GENSCODENXT1 ; ALL KEYS ARE UP AND WERE UP? + + LD B, 8 ; 8 COLUMN BITS + LD A, (DE) + +MKY_GENSCODE_LPC: + RRCA ; ROTATE NEW COLUMN BIT INTO CARRY + JR NC, MKY_NEWDWN ; IS KEY DOWN? + + ; KEY IS UP + RRC C ; ROTATE OLD COLUMN BIT INTO CARRY + JR C, MKY_GENSCODENXT ; BOTH KEYS UP? + + ; NEW KEY IS UP, OLD KEY WAS DOWN + JR MKY_KEYUP ; STORE NEW KEY RELEASE IN BUFF (A' IF ROW, B IS COLUMN) + +MKY_NEWDWN: + RRC C ; ROTATE OLD COLUMN BIT INTO CARRY + JR NC, MKY_KEYHOLD ; BOTH KEYS DOWN? + + ; NEW KEY IS DOWN, OLD KEY WAS UP + JR MKY_KEYDOWN ; STORE NEW KEY PRESS IN BUFF (A' IF ROW, B IS COLUMN) + +MKY_GENSCODENXT: + DJNZ MKY_GENSCODE_LPC + +MKY_GENSCODENXT1: + EX AF, AF' + INC A + CP MATRIX_ROW_COUNT + RET Z + EX AF, AF' + + INC HL + INC DE + JR MKY_GENSCODE_LPR + + ; KEY IS PRESSED +MKY_KEYHOLD: + EX AF, AF' ; GET ROW COUNT + CP 6 + JR NC, MKY_NORPT ; IF >=6 THEN WE DONT REPEAT + + LD (MKY_NRPTROW), A + EX AF, AF' + + PUSH AF + LD A, B + LD (MKY_NRPTCOL), A + + LD A, $FF ; RECORD FACT THAT A KEY HAS BEEN HELD - FOR LATER TESTING + LD (MKY_RPTACTIVE), A ; OF REPEAT FUNCTION + + POP AF + JR MKY_GENSCODENXT + +MKY_NORPT: + EX AF, AF' + JR MKY_GENSCODENXT + +MKY_KEYDOWN: + PUSH AF + LD A, KEY_REPEAT_INIT ; SET COUNTER FOR REPEAT TRIGGER + LD (MKY_RPTCNT), A + POP AF + +MKY_KEYDOWN_RPT: + CALL MKY_RESOLDBIT + CALL MKY_SCANADDR + LD A, (HL) + OR A ; IF NO SCANCODE - IGNORE IT + RET Z + + LD (MKY_SCANBUFF), A + LD A, 1 + LD (MKY_SCANBUFFLEN), A + RET + +MKY_KEYUP: + CALL MKY_SETOLDBIT + CALL MKY_SCANADDR + + LD A, (HL) + OR A ; IF NO SCANCODE - IGNORE IT + RET Z + LD (MKY_SCANBUFF+1), A + LD A, $F0 + LD (MKY_SCANBUFF), A + LD A, 2 + LD (MKY_SCANBUFFLEN), A + RET + +MKY_RPTGEN: + LD A, (MKY_SCANBUFFLEN) ; IF ALREADY A CODE IN BUFFER + OR A ; THEN WE CANT GENERATE A REPEAT + RET NZ + + LD A, (MKY_RPTACTIVE) ; NO KEY IS HELD + OR A + RET Z + + LD A, (MKY_RPTCNT) + OR A + RET NZ + + ; GENERATE THE KEY DOWN SCAN CODE FOR THE REPEATING KEY + LD A, KEY_REPEAT_PERIOD + LD (MKY_RPTCNT), A + LD A, (MKY_NRPTCOL) + LD B, A + LD A, (MKY_NRPTROW) + EX AF, AF' + JR MKY_KEYDOWN_RPT +; +;__________________________________________________________________________________________________ +; +; RETRIEVE ADDRESS AND BIT MASK WITHIN MKY_OLDKEY RRAY +; +; INPUT: +; B = 1 TO 8 - COLUMN COUNT +; A' IS ROW COUNT - 0 TO MATRIX_ROW_COUNT +; OUTPUT: +; HL = BYTE WITHIN MKY_OLDKEY ARRAY +; A = BIT MASK FOR COLUMN COUNT (EG: B = 3, A = 8) +; PROTECTS: +; A' IS UNCHANGED +; B IS UNCHANGED + +MKY_GETKEYIDX: + LD HL, MKY_OLDKEY + LD A, $80 + LD C, B ; SAVE B (COLUMN COUNT - 1 TO 8) +MKY_SETOLDBIT_LP: + DEC B + JR Z, SKIP + RRCA + JR MKY_SETOLDBIT_LP + +SKIP: + EX AF, AF' ; RETRIEVE ROW COUNT + LD E, A + EX AF, AF' + LD D, 0 + LD B, C ; RETORE B (COLUMN COUNT) + ADD HL, DE + RET +; +;__________________________________________________________________________________________________ +; +; SET BIT WITHIN THE KEY MATRIX ARRAY +; HL -> ADDRESS WITHIN MKY_OLDKEY ARRAY +; C BIT MASK TO BE OR'ED +; +MKY_SETOLDBIT: + CALL MKY_GETKEYIDX + OR (HL) + LD (HL), A + RET +; +;__________________________________________________________________________________________________ +; +; RESET BIT WITHIN THE KEY MATRIX ARRAY +; HL -> ADDRESS WITHIN MKY_OLDKEY ARRAY +; C CPL BIT MASK TO BE AND'ED +; +MKY_RESOLDBIT: + CALL MKY_GETKEYIDX + CPL + AND (HL) + LD (HL), A + RET +; +;__________________________________________________________________________________________________ +; +; CALCULATE THE ADDRESS WITHIN THE SCANCODE_TABLE FOR A SPECIFIC KEY +; +MKY_SCANADDR: + ; ASSUMING SINGLE BYTE CODE CODE + EX AF, AF' ; RETRIVE ROW COUNT + + ; CODE ADDR = SCANCODE_TBL + (A * 8) + B - 1 + LD L, A + LD H, 0 + ADD HL, HL + ADD HL, HL + ADD HL, HL + DEC B + LD C, B + LD B, 0 + ADD HL, BC + LD DE, SCANCODE_TBL + ADD HL, DE + RET +; +;__________________________________________________________________________________________________ +; READ A SINGLE BYTE FROM THE SCANCODE BUFFER +; RETURNED IN A +; +MKY_READBYT: + LD A, (MKY_SCANBUFFLEN) + OR A + RET Z + + LD A, (MKY_SCANBUFF) + LD DE, MKY_SCANBUFF + LD HL, MKY_SCANBUFF + 1 + LD BC, 4 + LDIR + LD C, A + LD A, (MKY_SCANBUFFLEN) + DEC A + LD (MKY_SCANBUFFLEN), A + LD A, C + RET + +; DYNAMIC DATA STORAGE: +; +; STORAGE OF KEYBOARD MATRIX, USED FOR DETECTING KEY REPETITION +MKY_OLDKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; CURRENT STATE OF THE KEYBOARD MATRIX +MKY_NEWKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; COPY OF MKY_NEWKEY FOR USE IN GENERATING SCANCODE +MKY_SCNKEY: .FILL MATRIX_ROW_COUNT, $FF +; +; SET TO NZ WHEN A SCAN IS COMPLETED +; SET TO ZERO AFTER A SCAN CODE CONVERSION +MKY_SCANNED: .DB 0 +; +; F3F6: VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE +; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD +MKY_SCNCNT: .DB SCAN_INT_PERIOD + +; INITIALL SET TO FALSE, AND THUS DISABLING INTERRUPT HANDLER'S SCAN FUNCTION +; AS SOON AT THE KEY REQUEST FUNCTIONS (STATUS, READ), THIS IS SET AND INTERRUPT HANDLER +; IS PERMANETLY ON. +; MKY_SCANON: .DB 0 + +; +MKY_NRPTCOL: .DB 0 +MKY_NRPTROW: .DB 0 +MKY_RPTACTIVE: .DB 0 +MKY_RPTCNT: .DB KEY_REPEAT_INIT + +MKY_SCANBUFF: .FILL 5, 0 +MKY_SCANBUFFLEN: .DB 0 + +MKY_SCANCODE: .DB 0 ; RAW SCANCODE +MKY_KEYCODE: .DB 0 ; RESULTANT KEYCODE AFTER DECODING +MKY_STATE: .DB 0 ; STATE BITS (SEE ABOVE) +MKY_LSTATE: .DB 0 ; STATE BITS FOR "LEFT" KEYS +MKY_RSTATE: .DB 0 ; STATE BITS FOR "RIGHT" KEYS +MKY_STATUS: .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) + +#IF (MKYKBLOUT == KBD_US) +;__________________________________________________________________________________________________ +; +; MAPPING TABLES US/ENGLISH +;__________________________________________________________________________________________________ +MKY_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'`',$FF + .DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'z','s','a','w','2',$FF + .DB $FF,'c','x','d','e','4','3',$FF,$FF,' ','v','f','t','r','5',$FF + .DB $FF,'n','b','h','g','y','6',$FF,$FF,$FF,'m','j','u','7','8',$FF + .DB $FF,',','k','i','o','0','9',$FF,$FF,'.','/','l',';','p','-',$FF + .DB $FF,$FF,$27,$FF,'[','=',$FF,$FF,$BC,$B1,$0D,']',$FF,'\',$FF,$FF + .DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$C0,$FF,$C3,$C6,$FF,$FF,$FF + .DB $C9,$CA,$C1,$C4,$C5,$C7,$1B,$BD,$FA,$CE,$C2,$CD,$CC,$C8,$BE,$FF + .DB $FF,$FF,$FF,$E6,$EC +; +MKY_MAPSIZ .EQU ($ - MKY_MAPSTD) +; +MKY_MAPSHIFT: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE WHEN SHIFT ACTIVE + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'~',$FF + .DB $FF,$B4,$B0,$FF,$B2,'Q','!',$FF,$FF,$FF,'Z','S','A','W','@',$FF + .DB $FF,'C','X','D','E','$','#',$FF,$FF,' ','V','F','T','R','%',$FF + .DB $FF,'N','B','H','G','Y','^',$FF,$FF,$FF,'M','J','U','&','*',$FF + .DB $FF,'<','K','I','O',')','(',$FF,$FF,'>','?','L',':','P','_',$FF + .DB $FF,$FF,$22,$FF,'{','+',$FF,$FF,$BC,$B1,$0D,'}',$FF,'|',$FF,$FF + .DB $FF,$FF,$FF,$FF,$FF,$FF,$08,$FF,$FF,$D0,$FF,$D3,$D6,$FF,$FF,$FF + .DB $D9,$DA,$D1,$D4,$D5,$D7,$1B,$BD,$FA,$DE,$D2,$DD,$DC,$D8,$BE,$FF + .DB $FF,$FF,$FF,$E6,$EC +; +MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES + .DB $11,$B5, $14,$B3, $1F,$B6, $27,$B7 + .DB $2F,$EF, $37,$FA, $3F,$FB, $4A,$CB + .DB $5A,$CF, $5E,$FC, $69,$F3, $6B,$F8 + .DB $6C,$F2, $70,$F0, $71,$F1, $72,$F7 + .DB $74,$F9, $75,$F6, $7A,$F5, $7C,$ED + .DB $7D,$F4, $7E,$FD, $00,$00 +; +#ENDIF +#IF (MKYKBLOUT == KBD_DE) +;__________________________________________________________________________________________________ +; +; MAPPING TABLES GERMAN +;__________________________________________________________________________________________________ +; +MKY_MAPSTD: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE ROW + +; Column 0 1 2 3 4 5 6 7 8 9 A B C D E F ; Special adjustments listed below + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'^',$FF ;0 for German keyboard keys that give + .DB $FF,$B4,$B0,$FF,$B2,'q','1',$FF,$FF,$FF,'y','s','a','w','2',$FF ;1 different characters than are printed + .DB $FF,'c','x','d','e','4','3',$FF,$FF,' ','v','f','t','r','5',$FF ;2 on the keys. + .DB $FF,'n','b','h','g','z','6',$FF,$FF,$FF,'m','j','u','7','8',$FF ;3 'german key' --> 'new occupied with' + .DB $FF,',','k','i','o','0','9',$FF,$FF,'.','-','l','[','p',$5C,$FF ;4 Assembler ERROR: '\'-->$5C ; 'ö'-->'[' + .DB $FF,$FF,'@',$FF,']','|',$FF,$FF,$BC,$B1,$0D,'+',$FF,'#',$FF,$FF ;5 'ä'-->'@' ; 'ü'-->']' + .DB $FF,'<',$FF,$FF,$FF,$FF,$08,$FF,$FF,$C0,$FF,$C3,$C6,'<',$FF,$FF ;6 + .DB $C9,$CA,$C1,$C4,$C5,$C7,$1B,$BD,$FA,$CE,$C2,$CD,$CC,$C8,$BE,$FF ;7 + .DB $FF,$FF,$FF,$E6,$EC ;8 + +MKY_MAPSIZ .EQU ($ - MKY_MAPSTD) +; +MKY_MAPSHIFT: ; SCANCODE IS INDEX INTO TABLE TO RESULTANT LOOKUP KEYCODE WHEN SHIFT ACTIVE + + .DB $FF,$E8,$FF,$E4,$E2,$E0,$E1,$EB,$FF,$E9,$E7,$E5,$E3,$09,'~',$FF ; '°' --> '~' + .DB $FF,$B4,$B0,$FF,$B2,'Q','!',$FF,$FF,$FF,'Y','S','A','W',$22,$FF + .DB $FF,'C','X','D','E','$',$20,$FF,$FF,' ','V','F','T','R','%',$FF ; '§'-->$20; '§'=Paragraph not used in CP/M + .DB $FF,'N','B','H','G','Z','&',$FF,$FF,$FF,'M','J','U','/','(',$FF + .DB $FF,';','K','I','O','=',')',$FF,$FF,':','_','L','{','P','?',$FF ; 'Ö'-->'{' + .DB $FF,$FF,'@',$FF,'}','`',$FF,$FF,$BC,$B1,$0D,'*',$FF,$27,$FF,$FF ; 'Ä'-->'@' ; 'Ü'-->'}' + .DB $FF,'>',$FF,$FF,$FF,$FF,$08,$FF,$FF,$D0,$FF,$D3,$D6,'>',$FF,$FF + .DB $D9,$DA,$D1,$D4,$D5,$D7,$1B,$BD,$FA,$DE,$D2,$DD,$DC,$D8,$BE,$FF + .DB $FF,$FF,$FF,$E6,$EC + +MKY_MAPEXT: ; PAIRS ARE [SCANCODE,KEYCODE] FOR EXTENDED SCANCODES + .DB $11,$B5, $14,$B3, $1F,$B6, $27,$B7 + .DB $2F,$EF, $37,$FA, $3F,$FB, $4A,$CB ; All keys listed below are customized for Wordstar. + .DB $5A,$CF, $5E,$FC, $69,$06, $6B,$13 ; n.a , n.a , word right , n.a. + .DB $6C,$01, $70,$16, $71,$07, $72,$18 ; Word left , Toggle Insert/Overwrite , Del Char , Cursor down + .DB $74,$04, $75,$05, $7A,$1A, $7C,$ED ; Cursor right , Cursor up , Page down + .DB $7D,$17, $7E,$FD, $00,$00 ; Page up , n.a. , END MKY_MAPEXT (Pairs end) +; +#ENDIF +; +;__________________________________________________________________________________________________ +; KEYCODE VALUES RETURNED BY THE DECODER +;__________________________________________________________________________________________________ +; +; VALUES 0-127 ARE STANDARD ASCII, SPECIAL KEYS WILL HAVE THE FOLLOWING VALUES: +; +; F1 $E0 +; F2 $E1 +; F3 $E2 +; F4 $E3 +; F5 $E4 +; F6 $E5 +; F7 $E6 +; F8 $E7 +; F9 $E8 +; F10 $E9 +; F11 $EA +; F12 $EB +; SYSRQ $EC +; PRTSC $ED +; PAUSE $EE +; APP $EF +; INS $F0 +; DEL $F1 +; HOME $F2 +; END $F3 +; PGUP $F4 +; PGDN $F5 +; UP $F6 +; DOWN $F7 +; LEFT $F8 +; RIGHT $F9 +; POWER $FA +; SLEEP $FB +; WAKE $FC +; BREAK $FD diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm new file mode 100644 index 00000000..4fe0a677 --- /dev/null +++ b/Source/HBIOS/rp5rtc.asm @@ -0,0 +1,446 @@ +; +;================================================================================================== +; RP5C01 CLOCK DRIVER +;================================================================================================== +; +RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) +; +; RTC DEVICE INITIALIZATION ENTRY +; + +; TODO: +; set the day of week register +; read block of nvram +; write block of nvram +; set alarm/get alarm???? + +;; NOTES FOR USING DRIVER IN Z-DOS +; First load the LDDS datestamper +; A:LDDS +; next prepare and drives with datestamper info: +; eg: a:putds -d=g: -V +; then view date time of files with: +; a:filedate + + +RP5RTC_REG .EQU $B4 +RP5RTC_DAT .EQU $B5 + +REG_1SEC .EQU $00 +REG_10SEC .EQU $01 +REG_1MIN .EQU $02 +REG_10MIN .EQU $03 +REG_1HR .EQU $04 +REG_10HR .EQU $05 +REG_DAYWEEK .EQU $06 ; NOT USED BY THIS DRIVER +REG_1DAY .EQU $07 +REG_10DAY .EQU $08 +REG_1MNTH .EQU $09 +REG_10MNTH .EQU $0A +REG_1YEAR .EQU $0B +REG_10YEAR .EQU $0C +REG_MODE .EQU $0D +REG_TEST .EQU $0E +REG_RESET .EQU $0F + + +REG_12_24 .EQU $0A +REG_LEAPYR .EQU $0B + +MODE_TIMEST .EQU 0 +MODE_ALRMST .EQU 1 +MODE_RAM0 .EQU 2 +MODE_RAM1 .EQU 3 + +MD_TIME .EQU 8 +MD_ALRM .EQU 4 + +RP5RTC_INIT: + LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? + OR A ; SET FLAGS + RET NZ ; IF ALREADY ACTIVE, ABORT + + CALL NEWLINE ; FORMATTING + PRTS("RP5C01 RTC: $") + + ; PRINT RTC LATCH PORT ADDRESS + PRTS("IO=0x$") ; LABEL FOR IO ADDRESS + LD A,RP5RTC_REG ; GET IO ADDRESS + CALL PRTHEXBYTE ; PRINT IT + CALL PC_SPACE ; FORMATTING + + ; CHECK PRESENCE STATUS + CALL RP5RTC_DETECT ; HARDWARE DETECTION + JR Z, RP5RTC_INIT1 ; IF ZERO, ALL GOOD + PRTS("NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT + OR $FF ; SIGNAL FAILURE + RET ; BAIL OUT + +RP5RTC_INIT1: +; ENSURE DEVICE IS RESET AND NOT IN TEST MODE + LD A, REG_TEST ; SELECT TEST REGISTER + OUT (RP5RTC_REG), A + CALL DLY16 + XOR A + OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS + + LD B, MODE_ALRMST + CALL RP5RTC_SETMD + + CALL RP5RTC_ENTIME + + LD A, REG_12_24 ; SET TO 24 HOUR CLOCK + OUT (RP5RTC_REG), A + LD A, 1 + OUT (RP5RTC_DAT), A + + CALL RP5RTC_RDTIM + + ; DISPLAY CURRENT TIME + LD HL, RP5RTC_BCDBUF ; POINT TO BCD BUF + CALL PRTDT +; + LD BC, RP5RTC_DISPATCH + CALL RTC_SETDISP +; + XOR A ; SIGNAL SUCCESS + RET +; +; DETECT RTC HARDWARE PRESENCE +; +RP5RTC_DETECT: + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_GETBYT ; GET VALUE + LD A, E ; TO ACCUM + LD L, A ; SAVE IT + XOR $FF ; FLIP ALL BITS + LD E, A ; TO E + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_SETBYT ; WRITE IT + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_GETBYT ; GET VALUE + LD A, L ; GET SAVED VALUE + XOR $FF ; FLIP ALL BITS + CP E ; COMPARE WITH VALUE READ + LD A, 0 ; ASSUME OK + JR Z, RP5RTC_DETECT1 ; IF MATCH, GO AHEAD + LD A, $FF ; ELSE STATUS IS ERROR + +RP5RTC_DETECT1: + PUSH AF ; SAVE STATUS + LD A, L ; GET SAVED VALUE + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_SETBYT ; SAVE IT + POP AF ; RECOVER STATUS + OR A ; SET FLAGS + RET +; +; RTC DEVICE FUNCTION DISPATCH ENTRY +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; B: FUNCTION (IN) +; +RP5RTC_DISPATCH: + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,RP5RTC_GETTIM ; GET TIME + DEC A + JP Z,RP5RTC_SETTIM ; SET TIME + DEC A + JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE + DEC A + JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE + DEC A + JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES + DEC A + JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + DEC A + JP Z,RP5RTC_GETALM ; GET ALARM + DEC A + JP Z,RP5RTC_SETALM ; SET ALARM + DEC A + JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO + CALL SYSCHK + LD A, ERR_NOFUNC + OR A + RET +; +; RTC GET NVRAM BYTE +; C: INDEX +; E: VALUE (OUTPUT) +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE +; +RP5RTC_GETBYT: + LD A, C + CP $0D + JR NC, RP5RTC_BADIDX + + LD B, MODE_RAM0 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + LD E, A + + LD B, MODE_RAM1 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + RLCA + RLCA + RLCA + RLCA + OR E + LD E, A + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + +RP5RTC_BADIDX: + LD E, 00 + LD A, ERR_RANGE + RET +; +; RTC SET NVRAM BYTE +; C: INDEX +; E: VALUE +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE +; +RP5RTC_SETBYT: + LD A, C + CP $0D + JR NC, RP5RTC_BADIDX + + LD B, MODE_RAM0 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + LD A, E + AND $0F + OUT (RP5RTC_DAT), A + + LD B, MODE_RAM1 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + LD A, E + AND $F0 + RRCA + RRCA + RRCA + RRCA + OUT (RP5RTC_DAT), A + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + +RP5RTC_GETBLK: +RP5RTC_SETBLK: +RP5RTC_GETALM: +RP5RTC_SETALM: + LD A, ERR_NOTIMPL + CALL SYSCHK + OR A + RET +; +; RTC GET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (OUT) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSS +; 24 HOUR TIME FORMAT IS ASSUMED +; +RP5RTC_GETTIM: + ; GET THE TIME INTO TEMP BUF + PUSH HL ; SAVE PTR TO CALLERS BUFFER +; + CALL RP5RTC_RDTIM + + ; NOW COPY TO REAL DESTINATION (INTERBANK SAFE) + LD A,BID_BIOS ; COPY FROM BIOS BANK + LD (HB_SRCBNK),A ; SET IT + LD A,(HB_INVBNK) ; COPY TO CURRENT USER BANK + LD (HB_DSTBNK),A ; SET IT + LD HL,RP5RTC_BCDBUF ; SOURCE ADR + POP DE ; DEST ADR + LD BC,RP5RTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; RTC SET TIME +; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR +; HL: DATE/TIME BUFFER (IN) +; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW +; 24 HOUR TIME FORMAT IS ASSUMED +; +RP5RTC_SETTIM: + ; COPY TO BCD BUF + LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK + LD (HB_SRCBNK),A ; SET IT + LD A,BID_BIOS ; COPY TO BIOS BANK + LD (HB_DSTBNK),A ; SET IT + LD DE,RP5RTC_BCDBUF ; DEST ADR + LD BC,RP5RTC_BUFSIZ ; LENGTH + CALL HB_BNKCPY ; COPY THE CLOCK DATA +; + LD B, MODE_TIMEST + CALL RP5RTC_SETMD + + LD B, REG_1SEC + LD A, (RP5RTC_SS) + CALL RP5RTC_WRVL + + LD B, REG_1MIN + LD A, (RP5RTC_MM) + CALL RP5RTC_WRVL + + LD B, REG_1HR + LD A, (RP5RTC_HH) + CALL RP5RTC_WRVL + + LD B, REG_1DAY + LD A, (RP5RTC_DT) + CALL RP5RTC_WRVL + + LD B, REG_1MNTH + LD A, (RP5RTC_MO) + CALL RP5RTC_WRVL + + LD B, REG_1YEAR + LD A, (RP5RTC_YR) + CALL RP5RTC_WRVL + + LD B, MODE_ALRMST + CALL RP5RTC_SETMD + + LD A, (RP5RTC_YR) + CALL BCD2BYTE + AND 3 + LD B, REG_LEAPYR + CALL RP5RTC_WRVL + + CALL RP5RTC_ENTIME + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; REPORT RTC DEVICE INFO +; +RP5RTC_DEVICE: + LD D,RTCDEV_RP5 ; D := DEVICE TYPE + LD E,0 ; E := PHYSICAL DEVICE NUMBER + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,0 ; L := 0, NO I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET + +; +; READ OUT THE TIME +RP5RTC_RDTIM: + LD B, MODE_TIMEST + CALL RP5RTC_SETMD + + LD B, REG_1SEC + CALL RP5RTC_RDVL + LD (RP5RTC_SS), A + + LD B, REG_1MIN + CALL RP5RTC_RDVL + LD (RP5RTC_MM), A + + LD B, REG_1HR + CALL RP5RTC_RDVL + LD (RP5RTC_HH), A + + LD B, REG_1DAY + CALL RP5RTC_RDVL + LD (RP5RTC_DT), A + + LD B, REG_1MNTH + CALL RP5RTC_RDVL + LD (RP5RTC_MO), A + + LD B, REG_1YEAR + CALL RP5RTC_RDVL + LD (RP5RTC_YR), A + + RET + +; SET MODE +; MODE IN B (MODE_TIMEST, MODE_ALRMST, MODE_RAM0, MODE_RAM1) +RP5RTC_SETMD: + LD A, REG_MODE ; SELECT MODE REGISTER + OUT (RP5RTC_REG), A + + IN A, (RP5RTC_DAT) + AND MD_TIME | MD_ALRM + OR B + OUT (RP5RTC_DAT), A ; ASSIGN MODE + RET + +; ENABLE THE TIME COUNTER +RP5RTC_ENTIME: + LD B, MD_TIME + JP RP5RTC_SETMD + +; READ OUT 2 REGISTERS - 2 NIBBLES TO 1 BYTE +; REGISTER IN B +RP5RTC_RDVL: + LD A, B ; SELECT UNIT REGISTER + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + LD L, A + + INC B + LD A, B ; SELECT TENS REGISTER + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F + RLCA + RLCA + RLCA + RLCA ; MOVE TO TOP NIBBLE + OR L ; MERGE IN LOW NIBBLE + LD H, A ; A = VALUE AS BCD + + RET + +; WRITE OUT 2 REGISTERS - 1 BYTE TO 2 NIBBLES +; REGISTER IN B (B+1) +; VALUE IN A +RP5RTC_WRVL: + LD C, A + LD A, B ; SELECT UNIT REGISTER + OUT (RP5RTC_REG), A + + LD A, C ; WRITE C (ONLY LOW NIBBLE WILL BE USED) + OUT (RP5RTC_DAT), A + + INC B + LD A, B ; SELECT TENS REGISTER + OUT (RP5RTC_REG), A + + LD A, C ; SHIFT TOP NIBBLE TO LOW NIBBLE + RRCA + RRCA + RRCA + RRCA + OUT (RP5RTC_DAT), A ; WRITE IT + + RET +; +; REGISTER EXTRACTED VALUES +; +RP5RTC_BCDBUF: +RP5RTC_YR .DB 20 +RP5RTC_MO .DB 01 +RP5RTC_DT .DB 01 +RP5RTC_HH .DB 00 +RP5RTC_MM .DB 00 +RP5RTC_SS .DB 00 + diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index f31412a2..467d5d9f 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -84,6 +84,7 @@ MM_N8 .EQU 3 ; Z180 CUSTOMIZED FOR N8 MEMORY EXTENSIONS MM_Z180 .EQU 4 ; Z180 NATIVE MEMORY MANAGER MM_Z280 .EQU 5 ; Z280 NATIVE MEMORY MANAGER MM_ZRC .EQU 6 ; ZRC BANK SWITCHING +MM_MBC .EQU 7 ; MBC MEMORY MANAGER ; ; BOOT STYLE ; @@ -199,7 +200,8 @@ AYMODE_MSX .EQU 5 ; RC2014 SOUND MODULE REV6 BY ED BRINDLEY ON Z80/Z180 AT MSX TMSMODE_NONE .EQU 0 TMSMODE_SCG .EQU 1 ; SCG ECB BOARD TMSMODE_N8 .EQU 2 ; N8 BUILT-IN VIDEO -TMSMODE_RC .EQU 3 ; RC2014 BUILT-IN VIDEO +TMSMODE_RC .EQU 3 ; RC2014 TMS9918 VIDEO BOARD +TMSMODE_RCV9958 .EQU 4 ; RC2014 V9958 VIDEO BOARD ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -427,7 +429,7 @@ SYSTIM .SET TM_CTC #IF (TMSENABLE & (INTMODE == 1)) #IF (TMSTIMENABLE) SYSTIM .SET TM_TMS - .ECHO " TMS9918" + .ECHO " TMS9918/V9958" #ENDIF #ENDIF ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 9a97ec8c..09345ed4 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -1,8 +1,9 @@ ;====================================================================== -; N8 VDU DRIVER FOR SBC PROJECT +; TM9918 AND V9958 VDU DRIVER ; ; WRITTEN BY: DOUGLAS GOODALL ; UPDATED BY: WAYNE WARTHEN -- 4/7/2013 +; UPDATED BY: DEAN NETHERTON -- 5/26/2021 - V9958 SUPPORT ;====================================================================== ; ; TODO: @@ -22,7 +23,7 @@ TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT .ECHO "TMS INTERRUPTS ENABLED\n" #ENDIF -#IF (TMSMODE == TMSMODE_RC) +#IF ((TMSMODE == TMSMODE_RC) | (TMSMODE == TMSMODE_RCV9958)) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_PPIA .EQU 0 ; PPI PORT A @@ -58,14 +59,21 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT #ENDIF ; TMS_ROWS .EQU 24 + +#IF (TMSMODE == TMSMODE_RCV9958) +TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA +TMS_COLS .EQU 80 +#ELSE +TMS_FNTVADDR .EQU $0800 ; VRAM ADDRESS OF FONT DATA TMS_COLS .EQU 40 +#ENDIF ; #DEFINE USEFONT8X8 #DEFINE TMS_FONT FONT8X8 ; TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; -; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918 ACCESSES +; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918/V9958 ACCESSES ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; #IF (CPUFAM == CPU_Z180) @@ -73,7 +81,11 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER #DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ -#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S +#IF (TMSMODE == TMSMODE_RCV9958) +#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE) +#ELSE +#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S +#ENDIF #ENDIF ; ;====================================================================== @@ -82,9 +94,9 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; TMS_PREINIT: ; DISABLE INTERRUPT GENERATION - LD A, (TMS_INIT9918_REG_1) + LD A, (TMS_INITVDU_REG_1) RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT - LD (TMS_INIT9918_REG_1), A + LD (TMS_INITVDU_REG_1), A LD C, TMSCTRL1 JP TMS_SET ; @@ -101,7 +113,21 @@ TMS_INIT: LD IY,TMS_IDAT ; POINTER TO INSTANCE DATA ; CALL NEWLINE ; FORMATTING - PRTS("TMS: IO=0x$") + PRTS("TMS: MODE=$") +#IF (TMSMODE == TMSMODE_SCG) + PRTS("SCG$") +#ENDIF +#IF (TMSMODE == TMSMODE_N8) + PRTS("N8$") +#ENDIF +#IF (TMSMODE == TMSMODE_RC) + PRTS("RC$") +#ENDIF +#IF (TMSMODE == TMSMODE_RCV9958) + PRTS("RC_V9958$") +#ENDIF +; + PRTS(" IO=0x$") LD A,TMS_DATREG CALL PRTHEXBYTE CALL TMS_PROBE ; CHECK FOR HW EXISTENCE @@ -118,15 +144,20 @@ TMS_INIT1: CALL TMS_VDARES1 #IF (TMSMODE == TMSMODE_N8) CALL PPK_INIT ; INITIALIZE KEYBOARD DRIVER +#ELSE +#IF MKYENABLE + CALL MKY_INIT #ENDIF +#ENDIF + #IF (INTMODE == 1 & TMSTIMENABLE) ; ADD IM1 INT CALL LIST ENTRY LD HL, TMS_TSTINT ; GET INT VECTOR CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST - LD A, (TMS_INIT9918_REG_1) + LD A, (TMS_INITVDU_REG_1) SET TMSINTEN, A ; SET INTERRUPT ENABLE BIT - LD (TMS_INIT9918_REG_1), A + LD (TMS_INITVDU_REG_1), A LD C, TMSCTRL1 CALL TMS_SET #ENDIF @@ -144,12 +175,6 @@ TMS_INIT1: ; XOR A ; SIGNAL SUCCESS RET - -#IF TMSTIMENABLE - ; DISABLE INTERRUPT -TMS_INT_DIS: - -#ENDIF ; ;====================================================================== ; TMS DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS @@ -172,11 +197,18 @@ TMS_FNTBL: .DW PPK_STAT .DW PPK_FLUSH .DW PPK_READ +#ELSE +#IF MKYENABLE + .DW MKY_STAT + .DW MKY_FLUSH + .DW MKY_READ + #ELSE .DW TMS_STAT .DW TMS_FLUSH .DW TMS_READ #ENDIF +#ENDIF #IF (($ - TMS_FNTBL) != (VDA_FNCNT * 2)) .ECHO "*** INVALID TMS FUNCTION TABLE ***\n" !!!!! @@ -349,11 +381,21 @@ TMS_SET: ; ;---------------------------------------------------------------------- ; SET TMS9918 READ/WRITE ADDRESS -; TMS_WR SETS TMS9918 TO BEGIN WRITING TO ADDRESS SPECIFIED IN HL -; TMS_RD SETS TMS9918 TO BEGIN READING TO ADDRESS SPECIFIED IN HL +; TMS_WR SETS TMS9918 TO BEGIN WRITING AT VDU ADDRESS SPECIFIED IN HL +; TMS_RD SETS TMS9918 TO BEGIN READING AT VDU ADDRESS SPECIFIED IN HL ;---------------------------------------------------------------------- ; TMS_WR: +#IF (TMSMODE == TMSMODE_RCV9958) + ; CLEAR R#14 FOR V9958 + XOR A + OUT (TMS_CMDREG), A + TMS_IODELAY + LD A, $80 | 14 + OUT (TMS_CMDREG), A + TMS_IODELAY +#ENDIF + PUSH HL SET 6,H ; SET WRITE BIT CALL TMS_RD @@ -423,8 +465,8 @@ TMS_CRTINIT1: ; ; INITIALIZE VDU REGISTERS LD C,0 ; START WITH REGISTER 0 - LD B,TMS_INIT9918LEN ; NUMBER OF REGISTERS TO INIT - LD HL,TMS_INIT9918 ; HL = POINTER TO THE DEFAULT VALUES + LD B,TMS_INITVDULEN ; NUMBER OF REGISTERS TO INIT + LD HL,TMS_INITVDU ; HL = POINTER TO THE DEFAULT VALUES TMS_CRTINIT2: LD A,(HL) ; GET VALUE CALL TMS_SET ; WRITE IT @@ -438,8 +480,8 @@ TMS_CRTINIT2: ;---------------------------------------------------------------------- ; TMS_LOADFONT: - ; SET WRITE ADDRESS TO $800 - LD HL,$800 + ; SET WRITE ADDRESS TO TMS_FNTVADDR + LD HL,TMS_FNTVADDR CALL TMS_WR #IF USELZSA2 @@ -458,8 +500,8 @@ TMS_LOADFONT: LD HL,TMS_FONT ; START OF FONT DATA #ENDIF ; - ; FILL $800 BYTES FROM FONTDATA - LD DE,$800 + ; FILL TMS_FNTVADDR BYTES FROM FONTDATA + LD DE,TMS_FNTVADDR TMS_LOADFONT1: LD A,(HL) OUT (TMS_DATREG),A @@ -520,7 +562,7 @@ TMS_SETCUR0: ; MULT BY 8 FOR FONT INDEX SLA L ; SHIFT LSB INTO CARRY RL H ; SHFT MSB FROM CARRY DJNZ TMS_SETCUR0 ; LOOP 3 TIMES - LD DE,$800 ; OFFSET TO START OF FONT TABLE + LD DE,TMS_FNTVADDR ; OFFSET TO START OF FONT TABLE ADD HL,DE ; ADD TO FONT INDEX CALL TMS_RD ; SETUP TO READ GLYPH LD B,8 ; 8 BYTES @@ -533,7 +575,7 @@ TMS_SETCUR1: ; READ GLYPH LOOP DJNZ TMS_SETCUR1 ; LOOP FOR 8 BYTES ; ; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255 - LD HL,$800 + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 + LD HL,TMS_FNTVADDR + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 CALL TMS_WR ; SETUP TO WRITE THE INVERTED GLYPH LD B,8 ; 8 BYTES PER GLYPH LD HL,TMS_BUF ; POINT TO BUFFER @@ -803,6 +845,11 @@ TMS_TSTINT: RET TMS_INTHNDL: + +;#IF MKYENABLE +; CALL MKY_INT +;#ENDIF + CALL HB_TIMINT ; RETURN NZ - HANDLED OR $FF RET @@ -874,24 +921,42 @@ TMS_PORTS: ; 5S Fifth sprite (not displayed) detected. Value in FS* is valid. ; INT Set at each screen update, used for interrupts. ; -TMS_INIT9918: +#IF (TMSMODE == TMSMODE_RCV9958) +TMS_INITVDU: + .DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 +TMS_INITVDU_REG_1: + .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 + .DB $03 ; REG 2 - PATTERN NAME TABLE := 0 + .DB $00 ; REG 3 - NO COLOR TABLE + .DB $02 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $1000) + .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT + .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE + .DB $F0 ; REG 7 - WHITE ON BLACK + + .DB $88 ; REG 8 - COLOUR BUS INPUT, DRAM 64K + .DB $00 ; REG 9 + .DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000) + +#ELSE ; TMS REGISTER SET +TMS_INITVDU: .DB $00 ; REG 0 - NO EXTERNAL VID -TMS_INIT9918_REG_1: +TMS_INITVDU_REG_1: .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 .DB $00 ; REG 2 - PATTERN NAME TABLE := 0 .DB $00 ; REG 3 - NO COLOR TABLE - .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO $800 + .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800) .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE .DB $F0 ; REG 7 - WHITE ON BLACK +#ENDIF ; -TMS_INIT9918LEN .EQU $ - TMS_INIT9918 +TMS_INITVDULEN .EQU $ - TMS_INITVDU ; ; #IF (CPUFAM == CPU_Z180) TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED #ENDIF - +; .ECHO "TMS instance data occupies " .ECHO $ - TMS_IDAT .ECHO " bytes\n" diff --git a/Source/Images/d_bp/u0/UNZIP154.COM b/Source/Images/d_bp/u0/UNZIP154.COM deleted file mode 100644 index f0572630..00000000 Binary files a/Source/Images/d_bp/u0/UNZIP154.COM and /dev/null differ diff --git a/Source/Images/d_bp/u0/UNZIP186.COM b/Source/Images/d_bp/u0/UNZIP186.COM deleted file mode 100644 index c750ff52..00000000 Binary files a/Source/Images/d_bp/u0/UNZIP186.COM and /dev/null differ diff --git a/Source/Images/d_bp/u0/UNZIPZ4.COM b/Source/Images/d_bp/u0/UNZIPZ4.COM index 6b701a70..9da369ff 100644 Binary files a/Source/Images/d_bp/u0/UNZIPZ4.COM and b/Source/Images/d_bp/u0/UNZIPZ4.COM differ diff --git a/Source/Images/d_cpm22/u0/UNZIP154.COM b/Source/Images/d_cpm22/u0/UNZIP154.COM deleted file mode 100644 index f0572630..00000000 Binary files a/Source/Images/d_cpm22/u0/UNZIP154.COM and /dev/null differ diff --git a/Source/Images/d_cpm22/u0/UNZIP186.COM b/Source/Images/d_cpm22/u0/UNZIP186.COM deleted file mode 100644 index c750ff52..00000000 Binary files a/Source/Images/d_cpm22/u0/UNZIP186.COM and /dev/null differ diff --git a/Source/Images/d_cpm22/u0/UNZIPZ4.COM b/Source/Images/d_cpm22/u0/UNZIPZ4.COM index 6b701a70..9da369ff 100644 Binary files a/Source/Images/d_cpm22/u0/UNZIPZ4.COM and b/Source/Images/d_cpm22/u0/UNZIPZ4.COM differ diff --git a/Source/Images/d_zsdos/u0/UNZIP154.COM b/Source/Images/d_zsdos/u0/UNZIP154.COM deleted file mode 100644 index f0572630..00000000 Binary files a/Source/Images/d_zsdos/u0/UNZIP154.COM and /dev/null differ diff --git a/Source/Images/d_zsdos/u0/UNZIP186.COM b/Source/Images/d_zsdos/u0/UNZIP186.COM deleted file mode 100644 index c750ff52..00000000 Binary files a/Source/Images/d_zsdos/u0/UNZIP186.COM and /dev/null differ diff --git a/Source/Images/d_zsdos/u0/UNZIPZ4.COM b/Source/Images/d_zsdos/u0/UNZIPZ4.COM index 6b701a70..9da369ff 100644 Binary files a/Source/Images/d_zsdos/u0/UNZIPZ4.COM and b/Source/Images/d_zsdos/u0/UNZIPZ4.COM differ diff --git a/Source/ZCPR-DJ/Build.cmd b/Source/ZCPR-DJ/Build.cmd index b9842ca4..b07546ee 100644 --- a/Source/ZCPR-DJ/Build.cmd +++ b/Source/ZCPR-DJ/Build.cmd @@ -11,5 +11,5 @@ set ZXBINDIR=%TOOLS%/cpm/bin/ set ZXLIBDIR=%TOOLS%/cpm/lib/ set ZXINCDIR=%TOOLS%/cpm/include/ -zx M80 -=zcpr +zx M80 -=zcpr/l zx L80 -zcpr,zcpr.bin/n/e \ No newline at end of file diff --git a/Source/ZCPR-DJ/Clean.cmd b/Source/ZCPR-DJ/Clean.cmd index 53fa501a..9a57c248 100644 --- a/Source/ZCPR-DJ/Clean.cmd +++ b/Source/ZCPR-DJ/Clean.cmd @@ -4,3 +4,4 @@ setlocal if exist *.bin del *.bin if exist *.lst del *.lst if exist *.rel del *.rel +if exist *.prn del *.prn diff --git a/Source/ZCPR-DJ/zcpr.mac b/Source/ZCPR-DJ/zcpr.mac index 11709ab6..04b54040 100644 --- a/Source/ZCPR-DJ/zcpr.mac +++ b/Source/ZCPR-DJ/zcpr.mac @@ -1,6 +1,8 @@ - TITLE ZCPR Console Command Processor - Version D&J - SUBTTL Last Modified: 5 March 1994 +; DATE 05/17/21 08:34:00 ; +; TITLE ZCPR Console Command Processor - Version D&J +; SUBTTL Last Modified: 10 August 1997 + ; CP/M Z80 Command Processor Replacement (CPR) Version 1.0 ; CCPZ CREATED AND CUSTOMIZED FOR ARIES-II BY RLC ; FURTHER MODIFIED BY RGF AS V2.0 @@ -66,6 +68,13 @@ ; ; Added PEEK 30 August 1993. ; +; Added CLS 10 August 1997 and fixed two bugs. One caused the system to +; hang if the command to log into another drive was given while logged +; into a drive from which the disk had been removed. The other caused +; a warm boot to return to the prior user area if the new user number +; had been selected using the USER command (although not if the user area +; had been changed using the du: command). +; ;******** Structure Notes ******** ; ; This CPR is divided into a number of major sections. The following @@ -86,39 +95,40 @@ ; ; 3 Utilities ; CRLF PRINTC PRINT PRINTS BELL -; CONOUT BREAK CHKETX ABORT READF -; READ WRITE DEFDMA DMASET SEARF -; SEARDE SEARN OPENF OPEN CLOSE -; CREATE BDOSFN SUBKIL DELETE TLOGIN -; DLOGIN LOGIN NEWUSR RSTUSR SETUSR -; BDOSEA BDOSJP BDOSBC BDOSDE +; CLS CONOUT BREAK CHKETX ABORT +; READF READ WRITE DEFDMA DMASET +; SEARF SEARDE SEARN OPENF OPEN +; CLOSE CREATE BDOSFN SUBKIL DELETE +; TLOGIN DLOGIN LOGIN NEWUSR RSTUSR +; SETUSR BDOSEA BDOSJP BDOSBC BDOSDE ; ; 4 CPR Utilities ; PROMPT REDBUF CNVBUF UCASE SDELM ; ADVAN SBLANK ADDAH NUMBER A2NUM ; HEXNUM USRNUM ERROR DIRPTR ULOGIN -; SCANER SCANT SCANF CMDSER SETUDB +; SCANER SCANT SCANF CMDSER ; ; 5 CPR-Resident Commands and Functions ; 5A DIR DIRPR PRFN ; 5B ERA ; 5C ERAQ PRNNF ; 5D SAK REPLY -; 5E BELL -; 5F LIST -; 5G TYPE PAGER -; 5H EJECT -; 5I SAVE -; 5J REN -; 5K USER SUSER -; 5L DFU -; 5M SCL -; 5N PEEK -; 5O POKE -; 5P JUMP -; 5Q COM -; 5R GO CLLPRG ERRLOG ERRJMP -; 5S GET MEMLD PRNLE +; 5E CLS +; 5F BELL +; 5G LIST +; 5H TYPE PAGER +; 5I EJECT +; 5J SAVE +; 5K REN +; 5L USER SUSER +; 5M DFU +; 5N SCL +; 5O PEEK +; 5P POKE +; 5Q JUMP +; 5R COM UPDATE +; 5S GO CLLPRG ERRLOG ERRJMP +; 5T GET MEMLD PRNLE ; BIOS BOOT ; ; @@ -148,8 +158,8 @@ REL EQU FALSE ;SET TO TRUE FOR MOVCPM INTEGRATION ;LEAVE ALL FALSE FOR SYSGEN IMAGE ; BASE EQU 0 ;BASE OF CP/M SYSTEM -;P2DOS EQU 0E400H ;BASE OF BDOS/P2DOS -P2DOS EQU 0D800H ;BASE OF BDOS/P2DOS +;P2DOS EQU 0E400H ;BASE OF BDOS/P2DOS (original) +P2DOS EQU 0D800H ;BASE OF BDOS/P2DOS (Retro-Brew) ZCPRSZ EQU 00800H ;SIZE OF ZCPR P2DOSSZ EQU 00E00H ;SIZE OF P2DOS BIOS EQU P2DOS+P2DOSSZ ;BASE OF BIOS @@ -244,7 +254,7 @@ SOFLG EQU 'S' ;LIST $SYS ONLY ; ; List and Type command customization equates ; -NLINES EQU 20 ;NUMBER OF LINES ON CRT PAGE +NLINES EQU 22 ;NUMBER OF LINES ON CRT PAGE NLINEP EQU 60 ;NUMBER OF LINES ON LIST DEVICE FFKILL EQU TRUE ;TRUE SUPPRESSES FF UNTIL FIRST CHARACTER PGDFLG EQU 'P' ;TYPE AND LIST COMMAND DEFAULT TOGGLE @@ -255,14 +265,17 @@ NOSTAT EQU FALSE ;SET TO TRUE IF BIOS LISTST NOT IMPLEMENTED BUFLEN EQU 80 ;SIZE OF COMMAND INPUT BUFFER MAXUSR EQU 15 ;MAXIMUM USER NUMBER ACCESSIBLE DEFUSR EQU 0 ;DEFAULT USER NUMBER FOR COM FILES +DEFDRV EQU 'A' ;DEFAULT DRIVE FOR COM FILES SPRMPT EQU '$' ;CPR PROMPT INDICATING SUBMIT COMMAND -COMCHR EQU ';' ;BEGIN COMMENT CHARACTER +COMCHR EQU '%' ;BEGIN COMMENT CHARACTER CMDCHR EQU ';' ;BEGIN NEXT COMMAND CHARACTER NUMBASE EQU 'H' ;CHARACTER USED TO SPECIFY HEXIDECIMAL BASE RECFLG EQU 'R' ;CHARACTER FOR SAVE COMMAND TO SAVE RECORDS SUPRES EQU TRUE ;TRUE TO SUPPRESS USER NUMBER FOR USER 0 MULTPL EQU TRUE ;TRUE TO ALLOW MULTIPLE COMMANDS ON ONE LINE REBOOT EQU TRUE ;TRUE TO INCLUDE BOOT COMMAND +CLSCHR EQU 1AH ;CHARACTER TO CLEAR TERMINAL SCREEN +ESC EQU 1BH ;VT100 LEAD-IN CHAR. (FOR 'CLS') ; IF TEST CPRMPT EQU '<' ;CPR PROMPT INDICATING TEST MODE @@ -300,7 +313,7 @@ TPA EQU BASE+0100H ;BASE OF TPA IF COMLD OR TEST LD HL,BGNXFR LD DE,CPRLOC - LD BC,ENDLD-CPRLOC + LD BC,ENDLD-BGNXFR LDIR LD BC,(UDFLAG) JP CPRLOC @@ -369,15 +382,26 @@ ENTRY: ; warm boot reloads ZCPR and destroys the contents of the command buffer. ; The multiple command feature may be turned off with the SCL command. ; -MBUFF: DEFB BUFLEN ;MAXIMUM BUFFER LENGTH +;MBUFF: DEFB BUFLEN ;MAXIMUM BUFFER LENGTH +MBUFF: DEFB BUFEND-CIBUFF ;MAXIMUM BUFFER LENGTH CBUFF: DEFB 0 ;NUMBER OF CHARACTERS IN COMMAND LINE -CIBUFF: DEFB ' ' ;DEFAULT (COLD BOOT) COMMAND - DEFB 0 ;COMMAND STRING TERMINATOR - DEFB ' ZCPR-D&J of 5 March 1994 ' - DEFB 0 ;TERMINATOR FOR DUMP IDENTIFICATION - DEFS BUFLEN-($-CIBUFF)+1 - DEFW 0 ;SENTINEL FOR STACK END - DEFS 24 ;STACK AREA +CIBUFF: DB ' ' ;DEFAULT (COLD BOOT) COMMAND 13 + DEFB 0 ;COMMAND STRING TERMINATOR 14 + DEFB ' ZCPR-D&J of 17 May 2021 ' ;44 + DEFB 0 ;TERMINATOR FOR DUMP IDENTIFICATION 45 +; DEFS BUFLEN-($-CIBUFF)+1 + db 0,0,0,0,0,0,0,0 ;53 + db 0,0,0,0,0,0,0,0 ;61 + db 0,0,0,0,0,0,0,0 ;69 + db 0,0,0,0,0,0,0,0 ;77 + db 0,0,0,0,0,0,0,0 ;85 + db 0,0,0,0,0,0,0,0 ;93 + db 0,0,0,0,0,0,0,0 ;101 + db 0,0,0,0,0,0,0,0 ;109 +BUFEND EQU $ +; DEFW 0 ;SENTINEL FOR STACK END + db 0,0 +; DEFS 24 ;STACK AREA STACK EQU $ ;TOP OF STACK ; ; SUBMIT FILE CONTROL BLOCK @@ -394,22 +418,23 @@ SUBCR EQU SUBDN+32 ;CURRENT RECORD NUMBER ; ; COMMAND FILE CONTROL BLOCK ; -FCBDN: DEFS 1 ;DISK DRIVE -FCBFN: DEFS 8 ;FILE NAME -FCBFT: DEFS 3 ;FILE TYPE -FCBEX: DEFS 1 ;EXTENT NUMBER -FCBS1: DEFS 1 ;S1 -FCBS2: DEFS 1 ;S2 -FCBRC: DEFS 1 ;RECORD COUNT -FCBDM: DEFS 16 ;DISK GROUP MAP +FCBDN: db 0 ;DISK DRIVE +FCBFN: db 0,0,0,0,0,0,0,0 ;FILE NAME +FCBFT: db 0,0,0 ;FILE TYPE +FCBEX: db 0 ;EXTENT NUMBER +FCBS1: db 0 ;S1 +FCBS2: db 0 ;S2 +FCBRC: db 0 ;RECORD COUNT +FCBDM: db 0,0,0,0,0,0,0,0 ;DISK GROUP MAP + db 0,0,0,0,0,0,0,0 FCBCR: DEFS 1 ;CURRENT RECORD NUMBER ; ; Type and List Variables ; -CHRCNT: DEFS 1 ;CHARACTER COUNT FOR TYPE AND LIST -LNCNT: DEFS 1 ;LINE COUNT FOR TYPE AND LIST -TYPLST: DEFS 1 ;FLAG FOR TYPE OR LIST -TABCNT: DEFS 1 ;TAB COUNT FOR TYPE AND LIST +CHRCNT: db 0 ;CHARACTER COUNT FOR TYPE AND LIST +LNCNT: db 0 ;LINE COUNT FOR TYPE AND LIST +TYPLST: db 0 ;FLAG FOR TYPE OR LIST +TABCNT: db 0 ;TAB COUNT FOR TYPE AND LIST SYSTST: DEFB 0 ;LIST SYSTEM FILES IN DIRECTORY FLAG ; ; General Variables @@ -417,7 +442,7 @@ SYSTST: DEFB 0 ;LIST SYSTEM FILES IN DIRECTORY FLAG CIBPTR: DEFW CIBUFF ;POINTER TO COMMAND INPUT BUFFER CIPTR: DEFW CIBUFF ;POINTER TO CURRENT CMD FOR ERROR REPORTING TMPUSR: DEFB 0 ;TEMPORARY USER NUMBER -TDRIVE: DEFB 0 ;DEFAULT DRIVE +TDRIVE: DEFB 0 ;TEMPORARY DRIVE DFUSR: DEFB DEFUSR ;DEFAULT USER LDADR: DEFW TPA ;MEMORY LOAD ADDRESS ; @@ -435,11 +460,13 @@ CMDTBL: DEFW USER DC 'DFU' DEFW DFU - DC 'PAGE' + DC 'FF' ; was 'PAGE' DEFW EJECT DC 'BELL' DEFW RING - DC 'SAK' + DC 'CLS' + DEFW CLS + DC 'WAIT' ; was 'SAK' ("strike any key") DEFW SAK DC 'GO' DEFW GO @@ -459,7 +486,7 @@ CMDTBL: DEFW PEEK DC 'POKE' DEFW POKE -NCMNDS DEFL 17 ;NUMBER OF COMMANDS +NCMNDS DEFL 18 ;NUMBER OF COMMANDS ; IF MULTPL DC 'SCL' @@ -516,14 +543,11 @@ RS3: JR Z,RESTRT ;YES, SKIP REST OF LINE CALL SCANER ;PARSE COMMAND NAME FROM COMMAND LINE JR NZ,RS4 ;ERROR IF NAME CONTAINS A "?" - CALL DEFDMA ;SET TBUFF TO DMA ADDRESS - CALL DLOGIN ;ASSURE PROPER DRIVE - CALL RSTUSR ;ASSURE PROPER USER NUMBER - CALL SETUDB ;SET UD BYTE TO MATCH USER/DRIVE - CALL CMDSER ;SCAN FOR CPR-RESIDENT COMMAND + CALL CMDSER ;SCAN FOR COMMAND ; ; ENTRY POINT FOR CONTINUED SCAN OF COMMAND LINE ; + CALL UPDATE ;UPDATE BDOS/SYSTEM PARAMETERS CALL ADVAN ;GET ANY CHARACTER JR Z,RESTRT ;NONE, END OF LINE LD (CIPTR),DE ;UPDATE START OF LINE IN CASE ERROR @@ -1024,7 +1048,7 @@ SCAN4: LD (HL),B ;SAVE DRIVE LD B,8 ;MAX OF 8 CHARACTERS XOR A ;CLEAR '?' COUNT - EX AF,AF ;AND SAVE + EX AF,AF' ;AND SAVE CALL SCANF ;GET POSSIBLE NAME CALL SCANT ;AND POSSIBLE TYPE ; @@ -1044,7 +1068,7 @@ SCAN4: ; SCAN COMPLETE -- DE POINTS TO DELIMITER BYTE AFTER TOKEN ; LD (CIBPTR),DE - EX AF,AF ;GET NUMBER OF '?' IN FILENAME.TYP + EX AF,AF' ;GET NUMBER OF '?' IN FILENAME.TYP RET ; ; EXTRACT FILE TYPE FROM POSSIBLE FILENAME.TYP @@ -1069,9 +1093,9 @@ SCAN12: SCAN13: CP '?' ;QUESTION MARK? JR NZ,SCAN14 ;NO, JUST STORE CHARACTER - EX AF,AF ;GET QUESTION MARK COUNT + EX AF,AF' ;GET QUESTION MARK COUNT INC A ;COUNT IT - EX AF,AF ;AND SAVE COUNT + EX AF,AF' ;AND SAVE COUNT SCAN14: INC DE ;POINT TO NEXT CHARACTER IN COMMAND LINE LD (HL),A ;STORE CHARACTER IN FCBDN @@ -1097,15 +1121,6 @@ CMDSER: LD A,(HL) ;LOOK FOR DRIVE SPEC DEC A ;ADJUST FOR LOG IN CALL P,TLOGIN ;LOG IN DRIVE -SETUDB: - LD A,(TMPUSR) ;GET CURRENT USER NUMBER - ADD A,A ;PLACE IT IN HIGH NIBBLE - ADD A,A - ADD A,A - ADD A,A - LD HL,TDRIVE ;ADD DEFAULT DRIVE NUMBER (LOW NIBBLE) - OR (HL) - LD (UDFLAG),A ;UPDATE USER/DRIVE BYTE RET CMS0: OR (HL) ;DRIVE OR USER NUMBER @@ -1125,11 +1140,10 @@ CMS2: LD A,(DE) ;NEXT CHARACTER IN INPUT COMMAND MUST BE CP ' ' JR NZ,CMS4 - LD A,(HL) ;FOUND COMMAND, + LD E,(HL) ;FOUND COMMAND, INC HL ;LOAD ADDRESS, - LD H,(HL) ;AND - LD L,A ;JUMP TO IT - JP (HL) ;COMMAND IS CPR-RESIDENT + LD D,(HL) ;AND + JR CMS6 ;UPDATE SYSTEM DATA AND EXECUTE CMS3: BIT 7,(HL) ;END OF TABLE ENTRY? INC HL @@ -1139,7 +1153,10 @@ CMS4: INC HL DJNZ CMS1 ;NOT TO END OF TABLE YET CMS5: - JP COM ;COMMAND MAY BE DISK-RESIDENT + LD DE,COM ;LOAD DESTINATION AND UPDATE +CMS6: + PUSH DE ;PLACE ROUTINE ADDRESS ON STACK + JP UPDATE ;UPDATE SYSTEM DATA AND EXECUTE ; ;**** Section 5 **** ; CPR-Resident Commands @@ -1411,6 +1428,21 @@ REPL2: RET ; ;Section 5E +;Command: CLS +;Function: To clear screen. +;Forms: +; CLS +; +CLS: +; LD A,CLSCHR ; Load clear screen character +; DEFB 21H ; and skip next instruction + ; If a multi-character string is + ; required to clear screen use: + CALL PRINT + DB ESC,'[2','J'+128 + RET +; +;Section 5F ;Command: BELL ;Function: To ring terminal bell. ;Forms: @@ -1420,7 +1452,7 @@ RING: LD A,BELL ; load bell into A JP CONOUT ; and output it ; -;Section 5F +;Section 5G ;Command: LIST ;Function: To print specified file on list device. ;Forms: @@ -1437,7 +1469,7 @@ LIST: ; JR TYPE1 ; -;Section 5G +;Section 5H ;Command: TYPE ;Function: To display specified file on console. ;Forms: @@ -1560,8 +1592,8 @@ PAGER: PAGE2: JP BDOSJP ; return via bdos ; -;Section 5H -;Command: PAGE +;Section 5I +;Command: FF (was PAGE) ;Function: To eject a page on list device via a form feed. ;Forms: ; PAGE @@ -1579,7 +1611,7 @@ EJECT: LD C,05H ; list output JP BDOS ; output character and return via bdos ; -;Section 5I +;Section 5J ;Command: SAVE ;Function: To save the contents of TPA onto disk as a file. Number of ; pages or records is in decimal. Saved area begins at 100H. @@ -1628,7 +1660,7 @@ SAVE3: SAVE4: JP PRNLE ;PRINT 'NO SPACE' ERROR ; -;Section 5J +;Section 5K ;Command: REN ;Function: To change the name of an existing file. ;Forms: @@ -1670,7 +1702,7 @@ NAMERR: REN2: JP ABORT ; -;Section 5K +;Section 5L ;Command: USER ;Function: To change current user number; new user number is in decimal. ;Forms: @@ -1680,7 +1712,7 @@ USER: CALL USRNUM ;EXTRACT USER NUMBER FROM COMMAND LINE JP NEWUSR ;SET NEW USER NUMBER ; -;Section 5L +;Section 5M ;Command: DFU ;Function: To set the Default User Number for the command/file scanner; new ; default user number is in decimal. @@ -1692,7 +1724,7 @@ DFU: LD (DFUSR),A ;PUT IT AWAY RET ; -;Section 5M +;Section 5N ;Command: SCL ;Function: To force ZCPR to parse only a single command per line; reset ; to multiple command format at the next ^C. @@ -1709,7 +1741,7 @@ SINGLE: ENDIF ; ; -;Section 5N +;Section 5O ;Command: PEEK ;Function: To display hex values beginning at a specified address. ;Forms: @@ -1756,7 +1788,7 @@ PRHEX: JP CONOUT ; go display value ; ; -;Section 5O +;Section 5P ;Command: POKE ;Function: To poke a string of hex values into a set of consecutive addresses. ;Forms: @@ -1777,7 +1809,7 @@ POKE1: JR POKE1 ; go for more ; ; -;Section 5P +;Section 5Q ;Command: JUMP ;Function: To call the program (subroutine) at the specified address ; without loading from disk. @@ -1788,7 +1820,7 @@ JUMP: CALL HEXNUM ;GET LOAD ADDRESS IN HL JR CLLPRG ;PERFORM CALL ; -;Section 5Q +;Section 5R ;Command: COM file processing ;Function: To load the specified COM file from disk and execute it. ;Forms: @@ -1808,7 +1840,7 @@ COM: CALL MEMLD ;LOAD MEMORY WITH FILE SPECIFIED ;(NO RETURN IF ERROR OR TOO BIG) ; -;Section 5R +;Section 5S ;Command: GO ;Function: To call the program in the TPA without loading from disk. ; Same as JUMP 100H, but more convenient, especially when @@ -1869,14 +1901,24 @@ COM3: ; RUN LOADED TRANSIENT PROGRAM ; CALL CRLF ;NEW LINE - CALL DEFDMA ;SET DMA TO 0080 - CALL RSTUSR ;RESET TO PROPER USER NUMBER +UPDATE: + CALL DEFDMA ;SET DMA TO DEFAULT VALUE + CALL DLOGIN ;ASSURE PROPER DRIVE + CALL RSTUSR ;ASSURE PROPER USER NUMBER + LD A,E ;GET CURRENT USER NUMBER + ADD A,A ;PLACE IT IN HIGH NIBBLE + ADD A,A + ADD A,A + ADD A,A + LD HL,TDRIVE ;ADD DEFAULT DRIVE NUMBER (LOW NIBBLE) + OR (HL) + LD (UDFLAG),A ;UPDATE USER/DRIVE BYTE ; -; EXECUTION (CALL) OF PROGRAM (SUBROUTINE) OCCURS HERE +; EXECUTION (CALL) OF PROGRAM/SUBROUTINE/COMMAND OCCURS HERE ; RET ;CALL TRANSIENT ; -;Section 5S +;Section 5T ;Command: GET ;Function: To load the specified file from disk to the specified address ;Forms: @@ -1897,9 +1939,9 @@ MEMLD: LD (LDADR),HL ;SET LOAD ADDRESS ; ; MLA is a reentry point for a non-standard CP/M Modification -; This is the return point when the .COM (or GET) file is not found the -; first time, the Default User is selected for the second attempt -; and Drive A is selected for the final attempt. +; This is the return point when the .COM (or GET) file was not found +; so the Default Drive & User are selected for the final attempt +; to find the file. ; MLA: CALL ULOGIN ;LOG ANY USER @@ -1907,29 +1949,22 @@ MLA: CALL OPENF ;OPEN COMMAND.COM FILE JR NZ,MLA1 ;FILE FOUND - LOAD IT ; -; FILE NOT FOUND - SELECT DEFAULT USER +; FILE NOT FOUND - SELECT DEFAULT COM USER ; - LD A,L ;GET FCB USER - AND A ;DEFAULT USER? - JR NZ,MLA0 ;NO - LD HL,TMPUSR ;CURRENT USER SAME AS DEFAULT? LD A,(DFUSR) ;GET DEFAULT USER - CP (HL) SET 7,A ;MAKE INTO VALID USER NUMBER LD (FCBS1),A ;PUT USER INTO FCB - JR NZ,MLA ;AND TRY AGAIN ; -; FILE NOT FOUND - SELECT DRIVE A IF DEFAULT WAS SOME OTHER DRIVE +; AND SELECT DEFAULT COM DRIVE. IF DEFAULT COM DRIVE ALREADY +; SELECTED, GIVE UP AND PRINT ERROR MESSAGE ; MLA0: - LD A,(TDRIVE) ;DRIVE A DEFAULT? - AND A + LD A,DEFDRV-'@' ;A<= DEFAULT COM DRIVE + LD HL,FCBDN ;POINT TO DRIVE IN FCB + CP (HL) ;THE SAME? JR Z,MLA3 ;YES, ERROR - XOR A - LD HL,FCBDN ;POINT AT DRIVE IN FCB - OR (HL) ;DRIVE ALREADY SPECIFIED? - LD (HL),1 ;SELECT DRIVE A - JR Z,MLA ;NO, GO GIVE IT A TRY + LD (HL),A ;PUT DEFAULT COM DRIVE IN FCB + JR MLA ;GO GIVE IT A TRY MLA3: CALL PRNNF ;CAN'T FIND FILE JR PRNLE1 @@ -1962,6 +1997,7 @@ PRNLE1: IF (($-ENTRY) GT ZCPRSZ) *ZCPR too large!!* ENDIF + .DEPHASE ; IF TEST LISTST: @@ -1978,4 +2014,4 @@ ENDLD EQU $ END - PUSH HL ;SAVE POI \ No newline at end of file + \ No newline at end of file diff --git a/Source/ver.inc b/Source/ver.inc index a6c0fe1e..7094aff8 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.77" +#DEFINE BIOSVER "3.1.1-pre.83" diff --git a/Source/ver.lib b/Source/ver.lib index e259b3c2..245126b1 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.77" + db "3.1.1-pre.83" endm