From 585c892a54a71f216ed147d39f1c5c3636b83093 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 7 Apr 2024 18:56:39 -0700 Subject: [PATCH 01/20] Add Genesis Platform ID (STDZ180) --- Source/HBIOS/hbios.inc | 1 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index cb573649..64d793a3 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -156,6 +156,7 @@ PLT_DUO .EQU 17 ; DUODYNE Z80 SYSTEM PLT_HEATH .EQU 18 ; HEATHKIT H8 Z80 SYSTEM PLT_EPITX .EQU 19 ; Z180 MINI-ITX PLT_MON .EQU 20 ; MONSPUTER +PLT_STDZ180 .EQU 21 ; GENESIS Z180 SYSTEM ; ; HBIOS GLOBAL ERROR RETURN VALUES ; diff --git a/Source/ver.inc b/Source/ver.inc index 1a73d142..aa9bde05 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.25" +#DEFINE BIOSVER "3.5.0-dev.26" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index e5411f12..b4504981 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.25" + db "3.5.0-dev.26" endm From 8c4a3d2b3dbed4c94a56127bf1724b8702b3359e Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 12 Apr 2024 17:04:36 -0700 Subject: [PATCH 02/20] Final Video Hardware Reset Changes - Modified TMS driver to always imbed an uncompressed font. This is because I have found no reasonable way to decompress a font while an OS is still active without mangling some of the OSes RAM. --- Source/HBIOS/Config/DUO_std.asm | 5 +++-- Source/HBIOS/cfg_duo.asm | 2 +- Source/HBIOS/hbios.asm | 12 ++++++++++-- Source/HBIOS/tms.asm | 17 ++++++++++------- Source/HBIOS/vga.asm | 4 ++-- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 7 files changed, 28 insertions(+), 16 deletions(-) diff --git a/Source/HBIOS/Config/DUO_std.asm b/Source/HBIOS/Config/DUO_std.asm index 855735ea..be2621d3 100644 --- a/Source/HBIOS/Config/DUO_std.asm +++ b/Source/HBIOS/Config/DUO_std.asm @@ -38,10 +38,11 @@ BATCOND .SET TRUE ; ENABLE LOW BATTERY WARNING MESSAGE ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ; -PCFENABLE .SET TRUE ; ENABLE PCF8584 I2C CONTROLLER +PCFENABLE .SET FALSE ; ENABLE PCF8584 I2C CONTROLLER ; MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM ; UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 ; -ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +CHENABLE .SET TRUE ; CH: ENABLE CH375/376 USB SUPPORT +ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 4decaa5c..3ec2732d 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -237,7 +237,7 @@ SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE SDMTSWAP .EQU TRUE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 ; -CHENABLE .EQU TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 4dee78c9..93b6ec05 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -6544,7 +6544,10 @@ ORG_FONTS .EQU $ ; #IFDEF USEFONT8X8 FONT8X8: - #IF USELZSA2 +; +; FOR NOW, WE NEVER COMPRESS THE 8X8 FONT. SEE TMS DRIVER. +; + #IF USELZSA2 & FALSE #INCLUDE "font8x8c.asm" #ELSE #INCLUDE "font8x8u.asm" @@ -8044,7 +8047,7 @@ SLACK .EQU BNKTOP - $ ; ; DIAGNOSE HBIOS BANK OVERFLOW ; -#IF (SLACK<0) +#IF (SLACK < 0) .ECHO "*** ERROR: HBIOS too big!!!\n" !!! ; FORCE AN ASSEMBLY ERROR #ENDIF @@ -8059,6 +8062,11 @@ SLACK .EQU BNKTOP - $ !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; +;;;#IF (SLACK < (1024 * 3)) +;;; .ECHO "*** ERROR: Low HEAP space!!!\n" +;;; !!! ; FORCE AN ASSEMBLY ERROR +;;;#ENDIF +; #IFDEF ROMBOOT #IF (ROMSIZE > 0) .FILL SLACK diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index d0efcf93..5477a104 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -352,15 +352,11 @@ TMS_VDARES: CALL TMS_Z180IO #ENDIF CALL TMS_CRTINIT1A -#IF (!USELZSA2) - ; WE WANT TO RELOAD THE FONT ON RESET, BUT THIS IS NOT CURRENTLY - ; POSSIBLE WHEN FONT COMPRESSION IS IN USE. CALL TMS_CLRCUR ; CLEAR CURSOR CALL TMS_LOADFONT ; RELOAD FONT LD A,$FF ; REMOVE LD (TMS_CURSAV),A ; ... SAVED CURSOR CHAR CALL TMS_SETCUR ; RESTORE CURSOR -#ENDIF XOR A RET @@ -672,8 +668,15 @@ TMS_LOADFONT: ; SET WRITE ADDRESS TO TMS_FNTVADDR LD HL,TMS_FNTVADDR CALL TMS_WR - -#IF USELZSA2 +; +; THE USE OF COMPRESSED FONT STORAGE FOR THE TMS DRIVER IS DISABLED +; SO THAT WE CAN RELOAD THE FONT DATA ON USER RESET. THE TMS CHIP +; IS FREQUENTLY REPROGRAMMED BY GAMES, ETC., SO IT IS NECESSARY TO +; REINIT AND RELOAD FONTS. RELOADING A COMPRESSED FONT AFTER +; SYSTEM INITIALIZATION REQUIRES A LARGE DECOMPRESSION BUFFER THAT WE +; HAVE NO WAY TO ACCOMMODATE WITHOUT TRASHING OS/APP MEMORY. +; +#IF USELZSA2 & FALSE LD (TMS_STACK),SP ; SAVE STACK LD HL,(TMS_STACK) ; AND SHIFT IT LD DE,$2000 ; DOWN 4KB TO @@ -701,7 +704,7 @@ TMS_LOADFONT1: OR E JR NZ,TMS_LOADFONT1 ; -#IF USELZSA2 +#IF USELZSA2 & FALSE LD HL,(TMS_STACK) ; ERASE DECOMPRESS BUFFER LD SP,HL ; BY RESTORING THE STACK RET ; DONE diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index cbe7f6fe..b58da631 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -546,7 +546,7 @@ VGA_LOADFONT: LD HL,$7000 | VGA_89BIT ; CLEAR FONT PAGE NUM CALL VGA_SETCFG -#IF USELZSA2 +#IF USELZSA2 & (VGASIZ != V80X60) LD (VGA_STACK),SP ; SAVE STACK LD HL,(VGA_STACK) ; AND SHIFT IT LD DE,$2000 ; DOWN 4KB TO @@ -583,7 +583,7 @@ VGA_LOADFONT2: LD HL,$7070 | VGA_89BIT ; SET FONT PAGE NUM TO 7 CALL VGA_SETCFG -#IF USELZSA2 +#IF USELZSA2 & (VGASIZ != V80X60) LD HL,(VGA_STACK) ; ERASE DECOMPRESS BUFFER LD SP,HL ; BY RESTORING THE STACK RET ; DONE diff --git a/Source/ver.inc b/Source/ver.inc index aa9bde05..e5d42087 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.26" +#DEFINE BIOSVER "3.5.0-dev.27" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index b4504981..6aa41d89 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.26" + db "3.5.0-dev.27" endm From 438df9a80b29def81a0384dbbc2475b5c7f2082f Mon Sep 17 00:00:00 2001 From: Les Bird Date: Mon, 15 Apr 2024 20:21:09 -0600 Subject: [PATCH 03/20] NABU Personal Computer integration - nabu.asm and nabukb.asm contain code to support the NABU hardware. --- Source/HBIOS/Build.ps1 | 2 +- Source/HBIOS/Config/NABU_std.asm | 29 +++ Source/HBIOS/ay38910.asm | 7 + Source/HBIOS/cfg_nabu.asm | 338 +++++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 30 +++ Source/HBIOS/hbios.inc | 1 + Source/HBIOS/nabu.asm | 44 ++++ Source/HBIOS/nabukb.asm | 86 ++++++++ Source/HBIOS/tms.asm | 14 ++ Source/HBIOS/uart.asm | 10 + 10 files changed, 560 insertions(+), 1 deletion(-) create mode 100644 Source/HBIOS/Config/NABU_std.asm create mode 100644 Source/HBIOS/cfg_nabu.asm create mode 100644 Source/HBIOS/nabu.asm create mode 100644 Source/HBIOS/nabukb.asm diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index 41ac2de1..ec8bf51d 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -27,7 +27,7 @@ $ErrorAction = 'Stop' # UNA BIOS is simply imbedded, it is not built here. # -$PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "Z80RETRO", "DUO", "UNA", "HEATH", "MON" +$PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "Z80RETRO", "DUO", "UNA", "HEATH", "MON", "NABU" $PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH", "S100", "EPITX" $PlatformListZ280 = "RCZ280" diff --git a/Source/HBIOS/Config/NABU_std.asm b/Source/HBIOS/Config/NABU_std.asm new file mode 100644 index 00000000..f2bba624 --- /dev/null +++ b/Source/HBIOS/Config/NABU_std.asm @@ -0,0 +1,29 @@ +; +;================================================================================================== +; RCBUS Z80 STANDARD 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 BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_nabu.asm" +; +CPUOSC .SET 3580000 ; CPU OSC FREQ IN MHZ diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index cc8fac44..01ab9c80 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -54,10 +54,17 @@ AY_RIN .EQU AY_RSEL+AY_RCSND #ENDIF ; #IF (AYMODE == AYMODE_MSX) + #IF (PLATFORM == PLT_NABU) +AY_RSEL .EQU $40 +AY_RDAT .EQU $41 +AY_RIN .EQU AY_RSEL + .ECHO "NABU" + #ELSE AY_RSEL .EQU $A0 AY_RDAT .EQU $A1 AY_RIN .EQU $A2 .ECHO "MSX" + #ENDIF #ENDIF ; #IF (AYMODE == AYMODE_LINC) diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm new file mode 100644 index 00000000..3fe1500a --- /dev/null +++ b/Source/HBIOS/cfg_nabu.asm @@ -0,0 +1,338 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR RCBUS Z80 +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "RCBus", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_NABU ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU FALSE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +AUTOCON .EQU TRUE ; ENABLE CONSOLE TAKEOVER AT LOADER PROMPT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 3580000 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +APP_BNKS .EQU $FF ; BANKS TO RESERVE FOR APP USE ($FF FOR AUTO SIZING) +MEMMGR .EQU MM_Z2 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +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) +MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) +MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) +; +RTCIO .EQU $C0 ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER +CTCMODE .EQU CTCMODE_TIM16 ; CTC MODE: CTCMODE_[NONE|CTR|TIM16|TIM256] +CTCPRE .EQU 256 ; PRESCALE CONSTANT (1-256) +CTCPRECH .EQU 2 ; PRESCALE CHANNEL (0-3) +CTCTIMCH .EQU 3 ; TIMER CHANNEL (0-3) +CTCOSC .EQU CPUOSC ; CTC CLOCK FREQUENCY +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +SKZDIV .EQU DIV_1 ; UART CLK (CLK2) DIVIDER FOR Z80-512K +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +WDOGIO .EQU $6E ; WATCHDOG REGISTER ADR +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED +FPLED_DSKACT .EQU FALSE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +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) +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +PPKKBLOUT .EQU KBD_US ; PPK 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] +DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +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) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +DUARTCNT .EQU 1 ; DUART: NUMBER OF CHIPS TO DETECT (1-2) +DUART0BASE .EQU $A0 ; DUART 0: BASE ADDRESS OF CHIP +DUART0ACFG .EQU DEFSERCFG ; DUART 0A: SERIAL LINE CONFIG +DUART0BCFG .EQU DEFSERCFG ; DUART 0B: SERIAL LINE CONFIG +DUART1BASE .EQU $40 ; DUART 1: BASE ADDRESS OF CHIP +DUART1ACFG .EQU DEFSERCFG ; DUART 1A: SERIAL LINE CONFIG +DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG +; +UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) +UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART +UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART +UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART +UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART +UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART +UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +; +ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +ACIADEBUG .EQU FALSE ; ACIA: ENABLE DEBUG OUTPUT +ACIACNT .EQU 1 ; ACIA: NUMBER OF CHIPS TO DETECT (1-2) +ACIA0BASE .EQU $80 ; ACIA 0: REGISTERS BASE ADR +ACIA0CLK .EQU CPUOSC ; ACIA 0: OSC FREQ IN HZ +ACIA0DIV .EQU 1 ; ACIA 0: SERIAL CLOCK DIVIDER +ACIA0CFG .EQU DEFSERCFG ; ACIA 0: SERIAL LINE CONFIG (SEE STD.ASM) +ACIA1BASE .EQU $40 ; ACIA 1: REGISTERS BASE ADR +ACIA1CLK .EQU CPUOSC ; ACIA 1: OSC FREQ IN HZ +ACIA1DIV .EQU 1 ; ACIA 1: SERIAL CLOCK DIVIDER +ACIA1CFG .EQU DEFSERCFG ; ACIA 1: SERIAL LINE CONFIG (SEE STD.ASM) +; +SIOENABLE .EQU FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU CPUOSC ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU DEFSERCFG ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU CPUOSC ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU DEFSERCFG ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU CPUOSC ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU DEFSERCFG ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU CPUOSC ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU DEFSERCFG ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG +; +VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) +CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .EQU TMSMODE_MSX9958 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_RC ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE0BASE .EQU $10 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $00 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $00 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $60 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_MT ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|PIO|Z80R|USR] +SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 2 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $0C ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU TRUE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_MSX ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +; +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_RC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 93b6ec05..86b4b0b9 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -985,6 +985,13 @@ HBX_RETI: PUSH BC ; SAVE BC PUSH DE ; SAVE DE PUSH IY ; SAVE IY +; +#IF (PLATFORM == PLT_NABU) + PUSH HL + LD HL,($FFEA) ; TICCNT COPIED TO... + LD ($000B),HL ; ...LOW MEMORY FOR CP/M + POP HL +#ENDIF ; LD A,BID_BIOS ; HBIOS BANK CALL HBX_BNKSEL_INT ; SELECT IT @@ -2002,6 +2009,10 @@ HB_CPU1: CALL DSKY_DISPATCH #ENDIF ; +#IF (PLATFORM == PLT_NABU) + CALL NABU_PREINIT +#ENDIF +; #IF (SKZENABLE) ; ; SET THE SK Z80-512K UART CLK2 DIVIDER AS @@ -3308,6 +3319,9 @@ HB_INITTBL: .DW H8P_INIT #ENDIF #ENDIF +#IF (PLATFORM == PLT_NABU) + .DW NABU_INIT +#ENDIF #IF (AY38910ENABLE) .DW AY38910_INIT ; AUDIBLE INDICATOR OF BOOT START #ENDIF @@ -6303,6 +6317,22 @@ SIZ_H8P .EQU $ - ORG_H8P #ENDIF #ENDIF ; +#IF (PLATFORM == PLT_NABU) +ORG_NABU .EQU $ + #INCLUDE "nabu.asm" +SIZ_NABU .EQU $ - ORG_NABU + .ECHO "NABU occupies " + .ECHO SIZ_NABU + .ECHO " bytes.\n" +; +ORG_KBD .EQU $ + #INCLUDE "nabukb.asm" +SIZ_KBD .EQU $ - ORG_KBD + .ECHO "NABUKB occupies " + .ECHO SIZ_KBD + .ECHO " bytes.\n" +#ENDIF +; #IF (DSRTCENABLE) ORG_DSRTC .EQU $ #INCLUDE "dsrtc.asm" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 64d793a3..9c00f6e2 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -157,6 +157,7 @@ PLT_HEATH .EQU 18 ; HEATHKIT H8 Z80 SYSTEM PLT_EPITX .EQU 19 ; Z180 MINI-ITX PLT_MON .EQU 20 ; MONSPUTER PLT_STDZ180 .EQU 21 ; GENESIS Z180 SYSTEM +PLT_NABU .EQU 22 ; NABU PERSONAL COMPUTER ; ; HBIOS GLOBAL ERROR RETURN VALUES ; diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm new file mode 100644 index 00000000..f6453323 --- /dev/null +++ b/Source/HBIOS/nabu.asm @@ -0,0 +1,44 @@ +; +;================================================================================================== +; NABU INTERRUPT INTERCEPTOR +;================================================================================================== +NABU_INT1CLR .EQU $68 +NABU_TICCNT .EQU $FFEA ; TICCNT AT $FFEA IS COPIED DOWN TO $000B +; +; +; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION +; +NABU_PREINIT: + LD HL,NABU_STAT + CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST + RET +; +NABU_INIT: + CALL NEWLINE ; FORMATTING + PRTS("NABU INT1$") + XOR A + OUT (NABU_INT1CLR),A + RET ; DONE +; +; INTERRUPT ENTRY POINT +; +NABU_STAT: + XOR A + OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT + LD HL,(NABU_TICCNT) + INC HL + LD (NABU_TICCNT),HL + LD A,(NABU_HBTICK) + INC A + LD (NABU_HBTICK),A + CP $0A ; CALL HB_TICK EVERY 10 INTERRUPTS (50HZ) + RET NZ ; NOT TIME THEN JUST RETURN + CALL HB_TICK + XOR A + LD (NABU_HBTICK),A ; RESET HBTICK COUNTER + INC A ; INTERRUPT HANDLED + RET +; +NABU_HBTICK: + .DB 0 +; diff --git a/Source/HBIOS/nabukb.asm b/Source/HBIOS/nabukb.asm new file mode 100644 index 00000000..508060ee --- /dev/null +++ b/Source/HBIOS/nabukb.asm @@ -0,0 +1,86 @@ +;====================================================================== +; NABU KEYBOARD DRIVER +; +; CREATED BY: LES BIRD +; +;====================================================================== +; +; KBPORT EQU $90 +; +; POLL FOR INPUT +; KBLOOP: +; IN A,(KBPORT+1) +; BIT 1,A +; JR Z,KBLOOP +; IN A,(KBPORT) +; +; INIT: +; XOR A +; CALL SUB12 +; CALL SUB12 +; CALL SUB12 +; CALL SUB12 +; CALL SUB12 +; LD A,40H +; CALL SUB12 +; LD A,4EH +; CALL SUB12 +; LD A,04H +; CALL SUB12 +; +NABUKB_DAT .EQU $90 +; +NABUKB_INIT: + CALL NEWLINE + PRTS("NABUKB: IO=0x$") + LD A,NABUKB_DAT + CALL PRTHEXBYTE +; + XOR A + CALL NABUKB_PUT + CALL NABUKB_PUT + CALL NABUKB_PUT + CALL NABUKB_PUT + CALL NABUKB_PUT + LD A,$40 ; RESET 8251 + CALL NABUKB_PUT + LD A,$4E ; 1 STOP BIT, 8 BITS, 64X CLK + CALL NABUKB_PUT + LD A,$04 ; ENABLE RECV + CALL NABUKB_PUT +; + XOR A + RET +; +NABUKB_STAT: + IN A,(NABUKB_DAT+1) + AND $02 + JP Z,CIO_IDLE + RET +; +NABUKB_FLUSH: + XOR A + RET +; +NABUKB_READ: + IN A,(NABUKB_DAT+1) + AND $02 + JR Z,NABUKB_READ + IN A,(NABUKB_DAT) + LD E,A + CP $80 + JR C,NABUKB_READ1 + LD E,$FF +NABUKB_READ1: + XOR A + RET +; +NABUKB_PUT: + OUT (NABUKB_DAT+1),A + NOP + NOP + NOP + NOP + NOP + RET +; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 5477a104..1614ea70 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -46,8 +46,13 @@ TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT .ECHO "TMS: MODE=" ; #IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958)) + #IF (PLATFORM == PLT_NABU) +TMS_DATREG .EQU $A0 ; READ/WRITE DATA +TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL + #ELSE TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL + #ENDIF TMS_PPIA .EQU 0 ; PPI PORT A TMS_PPIB .EQU 0 ; PPI PORT B TMS_PPIC .EQU 0 ; PPI PORT C @@ -259,6 +264,9 @@ TMS_INIT1: #IF MKYENABLE CALL MKY_INIT ; INITIALIZE MKY KEYBOARD DRIVER #ENDIF +#IF (PLATFORM == PLT_NABU) + CALL NABUKB_INIT +#ENDIF #IF (INTMODE == 1 & TMSTIMENABLE) ; ADD IM1 INT CALL LIST ENTRY @@ -319,9 +327,15 @@ TMS_FNTBL: .DW MKY_READ #ELSE + #IF (PLATFORM == PLT_NABU) + .DW NABUKB_STAT + .DW NABUKB_FLUSH + .DW NABUKB_READ + #ELSE .DW TMS_STAT .DW TMS_FLUSH .DW TMS_READ + #ENDIF #ENDIF #ENDIF #ENDIF diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index cd8fe8fb..3d685d34 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -67,6 +67,7 @@ UARTCBASE .EQU $80 UARTMBASE .EQU $18 UART4BASE .EQU $C0 UARTRBASE .EQU $A0 +UARTNBASE .EQU $48 ; #IF (UARTINTS) ; @@ -1185,6 +1186,15 @@ UART_CFG_MFP: ; #ENDIF ; +#IF (PLATFORM == PLT_NABU) + .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) + .DB 0 ; UART TYPE + .DB UARTNBASE ; IO PORT BASE (RBR, THR) + .DB UARTNBASE + UART_LSR ; LINE STATUS PORT (LSR) + .DW UARTCFG ; LINE CONFIGURATION + .DW 0 ; SHOULD NEVER NEED INT HANDLER +#ENDIF +; UART_CNT .EQU ($ - UART_CFG) / 8 ; #IF ((!UARTINTS) | (INTMODE == 0)) From 67d23dc5400c87ddd57afa86711b2e84d6273201 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 16 Apr 2024 17:03:30 -0700 Subject: [PATCH 04/20] Tweaks to NABU Support - Include NABU in pre-built ROMs - AY sound driver works (but poorly) --- Doc/ChangeLog.txt | 2 + Doc/RomWBW Applications.pdf | Bin 239625 -> 239627 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123892 -> 123893 bytes Doc/RomWBW Errata.pdf | Bin 28704 -> 28926 bytes Doc/RomWBW ROM Applications.pdf | Bin 155011 -> 155012 bytes Doc/RomWBW System Guide.pdf | Bin 567602 -> 567603 bytes Doc/RomWBW User Guide.pdf | Bin 792289 -> 796647 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Apps/Tune/tune.asm | 8 ++- Source/Doc/UserGuide.md | 31 ++++++++++ Source/HBIOS/Build.cmd | 1 + Source/HBIOS/Build.sh | 1 + Source/HBIOS/Config/NABU_std.asm | 4 +- Source/HBIOS/ay38910.asm | 14 ++--- Source/HBIOS/cfg_duo.asm | 5 +- Source/HBIOS/cfg_dyno.asm | 5 +- Source/HBIOS/cfg_epitx.asm | 5 +- Source/HBIOS/cfg_heath.asm | 5 +- Source/HBIOS/cfg_master.asm | 5 +- Source/HBIOS/cfg_mbc.asm | 5 +- Source/HBIOS/cfg_mk4.asm | 5 +- Source/HBIOS/cfg_mon.asm | 5 +- Source/HBIOS/cfg_n8.asm | 5 +- Source/HBIOS/cfg_nabu.asm | 11 ++-- Source/HBIOS/cfg_rcz180.asm | 3 +- Source/HBIOS/cfg_rcz280.asm | 5 +- Source/HBIOS/cfg_rcz80.asm | 5 +- Source/HBIOS/cfg_rph.asm | 5 +- Source/HBIOS/cfg_s100.asm | 5 +- Source/HBIOS/cfg_sbc.asm | 5 +- Source/HBIOS/cfg_scz180.asm | 5 +- Source/HBIOS/cfg_z80retro.asm | 3 +- Source/HBIOS/cfg_zeta.asm | 3 +- Source/HBIOS/cfg_zeta2.asm | 3 +- Source/HBIOS/hbios.asm | 16 ++--- Source/HBIOS/nabu.asm | 14 ++--- Source/HBIOS/std.asm | 7 ++- Source/HBIOS/tms.asm | 101 +++++++++++++++++-------------- Source/HBIOS/uart.asm | 7 ++- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 42 files changed, 197 insertions(+), 115 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 13be47f2..551e3362 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -12,6 +12,8 @@ Version 3.5 - WBW: Added Cowgol disk image based on the work of Ladislau Szilagyi - WBW: Added support for CP/NET on Duodyne Disk I/O - DDW: Added support for Duodyne Media board +- WBW: Auto restore TMS video on user reset (CP/M warm boot) +- L?B: Added support for NABU w/ RomWBW Option Board Version 3.4 ----------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index e24171c42455274b0bca64f1e2dde784e167a5ab..c836c7c56cac053c6d1de50dca92cbcb36f7ecbe 100644 GIT binary patch delta 14717 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 G&Hf)XEr4kN delta 14693 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 diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index 9e2d3491fdba8b8be4e6b0047e6610e15859e426..8ca60e9bd776cf08207a328f98ce88b9c894ef98 100644 GIT binary patch delta 9397 zcmaia1yCGaw=Hgg5Zr=01eh5Z1`7lY5@2wG1b6qKgM}c$-QC^Y-3b=l6MT^1`tslR zzxVFV_io)&b*fLFv-aw>rK)#Tch&~t(%A1nIx!BN}Z#mu#h=<0|iA9`B-R~3lZ6~y9={TAg}M#f$Hhy zH)Co&arHxw#ZL_ZsUl`U_m!Ld9ghc7O1SI`7F4!WMrh;G2aH`0?%r7?dwjk@f%ueT zW}gM|EofllxTbCm8Nm#MA{~>HM6yURMZ4g*+HXfhszQ!fl(IEMc%k7(HYaW6DrY#H zm>AhbvMXKD`V-yCWY(HVs}Vh@1-(+*>!}*tWVl;7t2OC0Nk17exuqIzpR*;&st(Y47 zsHGSh4GogYe@1QQW<2N>9<5ZX6t1i&G`ktQz~ej*S5XNH6+ApvRA7^vdd(jnUtkS{ zQ>TLUdk83N@4iuIf=Q|6C&-0d&lhA=1|s%Zz8-KF=wB=#8Vx9XhVSnd^k`{4s~zrZII?)B=*)8}~{*>9s~v;vms4+0M}O58Ns9WFcN$-Y;)^*+o_szl~z z%uwX(+SSoNjx&8tNwaAw+P^FKk(v)aOi&W3wVEGEg{?x!g$S94r+c({A~xchioXVTEVSE>3cSjn1ip$rkaq@cxpAU_RB7R{1_* z#An=Q3cVRgdbh^qp;aO+kR%CCA93`SEoL)o&y4QFA(s%L%kycyW}#DK?w}S$&~Cf2 z7F8>C@U_NGEUdnJy+f=bJ$l#u{i%g#Z&De@8Ws6r^@rXY%BLuejp}9WZM?{Ep7LD@ z9C-D9PkiW!P*wr+RRta|N$6a^arcHgiG! zWa0Yuk=uYi){0*q0F2$gw4u>p@MZ>!`sH_1*h#f1-#u_e!N^M|DBx}de{vZ)@+0Bb zg^&}5CJatEx7Ld3t8qEJ$=|1&bPS31Q@GHcLi?h*8*P6W8fyKP$*`HH zu@CM|V%-<4bbr%d*QA&W{4M|4P|L|HB@pz17uyS?^3ACbNnr)W?|dHuO2sbS0iv&` z`;({9OwY-1_s(e`ZLiKPL&Vz+m#xqTG(cGa9gO6hW=$smr3CgDVZ~d{>H@r{(FI%H&-A~(yt&X6{8T+!|H$vTW-2ozB{4YBKBC&)jL8kH-ZR~px!nd$6 z`q#{o;*O*Vn@_{und|6VuL9DwFFNk&Q}fNBg_11D`SK?!7&aWcBPpN26bw0%kIz4yUDPO_3Z7VUxk|ZZe;N z0HJSO-i0q^97v+#`rinn#J@kzc^O*SY{9|tNef$)&UBoSdMqD{eepGuOl2O7e{ZJ} zZSyG2KB9N`GR;_GeRbBJ~lB%G8X*p|3m z>0fC_(Q=mIyUQ*fCH}f|n{DH}!(;rj#BkbY7&mqPKErJZz>qFNtnTJJk3nUR7Q8f+ z`azN5k<$B&uMp5T$Zn?4k{Jry#jCo>2swx3E1KDCI{X0Kcs=NQW@+Es7#*uvWyVBI zwFdhiNtWK@d|#f5-1lKH1%}!p{&-bi_!Vb<3~g!vo*w`=*b*Jw%K}P!=-pS0Ei(m- z(>|nZ(l4xk*sne{ufGnYmE{+~Gke{xvOD7S*k7d`yW-$Bd0%Mp@~jOeU%+S~O7RLM zC#{gatBj6OqJPnUxr@jj^l`3v`E;Lbc>&j|Jym^Wt}gUPg|}#{NFSlEQIf79 zWgxFj>U!7&oAu@x<~fHI;B|eTFLaSM%%i-QNxepYi7t`D2BV(yF zmTau#J2`y;AZrHe#sIds@~I1H;Rq|ax7;C3t2Bopz3jfYO!wEE4W9wC>!=9nx&0t* z8BB#blMSN~MLm}VE~>Sq?WlytzS_DWNLd~uD^Qu;z#7zhLHAkm z)m%uf=1X{TYsQ$X%fY+2fyzt8W47j+? zZILEsmejpAW@&+cPPrlItMsd@Snf8E#+~EzJ;!{xO?~)UT(!2s{PH(@h90dGf5Jg4 zsVl)#vgAfS5O(0u+f_x5E*!xJs{XY{zc4;jEISYCu1>A5N_@Xoh z`16%mv%*5qJ9eX%^}4S`w+OsFUc+vPF|D1O6b)JfZV-+k!2-lLpO&=4ja&zs-J+gQ zS5{T!s=^5z*S#S9qyj_AnY@yWZIo`Zd=4}{6TMmIy*-{7tj7rVwc+E`)=wMsp-d;e zC>Z3?6JNP71G^=b&_2#BgekpMe94+W#~-C_mJEC7nwcjB;-Vrwj3|&f7Nfq(l-Zq+zUoo%u;CpLK8|c;A-0)HTmlusa7_< z-^moRS$;$|wf3nxJeqsit95W+6y2A8=EiT|(Ro`L=C;D`76ONt<0T&}>vrGc#S^(n z17HJA*tr63SeXM3hgsJTh?>*Fs_jxG_I1OBn)>=~e#x(AT&0X#HmdKW;bNOgLx-YSM34zf_{(I$6lXJ$uv_8ycAIVz`~C`0OD)Exi&=uH+oL$-j2pe z0M+?Ezs{8`h2Ce1*E`5HyZ~RZW18UhBA8!j!=Lvu^4Om?4Jl?2kM_qZX6d2mS`GKU z8s5F}CbPaBM8&Hi+=R!Mm}oz~eunLL?JAe9hSy>>+jAQWNrg65NK0$~J1^yU>X6Xz zE#SLtTV1aXIw3i0qM2=UTnFIlt!YAQcq=;_U*(uv?n*kb2zlsQQ5lEA{-ILIBg`vq z#AAt#!?Y32{e^?RnN{~M>F1$C)Rj*{!7UACe&@7leLU$$wOxhA`KmdBC*qHmD`3LC zh^!;Xn;hlHauge=iYxvsxZFTk5^wlTp2hO9CEG)#>P{G&q#z#fp6{ zuBP4RdYxq^i08KpeAR~F@}(-v0I$gWY`PUuil$iem$s>0BJuMm`|<=_%Xhva+W9rG-Zqsr!RS8oIR&%^xfX2sz!VgEx7%tN+n^h z8!t#Eo)6Y&8%EFJNTIi?4LS{uizDtE0MYRI-=Htdtpmos>h*&tjk;L%TWHc#6^BReQD_)-abAH;ZFZK_MOt&~3RxM2V&)m|!;5=px(F&# z_>)}yGj`-@FJlOi5c6S6z+?#5)jlN7EH}@1pc65HM|!hLTojMHTS-6_jVrp4p*K%C zB~3XcI6KQJtcd$BjyY(>-=bIB7(xGk@r?JNVr}+ zrv4{y<*9C*p{woRur4DlQ=9^qfK9dj`=nfP!lk(VhoXV0 z)Ylf3N#LK_74dC|XiL;+*0FoJ@E6~^6c*Q}QU`bT zxN|Yb52p6Ho%u|(rip)c2FYY#zo@ow!ZN z<{FnQ4bf>Pr~&pJMii6KY^ZX)=7YqSxh^{fKH0GeWnUP|Gs|I#zL*m$JKHB{+eScR z9Hl*`YW`dSihKqN`rWXVSf z|6Jv*pGo!d3B|^Q?*ZCv3jL{C9bslNn$SBkMnYvtoAGeUDHBn|1{(@HB2Jb-uVX1Z z_FtpjbRIAj@2EE77|eorrC&8wBRxg-=d~8ZY#%?poUR`g)%07*^<^{o-LLb=fg+4M zTB*O$5h&!aq0mt*8*!($545789{Q;VLS!%!4!*0ZQJE{-j)u5>Q5E!unvw{ieluEt z?zA?eFwW}r7Pa;l62^PR)}sBM7Z~rK?joK^5sim64euZ`mAYa?>#0fySi^y0`ZeWc zAw5I)vclC_4-D1fUnL+1B>sF@jjFo`&_;i9?&a^j*u?DDdmuxPn2`VoD}ivjZ3v zg%sAx4}g04dga>(8R>)SHwVvw_f19k^NHTFDNs!F;Cq{OBcN3`ij}{lk1eJ9sZGj_ zi+oZhl<{m$R7OaUC4}G_R|ugb*_!D_ASfo^VaJ()gXZSCXOBc`GH#qJw0ueKa}+gd zdD^5sF{wkIqFo^qL&O?&^d`2Me+Mk6GOI=f=w4~~B|WxyHi8aG+g-x5Uze12u=!T^ z%jS%?ms)u5Jbtz<7Pj*oeVpq68Kanqt@-;TZM$d@tt$I&u{rdaBKh}sv%couIyC(P zWiGi=R(3uFG4jIuO0saMxk;ClU-= zO_)5HZn`V5@l$Ybqr%d$Akj3Z@6Jhi0aDJDbe|$MhH~OI*5oa@YB+nN3Hq55lGa9S zVswt(ywuiQRM2dsd1!VkT~pqvTol!-A6To%S&QHmJ9emew!su-jy3}(C)m`RQ*SQK z{ViQ34pz7dRviTDXEW!?RtHmGCVer5r|ls9VtB=*^61&pzpCOLlqOqdv>066Tq#TN zIy3`xat(S5i;FcTj>%KMy*bO$`CC$=ZVFYE^_HSE)i;H74#!#a;yU;r ziNSL@HB%AjTQN-mW4lb908ai9+u|6XXf3vjNZDzh`tXmw#`fFN1}s`^l)EN`R@A^x zWApuw@T0>OZ>1yr+TetM_~CtqF|N8MWFfi${HFc!wi#+B*iehG6SLi4$Tj z{_VUkVU5c4g%VP3;nN_f`nvn3Nz8}qEiwo2ISG>4?|ndMA|Y2c6#UgEE)lb-?RjUF zCLG~)9WuMJmteb5JmE1+nkPl0!b9gAJJOxeEHQS{6yuyC?px zCNuw6of`S1-aBdpLXV+Y-N9XK0;0}=Hg4gGzW71Uu(+wlskeLT6KMPdODfL4JWipN zQlD{CoDnulHe=vv47z+SuWtlgHW63ge|q!YItYPUb++Y|#;)bEvkeA8Sto58`3C^O zIy?*{Bq1CH8iDyPhbYe2Y}>+f>w0I)Yad@|5q0NtEc%JR^N3OCyQs8fXgc(9H)L^7 zZwK+4rrW65C9q8Fs*kFJ5l6#8XGyY(gSUhoR5Fi2Hpbv45Z_72Hj`MJka}N%uzv%+ zogt-oES>(f_*9^Ry#}^X?12ZeeI|O>qYYt{s3aC42!?RYT%7)xXK8toKTQEguPnum zDmoDny+0Ie4X7qcLp8cjja-gI$#;tyrGo#6bh7!Ve`h}WKKO^j1Z?o|kyXE!ry54j+EePSxBdpw0){vVl?;eVRH$kUfts_Nq77DVxgubRjI72 z7jfg*sIb?bZ_unl4Ol%h4W#c_B=5b$PDGYvWN@=__{;#Tb6vXJA8< z;9Ut!vD(AetaOZhWBB5+HAi3P7M|qW2cF7nEp=YBC})L6R0V6B+^2x@HqMpFI88p~ z`5IoDkECP6<;v2W8Ga?=Yu^l~?^Gx+W~LmyWraDmF+~W7Ul8E^Y%U&_&1hv>&CaHE zqmNU`A2?B4Di~jz`{Hy8NfUGt^GThqn=etP7g#}6rSMAh8WgOp-}6?e8S2@SAlq|! z)(UMycVTS8bLrQxYCFBEYk9glTFy%hV@R+5hNeq<5|w@t5Z~sV>c7eo@h8aQsAgA`w;(RLRvDC6KamBjwtMVgnB~QCQdA5 zH=Cy9#Ioo=RHXBulZoX)@iH%|)ZfE~-zh`(bFSzM2wVI>Tq4XtP)GdOT)EG*9dg-T zYf!@3uKLL2pSi3Y5%>O4YbV93JwVDc_5)L{_G`>uVkM^$>T zg*HKwLD&CrvJH2yjORAeKVTtCf3X0pqAUlNQ+}Xx1y{I^v8l3$x4;O**|ZOuZ7s{z z72(wY4VSxAX!IzMCJzmQMW7Re!WYz5p){7Lyl70Ot2Nyb^1(Y@R;sqxv?t%V0LBX7 zd>C*CPk_r&(>UEMwifzp8lv}5n4MCe2BuW9b{G-(w~A?hQg$l}=P1|9PX*N_|TA^{Q+CtUEiiTA`y6SN@rkysX!&$S<$V-BgmOuwyJEw@)qaj(F zz^@E-UX^#NS#mgodY!$HlGZii6Adp4Mev*YB9@6fs2*Y^^o7OpJkvc>t&;OWWiN{D zQ3buIy(Pe2i$IYdVhGTHMB5x1*3JZ;gfwooMQV<&UY2&YbA^AJD)p^%6M?P;$5 zn!iEQlrNuYE;fYv%8)n&&gk-e%f?J7df7&XB3ubt{C+7C*^mBI)pXrpgU0x3&0L~= z(f>5P_7*>9o*a-Y48f_X6pLL<+AuT0Y2?_+2vX|o%V zCH@rWf*WyNcxe$nQ)J#L%Etfk3^x|s2k7tnFlTz%MtEZ@hp^oPx4yWG1s7w4R5Vz)Uu zn5U}PdlBG#N?idQ?)uc3D<)Fh z=u`{MDdhQmO&Tv*p*&Fgm7><{@_m6M>OxL0L|q~i>Pk4EmY&*w~|~zp9nu;fAT{0qe9+CNfC24 z-TUyHlWdJqJ|GAUjH5*kn`NkBnEvmkah37Zg@t$~=pvcPVk-7(C3&AfPVmkPly2Y9 z^YI|Uz%A7)?e=Ja=c(%}J9FA0T!JM3zA65o1g`$Yu4&>KV^iLJ4d zv!jWD&A(Q5hL%`BAPs;fmR(Kq-$m)77Vy7UwU263gls@wATJL;ke34hVFm!0S!uZB z?TjT1oK0w0Bm_VJ5D$Ro-;mgA%WPJD8o<8>jV%q6TtpH2l4(f{mTaQN5tQIKyCn#_ir38nCEZ4Kk5K~-2d13e~N*8 zeE+t6`JXoVdAMV%tqI=#O$*@R=KhD%JOFNU7^6~>?v;Th@AV5CIUkpGH2*mf--k)sp^TnRo5WxQS z0tn*a{aY818_4^2ynx)?ynm+w1O!0-iGzUt_UX^>75}H0VE;EYpg+m}TP6qug#0ZA z1mfoX2M){w{=0TSpnuj02*k_tU&8|f06<_~$lp-_@pAM0;~~7f!2fFe$CeiY{znx4 zWbyAPfOz>q|G+^2{M@mAb|U&xygYmoVgMdVDKSwXK%5&QDJBZw6^C$3@Jm7X0er$V jLjN;Fmqu6^%gNcm(fPBZi76Hc0s%m<7#SrMrLg`N%z;QY delta 9252 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�ST6ksP>IfoM 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 z zfVovNgCag&t|;F1r}#6vCc!Ro%Z}qu%_R@&PX}yOYeYwTKOwiMGSMDJDDP}dotz!t z8QJ`^vNL{<0s@hO$o zI|v5*6U`3d=KQNBPSD>tP7aPgv;WgAjz4pNAuz6gYzaj+=l}@vmk-zflJ7UwzqoQi zp`3rl=Hvwbjf27d!a><#|EdZ25AncUoLqki1qFfsA_xWjyMX`j1%bg}=$~Yu9Nd4~ zIR8tc-}%|uLBEy%lQoC~#Pz2Vpx=Y}*Br3JAb*kuaX|m-0*C|lS0P{!JHY){z~6HJ z84wHxasErP|EL%Y0skEk%<)%ZFqjkkXCYt+C*z5GWKZ!pSKN`K^m6 dH%ydEfSm9D2T547e~rQkgP_pRh$~8<{2zBU!>|AV diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index 12f702d6bd71497161ea17a7735cba5ac30cd501..5a0b6dcbb4efe3d89030f84062668ad4c092a7aa 100644 GIT binary patch delta 8257 zcmai3eXN#c8HZPEJ12rc$=Tt#?E;>F=e3tEI`ilk4!p4M@X@t%-rTU~^_eG6_HX#frRlTl&%Zk9 zS4WnsD<{6U>dWU3?fY9XI@R8J`q2JY`bRxH_?^4XFMjaZGxw)k#tmM+eEZakmOeAK z>%_8e|M}5telu^yv@rGi4}I>k1>0`Fb^gKMkDYkQ!D)M6etgRP{VNx4Tt52TkB;83 zd))f#@4ITk6BGTGrMKL3V(usZaM=?*GrIozy^D|b|Kk0gjnAJ-TgK1cvEiL<$0tqu z+R42q*3^pgr{2BwhE@L6f1Lc`PWN=rgmdws$F9El!8;B)Io0eti7N*QcMp@PnsrTC#A~j;((>Ja56amuIhA^{MR} zrha<+#NOL_uUmcZqO%Y0TlT`wCZC&i_FJ#reCF7}w?K!a!CqFxET1S3>i9Q(XAufA zs-1C!3}jhmgaZf?Ef<`Tmv$+uR!|p>!Ux`mY&yTO@=ts zJ$XTA+6`&spVonVr?R&ll&MH*9g{p51-OIj9Hq85g?FUv7-}CgRYISXl|?0>ILiHk zw@IQEvJLgjf&ESRqji)zF>=nv=)81EL}Qb(q#6FCjcZ4>jz6jybvsCmOegIS4AP%L zQTf)LT$hdH21*B0I9Wh+wlWqp*ain?cH|ONQK}2ZBNd9our#^aK-Os*R$x*1#RfE zA(@Wc4?M`Ihy~Pn;sGe>K_X*e+i;e&_@6~4(yfyrHUtXH{Xi$u#csp{97=H2b->>l z@N8j;LsyhCn|#@^%AaP+I+SneI;6Jb2HGjjm(e~2$^V?sTB6`kLF6IMM`FCFtmGzu zFE67YYsN>D|2Z%k8E|NyWS#SgG6J2l8r6WvVVSIiE`UN;5iGC}5mFU`;wyq5J(0+U z*D2GbGnxtQSFL)b4{-(xT)qCa{OMgJstvCbg~nxwhIv3J-Gm-NG~LIfn#hdsKkquA z5Mhe2Bq;on%n{T+0UBC|D+*Z=46;@T;Uz6=K)};d_zn~Ybx-Pg&}EXzw8Mi4v<|6Q z$G@3Q2y`kw0dG6nFh?0kDr7Am7b@TlD6(UU1H(ON(2A3-gsg8d_uOt*4F`81DtwS2i8jt{u2sr41dR8x^u&yA&kkEMrgiyw_ zmy~HJg$<+R{m>2V0oRBvhfuHY*T(-6T9$wi$~?sYo#e}SZA8jK7mkvb_D$x~aC?b= z@|4F=wlZ3=4lIr~1XZcZpliI4K^M)ux(>3ShwM$Y@fZS7wZcC;D9G`d!eL7K8XG50 zN#+e2QBpsn1fi7$czDQqpFmDTjzc+7rNcTg-vhdEKe+~P(6(T#Cjl0MOiPFYJNx4wQLOHFK(GOj;Gt%|4>p|B`x(-e2=_5o!J_(mV8RV;a2$b;nmPx&?-JDaeihDDyoM-Suw16X#9fO$BIlb3x<+qYXODQ^qL2) zVjIf{tsW0u^cIq#(?Ql=OmT2*@Qn5Xn;pk7zVHyZC8efAI&=k$G}>ajp3FGdS9k`J z0k;OaVncl1k`Jy@m$Dw~D4XFIijr&!v`IR|(1GHEf zJ)B^FGn_DUA?|^()kxfptOF%(#$romiIiauhQO;DSB^g`#Jj{F3u$T#S(NMzv|G2{ zqK!8WWKnWr$T9^cCY?bb0}x!%LFnbA4r6Lh2V=-5i)8uuU>OXSC|Er*jBP8X7=+0* z!Iw08yWq1(l-Z0R1aA~jwHK8#RfsU$d6T3Qe zFpaJ*=)+G~li9VO?UGtvvOYC3G{hjx@ z=bU@ab3X1Low03n#?Cvd{Lo#O4g9X_WpT+1lb=0PZJ*k7`QtmT|5Eea)yKXQ8pa-P z`TKt_c=hRB2WEb1y#I?^&K!Mo@4HP`9N1p9Z^2ui3;mxw)c)GF`|myU*Q3i`{^!=& zCui6_|Jk?wZ@q6H*tB4H{x>c9&VD^Hx)d-_}B zBm3J&{bPSVF?;L4oc*(3fB)o`(off(`M@n&ea(*94^*FCzUMFBep7Cp>hE~znS>_K#_kJ7XC9hok9L0lr8>R$CpT?tDHQe(T$|nlD`a-oQH-?SA%&m33SGHCZ?7s#%vWZ94YLNA?bV{VO-zHtQ3eOAhSbwsOwF z4c%j#A3AvD8)0>QTSaW)t7!$8DYw2 zX;D*YxXPx9rc&K!biK%b^>^0SeE5%$(F=N}lr!myMWw43D*j1?$}_2>lLS_3p_NU8 zi%NA1*{2w7tb~9j&U<<$gLP@V073|>0)w!|Fm0`kHZ@!aEtriq3Zfa55SAE+GbMHE z%MkpNRUE>3Lk)33#Wa>7*e5SFv)il4V7)OR)ixJGc*kL*Vg?7{ZR!EU05c?L?)`vp zqJ{()96Jk|Jw=F7Qn@J2+24L_I{2cBF;%s|EQTA6WoDUZEyYzjsI($OP>ZD#k*X%6 zk@PC1g_3Ew2tsM8skao~j6rybK%2@CRB7dbL6pWxq|VjSSecp^7Z{?Yb<_}TC9?R# z6h7xpoY|O$G6Ypx2W_ZkI)EYwgi%I^G?5`_TpDF9wc9u&sb(fbVUxVRz!xS8mNCd7 zK_3-oAfUkvLE}g&#U4;9?YW!<0gYz}>IQ0ood?vK^26P3==nwX<>cL>;Z@Y z8b(ejmhH~!K>gz)97Mv+Yr|@R_dGegH}`-3DDTr?hM>W(12C94XEaopVA6PopmrM>H~}hj4FuMJwsdN^p&(Wbh@aUV z(9JLi&C(JfMN6DCLh|bo`YcwFdIEh()`^*AJ!_`GP0ZoOp@3689nT-*3UqR&Y|nK5 z7#qAwJxdB+%LG(Xc9&xeXhJYHjbsSwR;wHZR zMIi*dK^<;`U`?O(L7*=wgz!;P<6LfEiGQ3hTBfNCL2raGOE;&`LQn{Wl9HO20)nO% zn4i6fvsO^rayAG5P==t?gF>OWI4`a)dL`0ChMYwvM9X*s zJXrwY3QCw|4B)jYr`x&a%*9Y{52nN2YmEkY96GW0L3Lw;nfHoCj@M3_)UXT?l-~l% z3yp{%0;|^EJ7-g0hG61Ss)93S9Xcvx%vgq?&JAEBcBWDINTB5o)ur0yMOtXXvLk3~ zN#saOfDY`DAvn6HtO#)#Xh32VvS5!4L6nBLh~!M5h4z#HgF(NZs#XAkC0dZJPVJ)h38Y+N*xGoQs=kg45E8S4wDgy$V$Pmm%Ygj*oy#w_H zu0ju(RM=I)}cx5&~Blft|=| zKrq*NIGc$pPfJI@C=b5K5abiku^6j_5NJ)x9shK=VOkMsBtx(O_XWZ1v6QHUm1sBv z_+m||ZZ6RRH+p&_$i5bPhSm5Kh)W=jg$hFl0au=7xpM0@Z3rrZO~cTFQw|CVg9xbU zm9Q`bgF%`C!~lsp5pscG;?@vtvmAXnoUtJhR~gBkC)hH@PgmFwY{VRM6U^c|Io1IM zP#7^4Hz}-DCNcyI<7^i*3%{s5g9#ykJ=XH}AF^06Qt>F*P7h_9k~Ru!q>P)(yJMa~ zSe&)$oM-UkfC+CLI`RC8;O$DCAntjwj0S^I!#Y4PrwPZ4Wpte7B3?Z8WeBcyU`vE3 z1Z}mU8G86MmLW)ppYOYHu#^1v*JK97i+>>?)15cIwFx^z|dg zB&LP&G)mBFAsW(1h9Kft6yU8Z4au7xx?&+;Oa54Q^(J&rw}UIJh@~DLW<}}*>VY6HdbS>dlTBEsSH6AOb6D&VxQ`179lRs8mH!4 z0730Gm@ue+uzsa03s1|4&%4}2SP;9u_mKA5157NXfrIsGwin%1Jmc^pY zx3nRl7B61xobqh}-IR5rseZx#7wN8VYO1-Xzh`6ry&G@ut&s*(xv!Z!w{=-t&Hn(Y CpzNLi diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index 42bf05e37ddad11a4c129f05740792cf11a72861..f4a46d0b9d8c050c704cb6eef833fe5a1980e6ec 100644 GIT binary patch delta 23727 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 delta 20229 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 diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 668123072e12f5db29713dc8009fef37852bb294..2213069e947735db9c6b340c7460e92ae8ada82f 100644 GIT binary patch delta 116811 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

ZZkCkjw+NGM<%BX;;4 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

i4hh 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
o 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 delta 205461 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Ⓢ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
TIfSaq7y9 zu@_s4t5yY9=OZ3V+G_R1Z>0fW_M4gC?(#1qAKO2;NTaDhJn#C};=G9x+Ph)jNC5fU zdZScn-FLZr`)p(d-17tNy)3e~#H>WKrB-#==j$qcyP@)DImtZ7yndK-sl~~@z^VzYLxN{u0#yq}A1}1Hm zsgK*Q&T(BjBr?rd;kCMMyS)sp-!%plKV}#CZ@P7VMR$+*yUdKcJRq*kRsaNhCcaJ z(NV~B0Cfllt*NobOWapCHIjr0eu{4&KS3&cgu&%Q*4@_mtEfAGm1Tl>w&z`8xC;^{5wGM|g9RhBqQwS93hx!D@EB4t zYDc$D*(a-K0sfch){|!*G_6Rq+G)vN1Ux-xw7pqEL6vvPKD`ufed?4VwPM+rY>his zt>3W4RLS5-)xk*IglJ5Y{_dxNlaF705~6>Qw&41|D4J0rdeu)w^ki(IUxesu#q9Yg z_+^Q~72((0k288Ode0BCXqW^C72i@e@EK;#p+kZ}Gowt@B1Q7|W++HH^uT3PpVr#z zYMW5NR|$tMcV=Wh0CU!GRq^}b1dKK4XFfC7euv}@;M-|1sCRs$a(aAQFYWuF+^He& z2g%f`rmuWgPE{=B-WwVM4)~7Aju%8KJ$(gGXb^s@+YUn9hwU!HP}v6}=F-$~1RvFj zO|w{AjQ~lMQt8RTZp2OV!LMRb(b;!S01N{joH zdw*}_zeGQAg6Jo{Tl5nb$8YBvKezLrJj2+X6oo$oAAHM>;3H0mUBHSHgn(bRCv5DT zFM%O>I3D4>BkTx32?>Y`kZ}Tnn*1oIDJNE(AmXVf5=1;9DCHW0216_o;y`__L`c~Oiyy)cZvDwP6vJcMPU9F6ifB#-~ z{)+3mtLT%NcaL+Ob1ppzYFYA6({N4|C|TBDNK-Q&t&Ead-jd(mSR3hpK;mTe{`W^3 zeO5;&K^^4$XE@`!D2Qmfe8Wj}WhtF)a)AR3Y+hZOdX|!92e5 zL-_f=3U{aWDDI1l`6FgkiFd2kOrfppJZF-J``;Rm$X;5S@VH?LMH1JMrcful+W8je ze)^Di*<~$xZ>0a7YFvcZf|8Mf-}2OSQiYpVPRGi^Sc%z4QgzggMftiOzXM&xGV9({ z4jj!=qsyBvIg^bQK2<4=x^5l?#}*nd#dx`4smn<61I%(SNWCyEiHdAKxAkp#_SlSv z%i6Yk_Q9_!*`vBS2-=>84cVxL7e3c;lho^X26Q3n#sar-ul>0917;C7)Rj0=vuhhm zxsp5wTbdj`)o$k{YX!M1G{v*;@BRF??Ka1jw2sOw-?xJ9o^GG+?fv^M8_4%!=*p(B zlwGCY`2s#g4JqDtn_f#bA5kUgUw`h84T;T8#q~G3cquA*jCFUVSMM96TK8=fU0lfF(nnZv?TS;^k~AdLzA>;XN$iy$X%ZCH}Xk*?Y_D`y0KhW zC#jp!#t-F)lvG(RU1?e=`=;GU+f^0C`dqc!=mgkQ&$K0mUw%(84hzQ+gQgN?>}*M>SaE z{f=O^MbEB$NgSsFP`IMyqv*xQ&COcx!|Bk6Fkd5n@|O+5Zd{hXmtyS=lp>Orun-urV?{qRon zoS|qq_=ocA{lZ5~vi8o7B(!~W+9L*t#}4lIDIeIIeR~@k!|TCD5~rq`dh;Y}`TcZ< z@en#7ZM4q3^B`?Z4oN|#N-V1EYrRzzBwLU_okp($`V$5mcV*Da| z8m|MQynzfLbJ+2aM`&U6u613Grv#;=+l<1Pk+1IqZb2DP_4y$w#=$1$C?G$(OAabW zf4kbwi~4|~WsN_1yZKpoI$$Uq!2Hj_ru{0bi_wSc9iUT1SY(g=HU8emxLgyJFcN;f z1m41aGDU~LmsFa7^X`E539#`t)-1#awZ<@Zvcf!gh#;5-PhUb?#a!92u#*}v{B^Pc z5=soS4&6m&k|kG1r&MqfgJ{nMNIXE zyuGbOjAYXXq(LW&t?$m7DnM05LLio8iyD)k2ag3m~kwWkqB zV75F)byn&sF3_Jy!Ym=xgi08+Hq>iYm4>&_4lZ?`4p2Wkx*#42NaPan8#T$b5|?%x z74YP@uEu$vO{a`g=SMTb?0BG5H7fQxRmy-9&KE&h^;v?f*@F}8uM@bV9VwR*gzcmH zw5X3)BuaS7Xh(}t^SU*49fh~-w;3?yogipSykHU;6c4U>UEX!115oB20EIQ~k=>Dg zgvu78w+n_(luU@Du&s6kV{aro&XCl^qyrvkT1}_OCH8A%x&!^!TQ!qcl)>y?2%+!(108cAMNIK00Ow(LGDTy6W})`H)IuL!r(&%QZ5eN(%?YZ(gd^^&hlpKgG6 z=3a#B;lFlKgblp!fqe^~2Z-IB2Z#lUbg)`X0`^hJEgtck6c1bkbYMXe_zb+-`z{ac za7hD5HrQoE6ouMbs+fT=Lh$s3am`w^Edv!*$?j2~^9D*ux zfEi*v9RZsmFpzI9A{ZEAi1HBikjn!ERcw_ad>Ri#o{#W{JaZ5V(93*;2Lo(7_{*{* z0mvADiwtrr01=De57-<)jNQo%yfA_g1Kuc@BcB*84&8PJz#J(=u#j=CePecUUmIhgmr3j`{je3L?#a>Z) zi>;*&P#LlPU`*d{oFQxY4g>r|Ow3qm!qomb=h9;T&&wcnV( zZ~O~I(A9hu#Sf8w080%G zR_j}6062(KSr7ik0X~9njfGnIiMW}uI|WPr!~&GafIketAHIXrPSFeOuF@xj7Wj4m znw_X+bEx10jC3Y4f(eVSE%Mis0HRO)3(YtVSSEi(aMD$VY(BoAkbLr<11Q!M898ra6D#sQ=;ojH( zdiStU8$S^jGj=Be;7>4sZJ7YZjzj&Iva@5^{^Q-lx9or+v$Ia1=wSc`2tQDVuJ$31 zF<|kY_rDN<=G=hoI(`-b^3B0YVZvhn4KBw5qbLjvRQDZ0s2&5iz<_|0cNxP$7mN(( zf^F=7{S@fB{~g>10A&Cwuvme_X6Wb~;vjCyX^4pb3GX1a-Ca)O#(uS@^|Qwes`~u< z{L$Dj70=U}heC%xKM*vM-JHCmqohz-skAWxA_9-U;rX$+)q-%9Zoj3QG<-6KAu)CE zMRI`8an0k$mowQ?Voc@IH}j^GTB6Pt7k~1)VcEwuc8qq$f8)@aL}_VRRneu{K9e=* zxOjH<>J_Zg#fbKG2iNUlw*G(@60&8f(Ac=W|Eh<>bfu05V)M$@(&pHW(v=%HOR9tV zc8Z&ueYK)5N}g=n*R^CHH5pkPYMbeUWabe9sM3LVa;4RgGr5rcJc13EoY8x}%_8JZ zoLtL7QpT-=0dh)@-#12gHecChIM2}}N0iKemWneAU4r`TZIU%R!gy0SlRG;{>+Wc+ zL?{0%Th@eS{U1_H=O|S2r~~*Kf*s{VkINl=q|g#-noV?N(Hb(&{ZMWoa=QHaUR$s#`Bl8C(=PXqwMJBSqD8Y@p!7T_|%-+pLIMdEAT=)g1^foeTqZuq=0 zDB?t#SEi+GvGMcwS~{=wPus=O&B=#LJw2?98_?~%FXX#NOQg(Z^=2t8F3Q=&SS$aW zv;KXq!O~0e+Iub)>%>nwQ_ai1&fhfdPVLyk-6S}j(xJRkf9d$@6!!Gz@v}C=N;Gw| zed+v02GQ4!cQx%j)WNe{H1Y6_V18i?)}L&)WItYu@7$=2CE5 zOW7`++`Mt3#+9|^BKBY zJGD?pUG=Dfrnk@5Z&91Dp{k0D z+$mbB*0#S&m9Kwl!c;cr`gDEJw9LO)9G<4BYS1qiqB`mNDgJz2al{BaZcD)QLhR-J z&71tQz5D_VRh1kjx-^c8QUSDP9ueNvO@T5(W4>6KBE<`0W?4GbXX~`5PxHIXVA#>7 z34E)!oMrUy`0neIR{SpcRd`ERzIe|Cme=d|WJ^-g1A}9GMpHN{qPx0{L&5@FPHpl_ zx20zq%#MC-T|<<``}b(OUc_;ou7VO(C+W_=&wjrD#f^ZWqWzvU`)TIh-gaC1E@r0$(xH`k8&MUbWEzdsU``h6v4IUERdU8ndhbLun2(4*llBoYmO&7gYWJTDDY30h++ymtUA93ML%6VL` z7?pC8*Pf-)isL>Uo9pkkO?o$fE1D4hM zUpB`->s4TPX88+ezW z>wABv=Q*HDdcv!pvfLC+eSD9=L7?6Q!+Rn1CicCIS>-qA}0~N~AD>Faw4IazY^~ zAO{^HPKcQbxj!~13xx}z!|@SOlMHl-Q~pg;u@-$&__R@J-E_}@+nCiIoM33iqCVpz z;p`42-HFB8+6Cx_l3(-ENg-b$zqR=&gsV~pL#oVOLmeIGfVKIBiTo%bO`Uqh5-9si zmqlh({xs_t?b%}e3+us_y(gMEDlfQ=oNuecX}ZN)^cI)8+}WCIoNy0FZQ*zx*Wc$* z)Y5CwKd2T{E<#0svvz3E*4W)@k?3ljV86+bB4NG}Nra%l3V|V_d_XWW&ystis9k+fbfe zN~}q)?xUqd*Fn$6k*6Qn(&73ef)Djx;u(D|G3Dj(Vl6vu!Kpqb=0vr|^3(rWleGDL zpf+OzH8?%zXO?kE3s;suu2r|kLQ=GsuMIBw^iUhJ)y^y1AghR@rDYx&;pEoymhMET z_z!hFZup;dsdxFAwYO*N?y;flHu90Rn5c~Z1n;nc=+m4vty<5ja;{BV zC9`XpQ`y@p_1G_pl=lp!s%Q#4rKr~fWT86SDYIPhG1+)a9KRmot{F#r2$RE%LwCfF zih(a17Si1pCcsWQ6yA{Un`Q@g(%S1eeF+6LQ6ER7RCCP^w3UB(U51-Nejgh-y*K-= zqAO*s$M!A1oAX0oUyt=EZ5K=&QaL+k@>(t~*QnfOt}p2uar-z`*52aEy$ffF1}kS> zgJ=rJ(w|X0cEx>(v!qP02suAk`Xk|njSzK?-&6b3rS-~9`O9?)eed-x^l3koFS4Fz zOSmK6=kdTl_~ZQ#)~$~+Cxqlpms&=r{5MCM(3M(_DdL{qfs+QgvJy@j!k5QC(d9qf z`{j$8olj4L|LrdhYiSRXo{m2;d`9%+40lXn_?{=0>`S_C&wPBm0%}Sdbd+5 zlxs!U=l&Km-{fT@gQPnngFW8&XTqcw9#7e-S4%V8(9H62ZG7d8W4@RkGt1sJe|cz#)SDrarm~XG}Z#MMb%$eTXi1 zTRb~sT47`9-iEdWyVycMNnGOAt1PIaenfqJ(tq$&wOXjztQRNZo9)Pw1W)K%UQ1qw zTU`^;x`o%3^D!ChkpoUy3UhhewHrT1Cv!VXg0g%cyx>{Foy|UzXBnTXcrCOq;Qk}k zHw{$=2OiQIgd2BCo6Vc{2=rp=F6P@HzFo87`LWid-qdHpw4$zg>>Hos8NT?$t%VzO zHC0*%^JG3Q-<8gsn3-~An7;KwKd$U_`{w=y37bpXh;;77<%k#t?fHH|V@@yD^j~^2mI2P-a|XbJKZPFY$uQ6WucDJF*5G zlKx66+kT#7KkVEJv&Z9;%KJ)OO!NCpMoZ3&SIu=sudTE`c8WRG)XXz2d2BQ5)Mwti zvmd@4@qaVBMG>*)?5k*h5-L`==n|Rlr^t^O)UJQVnpy55hqK{-+12R0_4PWv8LMH&!-AeGa0WeayrBk6+0cvna{=rs0;060_`^StxM&>a$VK|F-M(VD-AP z9?jV}k;`87?1vw{Iq_g{rK4ukOxtpLVsqZ%%eIv9Vae?1=QufyV8?ay!Ok|Y-D8Jq zG7e?NNSxrKud7y1S>X#UW|ksNh;WfyP+#@4!D<)s-RYRH%w8Jcu(ZWx8c1SCr5+7} ziaY~+I8&DG5?Qa@YyPff#qGo+hcjHp!iEPAN<$SBAZFw!wr0vzEA!P$8xi$9F|qh) zMwWYx^%PWEAmQ~{=@Pc~rA@JmpOw}8QI~^MBh5BMB(apiwFd$ZGTjKQPd2$qI>O%h ziDD$h^Z>;rQj53sq>L-a$)q0EbOtH2T;>840!Y4dEcafqn%?8FUw;>4WfiI=vV6l` zG?$4=OJDOKu95D`Q5psi2}`^{V*HSq<=#`e^WfA9gC;StQBK->Jn!N!zI@sF@zf1$ zP|Qs>@~l@G1=w<6kiZbwzux&`%BPn(&RYRs> zQdL8vcJPnnt2wVwidq9|VWzJL$9*@B>-8U$6h+~N^Ms;DiAS0ljjj8GkDp|@{D6^s zWQMda+JORdnPo-mGu4R2LzYHNl3>ko`uAGt``%VTJyup{Gxyx%v3fv!P*V`W2M89L zc?%M*U*tM-{jr%4AZdts$a`<t?Cp+Ikr*<=k$%r&_&)m0>QV;IdA(-}$vgm_ z`9y@s-XvRLArSCL?-L^OI9O;zm|pGStL96N=(A>O=`uo7o#Anub$5A>^W)469x*-! zBn8^9pOap&H2~cd*r}UAr!vEzXq3nzxORR2uao}==6Rm zOdofhekweOk1x=O*Mv%)T<(EYy^vKMBtpjYaUa=STE?~kC*;kKUQB`0A(;P!#TBq6I(ZPvZQfUiI^owUNG{kkRqh=J>44FiLVv$Yld z17gs~D+mY*_~Us$Pg%Sb576&Fh|M8BpCAah3c5JnP&NP$Kux<#mO4eBb^@S@=eB0O zq_qZVRD6XHkwps8VpTQZmSK;;6=NTKXV{*9L&Qd=vpckjG)1f*DyZ}P3dh3_6 ztgN0w7So6WW>%lB4oEr7fZ0PWXrTnIaDmxtJh*SFL^JFt(Lv2KVoV=hVwsPlPQ?_6 z(Zh#2GnHw`w_m;d9f1C!g7#1&5M7rDW8hs5_yuxyO^*HVNQ z1C9s0zA#0J{Ha2KCRjFR!u-q@`I!TPKRX{*CD`Dn|3iHcC&W=U??YlKDDG|knD~r4 zOBy~0L&dbCMT!3hO5%8wWOr*(;=578H~mCOdV>npCkw?MP33)yQ3^h0FCkjnCV|6lfP#gbbU7h zGkr(^N&V~WI18XUBE<2SGD(1^H|IyU7=Hvj(yW5+l0Cm8sqpI}JtdVeJGV2JsH zkp|#Us!+YsFGM5>h@>9@W5F{UL&9n znCS%|TX0XHSOPQspKByu8A$_GF%umiK}!OayA{b)>Y{@DL`Jm*^lT1G_ASb!Gck~I zFa-k%S`7FVfJvGK9PDydfHs0rnglEtC_xFyO7(kqQlJ8A9`HA?!#|drjZ_Dg4E>LQ zJ~LSpX-+}AQPs3X=OUVad7I>8&9nW_g!L}y6^_ks)I*ZpsdK^_@?X-dQM zxvL8-O<~4=K^nZW@{Bi)C|M-OM)Kvd-q5g7(z+g%5 zfCaS~A@@R+Or**%PGqo;K!ZsP?{oV538W!+TkuI6JBx%FZp2u?!a88{>*bV|g6IOk zq@TC`^&N+sU{lcesb33T8bZUCj>m+1P80TZbWa(}!O!!uZJZT|Hp62tkRi zzp#?QFB8bk<`-0ezH}0N2%-Du{se;V?ltE~$!2 zo3z*4YnKU_SRVzxEbs!+5rg-!#uZGF6jalT6x@vi_&UR&L9_lyW-1s5EWBNVY*I+? z0@%x{6qO+Gt`{hge{lb7E_b|z7l|Pb!L=5;oYns8w8*fqk`!2wDKKWn2Ef|?J{QVMw?p*+HfOe%C2^s(r$Uq_piPj@npuEp0s?xhS zqzMHjZNc{9>Sv`_U1=jQ9t^-i36eE{1+NK7$NZDz_>b>9cvb&DcnEcyp%-BUc)*8v z2OhD29e9APlnSB_Lmp+s8(aT+bXe4ZA&Lk?G7^Kg8;=m)zWC2+fCwt=zYu~y3E-_^ zfH2|UwbaD@gb8j3QV|1mAsopJ8H6F};oB#K19-dxe!&AQlmMR6BN0e>3K{{Px@}|c z?YYl5j^{CzcwC6lXqaG^1&v1URH6P86!iZK3SRCrfOO(_K-tM0F^>a-jLqwzCWwdV zUsly$O9qW5;Bg=x;DO%3121F#jR)ugD+b7XyFRLDxC{P_Fh~4+UEn5wg&;E;FZ%Af z6A+99p=04lnw>=hL{u1+mIQzbWodc9*8F!Rj`Iy+JCI;@Ai>LLw7y=^D{p_C~2Q+Ack${9V|7rpVFr)Et ztA9T(I30$97>xmB$NJz60nt8}P=a882jL(fOa}+@ph5b{%IWV2sgtYCq~s*tMF)x6 zHNW?hCOdyb_|ht_u9!DXqzuFlT>Bpn4QZl{(Miu!>QCRj8eJp2PanpHB_Cje5@JdtR>pF{j^EJME_saC@S>>sfzYiFD74R4E;cl@+h4Lz~r} z1EXgxF6eIfY>ccz4cTK2xWUcbU`FiL^6LCL$NJRJ%5p=YRYx7JzshV>w^W_KB&zYC58@F_XtUTCM8Xj?39JaO5Inh1sJx~&r|L~%d zfUC=k@GkjEx2;31Zsk3t&&EC}Rwl_zt~+Hq_2J4mCaPV#aY<2LS2UDDQ&0UU_p4-2 z-opLJ6wPnWIImm1FXQdhmkWko+aU{G|VAoX~zz0KpJydrx} zrp4gYv#8~iDM_n1m3a&)8y%b-)np>HT?DfWAF-VS)st1i-)0@Y*Z#3HLXS1^ik`~3 z4ri*gLI=jD_Rg%=L|7Bw*3{B`0f`m2*i8=Hd+W#w*%dtCMGbTXo$hEQGgenU?Lk95 zP}mL%KZ9z?xz~@iwo>j>QFSZoIK)F41|s=z$j(p@K?|bf&uV~j#qJW?F=CpB(#VK~ z1hr$u99r!j@?SHPz)Yx!nhY69fnZR_3TBZ#4{HL^$6leE3FL0#%K|3Cra_8M7ji;h^4B-lGuI|+%JY`X6I0AA-3d8>^yk zpnf8O8NCl;An#hCBD6AbdLXLO_Pg4`%EeasEMiHC!$z)DtdLZWL<@#wM2Nm>k6Oi} zlKbAFM-PU?wKz=gN#SlIdSKghMj%K)(<5-j;L-kCLtZ;&Z_%sAtmM_sGAf_YFF-Sb z8p(C728_=1uMBy!tUxGeBDwBhqH-IC(a#0Maeh8gXpg0+raEqj<6S;L1>z;YGiiVT z(EOty#L`dl6qefmJ_rDX$aGl~j~?leGh<|v_oxF&8Hb5HS%EnR6fn-bU1S@3I3i1k zK94dC)MGZf4<6e{`GmZCG4%C?TKi3UPBYO*m^UL_M1jRl0^jV|#sb5E~rz zYS9f6DpQVJm;dx=B$Gyhb&(BhJ?(gj?x z`MlVIO6Gl*Af%13fiP))CsDEa&R;8;q3pSv>% zi5=Y!y%T!*r$UC75W{bZvb$t#v;;vQ|3m2@G{JiokTuaeb`^6-J`c$T`&Vx<;!P2M z?`aay)hr+*MpgiE2gD-@Gvebt|2=095E_~A5upF{;Ny}6ps@U3@`40D9tmucpoT^^ z(hx-Sfyx;|rR)!p_rL*{(SyF z9~U3F`p72knFHtXBNcfMi=UM@o=vnRdb}{~DVleu@0Y-0W!ae-0Mk1P>OTn;kQVImB7J zGdE1T?F(p0V6(^q>nyh!Oio$_m>kJnW;*Z)`oI(pu-h&Dfa~$noZD|SKodcl!$*n! zjUDJStpY}$?n)#rbXXIqMht{hAm9jf>9wmAx2G|wg%ive%KXBOz#rzYOU-~=^Er8QuK$y|HEe&YU2O|T$>jTCdN$9=?N)S95rzVK@+~@~O zM;k$L0E%=*@j(LvNGe>dzqsH0S^t8uPaRuZPdkki21e%UZ<6Tq-J&vh6wa8b;mG!a zeey^5=)~%L6t3&QwNO`V%C>K`zZKiXci$eIIwBuArdy{=>*SC-Iy6HMM7s9%?WrNW zNEb52Gw;6Fe`AkGx76Ijc-x$0t zSIZMtDtS#S*I)In+P>@`O}q@gsWYqdxa7St?mM3|U}ljght-}Py4}Ct7-@0%b0$oN z|8_xXDwM1Q6CBVo0($_X(bayi_CUVAI&|y{0DZcJ^gyXaE0Tq%bpKc6G;&WR-Au;} z(8%ExI7j!0@EwoUw`atwpNx2V+<(5~(0yy9up0WOL1!nr6)0u9zn}P~pYJFk6qxh3 z%>peQtIvD_wm$1I;NxijUW*VKyeiP6?_l|WZ#K}@p`p27`vVBF#cLV|Xa8z~b*&!o zpak_C4bH-^L1)5E;57&ox!Ax#SlIxaPjGU+`8;yppNdA(Y$GvHG`zaWzr@}zL&<6u z&@Qw4&CgaObSTI@Gf4(fhvk~5)RfQmw zmsVBV$hhn3>@Aj&sT@ah)P_e63&j*ROl>=Dca0#zik-$4(^I_)>u9l8Tw-xiUujF% z+@H9uuk?C#H%3JX)0S>-{!s2-EKcqoTsHUE#`Vg0ZdR>~oS$~{Ej1VIrkuI;f*t3x z^?81Eb$-ZA=Y-zlx_rySO50CYwn`dkZ@lb2uq`*~kM;Yowb?S)F=K>o>eaG0F-7WIUrGP_?9(T!mSRh*EvG8ktEabe#AZXVrB!3LKHfd6FR+UJ_94nw+xec_`o2YD{A=VYO1@T5(k0tQpSNw`6r- z*h2a?woo^!^2*SM$-(8NMcMJKZz*F}T_Z+ZzvfG(4yq1nxwDNmcz^k^;=a8SwbJZZ zQt&ErP-n^avU#7{?9AiVS(&L7S?_Bz6?bW=2R_Y6cpU3ZPeb$ug`}LR4C~d?W?g%E z`HM}OXodu(0;z~Z#f`Jf5n7*bI~AZk5WZw=?kXxtZbHn%rXCNH`aIqDfNE0M55wEU+Y;Bv?j}nnItcm;uNpG`+9(H_`pq6G$w7ac- zuH#Tq`^O@w5bzI`u!NMz4Upk|@MWz|XS%xslU>{JOV)R-&x@G7?(l*wFa1VH-a{|e za%;!7RuThcRo&KTQK9Dg;m&wxmv|bRTiQjs7wJlCtoe!XQlqnPp?lDN@x-|*W{Qv@CUIA{n zYw=j>%k}2&4`;hhJbhCknv-lvo@1_9y?(TBYz$C^Bx7SP{gmXC-GGPy+bCiFI{jJj z2aqcd0_%F(ERvP-w-HSSFF^u65gF+79N7G4egF$3y!n?tTt!M#(DcohY%2|~j?Umf zsq>#AJTTT0_PiYf?_YZ!P$1wvkD0LF{4$bb2;?|WAsGs997gY?BbY;6tH7!?Bae4< z>OtA0s2yJ>*aGmxH&@9}gkp7j!LG1dC<6IXc>5kcUiI%i3hsjUoPgC|dk$#A?>Q=D zC?=4z1@AeK*AKAw;&)*$auf~ZQbuy16o@`6WVBT$Dgn5cTOcK(B;6QWh)5j_1xt>? z)5A0EMPmpS?>~9?K^rtjM=mG?B!XRAE(UM%{cDgIF+5}ZIvMz7z!FbzHNmXa$Qz`D2^#w<@52MPhkA##U=i3R*7!K?h|L||YW@qbMO!NLmd z*@wb=D=>J*p+7hu!QEn&vG|=|ml?C$!i)iq5PX))5DSWd82mBkh!SE#?=r8#=Yg3K z1eVu-Gpb;a_K?F@?J~{7SK((UjRghl+%k~79FQ}PQ-f!9H9`O(9Rtk;kqAKs4Jg*q zC#)zk3Mx0tw&ji086|oH^C1E>oOejL0V+GuxqqPoL@yYXpZ=Yn@)3q$hvxi4Rwp#= z$VZqR1|xGwe;*1MrV-?X7+x<>hJ+x_U;vE|9u_@*01Nm7h6Oq%fZA~~!~HNE%ou#; z(cg;z^nK3AHVePCq}^1@&*7Rdj=d$A6bz7{~C$*E7z2DB{$saq7; zQiH@leJt00V9R$v(J^6m-oZaC@gM>Mc47(s*W%nA6#>qM9a9jQC~C*Cjsa%tp~GOL zQT!+>$YLK*{p%0IFO3e-fzs=uC>j(c@TyfSY;ZWt30C6A1F{D}v^fvce}qY32w@WY ze!VNdKNkdj9*0JNykY zJ~l#_X?JJ@h7cMd2$_ohnk_;^gdjAJ#orUGLSZNgOeS=gfrNt)T8@#x$A&<|a;W_f zJBS9riG3>kKfc~PkgMnWAAi|BuS7z$mnHl5w67t%QucjUA$th%Or=tmq+Cgake#yc z(q<`(KGN)Bi5_{d+emDaOo-qbJx?Ba@F9mc_4n@TBjXk`F3hs;7H@EWFM6%e(ZNL60?M zsUM+QatD>|TFUpYEZu=4Pa41dIm0(Fs^aY~GyhYzHy|u8F#cRF!OvVZt66*my-JtqS<_hF@lY?!BjB#; zNzvkX? zw{otOpgsEhrsdVPg%{t4cD!z4Pslyibg+7>j|Jtz(DXuEzL`P76$8$q!E1)M&8PW# zX2POqs$;S&+$HkcXczpYyUVoZvMl^2yw2irS5#Z@v2XgraR;KidDRz4#frp#8kkV( zzVVtmYUIc`)|+eS!g+aX3i_nLZOc{FoUG879n6H??~(XWMf06=9%Veo89(*BA-iiu1}X_Z|)=d?)?%_ueyvyf^uB91Q>4E= zdO7{f>tRvHki`P(y>z87a;n!7Al8riWSp}5bV|MqD~Uy3ui{8}5jgo{S85oCB~P!r za>B{8I^t1;g`KjqN?+Vc8)Z*bvhWyWc~R0giY}?n%mWDzpTG6X2$lcwaz;*dWtIb=nJ#N=*(aQW2klRJzt5WC{Mj%u9b|UzTZC1lYxP{ax{K%59>U4+y=mJ^9d5fhZ9mrb z>yfz3nAEQVLC2!#`J>+#oO7lECkj%kPwA|o;*^#L0c_ zmn&t+4L6<0H>W;~*ZEm0IApai4t_c6^E%YQS5#Iw!z=9}-(7~#*CfM|@A_O7I=8$( z`%jr@F-L&)j>gD<7{W}(*zj&ptbV2nD?d8?@87?fLLfyPhc1d?9 zaLyZ=0`#|Viu^>MT3cFO>8@0kunN6;S|^4l^`%C-Ct2oIEg7EoBM!mu`(vFh1vmKb z?y2wdF74EoW4Y|HgCSVz;&G8H!Q9zTLZmKMpUR@3Oj92# zPzVc{$N|i>YL9iqei|w5pZ1N&3>kMj&lYXRXE-nNK%-0?nI5GdBy;0*0GRZ9aezsi zVle4O0)~@j!f?_&sdaDl!{Y!VeaYD7bfyN6kZ6ad0Q^yH5E3nVbIInklajghX(vrn z_@gR0aIDqZ*h#UdZuxMQ-dD2g0V$IlihV_lkF$j)wWE+B0sRzU(j6fd-$UII+FCcu z>PruW;KKq^orId)lSs8RxbUHzVHJd%b-E0Vng@i`YE_wHZXMssgXLOd&yTpo%znDl)NCS65@NgEPj(%b-()@F&dm(`#mix$0jpK0vec^ow1Fnu9dBc#nE z=7iH$vgn9Ip*GfS`^CC5r5j0XxI<4|iU$aK4|PnT!FUe&Fo8;29ZKabUa<~SH*?u= zxTyg<~P4h8RlPMk;inbt{IFPQ_5tP_~yb|Mq2n-4KXc z7P;eCt*RJ;%T`ys)L_kxqfNTN#C@9UqwTyqPyWu3z00?_wrEG$m$DW7xLHDa$i+Kv$YP@M4+4f5F}zJ46E!N#!kVpG zcU`Zx5zQetFb=b)Q20PBCNd+kS2o@YW7p z1K4M5v)&H^i{Tml6@+U4<Z=7zRhvA@J+S_GuncK8jn(!lg?(FUPl*-(}oJk&5s{{wxJuk-> zqMLJb62A156g4caJ$Cn8sw%b%`1-Qb`_2u&y8a&{GlF>v_p7TCf(R^~hp)#IRy-DA z8}f6?dFiXH^^=yhfu7Po$RXOmM><=~jtwELUgz_9)9-Y&BY>Fh@@&pZ!KnJSo* ztC)1j>B+R4uFh$Sw}^aYs9J1NW|O^hbpd^(iQA{LW@Wn2ty;nVjb-*@mh+Zg?N=$Y z^{AG4_*9~ANza~{PnWxL`}=&ns;5d)d?|Y(p1C~gy=zt`IMrk+eeUd-soUjX zb4F-K`q_F0F;cc9;xNXDHgQtUKOybb*CZHI`MII5V3<55~ioc?=y6kjj+lPqG< z=4qZ7?dCr=5A5y}0Gd;9u&)-O)__s}b;BqkwvMlIu>5@*hTt{WML4s_-xrJ`PzUf# zE_C0C-zEYv2|)4kpduDHh&LmF0&JHXWjT(SHcF@fg9vA9BAo2AB@U2>_z5coxn;Wj zr?OVoXM@`kM;pE831;uvh>i0f%Ld?z|0gdt;JAPCf>^Z43-Jwj*=Fz*u&}@lr#6Pw zB;v}CF#Zi<21ki=oKge zR5=$D5pn%rsevj0X>y@s7Pt+(9YE3m)XY_4K21GGv8{Wgi$vjk^2AHibI{ro_LtjMOhoLhVT>eE7@AiWKR&zl9MvW7=ooEYy zB8t!AED+jrv+eJ70Ow9+yYN|VeZsIHG%#6zN1=f-$SMMY%lv-@cRdOXDs*APIJX&h z=HJPYSdYoG_b{~@B*XgKezqBdW{rTEP45!DU9evM%UeklKn~o{05gQ!)Bh%-`2Q|-~)fk>~H%n+?^R z1dUcWe2+19pcf*3e;)z+OymO5j{RRQtjD0?Lazn?=E8dH8IbJ1ta>spToS??L8$H>B`lG+WJYBrk?+;Vev$puI``q()A*Y7?>gaMretD?~|bf zEnp(o#z64LP|4&?rHBWA6rxiH^6<|hqFTlO4THuW$J8n_{%^}P)Diu7I+9_(BZdy8 zfT}s5L9I)Q7bdcR6gDx~mxiDf$yP>NJ)ie|AB*aF4MriMw|N%UUYczs&l4EfuiDc! za1a!3jeT(n=o6D!vbm{THz}eL#b~9X+41#fq@MK3ukSzSzF*y^DQCd5w=TV;M!|jQ z!2Ms(xQ}s26)b$6=z7no(fLfnjsvbo3w){ zL4H?CSS@=_?d#pYve5i>=6p@Of=77UOGj6Nb46(&!Regmn)z@m$x4uqqr2syN-~1n z+VtGJ`tjcSn!$oQT=>M*#qs)Jp+0;W+yWLZ3E3YZRMl&f(przb7 z@`-#`s8OUqu!wVo&)2Rm$51c_4LRlWeQGjo3G;c8?!2da$M>=uC-VbUOdD^D8Maw+ zZhznGTs?Nur(ZvA|9Dts)7j2newqRj>C-&V3=G3ZcUNf_7ar>>Ql@-=BYgU#qfhXf}QXNlU3%wQiSx7*Z-guslFh0_kC#_Sp-J|51gS8oYkK7^Ed&T>sV~piU zj@COXfgLW^x3!jH_m|mAaZ%79CB2-bTpje&<5KcEyrWKgmaNZ?b~JvbtKZfauNKbN z(d73`AwKYN)|11sy&lj(?C-*KY zOt|GF@XNUs*hSEXp1(PrI6N|vM_Bb3GQIqeds>Ep?nrS+IlsJXg74$bzHQC9osArK zv&heRweHZAew8rPru3*>jI=30>0OiiAj($#na?EI@1VSi@b$;txp9N>kwt~y8Kxen zjgCedV+#?z@IkI&2P*PuftzxAZ)|!*fZaK5qxD&JG%l zXLIabP+y*pN%)o&EpJIZ?DM@Zm2gN;SN3%Ip|O|uK2`6mxR*{-pmvq6)aAYJ4ZIqY z16816T|}?jO}P^Nhr7cg14d2Cs=4N0(!Jw6%CB=X1vj>L@zu9^FS1bPiO4ijnGfER zHe0hxGcq=UR+{_=kT8M$g~Mxl&l$ zf9EOn9+5_BC+D&x2)MWRNa=!|LY(VFQca%uZeFxq)>k@CYa)rN=mvQZnjSv!BVO=U zuqW$>DbM;=*_wSv-R9n^yEfi_p}m`MU#-r?@=HbEZDx&Mr=Q!<$)zgHapd~^v`n?D zF<2b9s3SiXF!y#)bt-USfS2O2eWRKC&9cRk+v!b4Mo%QAIONAp&%KrC`6noaR%mUy zQ0!=NkB{4hGa(Bn?wx<%*qBlb0lLq#2AEv4Y@8bEO64il7ZXh1_fG*EzWC`!Q)$Be zvCQ!Y^7BJ)zV>Hdw|Kg=*u@p(T9_?Y)>>U^`S3wc5Sk^Qvi*i-XD-#P*f>>3*PR*z zEwg7A9zFhvP$|w>n?0*kl%F{9Cb=6K`}(ux-SkA{)b&Arp{^Lt+iCh;RrRKVnuE_I z%CDAimh$D4oY*P!O(_$p&*iVm75b*CLfCSpieh(PGPA7@%iMmK2qdKHR{F)KuA!P2 z8~S6DpN3_~2|h&docLQ8Sfiy(YQq{-KdT;a`%wnJcv4C6oI31M_4#;{E3DBp4p*f} zyXK6k@SJXC@pYnYcrmXK8$o+8OAUD0#ftf*Uf_2+>C~`)OT|s<=56+S3``h(2+pT% zBKFIuTx8XAZArkT<6Bkh!nlpv;3bZzdUZi<4(p%?)EyUC^@Kl>dXZ0L=+iXEYI3#+ zslA;aaEKKaE9`*x84BvdxMSO`I~kQ+g`BSsJi1__2cZ#6^z3cn52J3di5_`bZ8kR# z(-jjv7fF_rM+0R%E}B4W1OoY!G^fk;6SsMrW1P|+2`L=Eq+5F?!_di+;j%>lKAU`t zjGh2eFThy#G=Ep>8KG~-@(+m|z1zI!O4V_nD>ihXT1hE* z^Hv69tguEBGOqDR|6&KSw0biD#Yjram7w9x7VX1aJ06E#M?yFh9S`CitO$)(HBh*9Fx3{W9a6jDAJ^K)_8QN zG5;tsrcFYCzIf}(jaR61YfTx(j#2hLe2~Bm&4OjHSR-lQ4bA+R%fm-Vq4;itH9zk4 z%H=~acO2%E3HKS!L@H?oX)vDDF1z_r)3z*$DOUK4Cds(^X&cQg__TxU`4LAHN}X_N zQ_rc>gr8^V$MWBSai7WfIb-rPoo-kNE4-{Njk1xxI1i1v0B|Ny(=zO#kaYw0~q-zQf-9@-|mn@ zv1F7(teEij>_Hno#)x{?+tzz(rmYQKe43!)PIol*CcM|#8l-&Mf30kJ{@yMy0X}+n z@<#uz&KKkKc~+9ki*w%d2dzTMYwQrHo=@Ce6OZPRDPYDSIsk;{;SjXU3wNMI>M_on zdaG-Vze;b@cs=1Cm4HWn8wU;WoW~9t#9$5owd7#e?Z6C{zYiMg85PhAl>nK?2EP%L z;*Y^cpI}`NGslc4A|C#G9s;Wkao9SQ8^dP8{|$72?y>PR{SH|1FWWGyPZtcE?(yb9 z5D!H}Tj;h*A}0Vw4xaGDa|TQU28$)F#&MJFFY-qPs&V`z)2MkhjvcTY!PU6!ym>1e zBWiiFxj&waz7rXU`O!A`vMBH&LCVX|G^k~Utt4(pI(*e)>BiCsiq=%)SO~Kd9}|si znULXki8XS|%UWx*f-AG{GHw?8FV2fj_G*~@oF~Mu{``LRs%I+yNzKU_t1RB+6Q@oY zbg8g5jr70n8`^tzPp}^?w!iT&OH3Ppx%4g`3EJf7~ad`vhDXRgUv$hMC$hjprOy%`!me4%DHp@-CH!PA5% zh9c>vPWE!v)!8pY`v{erZ=V-Z%C;NL7+|vOW~1=8J0gY#B}?sXp@IKH<`_ zGlETT8y}TNnOWjZEz?IUYd)n=H|WY3FW9#Z_A?_+L0=Y=JnvN(@>!azmn!7_+a?dc zzHM>FobV>qN99UiU81|_MmZVkx>`lc*?EyMfyxeI30 zJjWV6@*Z4m9ppW|YDMuyNo>lyV&%ipXWX?-S8anP=jA%$lg9(M>{e@GRkb*288bCA z^zdGni9s~wuY9HRjYlV>jEe)xq{3E@xyCsB&~r_$K*y^3cB{5@W?X&s?1sTuMD%mQ z6{D@CzO7_i5AC=u?Bw10oT-Z@NQ~BqR=2|5?lIpvXU>?xJ+*fNI`4Sq#cfT=(~GlM z6gtdaw&rl#7A>^N&bjyalkBc#Z{c6bpQim^&Arg{i?uT?wc7Eui*)8uh#g6n|16XL zn4a#w1;=9tE#zW?bPDos-Px)CNq721V}Fdq4>xWXi&)DxpMdvQUd@=dFUGNbb{)+x zJkN*Pv%Q{wo-uX(-I{9d_l#i+=Xb7Tx$+Bn0=QpZ=+&pVa1w8nsU9avB2}VUk2_C} z!vaqJW2gScctatAzQ7dX|8U5HJT#yXd3J1G9BrD$@aqxk(bk4_U=)4>R%Lx>vEzoU^fb7Gf6cDe`#5;fU1nws=&wIKqFm^*?0SHyfg;I9^ z9x4>!!_{G^~ioEMpi{bajXd`mzg5%HW~38%qh;8VB~NBJ(C! zcH;HfA{D3h@VyIfYt`e#^5t1O*RRjys1lc#IJ2@$`E%Im@~m`y>{6v zRuj3vIwELm7c)AeNr<~jh_5*}Yw)rqc|O3ex2b8_-20RUL3ZA!Cb4A(mFF>%3tuoB zX&srr8oGUa=CoQ#o0}PG^5!LlZ~eXzt3*Qe(%kv^M2UW)g?op;h z>Zu=12cGN`Svv4UXQg+{VZiFm*w3(^{ew?rR>oy}PADxcGz~}k8H^b83yThve9C|C zQvOBlXf^-xOMXkk;`*^C4bt=8AJ4lMi2cmpC$?blHRrX%_>KELzB2QB&&(Cm1r&_+ zWLfgnEDq`_i?~v(nMm+e-TnS$q|dOy*BfMA|1AH^7(yE&6U|y>*k{>z-!4w^ z`5D+zhB}Xwv@nSZFuymuk>HvZ{A)%2M4|v$fljwcivmkrNaY)gzMx5ef=owb@Ox7^ z_nOH>wb!LTUJp$sI!qPKIhpO95AC1l9r9Up?JRoYsy8?KzMlU@(cn}!p>&Vkp|`>o z;%JTclgPswmi_0y{=73{cK%F-*VwxQa}1|fs9WVe9sL@9zaaa3kHu^$-NUIfvC26j z@;e{*RAh}b`4>oW4cyDLn*Vt2;~Z0xVH`10AH+!dpR*ELLEYFm=QrSQG?5nKLGE=_ndIRq(=}Bw3Q-+}K(%t*U zK77r#%f*bYBzn3#?F{9_oeB3Dt%j>zH!FB89}OH^lioA9I_>}NpqJ^EXuVETuR&L{ z7k!z#dt;;m2H%%fcGc3BzcDox{mH7J?>H)r!=E0#!kCgIL+Q4jI`Dzlp<1QH6Zsr8 zfv#jvT9;k-h(U5Am0gfFke~>81HFvF?>hKHS)f1*ctpG=5a6%GtG<^7Z)NyS+j}ZX z^3#_l$E$MsHq$cD$_ahlNOY8UUpV}z{P9A?@C7>K)AmR(H9!63r_$lt1(Q_ZJR+Id z`ie2M3`-xF4Q?%4MjudIJmVhs6|x83_?KRJ`*Ah|Bk4oo+B=V@yD^RK<2)h6h{0YePwy9y~*6 zDcq(Adm|v*PwYLbYi+L>aYOwKH*mb7BF_(ltM%*If5^hMx#{B$CS~NS-kWlK@H+PF z=La6#c39#>n}8p(_y>?{Xs4{>4JU7QohYul2Utp?Id&GB{-nZe)|?A7?4g?9U3m;_ zzB7ilzV(y1pmuedG4y~t5ln3JHu9dxGESv8yUMawF1+te@K!c7El$o@WoZ z89K?sV^XY-9uQTrovgD4_jBin2dRQ)G>rUeb*4$Ft#7F=Lw!}<#TRJ zmqil>odZ@7n!s8|B;HZE4bl!pC|0yMWmy zEz&Y%@l9_>_6v^ppE`DR%5OPG`=w;0VvS@^MI(f>!{YIPy9wsCynf97A8yOo-UK#M zTpJsy|7-*P@+QH9S1|E1isj?)&pQ--{{Wj8ovw||3)=Gmwj+V|)O)d{J;V#8rU<(- z+Ws!1UsTt(CEmJlG1&k0KhXxadWb0}*sIjV7gp5Er+7+w<>XH7G%+{tMU%NSuO_Qo zNZnuc&;%5C!ocL}cjer4&G%X#-}MeomCC6fk_UWve0=xv&$+KZXOuN>={+9t@zZpj z;F<7pnU@^A(V<#5fvYLhdNWV3EJfiwS+DJeuPO`>?B&AllWbPy5~s>y`kEXIr+Nfj z6BBnPj?Sm<-P1nhjH-@!f0FstH6!Sz&|g&z7;uXx3=|NtJ8?2-HFagN#AoHK=EI`+ zRhd!w`-Q3%8yN6Z-yYkv=A6~}vFnf8pP955aoer-P35>26FQr3`)7UebETk91q=kv({xon^JtCMz5=h5 zFGY!}Ym8;>bA&tmr!q}Cx5+ub**hZtNN=g~r{RcSbJpy(l4TK5g~-nyVy4VL28MJh zEGHA~_@6~Z;K;MB(%%36A8{*hGD|8gJ=^x9P;}hUIO=4D&+IiqK|*|uev67VcG&D9o0(C~aJ;Sm zS%`gH+=0)6jWCxVeu6hZOKOqp&5AQsu)-dKsf)4yz;L+VTh8eNkh>y0QDJrAWlqOI zcIGLSN*hD7hrPouUcWdd8UDsvJTqqAHh1TT*DO<%BlH0Y(aee+;eFEqitn0)+Lss- z@lkxKNq2OZCnm+cj?dhfEf^M$y6xL;cWZR`vCh_+Zmk)@=i{6eo!j=yUXqwl8;u>N zV?>=TKcC@`(RaNwb6D;ntM?0&bnfwH@q0`6zsYLp4U2y_&m;(*n$r8#dF9f#roMe$ zy$^EOlw4ivgUfX^WXp_~e9oU(jWt{FE8AC-9pIrGVfID-xZRhaY5|EuJPU>e^UqQS z(|6XKXpFTeEA%A@fA&+Fe;cZ8G?KCF4&ejOyV#DhRpFXvpLf%tsau@${P^|Nl8TZ) z>g9c}%q$(=N|!~rHyqJEXyyIG!oVo*(7o}TOqt_rKABBV7FTOjE$lrz%nW=VtgdD* zRj0fuDqARtm5w~8CdcflC1X`QCP5ZRCPJ8+bE?=iD6PM>o$zk#%-!JOkd}p@S92nv z{wxB~Zh;1I!|YyF@6GoLlg{lz=*@D;% zf0tfTpQMV+OC&n1ysSmu&+$qOU20+N!*?E$F!JS}RV%`Y7(w$|5VWcH4^Q_OX?BC$*OY|A~czOn1Cv^o3^6A8ibxo}SDR~GwVSsNS*qW)>ErclmG?nyM%C*U zR!YvS*H40j8}8|}R_ZePa?-HGnset9}bg7^6~0o{$xVRZ3nD zNIi+Rj#06qlS$Nc1V`*jMiZ`NMC(gwSoz>ehLIFcenuaVtY02H6H>0dOCA$_T!4J$ z_#IxAi@}ihm^|8|^asGJ3-4THB^7QXC4&nYc#q*Wev5XSRSrDEQ)e5}Gw1?%TK&7S z*4Da7-y~ndeN3>%(o(9BkmJprXACDQ?pSk&Rx1+3c$?`@a~QW7=G2k<{zjHBqGB)x6%Me)~v*O|+9u zV`s6t-Q&R%C-U_npt(mLJCv?`XQg3@i^auE2{H3T48d&-D|Q>h5-a%%ehq1p z1h}-79*2QxGjMb}M{{Ze>OPjbP8`74b{H6&z=V}5;sA}^z>Z6w7kP6@#Ut-?{+4*h zJVQaQ`xY%ZHAu3Zv?IR&y5U( zp2ciPe;eJ_@s_Cd#D>vrBUY~ky5|FUBj*3Yg)$L?x%}5G2H|RnrZ&NeO(-7zHwyJ% zyP7x=ga$Uizo2+{ar6OZJaYN?`|1IjBpQ!?e1oe8VN_-kHm2s?fFR9HhX^)!FfG|r zbC-OY#LZJ9-RA=XehFThJac|y>;N5vu)A0`$zVs^b}~HV1^nM8vyEUNf9{ok10*q% z*=C|ZG-(2Cj*ty6f*JoefD;eMH{$qx7BnQp#n7jCd}%|%Y^_c@+h3#5pHHer+aqIMg#U-L!}M`UwM> zz*W!1*+A~ysiRkAvl-vXng&fRd>!%4mdktOmnJ`4H{#nlR{HV{-&EJQcU8iSSKmFO zo~vH`Q(bFA%eiyRL-IeC`Tg3LS8qzn%a@G2s$Bd^cqf(jr250L<)GDx8A0ED3WF>2 zIJ1z-&Ub?~eJhJ*t4ooxK~hY&z@l`oD^N;fetEg&tD7&OiZ`n;_e3R=NYt*|u0cnV z4*DzlD-TQ_>zq9}_4$&SrilHu<2@#n_vT7Nr+B<fhH%oXGYi$8!p8QJm7!8%QO?em&$$>|FP!8WN$}-;{s>m zilT#*;muuhG*>2?Giz;)%}RAtzhrBsXB=gw!{{*QQyZql;rNOM#&9|R+i+oem`_p@Zq&(Vg2s5 zkgQ&Qf{wvC+yl3a@4G5j`Suv3gi*B!myJKV({=VIFAEt@lD$4{+1tdznLx^OysOCT zYSn!I1LHvkRPPzG9R22~Lv0Q5F@U#r&1(SqK87B0QW?t!0tbmG==arAzCplRFK2-%a)FcXekYJc-=#WVB!y`OVb6aW3_RQ?-pfz^o$FD^&cuVV?y zvtBv9KRxC>q{L^Le1-fft?W#!BIPLi60`PY4}Fr{TO(4mC||Naskg+s z_t#GCD0)@bcqHg(_g1`9nMi%)wm&Aijs!!N#=?3y|>{XLpZr_K1qki(0Y zZ?`ZAx>ioG_B9Xpm?_WC7>{gee)^Im(XaQr(zfLn7X;t9ZEFu2YT5fb?nL>-*Z!ef z{d5l;UY|{yS;^OymLl-@mz@)=JwvW5%WEqAz)*8K^ z4RffFTB_bFdqR8B)<*O1S}Sh$0gS2osRHFTI$$0MSklS5ASONG7c$_*-~{&x;Zwi zfp(ahZ$<^4V0FkPP$~OrdW9rWWz_Bt=E$ziZjcu1e&C;~O=&Y4AMGB?=6)bY$j92a*Se#PnTAjFD=lU}aP&Y-~6XJ?3s02pqZ zk?G`7IbojWIB7k8A?GnAUF**FJMP`812)C&_f4-Z1P?qCjpd&`_LW0%R2Oj+W%1{r z3r@m|O$nV%{e&n>TzviNp=1W@7P(hBPv7nm3(-hp=7F3(?V5Zf%BOUVHEeGmxNj5j zfJY1x^$;>!439JV)7LvO=Z4uFvG(6&!C_J|^l5S?Icqlifi^Dk zVd{t5vrqHJ`3g7FaYff^GGqwYGYwPgb6ax|a3@l>I_uKYW>Tc%!&y2X?(flntV9J$ zSYcK>B%2XFV9cbY9SViQY$0OY*QBJf*@ffo?aJ0r%+`ZkGS6s);b-NorWTLFPhn8(Z{uY?9c59~40-F^5SYe9okR^vf$<&&#xK~ps9G5aG zWQOQ$iRI@w<09E`mcd-bwo;43TCvCgfdoLp-o^^)qN&%j)J55Xy@O&H7~i;fHmTNtynbA*q7)&qiE_Ts%PNB?F=Yo7eF42v5SPX9+ zKY39sflKS@)3DGxJJ0k!eB9!j{NU}S(hr{phVLnz7zKCYU_EX|NH0XtOxYbtv!@p*ZW{wOzsU-rs{>vay=p@Rw}wx=g)Yy@;ilL6iXg%9H=x%L3lMD zN#k6PU)o|Ab=-v!$~uni=|oaveBs&lSaL&m!|ft4w76UK#YZz)#f*Y?)D7i zF+yVCX))nw<_=E~tSa40F8B0d1h+1iGhol|f{ap0lb>NkV~Y6^yJwG46g%st(AR4+ z?7YKR?Ce>2w-ZEyHi@!VEW<`0vLn$RdT})FpgI)p$ycC{O9-l-_7QUlbSy6QukSfu zFmTRqWID5ic4P<)^kj_oFUK*bB`=hjoq8)Nwmk%-1N!3z1jm8@{J%`{f4kP;rPfXI zVCWBy!0CfOk;f5)1w9-^jzf1IKEl7f1j?{? zP*XO90Rqef^B}C~6*dISFD?jcH2o2(Xa!a(^sE=ncJ#d(LW@3dLMYHU9^?RO!VcX! zvmrRNM+T@)Wkt1KK7F1P}5)&;|(l>huG0wyhN4}3FR|G5LBBN2nD{eq2G9+uY-y(*24x+v5yZqO$sOu z;%hm4z$jX`|1fI57>sj(4=E%Sg+8#xOZlO3fG%>te0=6d!Z0o!+$Q?pk%?`viOB3q z0mKMn)4}Ms2PjZ!K?K1ZF^SaCDF6}nf`}yQj&aHQ;Ga?iFPz z;Ln^OqP)(ieYe=CP-`KC1{F~OhJ^?rf$O|F7@fd|Lj{DPH}KN@chdBPk#tC>0n9sy z?h(OcSru3c+<^HMA&MeVD4vRdP)s?~P@|&H6c!U-lBG+ZB6AwHMR)-#l@+qbS9X?k^wvmZSY)GGgJ2@4qB?<#z(D*|H ztkQqv{d}{rYnLUlSpr1q-fG8QDT6 z3Sr&~BoI;fvBB<5o{6EqpTeXFIL{h=^Ar+oC4u{6Wl4d2{ia<(3#1F0r6q-=#M`7m z&p^1TgUDXgMhYZ3UJ{6V?}E^S+M!0*NXRMBs8gGIfK3{)#`5wc$sz}$g`_CZENKLR zl~L#Vhb)Cc!2?;4fcziua=}S>nK;e#*1&)?8HA6x_R(n>ko67Dv&te@(J&e4`H?Kb zjS8QDIo;%lCu%8&&|(6)vDVQrIbbJ|*~BJGA+hThOa_I4Zbj@LB0Gph6ljr_H?V0atsz(qe$q(F}<|406` zRS+TcwK2?Ttum20pj{3|%PHah{f@vbF!4LWegrv++M0o${jLn%#2$e^)z<5MF`!S6 zAadY&NaWXk72ucH2ET~21Kk7y(@0c+(c>y0%1_N<(DbS>5g5ye-!yum|7b68a0lMW zpgF3DG*Ne)fX{%A3KdGP29g9RL@>6&LUbX8L_Qy(60K1q>cq_z%8Bx;gI;4+M?j|G z8-lv2BilFS2wvnwtJIN$Kr{Aoj0UE4Enzf72|T0$vkxZ4jqmN&Kez#F8PkVAI|W*< zf!KgR5ql4mA)!LqEI@{@@qqlC)n2rl1R22Vyqs1XyA9UYk z4v$lDVLH01)X9yoDqSO@| z!eD|7H$PzmhDgbV%%R0b&}0%9FyN*eH2KpA5d(dIv5MF-s$~q!AW9qY!?>DCa{!Gs z{w;FR^tM$03Z}RyahaAVngA)-s^63p)WsB`!?qVh>Ta1LdMK|6Y|AuMp&u$U;QW34 zO}U4C%73J6o8*7iq&Q^4Benv2%9ALA_r}Ua1T^zD)T z+wlLT34$eTKE;a$S|KVZi7?3OTQU*^{cg3X?cf8T1v3PFAEFogZvztR`VF4gjXtwR z6wzc6;b z8wAVL9#O&61Jp{QTXkrFCmPW2j6I@?F^)T$?i|G*D-*T@#0didqeEjHkgFhj#D?8y zNGMRPlL(GX98!W2_x0{4kwi?Hf&j9i7jS?%mOceUf&hA>HK!2Ob@p+g0;i#rxG{z| z%&;m7wDdG`0j3LUnpB({mLV)yO{w(*ff@SI5mqhnbio?^Hh>-tZ~|&7w1KZgT?x$? zqDxMQ2Rwtd5d9$l4iU~o-L^@YAGYa&(2S|*%2V#JJ@I<)L7aq_B@l>%{tG|ApkIGM?wh&-m! zJQ2xtZN`e?y%0x?L)_7W7hwnK1%wd~8AL8kc_DU~761kxLIchcR~L~<#65G`S;QIJ z77}aed0_4jdlOZfqCLp2gEwM|hMfi3WjzH7aKsxJHl@1BFj^lZep96hQsDmB3QKIB zFhDH`p$B}S4?w*~_#)w`$1`xl8gGKeEzThvXrB)>{*sYKvgGMG1jV6`d_Z>YiP7vw zuUte@*f(x(lr@g%Ih@@uEFr$05%iC1I@szLFq3eX_*_DaNcUpFK_JM@enEXV16M~o zH+u){CCrly3*3O}Tmv`!;B7y=cFtPN{W=!GSEbjpgXqGKzwUP8VwS$65v|Pe)Qazb%s@J@_J*Y`nS>SKx-I4n!$;0 ze@U`9jT+g$jVQ_gmlP~u7*T>Qi*1skEltBoyTN^o5=jw^5>xcOG|fR$2rhn89-3#A zp$Yu|3Oo0pyRPc6k8QAJAK4&FHa3|0^9%flrTaLKdxHFsC7Cf`Jxl`uTP`vcRA5`i z5(#zcTnvQp2oNQd!-T{ELQ8mc;-MM0nL=@!l4d$-%Aak*Q1_2^CQSo$+D<#2boyKS ztaZ-WYki;bWWuL)_g;JLwfA1{z0dHEufC>u|L~9fdy7jE@Ne2%JTk!kd~b0V!u0Cf zirWnKV5PTRD*fC~rJn_=^pZ!VySvgIRw;KX{bp&UsolyxO*x5yko@QKNSAj8h!PNZJidg(a)DOx?7v{Fc3qw{qL*vEzbM8uO2%874qnKHi4JzT#`ryw>In?TS ztv*9@Y_g8rp}C%_gr31|+Ii=-*uaqrq=z@n$Md4k7M2U zPHlU6_x;5M#_)bZ_w$iiYnno)bf!~301pc4ANl||U&rbt-h5v6!i7KjmEq$|_LIE> z)}8Zb+b;k0E5CV3#=`r-+B1)D$@F`IKMYC#1za9x(r178qZe{K!ft=)tzW*Zsnh0} z!9?e=?o)Sj?!L13{Cvo_@aCJ6%VTQ&lz3iD|4KIMW95fZ^L^)`iCA{ZVx9& zclM7jysCTp2fB?<={)xAKlR>6&upwV_PqY&-#)z|r5?sOZfz+lxa^_;R+wUJJ_FdW2S?dfM-Ht1szkkU=&h@z)=cf&Q@!dUQC6wK2 zl(xFf>{Hf!;dH0Bo@3pM ze;QL{+ug;EOPA>zz9{-P96yaIQWIpo9qydyX7``~=*U zwuw7?jy!(i=j5L~eN%PF7e?o=FLvH(Efbo4vrN$R{S=J}x(rSCg_Fh3gN^Q@M2+tI zEz#&Y?>ThhePUwiN?@s+J&h@|_w~iL!*=^ns8V^qH9DQEq3hRgN+dq&gT>Axjb20S ziBwHGvMisgo?;_XY0j}e|E7dhxt3_v&9fEOWxw77)}Hh!R^0N#f>p(5qBUJHWg~2f zRhM5mprq$mpL??`lih+9T9>v*hE0=mKxK&0s-)k3`)3}rRZ>f#r?EewThf@W{WAxp zQ4jr;Mn0SHSfWvRC^XtveYcvqJ#%1K`=wwjJ^3g^-g{56?TCG$A)yQBB%iWAd|*T> z%^8vD*z7u_yh})b!l_X^W72LOG-NYJpOL@`Q(Ge1xFec^gWe7;S{A$mW->eL}yfXa*7T%s?2+= zKj9SFH^Ft)`;UH$yLIbHq4Ka$X`gG6S*zCGa&M{*GhQmuQ!2?PaDI-O)tIQX57TVL zOSMxBs}h}ICG5`%9afFrV}0RsRGU)Jxhv@tti)CNbEGO-u-5w6<5nD~+kR6Hv<~NJ z_X#+9@y{TV)duR(z3@4zRWT|$qd6z?ZAXh;ht#O)k-qRbs#W6;NW(dzl=oz@>!_*t zgw)KAEf%S^kJR++G{UEpl4Lu6ltofi-D6dDZHYBIMn-vtwO2{C`T#xF7d}k2eTz_O zRnl{;9Hw1|trAyOUJc1DS6;mUu$;&8F+fce;h)Ewfi=5HTrG)ntD%>g~~ zHn!8Bycw~qwq=^QTD@D-s5?W^Dajd)yq3&<+OHf;H2#Exqy^SCaU~fVfAkJ;fRos~mo`N~YyWE>VaAl1XKNH?SOn)ejD4%TM)CZztXcuIBg4XK@# z?yThIzHzd+0DQ_b!DnXfRx>wi)bRB*vm8JCo8Y_T@#2DgwHdt$pFb`}pCRb!o3f6y z0p8Bq;$~?<%&;}G{HC*ai506kN_JL^YV|~Qz0{+E@;EufD5zIaLTvclJ1O5VMfeQ0~wT zxci-2snt4RG|6TT-L5+|7$wV9nGtML9I*5hGIE+wjzyfIW0k$*p3t~s%5It4I;^OQFAZv{{8E?(qyn5;DSS2jE3yxMACQXyJ zXXdv=kewvU6-;>`X$@Hr4NLb}omQ%hEM?_D)?jR5ddLAfR+;@Pvol-Qi1Vy8Bgz&? zM>STOS>10TX#dPZgyR|s$L+k!(jbXmvwv-%$}lS%`&7mBtW+dzW!eYK7Ebg!ijpMlEkD?X}O;st3NF^Swl0N>~9~0EP@Ez z9x%ICW@$FAQRP>~tQ|wA+tpUZh}KmhJ^R_eg&ijcX`kh)dOF=fstmC%idw1Dy-3j# z!MKB!*}g)q*^Nf7M`O00lB*^(i}EM?^~Bs&*&8YepVK{+AuzInRIezGVHI}WF?u_d z#a~CNlub&8TFTSOmFa{Wsx*C-cx1Nhh(;IJ&}jV9m~VEnGM@^*BwfC{59vbm?Sf;L zJ?yc+u_Ts|(l`*oS7G$;Y{f0LCQ>SU$aG0jPX55CjPD4q5HqR32U>mFmJ-=kBA{q&Z%WO-9=cN9FfD7 z8NPzX%ta%s@@O&}ty24WinaR=CfdQu!n+BnKPMh(u2}|ByW_Vp*S#l-3lB}si`gw( zk!U8Ta!#|tQxfOt_#CM$yel+XsC7%M`Ds$?IL9j5o=U5d&MF^% z4Kx4Ep%~{ZdSk@-6Kh z??k9g4wBh$0jXi>Db28?L-K${bQ5VWd`L>Oe-x>mPCJf9xgJNJXny}Y2mNAZY#PTM zo&j-xcuF^j45tDAlIu z1Y~LI*2c>9z%UhEk=eW#kQ6{9ORO{_HVx&@&VXANWvKZXEXQ)ii>;3oJLhJ~CN$0x zD>v&WL9<;CSd><}nVD)6^`l!HRTsq!X=AFH!2LvpFnpF*oZB>sz(Z!vrjc~*w;V}% zXd{J_Q+AJ`T@IFJx+bLVm1fBbRx<#%#F{CFQVn9L+&zQJCr=gI78bir=={kUs`wq^nA+SXNCTax>@ExR7DsHYHQ(Nn|hPm3u@TiV<{E|q*cncNPz@V!<= zu=B3c%-J-OKP-k?56h6LA31?lB8TO`q>P|6qtFO09U6-cD#2OZ-`PmqV99c(+ zi1;X_nX3t_*CB>gd8KCVl(@cNU|miM2Fk(U)mTYbf&55V=-l?E*}}Rv%|Yl3SZ*z+ zeruV`QNn#cf2z1-VV18<#q{XN_I}We_H>SRJ}@aHC@q>g^mDt%3{B;TG012)^H^!; zX-biq6fVoTsGwae!TbZF6g@c>m52hIhw$I(cw22s( zRe~#*vq)N*;MRo$?O23^Tv5;mwFjv<3T?z>cNu`Z8Np-GFwIj9}fLmO{||*-WKCk4hrFKl@m5@xDpr z!P4TYfe4#{ow8wrHZ9?eCyQO(C(%=Dwa#z6=gf&mcF(!Fw^Avr5bjvFs^S!~5J)eb z6~aB9R)bOs;r?=~8dxD*)oIlXP)IG1bswbdL14CAeh&b#l~(is@HT3C_W;l~YO(hK zur_L__kc#G)H9(6a1&~!5r!M@xk#qn3Z#7YnV&1(bxwE7K}rgL^GU8~%-&agdfjiM z8y`FV&J(alxS`_OK*A1<{un6nqu>1o5{78J&p^TvwLlFdEKx7PKr`s4Cb!?G24o7* zlEat;mAYm3_}?wAU#oJ^_H)Rd&s4V=47w@b&2Y>ioC025+kVP(Cwk z&`w2f4{NMpB3`{Og9-7}b|(MHU_$(y0_Qh8QQUA-_R~UW=e@FN^M%lk2JC+0iK6Mg zq6_wt^+M<;N|3b``Uy>EFrl9+iwq|8bG0Oc3HfskODn01M7}0N43@}mxf=5DFBCVd zdn-?WTMGRPO*0ux=wGN6|d{sg`ui16ae~5b{wsV|`m;9C?+Vod2^fw!a9#vF_dPEv{SlT_B{=OpA7bhm|_^3W0-`*is1m zv&^4DU|y}UBZWY?C3Y18;kAaxZhWl!*89-})8in_tJU=DdsI+cYxr6r&|9k`r4Z=t`wh?->Syn=C+gv|6c@+dVY9DAf2yVEM@e5BC*AkL``l;f&8&s$#=G73> zWCYg`(;y@MGfj79O&PD@_S#h+D6S*Bbms?(YqQ@Q=H3tkkbSdVwsubeFF9WHzT#Eg zw?9z4@`fp|8W||tQw_6T%@&{eAR|wOLBq6Gi&CRe#VpYw$Z+?(1Hx5*}C1tV5X*zZzvO1K3s@ zewZ@>3UIo!zg%4Yay#LZUuA{)EOz(YFBdPnQjf^wXPM>_G4NygSuL!|&oZgy0%wGy zd+ABpeUmBh$-DKF9N-^y#RUbsY#~$SLwem)AK4U{%xpNeIy&Isfg^p`LW{W{r>!j8CZvNB8FgXdUrr1W+0`d-Nwg@U00YzH~uR0GWn;w z;>w-64Mw`zBGhDj~2g8nuvub4QkJU;L% z#f|GW9CWdB+HlI#7MiJpJCc)j(9G<_feFb}oCRS}%4wcyoFXCVKK6;CxYBIOvA>*# z8B*aNeS(wf1$nX&XN#u$^G_5vUug#R&^eijGs0L`f3mo27Ia0j4rk%?SE4~?WtDc( zrTsn`=gCd74}U;6(fa1yVg%9HtD#Ed&nzesF^6!>{4~TQ0vwRYQJ)0~0&2}-cCYzV zu|pn%IP|IF@?-ua)}l{lL7#{<1=uTEF{$wJ0+KX8>WZHG6ynAL3Im7hG@*9h{SXT7 z_XoR{383+Nt6}IwpUMIVBTxhvPOfh&N`uR(-P?YZ^$(b2F7x@K`y{^}^O{ynHGT}8 zWNk1t{75ntEC&ykwZQ@E&N*9L9#lU+Ru*p&TV#1A^}mvl=WzInG8oOs3Fh*>3Wm`y(ppSYnJm)n(ZeXiKW>jUrmWbx|m6Q3(y`s^Qku6X#|TXd(MIsVYY z6298aK3bXlRbVSawLF(`^y%^RjK9ee%y1<)%G7E2N((8ME(in%1KO+BLv6;T|rQ+S)Or-Qf#W6rZ9KYhk^C>WZ&wlqmH!6V zjNAfq$Y9GwxvZc4>hBi6c&F*h?becFip^%`@YVN57E}yPn>fJy5=xugxTO> zVl+8eBXyD)Y_UwAhW9WDK=a>vU>o7u^jb{bu&G5xWiWz25*5i{Ep^Opj%dZC6{hVL zyuKhOX@sqL8H6;P9K{hRuvK~&B!dwj5%HhH+J(fTG8i8<@#{ZB{)iBmwgXnx;vYF+ zBZ}C;Qn)OKl{1MMIaqr6!@<&*sU3{>SNpze+qGm~YDogQhAZ)R9IO?+l*1_N3q(_h z8QYbTho1C>|56W{ACJm)sdTl0$5hZr}gSDKC2yyMwx2YYhnl0C%VJ(u-H4JB* zLDE|^dAkNBbq7!GUG`LQPK`!dZfd_(%U*YY&DClW)tSDhJ&m0 ziJWQQ-E8$%{QD`8hUp=u97e#c>7Mw#;#F&Z{CHF+Iq%c<$h)P;=nPhob8}0*sLJ%{ zP~NU=!-?cliuN64#-gUY#t%Xu*$+Z$CuRGlg8(B|m=n03tx94KicNvrv*F$QrhoCBAb@J(W9ED5aG5n)XGcrT2Vt7_pvw zBd=!^ccd(H){rIkRF^EWXFo8$NuLwVV^FBu09%R^Fdc(-B{Dkz(>*@dun9+!Ab&WL z3l2#b1cez0Tw+Y>xP#0d|TJxQ`%Nh_O`2vB&tNr;Yd795JYRL%|*CHbjSlzk)9=ImHZ@coAX+`QuVt-Qt*A*`# z_%&wf(qm@Rh86PKi!?d5p8b?irfRROFJC6~nr8<8*bA3t)Bq&swBw)R?}QCceTLMX zPVv$_y+WA7sP^fO3ktuGXvwA5VZbPW@MsD9besB(Ugyih2$E!*B5!9uRi{5*1-YRw;~FrpRD66y{#p z{TLKfCwVF;!t`ht*h+qT%DHvtf-8!x@5`;nV9jx}vQ^D3BN>Inp0zNn}o?p+6A%B`C8>f>}^?xhF61n;Hx9K@CgE(jh?dV(^; zhb_{0QxH=%-DJrcF3XfQ$zePs>h>Vdcm#`#het4-a}MGrViNbT?k_Lje&OH2tdtOR zHUPn+5S`$go08|6wj&G07cK)Vg_&GC`54N#)JASpWK=@?JcZ3SRXDSR4 z&kHVydvAuFLOS`Zpz!f3UXxu)OgCd^#UoCB<&boIlt56(g#*_-nyw-lJ!K+wy7_a0 z!ei$-&tUKKYH|qguv2(%d2pa?cBi_i{D zdCk87Mc7((oht1d+EsArkn&V&2#Vl{@#=F>!1(Ur6xY1Q+&w2Kg4n7X9C1(dit^n6 zBZIo*Uv5gps*bC)N^$Ufay+iw9Tyam_{e{17hZ`H2})OvTsum*o)HvY57WF2RKU3q zK|>Ez-8p}_85IqwdcWOpLW4KR^NPGsBPhISKcjTfTg1SE@rzS1=Q9q83cvSx3^F*w zIA}p!v*{_d0>wHU>;?@T7L_!&KfMiV(c3u0pS=gf4AKq1Y$;HS8ew{H)B)Qi;`s3T)E}|K!?q&}6SM$meW+|kAeGO92nxw#W|T22Z{gBB zCQaBAe68tU!|7nZP)+6i0dheA^P!Nit@r;B>Veb1((^J?GQpP~y9PF{J`Hg?o)Mb7 zKqnE8cb<P4?Y?DlU>?aJ5hvaj6z#uUo#9HyNYKi#zV;Jd`Cc-OK_U5!#sZ1w_wdsi) z2cve<4TW>>k2ax#^g=y-CyXQ(?)3!?Qw4A~$O7Tx=fkW6b2o`=k{xvVSr~~`6d1JZ zYnifvNsIbu8=)Hc)Y#XFw)uIluwC8BCa=ayI{q-Y_dBG_H?+h5@(K^%i1190Z-}-D z(7UU^R^Awwq6O=0G7ng~@0m@zmGF!s8iu)(-F@oc6z5BUm+Ko$3*6TbJ_42=9&>%u zHP;-5jh!6?lC1on84d#z0G2){4Jx*n+bGeYC%r4}bQA7Ti;d=6TV!m_>LfYO(rX7dR zwUg_ow$Cl(Na#CVEX=7U4(ZMdK@PDiT993dh2z(K(bCWnjR5c#qX>nt7kCOFRqbYMrI5iFyl}xJWK2L< zdLM#z#E=~^G7rCJ2-=D3f7}hsFrjn0pOUqMXzvrr%7rCC*f!nw{+-yKo@oT&{GP=- zO!rE&p$MUQdlY{IrR2z@ra-E@v%V#1>V7wkN>c(!J{Aou_-+ec@D2wE`@zSFNR8EA z*aLHUdA2#gWnfx`(d4P-6}GV7892_E*ktHSAlILIDc@KJAQ6bbLd@t0BY5Z7DndNM z&?&ARS2j!%jA{mEd1swqQOG1>#I!+}VjPD3p+>KU&VYSa7F4?gZq-D1O)Cs) zhVq_p6hY{N03b|P)3X^9)Aw%E0;hHp0z-y$O~dr~nnRdM7&930h_I`fTUd84Rr>e< zJP7_QF!ZulGn943K?r0RyEK_Z2~o&$QrD2a0p^HKUq8xW&E({mnjtmo&3y(*_ki=x zb=>`^X`dt#_2&IL@HJrruj%X+s|4dBLK5Cy0b{iVokyZ2=r>H#pgpJ=6yGeV`C+$` zMG7_ym4rTaKx!al2LO;cb%KV^l6j|nfekn@Yu2f1l+L9~d6Qr!SnZ@4xjtN+d=NAq z;f)+d-w@!ZFV=A0ZaG_{2*V&muG~yG>>=#~!iD$VXg8Ln=w<~LCI_tNmhj)$FF^0| z0wX5vs1}#XDHxnQp0@Vw$ej7f$x8Y7&v`SYr6XxB;D$8FobXzIQTa7 z4Hc=3yKa4=jM}mwR8l@U%mfV+2IlQ$XV5TkNYgXMqTlGue_%gJJZ}aHG5&}_OmMz{ zrSE!WoWTeW#E8v2orv(Cg0qmR1r`z_WYE)d7H*KC3~e%z^d4#6jzSnGKNw@RmiIAS z!;mPH)V&uzLQF(RRLiqp^s(QVXcARUqx}cM5FjCBl0IOW6G*q7E zN;_R{9Pz<_23dK#4hc+C#~EPZI5CJf!|2PcW8b&J#|yA!xekL+XyK(4I?U&kmb{zc zT?YmZxhLu!;;|DuMF|}2KN_~-98;F*^I>=_!MX)Tt|6ZtN-TJNsrVx23{NeI1)T$d zk>&MkT+TwupMld?702~tIjIH;`-9p(Zy`z5sZ@4J-%$qOmw1bYXcf^--%d(10*s8V zgGmvS*Co@Wt=WHYAs7)*NZpY`Na!r=53F==@j`UtEnZ+NA4%d3Awn5`6S5?}Sb)V0 zJ^Veg(%B07-) zYX1QY`8EQGare_XC>?U}J{`(o@&Pq61Fm-AH~juM+#U^snz&)R1$Nhhp=K*U)JM6VFpUg)kURLoB} z5*vl?fKs&-?Nq!uAM~JL0;kq-aK$I6ycvRzY&vSNYgP^4vh)(00JjA*hK6`w!RBaV zC>&yl8#!VSHi281+k<`^BzB9$_A_DNpvx#f2)iH0$SYP3?}}M4SC?ksae9PK?F7K6@osNYZm~84Kl(wr3YUOXLEo(&={)A}rj%Tx_s%=7G~#xa#MQ_8*<8*bAN0 zv#S|_xU}A0Ku};J`M#L-e!~%*&hsJgpUxpd2Mh_~n%|_tZ>vweL(p%Nw3vLJP z8nJ(6a^ohH8&l4RAoGM(;@goF^sL7C59$~p>Wz}J<}j&p8tgxS&NPNIT=fYelVnO3 zbAosXBxm3WjF$ssU>D!uE)ucwFbL8+XhkH2k8Ohx&&UldISs!T7$evV$ibN}3}7A$ z?_tZ_hD5&U2%c*6`6%uzS@F)eoK#tczD%QpLFP_MenH`i->WcAnq; z@XE(6kb0pY1d$Ri#I597txd%2Khh16>QxjzT)!RG&h`SnK+u2;95_SYAePrS17T;j z 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 diff --git a/ReadMe.md b/ReadMe.md index 0d5586a4..41ab05e4 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.5 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -16 Apr 2024 +17 Apr 2024 # Overview @@ -229,6 +229,8 @@ let me know if I missed you! - Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol that leverages RomWBW memory banking. +- Les Bird has contributed support for the NABU w/ Option Board + Contributions of all kinds to RomWBW are very welcome. # Licensing diff --git a/ReadMe.txt b/ReadMe.txt index c2c52345..af0e23ec 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -16 Apr 2024 +17 Apr 2024 @@ -230,6 +230,8 @@ let me know if I missed you! - Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol that leverages RomWBW memory banking. +- Les Bird has contributed support for the NABU w/ Option Board + Contributions of all kinds to RomWBW are very welcome. diff --git a/Source/Doc/ROM_Applications.md b/Source/Doc/ROM_Applications.md index 7a3f1a83..cfb8ae5f 100644 --- a/Source/Doc/ROM_Applications.md +++ b/Source/Doc/ROM_Applications.md @@ -10,7 +10,7 @@ programming languages. `\clearpage`{=latex} -# ROMWBW Monitor +# RomWBW Monitor The Monitor program is a low level utility that can be used for testing and programming. It allows programs to be entered, @@ -339,8 +339,8 @@ A comprehensive instruction manual is available in the Doc\\Contrib directory. ## ROMWBW unsupported features -- Cassette loading -- Cassette saving +- This ROM-hosted implementation does not support cassette or disk + access for loading and saving programs. # TastyBASIC @@ -350,10 +350,12 @@ original source can be found here [https://github.com/dimitrit/tastybasic](https ## Features / Limitations - Integer arithmetic, numbers -32767 to 32767 - Singles letter variables A-Z - 1-dimensional array support - Strings are not supported +- This ROM-hosted implementation does not support disk access for + loading and saving programs. +- Integer arithmetic, numbers -32767 to 32767 +- Singles letter variables A-Z +- 1-dimensional array support +- Strings are not supported ## Direct Commands @@ -494,7 +496,8 @@ Due to different platform processor speeds, serials speeds and flow control cap See the ROMWBW Applications guide for additional information on performing upgrades. - ## Console Options +## Console Options + Option ( C ) - Set Console Device Option ( S ) - Set Serial Device @@ -576,7 +579,7 @@ Can be used to verify if a ROM image has been transferred and flashed correctly. In Windows, right clicking on a file should also give you a context menu option CRC SHA which will allow you to select a CRC32 calculation to be done on the selected file. -## Teraterm macro configuration +## Tera Term macro configuration Macros are a useful tool for automatic common tasks. There are a number of instances where using macros to facilitate the update process could be worthwhile if you are: @@ -595,20 +598,21 @@ crc32file crc '\\desktop\users\phillip\documents\github\romwbw\binary\sbc_std_cu sprintf '0x%08x' crc messagebox inputstr 'crc32' ``` + ## Serial speed guidelines As identified in the introduction, there are limitations on serial speed depending on processor speed and flow control settings. Listed below are some of the results identified during testing. Platform / Configuration | Processor Speed | Maximum Serial Speed -------------------------------|-----------------|--------------------- -Sbc-v2 uart no flow control | 2mhz | 9600 -sbc-v2 uart no flow control | 4mhz | 19200 -sbc-v2 uart no flow control | 5mhz | 19200 -sbc-v2 uart no flow control | 8mhz | 38400 -sbc-v2 uart no flow control | 10mhz | 38400 -sbc-v2 usb-fifo 2mhz+ | | n/a -sbc-mk4 asci no flow control | 18.432mhz | 9600 -sbc-mk4 asci with flow control | 18.432mhz | 38400 +SBC-V2 UART no flow control | 2mhz | 9600 +SBC-V2 UART no flow control | 4mhz | 19200 +SBC-V2 UART no flow control | 5mhz | 19200 +SBC-V2 UART no flow control | 8mhz | 38400 +SBC-V2 UART no flow control | 10mhz | 38400 +SBC-V2 USB-FIFO 2mhz+ | | n/a +SBC-MK4 ASCI no flow control | 18.432mhz | 9600 +SBC-MK4 ASCI with flow control | 18.432mhz | 38400 The **Set Recommend Baud Rate** option in the Updater menu follows the following guidelines. @@ -623,9 +627,9 @@ These can be customized in the updater.asm source code in the CLKTBL table if d Feedback to the ROMWBW developers on these guidelines would be appreciated. ## Notes: -All testing was done with Teraterm x-modem, Forcing checksum mode using macros was found to give the most reliable transfer. -Partial writes can be completed with 39SF040 chips. Other chips require entire flash to be erased before being written. -An SBC V2-005 MegaFlash or Z80 MBC required for 1mb flash support. The Updater assumes both chips are same type -Failure handling has not been tested. -Timing broadly calibrated on a Z80 SBC-v2 -Unabios not supported +- All testing was done with Teraterm x-modem, Forcing checksum mode using macros was found to give the most reliable transfer. +- Partial writes can be completed with 39SF040 chips. Other chips require entire flash to be erased before being written. +- An SBC V2-005 MegaFlash or Z80 MBC required for 1mb flash support. The Updater assumes both chips are same type +- Failure handling has not been tested. +- Timing broadly calibrated on a Z80 SBC-v2 +- UNA BIOS not supported diff --git a/Source/Doc/ReadMe.md b/Source/Doc/ReadMe.md index 81a18cf7..61783118 100644 --- a/Source/Doc/ReadMe.md +++ b/Source/Doc/ReadMe.md @@ -220,6 +220,8 @@ please let me know if I missed you! * Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol that leverages RomWBW memory banking. +* Les Bird has contributed support for the NABU w/ Option Board + Contributions of all kinds to RomWBW are very welcome. # Licensing diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index 8ce4404c..624df28d 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -631,6 +631,7 @@ prompt: | CP/M 2.2 | Digital Research CP/M 2.2 OS | | Z-System | ZSDOS 1.1 w/ ZCPR 1 (Enhanced CP/M compatible OS) | | Forth | Brad Rodriguez's ANSI compatible Forth language | +| BASIC | Microsoft ROM BASIC | | Tasty BASIC | Dimitri Theuling's Tiny BASIC implementation | | Play | A simple video game (requires ANSI terminal emulation) | | Network Boot | Boot system via Wiznet MT011 device | @@ -650,9 +651,17 @@ in the ROM (CP/M 2.2 & Z-System) are described in the Operating Systems chapter of this document. In general, the command to exit any of these applications and restart -the system is `BYE`. The exceptions are the Monitor which uses `B` and +the system is `BYE`. The exceptions are the Monitor which uses `X` and Play which uses `Q`. +**NOTE:** Of the ROM Applications, only the operating systems (CP/M and +Z-System) have the ability to interact with disk drives. So, other than +these 2 OSes, the ROM Applications do **not** have any way to save or +load data from peristent/disk storage. For example, if you launch BASIC +from the Boot Loader, you will not be able to save or load your +programs. You will need to start an operating system first and then run +BASIC in order to save or load programs. + Two of the ROM Applications are, in fact, complete operating systems. Specifically, "CP/M 2.2" and "Z-System" are provided so that you can actually start either operating system directly from your ROM. This @@ -1395,15 +1404,24 @@ filesystem format used is 8MB. This ensures any filesystem will be accessible to any of the operating systems. Since storage devices today are quite large, RomWBW implements a -mechanism called slicing to allow up to 256 8MB filesystems on a -single large storage device. This allows up to 2GB of usable space on +mechanism called slicing to allow up to 256 8MB CP/M filesystems on a +single large storage device. To say it another way, the media is +"sliced up" into many 8MB CP/M filesystems. Each slice is a complete +CP/M filesystem. This allows up to 2GB of usable space on one media. You can think of slices as a way to refer to any of -the first 256 8MB chunks of space on a single media. +the first 256 8MB chunks of space on a single media. Each chunk +is a CP/M filesystem. + +Note that slices are **not** the same thing as a hard disk partition. +In fact, these slices all live inside of a single hard disk partition. +Normally, a RomWBW hard disk will have one partition (called the +RomWBW partition) containing 64 slices. Optionally, there may be +a second partition which contains a FAT filesystem. For now, we +are just talking about the slices within the single RomWBW partition. -Note that although you can use up to 256 slices per physical disk, this -large number of slices is rarely used. The recommended RomWBW disk -layout provides for 64 slices which is more than enough for most -use cases. +Although you can use up to 256 slices per physical disk, this large +number of slices is rarely used. The recommended RomWBW disk layout +provides for 64 slices which is more than enough for most use cases. Of course, the problem is that CP/M-like operating systems have only 16 drive letters (A:-P:) available. Under the covers, RomWBW allows @@ -1439,22 +1457,28 @@ the same device/slice at the same time. Second, there must always be a drive assigned to A:. Any attempt to violate these rules will be blocked by the `ASSIGN` command. +As you see, the name of a slice does not reference the hard disk +partition containing the slices. Since there can only be a single +RomWBW partition containing slices on any disk, the partition is +determined automatically. + In case this wasn't already clear, you **cannot** refer directly to slices using CP/M. CP/M only understands drive letters, so to access a given slice, you must assign a drive letter to it first. -While it may be obvious, you cannot use slices on any media less -than 8MB in size. Specifically, you cannot slice RAM disks, ROM -disks, floppy disks, etc. All of these are considered to have a single -slice and any attempt to ASSIGN a drive letter to a slice beyond that -will result in an error message. +While it may be obvious, you cannot use slices on any media less than +8MB in size. Specifically, you cannot slice RAM disks, ROM disks, floppy + disks, etc. All of these are considered to have a single slice (slice +0) and any attempt to ASSIGN a drive letter to a slice beyond that will +fail and produce an error message. It is very important to understand that RomWBW slices are not individually created or allocated on your hard disk. RomWBW uses a -single, large chunk of space on your hard disk to contain the slices. -You should think of slices as just an index into a sequential set of 8MB -areas that exist in this large chunk of space. The next section will -go into more detail on how slices are located on your hard disk. +single, large chunk of space (partition) on your hard disk to contain +the slices. You should think of slices as just an index into a +sequential set of 8MB areas that exist in this large chunk of space. +The next section will go into more detail on how slices are located on +your hard disk. Although you do not need to allocate slices individually, you do need to initialize each slice for CP/M to use it. This is somewhat analogous @@ -1466,10 +1490,10 @@ absolutely sure you know what media and slice are assigned to that drive letter before using `CLRDIR` because CLRDIR will wipe out any pre-existing contents of the slice. -**WARNING**: The `CLRDIR` application does not appear to check for -disk errors when it runs. If you attempt to run `CLRDIR` on a drive -that is mapped to a slice that does not actually fit on the physical -disk, it may behave erratically. +**WARNING**: Earlier versions of the `CLRDIR` application does not +appear to check for disk errors when it runs. If you attempt to run +`CLRDIR` on a drive that is mapped to a slice that does not actually fit +on the physical disk, it may behave erratically. Here is an example of using `CLRDIR`. In this example, the `ASSIGN` command is used to show the current drive letter assignments. Then @@ -1696,9 +1720,9 @@ transferring your files over individually. You use your modern computer (Windows, Linux, MacOS) to write the disk image onto the disk media, then just move the media over to your system. -The disk image files are found in the Binary directory of the -distribution. Floppy disk images are prefixed with "fd_" and hard -disk images are prefixed with either "hd512_" or "hd1k_" depending on the +The disk image files are found in the Binary directory of the +distribution. Floppy disk images are prefixed with "fd_" and hard disk +images are prefixed with either "hd512_" or "hd1k_" depending on the hard disk layout they are for. Each disk image has the complete set of normal applications and tools @@ -2255,7 +2279,7 @@ significant improvements such as date/time stamping of files. Z-System is a somewhat ambiguous term because there are multiple generations of this software. RomWBW Z-System is a combination of both -ZCPR-DJ (the CCP) and ZSDOS 1.1 (the BDOS) when referring to Z-System. +ZCPR-DJ (the CCP) and ZSDOS 1.1 (the BDOS) when referring to Z-System. The latest version of Z-System (ZCPR 3.4) is also provided with RomWBW via the NZ-COM adaptation (see below). @@ -2470,7 +2494,7 @@ CP/M 3 and ZCPR 3. To create (or update) a ZPM3 boot drive, you must place `ZPMLDR.SYS` on the system track of the disk. You must also place `CPM3.SYS`, `ZCCP.COM`, `ZINSTAL.ZPM`, and `STARTZPM.COM` on the target drive as -regular files. Do **not** place CPM3.SYS on the boot track. +regular files. Do **not** place CPM3.SYS on the boot track. `ZPMLDR.SYS` chain loads `CPM3.SYS` which must exist as a regular file on the disk. Subsequently, `CPM3.SYS` loads `CCP.COM`. @@ -2549,9 +2573,9 @@ the QP/M components. To do this, you can perform the following steps: 1. Use RomWBW `SYSCOPY` to place the stock RomWBW CP/M OS image onto the system tracks of the QP/M boot disk: - + `SYSCOPY A:=x:CPM.SYS` - + where x is the drive letter of your ROM Disk. 1. Run `QINSTALL` to overlay the QP/M OS components on your @@ -2709,11 +2733,11 @@ To boot into Fuzix: ``` RCBus [RCZ180_nat_wbw] Boot Loader FP Switches = 0x00 - + Boot [H=Help]: 2 - + Booting Disk Unit 2, Slice 0, Sector 0x00000000... - + Volume "Fuzix 126 Loader" [0xF200-0xF400, entry @ 0xF200]... FUZIX version 0.4 Copyright (c) 1988-2002 by H.F.Bower, D.Braun, S.Nitschke, H.Peraza @@ -2742,13 +2766,13 @@ To boot into Fuzix: Enter new date: Current time is 13:30:24 Enter new time: - + ^ ^ n n Fuzix 0.4 >@< Welcome to Fuzix m m - + login: ``` @@ -2757,7 +2781,7 @@ To boot into Fuzix: ``` login: root - + Welcome to FUZIX. # ``` @@ -2841,7 +2865,7 @@ This application understands both FAT filesystems as well as CP/M filesystems. characters are **not permitted** in a CP/M filename: `< > . , ; : = ? * [ ] _ % | ( ) / \` - + The FAT application does not auto-rename files when it encounters invalid filenames. It will just issue an error and quit. Additionally, the error message is not very clear about the problem. @@ -2916,8 +2940,8 @@ computer and access it using `FAT` based on its RomWBW unit number. **WARNING**: Microsoft Windows will sometimes suggest reformatting partitions that it does not recognize. If you are prompted to format a partition of your SD/CF/USB Media when inserting the card into a Windows - computer, you probably want to select Cancel. - +computer, you probably want to select Cancel. + ## FAT Application Usage Complete instructions for the `FAT` application are found in $doc_apps$. @@ -3393,7 +3417,7 @@ The document is called "dri-cpnet.pdf". Under CP/M 2.2, you will start the networking client using the command `CPNETLDR`. Under CP/M 3, you use the command `NDOS3`. If that works, you can map network drives as local drives using the `NETWORK` command. -The `CPNETSTS` command is useful for displaying the current status. +The `CPNETSTS` command is useful for displaying the current status. Here is a sample session from CP/M 2.2: ``` @@ -4184,6 +4208,8 @@ please let me know if I missed you! * Ladislau Szilagyi has contributed an enhanced version of CP/M Cowgol that leverages RomWBW memory banking. +* Les Bird has contributed support for the NABU w/ Option Board + Contributions of all kinds to RomWBW are very welcome. # Licensing From e41cd6d8d2e2be728ffab29dc51fcfe508ff54a8 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 17 Apr 2024 17:02:41 -0700 Subject: [PATCH 06/20] Support 40 and 80 Column Video for NABU - 40 column mode will work with original TMS9918 video chip - 80 column mode requires FPGA TMS video chip replacement --- Source/HBIOS/Config/NABU_std.asm | 3 ++ Source/HBIOS/cfg_duo.asm | 2 +- Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_epitx.asm | 2 +- Source/HBIOS/cfg_heath.asm | 2 +- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mbc.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_mon.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_nabu.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_rph.asm | 2 +- Source/HBIOS/cfg_s100.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_z80retro.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- Source/HBIOS/std.asm | 3 +- Source/HBIOS/tms.asm | 55 +++++++++++++------------------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 25 files changed, 49 insertions(+), 56 deletions(-) diff --git a/Source/HBIOS/Config/NABU_std.asm b/Source/HBIOS/Config/NABU_std.asm index 25eca916..d7e556be 100644 --- a/Source/HBIOS/Config/NABU_std.asm +++ b/Source/HBIOS/Config/NABU_std.asm @@ -29,3 +29,6 @@ CPUOSC .SET 3580000 ; CPU OSC FREQ IN MHZ ; CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +TMSMODE .SET TMSMODE_NABU80 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] + diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index b6f7ac72..107fb3a9 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -169,7 +169,7 @@ CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_DUO ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_DUO ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index bf17b009..791177fe 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -187,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index e4e6de0d..a5b0c1c9 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -189,7 +189,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 47cd275f..72c2737e 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -192,7 +192,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 41f39735..8c4b9d50 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -237,7 +237,7 @@ GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH] GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA] TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index f966d1ae..890e6a84 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -166,7 +166,7 @@ CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index a101e728..31b60aef 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -176,7 +176,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index 3439482b..f3cb889e 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -187,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 75e3b810..ffcac599 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -178,7 +178,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index 7a04ee47..a44a56a8 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -192,7 +192,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NABU ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_NABU80 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 5f346d2b..84a54d59 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -193,7 +193,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 3b435716..92b1c01c 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -197,7 +197,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index d69845e1..a04c1803 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -192,7 +192,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index c6a91923..dcdad453 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -167,7 +167,7 @@ GDCENABLE .EQU TRUE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH] GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA] TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index 93fa49a0..123f37e9 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -187,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 980f67cc..fbf65a8e 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -166,7 +166,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] 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] diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 49478897..2b189277 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -187,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index 548294b8..ee96e89e 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -169,7 +169,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 459b8cff..c2b9e790 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -139,7 +139,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index a1ca5524..fe567637 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -150,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) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 843195f4..d66f8eb9 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -238,7 +238,8 @@ TMSMODE_MSXKBD .EQU 5 ; MSX PORTS + PS2 KEYBOARD TMSMODE_MBC .EQU 6 ; MBC V9938/58 VIDEO BOARD TMSMODE_COLECO .EQU 7 ; COLECOVISION PORT MAPPING TMSMODE_DUO .EQU 8 ; DUODYNE PORT MAPPING -TMSMODE_NABU .EQU 9 ; NABU V9958 + NABU KBD +TMSMODE_NABU40 .EQU 9 ; NABU V9918 + NABU KBD +TMSMODE_NABU80 .EQU 10 ; NABU V9958 + NABU KBD ; ; CVDU VIDEO MODE SELECTIONS ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index f1f11687..54b39de5 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -48,10 +48,6 @@ TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT #IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958)) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL -;TMS_PPIA .EQU 0 ; PPI PORT A -;TMS_PPIB .EQU 0 ; PPI PORT B -;TMS_PPIC .EQU 0 ; PPI PORT C -;TMS_PPIX .EQU 0 ; PPI CONTROL PORT ; #IF (TMSMODE == TMSMODE_MSX) .ECHO "MSX" @@ -64,10 +60,6 @@ TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL #IF (TMSMODE == TMSMODE_COLECO) TMS_DATREG .EQU $BE ; READ/WRITE DATA TMS_CMDREG .EQU $BF ; READ STATUS / WRITE REG SEL -;TMS_PPIA .EQU 0 ; PPI PORT A -;TMS_PPIB .EQU 0 ; PPI PORT B -;TMS_PPIC .EQU 0 ; PPI PORT C -;TMS_PPIX .EQU 0 ; PPI CONTROL PORT .ECHO "COLECO" #ENDIF ; @@ -93,10 +85,6 @@ TMS_PPIX .EQU $87 ; PPI CONTROL PORT TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER -;TMS_PPIA .EQU 0 ; PPI PORT A -;TMS_PPIB .EQU 0 ; PPI PORT B -;TMS_PPIC .EQU 0 ; PPI PORT C -;TMS_PPIX .EQU 0 ; PPI CONTROL PORT .ECHO "SCG" #ENDIF ; @@ -104,10 +92,6 @@ TMS_ACR .EQU $9C ; AUX CONTROL REGISTER TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER -;TMS_PPIA .EQU 0 ; PPI PORT A -;TMS_PPIB .EQU 0 ; PPI PORT B -;TMS_PPIC .EQU 0 ; PPI PORT C -;TMS_PPIX .EQU 0 ; PPI CONTROL PORT TMS_KBDDATA .EQU $E2 ; KBD CTLR DATA PORT TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT .ECHO "MBC" @@ -117,19 +101,21 @@ TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT TMS_DATREG .EQU $A0 ; READ/WRITE DATA TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $A6 ; AUX CONTROL REGISTER -;TMS_PPIA .EQU 0 ; PPI PORT A -;TMS_PPIB .EQU 0 ; PPI PORT B -;TMS_PPIC .EQU 0 ; PPI PORT C -;TMS_PPIX .EQU 0 ; PPI CONTROL PORT TMS_KBDDATA .EQU $4C ; KBD CTLR DATA PORT TMS_KBDST .EQU $4D ; KBD CTLR STATUS/CMD PORT .ECHO "DUO" #ENDIF ; -#IF (TMSMODE == TMSMODE_NABU) +#IF ((TMSMODE == TMSMODE_NABU40) | (TMSMODE == TMSMODE_NABU80)) TMS_DATREG .EQU $A0 ; READ/WRITE DATA TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL - .ECHO "NABU" +; + #IF (TMSMODE == TMSMODE_NABU40) + .ECHO "NABU-40" + #ENDIF + #IF (TMSMODE == TMSMODE_NABU80) + .ECHO "NABU-80" + #ENDIF #ENDIF ; .ECHO ", IO=" @@ -141,7 +127,7 @@ TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL ; TMS_ROWS .EQU 24 ; -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU80)) TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA TMS_FNTSIZE .EQU 8*256 ; ### JLC Mod for JBL compatibility ### = 8x8 Font 256 Chars TMS_CHRVADDR .EQU $0000 ; VRAM ADDRESS OF CHAR SCREEN DATA (NEW CONSTANT) = REG2 * $400 @@ -168,7 +154,7 @@ PPKENABLE .SET TRUE ; INCLUDE PPK KEYBOARD SUPPORT KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT #ENDIF ; -#IF (TMSMODE == TMSMODE_NABU) +#IF ((TMSMODE == TMSMODE_NABU40) |(TMSMODE == TMSMODE_NABU80)) NABUKBENABLE .SET TRUE ; INCLUDE NABU KEYBOARD SUPPORT #ENDIF ; @@ -181,7 +167,7 @@ NABUKBENABLE .SET TRUE ; INCLUDE NABU KEYBOARD SUPPORT ;#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP ; 20 W/S ### JLC Mod for Clock/2 (9 MHz) ### #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ - #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) + #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU40) | (TMSMODE == TMSMODE_NABU80)) #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 @@ -244,8 +230,11 @@ TMS_INIT: #IF (TMSMODE == TMSMODE_MSX9958) PRTS("RC_V9958$") #ENDIF -#IF (TMSMODE == TMSMODE_NABU) - PRTS("NABU$") +#IF (TMSMODE == TMSMODE_NABU40) + PRTS("NABU-40$") +#ENDIF +#IF (TMSMODE == TMSMODE_NABU80) + PRTS("NABU-80$") #ENDIF ; PRTS(" IO=0x$") @@ -272,7 +261,7 @@ TMS_INIT1: #IF MKYENABLE CALL MKY_INIT ; INITIALIZE MKY KEYBOARD DRIVER #ENDIF -#IF (TMSMODE == TMSMODE_NABU) +#IF ((TMSMODE == TMSMODE_NABU40) | (TMSMODE == TMSMODE_NABU80)) CALL NABUKB_INIT ; INITIALIZE NABU KEYBOARD DRIVER #ENDIF @@ -329,7 +318,7 @@ TMS_FNTBL: .DW KBD_FLUSH .DW KBD_READ #ENDIF -#IF (TMSMODE == TMSMODE_NABU) +#IF ((TMSMODE == TMSMODE_NABU40) | (TMSMODE == TMSMODE_NABU80)) .DW NABUKB_STAT .DW NABUKB_FLUSH .DW NABUKB_READ @@ -557,7 +546,7 @@ TMS_SET: ;---------------------------------------------------------------------- ; TMS_WR: -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU80)) ; CLEAR R#14 FOR V9958 XOR A OUT (TMS_CMDREG), A @@ -653,7 +642,7 @@ TMS_CRTINIT2: DJNZ TMS_CRTINIT2 ; LOOP ; ; ENABLE WAIT SIGNAL IF 9938/58 -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU80)) LD C,25 ; REGISTER 25 LD A,%00000100 ; ONLY WTE BIT SET CALL TMS_SET ; DO IT @@ -1101,7 +1090,7 @@ TMS_IDAT: .DB TMS_KBDDATA ; 8242 DATA PORT .DB 0 ; FILLER #ENDIF -#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_SCG) | (TMSMODE == TMSMODE_COLECO) | (TMSMODE == TMSMODE_NABU)) +#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_SCG) | (TMSMODE == TMSMODE_COLECO) | (TMSMODE == TMSMODE_NABU40) | (TMSMODE == TMSMODE_NABU80)) .FILL 4,0 ; DUMMY KEYBOARD CONFIG DATA #ENDIF ; @@ -1150,7 +1139,7 @@ TMS_IDAT: ; 5S Fifth sprite (not displayed) detected. Value in FS* is valid. ; INT Set at each screen update, used for interrupts. ; -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU80)) ; ; NOTE: YAMAHA 9938/58 DOCUMENTATION SAYS R3 IS SAME AS 9918 (ADR >> 10), ; BUT THIS SEEMS TO BE WRONG AND CORRECTLY DOCUMENTED AT diff --git a/Source/ver.inc b/Source/ver.inc index 707b5da9..dc59e817 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.28" +#DEFINE BIOSVER "3.5.0-dev.29" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index d7fbd3f7..2a94095b 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.28" + db "3.5.0-dev.29" endm From bf2d0b81960373d4d519d36fbe549bf1508b417d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 18 Apr 2024 15:58:01 -0700 Subject: [PATCH 07/20] Update NABU Keyboard Driver - Translate NABU special keys to standard RomWBW values to allow things like arrow keys to emit proper escape sequences within ANSI emulation. - Add a simple, single byte buffer to avoid keyboard status returning a key is ready when it is only a special character that has no translation. --- Source/HBIOS/nabukb.asm | 104 ++++++++++++++++++++++++++++++++++------ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 92 insertions(+), 16 deletions(-) diff --git a/Source/HBIOS/nabukb.asm b/Source/HBIOS/nabukb.asm index 508060ee..4d936e97 100644 --- a/Source/HBIOS/nabukb.asm +++ b/Source/HBIOS/nabukb.asm @@ -53,27 +53,58 @@ NABUKB_INIT: RET ; NABUKB_STAT: - IN A,(NABUKB_DAT+1) - AND $02 - JP Z,CIO_IDLE + LD A,(NABUKB_KSTAT) ; GET KEY WAITING STATUS + OR A ; SET FLAGS + RET NZ ; KEY WAITING, ALL SET + IN A,(NABUKB_DAT+1) ; GET BKD STATUS + AND $02 ; CHECK DATA RDY BIT + JR Z,NABUKB_STAT1 ; BAIL OUT IF NOT + IN A,(NABUKB_DAT) ; GET THE KEY + BIT 7,A ; HIGH BIT IS SPECIAL CHAR + CALL NZ,NABUKB_XLAT ; IF SO, TRANSLATE IT + JR C,NABUKB_STAT1 ; CF INDICATES INVALID + LD (NABUKB_KEY),A ; BUFFER IT + LD A,1 ; KEY WAITING STATUS + LD (NABUKB_KSTAT),A ; SAVE IT + OR A ; SET FLAGS RET ; +NABUKB_STAT1: + XOR A ; SIGNAL NO CHAR READY + JP CIO_IDLE ; RETURN VIA IDLE PROCESSOR +; +NABUKB_XLAT: + ; NABU KEYBOARD USES $E0-$FF FOR SPECIAL KEYS + ; HERE WE TRANSLATE TO ROMWBW SPECIAL KEYS AS BEST WE CAN + ; CF IS SET ON RETURN IF KEY IS INVALID (NO TRANSLATION) + SUB $E0 ; ZERO OFFSET + RET C ; ABORT IF < $E0, CF SET! + LD HL,NABUKB_XTBL ; POINT TO XLAT TABLE + CALL ADDHLA ; OFFSET BY SPECIAL KEY VAL + LD A,(HL) ; GET TRANSLATED VALUE + OR A ; CHECK FOR N/A (0) + RET NZ ; XLAT OK, RET W/ CF CLEAR + SCF ; SIGNAL INVALID + RET ; DONE +; +NABUKB_XLAT1: + SCF ; SIGNAL INVALID + RET ; AND DONE +; NABUKB_FLUSH: XOR A RET ; NABUKB_READ: - IN A,(NABUKB_DAT+1) - AND $02 - JR Z,NABUKB_READ - IN A,(NABUKB_DAT) - LD E,A - CP $80 - JR C,NABUKB_READ1 - LD E,$FF -NABUKB_READ1: - XOR A - RET + CALL NABUKB_STAT ; CHECK FOR KEY READY + JR Z,NABUKB_READ ; LOOP TIL ONE IS READY + LD A,(NABUKB_KEY) ; GET THE BUFFERED KEY + LD E,A ; PUT IN E FOR RETURN + XOR A ; ZERO TO ACCUM + LD C,A ; NO SCANCODE + LD D,A ; NO KEYSTATE + LD (NABUKB_KSTAT),A ; CLEAR KEY WAITING STATUS + RET ; AND RETURN ; NABUKB_PUT: OUT (NABUKB_DAT+1),A @@ -84,3 +115,48 @@ NABUKB_PUT: NOP RET ; +; +; +NABUKB_KSTAT .DB 0 ; KEY STATUS +NABUKB_KEY .DB 0 ; KEY BUFFER +; +; THIS TABLE TRANSLATES THE NABU KEYBOARD SPECIAL CHARS INTO +; ANALOGOUS ROMWBW STANDARD SPECIAL CHARACTERS. THE TABLE STARTS WITH +; NABU KEY CODE $E0 AND HANDLES $20 POSSIBLE VALUES ($E0-$FF) +; THE SPECIAL KEYS SEND A SPECIFIC KEYCODE TO INDICATE DOWN (KEY +; PRESSED) AND UP (KEY RELEASED). WE WILL ARBITRARILY CHOOSE TO +; RESPOND TO KEY RELEASED. +; +NABUKB_XTBL: + .DB $00 ; $E0, RIGHT ARROW (DN) + .DB $00 ; $E1, LEFT ARROW (DN) + .DB $00 ; $E2, UP ARROW (DN) + .DB $00 ; $E3, DOWN ARROW (DN) + .DB $00 ; $E4, PAGE RIGHT (DN) + .DB $00 ; $E5, PAGE LEFT (DN) + .DB $00 ; $E6, NO (DN) + .DB $00 ; $E7, YES (DN) + .DB $00 ; $E8, SYM (DN) + .DB $00 ; $E9, PAUSE (DN) + .DB $00 ; $EA, TV/NABU (DN) + .DB $00 ; $EB, N/A + .DB $00 ; $EC, N/A + .DB $00 ; $ED, N/A + .DB $00 ; $EE, N/A + .DB $00 ; $EF, N/A + .DB $F9 ; $F0, RIGHT ARROW (UP) -> RIGHT ARROW + .DB $F8 ; $F1, LEFT ARROW (UP) -> LEFT ARROW + .DB $F6 ; $F2, UP ARROW (UP) -> UP ARROW + .DB $F7 ; $F3, DOWN ARROW (UP) -> DOWN ARROW + .DB $F5 ; $F4, PAGE RIGHT (UP) -> PAGE DOWN + .DB $F4 ; $F5, PAGE LEFT (UP) -> PAGE UP + .DB $F3 ; $F6, NO (UP) -> END + .DB $F2 ; $F7, YES (UP) -> HOME + .DB $EC ; $F8, SYM (UP) -> SYSRQ + .DB $EE ; $F9, PAUSE (UP) -> PAUSE + .DB $EF ; $FA, TV/NABU (UP) -> APP + .DB $00 ; $FB, N/A + .DB $00 ; $FC, N/A + .DB $00 ; $FD, N/A + .DB $00 ; $FE, N/A + .DB $00 ; $FF, N/A diff --git a/Source/ver.inc b/Source/ver.inc index dc59e817..a19eed64 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.29" +#DEFINE BIOSVER "3.5.0-dev.30" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 2a94095b..b95a624a 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.29" + db "3.5.0-dev.30" endm From c8794d2b9c5cbff0515b1df67ce1724c2d6e0e0b Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 19 Apr 2024 16:49:12 -0700 Subject: [PATCH 08/20] NABU LEDs - Utilize NABU front panel LEDs for startup diagnostics and disk activity. - Modified NABU keyboard driver to pass thru joystick activity codes. --- Source/HBIOS/ansi.asm | 12 +++++++++++ Source/HBIOS/cfg_duo.asm | 2 +- Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_epitx.asm | 2 +- Source/HBIOS/cfg_heath.asm | 2 +- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mbc.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_mon.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_nabu.asm | 6 +++--- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_rph.asm | 2 +- Source/HBIOS/cfg_s100.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_z80retro.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- Source/HBIOS/hbios.asm | 10 +++++++++ Source/HBIOS/nabukb.asm | 38 +++++++++++++++++++++++++++++------ Source/HBIOS/romldr.asm | 5 +++++ Source/HBIOS/std.asm | 1 + Source/ver.inc | 2 +- Source/ver.lib | 2 +- 27 files changed, 84 insertions(+), 30 deletions(-) diff --git a/Source/HBIOS/ansi.asm b/Source/HBIOS/ansi.asm index f6a9dc88..8ca7e7f5 100644 --- a/Source/HBIOS/ansi.asm +++ b/Source/HBIOS/ansi.asm @@ -149,8 +149,20 @@ ANSI_IN1: ; PERFORM ACTUAL KEYBOARD INPUT LD B,BF_VDAKRD ; SET FUNCTION TO KEYBOARD READ CALL ANSI_VDADISP ; CALL VDA DISPATCHER LD A,E ; CHARACTER READ INTO A +; +; THE NABU USES KEYBOARD CODES TO REPORT JOYSTICK ACTIVITY USING +; VALUES $A0-$BF. NORMALLY, WE WOULD PROCESS ANYTHING OVER $80 AS +; A SPECIAL CHAR AND WIND UP IGNORING $80-$DF. FOR NABU, WE ALLOW +; ANYTHING LESS THAN $E0 TO BE RETURNED TO THE APPLICATION FOR +; JOYSTICK PROCESSING. +; +#IF (PLATFORM == PLT_NABU) + CP $E0 ; >= $E0 IS SPECIAL KEY + JR NC,ANSI_IN2 ; HANDLE SPECIAL KEY +#ELSE BIT 7,A ; TEST HIGH BIT JR NZ,ANSI_IN2 ; HANDLE $80 OR HIGHER AS SPECIAL CHAR +#ENDIF XOR A ; OTHERWISE, SIGNAL SUCCESS RET ; AND RETURN THE KEY ; diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 107fb3a9..893a6587 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -78,7 +78,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 791177fe..63c18fcf 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index a5b0c1c9..932a62c6 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -81,7 +81,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 72c2737e..8ad98887 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 8c4b9d50..b813b71a 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -109,7 +109,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 890e6a84..a9bc9bd8 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -75,7 +75,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 31b60aef..2063892c 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index f3cb889e..94e2dfd1 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -75,7 +75,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index ffcac599..6aaeba20 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -82,7 +82,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index a44a56a8..d906ee10 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -79,9 +79,9 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED ; DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; -LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] -LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDENABLE .EQU TRUE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_NABU ; LEDMODE_[STD|RTC|NABU] +LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 84a54d59..b10812ba 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -86,7 +86,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 92b1c01c..c2c24b2c 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index a04c1803..7a78404b 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index dcdad453..206a8db0 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index 123f37e9..d3ed65c7 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index fbf65a8e..a64395e0 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -75,7 +75,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 2b189277..57a60175 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index ee96e89e..36b86b85 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -78,7 +78,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index c2b9e790..cfe19702 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -67,7 +67,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index fe567637..778b7a13 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -78,7 +78,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 9aa76cc8..db0466d1 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -126,6 +126,7 @@ MODCNT .SET MODCNT + 1 ; MBC: LED Port=0x70, bits 1-0, normal, shared w/ RTC port ; DUO: LED Port=0x94, bits 1-0, normal, shared w/ RTC port ; S100: LED Port = $0E, bit 2, inverted, dedicated port +; NABU: LED Port = $00, bits 5-3, normal, shared port ; #IF (LEDENABLE) #IF (LEDMODE == LEDMODE_STD) @@ -143,6 +144,12 @@ MODCNT .SET MODCNT + 1 #DEFCONT \ OUT (LEDPORT),A #DEFCONT \ POP AF #ENDIF + #IF (LEDMODE == LEDMODE_NABU) + #DEFINE LED(N) PUSH AF + #DEFCONT \ LD A,+(((N << 3)) & %00011000) + #DEFCONT \ OUT (LEDPORT),A + #DEFCONT \ POP AF + #ENDIF #ELSE #DEFINE LED(N) \; #ENDIF @@ -1220,6 +1227,9 @@ BOOTWAIT: ;LD A,(RTCDEFVAL) ; DEFAULT LATCH VALUE LD A,RTCDEF ; DEFAULT LATCH VALUE OR %00000001 ; LED 0 ON + #ENDIF + #IF (LEDMODE == LEDMODE_NABU) + LD A,%00001000 ; LOW LED BIT ONLY #ENDIF OUT (LEDPORT),A #ENDIF diff --git a/Source/HBIOS/nabukb.asm b/Source/HBIOS/nabukb.asm index 4d936e97..873bd79c 100644 --- a/Source/HBIOS/nabukb.asm +++ b/Source/HBIOS/nabukb.asm @@ -5,6 +5,22 @@ ; ;====================================================================== ; +; NABU KEYBOARD CODES: +; +; $00-$7F STANDARD ASCII CODES +; $80-$8F JOYSTICK PREFIXES ($80 = JS1, $81 = JS2) +; $90-$9F KEYBOARD ERROR CODES +; $A0-$BF JOYSTICK DATA +; $C0-$DF UNUSED +; $E0-$EF SPECIAL KEYS +; +; NOTE THAT THE ERROR CODE $94 IS A WATCHDOG TIMER THAT WILL BE +; SENT BY THE KEYBOARD EVERY 3.7 SECONDS. +; +; THE CODE BELOW WILL IGNORE (SWALLOW) THE ERROR CODES ($90-$9F) AND +; WILL TRANSLATE SPECIAL KEYS ($E0-$FF) TO ROMWBW EQUIVALENTS. ALL +; OTHER KEYS WILL BE PASSED THROUGH AS IS. +; ; KBPORT EQU $90 ; ; POLL FOR INPUT @@ -58,18 +74,28 @@ NABUKB_STAT: RET NZ ; KEY WAITING, ALL SET IN A,(NABUKB_DAT+1) ; GET BKD STATUS AND $02 ; CHECK DATA RDY BIT - JR Z,NABUKB_STAT1 ; BAIL OUT IF NOT + JR Z,NABUKB_STATX ; BAIL OUT IF NOT IN A,(NABUKB_DAT) ; GET THE KEY BIT 7,A ; HIGH BIT IS SPECIAL CHAR - CALL NZ,NABUKB_XLAT ; IF SO, TRANSLATE IT - JR C,NABUKB_STAT1 ; CF INDICATES INVALID + JR Z,NABUKB_STAT2 ; IF NORMAL CHAR, BUFFER IT + CP $90 ; START OF ERR CODES + JR C,NABUKB_STAT1 ; NOT ERR CODE, CONTINUE + CP $A0 ; END OF ERR CODES + JR NC,NABUKB_STAT1 ; NOT ERR CODE, CONTINUE + JR NABUKB_STATX ; IS ERR CODE, IGNORE IT +NABUKB_STAT1: + CP $E0 ; SPECIAL CHARACTER? + JR C,NABUKB_STAT2 ; IF NOT, SKIP XLAT, BUFFER KEY + CALL NABUKB_XLAT ; IF SO, TRANSLATE IT + JR C,NABUKB_STATX ; CF INDICATES INVALID +NABUKB_STAT2: LD (NABUKB_KEY),A ; BUFFER IT - LD A,1 ; KEY WAITING STATUS + LD A,1 ; SIGNAL KEY WAITING LD (NABUKB_KSTAT),A ; SAVE IT OR A ; SET FLAGS - RET + RET ; DONE ; -NABUKB_STAT1: +NABUKB_STATX: XOR A ; SIGNAL NO CHAR READY JP CIO_IDLE ; RETURN VIA IDLE PROCESSOR ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 611a50cf..021efe85 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -1496,6 +1496,11 @@ clrled: out (RTCIO),a ; clear led ld (HB_RTCVAL),a #endif + #if (LEDMODE == LEDMODE_NABU) + ; Bits 0 and 1 of the RTC latch are for the LEDs. + xor a + out (LEDPORT),a + #endif #endif #endif ret diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index d66f8eb9..62bc7b72 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -148,6 +148,7 @@ CONBELL_IOBIT .EQU 2 LEDMODE_NONE .EQU 0 LEDMODE_STD .EQU 1 LEDMODE_RTC .EQU 2 +LEDMODE_NABU .EQU 3 ; ; DSKY MODE SELECTIONS ; diff --git a/Source/ver.inc b/Source/ver.inc index a19eed64..d557051d 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.30" +#DEFINE BIOSVER "3.5.0-dev.31" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index b95a624a..bf0a23fb 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.30" + db "3.5.0-dev.31" endm From 3f63c92fd59ae41da7cc9e593b55e5892baff11d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 30 Apr 2024 14:18:59 -0700 Subject: [PATCH 09/20] HBIOS Cleaning - Rearranged HBIOS code to improve colocation of related code. - Implemented macros to improve control over assembly diagnostic output. - Improved handling of diagnostic LEDs. - Improved application boot bank management. - Implemented application boot for Z280 systems. - Moved Z280_BNKSEL into proxy. - --- Source/CBIOS/cbios.asm | 8 +- Source/CPM3/boot.z80 | 8 +- Source/HBIOS/Bank Layout.txt | 33 +- Source/HBIOS/Build.cmd | 1 + Source/HBIOS/Config/DUO_std.asm | 9 +- Source/HBIOS/Config/SCZ180_sc700.asm | 1 + Source/HBIOS/acia.asm | 16 +- Source/HBIOS/asci.asm | 32 +- Source/HBIOS/ay38910.asm | 30 +- Source/HBIOS/bqrtc.asm | 6 +- Source/HBIOS/cfg_duo.asm | 4 +- Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_epitx.asm | 2 +- Source/HBIOS/cfg_heath.asm | 2 +- Source/HBIOS/cfg_master.asm | 2 +- Source/HBIOS/cfg_mbc.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_mon.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_nabu.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_rph.asm | 2 +- Source/HBIOS/cfg_s100.asm | 2 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_z80retro.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- Source/HBIOS/ch.asm | 12 +- Source/HBIOS/chsd.asm | 12 +- Source/HBIOS/chusb.asm | 12 +- Source/HBIOS/ctc.asm | 38 +- Source/HBIOS/cvdu.asm | 18 +- Source/HBIOS/dma.asm | 14 +- Source/HBIOS/ds1501rtc.asm | 10 +- Source/HBIOS/ds7rtc.asm | 2 +- Source/HBIOS/dsrtc.asm | 60 +- Source/HBIOS/duart.asm | 24 +- Source/HBIOS/ef.asm | 4 + Source/HBIOS/esp.asm | 12 +- Source/HBIOS/fd.asm | 52 +- Source/HBIOS/gdc.asm | 18 +- Source/HBIOS/h8p.asm | 5 + Source/HBIOS/hbios.asm | 2675 +++++++++++++++----------- Source/HBIOS/hdsk.asm | 10 +- Source/HBIOS/icm.asm | 4 + Source/HBIOS/ide.asm | 120 +- Source/HBIOS/imm.asm | 24 +- Source/HBIOS/intrtc.asm | 2 +- Source/HBIOS/kbd.asm | 2 +- Source/HBIOS/kio.asm | 4 + Source/HBIOS/lpt.asm | 24 +- Source/HBIOS/md.asm | 4 +- Source/HBIOS/mky.asm | 5 + Source/HBIOS/nabu.asm | 5 + Source/HBIOS/nabukb.asm | 4 + Source/HBIOS/pcf.asm | 6 +- Source/HBIOS/pio.asm | 24 +- Source/HBIOS/pkd.asm | 6 +- Source/HBIOS/ppa.asm | 24 +- Source/HBIOS/ppide.asm | 48 +- Source/HBIOS/ppk.asm | 2 +- Source/HBIOS/ppp.asm | 10 +- Source/HBIOS/prp.asm | 10 +- Source/HBIOS/rf.asm | 24 +- Source/HBIOS/romldr.asm | 45 +- Source/HBIOS/rp5rtc.asm | 6 +- Source/HBIOS/scon.asm | 6 +- Source/HBIOS/sd.asm | 35 +- Source/HBIOS/simrtc.asm | 6 +- Source/HBIOS/sio.asm | 88 +- Source/HBIOS/sn76489.asm | 22 +- Source/HBIOS/spk.asm | 6 +- Source/HBIOS/std.asm | 120 +- Source/HBIOS/syq.asm | 24 +- Source/HBIOS/tms.asm | 30 +- Source/HBIOS/uart.asm | 82 +- Source/HBIOS/uf.asm | 6 +- Source/HBIOS/vdu.asm | 10 +- Source/HBIOS/vga.asm | 14 +- Source/HBIOS/vrc.asm | 12 +- Source/HBIOS/ym2612.asm | 6 +- Source/HBIOS/z2u.asm | 8 +- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 87 files changed, 2216 insertions(+), 1830 deletions(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index b12d859f..d1320ae0 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -2266,13 +2266,7 @@ INIT: RST 08 ; DO IT, DE=MAJ/MIN/UP/PAT LD A,D ; A := MAJ/MIN CP ((RMJ << 4) | RMN) ; MATCH? - JR NZ,INIT1 ; HANDLE VER MISMATCH - LD A,E ; A := OS UP/PAT - AND $F0 ; PAT NOT INCLUDED IN MATCH - CP (RUP << 4) ; MATCH? - JR NZ,INIT1 ; HANDLE VER MISMATCH - JR INIT2 ; ALL GOOD, CONTINUE -INIT1: + JR Z,INIT2 ; ALL GOOD, CONTINUE ; DISPLAY VERSION MISMATCH CALL NEWLINE2 ; FORMATTING LD DE,STR_VERMIS ; VERSION MISMATCH diff --git a/Source/CPM3/boot.z80 b/Source/CPM3/boot.z80 index b6f4c08d..dbb42907 100644 --- a/Source/CPM3/boot.z80 +++ b/Source/CPM3/boot.z80 @@ -96,13 +96,7 @@ init$2: rst 08 ; do it, de=maj/min/up/pat ld a,d ; a := maj/min cp ((rmj << 4) | rmn) ; match? - jr nz,init$3 ; handle ver mismatch - ld a,e ; a := os up/pat - and 0F0h ; pat not included in match - cp (rup << 4) ; match? - jr nz,init$3 ; handle ver mismatch - jr init$4 ; all good, continue -init$3: + jr z,init$4 ; all good, continue ; display version mismatch ld hl,vermis$msg ; version mismatch call ?pmsg ; display it diff --git a/Source/HBIOS/Bank Layout.txt b/Source/HBIOS/Bank Layout.txt index 01bff19a..a3a40d57 100644 --- a/Source/HBIOS/Bank Layout.txt +++ b/Source/HBIOS/Bank Layout.txt @@ -27,7 +27,7 @@ Bank ID Module Start Size 0x04 - N ROM Disk Data -Typical ROM Bank Layout +Typical ROM Bank Layout (512K) Bank ID Usage ------- ------ @@ -35,22 +35,43 @@ Bank ID Usage 0x01 ROM Loader, Monitor, ROM OSes 0x02 ROM Applications 0x03 Reserved -0x04-0x0F ROM Disk Banks +0x04-0x0F ROM Disk Banks (12) -Typical RAM Bank Layout +Standard RAM Bank Layout (512K) Bank ID Usage ------- ------ 0x80 RomWBW HBIOS -0x81-0x8B RAM Disk Data +0x81-0x88 RAM Disk Data (3) +0x89-0x8B App Banks (8) 0x8C CP/M 3 Buffers 0x8D CP/M 3 OS 0x8E User TPA 0x8F Common +Large RAM Bank Layout (2048K) -Typical ROMless Bank Layout +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81-0xB0 RAM Disk Data (30) +0xB1-0xBB App Banks (11) +0xBC CP/M 3 Buffers +0x8D CP/M 3 OS +0x8E User TPA +0x8F Common + +Tiny RAM Bank Layout (128K) + +Bank ID Usage +------- ------ +0x80 RomWBW HBIOS +0x81 CP/M 3 OS +0x82 User TPA +0x83 Common + +ROMless Standard Bank Layout (512K) Bank ID Usage ------- ------ @@ -58,7 +79,7 @@ Bank ID Usage 0x81 Loader, DbgMon, CP/M 2.2, ZSDOS 0x82 ROM Apps 0x83 More ROM Apps -0x84-0x8B RAM Disk Data +0x84-0x8B RAM Disk Data (8) 0x8C CP/M 3 Buffers 0x8D CP/M 3 OS 0x8E User TPA diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index 3ac3c555..4d101a96 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -50,6 +50,7 @@ echo. :: tasm -t80 -g3 -dCMD hbios_env.asm hbios_env.com hbios_env.lst || exit /b +zxcc hbios_env zxcc hbios_env >hbios_env.cmd call hbios_env.cmd diff --git a/Source/HBIOS/Config/DUO_std.asm b/Source/HBIOS/Config/DUO_std.asm index be2621d3..f6e91f0b 100644 --- a/Source/HBIOS/Config/DUO_std.asm +++ b/Source/HBIOS/Config/DUO_std.asm @@ -31,18 +31,21 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; INTMODE .SET 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) ; -;;;DMAENABLE .SET TRUE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMAENABLE .SET TRUE ; DMA: ENABLE DMA DRIVER (DMA.ASM) ; BATCOND .SET TRUE ; ENABLE LOW BATTERY WARNING MESSAGE ; ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ; -PCFENABLE .SET FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFENABLE .SET TRUE ; ENABLE PCF8584 I2C CONTROLLER ; MDFFENABLE .SET FALSE ; MD: ENABLE FLASH FILE SYSTEM ; UARTINTS .SET FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 ; +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; CHENABLE .SET TRUE ; CH: ENABLE CH375/376 USB SUPPORT -ESPENABLE .SET TRUE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +ESPENABLE .SET FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) diff --git a/Source/HBIOS/Config/SCZ180_sc700.asm b/Source/HBIOS/Config/SCZ180_sc700.asm index 88f38f37..d3d6284c 100644 --- a/Source/HBIOS/Config/SCZ180_sc700.asm +++ b/Source/HBIOS/Config/SCZ180_sc700.asm @@ -36,6 +36,7 @@ Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) ; LEDENABLE .SET TRUE ; ENABLE STATUS LED (SINGLE LED) +LEDMODE .SET LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .SET $0E ; STATUS LED PORT ADDRESS ; FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS diff --git a/Source/HBIOS/acia.asm b/Source/HBIOS/acia.asm index ee2e4ba6..dab9d31e 100644 --- a/Source/HBIOS/acia.asm +++ b/Source/HBIOS/acia.asm @@ -705,12 +705,12 @@ ACIA0_CFG: .DW (ACIA0CLK / ACIA0DIV) & $FFFF ; CLOCK FREQ AS .DW (ACIA0CLK / ACIA0DIV) >> 16 ; ... DWORD VALUE ; - .ECHO "ACIA: IO=" - .ECHO ACIA0BASE + DEVECHO "ACIA: IO=" + DEVECHO ACIA0BASE #IF (INTMODE == 1) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; ACIA_CFGSIZ .EQU $ - ACIA_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -728,12 +728,12 @@ ACIA1_CFG: .DW (ACIA1CLK / ACIA1DIV) & $FFFF ; CLOCK FREQ AS .DW (ACIA1CLK / ACIA1DIV) >> 16 ; ... DWORD VALUE ; - .ECHO "ACIA: IO=" - .ECHO ACIA1BASE + DEVECHO "ACIA: IO=" + DEVECHO ACIA1BASE #IF (INTMODE == 1) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index eb5d737f..85cbb0f5 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -837,12 +837,12 @@ ASCI1_CFG: .DW ASCI1CFG ; LINE CONFIGURATION .DW ASCI1_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "ASCI: IO=" - .ECHO ASCI1_BASE + DEVECHO "ASCI: IO=" + DEVECHO ASCI1_BASE #IF ((ASCIINTS) & (INTMODE >0)) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; ASCI_CFGSIZ .EQU $ - ASCI_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -855,12 +855,12 @@ ASCI0_CFG: .DW ASCI0CFG ; LINE CONFIGURATION .DW ASCI0_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "ASCI: IO=" - .ECHO ASCI0_BASE + DEVECHO "ASCI: IO=" + DEVECHO ASCI0_BASE #IF ((ASCIINTS) & (INTMODE >0)) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; #ELSE ; @@ -873,12 +873,12 @@ ASCI0_CFG: .DW ASCI0CFG ; LINE CONFIGURATION .DW ASCI0_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "ASCI: IO=" - .ECHO ASCI0_BASE + DEVECHO "ASCI: IO=" + DEVECHO ASCI0_BASE #IF ((ASCIINTS) & (INTMODE >0)) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; ASCI_CFGSIZ .EQU $ - ASCI_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -891,12 +891,12 @@ ASCI1_CFG: .DW ASCI1CFG ; LINE CONFIGURATION .DW ASCI1_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "ASCI: IO=" - .ECHO ASCI1_BASE + DEVECHO "ASCI: IO=" + DEVECHO ASCI1_BASE #IF ((ASCIINTS) & (INTMODE > 0)) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index e5ce2493..bc2a431a 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -21,14 +21,14 @@ ; AY_RCSND .EQU 0 ; 0 = EB MODULE, 1=MF MODULE ; - .ECHO "AY38910: MODE=" + DEVECHO "AY38910: MODE=" ; #IF (AYMODE == AYMODE_SCG) AY_RSEL .EQU $9A AY_RDAT .EQU $9B AY_RIN .EQU AY_RSEL AY_ACR .EQU $9C - .ECHO "SCG" + DEVECHO "SCG" #ENDIF ; #IF (AYMODE == AYMODE_N8) @@ -36,35 +36,35 @@ AY_RSEL .EQU $9C AY_RDAT .EQU $9D AY_RIN .EQU AY_RSEL AY_ACR .EQU N8_ACR - .ECHO "N8" + DEVECHO "N8" #ENDIF ; #IF (AYMODE == AYMODE_RCZ80) AY_RSEL .EQU $D8 AY_RDAT .EQU $D0 AY_RIN .EQU AY_RSEL+AY_RCSND - .ECHO "RCZ80" + DEVECHO "RCZ80" #ENDIF ; #IF (AYMODE == AYMODE_RCZ180) AY_RSEL .EQU $68 AY_RDAT .EQU $60 AY_RIN .EQU AY_RSEL+AY_RCSND - .ECHO "RCZ180" + DEVECHO "RCZ180" #ENDIF ; #IF (AYMODE == AYMODE_MSX) AY_RSEL .EQU $A0 AY_RDAT .EQU $A1 AY_RIN .EQU $A2 - .ECHO "MSX" + DEVECHO "MSX" #ENDIF ; #IF (AYMODE == AYMODE_LINC) AY_RSEL .EQU $33 AY_RDAT .EQU $32 AY_RIN .EQU $32 - .ECHO "LINC" + DEVECHO "LINC" #ENDIF ; #IF (AYMODE == AYMODE_MBC) @@ -72,7 +72,7 @@ AY_RSEL .EQU $A0 AY_RDAT .EQU $A1 AY_RIN .EQU AY_RSEL AY_ACR .EQU $A2 - .ECHO "MBC" + DEVECHO "MBC" #ENDIF ; #IF (AYMODE == AYMODE_DUO) @@ -80,21 +80,21 @@ AY_RSEL .EQU $A4 AY_RDAT .EQU $A5 AY_RIN .EQU AY_RSEL AY_ACR .EQU $A6 - .ECHO "DUO" + DEVECHO "DUO" #ENDIF ; #IF (AYMODE == AYMODE_NABU) AY_RSEL .EQU $41 AY_RDAT .EQU $40 AY_RIN .EQU $40 - .ECHO "NABU" + DEVECHO "NABU" #ENDIF ; - .ECHO ", IO=" - .ECHO AY_RSEL - .ECHO ", CLOCK=" - .ECHO AY_CLK - .ECHO " HZ\n" + DEVECHO ", IO=" + DEVECHO AY_RSEL + DEVECHO ", CLOCK=" + DEVECHO AY_CLK + DEVECHO " HZ\n" ; ;====================================================================== ; diff --git a/Source/HBIOS/bqrtc.asm b/Source/HBIOS/bqrtc.asm index 51fd677f..233faeab 100644 --- a/Source/HBIOS/bqrtc.asm +++ b/Source/HBIOS/bqrtc.asm @@ -91,9 +91,9 @@ BQRTC_UTI .EQU %00001000 BQRTC_BUFSIZE .EQU 6 ; 6 BYTE BUFFER (YYMMDDHHMMSS) - .ECHO "BQRTC: IO=" - .ECHO BQRTC_BASE - .ECHO "\n" + DEVECHO "BQRTC: IO=" + DEVECHO BQRTC_BASE + DEVECHO "\n" ; RTC Device Initialization Entry diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 893a6587..50994d4a 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -78,7 +78,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; @@ -306,7 +306,7 @@ PIOSBASE .EQU $60 ; PIO: PIO REGISTERS BASE ADR FOR SBC PPI UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) UFBASE .EQU $0C ; UF: REGISTERS BASE ADR ; -SN76489ENABLE .EQU TRUE ; SN: ENABLE SN76489 SOUND DRIVER +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD SNMODE .EQU SNMODE_DUO ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM|DUO] diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 63c18fcf..42298316 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index 932a62c6..7ca40d09 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -81,7 +81,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 8ad98887..c3f4f10e 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_SC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index b813b71a..18fcd0c5 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -109,7 +109,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index a9bc9bd8..f767a352 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -75,7 +75,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 2063892c..39214bb6 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index 94e2dfd1..32db23b4 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -75,7 +75,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 6aaeba20..8ecb59e0 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -82,7 +82,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index d906ee10..3831d4e6 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_NABU ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_NABU ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index b10812ba..a8c1e846 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -86,7 +86,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index c2c24b2c..46edeaaf 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 7a78404b..66f815e5 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 206a8db0..6f4af843 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index d3ed65c7..ce82688d 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU TRUE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_SC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index a64395e0..e0d85495 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -75,7 +75,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index 57a60175..e91836c3 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -80,7 +80,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) -LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_SC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index 36b86b85..d087f5cc 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -78,7 +78,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU $00 ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index cfe19702..f0ed536c 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -67,7 +67,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 778b7a13..0c33dfa0 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -78,7 +78,7 @@ FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING ; LEDENABLE .EQU FALSE ; ENABLES STATUS LED -LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC|NABU] +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED ; diff --git a/Source/HBIOS/ch.asm b/Source/HBIOS/ch.asm index ad884da4..0bfb877d 100644 --- a/Source/HBIOS/ch.asm +++ b/Source/HBIOS/ch.asm @@ -105,9 +105,9 @@ CH_CFG0: ; DEVICE 0 .DB CH0SDENABLE ; ENABLE SD CARD SUB-DRIVER .DW CHSD_CFG0 ; SD CARD SUB-DRIVER INIT ADR ; - .ECHO "CH: IO=" - .ECHO CH0BASE - .ECHO "\n" + DEVECHO "CH: IO=" + DEVECHO CH0BASE + DEVECHO "\n" #ENDIF ; #IF (CHCNT >= 2) @@ -120,9 +120,9 @@ CH_CFG1: ; DEVICE 1 .DB CH1SDENABLE ; ENABLE SD CARD SUB-DRIVER .DW CHSD_CFG1 ; SD CARD SUB-DRIVER INIT ADR ; - .ECHO "CH: IO=" - .ECHO CH1BASE - .ECHO "\n" + DEVECHO "CH: IO=" + DEVECHO CH1BASE + DEVECHO "\n" #ENDIF ; #IF ($ - CH_CFGTBL) != (CHCNT * CH_CFGSIZ) diff --git a/Source/HBIOS/chsd.asm b/Source/HBIOS/chsd.asm index a5789c9a..c4b38194 100644 --- a/Source/HBIOS/chsd.asm +++ b/Source/HBIOS/chsd.asm @@ -60,9 +60,9 @@ CHSD_CFG0: .DW CH0_MODE ; POINTER TO MODE BYTE ; #IF (CH0SDENABLE) - .ECHO "CHSD: IO=" - .ECHO CH0BASE - .ECHO "\n" + DEVECHO "CHSD: IO=" + DEVECHO CH0BASE + DEVECHO "\n" #ENDIF #ENDIF ; @@ -77,9 +77,9 @@ CHSD_CFG1: .DW CH1_MODE ; POINTER TO MODE BYTE ; #IF (CH1SDENABLE) - .ECHO "CHSD: IO=" - .ECHO CH1BASE - .ECHO "\n" + DEVECHO "CHSD: IO=" + DEVECHO CH1BASE + DEVECHO "\n" #ENDIF #ENDIF ; diff --git a/Source/HBIOS/chusb.asm b/Source/HBIOS/chusb.asm index fd4c5d44..175a00b2 100644 --- a/Source/HBIOS/chusb.asm +++ b/Source/HBIOS/chusb.asm @@ -65,9 +65,9 @@ CHUSB_CFG0: .DW CH0_MODE ; POINTER TO MODE BYTE ; #IF (CH0USBENABLE) - .ECHO "CHUSB: IO=" - .ECHO CH0BASE - .ECHO "\n" + DEVECHO "CHUSB: IO=" + DEVECHO CH0BASE + DEVECHO "\n" #ENDIF #ENDIF ; @@ -82,9 +82,9 @@ CHUSB_CFG1: .DW CH1_MODE ; POINTER TO MODE BYTE ; #IF (CH1USBENABLE) - .ECHO "CHUSB: IO=" - .ECHO CH1BASE - .ECHO "\n" + DEVECHO "CHUSB: IO=" + DEVECHO CH1BASE + DEVECHO "\n" #ENDIF #ENDIF ; diff --git a/Source/HBIOS/ctc.asm b/Source/HBIOS/ctc.asm index 777b28f8..2fd205ea 100644 --- a/Source/HBIOS/ctc.asm +++ b/Source/HBIOS/ctc.asm @@ -28,19 +28,19 @@ CTC_TIM256CFG .EQU %00110111 ; CTC TIMER/256 MODE CONFIG #IF (CTCTIMER & (INTMODE != 2)) .ECHO "*** WARNING: CTC TIMER DISABLED -- INTMODE 2 REQUIRED!!!\n" #ENDIF - .ECHO "CTC: IO=" - .ECHO CTCBASE + DEVECHO "CTC: IO=" + DEVECHO CTCBASE ; #IF (CTCTIMER & (INTMODE == 2)) ; #IF (INT_CTC0A % 4) - .ECHO INT_CTC0A - .ECHO "\n" - .ECHO (INT_CTC0A % 4) - .ECHO "\n" + DEVECHO INT_CTC0A + DEVECHO "\n" + DEVECHO (INT_CTC0A % 4) + DEVECHO "\n" - .ECHO "*** ERROR: CTC BASE VECTOR NOT DWORD ALIGNED!!!\n" + DEVECHO "*** ERROR: CTC BASE VECTOR NOT DWORD ALIGNED!!!\n" !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; @@ -112,23 +112,23 @@ CTC_DIVHI .EQU CTCPRE CTC_DIVLO .EQU (CTC_DIV / CTC_DIVHI) ; - .ECHO ", TIMER MODE=" + DEVECHO ", TIMER MODE=" #IF (CTCMODE == CTCMODE_CTR) - .ECHO "COUNTER" + DEVECHO "COUNTER" #ENDIF #IF (CTCMODE == CTCMODE_TIM16) - .ECHO "TIMER/16" + DEVECHO "TIMER/16" #ENDIF #IF (CTCMODE == CTCMODE_TIM256) - .ECHO "TIMER/256" + DEVECHO "TIMER/256" #ENDIF - .ECHO ", DIVISOR=" - .ECHO CTC_DIV - .ECHO ", HI=" - .ECHO CTC_DIVHI - .ECHO ", LO=" - .ECHO CTC_DIVLO - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", DIVISOR=" + DEVECHO CTC_DIV + DEVECHO ", HI=" + DEVECHO CTC_DIVHI + DEVECHO ", LO=" + DEVECHO CTC_DIVLO + DEVECHO ", INTERRUPTS ENABLED" ; #IF ((CTC_DIV == 0) | (CTC_DIV > $FFFF)) .ECHO "COMPUTED CTC DIVISOR IS UNUSABLE!\n" @@ -148,7 +148,7 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH ; #ENDIF ; - .ECHO "\n" + DEVECHO "\n" ; ;================================================================================================== ; CTC PRE-INITIALIZATION diff --git a/Source/HBIOS/cvdu.asm b/Source/HBIOS/cvdu.asm index adbe84c9..8fce3e31 100644 --- a/Source/HBIOS/cvdu.asm +++ b/Source/HBIOS/cvdu.asm @@ -18,7 +18,7 @@ ; CVDU_BASE .EQU $E0 ; - .ECHO "CVDU: MODE=" + DEVECHO "CVDU: MODE=" ; #IF (CVDUMODE == CVDUMODE_ECB) CVDU_KBDDATA .EQU CVDU_BASE + $02 ; KBD CTLR DATA PORT @@ -26,7 +26,7 @@ CVDU_KBDST .EQU CVDU_BASE + $0A ; KBD CTLR STATUS/CMD PORT CVDU_STAT .EQU CVDU_BASE + $04 ; READ M8563 STATUS CVDU_REG .EQU CVDU_BASE + $04 ; SELECT M8563 REGISTER CVDU_DATA .EQU CVDU_BASE + $0C ; READ/WRITE M8563 DATA - .ECHO "ECB" + DEVECHO "ECB" #ENDIF ; #IF (CVDUMODE == CVDUMODE_MBC) @@ -35,15 +35,15 @@ CVDU_KBDST .EQU CVDU_BASE + $03 ; KBD CTLR STATUS/CMD PORT CVDU_STAT .EQU CVDU_BASE + $04 ; READ M8563 STATUS CVDU_REG .EQU CVDU_BASE + $04 ; SELECT M8563 REGISTER CVDU_DATA .EQU CVDU_BASE + $05 ; READ/WRITE M8563 DATA - .ECHO "MBC" + DEVECHO "MBC" #ENDIF ; - .ECHO ", IO=" - .ECHO CVDU_BASE - .ECHO ", KBD MODE=PS/2" - .ECHO ", KBD IO=" - .ECHO CVDU_KBDDATA - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO CVDU_BASE + DEVECHO ", KBD MODE=PS/2" + DEVECHO ", KBD IO=" + DEVECHO CVDU_KBDDATA + DEVECHO "\n" ; CVDU_ROWS .EQU 25 CVDU_COLS .EQU 80 diff --git a/Source/HBIOS/dma.asm b/Source/HBIOS/dma.asm index 18d0ff8c..05ac7a03 100644 --- a/Source/HBIOS/dma.asm +++ b/Source/HBIOS/dma.asm @@ -3,17 +3,17 @@ ;================================================================================================== ; ; - .ECHO "DMA: MODE=" + DEVECHO "DMA: MODE=" ; #IF ((DMAMODE == DMAMODE_ECB) | (DMAMODE == DMAMODE_MBC)) DMA_IO .EQU DMABASE DMA_CTL .EQU DMABASE + 1 DMA_USEHALF .EQU TRUE #IF (DMAMODE == DMAMODE_ECB) - .ECHO "ECB" + DEVECHO "ECB" #ENDIF #IF (DMAMODE == DMAMODE_MBC) - .ECHO "MBC" + DEVECHO "MBC" #ENDIF #ENDIF ; @@ -21,12 +21,12 @@ DMA_USEHALF .EQU TRUE DMA_IO .EQU DMABASE DMA_CTL .EQU DMABASE + 3 DMA_USEHALF .EQU FALSE - .ECHO "DUO" + DEVECHO "DUO" #ENDIF ;S - .ECHO ", IO=" - .ECHO DMA_IO - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO DMA_IO + DEVECHO "\n" ; DMA_CONTINUOUS .equ %10111101 ; + Pulse DMA_BYTE .equ %10011101 ; + Pulse diff --git a/Source/HBIOS/ds1501rtc.asm b/Source/HBIOS/ds1501rtc.asm index daf42ae3..fb50f4ec 100644 --- a/Source/HBIOS/ds1501rtc.asm +++ b/Source/HBIOS/ds1501rtc.asm @@ -111,11 +111,11 @@ DS1501RTC_TE .EQU %10000000 ; DS1501RTC_BUFSIZE .EQU 6 ; 6 BYTE BUFFER (YYMMDDHHMMSS) - .ECHO "DS1501RTC: RTCIO=" - .ECHO DS1501RTC_BASE - .ECHO ", NVMIO=" - .ECHO DS1501NVM_BASE - .ECHO "\n" + DEVECHO "DS1501RTC: RTCIO=" + DEVECHO DS1501RTC_BASE + DEVECHO ", NVMIO=" + DEVECHO DS1501NVM_BASE + DEVECHO "\n" ; ; RTC Device Initialization Entry ; diff --git a/Source/HBIOS/ds7rtc.asm b/Source/HBIOS/ds7rtc.asm index 7dd6970c..4014b26e 100644 --- a/Source/HBIOS/ds7rtc.asm +++ b/Source/HBIOS/ds7rtc.asm @@ -23,7 +23,7 @@ DS7_WRITE .EQU (DS7_DS1307 | DS7_W) ; WRITE ; DS7_CTL .EQU (DS7_OUT | DS7_SQWE | DS7_RATE) ; - .ECHO "DS1307: ENABLED\n" + DEVECHO "DS1307: ENABLED\n" ; ;----------------------------------------------------------------------------- ; DS1307 INITIALIZATION diff --git a/Source/HBIOS/dsrtc.asm b/Source/HBIOS/dsrtc.asm index 0f20b987..f7e89631 100644 --- a/Source/HBIOS/dsrtc.asm +++ b/Source/HBIOS/dsrtc.asm @@ -66,30 +66,30 @@ ; RTC LATCH WRITE ; --------------- ; -; BIT SBC RCBUS SBC-004 MFPIC K80W N8 N8-CSIO MK4 SC130 SC131 SC126 MBC RPH -; ----- ------- ------- ------- ------- ------- ------- ------- ------- ------- ------- --------------- ------- ------- -; D7 RTC_OUT RTC_OUT RTC_OUT -- -- RTC_OUT RTC_OUT RTC_OUT -- -- RTC_OUT,I2C_SDA RTC_OUT RTC_OUT -; D6 RTC_CLK RTC_CLK RTC_CLK -- -- RTC_CLK RTC_CLK RTC_CLK -- -- RTC_CLK RTC_CLK RTC_CLK -; D5 /RTC_WE /RTC_WE /RTC_WE -- -- /RTC_WE /RTC_WE /RTC_WE -- -- /RTC_WE /RTC_WE /RTC_WE -; D4 RTC_CE RTC_CE RTC_CE -- -- RTC_CE RTC_CE RTC_CE -- -- RTC_CE RTC_CE RTC_CE -; D3 NC NC CLKSEL /RTC_CE /RTC_CE NC NC NC -- -- /SPI_CS2 CLKSEL -- -; D2 NC NC SPK RTC_CLK RTC_CLK SPI_CS SPI_CS NC /SPI_CS1/SPI_CS1/SPI_CS1 SPK -- -; D1 -- -- -- RTC_WE RTC_WE SPI_CLK NC NC -- -- FS LED1 -- -; D0 -- -- -- RTC_OUT RTC_OUT SPI_DI NC NC -- -- I2C_SCL LED0 -- -; -; RTC LATCH READTCH READ -; ---------------------- -; -; D7 -- -- -- -- -- -- -- -- -- -- I2C_SDA -- -- -; D6 CFG -- CFG -- -- SPI_DO CFG -- -- -- -- CFG -- -; D5 -- -- -- -- -- -- -- -- -- -- -- -- -- -; D4 -- -- -- -- -- -- -- -- -- -- -- -- -- -; D3 -- -- -- -- -- -- -- -- -- -- -- -- -- -; D2 -- -- -- -- -- -- -- -- -- -- -- -- -- -; D1 -- -- -- -- -- -- -- -- -- -- -- CLKSEL -- -; D0 RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN -- -- RTC_IN RTC_IN RTC_IN -; - .ECHO "DSRTC: MODE=" +; BIT SBC RCBUS SBC-004 MFPIC K80W N8 N8-CSIO MK4 SC126 SC130 SC131 SC140 SC503 SC722 MBC RPH +; ----- ------- ------- ------- ------- ------- ------- ------- ------- --------------- ------- ------- ------- ------- ------- ------- ------- +; D7 RTC_OUT RTC_OUT RTC_OUT -- -- RTC_OUT RTC_OUT RTC_OUT RTC_OUT,I2C_SDA -- -- -- -- -- RTC_OUT RTC_OUT +; D6 RTC_CLK RTC_CLK RTC_CLK -- -- RTC_CLK RTC_CLK RTC_CLK RTC_CLK -- -- -- -- -- RTC_CLK RTC_CLK +; D5 /RTC_WE /RTC_WE /RTC_WE -- -- /RTC_WE /RTC_WE /RTC_WE /RTC_WE -- -- -- -- -- /RTC_WE /RTC_WE +; D4 RTC_CE RTC_CE RTC_CE -- -- RTC_CE RTC_CE RTC_CE RTC_CE -- -- -- -- -- RTC_CE RTC_CE +; D3 NC NC CLKSEL /RTC_CE /RTC_CE NC NC NC /SPI_CS2 -- -- -- -- -- CLKSEL -- +; D2 NC NC SPK RTC_CLK RTC_CLK SPI_CS SPI_CS NC /SPI_CS1 /SPI_CS1/SPI_CS1/SPI_CS1/SPI_CS1/SPI_CS1SPK -- +; D1 -- -- -- RTC_WE RTC_WE SPI_CLK NC NC FS -- -- -- -- -- LED1 -- +; D0 -- -- -- RTC_OUT RTC_OUT SPI_DI NC NC I2C_SCL -- -- -- -- -- LED0 -- +; +; RTC LATCH LATCH READ +; -------------------- +; +; D7 -- -- -- -- -- -- -- -- I2C_SDA -- -- -- -- -- -- -- +; D6 CFG -- CFG -- -- SPI_DO CFG -- -- -- -- -- -- -- CFG -- +; D5 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +; D4 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +; D3 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +; D2 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +; D1 -- -- -- -- -- -- -- -- -- -- -- -- -- -- CLKSEL -- +; D0 RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN RTC_IN -- -- -- -- -- RTC_IN RTC_IN +; + DEVECHO "DSRTC: MODE=" ; #IF (DSRTCMODE == DSRTCMODE_STD) ; @@ -107,7 +107,7 @@ RTCDEF .SET RTCDEF | DSRTC_IDLE ; FOR HBIOS MAINLINE ; #DEFINE DSRTC_OPRVAL HB_RTCVAL ; - .ECHO "STD" + DEVECHO "STD" ; #ENDIF ; @@ -125,7 +125,7 @@ DSRTC_IDLE .EQU %00001000 ; QUIESCENT STATE ; #DEFINE DSRTC_OPRVAL DSRTC_RTCVAL ; - .ECHO "MFPIC" + DEVECHO "MFPIC" ; #ENDIF ; @@ -143,13 +143,13 @@ DSRTC_IDLE .EQU %00001000 ; QUIESCENT STATE ; #DEFINE DSRTC_OPRVAL HB_RTCVAL ; - .ECHO "K80W" + DEVECHO "K80W" ; #ENDIF ; - .ECHO ", IO=" - .ECHO DSRTC_IO - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO DSRTC_IO + DEVECHO "\n" ; ; VALUES FOR DIFFERENT BATTERY OR SUPERCAPACITOR CHARGE RATES ; diff --git a/Source/HBIOS/duart.asm b/Source/HBIOS/duart.asm index 91213874..c6ab5fc8 100644 --- a/Source/HBIOS/duart.asm +++ b/Source/HBIOS/duart.asm @@ -823,9 +823,9 @@ DUART0A_CFG: .DW DUART0ACFG ; IY+8 LINE CONFIGURATION .DB 1 ; IY+10 MULTIPLIER WRT 3.6864MHZ CLOCK ; - .ECHO "DUART: IO=" - .ECHO DUART0BASE + $00 - .ECHO ", CHANNEL A\n" + DEVECHO "DUART: IO=" + DEVECHO DUART0BASE + $00 + DEVECHO ", CHANNEL A\n" ; DUART_CFGSIZ .EQU $ - DUART_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -840,9 +840,9 @@ DUART0B_CFG: .DW DUART0BCFG ; LINE CONFIGURATION .DB 1 ; MULTIPLIER WRT 3.6864MHZ CLOCK ; - .ECHO "DUART: IO=" - .ECHO DUART0BASE + $08 - .ECHO ", CHANNEL B\n" + DEVECHO "DUART: IO=" + DEVECHO DUART0BASE + $08 + DEVECHO ", CHANNEL B\n" ; #IF (DUARTCNT >= 2) ; @@ -857,9 +857,9 @@ DUART1A_CFG: .DW DUART1ACFG ; LINE CONFIGURATION .DB 1 ; MULTIPLIER WRT 3.6864MHZ CLOCK ; - .ECHO "DUART: IO=" - .ECHO DUART1BASE + $00 - .ECHO ", CHANNEL A\n" + DEVECHO "DUART: IO=" + DEVECHO DUART1BASE + $00 + DEVECHO ", CHANNEL A\n" ; DUART1B_CFG: ; 2ND DUART MODULE CHANNEL B @@ -872,9 +872,9 @@ DUART1B_CFG: .DW DUART1BCFG ; LINE CONFIGURATION .DB 1 ; MULTIPLIER WRT 3.6864MHZ CLOCK ; - .ECHO "DUART: IO=" - .ECHO DUART1BASE + $08 - .ECHO ", CHANNEL B\n" + DEVECHO "DUART: IO=" + DEVECHO DUART1BASE + $08 + DEVECHO ", CHANNEL B\n" ; #ENDIF ; diff --git a/Source/HBIOS/ef.asm b/Source/HBIOS/ef.asm index 9d6228f3..63ba2bf4 100644 --- a/Source/HBIOS/ef.asm +++ b/Source/HBIOS/ef.asm @@ -153,6 +153,10 @@ EF_FG_CYAN .EQU 6 EF_FG_WHITE .EQU 7 ; EF_SCREENSIZE .EQU EF_DROWS * EF_DLINES +; + DEVECHO "EF: IO=" + DEVECHO EF_BASE + DEVECHO "\n" ; ;====================================================================== ; VDU DRIVER - INITIALIZATION diff --git a/Source/HBIOS/esp.asm b/Source/HBIOS/esp.asm index 75b4d58b..5a76ffb7 100644 --- a/Source/HBIOS/esp.asm +++ b/Source/HBIOS/esp.asm @@ -54,9 +54,9 @@ ESP_CFG_ST .EQU 2 ; ESP STATUS PORT ESP_CFG_RDYMSK .EQU 3 ; ESP READY MASK ESP_CFG_BSYMSK .EQU 4 ; ESP BUSY MASK ; - .ECHO "ESP: IO=" - .ECHO ESP_IOBASE - .ECHO "\n" + DEVECHO "ESP: IO=" + DEVECHO ESP_IOBASE + DEVECHO "\n" ; ; GLOBAL ESP INITIALIZATION ; @@ -348,7 +348,7 @@ ESP_STR_UPGRADE .TEXT "!!!UPGRADE REQUIRED!!!$" ESPCON_ROWS .EQU 25 ; VGA DISPLAY ROWS ESPCON_COLS .EQU 80 ; VGA DISPLAY COLS ; - .ECHO "ESPCON: ENABLED\n" + DEVECHO "ESPCON: ENABLED\n" ; ; ; @@ -692,7 +692,7 @@ ESPSER0_CFG: .DB ESP_0_BUSY ; ESP BUSY BIT MASK .DW ESPSER_LINECFG ; LINE CONFIGURATION ; - .ECHO "ESPSER: DEVICE=0\n" + DEVECHO "ESPSER: DEVICE=0\n" ; ESPSER1_CFG: .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) @@ -702,7 +702,7 @@ ESPSER1_CFG: .DB ESP_1_BUSY ; ESP BUSY BIT MASK .DW ESPSER_LINECFG ; LINE CONFIGURATION ; - .ECHO "ESPSER: DEVICE=1\n" + DEVECHO "ESPSER: DEVICE=1\n" ; ; ; diff --git a/Source/HBIOS/fd.asm b/Source/HBIOS/fd.asm index fc52bf77..5888f4a1 100644 --- a/Source/HBIOS/fd.asm +++ b/Source/HBIOS/fd.asm @@ -152,31 +152,31 @@ FD_CFGTBL: .DB 0 ; HOST HEAD .DB FD0TYPE ; DRIVE TYPE ; - .ECHO "FD: MODE=" - .ECHO FDMODE_STR - .ECHO ", IO=" - .ECHO FDC_MSR - .ECHO ", DRIVE 0" - .ECHO ", TYPE=" + DEVECHO "FD: MODE=" + DEVECHO FDMODE_STR + DEVECHO ", IO=" + DEVECHO FDC_MSR + DEVECHO ", DRIVE 0" + DEVECHO ", TYPE=" #IF (FD0TYPE == FDT_NONE - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (FD0TYPE == FDT_3DD - .ECHO "3.5\" DD" + DEVECHO "3.5\" DD" #ENDIF #IF (FD0TYPE == FDT_3HD - .ECHO "3.5\" HD" + DEVECHO "3.5\" HD" #ENDIF #IF (FD0TYPE == FDT_5DD - .ECHO "5.25\" DD" + DEVECHO "5.25\" DD" #ENDIF #IF (FD0TYPE == FDT_5HD - .ECHO "5.25\" HD" + DEVECHO "5.25\" HD" #ENDIF #IF (FD0TYPE == FDT_8 - .ECHO "8\" DD" + DEVECHO "8\" DD" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; #IF (FD_DEVCNT >= 2) ; DEVICE 1, PRIMARY SLAVE @@ -189,31 +189,31 @@ FD_CFGTBL: .DB 0 ; HOST HEAD .DB FD1TYPE ; DRIVE TYPE ; - .ECHO "FD: MODE=" - .ECHO FDMODE_STR - .ECHO ", IO=" - .ECHO FDC_MSR - .ECHO ", DRIVE 1" - .ECHO ", TYPE=" + DEVECHO "FD: MODE=" + DEVECHO FDMODE_STR + DEVECHO ", IO=" + DEVECHO FDC_MSR + DEVECHO ", DRIVE 1" + DEVECHO ", TYPE=" #IF (FD1TYPE == FDT_NONE - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (FD1TYPE == FDT_3DD - .ECHO "3.5\" DD" + DEVECHO "3.5\" DD" #ENDIF #IF (FD1TYPE == FDT_3HD - .ECHO "3.5\" HD" + DEVECHO "3.5\" HD" #ENDIF #IF (FD1TYPE == FDT_5DD - .ECHO "5.25\" DD" + DEVECHO "5.25\" DD" #ENDIF #IF (FD1TYPE == FDT_5HD - .ECHO "5.25\" HD" + DEVECHO "5.25\" HD" #ENDIF #IF (FD1TYPE == FDT_8 - .ECHO "8\" DD" + DEVECHO "8\" DD" #ENDIF - .ECHO "\n" + DEVECHO "\n" #ENDIF ; #IF ($ - FD_CFGTBL) != (FD_DEVCNT * FD_CFGSIZ) diff --git a/Source/HBIOS/gdc.asm b/Source/HBIOS/gdc.asm index a73a432c..6e0fc085 100644 --- a/Source/HBIOS/gdc.asm +++ b/Source/HBIOS/gdc.asm @@ -37,32 +37,32 @@ GDC_COLS .EQU 80 ; BE USED TO ALLOW FOR MULTIPLE MONITOR TIMINGS AND/OR FONT ; DEFINITIONS. ; - .ECHO "GDC: MODE=" + DEVECHO "GDC: MODE=" ; #IF (GDCMODE == GDCMODE_ECB) - .ECHO "ECB" + DEVECHO "ECB" #ENDIF #IF (GDCMODE == GDCMODE_RPH) - .ECHO "RPH" + DEVECHO "RPH" #ENDIF ; - .ECHO ", DISPLAY=" + DEVECHO ", DISPLAY=" ; #IF (GDCMON == GDCMON_CGA) #DEFINE USEFONTCGA #DEFINE GDC_FONT FONTCGA - .ECHO "CGA" + DEVECHO "CGA" #ENDIF ; #IF (GDCMON == GDCMON_EGA) #DEFINE USEFONT8X16 #DEFINE GDC_FONT FONT8X16 - .ECHO "EGA" + DEVECHO "EGA" #ENDIF ; - .ECHO ", IO=" - .ECHO GDC_BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO GDC_BASE + DEVECHO "\n" ; TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT diff --git a/Source/HBIOS/h8p.asm b/Source/HBIOS/h8p.asm index 8ccb96ad..234283f5 100644 --- a/Source/HBIOS/h8p.asm +++ b/Source/HBIOS/h8p.asm @@ -11,6 +11,11 @@ ; 20 08 ; +--10--+ 80 ; +; + DEVECHO "H8P: IO=??" + ;DEVECHO 0 + DEVECHO "\n" +; ;__H8P_PREINIT_______________________________________________________________________________________ ; ; CONFIGURE AND RESET PANEL diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index db0466d1..e0f6fb41 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -65,6 +65,27 @@ ; - [xio|mio].asm ; - unlzsa2s.asm ; +; MEMORY LAYOUT: +; +; +; DESCRIPTION START LENGTH +; ----------------------------- ------- ------- +; Page Zero 0x0000 0x0100 +; HBIOS Control Block 0x0100 0x0100 +; Proxy Image 0x0200 0x0200 +; Entry Vectors / Stack 0x0400 0x0100 +; Interrupt Vectors 0x0500 Varies +; System Initialization Varies Varies +; Function Dispatching Varies Varies +; System API Varies Varies +; Z280 Int Vector Table Varies Varies +; Internal Functions Varies Varies +; Utility Functions Varies Varies +; Print Summary Function Varies Varies +; Hardware Drivers Varies Varies +; Font Data Varies Varies +; HBIOS Data Varies Varies +; ; AUXILIARY CONTROL REGISTER ; -------------------------- ; @@ -81,20 +102,19 @@ ; ; PORT SCG:0x9C 0x94 VDP:0x92 PSG:0xA2 0x80 MEDIA:0xA6 ; -; -; INCLUDE GENERIC STUFF -; -#INCLUDE "std.asm" -; #DEFINE HBIOS ; -SUPCTS .EQU FALSE ; SUPPRESS CTS DURING HBIOS BOOT -; ; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. ; MODCNT .EQU 0 #IFDEF ROMBOOT MODCNT .SET MODCNT + 1 +; + #DEFINE BNKINFO + #DEFINE MEMINFO + #DEFINE DEVINFO + #DEFINE SYSINFO +; #ENDIF #IFDEF APPBOOT MODCNT .SET MODCNT + 1 @@ -107,36 +127,67 @@ MODCNT .SET MODCNT + 1 !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; +; CONTROLS PRINTING OF DEVICE INFORMATION IN ASSEMBLY OUTPUT +; +#IFDEF DEVINFO + #DEFINE DEVECHO .ECHO +#ELSE + #DEFINE DEVECHO \; +#ENDIF +; +; CONTROLS PRINTING OF MEMORY USAGE INFORMATION IN ASSEMBLY OUTPUT +; +#IFDEF MEMINFO + #DEFINE MEMECHO .ECHO +#ELSE + #DEFINE MEMECHO \; +#ENDIF +; +; INCLUDE GENERIC STUFF +; +#INCLUDE "std.asm" +; +SUPCTS .EQU FALSE ; SUPPRESS CTS DURING HBIOS BOOT ; +; HELPER MACROS ; -#DEFINE ALIGN(N) .FILL ((($+(N-1)) & ~(N-1)) - $) +; SET FRONT PANEL LEDS ; #IF (FPLED_ENABLE) - #DEFINE DIAG(N) PUSH AF + #DEFINE FPLEDS(N) PUSH AF #DEFCONT \ LD A,N #DEFCONT \ CALL FP_SETLEDS #DEFCONT \ POP AF #ELSE - #DEFINE DIAG(N) \; + #DEFINE FPLEDS(N) \; #ENDIF ; -; SCxxx: LED Port=0x0E, bit 2, inverted, dedicated port -; TinyZ80: LED Port=0x6E, bit 0, inverted, dedicated port -; Z80-512K: LED Port=0x6E, bit 0, inverted, dedicated port -; MBC: LED Port=0x70, bits 1-0, normal, shared w/ RTC port -; DUO: LED Port=0x94, bits 1-0, normal, shared w/ RTC port -; S100: LED Port = $0E, bit 2, inverted, dedicated port -; NABU: LED Port = $00, bits 5-3, normal, shared port +; SET DIAGNOSTIC LEDS +; +; SCxxx: LED Port=0x0E, bit 2, inverted, dedicated port (LEDMODE_SC) +; SC7xx: LED Port=0x0E, bit 0, inverted, dedicated port (LEDMODE_STD) +; TinyZ80: LED Port=0x6E, bit 0, inverted, dedicated port (LEDMODE_STD) +; Z80-512K: LED Port=0x6E, bit 0, inverted, dedicated port (LEDMODE_STD) +; MBC: LED Port=0x70, bits 1-0, normal, shared w/ RTC port (LEDMODE_RTC) +; DUO: LED Port=0x94, bits 1-0, normal, shared w/ RTC port (LEDMODE_RTC) +; S100: LED Port = $0E, bit 2, inverted, dedicated port (LEDMODE_SC) +; NABU: LED Port = $00, bits 5-3, normal, shared w/ control port (LEDMODE_NABU) ; #IF (LEDENABLE) #IF (LEDMODE == LEDMODE_STD) - #DEFINE LED(N) PUSH AF + #DEFINE DIAG(N) PUSH AF #DEFCONT \ LD A,~N #DEFCONT \ OUT (LEDPORT),A #DEFCONT \ POP AF #ENDIF + #IF (LEDMODE == LEDMODE_SC) + #DEFINE DIAG(N) PUSH AF + #DEFCONT \ LD A,+(((~N) << 2) & %00000100) + #DEFCONT \ OUT (LEDPORT),A + #DEFCONT \ POP AF + #ENDIF #IF (LEDMODE == LEDMODE_RTC) - #DEFINE LED(N) PUSH AF + #DEFINE DIAG(N) PUSH AF #DEFCONT \ LD A,(HB_RTCVAL) #DEFCONT \ AND %11111100 #DEFCONT \ OR (N & %00000011) @@ -145,21 +196,25 @@ MODCNT .SET MODCNT + 1 #DEFCONT \ POP AF #ENDIF #IF (LEDMODE == LEDMODE_NABU) - #DEFINE LED(N) PUSH AF - #DEFCONT \ LD A,+(((N << 3)) & %00011000) + #DEFINE DIAG(N) PUSH AF + #DEFCONT \ LD A,+((N << 3) & %00011000) #DEFCONT \ OUT (LEDPORT),A #DEFCONT \ POP AF #ENDIF #ELSE - #DEFINE LED(N) \; + #DEFINE DIAG(N) \; #ENDIF ; +; HANDLE SYSTEM CHECK ERRORS +; #DEFINE SYSCHKERR(HB_ERR) \ #DEFCONT \ CALL SYSCHKA #DEFCONT \ LD A,HB_ERR #DEFCONT \ OR A ; -; +; THE HB_EI AND HB_DI MACROS ARE USED TO GENERATE THE APPROPRIATE +; INTERRUPT ENABLE/DISABLE CODE DEPENDING ON THE INTERRUPT MODE +; BEING USED. ; #IF (INTMODE == 0) ; NO INTERRUPT HANDLING @@ -182,6 +237,8 @@ MODCNT .SET MODCNT + 1 #ENDIF #ENDIF ; +; CONSISTENCY CHECKS +; #IF (INTMODE > 3) .ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n" !!! ; FORCE AN ASSEMBLY ERROR @@ -217,56 +274,83 @@ MODCNT .SET MODCNT + 1 ; #DEFINE Z2_BANK(X) (PBANK(X) << 3) ; +; RTC LATCH +; +; MANY OF THE ROMWBW SYSTEMS USE A LATCH PORT PRIMARILY FOR BIT +; BANGING A DS-1302 RTC. HOWEVER, SINCE THE RTC ONLY NEEDS A COUPLE +; BITS, THE OTHER BITS OF THE LATCH ARE FREQUENTY USED FOR OTHER +; PURPOSES (LEDS, SD CARD BIT BANGING, ETC.). SEE DSRTC.ASM FOR +; A SUMMARY OF THE WAY THE RTC LATCH BITS ARE USED IN THE VARIOUS +; ROMWBW SYSTEMS. IT IS CRITICAL THAT WHEN MANIPULATING THE RTC +; LATCH THAT BITS ARE NOT FLIPPED INADVERTENTLY. THE RTC LATCH IS +; TYPICALLY WRITE-ONLY, SO WE NEED TO MAINTAIN A SHADOW COPY. +; THE SHADOW COPY IS CALLED HB_RTCVAL AND IS DECLARED AT THE END OF +; THIS FILE IN THE DATA AREA. +; +; INITIALIZING THE HB_RTCVAL SHADOW IS TRICKY BECAUSE DIFFERENT BITS +; ARE MANAGED IN DIFFERENT DRIVERS. TO HANDLE THIS, ; THE RTCDEF EQUATE IS INITIALIZED HERE AND UPDATED BY DRIVER INCLUDES ; THAT SHARE THE RTC LATCH. AS EACH DRIVER FILE IS INCLUDED, IT CAN -; USE .SET TO SET ANY BITS THEY OWN WITHIN THE RTC LATCH BYTE. -; SINCE RTCDEF IS CHANGED AFTER IT NEEDS TO BE USED BY THE CODE, IT -; CANNOT BE USED DIRECTLY TO SET THE LATCH. INSTEAD, THE FINAL VALUE +; USE .SET TO MODIFY THE DEFAULT VALUE OF ANY BITS THEY OWN. +; SINCE RTCDEF IS CHANGED *AFTER* IT NEEDS TO BE USED BY THE CODE, IT +; SHOULD NOT BE USED DIRECTLY TO SET THE LATCH. INSTEAD, THE FINAL VALUE ; OF RTCDEF IS USED TO INITIALIZE A STORAGE BYTE CALLED RTCDEFVAL AT -; THE END OF HBIOS.ASM. SO (RTCDEFVAL) CAN BE USED ANYWHERE IN -; HBIOS.ASM TO ACCESS THE FINAL RTCDEF VALUE. +; THE END OF THIS FILE. SO (RTCDEFVAL) CAN BE USED ANYWHERE IN +; HBIOS.ASM TO ACCESS THE FINAL RTCDEF VALUE. IN MOST PLACES, THE +; SHADOW COPY (RTCVAL) SHOULD BE USED TO GET THE CURRENT VALUE OF THE +; LATCH AND MAINTAIN ALL BIT CHANGES. ; -RTCDEF .EQU 0 ; ALLOWS DRIVERS TO SET BITS +RTCDEF .EQU 0 ; INIT DEF RTC LATCH VALUE +; +; THE SC126 HAS AN I2C CIRCUIT AND THERE IS NO ASSOCAITED +; DRIVER, SO WE SET THAT BIT HERE. IT IS SET FOR ALL OF THE SCXXX +; SYSTEMS, BUT IS UNUSED ON ALL BUT THE SC126. IT DOES NO HARM. ; #IF (PLATFORM == PLT_SCZ180) -RTCDEF .SET RTCDEF | %00000001 ; SC128 I2C SCL BIT +RTCDEF .SET RTCDEF | %00000001 ; SC128 I2C SCL BIT #ENDIF ; +; MBC PLATFORM IMPLEMENTS DYNAMIC SPEED SWITCH ON RTC LATCH +; BIT 3. SET THE BIT TO LOW SPEED AS DEFAULT HERE. +; #IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC)) -RTCDEF .SET RTCDEF & ~%00001000 ; INITIAL SPEED LOW +RTCDEF .SET RTCDEF & ~%00001000 ; INITIAL SPEED LOW #ENDIF ; +; DUODYNE PLATFORM IMPLEMENTS DYNAMIC SPEED SWITCH ON RTC LATCH +; BIT 3. SET THE BIT TO LOW SPEED AS DEFAULT HERE. +; #IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_SBC)) -RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW +RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW #ENDIF ; -; +; EMIT FRONT PANEL CONFIGURATION TO ASSEMBLY OUTPUT ; #IF (FPLED_ENABLE | FPSW_ENABLE) - .ECHO "FP: " + DEVECHO "FP: " #IF (FPLED_ENABLE) - .ECHO "LEDIO=" - .ECHO FPLED_IO + DEVECHO "LEDIO=" + DEVECHO FPLED_IO #ENDIF #IF (FPLED_ENABLE & FPSW_ENABLE) - .ECHO ", " + DEVECHO ", " #ENDIF #IF (FPSW_ENABLE) - .ECHO "SWIO=" - .ECHO FPSW_IO + DEVECHO "SWIO=" + DEVECHO FPSW_IO #ENDIF - .ECHO "\n" + DEVECHO "\n" #ENDIF ; -; -; -#IFNDEF APPBOOT +;================================================================================================== +; Z80 PAGE ZERO, VECTORS, ETC. +;================================================================================================== ; .ORG 0 ; -;================================================================================================== -; NORMAL PAGE ZERO SETUP, RET/RETI/RETN AS APPROPRIATE, LEAVE INTERRUPTS DISABLED -;================================================================================================== +HB_PGZERO_BEG .EQU $ +; +#IFNDEF APPBOOT ; .FILL (000H - $),0FFH ; RST 0 JP HB_START @@ -312,12 +396,19 @@ DESC .DB "Copyright (C) 2024, Wayne Warthen, GNU GPL v3", 0 .FILL ($100 - $),$FF ; PAD REMAINDER OF PAGE ZERO ; #ENDIF +; + .ORG $100 +; +HB_PGZERO_END .EQU $ ; ;================================================================================================== ; HBIOS CONFIGURATION BLOCK (HCB) ;================================================================================================== ; .ORG HCB_LOC +; +HB_HCB_BEG .EQU $ +; HCB: JP HB_START ; @@ -363,11 +454,15 @@ CB_APP_BNKS .DB APP_BNKS ; .FILL (HCB + HCB_SIZ - $),0 ; PAD REMAINDER OF HCB ; +HB_HCB_END .EQU $ +; ;================================================================================================== ; HBIOS UPPER MEMORY PROXY (RELOCATED TO RUN IN TOP 2 PAGES OF CPU RAM) ;================================================================================================== ; ; THE FOLLOWING CODE IS RELOCATED TO THE TOP OF MEMORY TO HANDLE INVOCATION DISPATCHING +; +HB_PROXY_BEG .EQU $ ; .FILL (HBX_IMG - $) ; FILL TO START OF PROXY IMAGE START .ORG HBX_LOC ; ADJUST FOR RELOCATION @@ -376,8 +471,9 @@ CB_APP_BNKS .DB APP_BNKS ; ; HBIOS PROXY CODE $FE00 (256 BYTES) ; INTERRUPT VECTORS $FF00 (32 BYTES, 16 ENTRIES) -; INTERRUPT HANDLER STUBS $FF20 (128 BYTES) -; HBIOS PROXY COPY BUFFER $FF80 (64 BYTES) +; INTERRUPT HANDLER STUBS $FF20 (64 BYTES) +; HBIOS PROXY CODE $FF60 (64 BYTES) +; HBIOS PROXY COPY BUFFER $FFA0 (64 BYTES) ; HBIOS PROXY MGMT BLOCK $FFE0 (32 BYTES) ; ; DEFINITIONS @@ -391,9 +487,7 @@ HBX_IDENT: .DB RMJ << 4 | RMN ; FIRST BYTE OF VERSION INFO .DB RUP << 4 | RTP ; SECOND BYTE OF VERSION INFO ; -;================================================================================================== -; HBIOS ENTRY FOR RST 08 PROCESSING -;================================================================================================== +; HBIOS ENTRY FOR RST 08 PROCESSING ; ; NOTE: THE SIZE OF HBX_TMPSTK (TYPICALLY 20 BYTES) IS INSUFFICIENT FOR ; FREERTOS IF AN INTERRUPT STRIKES WHILE THE TEMPORARY STACK IS ACTIVE. @@ -491,10 +585,8 @@ HBX_BNKSEL_INT: ; NEEDED WHEN USING INT MODE 1 BECAUSE THAT MODE REQUIRES ; PAGE ONE TO HAVE A VALID INT HANDLER WHENEVER INTS ARE ; ENABLED. - ;BIT 7,A ; [8] TEST RAM BIT - ;JR Z,HBX_ROM ; [12/7] IF NOT SET, JUST DO ROM - OR A ; [4] SET FLAGS - JP P,HBX_ROM ; [10] BIT 7 INDICATES RAM + OR A ; SET FLAGS + JP P,HBX_ROM ; BIT 7 INDICATES RAM #ENDIF OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR HBX_ROM: @@ -655,6 +747,97 @@ HBX_ROM: RET ; DONE #ENDIF ; +#IF (MEMMGR == MM_Z280) +; +; REG A HAS BANK ID, REG B HAS INITIAL PDR TO PROGRAM +; REGISTERS AF, BC, HL DESTROYED +; +Z280_BNKSEL: + ;; *DEBUG* + ;CALL PC_LBKT + ;CALL PRTHEXBYTE + ;CALL PC_RBKT + + ; SELECT I/O PAGE $FE (SAVING PREVIOUS VALUE) + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER + LDCTL HL,(C) ; GET CURRENT I/O PAGE + PUSH HL ; SAVE IT + LD L,$FF ; NEW I/O PAGE + LDCTL (C),HL ; IMPLEMENT +; + ; CONVERT BANK ID TO TOP 12 BITS OF PHYSICAL ADDRESS + ; WITH $0A IN THE LOW ORDER NIBBLE: + ; BANK ID: R000 BBBB + ; PDR: R000 0BBB B000 1010 (RCBUS) + ; PDR: 0000 RBBB B000 1010 (ZZ80MB) +; + MULTU A,$80 ; HL=0R00 0BBB B000 0000 + BIT 6,H ; RAM BIT SET? + JR Z,Z280_BNKSEL2 ; IF NOT, ALL DONE + RES 6,H ; OTHERWISE, REMOVE RAM BIT + LD A,RAMBIAS >> 6 ; RAM OFFSET (TOP 8 BITS) + OR H ; RECOMBINE + LD H,A ; AND PUT BACK IN H +; +Z280_BNKSEL2: +; + ; SET LOW NIBBLE + LD A,$0A ; VALUE FOR LOW NIBBLE + ADD HL,A ; ADD HL,A ; HL=0000 RBBB B000 1010 +; + ; POINT TO FIRST PDR TO PROGRAM + LD A,B ; INITIAL PDR TO PROG + OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER +; + ; PROGRAM 8 PDRS + LD C,Z280_MMUBLKMOV ; PDR BLOCK MOVE PORT + ;LD B,8 ; PROGRAM 8 PDRS + LD A,$10 ; PDR VALUE INCREMENT +Z280_BNKSEL3: + ; PROGRAM 8 PDR VALUES + ; LOOP UNROLLED FOR SPEED + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + OUTW (C),HL ; WRITE VALUE + ADD HL,A ; BUMP VALUE + ;DJNZ Z280_BNKSEL3 ; DO ALL PDRS +; + ; RESTORE I/O PAGE + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER + POP HL ; RECOVER ORIGINAL I/O PAGE + LDCTL (C),HL +; + RET +; +Z280_BNKSEL_LEN .EQU $ - Z280_BNKSEL +; +#ENDIF +; +; Z280 SYSCALL VECTOR ENTRY POINT. TAKES STACK PARAMETER AS A BRANCH +; ADDRESS AND CALLS IT. ALLOWS ANY USER MODE CODE TO CALL INTO AN +; ARBITRARY LOCATION OF SYSTEM MODE CODE. +; +#IF (MEMMGR == MM_Z280) +Z280_SYSCALL: + EX (SP),HL + LD (Z280_SYSCALL_GO + 1),HL + POP HL +Z280_SYSCALL_GO: + CALL $FFFF ; PARM SET ABOVE + RETIL ; RETURN FROM INT +#ENDIF ; ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Copy Data - Possibly between banks. This resembles CP/M 3, but @@ -837,44 +1020,23 @@ HBX_PPRET: HBX_PPSP .EQU $ - 2 RET ; -; SPECIAL ROUTINE IN HIGH MEMORY TO PERFORM A COLD START ON Z280 -; THIS REQUIRES US TO REMAP LOW MEMORY, THEN JUMP TO ZERO -; -#IF (MEMMGR == MM_Z280) -; -Z280_RESTART: - DI ; KILL INTERRUPTS - LD SP,HBX_LOC ; STACK IN HIGH MEMORY -; - ; COPY Z280 BANK SELECT ROUTINE TO HIGH MEMORY - LD HL,Z280_BNKSEL - LD DE,$8000 - LD BC,Z280_BNKSEL_LEN - LDIR -; - ; MAKE ROM BOOT BANK ACTIVE IN LOW SYS MEM - LD A,BID_BOOT - LD B,$10 ; FIRST SYS PDR - CALL $8000 ; DO IT -; - ; NOW JUST JUMP TO START OF ROM BOOT CODE - JP 0 -#ENDIF -; ; PRIVATE STACK AT END OF HBIOS CODE ; OCCUPIES SPACE BEFORE IVT ; +#IF (MEMMGR != MM_Z280) +; HBX_INTSTKSIZ .EQU $FF00 - $ - .ECHO "HBIOS INT STACK space: " - .ECHO HBX_INTSTKSIZ - .ECHO " bytes.\n" + MEMECHO "HBIOS INT STACK space: " + MEMECHO HBX_INTSTKSIZ + MEMECHO " bytes.\n" .FILL HBX_INTSTKSIZ,$FF HBX_INTSTK .EQU $ ; -;#IF (HBX_INTSTKSIZ < 24) -#IF (HBX_INTSTKSIZ < 22) + #IF (HBX_INTSTKSIZ < 22) .ECHO "*** ERROR: INTERRUPT STACK IS TOO SMALL!!!\n" !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF +; #ENDIF ; ; HBIOS INTERRUPT SLOT ASSIGNMENTS @@ -897,6 +1059,9 @@ HBX_INTSTK .EQU $ ; 13 SIO0 ; 14 SIO1 ; 15 +; + ; IVT MUST START AT PAGE BOUNDARY + ALIGN($100) ; HBX_IVT: .DW HBX_IV00 @@ -1036,9 +1201,9 @@ HBX_INT_SP .EQU $ - 2 ; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY ; HBX_TMPSTKSIZ .EQU (HBX_XFC - HBX_BUFSIZ - $) - .ECHO "HBIOS TEMP STACK space: " - .ECHO HBX_TMPSTKSIZ - .ECHO " bytes.\n" + MEMECHO "HBIOS TEMP STACK space: " + MEMECHO HBX_TMPSTKSIZ + MEMECHO " bytes.\n" .FILL HBX_TMPSTKSIZ,$CC HBX_TMPSTK .EQU $ ; @@ -1053,39 +1218,34 @@ HBX_BUF_END .EQU $ ; ; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES) ; -#IFDEF ROMBOOT - .DB BID_BOOT ; HB_CURBNK: CURRENTLY ACTIVE LOW MEMORY BANK ID -#ELSE - .DB BID_USR ; HB_CURBNK: CURRENTLY ACTIVE LOW MEMORY BANK ID -#ENDIF - .DB $FF ; HB_INVBNK: BANK ACTIVE AT TIME OF HBIOS CALL INVOCATION - .DW 0 ; HB_SRCADR: BNKCPY SOURCE ADDRESS - .DB BID_USR ; HB_SRCBNK: BNKCPY SOURCE BANK ID - .DW 0 ; HB_DSTADR: BNKCPY DESTINATION ADDRESS - .DB BID_USR ; HB_DSTBNK: BNKCPY DESTINATION BANK ID - .DW 0 ; HB_CPYLEN: BNKCPY LENGTH - .DW 0 ; RESERVED FOR OPTIONAL TICK CTR, PLATFORM DEPENDENT - .DW 0 ; RESERVED FOR FUTURE HBIOS USE - .DB 0 ; SHADOW VALUE FOR RTC LATCH PORT - .DB $FE ; HB_LOCK: HBIOS MUTEX LOCK - JP HBX_INVOKE ; HB_INVOKE: FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) - JP HBX_BNKSEL ; HB_BNKSEL: FIXED ADR ENTRY FOR HBX_BNKSEL - JP HBX_BNKCPY ; HB_BNKCPY: FIXED ADR ENTRY FOR HBX_BNKCPY - JP HBX_BNKCALL ; HB_BNKCALL: FIXED ADR ENTRY FOR HBX_BNKCALL - .DW HBX_IDENT ; ADDRESS OF HBIOS PROXY START (DEPRECATED) - .DW HBX_IDENT ; HB_IDENT: ADDRESS OF HBIOS IDENT INFO DATA BLOCK + .DB BID_BOOT ; (+0) HB_CURBNK: CURRENTLY ACTIVE LOW MEMORY BANK ID + .DB $FF ; (+1) HB_INVBNK: BANK ACTIVE AT TIME OF HBIOS CALL INVOCATION + .DW 0 ; (+2) HB_SRCADR: BNKCPY SOURCE ADDRESS + .DB BID_USR ; (+4) HB_SRCBNK: BNKCPY SOURCE BANK ID + .DW 0 ; (+5) HB_DSTADR: BNKCPY DESTINATION ADDRESS + .DB BID_USR ; (+7) HB_DSTBNK: BNKCPY DESTINATION BANK ID + .DW 0 ; (+8) HB_CPYLEN: BNKCPY LENGTH + .DW 0 ; (+10) RESERVED FOR OPTIONAL TICK CTR, PLATFORM DEPENDENT + .DW 0 ; (+12) RESERVED FOR FUTURE HBIOS USE + .DB 0 ; (+14) SHADOW VALUE FOR RTC LATCH PORT + .DB $FE ; (+15) HB_LOCK: HBIOS MUTEX LOCK + JP HBX_INVOKE ; (+16) HB_INVOKE: FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) + JP HBX_BNKSEL ; (+19) HB_BNKSEL: FIXED ADR ENTRY FOR HBX_BNKSEL + JP HBX_BNKCPY ; (+22) HB_BNKCPY: FIXED ADR ENTRY FOR HBX_BNKCPY + JP HBX_BNKCALL ; (+25) HB_BNKCALL: FIXED ADR ENTRY FOR HBX_BNKCALL + .DW HBX_IDENT ; (+28) ADDRESS OF HBIOS PROXY START (DEPRECATED) + .DW HBX_IDENT ; (+30) HB_IDENT: ADDRESS OF HBIOS IDENT INFO DATA BLOCK ; .FILL MEMTOP - $ ; FILL TO END OF MEMORY (AS NEEDED) - .ORG HBX_IMG + HBX_SIZ ; RESET ORG + .ORG HBX_IMG + HBX_SIZ ; RESTORE ORG ; -;================================================================================================== -; HBIOS CORE -;================================================================================================== +HB_PROXY_END .EQU $ ; ;================================================================================================== ; ENTRY VECTORS (JUMP TABLE) AND INTERNAL PROCESSING STACK ;================================================================================================== ; +HB_ENTRY_BEG .EQU $ HB_ENTRYTBL .EQU $ ; JP HB_START ; HBIOS INITIALIZATION @@ -1098,6 +1258,7 @@ HB_STKSIZ .EQU $100 - ($ & $FF) ; .FILL HB_STKSIZ,$FF ; USE REMAINDER OF PAGE FOR HBIOS STACK HB_STACK .EQU $ ; TOP OF HBIOS STACK +HB_ENTRY_END .EQU $ ; ;================================================================================================== ; INTERRUPT VECTOR TABLE (MUST START AT PAGE BOUNDARY!!!) @@ -1116,6 +1277,8 @@ HB_STACK .EQU $ ; TOP OF HBIOS STACK ; NOTE THAT EACH ENTRY HAS A FILLER BYTE OF VALUE ZERO. THIS BYTE ; HAS NO FUNCTION. IT IS JUST USED TO MAKE ENTRIES AN EVEN 4 BYTES. ; +HB_INTVEC_BEG .EQU $ +; HB_IVT: HB_IVT00: JP HB_BADINT \ .DB 0 HB_IVT01: JP HB_BADINT \ .DB 0 @@ -1159,27 +1322,35 @@ HB_IM1INT: CALL HB_BADINT \ RET NZ CALL HB_BADINT \ RET NZ ; +HB_INTVEC_END .EQU $ +; ;================================================================================================== ; SYSTEM INITIALIZATION ;================================================================================================== ; +HB_SYSINIT_BEG .EQU $ +; HB_START: ; #IFDEF APPBOOT - #IF (MEMMGR == MM_Z280) - LD DE,Z280_BOOTERR ; POINT TO ERROR MESSAGE - LD C,9 ; BDOS FUNC 9: WRITE STR - JP $0005 ; DO IT AND RETURN TO OS + ; THE CODE TO PREPARE FOR AN APPBOOT IS "HIDDEN" IN HB_WRKBUF. + ; WE ARE OPERATING ON THE (MINIMAL) BDOS STACK, BUT THAT + ; SHOULD BE FINE FOR THIS LIMITED ACTIVITY. + CALL HB_APPBOOT ; PREPARE APP BOOT + RET NZ ; RETURN ON ERROR +; +HB_APPBOOT_Z: ; -Z280_BOOTERR .TEXT "\r\n\r\n*** Application mode boot not supported under Z280 native memory management!!!\r\n\r\n$" - #ENDIF #ENDIF ; DI ; NO INTERRUPTS IM 1 ; INTERRUPT MODE 1 ; #IF ((PLATFORM == PLT_DUO) & TRUE) - ; WAIT A WHILE + ; THIS ARBITRARY DELAY SEEMS TO HELP DUODYNE CPU V1.0 SYSTEMS + ; STARTUP CLEANLY. DOUDYNE CPU V1.1 INTRODUCES A RESET + ; SUPERVISOR AND THIS DELAY IS UNNECESSARY. WE DON'T KNOW + ; IF WE ARE ON A V1.1 THOUGH, SO WE ALWAYS DO THE DELAY. LD HL,0 BOOTWAIT: DEC HL @@ -1188,14 +1359,15 @@ BOOTWAIT: JR NZ,BOOTWAIT #ENDIF ; - ; EARLY RTC LATCH BYTE INITIALIZATION - ; FOR SOME PLATFORMS THIS CONTROLS HI/LO SPEED CIRCUIT - ; NOTE: WE WANT TO USE (RTCDEFVAL) HERE, BUT THE Z2 MEMORY - ; MANAGER STARTS UP WITH THE FIRST 16K OF ROM MAPPED TO ALL - ; 4 16K BANKS OF CPU SPACE. SO, IF RTCDEVFAL IS LOCATED AFTER - ; PAST 16K, WE DON'T HAVE ACCESS TO IT. FOR NOW, WE JUST USE - ; RTCDEF WHICH IS SUBOPTIMAL, BUT PROBABLY DOES NOT CAUSE ANY - ; PROBLEMS. +; EARLY RTC LATCH BYTE INITIALIZATION +; FOR SOME PLATFORMS THIS CONTROLS HI/LO SPEED CIRCUIT +; NOTE: WE WANT TO USE (RTCDEFVAL) HERE, BUT THE Z2 MEMORY +; MANAGER STARTS UP WITH THE FIRST 16K OF ROM MAPPED TO ALL +; 4 16K BANKS OF CPU SPACE. SO, IF RTCDEVFAL IS LOCATED AFTER +; PAST 16K, WE DON'T HAVE ACCESS TO IT. FOR NOW, WE JUST USE +; RTCDEF WHICH IS SUBOPTIMAL, BUT PROBABLY DOES NOT CAUSE ANY +; PROBLEMS. +; ;LD A,(RTCDEFVAL) ; GET DEFAULT VALUE LD A,RTCDEF ; DEFAULT VALUE OUT (RTCIO),A ; SET IT @@ -1210,23 +1382,29 @@ BOOTWAIT: OUT0 (RPH_ACR),A ; ... REGISTER IS INITIALIZED #ENDIF ; +; INITIALIZE DIAGNOSTIC AND/OR FRONT PANEL LED(S) TO INDICATE THE +; SYSTEM IS ALIVE. WE HAVE NO RAM AT THIS TIME, SO WE CANNOT USE +; THE NORMAL DIAG() OR FPLEDS() MACROS WHICH DEPEND UPON A STACK. +; SO, JUST HACK THE VALUES IN PLACE. +; #IF (FPLED_ENABLE) - ; NO STACK YET, SO CAN'T USE DIAG() MACRO - LD A,DIAG_01 #IF (FPLED_INV) - XOR $FF ; INVERT BITS IF NEEDED + LD A,~DIAG_01 + #ELSE + LD A,DIAG_01 #ENDIF +; OUT (FPLED_IO),A #ENDIF +; #IF (LEDENABLE) - #IF (LEDMODE == LEDMODE_STD) + #IF ((LEDMODE == LEDMODE_STD) | (LEDMODE == LEDMODE_SC)) XOR A ; LED IS INVERTED, TURN IT ON #ENDIF #IF (LEDMODE == LEDMODE_RTC) ; CAN'T USE (RTCDEFVAL) YET, SEE COMMENTS ABOVE ;LD A,(RTCDEFVAL) ; DEFAULT LATCH VALUE - LD A,RTCDEF ; DEFAULT LATCH VALUE - OR %00000001 ; LED 0 ON + LD A,RTCDEF | %00000001 ; LED 0 ON #ENDIF #IF (LEDMODE == LEDMODE_NABU) LD A,%00001000 ; LOW LED BIT ONLY @@ -1234,11 +1412,16 @@ BOOTWAIT: OUT (LEDPORT),A #ENDIF ; - ; WARNING: ALTHOUGH WE ARE INITIALIZING SP HERE, IT IS NOT YET - ; SAFE TO PUSH VALUES TO THE STACK BECAUSE SOME PLATFORMS WILL - ; NOT YET HAVE RAM MAPPED TO THE UPPER 32K YET! +; INITIALIZE SP +; +; WARNING: ALTHOUGH WE ARE INITIALIZING SP HERE, IT IS NOT YET +; SAFE TO PUSH VALUES TO THE STACK BECAUSE SOME PLATFORMS WILL +; NOT YET HAVE RAM MAPPED TO THE UPPER 32K YET! +; LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY ; +; Z280 BARE METAL INIT +; #IF (CPUFAM == CPU_Z280) ; SET MAXIMUM I/O WAIT STATES FOR NOW LD C,Z280_BTCR ; BUS TIMING AND CONTROL REGISTER @@ -1252,21 +1435,34 @@ BOOTWAIT: ; #IF (MEMMGR == MM_Z280) ; - ; INITIALIZE ALL OF THE SYSTEM PAGE DESCRIPTORS WITH BLOCK MOVE - XOR A ; FIRST USER PDR + ; BEFORE ENABLING MMU W/ USER & SYSTEM PAGE TRANSLATION, + ; WE INITIALIZE ALL PDRS. HOWEVER, FOR AN APP + ; BOOT, THE LOW RAM PDRS ARE ALREADY CORRECT AND SHOULD BE + ; LEFT ALONE. +; + ; INITIALIZE ALL OF THE USER PAGE DESCRIPTORS WITH BLOCK MOVE +#IFDEF APPBOOT + LD A,$08 ; FIRST USER PDR IN HI MEM +#ELSE + LD A,$00 ; FIRST USER PDR +#ENDIF OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER LD HL,Z280_BOOTPDRTBL ; START OF PDR VALUES TABLE LD C,Z280_MMUBLKMOV ; PDR BLOCK MOVE PORT - LD B,16 ; PROGRAM 16 PDRS - OTIRW ; OTIRW + LD B,Z280_PDRCNT ; NUMBER OF PDR ENTRIES TO PROG + OTIRW ; OTIRW PROGS PDRS SEQUENTIALLY ; - ; INITIALIZE ALL OF THE USER PAGE DESCRIPTORS WITH BLOCK MOVE + ; INITIALIZE ALL OF THE SYSTEM PAGE DESCRIPTORS WITH BLOCK MOVE +#IFDEF APPBOOT + LD A,$18 ; FIRST SYSTEM PDR IN HI MEM +#ELSE LD A,$10 ; FIRST SYSTEM PDR +#ENDIF OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER LD HL,Z280_BOOTPDRTBL ; START OF PDR VALUES TABLE LD C,Z280_MMUBLKMOV ; PDR BLOCK MOVE PORT - LD B,16 ; PROGRAM 16 PDRS - OTIRW ; OTIRW + LD B,Z280_PDRCNT ; NUMBER OF PDR ENTRIES TO PROG + OTIRW ; OTIRW PROGS PDRS SEQUENTIALLY ; ; ENABLE MMU (SYSTEM AND USER TRANSLATION) LD C,Z280_MMUMCR ; MMU MASTER CONTROL REGISTER @@ -1276,28 +1472,23 @@ BOOTWAIT: ; DISABLE MEMORY REFRESH CYCLES LD A,$08 ; DISABLED OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER -; - ; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER - ; WILL POINT TO ROM COPY FOR NOW, UPDATED TO RAM LATER ON - LD C,Z280_VPR - LD HL,Z280_IVT >> 8 ; TOP 16 BITS OF PHYSICAL ADR OF IVT - LDCTL (C),HL ; JR Z280_INITZ ; JUMP TO CODE CONTINUATION ; - ; WORD ALIGN THE PDR TABLE - ALIGN(2) + ALIGN(2) ; WORD ALIGN THE PDR TABLE ; Z280_BOOTPDRTBL: +#IFNDEF APPBOOT ; LOWER 32 K (BANKED) - .DW ($000 << 4) | $A - .DW ($001 << 4) | $A - .DW ($002 << 4) | $A - .DW ($003 << 4) | $A - .DW ($004 << 4) | $A - .DW ($005 << 4) | $A - .DW ($006 << 4) | $A - .DW ($007 << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 0) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 1) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 2) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 3) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 4) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 5) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 6) << 4) | $A + .DW ((Z2_BANK(BID_BOOT) + 7) << 4) | $A +#ENDIF ; UPPER 32 K (COMMON) .DW ((Z2_BANK(BID_COM) + 0) << 4) | $A .DW ((Z2_BANK(BID_COM) + 1) << 4) | $A @@ -1308,6 +1499,8 @@ Z280_BOOTPDRTBL: .DW ((Z2_BANK(BID_COM) + 6) << 4) | $A .DW ((Z2_BANK(BID_COM) + 7) << 4) | $A ; +Z280_PDRCNT .EQU ($ - Z280_BOOTPDRTBL) / 2 +; Z280_INITZ: ; #ENDIF @@ -1319,6 +1512,8 @@ Z280_INITZ: ; #ENDIF ; +; Z180 BARE METAL INIT +; #IF (CPUFAM == CPU_Z180) ; SET BASE FOR CPU IO REGISTERS ; DO NOT USE Z180_ICR FROM Z180.INC BECAUSE THE ICR @@ -1370,6 +1565,8 @@ Z280_INITZ: ; #ENDIF ; +; EIPC BARE METAL INIT +; #IF (EIPCENABLE) LD A,(EIPC_WDT_CONST | EIPC_HALT_RUN | EIPC_WDT_P2_22) OUT (EIPC_WDTMR),A ; CLEAR WDTE BIT (DISABLE WATCHDOG) @@ -1386,6 +1583,44 @@ Z280_INITZ: OUT (EIPC_SCDP),A ; SET SYSTEM CONTROL DATA PORT (SCDP) #ENDIF ; +; Z180 MINI-ITX MADNESS TO INITIALIZE THE PPIO. WE HAVE THE MAIN RAM AT +; $8000 AND ROM AT $0 AT THIS POINT AND THE Z180 MMU SET UP. NOW +; GET THE 82C55 PROGRAMMED. +; +#IF (PLATFORM == PLT_EPITX) + ; THE 82C55 IS BRAINDEAD AND FLIPS OUTPUT LINES TO 0 WHEN WE SET + ; THE MODE. WE BOOT WITH THE ROM ENABLED BUT THE RESET WILL ENABLE + ; LOW RAM. SOME MENTAL BACKFLIPS REQUIRED TO MAKE THIS WORK + LD HL,BOOTFLIP + LD DE,$8000 + LD BC,$10 + LDIR + JP $8000 +; +BOOTFLIP: + ; SET THE MODE. ALSO CLEARS ALL THE OUTPUT BITS SO WE BLIP THE + ; I2C, KEYBOARD ETC BUT NOBODY WILL CARE. HOWEVER WE ALSO FLIP + ; TO ALL RAM MODE HENCE THIS IS EXECUTED HIGH + ; A OUT B IN C HIGH IN C LOW IN + LD A,$8B + OUT ($43),A + LD A,$FF + OUT ($40),A + JP ROMRESUME +; +ROMRESUME: + ; THIS WILL GLITCH EXTRAM ON SO WE MUST NOW BE IN ROM + LD A,$8A ; C LOW NOW OUTPUT + OUT ($43),A + LD A,$FF + OUT ($42),A ; EXTRAM OFF, RAM BACK IN, SPI 7 + ; AND DONE. MODE REMAINS THIS WAY FOREVER +; +#ENDIF +; +; INITIALIZE MEMORY MANAGERS AS NEEDED TO ADDRESS BOOT ROM IN LOW 32K +; AND COMMON RAM IN HIGH 32K. +; #IF ((MEMMGR == MM_SBC) | (MEMMGR == MM_MBC)) ; SET PAGING REGISTERS #IFDEF ROMBOOT @@ -1421,63 +1656,13 @@ Z280_INITZ: ; AT THIS POINT, RAM SHOULD BE AVAILABLE IN THE COMMON BANK ; (TOP 32K). ; -; NOTIFICATION THAT WE HAVE MADE THE JUMP TO RAM BANK! -; THE DIAG() MACRO IS NOT USED BECAUSE IT USES THE STACK AND WE DO -; NOT WANT TO EFFECT RAM UNTIL AFTER THE BACKUP BATTERY STATUS CHECK -; IS PERFORMED NEXT. +; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE +; VALUES TEMPORARILY BECAUSE WE MAY BE OPERATING IN ROM AT THIS POINT. +; (HBX_LOC - 1) = BATCOND, (HBX_LOC - 2) = APPBANK +; THERE IS NOTHING ON THE STACK AT THIS POINT SO, HERE, WE JUST RESET +; THE STACK TO HBX_LOC - 2. ; -#IF (FPLED_ENABLE) - ; NO STACK YET, SO CAN'T USE DIAG() MACRO - LD A,DIAG_02 - #IF (FPLED_INV) - XOR $FF ; INVERT BITS IF NEEDED - #ENDIF - OUT (FPLED_IO),A -#ENDIF - -; -; Z180 MINI-ITX MADNESS TO INITIALIZE THE PPIO. WE HAVE THE MAIN RAM AT -; $8000 AND ROM AT $0 AT THIS POINT AND THE Z180 MMU SET UP. NOW -; GET THE 82C55 PROGRAMMED. -; -#IF (PLATFORM == PLT_EPITX) - ; THE 82C55 IS BRAINDEAD AND FLIPS OUTPUT LINES TO 0 WHEN WE SET - ; THE MODE. WE BOOT WITH THE ROM ENABLED BUT THE RESET WILL ENABLE - ; LOW RAM. SOME MENTAL BACKFLIPS REQUIRED TO MAKE THIS WORK - LD HL,BOOTFLIP - LD DE,$8000 - LD BC,$10 - LDIR - JP $8000 -; -BOOTFLIP: - ; SET THE MODE. ALSO CLEARS ALL THE OUTPUT BITS SO WE BLIP THE - ; I2C, KEYBOARD ETC BUT NOBODY WILL CARE. HOWEVER WE ALSO FLIP - ; TO ALL RAM MODE HENCE THIS IS EXECUTED HIGH - ; A OUT B IN C HIGH IN C LOW IN - LD A,$8B - OUT ($43),A - LD A,$FF - OUT ($40),A - JP ROMRESUME -; -ROMRESUME: - ; THIS WILL GLITCH EXTRAM ON SO WE MUST NOW BE IN ROM - LD A,$8A ; C LOW NOW OUTPUT - OUT ($43),A - LD A,$FF - OUT ($42),A ; EXTRAM OFF, RAM BACK IN, SPI 7 - ; AND DONE. MODE REMAINS THIS WAY FOREVER -; -#ENDIF -; -; WE USE THE TWO BYTES IMMEDIATELY BELOW THE PROXY TO STORE A COUPLE -; VALUES TEMPORARILY BECAUSE WE MAY BE OPERATING IN ROM AT THIS POINT. -; (HBX_LOC - 1) = BATCOND, (HBX_LOC - 2) = APPBANK -; THERE IS NOTHING ON THE STACK AT THIS POINT SO, HERE, WE JUST RESET -; THE STACK TO HBX_LOC - 2. -; - LD SP,HBX_LOC - 2 + LD SP,HBX_LOC - 2 ; ; CHECK BATTERY BACKUP STATUS BEFORE WE TOUCH RAM (UPPER MEMORY) ; @@ -1498,17 +1683,15 @@ ROMRESUME: LD (HL),A ; ; INSTALL PROXY IN UPPER MEMORY -; THE HB_CURBNK MUST BE PRESERVED IF THIS IS AN APPBOOT. ; - LD A,(HB_CURBNK) ; SAVE EXISTING HB_CURBNK LD DE,HBX_LOC ; AS PER ABOVE LD HL,HBX_IMG LD BC,HBX_SIZ LDIR ; -#IFDEF APPBOOT - LD (HB_CURBNK),A ; RESTORE HB_CURBNK -#ENDIF +; NOTIFICATION THAT WE HAVE COMPLETED HARDWARE INIT. +; + FPLEDS(DIAG_02) ; ; S100 ROM CONTAINS A HARDWARE LEVEL MONITOR IN BANK ID 3 OF ROM. ; IF PORT $75 BIT 1 IS SET (SET IS ZERO), THEN WE IMMEDIATELY @@ -1540,21 +1723,6 @@ S100MON_SKIP: OUT0 (Z180_RLDR1L),A #ENDIF ; -; SAVE CURRENT BANKID -; -; THIS IS NOT GOING TO WORK IF THE APP BOOT IMAGE IS LOADED -; USING THE UNA FAT32 LOADER. SHOULD PROBABLY CHECK THAT THERE -; IS A VALID ROMWBW PROXY IN MEMORY BEFORE DOING THIS. HOWEVER, -; THIS USE CASE IS PROBABLY NON-EXISTENT. THE IMG BOOT IMAGE -; SHOULD WORK FINE WITH THE UNA FAT32 LOADER. -; -; THIS VALUE IS TEMPORARILY STORED AT HBX_LOC - 2 -; BECAUSE WE ARE CURRENTLY RUNNING IN ROM. AFTER WE TRANSITION HBIOS -; TO RAM, THE VALUE IS MOVED TO IT'S REAL LOCATION AT HB_APPBNK. -; - LD A,(HB_CURBNK) ; GET HB_CURBNK - LD (HBX_LOC - 2),A ; ... AND SAVE TEMP FOR APPBNK -; ; WE CAN NOW DO THE REAL INITIALIZATION OF THE RTC LATCH BASED ON ; (RTCDEFVAL). AT THIS POINT WE SHOULD HAVE ACCESS TO THE ROM LOCATION ; WHERE RTCDEFVAL IS STORED AND THE PROXY IS INSTALLED IN UPPER RAM @@ -1563,8 +1731,9 @@ S100MON_SKIP: ; CREATED. ; LD A,(RTCDEFVAL) - OUT (RTCIO),A ; SET IT LD (HB_RTCVAL),A + OUT (RTCIO),A ; SET IT + DIAG(1) ; REAPPLY CURRENT DIAG LED SETUP ; #IFDEF TESTING ; @@ -1734,6 +1903,8 @@ MBC_SINGLE: ; BANK AND SKIP THE COPY IF SO (DON'T COPY OVER OURSELVES). ; THIS SITUATION OCCURS ON A ROMLESS STARTUP OR WHEN DOING A ; FULL RESTART OF A SYSTEM USING THE EXISTING HBIOS COPY. + ; NOTE THAT THIS TEST WORKS BECAUSE BID_BIOS == BID_BOOT + ; IN THESE SCENARIOS. CP BID_BIOS JR Z,HB_START1 ; @@ -1774,20 +1945,15 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK LD SP,HBX_LOC - 2 ; RESET STACK ; ; NOTIFY THAT WE MADE THE TRANSITION! - DIAG(DIAG_03) - LED(%00000010) + FPLEDS(DIAG_03) + DIAG(2) ; ; RECOVER DATA PASSED PRIOR TO RAM TRANSITION - ; (HBX_LOC - 1) = BATCOND, (HBX_LOC - 2) = APPBNK + ; (HBX_LOC - 1) = BATCOND POP HL ; POP 2 BYTES LD A,H ; GET FIRST BYTE PUSHED LD (HB_BATCOND),A ; ... AND SAVE AS BAT COND ; -#IFDEF APPBOOT - LD A,L ; GET SECOND BYTE PUSHED - LD (HB_APPBNK),A ; ... AND SAVE AS APPBNK -#ENDIF -; #IF (MEMMGR == MM_Z280) ; NOW POINT TO RAM COPY OF Z280 INT/TRAP TABLE ; HL IS TOP 16 BITS OF PHYSICAL ADDRESS OF IVT @@ -1900,7 +2066,7 @@ SAVE_REC_M: #ENDIF #ENDIF ; - DIAG(DIAG_04) + FPLEDS(DIAG_04) ; #IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL CALL MIO_INIT ; WE GET TO BOOT MESSAGE @@ -2034,7 +2200,7 @@ HB_CPU1: ; #ENDIF ; - DIAG(DIAG_05) + FPLEDS(DIAG_05) ; ; INIT OSCILLATOR SPEED FROM CONFIG ; @@ -2367,7 +2533,7 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT LD A,$FF ; FILL WITH $FF CALL FILL ; DO IT ; - DIAG(DIAG_06) + FPLEDS(DIAG_06) ; #IF FALSE ; @@ -2407,8 +2573,8 @@ NOT_REC_M0: ; #ENDIF ; - DIAG(DIAG_07) - LED(%00000111) + FPLEDS(DIAG_07) + DIAG(3) ; ; ; @@ -2499,7 +2665,6 @@ NXTMIO: LD A,(HL) ; ; ANNOUNCE HBIOS ; - CALL NEWLINE2 PRTX(STR_BANNER) ; ; DISPLAY HBIOS MUTEX ENABLED MESSAGE @@ -2522,7 +2687,7 @@ NXTMIO: LD A,(HL) #ENDIF NOT_REC_M2: ; - DIAG(DIAG_08) + FPLEDS(DIAG_08) ; ; IO PORT SCAN ; @@ -3053,7 +3218,6 @@ INITSYS3: LD A,(HB_NEWCON) ; GET NEW CONSOLE UNIT NUM CALL PRTDECB ; PRINT UNIT NUM LD (CB_CONDEV),A ; IMPLEMENT NEW CONSOLE! - CALL NEWLINE2 ; FORMATTING LD DE,STR_BANNER ; POINT TO BANNER CALL NZ,WRITESTR ; OUTPUT IF CONSOLE MOVED ; @@ -3190,29 +3354,15 @@ INITSYS4: CALL SND_BEEP #ENDIF ; -#IFNDEF ROMBOOT -; - ; COPY OS IMAGE: BID_USR: --> BID_USR:0 - LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY - LD D,BID_USR ; D = DEST BANK = USER BANK - ;LD E,BID_USR ; E = SRC BANK = USER BANK - LD A,(HB_APPBNK) ; GET APP LOAD BANK - LD E,A ; USE AS SOURCE - LD HL,$8000 ; HL = COPY LEN = ENTIRE BANK - RST 08 ; DO IT - LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY - LD HL,HB_END ; COPY FROM END OF HBIOS - LD DE,0 ; TO USER ADDRESS 0 - RST 08 ; DO IT -; -#ENDIF + DIAG(0) ; CLEAR BOOT DIAG LED(S) + FPLEDS(DIAG_00) ; CLEAR FP LEDS ; ; CHAIN TO LOADER ; #IFDEF ROMBOOT LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK #ELSE - LD A,BID_USR ; CHAIN TO USER BANK + LD A,BID_AUX ; CHAIN TO AUX BANK #ENDIF LD IX,0 ; ENTER AT ADDRESS 0 CALL HBX_BNKCALL ; GO THERE @@ -3467,27 +3617,7 @@ HB_INITTBL: ; HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ; -;================================================================================================== -; IDLE -;================================================================================================== -; -;__________________________________________________________________________________________________ -; -IDLE: - PUSH AF - PUSH BC - PUSH DE - PUSH HL - PUSH IY -#IF (FDENABLE) - CALL FD_IDLE -#ENDIF - POP IY - POP HL - POP DE - POP BC - POP AF - RET +HB_SYSINIT_END .EQU $ ; ;================================================================================================== ; BIOS FUNCTION DISPATCHER @@ -3497,6 +3627,8 @@ IDLE: ; B: FUNCTION ;__________________________________________________________________________________________________ ; +HB_DISP_BEG .EQU $ +; HB_DISPATCH: ; #IF (MEMMGR == MM_Z280) @@ -3876,19 +4008,19 @@ HB_DSKFN: PUSH BC ; SAVE COUNTERS #IF (FPLED_ENABLE & FPLED_DSKACT) LD A,(HB_DSKBIT) ; LOAD UNIT DISK BIT MASK - CALL FP_SETLEDS ; DISPLAY ON DIAG LEDS + CALL FP_SETLEDS ; DISPLAY ON FP LEDS #ENDIF #IF (LEDENABLE & LEDDISKIO) - LED(%00000101) ; BIT 0 FOR TINY Z80 & MBC, BIT 2 FOR SCXXX + DIAG(1) ; BIT 0 FOR TINY Z80 & MBC, BIT 2 FOR SCXXX #ENDIF LD E,1 ; ONE SECTOR HB_DSKFNADR .EQU $+1 CALL PANIC ; READ ONE SECTOR #IF (FPLED_ENABLE & FPLED_DSKACT) - DIAG($00) ; CLEAR DIAG LEDS + FPLEDS($00) ; CLEAR FP LEDS #ENDIF #IF (LEDENABLE & LEDDISKIO) - LED($00) + DIAG(0) #ENDIF POP BC ; RESTORE COUNTERS RET ; RETURN @@ -4222,6 +4354,14 @@ SYS_DISPATCH: JP Z,SYS_INT ; $FC DEC A ; +HB_DISP_END .EQU $ +; +;================================================================================================== +; SYSTEM API FUNCTIONS +;================================================================================================== +; +HB_SYSAPI_BEG .EQU $ +; ; RESTART SYSTEM ; SUBFUNCTION IN C ; @@ -4245,10 +4385,6 @@ SYS_RESINT: ; RESET THE HEAP LD HL,(HEAPCURB) ; GET HBIOS HEAP THRESHOLD LD (CB_HEAPTOP),HL ; RESTORE HEAP TOP -;; -; ; MAKE SURE THE PROPER RESET VECTOR IS AT ADDRESS $0000 -; LD HL,$0040 ; USER RESET CODE STUB -; LD ($0001),HL ; OPERAND OF JP AT $0000 ; XOR A RET @@ -4257,14 +4393,18 @@ SYS_RESINT: ; SYS_RESWARM: ; - CALL SYS_RESINT + CALL SYS_RESINT ; HBIOS INTERNAL RESET ; #IF (MEMMGR == MM_Z280) JP INITSYS4 #ELSE ; PERFORM BANK CALL TO OS IMAGES BANK IN ROM LD SP,HBX_LOC ; STACK JUST BELOW HBIOS PROXY - LD A,BID_IMG0 ; CHAIN TO OS IMAGES BANK + #IFDEF APPBOOT + LD A,BID_AUX ; IF APPBOOT, CHAIN TO AUX BANK + #ELSE + LD A,BID_IMG0 ; ELSE CHAIN TO OS IMAGES BANK + #ENDIF LD IX,0 ; ENTER AT ADDRESS 0 CALL HBX_BNKCALL ; GO THERE HALT ; WE SHOULD NEVER COME BACK! @@ -4275,7 +4415,20 @@ SYS_RESWARM: SYS_RESCOLD: ; #IF (MEMMGR == MM_Z280) - JP Z280_RESTART + ; FOR Z280, NEED TO REMAP THE LOW 32K IN SYSTEM MODE AND + ; CONTINUE AT ADDRESS ZERO. WE CANNOT RETURN HERE AFTER THE + ; BNKSEL IS DONE BECAUSE THE SYSTEM BANK HAS BEEN CHANGED! + ; SO, WE PRESET THE STACK TO CAUSE A JUMP TO ADDRESS ZERO + ; ON RETURN FROM THE BNKSEL. SLICK, RIGHT? + DI ; KILL INTERRUPTS + LD SP,HBX_LOC ; STACK IN HIGH MEMORY + LD HL,0 ; VALUE TO RESUME + PUSH HL ; ... IS PRESET ON STACK +; + ; MAKE ROM BOOT BANK ACTIVE IN LOW SYS MEM + LD A,BID_BOOT ; BOOT BANK + LD B,$10 ; FIRST SYS PDR + JP Z280_BNKSEL ; DO IT AND RESUME FROM STACK #ELSE DI LD SP,HBX_LOC ; STACK JUST BELOW HBIOS PROXY @@ -5302,20 +5455,24 @@ SYS_INTSET1: XOR A ; SIGNAL SUCCESS RET ; DONE ; +HB_SYSAPI_END .EQU $ +; ;================================================================================================== ; Z280 INTERRUPT VECTOR TABLE ;================================================================================================== ; -#IF (MEMMGR == MM_Z280) +HB_Z280IVT_BEG .EQU $ +; +; THE Z280 IVT MUST BE ON A 4K BOUNDARY. IT HAS BEEN LOCATED +; HERE IN AN EFFORT TO MINIMIZE WASTED SPACE. THERE SHOULD BE +; A LITTLE LESS THAN 4K OF CODE ABOVE. ; - ; THE Z280 IVT MUST BE ON A 4K BOUNDARY. IT HAS BEEN LOCATED - ; HERE IN AN EFFORT TO MINIMIZE WASTED SPACE. THERE SHOULD BE - ; A LITTLE LESS THAN 4K OF CODE ABOVE. +#IF (MEMMGR == MM_Z280) ; Z280_IVT_SLACK_ORG .EQU $ ALIGN($1000) Z280_IVT_SLACK .EQU $ - Z280_IVT_SLACK_ORG - .ECHO "Z280 IVT SLACK occupies " + .ECHO "Z280 IVT SLACK = " .ECHO Z280_IVT_SLACK .ECHO " bytes.\n" ; @@ -5395,10 +5552,33 @@ Z280_IVT: ; #ENDIF ; +HB_Z280IVT_END .EQU $ +; ;================================================================================================== ; GLOBAL HBIOS FUNCTIONS ;================================================================================================== ; +HB_INTFUNC_BEG .EQU $ +; +; GLOBAL HBIOS IDLE PROCESSING IS DONE HERE. THIS ROUTINE SHOULD +; BE CALLED WHENEVER WAITING FOR USER INPUT. +; +IDLE: + PUSH AF + PUSH BC + PUSH DE + PUSH HL + PUSH IY +#IF (FDENABLE) + CALL FD_IDLE +#ENDIF + POP IY + POP HL + POP DE + POP BC + POP AF + RET +; ; COMMON ROUTINE THAT IS CALLED BY CHARACTER IO DRIVERS WHEN ; AN IDLE CONDITION IS DETECTED (WAIT FOR INPUT/OUTPUT) ; @@ -5968,89 +6148,6 @@ HB_ALLOC1: HB_TMPSZ .DW 0 HB_TMPREF .DW 0 ; -; Z280 BANK SELECTION (CALLED FROM PROXY) -; -#IF (MEMMGR == MM_Z280) -; -; REG A HAS BANK ID, REG B HAS INITIAL PDR TO PROGRAM -; REGISTERS AF, BC, HL DESTROYED -; -; THIS ROUTINE MAY BE RELOCATED TO RUN IN HIGH MEMORY IN CERTAIN CASES -; LIKE A SYSTEM RESTART. IT MUST BE KEPT ENTIRELY RELOCATABLE. -; -Z280_BNKSEL: - ;; *DEBUG* - ;CALL PC_LBKT - ;CALL PRTHEXBYTE - ;CALL PC_RBKT - - ; SELECT I/O PAGE $FE (SAVING PREVIOUS VALUE) - LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - LDCTL HL,(C) ; GET CURRENT I/O PAGE - PUSH HL ; SAVE IT - LD L,$FF ; NEW I/O PAGE - LDCTL (C),HL ; IMPLEMENT -; - ; CONVERT BANK ID TO TOP 12 BITS OF PHYSICAL ADDRESS - ; WITH $0A IN THE LOW ORDER NIBBLE: - ; BANK ID: R000 BBBB - ; PDR: R000 0BBB B000 1010 (RCBUS) - ; PDR: 0000 RBBB B000 1010 (ZZ80MB) -; - MULTU A,$80 ; HL=0R00 0BBB B000 0000 - BIT 6,H ; RAM BIT SET? - JR Z,Z280_BNKSEL2 ; IF NOT, ALL DONE - RES 6,H ; OTHERWISE, REMOVE RAM BIT - LD A,RAMBIAS >> 6 ; RAM OFFSET (TOP 8 BITS) - OR H ; RECOMBINE - LD H,A ; AND PUT BACK IN H -; -Z280_BNKSEL2: -; - ; SET LOW NIBBLE - LD A,$0A ; VALUE FOR LOW NIBBLE - ADD HL,A ; ADD HL,A ; HL=0000 RBBB B000 1010 -; - ; POINT TO FIRST PDR TO PROGRAM - LD A,B ; INITIAL PDR TO PROG - OUT (Z280_MMUPDRPTR),A ; SET THE PDR POINTER -; - ; PROGRAM 8 PDRS - LD C,Z280_MMUBLKMOV ; PDR BLOCK MOVE PORT - ;LD B,8 ; PROGRAM 8 PDRS - LD A,$10 ; PDR VALUE INCREMENT -Z280_BNKSEL3: - ; PROGRAM 8 PDR VALUES - ; LOOP UNROLLED FOR SPEED - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - OUTW (C),HL ; WRITE VALUE - ADD HL,A ; BUMP VALUE - ;DJNZ Z280_BNKSEL3 ; DO ALL PDRS -; - ; RESTORE I/O PAGE - LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - POP HL ; RECOVER ORIGINAL I/O PAGE - LDCTL (C),HL -; - RET -; -Z280_BNKSEL_LEN .EQU $ - Z280_BNKSEL -; -#ENDIF -; ; Z280 BANK COPY (CALLED FROM PROXY) ; ; USE Z280 PHYSICAL MEMORY DMA COPY TO PERFORM AN INTERBANK COPY. @@ -6280,611 +6377,299 @@ Z2DMAADR2: ; #ENDIF ; -; Z280 SYSCALL VECTOR ENTRY POINT. TAKES STACK PARAMETER AS A BRANCH -; ADDRESS AND CALLS IT. ALLOWS ANY USER MODE CODE TO CALL INTO AN -; ARBITRARY LOCATION OF SYSTEM MODE CODE. -; -#IF (MEMMGR == MM_Z280) -Z280_SYSCALL: - EX (SP),HL - LD (Z280_SYSCALL_GO+1),HL - POP HL -Z280_SYSCALL_GO: - CALL $FFFF ; PARM SET ABOVE - RETIL ; RETURN FROM INT -#ENDIF +HB_INTFUNC_END .EQU $ ; ;================================================================================================== -; DEVICE DRIVERS +; UTILITY FUNCTIONS ;================================================================================================== ; -#IF (DSKYENABLE) - #IF (ICMENABLE) -ORG_ICM .EQU $ - #INCLUDE "icm.asm" -SIZ_ICM .EQU $ - ORG_ICM - .ECHO "ICM occupies " - .ECHO SIZ_ICM - .ECHO " bytes.\n" - #ENDIF +HB_UTIL_BEG .EQU $ ; - #IF (PKDENABLE) -ORG_PKD .EQU $ - #INCLUDE "pkd.asm" -SIZ_PKD .EQU $ - ORG_PKD - .ECHO "PKD occupies " - .ECHO SIZ_PKD - .ECHO " bytes.\n" - #ENDIF +#DEFINE USEDELAY +#INCLUDE "util.asm" +#INCLUDE "time.asm" +#INCLUDE "bcd.asm" +#INCLUDE "decode.asm" +#INCLUDE "encode.asm" ; - #IF (H8PENABLE) -ORG_H8P .EQU $ - #INCLUDE "h8p.asm" -SIZ_H8P .EQU $ - ORG_H8P - .ECHO "H8P occupies " - .ECHO SIZ_H8P - .ECHO " bytes.\n" - #ENDIF +#IF (WBWDEBUG == USEXIO) +#INCLUDE "xio.asm" #ENDIF -; -#IF (PLATFORM == PLT_NABU) -ORG_NABU .EQU $ - #INCLUDE "nabu.asm" -SIZ_NABU .EQU $ - ORG_NABU - .ECHO "NABU occupies " - .ECHO SIZ_NABU - .ECHO " bytes.\n" +#IF (WBWDEBUG == USEMIO) +#INCLUDE "mio.asm" #ENDIF ; -#IF (DSRTCENABLE) -ORG_DSRTC .EQU $ - #INCLUDE "dsrtc.asm" -SIZ_DSRTC .EQU $ - ORG_DSRTC - .ECHO "DSRTC occupies " - .ECHO SIZ_DSRTC - .ECHO " bytes.\n" +; INCLUDE LZSA2 decompression engine if required. +; +#IF ((CVDUENABLE | GDCENABLE | TMSENABLE | VGAENABLE | VRCENABLE) & USELZSA2) +#INCLUDE "unlzsa2s.asm" #ENDIF ; -#IF (DS1501RTCENABLE) -ORG_DS1501RTC .EQU $ - #INCLUDE "ds1501rtc.asm" -SIZ_DS1501RTC .EQU $ - ORG_DS1501RTC - .ECHO "DS1501RTC occupies " - .ECHO SIZ_DS1501RTC - .ECHO " bytes.\n" -#ENDIF -; -#IF (BQRTCENABLE) -ORG_BQRTC .EQU $ - #INCLUDE "bqrtc.asm" -SIZ_BQRTC .EQU $ - ORG_BQRTC - .ECHO "BQRTC occupies " - .ECHO SIZ_BQRTC - .ECHO " bytes.\n" -#ENDIF -; -#IF (SIMRTCENABLE) -ORG_SIMRTC .EQU $ - #INCLUDE "simrtc.asm" -SIZ_SIMRTC .EQU $ - ORG_SIMRTC - .ECHO "SIMRTC occupies " - .ECHO SIZ_SIMRTC - .ECHO " bytes.\n" -#ENDIF -; -#IF (PCFENABLE) -ORG_PCF .EQU $ - #INCLUDE "pcf.asm" -SIZ_PCF .EQU $ - ORG_PCF - .ECHO "PCF occupies " - .ECHO SIZ_PCF - .ECHO " bytes.\n" -#ENDIF -; -#IF (DS7RTCENABLE) -ORG_DS7RTC .EQU $ - #INCLUDE "ds7rtc.asm" -SIZ_DS7RTC .EQU $ - ORG_DS7RTC - .ECHO "DS7RTC occupies " - .ECHO SIZ_DS7RTC - .ECHO " bytes.\n" -#ENDIF -; -#IF (INTRTCENABLE) -ORG_INTRTC .EQU $ - #INCLUDE "intrtc.asm" -SIZ_INTRTC .EQU $ - ORG_INTRTC - .ECHO "INTRTC occupies " - .ECHO SIZ_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" -SIZ_ASCI .EQU $ - ORG_ASCI - .ECHO "ASCI occupies " - .ECHO SIZ_ASCI - .ECHO " bytes.\n" -#ENDIF -; -#IF (Z2UENABLE) -ORG_Z2U .EQU $ - #INCLUDE "z2u.asm" -SIZ_Z2U .EQU $ - ORG_Z2U - .ECHO "Z2U occupies " - .ECHO SIZ_Z2U - .ECHO " bytes.\n" -#ENDIF -; -#IF (UARTENABLE) -ORG_UART .EQU $ - #INCLUDE "uart.asm" -SIZ_UART .EQU $ - ORG_UART - .ECHO "UART occupies " - .ECHO SIZ_UART - .ECHO " bytes.\n" -#ENDIF -; -#IF (DUARTENABLE) -ORG_DUART .EQU $ - #INCLUDE "duart.asm" -SIZ_DUART .EQU $ - ORG_DUART - .ECHO "DUART occupies " - .ECHO SIZ_DUART - .ECHO " bytes.\n" -#ENDIF +;================================================================================================== +; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) +;================================================================================================== ; -#IF (SIOENABLE) -ORG_SIO .EQU $ - #INCLUDE "sio.asm" -SIZ_SIO .EQU $ - ORG_SIO - .ECHO "SIO occupies " - .ECHO SIZ_SIO - .ECHO " bytes.\n" -#ENDIF +; OUTPUT CHARACTER FROM A ; -#IF (ACIAENABLE) -ORG_ACIA .EQU $ - #INCLUDE "acia.asm" -SIZ_ACIA .EQU $ - ORG_ACIA - .ECHO "ACIA occupies " - .ECHO SIZ_ACIA - .ECHO " bytes.\n" -#ENDIF +COUT: + ; SAVE ALL INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL ; -#IF (PIOENABLE) -ORG_PIO .EQU $ - #INCLUDE "pio.asm" -SIZ_PIO .EQU $ - ORG_PIO - .ECHO "PIO occupies " - .ECHO SIZ_PIO - .ECHO " bytes.\n" -#ENDIF + ; GET CURRENT CONSOLE UNIT + LD E,A ; TEMPORARILY STASH OUTPUT CHAR IN E + LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE + CP $FF ; TEST FOR $FF (HBIOS NOT READY) + JR Z,COUT1 ; IF NOT READY, TRY DEBUG OUTPUT ; -#IF (LPTENABLE) -ORG_LPT .EQU $ - #INCLUDE "lpt.asm" -SIZ_LPT .EQU $ - ORG_LPT - .ECHO "LPT occupies " - .ECHO SIZ_LPT - .ECHO " bytes.\n" -#ENDIF + ; USE HBIOS + LD C,A ; CONSOLE UNIT TO C + LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR + CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY + JR COUT2 ; CONTINUE ; -#IF (PIO_4P | PIO_ZP | PIO_SBC) -ORG_PIO .EQU $ - #INCLUDE "pio.asm" -SIZ_PIO .EQU $ - ORG_PIO - .ECHO "PIO occupies " - .ECHO SIZ_PIO - .ECHO " bytes.\n" -#ENDIF +COUT1: ; -#IF (UFENABLE) -ORG_UF .EQU $ - #INCLUDE "uf.asm" -SIZ_UF .EQU $ - ORG_UF - .ECHO "UF occupies " - .ECHO SIZ_UF - .ECHO " bytes.\n" +#IF (WBWDEBUG == USEXIO) + LD A,E ; GET OUTPUT CHAR BACK TO ACCUM + CALL XIO_OUTC ; OUTPUT VIA XIO #ENDIF ; -#IF (VGAENABLE) -ORG_VGA .EQU $ - #INCLUDE "vga.asm" -SIZ_VGA .EQU $ - ORG_VGA - .ECHO "VGA occupies " - .ECHO SIZ_VGA - .ECHO " bytes.\n" +#IF (WBWDEBUG == USEMIO) + LD A,E + CALL MIO_OUTC ; OUTPUT VIA MIO #ENDIF ; -#IF (CVDUENABLE) -ORG_CVDU .EQU $ - #INCLUDE "cvdu.asm" -SIZ_CVDU .EQU $ - ORG_CVDU - .ECHO "CVDU occupies " - .ECHO SIZ_CVDU - .ECHO " bytes.\n" -#ENDIF +COUT2: + ; RESTORE ALL REGISTERS + POP HL + POP DE + POP BC + POP AF + RET ; -#IF (VDUENABLE) -ORG_VDU .EQU $ - #INCLUDE "vdu.asm" -SIZ_VDU .EQU $ - ORG_VDU - .ECHO "VDU occupies " - .ECHO SIZ_VDU - .ECHO " bytes.\n" -#ENDIF +; INPUT CHARACTER TO A ; -#IF (TMSENABLE) -ORG_TMS .EQU $ - #INCLUDE "tms.asm" -SIZ_TMS .EQU $ - ORG_TMS - .ECHO "TMS occupies " - .ECHO SIZ_TMS - .ECHO " bytes.\n" -#ENDIF +CIN: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL ; -#IF (EFENABLE) -ORG_EF .EQU $ - #INCLUDE "ef.asm" -SIZ_EF .EQU $ - ORG_EF - .ECHO "EF occupies " - .ECHO SIZ_EF - .ECHO " bytes.\n" -#ENDIF + LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE + CP $FF ; TEST FOR $FF (HBIOS NOT READY) + JR Z,CIN1 ; IF NOT READY, TRY DEBUG INPUT ; -#IF (GDCENABLE) -ORG_GDC .EQU $ - #INCLUDE "gdc.asm" -SIZ_GDC .EQU $ - ORG_GDC - .ECHO "GDC occupies " - .ECHO SIZ_GDC - .ECHO " bytes.\n" -#ENDIF + ; USE HBIOS + LD C,A ; CONSOLE UNIT TO C + LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR + CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY + LD A,E ; RESULTANT CHAR TO A + JR CIN2 ; CONTINUE ; -#IF (VRCENABLE) -ORG_VRC .EQU $ - #INCLUDE "vrc.asm" -SIZ_VRC .EQU $ - ORG_VRC - .ECHO "VRC occupies " - .ECHO SIZ_VRC - .ECHO " bytes.\n" -#ENDIF +CIN1: ; -#IF (DMAENABLE) -ORG_DMA .EQU $ -#INCLUDE "dma.asm" -SIZ_DMA .EQU $ - ORG_DMA - .ECHO "DMA occupies " - .ECHO SIZ_DMA - .ECHO " bytes.\n" +#IF (WBWDEBUG == USEXIO) + CALL XIO_INC ; GET CHAR #ENDIF ; -; FONTS AREA -; -ORG_FONTS .EQU $ -; - .ECHO "FONTS" -; -#IFDEF USEFONT8X8 -FONT8X8: -; -; FOR NOW, WE NEVER COMPRESS THE 8X8 FONT. SEE TMS DRIVER. -; - #IF USELZSA2 & FALSE - #INCLUDE "font8x8c.asm" - #ELSE - #INCLUDE "font8x8u.asm" - #ENDIF - .ECHO " 8X8" +#IF (WBWDEBUG == USEMIO) + CALL MIO_INC ; GET CHAR #ENDIF ; -#IFDEF USEFONT8X11 -FONT8X11: - #IF USELZSA2 - #INCLUDE "font8x11c.asm" - #ELSE - #INCLUDE "font8x11u.asm" - #ENDIF - .ECHO " 8X11" -#ENDIF +CIN2: ; -#IFDEF USEFONT8X16 -FONT8X16: - #IF USELZSA2 - #INCLUDE "font8x16c.asm" - #ELSE - #INCLUDE "font8x16u.asm" - #ENDIF - .ECHO " 8X16" -#ENDIF + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET ; -#IFDEF USEFONTCGA -FONTCGA: - #IF USELZSA2 - #INCLUDE "fontcgac.asm" - #ELSE - #INCLUDE "fontcgau.asm" - #ENDIF - .ECHO " CGA" -#ENDIF +; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) ; -#IFDEF USEFONTVGARC -FONTVGARC: - #IF USELZSA2 - #INCLUDE "fontvgarcc.asm" - #ELSE - #INCLUDE "fontvgarcu.asm" - #ENDIF - .ECHO " VGARC" -#ENDIF +CST: + ; SAVE INCOMING REGISTERS (AF IS OUTPUT) + PUSH BC + PUSH DE + PUSH HL ; -SIZ_FONTS .EQU $ - ORG_FONTS - .ECHO " occupy " - .ECHO SIZ_FONTS - .ECHO " bytes.\n" + LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE + CP $FF ; TEST FOR $FF (HBIOS NOT READY) + JR Z,CST1 ; IIF NOT READY, TRY DEBUG DEBUG STATUS ; -#IF (KBDENABLE) -ORG_KBD .EQU $ - #INCLUDE "kbd.asm" -SIZ_KBD .EQU $ - ORG_KBD - .ECHO "KBD occupies " - .ECHO SIZ_KBD - .ECHO " bytes.\n" -#ENDIF + ; USE HBIOS + LD C,A ; CONSOLE UNIT TO C + LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS + CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY + JR CST2 ; CONTINUE ; -#IF (PPKENABLE) -ORG_PPK .EQU $ - #INCLUDE "ppk.asm" -SIZ_PPK .EQU $ - ORG_PPK - .ECHO "PPK occupies " - .ECHO SIZ_PPK - .ECHO " bytes.\n" -#ENDIF +CST1: ; -#IF (MKYENABLE) -ORG_MKY .EQU $ - #INCLUDE "mky.asm" -SIZ_MKY .EQU $ - ORG_MKY - .ECHO "MKY occupies " - .ECHO SIZ_MKY - .ECHO " bytes.\n" +#IF (WBWDEBUG == USEXIO) + CALL XIO_IST ; GET STATUS #ENDIF ; -#IF (NABUKBENABLE) -ORG_NABUKB .EQU $ - #INCLUDE "nabukb.asm" -SIZ_NABUKB .EQU $ - ORG_NABUKB - .ECHO "NABUKB occupies " - .ECHO SIZ_NABUKB - .ECHO " bytes.\n" +#IF (WBWDEBUG == USEMIO) + CALL MIO_IST ; GET STATUS #ENDIF ; -#IF (PRPENABLE) -ORG_PRP .EQU $ - #INCLUDE "prp.asm" -SIZ_PRP .EQU $ - ORG_PRP - .ECHO "PRP occupies " - .ECHO SIZ_PRP - .ECHO " bytes.\n" -#ENDIF +CST2: + ; RESTORE REGISTERS (AF IS OUTPUT) + POP HL + POP DE + POP BC + RET ; -#IF (PPPENABLE) -ORG_PPP .EQU $ - #INCLUDE "ppp.asm" -SIZ_PPP .EQU $ - ORG_PPP - .ECHO "PPP occupies " - .ECHO SIZ_PPP - .ECHO " bytes.\n" -#ENDIF +;================================================================================================== +; INTERNAL UTILITY FUNCTIONS +;================================================================================================== ; -#IF (SCONENABLE) -ORG_SCON .EQU $ - #INCLUDE "scon.asm" -SIZ_SCON .EQU $ - ORG_SCON - .ECHO "SCON occupies " - .ECHO SIZ_SCON - .ECHO " bytes.\n" -#ENDIF +; SET HL TO IY+A, A IS TRASHED ; -#IF (CHENABLE) -ORG_CH .EQU $ - #INCLUDE "ch.asm" -SIZ_CH .EQU $ - ORG_CH - .ECHO "CH occupies " - .ECHO SIZ_CH - .ECHO " bytes.\n" -#ENDIF +LDHLIYA: + PUSH IY ; COPY INSTANCE DATA PTR + POP HL ; ... TO HL + ;JP ADDHLA ; APPLY OFFSET TO HL AND RETURN + ADD A,L ; ADD OFFSET TO LSB + LD L,A ; ... PUT BACK IN L + RET NC ; DONE IF CF NOT SET + INC H ; IF CF SET, BUMP MSB + RET ; ... AND RETURN ; -#IF (ESPENABLE) -ORG_ESP .EQU $ - #INCLUDE "esp.asm" -SIZ_ESP .EQU $ - ORG_ESP - .ECHO "ESP occupies " - .ECHO SIZ_ESP - .ECHO " bytes.\n" -#ENDIF +; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO +; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED +; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. ; -#IF (MDENABLE) -ORG_MD .EQU $ - #INCLUDE "md.asm" -SIZ_MD .EQU $ - ORG_MD - .ECHO "MD occupies " - .ECHO SIZ_MD - .ECHO " bytes.\n" -#ENDIF +; INPUT: HL=TRACK, D=HEAD, E=SECTOR +; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) ; -#IF (FDENABLE) -ORG_FD .EQU $ - #INCLUDE "fd.asm" -SIZ_FD .EQU $ - ORG_FD - .ECHO "FD occupies " - .ECHO SIZ_FD - .ECHO " bytes.\n" -#ENDIF +HB_CHS2LBA: ; -#IF (RFENABLE) -ORG_RF .EQU $ - #INCLUDE "rf.asm" -SIZ_RF .EQU $ - ORG_RF - .ECHO "RF occupies " - .ECHO SIZ_RF - .ECHO " bytes.\n" -#ENDIF + LD A,D ; HEAD TO A + RLCA ; LEFT SHIFT TO HIGH NIBBLE + RLCA ; ... DEPENDS ON HIGH + RLCA ; ... NIBBLE BEING 0 SINCE + RLCA ; ... IT ROTATES INTO LOW NIBBLE + OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) + LD D,0 + LD E,H + LD H,L + LD L,A + XOR A + RET ; -#IF (IDEENABLE) -ORG_IDE .EQU $ - #INCLUDE "ide.asm" -SIZ_IDE .EQU $ - ORG_IDE - .ECHO "IDE occupies " - .ECHO SIZ_IDE - .ECHO " bytes.\n" -#ENDIF +; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? ; -#IF (PPIDEENABLE) -ORG_PPIDE .EQU $ - #INCLUDE "ppide.asm" -SIZ_PPIDE .EQU $ - ORG_PPIDE - .ECHO "PPIDE occupies " - .ECHO SIZ_PPIDE - .ECHO " bytes.\n" -#ENDIF +SYSCHKA: + ; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY + PUSH AF ; PRESERVE INCOMING AF VALUE + LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL + CP DL_ERROR ; >= ERROR LEVEL + JR C,SYSCHK1 ; IF NOT, GO HOME + POP AF ; RESTORE INCOMING AF VALUE ; -#IF (SDENABLE) -ORG_SD .EQU $ - #INCLUDE "sd.asm" -SIZ_SD .EQU $ - ORG_SD - .ECHO "SD occupies " - .ECHO SIZ_SD - .ECHO " bytes.\n" -#ENDIF + ; DISPLAY SYSCHK MESSAGE + PUSH DE ; PRESERVE DE VALUE + LD DE,STR_SYSCHK ; POINT TO PREFIX STRING + CALL WRITESTR ; PRINT IT + POP DE ; RESTORE DE VALUE + CALL XREGDMP ; DUMP REGISTERS + + ; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX + EX (SP),HL ; GET RETURN ADDRESS + INC HL ; POINT TO THE ERROR CODE + PUSH AF + LD A,(HL) ; DISPLAY + CALL PRTHEXBYTE + POP AF + DEC HL ; RESTORE RETURN ADDRESS + EX (SP),HL ; -#IF (HDSKENABLE) -ORG_HDSK .EQU $ - #INCLUDE "hdsk.asm" -SIZ_HDSK .EQU $ - ORG_HDSK - .ECHO "HDSK occupies " - .ECHO SIZ_HDSK - .ECHO " bytes.\n" -#ENDIF + JR CONTINUE ; CHECK W/ USER ; -#IF (PPAENABLE) -ORG_PPA .EQU $ - #INCLUDE "ppa.asm" -SIZ_PPA .EQU $ - ORG_PPA - .ECHO "PPA occupies " - .ECHO SIZ_PPA - .ECHO " bytes.\n" -#ENDIF +SYSCHK1: + ; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL + POP AF + RET ; -#IF (IMMENABLE) -ORG_IMM .EQU $ - #INCLUDE "imm.asm" -SIZ_IMM .EQU $ - ORG_IMM - .ECHO "IMM occupies " - .ECHO SIZ_IMM - .ECHO " bytes.\n" -#ENDIF +; PANIC: DUMP MACHINE STATE AND HALT ; -#IF (SYQENABLE) -ORG_SYQ .EQU $ - #INCLUDE "syq.asm" -SIZ_SYQ .EQU $ - ORG_SYQ - .ECHO "SYQ occupies " - .ECHO SIZ_SYQ - .ECHO " bytes.\n" -#ENDIF +PANIC: + PUSH DE + LD DE,STR_PANIC + CALL WRITESTR + POP DE + CALL XREGDMP ; DUMP REGISTERS + JR SYSHALT ; FULL STOP ; -; TERM IS ALWAYS INCLUDED -ORG_TERM .EQU $ - #INCLUDE "term.asm" -SIZ_TERM .EQU $ - ORG_TERM - .ECHO "TERM occupies " - .ECHO SIZ_TERM - .ECHO " bytes.\n" ; -;#IF (SPKENABLE & DSRTCENABLE) -#IF (SPKENABLE) -ORG_SPK .EQU $ - #INCLUDE "spk.asm" -SIZ_SPK .EQU $ - ORG_SPK - .ECHO "SPK occupies " - .ECHO SIZ_SPK - .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" -SIZ_CTC .EQU $ - ORG_CTC - .ECHO "CTC occupies " - .ECHO SIZ_CTC - .ECHO " bytes.\n" -#ENDIF -#IF (SN76489ENABLE) -ORG_SN76489 .EQU $ - #INCLUDE "sn76489.asm" -SIZ_SN76489 .EQU $ - ORG_SN76489 - .ECHO "SN76489 occupies " - .ECHO SIZ_SN76489 - .ECHO " bytes.\n" -#ENDIF -#IF (AY38910ENABLE) -ORG_AY38910 .EQU $ - #INCLUDE "ay38910.asm" -SIZ_AY38910 .EQU $ - ORG_AY38910 - .ECHO "AY38910 occupies " - .ECHO SIZ_AY38910 - .ECHO " bytes.\n" -#ENDIF -#IF (YM2612ENABLE) -ORG_YM2612 .EQU $ - #INCLUDE "ym2612.asm" -SIZ_YM2612 .EQU $ - ORG_YM2612 - .ECHO "YM2612 occupies " - .ECHO SIZ_YM2612 - .ECHO " bytes.\n" -#ENDIF ; - .ECHO "RTCDEF=" - .ECHO RTCDEF - .ECHO "\n" +CONTINUE: + PUSH AF +CONTINUE1: + PUSH DE + LD DE,STR_CONTINUE + CALL WRITESTR + POP DE + CALL CIN + RES 5,A ; FORCE UPPERCASE (IMPERFECTLY) + CALL COUT ; ECHO + CP 'Y' + JR Z,CONTINUE3 + CP 'N' + JR Z,SYSHALT + JR CONTINUE1 +CONTINUE3: + CALL NEWLINE + POP AF + RET ; -#DEFINE USEDELAY -#INCLUDE "util.asm" -#INCLUDE "time.asm" -#INCLUDE "bcd.asm" -#INCLUDE "decode.asm" -#INCLUDE "encode.asm" ; -#IF (WBWDEBUG == USEXIO) -#INCLUDE "xio.asm" -#ENDIF -#IF (WBWDEBUG == USEMIO) -#INCLUDE "mio.asm" -#ENDIF ; -; INCLUDE LZSA2 decompression engine if required. +SYSHALT: + LD DE,STR_HALT + CALL WRITESTR + DI + HALT ; -#IF ((CVDUENABLE | GDCENABLE | TMSENABLE | VGAENABLE | VRCENABLE) & USELZSA2) -#INCLUDE "unlzsa2s.asm" -#ENDIF +; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +; +PRTD3M: + PUSH BC + PUSH DE + PUSH HL + LD E,'0' + LD BC,-10000 + CALL PRTD3M1 + LD E,0 + LD BC,-1000 + CALL PRTD3M1 + CALL PC_PERIOD + LD BC,-100 + CALL PRTD3M1 + LD C,-10 + CALL PRTD3M1 + LD C,-1 + CALL PRTD3M1 + POP HL + POP DE + POP BC + RET +PRTD3M1: + LD A,'0' - 1 +PRTD3M2: + INC A + ADD HL,BC + JR C,PRTD3M2 + SBC HL,BC + CP E + JR Z,PRTD3M3 + LD E,0 + CALL COUT +PRTD3M3: + RET ; ;================================================================================================== ; FRONT PANEL SUPPORT @@ -7098,10 +6883,14 @@ HB_CPUSPD2: OR $FF ; SIGNAL ERROR RET ; AND DONE ; +HB_UTIL_END .EQU $ +; ;================================================================================================== ; DISPLAY SUMMARY OF ATTACHED UNITS/DEVICES ;================================================================================================== ; +HB_PRTSUM_BEG .EQU $ +; PRTSUM: CALL NEWLINE2 ; SKIP A LINE LD DE,PS_STRHDR ; POINT TO HEADER @@ -7665,286 +7454,606 @@ PS_SDSND .TEXT "SND$" ; ; SOUND TYPE STRINGS ; -PS_SDSN76489 .TEXT "SN76489$" -PS_SDAY38910 .TEXT "AY-3-8910$" -PS_SDBITMODE .TEXT "I/O PORT$" -PS_SDYM2612 .TEXT "YM2612$" +PS_SDSN76489 .TEXT "SN76489$" +PS_SDAY38910 .TEXT "AY-3-8910$" +PS_SDBITMODE .TEXT "I/O PORT$" +PS_SDYM2612 .TEXT "YM2612$" +; +; 0 1 2 3 4 5 6 7 +; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 +PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n" + .TEXT "---------- ---------- ---------------- --------------------\r\n$" +; +HB_PRTSUM_END .EQU $ +; +;================================================================================================== +; DEVICE DRIVERS +;================================================================================================== +; +HB_DRIVERS_BEG .EQU $ +; +#IF (DSKYENABLE) + #IF (ICMENABLE) +ORG_ICM .EQU $ + #INCLUDE "icm.asm" +SIZ_ICM .EQU $ - ORG_ICM + MEMECHO "ICM occupies " + MEMECHO SIZ_ICM + MEMECHO " bytes.\n" + #ENDIF +; + #IF (PKDENABLE) +ORG_PKD .EQU $ + #INCLUDE "pkd.asm" +SIZ_PKD .EQU $ - ORG_PKD + MEMECHO "PKD occupies " + MEMECHO SIZ_PKD + MEMECHO " bytes.\n" + #ENDIF +; + #IF (H8PENABLE) +ORG_H8P .EQU $ + #INCLUDE "h8p.asm" +SIZ_H8P .EQU $ - ORG_H8P + MEMECHO "H8P occupies " + MEMECHO SIZ_H8P + MEMECHO " bytes.\n" + #ENDIF +#ENDIF +; +#IF (PLATFORM == PLT_NABU) +ORG_NABU .EQU $ + #INCLUDE "nabu.asm" +SIZ_NABU .EQU $ - ORG_NABU + MEMECHO "NABU occupies " + MEMECHO SIZ_NABU + MEMECHO " bytes.\n" +#ENDIF +; +#IF (DSRTCENABLE) +ORG_DSRTC .EQU $ + #INCLUDE "dsrtc.asm" +SIZ_DSRTC .EQU $ - ORG_DSRTC + MEMECHO "DSRTC occupies " + MEMECHO SIZ_DSRTC + MEMECHO " bytes.\n" +#ENDIF +; +#IF (DS1501RTCENABLE) +ORG_DS1501RTC .EQU $ + #INCLUDE "ds1501rtc.asm" +SIZ_DS1501RTC .EQU $ - ORG_DS1501RTC + MEMECHO "DS1501RTC occupies " + MEMECHO SIZ_DS1501RTC + MEMECHO " bytes.\n" +#ENDIF +; +#IF (BQRTCENABLE) +ORG_BQRTC .EQU $ + #INCLUDE "bqrtc.asm" +SIZ_BQRTC .EQU $ - ORG_BQRTC + MEMECHO "BQRTC occupies " + MEMECHO SIZ_BQRTC + MEMECHO " bytes.\n" +#ENDIF +; +#IF (SIMRTCENABLE) +ORG_SIMRTC .EQU $ + #INCLUDE "simrtc.asm" +SIZ_SIMRTC .EQU $ - ORG_SIMRTC + MEMECHO "SIMRTC occupies " + MEMECHO SIZ_SIMRTC + MEMECHO " bytes.\n" +#ENDIF +; +#IF (PCFENABLE) +ORG_PCF .EQU $ + #INCLUDE "pcf.asm" +SIZ_PCF .EQU $ - ORG_PCF + MEMECHO "PCF occupies " + MEMECHO SIZ_PCF + MEMECHO " bytes.\n" +#ENDIF +; +#IF (DS7RTCENABLE) +ORG_DS7RTC .EQU $ + #INCLUDE "ds7rtc.asm" +SIZ_DS7RTC .EQU $ - ORG_DS7RTC + MEMECHO "DS7RTC occupies " + MEMECHO SIZ_DS7RTC + MEMECHO " bytes.\n" +#ENDIF +; +#IF (INTRTCENABLE) +ORG_INTRTC .EQU $ + #INCLUDE "intrtc.asm" +SIZ_INTRTC .EQU $ - ORG_INTRTC + MEMECHO "INTRTC occupies " + MEMECHO SIZ_INTRTC + MEMECHO " bytes.\n" +#ENDIF +; +#IF (RP5RTCENABLE) +ORG_RP5RTC .EQU $ + #INCLUDE "rp5rtc.asm" +SIZ_RP5RTC .EQU $ - ORG_RP5RTC + MEMECHO "RP5RTC occupies " + MEMECHO SIZ_RP5RTC + MEMECHO " bytes.\n" +#ENDIF +#IF (ASCIENABLE) +ORG_ASCI .EQU $ + #INCLUDE "asci.asm" +SIZ_ASCI .EQU $ - ORG_ASCI + MEMECHO "ASCI occupies " + MEMECHO SIZ_ASCI + MEMECHO " bytes.\n" +#ENDIF +; +#IF (Z2UENABLE) +ORG_Z2U .EQU $ + #INCLUDE "z2u.asm" +SIZ_Z2U .EQU $ - ORG_Z2U + MEMECHO "Z2U occupies " + MEMECHO SIZ_Z2U + MEMECHO " bytes.\n" +#ENDIF +; +#IF (UARTENABLE) +ORG_UART .EQU $ + #INCLUDE "uart.asm" +SIZ_UART .EQU $ - ORG_UART + MEMECHO "UART occupies " + MEMECHO SIZ_UART + MEMECHO " bytes.\n" +#ENDIF +; +#IF (DUARTENABLE) +ORG_DUART .EQU $ + #INCLUDE "duart.asm" +SIZ_DUART .EQU $ - ORG_DUART + MEMECHO "DUART occupies " + MEMECHO SIZ_DUART + MEMECHO " bytes.\n" +#ENDIF +; +#IF (SIOENABLE) +ORG_SIO .EQU $ + #INCLUDE "sio.asm" +SIZ_SIO .EQU $ - ORG_SIO + MEMECHO "SIO occupies " + MEMECHO SIZ_SIO + MEMECHO " bytes.\n" +#ENDIF ; -; 0 1 2 3 4 5 6 7 -; 01234567890123456789012345678901234567890123456789012345678901234567890123456789 -PS_STRHDR .TEXT "Unit Device Type Capacity/Mode\r\n" - .TEXT "---------- ---------- ---------------- --------------------\r\n$" +#IF (ACIAENABLE) +ORG_ACIA .EQU $ + #INCLUDE "acia.asm" +SIZ_ACIA .EQU $ - ORG_ACIA + MEMECHO "ACIA occupies " + MEMECHO SIZ_ACIA + MEMECHO " bytes.\n" +#ENDIF ; -;================================================================================================== -; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) -;================================================================================================== +#IF (PIOENABLE) +ORG_PIO .EQU $ + #INCLUDE "pio.asm" +SIZ_PIO .EQU $ - ORG_PIO + MEMECHO "PIO occupies " + MEMECHO SIZ_PIO + MEMECHO " bytes.\n" +#ENDIF ; -; OUTPUT CHARACTER FROM A +#IF (LPTENABLE) +ORG_LPT .EQU $ + #INCLUDE "lpt.asm" +SIZ_LPT .EQU $ - ORG_LPT + MEMECHO "LPT occupies " + MEMECHO SIZ_LPT + MEMECHO " bytes.\n" +#ENDIF ; -COUT: - ; SAVE ALL INCOMING REGISTERS - PUSH AF - PUSH BC - PUSH DE - PUSH HL +#IF (PIO_4P | PIO_ZP | PIO_SBC) +ORG_PIO .EQU $ + #INCLUDE "pio.asm" +SIZ_PIO .EQU $ - ORG_PIO + MEMECHO "PIO occupies " + MEMECHO SIZ_PIO + MEMECHO " bytes.\n" +#ENDIF ; - ; GET CURRENT CONSOLE UNIT - LD E,A ; TEMPORARILY STASH OUTPUT CHAR IN E - LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE - CP $FF ; TEST FOR $FF (HBIOS NOT READY) - JR Z,COUT1 ; IF NOT READY, TRY DEBUG OUTPUT +#IF (UFENABLE) +ORG_UF .EQU $ + #INCLUDE "uf.asm" +SIZ_UF .EQU $ - ORG_UF + MEMECHO "UF occupies " + MEMECHO SIZ_UF + MEMECHO " bytes.\n" +#ENDIF ; - ; USE HBIOS - LD C,A ; CONSOLE UNIT TO C - LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR - CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY - JR COUT2 ; CONTINUE +#IF (VGAENABLE) +ORG_VGA .EQU $ + #INCLUDE "vga.asm" +SIZ_VGA .EQU $ - ORG_VGA + MEMECHO "VGA occupies " + MEMECHO SIZ_VGA + MEMECHO " bytes.\n" +#ENDIF ; -COUT1: +#IF (CVDUENABLE) +ORG_CVDU .EQU $ + #INCLUDE "cvdu.asm" +SIZ_CVDU .EQU $ - ORG_CVDU + MEMECHO "CVDU occupies " + MEMECHO SIZ_CVDU + MEMECHO " bytes.\n" +#ENDIF ; -#IF (WBWDEBUG == USEXIO) - LD A,E ; GET OUTPUT CHAR BACK TO ACCUM - CALL XIO_OUTC ; OUTPUT VIA XIO +#IF (VDUENABLE) +ORG_VDU .EQU $ + #INCLUDE "vdu.asm" +SIZ_VDU .EQU $ - ORG_VDU + MEMECHO "VDU occupies " + MEMECHO SIZ_VDU + MEMECHO " bytes.\n" #ENDIF ; -#IF (WBWDEBUG == USEMIO) - LD A,E - CALL MIO_OUTC ; OUTPUT VIA MIO +#IF (TMSENABLE) +ORG_TMS .EQU $ + #INCLUDE "tms.asm" +SIZ_TMS .EQU $ - ORG_TMS + MEMECHO "TMS occupies " + MEMECHO SIZ_TMS + MEMECHO " bytes.\n" #ENDIF ; -COUT2: - ; RESTORE ALL REGISTERS - POP HL - POP DE - POP BC - POP AF - RET +#IF (EFENABLE) +ORG_EF .EQU $ + #INCLUDE "ef.asm" +SIZ_EF .EQU $ - ORG_EF + MEMECHO "EF occupies " + MEMECHO SIZ_EF + MEMECHO " bytes.\n" +#ENDIF ; -; INPUT CHARACTER TO A +#IF (GDCENABLE) +ORG_GDC .EQU $ + #INCLUDE "gdc.asm" +SIZ_GDC .EQU $ - ORG_GDC + MEMECHO "GDC occupies " + MEMECHO SIZ_GDC + MEMECHO " bytes.\n" +#ENDIF ; -CIN: - ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - PUSH BC - PUSH DE - PUSH HL +#IF (VRCENABLE) +ORG_VRC .EQU $ + #INCLUDE "vrc.asm" +SIZ_VRC .EQU $ - ORG_VRC + MEMECHO "VRC occupies " + MEMECHO SIZ_VRC + MEMECHO " bytes.\n" +#ENDIF ; - LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE - CP $FF ; TEST FOR $FF (HBIOS NOT READY) - JR Z,CIN1 ; IF NOT READY, TRY DEBUG INPUT +#IF (DMAENABLE) +ORG_DMA .EQU $ +#INCLUDE "dma.asm" +SIZ_DMA .EQU $ - ORG_DMA + MEMECHO "DMA occupies " + MEMECHO SIZ_DMA + MEMECHO " bytes.\n" +#ENDIF ; - ; USE HBIOS - LD C,A ; CONSOLE UNIT TO C - LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR - CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY - LD A,E ; RESULTANT CHAR TO A - JR CIN2 ; CONTINUE +#IF (KBDENABLE) +ORG_KBD .EQU $ + #INCLUDE "kbd.asm" +SIZ_KBD .EQU $ - ORG_KBD + MEMECHO "KBD occupies " + MEMECHO SIZ_KBD + MEMECHO " bytes.\n" +#ENDIF ; -CIN1: +#IF (PPKENABLE) +ORG_PPK .EQU $ + #INCLUDE "ppk.asm" +SIZ_PPK .EQU $ - ORG_PPK + MEMECHO "PPK occupies " + MEMECHO SIZ_PPK + MEMECHO " bytes.\n" +#ENDIF ; -#IF (WBWDEBUG == USEXIO) - CALL XIO_INC ; GET CHAR +#IF (MKYENABLE) +ORG_MKY .EQU $ + #INCLUDE "mky.asm" +SIZ_MKY .EQU $ - ORG_MKY + MEMECHO "MKY occupies " + MEMECHO SIZ_MKY + MEMECHO " bytes.\n" #ENDIF ; -#IF (WBWDEBUG == USEMIO) - CALL MIO_INC ; GET CHAR +#IF (NABUKBENABLE) +ORG_NABUKB .EQU $ + #INCLUDE "nabukb.asm" +SIZ_NABUKB .EQU $ - ORG_NABUKB + MEMECHO "NABUKB occupies " + MEMECHO SIZ_NABUKB + MEMECHO " bytes.\n" #ENDIF ; -CIN2: +#IF (PRPENABLE) +ORG_PRP .EQU $ + #INCLUDE "prp.asm" +SIZ_PRP .EQU $ - ORG_PRP + MEMECHO "PRP occupies " + MEMECHO SIZ_PRP + MEMECHO " bytes.\n" +#ENDIF ; - ; RESTORE REGISTERS (AF IS OUTPUT) - POP HL - POP DE - POP BC - RET +#IF (PPPENABLE) +ORG_PPP .EQU $ + #INCLUDE "ppp.asm" +SIZ_PPP .EQU $ - ORG_PPP + MEMECHO "PPP occupies " + MEMECHO SIZ_PPP + MEMECHO " bytes.\n" +#ENDIF ; -; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) +#IF (SCONENABLE) +ORG_SCON .EQU $ + #INCLUDE "scon.asm" +SIZ_SCON .EQU $ - ORG_SCON + MEMECHO "SCON occupies " + MEMECHO SIZ_SCON + MEMECHO " bytes.\n" +#ENDIF ; -CST: - ; SAVE INCOMING REGISTERS (AF IS OUTPUT) - PUSH BC - PUSH DE - PUSH HL +#IF (CHENABLE) +ORG_CH .EQU $ + #INCLUDE "ch.asm" +SIZ_CH .EQU $ - ORG_CH + MEMECHO "CH occupies " + MEMECHO SIZ_CH + MEMECHO " bytes.\n" +#ENDIF ; - LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE - CP $FF ; TEST FOR $FF (HBIOS NOT READY) - JR Z,CST1 ; IIF NOT READY, TRY DEBUG DEBUG STATUS +#IF (ESPENABLE) +ORG_ESP .EQU $ + #INCLUDE "esp.asm" +SIZ_ESP .EQU $ - ORG_ESP + MEMECHO "ESP occupies " + MEMECHO SIZ_ESP + MEMECHO " bytes.\n" +#ENDIF ; - ; USE HBIOS - LD C,A ; CONSOLE UNIT TO C - LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS - CALL CIO_DISPATCH ; CALL CIO DISPATCHER DIRECTLY - JR CST2 ; CONTINUE +#IF (MDENABLE) +ORG_MD .EQU $ + #INCLUDE "md.asm" +SIZ_MD .EQU $ - ORG_MD + MEMECHO "MD occupies " + MEMECHO SIZ_MD + MEMECHO " bytes.\n" +#ENDIF ; -CST1: +#IF (FDENABLE) +ORG_FD .EQU $ + #INCLUDE "fd.asm" +SIZ_FD .EQU $ - ORG_FD + MEMECHO "FD occupies " + MEMECHO SIZ_FD + MEMECHO " bytes.\n" +#ENDIF ; -#IF (WBWDEBUG == USEXIO) - CALL XIO_IST ; GET STATUS +#IF (RFENABLE) +ORG_RF .EQU $ + #INCLUDE "rf.asm" +SIZ_RF .EQU $ - ORG_RF + MEMECHO "RF occupies " + MEMECHO SIZ_RF + MEMECHO " bytes.\n" #ENDIF ; -#IF (WBWDEBUG == USEMIO) - CALL MIO_IST ; GET STATUS +#IF (IDEENABLE) +ORG_IDE .EQU $ + #INCLUDE "ide.asm" +SIZ_IDE .EQU $ - ORG_IDE + MEMECHO "IDE occupies " + MEMECHO SIZ_IDE + MEMECHO " bytes.\n" #ENDIF ; -CST2: - ; RESTORE REGISTERS (AF IS OUTPUT) - POP HL - POP DE - POP BC - RET +#IF (PPIDEENABLE) +ORG_PPIDE .EQU $ + #INCLUDE "ppide.asm" +SIZ_PPIDE .EQU $ - ORG_PPIDE + MEMECHO "PPIDE occupies " + MEMECHO SIZ_PPIDE + MEMECHO " bytes.\n" +#ENDIF ; -;================================================================================================== -; INTERNAL UTILITY FUNCTIONS -;================================================================================================== +#IF (SDENABLE) +ORG_SD .EQU $ + #INCLUDE "sd.asm" +SIZ_SD .EQU $ - ORG_SD + MEMECHO "SD occupies " + MEMECHO SIZ_SD + MEMECHO " bytes.\n" +#ENDIF ; -; SET HL TO IY+A, A IS TRASHED +#IF (HDSKENABLE) +ORG_HDSK .EQU $ + #INCLUDE "hdsk.asm" +SIZ_HDSK .EQU $ - ORG_HDSK + MEMECHO "HDSK occupies " + MEMECHO SIZ_HDSK + MEMECHO " bytes.\n" +#ENDIF ; -LDHLIYA: - PUSH IY ; COPY INSTANCE DATA PTR - POP HL ; ... TO HL - ;JP ADDHLA ; APPLY OFFSET TO HL AND RETURN - ADD A,L ; ADD OFFSET TO LSB - LD L,A ; ... PUT BACK IN L - RET NC ; DONE IF CF NOT SET - INC H ; IF CF SET, BUMP MSB - RET ; ... AND RETURN +#IF (PPAENABLE) +ORG_PPA .EQU $ + #INCLUDE "ppa.asm" +SIZ_PPA .EQU $ - ORG_PPA + MEMECHO "PPA occupies " + MEMECHO SIZ_PPA + MEMECHO " bytes.\n" +#ENDIF ; -; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO -; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED -; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. +#IF (IMMENABLE) +ORG_IMM .EQU $ + #INCLUDE "imm.asm" +SIZ_IMM .EQU $ - ORG_IMM + MEMECHO "IMM occupies " + MEMECHO SIZ_IMM + MEMECHO " bytes.\n" +#ENDIF ; -; INPUT: HL=TRACK, D=HEAD, E=SECTOR -; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) +#IF (SYQENABLE) +ORG_SYQ .EQU $ + #INCLUDE "syq.asm" +SIZ_SYQ .EQU $ - ORG_SYQ + MEMECHO "SYQ occupies " + MEMECHO SIZ_SYQ + MEMECHO " bytes.\n" +#ENDIF ; -HB_CHS2LBA: +; TERM IS ALWAYS INCLUDED +ORG_TERM .EQU $ + #INCLUDE "term.asm" +SIZ_TERM .EQU $ - ORG_TERM + MEMECHO "TERM occupies ") + MEMECHO SIZ_TERM + MEMECHO " bytes.\n" ; - LD A,D ; HEAD TO A - RLCA ; LEFT SHIFT TO HIGH NIBBLE - RLCA ; ... DEPENDS ON HIGH - RLCA ; ... NIBBLE BEING 0 SINCE - RLCA ; ... IT ROTATES INTO LOW NIBBLE - OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) - LD D,0 - LD E,H - LD H,L - LD L,A - XOR A - RET +;#IF (SPKENABLE & DSRTCENABLE +#IF (SPKENABLE) +ORG_SPK .EQU $ + #INCLUDE "spk.asm" +SIZ_SPK .EQU $ - ORG_SPK + MEMECHO "SPK occupies " + MEMECHO SIZ_SPK + MEMECHO " bytes.\n" +#ENDIF +#IF (KIOENABLE) +ORG_KIO .EQU $ + #INCLUDE "kio.asm" +SIZ_KIO .EQU $ - ORG_KIO + MEMECHO "KIO occupies " + MEMECHO SIZ_KIO + MEMECHO " bytes.\n" +#ENDIF +#IF (CTCENABLE) +ORG_CTC .EQU $ + #INCLUDE "ctc.asm" +SIZ_CTC .EQU $ - ORG_CTC + MEMECHO "CTC occupies " + MEMECHO SIZ_CTC + MEMECHO " bytes.\n" +#ENDIF +#IF (SN76489ENABLE) +ORG_SN76489 .EQU $ + #INCLUDE "sn76489.asm" +SIZ_SN76489 .EQU $ - ORG_SN76489 + MEMECHO "SN76489 occupies " + MEMECHO SIZ_SN76489 + MEMECHO " bytes.\n" +#ENDIF +#IF (AY38910ENABLE) +ORG_AY38910 .EQU $ + #INCLUDE "ay38910.asm" +SIZ_AY38910 .EQU $ - ORG_AY38910 + MEMECHO "AY38910 occupies " + MEMECHO SIZ_AY38910 + MEMECHO " bytes.\n" +#ENDIF +#IF (YM2612ENABLE) +ORG_YM2612 .EQU $ + #INCLUDE "ym2612.asm" +SIZ_YM2612 .EQU $ - ORG_YM2612 + MEMECHO "YM2612 occupies " + MEMECHO SIZ_YM2612 + MEMECHO " bytes.\n" +#ENDIF ; -; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? + MEMECHO "RTCDEF=" + MEMECHO RTCDEF + MEMECHO "\n" ; -SYSCHKA: - ; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY - PUSH AF ; PRESERVE INCOMING AF VALUE - LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL - CP DL_ERROR ; >= ERROR LEVEL - JR C,SYSCHK1 ; IF NOT, GO HOME - POP AF ; RESTORE INCOMING AF VALUE +HB_DRIVERS_END .EQU $ ; - ; DISPLAY SYSCHK MESSAGE - PUSH DE ; PRESERVE DE VALUE - LD DE,STR_SYSCHK ; POINT TO PREFIX STRING - CALL WRITESTR ; PRINT IT - POP DE ; RESTORE DE VALUE - CALL XREGDMP ; DUMP REGISTERS - - ; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX - EX (SP),HL ; GET RETURN ADDRESS - INC HL ; POINT TO THE ERROR CODE - PUSH AF - LD A,(HL) ; DISPLAY - CALL PRTHEXBYTE - POP AF - DEC HL ; RESTORE RETURN ADDRESS - EX (SP),HL +;================================================================================================== +; FONTS +;================================================================================================== ; - JR CONTINUE ; CHECK W/ USER +HB_FONTS_BEG .EQU $ ; -SYSCHK1: - ; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL - POP AF - RET +ORG_FONTS .EQU $ ; -; PANIC: DUMP MACHINE STATE AND HALT + MEMECHO "FONTS" ; -PANIC: - PUSH DE - LD DE,STR_PANIC - CALL WRITESTR - POP DE - CALL XREGDMP ; DUMP REGISTERS - JR SYSHALT ; FULL STOP +#IFDEF USEFONT8X8 +FONT8X8: ; +; FOR NOW, WE NEVER COMPRESS THE 8X8 FONT. SEE TMS DRIVER. ; + #IF USELZSA2 & FALSE + #INCLUDE "font8x8c.asm" + #ELSE + #INCLUDE "font8x8u.asm" + #ENDIF + MEMECHO " 8X8" +#ENDIF ; -CONTINUE: - PUSH AF -CONTINUE1: - PUSH DE - LD DE,STR_CONTINUE - CALL WRITESTR - POP DE - CALL CIN - RES 5,A ; FORCE UPPERCASE (IMPERFECTLY) - CALL COUT ; ECHO - CP 'Y' - JR Z,CONTINUE3 - CP 'N' - JR Z,SYSHALT - JR CONTINUE1 -CONTINUE3: - CALL NEWLINE - POP AF - RET +#IFDEF USEFONT8X11 +FONT8X11: + #IF USELZSA2 + #INCLUDE "font8x11c.asm" + #ELSE + #INCLUDE "font8x11u.asm" + #ENDIF + MEMECHO " 8X11" +#ENDIF ; +#IFDEF USEFONT8X16 +FONT8X16: + #IF USELZSA2 + #INCLUDE "font8x16c.asm" + #ELSE + #INCLUDE "font8x16u.asm" + #ENDIF + MEMECHO " 8X16" +#ENDIF ; +#IFDEF USEFONTCGA +FONTCGA: + #IF USELZSA2 + #INCLUDE "fontcgac.asm" + #ELSE + #INCLUDE "fontcgau.asm" + #ENDIF + MEMECHO " CGA" +#ENDIF ; -SYSHALT: - LD DE,STR_HALT - CALL WRITESTR - DI - HALT +#IFDEF USEFONTVGARC +FONTVGARC: + #IF USELZSA2 + #INCLUDE "fontvgarcc.asm" + #ELSE + #INCLUDE "fontvgarcu.asm" + #ENDIF + MEMECHO " VGARC" +#ENDIF ; -; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +SIZ_FONTS .EQU $ - ORG_FONTS + MEMECHO " occupy " + MEMECHO SIZ_FONTS + MEMECHO " bytes.\n" ; -PRTD3M: - PUSH BC - PUSH DE - PUSH HL - LD E,'0' - LD BC,-10000 - CALL PRTD3M1 - LD E,0 - LD BC,-1000 - CALL PRTD3M1 - CALL PC_PERIOD - LD BC,-100 - CALL PRTD3M1 - LD C,-10 - CALL PRTD3M1 - LD C,-1 - CALL PRTD3M1 - POP HL - POP DE - POP BC - RET -PRTD3M1: - LD A,'0' - 1 -PRTD3M2: - INC A - ADD HL,BC - JR C,PRTD3M2 - SBC HL,BC - CP E - JR Z,PRTD3M3 - LD E,0 - CALL COUT -PRTD3M3: - RET +HB_FONTS_END .EQU $ ; ;================================================================================================== ; HBIOS GLOBAL DATA ;================================================================================================== ; +HB_DATA_BEG .EQU $ +; IDLECOUNT .DB 0 ; HEAPCURB .DW 0 ; MARK HEAP ADDRESS AFTER INITIALIZATION @@ -7964,9 +8073,12 @@ RTCDEFVAL .DB RTCDEF ; STORAGE FOR RTC DEFAULT VALUE HB_BOOT_REC .DB 0 ; BOOT MODE (0=NORMAL, 1=RECOVERY MODE) #ENDIF ; -STR_BANNER .DB "RomWBW HBIOS v", BIOSVER, ", ", TIMESTAMP, "$" +STR_BANNER .DB "\r\n\r\nRomWBW HBIOS v", BIOSVER, ", ", TIMESTAMP +#IFDEF APPBOOT + .DB " (App Boot)" +#ENDIF + .DB "$" STR_PLATFORM .DB PLATFORM_NAME, "$" -;STR_SWITCH .DB "*** Activating CRT Console ***$" STR_CONSOLE .DB "\r\n\r\n Console on Unit #$" STR_BADINT .DB "\r\n*** BAD INT ***\r\n$" STR_LOWBAT .DB "\r\n\r\n+++ LOW BATTERY +++$" @@ -7979,8 +8091,6 @@ STR_CONTINUE .TEXT "\r\nContinue (Y/N)? $" MSG_HBVER .DB $76,$7F,$30,$3F,$00,$00,$00,$00 ; "HBIO " #ENDIF ; -HB_APPBNK .DB 0 ; START BANK WHEN RUN IN APP MODE -; HB_CURSEC .DB 0 ; CURRENT SECOND (TEMP) ; HB_BCDTMP .FILL 5,0 ; BCD NUMBER STORAGE (TEMP) @@ -7996,7 +8106,116 @@ HB_CONCFGSAV .DW 0 ; CONSOLE CONFIG SAVE AREA ; HB_HASFP .DB 0 ; NON-ZERO MEANS FP EXISTS ; -HB_WRKBUF .FILL 512,0 ; INTERNAL DISK BUFFER +HB_WRKBUF .EQU $ ; INTERNAL DISK BUFFER +; +; THIS AREA IS USED AS A TEMPORARY DISK BUFFER. IT IS ALSO USED +; FOR THE APPBOOT STARTUP CODE SINCE THAT CODE CAN BE DISCARDED +; AFTER STARTUP. +; +HB_APPBOOT: +; +#IFDEF APPBOOT + ; APPBOOT IS ONLY SUPPORTED ON A RUNNING ROMWBW SYSTEM. + ; CONFIRM AND DIAGNOSE IF NOT. + LD HL,(HB_IDENT) ; HL := ADR OR ROMWBW HBIOS IDENT + LD A,(HL) ; GET FIRST BYTE OF ROMWBW MARKER + CP 'W' ; MATCH? + JR NZ,HB_APPBOOTERR ; ABORT WITH INVALID CONFIG BLOCK + INC HL ; NEXT BYTE (MARKER BYTE 2) + LD A,(HL) ; LOAD IT + CP ~'W' ; MATCH? + JR NZ,HB_APPBOOTERR ; ABORT WITH INVALID CONFIG BLOCK + JR HB_APPBOOT1 ; WE ARE RUNNING ROMWBW, CONTINUE +; +HB_APPBOOTERR: + LD DE,STR_APPBOOTERR ; POINT TO ERROR MESSAGE + LD C,9 ; BDOS FUNC 9: WRITE STR + CALL $0005 ; DO IT + OR $FF ; SIGNAL ERROR + RET ; AND RETURN +; +STR_APPBOOTERR .DB "\r\n\r\n*** App Boot is only possible on running RomWBW system!\r\n\r\n$" +; +HB_APPBOOT1: + ; ANNOUNCE THE APPLICATION BOOT + LD DE,STR_APPBOOT ; POINT TO MESSAGE + LD C,9 ; BDOS FUNC 9: WRITE STR + CALL $0005 ; DO IT + JR HB_APPBOOT2 ; AND CONTINUE +; +STR_APPBOOT .DB "\r\n\r\n*** Launching RomWBW HBIOS v", BIOSVER, ", ", TIMESTAMP, " for" + .DB "\r\n\r\n ", PLATFORM_NAME, "$" +; +HB_APPBOOT2: + ; IF THIS IS AN APPLICATION BOOT, WE CAPTURE THE CURRENT BANK ID + ; AND UPDATE THE PROXY IMAGE. LATER, WHEN THE PROXY IMAGE IS COPIED + ; TO IT'S RUNNING LOCATION AT TOP OF RAM, THE CORRECT HB_CURBNK + ; VALUE WILL BE INSTALLED. NOTE: THE ADDRESSES IN THE PROXY + ; IMAGE ARE FOR IT'S RUNNING LOCATION. WE NEED TO USE *MATH* + ; TO DERIVE THE LOCATION OF HB_CURBNK IN THE IMAGE. + LD A,(HB_CURBNK) + LD (HB_CURBNK - HBX_LOC + HBX_IMG),A +; + ; FOR AN APPLICATION BOOT, WE ALSO COPY THE CONCATENATED OS + ; IMAGES TO THE AUX BANK WHERE WE WILL JUMP TO ROMLDR LATER. + ; THE AUX BANK WILL BE DESTROYED IF CP/M 3 IS LOADED. WE DON'T + ; LIVE IN A PERFECT WORLD. + LD B,BF_SYSSETCPY ; HBIOS FUNC: SETUP BANK COPY + LD D,BID_AUX ; D = DEST BANK = AUX BANK + LD A,(HB_CURBNK) ; E = SRC BANK = CUR BANK + LD E,A ; USE AS SOURCE + LD HL,$8000 ; HL = COPY LEN = ENTIRE BANK + RST 08 ; DO IT + LD B,BF_SYSBNKCPY ; HBIOS FUNC: PERFORM BANK COPY + LD HL,HB_END ; COPY FROM END OF HBIOS + LD DE,0 ; TO START OF TARGET BANK + RST 08 ; DO IT +; + #IF (MEMMGR == MM_Z280) + ; WE NEED TO SWITCH FROM USER MODE TO SYSTEM MODE, BUT CONTINUE + ; RUNNING IN THE CURRENT BANK. THIS IS A LITTLE MESSY. +; + ; FIRST, OVERLAY PROXY CODE WITH NEW CODE SO WE CAN USE THE + ; PROXY ROUTINES SAFELY. + LD DE,HBX_LOC ; RUNNING LOCATION + LD HL,HBX_IMG ; LOCATION IN IMAGE + LD BC,HBX_SIZ ; SIZE + LDIR ; INSTALL IT +; + ; NEXT, COPY A BIT OF CODE TO DO THE SYSTEM TRANSITION TO + ; UPPER MEM. WE CAN BORROW THE PROXY BOUNCE BUFFER FOR THIS. + LD HL,Z280_GOSYS + LD DE,HBX_BUF + LD BC,Z280_GOSYS_LEN + LDIR +; + ; THEN SYSCALL IT. NOTE THAT THE ROUTINE CALLED DOES NOT + ; (RET)URN, IT JUMPS TO CONTINUE SO THAT THE SYSCALL DOES + ; NOT RETURN TO USER MODE. + SC HBX_BUF ; SYSCALL ROUTINE +; +Z280_GOSYS: + ; THIS BIT OF CODE RUNS IN UPPER MEM. IT REMAPS THE LOW MEM + ; SYSTEM PAGES TO THE CURRENT BANK. WE LOSE STACK CONTEXT IN + ; THE PROCESS, SO IN THIS CASE WE NEED TO JUMP BACK TO CONTINUE + ; THE APP BOOT. + DI ; NO INTERRUPTS + LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY + LD A,(HB_CURBNK) ; CURRENT BANK + LD B,$10 ; FIRST SYSTEM PDR + CALL Z280_BNKSEL ; DO THE SWITCH + JP HB_APPBOOT_Z ; AND RESUME BOOT +; +Z280_GOSYS_LEN .EQU $ - Z280_GOSYS +; + #ENDIF +; + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +#ENDIF +; + .FILL (512 - ($ - HB_WRKBUF)) ; PAD REMAINDER OF WORK BUF ; ; ; @@ -8080,18 +8299,138 @@ DSKY_HEXBUFLEN .EQU $ - DSKY_HEXBUF ; #ENDIF ; +HB_DATA_END .EQU $ +; HB_END .EQU $ ; SLACK .EQU BNKTOP - $ - .ECHO "HBIOS space remaining: " - .ECHO SLACK - .ECHO " bytes.\n" +; +; +; +#IFDEF MEMINFO + .ECHO "PAGE ZERO @ " + .ECHO HB_PGZERO_BEG + .ECHO ", LENGTH=" + .ECHO HB_PGZERO_END - HB_PGZERO_BEG + .ECHO "\n" +; + .ECHO "HCB @ " + .ECHO HB_HCB_BEG + .ECHO ", LENGTH=" + .ECHO HB_HCB_END - HB_HCB_BEG + .ECHO "\n" +; + .ECHO "PROXY @ " + .ECHO HB_PROXY_BEG + .ECHO ", LENGTH=" + .ECHO HB_PROXY_END - HB_PROXY_BEG + .ECHO "\n" +; + .ECHO "ENTRY @ " + .ECHO HB_ENTRY_BEG + .ECHO ", LENGTH=" + .ECHO HB_ENTRY_END - HB_ENTRY_BEG + .ECHO "\n" +; + .ECHO "INTVEC @ " + .ECHO HB_INTVEC_BEG + .ECHO ", LENGTH=" + .ECHO HB_INTVEC_END - HB_INTVEC_BEG + .ECHO "\n" +; + .ECHO "SYSINIT @ " + .ECHO HB_SYSINIT_BEG + .ECHO ", LENGTH=" + .ECHO HB_SYSINIT_END - HB_SYSINIT_BEG + .ECHO "\n" +; + .ECHO "DISP @ " + .ECHO HB_DISP_BEG + .ECHO ", LENGTH=" + .ECHO HB_DISP_END - HB_DISP_BEG + .ECHO "\n" +; + .ECHO "SYSAPI @ " + .ECHO HB_SYSAPI_BEG + .ECHO ", LENGTH=" + .ECHO HB_SYSAPI_END - HB_SYSAPI_BEG + .ECHO "\n" +; + .ECHO "Z280IVT @ " + .ECHO HB_Z280IVT_BEG + .ECHO ", LENGTH=" + .ECHO HB_Z280IVT_END - HB_Z280IVT_BEG + .ECHO "\n" +; + .ECHO "INTFUNC @ " + .ECHO HB_INTFUNC_BEG + .ECHO ", LENGTH=" + .ECHO HB_INTFUNC_END - HB_INTFUNC_BEG + .ECHO "\n" +; + .ECHO "UTIL @ " + .ECHO HB_UTIL_BEG + .ECHO ", LENGTH=" + .ECHO HB_UTIL_END - HB_UTIL_BEG + .ECHO "\n" +; + .ECHO "PRTSUM @ " + .ECHO HB_PRTSUM_BEG + .ECHO ", LENGTH=" + .ECHO HB_PRTSUM_END - HB_PRTSUM_BEG + .ECHO "\n" +; + .ECHO "DRIVERS @ " + .ECHO HB_DRIVERS_BEG + .ECHO ", LENGTH=" + .ECHO HB_DRIVERS_END - HB_DRIVERS_BEG + .ECHO "\n" +; + .ECHO "FONTS @ " + .ECHO HB_FONTS_BEG + .ECHO ", LENGTH=" + .ECHO HB_FONTS_END - HB_FONTS_BEG + .ECHO "\n" +; + .ECHO "DATA @ " + .ECHO HB_DATA_BEG + .ECHO ", LENGTH=" + .ECHO HB_DATA_END - HB_DATA_BEG + .ECHO "\n" +; +TOTAL .EQU 0 +TOTAL .SET TOTAL + (HB_PGZERO_END - HB_PGZERO_BEG) +TOTAL .SET TOTAL + (HB_HCB_END - HB_HCB_BEG) +TOTAL .SET TOTAL + (HB_PROXY_END - HB_PROXY_BEG) +TOTAL .SET TOTAL + (HB_ENTRY_END - HB_ENTRY_BEG) +TOTAL .SET TOTAL + (HB_INTVEC_END - HB_INTVEC_BEG) +TOTAL .SET TOTAL + (HB_SYSINIT_END - HB_SYSINIT_BEG) +TOTAL .SET TOTAL + (HB_DISP_END - HB_DISP_BEG) +TOTAL .SET TOTAL + (HB_SYSAPI_END - HB_SYSAPI_BEG) +TOTAL .SET TOTAL + (HB_Z280IVT_END - HB_Z280IVT_BEG) +TOTAL .SET TOTAL + (HB_INTFUNC_END - HB_INTFUNC_BEG) +TOTAL .SET TOTAL + (HB_UTIL_END - HB_UTIL_BEG) +TOTAL .SET TOTAL + (HB_PRTSUM_END - HB_PRTSUM_BEG) +TOTAL .SET TOTAL + (HB_DRIVERS_END - HB_DRIVERS_BEG) +TOTAL .SET TOTAL + (HB_FONTS_END - HB_FONTS_BEG) +TOTAL .SET TOTAL + (HB_DATA_END - HB_DATA_BEG) +TOTAL .SET TOTAL + SLACK +; + .ECHO "TOTAL MEMORY USAGE = " + .ECHO TOTAL + .ECHO "\n" +; +#ENDIF +; + .ECHO "HBIOS space remaining: " + .ECHO SLACK + .ECHO " bytes.\n" ; ; DIAGNOSE HBIOS BANK OVERFLOW ; #IF (SLACK < 0) - .ECHO "*** ERROR: HBIOS too big!!!\n" - !!! ; FORCE AN ASSEMBLY ERROR + .ECHO "*** ERROR: HBIOS too big!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; ; CHECK TO SEE IF WE HAVE ENOUGH HEAP TO CACHE THE CP/M CCP @@ -8099,20 +8438,20 @@ SLACK .EQU BNKTOP - $ ; MAY NOT NEED THIS, THE MOST COMMON ONES DO. CREATING AN HBIOS ; WITHOUT SPACE FOR THIS WILL NOT BE USEFUL. ; -#IF ((CCP_SIZ + 512) > SLACK) - .ECHO "*** ERROR: Insufficient HEAP space!!!\n" - !!! ; FORCE AN ASSEMBLY ERROR +#IF ((CCP_SIZ + 512 + 8) > SLACK) + .ECHO "*** ERROR: Insufficient HEAP space!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; ;;;#IF (SLACK < (1024 * 3)) -;;; .ECHO "*** ERROR: Low HEAP space!!!\n" -;;; !!! ; FORCE AN ASSEMBLY ERROR +;;; .ECHO "*** ERROR: Low HEAP space!!!\n" +;;; !!! ; FORCE AN ASSEMBLY ERROR ;;;#ENDIF ; #IFDEF ROMBOOT #IF (ROMSIZE > 0) - .FILL SLACK + .FILL SLACK #ENDIF #ENDIF ; - .END + .END diff --git a/Source/HBIOS/hdsk.asm b/Source/HBIOS/hdsk.asm index 2fa6fddf..6dfc426f 100644 --- a/Source/HBIOS/hdsk.asm +++ b/Source/HBIOS/hdsk.asm @@ -22,11 +22,11 @@ HDSK_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) HDSK_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) HDSK_LBA .EQU 2 ; OFFSET OF LBA (DWORD) ; - .ECHO "HDSK: IO=" - .ECHO HDSK_IO - .ECHO ", DEVICE COUNT=" - .ECHO HDSK_DEVCNT - .ECHO "\n" + DEVECHO "HDSK: IO=" + DEVECHO HDSK_IO + DEVECHO ", DEVICE COUNT=" + DEVECHO HDSK_DEVCNT + DEVECHO "\n" ; HDSK_CFGTBL: ; DEVICE 0 diff --git a/Source/HBIOS/icm.asm b/Source/HBIOS/icm.asm index 79aab3fd..a0490cd4 100644 --- a/Source/HBIOS/icm.asm +++ b/Source/HBIOS/icm.asm @@ -31,6 +31,10 @@ ICM_PPIA .EQU ICMPPIBASE + 0 ; PORT A ICM_PPIB .EQU ICMPPIBASE + 1 ; PORT B ICM_PPIC .EQU ICMPPIBASE + 2 ; PORT C ICM_PPIX .EQU ICMPPIBASE + 3 ; PPI CONTROL PORT +; + DEVECHO "ICM: IO=" + DEVECHO ICMPPIBASE + DEVECHO "\n" ; ;__ICM_INIT__________________________________________________________________________________________ ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index aae7173e..388c3181 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -214,26 +214,26 @@ IDE_DEV0M: ; DEVICE 0, MASTER .DB IDE0DATHI ; IO BASE ADDRESS .DW IDE_DEV0S ; PARTNER ; - .ECHO "IDE: MODE=" + DEVECHO "IDE: MODE=" #IF (IDE0MODE == IDEMODE_NONE) - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (IDE0MODE == IDEMODE_DIO) - .ECHO "DIO" + DEVECHO "DIO" #ENDIF #IF (IDE0MODE == IDEMODE_DIDE) - .ECHO "DIDE" + DEVECHO "DIDE" #ENDIF #IF (IDE0MODE == IDEMODE_MK4) - .ECHO "MK4" + DEVECHO "MK4" #ENDIF #IF (IDE0MODE == IDEMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF - .ECHO ", IO=" - .ECHO IDE0BASE - .ECHO ", MASTER" - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IDE0BASE + DEVECHO ", MASTER" + DEVECHO "\n" ; IDE_DEV0S: ; DEVICE 0, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -249,26 +249,26 @@ IDE_DEV0S: ; DEVICE 0, SLAVE .DB IDE0DATHI ; IO BASE ADDRESS .DW IDE_DEV0M ; PARTNER ; - .ECHO "IDE: MODE=" + DEVECHO "IDE: MODE=" #IF (IDE0MODE == IDEMODE_NONE) - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (IDE0MODE == IDEMODE_DIO) - .ECHO "DIO" + DEVECHO "DIO" #ENDIF #IF (IDE0MODE == IDEMODE_DIDE) - .ECHO "DIDE" + DEVECHO "DIDE" #ENDIF #IF (IDE0MODE == IDEMODE_MK4) - .ECHO "MK4" + DEVECHO "MK4" #ENDIF #IF (IDE0MODE == IDEMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF - .ECHO ", IO=" - .ECHO IDE0BASE - .ECHO ", SLAVE" - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IDE0BASE + DEVECHO ", SLAVE" + DEVECHO "\n" #ENDIF ; #IF (IDECNT >= 2) @@ -287,26 +287,26 @@ IDE_DEV1M: ; DEVICE 1, MASTER .DB IDE1DATHI ; IO BASE ADDRESS .DW IDE_DEV1S ; PARTNER ; - .ECHO "IDE: MODE=" + DEVECHO "IDE: MODE=" #IF (IDE1MODE == IDEMODE_NONE) - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (IDE1MODE == IDEMODE_DIO) - .ECHO "DIO" + DEVECHO "DIO" #ENDIF #IF (IDE1MODE == IDEMODE_DIDE) - .ECHO "DIDE" + DEVECHO "DIDE" #ENDIF #IF (IDE1MODE == IDEMODE_MK4) - .ECHO "MK4" + DEVECHO "MK4" #ENDIF #IF (IDE1MODE == IDEMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF - .ECHO ", IO=" - .ECHO IDE1BASE - .ECHO ", MASTER" - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IDE1BASE + DEVECHO ", MASTER" + DEVECHO "\n" ; IDE_DEV1S: ; DEVICE 1, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -322,26 +322,26 @@ IDE_DEV1S: ; DEVICE 1, SLAVE .DB IDE1DATHI ; IO BASE ADDRESS .DW IDE_DEV1M ; PARTNER ; - .ECHO "IDE: MODE=" + DEVECHO "IDE: MODE=" #IF (IDE1MODE == IDEMODE_NONE) - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (IDE1MODE == IDEMODE_DIO) - .ECHO "DIO" + DEVECHO "DIO" #ENDIF #IF (IDE1MODE == IDEMODE_DIDE) - .ECHO "DIDE" + DEVECHO "DIDE" #ENDIF #IF (IDE1MODE == IDEMODE_MK4) - .ECHO "MK4" + DEVECHO "MK4" #ENDIF #IF (IDE1MODE == IDEMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF - .ECHO ", IO=" - .ECHO IDE1BASE - .ECHO ", SLAVE" - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IDE1BASE + DEVECHO ", SLAVE" + DEVECHO "\n" #ENDIF ; #IF (IDECNT >= 3) @@ -360,26 +360,26 @@ IDE_DEV2M: ; DEVICE 2, MASTER .DB IDE2DATHI ; IO BASE ADDRESS .DW IDE_DEV2S ; PARTNER ; - .ECHO "IDE: MODE=" + DEVECHO "IDE: MODE=" #IF (IDE2MODE == IDEMODE_NONE) - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (IDE2MODE == IDEMODE_DIO) - .ECHO "DIO" + DEVECHO "DIO" #ENDIF #IF (IDE2MODE == IDEMODE_DIDE) - .ECHO "DIDE" + DEVECHO "DIDE" #ENDIF #IF (IDE2MODE == IDEMODE_MK4) - .ECHO "MK4" + DEVECHO "MK4" #ENDIF #IF (IDE2MODE == IDEMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF - .ECHO ", IO=" - .ECHO IDE2BASE - .ECHO ", MASTER" - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IDE2BASE + DEVECHO ", MASTER" + DEVECHO "\n" ; IDE_DEV2S: ; DEVICE 2, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -395,26 +395,26 @@ IDE_DEV2S: ; DEVICE 2, SLAVE .DB IDE2DATHI ; IO BASE ADDRESS .DW IDE_DEV1M ; PARTNER ; - .ECHO "IDE: MODE=" + DEVECHO "IDE: MODE=" #IF (IDE2MODE == IDEMODE_NONE) - .ECHO "NONE" + DEVECHO "NONE" #ENDIF #IF (IDE2MODE == IDEMODE_DIO) - .ECHO "DIO" + DEVECHO "DIO" #ENDIF #IF (IDE2MODE == IDEMODE_DIDE) - .ECHO "DIDE" + DEVECHO "DIDE" #ENDIF #IF (IDE2MODE == IDEMODE_MK4) - .ECHO "MK4" + DEVECHO "MK4" #ENDIF #IF (IDE2MODE == IDEMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF - .ECHO ", IO=" - .ECHO IDE2BASE - .ECHO ", SLAVE" - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IDE2BASE + DEVECHO ", SLAVE" + DEVECHO "\n" #ENDIF ; #IF ($ - IDE_CFGTBL) != (IDE_DEVCNT * IDE_CFGSIZ) diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index d85a76cd..237c6ed4 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -1526,16 +1526,16 @@ IMM0_CFG: ; DEVICE 0 .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA ; - .ECHO "IMM: MODE=" + DEVECHO "IMM: MODE=" #IF (IMMMODE == IMMMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (IMMMODE == IMMMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO IMM0BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IMM0BASE + DEVECHO "\n" #ENDIF ; #IF (IMMCNT >= 2) @@ -1548,16 +1548,16 @@ IMM1_CFG: ; DEVICE 1 .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA ; - .ECHO "IMM: MODE=" + DEVECHO "IMM: MODE=" #IF (IMMMODE == IMMMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (IMMMODE == IMMMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO IMM1BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO IMM1BASE + DEVECHO "\n" #ENDIF ; #IF ($ - IMM_CFG) != (IMMCNT * IMM_CFGSIZ) diff --git a/Source/HBIOS/intrtc.asm b/Source/HBIOS/intrtc.asm index 8d65e2e2..49eb9573 100644 --- a/Source/HBIOS/intrtc.asm +++ b/Source/HBIOS/intrtc.asm @@ -5,7 +5,7 @@ ; INTRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) ; - .ECHO "INTRTC: ENABLED\n" + DEVECHO "INTRTC: ENABLED\n" ; ; RTC DEVICE INITIALIZATION ENTRY ; diff --git a/Source/HBIOS/kbd.asm b/Source/HBIOS/kbd.asm index 113c8aa1..67014d2b 100644 --- a/Source/HBIOS/kbd.asm +++ b/Source/HBIOS/kbd.asm @@ -56,7 +56,7 @@ KBD_STATUS .DB 0 ; CURRENT STATUS BITS (SEE ABOVE) KBD_REPEAT .DB 0 ; CURRENT REPEAT RATE KBD_IDLE .DB 0 ; IDLE COUNT ; - .ECHO "KBD: ENABLED\n" + DEVECHO "KBD: ENABLED\n" ; ;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION diff --git a/Source/HBIOS/kio.asm b/Source/HBIOS/kio.asm index 8c7867c7..bb7cd109 100644 --- a/Source/HBIOS/kio.asm +++ b/Source/HBIOS/kio.asm @@ -25,6 +25,10 @@ KIO_KIOCMD .EQU KIOBASE + $0E KIO_KIOCMDB .EQU KIOBASE + $0F ; ; +; + DEVECHO "KIO: IO=" + DEVECHO KIOBASE + DEVECHO "\n" ; KIO_PREINIT: CALL KIO_DETECT diff --git a/Source/HBIOS/lpt.asm b/Source/HBIOS/lpt.asm index 73f26b5e..917a5a38 100644 --- a/Source/HBIOS/lpt.asm +++ b/Source/HBIOS/lpt.asm @@ -421,16 +421,16 @@ LPT0_CFG: .DB LPT0BASE ; BASE PORT .DW 0 ; LINE CONFIGURATION ; - .ECHO "LPT: MODE=" + DEVECHO "LPT: MODE=" #IF (LPTMODE == LPTMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (LPTMODE == LPTMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO LPT0BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO LPT0BASE + DEVECHO "\n" ; LPT_CFGSIZ .EQU $ - LPT_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -444,16 +444,16 @@ LPT1_CFG: .DB LPT1BASE ; BASE PORT .DW 0 ; LINE CONFIGURATION ; - .ECHO "LPT: MODE=" + DEVECHO "LPT: MODE=" #IF (LPTMODE == LPTMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (LPTMODE == LPTMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO LPT1BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO LPT1BASE + DEVECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 6e8adbb8..0d8b3378 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -40,7 +40,7 @@ MD_CFGTBL: .DB MID_MDRAM ; DEVICE MEDIA ID .DB MD_ARAM ; DEVICE ATTRIBUTE ; - .ECHO "MD: TYPE=RAM\n" + DEVECHO "MD: TYPE=RAM\n" #ENDIF ; #IF (MDROM) @@ -51,7 +51,7 @@ MD_CFGTBL: .DB MID_MDROM ; DEVICE MEDIA ID .DB MD_AROM ; DEVICE ATTRIBUTE ; - .ECHO "MD: TYPE=ROM\n" + DEVECHO "MD: TYPE=ROM\n" #ENDIF ; MD_DEVCNT .EQU ($ - MD_CFGTBL) / MD_CFGSIZ diff --git a/Source/HBIOS/mky.asm b/Source/HBIOS/mky.asm index 0a86dd16..34650e82 100644 --- a/Source/HBIOS/mky.asm +++ b/Source/HBIOS/mky.asm @@ -177,6 +177,11 @@ SCANCODE_TBL: .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 + + DEVECHO "MKY: IO=" + DEVECHO MKY_REGA + DEVECHO "\n" + ;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION ;__________________________________________________________________________________________________ diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index 212d0f35..b8ecfb9a 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -4,6 +4,11 @@ ;================================================================================================== NABU_INT1CLR .EQU $68 NABU_TICCNT .EQU $FFEA ; TICCNT AT $FFEA IS COPIED DOWN TO $000B +; + DEVECHO "NABU: IO=" + DEVECHO NABU_INT1CLR + DEVECHO "\n" + ; ; ; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION diff --git a/Source/HBIOS/nabukb.asm b/Source/HBIOS/nabukb.asm index 873bd79c..9bcaf745 100644 --- a/Source/HBIOS/nabukb.asm +++ b/Source/HBIOS/nabukb.asm @@ -45,6 +45,10 @@ ; CALL SUB12 ; NABUKB_DAT .EQU $90 +; + DEVECHO "NABUKB: IO=" + DEVECHO NABUKB_DAT + DEVECHO "\n" ; NABUKB_INIT: CALL NEWLINE diff --git a/Source/HBIOS/pcf.asm b/Source/HBIOS/pcf.asm index 92023bc9..c8c0eaa1 100644 --- a/Source/HBIOS/pcf.asm +++ b/Source/HBIOS/pcf.asm @@ -94,9 +94,9 @@ PCF_ACKTO .EQU 65000 PCF_BBTO .EQU 65000 PCF_LABDLY .EQU 65000 ; - .ECHO "PCF: IO=" - .ECHO PCF_BASE - .ECHO "\n" + DEVECHO "PCF: IO=" + DEVECHO PCF_BASE + DEVECHO "\n" ; ; DATA PORT REGISTERS ; diff --git a/Source/HBIOS/pio.asm b/Source/HBIOS/pio.asm index 1dc823a9..444fb64b 100644 --- a/Source/HBIOS/pio.asm +++ b/Source/HBIOS/pio.asm @@ -308,9 +308,9 @@ PIO0A_CFG: .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO0A_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "PIO: IO=" - .ECHO PIO0BASE - .ECHO ", CHANNEL A\n" + DEVECHO "PIO: IO=" + DEVECHO PIO0BASE + DEVECHO ", CHANNEL A\n" ; PIO_CFGSIZ .EQU $ - PIO_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -324,9 +324,9 @@ PIO0B_CFG: .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO0B_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "PIO: IO=" - .ECHO PIO0BASE - .ECHO ", CHANNEL B\n" + DEVECHO "PIO: IO=" + DEVECHO PIO0BASE + DEVECHO ", CHANNEL B\n" ; #IF (PIOCNT >= 2) ; @@ -340,9 +340,9 @@ PIO1A_CFG: .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO1A_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "PIO: IO=" - .ECHO PIO1BASE - .ECHO ", CHANNEL A\n" + DEVECHO "PIO: IO=" + DEVECHO PIO1BASE + DEVECHO ", CHANNEL A\n" ; ; PIO1 CHANNEL B PIO1B_CFG: @@ -354,9 +354,9 @@ PIO1B_CFG: .DW DEFSERCFG ; LINE CONFIGURATION .DW PIO1B_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "PIO: IO=" - .ECHO PIO1BASE - .ECHO ", CHANNEL B\n" + DEVECHO "PIO: IO=" + DEVECHO PIO1BASE + DEVECHO ", CHANNEL B\n" ; #ENDIF ; diff --git a/Source/HBIOS/pkd.asm b/Source/HBIOS/pkd.asm index fbaa6317..5da7dda4 100644 --- a/Source/HBIOS/pkd.asm +++ b/Source/HBIOS/pkd.asm @@ -66,9 +66,9 @@ PKD_CMD_FIFO .EQU %01000000 ; READ FIFO ; PKD_PRESCL .EQU PKDOSC/100000 ; PRESCALER ; - .ECHO "PKD: IO=" - .ECHO PKDPPIBASE - .ECHO "\n" + DEVECHO "PKD: IO=" + DEVECHO PKDPPIBASE + DEVECHO "\n" ; ;__PKD_PREINIT_______________________________________________________________________________________ ; diff --git a/Source/HBIOS/ppa.asm b/Source/HBIOS/ppa.asm index e13493d8..0b6da099 100644 --- a/Source/HBIOS/ppa.asm +++ b/Source/HBIOS/ppa.asm @@ -1386,16 +1386,16 @@ PPA0_CFG: ; DEVICE 0 .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA ; - .ECHO "PPA: MODE=" + DEVECHO "PPA: MODE=" #IF (PPAMODE == PPAMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (PPAMODE == PPAMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO PPA0BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO PPA0BASE + DEVECHO "\n" #ENDIF ; #IF (PPACNT >= 2) @@ -1408,16 +1408,16 @@ PPA1_CFG: ; DEVICE 1 .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA ; - .ECHO "PPA: MODE=" + DEVECHO "PPA: MODE=" #IF (PPAMODE == PPAMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (PPAMODE == PPAMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO PPA1BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO PPA1BASE + DEVECHO "\n" #ENDIF ; #IF ($ - PPA_CFG) != (PPACNT * PPA_CFGSIZ) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index d70ede57..de956828 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -230,10 +230,10 @@ PPIDE_DEV0M: ; DEVICE 0, MASTER .DB PPIDE0BASE+3 ; PPI .DW PPIDE_DEV0S ; PARTNER ; - .ECHO "PPIDE: IO=" - .ECHO PPIDE0BASE - .ECHO ", MASTER" - .ECHO "\n" + DEVECHO "PPIDE: IO=" + DEVECHO PPIDE0BASE + DEVECHO ", MASTER" + DEVECHO "\n" ; PPIDE_DEV0S: ; DEVICE 0, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -248,10 +248,10 @@ PPIDE_DEV0S: ; DEVICE 0, SLAVE .DB PPIDE0BASE+3 ; PPI .DW PPIDE_DEV0M ; PARTNER ; - .ECHO "PPIDE: IO=" - .ECHO PPIDE0BASE - .ECHO ", SLAVE" - .ECHO "\n" + DEVECHO "PPIDE: IO=" + DEVECHO PPIDE0BASE + DEVECHO ", SLAVE" + DEVECHO "\n" ; #ENDIF ; @@ -270,10 +270,10 @@ PPIDE_DEV1M: ; DEVICE 1, MASTER .DB PPIDE1BASE+3 ; PPI .DW PPIDE_DEV1S ; PARTNER ; - .ECHO "PPIDE: IO=" - .ECHO PPIDE1BASE - .ECHO ", MASTER" - .ECHO "\n" + DEVECHO "PPIDE: IO=" + DEVECHO PPIDE1BASE + DEVECHO ", MASTER" + DEVECHO "\n" ; PPIDE_DEV1S: ; DEVICE 1, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -288,10 +288,10 @@ PPIDE_DEV1S: ; DEVICE 1, SLAVE .DB PPIDE1BASE+3 ; PPI .DW PPIDE_DEV1M ; PARTNER ; - .ECHO "PPIDE: IO=" - .ECHO PPIDE1BASE - .ECHO ", SLAVE" - .ECHO "\n" + DEVECHO "PPIDE: IO=" + DEVECHO PPIDE1BASE + DEVECHO ", SLAVE" + DEVECHO "\n" ; #ENDIF ; @@ -310,10 +310,10 @@ PPIDE_DEV2M: ; DEVICE 2, MASTER .DB PPIDE2BASE+3 ; PPI .DW PPIDE_DEV2S ; PARTNER ; - .ECHO "PPIDE: IO=" - .ECHO PPIDE2BASE - .ECHO ", MASTER" - .ECHO "\n" + DEVECHO "PPIDE: IO=" + DEVECHO PPIDE2BASE + DEVECHO ", MASTER" + DEVECHO "\n" ; PPIDE_DEV2S: ; DEVICE 2, SLAVE .DB $FE ; DRIVER DEVICE NUMBER (FILLED DYNAMICALLY) @@ -328,10 +328,10 @@ PPIDE_DEV2S: ; DEVICE 2, SLAVE .DB PPIDE2BASE+3 ; PPI .DW PPIDE_DEV2M ; PARTNER ; - .ECHO "PPIDE: IO=" - .ECHO PPIDE2BASE - .ECHO ", SLAVE" - .ECHO "\n" + DEVECHO "PPIDE: IO=" + DEVECHO PPIDE2BASE + DEVECHO ", SLAVE" + DEVECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/ppk.asm b/Source/HBIOS/ppk.asm index 3c8dbb0a..50ac9a98 100644 --- a/Source/HBIOS/ppk.asm +++ b/Source/HBIOS/ppk.asm @@ -60,7 +60,7 @@ PPK_REPEAT .DB 0 ; CURRENT REPEAT RATE PPK_IDLE .DB 0 ; IDLE COUNT PPK_WAITTO .DW 0 ; TIMEOUT WAIT LOOP COUNT (COMPUTED IN INIT) ; - .ECHO "PPK: ENABLED\n" + DEVECHO "PPK: ENABLED\n" ; ;__________________________________________________________________________________________________ ; KEYBOARD INITIALIZATION diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 2ebcad99..9b1c1301 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -9,9 +9,9 @@ PPP_IO .EQU PPPBASE + 0 ; PPP DATA I/O (PPI PORT A) PPP_CTL .EQU PPPBASE + 2 ; PPP CTL LINES (PPI PORT C) PPP_PPICTL .EQU PPPBASE + 3 ; PPI CONTROL PORT ; - .ECHO "PPP: IO=" - .ECHO PPP_IO - .ECHO "\n" + DEVECHO "PPP: IO=" + DEVECHO PPP_IO + DEVECHO "\n" ; ; COMMAND BYTES ; @@ -253,7 +253,7 @@ PPP_FWVER .DB $00, $00, $00, $00 ; MMNNBBB (M=MAJOR, N=MINOR, B=BUILD) PPPCON_ROWS .EQU 29 ; PROPELLER VGA DISPLAY ROWS (30 - 1 STATUS LINES) PPPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS ; - .ECHO "PPPCON: ENABLED\n" + DEVECHO "PPPCON: ENABLED\n" ; PPPCON_INIT: CALL NEWLINE @@ -420,7 +420,7 @@ PPPSD_CFGTBL: ; .DB $FF ; END MARKER ; - .ECHO "PPPSD: ENABLED\n" + DEVECHO "PPPSD: ENABLED\n" ; ; SD CARD INITIALIZATION ; diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index 38849dce..6cc98ff2 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -7,9 +7,9 @@ ; PRP_IOBASE .EQU $A8 ; - .ECHO "PRP: IO=" - .ECHO PRP_IOBASE - .ECHO "\n" + DEVECHO "PRP: IO=" + DEVECHO PRP_IOBASE + DEVECHO "\n" ; ; GLOBAL PROPIO INITIALIZATION ; @@ -124,7 +124,7 @@ PRPCON_DSPRDY .EQU $10 ; BIT SET WHEN DISPLAY BUF IS READY FOR A BYTE (BUF EMPT PRPCON_ROWS .EQU 29 ; PROPELLER VGA DISPLAY ROWS (30 - 1 STATUS LINES) PRPCON_COLS .EQU 80 ; PROPELLER VGA DISPLAY COLS ; - .ECHO "PRPCON: ENABLED\n" + DEVECHO "PRPCON: ENABLED\n" ; ; ; @@ -317,7 +317,7 @@ PRPSD_CFGTBL: ; .DB $FF ; END MARKER ; - .ECHO "PRPSD: ENABLED\n" + DEVECHO "PRPSD: ENABLED\n" ; ; SD CARD INITIALIZATION ; diff --git a/Source/HBIOS/rf.asm b/Source/HBIOS/rf.asm index 29d9dabc..cd804074 100644 --- a/Source/HBIOS/rf.asm +++ b/Source/HBIOS/rf.asm @@ -43,9 +43,9 @@ RF_CFGTBL: .DB 0 ; UNUSED .DB RF_U0IO ; DEVICE BASE ADDR ; - .ECHO "RF: IO=" - .ECHO RF_U0IO - .ECHO "\n" + DEVECHO "RF: IO=" + DEVECHO RF_U0IO + DEVECHO "\n" ; #IF (RF_DEVCNT > 1) ; DEVICE 1 @@ -56,9 +56,9 @@ RF_CFGTBL: .DB RF_U1IO ; DEVICE BASE ADDR #ENDIF ; - .ECHO "RF: IO=" - .ECHO RF_U1IO - .ECHO "\n" + DEVECHO "RF: IO=" + DEVECHO RF_U1IO + DEVECHO "\n" ; #IF (RF_DEVCNT > 2) ; DEVICE 2 @@ -69,9 +69,9 @@ RF_CFGTBL: .DB RF_U2IO ; DEVICE BASE ADDR #ENDIF ; - .ECHO "RF: IO=" - .ECHO RF_U2IO - .ECHO "\n" + DEVECHO "RF: IO=" + DEVECHO RF_U2IO + DEVECHO "\n" ; #IF (RF_DEVCNT > 3) ; DEVICE 3 @@ -81,9 +81,9 @@ RF_CFGTBL: .DB 0 ; UNUSED .DB RF_U3IO ; DEVICE BASE ADDR ; - .ECHO "RF: IO=" - .ECHO RF_U3IO - .ECHO "\n" + DEVECHO "RF: IO=" + DEVECHO RF_U3IO + DEVECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 021efe85..4d4395d8 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -148,7 +148,7 @@ start: ld bc,$01FB ; UNA func: set bank ld de,BID_USR ; select user bank rst 08 ; do it - ld (bid_ldr),de ; ... for later + ld (bid_ldr),de ; save previous bank for later bit 7,d ; starting from ROM? #endif ; @@ -156,6 +156,8 @@ start: ld hl,ra_tbl ; assume ROM startup jr z,start1 ; if so, ra_tbl OK, skip ahead ld hl,ra_tbl_app ; not ROM boot, get app tbl loc + ld a,$ff ; signal for app boot + ld (appboot),a ; ... goes in flag start1: ld (ra_tbl_loc),hl ; and overlay pointer ; @@ -206,6 +208,10 @@ start1: call nl2 ; formatting ld hl,str_banner ; display boot banner call pstr ; do it + ld a,(appboot) ; get app boot flag + or a ; set flags + ld hl,str_appboot ; signal application boot mode + call nz,pstr ; print if app boot active call clrbuf ; zero fill the cmd buffer ; #if ((BIOS == BIOS_WBW) & FPSW_ENABLE) @@ -398,7 +404,6 @@ conpoll4: ;======================================================================= ; concmd: - call clrled ; clear LEDs ; #if (DSKYENABLE) call dsky_highlightkeysoff @@ -617,7 +622,6 @@ fp_flopboot2: #if (DSKYENABLE) ; dskycmd: - call clrled ; clear LEDs ; call dsky_getkey ; get DSKY key ld a,e ; put in A @@ -1474,37 +1478,6 @@ str_s100con .db "\r\n\r\nConsole on S100 Bus",0 ; Utility functions ;======================================================================= ; -; Clear LEDs -; -clrled: -#if (BIOS == BIOS_WBW) - #if (FPLED_ENABLE) - ld b,BF_SYSSET ; HBIOS SysGet - ld c,BF_SYSSET_PANEL ; ... Panel swiches value - ld l,$00 ; all LEDs off - rst 08 ; do it - #endif - #if (LEDENABLE) - #if (LEDMODE == LEDMODE_STD) - ld a,$FF ; led is inverted - out (LEDPORT),a ; clear led - #endif - #if (LEDMODE == LEDMODE_RTC) - ; Bits 0 and 1 of the RTC latch are for the LEDs. - ld a,(HB_RTCVAL) - and ~%00000011 - out (RTCIO),a ; clear led - ld (HB_RTCVAL),a - #endif - #if (LEDMODE == LEDMODE_NABU) - ; Bits 0 and 1 of the RTC latch are for the LEDs. - xor a - out (LEDPORT),a - #endif - #endif -#endif - ret -; ; Print string at HL on console, null terminated ; pstr: @@ -2320,6 +2293,7 @@ acmd_to .dw BOOT_TIMEOUT ; auto cmd timeout ;======================================================================= ; str_banner .db PLATFORM_NAME," Boot Loader",0 +str_appboot .db " (App Boot)",0 str_autoboot .db "AutoBoot: ",0 str_prompt .db "Boot [H=Help]: ",0 str_bs .db bs,' ',bs,0 @@ -2435,7 +2409,7 @@ ra_ent .equ 12 ; be pre-loaded into the currently executing ram bank thereby allowing ; those images to be dynamically loaded as well. To support this ; concept, a pseudo-bank called bid_cur is used to specify the images -; normally found in BID_IMG0. In romload, this special value will cause +; normally found in BID_IMG0. This special value will cause ; the associated image to be loaded from the currently executing bank ; which will be correct regardless of the load mode. Images in other ; banks (BID_IMG1) will always be loaded directly from ROM. @@ -2514,6 +2488,7 @@ dma .dw 0 ; address for load sps .dw 0 ; sectors per slice mediaid .db 0 ; media id ; +appboot .db 0 ; app boot if != 0 ra_tbl_loc .dw 0 ; points to active ra_tbl bootunit .db 0 ; boot disk unit bootslice .db 0 ; boot disk slice diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index fe1d5e90..66753fcc 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -55,9 +55,9 @@ MODE_RAM1 .EQU 3 MD_TIME .EQU 8 MD_ALRM .EQU 4 - .ECHO "RP5C01: IO=" - .ECHO RP5RTC_REG - .ECHO "\n" + DEVECHO "RP5C01: IO=" + DEVECHO RP5RTC_REG + DEVECHO "\n" RP5RTC_INIT: LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? diff --git a/Source/HBIOS/scon.asm b/Source/HBIOS/scon.asm index 749175bb..1d3b4a5d 100644 --- a/Source/HBIOS/scon.asm +++ b/Source/HBIOS/scon.asm @@ -16,9 +16,9 @@ SCON_DSPRDY .EQU %00000100 SCON_COLS .EQU 80 SCON_ROWS .EQU 40 ; - .ECHO "SCON: IO=" - .ECHO SCON_IOBASE - .ECHO "\n" + DEVECHO "SCON: IO=" + DEVECHO SCON_IOBASE + DEVECHO "\n" ; ; ; diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 88904021..f96abca5 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -117,7 +117,7 @@ SD_NOPULLUP .EQU TRUE ; ASSUME NO PULLUP ; SD_DEVCNT .EQU SDCNT ; SET SD_DEVCNT TO SDCNT CONFIG VAR ; - .ECHO "SD: MODE=" + DEVECHO "SD: MODE=" ; #IF (SDMODE == SDMODE_JUHA) ; JUHA MINI-BOARD SD_DEVMAX .EQU 1 ; NUMBER OF PHYSICAL UNITS (SOCKETS) @@ -131,7 +131,7 @@ SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS - .ECHO "JUHA" + DEVECHO "JUHA" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -148,7 +148,7 @@ SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %01000000 ; RTC:6 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS - .ECHO "N8" + DEVECHO "N8" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -163,7 +163,7 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS - .ECHO "CSIO" + DEVECHO "CSIO" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF @@ -184,7 +184,7 @@ SD_DI .EQU %00000001 ; PPIC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; PPIB:7 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_PPIBASE ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS - .ECHO "PPI" + DEVECHO "PPI" #ENDIF ; #IF (SDMODE == SDMODE_UART) @@ -199,7 +199,7 @@ SD_DI .EQU %00000001 ; UART MCR:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %00100000 ; UART MSR:5 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU UARTIOB ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS - .ECHO "UART" + DEVECHO "UART" #ENDIF ; #IF (SDMODE == SDMODE_DSD) ; DUAL SD @@ -215,7 +215,7 @@ SD_DI .EQU %00000001 ; RTC:6 IS DATA IN (CARD <- CPU) SD_DO .EQU %00000001 ; RTC:0 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS - .ECHO "DSD" + DEVECHO "DSD" #ENDIF ; #IF (SDMODE == SDMODE_MK4) ; MARK IV (CSIO STYLE INTERFACE) @@ -227,7 +227,7 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS - .ECHO "MK4" + DEVECHO "MK4" #ENDIF ; #IF (SDMODE == SDMODE_SC) ; SC @@ -241,16 +241,10 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS - .ECHO "SC" + DEVECHO "SC" ; RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF -; - .ECHO ", IO=" - .ECHO SD_IOBASE - .ECHO ", UNITS=" - .ECHO SDCNT - .ECHO "\n" ; #IF (SDMODE == SDMODE_MT) ; MT shift register for RCBUS (ref SDMODE_CSIO) ; @@ -300,6 +294,7 @@ SD_CS1 .EQU %00010000 ; IN/OUT:SD_OPREG:4 = CS1, SDCARD1 CS, IN=1 Card present #ENDIF SD_IOBASE .EQU SD_BASE ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + DEVECHO "DUO" #ENDIF ; ; @@ -332,6 +327,7 @@ SD_CINIT .EQU TRUE ; INITIALIZE OUTPUT PORT SD_DDR .EQU $6B ; DATA DIRECTION REGISTER SD_DDRVAL .EQU %11100110 ; DATA DIRECTION REGISTER VALUE SD_INVCS .EQU TRUE ; INVERT CS + DEVECHO "PIO" #ENDIF ; ; @@ -355,6 +351,7 @@ SD_CINIT .EQU TRUE ; INITIALIZE OUTPUT PORT SD_DDR .EQU $03 ; DATA DIRECTION REGISTER SD_DDRVAL .EQU %00001101 ; DATA DIRECTION REGISTER VALUE SD_INVCS .EQU FALSE ; INVERT CS + DEVECHO "USR" #ENDIF ; #IF (SDMODE == SDMODE_Z80R) ; Z80 Retro @@ -376,6 +373,7 @@ SD_DI .EQU %00000001 ; DATA IN (CARD <- CPU) MOSI SD_DO .EQU %00000001 ; DATA OUT (CARD -> CPU) MISO SD_CINIT .EQU FALSE ; INITIALIZE OUTPUT PORT SD_INVCS .EQU FALSE ; INVERT CS + DEVECHO "Z80R" #ENDIF ; FOR NOW WE JUST HOOK UP ONE UNIT. THERE ARE EIGHT PORTS FOR DIFFERENT @@ -389,7 +387,14 @@ SD_CNTR .EQU Z180_CNTR SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU FALSE ; INVERT CS + DEVECHO "EPITX" #ENDIF +; + DEVECHO ", IO=" + DEVECHO SD_IOBASE + DEVECHO ", UNITS=" + DEVECHO SDCNT + DEVECHO "\n" ; #IF (SD_DEVCNT > SD_DEVMAX) .ECHO "*** ERROR: SDCNT EXCEEDS MAXIMUM SUPPORTED BY INTERFACE!!!\n" diff --git a/Source/HBIOS/simrtc.asm b/Source/HBIOS/simrtc.asm index 69943d35..17cc2c3d 100644 --- a/Source/HBIOS/simrtc.asm +++ b/Source/HBIOS/simrtc.asm @@ -8,9 +8,9 @@ SIMRTC_CLKREAD .EQU 7 ; READ CLOCK COMMAND SIMRTC_CLKWRITE .EQU 8 ; WRITE CLOCK COMMAND SIMRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) ; - .ECHO "SIMRTC: IO=" - .ECHO SIMRTC_IO - .ECHO "\n" + DEVECHO "SIMRTC: IO=" + DEVECHO SIMRTC_IO + DEVECHO "\n" ; ; RTC DEVICE INITIALIZATION ENTRY ; diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index 3cf5a52b..0274a66e 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -1171,30 +1171,30 @@ SIO0A_CFG: .DB SIO0ACTCC ; CTC CHANNEL .DB SIO0MODE ; MODE ; - .ECHO "SIO MODE=" + DEVECHO "SIO MODE=" #IF (SIO0MODE == SIOMODE_STD) - .ECHO "STD" + DEVECHO "STD" #ENDIF #IF (SIO0MODE == SIOMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF #IF (SIO0MODE == SIOMODE_SMB) - .ECHO "SMB" + DEVECHO "SMB" #ENDIF #IF (SIO0MODE == SIOMODE_ZP) - .ECHO "ZP" + DEVECHO "ZP" #ENDIF #IF (SIO0MODE == SIOMODE_Z80R) - .ECHO "Z80R" + DEVECHO "Z80R" #ENDIF - .ECHO ", IO=" - .ECHO SIO0BASE - .ECHO ", CHANNEL A" + DEVECHO ", IO=" + DEVECHO SIO0BASE + DEVECHO ", CHANNEL A" #IF (INTMODE > 0) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; SIO_CFGSIZ .EQU $ - SIO_CFG ; SIZE OF ONE CFG TABLE ENTRY ; @@ -1212,29 +1212,29 @@ SIO0B_CFG: .DB SIO0BCTCC ; CTC CHANNEL .DB SIO0MODE ; MODE ; - .ECHO "SIO MODE=" + DEVECHO "SIO MODE=" #IF (SIO0MODE == SIOMODE_STD) - .ECHO "STD" + DEVECHO "STD" #ENDIF #IF (SIO0MODE == SIOMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF #IF (SIO0MODE == SIOMODE_SMB) - .ECHO "SMB" + DEVECHO "SMB" #ENDIF #IF (SIO0MODE == SIOMODE_ZP) - .ECHO "ZP" + DEVECHO "ZP" #ENDIF #IF (SIO0MODE == SIOMODE_Z80R) - .ECHO "Z80R" + DEVECHO "Z80R" #ENDIF - .ECHO ", IO=" - .ECHO SIO0BASE - .ECHO ", CHANNEL B" + DEVECHO ", IO=" + DEVECHO SIO0BASE + DEVECHO ", CHANNEL B" #IF (INTMODE > 0) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; #IF (SIOCNT >= 2) ; @@ -1252,30 +1252,30 @@ SIO1A_CFG: .DB SIO1ACTCC ; CTC CHANNEL .DB SIO1MODE ; MODE ; - .ECHO "SIO MODE=" + DEVECHO "SIO MODE=" #IF (SIO1MODE == SIOMODE_STD) - .ECHO "STD" + DEVECHO "STD" #ENDIF #IF (SIO1MODE == SIOMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF #IF (SIO1MODE == SIOMODE_SMB) - .ECHO "SMB" + DEVECHO "SMB" #ENDIF #IF (SIO1MODE == SIOMODE_ZP) - .ECHO "ZP" + DEVECHO "ZP" #ENDIF #IF (SIO1MODE == SIOMODE_Z80R) - .ECHO "Z80R" + DEVECHO "Z80R" #ENDIF - .ECHO ", IO=" - .ECHO SIO1BASE - .ECHO ", CHANNEL A" + DEVECHO ", IO=" + DEVECHO SIO1BASE + DEVECHO ", CHANNEL A" #IF (INTMODE > 0) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; ; SIO1 CHANNEL B SIO1B_CFG: @@ -1291,29 +1291,29 @@ SIO1B_CFG: .DB SIO1BCTCC ; CTC CHANNEL .DB SIO1MODE ; MODE ; - .ECHO "SIO MODE=" + DEVECHO "SIO MODE=" #IF (SIO1MODE == SIOMODE_STD) - .ECHO "STD" + DEVECHO "STD" #ENDIF #IF (SIO1MODE == SIOMODE_RC) - .ECHO "RC" + DEVECHO "RC" #ENDIF #IF (SIO1MODE == SIOMODE_SMB) - .ECHO "SMB" + DEVECHO "SMB" #ENDIF #IF (SIO1MODE == SIOMODE_ZP) - .ECHO "ZP" + DEVECHO "ZP" #ENDIF #IF (SIO1MODE == SIOMODE_Z80R) - .ECHO "Z80R" + DEVECHO "Z80R" #ENDIF - .ECHO ", IO=" - .ECHO SIO1BASE - .ECHO ", CHANNEL B" + DEVECHO ", IO=" + DEVECHO SIO1BASE + DEVECHO ", CHANNEL B" #IF (INTMODE > 0) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/sn76489.asm b/Source/HBIOS/sn76489.asm index 413b0883..6f31de33 100644 --- a/Source/HBIOS/sn76489.asm +++ b/Source/HBIOS/sn76489.asm @@ -17,33 +17,33 @@ ;====================================================================== ; - .ECHO "SN76489 MODE=" + DEVECHO "SN76489 MODE=" ; #IF (SNMODE == SNMODE_VGM) SN76489_PORT_LEFT .EQU $C6 ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $C7 ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) - .ECHO "VGM" + DEVECHO "VGM" #ENDIF ; #IF (SNMODE == SNMODE_RC) SN76489_PORT_LEFT .EQU $FF ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $FB ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) - .ECHO "RC" + DEVECHO "RC" #ENDIF ; #IF (SNMODE == SNMODE_DUO) SN76489_PORT_LEFT .EQU $BE ; PORTS FOR ACCESSING THE SN76489 CHIP (LEFT) SN76489_PORT_RIGHT .EQU $BF ; PORTS FOR ACCESSING THE SN76489 CHIP (RIGHT) - .ECHO "RC" + DEVECHO "RC" #ENDIF ; - .ECHO ", IO_LEFT=" - .ECHO SN76489_PORT_LEFT - .ECHO ", IO_RIGHT=" - .ECHO SN76489_PORT_RIGHT - .ECHO ", CLOCK=" - .ECHO SN7CLK - .ECHO " HZ\n" + DEVECHO ", IO_LEFT=" + DEVECHO SN76489_PORT_LEFT + DEVECHO ", IO_RIGHT=" + DEVECHO SN76489_PORT_RIGHT + DEVECHO ", CLOCK=" + DEVECHO SN7CLK + DEVECHO " HZ\n" ; SN7_IDAT .EQU 0 SN7_TONECNT .EQU 3 ; COUNT NUMBER OF TONE CHANNELS diff --git a/Source/HBIOS/spk.asm b/Source/HBIOS/spk.asm index 780ca4b8..302a7990 100644 --- a/Source/HBIOS/spk.asm +++ b/Source/HBIOS/spk.asm @@ -41,9 +41,9 @@ SP_PENDING_PERIOD .DW SP_NOTE_C8 ; PENDING PERIOD (16 BITS) SP_PENDING_VOLUME .DB $FF ; PENDING VOL (8 BITS) SP_PENDING_DURATION .DW 0 ; PENDING DURATION (16 BITS) ; - .ECHO "SPK: IO=" - .ECHO RTCIO - .ECHO "\n" + DEVECHO "SPK: IO=" + DEVECHO RTCIO + DEVECHO "\n" ; ;====================================================================== ; DRIVER INITIALIZATION diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 62bc7b72..74de2d49 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -34,6 +34,14 @@ FALSE .EQU 0 TRUE .EQU ~FALSE ; +; CONTROLS PRINTING OF SYSTEM INFORMATION IN ASSEMBLY OUTPUT +; +#IFDEF SYSINFO + #DEFINE SYSECHO .ECHO +#ELSE + #DEFINE SYSECHO \; +#ENDIF +; ; DEBUGGING OPTIONS ; USENONE .EQU 0 ; NO DEBUG @@ -147,8 +155,9 @@ CONBELL_IOBIT .EQU 2 ; LEDMODE_NONE .EQU 0 LEDMODE_STD .EQU 1 -LEDMODE_RTC .EQU 2 -LEDMODE_NABU .EQU 3 +LEDMODE_SC .EQU 2 +LEDMODE_RTC .EQU 3 +LEDMODE_NABU .EQU 4 ; ; DSKY MODE SELECTIONS ; @@ -564,24 +573,20 @@ CPUKHZ .SET CPUKHZ / 2 ; Z180 PHI IS ALWAYS 1/2 OSC ; CPUMHZ .EQU CPUKHZ / 1000 ; CPU FREQ IN MHZ ; - .ECHO "ASSUMED CPU SPEED: " - .ECHO CPUKHZ - .ECHO " KHZ\n" -; - .ECHO "INTERRUPTS: " + SYSECHO "INTERRUPTS: " #IF (INTMODE == 0) - .ECHO "NONE" + SYSECHO "NONE" #ENDIF #IF (INTMODE == 1) - .ECHO "MODE 1" + SYSECHO "MODE 1" #ENDIF #IF (INTMODE == 2) - .ECHO "MODE 2" + SYSECHO "MODE 2" #ENDIF #IF (INTMODE == 3) - .ECHO "MODE 3" + SYSECHO "MODE 3" #ENDIF - .ECHO "\n" + SYSECHO "\n" ; ; SYSTEM PERIODIC TIMER MODE ; @@ -594,110 +599,110 @@ TM_SIMH .EQU 3 TM_Z180 .EQU 4 TM_Z280 .EQU 5 ; - .ECHO "SYSTEM TIMER:" + SYSECHO "SYSTEM TIMER:" SYSTIM .EQU TM_NONE ; #IF (CTCENABLE & (INTMODE == 2)) #IF (CTCTIMER) SYSTIM .SET TM_CTC - .ECHO " CTC" + SYSECHO " CTC" #ENDIF #ENDIF ; #IF (TMSENABLE & (INTMODE == 1)) #IF (TMSTIMENABLE) SYSTIM .SET TM_TMS - .ECHO " TMS9918/V9958" + SYSECHO " TMS9918/V9958" #ENDIF #ENDIF ; #IF ((PLATFORM == PLT_SBC) & (INTMODE == 1)) #IF (HTIMENABLE) SYSTIM .SET TM_SIMH - .ECHO " SIMH" + SYSECHO " SIMH" #ENDIF #ENDIF ; #IF ((CPUFAM == CPU_Z180) & (INTMODE == 2)) #IF (Z180_TIMER) SYSTIM .SET TM_Z180 - .ECHO " Z180" + SYSECHO " Z180" #ENDIF #ENDIF ; #IF ((CPUFAM == CPU_Z280) & (MEMMGR == MM_Z280)) #IF (Z280_TIMER) SYSTIM .SET TM_Z280 - .ECHO " Z280" + SYSECHO " Z280" #ENDIF #ENDIF ; #IF SYSTIM == TM_NONE - .ECHO " NONE" + SYSECHO " NONE" #ENDIF ; - .ECHO "\n" + SYSECHO "\n" ; #ENDIF ; #IF (BIOS == BIOS_WBW) - .ECHO "DEFAULT SERIAL CONFIGURATION: " + SYSECHO "DEFAULT SERIAL CONFIGURATION: " #IF ((DEFSERCFG & %1111100000000) == SER_BAUD9600 - .ECHO "9600" + SYSECHO "9600" #ENDIF #IF ((DEFSERCFG & %1111100000000) == SER_BAUD38400 - .ECHO "38400" + SYSECHO "38400" #ENDIF #IF ((DEFSERCFG & %1111100000000) == SER_BAUD57600 - .ECHO "57600" + SYSECHO "57600" #ENDIF #IF ((DEFSERCFG & %1111100000000) == SER_BAUD115200 - .ECHO "115200" + SYSECHO "115200" #ENDIF - .ECHO " BAUD\n" + SYSECHO " BAUD\n" #ENDIF ; ; ; #IF (BIOS == BIOS_WBW) - .ECHO "MEMORY MANAGER: " + SYSECHO "MEMORY MANAGER: " #IF (MEMMGR == MM_SBC) - .ECHO "N8VEM (SBC)" + SYSECHO "N8VEM (SBC)" #ENDIF #IF (MEMMGR == MM_Z2) - .ECHO "ZETA 2 (Z2)" + SYSECHO "ZETA 2 (Z2)" #ENDIF #IF (MEMMGR == MM_N8) - .ECHO "N8 ONBOARD (N8)" + SYSECHO "N8 ONBOARD (N8)" #ENDIF #IF (MEMMGR == MM_Z180) - .ECHO "Z180 NATIVE (Z180)" + SYSECHO "Z180 NATIVE (Z180)" #ENDIF #IF (MEMMGR == MM_Z280) - .ECHO "Z280 NATIVE (Z280)" + SYSECHO "Z280 NATIVE (Z280)" #ENDIF #IF (MEMMGR == MM_ZRC) - .ECHO "ZRC ONBOARD (ZRC)" + SYSECHO "ZRC ONBOARD (ZRC)" #ENDIF #IF (MEMMGR == MM_MBC) - .ECHO "NHYODYNE (MBC)" + SYSECHO "NHYODYNE (MBC)" #ENDIF #IF (MEMMGR == MM_RPH) - .ECHO "RHYOPHYRE ONBOARD (RPH)" + SYSECHO "RHYOPHYRE ONBOARD (RPH)" #ENDIF #IF (MEMMGR == MM_MON) - .ECHO "MONSPUTER ONBOARD (MON)" + SYSECHO "MONSPUTER ONBOARD (MON)" #ENDIF - .ECHO "\n" + SYSECHO "\n" #ENDIF ; - .ECHO "ROM SIZE: " - .ECHO ROMSIZE - .ECHO " KB\n" + SYSECHO "ROM SIZE: " + SYSECHO ROMSIZE + SYSECHO " KB\n" ; - .ECHO "RAM SIZE: " - .ECHO RAMSIZE - .ECHO " KB\n" + SYSECHO "RAM SIZE: " + SYSECHO RAMSIZE + SYSECHO " KB\n" ; ; MEMORY BANK CONFIGURATION ; @@ -832,11 +837,26 @@ BID_ROMD0 .EQU 0 ; NO ROM DRIVE ; #ENDIF ; +#IF ((!MDRAM) | (RAMD_BNKS <= 0)) +BID_RAMD0 .SET $FF +MDRAM .SET FALSE +#ENDIF +; +#IF ((!MDROM) | (ROMD_BNKS <= 0)) +BID_ROMD0 .SET $FF +MDROM .SET FALSE +#ENDIF +; APP_BNKS .SET BID_BUF - BID_APP0 ; -BID_RAMDN .EQU BID_RAMD0 + RAMD_BNKS - 1 ; LAST RAM DRIVE BANK -BID_ROMDN .EQU BID_ROMD0 + ROMD_BNKS - 1 ; LAST ROM DRIVE BANK -BID_APPN .EQU BID_APP0 + APP_BNKS - 1 ; LAST APP BANK +#IF (APP_BNKS <= 0) +BID_APP0 .SET $FF +APP_BNKS .SET 0 +#ENDIF +; +;;;BID_RAMDN .EQU BID_RAMD0 + RAMD_BNKS - 1 ; LAST RAM DRIVE BANK +;;;BID_ROMDN .EQU BID_ROMD0 + ROMD_BNKS - 1 ; LAST ROM DRIVE BANK +;;;BID_APPN .EQU BID_APP0 + APP_BNKS - 1 ; LAST APP BANK ; #IF TRUE .ECHO "------------- CAPACITY -----------------\n" @@ -856,12 +876,12 @@ BID_APPN .EQU BID_APP0 + APP_BNKS - 1 ; LAST APP BANK .ECHO "BID_IMG1: " \ .ECHO BID_IMG1 \ .ECHO "\n" .ECHO "BID_IMG2: " \ .ECHO BID_IMG2 \ .ECHO "\n" .ECHO "BID_ROMD0: " \ .ECHO BID_ROMD0 \ .ECHO "\n" - .ECHO "BID_ROMDN: " \ .ECHO BID_ROMDN \ .ECHO "\n" +;;; .ECHO "BID_ROMDN: " \ .ECHO BID_ROMDN \ .ECHO "\n" .ECHO "BID_BIOS: " \ .ECHO BID_BIOS \ .ECHO "\n" .ECHO "BID_RAMD0: " \ .ECHO BID_RAMD0 \ .ECHO "\n" - .ECHO "BID_RAMDN: " \ .ECHO BID_RAMDN \ .ECHO "\n" +;;; .ECHO "BID_RAMDN: " \ .ECHO BID_RAMDN \ .ECHO "\n" .ECHO "BID_APP0: " \ .ECHO BID_APP0 \ .ECHO "\n" - .ECHO "BID_APPN: " \ .ECHO BID_APPN \ .ECHO "\n" +;;; .ECHO "BID_APPN: " \ .ECHO BID_APPN \ .ECHO "\n" .ECHO "BID_BUF: " \ .ECHO BID_BUF \ .ECHO "\n" .ECHO "BID_AUX: " \ .ECHO BID_AUX \ .ECHO "\n" .ECHO "BID_USR: " \ .ECHO BID_USR \ .ECHO "\n" @@ -1089,6 +1109,8 @@ Z180_CNTR_DEF .EQU $06 ; DEFAULT VALUE FOR Z180 CSIO CONFIG ; ; HELPER MACROS ; +#DEFINE ALIGN(N) .FILL ((($+(N-1)) & ~(N-1)) - $) +; #DEFINE PRTC(C) CALL PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X') #DEFINE PRTS(S) CALL PRTSTRD \ .TEXT S ; PRINT STRING S TO CONSOLE - PRTD("HELLO") #DEFINE PRTX(X) CALL PRTSTRI \ .DW X ; PRINT STRING AT ADDRESS X TO CONSOLE - PRTI(STR_HELLO) diff --git a/Source/HBIOS/syq.asm b/Source/HBIOS/syq.asm index 824d3bed..a913ddf7 100644 --- a/Source/HBIOS/syq.asm +++ b/Source/HBIOS/syq.asm @@ -1447,16 +1447,16 @@ SYQ0_CFG: ; DEVICE 0 .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA ; - .ECHO "SYQ: MODE=" + DEVECHO "SYQ: MODE=" #IF (SYQMODE == SYQMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (SYQMODE == SYQMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO SYQ0BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO SYQ0BASE + DEVECHO "\n" #ENDIF ; #IF (SYQCNT >= 2) @@ -1469,16 +1469,16 @@ SYQ1_CFG: ; DEVICE 1 .DW 0,0 ; DEVICE CAPACITY .DW 0,0 ; CURRENT LBA ; - .ECHO "SYQ: MODE=" + DEVECHO "SYQ: MODE=" #IF (SYQMODE == SYQMODE_SPP) - .ECHO "SPP" + DEVECHO "SPP" #ENDIF #IF (SYQMODE == SYQMODE_MG014) - .ECHO "MG014" + DEVECHO "MG014" #ENDIF - .ECHO ", IO=" - .ECHO SYQ1BASE - .ECHO "\n" + DEVECHO ", IO=" + DEVECHO SYQ1BASE + DEVECHO "\n" #ENDIF ; #IF ($ - SYQ_CFG) != (SYQCNT * SYQ_CFGSIZ) diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 54b39de5..eaed9dfe 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -43,24 +43,24 @@ TMSCTRL1: .EQU 1 ; CONTROL BITS TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT ; - .ECHO "TMS: MODE=" + DEVECHO "TMS: MODE=" ; #IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958)) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL ; #IF (TMSMODE == TMSMODE_MSX) - .ECHO "MSX" + DEVECHO "MSX" #ENDIF #IF (TMSMODE == TMSMODE_MSX9958) - .ECHO "MSX9958" + DEVECHO "MSX9958" #ENDIF #ENDIF ; #IF (TMSMODE == TMSMODE_COLECO) TMS_DATREG .EQU $BE ; READ/WRITE DATA TMS_CMDREG .EQU $BF ; READ STATUS / WRITE REG SEL - .ECHO "COLECO" + DEVECHO "COLECO" #ENDIF ; #IF (TMSMODE == TMSMODE_MSXKBD) @@ -68,7 +68,7 @@ TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_KBDDATA .EQU $E0 ; KBD CTLR DATA PORT TMS_KBDST .EQU $E1 ; KBD CTLR STATUS/CMD PORT - .ECHO "MSXKBD" + DEVECHO "MSXKBD" #ENDIF ; #IF (TMSMODE == TMSMODE_N8) @@ -78,14 +78,14 @@ TMS_PPIA .EQU $84 ; PPI PORT A TMS_PPIB .EQU $85 ; PPI PORT B TMS_PPIC .EQU $86 ; PPI PORT C TMS_PPIX .EQU $87 ; PPI CONTROL PORT - .ECHO "N8" + DEVECHO "N8" #ENDIF ; #IF (TMSMODE == TMSMODE_SCG) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER - .ECHO "SCG" + DEVECHO "SCG" #ENDIF ; #IF (TMSMODE == TMSMODE_MBC) @@ -94,7 +94,7 @@ TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER TMS_KBDDATA .EQU $E2 ; KBD CTLR DATA PORT TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT - .ECHO "MBC" + DEVECHO "MBC" #ENDIF #IF (TMSMODE == TMSMODE_DUO) @@ -103,7 +103,7 @@ TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $A6 ; AUX CONTROL REGISTER TMS_KBDDATA .EQU $4C ; KBD CTLR DATA PORT TMS_KBDST .EQU $4D ; KBD CTLR STATUS/CMD PORT - .ECHO "DUO" + DEVECHO "DUO" #ENDIF ; #IF ((TMSMODE == TMSMODE_NABU40) | (TMSMODE == TMSMODE_NABU80)) @@ -111,19 +111,19 @@ TMS_DATREG .EQU $A0 ; READ/WRITE DATA TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL ; #IF (TMSMODE == TMSMODE_NABU40) - .ECHO "NABU-40" + DEVECHO "NABU-40" #ENDIF #IF (TMSMODE == TMSMODE_NABU80) - .ECHO "NABU-80" + DEVECHO "NABU-80" #ENDIF #ENDIF ; - .ECHO ", IO=" - .ECHO TMS_DATREG + DEVECHO ", IO=" + DEVECHO TMS_DATREG #IF TMSTIMENABLE - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; TMS_ROWS .EQU 24 ; diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index 737f0c56..d012b33c 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -1033,12 +1033,12 @@ UART_CFG_SBC: .DW UARTCFG ; LINE CONFIGURATION .DW UARTSBC_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "UART: MODE=SBC, IO=" - .ECHO UARTSBASE + DEVECHO "UART: MODE=SBC, IO=" + DEVECHO UARTSBASE #IF ((UARTINTS) & (INTMODE > 0)) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" #ENDIF #IF (UARTAUX) UART_CFG_AUX: @@ -1050,9 +1050,9 @@ UART_CFG_AUX: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; NO INT HANDLER ; - .ECHO "UART: MODE=AUX, IO=" - .ECHO UARTABASE - .ECHO "\n" + DEVECHO "UART: MODE=AUX, IO=" + DEVECHO UARTABASE + DEVECHO "\n" #ENDIF #IF (UARTCAS) UART_CFG_CAS: @@ -1064,12 +1064,12 @@ UART_CFG_CAS: .DW UARTCASSPD ; LINE CONFIGURATION .DW UARTCAS_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; - .ECHO "UART: MODE=CAS, IO=" - .ECHO UARTCBASE + DEVECHO "UART: MODE=CAS, IO=" + DEVECHO UARTCBASE #IF ((UARTINTS) & (INTMODE > 0)) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" #ENDIF #IF (UARTMFP) UART_CFG_MFP: @@ -1081,9 +1081,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=MFP, IO=" - .ECHO UARTSBASE - .ECHO "\n" + DEVECHO "UART: MODE=MFP, IO=" + DEVECHO UARTSBASE + DEVECHO "\n" #ENDIF #IF (UART4) ; 4UART SERIAL PORT A @@ -1094,9 +1094,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=4UART, IO=" - .ECHO UART4BASE+0 - .ECHO "\n" + DEVECHO "UART: MODE=4UART, IO=" + DEVECHO UART4BASE+0 + DEVECHO "\n" ; ; 4UART SERIAL PORT B .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) @@ -1106,9 +1106,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=4UART, IO=" - .ECHO UART4BASE+8 - .ECHO "\n" + DEVECHO "UART: MODE=4UART, IO=" + DEVECHO UART4BASE+8 + DEVECHO "\n" ; ; 4UART SERIAL PORT C .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) @@ -1118,9 +1118,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=4UART, IO=" - .ECHO UART4BASE+16 - .ECHO "\n" + DEVECHO "UART: MODE=4UART, IO=" + DEVECHO UART4BASE+16 + DEVECHO "\n" ; ; 4UART SERIAL PORT D .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) @@ -1130,9 +1130,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=4UART, IO=" - .ECHO UART4BASE+24 - .ECHO "\n" + DEVECHO "UART: MODE=4UART, IO=" + DEVECHO UART4BASE+24 + DEVECHO "\n" #ENDIF #IF (UARTRC) ; UARTRC SERIAL PORT A @@ -1143,9 +1143,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=RC, IO=" - .ECHO UARTRBASE+0 - .ECHO "\n" + DEVECHO "UART: MODE=RC, IO=" + DEVECHO UARTRBASE+0 + DEVECHO "\n" ; ; UARTRC SERIAL PORT B .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) @@ -1155,9 +1155,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=RC, IO=" - .ECHO UARTRBASE+8 - .ECHO "\n" + DEVECHO "UART: MODE=RC, IO=" + DEVECHO UARTRBASE+8 + DEVECHO "\n" ; #ENDIF #IF (UARTDUAL) @@ -1176,13 +1176,13 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=DUAL, IO=" - .ECHO UARTDBASE+8 - .ECHO "\n" + DEVECHO "UART: MODE=DUAL, IO=" + DEVECHO UARTDBASE+8 + DEVECHO "\n" ; - .ECHO "UART: MODE=DUAL, IO=" - .ECHO UARTDBASE+0 - .ECHO "\n" + DEVECHO "UART: MODE=DUAL, IO=" + DEVECHO UARTDBASE+0 + DEVECHO "\n" ; #ENDIF #IF (UARTNABU) @@ -1193,9 +1193,9 @@ UART_CFG_MFP: .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER ; - .ECHO "UART: MODE=NABU, IO=" - .ECHO UARTNBASE - .ECHO "\n" + DEVECHO "UART: MODE=NABU, IO=" + DEVECHO UARTNBASE + DEVECHO "\n" #ENDIF ; UART_CNT .EQU ($ - UART_CFG) / 8 diff --git a/Source/HBIOS/uf.asm b/Source/HBIOS/uf.asm index 328ac033..972ebe05 100644 --- a/Source/HBIOS/uf.asm +++ b/Source/HBIOS/uf.asm @@ -24,9 +24,9 @@ UF_USB_ACTIVE .DB 0 ; USB CABLE CONNECTED STATUS FLAG ; UF_CFG: .DW SER_9600_8N1 ; DUMMY CONFIGURATION ; - .ECHO "USB-FIFO: IO=" - .ECHO UFBASE - .ECHO "\n" + DEVECHO "USB-FIFO: IO=" + DEVECHO UFBASE + DEVECHO "\n" ; ; SETUP THE DISPATCH TABLE ENTRY AND INITIALIZE HARDWARE ; diff --git a/Source/HBIOS/vdu.asm b/Source/HBIOS/vdu.asm index faef9888..c97081d0 100644 --- a/Source/HBIOS/vdu.asm +++ b/Source/HBIOS/vdu.asm @@ -83,11 +83,11 @@ VDU_R10 .EQU (VDU_BLNK + DSCANL-1) VDU_R11 .EQU DSCANL-1 #ENDIF ; - .ECHO "VDU: IO=" - .ECHO VDU_RAMRD - .ECHO ", PPK IO=" - .ECHO VDU_PPIA - .ECHO "\n" + DEVECHO "VDU: IO=" + DEVECHO VDU_RAMRD + DEVECHO ", PPK IO=" + DEVECHO VDU_PPIA + DEVECHO "\n" ; ;====================================================================== ; VDU DRIVER - INITIALIZATION diff --git a/Source/HBIOS/vga.asm b/Source/HBIOS/vga.asm index b58da631..1b5e023b 100644 --- a/Source/HBIOS/vga.asm +++ b/Source/HBIOS/vga.asm @@ -21,13 +21,13 @@ VGA_HI .EQU VGA_BASE + $05 ; BOARD RAM HI ADDRESS VGA_LO .EQU VGA_BASE + $06 ; BOARD RAM LO ADDRESS VGA_DAT .EQU VGA_BASE + $07 ; BOARD RAM BYTE R/W ; - .ECHO "VGA: " - .ECHO "IO=" - .ECHO VGA_BASE - .ECHO ", KBD MODE=PS/2" - .ECHO ", KBD IO=" - .ECHO VGA_KBDDATA - .ECHO "\n" + DEVECHO "VGA: " + DEVECHO "IO=" + DEVECHO VGA_BASE + DEVECHO ", KBD MODE=PS/2" + DEVECHO ", KBD IO=" + DEVECHO VGA_KBDDATA + DEVECHO "\n" ; VGA_NOBL .EQU 00000000B ; NO BLINK VGA_NOCU .EQU 00100000B ; NO CURSOR diff --git a/Source/HBIOS/vrc.asm b/Source/HBIOS/vrc.asm index 51d50e63..73b748ce 100644 --- a/Source/HBIOS/vrc.asm +++ b/Source/HBIOS/vrc.asm @@ -27,12 +27,12 @@ VRC_COLS .EQU 64 TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT ; - .ECHO "VRC: IO=" - .ECHO VRC_BASE - .ECHO ", KBD MODE=VRC" - .ECHO ", KBD IO=" - .ECHO VRC_KBDDATA - .ECHO "\n" + DEVECHO "VRC: IO=" + DEVECHO VRC_BASE + DEVECHO ", KBD MODE=VRC" + DEVECHO ", KBD IO=" + DEVECHO VRC_KBDDATA + DEVECHO "\n" ; ;====================================================================== ; VRC DRIVER - INITIALIZATION diff --git a/Source/HBIOS/ym2612.asm b/Source/HBIOS/ym2612.asm index 936dabae..a4818364 100644 --- a/Source/HBIOS/ym2612.asm +++ b/Source/HBIOS/ym2612.asm @@ -39,9 +39,9 @@ YM_DEBUG .EQU 0 ; CHANGE TO 1 TO ENABLE DEBUGGING YM_RSTCFG .EQU 0 ; SET TO 1 FOR FULL REGISTER CLEAR YM_FAST3438 .EQU 0 ; FAST CPU'S WITH A YM3438 MAY REQUIRE A DELAY ; - .ECHO "YM: IO=" - .ECHO YMSEL - .ECHO "\n" + DEVECHO "YM: IO=" + DEVECHO YMSEL + DEVECHO "\n" ; ;------------------------------------------------------------------------------ ; Driver function table and instance data diff --git a/Source/HBIOS/z2u.asm b/Source/HBIOS/z2u.asm index 9e54ebb0..60100438 100644 --- a/Source/HBIOS/z2u.asm +++ b/Source/HBIOS/z2u.asm @@ -716,12 +716,12 @@ Z2U0_CFG: .DW Z2U0_RCVBUF ; POINTER TO RCV BUFFER STRUCT ; ; - .ECHO "Z2U: IO=" - .ECHO Z2U0BASE + DEVECHO "Z2U: IO=" + DEVECHO Z2U0BASE #IF (INTMODE == 3) - .ECHO ", INTERRUPTS ENABLED" + DEVECHO ", INTERRUPTS ENABLED" #ENDIF - .ECHO "\n" + DEVECHO "\n" ; Z2U_CFGSIZ .EQU $ - Z2U_CFG ; SIZE OF ONE CFG TABLE ENTRY diff --git a/Source/ver.inc b/Source/ver.inc index d557051d..d9157629 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.31" +#DEFINE BIOSVER "3.5.0-dev.34" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index bf0a23fb..bd52da34 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.31" + db "3.5.0-dev.34" endm From a4fdebea2be612ef653082a9921a90936fb5f84d Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 3 May 2024 09:21:20 -0700 Subject: [PATCH 10/20] Update CLRDIR Update CLRDIR with minor update from the author Max Scane to emphasize the need to type a capital Y to proceed. Thanks and credit to Max Scane for this application. Adds CLRDIR to the Applications document. --- Doc/RomWBW Applications.pdf | Bin 239626 -> 248852 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123890 -> 123895 bytes Doc/RomWBW Errata.pdf | Bin 28739 -> 28660 bytes Doc/RomWBW ROM Applications.pdf | Bin 156004 -> 156010 bytes Doc/RomWBW System Guide.pdf | Bin 567601 -> 567605 bytes Doc/RomWBW User Guide.pdf | Bin 800280 -> 800437 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Doc/Applications.md | 68 +++++++++++++++- Source/Doc/UserGuide.md | 14 ++-- Source/HBIOS/hbios.asm | 120 +++++++++++++++++----------- Source/Images/Common/All/CLRDIR.COM | Bin 1706 -> 1710 bytes Source/RomDsk/ROM_128KB/CLRDIR.COM | Bin 1706 -> 1710 bytes Source/RomDsk/ROM_256KB/CLRDIR.COM | Bin 1706 -> 1710 bytes Source/RomDsk/ROM_384KB/CLRDIR.COM | Bin 1706 -> 1710 bytes Source/RomDsk/ROM_896KB/CLRDIR.COM | Bin 1706 -> 1710 bytes Source/RomDsk/ReadMe.txt | 43 ++++++---- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 19 files changed, 177 insertions(+), 76 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index d10f8d341421540859ec39779d670fb6a4710931..ea50c203a6f396647a1bc623043bce42e3e8a644 100644 GIT binary patch delta 66626 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

{U6g;FYpci9Fqy~c=6cDe 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 diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index e2628916e2e15b6bcce7190c9e0bcdac0f798324..99872a35559d1aa6732c9c3fc6dfc4f2bc234ee6 100644 GIT binary patch delta 4775 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 diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index 9e17f80035c716944b24dcead66f69dd8c8aef16..3ec0d57bd2138c296c4e6520ea974f3f47243900 100644 GIT binary patch delta 9263 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 W<&%?{IR=Q22L!}mV31Ol#`q5p+sUo~ diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index ba8603398f51544fd772f55e5298d75e0a9229bb..d04b6903319b4020dec7099177af79d32041e4c7 100644 GIT binary patch delta 7871 zcmai3du-M96<=>xpp`AK0#deVl`z>5{JtOAT5Y>lBUG&lK9EY?+;rI(P&T(Qb2m+N zuxMbIeW@cVL?D>WtwhtIky&(ZOoa(stkhsgOi*xcZe|Ju+2_iA@H^)w>tD^e=llJh z=jS|rZ|xb)pvi<0>KOH}Cb^T5c8U(8vsc|-T=RZZL6mv6ZC{B`@5&8oZWvX`#yx~XRMV{y%^ zW1p(c57c-6{KnPq-2TE7S8N%Xbzt_iaYt(IntIlQr@9}WwCRCweNrrFIsWKx#%!y- zBmcdXV<(J#?ZU1PesyyFo~P%&yX5hsFLZpgclzJ|yx`HjJJfxPc22qRnUSVLgOiW+ z>xDzD7v4Yc<8hns$eoz*e)AhoJ-Kqu&=-IE(DGYfn|bo&TdyCydCY^8>Mp-zbk}1i z=Iz_Qd&8aX;IXv_KfiLvH{bZ>oBan{W}Uln?gcAPoN64MF*&O@y)ZrwR^ z={s8{zdky=`R-fRZS0%=mn{#!`u4fcz5Ca*?{3Q7+mx#rYRculfAM%Lw1~nRHCy;~ zzpI@zUKvrQrKj6+k4$m0Srq=7moztg{ErY`#I&qE*EreHpOo?<4YcPj$OrzDG+CN7 zLPv6i)KUs^R?27;1T%^CHY;G- z*^wL5!rpMg5hFlm#bt5Yn^g1FTw|VJ;ew!ILTx6xi;?kpX^Qr#n8&Ng-tfj2#XQ4~ z-bsF;_na1~vxEpDFq;LXnJt1YIj|_;MR01cnmHl3$ebF2v8k;SM)TA_QCh|xwV*~r zq**|s=k~f{xTA%4=p%&?0rX zf^(@Yl(&*TrKJtjj#@fX6tkkEmYx|BG#2O@2}Xs{7F6OaZH<)ayi0S9Ez~4BSeB!J z22K3~S^z}h3T7tb98=Xq>8YwFDovjUjXiIbW9bW;FS;i!?9J8Bmr61dNu^j^No6F9 zNo5^PP^r99sqeBXp)R#hj9tq>tt_?HRA;H7A@PRP&TzgUihLD(kUCn%2v4#L;T+Cq z7^q39V*B~ zRglIq5R?uPOiUu9XVnQ6omC=W3#;hB<5FQQN1Bu<5;Wrhpq@HSX&tG(x%KP@8zGoZL;Qd`5UrGw+b1nu})M}Z@Kw>wwI62nODJELGOqA^l6 z(f~GvW|#2=K`m$ynMGPT2!#%w*9XPpBN|Py7q$<9Vzfahu!qrcWfegX8t0jxjExLU zjEW_YE@!iGD0Nh02XJFF#jWL>7ZmQ$8nHTWA`dtdg`hq*4k(n`u0)-uiX)m>&9f@7 z(6Q){L|Th0SYTLXEwwSOWnmBHNy`ajH-VW6&5L38S@51VT?H{M#6*jBRW-G62{kq9 z00A0I1n3r2`YEpHrZH=SV_@n;WMvyQhk4MYiB}YcHY7haxJx~~xyJbp?G?oeXC3QP zoC>_kS&)7o=dg={<@qF-fRW zWsrHL(pZ7CfJ(t0(I}4eLJX%g6@o;mV0;KxN;9;%x(KF4)uMS3sv%pQ&sZ3RvT=)%m`71iRT(XR zn3eFt*^;*^p&by$Spf@exFuG=S)8WBRzUyC!UT(Rt})+nq59J@Btldaz3_0wb>(3T zjI6;9NIGH#97ge`+C|LnjK;QqI4fv#k@hak)p5{?j*c1VOCnotgouT7ns^i9n7A73 zSkf|?JX?~62raXGg%*e{3j@-E<|=$u0ZwEQYNtA84U8jGw6%mdR-&WMbZmB2p+2hzJ%Y z5q+dd?-kTy8e__(-ipSuDuZ60dI5_+$B-4%1^u{#m7Xm%K^3)7VwFj2F_TblVR(@g zoh3f;Fz^Aw2Ad8QuAo6E0R<$R3!8tI&DdOdv`#lyakvtS^@mDmipPa*EPG1BG&Bgb zG@OPdSuwUNmcf2V`t(XcCgLqDU>)saQ8O*gHy992Og6YcQzb8y5EH$!re8xqE6Hli>+E#x9kL?|-GP8ZC+1q4 lzw-ZC7B#oFHuSIPTfX84%WwTg14cO@M8k|3omX}>{0~VGba?;( delta 8298 zcmai3ZIG5_6>eWZgrX5~(6JGg61P#D?(YvnbU#I#DIy_@N;kut;v--OMAL`Dvd&~-J@4-O?)#i;XWC!8_ul6|=RW6L z=Un%BPVJlU(!L2Bmey1p+<3TcYVo0G-oIbH?H8|K@y{_+b}!!H9`AW!Y@E0JD^t#Y zsPEi2-duO&k)^lYd;7^1ukJr|=-|4u11F}P^RvUZ|LVly{`TqmsXc$2@$g;OO!~{1 zJGXZ{cg68FS1;N4?23Qi(Y5BRpMCVHX_qW~u6z7@pZ)doch7(N)ECC|#$rj^Z%>bV z_}2dWr^ctnCo@%Mi$z31_H7hHYb_|xB?`vn%;;Koy9 zj-P+?{r5iFJL#QMH&5HO;ri8Id%5?0U;KGT=f5Vr`o>4LZcA_fgcmlm!%_PcLhe8Z8oGiMavI`@U03vT-ILtD;Feb0iI$6fT-o1U1} zZ5RFVvRSjb`Zs>`9ou*O{yS@zKEHa^Rrh^t*@1mOo`2>)OOAbF+Eov}H12`!MSHg$ zy>{PE4qSBbmK%=Vb?1erPd;$>@eOaTjW@p7{aD{?|2@>PYwj-d;O7sVRR`Ob|9R7% zUtYL*;paX({;^FLJTWlom7UwpESq*uTgQ(MeQN#m+I`b&Z9kn}tF69fg40nu=d~XE zZfEV{mOuA)*1k8#`*v0Sv@dI)SpP+-sH|MmIV!nkOmKr+yJ{VU;eV-AUDHn4ERN7t zYb9j0&d$hvPDLB4=fTtvV*+E~2fX;)7ZpNf!B5%9j3bx?fu-@u{>8j+MmB2WC(EoL00Cv1{2kgg^AS z5l9RpLhC@urLwm&o{(kF=%i&xJfPE}xE^b7ipVhra%4z6TCl8oJ~_fR*61Rk#IeY& z;L{MaasQ_KLuM$(dP>%fZSIRU2I3E$6`z`QZjH1{| z7h3Phtrm!&eHwjR7=s>R$Y}2x-WuV5HU(lYHd)WYfr^R+>_jdor#W<>r@~tc6oRg^ z%wT6M-Nc!sqzh4cs5+uS5B6VIn^JH}l&LL{3vvwtB%B7?PtkV))lcq2=aE5h9(}9a z*IHU&J5_ANAn}3T@tR@(gwTj!vn;{D3PY%u7MGFn(rRRhjH(NXqKZzfrNcq3sW*a! zkPc*BLB!X=|1wRy@m{(gN(ck!0K{>c0ZWTcZ;RFxwb zp~Q3=rH6rP(914qG!qFK@DIWpo|(hg8tK|ed+8aK@Qxs3@B|TAuN|m+1xBU+!Rq)x z6l9Tb5Y|NN5_$krvend^b~KVqYbZN|2%_O5y|A#9?x&!ENU@ zi+OTcbV_8Ui$rd*kIb%<7lqpPLMAQIFZdXBC>1wb$wi=@XG8*%*>KbI@ zX#1+vppIrdB3W^0eS(&`r4sNX_LXZgbWn^2Uo{3TR#Ab)S}MeW5O(s(0%5RlI*=F_ zWSI)5XsHe3x{c>klUqaBM2ZvUIg}r$7-An}dG3}_2*l-ZktjG$QN|dfUb-FAHMCGU zgGCcWXO*%^c>!6_XCq&rki{@r&Q`He7Q~W!ONIhryqrlf`Vp;p*{C5KnmN;)t)eG$ z(<`&9dLV>H+ZP=xCMp40C(kQzJIa2nWhXMY6qY@z+$RrIDJw}QARQY&BuP z%!(;?P-2L1rfik)0u+NwR6PjUmI;L!o+RPIRc2fkAETJpWH&f@QQ5cT*cBuwbF&BI z5jH_T4VfUz18(di(uh(zH1KNaTM&-Yb|}fR>7lEtYVj-Yr~|Q#jB85(Wo0T)rLt~9 z*b~dZ#!(JL8LvhGvW`%n6^c-GAB+xif(BVz5X-A-CBxm|naeYt45KyEY*2GC3sOr^CMeEODJSAXv5NnOUd&e+}K zY-e8%J=*s4b%yR3Y*%mhoc7uOf6K?)=ggV7YM_7Rz#S_W-!@S@^lvqB=FHv?^iBL9 DVMVW) diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index 12cfa0343ebdddc7c2193fc42538f767c3a9443a..7ec5c43e155fa70888cea83850e3c7e76e015893 100644 GIT binary patch delta 23744 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 delta 23738 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 aY4C(ez7vKHD~<1?CAqYtW6RF1O8*aCe_7W6 diff --git a/ReadMe.md b/ReadMe.md index 41ab05e4..c91cec6d 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.5 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -17 Apr 2024 +03 May 2024 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index af0e23ec..bb14f64f 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -17 Apr 2024 +03 May 2024 diff --git a/Source/Doc/Applications.md b/Source/Doc/Applications.md index 5c0f03bb..a972b53e 100644 --- a/Source/Doc/Applications.md +++ b/Source/Doc/Applications.md @@ -48,8 +48,9 @@ found: | RTC | Yes | Yes | Yes | | TIMER | Yes | Yes | Yes | | CPUSPD | Yes | Yes | Yes | +| FAT | Yes | Yes | Yes | +| CLRDIR | Yes | Yes | Yes | | INTTEST | No | Yes | Yes | -| FAT | No | Yes | Yes | | TUNE | No | Yes | Yes | | WDATE | No | Yes | Yes | | HTALK | No | Yes | Yes | @@ -545,7 +546,7 @@ distribution in the Doc/Contrib directory. The application supports a significant number of EEPROM parts. It should automatically detect your part. If it does not recognize your chip, make sure that you do not have a write protect jumper set -- -this jumper can prevent the ROM chip from being recognized. +this jumper will prevent the ROM chip from being recognized. Reprogramming a ROM chip in-place is inherently dangerous. If anything goes wrong, you will be left with a non-functional system and no @@ -921,6 +922,15 @@ Files written are not verified. Wildcard matching in FAT filesystems is a bit unusual as implemented by FatFs. See FatFs documentation. +The `FAT FORMAT` command will not perform a physical format on floppy +disks. You must use FDU to do this prior to using `FAT FORMAT`. + +Formatting (`FAT FORMAT`) of floppies does not work well. The +underlying FatFs library uses some non-standard fields. The resulting +floppy may or may not be useable on other systems. It is best to format +a FAT floppy on a Windows or DOS system. You should have no problems +copying files to/from such a floppy using `FAT`. + ## Etymology The `FAT` application is an original RomWBW work, but utilizes the @@ -953,6 +963,60 @@ can corrupt a file if it occurs. Be careful to avoid this. `\clearpage`{=latex} +# CLRDIR + +`CLRDIR` is used to initialize a CP/M filesystem. This is frequently +used to prepare RomWBW disk slices for use. If there is any data +on the filesystem, it will be destroyed. `CLRDIR` works on CP/M +drive letters. To initialize a RomWBW slice, the slice must first be +assigned to a CP/M drive letter. + + +This application is provided by Max Scane. + +## Syntax + +| `CLRDIR `*``*` [options]` + +*``* is the CP/M drive letter to be cleared (e.g., "A:") + + +Options: + +| `-D`: Enable debug output +| `-Y`: Do not ask for confirmation + +## Usage + +This application has a command line interface only. Type an +appropriately formatted command at the command prompt at any of the +RomWBW CP/M operatings systems (CP/M 2.2, ZSDOS, CP/M 3, etc.). + +You will be prompted for confirmation to continue. You must type a +**capital** 'Y' to proceed. The application will confirm that the +drive has been cleared. + +If used under ZSDOS, you should issue a `RELOG` command after using +`CLRDIR` to ensure that CP/M relogs the cleared drive. + +## Notes + +This command is inherently dangerous. It will completely destroy the +directory area of the target drive. Be very careful to ensure you do +not target a drive that contains useful data. + +`CLRDIR` understands the directory formats of all of the RomWBW +CPM-like operating systems and devices including floppy disks, CF/SD +Cards, etc. + +## Etymology + +This application was written and provided by Max Scane. He +provides it in binary format and is included in the RomWBW +distribution as a binary file. + +`\clearpage`{=latex} + # TUNE If your RomWBW system has a sound card based on either an AY-3-8190 or diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index 624df28d..04ba281f 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -1118,11 +1118,11 @@ system. The drive letter assignments **do not** change during an OS session unless you use the `ASSIGN` command yourself to do it. Additionally, the - assignments at boot will stay the same on each boot as long as you do +assignments at boot will stay the same on each boot as long as you do not make changes to your hardware configuration. Note that the assignments **are** dependent on the media currently inserted in hard disk drives when the operating system is started. So, notice that if you - insert or remove an SD Card, CF Card or USB Drive, the drive +insert or remove an SD Card, CF Card or USB Drive, the drive assignments will change. Since drive letter assignments can change, you must be careful when doing destructive things like using `CLRDIR` to make sure the drive letter you use is referring to the desired media. @@ -1513,10 +1513,10 @@ B>assign H:=IDE0:3 B>clrdir G: -CLRDIR Version 1.2 April 2020 by Max Scane +CLRDIR Version 1.2B May 2024 by Max Scane Warning - this utility will overwrite the directory sectors of Drive: G -Type Y to proceed, any key other key to exit. Y +Type CAPITAL Y to proceed, any key other key to exit. Y Directory cleared. B> ``` @@ -1993,10 +1993,12 @@ custom hard disk image file, it will need to be written to the media using your modern computer. Note that you **do not** run `CLRDIR` or `SYSCOPY` on the slices that contain the data. When using this method, the disk will be partitioned and setup with 1 or more slices containing -ready-to-run bootable operating systems. +ready-to-run bootable operating systems. You **do** need to run +`CLRDIR` and optionally `SYSCOPY` on slices that are not part of the +image (slices beyond the ones included with the image). To write a hard disk image file onto your actual media (actual hard disk - or CF/SD/USB Media), you need to use an image writing utility on your +or CF/SD/USB Media), you need to use an image writing utility on your modern computer. Your modern computer will need to have an appropriate interface or slot that accepts the media. To actually copy the image, you can use the `dd` command on Linux or MacOS. On Windows, in the diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index e0f6fb41..05f5fde8 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -22,27 +22,25 @@ ; SYSTEM INITIALIZATION, THE IMAGE OF THE RUNNING ROM BANK IS COPIED TO A RAM BANK ; CREATING A SHADOW COPY IN RAM. EXECUTION IS THAN TRANSFERRED TO THE RAM SHADOW COPY. ; THIS IS ESSENTIAL BECAUSE THE HBIOS CODE DOES NOT SUPPORT RUNNING IN READ ONLY MEMORY -; (EXCEPT FOR THE INITIAL LAUNCHING CODE). IN THIS MODE, THE HBI OS INITIALIZATION WILL -; ALSO COPY THE OS IMAGES BANK IN ROM TO THE USER RAM BANK AND LAUNCH IT AFTER HBIOS -; IS INSTALLED. +; (EXCEPT FOR THE INITIAL LAUNCHING CODE). ; ; - APPBOOT: BOOT FROM A CP/M STYLE APPLICATION FILE ; ; WHEN APPBOOT IS DEFINED, THE FILE IS ASSEMBLED AS A CP/M APPLICATION ASSUMING ; THAT IT WILL BE LOADED AT 100H BY THE CP/M (OR COMPATIBLE) OS. NOTE THAT IN ; THIS CASE IT IS ASSUMED THAT AN OS IMAGES FILE IS APPENDED TO THE END OF THE -; HBIOS APPLICATION BINARY. THE APPENDED OS IMAGES ARE COPIED TO THE USER RAM +; HBIOS APPLICATION BINARY. THE APPENDED OS IMAGES ARE COPIED TO THE AUX RAM ; BANK AND LAUNCHED AFTER HBIOS HAS INSTALLED ITSELF. ; -; - IMGBOOT: BOOT FROM AN IMAGE FILE THAT HAS BEEN PLACED IN THE USER BANK -; -; WHEN IMGBOOT IS DEFINED, THE FILE IS ASSEMBLED SUCH THAT IT CAN BE PRELOADED -; INTO THE RAM USER BANK BY AN EXTERNAL PROCESS THAT SUBSEQUENTLY LAUNCHES -; THE CODE AT ADDRESS 0. THE MOST COMMON EXAMPLE OF THIS IS THE UNA FSFAT -; TOOL WHICH CAN LOAD AN IMAGE FROM A DOS FAT FILESYSTEM PROVIDING A SIMPLE -; WAY TO LOAD A TEST COPY OF HBIOS. AS IS THE CASE WITH APPBOOT, IT IS ASSUMED -; THAT AN OS IMAGES FILE IS APPENDED TO THE END OF THE IMAGE AND IS LAUNCHED -; AFTER HBIOS IS INSTALLED. +;;;; - IMGBOOT: BOOT FROM AN IMAGE FILE THAT HAS BEEN PLACED IN THE USER BANK +;;;; +;;;; WHEN IMGBOOT IS DEFINED, THE FILE IS ASSEMBLED SUCH THAT IT CAN BE PRELOADED +;;;; INTO THE RAM USER BANK BY AN EXTERNAL PROCESS THAT SUBSEQUENTLY LAUNCHES +;;;; THE CODE AT ADDRESS 0. THE MOST COMMON EXAMPLE OF THIS IS THE UNA FSFAT +;;;; TOOL WHICH CAN LOAD AN IMAGE FROM A DOS FAT FILESYSTEM PROVIDING A SIMPLE +;;;; WAY TO LOAD A TEST COPY OF HBIOS. AS IS THE CASE WITH APPBOOT, IT IS ASSUMED +;;;; THAT AN OS IMAGES FILE IS APPENDED TO THE END OF THE IMAGE AND IS LAUNCHED +;;;; AFTER HBIOS IS INSTALLED. ; ; INCLUDE FILE NESTING: ; @@ -1423,15 +1421,32 @@ BOOTWAIT: ; Z280 BARE METAL INIT ; #IF (CPUFAM == CPU_Z280) + ; CLEAR THE MASTER STATUS REGISTER + LD C,Z280_MSR ; MASTER STATUS REGISTER + LD HL,$0000 ; SYS MODE, NO INTERRUPTS + LDCTL (C),HL ; DO IT +; ; SET MAXIMUM I/O WAIT STATES FOR NOW LD C,Z280_BTCR ; BUS TIMING AND CONTROL REGISTER LD HL,$0033 ; 3 I/O WAIT STATES ADDED - LDCTL (C),HL + LDCTL (C),HL ; DO IT ; - ; START BY SELECTING I/O PAGE $FF + ; SELECT I/O PAGE $FF FOR INTERNAL SYSTEM REGISTER ACCESS LD L,$FF ; MMU AND DMA PAGE I/O REG IS $FF LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - LDCTL (C),HL + LDCTL (C),HL ; DO IT +; + ; DISABLE MEMORY REFRESH CYCLES + LD A,$08 ; REFRESH DISABLED + OUT (Z280_RRR),A ; DO IT +; + ; INITIALIZE CACHE CONTROL REGISTER + LD A,$20 ; CACHE INSTRUCTIONS, NOT DATA + OUT (Z280_CCR),A ; DO IT +; + ; INITIALIZE TRAP CONTROL REGISTER + LD A,$00 ; ALLOW USER I/O, NO EPU, NO STK WARN + OUT (Z280_TCR),A ; DO IT ; #IF (MEMMGR == MM_Z280) ; @@ -1468,10 +1483,6 @@ BOOTWAIT: LD C,Z280_MMUMCR ; MMU MASTER CONTROL REGISTER LD HL,$BBFF ; ENABLE USER & SYSTEM TRANSLATE OUTW (C),HL -; - ; DISABLE MEMORY REFRESH CYCLES - LD A,$08 ; DISABLED - OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER ; JR Z280_INITZ ; JUMP TO CODE CONTINUATION ; @@ -1505,7 +1516,7 @@ Z280_INITZ: ; #ENDIF ; - ; RESTORE I/O PAGE TO $00 + ; RESTORE I/O PAGE TO $00 FOR NORMAL USER I/O SPACE LD L,$00 ; NORMAL I/O REG IS $00 LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER LDCTL (C),HL @@ -2917,17 +2928,26 @@ HB_Z280BUS1: PRTS("BTCR=$") LD C,Z280_BTCR ; BUS TIMING AND CONTROL REGISTER LDCTL HL,(C) - CALL PRTHEXWORDHL + LD A,L + CALL PRTHEXBYTE CALL PC_SPACE PRTS("BTIR=$") LD C,Z280_BTIR ; BUS TIMING AND CONTROL REGISTER LDCTL HL,(C) - CALL PRTHEXWORDHL + LD A,L + CALL PRTHEXBYTE CALL PC_SPACE PRTS("CCR=$") LD C,Z280_CCR ; CACHE CONTROL REGISTER LDCTL HL,(C) - CALL PRTHEXWORDHL + LD A,L + CALL PRTHEXBYTE + CALL PC_SPACE + PRTS("TCR=$") + LD C,Z280_TCR ; CACHE CONTROL REGISTER + LDCTL HL,(C) + LD A,L + CALL PRTHEXBYTE #ENDIF ; #IFDEF ROMBOOT @@ -3326,32 +3346,28 @@ DBG_NOTE: ; #ENDIF ; +#IFDEF TESTING + CALL SND_BEEP +#ENDIF +; INITSYS4: ; #IF (MEMMGR == MM_Z280) - ; LEAVE SYSTEM MODE STACK POINTING TO AN OK PLACE - LD SP,HB_STACK ; NOW USE REAL SYSTEM STACK LOC -; - HB_DI ; NOT SURE THIS IS NEEDED + ; LEAVE SYSTEM MODE STACK POINTING TO THE RIGHT PLACE + LD SP,HB_STACK ; DEDICATED HBIOS STACK LOC ; ; ACTIVATE THE CORRECT USER MODE BANK LD A,(HB_CURBNK) ; GET CURRENT BANK - CALL HBX_BNKSEL + CALL HBX_BNKSEL ; DO IT ; ; PRESET THE USER MODE STACK - LD HL,HBX_LOC - LDCTL USP,HL -; - HB_EI ; NOT SURE THIS IS NEEDED + LD HL,HBX_LOC ; USER STACK JUST BELOW PROXY + LDCTL USP,HL ; DO IT ; ; SWITCH TO USER MODE NOW - LD C,Z280_MSR - LD HL,$407F - LDCTL (C),HL -#ENDIF -; -#IFDEF TESTING - CALL SND_BEEP + LD C,Z280_MSR ; MASTER STATUS REGISTER + LD HL,$4000 | $0B ; USER MODE W/ NORMAL INT MASK + LDCTL (C),HL ; DO IT #ENDIF ; DIAG(0) ; CLEAR BOOT DIAG LED(S) @@ -5911,23 +5927,31 @@ Z280_PRIVINST: EX (SP),HL ; GET ADR, SAVE HL ; PUSH AF - PUSH BC - PUSH DE + PUSH BC ; NEEDED? + PUSH DE ; NEEDED? ; LDUP A,(HL) ; BYTE FROM USER SPACE ; - ; HANDLE DI + ; HANDLE USER MODE Z80 DI CP $F3 ; DI? JR NZ,Z280_PRIVINST2 - HB_DI ; DO THE DI + + ;;;HB_DI ; DO THE DI + XOR A ; NO INTERRUPTS + LD (HB_MSRSAV),A ; UPDATE SAVED MSR LSB + INC HL ; BUMP PAST IT JR Z280_PRIVINSTX ; Z280_PRIVINST2: - ; HANDLE EI + ; HANDLE USER MODE Z80 EI CP $FB ; EI? JR NZ,Z280_PRIVINST3 - HB_EI ; DO THE EI + + ;;;HB_EI ; DO THE EI + LD A,$0B ; NORMAL INTERRUPTS + LD (HB_MSRSAV),A ; UPDATE SAVED MSR LSB + INC HL ; BUMP PAST IT JR Z280_PRIVINSTX ; @@ -5954,8 +5978,8 @@ Z280_PRIVINST4: ; Z280_PRIVINSTX: ; RESTORE REGISTERS - POP DE - POP BC + POP DE ; NEEDED? + POP BC ; NEEDED? POP AF ; ; RECOVER HL AND MSR, THEN RETURN VIA RETIL diff --git a/Source/Images/Common/All/CLRDIR.COM b/Source/Images/Common/All/CLRDIR.COM index 9c00904f82c7205a7345b5aab848cc0caaed4e73..068bfb4c7e0c0567b7d9b9560913a63c5fe4a9b8 100644 GIT binary patch literal 1710 zcmZ`(O>7%Q6drHv8O5zld}#SqGO;ZonI zQC#sOxa1gdLLm)lWTk(na)ATETas+hRs^a_a6qac2+7K!NCCvb@MhLdN)fBww=?g3 z@6DU{=PY^$hfgPlPSZ)I8>&{I{k?LUj-<*|?vtOS=`yU((uqu}zyf}M)H&}}-bM|y zbJG{YDJU#V6Z&Pm@L~%M>U#NjTt(pt0pt(oSM(mG^0hP=QRBc z%hG^9%B@Yo5n%c7340vYQ>&K#~>1K)Q*mX?%G zQr$Trh2A8}D!JA6*9pl2{zXZ-M5@>SmYn^z?mlTxxdKL!*9v=`8*Q<5@>qDC%vWn+ zslo|3pHOvhSkucilV>TNdme~79mGQD)yQN${1K^#+L1VHP6{1E4{|Pik$QNE)Fb?H zcgyZhD6Nn>*VvAnlUIoyTOr{!(v48KN@B|-;`}bb3yug3cwgNjL@3j-T+U!7xABPptQ-MaCz+a?X%4z5K)_}c6?D(DsN!?e;TqICCX!F5md#)1a z9W1gv>;?6aL=1A}e2Nnz&H{Fp@jZw&KsX=b|03719Z$Bx7h5BH^AMoh6(Fz?I&sRy z6Ni}UT^NX@9c+g(g@U<#F0$8%ZUfF*^ahUu6H0B%TWR!f$ejd2FgX7B2z`Pkm?@eB zI)LYKgmXtVlMa@2ofXV{nNF07MNNl35?zAOK^Hs@@`33)?$7?^zRkXd^5-V8Ukgfb zlpXYN8V_(c{XlF*Lh_ebzK-QBEbn01!SXj){tojqUrOl(wJ=S4sQHF!(2}X1bSoRc670Psm zm8k}1b+G~|JFA+#U@zorOmW9vG*Z)08qLx6Y?jw}oW9(XI7NG=UJ3XId6)jbW87n- z$TDh9h2RP8UYLGkVmcX0z~7Ug^o2qyorjyTbZMGuC9_yE0n{@^X+om~NJI+e7ECE9 z(?U+w&!qTh14I;Z%&WO}6I)+kvHA&H+wST|Y<=afzQp@ZiCQDO6)r9d_>TtS=veY_D1ylCbkV;Cjnk+4 WW%_)Xk9Hn0qgAlnNXv)2{{H~@16q{; delta 1149 zcmZWoO=uHA6yEI5JWQKlM8&G;HXC|~|Dz}@8c~BFSX$a5coEaOm7ung2DRE4QB*t? z$syEQYm7D8gD7~iD0Nq~8yys(J$Mnpf)Wsd^q_~uH@mIB%g)<*-+b@Q%=g~j4~zz~ zEHCfc+Y;Z?qV6+NJ<0Aab;DYkP@6i^-R(w7rR(WNwY^tuOq^0%I}%++!0(T++p>O6 zaD?((CA19m^TO1Q_x-Xn|6RXKZ-Rb7aCEcZrAXyTUuZMv7X@bxhb{?D+|2l5K3W26 z(&w}V%~zgB@4*bqU%j$5i|~HrBIhpXccEl{_Ob0ss09#Y%amY%DFSOy^qbJMLSQ{4 z^9T=7#`Y=pMKk7sa@%y4)g3@zIVpXYrlQ^y4!=$ooHOTCp6di$8 z;SuO7nGIrw8?Hz^nKDp-RIl1`)JUX^Lu=JQgw=v22nV!%m2e&^p?QM4+Zi!bBh+ye zhgJy>Kte`yt|sC&{`bJb!6o#zU%( zZ^D})IujiL?hL>jJOK8V?R_f`XI6IG{OqaZ2}4&SsLzWXEU3hEG^iUcwYrz;QJb-_ zZK*`Z5l*`XtSal6w93_G`K~{1-HO27hs6H(G7#?CdepJjo50F!Y-+w^h1Z zJ()_T-7I%p(#R~yy(Y`&9*B#w!?TzjErN!ERPd60kH<4(di zO7by-1|2sjrt;<1U!39}9MsMZ&coKk9{G4yn|2}-$g}ctuogjVuUB%$*)UF*0{`Qh z*EOme)wq$yiWrATz#qZV#-Fa4;EO2<=D0 Niy=ru3vxB2_!BX0r-1+f diff --git a/Source/RomDsk/ROM_128KB/CLRDIR.COM b/Source/RomDsk/ROM_128KB/CLRDIR.COM index 9c00904f82c7205a7345b5aab848cc0caaed4e73..068bfb4c7e0c0567b7d9b9560913a63c5fe4a9b8 100644 GIT binary patch literal 1710 zcmZ`(O>7%Q6drHv8O5zld}#SqGO;ZonI zQC#sOxa1gdLLm)lWTk(na)ATETas+hRs^a_a6qac2+7K!NCCvb@MhLdN)fBww=?g3 z@6DU{=PY^$hfgPlPSZ)I8>&{I{k?LUj-<*|?vtOS=`yU((uqu}zyf}M)H&}}-bM|y zbJG{YDJU#V6Z&Pm@L~%M>U#NjTt(pt0pt(oSM(mG^0hP=QRBc z%hG^9%B@Yo5n%c7340vYQ>&K#~>1K)Q*mX?%G zQr$Trh2A8}D!JA6*9pl2{zXZ-M5@>SmYn^z?mlTxxdKL!*9v=`8*Q<5@>qDC%vWn+ zslo|3pHOvhSkucilV>TNdme~79mGQD)yQN${1K^#+L1VHP6{1E4{|Pik$QNE)Fb?H zcgyZhD6Nn>*VvAnlUIoyTOr{!(v48KN@B|-;`}bb3yug3cwgNjL@3j-T+U!7xABPptQ-MaCz+a?X%4z5K)_}c6?D(DsN!?e;TqICCX!F5md#)1a z9W1gv>;?6aL=1A}e2Nnz&H{Fp@jZw&KsX=b|03719Z$Bx7h5BH^AMoh6(Fz?I&sRy z6Ni}UT^NX@9c+g(g@U<#F0$8%ZUfF*^ahUu6H0B%TWR!f$ejd2FgX7B2z`Pkm?@eB zI)LYKgmXtVlMa@2ofXV{nNF07MNNl35?zAOK^Hs@@`33)?$7?^zRkXd^5-V8Ukgfb zlpXYN8V_(c{XlF*Lh_ebzK-QBEbn01!SXj){tojqUrOl(wJ=S4sQHF!(2}X1bSoRc670Psm zm8k}1b+G~|JFA+#U@zorOmW9vG*Z)08qLx6Y?jw}oW9(XI7NG=UJ3XId6)jbW87n- z$TDh9h2RP8UYLGkVmcX0z~7Ug^o2qyorjyTbZMGuC9_yE0n{@^X+om~NJI+e7ECE9 z(?U+w&!qTh14I;Z%&WO}6I)+kvHA&H+wST|Y<=afzQp@ZiCQDO6)r9d_>TtS=veY_D1ylCbkV;Cjnk+4 WW%_)Xk9Hn0qgAlnNXv)2{{H~@16q{; delta 1149 zcmZWoO=uHA6yEI5JWQKlM8&G;HXC|~|Dz}@8c~BFSX$a5coEaOm7ung2DRE4QB*t? z$syEQYm7D8gD7~iD0Nq~8yys(J$Mnpf)Wsd^q_~uH@mIB%g)<*-+b@Q%=g~j4~zz~ zEHCfc+Y;Z?qV6+NJ<0Aab;DYkP@6i^-R(w7rR(WNwY^tuOq^0%I}%++!0(T++p>O6 zaD?((CA19m^TO1Q_x-Xn|6RXKZ-Rb7aCEcZrAXyTUuZMv7X@bxhb{?D+|2l5K3W26 z(&w}V%~zgB@4*bqU%j$5i|~HrBIhpXccEl{_Ob0ss09#Y%amY%DFSOy^qbJMLSQ{4 z^9T=7#`Y=pMKk7sa@%y4)g3@zIVpXYrlQ^y4!=$ooHOTCp6di$8 z;SuO7nGIrw8?Hz^nKDp-RIl1`)JUX^Lu=JQgw=v22nV!%m2e&^p?QM4+Zi!bBh+ye zhgJy>Kte`yt|sC&{`bJb!6o#zU%( zZ^D})IujiL?hL>jJOK8V?R_f`XI6IG{OqaZ2}4&SsLzWXEU3hEG^iUcwYrz;QJb-_ zZK*`Z5l*`XtSal6w93_G`K~{1-HO27hs6H(G7#?CdepJjo50F!Y-+w^h1Z zJ()_T-7I%p(#R~yy(Y`&9*B#w!?TzjErN!ERPd60kH<4(di zO7by-1|2sjrt;<1U!39}9MsMZ&coKk9{G4yn|2}-$g}ctuogjVuUB%$*)UF*0{`Qh z*EOme)wq$yiWrATz#qZV#-Fa4;EO2<=D0 Niy=ru3vxB2_!BX0r-1+f diff --git a/Source/RomDsk/ROM_256KB/CLRDIR.COM b/Source/RomDsk/ROM_256KB/CLRDIR.COM index 9c00904f82c7205a7345b5aab848cc0caaed4e73..068bfb4c7e0c0567b7d9b9560913a63c5fe4a9b8 100644 GIT binary patch literal 1710 zcmZ`(O>7%Q6drHv8O5zld}#SqGO;ZonI zQC#sOxa1gdLLm)lWTk(na)ATETas+hRs^a_a6qac2+7K!NCCvb@MhLdN)fBww=?g3 z@6DU{=PY^$hfgPlPSZ)I8>&{I{k?LUj-<*|?vtOS=`yU((uqu}zyf}M)H&}}-bM|y zbJG{YDJU#V6Z&Pm@L~%M>U#NjTt(pt0pt(oSM(mG^0hP=QRBc z%hG^9%B@Yo5n%c7340vYQ>&K#~>1K)Q*mX?%G zQr$Trh2A8}D!JA6*9pl2{zXZ-M5@>SmYn^z?mlTxxdKL!*9v=`8*Q<5@>qDC%vWn+ zslo|3pHOvhSkucilV>TNdme~79mGQD)yQN${1K^#+L1VHP6{1E4{|Pik$QNE)Fb?H zcgyZhD6Nn>*VvAnlUIoyTOr{!(v48KN@B|-;`}bb3yug3cwgNjL@3j-T+U!7xABPptQ-MaCz+a?X%4z5K)_}c6?D(DsN!?e;TqICCX!F5md#)1a z9W1gv>;?6aL=1A}e2Nnz&H{Fp@jZw&KsX=b|03719Z$Bx7h5BH^AMoh6(Fz?I&sRy z6Ni}UT^NX@9c+g(g@U<#F0$8%ZUfF*^ahUu6H0B%TWR!f$ejd2FgX7B2z`Pkm?@eB zI)LYKgmXtVlMa@2ofXV{nNF07MNNl35?zAOK^Hs@@`33)?$7?^zRkXd^5-V8Ukgfb zlpXYN8V_(c{XlF*Lh_ebzK-QBEbn01!SXj){tojqUrOl(wJ=S4sQHF!(2}X1bSoRc670Psm zm8k}1b+G~|JFA+#U@zorOmW9vG*Z)08qLx6Y?jw}oW9(XI7NG=UJ3XId6)jbW87n- z$TDh9h2RP8UYLGkVmcX0z~7Ug^o2qyorjyTbZMGuC9_yE0n{@^X+om~NJI+e7ECE9 z(?U+w&!qTh14I;Z%&WO}6I)+kvHA&H+wST|Y<=afzQp@ZiCQDO6)r9d_>TtS=veY_D1ylCbkV;Cjnk+4 WW%_)Xk9Hn0qgAlnNXv)2{{H~@16q{; delta 1149 zcmZWoO=uHA6yEI5JWQKlM8&G;HXC|~|Dz}@8c~BFSX$a5coEaOm7ung2DRE4QB*t? z$syEQYm7D8gD7~iD0Nq~8yys(J$Mnpf)Wsd^q_~uH@mIB%g)<*-+b@Q%=g~j4~zz~ zEHCfc+Y;Z?qV6+NJ<0Aab;DYkP@6i^-R(w7rR(WNwY^tuOq^0%I}%++!0(T++p>O6 zaD?((CA19m^TO1Q_x-Xn|6RXKZ-Rb7aCEcZrAXyTUuZMv7X@bxhb{?D+|2l5K3W26 z(&w}V%~zgB@4*bqU%j$5i|~HrBIhpXccEl{_Ob0ss09#Y%amY%DFSOy^qbJMLSQ{4 z^9T=7#`Y=pMKk7sa@%y4)g3@zIVpXYrlQ^y4!=$ooHOTCp6di$8 z;SuO7nGIrw8?Hz^nKDp-RIl1`)JUX^Lu=JQgw=v22nV!%m2e&^p?QM4+Zi!bBh+ye zhgJy>Kte`yt|sC&{`bJb!6o#zU%( zZ^D})IujiL?hL>jJOK8V?R_f`XI6IG{OqaZ2}4&SsLzWXEU3hEG^iUcwYrz;QJb-_ zZK*`Z5l*`XtSal6w93_G`K~{1-HO27hs6H(G7#?CdepJjo50F!Y-+w^h1Z zJ()_T-7I%p(#R~yy(Y`&9*B#w!?TzjErN!ERPd60kH<4(di zO7by-1|2sjrt;<1U!39}9MsMZ&coKk9{G4yn|2}-$g}ctuogjVuUB%$*)UF*0{`Qh z*EOme)wq$yiWrATz#qZV#-Fa4;EO2<=D0 Niy=ru3vxB2_!BX0r-1+f diff --git a/Source/RomDsk/ROM_384KB/CLRDIR.COM b/Source/RomDsk/ROM_384KB/CLRDIR.COM index 9c00904f82c7205a7345b5aab848cc0caaed4e73..068bfb4c7e0c0567b7d9b9560913a63c5fe4a9b8 100644 GIT binary patch literal 1710 zcmZ`(O>7%Q6drHv8O5zld}#SqGO;ZonI zQC#sOxa1gdLLm)lWTk(na)ATETas+hRs^a_a6qac2+7K!NCCvb@MhLdN)fBww=?g3 z@6DU{=PY^$hfgPlPSZ)I8>&{I{k?LUj-<*|?vtOS=`yU((uqu}zyf}M)H&}}-bM|y zbJG{YDJU#V6Z&Pm@L~%M>U#NjTt(pt0pt(oSM(mG^0hP=QRBc z%hG^9%B@Yo5n%c7340vYQ>&K#~>1K)Q*mX?%G zQr$Trh2A8}D!JA6*9pl2{zXZ-M5@>SmYn^z?mlTxxdKL!*9v=`8*Q<5@>qDC%vWn+ zslo|3pHOvhSkucilV>TNdme~79mGQD)yQN${1K^#+L1VHP6{1E4{|Pik$QNE)Fb?H zcgyZhD6Nn>*VvAnlUIoyTOr{!(v48KN@B|-;`}bb3yug3cwgNjL@3j-T+U!7xABPptQ-MaCz+a?X%4z5K)_}c6?D(DsN!?e;TqICCX!F5md#)1a z9W1gv>;?6aL=1A}e2Nnz&H{Fp@jZw&KsX=b|03719Z$Bx7h5BH^AMoh6(Fz?I&sRy z6Ni}UT^NX@9c+g(g@U<#F0$8%ZUfF*^ahUu6H0B%TWR!f$ejd2FgX7B2z`Pkm?@eB zI)LYKgmXtVlMa@2ofXV{nNF07MNNl35?zAOK^Hs@@`33)?$7?^zRkXd^5-V8Ukgfb zlpXYN8V_(c{XlF*Lh_ebzK-QBEbn01!SXj){tojqUrOl(wJ=S4sQHF!(2}X1bSoRc670Psm zm8k}1b+G~|JFA+#U@zorOmW9vG*Z)08qLx6Y?jw}oW9(XI7NG=UJ3XId6)jbW87n- z$TDh9h2RP8UYLGkVmcX0z~7Ug^o2qyorjyTbZMGuC9_yE0n{@^X+om~NJI+e7ECE9 z(?U+w&!qTh14I;Z%&WO}6I)+kvHA&H+wST|Y<=afzQp@ZiCQDO6)r9d_>TtS=veY_D1ylCbkV;Cjnk+4 WW%_)Xk9Hn0qgAlnNXv)2{{H~@16q{; delta 1149 zcmZWoO=uHA6yEI5JWQKlM8&G;HXC|~|Dz}@8c~BFSX$a5coEaOm7ung2DRE4QB*t? z$syEQYm7D8gD7~iD0Nq~8yys(J$Mnpf)Wsd^q_~uH@mIB%g)<*-+b@Q%=g~j4~zz~ zEHCfc+Y;Z?qV6+NJ<0Aab;DYkP@6i^-R(w7rR(WNwY^tuOq^0%I}%++!0(T++p>O6 zaD?((CA19m^TO1Q_x-Xn|6RXKZ-Rb7aCEcZrAXyTUuZMv7X@bxhb{?D+|2l5K3W26 z(&w}V%~zgB@4*bqU%j$5i|~HrBIhpXccEl{_Ob0ss09#Y%amY%DFSOy^qbJMLSQ{4 z^9T=7#`Y=pMKk7sa@%y4)g3@zIVpXYrlQ^y4!=$ooHOTCp6di$8 z;SuO7nGIrw8?Hz^nKDp-RIl1`)JUX^Lu=JQgw=v22nV!%m2e&^p?QM4+Zi!bBh+ye zhgJy>Kte`yt|sC&{`bJb!6o#zU%( zZ^D})IujiL?hL>jJOK8V?R_f`XI6IG{OqaZ2}4&SsLzWXEU3hEG^iUcwYrz;QJb-_ zZK*`Z5l*`XtSal6w93_G`K~{1-HO27hs6H(G7#?CdepJjo50F!Y-+w^h1Z zJ()_T-7I%p(#R~yy(Y`&9*B#w!?TzjErN!ERPd60kH<4(di zO7by-1|2sjrt;<1U!39}9MsMZ&coKk9{G4yn|2}-$g}ctuogjVuUB%$*)UF*0{`Qh z*EOme)wq$yiWrATz#qZV#-Fa4;EO2<=D0 Niy=ru3vxB2_!BX0r-1+f diff --git a/Source/RomDsk/ROM_896KB/CLRDIR.COM b/Source/RomDsk/ROM_896KB/CLRDIR.COM index 9c00904f82c7205a7345b5aab848cc0caaed4e73..068bfb4c7e0c0567b7d9b9560913a63c5fe4a9b8 100644 GIT binary patch literal 1710 zcmZ`(O>7%Q6drHv8O5zld}#SqGO;ZonI zQC#sOxa1gdLLm)lWTk(na)ATETas+hRs^a_a6qac2+7K!NCCvb@MhLdN)fBww=?g3 z@6DU{=PY^$hfgPlPSZ)I8>&{I{k?LUj-<*|?vtOS=`yU((uqu}zyf}M)H&}}-bM|y zbJG{YDJU#V6Z&Pm@L~%M>U#NjTt(pt0pt(oSM(mG^0hP=QRBc z%hG^9%B@Yo5n%c7340vYQ>&K#~>1K)Q*mX?%G zQr$Trh2A8}D!JA6*9pl2{zXZ-M5@>SmYn^z?mlTxxdKL!*9v=`8*Q<5@>qDC%vWn+ zslo|3pHOvhSkucilV>TNdme~79mGQD)yQN${1K^#+L1VHP6{1E4{|Pik$QNE)Fb?H zcgyZhD6Nn>*VvAnlUIoyTOr{!(v48KN@B|-;`}bb3yug3cwgNjL@3j-T+U!7xABPptQ-MaCz+a?X%4z5K)_}c6?D(DsN!?e;TqICCX!F5md#)1a z9W1gv>;?6aL=1A}e2Nnz&H{Fp@jZw&KsX=b|03719Z$Bx7h5BH^AMoh6(Fz?I&sRy z6Ni}UT^NX@9c+g(g@U<#F0$8%ZUfF*^ahUu6H0B%TWR!f$ejd2FgX7B2z`Pkm?@eB zI)LYKgmXtVlMa@2ofXV{nNF07MNNl35?zAOK^Hs@@`33)?$7?^zRkXd^5-V8Ukgfb zlpXYN8V_(c{XlF*Lh_ebzK-QBEbn01!SXj){tojqUrOl(wJ=S4sQHF!(2}X1bSoRc670Psm zm8k}1b+G~|JFA+#U@zorOmW9vG*Z)08qLx6Y?jw}oW9(XI7NG=UJ3XId6)jbW87n- z$TDh9h2RP8UYLGkVmcX0z~7Ug^o2qyorjyTbZMGuC9_yE0n{@^X+om~NJI+e7ECE9 z(?U+w&!qTh14I;Z%&WO}6I)+kvHA&H+wST|Y<=afzQp@ZiCQDO6)r9d_>TtS=veY_D1ylCbkV;Cjnk+4 WW%_)Xk9Hn0qgAlnNXv)2{{H~@16q{; delta 1149 zcmZWoO=uHA6yEI5JWQKlM8&G;HXC|~|Dz}@8c~BFSX$a5coEaOm7ung2DRE4QB*t? z$syEQYm7D8gD7~iD0Nq~8yys(J$Mnpf)Wsd^q_~uH@mIB%g)<*-+b@Q%=g~j4~zz~ zEHCfc+Y;Z?qV6+NJ<0Aab;DYkP@6i^-R(w7rR(WNwY^tuOq^0%I}%++!0(T++p>O6 zaD?((CA19m^TO1Q_x-Xn|6RXKZ-Rb7aCEcZrAXyTUuZMv7X@bxhb{?D+|2l5K3W26 z(&w}V%~zgB@4*bqU%j$5i|~HrBIhpXccEl{_Ob0ss09#Y%amY%DFSOy^qbJMLSQ{4 z^9T=7#`Y=pMKk7sa@%y4)g3@zIVpXYrlQ^y4!=$ooHOTCp6di$8 z;SuO7nGIrw8?Hz^nKDp-RIl1`)JUX^Lu=JQgw=v22nV!%m2e&^p?QM4+Zi!bBh+ye zhgJy>Kte`yt|sC&{`bJb!6o#zU%( zZ^D})IujiL?hL>jJOK8V?R_f`XI6IG{OqaZ2}4&SsLzWXEU3hEG^iUcwYrz;QJb-_ zZK*`Z5l*`XtSal6w93_G`K~{1-HO27hs6H(G7#?CdepJjo50F!Y-+w^h1Z zJ()_T-7I%p(#R~yy(Y`&9*B#w!?TzjErN!ERPd60kH<4(di zO7by-1|2sjrt;<1U!39}9MsMZ&coKk9{G4yn|2}-$g}ctuogjVuUB%$*)UF*0{`Qh z*EOme)wq$yiWrATz#qZV#-Fa4;EO2<=D0 Niy=ru3vxB2_!BX0r-1+f diff --git a/Source/RomDsk/ReadMe.txt b/Source/RomDsk/ReadMe.txt index 5fe0d7ed..c5fdee56 100644 --- a/Source/RomDsk/ReadMe.txt +++ b/Source/RomDsk/ReadMe.txt @@ -9,10 +9,15 @@ This is the parent directory for all files to be included in the ROM Disk when a ROM is built. -When constructing the ROM disk as part of a build, the build process +When constructing the ROM Disk as part of a build, the build process first grabs all of the "standard" files for the size of ROM being -built. So, if you are building a normal 512KB ROM, all of the files -in ROM_512KB directory will be pulled in. +built. Note the table at the bottom of this file which indicates +the size of the ROM Disk that will be created depending on +the size of your ROM chip and the boot type of your system. The +size of your ROM Disk determines which sub-folder will be used to +pull in your files. For example, if you are using a typical 512KB +ROM chip and a normal ROM Boot process, you will have a 384KB ROM +Disk and the files will come from the ROM_384KB sub-folder. You may freely add/delete/update the files in these directories to change the contents of the ROM Disk of your ROM firmware. @@ -27,16 +32,22 @@ BuildROM script: The resulting ROM Disk is still OK to use, but will not contain the file(s) that did not fit. -RomWBW also supports the concept of a "ROMless" system in which an -external bootstrap pre-loads the RAM. The RAM_xxxKB directories -contain the files to be used for such systems. Note the size of the -RAM disk on a 512KB ROMless system is not the same as the RAM disk -on a normal system. This is due to different bank layout and overhead. - -System ROM Disk Image RAM Disk Image ------- -------------- -------------- -128KB n/a n/a -256KB 128KB ROM Disk n/a -512KB 384KB ROM Disk 256KB RAM Disk -1024KB 896KB ROM Disk 768KB RAM Disk ??? -2048KB n/a 1792KB RAM Disk ??? \ No newline at end of file +The table below indicates the size of the ROM Disk that you will +have based on your ROM chip size and boot type. The common boot +type is a ROM Boot where your system boots from code on the ROM. +Alternatively, some systems provide a ROMless boot where the +code is loaded from somewhere else (typically a disk or CF/SD Card). +In this case, you actually have no ROM disk, but instead you get +a pre-loaded RAM disk. + +A normal ROM Boot system will have a ROM Disk that is 128KB less +than the size of the ROM chip. A ROMless Boot system will have a +ROM Disk that is 256KB less than the size of the ROM chip. + +ROM Chip ROM Boot ROMless Boot +-------------- -------------- -------------- +128KB n/a n/a +256KB 128KB ROM Disk n/a +512KB 384KB ROM Disk 256KB RAM Disk +1024KB 896KB ROM Disk 768KB RAM Disk +2048KB n/a 1792KB RAM Disk \ No newline at end of file diff --git a/Source/ver.inc b/Source/ver.inc index d9157629..cd0508b2 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.34" +#DEFINE BIOSVER "3.5.0-dev.35" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index bd52da34..7958f07b 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.34" + db "3.5.0-dev.35" endm From dd93a178faeba3cc1699a9f4ce75ffb8bc40defe Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 May 2024 11:15:45 -0700 Subject: [PATCH 11/20] Update nabu.asm - Initialize PSG I/O ports for NABU --- Source/HBIOS/nabu.asm | 50 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index b8ecfb9a..817c6ef3 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -2,18 +2,66 @@ ;================================================================================================== ; NABU INTERRUPT INTERCEPTOR ;================================================================================================== +; NABU_INT1CLR .EQU $68 NABU_TICCNT .EQU $FFEA ; TICCNT AT $FFEA IS COPIED DOWN TO $000B +; +; NABU INTERRUPT ENABLE PORT AND STATUS PORTS ARE MANAGED BY THE +; PSG IO PORTS. +; +; INTERRUPT ENABLE (OUTPUT) - PSG PORT A +; +; D7 - HCCA Receive +; D6 - HCCA Send +; D5 - Keyboard +; D4 - Video Frame Sync +; D3 - Option Card 0 (J9) +; D2 - Option Card 1 (J10) +; D1 - Option Card 2 (J11) +; DO - Option Card 3 (J12) +; +; STATUS BYTE (INPUT) - PSG PORT B +; +; D7 - N.C. +; D6 - Overrun Error (HCCA UART) +; D5 - Framing Error (HCCA UART) +; D4 - Printer Busy +; D3 - A2 Priority +; D2 - A1 Priority +; D1 - AO Priority +; DO - Interrupt Request +; +; PORTS TO MANAGE PSG +; +NABU_RSEL .EQU $41 ; SELECT PSG REGISTER +NABU_RDAT .EQU $40 ; WRITE TO SELECTED REGISTER +NABU_RIN .EQU $40 ; READ FROM SELECTED REGISTER ; DEVECHO "NABU: IO=" DEVECHO NABU_INT1CLR DEVECHO "\n" - ; ; ; HARDWARE RESET PRIOR TO ROMWBW CONSOLE INITIALIZATION ; NABU_PREINIT: + ; INITIALIZE THE NABU PSG I/O PORTS + ; PORT A IN WRITE MODE AND SET ALL BITS TO ZERO + ; PORT B IN READ MODE +; + ; SET I/O PORT MODES + LD A,7 ; PSG REGISTER 7 (ENABLE REG) + OUT (NABU_RSEL),A ; SELECT IT + LD A,%01000000 ; PORT B INPUT, PORT A OUPUT + OUT (NABU_RDAT),A ; SET IT +; + ; SET PORT A TO VALUE 0 + LD A,16 ; PSG REGISTER 16 (PORT A DATA) + OUT (NABU_RSEL),A ; SELECT IT + XOR A ; VALUE 0 + OUT (NABU_RDAT),A ; SET IT +; + ; ADD TO INTERRUPT CHAIN LD HL,NABU_STAT CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST RET From a6505fbbb15f9198e63a8a9bda30812624365882 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 May 2024 11:24:38 -0700 Subject: [PATCH 12/20] Update ay38910.asm - Exception for NABU in PSG initialization --- Source/HBIOS/ay38910.asm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index bc2a431a..bd2671b9 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -278,8 +278,14 @@ AY_TIMTIK .DB 0 ; COUNT DOWN TO FINISH BOOT BEEP ;====================================================================== ; AY_INIT: +#IF (AYMODE == AYMODE_NABU) + ; I/O B=INPUT, I/O A=OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE + LD DE,(AY_R7ENAB*256)+$78 ; SET MIXER CONTROL / IO ENABLE. $78 - 01 111 000 +#ELSE + ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE LD DE,(AY_R7ENAB*256)+$F8 ; SET MIXER CONTROL / IO ENABLE. $F8 - 11 111 000 - JP AY_WRTPSG ; I/O PORTS = OUTPUT, NOISE CHANNEL C, B, A DISABLE, TONE CHANNEL C, B, A ENABLE +#ENDIF + JP AY_WRTPSG ; AY_CHKREDY: LD A, (AY_READY) From 4946b313e1e552e5aaf7d2e3d09fb294230ad927 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 May 2024 13:10:44 -0700 Subject: [PATCH 13/20] Update nabu.asm - Fix R16 register addressing --- Source/HBIOS/nabu.asm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index 817c6ef3..6862337a 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -50,13 +50,13 @@ NABU_PREINIT: ; PORT B IN READ MODE ; ; SET I/O PORT MODES - LD A,7 ; PSG REGISTER 7 (ENABLE REG) + LD A,7 ; PSG R7 (ENABLE REG) OUT (NABU_RSEL),A ; SELECT IT LD A,%01000000 ; PORT B INPUT, PORT A OUPUT OUT (NABU_RDAT),A ; SET IT ; ; SET PORT A TO VALUE 0 - LD A,16 ; PSG REGISTER 16 (PORT A DATA) + LD A,14 ; PSG R16 (PORT A DATA) OUT (NABU_RSEL),A ; SELECT IT XOR A ; VALUE 0 OUT (NABU_RDAT),A ; SET IT From 337374c9e9597f6547dc62ec87c171a0785dd0fc Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 May 2024 14:53:58 -0700 Subject: [PATCH 14/20] More HBIOS Cleaning, FLASH & FAT App Updates - Additional HBIOS reorganization - no functional changes (in theory) - Upgrade to v1.3.8 of FLASH4 from Will Sowerbutts - Upgrade to FAT v1.1 based on input from Peter (@z80micro-mc) Co-Authored-By: Will Sowerbutts --- Source/Apps/FAT/ReadMe.md | 35 +- Source/Apps/FAT/fat.com | Bin 40432 -> 40441 bytes Source/HBIOS/asci.asm | 2 +- Source/HBIOS/hbios.asm | 2138 +++++++++++++++------------- Source/HBIOS/std.asm | 26 +- Source/Images/Common/All/FLASH.COM | Bin 13361 -> 13510 bytes Source/RomDsk/ROM_256KB/FLASH.COM | Bin 13361 -> 13510 bytes Source/RomDsk/ROM_384KB/FAT.COM | Bin 40432 -> 40441 bytes Source/RomDsk/ROM_384KB/FLASH.COM | Bin 13361 -> 13510 bytes Source/RomDsk/ROM_896KB/FAT.COM | Bin 40432 -> 40441 bytes Source/RomDsk/ROM_896KB/FLASH.COM | Bin 13361 -> 13510 bytes Source/ver.inc | 2 +- Source/ver.lib | 2 +- 13 files changed, 1200 insertions(+), 1005 deletions(-) diff --git a/Source/Apps/FAT/ReadMe.md b/Source/Apps/FAT/ReadMe.md index c54eda9f..1c76023b 100644 --- a/Source/Apps/FAT/ReadMe.md +++ b/Source/Apps/FAT/ReadMe.md @@ -1,7 +1,7 @@ # RomWBW HBIOS CP/M FAT Utility ("FAT.COM") Author: Wayne Warthen \ -Updated: 6-Jan-2024 +Updated: 6-May-2024 This application allows copying files between CP/M filesystems and FAT filesystems (DOS, Windows, Mac, Linux, etc.). The application runs on @@ -72,6 +72,38 @@ creation. - Wildcard matching in FAT filesystems is a bit unusual as implemented by FatFs. See FatFs documentation. + - The `FAT FORMAT` command will not perform a physical format on + floppy disks. You must use FDU to do this prior to using + `FAT FORMAT`. + + - Formatting (`FAT FORMAT`) of floppies does not work well. The + underlying FatFs library uses some non-standard fields. The + resulting floppy may or may not be useable on other systems. It is + best to format a FAT floppy on a Windows or DOS system. You should + have no problems copying files to/from such a floppy using `FAT`. + +### Known Issues + + - CP/M (and workalike) OSes have significant restrictions on filename + characters. The FAT application will block any attempt to create a + file on the CP/M filesystem containing any of these prohibited + characters: + +| `< > . , ; : ? * [ ] |/ \` + + The operation will be aborted with "`Error: Invalid Path Name`" if such + a filename character is encountered. + + Since MS-DOS does allow some of these characters, you can have + issues when copying files from MS-DOS to CP/M if the MS-DOS filenames + use these characters. Unfortunately, FAT is not yet smart enough to + substitute illegal characters with legal ones. So, you will need to + clean the filenames before trying to copy them to CP/M. + + - The FAT application does try to detect the scenario where you are + copying a file to itself. However, this detection is not perfect and + can corrupt a file if it occurs. Be careful to avoid this. + ### License: GNU GPLv3 (see file LICENSE.txt) @@ -123,3 +155,4 @@ creation. | 12-Oct-2023 | v0.9.9 | (beta) handle updated HBIOS Disk Device call | | 6-Jan-2024 | v1.0.0 | updated to latest FsFat (v0.15) | | | | updated to latest SDCC (v4.3) | +| 6-May-2024 | v1.1.0 | improve floppy format boot record | diff --git a/Source/Apps/FAT/fat.com b/Source/Apps/FAT/fat.com index 004760fb940c187beeb0296a99fb945dd4ed60c2..9c6d2f2c092cd2f5162cc0ba42b4aa266ab4d04c 100644 GIT binary patch delta 2404 zcmZ8idr(tX8owt|=jb*jrVE}m;=pv5* ziNFC`EE1=$>5RKR_Exh~*VzJ1XNa2}DUE;Z?r}?<>}U~czy}c{``rW_*MGk6e82B^ ze&6GS%Y$n?`!!xrm>U&I+0B1BYxw)b5QC_=M#>;TVmcC;b1ny^x}mSw-@Ebs(QjF0 zP?9^i3n80%$j(|es}SUNOWF~NW-XyY9z-+Y!${zv7jN{?$9d>^{5Vhi*NAU{-4to_ zMbWrYz8lD2%OBBb9$(GO7DS)5*$_n;*CZLu(KsM0A4t_%*U?uvHk-iNHzx$_ww&O= z&Ow_k#mG>UH8ROc3jRs5|3#GlCJJKi#N|2KbWX`?A!+wX^0bkp{X~+dK=Q2Zj$<-K zK0ZmxACs~tucTkmoF&tttV9j$$0Zs* ztYFJ~C%}d(Q}BcLwxM}8RCyeMJ6pOJp+Do9vhB3DelvA6)FVxtY-ExvtY!;ND))=s zst@zhFQLacw996rS5RY~JNEuMRh0aCrYK8Qa;!vEBdUsujM^fKjz}%4VKwDP5W3IW zDs~``qo;|TOpcl7*#wo07sv^WA3Y?#1CKFj^-yl6j20_%r)r71EvM_)spA*F*^erwBXIqSns*ckdt|=B;x)@JNW_J;2 z5JjzZRwE?iYty~wyO>iBnVrtBho?5r;WM>upenAb^5I&v4I4?pbCSJSQfTINmws6Zi|YJPL9-2=H9MkJpoG zyFv5|rm)euLK5>_#3wO}L~XxyShSi^a4-&R2w%n31{9-H@vNpH3ktFSX{_XdW>!nxPW8{Gnb zf0N~tbQB=G?nx-?W^S)b7v|BiFChud>B3!f+)D`Ek}j0eiOYx#uBEi43qxr6G6cwZ zO}fyBenSh&PT_|T^Vay*7$hrdpfa;ZYwly$blyP?0)5;XJtNRx6|JBtYAj5kR~saO z2aTTBByI-2Xg>YTn%rSl;sFWqMuA>cBBw66AyP zyEcHW>-x;&twEw*ytQd00f%;13OWW!%+nFS9ul)K>W9yFr@2@35a~TMT7glICONOc~C6t|>RtdB}sr=;3}M zy$gLq`#-tdl*>)K+zdGEi?@ckM(*tAMh2^NBZ^gGF{yMTs#W3P@a-hW38}a}WxkJ9 zSOpurhj+Ve@0)3yRbg50F9A5vyI~vLR6ivB&xraF8FGBbh0jR;!&0JlkfBFMPQD$^ zni~79@b!F5vY#Z1h;p7N?B))9p*IpFNUt!cV{n*H3T_*T@-b07vAP)G=IYFHO!oyM zIgaQ{1oE-IAQXi)eYvOv|JWBA=GU_%dvaNoQ!0N-$`*v*5cLCt2_E#ubh62UWBW7E zP2AQm2YaLcZFG~Be6STE4KDmpk2-n=WFTKQunzAV2zH(#oYo(IIgkq{!I^J^eY#1^ z&!P?z^FY`_)IXEzr%-`ZFOVB|lTCiuc1Gy?qMw(>4Ejj&|35Bv-$#EyNQJ*2WWYWi z{5&&NTdb|n_G&-Xvf2^t_u3z|_q6j`cb&g3RJUE1qdTZm=xTL3-8tPCx+^;5Po20d g@n-BpQpyWXEAumbr!S#M4t0nB+RSG|)0f8n2h*ExiU0rr delta 2441 zcmZ8ieN>az8GmmQnBk-J6|3Q6F0VnCAhP1YU>F}ObZLP}obpv#DT>8r+91eR1R^tn zL`ej$U{NGJ?bdy?Q#r4bv$37C$kL8ivNL*y=j`LUayaR+Fu*XWMhMySCZTiw^E~(d zp5OgFANS^sdqnVHL=YPvOeIoo$Mvhjk ztBcKC2ku(jHUWCTPHwA35X+UHLrB3+DkK8f&2P7%aLOv%LRnKOt3a5F@b7kf0&HWV zD-tPiT~;oT|B$srqXm4cpeS5%)#XAIWq&Ty?oi;U!UI5RDEvJd!n=wHtRsu#!0s;I z9Ag}Cx$^7`ML82QouusVr05?+_fJwu97bGSY}W8f&PkI0Z=#;Fll&Q?o(0LPu4&Iy zUe?4Ess4%_fAmcF8O=pf^dF*oNGg{=b5F?^Pr%b7>SBVegj~2w{_6R)rKF z{Hlx(Tzk_5weBt-gSFsbC0Omjw_y;U9o&bI5pS)i0LWDFF_4spQ=#|j!!HJ*diH&- zNeClIc&8DpLYIdhyt5lEunOG?1nz3pUW9&u=Z}An4z_Nijw;0YGPRvi*Ek*HIJ5eN zU5VCsfi-|05?@S^DtF`_)Ul@OBM42i zu9|ElK6HV&$<&x*flaSf31WDGiKB;P({LG6PO)wqWuJ61(+zyW?)pu9e1Z{EQL_-& zmPb7uXGiNB1!x?n>D6G3`nYHyOQMKwl~j76ZdsYEXwuHqHt||EeT8JaiwU7rZa;wr zQFOM+X@_9iNlnB;7jwp=a?=Nz;i?@o`0~jPP?a^+ujfm2+3cijl@xikHXeixxm9AYS>xeLrHnAe{BuKA62yuT;3a^cXeJHr zVd?Wsd8==PBzaXTB*|W4aNj*F4Pz>K7{{F2{tZ4ipctJ=V@;n)L#|rgvBx%WP=l4_`BGfeIb4z@>^Nv|a2eW*X!o^e$;)aSk_Kf&j)t_` z*Fb#e%ng1HCwSt<4*wjOwkR}%zuWc`=<)Nmm)3fGO8|M#L0%5;Y)^xFs@gZNhkDKm zRZbpvGT-jt>#(-J1r-FHePtsE|9C~^zD^oeNP~xNG5Pfmoh<<6;j`)A3{39`uiVNj zUtkQpkj2Cc(H#dssH!8KukbJYO)Ul#MmkbA0X7eq2Q)n@j}oj5EW%-?EwcRc&$OI# z-VWFJUahU^{WO?C=x7f9p(zXH;EN_{XxP^p5%^E0Snb~PkR5KpCZYYOCYeiXkeyle zFCCAnZ6{f2DD!-$k9}RDv@;3*wT+I@UT$&So4a$#Ky|S5Rh#VSta-8UKd&8ML5YKi56LvQ~>7>`r;FC zbz4Mih20R<~iMwt3FCsJ^;K57KQJzZV z^ypSSm0suDdWRUF>H4X7-vBXq?{2-FjCXd|g`XZE$xm*F^^oM{(J*|oJAa+FhbX^9 zqgou&BaMX(kQ1dFh`~iZTui&I?SVJ!A`Oc`Q1>WKc`;Ae&OP?|9rBa>Hj4|s$op(= zgU`RrsrvZ6nk)4AS2@3KP5{ph?0+CH=4l!(+eh2W-R$M}`?(UIOhJHF$mRIrC7dSF zwR*6-&0ZXO(t#VLW7jeUH}MqG|#(KK$swJ^d(oO>#zcfNJ; zXs`b}xt-Lll3Fi({=OnbkBDKJ=pK_wx8wAHO-RZJDY_R)P7qRaPr{PwC*=4txpQC5 zfwbWv>02R&B{JywjNh)1zK2!B;30!cM_S(4&T!gox;F-_vNvP1@BXAT^dbohlu)-qYCYu6f|`@#p578vj%Rxn@nJmy zv6eM0z6W2?l0Oo|gJBLH!JRoZH;yy<_MuO4cV8CRzxKU>K4p_Gr6AObweMPCO5%PM z*zEpYVDZZ z|Njcv(krJCI*Q2v1J*n6VZqDhQnS{4-h9RUOY?8ccg%k?e{Nndd(Gh%sU^jdZz-}I wuvA;xESD@+%f}Y9k!l>0M=%ctl~gFKf({f!&fP$XJh~44+L?jDxf^5u1rr~gBme*a diff --git a/Source/HBIOS/asci.asm b/Source/HBIOS/asci.asm index 85cbb0f5..5f6c00dd 100644 --- a/Source/HBIOS/asci.asm +++ b/Source/HBIOS/asci.asm @@ -618,7 +618,7 @@ ASCI_DETECT: ; Z180 DIVISOR IS ALWAYS A FACTOR OF 160 ; ; CNTLB= XXPXDSSS -; FAILSAVE = 00100000 +; FAILSAFE = 00100000 ; ; PS (PRESCALE): 0=/10, 1=/30 ; DR (DIVIDE RATIO): 0=/16, 1=/64 diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 05f5fde8..f348a336 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -72,7 +72,7 @@ ; HBIOS Control Block 0x0100 0x0100 ; Proxy Image 0x0200 0x0200 ; Entry Vectors / Stack 0x0400 0x0100 -; Interrupt Vectors 0x0500 Varies +; Interrupt Vector Table 0x0500 Varies ; System Initialization Varies Varies ; Function Dispatching Varies Varies ; System API Varies Varies @@ -682,7 +682,7 @@ HBX_ROM: OR A ; SET FLAGS JP P,HBX_ROM ; BIT 7 INDICATES RAM OUT (MPCL_ROM),A ; ENSURE ROM PAGE OUT OF MEMORY BEFORE SWITCH - ; SEE MBC RUNTIME MEMORY SIZE ADJUSTMENT + ; SEE MBC BANK SELECT MASK SETUP ROUTINE ABOVE HBX_MBCMSK .EQU $+1 ; FORCE TOP 32K ; MASK POPULATED XOR %00000000 ; TO BE IN FIRST CHIP ; DURING INITIALIZATION OUT (MPCL_RAM),A ; SET RAM PAGE SELECTOR @@ -1320,6 +1320,10 @@ HB_IM1INT: CALL HB_BADINT \ RET NZ CALL HB_BADINT \ RET NZ ; +HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST +HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST +HB_IM1PTR .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY +; HB_INTVEC_END .EQU $ ; ;================================================================================================== @@ -1594,6 +1598,13 @@ Z280_INITZ: OUT (EIPC_SCDP),A ; SET SYSTEM CONTROL DATA PORT (SCDP) #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; PLATFORM MEMORY MANAGEMENT INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; +; INITIALIZE MEMORY MANAGERS AS NEEDED TO ADDRESS BOOT ROM IN LOW 32K +; AND COMMON RAM IN HIGH 32K. SETUP MMU FOR BANKING IN LOWER 32K. +; ; Z180 MINI-ITX MADNESS TO INITIALIZE THE PPIO. WE HAVE THE MAIN RAM AT ; $8000 AND ROM AT $0 AT THIS POINT AND THE Z180 MMU SET UP. NOW ; GET THE 82C55 PROGRAMMED. @@ -1629,8 +1640,7 @@ ROMRESUME: ; #ENDIF ; -; INITIALIZE MEMORY MANAGERS AS NEEDED TO ADDRESS BOOT ROM IN LOW 32K -; AND COMMON RAM IN HIGH 32K. +; SBC AND MBC MMU INITIALIZATION ; #IF ((MEMMGR == MM_SBC) | (MEMMGR == MM_MBC)) ; SET PAGING REGISTERS @@ -1641,29 +1651,53 @@ ROMRESUME: #ENDIF #ENDIF ; +; ZETA 2 AND DUO MMU INITIALIZATION +; +; ZETA 2 MMU USES 4 16K PAGES TO MAP PHYSICAL MEMORY TO CPU MEMORY. +; HBIOS USES THE LOWER 2 16K PAGES FOR BANKING AND UPPER 2 16K PAGES +; FOR COMMON. NORMALLY, A ZETA 2 BASED SYSTEM WILL CONTAIN 512K OF +; PHYSICAL ROM FOLLOWED BY 512K OF PHYSICAL RAM. DUO USES A PHYSICAL +; ADDRESS SPACE OF 4096K WITH THE FIRST 2048K AS ROM AND THE FOLLOWING +; 2048K AS RAM. THE SIZE OF ROM AND RAM CAN VARY FOR DUO, BUT THE +; RAM BOUNDARY IS ALWAYS AT 2048K. +; #IF (MEMMGR == MM_Z2) - ; SET PAGING REGISTERS +; #IFDEF ROMBOOT + ; IF THIS IS A ROM BOOT, SETUP THE FIRST 2 16K MMU REGISTERS + ; TO MAP THE LOWEST 32K OF PHYSICAL ROM TO THE LOW 32K OF + ; CPU ADDRESS SPACE (BANKING AREA). THE FIRST 16K MAPPING IS + ; REDUNDANT BECAUSE WE ARE ALREADY RUNNING IN THIS AREA. THE + ; MAPPING OF THE SECOND 16K IS CRITICAL BECAUSE ALL ZETA 2 + ; MMU REGISTERS WILL BE 0 AT RESET! XOR A - OUT (MPGSEL_0),A + OUT (MPGSEL_0),A ; PROG FIRST 16K MMU REGISTER INC A - OUT (MPGSEL_1),A + OUT (MPGSEL_1),A ; PROG SECOND 16K MMU REGISTER #ENDIF ; #IF (PLATFORM == PLT_DUO) + ; DUO HAS VARIABLE RAM SIZE. RAM ALWAYS STARTS AT 2048K. + ; SETUP COMMON RAM FOR HIGHEST 32K OF RAM BASED ON TOTAL RAM. LD A,128 + (RAMSIZE / 16) - 2 #ELSE + ; NORMAL ZETA 2 SYSTEM HAS FIXED 512K OF RAM. SETUP COMMON + ; FOR TOP 32K OF THIS. LD A,64 - 2 #ENDIF ; - OUT (MPGSEL_2),A + OUT (MPGSEL_2),A ; PROG THIRD 16K MMU REGISTER INC A - OUT (MPGSEL_3),A + OUT (MPGSEL_3),A ; PROG FOURTH 16K MMU REGISTER ; ENABLE PAGING LD A,1 - OUT (MPGENA),A + OUT (MPGENA),A ; ENABLE MMU NOW #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; PROXY INSTALLATION +;-------------------------------------------------------------------------------------------------- +; ; AT THIS POINT, RAM SHOULD BE AVAILABLE IN THE COMMON BANK ; (TOP 32K). ; @@ -1678,7 +1712,7 @@ ROMRESUME: ; CHECK BATTERY BACKUP STATUS BEFORE WE TOUCH RAM (UPPER MEMORY) ; ; IF A DS1210 POWER CONTROLLER IS INSTALLED AND BATTERY BACKUP IS NOT INSTALLED -; OR IS LESS THAN 2V THEN THE DS1210 WILL BLOCK THE SECOND RAM ACCESS. +; OR IS LESS THAN 2V THEN THE DS1210 WILL BLOCK THE *SECOND* RAM ACCESS. ; FAILURE TO COMPLETE TWO RAM ACCESSES BEFORE INSTALLING PROXY WILL RESULT ; IN THE ROM ID BYTES NOT BEING COPIED CORRECTLY AND CP/M APPLICATIONS ; WILL NOT START CORRECTLY WHEN THEY CHECK THE ROM ID VERSION BYTES. @@ -1689,27 +1723,31 @@ ROMRESUME: ; LD HL,HBX_LOC - 1 ; POINT TO BYTE XOR A ; ZERO MEANS LOW BAT - LD (HL),A + LD (HL),A ; FIRST RAM ACCESS INC A ; 1 MEANS BAT OK - LD (HL),A + LD (HL),A ; SECOND RAM ACCESS (BLOLCKED IF BATTERY ISSUE) ; ; INSTALL PROXY IN UPPER MEMORY ; - LD DE,HBX_LOC ; AS PER ABOVE - LD HL,HBX_IMG - LD BC,HBX_SIZ - LDIR + LD DE,HBX_LOC ; RUNNING LOCATION OF PROXY + LD HL,HBX_IMG ; LOCATION OF PROXY IMAGE + LD BC,HBX_SIZ ; SIZE OF PROXY + LDIR ; COPY IT ; ; NOTIFICATION THAT WE HAVE COMPLETED HARDWARE INIT. ; FPLEDS(DIAG_02) ; +;-------------------------------------------------------------------------------------------------- +; S100 MONITOR LAUNCH +;-------------------------------------------------------------------------------------------------- +; ; S100 ROM CONTAINS A HARDWARE LEVEL MONITOR IN BANK ID 3 OF ROM. ; IF PORT $75 BIT 1 IS SET (SET IS ZERO), THEN WE IMMEDIATELY ; TRANSITION TO THIS MONITOR. PRIOR TO THE TRANSITION, WE ALSO ; CHECK THE VALUE IN THE Z180 RELOAD REGISTER LOW. IF IT IS ASCII 'W', ; THEN IT MEANS THE S100 MONITOR IS ATTEMPTING TO REBOOT INTO ROMWBW -; HBIOS. +; HBIOS AND WE ABORT THE TRANSITION TO THE S100 MONITOR. ; #IF ((PLATFORM == PLT_S100) & TRUE) ; CHECK S100 BOARD DIP SWITCH, BIT 1 @@ -1734,6 +1772,10 @@ S100MON_SKIP: OUT0 (Z180_RLDR1L),A #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; RTC LATCH INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; ; WE CAN NOW DO THE REAL INITIALIZATION OF THE RTC LATCH BASED ON ; (RTCDEFVAL). AT THIS POINT WE SHOULD HAVE ACCESS TO THE ROM LOCATION ; WHERE RTCDEFVAL IS STORED AND THE PROXY IS INSTALLED IN UPPER RAM @@ -1746,199 +1788,131 @@ S100MON_SKIP: OUT (RTCIO),A ; SET IT DIAG(1) ; REAPPLY CURRENT DIAG LED SETUP ; -#IFDEF TESTING +;-------------------------------------------------------------------------------------------------- +; DYNAMIC RAM SIZER (IN DEVELOPMENT) +;-------------------------------------------------------------------------------------------------- +; +#IFDEF SIZERAM ; ; THIS IS WHERE WE PROBE FOR THE ACTUAL NUMBER OF RAM ; BANKS AVAILABLE IN THE SYSTEM. THE PROBE CODE NEEDS ; TO BE COPIED TO AND RUN FROM THE COMMON RAM BANK. +; + + #IF (MEMMGR == MM_MBC) + ; MBC REQUIRES A BANK SELECT MASK TO BE SETUP IN THE MBC + ; BANK SELECT ROUTINE. HOWEVER, THE MASK IS DERIVED FROM THE + ; TOTAL SIZE OF THE RAM IN THE SYSTEM (SEE MBC BANK SELECT + ; MASK SETUP BELOW). SO, WE HAVE A CATCH-22 + ; HERE FOR MBC. THE DYNAMIC RAM SIZING REQUIRES THE THE MASK + ; AND THE MASK SETUP REQUIRES THE TOTAL RAM SIZE. SO, FOR MBC, + ; WE CAN'T DO DYNAMIC RAM SIZING. +; + .ECHO "*** ERROR: DYNAMIC RAM SIZING NOT POSSIBLE FOR MBC!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR + #ENDIF ; LD DE,$F000 LD HL,RS_IMAGE LD BC,RS_LEN LDIR CALL RS_START - JP RS_IMAGE + RS_LEN -; -; CODE THAT IS COPIED TO $F000 TO PERFORM RAM SIZE DETECTION -; -RS_IMAGE: - .ORG $F000 -RS_START: - LD A,(HB_CURBNK) ; GET CURRENT BANK - PUSH AF ; SAVE IT - - LD C,0 ; RUNNING BANK COUNT - LD HL,$7FFF ; BYTE TEST ADDRESS - LD IX,RS_ARY ; ORIG BYTE STORAGE ARRAY PTR -RS_LOOP1: - LD A,C - ADD A,$80 ; OFFSET BY START OF RAM BANKS - CALL HBX_BNKSEL ; SELECT THE BANK - - LD A,(HL) ; GET ORIGINAL VALUE - LD (IX),A ; SAVE IT TO RESTORE LATER - INC IX ; BUMP IX - - LD A,$AA ; TEST LOC WITH $AA - LD (HL),A ; AVOID PROBLEMS WITH - LD (HL),A ; ... DS1210 - LD (HL),A - LD A,(HL) - CP $AA - JR NZ,RS_DONE - - LD A,$55 ; TEST LOC WITH $55 - LD (HL),A - LD A,(HL) - CP $55 - JR NZ,RS_DONE - - ; STORE A UNIQUE VALUE - LD A,C - LD (HL),A - OR A ; ZERO? - JR Z,RS_NEXT ; SKIP STORED VALUE CHECK - - ; VERIFY ALL STORED VALUES - LD B,C ; INIT LOOP COUNTER - LD E,0 ; INIT BANK ID -RS_LOOP3: - LD A,E - ADD A,$80 - CALL HBX_BNKSEL - LD A,(HL) - CP E ; VERIFY - JR NZ,RS_DONE ; ABORT IF MISCOMPARE - INC E ; NEXT BANK - DJNZ RS_LOOP3 -; -RS_NEXT: - INC C ; ADD 1 TO RAM BANK COUNT - JR RS_LOOP1 ; AND LOOP TILL DONE -; -RS_DONE: - LD E,C ; FINAL BANK COUNT TO E - LD A,C - OR A - JR Z,RS_LOOPZ - ; RESTORE SAVED VALUES - LD IX,RS_ARY - LD B,C ; LOOP COUNT - LD C,$80 ; BANK ID -RS_LOOP2: - LD A,C - CALL HBX_BNKSEL - INC C - LD A,(IX) ; GET VALUE - LD (HL),A ; RESTORE IT - INC IX - DJNZ RS_LOOP2 ; ALL BANKS -RS_LOOPZ: -; -; MBC RUNTIME MEMORY SIZE ADJUSTMENT -; -; THE MBC RAM BOARD CAN CONTAIN 1 OR 2 RAM CHIPS. THEY CAN BE -; EITHER 128K OR 512K EACH. SO THE MBC RAM BOARD CAN HAVE A -; TOTAL OF 128K, 256K, 512K, OR 1024K. THE COMMON (HIMEM) RAM -; IS ALWAYS MAPPED TO THE LAST 32K OF THE FIRST CHIP ON THE BOARD. -; IF THERE ARE TWO CHIPS ON THE BOARD, THIS MEANS THE COMMON -; BANK WILL APPEAR IN THE "MIDDLE" OF THE PHYSICAL RAM BANKS. -; ROMWBW NEEDS THE COMMON BANK TO BE AT THE LAST BANK OF PHYSICAL -; RAM IN ORDER TO HAVE SEQUENTIAL RAM BANKS AVAILABLE FOR THE -; RAM DISK. TO WORK AROUND THIS, WE FLIP THE HIGH BIT OF THE -; BANK ID FOR AN MBC SYSTEM IFF IT HAS 2 CHIPS (256K OR 1024K). -; THE CODE BELOW GENERATES THE CORRECT MASK TO ACCOMPLISH THIS -; AND THEN POKES THE MASK INTO AN XOR INSTRUCTION IN THE MBC -; MEMORY MANAGER. -; - #IF (MEMMGR == MM_MBC) -; - ;LD HL,CB_RAMBANKS ; IN NUMBER OF RAMBANKS DETECTED FOR MBC - LD A,%11101011 ; IS 4 (128KB) OR 16 (512KB) THEN - ;AND (HL) ; ZERO THE LAST BANK MASK OTHERWISE - AND E ; ZERO THE LAST BANK MASK OTHERWISE - JR Z,MBC_SINGLE ; CALCULATE THE LAST BANK MASK (BANKS/2) - RRA ; 256K = %00000100, 1024K = %00010000 -MBC_SINGLE: - LD (HBX_MBCMSK),A -; - #ENDIF -; - ; RETURN TO ORIGINAL BANK - POP AF - CALL HBX_BNKSEL - LD A,E ; RETURN BANK COUNT - LD ($FFEA),A ; STASH HERE FOR A BIT - RET -; -RS_ARY .EQU $ -; -RS_LEN .EQU $ - RS_START - .ORG RS_IMAGE + RS_LEN -; -#ELSE + LD ($FFEA),A ; STASH HERE TO PRINT LATER +; +#ENDIF +; +;-------------------------------------------------------------------------------------------------- +; MBC BANK SELECT MASK SETUP +;-------------------------------------------------------------------------------------------------- +; +; THE MBC RAM BOARD CAN CONTAIN 1 OR 2 RAM CHIPS. THE COMMON RAM BANK IS +; FIXED BY HARDWARE TO BE THE TOP 32K OF THE *FIRST* RAM CHIP. WHEN THERE +; ARE 2 RAM CHIPS INSTALLED, THE HARDWARE WILL THUS PLACE THE COMMON RAM IN +; THE MIDDLE OF PHYSICAL RAM. HBIOS REQUIRES THAT THE COMMON RAM BANK BE +; MAPPED TO THE VERY LAST 32K OF PHYSICAL RAM. THIS IS REQUIRED SO THAT +; THE RAM DISK BANKS CAN BE SEQUENTIAL. TO WORK AROUND THIS, WE USE AN +; XOR MASK THAT IS APPLIED DURING BANK SELECT. THIS MASK WILL FLIP THE +; HIGH ORDER BANK SELECT BIT (WHEN 2 RAM CHIPS ARE USED) SO THAT THE TWO +; RAM CHIPS WIND UP "REVERSED" AND THE FIXED COMMON BANK WINDS UP AT THE +; END OF THE RAM BANKS. THE MASK IS SETUP HERE BASED ON THE NUMBER OF RAM +; CHIPS AND THEIR SIZE. NOTE THAT THE NUMBER OF RAM CHIPS IS INFERRED BY +; THE TOTAL RAM SIZE. A SINGLE CHIP WILL BE EITHER 128K OR 512K. IF THE +; TOTAL RAM SIZE OF THE SYSTEM IS 256K OR 1M, THEN THERE MUST BE TWO CH +; IPS. THE RESULTING BANK SELECT MASK IS INSERTED INTO THE MBC BANK +; SELECT ROUTINE. +; +#IF (MEMMGR == MM_MBC) ; -; MBC RUNTIME MEMORY SIZE ADJUSTMENT -; -; THE MBC RAM BOARD CAN CONTAIN 1 OR 2 RAM CHIPS. THEY CAN BE -; EITHER 128K OR 512K EACH. SO THE MBC RAM BOARD CAN HAVE A -; TOTAL OF 128K, 256K, 512K, OR 1024K. THE COMMON (HIMEM) RAM -; IS ALWAYS MAPPED TO THE LAST 32K OF THE FIRST CHIP ON THE BOARD. -; IF THERE ARE TWO CHIPS ON THE BOARD, THIS MEANS THE COMMON -; BANK WILL APPEAR IN THE "MIDDLE" OF THE PHYSICAL RAM BANKS. -; ROMWBW NEEDS THE COMMON BANK TO BE AT THE LAST BANK OF PHYSICAL -; RAM IN ORDER TO HAVE SEQUENTIAL RAM BANKS AVAILABLE FOR THE -; RAM DISK. TO WORK AROUND THIS, WE FLIP THE HIGH BIT OF THE -; BANK ID FOR AN MBC SYSTEM IFF IT HAS 2 CHIPS (256K OR 1024K). -; THE CODE BELOW GENERATES THE CORRECT MASK TO ACCOMPLISH THIS -; AND THEN POKES THE MASK INTO AN XOR INSTRUCTION IN THE MBC -; MEMORY MANAGER. + ; ALTHOUGH DYNAMIC SYSTEM RAM SIZING IS NOT POSSIBLE FOR MBC + ; (SEE COMMENTS ABOVE), WE ARE STILL DOING THE MASK SETUP + ; DYNAMICALLY. THIS IS SIMPLY IN CASE WE EVER FIND A WAY TO + ; DYNAMICALLY SIZE THE RAM IN AN MBC SYSTEM. + ; + ; 128K: %00000000 ; 1 CHIP, FLIP NO BITS + ; 256K: %00000100 ; 2 CHIPS, 8 BANKS, FLIP BIT 2 + ; 512K: %00000000 ; 1 CHIP, FLIP NO BITS + ; 1024K: %00010000 ; 2 CHIPS, 32 BANKS, FLIP BIT 4 + ; + ; IF NUMBER OF RAMBANKS DETECTED FOR MBC IS 4 (128KB) OR + ; 16 (512KB) THEN ZERO THE BANK MASK, OTHERWISE CALCULATE + ; THE BANK MASK AS BANKS/2. ; - #IF (MEMMGR == MM_MBC) - LD HL,CB_RAMBANKS ; IF NUMBER OF RAMBANKS DETECTED FOR MBC - LD A,%11101011 ; IS 4 (128KB) OR 16 (512KB) THEN - AND (HL) ; ZERO THE LAST BANK MASK OTHERWISE - JR Z,MBC_SINGLE ; CALCULATE THE LAST BANK MASK (BANKS/2) - RRA ; 256K = %00000100, 1024K = %00010000 + LD A,(CB_RAMBANKS) + LD E,A + LD A,%11101011 + AND E + JR Z,MBC_SINGLE + RRA MBC_SINGLE: - LD (HBX_MBCMSK),A - #ENDIF + LD (HBX_MBCMSK),A ; #ENDIF ; -; INSTALL HBIOS IN RAM BANK +;-------------------------------------------------------------------------------------------------- +; HBIOS TRANSITION TO RAM +;-------------------------------------------------------------------------------------------------- ; - LD A,(HB_CURBNK) +; COPY OURSELVES TO HBIOS BANK IN RAM +; + LD A,(HB_CURBNK) ; GET CURRENT BANK ID ; - ; CHECK TO SEE IF WE ARE ALREADY RUNNING IN THE HBIOS + ; CHECK TO SEE IF WE ARE ALREADY RUNNING IN THE HBIOS RAM ; BANK AND SKIP THE COPY IF SO (DON'T COPY OVER OURSELVES). ; THIS SITUATION OCCURS ON A ROMLESS STARTUP OR WHEN DOING A ; FULL RESTART OF A SYSTEM USING THE EXISTING HBIOS COPY. ; NOTE THAT THIS TEST WORKS BECAUSE BID_BIOS == BID_BOOT ; IN THESE SCENARIOS. - CP BID_BIOS - JR Z,HB_START1 -; - LD (HB_SRCBNK),A - LD A,BID_BIOS - LD (HB_DSTBNK),A - LD HL,0 - LD DE,0 - LD BC,$8000 + CP BID_BIOS ; SAVE AS BIOS BANK? + JR Z,HB_START1 ; IF SO, SKIP +; + LD (HB_SRCBNK),A ; CURRENT BANK IS SOURCE + LD A,BID_BIOS ; GET BIOS BANK ID + LD (HB_DSTBNK),A ; ... AND MAKE IT THE DESTINATION + LD HL,0 ; START FROM ADDRESS ZERO + LD DE,0 ; SAME FOR DESTINATION + LD BC,$8000 ; COPY ENTIRE 32KB BANK #IF (MEMMGR == MM_Z280) - CALL Z280_BNKCPY + ; WE CANNOT USE HBX_BNKCPY FOR Z280 BECAUSE HBX_BNKCPY WILL + ; SYSCALL Z280_BNKCPY. SYSCALL IS NOT SAFE YET BECAUSE THE + ; Z280 IVT ADDRESS HAS NOT BEEN SETUP. + CALL Z280_BNKCPY ; HANDLE Z280 SPECIAL #ELSE - CALL HBX_BNKCPY + CALL HBX_BNKCPY ; ELSE NORMAL BANK COPY #ENDIF ; ; TRANSITION TO HBIOS IN RAM BANK ; #IF (MEMMGR == MM_Z280) + ; Z280 NEEDS TO BE HANDLED SPECIAL BECAUSE WE ARE SWITCHING + ; THE SYSTEM MODE BANK, NOT THE NORMAL USER MODE BANK. LD A,BID_BIOS LD B,$10 ; FIRST SYSTEM PDR CALL Z280_BNKSEL JR HB_START1 #ELSE + ; JUST DOING A BANK CALL TO THE RAM BANK BANK. IF THIS IS A + ; ROMLESS BOOT OR AN IN-PLACE HBIOS RESTART, WE ARE ALREADY + ; RUNNING IN BID_BIOS BANK. HOWEVER, THIS WILL DO NO HARM. LD A,BID_BIOS ; BIOS BANK ID LD IX,HB_START1 ; EXECUTION RESUMES HERE CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN @@ -1965,16 +1939,8 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK LD A,H ; GET FIRST BYTE PUSHED LD (HB_BATCOND),A ; ... AND SAVE AS BAT COND ; -#IF (MEMMGR == MM_Z280) - ; NOW POINT TO RAM COPY OF Z280 INT/TRAP TABLE - ; HL IS TOP 16 BITS OF PHYSICAL ADDRESS OF IVT - ; IVT *MUST* BE ON A 4K BOUNDARY - LD C,Z280_VPR - LD HL,0 + (((PBANK(BID_BIOS) << 15) + Z280_IVT) >> 8) - LDCTL (C),HL -#ENDIF -; ; IF APPBOOT, WE NEED TO FIX UP A FEW THINGS IN PAGE ZERO +; ;;; SHOULD THIS BE DONE FOR AN HBIOS RESTART IN PLACE??? ; #IFDEF APPBOOT ; @@ -2036,67 +2002,32 @@ CB_IDS: LD (HL),A ; POPULATE CB_BIDCOM ; #ENDIF ; -;================================================================================================== -; RECOVERY MODE -;================================================================================================== -; -; PLATFORM SPECIFIC CODE FOR DETECTING RECOVERY MODE SWITCH -; -#IF (BT_REC_TYPE != BT_REC_NONE) - #IF (BT_REC_TYPE == BT_REC_FORCE) - LD A,1 ; SET FOR RECOVERY MODE - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) - #IF (BT_REC_TYPE == BT_REC_SBC01) - LD A,%00100000 ; DISABLE RTC AND - OUT (RTCIO),A ; DRQ DRIVER READ - IN A,(RTCIO) ; BIT 0 (DRQ). - CPL ; PULLED HIGH - AND 1 ; IS RECOVERY MODE - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #IF (BT_REC_TYPE == BT_REC_SBC1B) - IN A,(RTCIO) ; RTC PORT, BIT 6 HAS THE - BIT 6,A ; STATE OF CONFIG JUMPER - LD A,1 ; JUMPER INSTALLED - JR Z,SAVE_REC_M ; IS RECOVERY MODE - LD A,0 -SAVE_REC_M: - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #IF (BT_REC_TYPE == BT_REC_SBCRI) - IN A,($68 + 6) ; UART_MSR MODEM - BIT 6,A ; STATUS REGISTER - LD A,0 ; BIT 6 - JR Z,SAVE_REC_M ; IS RECOVERY MODE - LD A,1 -SAVE_REC_M: - LD (HB_BOOT_REC),A ; SAVE FOR LATER - #ENDIF - #ENDIF -#ENDIF -; - FPLEDS(DIAG_04) -; -#IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL - CALL MIO_INIT ; WE GET TO BOOT MESSAGE -#ENDIF -; -#IF FALSE +; CLEAR DISPATCH TABLE ENTRIES ; -; TEST DEBUG *************************************************************************************** + XOR A ; ZERO + LD (CIO_CNT),A ; CIO DEVICES + LD (DIO_CNT),A ; DIO DEVICES + LD (VDA_CNT),A ; VDA DEVICES + LD (SND_CNT),A ; SND DEVICES + LD (RTC_DISPACT),A ; RTC DEVICE + LD (DSKY_DISPACT),A ; DSKY DEVICE ; - PRTS("DEBUG-IM1INT$") - LD DE,HB_IM1INT - CALL DUMP_BUFFER - CALL NEWLINE +; INITIALIZE HEAP STORAGE ; -; TEST DEBUG *************************************************************************************** + ; INITIALIZE POINTERS + LD HL,HB_END ; HEAP FOLLOWS HBIOS CODE + LD (CB_HEAP),HL ; INIT HEAP BASE ADDRESS + LD (CB_HEAPTOP),HL ; INIT HEAP TOP ADDRESS + ; CLEAR HEAP + LD BC,BNKTOP - HB_END ; MAX SIZE OF HEAP + LD A,$FF ; FILL WITH $FF + CALL FILL ; DO IT ; -#ENDIF + FPLEDS(DIAG_04) ; -; DISCOVER CPU TYPE +;-------------------------------------------------------------------------------------------------- +; CPU TYPE DISCOVERY +;-------------------------------------------------------------------------------------------------- ; ; SOME OF THIS CODE IS DERIVED FROM UNA BY JOHN COFFMAN ; @@ -2151,22 +2082,28 @@ HB_CPU1: LD A,L LD (HB_CPUTYPE),A ; -; CLEAR DISPATCH TABLE ENTRIES +;-------------------------------------------------------------------------------------------------- +; EARLY DRIVER INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; - XOR A ; ZERO - LD (CIO_CNT),A ; CIO DEVICES - LD (DIO_CNT),A ; DIO DEVICES - LD (VDA_CNT),A ; VDA DEVICES - LD (SND_CNT),A ; SND DEVICES - LD (RTC_DISPACT),A ; RTC DEVICE - LD (DSKY_DISPACT),A ; DSKY DEVICE +; SOME DRIVERS NEED TO BE CALLED AS EARLY AS WE CAN ONE AN OPERATING +; ENVIRONMENT IS ESTABLISHED. ; #IF (SN76489ENABLE) + ; SN76489 CHIP GENERATES UGLY NOISE AFTER HARDWARE RESET. + ; WE CALL THIS DRIVER'S PREINIT ASAP TO SHUT OFF THE NOISE. CALL SN76489_PREINIT #ENDIF #IF (DSRTCENABLE) + ; THE DSRTC NEEDS TO BE INITIALIZED IN ORDER TO PERFROM THE + ; CPU SPEED DETECTION BELOW. CALL DSRTC_PREINIT #ENDIF +; +;-------------------------------------------------------------------------------------------------- +; DSKY INITIALIZATION AND ANNOUNCEMENT +;-------------------------------------------------------------------------------------------------- +; #IF (DSKYENABLE) #IF (ICMENABLE) CALL ICM_PREINIT @@ -2177,9 +2114,8 @@ HB_CPU1: #IF (H8PENABLE) CALL H8P_PREINIT #ENDIF -#ENDIF ; -#IF (DSKYENABLE) + ; ANNOUNCE OURSELVES ON DSKY LD HL,MSG_HBVER + 5 LD A,(DSKY_HEXMAP + RMJ) OR $80 @@ -2195,21 +2131,6 @@ HB_CPU1: LD B,BF_DSKYSHOWSEG CALL DSKY_DISPATCH #ENDIF -; -#IF (PLATFORM == PLT_NABU) - CALL NABU_PREINIT -#ENDIF -; -#IF (SKZENABLE) -; - ; SET THE SK Z80-512K UART CLK2 DIVIDER AS - ; CONFIGURED. NOTE THAT THIS IMPLICITLY - ; CLEARS THE WATCHDOG BIT. THE WATCHDOG - ; WILL BE ENABLED LATER IF CONFIGURED. - LD A,SKZDIV ; GET DIVIDER CODE - OUT ($6D),A ; IMPLEMENT IT -; -#ENDIF ; FPLEDS(DIAG_05) ; @@ -2218,16 +2139,16 @@ HB_CPU1: LD HL,CPUOSC / 1000 ; OSC SPD IN KHZ LD (HB_CPUOSC),HL ; INIT HB_CPUOSC DEFAULT ; -; ATTEMPT DYNAMIC CPU SPEED DERIVATION -; NOTE THAT FOR PLATFORMS WITH SOFTWARE SELECTABLE CPU SPEED, -; THIS IS BEING DONE WITH THE CPU SPEED SET TO THE LOWEST -; POSSIBLE SETTING. THE FINAL CPU SPEED WILL BE ADJUSTED -; LATER. + ; ATTEMPT DYNAMIC CPU SPEED DERIVATION + ; NOTE THAT FOR PLATFORMS WITH SOFTWARE SELECTABLE CPU SPEED, + ; THIS IS BEING DONE WITH THE CPU SPEED SET TO THE LOWEST + ; POSSIBLE SETTING. THE FINAL CPU SPEED WILL BE ADJUSTED + ; LATER. ; CALL HB_CPUSPD ; DYNAMIC CPU SPEED DETECTION JR NZ,HB_CPU2 ; SKIP AHEAD IF FAILED ; -; RECORD THE UPDATED CPU OSCILLATOR SPEED + ; RECORD THE UPDATED CPU OSCILLATOR SPEED ; #IF ((CPUFAM == CPU_Z180) | (CPUSPDCAP == SPD_HILO)) ; SPEED MEASURED WILL BE HALF OSCILLATOR SPEED @@ -2240,14 +2161,15 @@ HB_CPU1: ; HB_CPU2: ; -; INIT CPUKHZ BASED ON OSCILLATOR SPEED -; - LD HL,(HB_CPUOSC) +;-------------------------------------------------------------------------------------------------- +; FINALIZE OPERATING CPU SPEED +;-------------------------------------------------------------------------------------------------- ; ; TRANSITION TO FINAL DESIRED CPU SPEED FOR THOSE PLATFORMS ; THAT SUPPORT SOFTWARE SELECTABLE CPU SPEED. UPDATE CB_CPUKHZ ; IN HCB AS WE DO THIS. ; + LD HL,(HB_CPUOSC) #IF ((CPUSPDCAP==SPD_HILO) & (PLATFORM==PLT_MBC)) #IF (CPUSPDDEF==SPD_HIGH) ; SET HIGH SPEED VIA RTC LATCH @@ -2338,9 +2260,15 @@ HB_CPU3: ADC A,C ; C -> A; ADD CF FOR ROUNDING LD (CB_CPUMHZ),A ; SAVE IT ; +;-------------------------------------------------------------------------------------------------- +; FINALIZE OPERATING WAIT STATES +;-------------------------------------------------------------------------------------------------- +; +; SET OPERATING WAIT STATE CONFIGURATION ON SYSTEMS THAT SUPPORT IT +; #IF (CPUFAM == CPU_Z180) ; - ; SET FINAL DESIRED WAIT STATES + ; SET FINAL DESIRED WAIT STATES PER CONFIG LD A,0 + (Z180_MEMWAIT << 6) | (Z180_IOWAIT << 4) OUT0 (Z180_DCNTL),A ; @@ -2348,6 +2276,8 @@ HB_CPU3: ; #IF (CPUFAM == CPU_Z280) ; + ; SET FINAL DESIRED WAIT STATES PER CONFIG + ; BUS TIMING AND CONFIGURATION REGISTER LD C,Z280_BTCR ; BUS TIMING AND CONTROL REG LDCTL HL,(C) LD A,L ; PUT IN A @@ -2356,29 +2286,61 @@ HB_CPU3: OR Z280_MEMHIWAIT << 2 ; SET HIGH 8MB WAIT STATE BITS (HM) OR Z280_IOWAIT ; SET I/O WAIT STATE BITS LD L,A ; BACK TO L - LDCTL (C),HL + LDCTL (C),HL ; DO IT ; + ; BUS TIMING AND INITIALIZATION REGISTER LD C,Z280_BTIR ; BUS TIMING AND INIT REG LDCTL HL,(C) LD A,L ; PUT IN A AND %11110011 ; CLEAR LM FIELD OR Z280_MEMLOWAIT << 2 ; SET LOW 8MB WAIT STATE BITS LD L,A ; BACK TO L - LDCTL (C),HL + LDCTL (C),HL ; DO IT ; #ENDIF ; - LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT - CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY +;-------------------------------------------------------------------------------------------------- +; SK Z80-512K CLOCK INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; -#IF ((INTMODE == 2) | ((INTMODE == 1) & (CPUFAM == CPU_Z180))) - ; SETUP Z80 IVT AND INT MODE 2 - LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS - LD I,A ; ... AND PLACE IT IN I REGISTER - - #IF (CPUFAM == CPU_Z180) - ; SETUP Z180 IVT - XOR A ; SETUP LO BYTE OF IVT ADDRESS +#IF (SKZENABLE) +; +;;; LOCATION OF THIS CODE??? +; + ; SET THE SK Z80-512K UART CLK2 DIVIDER AS + ; CONFIGURED. NOTE THAT THIS IMPLICITLY + ; CLEARS THE WATCHDOG BIT. THE WATCHDOG + ; WILL BE ENABLED LATER IF CONFIGURED. + LD A,SKZDIV ; GET DIVIDER CODE + OUT ($6D),A ; IMPLEMENT IT +; +#ENDIF +; +;-------------------------------------------------------------------------------------------------- +; INITIALIZE SPEED-COMPENSATED DELAY FUNCTIONS +;-------------------------------------------------------------------------------------------------- +; +;;; LOCATION OF THIS CODE??? +; + LD A,(CB_CPUMHZ) ; CPU SPEED TO ACCUM AND INIT + CALL DELAY_INIT ; .. SPEED COMPENSATED DELAY +; +;-------------------------------------------------------------------------------------------------- +; INTERRUPT MANAGEMENT SETUP +;-------------------------------------------------------------------------------------------------- +; +; SETUP INTERRUPT VECTOR TABLE ADDRESS(ES) AND TRANSITION TO +; OPERATING INTERRUPT MODE. NOTE THAT INTERRUPTS REMAIN +; DISABLED AT THIS POINT. +; +#IF ((INTMODE == 2) | ((INTMODE == 1) & (CPUFAM == CPU_Z180))) + ; SETUP Z80 IVT AND INT MODE 2 + LD A,HBX_IVT >> 8 ; SETUP HI BYTE OF IVT ADDRESS + LD I,A ; ... AND PLACE IT IN I REGISTER + + #IF (CPUFAM == CPU_Z180) + ; SETUP Z180 IVT + XOR A ; SETUP LO BYTE OF IVT ADDRESS OUT0 (Z180_IL),A ; ... AND PLACE IN Z180 IL REGISTER #ENDIF @@ -2387,6 +2349,15 @@ HB_CPU3: #ENDIF #ENDIF ; +#IF (MEMMGR == MM_Z280) + ; NOW POINT TO RAM COPY OF Z280 INT/TRAP TABLE + ; HL IS TOP 16 BITS OF PHYSICAL ADDRESS OF IVT + ; IVT *MUST* BE ON A 4K BOUNDARY + LD C,Z280_VPR + LD HL,0 + (((PBANK(BID_BIOS) << 15) + Z280_IVT) >> 8) + LDCTL (C),HL +#ENDIF +; #IF (INTMODE == 3) ; ; SETUP Z280 INT A FOR VECTORED INTERRUPTS @@ -2394,10 +2365,15 @@ HB_CPU3: LD C,Z280_ISR LDCTL (C),HL ; + ; TRANSITION TO INTERRUPT MODE 3 IM 3 ; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; SYSTEM TIME INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; #IF (PLATFORM == PLT_SBC) ; #IF (HTIMENABLE) ; SIMH TIMER @@ -2411,35 +2387,6 @@ HB_CPU3: ; #ENDIF ; -; TEMPLATE FOR SETTING UP INTERRUPTS USING THE MBC/DUODYNE IM2 INTERRUPT -; PIN HEADERS. UPDATE HB_DUMMYx TO POINT TO THE INTERRUPT ROUTINE. -; IN STD.ASM ALLOCATE THE EQUIVALENT INT_IM2PHx INTERRUPT TABLE ENTRY NUMBER. -; -; -; LD HL,HB_DUMMY0 -; LD (IVT(INT_IM2PH0)),HL -; -; LD HL,HB_DUMMY1 -; LD (IVT(INT_IM2PH1)),HL -; -; LD HL,HB_DUMMY2 -; LD (IVT(INT_IM2PH2)),HL -; -; LD HL,HB_DUMMY3 -; LD (IVT(INT_IM2PH3)),HL -; -; LD HL,HB_DUMMY4 -; LD (IVT(INT_IM2PH4)),HL -; -; LD HL,HB_DUMMY5 -; LD (IVT(INT_IM2PH5)),HL -; -; LD HL,HB_DUMMY6 -; LD (IVT(INT_IM2PH6)),HL -; -; LD HL,HB_DUMMY7 -; LD (IVT(INT_IM2PH7)),HL -; #IF (KIOENABLE) CALL KIO_PREINIT #ENDIF @@ -2448,11 +2395,16 @@ HB_CPU3: CALL CTC_PREINIT #ENDIF ; +#IF (PLATFORM == PLT_NABU) + CALL NABU_PREINIT +#ENDIF +; #IF (CPUFAM == CPU_Z180) ; #IF (INTMODE > 0) ; - ; MASK ALL EXTERNAL INTERRUPTS FOR NOW + ; FOR NOW, JUST ENABLE THE INT0 PIN WHICH IS GENERALLY + ; EQUIVALENT TO Z80 INTERRUPTS. LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED OUT0 (Z180_ITC),A ; WRITE TO INT/TRAP CONTROL REGISTER ; @@ -2472,9 +2424,9 @@ HB_CPU3: ; ; Z180 PRESCALES THE COUNTER BY 20 SO, ; RLDR = CPU CLK / 20 / TICKFREQ - ; IF WE ASSUME TICKFREQ = 50, WE CAN SIMPIFY TO + ; IF WE ASSUME TICKFREQ = 50, WE CAN SIMPLIFY TO ; RLDR = CPU CLK / 1000 - ; NOW IF DIVIDE BOTH SIDES BY 1000, WE CAN USE + ; IF WE DIVIDE BOTH SIDES BY 1000, WE CAN USE ; CPUKHZ VALUE AND SIMPLIFY TO ; RLDR = CPUKHZ XOR A ; ALL BITS ZERO @@ -2533,18 +2485,15 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT ; #ENDIF ; -; INITIALIZE HEAP STORAGE + FPLEDS(DIAG_06) ; - ; INITIALIZE POINTERS - LD HL,HB_END ; HEAP FOLLOWS HBIOS CODE - LD (CB_HEAP),HL ; INIT HEAP BASE ADDRESS - LD (CB_HEAPTOP),HL ; INIT HEAP TOP ADDRESS - ; CLEAR HEAP - LD BC,BNKTOP - HB_END ; MAX SIZE OF HEAP - LD A,$FF ; FILL WITH $FF - CALL FILL ; DO IT +;-------------------------------------------------------------------------------------------------- +; PRE-CONSOLE INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; - FPLEDS(DIAG_06) +#IF (WBWDEBUG == USEMIO) ; BUFFER OUTPUT UNTIL + CALL MIO_INIT ; WE GET TO BOOT MESSAGE +#ENDIF ; #IF FALSE ; @@ -2557,7 +2506,42 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT ; #ENDIF ; -; PRE-CONSOLE INITIALIZATION +; PLATFORM SPECIFIC CODE FOR DETECTING RECOVERY MODE SWITCH +; +#IF (BT_REC_TYPE != BT_REC_NONE) + #IF (BT_REC_TYPE == BT_REC_FORCE) + LD A,1 ; SET FOR RECOVERY MODE + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) + #IF (BT_REC_TYPE == BT_REC_SBC01) + LD A,%00100000 ; DISABLE RTC AND + OUT (RTCIO),A ; DRQ DRIVER READ + IN A,(RTCIO) ; BIT 0 (DRQ). + CPL ; PULLED HIGH + AND 1 ; IS RECOVERY MODE + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #IF (BT_REC_TYPE == BT_REC_SBC1B) + IN A,(RTCIO) ; RTC PORT, BIT 6 HAS THE + BIT 6,A ; STATE OF CONFIG JUMPER + LD A,1 ; JUMPER INSTALLED + JR Z,SAVE_REC_M ; IS RECOVERY MODE + LD A,0 +SAVE_REC_M: + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #IF (BT_REC_TYPE == BT_REC_SBCRI) + IN A,($68 + 6) ; UART_MSR MODEM + BIT 6,A ; STATUS REGISTER + LD A,0 ; BIT 6 + JR Z,SAVE_REC_M ; IS RECOVERY MODE + LD A,1 +SAVE_REC_M: + LD (HB_BOOT_REC),A ; SAVE FOR LATER + #ENDIF + #ENDIF +#ENDIF ; LD DE,HB_PCINITTBL ; POINT TO PRECONSOLE INIT TABLE LD B,HB_PCINITTBLLEN ; NUMBER OF ENTRIES @@ -2571,7 +2555,10 @@ Z280_TC .EQU CPUOSC / 4 / 50 / 2 ; TIME CONSTANT NOT_REC_M0: ; #ENDIF - CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE +; + ; CYCLE THROUGH THE INITIALIZATION TABLE CALLING THE PRE-INIT + ; ENTRY POINT OF ALL DRIVERS. + CALL CALLLIST ; PROCESS THE PRE-INIT CALL TABLE ; #IF FALSE ; @@ -2587,7 +2574,12 @@ NOT_REC_M0: FPLEDS(DIAG_07) DIAG(3) ; +;-------------------------------------------------------------------------------------------------- +; BOOT DELAY +;-------------------------------------------------------------------------------------------------- ; +; IF CONFIGURED, AN ARBITRARY BOOT DELAY IS IMPLEMENTED HERE. THIS IS +; TYPICALLY USED TO DELAY ACCESSING DEVICES THAT WILL NOT BE READY. ; #IF (BOOT_DELAY > 100) .ECHO "*** ERROR: INVALID BOOT_DELAY (BOOT_DELAY > 100)!!!\n" @@ -2601,6 +2593,10 @@ HB_BOOTDLY: DJNZ HB_BOOTDLY ; LOOP TILL DONE #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; ACTIVATE BOOT CONSOLE +;-------------------------------------------------------------------------------------------------- +; ; PRIOR TO THIS POINT, CONSOLE I/O WAS NOT AVAILABLE UNLESS DIRECTED TO DEBUG OUTPUT I.E. XIO ; NOW THAT HBIOS IS READY, SET THE CONSOLE UNIT TO ACTIVATE CONSOLE I/O ; VIA HBIOS. @@ -2616,6 +2612,10 @@ HB_BOOTDLY: ; HB_CONRDY: ; +; SUPPRESS HARDWARE FLOW CONTROL TEMPORARILY, IF NEEDED. THIS IS +; GENERALLY NOT USED ANYMORE BECAUSE THE UART DRIVER NOW CHECKS FOR +; A VALID CTS SIGNAL AND ADJUSTS AS NEEDED. +; #IF (SUPCTS) ; ; MOST SERIAL PORTS ARE CONFIGURED WITH HARDWARE FLOW CONTROL ENABLED. @@ -2674,7 +2674,15 @@ NXTMIO: LD A,(HL) ; #ENDIF ; +;-------------------------------------------------------------------------------------------------- ; ANNOUNCE HBIOS +;-------------------------------------------------------------------------------------------------- +; +; DISPLAY A BANNER ON THE BOOT CONSOLE NOW. NOTE THAT WE INTENTIONALLY +; LEAVE INTERRUPTS DISABLED UNTIL A BIT LATER. SINCE INTERRUPTS CAN +; DESTABILIZE A SYSTEM, IT IS DIAGNOSTICALLY USEFUL TO GET SOMETHING +; DISPLAYED BEFORE INTRODUCING INTERRUPTS. IF THE SYSTEM CRASHES +; AFTER DISPLAYING THE BANNER, INTERRUPT INTEGRITY SHOULD BE SUSPECTED. ; PRTX(STR_BANNER) ; @@ -2700,9 +2708,12 @@ NOT_REC_M2: ; FPLEDS(DIAG_08) ; +;-------------------------------------------------------------------------------------------------- ; IO PORT SCAN +;-------------------------------------------------------------------------------------------------- ; #IF FALSE +; PSCN: LD C,0 ; IO PORT NUMBER LD B,0 ; LOOP COUNTER @@ -2727,20 +2738,36 @@ PSCNX .EQU $ + 1 CALL PRTHEXBYTE INC C DJNZ PSCN1 +; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; CPU SPEED DETECTION ALIGNMENT TEST +;-------------------------------------------------------------------------------------------------- +; #IF FALSE +; +; IF ENABLED, THE CPU SPEED TEST WILL BE REPEATED INDEFINITELY. THIS +; IS USED TO ADJUST THE SPEED DETECTION LOOP. +; HB_SPDTST: CALL HB_CPUSPD ; CPU SPEED DETECTION CALL NEWLINE LD HL,(CB_CPUKHZ) CALL PRTD3M ; PRINT AS DECIMAL WITH 3 DIGIT MANTISSA JR HB_SPDTST +; #ENDIF +; +;-------------------------------------------------------------------------------------------------- +; ENABLE INTERRUPTS +;-------------------------------------------------------------------------------------------------- ; HB_EI ; INTERRUPTS SHOULD BE OK NOW ; +;-------------------------------------------------------------------------------------------------- ; DISPLAY PLATFORM INFORMATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE2 PRTX(STR_PLATFORM) @@ -2786,7 +2813,9 @@ HB_Z280BUS1: PRTS("MHz$") ; SUFFIX #ENDIF ; -; DISPLAY CPU CONFIG +;-------------------------------------------------------------------------------------------------- +; DISPLAY CPU CONFIGURATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE @@ -2866,7 +2895,9 @@ HB_Z280BUS1: CALL PRTSTRD .TEXT " MMU$" ; -; DISPLAY MEMORY CONFIG +;-------------------------------------------------------------------------------------------------- +; DISPLAY MEMORY CONFIGURATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE LD HL,ROMSIZE @@ -2891,12 +2922,15 @@ HB_Z280BUS1: LD HL,BNKTOP - HB_END CALL PRTHEXWORDHL ; -#IFDEF TESTING +#IFDEF SIZERAM ; CALL PRTSTRD .TEXT ", RAMBANKS=0x$" LD A,($FFEA) CALL PRTHEXBYTE +#ENDIF +; +#IFDEF TESTING ; CALL PRTSTRD .TEXT ", RTCDEF=0x$" @@ -2950,6 +2984,10 @@ HB_Z280BUS1: CALL PRTHEXBYTE #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; ROM CHECKSUM VERIFICATION +;-------------------------------------------------------------------------------------------------- +; #IFDEF ROMBOOT #IF (ROMSIZE > 0) ; @@ -3025,7 +3063,9 @@ HB_ROMCKZ: #ENDIF #ENDIF ; -; LOW BATTERY DIAGNOSTIC MESSAGE +;-------------------------------------------------------------------------------------------------- +; LOW RAM BATTERY MESSAGE +;-------------------------------------------------------------------------------------------------- ; #IF (BATCOND) LD A,(HB_BATCOND) @@ -3034,7 +3074,9 @@ HB_ROMCKZ: CALL Z,WRITESTR #ENDIF ; -; PERFORM DEVICE INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; FINAL DEVICE INITIALIZATION +;-------------------------------------------------------------------------------------------------- ; CALL NEWLINE @@ -3053,6 +3095,10 @@ NOT_REC_M1: IS_REC_M1: CALL CALLLIST ; +;-------------------------------------------------------------------------------------------------- +; WATCHDOG ACTIVATION +;-------------------------------------------------------------------------------------------------- +; ; IF WATCHDOG FUNCTIONALITY IS REQUESTED, CHECK TO MAKE SURE ; WE ARE GETTING INTERRUPTS. IF SO, ENABLE THE WATCHDOG. ; @@ -3094,6 +3140,10 @@ HB_WDZ: ; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; HEAP CURB INITIALIZATION +;-------------------------------------------------------------------------------------------------- +; ; RECORD HEAP CURB AT THE CURRENT VALUE OF HEAP TOP. HEAP CURB ; MARKS THE POINT IN THE HEAP AFTER WHICH MEMORY IS RELEASED ; WHEN AN HBIOS RESET IS PEFORMED. @@ -3101,7 +3151,15 @@ HB_WDZ: LD HL,(CB_HEAPTOP) LD (HEAPCURB),HL ; -; NOW SWITCH CONSOLES IF CONFIGURED +;-------------------------------------------------------------------------------------------------- +; FINAL CONSOLE ACTIVATION +;-------------------------------------------------------------------------------------------------- +; +; ON SOME SYSTEMS, THE OPERATING CONSOLE IS DIFFERENT THAT THE BOOT +; CONSOLE. FOR EXAMPLE, IF A VIDEO CONSOLE IS DESIRED. A VIDEO +; CONSOLE CANNOT BE USED AS A BOOT CONSOLE BECAUSE IT WILL NOT BE +; INITIALIZED EARLY ENOUGH. SO, IF DESIRED, WE SWITCH TO THE FINAL +; RUNNING CONSOLE HERE. ; LD A,(CB_CONDEV) ; GET CURRENT CONSOLE LD (HB_NEWCON),A ; AND INIT NEW CONSOLE VAR @@ -3241,10 +3299,21 @@ INITSYS3: LD DE,STR_BANNER ; POINT TO BANNER CALL NZ,WRITESTR ; OUTPUT IF CONSOLE MOVED ; +;-------------------------------------------------------------------------------------------------- +; PRINT DEVICE SUMMARY +;-------------------------------------------------------------------------------------------------- +; INITSYS3A: CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; -#IF 0 +;-------------------------------------------------------------------------------------------------- +; DIAGNOSTIC ROUTINES +;-------------------------------------------------------------------------------------------------- +; +; DIGANOSTIC ROUTINE TO EXERCISE THE Z280 BNKCPY CODE +; +#IF FALSE +; CALL NEWLINE CALL NEWLINE CALL NEWLINE @@ -3309,7 +3378,9 @@ INITSYS3A: ; #ENDIF ; -#IF 0 +; DIAGNOSTIC ROUTINE TO PLAY SERIES OF NOTES +; +#IF FALSE ; LD HL,0 CALL DBG_NOTE @@ -3346,12 +3417,20 @@ DBG_NOTE: ; #ENDIF ; +; DIAGNOSTIC ROUTINE TO PLAY A BEEP +; #IFDEF TESTING CALL SND_BEEP #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; TRANSITION TO USER LAND +;-------------------------------------------------------------------------------------------------- +; INITSYS4: ; +; IF Z280, WE NEED TO SWITCH TO USER MODE NOW. +; #IF (MEMMGR == MM_Z280) ; LEAVE SYSTEM MODE STACK POINTING TO THE RIGHT PLACE LD SP,HB_STACK ; DEDICATED HBIOS STACK LOC @@ -3384,55 +3463,41 @@ INITSYS4: CALL HBX_BNKCALL ; GO THERE HALT ; WE SHOULD NEVER COME BACK! ; -; CALL A LIST OF ROUTINES POINTED TO BY DE OF LENGTH B. -; -CALLLIST: - LD A,(DE) - LD L,A - INC DE - LD A,(DE) - LD H,A - INC DE - PUSH DE - PUSH BC - CALL JPHL - POP BC - POP DE - DJNZ CALLLIST -CALLDUMMY: - RET - -; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; TABLE OF RECOVERY MODE INITIALIZATION ENTRY POINTS -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; USE "CALLDUMMY" IF NO ENTRY REQUIRED ; #IF (BT_REC_TYPE != BT_REC_NONE) ; HB_PCINIT_REC: +; #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) .DW UART_PREINIT ; .DW CALLDUMMY #ENDIF +; HB_PCINITRLEN .EQU (($ - HB_PCINIT_REC) / 2) ; HB_INIT_REC: +; #IF ((PLATFORM == PLT_SBC) | (PLATFORM == PLT_MBC)) .DW UART_INIT .DW MD_INIT .DW PPIDE_INIT #ENDIF +; HB_INITRLEN .EQU (($ - HB_INIT_REC) / 2) ; #ENDIF ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; TABLE OF PRE-CONSOLE INITIALIZATION ENTRY POINTS -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; HB_PCINITTBL: +; #IF (ASCIENABLE) .DW ASCI_PREINIT #ENDIF @@ -3469,12 +3534,13 @@ HB_PCINITTBL: .DW TERM_PREINIT ; ALWAYS DO THIS ONE ; HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2) - +; ;================================================================================================== ; TABLE OF INITIALIZATION ENTRY POINTS ;================================================================================================== ; HB_INITTBL: +; #IF (KIOENABLE) .DW KIO_INIT #ENDIF @@ -3636,25 +3702,31 @@ HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) HB_SYSINIT_END .EQU $ ; ;================================================================================================== -; BIOS FUNCTION DISPATCHER +; BIOS FUNCTION DISPATCHER ;================================================================================================== ; -; MAIN BIOS FUNCTION -; B: FUNCTION -;__________________________________________________________________________________________________ -; HB_DISP_BEG .EQU $ ; +;-------------------------------------------------------------------------------------------------- +; HIGH LEVEL FUNCTION DISPATCHER +;-------------------------------------------------------------------------------------------------- +; +; JUMP TO FUNCTION GROUP SPECIFIC DISPATCHER. THE FUNCTION GROUP +; IS BASED ON THE TOP NIBBLE OF THE FUNCTION NUMBER. +; +; ENTRY: B=FUNCTION +; HB_DISPATCH: ; #IF (MEMMGR == MM_Z280) ; FOR Z280 MEMMGR, WE DISPATCH VIA THE Z280 SYSCALL. - ; THE SYSCALL MECHANISM WILL CLEAR INTERRUPTS. IN + ; THE SYSCALL MECHANISM WILL DISABLE INTERRUPTS. IN ; GENERAL, INTERRUPTS ARE OK DURING API PROCESSING, ; SO ENABLE THEM HERE. HB_EI #ENDIF ; +; STACK INTEGRITY DIAGNOSTIC CHECK ; #IF FALSE ; *DEBUG* START ; @@ -3669,6 +3741,7 @@ HB_DISPATCH: LD (HB_STACK - HB_STKSIZ + $08),A POP AF RET +; HB_DISPATCH1: ; #ENDIF ; *DEBUG* END @@ -3695,9 +3768,9 @@ HB_DISPERR: SYSCHKERR(ERR_NOFUNC) RET ; -;================================================================================================== -; CHARACTER I/O DEVICE FUNCTION DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; CHARACTER I/O DEVICE FUNCTION DISPATCHER +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO SPECIFIED CHARACTER I/O DRIVER ; B: FUNCTION @@ -3750,9 +3823,9 @@ CIO_SIZ .EQU CIO_MAX * 4 ; EACH ENTRY IS 4 BYTES CIO_CNT .DB 0 ; ENTRY COUNT PREFIX CIO_TBL .FILL CIO_SIZ,0 ; SPACE FOR ENTRIES ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; DISK I/O DEVICE FUNCTION DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO SPECIFIED DISK I/O DRIVER ; B: FUNCTION @@ -3813,9 +3886,11 @@ DIO_SIZ .EQU DIO_MAX * 4 ; EACH ENTRY IS 4 BYTES DIO_CNT .DB 0 ; ENTRY COUNT PREFIX DIO_TBL .FILL DIO_SIZ,0 ; SPACE FOR ENTRIES ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; DISK READ HELPER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; +;;; RELOCATE THIS CODE??? ; ; IMPLEMENTS MULTI SECTOR READS AND I/O TO/FROM ; BANKED RAM VIA BOUNCE BUFFER @@ -3848,7 +3923,7 @@ HB_DSKREAD0: LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS #ENDIF ; -#IF 1 +#IF TRUE ; CHECK TO SEE IF INTER-BANK I/O NEEDED. BIT 7,H ; TGT BUF IN UPPER 32K? JP NZ,HB_DSKIO ; IF SO, NON-BANKED @@ -3857,7 +3932,7 @@ HB_DSKREAD0: JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; -#IF 1 +#IF TRUE ; RAM BANK RANGE CHECK LD A,D ; GET TGT BANK CP BID_RAMN ; BANK IN RANGE 0-N? @@ -3904,9 +3979,9 @@ HB_DSKREADX: LD HL,(HB_IOBUF) ; NEXT BUF ADR JR HB_DSKIOX ; DONE ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; DISK WRITE HELPER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; IMPLEMENTS MULTI SECTOR WRITES AND I/O TO/FROM ; BANKED RAM VIA BOUNCE BUFFER @@ -3938,7 +4013,7 @@ HB_DSKWRITE0: LD (HB_DSKBIT),A ; SAVE IT FOR DIAGNOSTICS #ENDIF ; -#IF 1 +#IF TRUE ; CHECK TO SEE IF INTER-BANK I/O NEEDED. BIT 7,H ; TGT BUF IN UPPER 32K? JP NZ,HB_DSKIO ; IF SO, NON-BANKED @@ -3947,7 +4022,7 @@ HB_DSKWRITE0: JP Z,HB_DSKIO ; IF SO, NON-BANKED #ENDIF ; -#IF 1 +#IF TRUE ; RAM BANK RANGE CHECK LD A,D ; GET TGT BANK CP BID_RAMN ; BANK IN RANGE 0-N? @@ -3993,9 +4068,9 @@ HB_DSKWRITEX: LD HL,(HB_IOBUF) ; NEXT BUF ADR JR HB_DSKIOX ; DONE ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; NON-BANKED DISK READ/WRITE -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; HB_DSKIO: ; @@ -4020,6 +4095,10 @@ HB_DSKIOX: OR A ; SET RESULT FLAGS RET ; DONE ; +;-------------------------------------------------------------------------------------------------- +; INVOKE DRIVER DISK I/O FUNCTION +;-------------------------------------------------------------------------------------------------- +; HB_DSKFN: PUSH BC ; SAVE COUNTERS #IF (FPLED_ENABLE & FPLED_DSKACT) @@ -4048,12 +4127,9 @@ HB_DSKCMD: HB_DSKUNIT .DB 0 ; CURRENT DISK UNIT HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) -; -;================================================================================================== -; DSKY DISK ACTIVITY MONITOR -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; DSKY DISK ACTIVITY MONITOR +;-------------------------------------------------------------------------------------------------- ; ; THIS FUNCTION IS CALLED BY DISK DRIVERS JUST PRIOR TO ; THE START OF A DISK I/O OPERATION. @@ -4069,6 +4145,9 @@ HB_DSKFUNC .DB 0 ; CURRENT DISK FUNCTION ; HL: ADDRESS OF 32-BIT SECTOR NUMBER (LITTLE-ENDIAN) ; ALL REGISTERS PERSERVED ; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) +; HB_DSKACT: ; SAVE EVERYTHING PUSH AF @@ -4139,9 +4218,9 @@ HB_DSKACTCHS: #ENDIF #ENDIF ; -;================================================================================================== -; REAL TIME CLOCK DEVICE DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; REAL TIME CLOCK DEVICE DISPATCHER +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO REAL TIME CLOCK DRIVER ; B: FUNCTION @@ -4166,14 +4245,12 @@ RTC_SETDISP: LD (RTC_DISPACT),A ; SAVE IT RET ; AND DONE ; -; -; RTC_DISPADR .DW RTC_DISPERR ; RTC DISPATCH ADDRESS RTC_DISPACT .DB 0 ; SET WHEN DISPADR SET ; -;================================================================================================== -; DSKY DEVICE DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; DSKY DEVICE DISPATCHER +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO DSKY DRIVER ; B: FUNCTION @@ -4198,8 +4275,6 @@ DSKY_SETDISP: LD (DSKY_DISPACT),A ; SAVE IT RET ; AND DONE ; -; -; DSKY_DISPADR .DW DSKY_DISPERR ; DSKY DISPATCH ADDRESS DSKY_DISPACT .DB 0 ; SET WHEN DISPADR SET ; @@ -4245,12 +4320,10 @@ VDA_SIZ .EQU VDA_MAX * 4 ; EACH ENTRY IS 4 BYTES .DB VDA_MAX ; MAX ENTRY COUNT TABLE PREFIX VDA_CNT .DB 0 ; ENTRY COUNT PREFIX VDA_TBL .FILL VDA_SIZ,0 ; SPACE FOR ENTRIES - -; ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; SOUND ADAPTER DEVICE DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; ROUTE CALL TO SPECIFIED SOUND DEVICE DRIVER ; B: FUNCTION @@ -4258,10 +4331,10 @@ VDA_TBL .FILL VDA_SIZ,0 ; SPACE FOR ENTRIES ; SND_DISPATCH: PUSH IY ; SAVE INCOMING IY - +; LD IY, SND_TBL ; POINT IY TO START OF DIO TABLE CALL HB_DISPCALL ; GO TO GENERIC API CALL CODE - +; POP IY ; RESTORE IY RET ; AND DONE ; @@ -4291,9 +4364,11 @@ SND_SIZ .EQU SND_MAX * 4 ; EACH ENTRY IS 4 BYTES SND_CNT .DB 0 ; ENTRY COUNT PREFIX SND_TBL .FILL SND_SIZ,0 ; SPACE FOR ENTRIES ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; SPEAKER BEEP ROUTINE -;================================================================================================== +;-------------------------------------------------------------------------------------------------- +; +;;; RELOCATE ; ; ROUTINE TO BEEP THE DEFAULT SOUND UNIT ; NEED TO CHECK FOR EXISTENCE OF SOUND UNIT @@ -4334,9 +4409,9 @@ SND_BEEP: CALL SND_DISPATCH ; DO IT RET ; DONE ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; SYSTEM FUNCTION DISPATCHER -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; B: FUNCTION ; @@ -4378,6 +4453,10 @@ HB_DISP_END .EQU $ ; HB_SYSAPI_BEG .EQU $ ; +;-------------------------------------------------------------------------------------------------- +; SYSTEM RESET +;-------------------------------------------------------------------------------------------------- +; ; RESTART SYSTEM ; SUBFUNCTION IN C ; @@ -4506,6 +4585,10 @@ SYS_RESUSER2: ; RET ; ELSE RETURN WITH USER RESET VECTOR IN HL ; +;-------------------------------------------------------------------------------------------------- +; SYSTEM VERSION +;-------------------------------------------------------------------------------------------------- +; ; GET THE CURRENT HBIOS VERSION ; ON INPUT, C=0 ; RETURNS VERSION IN DE AS BCD @@ -4519,6 +4602,10 @@ SYS_VER: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; SET BANK +;-------------------------------------------------------------------------------------------------- +; ; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK ; NOTE THAT IT GOES INTO EFFECT AS HBIOS FUNCTION IS EXITED ; HERE, WE JUST SET THE CURRENT BANK @@ -4528,7 +4615,7 @@ SYS_SETBNK: #IF (MEMMGR == MM_Z280) ; FOR Z280 MEMMGR, WE ARE IN SYSTEM MODE HERE, SO WE CAN UPDATE ; THE USER MODE BANK WITHOUT IMPACTING THE RUNNING CODE. IT - ; TAKE EFFECT UPON RETURN TO USER MODE. + ; WILL TAKE EFFECT UPON RETURN TO USER MODE. LD A,(HB_INVBNK) ; GET PREVIOUS BANK PUSH AF ; SAVE IT LD A,C ; NEW BANK TO A @@ -4550,7 +4637,9 @@ SYS_SETBNK: RET ; DONE #ENDIF ; -; GET ACTIVE MEMORY BANK +;-------------------------------------------------------------------------------------------------- +; GET BANK +;-------------------------------------------------------------------------------------------------- ; SYS_GETBNK: LD A,(HB_INVBNK) ; GET THE ACTIVE MEMORY BANK @@ -4558,6 +4647,10 @@ SYS_GETBNK: XOR A ; SIGNAL SUCCESS RET ; +;-------------------------------------------------------------------------------------------------- +; SETUP INTERBANK COPY +;-------------------------------------------------------------------------------------------------- +; ; SET BANKS AND LENGTH FOR INTERBANK MEMORY COPY (BNKCPY) ; ENTRY: E=SOURCE BANK ID ; D=DEST BANK ID @@ -4572,6 +4665,10 @@ SYS_SETCPY: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; PERFORM INTERBANK COPY +;-------------------------------------------------------------------------------------------------- +; ; PERFORM MEMORY COPY POTENTIALLY ACROSS BANKS ; ENTRY: HL=SOURCE ADDRESS ; DE=DESTINATION ADDRESS @@ -4586,6 +4683,10 @@ SYS_BNKCPY: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; ALLOCATE HEAP SPACE +;-------------------------------------------------------------------------------------------------- +; ; ALLOCATE HL BYTES OF MEMORY FROM HBIOS HEAP ; RETURNS POINTER TO ALLOCATED MEMORY IN HL ; ON SUCCESS RETURN A == 0, AND Z SET @@ -4595,6 +4696,10 @@ SYS_BNKCPY: SYS_ALLOC: JP HB_ALLOC ; +;-------------------------------------------------------------------------------------------------- +; FREE HEAP SPACE +;-------------------------------------------------------------------------------------------------- +; ; FREE HEAP MEMORY BY SIMPLY RELEASING ALL ; MEMORY BEYOND POINTER IN HL. ; ON SUCCESS RETURN A == 0, AND Z SET @@ -4605,6 +4710,10 @@ SYS_FREE: SYSCHKERR(ERR_NOTIMPL) ; NOT YET IMPLEMENTED RET ; +;-------------------------------------------------------------------------------------------------- +; GET SYSTEM INFORMATION +;-------------------------------------------------------------------------------------------------- +; ; GET SYSTEM INFORMATION ; ITEM TO RETURN INDICATED IN C ; @@ -4979,6 +5088,10 @@ SYS_GETAPPBNKS: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; SET SYSTEM PARAMETERS +;-------------------------------------------------------------------------------------------------- +; ; SET SYSTEM PARAMETERS ; PARAMETER(S) TO SET INDICATED IN C ; @@ -5074,8 +5187,8 @@ SYS_SETCPUSPD1: CP 1 ; CHECK FOR 1 (FULL SPEED) JR Z,SYS_SETCPUSPD2 ; IF SO, ALL DONE ; ADJUST HL TO REFLECT HALF SPEED OPERATION - SRL H ; ADJUST HL ASSUMING - RR L ; HALF SPEED OPERATION + SRL H ; ADJUST HL ASSUMING + RR L ; HALF SPEED OPERATION ; SYS_SETCPUSPD2: ; @@ -5286,6 +5399,10 @@ SYS_SETPANEL: RET #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; INTERBANK MEMORY PEEK +;-------------------------------------------------------------------------------------------------- +; ; RETURN A BYTE OF MEMORY FROM SPECIFIED BANK ; ENTRY: D=BANK ID, HL=ADDRESS ; RETURN: E=BYTE VALUE @@ -5324,6 +5441,10 @@ SYS_PEEK: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; INTERBANK MEMORY POKE +;-------------------------------------------------------------------------------------------------- +; ; WRITE A BYTE OF MEMORY TO SPECIFIED BANK ; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE ; @@ -5361,6 +5482,10 @@ SYS_POKE: XOR A RET ; +;-------------------------------------------------------------------------------------------------- +; INTERRUPT MANAGEMENT FUNCTIONS +;-------------------------------------------------------------------------------------------------- +; ; INTERRUPT MANAGEMENT FUNCTIONS ; SUBFUNCTION IN C ; @@ -5562,6 +5687,7 @@ Z280_IVT: .DW HBX_IV0D .DW HBX_IV0E .DW HBX_IV0F +; ; THE REMAINDER OF THE Z280 IVT IS TRUNCATED HERE BECAUSE IT ; TAKES A BUNCH OF SPACE AND IS NOT USED. WE SUPPORT ONLY ; 16 VECTORED INTERRUPTS AND THEY MUST BE CONNECTED TO INTA. @@ -5571,24 +5697,91 @@ Z280_IVT: HB_Z280IVT_END .EQU $ ; ;================================================================================================== -; GLOBAL HBIOS FUNCTIONS +; GLOBAL INTERNAL HBIOS FUNCTIONS ;================================================================================================== ; HB_INTFUNC_BEG .EQU $ ; -; GLOBAL HBIOS IDLE PROCESSING IS DONE HERE. THIS ROUTINE SHOULD -; BE CALLED WHENEVER WAITING FOR USER INPUT. +;-------------------------------------------------------------------------------------------------- +; PRINT DECIMAL VALUE WITH 3 DIGIT MANTISSA +;-------------------------------------------------------------------------------------------------- ; -IDLE: - PUSH AF +; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +; +PRTD3M: PUSH BC PUSH DE PUSH HL - PUSH IY -#IF (FDENABLE) - CALL FD_IDLE -#ENDIF - POP IY + LD E,'0' + LD BC,-10000 + CALL PRTD3M1 + LD E,0 + LD BC,-1000 + CALL PRTD3M1 + CALL PC_PERIOD + LD BC,-100 + CALL PRTD3M1 + LD C,-10 + CALL PRTD3M1 + LD C,-1 + CALL PRTD3M1 + POP HL + POP DE + POP BC + RET +PRTD3M1: + LD A,'0' - 1 +PRTD3M2: + INC A + ADD HL,BC + JR C,PRTD3M2 + SBC HL,BC + CP E + JR Z,PRTD3M3 + LD E,0 + CALL COUT +PRTD3M3: + RET +; +;-------------------------------------------------------------------------------------------------- +; INITIALIZATION VECTOR PROCESSING SUPPORT +;-------------------------------------------------------------------------------------------------- +; +; CALL A LIST OF ROUTINES POINTED TO BY DE OF LENGTH B. +; +CALLLIST: + LD A,(DE) + LD L,A + INC DE + LD A,(DE) + LD H,A + INC DE + PUSH DE + PUSH BC + CALL JPHL + POP BC + POP DE + DJNZ CALLLIST +CALLDUMMY: + RET +; +;-------------------------------------------------------------------------------------------------- +; GLOBAL IDLE PROCESSING +;-------------------------------------------------------------------------------------------------- +; +; GLOBAL HBIOS IDLE PROCESSING IS DONE HERE. THIS ROUTINE SHOULD +; BE CALLED WHENEVER WAITING FOR USER INPUT. +; +IDLE: + PUSH AF + PUSH BC + PUSH DE + PUSH HL + PUSH IY +#IF (FDENABLE) + CALL FD_IDLE +#ENDIF + POP IY POP HL POP DE POP BC @@ -5607,6 +5800,124 @@ CIO_IDLE: POP AF ; RECOVER AF RET ; +; SET HL TO IY+A, A IS TRASHED +; +LDHLIYA: + PUSH IY ; COPY INSTANCE DATA PTR + POP HL ; ... TO HL + ;JP ADDHLA ; APPLY OFFSET TO HL AND RETURN + ADD A,L ; ADD OFFSET TO LSB + LD L,A ; ... PUT BACK IN L + RET NC ; DONE IF CF NOT SET + INC H ; IF CF SET, BUMP MSB + RET ; ... AND RETURN +; +;-------------------------------------------------------------------------------------------------- +; CHS TO LBA CONVERSION +;-------------------------------------------------------------------------------------------------- +; +; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO +; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED +; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. +; +; INPUT: HL=TRACK, D=HEAD, E=SECTOR +; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) +; +HB_CHS2LBA: +; + LD A,D ; HEAD TO A + RLCA ; LEFT SHIFT TO HIGH NIBBLE + RLCA ; ... DEPENDS ON HIGH + RLCA ; ... NIBBLE BEING 0 SINCE + RLCA ; ... IT ROTATES INTO LOW NIBBLE + OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) + LD D,0 + LD E,H + LD H,L + LD L,A + XOR A + RET +; +;-------------------------------------------------------------------------------------------------- +; SYSTEM CHECK / PANIC +;-------------------------------------------------------------------------------------------------- +; +; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? +; +SYSCHKA: + ; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY + PUSH AF ; PRESERVE INCOMING AF VALUE + LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL + 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 + CALL WRITESTR ; PRINT IT + POP DE ; RESTORE DE VALUE + CALL XREGDMP ; DUMP REGISTERS + + ; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX + EX (SP),HL ; GET RETURN ADDRESS + INC HL ; POINT TO THE ERROR CODE + PUSH AF + LD A,(HL) ; DISPLAY + CALL PRTHEXBYTE + POP AF + DEC HL ; RESTORE RETURN ADDRESS + EX (SP),HL +; + JR CONTINUE ; CHECK W/ USER +; +SYSCHK1: + ; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL + POP AF + RET +; +CONTINUE: + PUSH AF +CONTINUE1: + PUSH DE + LD DE,STR_CONTINUE + CALL WRITESTR + POP DE + CALL CIN + RES 5,A ; FORCE UPPERCASE (IMPERFECTLY) + CALL COUT ; ECHO + CP 'Y' + JR Z,CONTINUE3 + CP 'N' + JR Z,SYSHALT + JR CONTINUE1 +CONTINUE3: + CALL NEWLINE + POP AF + RET +; +; PANIC: DUMP MACHINE STATE AND HALT +; +PANIC: + PUSH DE + LD DE,STR_PANIC + CALL WRITESTR + POP DE + CALL XREGDMP ; DUMP REGISTERS + JR SYSHALT ; FULL STOP +; +; ISSUE MESSAGE AND HALT SYSTEM +; +SYSHALT: + LD DE,STR_HALT + CALL WRITESTR + DI + HALT +; +;-------------------------------------------------------------------------------------------------- +; INTERRUPT MANAGEMENT SUPPORT +;-------------------------------------------------------------------------------------------------- +; #IF (INTMODE == 1) ; ; ROUTINE BELOW IS USED TO ADD A NEW VECTOR TO THE IM1 @@ -5626,20 +5937,18 @@ HB_ADDIM1: INC (HL) ; INCREMENT RET ; DONE ; -HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST -HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST -HB_IM1PTR .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY -; #ENDIF ; +;-------------------------------------------------------------------------------------------------- +; DSKY SUPPORT +;-------------------------------------------------------------------------------------------------- +; #IF (DSKYENABLE) ; -;================================================================================================== ; CONVERT 32 BIT BINARY TO 8 BYTE HEX SEGMENT DISPLAY -;================================================================================================== ; -; HL: ADR OF 32 BIT BINARY -; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) +; HL: ADR OF 32 BIT BINARY +; DE: ADR OF DEST LED SEGMENT DISPLAY BUFFER (8 BYTES) ; DSKY_BIN2SEG: LD B,4 ; 4 BYTES OF INPUT @@ -5668,59 +5977,12 @@ DSKY_BIN2SEG_NIB: ; #ENDIF ; -; -; -#IF (MEMMGR == MM_Z280) -; -Z280_TIMINT: - ; DISCARD REASON CODE - INC SP - INC SP -; - ; SAVE INCOMING REGISTERS - PUSH AF - PUSH BC - PUSH DE - PUSH HL -; - ; CALL PRIMARY TIMER LOGIC ON EVERY OTHER INT - LD A,(Z280_TIMCTR) - XOR $FF - LD (Z280_TIMCTR),A - CALL Z,HB_TIMINT -; - ; SELECT I/O PAGE $FE (SAVING PREVIOUS VALUE) - LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - LDCTL HL,(C) ; GET CURRENT I/O PAGE - PUSH HL ; SAVE IT - LD L,$FE ; NEW COUNTER/TIMER I/O PAGE - LDCTL (C),HL -; - ; CLEAR END OF COUNT CONDITION TO RESET INTERRUPT - IN A,(Z280_CT0_CMDST) ; GET STATUS - RES 1,A ; CLEAR CC - OUT (Z280_CT0_CMDST),A ; SET C/T 0 -; - ; RESTORE I/O PAGE - LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER - POP HL ; RECOVER ORIGINAL I/O PAGE - LDCTL (C),HL -; - ; RESTORE REGISTERS - POP HL - POP DE - POP BC - POP AF -; - RETIL -; -Z280_TIMCTR .DB 0 ; USED TO DIVIDE TIMER INTS -; -#ENDIF -; -; +;-------------------------------------------------------------------------------------------------- +; SYSTEM TIMER INTERRUPT HANDLER +;-------------------------------------------------------------------------------------------------- ; HB_TIMINT: +; #IF FALSE ; *DEBUG* LD HL,HB_TIMDBGCNT INC (HL) @@ -5754,57 +6016,291 @@ HB_TICK: ; HB_TICK1: ; -#IF (CPUFAM == CPU_Z180) - ; ACK/RESET Z180 TIMER INTERRUPT - IN0 A,(Z180_TCR) - IN0 A,(Z180_TMDR0L) -#ENDIF +#IF (CPUFAM == CPU_Z180) + ; ACK/RESET Z180 TIMER INTERRUPT + IN0 A,(Z180_TCR) + IN0 A,(Z180_TMDR0L) +#ENDIF +; +#IF (WDOGMODE != WDOG_NONE) + ; PULSE WATCHDOG + OUT (WDOGIO),A ; VALUE IS IRRELEVANT +#ENDIF +; +#IF MKYENABLE + CALL MKY_INT +#ENDIF +; + OR $FF ; NZ SET TO INDICATE INT HANDLED + RET +; +HB_SECOND: + ; INCREMENT SECONDS COUNTER + LD HL,HB_SECS ; POINT TO SECONDS COUNTER + JP INC32HL ; INCREMENT AND RETURN +; +; BAD INTERRUPT HANDLER +; +HB_BADINT: + +#IF FALSE ; *DEBUG* + LD HL,HB_BADINTCNT + INC (HL) + LD A,(HL) + OUT (DIAGPORT),A + OR $FF + RET +HB_BADINTCNT .DB 0 +#ENDIF ; *DEBUG* + + CALL NEWLINE2 + PRTS("+++ BAD INT $") + LD A,L + RRCA + RRCA + ;CALL PRTHEXBYTE + ;PRTS("H: $") + CALL XREGDMP + CALL NEWLINE + ;CALL CONTINUE + OR $FF ; SIGNAL INTERRUPT HANDLED + RET +; +;-------------------------------------------------------------------------------------------------- +; API FUNCTION DISPATCH SUPPORT +;-------------------------------------------------------------------------------------------------- +; +; ON ENTRY B IS API FUNCTION NUMBER AND C IS UNIT # +; (INDEX INTO XXX_TBL OF UNITS) AND IY POINTS TO START OF UNIT TABLE. +; USE UNIT # IN C TO LOOKUP XXX_TBL ENTRY. THE XXX_TBL +; ENTRY CONTAINS THE START OF THE DRIVER FUNCTION TABLE AND +; THE DEVICE SPECIFIC INSTANCE DATA (BLOB). SET IY TO BLOB ADDRESS +; AND CALL THE SPECIFIC FUNCTION REQUESTED IN THE DRIVER. +; +HB_DISPCALL: + PUSH HL ; SAVE INCOMING HL VALUE + CALL HB_DISPCALC ; IY = BLOB ADR, HL = FN ADR + JR NZ,HB_DISPCALL1 ; ABORT ON ERROR + EX (SP),HL ; RESTORE HL & FN ADR TO TOS + RET ; JUMP TO FN ADR +HB_DISPCALL1: + POP HL ; RECOVER HL + RET ; AND DONE +; +; ENTRY: BC=FUNC/UNIT, IY=DISPATCH TABLE +; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR +; +HB_DISPCALC: + ; CHECK INCOMING UNIT INDEX IN C FOR VALIDITY + LD A,C ; A := INCOMING DISK UNIT INDEX + CP (IY-1) ; COMPARE TO COUNT + JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX + + ; CHECK FUNCTION INDEX FOR VALIDITY + LD A,B ; A := INCOMING FUNCTION NUMBER + AND $0F ; LOW NIBBLE ONLY FOR FUNC INDEX + CP (IY-3) ; CHECK FN NUM AGAINST MAX + JR NC,HB_FUNCERR ; HANDLE FN NUM OUT OF RANGE ERROR + + ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX + PUSH BC ; SAVE BC + LD B,0 ; MSB IS ALWAYS ZERO + RLC C ; MULTIPLY UNIT INDEX + RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET + ADD IY,BC ; SET IY TO ENTRY ADDRESS + POP BC ; RESTORE BC + + ; DERIVE DRIVER FUNC ADR TO CALL + ;PUSH HL ; SAVE INCOMING HL + LD L,(IY+0) ; COPY DRIVER FUNC TABLE + LD H,(IY+1) ; ... START TO HL + RLCA ; CONV UNIT (STILL IN A) TO FN ADR OFFSET + CALL ADDHLA ; HL NOW HAS DRIVER FUNC TBL START ADR + LD A,(HL) ; DEREFERENCE HL + INC HL ; ... TO GET + LD H,(HL) ; ... ACTUAL + LD L,A ; ... TARGET FUNCTION ADDRESS + ;EX (SP),HL ; RESTORE HL, FUNC ADR ON STACK + + ; GET UNIT INSTANCE DATA BLOB ADDRESS TO IY + ;PUSH HL ; SAVE INCOMING HL + PUSH HL ; SAVE FUNC ADR + LD L,(IY+2) ; HL := DATA BLOB ADDRESS + LD H,(IY+3) ; ... + EX (SP),HL ; RESTORE HL, BLOB ADR ON TOS + POP IY ; IY := BLOB ADR + + XOR A ; SIGNAL SUCCESS + RET ; JUMP TO DRIVER FUNC ADR ON TOS +; +HB_FUNCERR: + SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR + RET +; +HB_UNITERR: + SYSCHKERR(ERR_NOUNIT) ; SIGNAL ERROR + RET +; +; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL +; BC: DRIVER FUNCTION TABLE +; DE: ADDRESS OF UNIT INSTANCE DATA +; RETURN +; A: UNIT NUMBER ASSIGNED +; +HB_ADDENT: + DEC HL ; POINT TO ENTRY COUNT + LD A,(HL) ; GET ENTRY COUNT + PUSH AF ; SAVE VALUE TO RETURN AS ENTRY NUM AT END + INC A ; INCREMENT TO ACCOUNT FOR NEW ENTRY + DEC HL ; POINT TO ENTRY MAX + CP (HL) ; COMPARE MAX TO CURRENT COUNT (COUNT - MAX) + CALL NC,PANIC ; OVERFLOW + INC HL ; POINT TO COUNT + LD (HL),A ; SAVE NEW COUNT + INC HL ; POINT TO START OF TABLE + DEC A ; CONVERT A FROM ENTRY COUNT TO ENTRY INDEX + RLCA ; MULTIPLY BY 4 + RLCA ; ... TO GET BYTE OFFSET OF ENTRY + CALL ADDHLA ; MAKE HL POINT TO ACTUAL ENTRY ADDRESS + PUSH BC ; GET TABLE ENTRY ADDRESS TO BC + EX (SP),HL ; ... AND DISPATCH ADDRESS TO HL + POP BC ; ... SO THAT DE:HL HAS 32 BIT ENTRY + CALL ST32 ; LD (BC),DE:HL STORES THE ENTRY + POP AF ; RETURN ENTRY INDEX (UNIT NUMBER ASSIGNED) + RET +; +;-------------------------------------------------------------------------------------------------- +; HEAP MEMORY ALLOCATION +;-------------------------------------------------------------------------------------------------- +; +; ALLOCATE HL BYTES OF MEMORY ON THE HEAP +; RETURNS POINTER TO ALLOCATED SPACE IN HL +; ON SUCCESS RETURN A == 0, AND Z SET +; ON FAILURE A <> 0 AND NZ SET AND HL TRASHED +; ALL OTHER REGISTERS PRESERVED +; +; A 4 BYTE HEADER IS PLACED IN FRONT OF THE ALLOCATED MEMORY +; - DWORD: SIZE OF MEMORY ALLOCATED (DOES NOT INCLUDE 4 BYTE HEADER) +; - DWORD: ADDRESS WHERE ALLOC WAS CALLED (VALUE ON TOP OF STACK AT CALL) +; +HB_ALLOC: +; +#IFDEF MEMDBG + CALL PRTSTRD + .TEXT "\r\n>>> ALLOC SIZE=0x$") + CALL PRTHEXWORDHL +#ENDIF +; + ; SAVE ALLOC SIZE AND REFERENCE ADR FOR SUBSEQUENT HEADER CONSTRUCTION + LD (HB_TMPSZ),HL ; SAVE INCOMING SIZE REQUESTED + ; USE EX (SP),HL INSTEAD???? + POP HL ; GET RETURN ADDRESS + LD (HB_TMPREF),HL ; SAVE AS REFERENCE + ; USE EX (SP),HL INSTEAD???? + PUSH HL ; PUT IT BACK ON STACK + LD HL,(HB_TMPSZ) ; RECOVER INCOMING MEM SIZE PARM +; + ; CALC NEW HEAP TOP AND HANDLE OUT-OF-SPACE ERROR + PUSH DE ; SAVE INCOMING DE + LD DE,4 ; SIZE OF HEADER + ADD HL,DE ; ADD IT IN + JR C,HB_ALLOC1 ; ERROR ON OVERFLOW + LD DE,(CB_HEAPTOP) ; CURRENT HEAP TOP + ADD HL,DE ; ADD IT IN, HL := NEW HEAP TOP + JR C,HB_ALLOC1 ; ERROR ON OVERFLOW + BIT 7,H ; TEST PAST END OF BANK (>= 32K) + JR NZ,HB_ALLOC1 ; ERROR IF PAST END +; + ; SAVE NEW HEAP TOP + LD DE,(CB_HEAPTOP) ; GET ORIGINAL HEAP TOP + LD (CB_HEAPTOP),HL ; SAVE NEW HEAP TOP +; +#IFDEF MEMDBG + CALL PRTSTRD + .TEXT " TOP=0x$") + CALL PRTHEXWORDHL +#ENDIF +; + ; SET HEADER VALUES + EX DE,HL ; HEADER ADR TO HL + LD DE,(HB_TMPSZ) ; GET THE ORIG SIZE REQUESTED + LD (HL),E ; SAVE SIZE (LSB) + INC HL ; BUMP HEADER POINTER + LD (HL),D ; SAVE SIZE (MSB) + INC HL ; BUMP HEADER POINTER + LD DE,(HB_TMPREF) ; GET THE REFERENCE ADR + LD (HL),E ; SAVE REF ADR (LSB) + INC HL ; BUMP HEADER POINTER + LD (HL),D ; SAVE REF ADR (MSB) + INC HL ; BUMP HEADER POINTER +; + ; RETURN SUCCESS, HL POINTS TO START OF ALLOCATED MEMORY (PAST HEADER) + POP DE ; RESTORE INCOMING DE + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +HB_ALLOC1: + ; ERROR RETURN + POP DE ; RESTORE INCOMING DE + SYSCHKERR(ERR_NOMEM) ; SIGNAL ERROR + RET +; +HB_TMPSZ .DW 0 +HB_TMPREF .DW 0 +; +;-------------------------------------------------------------------------------------------------- +; Z280 SUPPORT ROUTINES +;-------------------------------------------------------------------------------------------------- +; +; Z280 SYSTEM TIMER INTERRUPT HANDLER +; +#IF (MEMMGR == MM_Z280) +; +Z280_TIMINT: + ; DISCARD REASON CODE + INC SP + INC SP +; + ; SAVE INCOMING REGISTERS + PUSH AF + PUSH BC + PUSH DE + PUSH HL +; + ; CALL PRIMARY TIMER LOGIC ON EVERY OTHER INT + LD A,(Z280_TIMCTR) + XOR $FF + LD (Z280_TIMCTR),A + CALL Z,HB_TIMINT ; -#IF (WDOGMODE != WDOG_NONE) - ; PULSE WATCHDOG - OUT (WDOGIO),A ; VALUE IS IRRELEVANT -#ENDIF + ; SELECT I/O PAGE $FE (SAVING PREVIOUS VALUE) + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER + LDCTL HL,(C) ; GET CURRENT I/O PAGE + PUSH HL ; SAVE IT + LD L,$FE ; NEW COUNTER/TIMER I/O PAGE + LDCTL (C),HL ; -#IF MKYENABLE - CALL MKY_INT -#ENDIF + ; CLEAR END OF COUNT CONDITION TO RESET INTERRUPT + IN A,(Z280_CT0_CMDST) ; GET STATUS + RES 1,A ; CLEAR CC + OUT (Z280_CT0_CMDST),A ; SET C/T 0 ; - OR $FF ; NZ SET TO INDICATE INT HANDLED - RET + ; RESTORE I/O PAGE + LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER + POP HL ; RECOVER ORIGINAL I/O PAGE + LDCTL (C),HL ; -HB_SECOND: - ; INCREMENT SECONDS COUNTER - LD HL,HB_SECS ; POINT TO SECONDS COUNTER - JP INC32HL ; INCREMENT AND RETURN + ; RESTORE REGISTERS + POP HL + POP DE + POP BC + POP AF ; -; BAD INTERRUPT HANDLER + RETIL ; -HB_BADINT: - -#IF FALSE ; *DEBUG* - LD HL,HB_BADINTCNT - INC (HL) - LD A,(HL) - OUT (DIAGPORT),A - OR $FF - RET -HB_BADINTCNT .DB 0 -#ENDIF ; *DEBUG* - - CALL NEWLINE2 - PRTS("+++ BAD INT $") - LD A,L - RRCA - RRCA - ;CALL PRTHEXBYTE - ;PRTS("H: $") - CALL XREGDMP - CALL NEWLINE - ;CALL CONTINUE - OR $FF ; SIGNAL INTERRUPT HANDLED - RET +Z280_TIMCTR .DB 0 ; USED TO DIVIDE TIMER INTS ; -; Z280 BAD INT HANDLER +#ENDIF ; #IF (MEMMGR == MM_Z280) ; @@ -5976,201 +6472,25 @@ Z280_PRIVINST4: DI HALT ; -Z280_PRIVINSTX: - ; RESTORE REGISTERS - POP DE ; NEEDED? - POP BC ; NEEDED? - POP AF -; - ; RECOVER HL AND MSR, THEN RETURN VIA RETIL - EX (SP),HL ; RECOVER HL, ADR TO STK - PUSH HL ; SAVE HL - LD HL,(HB_MSRSAV) ; GET SAVED MSR - EX (SP),HL ; MSR TO STK, RECOVER HL - RETIL ; RETURN FROM INT -; -HB_MSRSAV .DW 0 ; SAVED MSR -HB_RCSAV .DW 0 ; SAVED REASON CODE -; -Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$" -; -#ENDIF -; -; COMMON API FUNCTION DISPATCH CODE -; -; ON ENTRY B IS API FUNCTION NUMBER AND C IS UNIT # -; (INDEX INTO XXX_TBL OF UNITS) AND IY POINTS TO START OF UNIT TABLE. -; USE UNIT # IN C TO LOOKUP XXX_TBL ENTRY. THE XXX_TBL -; ENTRY CONTAINS THE START OF THE DRIVER FUNCTION TABLE AND -; THE DEVICE SPECIFIC INSTANCE DATA (BLOB). SET IY TO BLOB ADDRESS -; AND CALL THE SPECIFIC FUNCTION REQUESTED IN THE DRIVER. -; -HB_DISPCALL: - PUSH HL ; SAVE INCOMING HL VALUE - CALL HB_DISPCALC ; IY = BLOB ADR, HL = FN ADR - JR NZ,HB_DISPCALL1 ; ABORT ON ERROR - EX (SP),HL ; RESTORE HL & FN ADR TO TOS - RET ; JUMP TO FN ADR -HB_DISPCALL1: - POP HL ; RECOVER HL - RET ; AND DONE -; -; ENTRY: BC=FUNC/UNIT, IY=DISPATCH TABLE -; EXIT: HL=FUNC ADR, IY=DATA BLOB ADR -; -HB_DISPCALC: - ; CHECK INCOMING UNIT INDEX IN C FOR VALIDITY - LD A,C ; A := INCOMING DISK UNIT INDEX - CP (IY-1) ; COMPARE TO COUNT - JR NC,HB_UNITERR ; HANDLE INVALID UNIT INDEX - - ; CHECK FUNCTION INDEX FOR VALIDITY - LD A,B ; A := INCOMING FUNCTION NUMBER - AND $0F ; LOW NIBBLE ONLY FOR FUNC INDEX - CP (IY-3) ; CHECK FN NUM AGAINST MAX - JR NC,HB_FUNCERR ; HANDLE FN NUM OUT OF RANGE ERROR - - ; BUMP IY TO ACTUAL XXX_TBL ENTRY FOR INCOMING UNIT INDEX - PUSH BC ; SAVE BC - LD B,0 ; MSB IS ALWAYS ZERO - RLC C ; MULTIPLY UNIT INDEX - RLC C ; ... BY 4 FOR TABLE ENTRY OFFSET - ADD IY,BC ; SET IY TO ENTRY ADDRESS - POP BC ; RESTORE BC - - ; DERIVE DRIVER FUNC ADR TO CALL - ;PUSH HL ; SAVE INCOMING HL - LD L,(IY+0) ; COPY DRIVER FUNC TABLE - LD H,(IY+1) ; ... START TO HL - RLCA ; CONV UNIT (STILL IN A) TO FN ADR OFFSET - CALL ADDHLA ; HL NOW HAS DRIVER FUNC TBL START ADR - LD A,(HL) ; DEREFERENCE HL - INC HL ; ... TO GET - LD H,(HL) ; ... ACTUAL - LD L,A ; ... TARGET FUNCTION ADDRESS - ;EX (SP),HL ; RESTORE HL, FUNC ADR ON STACK - - ; GET UNIT INSTANCE DATA BLOB ADDRESS TO IY - ;PUSH HL ; SAVE INCOMING HL - PUSH HL ; SAVE FUNC ADR - LD L,(IY+2) ; HL := DATA BLOB ADDRESS - LD H,(IY+3) ; ... - EX (SP),HL ; RESTORE HL, BLOB ADR ON TOS - POP IY ; IY := BLOB ADR - - XOR A ; SIGNAL SUCCESS - RET ; JUMP TO DRIVER FUNC ADR ON TOS -; -HB_FUNCERR: - SYSCHKERR(ERR_NOFUNC) ; SIGNAL ERROR - RET -; -HB_UNITERR: - SYSCHKERR(ERR_NOUNIT) ; SIGNAL ERROR - RET -; -; ADD AN ENTRY TO THE UNIT TABLE AT ADDRESS IN HL -; BC: DRIVER FUNCTION TABLE -; DE: ADDRESS OF UNIT INSTANCE DATA -; RETURN -; A: UNIT NUMBER ASSIGNED -; -HB_ADDENT: - DEC HL ; POINT TO ENTRY COUNT - LD A,(HL) ; GET ENTRY COUNT - PUSH AF ; SAVE VALUE TO RETURN AS ENTRY NUM AT END - INC A ; INCREMENT TO ACCOUNT FOR NEW ENTRY - DEC HL ; POINT TO ENTRY MAX - CP (HL) ; COMPARE MAX TO CURRENT COUNT (COUNT - MAX) - CALL NC,PANIC ; OVERFLOW - INC HL ; POINT TO COUNT - LD (HL),A ; SAVE NEW COUNT - INC HL ; POINT TO START OF TABLE - DEC A ; CONVERT A FROM ENTRY COUNT TO ENTRY INDEX - RLCA ; MULTIPLY BY 4 - RLCA ; ... TO GET BYTE OFFSET OF ENTRY - CALL ADDHLA ; MAKE HL POINT TO ACTUAL ENTRY ADDRESS - PUSH BC ; GET TABLE ENTRY ADDRESS TO BC - EX (SP),HL ; ... AND DISPATCH ADDRESS TO HL - POP BC ; ... SO THAT DE:HL HAS 32 BIT ENTRY - CALL ST32 ; LD (BC),DE:HL STORES THE ENTRY - POP AF ; RETURN ENTRY INDEX (UNIT NUMBER ASSIGNED) - RET -; -; ALLOCATE HL BYTES OF MEMORY ON THE HEAP -; RETURNS POINTER TO ALLOCATED SPACE IN HL -; ON SUCCESS RETURN A == 0, AND Z SET -; ON FAILURE A <> 0 AND NZ SET AND HL TRASHED -; ALL OTHER REGISTERS PRESERVED -; -; A 4 BYTE HEADER IS PLACED IN FRONT OF THE ALLOCATED MEMORY -; - DWORD: SIZE OF MEMORY ALLOCATED (DOES NOT INCLUDE 4 BYTE HEADER) -; - DWORD: ADDRESS WHERE ALLOC WAS CALLED (VALUE ON TOP OF STACK AT CALL) -; -HB_ALLOC: -; -#IFDEF MEMDBG - CALL PRTSTRD - .TEXT "\r\n>>> ALLOC SIZE=0x$") - CALL PRTHEXWORDHL -#ENDIF -; - ; SAVE ALLOC SIZE AND REFERENCE ADR FOR SUBSEQUENT HEADER CONSTRUCTION - LD (HB_TMPSZ),HL ; SAVE INCOMING SIZE REQUESTED - ; USE EX (SP),HL INSTEAD???? - POP HL ; GET RETURN ADDRESS - LD (HB_TMPREF),HL ; SAVE AS REFERENCE - ; USE EX (SP),HL INSTEAD???? - PUSH HL ; PUT IT BACK ON STACK - LD HL,(HB_TMPSZ) ; RECOVER INCOMING MEM SIZE PARM -; - ; CALC NEW HEAP TOP AND HANDLE OUT-OF-SPACE ERROR - PUSH DE ; SAVE INCOMING DE - LD DE,4 ; SIZE OF HEADER - ADD HL,DE ; ADD IT IN - JR C,HB_ALLOC1 ; ERROR ON OVERFLOW - LD DE,(CB_HEAPTOP) ; CURRENT HEAP TOP - ADD HL,DE ; ADD IT IN, HL := NEW HEAP TOP - JR C,HB_ALLOC1 ; ERROR ON OVERFLOW - BIT 7,H ; TEST PAST END OF BANK (>= 32K) - JR NZ,HB_ALLOC1 ; ERROR IF PAST END -; - ; SAVE NEW HEAP TOP - LD DE,(CB_HEAPTOP) ; GET ORIGINAL HEAP TOP - LD (CB_HEAPTOP),HL ; SAVE NEW HEAP TOP -; -#IFDEF MEMDBG - CALL PRTSTRD - .TEXT " TOP=0x$") - CALL PRTHEXWORDHL -#ENDIF -; - ; SET HEADER VALUES - EX DE,HL ; HEADER ADR TO HL - LD DE,(HB_TMPSZ) ; GET THE ORIG SIZE REQUESTED - LD (HL),E ; SAVE SIZE (LSB) - INC HL ; BUMP HEADER POINTER - LD (HL),D ; SAVE SIZE (MSB) - INC HL ; BUMP HEADER POINTER - LD DE,(HB_TMPREF) ; GET THE REFERENCE ADR - LD (HL),E ; SAVE REF ADR (LSB) - INC HL ; BUMP HEADER POINTER - LD (HL),D ; SAVE REF ADR (MSB) - INC HL ; BUMP HEADER POINTER -; - ; RETURN SUCCESS, HL POINTS TO START OF ALLOCATED MEMORY (PAST HEADER) - POP DE ; RESTORE INCOMING DE - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN +Z280_PRIVINSTX: + ; RESTORE REGISTERS + POP DE ; NEEDED? + POP BC ; NEEDED? + POP AF ; -HB_ALLOC1: - ; ERROR RETURN - POP DE ; RESTORE INCOMING DE - SYSCHKERR(ERR_NOMEM) ; SIGNAL ERROR - RET + ; RECOVER HL AND MSR, THEN RETURN VIA RETIL + EX (SP),HL ; RECOVER HL, ADR TO STK + PUSH HL ; SAVE HL + LD HL,(HB_MSRSAV) ; GET SAVED MSR + EX (SP),HL ; MSR TO STK, RECOVER HL + RETIL ; RETURN FROM INT ; -HB_TMPSZ .DW 0 -HB_TMPREF .DW 0 +HB_MSRSAV .DW 0 ; SAVED MSR +HB_RCSAV .DW 0 ; SAVED REASON CODE +; +Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$" +; +#ENDIF ; ; Z280 BANK COPY (CALLED FROM PROXY) ; @@ -6429,9 +6749,9 @@ HB_UTIL_BEG .EQU $ #INCLUDE "unlzsa2s.asm" #ENDIF ; -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; CONSOLE CHARACTER I/O HELPER ROUTINES (REGISTERS PRESERVED) -;================================================================================================== +;-------------------------------------------------------------------------------------------------- ; ; OUTPUT CHARACTER FROM A ; @@ -6521,7 +6841,7 @@ CST: ; LD A,(CB_CONDEV) ; GET CONSOLE UNIT BYTE CP $FF ; TEST FOR $FF (HBIOS NOT READY) - JR Z,CST1 ; IIF NOT READY, TRY DEBUG DEBUG STATUS + JR Z,CST1 ; IF NOT READY, TRY DEBUG DEBUG STATUS ; ; USE HBIOS LD C,A ; CONSOLE UNIT TO C @@ -6547,153 +6867,117 @@ CST2: RET ; ;================================================================================================== -; INTERNAL UTILITY FUNCTIONS +; DYNAMIC RAM SIZE DETECTION ROUTINE ;================================================================================================== ; -; SET HL TO IY+A, A IS TRASHED -; -LDHLIYA: - PUSH IY ; COPY INSTANCE DATA PTR - POP HL ; ... TO HL - ;JP ADDHLA ; APPLY OFFSET TO HL AND RETURN - ADD A,L ; ADD OFFSET TO LSB - LD L,A ; ... PUT BACK IN L - RET NC ; DONE IF CF NOT SET - INC H ; IF CF SET, BUMP MSB - RET ; ... AND RETURN -; -; CONVERT AN HBIOS STANDARD HARD DISK CHS ADDRESS TO -; AN LBA ADDRESS. A STANDARD HBIOS HARD DISK IS ASSUMED -; TO HAVE 16 SECTORS PER TRACK AND 16 HEADS PER CYLINDER. -; -; INPUT: HL=TRACK, D=HEAD, E=SECTOR -; OUTPUT: DE:HL=32 BIT LBA ADDRESS (D:7 IS NOT SET IN THE RESULT) -; -HB_CHS2LBA: -; - LD A,D ; HEAD TO A - RLCA ; LEFT SHIFT TO HIGH NIBBLE - RLCA ; ... DEPENDS ON HIGH - RLCA ; ... NIBBLE BEING 0 SINCE - RLCA ; ... IT ROTATES INTO LOW NIBBLE - OR E ; COMBINE WITH SECTOR (HIGH NIBBLE MUST BE ZERO) - LD D,0 - LD E,H - LD H,L - LD L,A - XOR A - RET -; -; SYSTEM CHECK: DUMP MACHINE STATE AND CONTINUE? +; THIS CODE IS COPIED TO $F000 TO PERFORM RAM SIZE DETECTION. ; -SYSCHKA: - ; CHECK DIAG LEVEL TO SEE IF WE SHOULD DISPLAY - PUSH AF ; PRESERVE INCOMING AF VALUE - LD A,(CB_DIAGLVL) ; GET DIAGNOSTIC LEVEL - CP DL_ERROR ; >= ERROR LEVEL - JR C,SYSCHK1 ; IF NOT, GO HOME - POP AF ; RESTORE INCOMING AF VALUE +#IFDEF SIZERAM ; - ; DISPLAY SYSCHK MESSAGE - PUSH DE ; PRESERVE DE VALUE - LD DE,STR_SYSCHK ; POINT TO PREFIX STRING - CALL WRITESTR ; PRINT IT - POP DE ; RESTORE DE VALUE - CALL XREGDMP ; DUMP REGISTERS +RS_IMAGE: + .ORG $F000 +RS_START: + LD A,(HB_CURBNK) ; GET CURRENT BANK + PUSH AF ; SAVE IT + + LD C,0 ; RUNNING BANK COUNT + LD HL,$7FFF ; BYTE TEST ADDRESS + LD IX,RS_ARY ; ORIG BYTE STORAGE ARRAY PTR +RS_LOOP1: + LD A,C + ADD A,$80 ; OFFSET BY START OF RAM BANKS + CALL RS_BNKSEL ; SELECT THE BANK - ; DISPLAY ERROR CODE. IT IS AT RETURN ADDRESS+1 .. LD A,XX - EX (SP),HL ; GET RETURN ADDRESS - INC HL ; POINT TO THE ERROR CODE - PUSH AF - LD A,(HL) ; DISPLAY - CALL PRTHEXBYTE - POP AF - DEC HL ; RESTORE RETURN ADDRESS - EX (SP),HL -; - JR CONTINUE ; CHECK W/ USER -; -SYSCHK1: - ; RETURN IF MESSAGING BYPASSED BY DIAG LEVEL - POP AF - RET -; -; PANIC: DUMP MACHINE STATE AND HALT -; -PANIC: - PUSH DE - LD DE,STR_PANIC - CALL WRITESTR - POP DE - CALL XREGDMP ; DUMP REGISTERS - JR SYSHALT ; FULL STOP -; + LD A,(HL) ; GET ORIGINAL VALUE + LD (IX),A ; SAVE IT TO RESTORE LATER + INC IX ; BUMP IX + + LD A,$AA ; TEST LOC WITH $AA + LD (HL),A ; AVOID PROBLEMS WITH + LD (HL),A ; ... DS1210 + LD (HL),A + LD A,(HL) + CP $AA + JR NZ,RS_DONE + + LD A,$55 ; TEST LOC WITH $55 + LD (HL),A + LD A,(HL) + CP $55 + JR NZ,RS_DONE + + ; STORE A UNIQUE VALUE + LD A,C + LD (HL),A + OR A ; ZERO? + JR Z,RS_NEXT ; SKIP STORED VALUE CHECK + + ; VERIFY ALL STORED VALUES + LD B,C ; INIT LOOP COUNTER + LD E,0 ; INIT BANK ID +RS_LOOP3: + LD A,E + ADD A,$80 + CALL RS_BNKSEL + LD A,(HL) + CP E ; VERIFY + JR NZ,RS_DONE ; ABORT IF MISCOMPARE + INC E ; NEXT BANK + DJNZ RS_LOOP3 ; +RS_NEXT: + INC C ; ADD 1 TO RAM BANK COUNT + JR RS_LOOP1 ; AND LOOP TILL DONE +; +RS_DONE: + LD E,C ; FINAL BANK COUNT TO E + LD A,C + OR A + JR Z,RS_LOOPZ + ; RESTORE SAVED VALUES + LD IX,RS_ARY + LD B,C ; LOOP COUNT + LD C,$80 ; BANK ID +RS_LOOP2: + LD A,C + CALL RS_BNKSEL + INC C + LD A,(IX) ; GET VALUE + LD (HL),A ; RESTORE IT + INC IX + DJNZ RS_LOOP2 ; ALL BANKS +RS_LOOPZ: ; -CONTINUE: - PUSH AF -CONTINUE1: - PUSH DE - LD DE,STR_CONTINUE - CALL WRITESTR - POP DE - CALL CIN - RES 5,A ; FORCE UPPERCASE (IMPERFECTLY) - CALL COUT ; ECHO - CP 'Y' - JR Z,CONTINUE3 - CP 'N' - JR Z,SYSHALT - JR CONTINUE1 -CONTINUE3: - CALL NEWLINE + ; RETURN TO ORIGINAL BANK POP AF + CALL RS_BNKSEL + LD A,E ; RETURN BANK COUNT RET ; +; SPECIAL BANK SELECT FOR MEMORY SIZING ; +RS_BNKSEL: + #IF (MEMMGR == MM_Z280) + ; IF Z280 MEMMGR, THEN WE ARE IN SYSTEM MODE, SO WE NEED TO + ; BANK SELECT THE SYSTEM PDRS INSTEAD OF THE NORMAL USER PDRS. + PUSH BC ; SAVE BC + PUSH HL ; SAVE HL + LD B,$10 ; FIRST SYSTEM PDR + CALL Z280_BNKSEL ; DO IT + POP HL ; RESTORE HL + POP BC ; RESTORE BC + RET ; DONE + #ELSE + ; NORMAL BANK SELECT + JP HBX_BNKSEL + #ENDIF ; -SYSHALT: - LD DE,STR_HALT - CALL WRITESTR - DI - HALT +RS_ARY .EQU $ ; -; PRINT VALUE OF HL AS THOUSANDTHS, IE. 0.000 +RS_LEN .EQU $ - RS_START + .ORG RS_IMAGE + RS_LEN ; -PRTD3M: - PUSH BC - PUSH DE - PUSH HL - LD E,'0' - LD BC,-10000 - CALL PRTD3M1 - LD E,0 - LD BC,-1000 - CALL PRTD3M1 - CALL PC_PERIOD - LD BC,-100 - CALL PRTD3M1 - LD C,-10 - CALL PRTD3M1 - LD C,-1 - CALL PRTD3M1 - POP HL - POP DE - POP BC - RET -PRTD3M1: - LD A,'0' - 1 -PRTD3M2: - INC A - ADD HL,BC - JR C,PRTD3M2 - SBC HL,BC - CP E - JR Z,PRTD3M3 - LD E,0 - CALL COUT -PRTD3M3: - RET +#ENDIF ; ;================================================================================================== ; FRONT PANEL SUPPORT @@ -8241,8 +8525,6 @@ Z280_GOSYS_LEN .EQU $ - Z280_GOSYS ; .FILL (512 - ($ - HB_WRKBUF)) ; PAD REMAINDER OF WORK BUF ; -; -; #IFDEF MG014_MAP ; ; ALIGN TO 32 BYTE BOUNDARY @@ -8288,16 +8570,12 @@ MG014_STATMAPHI: ; #ENDIF ; -#IF (DSKYENABLE) -; -;================================================================================================== -; STORAGE -;================================================================================================== -; ; CODES FOR NUMERICS ; HIGH BIT ALWAYS CLEAR TO SUPPRESS DECIMAL POINT ; SET HIGH BIT TO SHOW DECIMAL POINT ; +#IF (DSKYENABLE) +; DSKY_HEXMAP: .DB $3F ; 0 .DB $06 ; 1 @@ -8332,117 +8610,25 @@ SLACK .EQU BNKTOP - $ ; ; #IFDEF MEMINFO - .ECHO "PAGE ZERO @ " - .ECHO HB_PGZERO_BEG - .ECHO ", LENGTH=" - .ECHO HB_PGZERO_END - HB_PGZERO_BEG - .ECHO "\n" -; - .ECHO "HCB @ " - .ECHO HB_HCB_BEG - .ECHO ", LENGTH=" - .ECHO HB_HCB_END - HB_HCB_BEG - .ECHO "\n" -; - .ECHO "PROXY @ " - .ECHO HB_PROXY_BEG - .ECHO ", LENGTH=" - .ECHO HB_PROXY_END - HB_PROXY_BEG - .ECHO "\n" -; - .ECHO "ENTRY @ " - .ECHO HB_ENTRY_BEG - .ECHO ", LENGTH=" - .ECHO HB_ENTRY_END - HB_ENTRY_BEG - .ECHO "\n" -; - .ECHO "INTVEC @ " - .ECHO HB_INTVEC_BEG - .ECHO ", LENGTH=" - .ECHO HB_INTVEC_END - HB_INTVEC_BEG - .ECHO "\n" -; - .ECHO "SYSINIT @ " - .ECHO HB_SYSINIT_BEG - .ECHO ", LENGTH=" - .ECHO HB_SYSINIT_END - HB_SYSINIT_BEG - .ECHO "\n" -; - .ECHO "DISP @ " - .ECHO HB_DISP_BEG - .ECHO ", LENGTH=" - .ECHO HB_DISP_END - HB_DISP_BEG - .ECHO "\n" -; - .ECHO "SYSAPI @ " - .ECHO HB_SYSAPI_BEG - .ECHO ", LENGTH=" - .ECHO HB_SYSAPI_END - HB_SYSAPI_BEG - .ECHO "\n" -; - .ECHO "Z280IVT @ " - .ECHO HB_Z280IVT_BEG - .ECHO ", LENGTH=" - .ECHO HB_Z280IVT_END - HB_Z280IVT_BEG - .ECHO "\n" -; - .ECHO "INTFUNC @ " - .ECHO HB_INTFUNC_BEG - .ECHO ", LENGTH=" - .ECHO HB_INTFUNC_END - HB_INTFUNC_BEG - .ECHO "\n" -; - .ECHO "UTIL @ " - .ECHO HB_UTIL_BEG - .ECHO ", LENGTH=" - .ECHO HB_UTIL_END - HB_UTIL_BEG - .ECHO "\n" -; - .ECHO "PRTSUM @ " - .ECHO HB_PRTSUM_BEG - .ECHO ", LENGTH=" - .ECHO HB_PRTSUM_END - HB_PRTSUM_BEG - .ECHO "\n" -; - .ECHO "DRIVERS @ " - .ECHO HB_DRIVERS_BEG - .ECHO ", LENGTH=" - .ECHO HB_DRIVERS_END - HB_DRIVERS_BEG - .ECHO "\n" -; - .ECHO "FONTS @ " - .ECHO HB_FONTS_BEG - .ECHO ", LENGTH=" - .ECHO HB_FONTS_END - HB_FONTS_BEG - .ECHO "\n" -; - .ECHO "DATA @ " - .ECHO HB_DATA_BEG - .ECHO ", LENGTH=" - .ECHO HB_DATA_END - HB_DATA_BEG - .ECHO "\n" -; -TOTAL .EQU 0 -TOTAL .SET TOTAL + (HB_PGZERO_END - HB_PGZERO_BEG) -TOTAL .SET TOTAL + (HB_HCB_END - HB_HCB_BEG) -TOTAL .SET TOTAL + (HB_PROXY_END - HB_PROXY_BEG) -TOTAL .SET TOTAL + (HB_ENTRY_END - HB_ENTRY_BEG) -TOTAL .SET TOTAL + (HB_INTVEC_END - HB_INTVEC_BEG) -TOTAL .SET TOTAL + (HB_SYSINIT_END - HB_SYSINIT_BEG) -TOTAL .SET TOTAL + (HB_DISP_END - HB_DISP_BEG) -TOTAL .SET TOTAL + (HB_SYSAPI_END - HB_SYSAPI_BEG) -TOTAL .SET TOTAL + (HB_Z280IVT_END - HB_Z280IVT_BEG) -TOTAL .SET TOTAL + (HB_INTFUNC_END - HB_INTFUNC_BEG) -TOTAL .SET TOTAL + (HB_UTIL_END - HB_UTIL_BEG) -TOTAL .SET TOTAL + (HB_PRTSUM_END - HB_PRTSUM_BEG) -TOTAL .SET TOTAL + (HB_DRIVERS_END - HB_DRIVERS_BEG) -TOTAL .SET TOTAL + (HB_FONTS_END - HB_FONTS_BEG) -TOTAL .SET TOTAL + (HB_DATA_END - HB_DATA_BEG) -TOTAL .SET TOTAL + SLACK -; - .ECHO "TOTAL MEMORY USAGE = " - .ECHO TOTAL - .ECHO "\n" + .ECHO "SECTION \tSTART\tLENGTH\n" + .ECHO "-------------- \t-------\t-------\n" + + .ECHO "PAGE ZERO \t" \ .ECHO HB_PGZERO_BEG \ .ECHO "\t" \ .ECHO HB_PGZERO_END - HB_PGZERO_BEG \ .ECHO "\n" + .ECHO "HCB \t" \ .ECHO HB_HCB_BEG \ .ECHO "\t" \ .ECHO HB_HCB_END - HB_HCB_BEG \ .ECHO "\n" + .ECHO "PROXY \t" \ .ECHO HB_PROXY_BEG \ .ECHO "\t" \ .ECHO HB_PROXY_END - HB_PROXY_BEG \ .ECHO "\n" + .ECHO "ENTRY \t" \ .ECHO HB_ENTRY_BEG \ .ECHO "\t" \ .ECHO HB_ENTRY_END - HB_ENTRY_BEG \ .ECHO "\n" + .ECHO "INTVEC \t" \ .ECHO HB_INTVEC_BEG \ .ECHO "\t" \ .ECHO HB_INTVEC_END - HB_INTVEC_BEG \ .ECHO "\n" + .ECHO "SYSINIT \t" \ .ECHO HB_SYSINIT_BEG \ .ECHO "\t" \ .ECHO HB_SYSINIT_END - HB_SYSINIT_BEG \ .ECHO "\n" + .ECHO "DISP \t" \ .ECHO HB_DISP_BEG \ .ECHO "\t" \ .ECHO HB_DISP_END - HB_DISP_BEG \ .ECHO "\n" + .ECHO "SYSAPI \t" \ .ECHO HB_SYSAPI_BEG \ .ECHO "\t" \ .ECHO HB_SYSAPI_END - HB_SYSAPI_BEG \ .ECHO "\n" + .ECHO "Z280IVT \t" \ .ECHO HB_Z280IVT_BEG \ .ECHO "\t" \ .ECHO HB_Z280IVT_END - HB_Z280IVT_BEG \ .ECHO "\n" + .ECHO "INTFUNC \t" \ .ECHO HB_INTFUNC_BEG \ .ECHO "\t" \ .ECHO HB_INTFUNC_END - HB_INTFUNC_BEG \ .ECHO "\n" + .ECHO "UTIL \t" \ .ECHO HB_UTIL_BEG \ .ECHO "\t" \ .ECHO HB_UTIL_END - HB_UTIL_BEG \ .ECHO "\n" + .ECHO "PRTSUM \t" \ .ECHO HB_PRTSUM_BEG \ .ECHO "\t" \ .ECHO HB_PRTSUM_END - HB_PRTSUM_BEG \ .ECHO "\n" + .ECHO "DRIVERS \t" \ .ECHO HB_DRIVERS_BEG \ .ECHO "\t" \ .ECHO HB_DRIVERS_END - HB_DRIVERS_BEG \ .ECHO "\n" + .ECHO "FONTS \t" \ .ECHO HB_FONTS_BEG \ .ECHO "\t" \ .ECHO HB_FONTS_END - HB_FONTS_BEG \ .ECHO "\n" + .ECHO "DATA \t" \ .ECHO HB_DATA_BEG \ .ECHO "\t" \ .ECHO HB_DATA_END - HB_DATA_BEG \ .ECHO "\n" + .ECHO "SLACK \t" \ .ECHO HB_END \ .ECHO "\t" \ .ECHO SLACK \ .ECHO "\n" ; #ENDIF ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 74de2d49..2697541d 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -24,10 +24,8 @@ ; 20. MON Jacques Pelletier's Monsputer ; 21. STDZ180 Genesis Z180 System ; 22. NABU NABU w/ Les Bird's RomWBW Option Board - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; -; INCLUDE VERSION +; INCLUDE BUILD VERSION ; #INCLUDE "../ver.inc" ; ADD BIOSVER ; @@ -1009,17 +1007,6 @@ INT_SIO1 .EQU 14 ; ZILOG SIO 1, CHANNEL A & B #IF (PLATFORM == PLT_MBC) ; -; MBC IM2 PINHEADER INTERRUPTS -; -;INT_IM2PH0 .EQU 0 -;INT_IM2PH1 .EQU 1 -;INT_IM2PH2 .EQU 2 -;INT_IM2PH3 .EQU 3 -;INT_IM2PH4 .EQU 4 -;INT_IM2PH5 .EQU 5 -;INT_IM2PH6 .EQU 6 -;INT_IM2PH7 .EQU 7 -; ; MBC Z80 INTERRUPTS ; ;INT_CTC0A .EQU 0 ; ZILOG CTC 0, CHANNEL A @@ -1044,17 +1031,6 @@ INT_CTC0D .EQU 15 ; ZILOG CTC 0, CHANNEL D #ENDIF #IF (PLATFORM == PLT_DUO) - -; DUO IM2 PINHEADER INTERRUPTS - -;INT_IM2PH0 .EQU 0 -;INT_IM2PH1 .EQU 1 -;INT_IM2PH2 .EQU 2 -;INT_IM2PH3 .EQU 3 -;INT_IM2PH4 .EQU 4 -;INT_IM2PH5 .EQU 5 -;INT_IM2PH6 .EQU 6 -;INT_IM2PH7 .EQU 7 ; ; DUO Z80 IM2 INTERRUPTS ; diff --git a/Source/Images/Common/All/FLASH.COM b/Source/Images/Common/All/FLASH.COM index ab46a910859a232fc15b8da96ab8bb77e98c2ad0..b14d74e37018fefc9a4eaf902ffda5879c776f8a 100644 GIT binary patch delta 4687 zcmaJ^4_H)H+P`;Zm>G0ICQ8P?+`|ZrV-g~vP)y|?&{A+UwX*1s9~h;8Ko5mBVEb&l zeU{c9<%`vTU|@^2!0r|NlOc>lG4ow_>Dgg-efDJJ-Zt}_wy`k&c$x1#_cEe>yB`nF zIq&(s?|J{7_n!04(Pw)Lt%zYwOf}n^>Th>NR-0HB0K3GxQ!D)Ki+YcVO+4De5Y+pY zb*|y8Ajy(=@aWoXmhHp`SsQyCpJ9`tJB4vAH-`-j|Dltcp1?fUm(ht?O%iaEHIK1p z@m|eSoFF7H#TJu}5ua;Df>6e`3pR>{JNnSHUx-0|s&E&&WiIf+TI6@wz6`1mMe&4Cxqu@+Hy{+#Dc-eMBONVMzMW5T0e6Uv-n!VzBC# z2i-nuT9&rm6y}@%(si14G4SjDL2>lgKKu9ouM8Oh`x);FGHMXy4#v97|4>zf@aQ_E zV`k)8Hi27q!{zyx{m*4`!~PAY__)(N(lg;XmMjy)_}u<26J>EU5b$r{`M6`ed1hM* z&!-4{$}v8rgKtYY#ixACr<~?fKH+Unfn^xCOwj`a^pJ_*fzT@sU;0|E3IAJ-t*8U*m;#iQ2gl-uQBW{rR- z9KGQc$$z(`n!kMUD3<^_KoZ^ex)^j4$0(^8<|2t>jMR*9dbEL}ZLS%wi|1dHL7Oaf zL)Vmwq*Sgj4Q6t!~#<{N-^^Nt420|JG-4F%%tX1W@{Odit_J%gO(GMXx zacgzAYZn%$W+{_D z+_i~i+~(54@_cS((bLat&*w@Ci@3rvDp{1jwLJenu<>U<*gARezJ@qtOC52H(;;Z7 z`+VCzKs&jmfPby!7TJ#T87FakgeARnpL(DHRLw}J*A1WGjgi?})mtPGAUUHXYmB6h za$1r)hI;Xyhzpw1&Ey%3&4HT=EYPTfHDy` z{1S3&QfmV07)qjYT3q&Ln0PN{^?Zia6AEKn4w$uU#{sf)l$4ASuP)0P#=cLnHo&ft z5?K|T0(U|SNedn@8-e;AzBtXQ->(`rMa?pSCG`U&MOR6|Phc!FYRQWC-h#9IniTv) zB6-)yCYcmnAq78(P5Ykg_Aa;TN!mr$TnQrIkb+B)&0~wUl)W;$`e9I1M0a)GC&a|hf$`k8fmALvhRLQ8)hqF*U%6IcZ?2V7eKDc|CH?@pQ7HCR^V|^s zqMDy;rg_u@*`5!6LzAIy)T1l(05d-22lU(yTLb?1wx#e24&9a* za}0l1J^C@GvLy9t&%8HD>QAnDZ{o$#NH43_9*d68Sa5KnO3hKE=vz{7Swas@Kv3Us zm0NF{s9W^Z1a8)&`h#MSKM`HZLK)q8M{M{Z=VkvErEng;x`Bj-|jP9V!$jc$!;z-%s+ixAKN3dAeJ9?BVM=^%J}*<<+GI4U+O?q%?`2D?m*X zRkN$p8s$duht<;;^}hftqnGdGo;KZg7+wV>IR=pK<;~Ae>R)kPzgn2$bO|mqU zb$5uBRpmxMpEP8iLmVTdW0*6Nox`ML#2n#9+b7v1b-d?f4ZZPB)<9ina(Z!V4P;D4 z?+J1mvq?^4Uy)G@rJqpgR!Uc^^oNu_qS8kw{T9$wuh+M5goO8kv11N5s zaAW}JcV(nFlB(j0BQBtuWK^YiQb-x*)kvbM?5vpVG~bJK@4%vs(#a^1(snIfSkM|} zp`nZEXq&Ro(M34=6)!ZlJ(Z!~)SJ4nU21%_ZKaxRQrS_c<=MxAg45582^^zJgUB*@voQbw8?2`SsnEiDig6x zoD(`To`*AHAT!l%YEPwXybhh?3z1Ti;R?OWE-83+3B#h%4>r#j`)rAk?l9_X( zD(lobHa}nZlv~Vy1J}(oXCDZG%K?N2X=t(d;X(SGa7J{5I%2lbglV`4;M-YX|9pQp zyb&x@$y=uY)}}yMo|(-q2i@qF3?JH5hE9{lC1~Q zbB341oIPj?q@#}tsvzEtVk5iw;y&oT(jAt9VsR9|kM5khvY9xhl8z~!=qCInnxX4; z14Bj$l=uiI#%Y#lfg&wbYxSQPXs9N^5ALCddr4?D|(P?Rh`3&EIH}s zCgpdL*{w9+sEZdz8~hv2@NqqSUrMKt$^8t4GY(72alw&tLJ)&{;?DA-e^1;=eB5$6 zBiA{&tMOjWZwdzcAb+l0C$u#%`Xt&i&u$iTTKXXC=@K2Fm33c-aoapJrM%tM*e>pd z5ucy8fE~yBc&nzQ87Ifjrc+LQe<->eV1!z3*Mcu z)_4wDmrJbc9PUrxX2Sx+lepW7BS2cN+}m@m1)ib+skj0H5s8Ua&%8$k7I?NO^FnJS zT`uz!D$C`b3T0m5IowL|EYEReUgc5suAaajoLH~1Zl+?no)$%HohL?_H+W7dY95{t z+vqu>;E#AdN>Yf&fZ_V2m85+GeuMkps?%k4@~hK#FyX<(B{ntYuUl!%Fe-Inv5*(^ zq};Gz0d&};jF8eVE{jL-GHW?xvD5mX{Z7)B*fcKnlmE0unD%tdtol}3vLLakxe$w6Gg3|M9L+lqrY-hKY zfZbNu!N`7HYn{P~^r zV54+lI*d_C({ay28aAbd7se=55sXzyy{k)_N$Nkjy(IN}^Q*-1Pf{@oc1Q(u$KPau zH3b@1pdiWlkz@_M^vF~m7@@!?^Rn+Q>#gN@_O5$1+nrdG{2R@xqqrvd1bYatTZCXN zUDR5&y}p_;GK`Zgt7kMo=wd7D86C@L!eW1^5{B6Q^^6e^V{ENTM8`VonJ7S>i2b0R zWf%?XjP0n`Fd*fN?V^Z|Jsyt?GldKL0@1?oA5 zW0--i5g_hom_K*14IER=Fvq&WfdE!Vmk9`9b#~2ASZg#dW(JUf5rI(?-ksskb4Y}NP)KK^47XA;P0dW~&q`^9X}08_2F%*p z{FhvHBMVALcVpWR-8bQvwb?k0EzG`Bzec|;udez%(`>4-ARK+L=e{>cS-X6E@1A>p z=bm%!x#ymH=HS9Tj|doX7SzZUmxg!y&5ah01BOfHic0IlyNiq8k<21qjVLbOBxD)K zdSykH(4MK2InGA5a1PE+KI971Y~DUSKZ=X=e!7>>$U}=dD{O?*6#`nMyO$eF*6Qx( zv%Ps}vE34fq>u+^d!OV+dL4|H;O@jJYotYDl75PgTSV@Of83ZSIs{P~L;e+SO;7Vm z3q6s@VIO^}FAxfZ9E?FO#XlHlVZ?mHI0qv@q~x$K5OOtkmxKa8XSH2rkq-^S(+9;} zse{N#qd+o@lQgY0#>_=m#Z;ZNE=p@J%e1bS)?Sha^@m)b{eOWz*Uat`aCtzLtBA?= z(b|4cbcNO`nj&)2xM0+P%wgZkp0@cbdK`H(<&wZ`Z83Skl&N{P$}~$Oj+(}d?e3mB zX=Tq$S|44(zL)8eEA$Bkf}r}O8i={3xysY|+V! zPAs-N^F(L9=oCcfXwi}4`S)i(Dkvs;zlIn;=na_9qH_DbLL@O zG08CJ8opM=Nu@a}Il7LP_WPsjaNl}q5qZpfyFJ;f1W^^A7Q!YZ?b{)J_3Yurc_;+r zVfthrUD|IcCjU0yVfgC?W|KHlZswB6<0+MS9}~?9X~y%^eU{drqwX(h{dt3t2G8Zu z;Q5Ty9!OL2SxQdkX#z(Jau5WIc94){l7Xb8+9sC}8az{VpoD0FjOQ$yt$Ge`rc0vq ziOVz?S0%)A!x(P_@YoI21QX##S!h}RW~&LPq2%dQ!5LLu!b4E`C0f@*Yk!nJc%DAl zOP5}vPetjn%gnxZXJW8{97!E#P1_Wpb!TbqmolxnLT4$o?jo)IUNRGG$;c>v2crA4 z>Xpf&JJmAh#=BqET*(Sn3h|bl%~rGKuB8y%wUloTgxEds1uGATO| zn}T-=yylAuS8i4hYRS;FWHmKSxLV_E8k+MfyBW@Q6CAn#n>Pd}cUhZg*%?k#Wx(?` z!?{&B#iIuPaYqulD{VYHN-w45XY%Bm#%Mlavb414z{ZWV^hf{3jpUzc*zkyE?c226 zimfUciA1cawC*cfdqKt>F&1_AL;Vwm#%>G_#`snPPTT_TS@p1`93+}AJv+hRxe%VK z=F9o?2Wxq+gG1a?D1kGefHcapLOja3P-ds(-U4CLyW%<}uSOX8@02_mrR$VV zJ{!E%75`y-C#z+jX|=4E)?cD!QAEowBW&6RS7T2`Mnc(EC=C^_SSFK08McOfV2U@n z;+;;>U-*hv{HyJ?mTB7-N-<1#EjD)$(_f1{G>FAri#;}o8Ddz2`r0sqO9w&YwF_4b zU`E&q_cK3N4?rdt=S=qg40|qy3Bv~W^}>KWsETrau8>4B^BYpUD-Is2w=e&szaG?> znVOY*h139kd0VU;7}fx8j)K#?N*S7^lyT20*uv;} z8lBGQMvWfM=(jaGlhKIWrH2ZU#{X?4l ze}BdAZ1(@A8TUczcq&r76LBiMKnXbgHJJPL+obh7VvZ~Y#c#$OsnlrIkyedX9VrAF z;-qamtP}8JHffg{U{ZveR7B4ZJKn2KbZnA=kEoM4Hc7x2*#v5^ zbjM4<$^00c_d3jJ@N$)q1&4K1FBo8$$XoC<24I~R-eh?Hta?_r*~=r|Y0w4BgVzN| zrS{UNuFz#lL#&>=p$)LZr+;AQd_1?~b*R`oU)K&!hK5vj(T-kTFB#TApHUvGozfevKDJ%K4BtMTFdp__>hF7X&NQgmPc%k+ zD)9&qtKMNXN^M)QtU3(U?9qky2c$#m=KHMkRKaD}2=)&M-U5Qu9qlfWhHshg3*N$; zaApgH*XjVfM|FHM;4Ti}_c!?9$>7imQAh+{yUHR>BPVm?#Lq`AjprtisdyvjAQX=n zF$RKJAj(qpYMcnc>x8h#4wXqPwrsOQT-*u$Qn}k+yI5L4T(;|l-5%;rq8*7{?(Ni_ zc(f5_C(!tKt`S)cv^tSiB?X|30O2NEUK|jk$osaL6OO%E$U)}`b&|Ej5Iz~toGD9{ zZ$g*LdUKW2<{03-@lzQx)ovZFO42$5tu?~Y$I;q&Sz7vLC6ki?KtL7Q7LjQ6SpJh@DQGcOpLoCm^@o zY4^IFIbNxMwQZ~@g;(2h$<&;GRP5VvYUTC`eAv?8-wDz4@7n?04tzs0>tbKW*_K116SE(QZ7zB+3ru?Eqw`JvN*SZTS&I$3j7xy-}195cPg+%DOc){Qp?Fo zU7rF!R32F_ec>Tza_5JfSn{Wu%6HMS z^PIn&)aLWo!34w$`C-%@p}Q_lI8eR|dV&b8zX$@`^Ya^|KQn=Xu7m10Mp(h7H+Oxe zPH*Wtt&WqrjBSix)n!-5-*#zwZ;SD7kIknDvzgePT^3brTGz90vH6UyyuYyV?wHuj zu1pobr)yN9O56*8e{>ryI|qJ)`(J6p1#Jjx!#6OH-wWfCwLRa}#`b&{*(Y4bWs+mU zGKk`o(YG7o--6e+oV+$V8yN489yJ~W-9ON+SE#$2wkSu~^a|bj!(wQMX-oIR&)ioa zcHP=02WU+Xo%N%O*RCmaGZsf7sJO{t9ly}y)6<$0(B83b5OPqx$h7YJl~U49pB^y! zs~CCN;Q|$(Id}qw!GXn;h5w%;jenj2h?d^i|Y$}*- zEq|LI~IeaS%Z&1IPWJ6(wN@bAu z3hx1G*w}+QNTK6nM_v!v;{KNXSBZk(Qm(ic*0yFWcJ6A*ACx*|=4Q01Rb27$=VVJiCN(;y9k4(5jj^%};7oO?bvl zX+>NdLVp-{cZ0?X?Z2;;M?6AD_x}!vn-Ds-|1lsM5qf9;G7ak3ze%o+3 diff --git a/Source/RomDsk/ROM_256KB/FLASH.COM b/Source/RomDsk/ROM_256KB/FLASH.COM index ab46a910859a232fc15b8da96ab8bb77e98c2ad0..b14d74e37018fefc9a4eaf902ffda5879c776f8a 100644 GIT binary patch delta 4687 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 diff --git a/Source/RomDsk/ROM_384KB/FAT.COM b/Source/RomDsk/ROM_384KB/FAT.COM index 004760fb940c187beeb0296a99fb945dd4ed60c2..9c6d2f2c092cd2f5162cc0ba42b4aa266ab4d04c 100644 GIT binary patch delta 2404 zcmZ8idr(tX8owt|=jb*jrVE}m;=pv5* ziNFC`EE1=$>5RKR_Exh~*VzJ1XNa2}DUE;Z?r}?<>}U~czy}c{``rW_*MGk6e82B^ ze&6GS%Y$n?`!!xrm>U&I+0B1BYxw)b5QC_=M#>;TVmcC;b1ny^x}mSw-@Ebs(QjF0 zP?9^i3n80%$j(|es}SUNOWF~NW-XyY9z-+Y!${zv7jN{?$9d>^{5Vhi*NAU{-4to_ zMbWrYz8lD2%OBBb9$(GO7DS)5*$_n;*CZLu(KsM0A4t_%*U?uvHk-iNHzx$_ww&O= z&Ow_k#mG>UH8ROc3jRs5|3#GlCJJKi#N|2KbWX`?A!+wX^0bkp{X~+dK=Q2Zj$<-K zK0ZmxACs~tucTkmoF&tttV9j$$0Zs* ztYFJ~C%}d(Q}BcLwxM}8RCyeMJ6pOJp+Do9vhB3DelvA6)FVxtY-ExvtY!;ND))=s zst@zhFQLacw996rS5RY~JNEuMRh0aCrYK8Qa;!vEBdUsujM^fKjz}%4VKwDP5W3IW zDs~``qo;|TOpcl7*#wo07sv^WA3Y?#1CKFj^-yl6j20_%r)r71EvM_)spA*F*^erwBXIqSns*ckdt|=B;x)@JNW_J;2 z5JjzZRwE?iYty~wyO>iBnVrtBho?5r;WM>upenAb^5I&v4I4?pbCSJSQfTINmws6Zi|YJPL9-2=H9MkJpoG zyFv5|rm)euLK5>_#3wO}L~XxyShSi^a4-&R2w%n31{9-H@vNpH3ktFSX{_XdW>!nxPW8{Gnb zf0N~tbQB=G?nx-?W^S)b7v|BiFChud>B3!f+)D`Ek}j0eiOYx#uBEi43qxr6G6cwZ zO}fyBenSh&PT_|T^Vay*7$hrdpfa;ZYwly$blyP?0)5;XJtNRx6|JBtYAj5kR~saO z2aTTBByI-2Xg>YTn%rSl;sFWqMuA>cBBw66AyP zyEcHW>-x;&twEw*ytQd00f%;13OWW!%+nFS9ul)K>W9yFr@2@35a~TMT7glICONOc~C6t|>RtdB}sr=;3}M zy$gLq`#-tdl*>)K+zdGEi?@ckM(*tAMh2^NBZ^gGF{yMTs#W3P@a-hW38}a}WxkJ9 zSOpurhj+Ve@0)3yRbg50F9A5vyI~vLR6ivB&xraF8FGBbh0jR;!&0JlkfBFMPQD$^ zni~79@b!F5vY#Z1h;p7N?B))9p*IpFNUt!cV{n*H3T_*T@-b07vAP)G=IYFHO!oyM zIgaQ{1oE-IAQXi)eYvOv|JWBA=GU_%dvaNoQ!0N-$`*v*5cLCt2_E#ubh62UWBW7E zP2AQm2YaLcZFG~Be6STE4KDmpk2-n=WFTKQunzAV2zH(#oYo(IIgkq{!I^J^eY#1^ z&!P?z^FY`_)IXEzr%-`ZFOVB|lTCiuc1Gy?qMw(>4Ejj&|35Bv-$#EyNQJ*2WWYWi z{5&&NTdb|n_G&-Xvf2^t_u3z|_q6j`cb&g3RJUE1qdTZm=xTL3-8tPCx+^;5Po20d g@n-BpQpyWXEAumbr!S#M4t0nB+RSG|)0f8n2h*ExiU0rr delta 2441 zcmZ8ieN>az8GmmQnBk-J6|3Q6F0VnCAhP1YU>F}ObZLP}obpv#DT>8r+91eR1R^tn zL`ej$U{NGJ?bdy?Q#r4bv$37C$kL8ivNL*y=j`LUayaR+Fu*XWMhMySCZTiw^E~(d zp5OgFANS^sdqnVHL=YPvOeIoo$Mvhjk ztBcKC2ku(jHUWCTPHwA35X+UHLrB3+DkK8f&2P7%aLOv%LRnKOt3a5F@b7kf0&HWV zD-tPiT~;oT|B$srqXm4cpeS5%)#XAIWq&Ty?oi;U!UI5RDEvJd!n=wHtRsu#!0s;I z9Ag}Cx$^7`ML82QouusVr05?+_fJwu97bGSY}W8f&PkI0Z=#;Fll&Q?o(0LPu4&Iy zUe?4Ess4%_fAmcF8O=pf^dF*oNGg{=b5F?^Pr%b7>SBVegj~2w{_6R)rKF z{Hlx(Tzk_5weBt-gSFsbC0Omjw_y;U9o&bI5pS)i0LWDFF_4spQ=#|j!!HJ*diH&- zNeClIc&8DpLYIdhyt5lEunOG?1nz3pUW9&u=Z}An4z_Nijw;0YGPRvi*Ek*HIJ5eN zU5VCsfi-|05?@S^DtF`_)Ul@OBM42i zu9|ElK6HV&$<&x*flaSf31WDGiKB;P({LG6PO)wqWuJ61(+zyW?)pu9e1Z{EQL_-& zmPb7uXGiNB1!x?n>D6G3`nYHyOQMKwl~j76ZdsYEXwuHqHt||EeT8JaiwU7rZa;wr zQFOM+X@_9iNlnB;7jwp=a?=Nz;i?@o`0~jPP?a^+ujfm2+3cijl@xikHXeixxm9AYS>xeLrHnAe{BuKA62yuT;3a^cXeJHr zVd?Wsd8==PBzaXTB*|W4aNj*F4Pz>K7{{F2{tZ4ipctJ=V@;n)L#|rgvBx%WP=l4_`BGfeIb4z@>^Nv|a2eW*X!o^e$;)aSk_Kf&j)t_` z*Fb#e%ng1HCwSt<4*wjOwkR}%zuWc`=<)Nmm)3fGO8|M#L0%5;Y)^xFs@gZNhkDKm zRZbpvGT-jt>#(-J1r-FHePtsE|9C~^zD^oeNP~xNG5Pfmoh<<6;j`)A3{39`uiVNj zUtkQpkj2Cc(H#dssH!8KukbJYO)Ul#MmkbA0X7eq2Q)n@j}oj5EW%-?EwcRc&$OI# z-VWFJUahU^{WO?C=x7f9p(zXH;EN_{XxP^p5%^E0Snb~PkR5KpCZYYOCYeiXkeyle zFCCAnZ6{f2DD!-$k9}RDv@;3*wT+I@UT$&So4a$#Ky|S5Rh#VSta-8UKd&8ML5YKi56LvQ~>7>`r;FC zbz4Mih20R<~iMwt3FCsJ^;K57KQJzZV z^ypSSm0suDdWRUF>H4X7-vBXq?{2-FjCXd|g`XZE$xm*F^^oM{(J*|oJAa+FhbX^9 zqgou&BaMX(kQ1dFh`~iZTui&I?SVJ!A`Oc`Q1>WKc`;Ae&OP?|9rBa>Hj4|s$op(= zgU`RrsrvZ6nk)4AS2@3KP5{ph?0+CH=4l!(+eh2W-R$M}`?(UIOhJHF$mRIrC7dSF zwR*6-&0ZXO(t#VLW7jeUH}MqG|#(KK$swJ^d(oO>#zcfNJ; zXs`b}xt-Lll3Fi({=OnbkBDKJ=pK_wx8wAHO-RZJDY_R)P7qRaPr{PwC*=4txpQC5 zfwbWv>02R&B{JywjNh)1zK2!B;30!cM_S(4&T!gox;F-_vNvP1@BXAT^dbohlu)-qYCYu6f|`@#p578vj%Rxn@nJmy zv6eM0z6W2?l0Oo|gJBLH!JRoZH;yy<_MuO4cV8CRzxKU>K4p_Gr6AObweMPCO5%PM z*zEpYVDZZ z|Njcv(krJCI*Q2v1J*n6VZqDhQnS{4-h9RUOY?8ccg%k?e{Nndd(Gh%sU^jdZz-}I wuvA;xESD@+%f}Y9k!l>0M=%ctl~gFKf({f!&fP$XJh~44+L?jDxf^5u1rr~gBme*a diff --git a/Source/RomDsk/ROM_384KB/FLASH.COM b/Source/RomDsk/ROM_384KB/FLASH.COM index ab46a910859a232fc15b8da96ab8bb77e98c2ad0..b14d74e37018fefc9a4eaf902ffda5879c776f8a 100644 GIT binary patch delta 4687 zcmaJ^4_H)H+P`;Zm>G0ICQ8P?+`|ZrV-g~vP)y|?&{A+UwX*1s9~h;8Ko5mBVEb&l zeU{c9<%`vTU|@^2!0r|NlOc>lG4ow_>Dgg-efDJJ-Zt}_wy`k&c$x1#_cEe>yB`nF zIq&(s?|J{7_n!04(Pw)Lt%zYwOf}n^>Th>NR-0HB0K3GxQ!D)Ki+YcVO+4De5Y+pY zb*|y8Ajy(=@aWoXmhHp`SsQyCpJ9`tJB4vAH-`-j|Dltcp1?fUm(ht?O%iaEHIK1p z@m|eSoFF7H#TJu}5ua;Df>6e`3pR>{JNnSHUx-0|s&E&&WiIf+TI6@wz6`1mMe&4Cxqu@+Hy{+#Dc-eMBONVMzMW5T0e6Uv-n!VzBC# z2i-nuT9&rm6y}@%(si14G4SjDL2>lgKKu9ouM8Oh`x);FGHMXy4#v97|4>zf@aQ_E zV`k)8Hi27q!{zyx{m*4`!~PAY__)(N(lg;XmMjy)_}u<26J>EU5b$r{`M6`ed1hM* z&!-4{$}v8rgKtYY#ixACr<~?fKH+Unfn^xCOwj`a^pJ_*fzT@sU;0|E3IAJ-t*8U*m;#iQ2gl-uQBW{rR- z9KGQc$$z(`n!kMUD3<^_KoZ^ex)^j4$0(^8<|2t>jMR*9dbEL}ZLS%wi|1dHL7Oaf zL)Vmwq*Sgj4Q6t!~#<{N-^^Nt420|JG-4F%%tX1W@{Odit_J%gO(GMXx zacgzAYZn%$W+{_D z+_i~i+~(54@_cS((bLat&*w@Ci@3rvDp{1jwLJenu<>U<*gARezJ@qtOC52H(;;Z7 z`+VCzKs&jmfPby!7TJ#T87FakgeARnpL(DHRLw}J*A1WGjgi?})mtPGAUUHXYmB6h za$1r)hI;Xyhzpw1&Ey%3&4HT=EYPTfHDy` z{1S3&QfmV07)qjYT3q&Ln0PN{^?Zia6AEKn4w$uU#{sf)l$4ASuP)0P#=cLnHo&ft z5?K|T0(U|SNedn@8-e;AzBtXQ->(`rMa?pSCG`U&MOR6|Phc!FYRQWC-h#9IniTv) zB6-)yCYcmnAq78(P5Ykg_Aa;TN!mr$TnQrIkb+B)&0~wUl)W;$`e9I1M0a)GC&a|hf$`k8fmALvhRLQ8)hqF*U%6IcZ?2V7eKDc|CH?@pQ7HCR^V|^s zqMDy;rg_u@*`5!6LzAIy)T1l(05d-22lU(yTLb?1wx#e24&9a* za}0l1J^C@GvLy9t&%8HD>QAnDZ{o$#NH43_9*d68Sa5KnO3hKE=vz{7Swas@Kv3Us zm0NF{s9W^Z1a8)&`h#MSKM`HZLK)q8M{M{Z=VkvErEng;x`Bj-|jP9V!$jc$!;z-%s+ixAKN3dAeJ9?BVM=^%J}*<<+GI4U+O?q%?`2D?m*X zRkN$p8s$duht<;;^}hftqnGdGo;KZg7+wV>IR=pK<;~Ae>R)kPzgn2$bO|mqU zb$5uBRpmxMpEP8iLmVTdW0*6Nox`ML#2n#9+b7v1b-d?f4ZZPB)<9ina(Z!V4P;D4 z?+J1mvq?^4Uy)G@rJqpgR!Uc^^oNu_qS8kw{T9$wuh+M5goO8kv11N5s zaAW}JcV(nFlB(j0BQBtuWK^YiQb-x*)kvbM?5vpVG~bJK@4%vs(#a^1(snIfSkM|} zp`nZEXq&Ro(M34=6)!ZlJ(Z!~)SJ4nU21%_ZKaxRQrS_c<=MxAg45582^^zJgUB*@voQbw8?2`SsnEiDig6x zoD(`To`*AHAT!l%YEPwXybhh?3z1Ti;R?OWE-83+3B#h%4>r#j`)rAk?l9_X( zD(lobHa}nZlv~Vy1J}(oXCDZG%K?N2X=t(d;X(SGa7J{5I%2lbglV`4;M-YX|9pQp zyb&x@$y=uY)}}yMo|(-q2i@qF3?JH5hE9{lC1~Q zbB341oIPj?q@#}tsvzEtVk5iw;y&oT(jAt9VsR9|kM5khvY9xhl8z~!=qCInnxX4; z14Bj$l=uiI#%Y#lfg&wbYxSQPXs9N^5ALCddr4?D|(P?Rh`3&EIH}s zCgpdL*{w9+sEZdz8~hv2@NqqSUrMKt$^8t4GY(72alw&tLJ)&{;?DA-e^1;=eB5$6 zBiA{&tMOjWZwdzcAb+l0C$u#%`Xt&i&u$iTTKXXC=@K2Fm33c-aoapJrM%tM*e>pd z5ucy8fE~yBc&nzQ87Ifjrc+LQe<->eV1!z3*Mcu z)_4wDmrJbc9PUrxX2Sx+lepW7BS2cN+}m@m1)ib+skj0H5s8Ua&%8$k7I?NO^FnJS zT`uz!D$C`b3T0m5IowL|EYEReUgc5suAaajoLH~1Zl+?no)$%HohL?_H+W7dY95{t z+vqu>;E#AdN>Yf&fZ_V2m85+GeuMkps?%k4@~hK#FyX<(B{ntYuUl!%Fe-Inv5*(^ zq};Gz0d&};jF8eVE{jL-GHW?xvD5mX{Z7)B*fcKnlmE0unD%tdtol}3vLLakxe$w6Gg3|M9L+lqrY-hKY zfZbNu!N`7HYn{P~^r zV54+lI*d_C({ay28aAbd7se=55sXzyy{k)_N$Nkjy(IN}^Q*-1Pf{@oc1Q(u$KPau zH3b@1pdiWlkz@_M^vF~m7@@!?^Rn+Q>#gN@_O5$1+nrdG{2R@xqqrvd1bYatTZCXN zUDR5&y}p_;GK`Zgt7kMo=wd7D86C@L!eW1^5{B6Q^^6e^V{ENTM8`VonJ7S>i2b0R zWf%?XjP0n`Fd*fN?V^Z|Jsyt?GldKL0@1?oA5 zW0--i5g_hom_K*14IER=Fvq&WfdE!Vmk9`9b#~2ASZg#dW(JUf5rI(?-ksskb4Y}NP)KK^47XA;P0dW~&q`^9X}08_2F%*p z{FhvHBMVALcVpWR-8bQvwb?k0EzG`Bzec|;udez%(`>4-ARK+L=e{>cS-X6E@1A>p z=bm%!x#ymH=HS9Tj|doX7SzZUmxg!y&5ah01BOfHic0IlyNiq8k<21qjVLbOBxD)K zdSykH(4MK2InGA5a1PE+KI971Y~DUSKZ=X=e!7>>$U}=dD{O?*6#`nMyO$eF*6Qx( zv%Ps}vE34fq>u+^d!OV+dL4|H;O@jJYotYDl75PgTSV@Of83ZSIs{P~L;e+SO;7Vm z3q6s@VIO^}FAxfZ9E?FO#XlHlVZ?mHI0qv@q~x$K5OOtkmxKa8XSH2rkq-^S(+9;} zse{N#qd+o@lQgY0#>_=m#Z;ZNE=p@J%e1bS)?Sha^@m)b{eOWz*Uat`aCtzLtBA?= z(b|4cbcNO`nj&)2xM0+P%wgZkp0@cbdK`H(<&wZ`Z83Skl&N{P$}~$Oj+(}d?e3mB zX=Tq$S|44(zL)8eEA$Bkf}r}O8i={3xysY|+V! zPAs-N^F(L9=oCcfXwi}4`S)i(Dkvs;zlIn;=na_9qH_DbLL@O zG08CJ8opM=Nu@a}Il7LP_WPsjaNl}q5qZpfyFJ;f1W^^A7Q!YZ?b{)J_3Yurc_;+r zVfthrUD|IcCjU0yVfgC?W|KHlZswB6<0+MS9}~?9X~y%^eU{drqwX(h{dt3t2G8Zu z;Q5Ty9!OL2SxQdkX#z(Jau5WIc94){l7Xb8+9sC}8az{VpoD0FjOQ$yt$Ge`rc0vq ziOVz?S0%)A!x(P_@YoI21QX##S!h}RW~&LPq2%dQ!5LLu!b4E`C0f@*Yk!nJc%DAl zOP5}vPetjn%gnxZXJW8{97!E#P1_Wpb!TbqmolxnLT4$o?jo)IUNRGG$;c>v2crA4 z>Xpf&JJmAh#=BqET*(Sn3h|bl%~rGKuB8y%wUloTgxEds1uGATO| zn}T-=yylAuS8i4hYRS;FWHmKSxLV_E8k+MfyBW@Q6CAn#n>Pd}cUhZg*%?k#Wx(?` z!?{&B#iIuPaYqulD{VYHN-w45XY%Bm#%Mlavb414z{ZWV^hf{3jpUzc*zkyE?c226 zimfUciA1cawC*cfdqKt>F&1_AL;Vwm#%>G_#`snPPTT_TS@p1`93+}AJv+hRxe%VK z=F9o?2Wxq+gG1a?D1kGefHcapLOja3P-ds(-U4CLyW%<}uSOX8@02_mrR$VV zJ{!E%75`y-C#z+jX|=4E)?cD!QAEowBW&6RS7T2`Mnc(EC=C^_SSFK08McOfV2U@n z;+;;>U-*hv{HyJ?mTB7-N-<1#EjD)$(_f1{G>FAri#;}o8Ddz2`r0sqO9w&YwF_4b zU`E&q_cK3N4?rdt=S=qg40|qy3Bv~W^}>KWsETrau8>4B^BYpUD-Is2w=e&szaG?> znVOY*h139kd0VU;7}fx8j)K#?N*S7^lyT20*uv;} z8lBGQMvWfM=(jaGlhKIWrH2ZU#{X?4l ze}BdAZ1(@A8TUczcq&r76LBiMKnXbgHJJPL+obh7VvZ~Y#c#$OsnlrIkyedX9VrAF z;-qamtP}8JHffg{U{ZveR7B4ZJKn2KbZnA=kEoM4Hc7x2*#v5^ zbjM4<$^00c_d3jJ@N$)q1&4K1FBo8$$XoC<24I~R-eh?Hta?_r*~=r|Y0w4BgVzN| zrS{UNuFz#lL#&>=p$)LZr+;AQd_1?~b*R`oU)K&!hK5vj(T-kTFB#TApHUvGozfevKDJ%K4BtMTFdp__>hF7X&NQgmPc%k+ zD)9&qtKMNXN^M)QtU3(U?9qky2c$#m=KHMkRKaD}2=)&M-U5Qu9qlfWhHshg3*N$; zaApgH*XjVfM|FHM;4Ti}_c!?9$>7imQAh+{yUHR>BPVm?#Lq`AjprtisdyvjAQX=n zF$RKJAj(qpYMcnc>x8h#4wXqPwrsOQT-*u$Qn}k+yI5L4T(;|l-5%;rq8*7{?(Ni_ zc(f5_C(!tKt`S)cv^tSiB?X|30O2NEUK|jk$osaL6OO%E$U)}`b&|Ej5Iz~toGD9{ zZ$g*LdUKW2<{03-@lzQx)ovZFO42$5tu?~Y$I;q&Sz7vLC6ki?KtL7Q7LjQ6SpJh@DQGcOpLoCm^@o zY4^IFIbNxMwQZ~@g;(2h$<&;GRP5VvYUTC`eAv?8-wDz4@7n?04tzs0>tbKW*_K116SE(QZ7zB+3ru?Eqw`JvN*SZTS&I$3j7xy-}195cPg+%DOc){Qp?Fo zU7rF!R32F_ec>Tza_5JfSn{Wu%6HMS z^PIn&)aLWo!34w$`C-%@p}Q_lI8eR|dV&b8zX$@`^Ya^|KQn=Xu7m10Mp(h7H+Oxe zPH*Wtt&WqrjBSix)n!-5-*#zwZ;SD7kIknDvzgePT^3brTGz90vH6UyyuYyV?wHuj zu1pobr)yN9O56*8e{>ryI|qJ)`(J6p1#Jjx!#6OH-wWfCwLRa}#`b&{*(Y4bWs+mU zGKk`o(YG7o--6e+oV+$V8yN489yJ~W-9ON+SE#$2wkSu~^a|bj!(wQMX-oIR&)ioa zcHP=02WU+Xo%N%O*RCmaGZsf7sJO{t9ly}y)6<$0(B83b5OPqx$h7YJl~U49pB^y! zs~CCN;Q|$(Id}qw!GXn;h5w%;jenj2h?d^i|Y$}*- zEq|LI~IeaS%Z&1IPWJ6(wN@bAu z3hx1G*w}+QNTK6nM_v!v;{KNXSBZk(Qm(ic*0yFWcJ6A*ACx*|=4Q01Rb27$=VVJiCN(;y9k4(5jj^%};7oO?bvl zX+>NdLVp-{cZ0?X?Z2;;M?6AD_x}!vn-Ds-|1lsM5qf9;G7ak3ze%o+3 diff --git a/Source/RomDsk/ROM_896KB/FAT.COM b/Source/RomDsk/ROM_896KB/FAT.COM index 004760fb940c187beeb0296a99fb945dd4ed60c2..9c6d2f2c092cd2f5162cc0ba42b4aa266ab4d04c 100644 GIT binary patch delta 2404 zcmZ8idr(tX8owt|=jb*jrVE}m;=pv5* ziNFC`EE1=$>5RKR_Exh~*VzJ1XNa2}DUE;Z?r}?<>}U~czy}c{``rW_*MGk6e82B^ ze&6GS%Y$n?`!!xrm>U&I+0B1BYxw)b5QC_=M#>;TVmcC;b1ny^x}mSw-@Ebs(QjF0 zP?9^i3n80%$j(|es}SUNOWF~NW-XyY9z-+Y!${zv7jN{?$9d>^{5Vhi*NAU{-4to_ zMbWrYz8lD2%OBBb9$(GO7DS)5*$_n;*CZLu(KsM0A4t_%*U?uvHk-iNHzx$_ww&O= z&Ow_k#mG>UH8ROc3jRs5|3#GlCJJKi#N|2KbWX`?A!+wX^0bkp{X~+dK=Q2Zj$<-K zK0ZmxACs~tucTkmoF&tttV9j$$0Zs* ztYFJ~C%}d(Q}BcLwxM}8RCyeMJ6pOJp+Do9vhB3DelvA6)FVxtY-ExvtY!;ND))=s zst@zhFQLacw996rS5RY~JNEuMRh0aCrYK8Qa;!vEBdUsujM^fKjz}%4VKwDP5W3IW zDs~``qo;|TOpcl7*#wo07sv^WA3Y?#1CKFj^-yl6j20_%r)r71EvM_)spA*F*^erwBXIqSns*ckdt|=B;x)@JNW_J;2 z5JjzZRwE?iYty~wyO>iBnVrtBho?5r;WM>upenAb^5I&v4I4?pbCSJSQfTINmws6Zi|YJPL9-2=H9MkJpoG zyFv5|rm)euLK5>_#3wO}L~XxyShSi^a4-&R2w%n31{9-H@vNpH3ktFSX{_XdW>!nxPW8{Gnb zf0N~tbQB=G?nx-?W^S)b7v|BiFChud>B3!f+)D`Ek}j0eiOYx#uBEi43qxr6G6cwZ zO}fyBenSh&PT_|T^Vay*7$hrdpfa;ZYwly$blyP?0)5;XJtNRx6|JBtYAj5kR~saO z2aTTBByI-2Xg>YTn%rSl;sFWqMuA>cBBw66AyP zyEcHW>-x;&twEw*ytQd00f%;13OWW!%+nFS9ul)K>W9yFr@2@35a~TMT7glICONOc~C6t|>RtdB}sr=;3}M zy$gLq`#-tdl*>)K+zdGEi?@ckM(*tAMh2^NBZ^gGF{yMTs#W3P@a-hW38}a}WxkJ9 zSOpurhj+Ve@0)3yRbg50F9A5vyI~vLR6ivB&xraF8FGBbh0jR;!&0JlkfBFMPQD$^ zni~79@b!F5vY#Z1h;p7N?B))9p*IpFNUt!cV{n*H3T_*T@-b07vAP)G=IYFHO!oyM zIgaQ{1oE-IAQXi)eYvOv|JWBA=GU_%dvaNoQ!0N-$`*v*5cLCt2_E#ubh62UWBW7E zP2AQm2YaLcZFG~Be6STE4KDmpk2-n=WFTKQunzAV2zH(#oYo(IIgkq{!I^J^eY#1^ z&!P?z^FY`_)IXEzr%-`ZFOVB|lTCiuc1Gy?qMw(>4Ejj&|35Bv-$#EyNQJ*2WWYWi z{5&&NTdb|n_G&-Xvf2^t_u3z|_q6j`cb&g3RJUE1qdTZm=xTL3-8tPCx+^;5Po20d g@n-BpQpyWXEAumbr!S#M4t0nB+RSG|)0f8n2h*ExiU0rr delta 2441 zcmZ8ieN>az8GmmQnBk-J6|3Q6F0VnCAhP1YU>F}ObZLP}obpv#DT>8r+91eR1R^tn zL`ej$U{NGJ?bdy?Q#r4bv$37C$kL8ivNL*y=j`LUayaR+Fu*XWMhMySCZTiw^E~(d zp5OgFANS^sdqnVHL=YPvOeIoo$Mvhjk ztBcKC2ku(jHUWCTPHwA35X+UHLrB3+DkK8f&2P7%aLOv%LRnKOt3a5F@b7kf0&HWV zD-tPiT~;oT|B$srqXm4cpeS5%)#XAIWq&Ty?oi;U!UI5RDEvJd!n=wHtRsu#!0s;I z9Ag}Cx$^7`ML82QouusVr05?+_fJwu97bGSY}W8f&PkI0Z=#;Fll&Q?o(0LPu4&Iy zUe?4Ess4%_fAmcF8O=pf^dF*oNGg{=b5F?^Pr%b7>SBVegj~2w{_6R)rKF z{Hlx(Tzk_5weBt-gSFsbC0Omjw_y;U9o&bI5pS)i0LWDFF_4spQ=#|j!!HJ*diH&- zNeClIc&8DpLYIdhyt5lEunOG?1nz3pUW9&u=Z}An4z_Nijw;0YGPRvi*Ek*HIJ5eN zU5VCsfi-|05?@S^DtF`_)Ul@OBM42i zu9|ElK6HV&$<&x*flaSf31WDGiKB;P({LG6PO)wqWuJ61(+zyW?)pu9e1Z{EQL_-& zmPb7uXGiNB1!x?n>D6G3`nYHyOQMKwl~j76ZdsYEXwuHqHt||EeT8JaiwU7rZa;wr zQFOM+X@_9iNlnB;7jwp=a?=Nz;i?@o`0~jPP?a^+ujfm2+3cijl@xikHXeixxm9AYS>xeLrHnAe{BuKA62yuT;3a^cXeJHr zVd?Wsd8==PBzaXTB*|W4aNj*F4Pz>K7{{F2{tZ4ipctJ=V@;n)L#|rgvBx%WP=l4_`BGfeIb4z@>^Nv|a2eW*X!o^e$;)aSk_Kf&j)t_` z*Fb#e%ng1HCwSt<4*wjOwkR}%zuWc`=<)Nmm)3fGO8|M#L0%5;Y)^xFs@gZNhkDKm zRZbpvGT-jt>#(-J1r-FHePtsE|9C~^zD^oeNP~xNG5Pfmoh<<6;j`)A3{39`uiVNj zUtkQpkj2Cc(H#dssH!8KukbJYO)Ul#MmkbA0X7eq2Q)n@j}oj5EW%-?EwcRc&$OI# z-VWFJUahU^{WO?C=x7f9p(zXH;EN_{XxP^p5%^E0Snb~PkR5KpCZYYOCYeiXkeyle zFCCAnZ6{f2DD!-$k9}RDv@;3*wT+I@UT$&So4a$#Ky|S5Rh#VSta-8UKd&8ML5YKi56LvQ~>7>`r;FC zbz4Mih20R<~iMwt3FCsJ^;K57KQJzZV z^ypSSm0suDdWRUF>H4X7-vBXq?{2-FjCXd|g`XZE$xm*F^^oM{(J*|oJAa+FhbX^9 zqgou&BaMX(kQ1dFh`~iZTui&I?SVJ!A`Oc`Q1>WKc`;Ae&OP?|9rBa>Hj4|s$op(= zgU`RrsrvZ6nk)4AS2@3KP5{ph?0+CH=4l!(+eh2W-R$M}`?(UIOhJHF$mRIrC7dSF zwR*6-&0ZXO(t#VLW7jeUH}MqG|#(KK$swJ^d(oO>#zcfNJ; zXs`b}xt-Lll3Fi({=OnbkBDKJ=pK_wx8wAHO-RZJDY_R)P7qRaPr{PwC*=4txpQC5 zfwbWv>02R&B{JywjNh)1zK2!B;30!cM_S(4&T!gox;F-_vNvP1@BXAT^dbohlu)-qYCYu6f|`@#p578vj%Rxn@nJmy zv6eM0z6W2?l0Oo|gJBLH!JRoZH;yy<_MuO4cV8CRzxKU>K4p_Gr6AObweMPCO5%PM z*zEpYVDZZ z|Njcv(krJCI*Q2v1J*n6VZqDhQnS{4-h9RUOY?8ccg%k?e{Nndd(Gh%sU^jdZz-}I wuvA;xESD@+%f}Y9k!l>0M=%ctl~gFKf({f!&fP$XJh~44+L?jDxf^5u1rr~gBme*a diff --git a/Source/RomDsk/ROM_896KB/FLASH.COM b/Source/RomDsk/ROM_896KB/FLASH.COM index ab46a910859a232fc15b8da96ab8bb77e98c2ad0..b14d74e37018fefc9a4eaf902ffda5879c776f8a 100644 GIT binary patch delta 4687 zcmaJ^4_H)H+P`;Zm>G0ICQ8P?+`|ZrV-g~vP)y|?&{A+UwX*1s9~h;8Ko5mBVEb&l zeU{c9<%`vTU|@^2!0r|NlOc>lG4ow_>Dgg-efDJJ-Zt}_wy`k&c$x1#_cEe>yB`nF zIq&(s?|J{7_n!04(Pw)Lt%zYwOf}n^>Th>NR-0HB0K3GxQ!D)Ki+YcVO+4De5Y+pY zb*|y8Ajy(=@aWoXmhHp`SsQyCpJ9`tJB4vAH-`-j|Dltcp1?fUm(ht?O%iaEHIK1p z@m|eSoFF7H#TJu}5ua;Df>6e`3pR>{JNnSHUx-0|s&E&&WiIf+TI6@wz6`1mMe&4Cxqu@+Hy{+#Dc-eMBONVMzMW5T0e6Uv-n!VzBC# z2i-nuT9&rm6y}@%(si14G4SjDL2>lgKKu9ouM8Oh`x);FGHMXy4#v97|4>zf@aQ_E zV`k)8Hi27q!{zyx{m*4`!~PAY__)(N(lg;XmMjy)_}u<26J>EU5b$r{`M6`ed1hM* z&!-4{$}v8rgKtYY#ixACr<~?fKH+Unfn^xCOwj`a^pJ_*fzT@sU;0|E3IAJ-t*8U*m;#iQ2gl-uQBW{rR- z9KGQc$$z(`n!kMUD3<^_KoZ^ex)^j4$0(^8<|2t>jMR*9dbEL}ZLS%wi|1dHL7Oaf zL)Vmwq*Sgj4Q6t!~#<{N-^^Nt420|JG-4F%%tX1W@{Odit_J%gO(GMXx zacgzAYZn%$W+{_D z+_i~i+~(54@_cS((bLat&*w@Ci@3rvDp{1jwLJenu<>U<*gARezJ@qtOC52H(;;Z7 z`+VCzKs&jmfPby!7TJ#T87FakgeARnpL(DHRLw}J*A1WGjgi?})mtPGAUUHXYmB6h za$1r)hI;Xyhzpw1&Ey%3&4HT=EYPTfHDy` z{1S3&QfmV07)qjYT3q&Ln0PN{^?Zia6AEKn4w$uU#{sf)l$4ASuP)0P#=cLnHo&ft z5?K|T0(U|SNedn@8-e;AzBtXQ->(`rMa?pSCG`U&MOR6|Phc!FYRQWC-h#9IniTv) zB6-)yCYcmnAq78(P5Ykg_Aa;TN!mr$TnQrIkb+B)&0~wUl)W;$`e9I1M0a)GC&a|hf$`k8fmALvhRLQ8)hqF*U%6IcZ?2V7eKDc|CH?@pQ7HCR^V|^s zqMDy;rg_u@*`5!6LzAIy)T1l(05d-22lU(yTLb?1wx#e24&9a* za}0l1J^C@GvLy9t&%8HD>QAnDZ{o$#NH43_9*d68Sa5KnO3hKE=vz{7Swas@Kv3Us zm0NF{s9W^Z1a8)&`h#MSKM`HZLK)q8M{M{Z=VkvErEng;x`Bj-|jP9V!$jc$!;z-%s+ixAKN3dAeJ9?BVM=^%J}*<<+GI4U+O?q%?`2D?m*X zRkN$p8s$duht<;;^}hftqnGdGo;KZg7+wV>IR=pK<;~Ae>R)kPzgn2$bO|mqU zb$5uBRpmxMpEP8iLmVTdW0*6Nox`ML#2n#9+b7v1b-d?f4ZZPB)<9ina(Z!V4P;D4 z?+J1mvq?^4Uy)G@rJqpgR!Uc^^oNu_qS8kw{T9$wuh+M5goO8kv11N5s zaAW}JcV(nFlB(j0BQBtuWK^YiQb-x*)kvbM?5vpVG~bJK@4%vs(#a^1(snIfSkM|} zp`nZEXq&Ro(M34=6)!ZlJ(Z!~)SJ4nU21%_ZKaxRQrS_c<=MxAg45582^^zJgUB*@voQbw8?2`SsnEiDig6x zoD(`To`*AHAT!l%YEPwXybhh?3z1Ti;R?OWE-83+3B#h%4>r#j`)rAk?l9_X( zD(lobHa}nZlv~Vy1J}(oXCDZG%K?N2X=t(d;X(SGa7J{5I%2lbglV`4;M-YX|9pQp zyb&x@$y=uY)}}yMo|(-q2i@qF3?JH5hE9{lC1~Q zbB341oIPj?q@#}tsvzEtVk5iw;y&oT(jAt9VsR9|kM5khvY9xhl8z~!=qCInnxX4; z14Bj$l=uiI#%Y#lfg&wbYxSQPXs9N^5ALCddr4?D|(P?Rh`3&EIH}s zCgpdL*{w9+sEZdz8~hv2@NqqSUrMKt$^8t4GY(72alw&tLJ)&{;?DA-e^1;=eB5$6 zBiA{&tMOjWZwdzcAb+l0C$u#%`Xt&i&u$iTTKXXC=@K2Fm33c-aoapJrM%tM*e>pd z5ucy8fE~yBc&nzQ87Ifjrc+LQe<->eV1!z3*Mcu z)_4wDmrJbc9PUrxX2Sx+lepW7BS2cN+}m@m1)ib+skj0H5s8Ua&%8$k7I?NO^FnJS zT`uz!D$C`b3T0m5IowL|EYEReUgc5suAaajoLH~1Zl+?no)$%HohL?_H+W7dY95{t z+vqu>;E#AdN>Yf&fZ_V2m85+GeuMkps?%k4@~hK#FyX<(B{ntYuUl!%Fe-Inv5*(^ zq};Gz0d&};jF8eVE{jL-GHW?xvD5mX{Z7)B*fcKnlmE0unD%tdtol}3vLLakxe$w6Gg3|M9L+lqrY-hKY zfZbNu!N`7HYn{P~^r zV54+lI*d_C({ay28aAbd7se=55sXzyy{k)_N$Nkjy(IN}^Q*-1Pf{@oc1Q(u$KPau zH3b@1pdiWlkz@_M^vF~m7@@!?^Rn+Q>#gN@_O5$1+nrdG{2R@xqqrvd1bYatTZCXN zUDR5&y}p_;GK`Zgt7kMo=wd7D86C@L!eW1^5{B6Q^^6e^V{ENTM8`VonJ7S>i2b0R zWf%?XjP0n`Fd*fN?V^Z|Jsyt?GldKL0@1?oA5 zW0--i5g_hom_K*14IER=Fvq&WfdE!Vmk9`9b#~2ASZg#dW(JUf5rI(?-ksskb4Y}NP)KK^47XA;P0dW~&q`^9X}08_2F%*p z{FhvHBMVALcVpWR-8bQvwb?k0EzG`Bzec|;udez%(`>4-ARK+L=e{>cS-X6E@1A>p z=bm%!x#ymH=HS9Tj|doX7SzZUmxg!y&5ah01BOfHic0IlyNiq8k<21qjVLbOBxD)K zdSykH(4MK2InGA5a1PE+KI971Y~DUSKZ=X=e!7>>$U}=dD{O?*6#`nMyO$eF*6Qx( zv%Ps}vE34fq>u+^d!OV+dL4|H;O@jJYotYDl75PgTSV@Of83ZSIs{P~L;e+SO;7Vm z3q6s@VIO^}FAxfZ9E?FO#XlHlVZ?mHI0qv@q~x$K5OOtkmxKa8XSH2rkq-^S(+9;} zse{N#qd+o@lQgY0#>_=m#Z;ZNE=p@J%e1bS)?Sha^@m)b{eOWz*Uat`aCtzLtBA?= z(b|4cbcNO`nj&)2xM0+P%wgZkp0@cbdK`H(<&wZ`Z83Skl&N{P$}~$Oj+(}d?e3mB zX=Tq$S|44(zL)8eEA$Bkf}r}O8i={3xysY|+V! zPAs-N^F(L9=oCcfXwi}4`S)i(Dkvs;zlIn;=na_9qH_DbLL@O zG08CJ8opM=Nu@a}Il7LP_WPsjaNl}q5qZpfyFJ;f1W^^A7Q!YZ?b{)J_3Yurc_;+r zVfthrUD|IcCjU0yVfgC?W|KHlZswB6<0+MS9}~?9X~y%^eU{drqwX(h{dt3t2G8Zu z;Q5Ty9!OL2SxQdkX#z(Jau5WIc94){l7Xb8+9sC}8az{VpoD0FjOQ$yt$Ge`rc0vq ziOVz?S0%)A!x(P_@YoI21QX##S!h}RW~&LPq2%dQ!5LLu!b4E`C0f@*Yk!nJc%DAl zOP5}vPetjn%gnxZXJW8{97!E#P1_Wpb!TbqmolxnLT4$o?jo)IUNRGG$;c>v2crA4 z>Xpf&JJmAh#=BqET*(Sn3h|bl%~rGKuB8y%wUloTgxEds1uGATO| zn}T-=yylAuS8i4hYRS;FWHmKSxLV_E8k+MfyBW@Q6CAn#n>Pd}cUhZg*%?k#Wx(?` z!?{&B#iIuPaYqulD{VYHN-w45XY%Bm#%Mlavb414z{ZWV^hf{3jpUzc*zkyE?c226 zimfUciA1cawC*cfdqKt>F&1_AL;Vwm#%>G_#`snPPTT_TS@p1`93+}AJv+hRxe%VK z=F9o?2Wxq+gG1a?D1kGefHcapLOja3P-ds(-U4CLyW%<}uSOX8@02_mrR$VV zJ{!E%75`y-C#z+jX|=4E)?cD!QAEowBW&6RS7T2`Mnc(EC=C^_SSFK08McOfV2U@n z;+;;>U-*hv{HyJ?mTB7-N-<1#EjD)$(_f1{G>FAri#;}o8Ddz2`r0sqO9w&YwF_4b zU`E&q_cK3N4?rdt=S=qg40|qy3Bv~W^}>KWsETrau8>4B^BYpUD-Is2w=e&szaG?> znVOY*h139kd0VU;7}fx8j)K#?N*S7^lyT20*uv;} z8lBGQMvWfM=(jaGlhKIWrH2ZU#{X?4l ze}BdAZ1(@A8TUczcq&r76LBiMKnXbgHJJPL+obh7VvZ~Y#c#$OsnlrIkyedX9VrAF z;-qamtP}8JHffg{U{ZveR7B4ZJKn2KbZnA=kEoM4Hc7x2*#v5^ zbjM4<$^00c_d3jJ@N$)q1&4K1FBo8$$XoC<24I~R-eh?Hta?_r*~=r|Y0w4BgVzN| zrS{UNuFz#lL#&>=p$)LZr+;AQd_1?~b*R`oU)K&!hK5vj(T-kTFB#TApHUvGozfevKDJ%K4BtMTFdp__>hF7X&NQgmPc%k+ zD)9&qtKMNXN^M)QtU3(U?9qky2c$#m=KHMkRKaD}2=)&M-U5Qu9qlfWhHshg3*N$; zaApgH*XjVfM|FHM;4Ti}_c!?9$>7imQAh+{yUHR>BPVm?#Lq`AjprtisdyvjAQX=n zF$RKJAj(qpYMcnc>x8h#4wXqPwrsOQT-*u$Qn}k+yI5L4T(;|l-5%;rq8*7{?(Ni_ zc(f5_C(!tKt`S)cv^tSiB?X|30O2NEUK|jk$osaL6OO%E$U)}`b&|Ej5Iz~toGD9{ zZ$g*LdUKW2<{03-@lzQx)ovZFO42$5tu?~Y$I;q&Sz7vLC6ki?KtL7Q7LjQ6SpJh@DQGcOpLoCm^@o zY4^IFIbNxMwQZ~@g;(2h$<&;GRP5VvYUTC`eAv?8-wDz4@7n?04tzs0>tbKW*_K116SE(QZ7zB+3ru?Eqw`JvN*SZTS&I$3j7xy-}195cPg+%DOc){Qp?Fo zU7rF!R32F_ec>Tza_5JfSn{Wu%6HMS z^PIn&)aLWo!34w$`C-%@p}Q_lI8eR|dV&b8zX$@`^Ya^|KQn=Xu7m10Mp(h7H+Oxe zPH*Wtt&WqrjBSix)n!-5-*#zwZ;SD7kIknDvzgePT^3brTGz90vH6UyyuYyV?wHuj zu1pobr)yN9O56*8e{>ryI|qJ)`(J6p1#Jjx!#6OH-wWfCwLRa}#`b&{*(Y4bWs+mU zGKk`o(YG7o--6e+oV+$V8yN489yJ~W-9ON+SE#$2wkSu~^a|bj!(wQMX-oIR&)ioa zcHP=02WU+Xo%N%O*RCmaGZsf7sJO{t9ly}y)6<$0(B83b5OPqx$h7YJl~U49pB^y! zs~CCN;Q|$(Id}qw!GXn;h5w%;jenj2h?d^i|Y$}*- zEq|LI~IeaS%Z&1IPWJ6(wN@bAu z3hx1G*w}+QNTK6nM_v!v;{KNXSBZk(Qm(ic*0yFWcJ6A*ACx*|=4Q01Rb27$=VVJiCN(;y9k4(5jj^%};7oO?bvl zX+>NdLVp-{cZ0?X?Z2;;M?6AD_x}!vn-Ds-|1lsM5qf9;G7ak3ze%o+3 diff --git a/Source/ver.inc b/Source/ver.inc index cd0508b2..d18d8523 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.35" +#DEFINE BIOSVER "3.5.0-dev.36" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 7958f07b..358b95ae 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.35" + db "3.5.0-dev.36" endm From 2a6a3f36c2d2106bf1aa0859f3e05db42918850b Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 6 May 2024 18:57:14 -0700 Subject: [PATCH 15/20] Update nabu.asm Ongoing work on NABU interrupt processing. Co-Authored-By: Les Bird --- Source/HBIOS/nabu.asm | 51 +++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index 6862337a..7a395f60 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -49,17 +49,7 @@ NABU_PREINIT: ; PORT A IN WRITE MODE AND SET ALL BITS TO ZERO ; PORT B IN READ MODE ; - ; SET I/O PORT MODES - LD A,7 ; PSG R7 (ENABLE REG) - OUT (NABU_RSEL),A ; SELECT IT - LD A,%01000000 ; PORT B INPUT, PORT A OUPUT - OUT (NABU_RDAT),A ; SET IT -; - ; SET PORT A TO VALUE 0 - LD A,14 ; PSG R16 (PORT A DATA) - OUT (NABU_RSEL),A ; SELECT IT - XOR A ; VALUE 0 - OUT (NABU_RDAT),A ; SET IT + CALL NABU_SETPSG ; ; ADD TO INTERRUPT CHAIN LD HL,NABU_STAT @@ -69,26 +59,45 @@ NABU_PREINIT: NABU_INIT: CALL NEWLINE ; FORMATTING PRTS("NABU: INT1$") - XOR A - OUT (NABU_INT1CLR),A +; XOR A +; OUT (NABU_INT1CLR),A RET ; DONE ; +NABU_SETPSG: + ; SET I/O PORT MODES + LD A,7 ; PSG R7 (ENABLE REG) + OUT (NABU_RSEL),A ; SELECT IT + LD A,%01111111 ; PORT B INPUT, PORT A OUPUT + OUT (NABU_RDAT),A ; SET IT +; +; ; SET PORT A TO VALUE 0 +; LD A,14 ; PSG R14 (PORT A DATA) +; OUT (NABU_RSEL),A ; SELECT IT +; XOR A ; VALUE 0 +; OUT (NABU_RDAT),A ; SET IT +; + LD A,15 + OUT (NABU_RSEL),A + IN A,(NABU_RIN) + RET +; ; INTERRUPT ENTRY POINT ; NABU_STAT: - XOR A - OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT + CALL NABU_SETPSG +; XOR A +; OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT LD HL,(NABU_TICCNT) ; INCREMENT NABU TICK COUNTER INC HL ; ... IN HBIOS PROXY LD (NABU_TICCNT),HL - LD A,(NABU_HBTICK) ; INCREMENT INTERNAL TICK CTR - INC A - LD (NABU_HBTICK),A - CP $0A ; CALL HB_TICK EVERY 10 INTERRUPTS (50HZ) - RET NZ ; NOT TIME THEN JUST RETURN +; LD A,(NABU_HBTICK) ; INCREMENT INTERNAL TICK CTR +; INC A +; LD (NABU_HBTICK),A +; CP $0A ; CALL HB_TICK EVERY 10 INTERRUPTS (50HZ) +; RET NZ ; NOT TIME THEN JUST RETURN CALL HB_TICK ; DO NORMAL HBIOS TICK XOR A - LD (NABU_HBTICK),A ; RESET HBTICK COUNTER +; LD (NABU_HBTICK),A ; RESET HBTICK COUNTER INC A ; INTERRUPT HANDLED RET ; From e0414bca054f5ea3ccab86004adaba8b20e641ca Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 10 May 2024 11:13:34 -0700 Subject: [PATCH 16/20] NABU Stuff - Implement Interrupt Mode 2 (Mode 1 is still default) - Implement interrupt driven keyboard support - Improve UART keyboard driver to support interrupt driven flow control --- Source/HBIOS/cfg_duo.asm | 3 +- Source/HBIOS/cfg_dyno.asm | 3 +- Source/HBIOS/cfg_epitx.asm | 3 +- Source/HBIOS/cfg_heath.asm | 3 +- Source/HBIOS/cfg_master.asm | 3 +- Source/HBIOS/cfg_mbc.asm | 3 +- Source/HBIOS/cfg_mk4.asm | 3 +- Source/HBIOS/cfg_mon.asm | 3 +- Source/HBIOS/cfg_n8.asm | 3 +- Source/HBIOS/cfg_nabu.asm | 3 +- Source/HBIOS/cfg_rcz180.asm | 3 +- Source/HBIOS/cfg_rcz280.asm | 3 +- Source/HBIOS/cfg_rcz80.asm | 3 +- Source/HBIOS/cfg_rph.asm | 3 +- Source/HBIOS/cfg_s100.asm | 3 +- Source/HBIOS/cfg_sbc.asm | 3 +- Source/HBIOS/cfg_scz180.asm | 3 +- Source/HBIOS/cfg_z80retro.asm | 3 +- Source/HBIOS/cfg_zeta.asm | 3 +- Source/HBIOS/cfg_zeta2.asm | 3 +- Source/HBIOS/hbios.asm | 31 ++++++- Source/HBIOS/nabu.asm | 33 ++++--- Source/HBIOS/nabukb.asm | 157 +++++++++++++++++++++++++--------- Source/HBIOS/std.asm | 17 +++- Source/HBIOS/tms.asm | 3 + Source/HBIOS/uart.asm | 23 ++--- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 28 files changed, 217 insertions(+), 111 deletions(-) diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 50994d4a..4843f81b 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -131,7 +131,7 @@ UARTOSC .EQU 7372800 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU TRUE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -139,7 +139,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU TRUE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 42298316..dd3f3c05 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index 7ca40d09..4002c7d1 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -141,7 +141,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -149,7 +149,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index c3f4f10e..41f6cb6a 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 18fcd0c5..e10cda1d 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -169,7 +169,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -177,7 +177,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index f767a352..bc37a51f 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -128,7 +128,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -136,7 +136,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU TRUE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 39214bb6..691440e6 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -133,7 +133,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -141,7 +141,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index 32db23b4..00f7b408 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -134,7 +134,7 @@ UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -142,7 +142,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index 8ecb59e0..d810827d 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -135,7 +135,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -143,7 +143,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index 3831d4e6..99198cce 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU TRUE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index a8c1e846..d1f2da99 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -145,7 +145,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -153,7 +153,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index 46edeaaf..f97f7033 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 66f815e5..7224ff1d 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index 6f4af843..fbf1ebbf 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -133,7 +133,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -141,7 +141,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index ce82688d..70800cf8 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index e0d85495..76cd046b 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -128,7 +128,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -136,7 +136,6 @@ UARTMFP .EQU TRUE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index e91836c3..52849489 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -139,7 +139,7 @@ UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG | SER_RTS ; UART: LINE CONFIG FOR UART PORTS -UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU FALSE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -147,7 +147,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index d087f5cc..e95c80ae 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -126,7 +126,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -134,7 +134,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index f0ed536c..0b3c409f 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -115,7 +115,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -123,7 +123,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 0c33dfa0..7e3c6f10 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -126,7 +126,7 @@ UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 UARTCFG .EQU DEFSERCFG ; UART: LINE CONFIG FOR UART PORTS UARTCASSPD .EQU SER_300_8N1 ; UART: ECB CASSETTE UART DEFAULT SPEED -UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO ONBOARD UART +UARTSBC .EQU TRUE ; UART: AUTO-DETECT SBC/ZETA/DUO/NABU ONBOARD UART UARTSBCFORCE .EQU FALSE ; UART: FORCE DETECTION OF SBC UART (FOR SIMH) UARTAUX .EQU FALSE ; UART: AUTO-DETECT AUX UART UARTCAS .EQU FALSE ; UART: AUTO-DETECT ECB CASSETTE UART @@ -134,7 +134,6 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART -UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index f348a336..8f340c68 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2371,7 +2371,7 @@ HB_CPU3: #ENDIF ; ;-------------------------------------------------------------------------------------------------- -; SYSTEM TIME INITIALIZATION +; SYSTEM TIMER INITIALIZATION ;-------------------------------------------------------------------------------------------------- ; #IF (PLATFORM == PLT_SBC) @@ -2707,6 +2707,34 @@ NXTMIO: LD A,(HL) NOT_REC_M2: ; FPLEDS(DIAG_08) + +#IF (PLATFORM == PLT_NABU) & TRUE +; + ; GET CURRENT VALUE OF PSG ENABLE REGISTER + LD A,7 + OUT (NABU_RSEL),A + NOP + IN A,(NABU_RDAT) + LD B,A +; + ; GET CURRENT VALUE OF PSG ENABLE REGISTER + LD A,7 + OUT (NABU_RSEL),A + NOP + IN A,(NABU_RDAT) + LD C,A +; + ; DUMP IT + CALL PC_ASTERISK + LD A,B + CALL PRTHEXBYTE + LD A,C + CALL PRTHEXBYTE + CALL PC_ASTERISK +; +#ENDIF + + ; ;-------------------------------------------------------------------------------------------------- ; IO PORT SCAN @@ -3061,6 +3089,7 @@ HB_CKBNKSIZ .EQU $-HB_CKBNK ; SIZE OF ROUTINE HB_ROMCKZ: ; #ENDIF +; #ENDIF ; ;-------------------------------------------------------------------------------------------------- diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index 7a395f60..ec3a1cf7 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -51,10 +51,17 @@ NABU_PREINIT: ; CALL NABU_SETPSG ; - ; ADD TO INTERRUPT CHAIN - LD HL,NABU_STAT - CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST - RET +;#IF (INTMODE == 1) +; ; ADD TO INTERRUPT CHAIN +; LD HL,NABU_STAT +; CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST +;#ENDIF +; +;#IF (INTMODE == 2) +; LD HL,NABU_STAT +; LD (IVT(INT_NABUKB)),HL ; IVT INDEX +;#ENDIF +; RET ; NABU_INIT: CALL NEWLINE ; FORMATTING @@ -70,11 +77,15 @@ NABU_SETPSG: LD A,%01111111 ; PORT B INPUT, PORT A OUPUT OUT (NABU_RDAT),A ; SET IT ; -; ; SET PORT A TO VALUE 0 -; LD A,14 ; PSG R14 (PORT A DATA) -; OUT (NABU_RSEL),A ; SELECT IT -; XOR A ; VALUE 0 -; OUT (NABU_RDAT),A ; SET IT + ; SET PORT A TO VALUE 0 + LD A,14 ; PSG R14 (PORT A DATA) + OUT (NABU_RSEL),A ; SELECT IT +#IF (INTMODE > 0) + LD A,%00100000 ; ENABLE NABU KB INTS +#ELSE + XOR A +#ENDIF + OUT (NABU_RDAT),A ; SET IT ; LD A,15 OUT (NABU_RSEL),A @@ -84,10 +95,12 @@ NABU_SETPSG: ; INTERRUPT ENTRY POINT ; NABU_STAT: - CALL NABU_SETPSG +; CALL NABU_SETPSG ; XOR A ; OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT LD HL,(NABU_TICCNT) ; INCREMENT NABU TICK COUNTER + + INC HL ; ... IN HBIOS PROXY LD (NABU_TICCNT),HL ; LD A,(NABU_HBTICK) ; INCREMENT INTERNAL TICK CTR diff --git a/Source/HBIOS/nabukb.asm b/Source/HBIOS/nabukb.asm index 9bcaf745..5d949032 100644 --- a/Source/HBIOS/nabukb.asm +++ b/Source/HBIOS/nabukb.asm @@ -44,16 +44,35 @@ ; LD A,04H ; CALL SUB12 ; -NABUKB_DAT .EQU $90 +NABUKB_IODAT .EQU $90 ; KEYBOARD DATA (READ) +NABUKB_IOSTAT .EQU $91 ; STATUS (READ), CMD (WRITE) ; DEVECHO "NABUKB: IO=" - DEVECHO NABUKB_DAT + DEVECHO NABUKB_IODAT DEVECHO "\n" ; +; SETUP INTERRUPT HANDLING, IF ENABLED +; +NABUKB_PREINIT: +#IF (INTMODE == 1) + ; ADD TO INTERRUPT CHAIN + LD HL,NABUKB_INT + CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST +#ENDIF +; +#IF (INTMODE == 2) + ; INSTALL VECTOR + LD HL,NABUKB_INT + LD (IVT(INT_NABUKB)),HL ; IVT INDEX +#ENDIF + RET +; +; INITIALZIZE THE KEYBOARD CONTROLLER. +; NABUKB_INIT: CALL NEWLINE PRTS("NABUKB: IO=0x$") - LD A,NABUKB_DAT + LD A,NABUKB_IODAT CALL PRTHEXBYTE ; XOR A @@ -72,36 +91,82 @@ NABUKB_INIT: XOR A RET ; +#IF (INTMODE > 0) +; +; INTERRUPT HANDLER FOR NABU KEYBOARD. HANDLES INTERRUPTS FOR EITHER +; INT MODE 1 OR INT MODE 2. THE KEYBOARD BUFFER IS JUST A SINGLE CHAR +; AT THIS POINT. NEW CHARACTERS ARRIVING WHEN THE BUFFER IS FULL WILL +; BE DISCARDED. +; +NABUKB_INT: + IN A,(NABUKB_IOSTAT) ; GET KBD STATUS + AND $02 ; CHECK DATA RDY BIT + RET Z ; ABORT W/ Z (INT NOT HANDLED) +; + ;CALL PC_LT ; *DEBUG* + IN A,(NABUKB_IODAT) ; GET THE KEY + LD E,A ; STASH IN REG E + ;CALL PRTHEXBYTE ; *DEBUG* + ;CALL PC_GT ; *DEBUG* +; + LD A,(NABUKB_KSTAT) ; GET KEY BUFFER STAT + OR A ; SET FLAGS + RET NZ ; BUFFER FULL, BAIL OUT W/ NZ (INT HANDLED), KEY DISCARDED +; + LD A,E ; RECOVER THE KEY CODE + CALL NABUKB_XB ; TRANSLATE AND BUFFER KEY + OR $FF ; SIGNAL INT HANDLED + RET ; DONE +; +#ENDIF +; +; NORMAL HBIOS CHAR INPUT STATUS. IF INTERRUPTS ARE NOT ACTIVE, THEN +; KEYBOARD POLLING IS IMPLEMENTED HERE. +; NABUKB_STAT: LD A,(NABUKB_KSTAT) ; GET KEY WAITING STATUS OR A ; SET FLAGS +#IF (INTMODE > 0) + JR Z,NABUKB_STATX ; BAIL OUT W/ Z (NO KEY) + RET ; KEY WAITING, ALL SET +#ELSE RET NZ ; KEY WAITING, ALL SET - IN A,(NABUKB_DAT+1) ; GET BKD STATUS + IN A,(NABUKB_IOSTAT) ; GET KBD STATUS AND $02 ; CHECK DATA RDY BIT - JR Z,NABUKB_STATX ; BAIL OUT IF NOT - IN A,(NABUKB_DAT) ; GET THE KEY + JR Z,NABUKB_STATX ; BAIL OUT W/ Z (NO KEY) + IN A,(NABUKB_IODAT) ; GET THE KEY + CALL NABUKB_XB ; TRANSLATE AND BUFFER KEY + LD A,(NABUKB_KSTAT) ; GET NEW KEY WAITING STATUS + OR A ; SET FLAGS + RET ; DONE +#ENDIF +; +NABUKB_STATX: + XOR A ; SIGNAL NO CHAR READY + JP CIO_IDLE ; RETURN VIA IDLE PROCESSOR +; +; ROUTINE TO TRANSLATE AND BUFFER INCOMING NABU KEYBOARD KEYCODES +; +NABUKB_XB: BIT 7,A ; HIGH BIT IS SPECIAL CHAR - JR Z,NABUKB_STAT2 ; IF NORMAL CHAR, BUFFER IT + JR Z,NABUKB_XB2 ; IF NORMAL CHAR, BUFFER IT CP $90 ; START OF ERR CODES - JR C,NABUKB_STAT1 ; NOT ERR CODE, CONTINUE + JR C,NABUKB_XB1 ; NOT ERR CODE, CONTINUE CP $A0 ; END OF ERR CODES - JR NC,NABUKB_STAT1 ; NOT ERR CODE, CONTINUE - JR NABUKB_STATX ; IS ERR CODE, IGNORE IT -NABUKB_STAT1: + JR NC,NABUKB_XB1 ; NOT ERR CODE, CONTINUE + RET ; DISCARD ERR CODE AND RETURN +NABUKB_XB1: CP $E0 ; SPECIAL CHARACTER? - JR C,NABUKB_STAT2 ; IF NOT, SKIP XLAT, BUFFER KEY + JR C,NABUKB_XB2 ; IF NOT, SKIP XLAT, BUFFER KEY CALL NABUKB_XLAT ; IF SO, TRANSLATE IT - JR C,NABUKB_STATX ; CF INDICATES INVALID -NABUKB_STAT2: + RET C ; CF INDICATES INVALID, DISCARD AND RETURN +NABUKB_XB2: LD (NABUKB_KEY),A ; BUFFER IT LD A,1 ; SIGNAL KEY WAITING LD (NABUKB_KSTAT),A ; SAVE IT - OR A ; SET FLAGS RET ; DONE ; -NABUKB_STATX: - XOR A ; SIGNAL NO CHAR READY - JP CIO_IDLE ; RETURN VIA IDLE PROCESSOR +; ROUTINE TO TRANSLATE SPECIAL NABU KEYBOARD KEY CODES ; NABUKB_XLAT: ; NABU KEYBOARD USES $E0-$FF FOR SPECIAL KEYS @@ -121,10 +186,15 @@ NABUKB_XLAT1: SCF ; SIGNAL INVALID RET ; AND DONE ; +; FLUSH KEYBOARD BUFFER +; NABUKB_FLUSH: XOR A + LD (NABUKB_KSTAT),A RET ; +; WAIT FOR A KEY TO BE READY AND RETURN IT. +; NABUKB_READ: CALL NABUKB_STAT ; CHECK FOR KEY READY JR Z,NABUKB_READ ; LOOP TIL ONE IS READY @@ -136,8 +206,10 @@ NABUKB_READ: LD (NABUKB_KSTAT),A ; CLEAR KEY WAITING STATUS RET ; AND RETURN ; +; HELPER ROUTINE TO WRITE +; NABUKB_PUT: - OUT (NABUKB_DAT+1),A + OUT (NABUKB_IOSTAT),A NOP NOP NOP @@ -155,36 +227,37 @@ NABUKB_KEY .DB 0 ; KEY BUFFER ; NABU KEY CODE $E0 AND HANDLES $20 POSSIBLE VALUES ($E0-$FF) ; THE SPECIAL KEYS SEND A SPECIFIC KEYCODE TO INDICATE DOWN (KEY ; PRESSED) AND UP (KEY RELEASED). WE WILL ARBITRARILY CHOOSE TO -; RESPOND TO KEY RELEASED. +; RESPOND TO KEY PRESSED. a TRANSLATION VALUE OF $00 MEANS THAT THE +; KEY CODE SHOULD BE DISCARDED. ; NABUKB_XTBL: - .DB $00 ; $E0, RIGHT ARROW (DN) - .DB $00 ; $E1, LEFT ARROW (DN) - .DB $00 ; $E2, UP ARROW (DN) - .DB $00 ; $E3, DOWN ARROW (DN) - .DB $00 ; $E4, PAGE RIGHT (DN) - .DB $00 ; $E5, PAGE LEFT (DN) - .DB $00 ; $E6, NO (DN) - .DB $00 ; $E7, YES (DN) - .DB $00 ; $E8, SYM (DN) - .DB $00 ; $E9, PAUSE (DN) - .DB $00 ; $EA, TV/NABU (DN) + .DB $F9 ; $E0, RIGHT ARROW (DN) -> RIGHT ARROW + .DB $F8 ; $E1, LEFT ARROW (DN) -> LEFT ARROW + .DB $F6 ; $E2, UP ARROW (DN) -> UP ARROW + .DB $F7 ; $E3, DOWN ARROW (DN) -> DOWN ARROW + .DB $F5 ; $E4, PAGE RIGHT (DN) -> PAGE DOWN + .DB $F4 ; $E5, PAGE LEFT (DN) -> PAGE UP + .DB $F3 ; $E6, NO (DN) -> END + .DB $F2 ; $E7, YES (DN) -> HOME + .DB $EE ; $E8, SYM (DN) -> SYSRQ + .DB $EF ; $E9, PAUSE (DN) -> PAUSE + .DB $00 ; $EA, TV/NABU (DN) -> APP .DB $00 ; $EB, N/A .DB $00 ; $EC, N/A .DB $00 ; $ED, N/A .DB $00 ; $EE, N/A .DB $00 ; $EF, N/A - .DB $F9 ; $F0, RIGHT ARROW (UP) -> RIGHT ARROW - .DB $F8 ; $F1, LEFT ARROW (UP) -> LEFT ARROW - .DB $F6 ; $F2, UP ARROW (UP) -> UP ARROW - .DB $F7 ; $F3, DOWN ARROW (UP) -> DOWN ARROW - .DB $F5 ; $F4, PAGE RIGHT (UP) -> PAGE DOWN - .DB $F4 ; $F5, PAGE LEFT (UP) -> PAGE UP - .DB $F3 ; $F6, NO (UP) -> END - .DB $F2 ; $F7, YES (UP) -> HOME - .DB $EC ; $F8, SYM (UP) -> SYSRQ - .DB $EE ; $F9, PAUSE (UP) -> PAUSE - .DB $EF ; $FA, TV/NABU (UP) -> APP + .DB $00 ; $F0, RIGHT ARROW (UP) + .DB $00 ; $F1, LEFT ARROW (UP) + .DB $00 ; $F2, UP ARROW (UP) + .DB $00 ; $F3, DOWN ARROW (UP) + .DB $00 ; $F4, PAGE RIGHT (UP) + .DB $00 ; $F5, PAGE LEFT (UP) + .DB $00 ; $F6, NO (UP) + .DB $00 ; $F7, YES (UP) + .DB $00 ; $F8, SYM (UP) + .DB $00 ; $F9, PAUSE (UP) + .DB $00 ; $FA, TV/NABU (UP) .DB $00 ; $FB, N/A .DB $00 ; $FC, N/A .DB $00 ; $FD, N/A diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 2697541d..6ee025ce 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -1049,7 +1049,22 @@ INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B #ENDIF - #IF ((PLATFORM != PLT_MBC) & (PLATFORM != PLT_DUO)) + #IF (PLATFORM == PLT_NABU) +; +; NABU Z80 IM2 INTERRUPTS +; +INT_HCAARCV .EQU 0 ; UART 0 +INT_HCAASND .EQU 1 ; UART 1 ????? +INT_NABUKB .EQU 2 ; ZILOG CTC 0, CHANNEL A +INT_VDP .EQU 3 ; ZILOG CTC 0, CHANNEL B +INT_OPTCRD0 .EQU 4 ; ZILOG CTC 0, CHANNEL C +INT_OPTCRD1 .EQU 5 ; ZILOG CTC 0, CHANNEL D +INT_OPTCRD2 .EQU 6 ; ZILOG SIO 0, CHANNEL A & B +INT_OPTCRD3 .EQU 7 ; ZILOG SIO 1, CHANNEL A & B + + #ENDIF + + #IF ((PLATFORM != PLT_MBC) & (PLATFORM != PLT_DUO) & (PLATFORM != PLT_NABU)) ; GENERIC Z80 M2 INTERRUPTS diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index eaed9dfe..0fd7fac3 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -179,6 +179,9 @@ NABUKBENABLE .SET TRUE ; INCLUDE NABU KEYBOARD SUPPORT ;====================================================================== ; TMS_PREINIT: +#IF (NABUKBENABLE == TRUE) + CALL NABUKB_PREINIT +#ENDIF ; DISABLE INTERRUPT GENERATION LD A, (TMS_INITVDU_REG_1) RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index d012b33c..bedf4487 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -57,7 +57,14 @@ UART_CTSBAD .EQU 4 ; CTS STALL DETECTED #IF (PLATFORM == PLT_DUO) UARTSBASE .EQU $58 UARTDBASE .EQU $70 -#ELSE +#ENDIF +; +#IF (PLATFORM == PLT_NABU) +UARTSBASE .EQU $48 +UARTDBASE .EQU $80 +#ENDIF +; +#IF ((PLATFORM != PLT_DUO) & (PLATFORM != PLT_NABU)) UARTSBASE .EQU $68 UARTDBASE .EQU $80 #ENDIF @@ -67,7 +74,6 @@ UARTCBASE .EQU $80 UARTMBASE .EQU $18 UART4BASE .EQU $C0 UARTRBASE .EQU $A0 -UARTNBASE .EQU $48 ; #IF (UARTINTS) ; @@ -79,7 +85,6 @@ UART1_IVT .EQU IVT(INT_UART1) #ENDIF ; #ENDIF - ; #DEFINE UART_INP(RID) CALL UART_INP_IMP \ .DB RID #DEFINE UART_OUTP(RID) CALL UART_OUTP_IMP \ .DB RID @@ -1185,18 +1190,6 @@ UART_CFG_MFP: DEVECHO "\n" ; #ENDIF -#IF (UARTNABU) - .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) - .DB 0 ; UART TYPE - .DB UARTNBASE ; IO PORT BASE (RBR, THR) - .DB UARTNBASE + UART_LSR ; LINE STATUS PORT (LSR) - .DW UARTCFG ; LINE CONFIGURATION - .DW 0 ; SHOULD NEVER NEED INT HANDLER -; - DEVECHO "UART: MODE=NABU, IO=" - DEVECHO UARTNBASE - DEVECHO "\n" -#ENDIF ; UART_CNT .EQU ($ - UART_CFG) / 8 ; diff --git a/Source/ver.inc b/Source/ver.inc index d18d8523..9971ed7e 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.36" +#DEFINE BIOSVER "3.5.0-dev.37" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 358b95ae..4feb605b 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.36" + db "3.5.0-dev.37" endm From 157af16d3239842f7a1b602b90dd9078ff30662a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 10 May 2024 14:09:43 -0700 Subject: [PATCH 17/20] More NABU Stuff - Add a hack to TUNE application to avoid corrupting PSG R7 which is used by and critical to NABU. - NABU default baud rate to 38400 to get file transfers working without flow control. - NABU default to console on video instead of UART. --- Source/Apps/Tune/tune.asm | 43 +++++++++++++++++++++++++++++++++------ Source/HBIOS/cfg_nabu.asm | 4 ++-- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Source/Apps/Tune/tune.asm b/Source/Apps/Tune/tune.asm index 85938037..8a9d1800 100644 --- a/Source/Apps/Tune/tune.asm +++ b/Source/Apps/Tune/tune.asm @@ -48,7 +48,7 @@ ; 2023-03-30 [WBW] Fix for quark delay adjustment being trashed ; 2024-02-23 [WBW] Include ACR value in config table ; 2024-04-16 [WBW] Add support for NABU AY-3-8910 -; +; 2024-05-10 [WBW] Hack to avoid corrupting bits 6&7 of PSG R7 for NABU! ;_______________________________________________________________________________ ; ; ToDo: @@ -666,7 +666,7 @@ TMP .DB 0 ; work around use of undocumented Z80 HBIOSMD .DB 0 ; NON-ZERO IF USING HBIOS SOUND DRIVER, ZERO OTHERWISE OCTAVEADJ .DB 0 ; AMOUNT TO ADJUST OCTAVE UP OR DOWN -MSGBAN .DB "Tune Player for RomWBW v3.7, 16-Apr-2024",0 +MSGBAN .DB "Tune Player for RomWBW v3.8, 10-May-2024",0 MSGUSE .DB "Copyright (C) 2024, Wayne Warthen, GNU GPL v3",13,10 .DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10 .DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10 @@ -2086,8 +2086,23 @@ LOUT OUT (C),A LD HL, AYREGS ; START OF VALUE LIST LOUT OUT (C), A ; SELECT REGISTER LD C, D ; POINT TO DATA PORT - OUTI ; WRITE (HL) TO DATA PORT, BUMP HL - LD C, E ; POINT TO ADDRESS PORT + + ; UGLINESS FOR NABU! WE NEED TO KEEP BIT 7 = 0, AND BIT 6 = 1 + ; FOR PSG REG 7 + CP 7 ; PSG REG 7? + JR NZ,LOUT1 ; SKIP SPECIAL PROCESSING + PUSH AF ; SAVE AF + LD A,(HL) ; GET VALUE BYTE + AND %00111111 ; FIX BITS 6 & 7 + OR %01000000 ; ... FOR NABU! + OUT (C),A ; SEND THE FIXED VALUE + DEC B ; SIMULATE THE RESET + INC HL ; ... OF OUTI + POP AF ; RESTORE AF + JR LOUT1A ; RESUME LOOP + +LOUT1 OUTI ; WRITE (HL) TO DATA PORT, BUMP HL +LOUT1A LD C, E ; POINT TO ADDRESS PORT INC A ; NEXT REGISTER CP 13 ; REG 13? JR NZ, LOUT ; IF NOT, LOOP @@ -2097,6 +2112,7 @@ LOUT OUT (C), A ; SELECT REGISTER JP M, LOUT2 ; IF BIT 7 SET, RETURN W/O WRITING VALUE LD C, D ; SELECT DATA PORT OUT (C), A ; WRITE VALUE TO REGISTER 13 + LOUT2 CALL NORMIO EI RET ; AND DONE @@ -2543,8 +2559,23 @@ upsg1: ld hl,(psource) psglp: ld c, e ; C := RSEL out (c), a ; Select register ld c, d ; C := RDAT - outi ; Set register value - inc a ; Next register + + ; ugliness for nabu! we need to keep bit 7 = 0, and bit 6 = 1 + ; for psg reg 7 + cp 7 ; psg reg 7? + jr nz,psglp1 ; if not, skip special processing + push af ; save af + ld a,(hl) ; get value byte + and %00111111 ; fix bits 6 & 7 + or %01000000 ; ... for NABU! + out (c),a ; send the fixed value + dec b ; simulate the rest + inc hl ; ... of outi + pop af ; restore af + jr psglp2 ; resume loop + +psglp1: outi ; Set register value +psglp2: inc a ; Next register ld bc, (3 * FRAG) - 1 ; Bytes to skip before next reg-1 add hl, bc ; Update HL diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index 99198cce..f5af6ede 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -31,7 +31,7 @@ CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW CPUOSC .EQU 3580000 ; CPU OSC FREQ IN MHZ INTMODE .EQU 1 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) -DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +DEFSERCFG .EQU SER_38400_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) ; RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) @@ -95,7 +95,7 @@ H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE -CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +CRTACT .EQU TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) From 7497e233d2bc54988825134dcff14887bd147eb6 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 10 May 2024 14:24:12 -0700 Subject: [PATCH 18/20] Fix NABU Config - CRTACT was not being set correctly. --- Source/HBIOS/Config/NABU_std.asm | 4 +--- Source/HBIOS/cfg_nabu.asm | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Source/HBIOS/Config/NABU_std.asm b/Source/HBIOS/Config/NABU_std.asm index d7e556be..8731dc6a 100644 --- a/Source/HBIOS/Config/NABU_std.asm +++ b/Source/HBIOS/Config/NABU_std.asm @@ -26,9 +26,7 @@ ; #include "cfg_nabu.asm" ; -CPUOSC .SET 3580000 ; CPU OSC FREQ IN MHZ -; -CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +CRTACT .SET TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP ; TMSMODE .SET TMSMODE_NABU80 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index f5af6ede..786d7390 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -95,7 +95,7 @@ H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL ; BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE -CRTACT .EQU TRUE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) From 7c41ef6fc94f42a82efaaf31aac17512525fd982 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 10 May 2024 15:44:51 -0700 Subject: [PATCH 19/20] Implement System Timer for NABU --- Source/HBIOS/cfg_nabu.asm | 2 +- Source/HBIOS/nabu.asm | 4 ++++ Source/HBIOS/tms.asm | 29 ++++++++++++++++++++++------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index 786d7390..372a26cd 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -192,7 +192,7 @@ CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NABU80 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU40|NABU80] -TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSTIMENABLE .EQU TRUE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index ec3a1cf7..bb4db4f4 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -81,7 +81,11 @@ NABU_SETPSG: LD A,14 ; PSG R14 (PORT A DATA) OUT (NABU_RSEL),A ; SELECT IT #IF (INTMODE > 0) + #IF (TMSTIMENABLE == TRUE) + LD A,%00110000 ; ENABLE NABU KB & VDP INTS + #ELSE LD A,%00100000 ; ENABLE NABU KB INTS + #ENDIF #ELSE XOR A #ENDIF diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 0fd7fac3..7b0d7815 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -120,7 +120,7 @@ TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL ; DEVECHO ", IO=" DEVECHO TMS_DATREG -#IF TMSTIMENABLE +#IF (TMSTIMENABLE & (INTMODE > 0)) DEVECHO ", INTERRUPTS ENABLED" #ENDIF DEVECHO "\n" @@ -268,17 +268,26 @@ TMS_INIT1: CALL NABUKB_INIT ; INITIALIZE NABU KEYBOARD DRIVER #ENDIF -#IF (INTMODE == 1 & TMSTIMENABLE) +#IF (TMSTIMENABLE & (INTMODE > 0)) +; + #IF (INTMODE == 1) ; ADD IM1 INT CALL LIST ENTRY - LD HL, TMS_TSTINT ; GET INT VECTOR + LD HL,TMS_TSTINT ; GET INT VECTOR CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST - + #ELSE + ; INSTALL VECTOR + LD HL,TMS_TSTINT + LD (IVT(INT_VDP)),HL ; IVT INDEX + #ENDIF +; LD A, (TMS_INITVDU_REG_1) SET TMSINTEN,A ; SET INTERRUPT ENABLE BIT LD (TMS_INITVDU_REG_1),A LD C, TMSCTRL1 CALL TMS_SET +; #ENDIF + ; ; ADD OURSELVES TO VDA DISPATCH TABLE LD BC,TMS_FNTBL ; BC := FUNCTION TABLE ADDRESS @@ -534,12 +543,14 @@ TMS_READ: ;---------------------------------------------------------------------- ; TMS_SET: + HB_DI OUT (TMS_CMDREG),A ; WRITE IT TMS_IODELAY LD A,C ; GET THE DESIRED REGISTER OR $80 ; SET BIT 7 OUT (TMS_CMDREG),A ; SELECT THE DESIRED REGISTER TMS_IODELAY + HB_EI RET ; ;---------------------------------------------------------------------- @@ -551,12 +562,14 @@ TMS_SET: TMS_WR: #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU80)) ; CLEAR R#14 FOR V9958 + HB_DI XOR A OUT (TMS_CMDREG), A TMS_IODELAY LD A, $80 | 14 OUT (TMS_CMDREG), A TMS_IODELAY + HB_EI #ENDIF PUSH HL @@ -566,12 +579,14 @@ TMS_WR: RET ; TMS_RD: + HB_DI LD A,L OUT (TMS_CMDREG),A TMS_IODELAY LD A,H OUT (TMS_CMDREG),A TMS_IODELAY + HB_EI RET ; ;---------------------------------------------------------------------- @@ -1045,11 +1060,11 @@ TMS_Z180IOX: ; #ENDIF -#IF (INTMODE == 1 & TMSTIMENABLE) +#IF (TMSTIMENABLE & (INTMODE > 0)) TMS_TSTINT: - IN A, (TMS_CMDREG) ; TEST FOR INT FLAG + IN A,(TMS_CMDREG) ; TEST FOR INT FLAG AND $80 - JR NZ, TMS_INTHNDL + JR NZ,TMS_INTHNDL AND $00 ; RETURN Z - NOT HANDLED RET diff --git a/Source/ver.inc b/Source/ver.inc index 9971ed7e..93f95abc 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.37" +#DEFINE BIOSVER "3.5.0-dev.38" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 4feb605b..d00f1741 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.37" + db "3.5.0-dev.38" endm From 5ea5003d0161709dc44391ceffa4b2c2578ce0f8 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 10 May 2024 19:30:42 -0700 Subject: [PATCH 20/20] Revise Z80 Tests to Improve Interrupt Management - Moved the saving/restoring of the interrupt state to bracket each individual test instead of the entire application. - Removed the IM n test because there is no way to save/restore it. --- Source/Images/Test/z80ccf.com | Bin 14797 -> 14795 bytes Source/Images/Test/z80doc.com | Bin 14312 -> 14310 bytes Source/Images/Test/z80docf.com | Bin 14312 -> 14310 bytes Source/Images/Test/z80flags.com | Bin 14312 -> 14310 bytes Source/Images/Test/z80full.com | Bin 14312 -> 14310 bytes Source/Images/Test/z80mptr.com | Bin 14312 -> 14310 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Source/Images/Test/z80ccf.com b/Source/Images/Test/z80ccf.com index 5fa0532ca32459997c6c980f936ff4e24f80d154..1bb506291c9554b1a0cca00d149bf336b2a22ae3 100644 GIT binary patch delta 372 zcmV-)0gL|4bIWrMAr1i%0Du9#Iqk5+0DzGaECGp;KUtBSY76u2SM|*Rg7NJ~`?CoF zga?1Wi4BTXik*t=iaU#mi`R=IjBkv$jQ@;BjgXDpjVO+Ej=+uzk5rGHkLHgukb;oX zkRp+Bk;9P{l4O#tlJ=55lZKPdlNOXSx}gT5Ridb(_o7InkfYe6A*5=gxugiCP^Flq;iW33c&5gt5~o|Iq^Itu zIH-uI*r+C{bg9Cr3#wGAovP-lFsps5$*UEtUaYFD^{hdykgeFQBd%<&wXOrNQ?Eax zuk)`!u#T|SuqCl{vCXk2vUIY-vJ|slv#qlLv{SU9wC}V$wTZRZwI{ZAw#Bv-w_~@k SxBa(BxRbcvxGA&D2>~!OYsh2( delta 375 zcmV--0f_#~bIo%SAr1i%0Du9%Iqk5+0D$xDSM`w&ECG>`J6Qzr?MM5OlxhRb0D`j# z0fYyC!HExwSBjsC?utE&i;LNdC5&;5xr_mgNsW??-i<1bc8 zpn9Ompd6uVp}e68qF17-qWPjqqmrZAqa&njq`RaFrBbDurQ@Y6rh2BxrWB`Lr>3Xy zr#h&LsM@F~sdlNvsST=Ds-LRpsxqs8tIMkwtYECHtoN)#t&*+UttGB*uD7lQuT`%> zrLXm`La>mq*sv$DcCpW~D6)34#IhE%VY9EZ0<=}MqqOm~KDCRr+O;XRc(%v37Pn=$ VvbX=YO1PD{;J7Qfb+gI|0WgnU$;$u$ diff --git a/Source/Images/Test/z80doc.com b/Source/Images/Test/z80doc.com index 3f2af072a776c8672849dff4adb75a25b5eb0b4f..ea2cf521813a07c60facd9d8e76eabdae6d7cd36 100644 GIT binary patch delta 381 zcmV-@0fPSMZ{}|fAr1i%0DuA5H|?;)0DzGaECGp;KUtBSY76u2SM|*Rg7NJ~`?CoF ze+PfMi3N&EijRuhiYJS5i@l2mj8BY|jM7-|!lVeLQ>C7z=cO&CbEdkc z0jExh0ZmPGc{i;T*j;q(JBdlnwu&nm1JgtYV)U8Az zu5PZlt^=<~uavLguQsrZu-C96v2n4vu>`VIvZS)_vO2Sbv(B>`v}UxjwEnb8wU)Ku bwJNr9wz{?gw@SAF0M`JMp$ZqX;|T>W#d68U delta 385 zcmV-{0e=4GZ|H9lAr1i%0DuA7H|?;)0D$xDSM`w&ECG>`J6Qzr?MM5OlxhRb0D`j# z0e=U7yom>jOp1|;-HIuTbc?@>2#isTmW*knwaL8Etzzg!kG}7SDK!h=$bN{dYi(3n+lv#oSmHLoHLz%oynaNo?f1=p8B3h zpOK&4pDmzypvRyPpJUO0Sl$;;%Tcj*8l*MVHFm$;RyvU3Y*Im diff --git a/Source/Images/Test/z80docf.com b/Source/Images/Test/z80docf.com index d5b7ac89ef1c0535767b6ebae99e40ddc09babc5..ddfdf53ff7078c4a65849d6e899c109433a0bbcb 100644 GIT binary patch delta 381 zcmV-@0fPSMZ{}|fAr1i%0DuA5H|?;)0DzGaG69c~MOl%eY76u2SM|*Rg7NJ~`?C)L zc?W;Gi3N&EijRuhiYJS5i@l2mj8BY|jM7-|!lVeLQ>C7z=cO&CbEdkc z0jExh0ZmPGc{i;T*j;q(JBdlnwu&nm1JgtYV)U8Az zu5PZlt^=<~uavLguQsrZu-C96v2n4vu>`VIvZS)_vO2Sbv(B>`v}UxjwEnb8wU)Ku bwJNr9wz{?gw@SAF0M`JMp$ZqX;|T>W=J3hh delta 385 zcmV-{0e=4GZ|H9lAr1i%0DuA7H|?;)0D$xDSM`w&G69#7L0JUx?MM5OnrZ{h0D`j* z0eJ_1yom>jOp1|;-HIuTbc?@>2#isTmW*knwaL8Etzzg!kG}7SDK!h=$bN{dYi(3n+lv#oSmHLoHLz%oynaNo?f1=p8B3h zpOK&4pDmzypvRyPpJUO0Sl$;;%Tcj*8l*MVHFm$;RyvUEBnhV diff --git a/Source/Images/Test/z80flags.com b/Source/Images/Test/z80flags.com index 3965c583d8de6ecd9d3423a07b3186aa2168ca2c..18fb3ebe19dc27e5035968e1f970f784b69bc29c 100644 GIT binary patch delta 381 zcmV-@0fPSMZ{}|fAr1i%0DuA5H|?;)0DzGaE&+>?L0OTWY76u2SM|*Rg7NJ~`?CuH zeFuNKi3N&EijRuhiYJS5i@l2mj8BY|jM7-|!lVeLQ>C7z=cO&CbEdkc z0jExh0ZmPGc{i;T*j;q(JBdlnwu&nm1JgtYV)U8Az zu5PZlt^=<~uavLguQsrZu-C96v2n4vu>`VIvZS)_vO2Sbv(B>`v}UxjwEnb8wU)Ku bwJNr9wz{?gw@SAF0RI4!p$ZqX;|T>W(p1Uz delta 385 zcmV-{0e=4GZ|H9lAr1i%0DuA7H|?;)0D$xDSM`w&E&-E~Jy`_t?MM5OmTCjd0D`j% z0euI5yom>jOp1|;-HIuTbc?@>2#isTmW*knwaL8Etzzg!kG}7SDK!h=$bN{dYi(3n+lv#oSmHLoHLz%oynaNo?f1=p8B3h zpOK&4pDmzypvRyPpJUO0Sl$;;%Tcj{{R4!VHFm$;RyvU7n{pO diff --git a/Source/Images/Test/z80full.com b/Source/Images/Test/z80full.com index ff3a76776b5ee5bc1f6101bb81acaba53c00c3de..4ef97c93c4788fd3bef9bc65d5ac1fe26a44e3d4 100644 GIT binary patch delta 381 zcmV-@0fPSMZ{}|fAr1i%0DuA5H|?;)0DzGaEdh#=Kv|KUY76u2SM|*Rg7NJ~`?CrG zeg}WLi3N&EijRuhiYJS5i@l2mj8BY|jM7-|!lVeLQ>C7z=cO&CbEdkc z0jExh0ZmPGc{i;T*j;q(JBdlnwu&nm1JgtYV)U8Az zu5PZlt^=<~uavLguQsrZu-C96v2n4vu>`VIvZS)_vO2Sbv(B>`v}UxjwEnb8wU)Ku bwJNr9wz{?gw@SAF0RI4!p$ZqX;|T>W%)iO< delta 385 zcmV-{0e=4GZ|H9lAr1i%0DuA7H|?;)0D$xDSM`w&Edi2|JXr+s?MM5Om1+ac0D`j$ z0e%O6yom>jOp1|;-HIuTbc?@>2#isTmW*knwaL8Etzzg!kG}7SDK!h=$bN{dYi(3n+lv#oSmHLoHLz%oynaNo?f1=p8B3h zpOK&4pDmzypvRyPpJUO0Sl$;;%Tcj{{R4!VHFm$;RyvU5(~>f diff --git a/Source/Images/Test/z80mptr.com b/Source/Images/Test/z80mptr.com index 25eb3c89671c3bdab8a556a19a137ac07d57c470..8edc2d16607fb4d30c17b9e2885b5254783d85d5 100644 GIT binary patch delta 381 zcmV-@0fPSMZ{}|fAr1i%0DuA5H|?;)0DzGaF9D2^LRpcYY76u2SM|*Rg7NJ~`?CxI zd7-|!lVeLQ>C7z=cO&CbEdkc z0jExh0ZmPGc{i;T*j;q(JBdlnwu&nm1JgtYV)U8Az zu5PZlt^=<~uavLguQsrZu-C96v2n4vu>`VIvZS)_vO2Sbv(B>`v}UxjwEnb8wU)Ku bwJNr9wz{?gw@SAF0RI4!p$ZqX;|T>W*Xhan delta 385 zcmV-{0e=4GZ|H9lAr1i%0DuA7H|?;)0D$xDSM`w&F9DR1K3N3u?MM5Omudse0D`j& z0elC4yom>jOp1|;-HIuTbc?@>2#isTmW*knwaL8Etzzg!kG}7SDK!h=$bN{dYi(3n+lv#oSmHLoHLz%oynaNo?f1=p8B3h zpOK&4pDmzypvRyPpJUO0Sl$;;%Tcj{{R4!VHFm$;RyvU9V^R7

`ZsKe7GfYsNFXaAgU21iSCY;B0IMiV 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 OAFep_%!_wkQvCn1)Dd(5 diff --git a/ReadMe.md b/ReadMe.md index ab035b5b..0d5586a4 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.5 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -03 Apr 2024 +16 Apr 2024 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index c47f3d10..c2c52345 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -03 Apr 2024 +16 Apr 2024 diff --git a/Source/Apps/Tune/tune.asm b/Source/Apps/Tune/tune.asm index 19f9334c..85938037 100644 --- a/Source/Apps/Tune/tune.asm +++ b/Source/Apps/Tune/tune.asm @@ -47,6 +47,8 @@ ; 2022-03-20 [DDW] Add support for MBC PSG module ; 2023-03-30 [WBW] Fix for quark delay adjustment being trashed ; 2024-02-23 [WBW] Include ACR value in config table +; 2024-04-16 [WBW] Add support for NABU AY-3-8910 +; ;_______________________________________________________________________________ ; ; ToDo: @@ -632,6 +634,9 @@ CFGSIZ .EQU $ - CFGTBL ; .DB 17, $A4, $A5, $A4, $FF, $A6, $FE ; DUODYNE .DW HWSTR_DUO +; + .DB 22, $41, $40, $40, $FF, $FF, $FF ; NABU + .DW HWSTR_NABU ; .DB $FF ; END OF TABLE MARKER ; @@ -661,7 +666,7 @@ TMP .DB 0 ; work around use of undocumented Z80 HBIOSMD .DB 0 ; NON-ZERO IF USING HBIOS SOUND DRIVER, ZERO OTHERWISE OCTAVEADJ .DB 0 ; AMOUNT TO ADJUST OCTAVE UP OR DOWN -MSGBAN .DB "Tune Player for RomWBW v3.6, 23-Feb-2024",0 +MSGBAN .DB "Tune Player for RomWBW v3.7, 16-Apr-2024",0 MSGUSE .DB "Copyright (C) 2024, Wayne Warthen, GNU GPL v3",13,10 .DB "PTxPlayer Copyright (C) 2004-2007 S.V.Bulba",13,10 .DB "MYMPlay by Marq/Lieves!Tuore",13,10,13,10 @@ -687,6 +692,7 @@ HWSTR_RCMF .DB "RCBus Sound Module (MF)",0 HWSTR_LINC .DB "Z50 LiNC Sound Module",0 HWSTR_MBC .DB "NHYODYNE Sound Module",0 HWSTR_DUO .DB "DUODYNE Sound Module",0 +HWSTR_NABU .DB "NABU Onboard Sound",0 MSGUNSUP .db "MYM files not supported with HBIOS yet!\r\n", 0 diff --git a/Source/Doc/UserGuide.md b/Source/Doc/UserGuide.md index 21084d99..8ce4404c 100644 --- a/Source/Doc/UserGuide.md +++ b/Source/Doc/UserGuide.md @@ -263,6 +263,7 @@ is discussed in [Customizing RomWBW]. | [Duodyne Z80 System]^1^ | Duo | DUO_std.rom | 38400 | | [Heath H8 Z80 System]^10^ | H8 | HEATH_std.rom | 115200 | | [EP Mini-ITX Z180]^11^ | RCBus? | EPITX_std.rom | 115200 | +| [NABU w/ RomWBW Option Board]^10^ | NABU | NABU_std.rom | 115200 | | ^1^Designed by Andrew Lynch | ^2^Designed by Sergey Kiselev @@ -5820,6 +5821,36 @@ S- MD: TYPE=RAM `\clearpage`{=latex} +### NABU w/ RomWBW Option Board + +#### ROM Image File: NABU_std.rom + +| | | +|-------------------|---------------| +| Default CPU Speed | 3.580 MHz | +| Interrupts | Mode 1 | +| System Timer | None | +| Serial Default | 115200 Baud | +| Memory Manager | Z2 | +| ROM Size | 512 KB | +| RAM Size | 512 KB | + +##### Supported Hardware (see [Appendix B - Device Summary]): + +- UART: MODE=NABU, IO=72 +- TMS: MODE=NABU, IO=160 +- MD: TYPE=RAM +- MD: TYPE=ROM +- PPIDE: IO=96, MASTER +- PPIDE: IO=96, SLAVE +- AY38910: MODE=NABU, IO=65, CLOCK=1789772 HZ + +##### Notes: + +- TMS video assumes F18A replacement for TMS9918 + +`\clearpage`{=latex} + ## Appendix B - Device Summary The table below briefly describes each of the possible devices that diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index ef862852..3ac3c555 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -241,6 +241,7 @@ call Build S100 std || exit /b call Build DUO std || exit /b call Build HEATH std || exit /b call Build EPITX std || exit /b +call Build NABU std || exit /b :: call Build MON std || exit /b goto :eof diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index 4f2a4a31..892640d0 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -50,6 +50,7 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then ROM_PLATFORM="ZETA2"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="HEATH"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="EPITX"; ROM_CONFIG="std"; bash Build.sh + ROM_PLATFORM="NABU"; ROM_CONFIG="std"; bash Build.sh # ROM_PLATFORM="MON"; ROM_CONFIG="std"; bash Build.sh exit fi diff --git a/Source/HBIOS/Config/NABU_std.asm b/Source/HBIOS/Config/NABU_std.asm index f2bba624..25eca916 100644 --- a/Source/HBIOS/Config/NABU_std.asm +++ b/Source/HBIOS/Config/NABU_std.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; RCBUS Z80 STANDARD CONFIGURATION +; NABU Z80 STANDARD CONFIGURATION ;================================================================================================== ; ; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE @@ -27,3 +27,5 @@ #include "cfg_nabu.asm" ; CPUOSC .SET 3580000 ; CPU OSC FREQ IN MHZ +; +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP diff --git a/Source/HBIOS/ay38910.asm b/Source/HBIOS/ay38910.asm index 01ab9c80..e5ce2493 100644 --- a/Source/HBIOS/ay38910.asm +++ b/Source/HBIOS/ay38910.asm @@ -54,17 +54,10 @@ AY_RIN .EQU AY_RSEL+AY_RCSND #ENDIF ; #IF (AYMODE == AYMODE_MSX) - #IF (PLATFORM == PLT_NABU) -AY_RSEL .EQU $40 -AY_RDAT .EQU $41 -AY_RIN .EQU AY_RSEL - .ECHO "NABU" - #ELSE AY_RSEL .EQU $A0 AY_RDAT .EQU $A1 AY_RIN .EQU $A2 .ECHO "MSX" - #ENDIF #ENDIF ; #IF (AYMODE == AYMODE_LINC) @@ -89,6 +82,13 @@ AY_RIN .EQU AY_RSEL AY_ACR .EQU $A6 .ECHO "DUO" #ENDIF +; +#IF (AYMODE == AYMODE_NABU) +AY_RSEL .EQU $41 +AY_RDAT .EQU $40 +AY_RIN .EQU $40 + .ECHO "NABU" +#ENDIF ; .ECHO ", IO=" .ECHO AY_RSEL diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 3ec2732d..b6f7ac72 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -139,6 +139,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU TRUE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -168,7 +169,7 @@ CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_DUO ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_DUO ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -312,7 +313,7 @@ SNMODE .EQU SNMODE_DUO ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM|DUO] ; AY38910ENABLE .EQU TRUE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_DUO ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_DUO ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 6656ea5f..bf17b009 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -186,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -291,7 +292,7 @@ SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index 5d90150d..e4e6de0d 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -149,6 +149,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -188,7 +189,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -323,7 +324,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 00d163db..47cd275f 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -191,7 +192,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -316,7 +317,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; 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 b46f54b9..41f39735 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -177,6 +177,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -236,7 +237,7 @@ GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH] GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA] TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -383,7 +384,7 @@ SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 2bcd96fc..f966d1ae 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -136,6 +136,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU TRUE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -165,7 +166,7 @@ CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MBC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -299,7 +300,7 @@ SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_MBC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_MBC ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU TRUE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 7af0fbd0..a101e728 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -141,6 +141,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -175,7 +176,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -295,7 +296,7 @@ SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index 1da15079..3439482b 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -142,6 +142,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -186,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -321,7 +322,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; 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 aa5ac163..75e3b810 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -143,6 +143,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -177,7 +178,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -288,7 +289,7 @@ SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index 3fe1500a..7a04ee47 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -1,6 +1,6 @@ ; ;================================================================================================== -; ROMWBW 3.X CONFIGURATION DEFAULTS FOR RCBUS Z80 +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR NABU Z80 W/ OPTION BOARD ;================================================================================================== ; ; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM @@ -11,7 +11,7 @@ ; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS ; FOR THE PLATFORM. ; -#DEFINE PLATFORM_NAME "RCBus", " [", CONFIG, "]" +#DEFINE PLATFORM_NAME "NABU Personal Computer", " [", CONFIG, "]" ; #INCLUDE "hbios.inc" ; @@ -20,7 +20,7 @@ CPUFAM .EQU CPU_Z80 ; CPU FAMILY: CPU_[Z80|Z180|Z280] BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) -USELZSA2 .EQU FALSE ; ENABLE FONT COMPRESSION +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) ; BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU TRUE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -191,7 +192,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX9958 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_NABU ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -326,7 +327,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU TRUE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_MSX ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_NABU ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; 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 d101a777..5f346d2b 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -153,6 +153,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -192,7 +193,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index dbd5c5e1..3b435716 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -196,7 +197,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -331,7 +332,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; 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 4979501c..d69845e1 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -191,7 +192,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -326,7 +327,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index cf81334f..c6a91923 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -141,6 +141,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -166,7 +167,7 @@ GDCENABLE .EQU TRUE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH] GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA] TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -277,7 +278,7 @@ SNMODE .EQU SNMODE_NONE ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_N8 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index ed5e3feb..93fa49a0 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -186,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -311,7 +312,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; 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 fcb8b975..980f67cc 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -136,6 +136,7 @@ UARTMFP .EQU TRUE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU TRUE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -165,7 +166,7 @@ CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] 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] @@ -277,7 +278,7 @@ SNMODE .EQU SNMODE_VGM ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_SCG ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; 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 f98705cf..49478897 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -147,6 +147,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU TRUE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 @@ -186,7 +187,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -321,7 +322,7 @@ SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] ; AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD -AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO] +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] ; SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) ; diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index d3176ae0..548294b8 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -134,6 +134,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -168,7 +169,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 0231e647..459b8cff 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -123,6 +123,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -138,7 +139,7 @@ VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 4369f1b4..a1ca5524 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -134,6 +134,7 @@ UARTMFP .EQU FALSE ; UART: AUTO-DETECT MF/PIC UART UART4 .EQU FALSE ; UART: AUTO-DETECT 4UART UART UARTRC .EQU FALSE ; UART: AUTO-DETECT RC UART UARTDUAL .EQU FALSE ; UART: AUTO-DETECT DUAL UART +UARTNABU .EQU FALSE ; UART: AUTO-DETECT NABU UART ; ASCIENABLE .EQU FALSE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) ; @@ -149,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) GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO|DUO|NABU] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 86b4b0b9..9aa76cc8 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -6324,13 +6324,6 @@ SIZ_NABU .EQU $ - ORG_NABU .ECHO "NABU occupies " .ECHO SIZ_NABU .ECHO " bytes.\n" -; -ORG_KBD .EQU $ - #INCLUDE "nabukb.asm" -SIZ_KBD .EQU $ - ORG_KBD - .ECHO "NABUKB occupies " - .ECHO SIZ_KBD - .ECHO " bytes.\n" #ENDIF ; #IF (DSRTCENABLE) @@ -6657,6 +6650,15 @@ SIZ_MKY .EQU $ - ORG_MKY .ECHO " bytes.\n" #ENDIF ; +#IF (NABUKBENABLE) +ORG_NABUKB .EQU $ + #INCLUDE "nabukb.asm" +SIZ_NABUKB .EQU $ - ORG_NABUKB + .ECHO "NABUKB occupies " + .ECHO SIZ_NABUKB + .ECHO " bytes.\n" +#ENDIF +; #IF (PRPENABLE) ORG_PRP .EQU $ #INCLUDE "prp.asm" diff --git a/Source/HBIOS/nabu.asm b/Source/HBIOS/nabu.asm index f6453323..212d0f35 100644 --- a/Source/HBIOS/nabu.asm +++ b/Source/HBIOS/nabu.asm @@ -15,7 +15,7 @@ NABU_PREINIT: ; NABU_INIT: CALL NEWLINE ; FORMATTING - PRTS("NABU INT1$") + PRTS("NABU: INT1$") XOR A OUT (NABU_INT1CLR),A RET ; DONE @@ -24,21 +24,21 @@ NABU_INIT: ; NABU_STAT: XOR A - OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT - LD HL,(NABU_TICCNT) - INC HL + OUT (NABU_INT1CLR),A ; CLEAR THE INTERRUPT + LD HL,(NABU_TICCNT) ; INCREMENT NABU TICK COUNTER + INC HL ; ... IN HBIOS PROXY LD (NABU_TICCNT),HL - LD A,(NABU_HBTICK) + LD A,(NABU_HBTICK) ; INCREMENT INTERNAL TICK CTR INC A LD (NABU_HBTICK),A CP $0A ; CALL HB_TICK EVERY 10 INTERRUPTS (50HZ) RET NZ ; NOT TIME THEN JUST RETURN - CALL HB_TICK + CALL HB_TICK ; DO NORMAL HBIOS TICK XOR A LD (NABU_HBTICK),A ; RESET HBTICK COUNTER INC A ; INTERRUPT HANDLED RET ; NABU_HBTICK: - .DB 0 + .DB 0 ; INTERNAL TICK CTR ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 49d9f6d8..843195f4 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -22,6 +22,8 @@ ; 18. HEATH Les Bird's Heath Z80 Board ; 19. EPITX Alan Cox' Mini-ITX System ; 20. MON Jacques Pelletier's Monsputer +; 21. STDZ180 Genesis Z180 System +; 22. NABU NABU w/ Les Bird's RomWBW Option Board ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; @@ -216,6 +218,7 @@ AYMODE_MSX .EQU 5 ; RCBUS SOUND MODULE REV6 BY ED BRINDLEY ON Z80/Z180 AT MSX P AYMODE_LINC .EQU 6 ; LINC Z50 AY SOUND CARD AYMODE_MBC .EQU 7 ; MBC SOUND BOARD AYMODE_DUO .EQU 8 ; MBC SOUND BOARD +AYMODE_NABU .EQU 9 ; NABU BUILT-IN SOUND ; ; SN SOUND CHIP MODE SELECTIONS ; @@ -234,7 +237,8 @@ TMSMODE_MSX9958 .EQU 4 ; MSX PORTS, V9958 CHIP TMSMODE_MSXKBD .EQU 5 ; MSX PORTS + PS2 KEYBOARD TMSMODE_MBC .EQU 6 ; MBC V9938/58 VIDEO BOARD TMSMODE_COLECO .EQU 7 ; COLECOVISION PORT MAPPING -TMSMODE_DUO .EQU 8 ; COLECOVISION PORT MAPPING +TMSMODE_DUO .EQU 8 ; DUODYNE PORT MAPPING +TMSMODE_NABU .EQU 9 ; NABU V9958 + NABU KBD ; ; CVDU VIDEO MODE SELECTIONS ; @@ -469,6 +473,7 @@ TERMENABLE .EQU FALSE ; TERM PSEUDO DEVICE, WILL AUTO-ENABLE IF A VDA IS ENABLE ; KBDENABLE .EQU FALSE ; PS/2 KEYBOARD DRIVER PPKENABLE .EQU FALSE ; PPK KEYBOARD DRIVER +NABUKBENABLE .EQU FALSE ; NABU KEYBOARD DRIVER ; ; VIDEO MODES ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 1614ea70..f1f11687 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -46,17 +46,12 @@ TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT .ECHO "TMS: MODE=" ; #IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958)) - #IF (PLATFORM == PLT_NABU) -TMS_DATREG .EQU $A0 ; READ/WRITE DATA -TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL - #ELSE TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL - #ENDIF -TMS_PPIA .EQU 0 ; PPI PORT A -TMS_PPIB .EQU 0 ; PPI PORT B -TMS_PPIC .EQU 0 ; PPI PORT C -TMS_PPIX .EQU 0 ; PPI CONTROL PORT +;TMS_PPIA .EQU 0 ; PPI PORT A +;TMS_PPIB .EQU 0 ; PPI PORT B +;TMS_PPIC .EQU 0 ; PPI PORT C +;TMS_PPIX .EQU 0 ; PPI CONTROL PORT ; #IF (TMSMODE == TMSMODE_MSX) .ECHO "MSX" @@ -69,10 +64,10 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT #IF (TMSMODE == TMSMODE_COLECO) TMS_DATREG .EQU $BE ; READ/WRITE DATA TMS_CMDREG .EQU $BF ; READ STATUS / WRITE REG SEL -TMS_PPIA .EQU 0 ; PPI PORT A -TMS_PPIB .EQU 0 ; PPI PORT B -TMS_PPIC .EQU 0 ; PPI PORT C -TMS_PPIX .EQU 0 ; PPI CONTROL PORT +;TMS_PPIA .EQU 0 ; PPI PORT A +;TMS_PPIB .EQU 0 ; PPI PORT B +;TMS_PPIC .EQU 0 ; PPI PORT C +;TMS_PPIX .EQU 0 ; PPI CONTROL PORT .ECHO "COLECO" #ENDIF ; @@ -98,10 +93,10 @@ TMS_PPIX .EQU $87 ; PPI CONTROL PORT TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER -TMS_PPIA .EQU 0 ; PPI PORT A -TMS_PPIB .EQU 0 ; PPI PORT B -TMS_PPIC .EQU 0 ; PPI PORT C -TMS_PPIX .EQU 0 ; PPI CONTROL PORT +;TMS_PPIA .EQU 0 ; PPI PORT A +;TMS_PPIB .EQU 0 ; PPI PORT B +;TMS_PPIC .EQU 0 ; PPI PORT C +;TMS_PPIX .EQU 0 ; PPI CONTROL PORT .ECHO "SCG" #ENDIF ; @@ -109,10 +104,10 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $9C ; AUX CONTROL REGISTER -TMS_PPIA .EQU 0 ; PPI PORT A -TMS_PPIB .EQU 0 ; PPI PORT B -TMS_PPIC .EQU 0 ; PPI PORT C -TMS_PPIX .EQU 0 ; PPI CONTROL PORT +;TMS_PPIA .EQU 0 ; PPI PORT A +;TMS_PPIB .EQU 0 ; PPI PORT B +;TMS_PPIC .EQU 0 ; PPI PORT C +;TMS_PPIX .EQU 0 ; PPI CONTROL PORT TMS_KBDDATA .EQU $E2 ; KBD CTLR DATA PORT TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT .ECHO "MBC" @@ -122,14 +117,20 @@ TMS_KBDST .EQU $E3 ; KBD CTLR STATUS/CMD PORT TMS_DATREG .EQU $A0 ; READ/WRITE DATA TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL TMS_ACR .EQU $A6 ; AUX CONTROL REGISTER -TMS_PPIA .EQU 0 ; PPI PORT A -TMS_PPIB .EQU 0 ; PPI PORT B -TMS_PPIC .EQU 0 ; PPI PORT C -TMS_PPIX .EQU 0 ; PPI CONTROL PORT +;TMS_PPIA .EQU 0 ; PPI PORT A +;TMS_PPIB .EQU 0 ; PPI PORT B +;TMS_PPIC .EQU 0 ; PPI PORT C +;TMS_PPIX .EQU 0 ; PPI CONTROL PORT TMS_KBDDATA .EQU $4C ; KBD CTLR DATA PORT TMS_KBDST .EQU $4D ; KBD CTLR STATUS/CMD PORT .ECHO "DUO" #ENDIF +; +#IF (TMSMODE == TMSMODE_NABU) +TMS_DATREG .EQU $A0 ; READ/WRITE DATA +TMS_CMDREG .EQU $A1 ; READ STATUS / WRITE REG SEL + .ECHO "NABU" +#ENDIF ; .ECHO ", IO=" .ECHO TMS_DATREG @@ -140,7 +141,7 @@ TMS_KBDST .EQU $4D ; KBD CTLR STATUS/CMD PORT ; TMS_ROWS .EQU 24 ; -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA TMS_FNTSIZE .EQU 8*256 ; ### JLC Mod for JBL compatibility ### = 8x8 Font 256 Chars TMS_CHRVADDR .EQU $0000 ; VRAM ADDRESS OF CHAR SCREEN DATA (NEW CONSTANT) = REG2 * $400 @@ -167,6 +168,10 @@ PPKENABLE .SET TRUE ; INCLUDE PPK KEYBOARD SUPPORT KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT #ENDIF ; +#IF (TMSMODE == TMSMODE_NABU) +NABUKBENABLE .SET TRUE ; INCLUDE NABU KEYBOARD SUPPORT +#ENDIF +; ; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918/V9958 ACCESSES ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; @@ -176,7 +181,7 @@ KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT ;#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP ; 20 W/S ### JLC Mod for Clock/2 (9 MHz) ### #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ - #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) + #IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) #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 @@ -239,6 +244,9 @@ TMS_INIT: #IF (TMSMODE == TMSMODE_MSX9958) PRTS("RC_V9958$") #ENDIF +#IF (TMSMODE == TMSMODE_NABU) + PRTS("NABU$") +#ENDIF ; PRTS(" IO=0x$") LD A,TMS_DATREG @@ -264,8 +272,8 @@ TMS_INIT1: #IF MKYENABLE CALL MKY_INIT ; INITIALIZE MKY KEYBOARD DRIVER #ENDIF -#IF (PLATFORM == PLT_NABU) - CALL NABUKB_INIT +#IF (TMSMODE == TMSMODE_NABU) + CALL NABUKB_INIT ; INITIALIZE NABU KEYBOARD DRIVER #ENDIF #IF (INTMODE == 1 & TMSTIMENABLE) @@ -315,28 +323,26 @@ TMS_FNTBL: .DW PPK_STAT .DW PPK_FLUSH .DW PPK_READ -#ELSE - #IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) +#ENDIF +#IF ((TMSMODE == TMSMODE_MSXKBD) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) .DW KBD_STAT .DW KBD_FLUSH .DW KBD_READ - #ELSE - #IF MKYENABLE - .DW MKY_STAT - .DW MKY_FLUSH - .DW MKY_READ - - #ELSE - #IF (PLATFORM == PLT_NABU) +#ENDIF +#IF (TMSMODE == TMSMODE_NABU) .DW NABUKB_STAT .DW NABUKB_FLUSH .DW NABUKB_READ - #ELSE +#ENDIF +#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_SCG) | (TMSMODE == TMSMODE_COLECO)) + #IF MKYENABLE + .DW MKY_STAT + .DW MKY_FLUSH + .DW MKY_READ + #ELSE .DW TMS_STAT .DW TMS_FLUSH .DW TMS_READ - #ENDIF - #ENDIF #ENDIF #ENDIF .DW TMS_VDARDC @@ -551,7 +557,7 @@ TMS_SET: ;---------------------------------------------------------------------- ; TMS_WR: -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) ; CLEAR R#14 FOR V9958 XOR A OUT (TMS_CMDREG), A @@ -647,7 +653,7 @@ TMS_CRTINIT2: DJNZ TMS_CRTINIT2 ; LOOP ; ; ENABLE WAIT SIGNAL IF 9938/58 -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) LD C,25 ; REGISTER 25 LD A,%00000100 ; ONLY WTE BIT SET CALL TMS_SET ; DO IT @@ -1083,7 +1089,7 @@ TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0 ;================================================================================================== ; TMS_IDAT: -#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_N8) | (TMSMODE == TMSMODE_SCG)) +#IF ((TMSMODE == TMSMODE_N8)) .DB TMS_PPIA ; PPI PORT A .DB TMS_PPIB ; PPI PORT B .DB TMS_PPIC ; PPI PORT C @@ -1095,6 +1101,9 @@ TMS_IDAT: .DB TMS_KBDDATA ; 8242 DATA PORT .DB 0 ; FILLER #ENDIF +#IF ((TMSMODE == TMSMODE_MSX) | (TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_SCG) | (TMSMODE == TMSMODE_COLECO) | (TMSMODE == TMSMODE_NABU)) + .FILL 4,0 ; DUMMY KEYBOARD CONFIG DATA +#ENDIF ; .DB TMS_DATREG .DB TMS_CMDREG @@ -1141,7 +1150,7 @@ TMS_IDAT: ; 5S Fifth sprite (not displayed) detected. Value in FS* is valid. ; INT Set at each screen update, used for interrupts. ; -#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO)) +#IF ((TMSMODE == TMSMODE_MSX9958) | (TMSMODE == TMSMODE_MBC) | (TMSMODE == TMSMODE_DUO) | (TMSMODE == TMSMODE_NABU)) ; ; NOTE: YAMAHA 9938/58 DOCUMENTATION SAYS R3 IS SAME AS 9918 (ADR >> 10), ; BUT THIS SEEMS TO BE WRONG AND CORRECTLY DOCUMENTED AT diff --git a/Source/HBIOS/uart.asm b/Source/HBIOS/uart.asm index 3d685d34..737f0c56 100644 --- a/Source/HBIOS/uart.asm +++ b/Source/HBIOS/uart.asm @@ -1185,14 +1185,17 @@ UART_CFG_MFP: .ECHO "\n" ; #ENDIF -; -#IF (PLATFORM == PLT_NABU) +#IF (UARTNABU) .DB 0 ; DEVICE NUMBER (UPDATED DURING INIT) .DB 0 ; UART TYPE .DB UARTNBASE ; IO PORT BASE (RBR, THR) .DB UARTNBASE + UART_LSR ; LINE STATUS PORT (LSR) .DW UARTCFG ; LINE CONFIGURATION .DW 0 ; SHOULD NEVER NEED INT HANDLER +; + .ECHO "UART: MODE=NABU, IO=" + .ECHO UARTNBASE + .ECHO "\n" #ENDIF ; UART_CNT .EQU ($ - UART_CFG) / 8 diff --git a/Source/ver.inc b/Source/ver.inc index e5d42087..707b5da9 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.27" +#DEFINE BIOSVER "3.5.0-dev.28" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 6aa41d89..d7fbd3f7 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.27" + db "3.5.0-dev.28" endm From 47120dcf8cedcaa17579398d082d0059bc5c9115 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 17 Apr 2024 14:47:55 -0700 Subject: [PATCH 05/20] Doc Updates - Various edits to address feedback from Andrew Kendall. --- Doc/RomWBW Applications.pdf | Bin 239627 -> 239626 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123893 -> 123890 bytes Doc/RomWBW Errata.pdf | Bin 28926 -> 28739 bytes Doc/RomWBW ROM Applications.pdf | Bin 155012 -> 156004 bytes Doc/RomWBW System Guide.pdf | Bin 567603 -> 567601 bytes Doc/RomWBW User Guide.pdf | Bin 796647 -> 800280 bytes ReadMe.md | 4 +- ReadMe.txt | 4 +- Source/Doc/ROM_Applications.md | 50 +++++++++------- Source/Doc/ReadMe.md | 2 + Source/Doc/UserGuide.md | 102 ++++++++++++++++++++------------ 11 files changed, 99 insertions(+), 63 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index c836c7c56cac053c6d1de50dca92cbcb36f7ecbe..d10f8d341421540859ec39779d670fb6a4710931 100644 GIT binary patch delta 14715 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 delta 4777 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 delta 8807 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 diff --git a/Doc/RomWBW ROM Applications.pdf b/Doc/RomWBW ROM Applications.pdf index 5a0b6dcbb4efe3d89030f84062668ad4c092a7aa..ba8603398f51544fd772f55e5298d75e0a9229bb 100644 GIT binary patch delta 60777 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 L`udJuPE!8|RLJJ~ delta 60252 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 diff --git a/Doc/RomWBW System Guide.pdf b/Doc/RomWBW System Guide.pdf index f4a46d0b9d8c050c704cb6eef833fe5a1980e6ec..12cfa0343ebdddc7c2193fc42538f767c3a9443a 100644 GIT binary patch delta 20674 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 delta 23619 zcmai+ebA?6RmTUAc-oP~Kn2oV7?77p?)R4#5tdyd2w2KNqF^Fg2HI&=Ktyr4GbF~C zi5EA2h^VYE1S3tY#6Uwai!&6+9~R&gQxT;`ftHpNCCc_WzqjYUzTamiW}eYGd!6g$ zT<1D3-*fKYuBQ)w;OWC}-o95k$?x3nO~duS_|*2lJL&a*_VQ2t&pwx&_Rc?j!|nqP zIP$W;dj9->J@jt}C+AenrKg|q@9%$N=Z`-Bu@^pg=Z3GocE;}A z?>M->Zr{ycdHwqy`lnZRpZ40WPhEcX_Q$S$;O!@T^wIo;J%>K}{SWPb!MV>qwbxa* z-*Cg(_nma~X^$Q8> zEgwJRz-wN+?~`9R_~%bP;;`o~y!*Gey?EI*?d=ckeeG9v+3UC7^}QGW{EAoq`y+QAbMKDbzxvw+m(z8!~ZqH@MzO-Tc?tgydu1D^8=80X;e`(hVzwyAg?mg}& z{`SRPN8Nwug&VH_gR@RK@zAs0dD{i&{>_^|@xRx0d-l4je(9bw|8URk58q!t__2GDhrieHw=aJ`!ry)mZPp}! ze>!WA%Ce)5S%3VQ@B8&l7hSn^{n49#rpSsatMd7f$!%w@?EHm3U!TQ)>$k68H~l|Z z)>gIBiYzaTmiLv>sxF({c-G2ML+Afg$nd(zyQ)ve)p?P%rO>jhEHa@L1$#ttgFd6XRjPMG+Cqb)@^N5)O{v<&oWp|Oihv7Qcc;)dEl*!>9}Eh z7fsXoz^=4|H+?62D^G_ zd|+ERt!wR?`mA(X-YYFH^GZ}K%ldMz5yR*y)Ol$Gi@LXa=jv2H%DQj#N~$8Obu(4n zrB@vCulimW&dVmNMGDaJT=XNa@~j`zSC)ON^OaS$xTaz8a*MLEr&E+I8kg=GTAzz#(6*-5MXJ2DO;@cx;~^_* z2Fg7_>(ty8b&U~7HbU=#MHt#Qe6VlKI`my=hOJGRn%EtL$q;?D(k?&uC{>zFVYsi2&UC}8x{!@yJ}}b-Ilar?uT;}-R_AEI<2VG(BM}y zlU7$ZPHPKM^lZqxt~2rXnV+OD%me1Vd$yu1*Wj)7853c&;d7?)Uy46N`F%5WDK-FR z^NKvrRyT<8E;^9{w6U~?X&6*AMWs@J)?~67j9#rFRMGUkdP>fgb+YL=uRi0V9hgrS z!5jCwYYdl9$d%Y4eW^B}XnPDps)R*{0grV<{tNL#EKLesQJWMxWTTr#i#ky*q7U-0*p zqO6lRU?%^vX+=R8*lAD#tyix|j*(lGQ&b!}JqY8fR-IT;H3!+-E~<8N%lSm+eXYh1 zx4ek>7ed2*7v>gL3VjuKT!P{D5fPI*S7o(fW!V;K(@aT4+rnC^DXljk*n6K3s z23nV_F}s;I^IK@KyDHtbtnI{Y?YGc2=BZJWO5Q+LbZDlXxXU%lVxT2!&?>c6&>Hhw zxKK;JijMa@J=`cVFSruZCoF-O0^U8LuSkZ_RZRxtEL_YAc9X0T@+X^U#S+8pDM3+M zyi!Kmp{AfDDsoz*0diT^Wi!aa5G!?N1k!k#^u%RV)#?JEHR=LNf?<6nxbAGBN6W|@ zV%~~!l|+H+%t)y!+YBLdDps<4oQJ-MvT4YJl7n2vKr-x<7&OA2WMD=RlIc4x+Y(c( zO*5;^TRycR^I@;i^n%IH{r#_jKt~eN-CbIUK2FCCPb(i4)e8XhJ*Yo zfB@ei(2QF9vL**kuY{8j(kYGCXQJ+E^C-CbhV!EVtI-HAEjQ~7uwc%Xv^_mZDAHQ@ z-ho8Q8dXm0JfkhmO;**t-DgE`FQVqv4ez0I!keQu%^IOS6V_y?At03fC(>axsseaw%iKzLf?BvOsj4S-c}LWpe=3b z5(ud4&Xh2a57`VBmk3=Y(>T^vH~4-VM}(Hr2Ea0M)|41D^?6zC@lQ^CuBa6>L#Uv& zjW}RJN@6bo0)nVs8T<|0D%~ImTBmjau@WNKxL%)Z;CZW?`NvB50Gp-inVZ zHIV=svhX{vvPP|L>|OPfajn`aXoki>o9Cz_9~DG9I5?FW#0Y{^;h|Yr#X-m}L}(bv zZcGaw6-ef))aF8~+Cs75SlA?v^|D6=x}bP7$SB*9&5(N>Z7NZbK={C7ve%{D7JgUf zD04Mqv6dz#1xT0L-k@oQmp53&v4BE8q!zPF7~d8|U4((9zAb2tCezS*JtLO4G|V&? zI3jL~UDsL)2xj#JSUa-cR9e)0daX^ti+j*JJQqvTCeprK#6W<+D4B6 zq9stE90n-_qM=0}Xsu!{u}CU$1WsU=ywdl^BdCaT^mLF6j)K{qJ&}sKPY{xJ^4PYp zFzOHZC#(HHGf*42Gn^iqTMddLv{rZpw`!$9c;|lW=f=zk$RT@3*e zN{k1_IJ}dpcAEhO*fL++ijf*CG&mwsiDf`LR@H$kA2W{|oXlt~u> zMOG_HiBBP%SVK2BP=^5kk_n0GmPz8gSPV!@^NWqMbUcbZYs_aLE#o3g2>Um(%RT9l z-aE=_Q5Zn5LXjk3t}~>oYs^RPy*S9c77IFTQ935G)7+0LQ=?!5G$zY)vA!t zN;N)g+G?>;G*sgQ%}S@xX384+zo=`GAz3*a+M;b~G%g;ah@YlFjeMq~<2ia&g+YBf=q1|@is)?NwjQ%x}A#+p8DI-o+-CQ2Cche&WH_sI@T(+M3- z(BmNT9I4`TPo3uB6f`=;2BIdY@pP2`ay9y_ zrRWMJL4O`VmnZ31@xRi15^8fmmRs(nW3p8 zUb6}N1gHoF2IY4N63*+Z1JTzM5Qw@S6q8~?_Yt&Jnf+iw%^!hL{OYL7X#~x}3qWCH zKdA33xE7UTt$;wYa&Aq`ss$~o$>2I7L88vI7>4{yTC>eZaFW#^a~=($9h#oOOJL`V zBp5+lQ%nDk>IYC+J1isF`67|bsO(S5E>cqSox;bi7>%$i)hJ&hVrdJbK!P)R+R#~UV}DhQ+CNow6tE* ziKvi%z~C0al4n?Cgn2h@?rCbD9b{ykz!A-(LNjkn`fOennlD1HiRv~fVw#qPbt2C; zt3#@+U|=4F6$5>Ik-o zK{JfwGXNXMs}ppKMGP*(^#N}wGpo{-)I|$gt!XPcsEhv0fV9fNBIZdrN zyok`oS<@xsDqUlMnD)LR{-D_+G#jd20Nw^=vW1r)pe@WY z^6VH$3?K`Wi7Jvs;%$i|y!5^pZ*9sNz!(ZVmH+adq6DH^jRn?JnT4$|3eCWVplQ5M zdmiQVOSVGl)uq};-ux}KVb>SXhUTF>X$3%#SQD#~z6>PvP)9WS^h6xa#Pbfs^ zy^f3WbI>^dQvAqEOYi^>*6j+->H#cbPy*wuR3EfN7ef9Rm??Q0?>r+LDK(8$dN_EO9&j1|u|v8rZ9>A}lm;{3uBJ42>CZEoh`w`#hhTqlBJ8lY#lv} z1F%fTLF?3w1aFcT&+Hh8jxk3|PdXvYR60^xRbzIXm!;Ej@LKiF zP=Pbtx@hQyU*m51_}JxReF^XyI09`h@5zg|tn5G7C$lj?Q+jF=nLa%>Ykh8vqaQkz z0W|wiD0pWtCD8=rCjx|-ew=hdDos{Bh;jZzJMb9iO+tv7CeS`;3r9DDF^UknPL0U)lLmRjQJ2$LD8|j}FRO71#5J5E$c9YF zI6(MxgU}FHN@G=Pd5v+Y9wC3aS}5omv%TUNXVx%!oP1%v0!-(F*FNut#xIhXHx8J< zm_6Miv9s4sf@Nt0<1DA)G8Y-(GEU(OCZJYb82C>kI4UYy4}jOx1IC%F<>I8|L!L+n zjKv?({bf?Xy~$?arP`#MCMa=UEP6T)-l}gDr)v0m%9#y!3}y?iD9kA?9Unp})&Vb# z`SZ<8j=gPV-GJ9mHwT~9FW@tiz&NYuLF-iV@Y*l8Fpg?ltUES>9ADFlVAeo|o>Oxl z(8fP@Fhv_`kP1H>fyMaNrbdt^QGH!7TUm%j_#{K6g*O~e$eG}^wgVDO%QT=BgI^IJ z5ZfaB{D)l=DXTARCV@p9+$GzZ>;0+`WY^dzJ>42uC)4>IlWv)@#M#OQNtO9Mk?|VH zpM|X=5Ci>X@)dQ$Jmt-`oK941Q8hH$ImQc5d9zM`(2IfOtm!~#jUs=1jBho}80RJd zB^1d7@4^!=jUdd6J6WcafCC0o!|a}z@4wUs!E5zGc-0e=tT8Zo5)o;yQMH9xzPp%> zGrNPz_%m*;VTV#55Q`eY7MJbf0)vn%VVpi$CbXoVO%uZ!Z?^<|-#+j3B>1Ernhu1y zn0(-~5w2P`*LqQu;f~EQPR#>L8JrF;-{7aq$GDlkkBuZD@j`bN*b9w3ROFPIG+G21 zACGARDZEz4k8w$*Y-%Lww$+>gW-98oFs9CEb929nV!-Qp1i#~EbpgH*vx;UgTe`_j zo2#ITqIL;h$^g1Sq7sdpFmrR`JT{V`)uxN!!=__V?@AY8VS0K}8sGSNt)KWwmG)p;NMQh_E-x=@MZ9g>v+XVruiI`vWkUL{3Ylxsn z!TR~5Z()|+kKQlL)|3?kEv3d%tCqsMh5}*H6J^0F<7AV1ZoFTZJwJ^P&+H!g)X$Z` zgBQYXS3XuY<*WPyMRsVvSqIH(ZtR2}hg7LzoZdbiegL`YICvM&a`pYjK-C3k_VEwQ zyqR=D#?dxtH1hA12CvlXkUz|8SS;XFXXb0WbV7JN2ZpBDE(<%5M(<;3K@Q&+saJy8 ze)yDylgbim#6f5tmn#Y0Wm>T`Cfw#+F;{~eDkU0gz--NUECL>+QlL^|cT7dxu8B6e zbll0YYb)?z0QkKZTg0Pf9_M7|-Ix(;<6v3~IcNe0?~rNftTC9S^L}x7y#x?VG*gWj znGpa^Yr%nL?md2J!%%D*@JwSu?ru-j&T4wI_F{ zwMS6q3~;4b9?l%em diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 2213069e947735db9c6b340c7460e92ae8ada82f..8a24c3b68abfd16b5c475bd00d2570606359dbe3 100644 GIT binary patch delta 207922 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