mirror of https://github.com/wwarthen/RomWBW.git
38 changed files with 2924 additions and 12 deletions
@ -0,0 +1,33 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
set TOOLS=../../../Tools |
||||
|
set APPBIN=..\..\Binary\Apps |
||||
|
|
||||
|
set PATH=%TOOLS%\tasm32;%TOOLS%\zx;%PATH% |
||||
|
|
||||
|
set TASMTABS=%TOOLS%\tasm32 |
||||
|
|
||||
|
set ZXBINDIR=%TOOLS%/cpm/bin/ |
||||
|
set ZXLIBDIR=%TOOLS%/cpm/lib/ |
||||
|
set ZXINCDIR=%TOOLS%/cpm/include/ |
||||
|
|
||||
|
pushd DMAmon && call Build || exit /b & popd |
||||
|
pushd dskyng && call Build || exit /b & popd |
||||
|
pushd inttst && call Build || exit /b & popd |
||||
|
pushd ppidetst && call Build || exit /b & popd |
||||
|
pushd ramtest && call Build || exit /b & popd |
||||
|
|
||||
|
goto :eof |
||||
|
|
||||
|
:asm |
||||
|
echo. |
||||
|
echo Building %1... |
||||
|
tasm -t80 -g3 -fFF %1.asm %1.com %1.lst || exit /b |
||||
|
goto :eof |
||||
|
|
||||
|
:asm180 |
||||
|
echo. |
||||
|
echo Building %1... |
||||
|
tasm -t180 -g3 -fFF %1.asm %1.com %1.lst || exit /b |
||||
|
goto :eof |
||||
@ -0,0 +1,14 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
if exist *.bin del *.bin |
||||
|
if exist *.com del *.com |
||||
|
if exist *.lst del *.lst |
||||
|
if exist *.hex del *.hex |
||||
|
if exist *.prn del *.prn |
||||
|
|
||||
|
pushd DMAmon && call Clean || exit /b 1 & popd |
||||
|
pushd dskyng && call Clean || exit /b 1 & popd |
||||
|
pushd inttst && call Clean || exit /b 1 & popd |
||||
|
pushd ppidetst && call Clean || exit /b 1 & popd |
||||
|
pushd ramtest && call Clean || exit /b 1 & popd |
||||
@ -0,0 +1,11 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
set TOOLS=../../../../Tools |
||||
|
set PATH=%TOOLS%\tasm32;%PATH% |
||||
|
set TASMTABS=%TOOLS%\tasm32 |
||||
|
|
||||
|
tasm -t180 -g3 -fFF dmamon.asm dmamon.com dmamon.lst || exit /b |
||||
|
|
||||
|
copy /Y dmamon.com ..\..\..\..\Binary\Apps\ || exit /b |
||||
|
|
||||
@ -0,0 +1,6 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
if exist *.com del *.com |
||||
|
if exist *.lst del *.lst |
||||
|
if exist *.bin del *.bin |
||||
@ -0,0 +1,41 @@ |
|||||
|
; |
||||
|
;================================================================================================== |
||||
|
; MBC CONFIGURATION |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE |
||||
|
; CFG_<PLT>.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 <PLT>_XXX.ASM AND SPECIFY |
||||
|
; YOUR FILE IN THE BUILD PROCESS. |
||||
|
; |
||||
|
; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. |
||||
|
; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO |
||||
|
; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON |
||||
|
; SETTINGS. |
||||
|
; |
||||
|
; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, |
||||
|
; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING |
||||
|
; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! |
||||
|
; |
||||
|
; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO |
||||
|
; DIRECTORIES ABOVE THIS ONE). |
||||
|
; |
||||
|
#DEFINE PLATFORM_NAME "Multi Board Computer" |
||||
|
#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON <CR> OR AUTO BOOT |
||||
|
; |
||||
|
#include "cfg_mbc.asm" |
||||
|
; |
||||
|
BATCOND .SET FALSE |
||||
|
; |
||||
|
FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) |
||||
|
; |
||||
|
PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) |
||||
|
; |
||||
|
DSKYENABLE .SET FALSE ; ENABLES DSKY |
||||
|
DSKYMODE .SET DSKYMODE_NG ; DSKY VERTSION: DSKYMODE_[V1|NG] |
||||
|
; |
||||
|
DMAENABLE .SET TRUE ; DMA: ENABLE DMA DRIVER (DMA.ASM) |
||||
|
DMABASE .SET $E0 ; DMA: DMA BASE ADDRESS |
||||
|
DMAMODE .SET DMAMODE_MBC ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) |
||||
@ -0,0 +1,8 @@ |
|||||
|
; RomWBW Configured for MBC std, 2021-09-03T14:52:50 |
||||
|
; |
||||
|
#DEFINE TIMESTAMP "2021-09-03" |
||||
|
; |
||||
|
ROMSIZE .EQU 512 |
||||
|
; |
||||
|
#INCLUDE "MBC_std.asm" |
||||
|
; |
||||
@ -0,0 +1,235 @@ |
|||||
|
; |
||||
|
;================================================================================================== |
||||
|
; ROMWBW 2.X CONFIGURATION DEFAULTS FOR MBC |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
; 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 "Multi Board Computer" |
||||
|
; |
||||
|
PLATFORM .EQU PLT_MBC ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|DYNO|RCZ280|MBC] |
||||
|
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 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 |
||||
|
; |
||||
|
CPUOSC .EQU 8000000 ; CPU OSC FREQ IN MHZ |
||||
|
INTMODE .EQU 0 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) |
||||
|
DEFSERCFG .EQU SER_38400_8N1 ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) |
||||
|
; |
||||
|
RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) |
||||
|
RAM_RESERVE .EQU 0 ; RESERVE FIRST N KB OF RAM (USUALLY 0) |
||||
|
ROM_RESERVE .EQU 0 ; RESERVE FIRST N KB OR ROM (USUALLY 0) |
||||
|
MEMMGR .EQU MM_MBC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC] |
||||
|
MPCL_RAM .EQU $78 ; SBC MEM MGR RAM PAGE SELECT REG (WRITE ONLY) |
||||
|
MPCL_ROM .EQU $7C ; SBC MEM MGR ROM PAGE SELECT REG (WRITE ONLY) |
||||
|
; |
||||
|
RTCIO .EQU $70 ; 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 $B0 ; CTC BASE I/O ADDRESS |
||||
|
CTCTIMER .EQU TRUE ; ENABLE CTC PERIODIC TIMER |
||||
|
CTCMODE .EQU CTCMODE_CTR ; 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 614400 ; CTC CLOCK FREQUENCY |
||||
|
; |
||||
|
EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION |
||||
|
; |
||||
|
SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES |
||||
|
; |
||||
|
WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] |
||||
|
; |
||||
|
DIAGENABLE .EQU FALSE ; ENABLES OUTPUT TO 8 BIT LED DIAGNOSTIC PORT |
||||
|
DIAGPORT .EQU $00 ; DIAGNOSTIC PORT ADDRESS |
||||
|
DIAGDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON DIAGNOSTIC LEDS |
||||
|
; |
||||
|
LEDENABLE .EQU TRUE ; ENABLES STATUS LED |
||||
|
LEDMODE .EQU LEDMODE_RTC ; LEDMODE_[STD|RTC] |
||||
|
LEDPORT .EQU RTCIO ; STATUS LED PORT ADDRESS |
||||
|
LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED |
||||
|
; |
||||
|
DSKYENABLE .EQU FALSE ; ENABLES DSKY |
||||
|
DSKYMODE .EQU DSKYMODE_V1 ; DSKY VERSION: DSKYMODE_[V1|NG] |
||||
|
DSKYPPIBASE .EQU $60 ; BASE I/O ADDRESS OF DSKY PPI |
||||
|
DSKYOSC .EQU 3000000 ; OSCILLATOR FREQ FOR DSKYNG (IN HZ) |
||||
|
; |
||||
|
BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE |
||||
|
CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP |
||||
|
VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] |
||||
|
ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) |
||||
|
PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) |
||||
|
KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) |
||||
|
PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] |
||||
|
KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] |
||||
|
MKYENABLE .EQU FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) |
||||
|
MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] |
||||
|
; |
||||
|
DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) |
||||
|
DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC] |
||||
|
DSRTCCHG .EQU FALSE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) |
||||
|
; |
||||
|
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) |
||||
|
; |
||||
|
UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) |
||||
|
UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ |
||||
|
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 |
||||
|
UARTCAS .EQU TRUE ; UART: AUTO-DETECT ECB CASSETTE UART |
||||
|
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 |
||||
|
; |
||||
|
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) |
||||
|
; |
||||
|
SIOENABLE .EQU TRUE ; 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 1 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP |
||||
|
SIO0MODE .EQU SIOMODE_ZP ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP] |
||||
|
SIO0BASE .EQU $B0 ; SIO 0: REGISTERS BASE ADR |
||||
|
SIO0ACLK .EQU (4915200/8) ; 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 (4915200/8) ; 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 |
||||
|
; |
||||
|
XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG |
||||
|
; |
||||
|
VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) |
||||
|
VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] |
||||
|
CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) |
||||
|
NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) |
||||
|
TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) |
||||
|
TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG/N8/RC/RCV9958] |
||||
|
TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) |
||||
|
VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) |
||||
|
VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] |
||||
|
; |
||||
|
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_MBC ; 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) |
||||
|
FDMEDIA .EQU FDM144 ; FD: DEFAULT MEDIA FORMAT FDM[720|144|360|120|111] |
||||
|
FDMEDIAALT .EQU FDM720 ; FD: ALTERNATE MEDIA FORMAT FDM[720|144|360|120|111] |
||||
|
FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS |
||||
|
; |
||||
|
RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER |
||||
|
RFCNT .EQU 1 ; RF: NUMBER OF RAM FLOPPY UNITS (1-4) |
||||
|
; |
||||
|
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_DIO ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC] |
||||
|
IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS |
||||
|
IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O |
||||
|
IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O |
||||
|
IDE0A8BIT .EQU FALSE ; IDE 0A (MASTER): 8 BIT XFER |
||||
|
IDE0B8BIT .EQU FALSE ; 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 FALSE ; 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 $20 ; 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 $44 ; 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_JUHA ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT] |
||||
|
SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE |
||||
|
SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC 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 |
||||
|
; |
||||
|
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) |
||||
|
; |
||||
|
HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) |
||||
|
HDSKTRACE .EQU 1 ; HDSK: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) |
||||
|
; |
||||
|
PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD |
||||
|
PIO4BASE .EQU $90 ; PIO: PIO REGISTERS BASE ADR FOR ECB 4P BOARD |
||||
|
PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) |
||||
|
PIOZBASE .EQU $88 ; PIO: PIO REGISTERS BASE ADR FOR ECB ZP BOARD |
||||
|
PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP |
||||
|
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 FALSE ; SN76489 SOUND DRIVER |
||||
|
AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER |
||||
|
SN7CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 |
||||
|
; |
||||
|
AY38910ENABLE .EQU FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER |
||||
|
AY_CLK .EQU CPUOSC / 4 ; DEFAULT TO CPUOSC / 4 |
||||
|
AYMODE .EQU AYMODE_NONE ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] |
||||
|
; |
||||
|
SPKENABLE .EQU TRUE ; 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_NONE ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC) |
||||
@ -0,0 +1,595 @@ |
|||||
|
;================================================================================================== |
||||
|
; Z80 DMA DRIVER |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
#INCLUDE "std.asm" |
||||
|
; |
||||
|
; |
||||
|
DMA_CONTINUOUS .equ %10111101 ; + Pulse |
||||
|
DMA_BYTE .equ %10011101 ; + Pulse |
||||
|
DMA_BURST .equ %11011101 ; + Pulse |
||||
|
DMA_LOAD .equ $cf ; %11001111 |
||||
|
DMA_ENABLE .equ $87 ; %10000111 |
||||
|
DMA_FORCE_READY .equ $b3 |
||||
|
DMA_DISABLE .equ $83 |
||||
|
DMA_START_READ_SEQUENCE .equ $a7 |
||||
|
DMA_READ_STATUS_BYTE .equ $bf |
||||
|
DMA_READ_MASK_FOLLOWS .equ $bb |
||||
|
DMA_RESET .equ $c3 |
||||
|
;DMA_RESET_PORT_A_TIMING .equ $c7 |
||||
|
;DMA_RESET_PORT_B_TIMING .equ $cb |
||||
|
;DMA_CONTINUE .equ $d3 |
||||
|
;DMA_DISABLE_INTERUPTS .equ $af |
||||
|
;DMA_ENABLE_INTERUPTS .equ $ab |
||||
|
;DMA_RESET_DISABLE_INTERUPTS .equ $a3 |
||||
|
;DMA_ENABLE_AFTER_RETI .equ $b7 |
||||
|
;DMA_REINIT_STATUS_BYTE .equ $8b |
||||
|
; |
||||
|
DMA_FBACK .equ TRUE ; ALLOW FALLBACK TO SOFTWARE |
||||
|
DMA_USEHS .equ TRUE ; USE CLOCK DIVIDER |
||||
|
; |
||||
|
DMAMODE .SET DMAMODE_ECB |
||||
|
; |
||||
|
#IF (DMAMODE=DMAMODE_MBC) |
||||
|
DMA_RDY .EQU %00000000 |
||||
|
DMA_FORCE .EQU 1 |
||||
|
DMA_USEHS .SET FALSE |
||||
|
#ENDIF |
||||
|
#IF (DMAMODE=DMAMODE_ECB) |
||||
|
DMA_RDY .EQU %00001000 |
||||
|
DMA_FORCE .EQU 0 |
||||
|
DMA_USEHS .SET TRUE |
||||
|
#ENDIF |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; MAIN DMA MONITOR ROUTINE |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
.ORG $0100 |
||||
|
; |
||||
|
MAIN: |
||||
|
LD (SAVSTK),SP ; SETUP LOCAL |
||||
|
LD SP,STACK ; STACK |
||||
|
; |
||||
|
call PRTSTRD ; WELCOME |
||||
|
.db "DMA MONITOR\n\r$" |
||||
|
; |
||||
|
MENULP: CALL DISPM ; DISPLAY MENU |
||||
|
CALL CIN ; GET SELECTION |
||||
|
; |
||||
|
CP 'D' |
||||
|
JP Z,DMATST_D |
||||
|
CP 'I' |
||||
|
JP Z,DMATST_I |
||||
|
CP 'M' |
||||
|
JP Z,DMATST_M |
||||
|
CP 'R' |
||||
|
JP Z,DMATST_R |
||||
|
CP 'Y' |
||||
|
JP Z,DMATST_Y |
||||
|
CP 'X' |
||||
|
JR Z,DMABYE |
||||
|
; |
||||
|
JR MENULP |
||||
|
; |
||||
|
DMABYE: LD SP,(SAVSTK) ; RESTORE CP/M STACK |
||||
|
RET |
||||
|
; |
||||
|
DMATST_I: |
||||
|
call PRTSTRD |
||||
|
.db "\n\rSTART DMA_INIT\n\r$" |
||||
|
CALL DMA_INIT |
||||
|
JP MENULP |
||||
|
; |
||||
|
DMATST_M: |
||||
|
call PRTSTRD |
||||
|
.db "\n\rSTART DMAMemMove\n\r$" |
||||
|
CALL DMAMemMove |
||||
|
JP MENULP |
||||
|
; |
||||
|
DMATST_D: |
||||
|
call PRTSTRD |
||||
|
.db "\n\rSTART DMARegDump\n\r$" |
||||
|
CALL DMARegDump |
||||
|
JP MENULP |
||||
|
; |
||||
|
DMATST_Y: |
||||
|
call PRTSTRD |
||||
|
.db "\n\r\Y READY\n\r$" |
||||
|
; CALL |
||||
|
JP MENULP |
||||
|
; |
||||
|
DMATST_R: |
||||
|
call PRTSTRD |
||||
|
.db "R RESET\n\r$" |
||||
|
; CALL |
||||
|
JP MENULP |
||||
|
|
||||
|
; |
||||
|
DISPM: call PRTSTRD |
||||
|
.db "\n\rDMA DEVICE: $" |
||||
|
LD C,DMAMODE_MBC ; DISPLAY |
||||
|
LD A,00000011B ; TARGET |
||||
|
LD DE,DMA_DEV_STR ; DEVICE |
||||
|
CALL PRTIDXMSK |
||||
|
CALL NEWLINE |
||||
|
; |
||||
|
call PRTSTRD |
||||
|
.db "DMA PORT: $" |
||||
|
LD A,DMABASE ; DISPLAY |
||||
|
CALL PRTHEXBYTE ; DMA PORT |
||||
|
CALL NEWLINE |
||||
|
; |
||||
|
LD HL,MENU_OPT ; DISPLAY |
||||
|
CALL PRTSTR ; MENU OPTIONS |
||||
|
; |
||||
|
RET |
||||
|
; |
||||
|
#INCLUDE "util.asm" |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DMA INITIALIZATION CODE |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
DMA_INIT: |
||||
|
CALL NEWLINE |
||||
|
PRTS("DMA: IO=0x$") ; announce |
||||
|
LD A, DMABASE |
||||
|
CALL PRTHEXBYTE |
||||
|
; |
||||
|
LD A,DMA_FORCE |
||||
|
out (DMABASE+1),a ; force ready off |
||||
|
; |
||||
|
#IF (DMA_USEHS) |
||||
|
ld a,(HB_RTCVAL) |
||||
|
or %00001000 ; half |
||||
|
out (RTCIO),a ; clock |
||||
|
#ENDIF |
||||
|
; |
||||
|
call DMAProbe ; do we have a dma? |
||||
|
jr nz,DMA_NOTFOUND |
||||
|
; |
||||
|
call PRTSTRD |
||||
|
.db " DMA FOUND\n\r$" |
||||
|
; |
||||
|
ld hl,DMACode ; program the |
||||
|
ld b,DMACode_Len ; dma command |
||||
|
ld c,DMABASE ; block |
||||
|
; |
||||
|
di |
||||
|
otir ; load dma |
||||
|
ei |
||||
|
xor a ; set status |
||||
|
; |
||||
|
DMA_EXIT: |
||||
|
#IF (DMA_USEHS) |
||||
|
push af |
||||
|
ld a,(HB_RTCVAL) |
||||
|
and %11110111 ; full |
||||
|
out (RTCIO),a ; clock |
||||
|
pop af |
||||
|
#ENDIF |
||||
|
ret |
||||
|
; |
||||
|
DMA_NOTFOUND: |
||||
|
push af |
||||
|
call PRTSTRD |
||||
|
.db " NOT PRESENT$" |
||||
|
|
||||
|
#IF (DMA_FBACK) |
||||
|
call PRTSTRD |
||||
|
.db ". USING SOFTWARE$" |
||||
|
LD A,ERR_NOHW |
||||
|
LD (DMA_FAIL_FLAG),A |
||||
|
#ENDIF |
||||
|
pop af |
||||
|
jr DMA_EXIT |
||||
|
; |
||||
|
DMA_FAIL_FLAG: |
||||
|
.db 0 |
||||
|
; |
||||
|
DMA_DEV_STR: |
||||
|
.TEXT "NONE$" |
||||
|
.TEXT "ECB$" |
||||
|
.TEXT "Z180" |
||||
|
.TEXT "Z280$" |
||||
|
.TEXT "MBC$" |
||||
|
; |
||||
|
MENU_OPT: |
||||
|
.TEXT "\n\r" |
||||
|
.TEXT "I) Initialize DMA\n\r" |
||||
|
.TEXT "M) Memory to Memory test\n\r" |
||||
|
.TEXT "P) Port select test\n\r" |
||||
|
.TEXT "R) Reset bit test\n\r" |
||||
|
.TEXT "Y) Ready bit test\n\r" |
||||
|
.TEXT "X) Exit\n\r" |
||||
|
|
||||
|
.TEXT ">$" |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DMA MEMORY MOVE |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
DMAMemMove: |
||||
|
; |
||||
|
LD HL,$8000 ; PREFILL DESTINATION WITH $55 |
||||
|
LD A,$55 |
||||
|
LD (HL),A |
||||
|
LD DE,$8001 |
||||
|
LD BC,4096-1 |
||||
|
LDIR |
||||
|
; |
||||
|
LD HL,PROEND ; FILL SOURCE WITH $AA |
||||
|
LD A,$AA |
||||
|
LD (HL),A |
||||
|
LD DE,PROEND+1 |
||||
|
LD BC,4096-1 |
||||
|
LDIR |
||||
|
; |
||||
|
LD HL,PROEND ; DMA COPY |
||||
|
LD DE,$8000 |
||||
|
LD BC,4096-1 |
||||
|
CALL DMALDIR |
||||
|
|
||||
|
; |
||||
|
; LD HL,$8400 ; PLANT |
||||
|
; LD A,$00 ; BAD |
||||
|
; LD (HL),A ; SEED |
||||
|
; |
||||
|
LD A,$AA ; CHECK COPY SUCCESSFULL |
||||
|
LD HL,$8000 |
||||
|
LD BC,4096 |
||||
|
NXTCMP: CPI |
||||
|
JP PO,CMPOK |
||||
|
JR Z,NXTCMP |
||||
|
|
||||
|
call PRTHEXWORD |
||||
|
call PRTSTRD |
||||
|
.db " TEST MEMORY MOVE FAILED\n\r$" |
||||
|
RET |
||||
|
|
||||
|
CMPOK: call PRTSTRD |
||||
|
.db "TEST MEMORY MOVE SUCCEEDED\n\r$" |
||||
|
RET |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DMA PROBE - WRITE TO ADDRESS REGISTER AND READ BACK |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
DMAProbe: |
||||
|
ld a,DMA_RESET |
||||
|
out (DMABASE),a |
||||
|
ld a,%01111101 ; R0-Transfer mode, A -> B, start address follows |
||||
|
out (DMABASE),a |
||||
|
ld a,$cc |
||||
|
out (DMABASE),a |
||||
|
ld a,$dd |
||||
|
out (DMABASE),a |
||||
|
ld a,$e5 |
||||
|
out (DMABASE),a |
||||
|
ld a,$1a |
||||
|
out (DMABASE),a |
||||
|
ld a,DMA_LOAD |
||||
|
out (DMABASE),a |
||||
|
; |
||||
|
ld a,DMA_READ_MASK_FOLLOWS ; set up |
||||
|
out (DMABASE),a ; for |
||||
|
ld a,%00011000 ; register |
||||
|
out (DMABASE),a ; read |
||||
|
ld a,DMA_START_READ_SEQUENCE |
||||
|
out (DMABASE),a |
||||
|
; |
||||
|
in a,(DMABASE) ; read in |
||||
|
ld c,a ; address |
||||
|
in a,(DMABASE) |
||||
|
ld b,a |
||||
|
; |
||||
|
xor a ; is it |
||||
|
ld hl,$ddcc ; a match |
||||
|
sbc hl,bc ; return with |
||||
|
ret z ; status |
||||
|
cpl |
||||
|
ret |
||||
|
; |
||||
|
DMACode ;.db DMA_DISABLE ; R6-Command Disable DMA |
||||
|
.db %01111101 ; R0-Transfer mode, A -> B, start address, block length follow |
||||
|
.dw 0 ; R0-Port A, Start address |
||||
|
.dw 0 ; R0-Block length |
||||
|
.db %00010100 ; R1-No timing bytes follow, address increments, is memory |
||||
|
.db %00010000 ; R2-No timing bytes follow, address increments, is memory |
||||
|
.db %10000000 ; R3-DMA, interrupt, stop on match disabled |
||||
|
.db DMA_CONTINUOUS ; R4-Continuous mode, destination address, interrupt and control byte follow |
||||
|
.dw 0 ; R4-Port B, Destination address |
||||
|
.db %00001100 ; R4-Pulse byte follows, Pulse generated |
||||
|
.db 0 ; R4-Pulse offset |
||||
|
.db %10010010+DMA_RDY; R5-Stop on end of block, ce/wait multiplexed, READY active config |
||||
|
.db DMA_LOAD ; R6-Command Load |
||||
|
; .db DMA_FORCE_READY ; R6-Command Force ready |
||||
|
; .db DMA_ENABLE ; R6-Command Enable DMA |
||||
|
DMACode_Len .equ $-DMACode |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DMA COPY BLOCK CODE - ASSUMES DMA PREINITIALIZED |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
DMALDIR: |
||||
|
ld (DMASource),hl ; populate the dma |
||||
|
ld (DMADest),de ; register template |
||||
|
ld (DMALength),bc |
||||
|
; |
||||
|
ld hl,DMACopy ; program the |
||||
|
ld b,DMACopy_Len ; dma command |
||||
|
ld c,DMABASE ; block |
||||
|
; |
||||
|
#IF (DMA_USEHS) |
||||
|
ld a,(HB_RTCVAL) |
||||
|
or %00001000 ; half |
||||
|
out (RTCIO),a ; clock |
||||
|
#ENDIF |
||||
|
di |
||||
|
otir ; load and execute dma |
||||
|
ei |
||||
|
; |
||||
|
ld a,DMA_READ_STATUS_BYTE ; check status |
||||
|
out (DMABASE),a ; of transfer |
||||
|
in a,(DMABASE) ; set non-zero |
||||
|
and %00111011 ; if failed |
||||
|
sub %00011011 |
||||
|
#IF (DMA_USEHS) |
||||
|
push af |
||||
|
ld a,(HB_RTCVAL) |
||||
|
and %11110111 ; full |
||||
|
out (RTCIO),a ; clock |
||||
|
pop af |
||||
|
#ENDIF |
||||
|
ret |
||||
|
; |
||||
|
DMACopy ;.db DMA_DISABLE ; R6-Command Disable DMA |
||||
|
.db %01111101 ; R0-Transfer mode, A -> B, start address, block length follow |
||||
|
DMASource .dw 0 ; R0-Port A, Start address |
||||
|
DMALength .dw 0 ; R0-Block length |
||||
|
.db %00010100 ; R1-No timing bytes follow, address increments, is memory |
||||
|
.db %00010000 ; R2-No timing bytes follow, address increments, is memory |
||||
|
.db %10000000 ; R3-DMA, interrupt, stop on match disabled |
||||
|
.db DMA_CONTINUOUS ; R4-Continuous mode, destination address, interrupt and control byte follow |
||||
|
DMADest .dw 0 ; R4-Port B, Destination address |
||||
|
.db %00001100 ; R4-Pulse byte follows, Pulse generated |
||||
|
.db 0 ; R4-Pulse offset |
||||
|
; .db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config |
||||
|
.db DMA_LOAD ; R6-Command Load |
||||
|
.db DMA_FORCE_READY ; R6-Command Force ready |
||||
|
.db DMA_ENABLE ; R6-Command Enable DMA |
||||
|
DMACopy_Len .equ $-DMACopy |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DMA I/O OUT BLOCK CODE - ADDRESS TO I/O PORT |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
DMAOTIR: |
||||
|
ld (DMAOutSource),hl ; populate the dma |
||||
|
ld (DMAOutDest),a ; register template |
||||
|
ld (DMAOutLength),bc |
||||
|
; |
||||
|
ld hl,DMAOutCode ; program the |
||||
|
ld b,DMAOut_Len ; dma command |
||||
|
ld c,DMABASE ; block |
||||
|
; |
||||
|
#IF (DMA_USEHS) |
||||
|
ld a,(HB_RTCVAL) |
||||
|
or %00001000 ; half |
||||
|
out (RTCIO),a ; clock |
||||
|
#ENDIF |
||||
|
di |
||||
|
otir ; load and execute dma |
||||
|
ei |
||||
|
; |
||||
|
ld a,DMA_READ_STATUS_BYTE ; check status |
||||
|
out (DMABASE),a ; of transfer |
||||
|
in a,(DMABASE) ; set non-zero |
||||
|
and %00111011 ; if failed |
||||
|
sub %00011011 |
||||
|
; |
||||
|
#IF (DMA_USEHS) |
||||
|
push af |
||||
|
ld a,(HB_RTCVAL) |
||||
|
and %11110111 ; full |
||||
|
out (RTCIO),a ; clock |
||||
|
pop af |
||||
|
#ENDIF |
||||
|
ret |
||||
|
; |
||||
|
DMAOutCode ;.db DMA_DISABLE ; R6-Command Disable DMA |
||||
|
.db %01111001 ; R0-Transfer mode, B -> A (temp), start address, block length follow |
||||
|
DMAOutSource .dw 0 ; R0-Port A, Start address |
||||
|
DMAOutLength .dw 0 ; R0-Block length |
||||
|
|
||||
|
.db %00010100 ; R1-No timing bytes follow, fixed incrementing address, is memory |
||||
|
.db %00101000 ; R2-No timing bytes follow, address static, is i/o |
||||
|
.db %10000000 ; R3-DMA, interrupt, stop on match disabled |
||||
|
|
||||
|
.db %10100101 ; R4-Continuous mode, destination port, interrupt and control byte follow |
||||
|
DMAOutDest .db 0 ; R4-Port B, Destination port |
||||
|
; .db %00001100 ; R4-Pulse byte follows, Pulse generated |
||||
|
; .db 0 ; R4-Pulse offset |
||||
|
|
||||
|
.db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config |
||||
|
.db DMA_LOAD ; R6-Command Load |
||||
|
.db %00000101 ; R0-Port A is Source |
||||
|
.db DMA_LOAD ; R6-Command Load |
||||
|
.db DMA_FORCE_READY ; R6-Command Force ready |
||||
|
.db DMA_ENABLE ; R6-Command Enable DMA |
||||
|
DMAOut_Len .equ $-DMAOutCode |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DMA I/O INPUT BLOCK CODE - I/O PORT TO ADDRESS |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
DMAINIR: |
||||
|
ld (DMAInDest),hl ; populate the dma |
||||
|
ld (DMAInSource),a ; register template |
||||
|
ld (DMAInLength),bc |
||||
|
; |
||||
|
ld hl,DMAInCode ; program the |
||||
|
ld b,DMAIn_Len ; dma command |
||||
|
ld c,DMABASE ; block |
||||
|
; |
||||
|
#IF (DMA_USEHS) |
||||
|
ld a,(HB_RTCVAL) |
||||
|
or %00001000 ; half |
||||
|
out (RTCIO),a ; clock |
||||
|
#ENDIF |
||||
|
di |
||||
|
otir ; load and execute dma |
||||
|
ei |
||||
|
; |
||||
|
ld a,DMA_READ_STATUS_BYTE ; check status |
||||
|
out (DMABASE),a ; of transfer |
||||
|
in a,(DMABASE) ; set non-zero |
||||
|
and %00111011 ; if failed |
||||
|
sub %00011011 |
||||
|
; |
||||
|
#IF (DMA_USEHS) |
||||
|
push af |
||||
|
ld a,(HB_RTCVAL) |
||||
|
and %11110111 ; full |
||||
|
out (RTCIO),a ; clock |
||||
|
pop af |
||||
|
#ENDIF |
||||
|
ret |
||||
|
; |
||||
|
DMAInCode ;.db DMA_DISABLE ; R6-Command Disable DMA |
||||
|
.db %01111001 ; R0-Transfer mode, B -> A, start address, block length follow |
||||
|
DMAInDest .dw 0 ; R0-Port A, Start address |
||||
|
DMAInLength .dw 0 ; R0-Block length |
||||
|
.db %00010100 ; R1-No timing bytes follow, address increments, is memory |
||||
|
.db %00111000 ; R2-No timing bytes follow, address static, is i/o |
||||
|
.db %10000000 ; R3-DMA, interrupt, stop on match disabled |
||||
|
.db %10100101 ; R4-Continuous mode, destination port, no interrupt, control byte. |
||||
|
DMAInSource .db 0 ; R4-Port B, Destination port |
||||
|
; .db %00001100 ; R4-Pulse byte follows, Pulse generated |
||||
|
; .db 0 ; R4-Pulse offset |
||||
|
.db %10010010+DMA_RDY;R5-Stop on end of block, ce/wait multiplexed, READY active config |
||||
|
.db DMA_LOAD ; R6-Command Load |
||||
|
.db DMA_FORCE_READY ; R6-Command Force ready |
||||
|
.db DMA_ENABLE ; R6-Command Enable DMA |
||||
|
|
||||
|
DMAIn_Len .equ $-DMAInCode |
||||
|
; |
||||
|
;================================================================================================== |
||||
|
; DEBUG - READ START, DESTINATION AND COUNT REGISTERS |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
;#IF (0) |
||||
|
; |
||||
|
DMARegDump: |
||||
|
ld a,DMA_READ_MASK_FOLLOWS |
||||
|
out (DMABASE),a |
||||
|
ld a,%01111110 |
||||
|
out (DMABASE),a |
||||
|
ld a,DMA_START_READ_SEQUENCE |
||||
|
out (DMABASE),a |
||||
|
; |
||||
|
in a,(DMABASE) |
||||
|
ld c,a |
||||
|
in a,(DMABASE) |
||||
|
ld b,a |
||||
|
call PRTHEXWORD |
||||
|
ld a,':' |
||||
|
call COUT |
||||
|
; |
||||
|
in a,(DMABASE) |
||||
|
ld c,a |
||||
|
in a,(DMABASE) |
||||
|
ld b,a |
||||
|
call PRTHEXWORD |
||||
|
ld a,':' |
||||
|
call COUT |
||||
|
; |
||||
|
in a,(DMABASE) |
||||
|
ld c,a |
||||
|
in a,(DMABASE) |
||||
|
ld b,a |
||||
|
call PRTHEXWORD |
||||
|
; |
||||
|
call NEWLINE |
||||
|
ret |
||||
|
;#ENDIF |
||||
|
|
||||
|
|
||||
|
; |
||||
|
;__COUT_______________________________________________________________________ |
||||
|
; |
||||
|
; OUTPUT CHARACTER FROM A |
||||
|
;_____________________________________________________________________________ |
||||
|
; |
||||
|
COUT: |
||||
|
; SAVE ALL INCOMING REGISTERS |
||||
|
PUSH AF |
||||
|
PUSH BC |
||||
|
PUSH DE |
||||
|
PUSH HL |
||||
|
; |
||||
|
; OUTPUT CHARACTER TO CONSOLE VIA HBIOS |
||||
|
LD E,A ; OUTPUT CHAR TO E |
||||
|
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C |
||||
|
LD B,BF_CIOOUT ; HBIOS FUNC: OUTPUT CHAR |
||||
|
CALL $FFF0 ; HBIOS OUTPUTS CHARACTER |
||||
|
; |
||||
|
; RESTORE ALL REGISTERS |
||||
|
POP HL |
||||
|
POP DE |
||||
|
POP BC |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
;__CIN________________________________________________________________________ |
||||
|
; |
||||
|
; INPUT CHARACTER TO A |
||||
|
;_____________________________________________________________________________ |
||||
|
; |
||||
|
CIN: |
||||
|
; SAVE INCOMING REGISTERS (AF IS OUTPUT) |
||||
|
PUSH BC |
||||
|
PUSH DE |
||||
|
PUSH HL |
||||
|
; |
||||
|
; INPUT CHARACTER FROM CONSOLE VIA HBIOS |
||||
|
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C |
||||
|
LD B,BF_CIOIN ; HBIOS FUNC: INPUT CHAR |
||||
|
CALL $FFF0 ; HBIOS READS CHARACTER |
||||
|
LD A,E ; MOVE CHARACTER TO A FOR RETURN |
||||
|
; |
||||
|
; RESTORE REGISTERS (AF IS OUTPUT) |
||||
|
POP HL |
||||
|
POP DE |
||||
|
POP BC |
||||
|
RET |
||||
|
; |
||||
|
;__CST________________________________________________________________________ |
||||
|
; |
||||
|
; RETURN INPUT STATUS IN A (0 = NO CHAR, !=0 CHAR WAITING) |
||||
|
;_____________________________________________________________________________ |
||||
|
; |
||||
|
CST: |
||||
|
; SAVE INCOMING REGISTERS (AF IS OUTPUT) |
||||
|
PUSH BC |
||||
|
PUSH DE |
||||
|
PUSH HL |
||||
|
; |
||||
|
; GET CONSOLE INPUT STATUS VIA HBIOS |
||||
|
LD C,CIO_CONSOLE ; CONSOLE UNIT TO C |
||||
|
LD B,BF_CIOIST ; HBIOS FUNC: INPUT STATUS |
||||
|
CALL $FFF0 ; HBIOS RETURNS STATUS IN A |
||||
|
; |
||||
|
; RESTORE REGISTERS (AF IS OUTPUT) |
||||
|
POP HL |
||||
|
POP DE |
||||
|
POP BC |
||||
|
RET |
||||
|
|
||||
|
SAVSTK: .DW 2 |
||||
|
.FILL 64 |
||||
|
STACK: .EQU $ |
||||
|
PROEND: .EQU $ |
||||
|
; |
||||
|
.end |
||||
@ -0,0 +1,2 @@ |
|||||
|
tasm -t80 -b dmamon.asm dmamon.com |
||||
|
|
||||
@ -0,0 +1,3 @@ |
|||||
|
~/RomWBW-dev/Tools/unix/uz80as/uz80as -t z80 dmamon.asm dmamon.bin |
||||
|
#srec_cat dmamon.bin -binary -offset 0x0100 --address-length=2 -o dmamon.hex -Intel |
||||
|
cat dmamon.bin > dmamon.com |
||||
@ -0,0 +1,267 @@ |
|||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; |
||||
|
; HBIOS FUNCTIONS |
||||
|
; |
||||
|
BF_CIO .EQU $00 |
||||
|
BF_CIOIN .EQU BF_CIO + 0 ; CHARACTER INPUT |
||||
|
BF_CIOOUT .EQU BF_CIO + 1 ; CHARACTER OUTPUT |
||||
|
BF_CIOIST .EQU BF_CIO + 2 ; CHARACTER INPUT STATUS |
||||
|
BF_CIOOST .EQU BF_CIO + 3 ; CHARACTER OUTPUT STATUS |
||||
|
BF_CIOINIT .EQU BF_CIO + 4 ; INIT/RESET DEVICE/LINE CONFIG |
||||
|
BF_CIOQUERY .EQU BF_CIO + 5 ; REPORT DEVICE/LINE CONFIG |
||||
|
BF_CIODEVICE .EQU BF_CIO + 6 ; REPORT DEVICE INFO |
||||
|
; |
||||
|
BF_DIO .EQU $10 |
||||
|
BF_DIOSTATUS .EQU BF_DIO + 0 ; DISK STATUS |
||||
|
BF_DIORESET .EQU BF_DIO + 1 ; DISK RESET |
||||
|
BF_DIOSEEK .EQU BF_DIO + 2 ; DISK SEEK |
||||
|
BF_DIOREAD .EQU BF_DIO + 3 ; DISK READ SECTORS |
||||
|
BF_DIOWRITE .EQU BF_DIO + 4 ; DISK WRITE SECTORS |
||||
|
BF_DIOVERIFY .EQU BF_DIO + 5 ; DISK VERIFY SECTORS |
||||
|
BF_DIOFORMAT .EQU BF_DIO + 6 ; DISK FORMAT TRACK |
||||
|
BF_DIODEVICE .EQU BF_DIO + 7 ; DISK DEVICE INFO REPORT |
||||
|
BF_DIOMEDIA .EQU BF_DIO + 8 ; DISK MEDIA REPORT |
||||
|
BF_DIODEFMED .EQU BF_DIO + 9 ; DEFINE DISK MEDIA |
||||
|
BF_DIOCAP .EQU BF_DIO + 10 ; DISK CAPACITY REPORT |
||||
|
BF_DIOGEOM .EQU BF_DIO + 11 ; DISK GEOMETRY REPORT |
||||
|
; |
||||
|
BF_RTC .EQU $20 |
||||
|
BF_RTCGETTIM .EQU BF_RTC + 0 ; GET TIME |
||||
|
BF_RTCSETTIM .EQU BF_RTC + 1 ; SET TIME |
||||
|
BF_RTCGETBYT .EQU BF_RTC + 2 ; GET NVRAM BYTE BY INDEX |
||||
|
BF_RTCSETBYT .EQU BF_RTC + 3 ; SET NVRAM BYTE BY INDEX |
||||
|
BF_RTCGETBLK .EQU BF_RTC + 4 ; GET NVRAM DATA BLOCK |
||||
|
BF_RTCSETBLK .EQU BF_RTC + 5 ; SET NVRAM DATA BLOCK |
||||
|
BF_RTCGETALM .EQU BF_RTC + 6 ; GET ALARM |
||||
|
BF_RTCSETALM .EQU BF_RTC + 7 ; SET ALARM |
||||
|
BF_RTCDEVICE .EQU BF_RTC + 8 ; RTC DEVICE INFO REPORT |
||||
|
; |
||||
|
BF_EMU .EQU $30 ; DEPRECATED |
||||
|
; |
||||
|
BF_VDA .EQU $40 |
||||
|
BF_VDAINI .EQU BF_VDA + 0 ; INITIALIZE VDU |
||||
|
BF_VDAQRY .EQU BF_VDA + 1 ; QUERY VDU STATUS |
||||
|
BF_VDARES .EQU BF_VDA + 2 ; SOFT RESET VDU |
||||
|
BF_VDADEV .EQU BF_VDA + 3 ; DEVICE INFO |
||||
|
BF_VDASCS .EQU BF_VDA + 4 ; SET CURSOR STYLE |
||||
|
BF_VDASCP .EQU BF_VDA + 5 ; SET CURSOR POSITION |
||||
|
BF_VDASAT .EQU BF_VDA + 6 ; SET CHARACTER ATTRIBUTE |
||||
|
BF_VDASCO .EQU BF_VDA + 7 ; SET CHARACTER COLOR |
||||
|
BF_VDAWRC .EQU BF_VDA + 8 ; WRITE CHARACTER |
||||
|
BF_VDAFIL .EQU BF_VDA + 9 ; FILL |
||||
|
BF_VDACPY .EQU BF_VDA + 10 ; COPY |
||||
|
BF_VDASCR .EQU BF_VDA + 11 ; SCROLL |
||||
|
BF_VDAKST .EQU BF_VDA + 12 ; GET KEYBOARD STATUS |
||||
|
BF_VDAKFL .EQU BF_VDA + 13 ; FLUSH KEYBOARD BUFFER |
||||
|
BF_VDAKRD .EQU BF_VDA + 14 ; READ KEYBOARD |
||||
|
; |
||||
|
BF_SND .EQU $50 |
||||
|
BF_SNDRESET .EQU BF_SND + 0 ; RESET SOUND SYSTEM |
||||
|
BF_SNDVOL .EQU BF_SND + 1 ; REQUEST SOUND VOL - L CONTAINS VOLUME (255 MAX, 0 SILENT) - SCALED AS REQUIRED BY DRIVER (EG: MAPS TO JUST 4 BIT RESOLUTION FOR SN76489) |
||||
|
BF_SNDPRD .EQU BF_SND + 2 ; REQUEST SOUND PERIOD - HL CONTAINS DRIVER SPECIFIC VALUE |
||||
|
BF_SNDNOTE .EQU BF_SND + 3 ; REQUEST NOTE - L CONTAINS NOTE - EACH VALUE IS QUARTER NOTE |
||||
|
BF_SNDPLAY .EQU BF_SND + 4 ; INITIATE THE REQUESTED SOUND COMMAND |
||||
|
BF_SNDQUERY .EQU BF_SND + 5 ; E IS SUBFUNCTION |
||||
|
BF_SNDDURATION .EQU BF_SND + 6 ; REQUEST DURATION HL MILLISECONDS |
||||
|
BF_SNDDEVICE .EQU BF_SND + 7 ; SOUND DEVICE INFO REQUEST |
||||
|
; |
||||
|
; BF_SNDQUERY SUBCOMMANDS |
||||
|
BF_SNDQ_STATUS .EQU 0 |
||||
|
BF_SNDQ_CHCNT .EQU BF_SNDQ_STATUS + 1 ; RETURN COUNT OF CHANNELS |
||||
|
BF_SNDQ_VOLUME .EQU BF_SNDQ_STATUS + 2 ; 8 BIT NUMBER |
||||
|
BF_SNDQ_PERIOD .EQU BF_SNDQ_STATUS + 3 ; 16 BIT NUMBER |
||||
|
BF_SNDQ_DEV .EQU BF_SNDQ_STATUS + 4 ; RETURN DEVICE TYPE CODE AND IO PORTS - TYPE IN B, PORTS IN DE, HL |
||||
|
; |
||||
|
BF_SYS .EQU $F0 |
||||
|
BF_SYSRESET .EQU BF_SYS + 0 ; SOFT RESET HBIOS |
||||
|
BF_SYSVER .EQU BF_SYS + 1 ; GET HBIOS VERSION |
||||
|
BF_SYSSETBNK .EQU BF_SYS + 2 ; SET CURRENT BANK |
||||
|
BF_SYSGETBNK .EQU BF_SYS + 3 ; GET CURRENT BANK |
||||
|
BF_SYSSETCPY .EQU BF_SYS + 4 ; BANK MEMORY COPY SETUP |
||||
|
BF_SYSBNKCPY .EQU BF_SYS + 5 ; BANK MEMORY COPY |
||||
|
BF_SYSALLOC .EQU BF_SYS + 6 ; ALLOC HBIOS HEAP MEMORY |
||||
|
BF_SYSFREE .EQU BF_SYS + 7 ; FREE HBIOS HEAP MEMORY |
||||
|
BF_SYSGET .EQU BF_SYS + 8 ; GET HBIOS INFO |
||||
|
BF_SYSSET .EQU BF_SYS + 9 ; SET HBIOS PARAMETERS |
||||
|
BF_SYSPEEK .EQU BF_SYS + 10 ; GET A BYTE VALUE FROM ALT BANK |
||||
|
BF_SYSPOKE .EQU BF_SYS + 11 ; SET A BYTE VALUE IN ALT BANK |
||||
|
BF_SYSINT .EQU BF_SYS + 12 ; MANAGE INTERRUPT VECTORS |
||||
|
; |
||||
|
BF_SYSRES_INT .EQU $00 ; RESET HBIOS INTERNAL |
||||
|
BF_SYSRES_WARM .EQU $01 ; WARM START (RESTART BOOT LOADER) |
||||
|
BF_SYSRES_COLD .EQU $02 ; COLD START |
||||
|
BF_SYSRES_USER .EQU $03 ; USER RESET REQUEST |
||||
|
; |
||||
|
BF_SYSGET_CIOCNT .EQU $00 ; GET CHAR UNIT COUNT |
||||
|
BF_SYSGET_CIOFN .EQU $01 ; GET CIO UNIT FN/DATA ADR |
||||
|
BF_SYSGET_DIOCNT .EQU $10 ; GET DISK UNIT COUNT |
||||
|
BF_SYSGET_DIOFN .EQU $11 ; GET DIO UNIT FN/DATA ADR |
||||
|
BF_SYSGET_RTCCNT .EQU $20 ; GET RTC UNIT COUNT |
||||
|
BF_SYSGET_VDACNT .EQU $40 ; GET VDA UNIT COUNT |
||||
|
BF_SYSGET_VDAFN .EQU $41 ; GET VDA UNIT FN/DATA ADR |
||||
|
BF_SYSGET_SNDCNT .EQU $50 ; GET VDA UNIT COUNT |
||||
|
BF_SYSGET_SNDFN .EQU $51 ; GET SND UNIT FN/DATA ADR |
||||
|
BF_SYSGET_TIMER .EQU $D0 ; GET CURRENT TIMER VALUE |
||||
|
BF_SYSGET_SECS .EQU $D1 ; GET CURRENT SECONDS VALUE |
||||
|
BF_SYSGET_BOOTINFO .EQU $E0 ; GET BOOT INFORMATION |
||||
|
BF_SYSGET_CPUINFO .EQU $F0 ; GET CPU INFORMATION |
||||
|
BF_SYSGET_MEMINFO .EQU $F1 ; GET MEMORY CAPACTITY INFO |
||||
|
BF_SYSGET_BNKINFO .EQU $F2 ; GET BANK ASSIGNMENT INFO |
||||
|
; |
||||
|
BF_SYSSET_TIMER .EQU $D0 ; SET TIMER VALUE |
||||
|
BF_SYSSET_SECS .EQU $D1 ; SET SECONDS VALUE |
||||
|
BF_SYSSET_BOOTINFO .EQU $E0 ; SET BOOT INFORMATION |
||||
|
; |
||||
|
BF_SYSINT_INFO .EQU $00 ; GET INTERRUPT SYSTEM INFO |
||||
|
BF_SYSINT_GET .EQU $10 ; GET INT VECTOR ADDRESS |
||||
|
BF_SYSINT_SET .EQU $20 ; SET INT VECTOR ADDRESS |
||||
|
; |
||||
|
CIO_CONSOLE .EQU $80 ; CIO UNIT NUM FOR CUR CON |
||||
|
; |
||||
|
; HBIOS GLOBAL ERROR RETURN VALUES |
||||
|
; |
||||
|
ERR_NONE .EQU 0 ; SUCCESS |
||||
|
; |
||||
|
ERR_UNDEF .EQU -1 ; UNDEFINED ERROR |
||||
|
ERR_NOTIMPL .EQU -2 ; FUNCTION NOT IMPLEMENTED |
||||
|
ERR_NOFUNC .EQU -3 ; INVALID FUNCTION |
||||
|
ERR_NOUNIT .EQU -4 ; INVALID UNIT NUMBER |
||||
|
ERR_NOMEM .EQU -5 ; OUT OF MEMORY |
||||
|
ERR_RANGE .EQU -6 ; PARAMETER OUT OF RANGE |
||||
|
ERR_NOMEDIA .EQU -7 ; MEDIA NOT PRESENT |
||||
|
ERR_NOHW .EQU -8 ; HARDWARE NOT PRESENT |
||||
|
ERR_IO .EQU -9 ; I/O ERROR |
||||
|
ERR_READONLY .EQU -10 ; WRITE REQUEST TO READ-ONLY MEDIA |
||||
|
ERR_TIMEOUT .EQU -11 ; DEVICE TIMEOUT |
||||
|
ERR_BADCFG .EQU -12 ; INVALID CONFIGURATION |
||||
|
ERR_INTERNAL .EQU -13 ; INTERNAL ERROR |
||||
|
; |
||||
|
; MEDIA ID VALUES |
||||
|
; |
||||
|
MID_NONE .EQU 0 |
||||
|
MID_MDROM .EQU 1 |
||||
|
MID_MDRAM .EQU 2 |
||||
|
MID_RF .EQU 3 |
||||
|
MID_HD .EQU 4 |
||||
|
MID_FD720 .EQU 5 |
||||
|
MID_FD144 .EQU 6 |
||||
|
MID_FD360 .EQU 7 |
||||
|
MID_FD120 .EQU 8 |
||||
|
MID_FD111 .EQU 9 |
||||
|
MID_HDNEW .EQU 10 |
||||
|
; |
||||
|
; CHAR DEVICE IDS |
||||
|
; |
||||
|
CIODEV_UART .EQU $00 |
||||
|
CIODEV_ASCI .EQU $10 |
||||
|
CIODEV_TERM .EQU $20 |
||||
|
CIODEV_PRPCON .EQU $30 |
||||
|
CIODEV_PPPCON .EQU $40 |
||||
|
CIODEV_SIO .EQU $50 |
||||
|
CIODEV_ACIA .EQU $60 |
||||
|
CIODEV_PIO .EQU $70 |
||||
|
CIODEV_UF .EQU $80 |
||||
|
CIODEV_DUART .EQU $90 |
||||
|
CIODEV_Z2U .EQU $A0 |
||||
|
; |
||||
|
; SUB TYPES OF CHAR DEVICES |
||||
|
; |
||||
|
;00 RS-232 |
||||
|
;01 TERMINAL |
||||
|
;02 PARALLEL PORT |
||||
|
;03 UNUSED |
||||
|
; |
||||
|
; DISK DEVICE IDS |
||||
|
; |
||||
|
DIODEV_MD .EQU $00 |
||||
|
DIODEV_FD .EQU $10 |
||||
|
DIODEV_RF .EQU $20 |
||||
|
DIODEV_IDE .EQU $30 |
||||
|
DIODEV_ATAPI .EQU $40 |
||||
|
DIODEV_PPIDE .EQU $50 |
||||
|
DIODEV_SD .EQU $60 |
||||
|
DIODEV_PRPSD .EQU $70 |
||||
|
DIODEV_PPPSD .EQU $80 |
||||
|
DIODEV_HDSK .EQU $90 |
||||
|
; |
||||
|
; RTC DEVICE IDS |
||||
|
; |
||||
|
RTCDEV_DS .EQU $00 ; DS1302 |
||||
|
RTCDEV_BQ .EQU $10 ; BQ4845P |
||||
|
RTCDEV_SIMH .EQU $20 ; SIMH |
||||
|
RTCDEV_INT .EQU $30 ; PERIODIC INT TIMER |
||||
|
RTCDEV_DS7 .EQU $40 ; DS1302 (I2C) |
||||
|
RTCDEV_RP5 .EQU $50 ; RP5C01 |
||||
|
; |
||||
|
; VIDEO DEVICE IDS |
||||
|
; |
||||
|
VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 |
||||
|
VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 |
||||
|
VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 |
||||
|
VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 |
||||
|
VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 |
||||
|
;VDADEV_V9958 .EQU $50 ; V9958 VDU |
||||
|
; |
||||
|
; SOUND DEVICE IDS |
||||
|
; |
||||
|
SNDDEV_SN76489 .EQU $00 |
||||
|
SNDDEV_AY38910 .EQU $10 |
||||
|
SNDDEV_BITMODE .EQU $20 |
||||
|
; |
||||
|
; HBIOS CONTROL BLOCK OFFSETS |
||||
|
; WARNING: THESE OFFSETS WILL CHANGE SIGNIFICANTLY BETWEEN RELEASES |
||||
|
; IT IS STRONGLY RECOMMENDED THAT YOU DO NOT USE THEM! |
||||
|
; |
||||
|
HCB_LOC .EQU $100 ; LOCATION OF HCB IN HBIOS BANK |
||||
|
HCB_SIZ .EQU $100 ; SIZE OF HCB DATA BLOCK |
||||
|
; |
||||
|
HCB_MARKER .EQU $03 ; MARKER ('W',~'W') (WORD) |
||||
|
HCB_VERSION .EQU $05 ; HBIOS VERSION NUM |
||||
|
HCB_PLATFORM .EQU $07 ; PLATFORM ID |
||||
|
HCB_CPUMHZ .EQU $08 ; CPU SPEED IN MHZ (BYTE) |
||||
|
HCB_CPUKHZ .EQU $09 ; CPU SPEED IN KHZ (WORD) |
||||
|
HCB_RAMBANKS .EQU $0B ; TOTAL SIZE OF RAM IN 32K BANKS (BYTE) |
||||
|
HCB_ROMBANKS .EQU $0C ; TOTAL SIZE OF ROM IN 32K BANKS (BYTE) |
||||
|
HCB_BOOTVOL .EQU $0D ; BOOT VOLUME, MSB=DEV/UNIT, LSB=LU (WORD) |
||||
|
HCB_BOOTBID .EQU $0F ; BANK ID OF ROM PAGE BOOTED (BYTE) |
||||
|
HCB_SERDEV .EQU $10 ; PRIMARY SERIAL DEVICE/UNIT (BYTE) |
||||
|
HCB_CRTDEV .EQU $11 ; CRT DISPLAY DEVICE/UNIT (BYTE) |
||||
|
HCB_CONDEV .EQU $12 ; ACTIVE CONSOLE DEVICE/UNIT (BYTE) |
||||
|
HCB_DIAGLVL .EQU $13 ; HBIOS DIAGNOSTIC LEVEL (BYTE) |
||||
|
; |
||||
|
HCB_HEAP .EQU $20 ; DWORD ADDRESS OF START OF HEAP |
||||
|
HCB_HEAPTOP .EQU $22 ; DWORD ADDRESS OF TOP OF HEAP |
||||
|
; |
||||
|
; MEMORY BANK IDS (ONE BYTE EACH) |
||||
|
HCB_BIDCOM .EQU $D8 ; COMMON BANK (UPPER 32K) |
||||
|
HCB_BIDUSR .EQU $D9 ; USER BANK (TPA) |
||||
|
HCB_BIDBIOS .EQU $DA ; BIOS BANK (HBIOS, UBIOS) |
||||
|
HCB_BIDAUX .EQU $DB ; AUX BANK (BPBIOS) |
||||
|
HCB_BIDRAMD0 .EQU $DC ; FIRST BANK OF RAM DRIVE |
||||
|
HCB_BIDRAMDN .EQU $DD ; LAST BANK OF RAM DRIVE |
||||
|
HCB_BIDROMD0 .EQU $DE ; FIRST BANK OF ROM DRIVE |
||||
|
HCB_BIDROMDN .EQU $DF ; LAST BANK OF ROM DRIVE |
||||
|
; |
||||
|
; HBIOS PROXY COMMON DATA BLOCK |
||||
|
; EXACTLY 32 BYTES AT $FFE0-$FFFF |
||||
|
; |
||||
|
HBX_XFC .EQU $10000 - $20 ; HBIOS PROXY INTERFACE AREA, 32 BYTES FIXED |
||||
|
; |
||||
|
HBX_XFCDAT .EQU HBX_XFC ; DATA PORTION OF HBIOS PROXY INTERFACE AREA |
||||
|
HB_CURBNK .EQU HBX_XFCDAT + 0 ; CURRENTLY ACTIVE LOW MEMORY BANK ID |
||||
|
HB_INVBNK .EQU HBX_XFCDAT + 1 ; BANK ACTIVE AT TIME OF HBIOS CALL INVOCATION |
||||
|
HB_SRCADR .EQU HBX_XFCDAT + 2 ; BNKCPY: DESTINATION BANK ID |
||||
|
HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID |
||||
|
HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS |
||||
|
HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS |
||||
|
HB_CPYLEN .EQU HBX_XFCDAT + 8 ; BNKCPY: COPY LENGTH |
||||
|
HB_RTCVAL .EQU HBX_XFCDAT + 14 ; RTC LATCH SHADOW VALUE |
||||
|
HB_LOCK .EQU HBX_XFCDAT + 15 ; INVOKE: HBIOS MUTEX LOCK |
||||
|
; |
||||
|
HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA |
||||
|
HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION |
||||
|
HB_BNKSEL .EQU HBX_XFCFNS + (1 * 3) ; SELECT LOW MEMORY BANK ID |
||||
|
HB_BNKCPY .EQU HBX_XFCFNS + (2 * 3) ; INTERBANK MEMORY COPY |
||||
|
HB_BNKCALL .EQU HBX_XFCFNS + (3 * 3) ; INTERBANK FUNCTION CALL |
||||
|
;HB_LOC .EQU HBX_XFCFNS + 12 ; ADDRESS OF HBIOS PROXY START (DEPRECATED) |
||||
|
HB_IDENT .EQU HBX_XFCFNS + 14 ; POINTER TO HBIOS IDENT DATA BLOCK |
||||
@ -0,0 +1,675 @@ |
|||||
|
; The purpose of this file is to define generic symbols and to include |
||||
|
; the requested build configuraton file to bring in platform specifics. |
||||
|
|
||||
|
; There are several hardware platforms supported by SBC. |
||||
|
; 1. SBC Z80 SBC (v1 or v2) w/ ECB interface |
||||
|
; 2. ZETA Standalone Z80 SBC w/ SBC compatibility |
||||
|
; 3. ZETA2 Second version of ZETA with enhanced memory bank switching |
||||
|
; 4. N8 MSX-ish Z180 SBC w/ onboard video and sound |
||||
|
; 5. MK4 Mark IV Z180 based SBC w/ ECB interface |
||||
|
; 6. UNA Any Z80/Z180 computer with UNA BIOS |
||||
|
; 7. RCZ80 RC2014 based system with 512K banked RAM/ROM card |
||||
|
; 8. RCZ180 RC2014 based system with Z180 CPU |
||||
|
; 9. EZZ80 Easy Z80, Z80 SBC w/ RC2014 bus and CTC |
||||
|
; 10. SCZ180 Steve Cousins Z180 based system |
||||
|
; 11. DYNO Steve Garcia's Dyno Micro-ATX Motherboard |
||||
|
; 12. RCZ280 Z280 CPU on RC2014 or ZZ80MB |
||||
|
; 13. MBC Andrew Lynch's Multi Board Computer |
||||
|
|
||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||||
|
; |
||||
|
; INCLUDE VERSION |
||||
|
; |
||||
|
#INCLUDE "ver.inc" ; ADD BIOSVER |
||||
|
; |
||||
|
FALSE .EQU 0 |
||||
|
TRUE .EQU ~FALSE |
||||
|
; |
||||
|
; DEBUGGING OPTIONS |
||||
|
; |
||||
|
USENONE .EQU 0 ; NO DEBUG |
||||
|
USEXIO .EQU 1 ; BASIC SERIAL DRIVER |
||||
|
USEMIO .EQU 2 ; MEMORY BUFFER DRIVER |
||||
|
WBWDEBUG .EQU USENONE |
||||
|
; |
||||
|
; DIAGNOSTIC LEVEL OPTIONS |
||||
|
; |
||||
|
DL_NONE .EQU 0 ; HBIOS DISPLAY NO MESSAGES |
||||
|
DL_CRITICAL .EQU 4 ; HBIOS DISPLAY CRITICAL ERROR MESSAGES |
||||
|
DL_ERROR .EQU 8 ; HBIOS DISPLAYS ALL ERROR MESSAGES |
||||
|
DL_WARNING .EQU 12 ; HBIOS DISPLAYS WARNING MESSAGES |
||||
|
DL_INFO .EQU 16 ; HBIOS DISPLAYS INFORMATIONAL MESSAGES |
||||
|
DL_DETAIL .EQU 20 ; HBIOS DISPLAYS DETAILED DIAGNOSTIC MESSAGES |
||||
|
DL_VERBOSE .EQU 24 ; HBIOS DISPLAYS ANYTHING IT KNOWS HOW TO |
||||
|
; |
||||
|
; PRIMARY HARDWARE PLATFORMS |
||||
|
; |
||||
|
PLT_SBC .EQU 1 ; SBC ECB Z80 SBC |
||||
|
PLT_ZETA .EQU 2 ; ZETA Z80 SBC |
||||
|
PLT_ZETA2 .EQU 3 ; ZETA Z80 V2 SBC |
||||
|
PLT_N8 .EQU 4 ; N8 (HOME COMPUTER) Z180 SBC |
||||
|
PLT_MK4 .EQU 5 ; MARK IV |
||||
|
PLT_UNA .EQU 6 ; UNA BIOS |
||||
|
PLT_RCZ80 .EQU 7 ; RC2014 W/ Z80 |
||||
|
PLT_RCZ180 .EQU 8 ; RC2014 W/ Z180 |
||||
|
PLT_EZZ80 .EQU 9 ; EASY Z80 |
||||
|
PLT_SCZ180 .EQU 10 ; SCZ180 |
||||
|
PLT_DYNO .EQU 11 ; DYNO MICRO-ATX MOTHERBOARD |
||||
|
PLT_RCZ280 .EQU 12 ; RC2014 W/ Z280 |
||||
|
PLT_MBC .EQU 13 ; MULTI BOARD COMPUTER |
||||
|
; |
||||
|
; CPU TYPES |
||||
|
; |
||||
|
CPU_NONE .EQU 0 ; NO CPU TYPE DEFINED |
||||
|
CPU_Z80 .EQU 1 ; Z80 FAMILY |
||||
|
CPU_Z180 .EQU 2 ; Z180 FAMILY |
||||
|
CPU_Z280 .EQU 3 ; Z280 FAMILY |
||||
|
; |
||||
|
; BIOS MODE |
||||
|
; |
||||
|
BIOS_NONE .EQU 0 ; NO BIOS TYPE DEFINED |
||||
|
BIOS_WBW .EQU 1 ; ROMWBW HBIOS |
||||
|
BIOS_UNA .EQU 2 ; UNA UBIOS |
||||
|
; |
||||
|
; DEFAULT HBIOS DIAGNOSTIC LEVEL |
||||
|
; WILL ULTIMATELY BE MOVED TO CONFIG FILE |
||||
|
; |
||||
|
DIAGLVL .EQU DL_CRITICAL |
||||
|
; |
||||
|
; MEMORY MANAGERS |
||||
|
; |
||||
|
MM_NONE .EQU 0 |
||||
|
MM_SBC .EQU 1 ; ORIGINAL N8VEM/RBC Z80 SBC BANKED MEMORY |
||||
|
MM_Z2 .EQU 2 ; 16K X 4 BANKED MEMORY INTRODUCED ON ZETA2 |
||||
|
MM_N8 .EQU 3 ; Z180 CUSTOMIZED FOR N8 MEMORY EXTENSIONS |
||||
|
MM_Z180 .EQU 4 ; Z180 NATIVE MEMORY MANAGER |
||||
|
MM_Z280 .EQU 5 ; Z280 NATIVE MEMORY MANAGER |
||||
|
MM_ZRC .EQU 6 ; ZRC BANK SWITCHING |
||||
|
MM_MBC .EQU 7 ; MBC MEMORY MANAGER |
||||
|
; |
||||
|
; BOOT STYLE |
||||
|
; |
||||
|
BT_MENU .EQU 1 ; WAIT FOR MENU SELECTION AT LOADER PROMPT |
||||
|
BT_AUTO .EQU 2 ; AUTO SELECT BOOT_DEFAULT AFTER BOOT_TIMEOUT |
||||
|
; |
||||
|
; BOOT RECOVERY METHODS |
||||
|
; |
||||
|
BT_REC_NONE .EQU 0 ; NO RECOVERY MODE |
||||
|
BT_REC_FORCE .EQU 1 ; FORCE BOOT RECOVERY MODE |
||||
|
BT_REC_SBC01 .EQU 2 ; ECB-SBCV2 - BIT 1 RTC HIGH |
||||
|
BT_REC_SBC1B .EQU 3 ; ECB-SBCV2 - 1-BIT IO PORT |
||||
|
BT_REC_SBCRI .EQU 4 ; ECB-SBCV2 - 16550 UART RING INDICATOR LINE |
||||
|
; |
||||
|
BT_REC_TYPE .EQU BT_REC_NONE ; BOOT RECOVERY METHOD TO USE |
||||
|
; |
||||
|
; FLOPPY DISK MEDIA SELECTIONS (ID'S MUST BE INDEX OF ENTRY IN FCD_TBL) |
||||
|
; |
||||
|
FDM720 .EQU 0 ; 3.5" FLOPPY, 720KB, 2 SIDES, 80 TRKS, 9 SECTORS |
||||
|
FDM144 .EQU 1 ; 3.5" FLOPPY, 1.44MB, 2 SIDES, 80 TRKS, 18 SECTORS |
||||
|
FDM360 .EQU 2 ; 5.25" FLOPPY, 360KB, 2 SIDES, 40 TRKS, 9 SECTORS |
||||
|
FDM120 .EQU 3 ; 5.25" FLOPPY, 1.2MB, 2 SIDES, 80 TRKS, 15 SECTORS |
||||
|
FDM111 .EQU 4 ; 8" FLOPPY, 1.11MB, 2 SIDES, 74 TRKS, 15 SECTORS |
||||
|
; |
||||
|
; ZILOG CTC MODE SELECTIONS |
||||
|
; |
||||
|
CTCMODE_NONE .EQU 0 ; NO CTC |
||||
|
CTCMODE_CTR .EQU 1 ; CTC COUNTER |
||||
|
CTCMODE_TIM16 .EQU 2 ; CTC TIMER W/ DIV 16 |
||||
|
CTCMODE_TIM256 .EQU 3 ; CTC TIMER W/ DIV 256 |
||||
|
; |
||||
|
; DS1302 RTC MODE SELECTIONS |
||||
|
; |
||||
|
DSRTCMODE_NONE .EQU 0 ; NO DSRTC |
||||
|
DSRTCMODE_STD .EQU 1 ; ORIGINAL DSRTC CIRCUIT (SBC, ZETA, MK4) |
||||
|
DSRTCMODE_MFPIC .EQU 2 ; MF/PIC VARIANT |
||||
|
; |
||||
|
; DS1307 RTC MODE SELECTIONS |
||||
|
; |
||||
|
DS7RTCMODE_NONE .EQU 0 ; NO DSRTC |
||||
|
DS7RTCMODE_PCF .EQU 1 ; PCF8584 I2C |
||||
|
; |
||||
|
; SIO MODE SELECTIONS |
||||
|
; |
||||
|
SIOMODE_NONE .EQU 0 |
||||
|
SIOMODE_STD .EQU 1 ; STD SIO REG CFG (EZZ80, KIO) |
||||
|
SIOMODE_RC .EQU 2 ; RC2014 SIO MODULE (SPENCER OWEN) |
||||
|
SIOMODE_SMB .EQU 3 ; RC2014 SIO MODULE (SCOTT BAKER) |
||||
|
SIOMODE_ZP .EQU 4 ; ECB-ZILOG PERIPHERALS BOARD |
||||
|
; |
||||
|
; TYPE OF CONSOLE BELL TO USE |
||||
|
; |
||||
|
CONBELL_NONE .EQU 0 |
||||
|
CONBELL_PSG .EQU 1 |
||||
|
CONBELL_IOBIT .EQU 2 |
||||
|
; |
||||
|
; LED MODE SELECTIONS |
||||
|
; |
||||
|
LEDMODE_NONE .EQU 0 |
||||
|
LEDMODE_STD .EQU 1 |
||||
|
LEDMODE_RTC .EQU 2 |
||||
|
; |
||||
|
; DSKY MODE SELECTIONS |
||||
|
; |
||||
|
DSKYMODE_NONE .EQU 0 |
||||
|
DSKYMODE_V1 .EQU 1 |
||||
|
DSKYMODE_NG .EQU 2 |
||||
|
; |
||||
|
; FD MODE SELECTIONS |
||||
|
; |
||||
|
FDMODE_NONE .EQU 0 |
||||
|
FDMODE_DIO .EQU 1 ; DISKIO V1 |
||||
|
FDMODE_ZETA .EQU 2 ; ZETA |
||||
|
FDMODE_ZETA2 .EQU 3 ; ZETA V2 |
||||
|
FDMODE_DIDE .EQU 4 ; DUAL IDE |
||||
|
FDMODE_N8 .EQU 5 ; N8 |
||||
|
FDMODE_DIO3 .EQU 6 ; DISKIO V3 |
||||
|
FDMODE_RCSMC .EQU 7 ; RC2014 SMC 9266 @ $40 (SCOTT BAKER) |
||||
|
FDMODE_RCWDC .EQU 8 ; RC2014 WDC 37C65 @ $40 (SCOTT BAKER) |
||||
|
FDMODE_DYNO .EQU 9 ; DYNO WDC 37C65 @ $84 |
||||
|
FDMODE_EPFDC .EQU 10 ; RC2014 ETCHED PIXELS FDC |
||||
|
FDMODE_MBC .EQU 11 ; MULTI-BOARD COMPUTER FDC |
||||
|
; |
||||
|
; IDE MODE SELECTIONS |
||||
|
; |
||||
|
IDEMODE_NONE .EQU 0 |
||||
|
IDEMODE_DIO .EQU 1 ; DISKIO V1 |
||||
|
IDEMODE_DIDE .EQU 2 ; DUAL IDE |
||||
|
IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT ONLY) |
||||
|
IDEMODE_RC .EQU 4 ; RC2014 CF MODULE (8 BIT ONLY) |
||||
|
; |
||||
|
; PPIDE MODE SELECTIONS |
||||
|
; |
||||
|
PPIDEMODE_NONE .EQU 0 |
||||
|
PPIDEMODE_SBC .EQU 1 ; STANDARD SBC PARALLEL PORT |
||||
|
PPIDEMODE_DIO3 .EQU 2 ; DISKIO V3 PARALLEL PORT |
||||
|
PPIDEMODE_MFP .EQU 3 ; MULTIFUNCTION / PIC |
||||
|
PPIDEMODE_N8 .EQU 4 ; MULTIFUNCTION / PIC |
||||
|
PPIDEMODE_RC .EQU 5 ; RC2014 PPIDE MODULE @ $20 (ED BRINDLEY) |
||||
|
PPIDEMODE_DYNO .EQU 6 ; DYNO PPIDE @ $4C |
||||
|
; |
||||
|
; SD MODE SELECTIONS |
||||
|
; |
||||
|
SDMODE_NONE .EQU 0 |
||||
|
SDMODE_JUHA .EQU 1 ; JUHA MINI BOARD |
||||
|
SDMODE_N8 .EQU 2 ; N8-2511, UNMODIFIED |
||||
|
SDMODE_CSIO .EQU 3 ; N8-2312 OR N8-2511 MODIFIED |
||||
|
SDMODE_PPI .EQU 4 ; PPISD MINI BOARD |
||||
|
SDMODE_UART .EQU 5 ; SD INTERFACE VIA UART |
||||
|
SDMODE_DSD .EQU 6 ; DUAL SD |
||||
|
SDMODE_MK4 .EQU 7 ; MARK IV |
||||
|
SDMODE_SC .EQU 8 ; SC (Steve Cousins) |
||||
|
SDMODE_MT .EQU 9 ; MT (Shift register SPI WIZNET for RC2014) |
||||
|
; |
||||
|
; SOUND CHIP MODE SELECTIONS |
||||
|
; |
||||
|
AYMODE_NONE .EQU 0 |
||||
|
AYMODE_N8 .EQU 1 ; N8 BUILT-IN SOUND |
||||
|
AYMODE_SCG .EQU 2 ; SCG ECB BOARD |
||||
|
AYMODE_RCZ80 .EQU 3 ; RC2014 SOUND MODULE BY ED BRINDLEY ON Z80 |
||||
|
AYMODE_RCZ180 .EQU 4 ; RC2014 SOUND MODULE BY ED BRINDLEY ON Z180 |
||||
|
AYMODE_MSX .EQU 5 ; RC2014 SOUND MODULE REV6 BY ED BRINDLEY ON Z80/Z180 AT MSX PORTS |
||||
|
AYMODE_LINC .EQU 6 ; LINC Z50 AY SOUND CARD |
||||
|
; |
||||
|
; TMS VIDEO MODE SELECTIONS |
||||
|
; |
||||
|
TMSMODE_NONE .EQU 0 |
||||
|
TMSMODE_SCG .EQU 1 ; SCG ECB BOARD |
||||
|
TMSMODE_N8 .EQU 2 ; N8 BUILT-IN VIDEO |
||||
|
TMSMODE_RC .EQU 3 ; RC2014 TMS9918 VIDEO BOARD |
||||
|
TMSMODE_RCV9958 .EQU 4 ; RC2014 V9958 VIDEO BOARD |
||||
|
; |
||||
|
; DMA MODE SELECTIONS |
||||
|
; |
||||
|
DMAMODE_NONE .EQU 0 |
||||
|
DMAMODE_ECB .EQU 1 ; ECB-DMA WOLFGANG KABATZKE'S Z80 DMA ECB BOARD |
||||
|
DMAMODE_Z180 .EQU 2 ; Z180 INTEGRATED DMA |
||||
|
DMAMODE_Z280 .EQU 3 ; Z280 INTEGRATED DMA |
||||
|
DMAMODE_RC .EQU 4 ; RC2014 Z80 DMA |
||||
|
DMAMODE_MBC .EQU 5 ; MBC |
||||
|
; |
||||
|
; SERIAL DEVICE CONFIGURATION CONSTANTS |
||||
|
; |
||||
|
SER_DATA5 .EQU 0 << 0 |
||||
|
SER_DATA6 .EQU 1 << 0 |
||||
|
SER_DATA7 .EQU 2 << 0 |
||||
|
SER_DATA8 .EQU 3 << 0 |
||||
|
; |
||||
|
SER_PARNONE .EQU 0 << 3 |
||||
|
SER_PARODD .EQU 1 << 3 |
||||
|
SER_PAREVEN .EQU 3 << 3 |
||||
|
SER_PARMARK .EQU 5 << 3 |
||||
|
SER_PARSPACE .EQU 7 << 3 |
||||
|
; |
||||
|
SER_STOP1 .EQU 0 << 2 |
||||
|
SER_STOP2 .EQU 1 << 2 |
||||
|
; |
||||
|
; SERIAL BAUD RATES ENCODED AS V = 75 * 2^X * 3^Y |
||||
|
; AND STORED AS 5 BITS: YXXXX |
||||
|
; |
||||
|
SER_BAUD75 .EQU $00 << 8 |
||||
|
SER_BAUD150 .EQU $01 << 8 |
||||
|
SER_BAUD300 .EQU $02 << 8 |
||||
|
SER_BAUD600 .EQU $03 << 8 |
||||
|
SER_BAUD1200 .EQU $04 << 8 |
||||
|
SER_BAUD2400 .EQU $05 << 8 |
||||
|
SER_BAUD4800 .EQU $06 << 8 |
||||
|
SER_BAUD9600 .EQU $07 << 8 |
||||
|
SER_BAUD19200 .EQU $08 << 8 |
||||
|
SER_BAUD38400 .EQU $09 << 8 |
||||
|
SER_BAUD76800 .EQU $0A << 8 |
||||
|
SER_BAUD153600 .EQU $0B << 8 |
||||
|
SER_BAUD307200 .EQU $0C << 8 |
||||
|
SER_BAUD614400 .EQU $0D << 8 |
||||
|
SER_BAUD1228800 .EQU $0E << 8 |
||||
|
SER_BAUD2457600 .EQU $0F << 8 |
||||
|
SER_BAUD225 .EQU $10 << 8 |
||||
|
SER_BAUD450 .EQU $11 << 8 |
||||
|
SER_BAUD900 .EQU $12 << 8 |
||||
|
SER_BAUD1800 .EQU $13 << 8 |
||||
|
SER_BAUD3600 .EQU $14 << 8 |
||||
|
SER_BAUD7200 .EQU $15 << 8 |
||||
|
SER_BAUD14400 .EQU $16 << 8 |
||||
|
SER_BAUD28800 .EQU $17 << 8 |
||||
|
SER_BAUD57600 .EQU $18 << 8 |
||||
|
SER_BAUD115200 .EQU $19 << 8 |
||||
|
SER_BAUD230400 .EQU $1A << 8 |
||||
|
SER_BAUD460800 .EQU $1B << 8 |
||||
|
SER_BAUD921600 .EQU $1C << 8 |
||||
|
SER_BAUD1843200 .EQU $1D << 8 |
||||
|
SER_BAUD3686400 .EQU $1E << 8 |
||||
|
SER_BAUD7372800 .EQU $1F << 8 |
||||
|
; |
||||
|
; UART DIVIDER VALUES |
||||
|
; STORED AS 5 BITS: YXXXX |
||||
|
; |
||||
|
DIV_1 .EQU $00 |
||||
|
DIV_2 .EQU $01 |
||||
|
DIV_4 .EQU $02 |
||||
|
DIV_8 .EQU $03 |
||||
|
DIV_16 .EQU $04 |
||||
|
DIV_32 .EQU $05 |
||||
|
DIV_64 .EQU $06 |
||||
|
DIV_128 .EQU $07 |
||||
|
DIV_256 .EQU $08 |
||||
|
DIV_512 .EQU $09 |
||||
|
DIV_1024 .EQU $0A |
||||
|
DIV_2048 .EQU $0B |
||||
|
DIV_4096 .EQU $0C |
||||
|
DIV_8192 .EQU $0D |
||||
|
DIV_16384 .EQU $0E |
||||
|
DIV_32768 .EQU $0F |
||||
|
DIV_3 .EQU $10 |
||||
|
DIV_6 .EQU $11 |
||||
|
DIV_12 .EQU $12 |
||||
|
DIV_24 .EQU $13 |
||||
|
DIV_48 .EQU $14 |
||||
|
DIV_96 .EQU $15 |
||||
|
DIV_192 .EQU $16 |
||||
|
DIV_384 .EQU $17 |
||||
|
DIV_768 .EQU $18 |
||||
|
DIV_1536 .EQU $19 |
||||
|
DIV_3072 .EQU $1A |
||||
|
DIV_6144 .EQU $1B |
||||
|
DIV_12288 .EQU $1C |
||||
|
DIV_24576 .EQU $1D |
||||
|
DIV_49152 .EQU $1E |
||||
|
DIV_98304 .EQU $1F |
||||
|
; |
||||
|
SER_XON .EQU 1 << 6 |
||||
|
SER_DTR .EQU 1 << 7 |
||||
|
SER_RTS .EQU 1 << 13 |
||||
|
; |
||||
|
SER_75_8N1 .EQU SER_BAUD75 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_150_8N1 .EQU SER_BAUD150 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_300_8N1 .EQU SER_BAUD300 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_600_8N1 .EQU SER_BAUD600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_1200_8N1 .EQU SER_BAUD1200 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_2400_8N1 .EQU SER_BAUD2400 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_4800_8N1 .EQU SER_BAUD4800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_9600_8N1 .EQU SER_BAUD9600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_19200_8N1 .EQU SER_BAUD19200 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_38400_8N1 .EQU SER_BAUD38400 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_76800_8N1 .EQU SER_BAUD76800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_153600_8N1 .EQU SER_BAUD153600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_307200_8N1 .EQU SER_BAUD307200 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_614400_8N1 .EQU SER_BAUD614400 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_1228800_8N1 .EQU SER_BAUD1228800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_2457600_8N1 .EQU SER_BAUD2457600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_225_8N1 .EQU SER_BAUD225 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_450_8N1 .EQU SER_BAUD450 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_900_8N1 .EQU SER_BAUD900 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_1800_8N1 .EQU SER_BAUD1800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_3600_8N1 .EQU SER_BAUD3600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_7200_8N1 .EQU SER_BAUD7200 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_14400_8N1 .EQU SER_BAUD14400 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_28800_8N1 .EQU SER_BAUD28800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_57600_8N1 .EQU SER_BAUD57600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_115200_8N1 .EQU SER_BAUD115200 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_230400_8N1 .EQU SER_BAUD230400 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_460800_8N1 .EQU SER_BAUD460800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_921600_8N1 .EQU SER_BAUD921600 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_1843200_8N1 .EQU SER_BAUD1843200 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_3686400_8N1 .EQU SER_BAUD3686400 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
SER_7372800_8N1 .EQU SER_BAUD7372800 | SER_DATA8 | SER_PARNONE | SER_STOP1 |
||||
|
; |
||||
|
; TERMENABLE CONTROLS INCLUSION OF TERMINAL PSEUDO-DEVICE DRIVER |
||||
|
; IT IS SET TO TRUE BY THE INCLUSION OF ANY VDA DRIVER. |
||||
|
; |
||||
|
TERMENABLE .EQU FALSE ; TERM PSEUDO DEVICE, WILL AUTO-ENABLE IF A VDA IS ENABLED |
||||
|
; |
||||
|
; VIDEO MODES |
||||
|
; |
||||
|
V80X24 .EQU 0 ; ECB-VDU |
||||
|
V80X25 .EQU 1 ; ECB-VDU, ECB-VGA3 |
||||
|
V80X30 .EQU 2 ; ECB-VDU, ECB-VGA3 |
||||
|
V80X25B .EQU 3 ; ECB-VDU |
||||
|
V80X24B .EQU 4 ; ECB-VDU |
||||
|
V80X43 .EQU 5 ; ECB-VGA3 |
||||
|
V80X60 .EQU 6 ; ECB-VGA3 |
||||
|
; |
||||
|
; KEYBOARD LAYOUTS |
||||
|
; |
||||
|
KBD_US .EQU 0 ; US ENGLISH |
||||
|
KBD_DE .EQU 1 ; GERMAN |
||||
|
; |
||||
|
; EMULATION TYPES |
||||
|
; |
||||
|
EMUTYP_NONE .EQU 0 ; NONE |
||||
|
EMUTYP_TTY .EQU 1 ; TTY |
||||
|
EMUTYP_ANSI .EQU 2 ; ANSI |
||||
|
; |
||||
|
; WATCHDOG TYPES |
||||
|
; |
||||
|
WDOG_NONE .EQU 0 ; NONE |
||||
|
WDOG_EZZ80 .EQU 1 ; EASY Z80 WATCHDOG |
||||
|
WDOG_SKZ .EQU 2 ; SK Z80 CPU W/ 512K |
||||
|
; |
||||
|
#INCLUDE "build.inc" ; INCLUDE USER CONFIG, ADD VARIANT, TIMESTAMP, & ROMSIZE |
||||
|
; |
||||
|
#IF (BIOS == BIOS_WBW) |
||||
|
#INCLUDE "hbios.inc" |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF (BIOS == BIOS_UNA) |
||||
|
#INCLUDE "../UBIOS/ubios.inc" |
||||
|
#ENDIF |
||||
|
; |
||||
|
; |
||||
|
; INCLUDE Z180 REGISTER DEFINITIONS |
||||
|
; |
||||
|
#IF (BIOS == BIOS_WBW) |
||||
|
#IF (CPUFAM == CPU_Z180) |
||||
|
#INCLUDE "z180.inc" |
||||
|
#ENDIF |
||||
|
#IF (CPUFAM == CPU_Z280) |
||||
|
#INCLUDE "z280.inc" |
||||
|
#ENDIF |
||||
|
#IF (EIPCENABLE) |
||||
|
#INCLUDE "eipc.inc" |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
; SETUP DEFAULT CPU SPEED VALUES |
||||
|
; |
||||
|
CPUKHZ .EQU CPUOSC / 1000 ; CPU FREQ IN KHZ |
||||
|
; |
||||
|
#IF (BIOS == BIOS_WBW) |
||||
|
#IF (CPUFAM == CPU_Z180) |
||||
|
#IF (Z180_CLKDIV == 0) |
||||
|
CPUKHZ .SET CPUKHZ / 2 ; ADJUST FOR HALF SPEED OPERATION |
||||
|
#ENDIF |
||||
|
#IF (Z180_CLKDIV == 2) |
||||
|
CPUKHZ .SET CPUKHZ * 2 ; ADJUST FOR DOUBLE SPEED OPERATION |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
#IF (CPUFAM == CPU_Z280) |
||||
|
CPUKHZ .SET CPUKHZ / 2 ; Z180 PHI IS ALWAYS 1/2 OSC |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
CPUMHZ .EQU CPUKHZ / 1000 ; CPU FREQ IN MHZ |
||||
|
; |
||||
|
; SYSTEM PERIODIC TIMER MODE |
||||
|
; |
||||
|
#IF (BIOS == BIOS_WBW) |
||||
|
; |
||||
|
TM_NONE .EQU 0 |
||||
|
TM_CTC .EQU 1 |
||||
|
TM_TMS .EQU 2 |
||||
|
TM_SIMH .EQU 3 |
||||
|
TM_Z180 .EQU 4 |
||||
|
TM_Z280 .EQU 5 |
||||
|
; |
||||
|
.ECHO "SYSTEM TIMER:" |
||||
|
SYSTIM .EQU TM_NONE |
||||
|
; |
||||
|
#IF (CTCENABLE & (INTMODE == 2)) |
||||
|
#IF (CTCTIMER) |
||||
|
SYSTIM .SET TM_CTC |
||||
|
.ECHO " CTC" |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF (TMSENABLE & (INTMODE == 1)) |
||||
|
#IF (TMSTIMENABLE) |
||||
|
SYSTIM .SET TM_TMS |
||||
|
.ECHO " TMS9918/V9958" |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF ((PLATFORM == PLT_SBC) & (INTMODE == 1)) |
||||
|
#IF (HTIMENABLE) |
||||
|
SYSTIM .SET TM_SIMH |
||||
|
.ECHO " SIMH" |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF ((CPUFAM == CPU_Z180) & (INTMODE == 2)) |
||||
|
#IF (Z180_TIMER) |
||||
|
SYSTIM .SET TM_Z180 |
||||
|
.ECHO " Z180" |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF ((CPUFAM == CPU_Z280) & (MEMMGR == MM_Z280)) |
||||
|
#IF (Z280_TIMER) |
||||
|
SYSTIM .SET TM_Z280 |
||||
|
.ECHO " Z280" |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF SYSTIM == TM_NONE |
||||
|
.ECHO " NONE" |
||||
|
#ENDIF |
||||
|
; |
||||
|
.ECHO "\n" |
||||
|
; |
||||
|
#ENDIF |
||||
|
; |
||||
|
; MEMORY BANK CONFIGURATION |
||||
|
; |
||||
|
#IF (BIOS == BIOS_UNA) |
||||
|
BID_ROM0 .EQU $0000 + (ROM_RESERVE / 32) |
||||
|
BID_RAM0 .EQU $8000 + (RAM_RESERVE / 32) |
||||
|
#ENDIF |
||||
|
; |
||||
|
#IF (BIOS == BIOS_WBW) |
||||
|
BID_ROM0 .EQU $00 + (ROM_RESERVE / 32) |
||||
|
BID_RAM0 .EQU $80 + (RAM_RESERVE / 32) |
||||
|
#ENDIF |
||||
|
|
||||
|
BID_ROMN .EQU (BID_ROM0 + ((ROMSIZE / 32) - 1)) |
||||
|
BID_RAMN .EQU (BID_RAM0 + ((RAMSIZE / 32) - 1)) |
||||
|
|
||||
|
BID_BOOT .EQU BID_ROM0 ; BOOT BANK |
||||
|
BID_IMG0 .EQU BID_ROM0 + 1 ; ROM LOADER AND FIRST IMAGES BANK |
||||
|
BID_IMG1 .EQU BID_ROM0 + 2 ; SECOND IMAGES BANK |
||||
|
;BID_FSFAT .EQU BID_ROM0 + 3 ; FAT FILESYSTEM DRIVER BANK |
||||
|
BID_IMG2 .EQU BID_ROM0 + 3 ; NETWORK BOOT |
||||
|
BID_ROMD0 .EQU BID_ROM0 + 4 ; FIRST ROM DRIVE BANK |
||||
|
BID_ROMDN .EQU BID_ROMN ; LAST ROM DRIVE BANK |
||||
|
|
||||
|
BID_RAMD0 .EQU BID_RAM0 ; FIRST RAM DRIVE BANK |
||||
|
BID_RAMDN .EQU BID_RAMN - 4 ; LAST RAM DRIVE BANK |
||||
|
BID_AUX .EQU BID_RAMN - 3 ; AUX BANK (BPBIOS, ETC.) |
||||
|
BID_BIOS .EQU BID_RAMN - 2 ; BIOS BANK |
||||
|
BID_USR .EQU BID_RAMN - 1 ; USER BANK (CP/M TPA, ETC.) |
||||
|
BID_COM .EQU BID_RAMN ; COMMON BANK, UPPER 32K |
||||
|
; |
||||
|
; MEMORY LAYOUT |
||||
|
; |
||||
|
SYS_SIZ .EQU $3000 ; COMBINED SIZE OF SYSTEM AREA (OS + HBIOS PROXY) |
||||
|
HBBUF_SIZ .EQU 1024 ; INVARIANT HBIOS PHYSICAL DISK BUFFER, 1K |
||||
|
HBX_SIZ .EQU $200 ; HBIOS PROXY SIZE (SUBJECT TO CHANGE) |
||||
|
CPM_SIZ .EQU SYS_SIZ - HBX_SIZ ; NET SIZE OF ALL OS COMPONENTS (EXCLUDING HBIOS PROXY) |
||||
|
CCP_SIZ .EQU $800 ; INVARIANT SIZE OF CCP |
||||
|
BDOS_SIZ .EQU $E00 ; INVARIANT SIZE OF BDOS |
||||
|
CBIOS_SIZ .EQU CPM_SIZ - CCP_SIZ - BDOS_SIZ ; CBIOS IS THE REMAINDER |
||||
|
|
||||
|
MEMTOP .EQU $10000 ; INVARIANT TOP OF Z80 ADDRESSABLE MEMORY |
||||
|
BNKTOP .EQU $8000 ; BANK MEMORY BARRIER |
||||
|
|
||||
|
HBX_IMG .EQU $200 ; LOC OF HBX IMAGE IN HBIOS IMAGE BANK |
||||
|
|
||||
|
HBBUF_END .EQU BNKTOP ; END OF PHYSICAL DISK BUFFER IN HBIOS |
||||
|
HBBUF_LOC .EQU HBBUF_END - HBBUF_SIZ ; START OF PHYSICAL DISK BUFFER |
||||
|
HBX_END .EQU MEMTOP ; END OF HBIOS PROXY |
||||
|
HBX_LOC .EQU HBX_END - HBX_SIZ ; START OF HBIOS PROXY |
||||
|
CPM_END .EQU HBX_LOC ; END OF CPM COMPONENTS (INCLUDING CBIOS) |
||||
|
CPM_LOC .EQU CPM_END - CPM_SIZ ; START OF CPM COMPONENTS |
||||
|
CBIOS_END .EQU HBX_LOC ; END OF CBIOS |
||||
|
CBIOS_LOC .EQU CBIOS_END - CBIOS_SIZ ; START OF CBIOS |
||||
|
|
||||
|
CPM_ENT .EQU CBIOS_LOC ; CPM ENTRY POINT (IN CBIOS) |
||||
|
|
||||
|
CPM_IMGSIZ .EQU $3000 |
||||
|
|
||||
|
; ROM BANK 1 |
||||
|
|
||||
|
LDR_LOC .EQU $0000 |
||||
|
LDR_SIZ .EQU $1000 |
||||
|
LDR_END .EQU LDR_LOC +LDR_SIZ |
||||
|
LDR_IMGLOC .EQU $0000 |
||||
|
|
||||
|
MON_LOC .EQU $EE00 ; LOCATION OF MONITOR FOR RUNNING SYSTEM |
||||
|
MON_SIZ .EQU $1000 ; SIZE OF MONITOR BINARY IMAGE |
||||
|
MON_END .EQU MON_LOC + MON_SIZ ; END OF MONITOR |
||||
|
MON_IMGLOC .EQU LDR_IMGLOC + LDR_SIZ |
||||
|
|
||||
|
ZSYS_IMGLOC .EQU MON_IMGLOC + MON_SIZ |
||||
|
|
||||
|
CPM_IMGLOC .EQU ZSYS_IMGLOC + CPM_IMGSIZ |
||||
|
|
||||
|
; ROM BANK 2 |
||||
|
|
||||
|
FTH_LOC .EQU $0200 ; CAMEL FORTH |
||||
|
FTH_SIZ .EQU $1700 |
||||
|
FTH_END .EQU FTH_LOC + FTH_SIZ |
||||
|
FTH_IMGLOC .EQU $0000 |
||||
|
|
||||
|
BAS_LOC .EQU $0200 ; NASCOM BASIC |
||||
|
BAS_SIZ .EQU $2000 |
||||
|
BAS_END .EQU BAS_LOC + BAS_SIZ |
||||
|
BAS_IMGLOC .EQU FTH_IMGLOC + FTH_SIZ |
||||
|
|
||||
|
TBC_LOC .EQU $0A00 ; TASTYBASIC |
||||
|
TBC_SIZ .EQU $0900 |
||||
|
TBC_END .EQU TBC_LOC + TBC_SIZ |
||||
|
TBC_IMGLOC .EQU BAS_IMGLOC + BAS_SIZ |
||||
|
|
||||
|
GAM_LOC .EQU $0200 ; GAME 2048 |
||||
|
GAM_SIZ .EQU $0900 |
||||
|
GAM_END .EQU GAM_LOC + GAM_SIZ |
||||
|
GAM_IMGLOC .EQU TBC_IMGLOC + TBC_SIZ |
||||
|
|
||||
|
EGG_LOC .EQU $F000 ; EASTER EGG |
||||
|
EGG_SIZ .EQU $0200 |
||||
|
EGG_END .EQU EGG_LOC + EGG_SIZ |
||||
|
EGG_IMGLOC .EQU GAM_IMGLOC + GAM_SIZ |
||||
|
|
||||
|
NET_LOC .EQU $0100 ; NETWORK BOOT |
||||
|
NET_SIZ .EQU $1000 |
||||
|
NET_END .EQU NET_LOC + NET_SIZ |
||||
|
NET_IMGLOC .EQU EGG_IMGLOC + EGG_SIZ |
||||
|
|
||||
|
UPD_LOC .EQU $0200 ; ROM UPDATER |
||||
|
UPD_SIZ .EQU $0D00 |
||||
|
UPD_END .EQU UPD_LOC + UPD_SIZ |
||||
|
UPD_IMGLOC .EQU NET_IMGLOC + NET_SIZ |
||||
|
|
||||
|
USR_LOC .EQU $0200 ; USER |
||||
|
USR_SIZ .EQU BNKTOP - UPD_IMGLOC - UPD_SIZ |
||||
|
USR_END .EQU USR_LOC + USR_SIZ |
||||
|
USR_IMGLOC .EQU UPD_IMGLOC + UPD_SIZ |
||||
|
|
||||
|
MON_DSKY .EQU MON_LOC + (0 * 3) ; MONITOR ENTRY (DSKY) |
||||
|
MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) |
||||
|
; |
||||
|
; INTERRUPT MODE 2 SLOT ASSIGNMENTS |
||||
|
; |
||||
|
#IF ((INTMODE == 2) | (INTMODE == 3)) |
||||
|
|
||||
|
#IF ((CPUFAM == CPU_Z180) | (CPUFAM == CPU_Z280)) |
||||
|
|
||||
|
; Z180-BASED SYSTEMS |
||||
|
|
||||
|
INT_INT1 .EQU 0 ; Z180 INT 1 |
||||
|
INT_INT2 .EQU 1 ; Z180 INT 2 |
||||
|
INT_TIM0 .EQU 2 ; Z180 TIMER 0 |
||||
|
INT_TIM1 .EQU 3 ; Z180 TIMER 1 |
||||
|
INT_DMA0 .EQU 4 ; Z180 DMA 0 |
||||
|
INT_DMA1 .EQU 5 ; Z180 DMA 1 |
||||
|
INT_CSIO .EQU 6 ; Z180 CSIO |
||||
|
INT_SER0 .EQU 7 ; Z180 SERIAL 0 |
||||
|
INT_SER1 .EQU 8 ; Z180 SERIAL 0 |
||||
|
INT_PIO0A .EQU 9 ; ZILOG PIO 0, CHANNEL A |
||||
|
INT_PIO0B .EQU 10 ; ZILOG PIO 0, CHANNEL B |
||||
|
INT_PIO1A .EQU 11 ; ZILOG PIO 1, CHANNEL A |
||||
|
INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B |
||||
|
INT_SIO0 .EQU 13 ; ZILOG SIO 0, CHANNEL A & B |
||||
|
INT_SIO1 .EQU 14 ; ZILOG SIO 1, CHANNEL A & B |
||||
|
|
||||
|
#ELSE |
||||
|
|
||||
|
; Z80-BASED SYSTEMS |
||||
|
|
||||
|
INT_CTC0A .EQU 0 ; ZILOG CTC 0, CHANNEL A |
||||
|
INT_CTC0B .EQU 1 ; ZILOG CTC 0, CHANNEL B |
||||
|
INT_CTC0C .EQU 2 ; ZILOG CTC 0, CHANNEL C |
||||
|
INT_CTC0D .EQU 3 ; ZILOG CTC 0, CHANNEL D |
||||
|
INT_UART0 .EQU 4 ; MBC UART 0 |
||||
|
INT_UART1 .EQU 5 ; MBC UART 1 |
||||
|
INT_SIO0 .EQU 7 ; ZILOG SIO 0, CHANNEL A & B |
||||
|
INT_SIO1 .EQU 8 ; ZILOG SIO 1, CHANNEL A & B |
||||
|
INT_PIO0A .EQU 9 ; ZILOG PIO 0, CHANNEL A |
||||
|
INT_PIO0B .EQU 10 ; ZILOG PIO 0, CHANNEL B |
||||
|
INT_PIO1A .EQU 11 ; ZILOG PIO 1, CHANNEL A |
||||
|
INT_PIO1B .EQU 12 ; ZILOG PIO 1, CHANNEL B |
||||
|
|
||||
|
#ENDIF |
||||
|
|
||||
|
#DEFINE IVT(INTX) HB_IVT+(INTX * 4)+1 |
||||
|
#DEFINE VEC(INTX) INTX*2 |
||||
|
|
||||
|
#ENDIF |
||||
|
|
||||
|
; SET DEFAULT CSIO SPEED (INTERNAL CLOCK, SLOW AS POSSIBLE) |
||||
|
; DIV 1280, 14KHZ @ 18MHZ CLK |
||||
|
|
||||
|
#IF (BIOS == BIOS_WBW) |
||||
|
#IF (CPUFAM == CPU_Z180) |
||||
|
Z180_CNTR_DEF .EQU $06 ; DEFAULT VALUE FOR Z180 CSIO CONFIG |
||||
|
#ENDIF |
||||
|
#ENDIF |
||||
|
|
||||
|
; |
||||
|
; HELPER MACROS |
||||
|
; |
||||
|
#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) |
||||
|
#DEFINE DEBUG(S) CALL PRTSTRD \ .TEXT S \ .TEXT "$" ; $$$$$$ PRINT STRING S TO CONSOLE - PRTD("HELLO") - NO TRAILING $ REQUIRED |
||||
|
; |
||||
|
#DEFINE XIO_PRTC(C) CALL XIO_PRTCH \ .DB C ; PRINT CHARACTER C TO CONSOLE - PRTC('X') |
||||
|
#DEFINE XIO_PRTS(S) CALL XIO_PRTSTRD \ .DB S ; PRINT STRING S TO CONSOLE - PRTD("HELLO") |
||||
|
#DEFINE XIO_PRTX(X) CALL XIO_PRTSTRI \ .DW X ; PRINT STRING AT ADDRESS X TO CONSOLE - PRTI(STR_HELLO) |
||||
@ -0,0 +1,969 @@ |
|||||
|
; |
||||
|
;================================================================================================== |
||||
|
; UTILITY FUNCTIONS |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
; |
||||
|
CHR_BEL .EQU 07H |
||||
|
CHR_CR .EQU 0DH |
||||
|
CHR_LF .EQU 0AH |
||||
|
CHR_BS .EQU 08H |
||||
|
CHR_ESC .EQU 1BH |
||||
|
; |
||||
|
;__________________________________________________________________________________________________ |
||||
|
; |
||||
|
; UTILITY PROCS TO PRINT SINGLE CHARACTERS WITHOUT TRASHING ANY REGISTERS |
||||
|
; |
||||
|
PC_SPACE: |
||||
|
PUSH AF |
||||
|
LD A,' ' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_PERIOD: |
||||
|
PUSH AF |
||||
|
LD A,'.' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_COLON: |
||||
|
PUSH AF |
||||
|
LD A,':' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_COMMA: |
||||
|
PUSH AF |
||||
|
LD A,',' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_LBKT: |
||||
|
PUSH AF |
||||
|
LD A,'[' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_RBKT: |
||||
|
PUSH AF |
||||
|
LD A,']' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_LT: |
||||
|
PUSH AF |
||||
|
LD A,'<' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_GT: |
||||
|
PUSH AF |
||||
|
LD A,'>' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_LPAREN: |
||||
|
PUSH AF |
||||
|
LD A,'(' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_RPAREN: |
||||
|
PUSH AF |
||||
|
LD A,')' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_ASTERISK: |
||||
|
PUSH AF |
||||
|
LD A,'*' |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_CR: |
||||
|
PUSH AF |
||||
|
LD A,CHR_CR |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_LF: |
||||
|
PUSH AF |
||||
|
LD A,CHR_LF |
||||
|
JR PC_PRTCHR |
||||
|
|
||||
|
PC_PRTCHR: |
||||
|
CALL COUT |
||||
|
POP AF |
||||
|
RET |
||||
|
|
||||
|
NEWLINE2: |
||||
|
CALL NEWLINE |
||||
|
NEWLINE: |
||||
|
CALL PC_CR |
||||
|
CALL PC_LF |
||||
|
RET |
||||
|
; |
||||
|
; PRINT A CHARACTER REFERENCED BY POINTER AT TOP OF STACK |
||||
|
; USAGE: |
||||
|
; CALL PRTCH |
||||
|
; .DB 'X' |
||||
|
; |
||||
|
PRTCH: |
||||
|
EX (SP),HL |
||||
|
PUSH AF |
||||
|
LD A,(HL) |
||||
|
CALL COUT |
||||
|
POP AF |
||||
|
INC HL |
||||
|
EX (SP),HL |
||||
|
RET |
||||
|
; |
||||
|
; PRINT A STRING AT ADDRESS SPECIFIED IN HL |
||||
|
; STRING MUST BE TERMINATED BY '$' |
||||
|
; USAGE: |
||||
|
; LD HL,MYSTR |
||||
|
; CALL PRTSTR |
||||
|
; ... |
||||
|
; MYSTR: .DB "HELLO$" |
||||
|
; |
||||
|
PRTSTR: |
||||
|
LD A,(HL) |
||||
|
INC HL |
||||
|
CP '$' |
||||
|
RET Z |
||||
|
CALL COUT |
||||
|
JR PRTSTR |
||||
|
; |
||||
|
; PRINT A STRING DIRECT: REFERENCED BY POINTER AT TOP OF STACK |
||||
|
; STRING MUST BE TERMINATED BY '$' |
||||
|
; USAGE: |
||||
|
; CALL PRTSTRD |
||||
|
; .DB "HELLO$" |
||||
|
; ... |
||||
|
; |
||||
|
PRTSTRD: |
||||
|
EX (SP),HL |
||||
|
PUSH AF |
||||
|
CALL PRTSTR |
||||
|
POP AF |
||||
|
EX (SP),HL |
||||
|
RET |
||||
|
; |
||||
|
; PRINT A STRING INDIRECT: REFERENCED BY INDIRECT POINTER AT TOP OF STACK |
||||
|
; STRING MUST BE TERMINATED BY '$' |
||||
|
; USAGE: |
||||
|
; CALL PRTSTRI(MYSTRING) |
||||
|
; MYSTRING .DB "HELLO$" |
||||
|
; |
||||
|
PRTSTRI: |
||||
|
EX (SP),HL |
||||
|
PUSH AF |
||||
|
LD A,(HL) |
||||
|
INC HL |
||||
|
PUSH HL |
||||
|
LD H,(HL) |
||||
|
LD L,A |
||||
|
CALL PRTSTR |
||||
|
POP HL |
||||
|
INC HL |
||||
|
POP AF |
||||
|
EX (SP),HL |
||||
|
RET |
||||
|
; |
||||
|
; PRINT THE HEX BYTE VALUE IN A |
||||
|
; |
||||
|
PRTHEXBYTE: |
||||
|
PUSH AF |
||||
|
PUSH DE |
||||
|
CALL HEXASCII |
||||
|
LD A,D |
||||
|
CALL COUT |
||||
|
LD A,E |
||||
|
CALL COUT |
||||
|
POP DE |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
; PRINT THE HEX WORD VALUE IN BC |
||||
|
; |
||||
|
PRTHEXWORD: |
||||
|
PUSH AF |
||||
|
LD A,B |
||||
|
CALL PRTHEXBYTE |
||||
|
LD A,C |
||||
|
CALL PRTHEXBYTE |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
; PRINT THE HEX WORD VALUE IN HL |
||||
|
; |
||||
|
PRTHEXWORDHL: |
||||
|
PUSH AF |
||||
|
LD A,H |
||||
|
CALL PRTHEXBYTE |
||||
|
LD A,L |
||||
|
CALL PRTHEXBYTE |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
; PRINT THE HEX DWORD VALUE IN DE:HL |
||||
|
; |
||||
|
PRTHEX32: |
||||
|
PUSH BC |
||||
|
PUSH DE |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD |
||||
|
PUSH HL |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD |
||||
|
POP BC |
||||
|
RET |
||||
|
; |
||||
|
; CONVERT BINARY VALUE IN A TO ASCII HEX CHARACTERS IN DE |
||||
|
; |
||||
|
HEXASCII: |
||||
|
LD D,A |
||||
|
CALL HEXCONV |
||||
|
LD E,A |
||||
|
LD A,D |
||||
|
RLCA |
||||
|
RLCA |
||||
|
RLCA |
||||
|
RLCA |
||||
|
CALL HEXCONV |
||||
|
LD D,A |
||||
|
RET |
||||
|
; |
||||
|
; CONVERT LOW NIBBLE OF A TO ASCII HEX |
||||
|
; |
||||
|
HEXCONV: |
||||
|
AND 0FH ;LOW NIBBLE ONLY |
||||
|
ADD A,90H |
||||
|
DAA |
||||
|
ADC A,40H |
||||
|
DAA |
||||
|
RET |
||||
|
; |
||||
|
; PRINT A BYTE BUFFER IN HEX POINTED TO BY DE |
||||
|
; REGISTER A HAS SIZE OF BUFFER |
||||
|
; |
||||
|
PRTHEXBUF: |
||||
|
OR A |
||||
|
RET Z ; EMPTY BUFFER |
||||
|
; |
||||
|
LD B,A |
||||
|
PRTHEXBUF1: |
||||
|
CALL PC_SPACE |
||||
|
LD A,(DE) |
||||
|
CALL PRTHEXBYTE |
||||
|
INC DE |
||||
|
DJNZ PRTHEXBUF1 |
||||
|
RET |
||||
|
; |
||||
|
; PRINT A BLOCK OF MEMORY NICELY FORMATTED |
||||
|
; DE=BUFFER ADDRESS |
||||
|
; |
||||
|
DUMP_BUFFER: |
||||
|
CALL NEWLINE |
||||
|
|
||||
|
PUSH DE |
||||
|
POP HL |
||||
|
INC D |
||||
|
INC D |
||||
|
|
||||
|
DB_BLKRD: |
||||
|
PUSH BC |
||||
|
PUSH HL |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD ; PRINT START LOCATION |
||||
|
POP BC |
||||
|
CALL PC_SPACE ; |
||||
|
LD C,16 ; SET FOR 16 LOCS |
||||
|
PUSH HL ; SAVE STARTING HL |
||||
|
DB_NXTONE: |
||||
|
LD A,(HL) ; GET BYTE |
||||
|
CALL PRTHEXBYTE ; PRINT IT |
||||
|
CALL PC_SPACE ; |
||||
|
DB_UPDH: |
||||
|
INC HL ; POINT NEXT |
||||
|
DEC C ; DEC. LOC COUNT |
||||
|
JR NZ,DB_NXTONE ; IF LINE NOT DONE |
||||
|
; NOW PRINT 'DECODED' DATA TO RIGHT OF DUMP |
||||
|
DB_PCRLF: |
||||
|
CALL PC_SPACE ; SPACE IT |
||||
|
LD C,16 ; SET FOR 16 CHARS |
||||
|
POP HL ; GET BACK START |
||||
|
DB_PCRLF0: |
||||
|
LD A,(HL) ; GET BYTE |
||||
|
AND 060H ; SEE IF A 'DOT' |
||||
|
LD A,(HL) ; O.K. TO GET |
||||
|
JR NZ,DB_PDOT ; |
||||
|
DB_DOT: |
||||
|
LD A,2EH ; LOAD A DOT |
||||
|
DB_PDOT: |
||||
|
CALL COUT ; PRINT IT |
||||
|
INC HL ; |
||||
|
LD A,D ; |
||||
|
CP H ; |
||||
|
JR NZ,DB_UPDH1 ; |
||||
|
LD A,E ; |
||||
|
CP L ; |
||||
|
JP Z,DB_END ; |
||||
|
DB_UPDH1: |
||||
|
; IF BLOCK NOT DUMPED, DO NEXT CHARACTER OR LINE |
||||
|
DEC C ; DEC. CHAR COUNT |
||||
|
JR NZ,DB_PCRLF0 ; DO NEXT |
||||
|
DB_CONTD: |
||||
|
CALL NEWLINE ; |
||||
|
JP DB_BLKRD ; |
||||
|
|
||||
|
DB_END: |
||||
|
RET |
||||
|
; |
||||
|
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $ |
||||
|
; C REGISTER CONTAINS THE INDEX TO THE STRING TO BE DISPLAYED. |
||||
|
; A REGISTER CONTAINS A MASK TO BE APPLIED TO THE INDEX |
||||
|
; THE INDEX IS NORMALIZED TO A RANGE 0..N USING THE MASK AND THEN THE nTH |
||||
|
; STRING IS PRINTED IN A LIST DEFINED BY DE |
||||
|
; |
||||
|
; C = ATTRIBUTE |
||||
|
; A = MASK |
||||
|
; DE = STRING LIST |
||||
|
; |
||||
|
PRTIDXMSK: |
||||
|
PUSH BC |
||||
|
PRTIDXMSK0: |
||||
|
BIT 0,A |
||||
|
JR NZ,PRTIDXMSK1 |
||||
|
SRL A |
||||
|
SRL C |
||||
|
JR PRTIDXMSK0 |
||||
|
PRTIDXMSK1: |
||||
|
LD B,A |
||||
|
LD A,C |
||||
|
AND B |
||||
|
POP BC |
||||
|
; |
||||
|
; PRINT THE nTH STRING IN A LIST OF STRINGS WHERE EACH IS TERMINATED BY $ |
||||
|
; A REGISTER DEFINES THE nTH STRING IN THE LIST TO PRINT AND DE POINTS |
||||
|
; TO THE START OF THE STRING LIST. |
||||
|
; |
||||
|
; SLOW BUT IMPROVES CODE SIZE, READABILITY AND ELIMINATES THE NEED HAVE |
||||
|
; LIST OF POINTERS OR A LIST OF CONDITIONAL CHECKS. |
||||
|
; |
||||
|
PRTIDXDEA: |
||||
|
PUSH BC |
||||
|
LD C,A ; INDEX COUNT |
||||
|
OR A |
||||
|
LD A,0 |
||||
|
LD (PRTIDXCNT),A ; RESET CHARACTER COUNT |
||||
|
PRTIDXDEA1: |
||||
|
JR Z,PRTIDXDEA3 |
||||
|
PRTIDXDEA2: |
||||
|
LD A,(DE) ; LOOP UNIT |
||||
|
INC DE ; WE REACH |
||||
|
CP '$' ; END OF STRING |
||||
|
JR NZ,PRTIDXDEA2 |
||||
|
DEC C ; AT STRING END. SO GO |
||||
|
JR PRTIDXDEA1 ; CHECK FOR INDEX MATCH |
||||
|
PRTIDXDEA3: |
||||
|
POP BC |
||||
|
; CALL WRITESTR ; FALL THROUGH TO WRITESTR |
||||
|
; RET |
||||
|
; |
||||
|
; OUTPUT A '$' TERMINATED STRING AT DE |
||||
|
; |
||||
|
WRITESTR: |
||||
|
PUSH AF |
||||
|
WRITESTR1: |
||||
|
LD A,(DE) |
||||
|
CP '$' ; TEST FOR STRING TERMINATOR |
||||
|
JP Z,WRITESTR2 |
||||
|
CALL COUT |
||||
|
LD A,(PRTIDXCNT) |
||||
|
INC A |
||||
|
LD (PRTIDXCNT),A |
||||
|
INC DE |
||||
|
JP WRITESTR1 |
||||
|
WRITESTR2: |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
PRTIDXCNT: |
||||
|
.DB 0 ; CHARACTER COUNT |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
TSTPT: |
||||
|
PUSH DE |
||||
|
LD DE,STR_TSTPT |
||||
|
CALL WRITESTR |
||||
|
POP DE |
||||
|
JR REGDMP ; DUMP REGISTERS AND RETURN |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
REGDMP: |
||||
|
CALL XREGDMP |
||||
|
RET |
||||
|
; |
||||
|
XREGDMP: |
||||
|
EX (SP),HL ; RET ADR TO HL, SAVE HL ON TOS |
||||
|
LD (REGDMP_RET),HL ; SAVE RETURN ADDRESS |
||||
|
POP HL ; RESTORE HL AND BURN STACK ENTRY |
||||
|
|
||||
|
EX (SP),HL ; PC TO HL, SAVE HL ON TOS |
||||
|
LD (REGDMP_PC),HL ; SAVE PC VALUE |
||||
|
EX (SP),HL ; BACK THE WAY IT WAS |
||||
|
|
||||
|
LD (REGDMP_SP),SP ; SAVE STACK POINTER |
||||
|
|
||||
|
;LD (RD_STKSAV),SP ; SAVE ORIGINAL STACK POINTER |
||||
|
;LD SP,RD_STACK ; SWITCH TO PRIVATE STACK |
||||
|
|
||||
|
PUSH AF |
||||
|
PUSH BC |
||||
|
PUSH DE |
||||
|
PUSH HL |
||||
|
|
||||
|
PUSH AF |
||||
|
LD A,'@' |
||||
|
CALL COUT |
||||
|
POP AF |
||||
|
|
||||
|
PUSH BC |
||||
|
LD BC,(REGDMP_PC) |
||||
|
CALL PRTHEXWORD ; PC |
||||
|
POP BC |
||||
|
CALL PC_LBKT |
||||
|
PUSH BC |
||||
|
PUSH AF |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD ; AF |
||||
|
POP BC |
||||
|
CALL PC_COLON |
||||
|
CALL PRTHEXWORD ; BC |
||||
|
CALL PC_COLON |
||||
|
PUSH DE |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD ; DE |
||||
|
CALL PC_COLON |
||||
|
PUSH HL |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD ; HL |
||||
|
CALL PC_COLON |
||||
|
LD BC,(REGDMP_SP) |
||||
|
CALL PRTHEXWORD ; SP |
||||
|
|
||||
|
CALL PC_COLON |
||||
|
PUSH IX |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD ; IX |
||||
|
|
||||
|
CALL PC_COLON |
||||
|
PUSH IY |
||||
|
POP BC |
||||
|
CALL PRTHEXWORD ; IY |
||||
|
|
||||
|
CALL PC_RBKT |
||||
|
CALL PC_SPACE |
||||
|
|
||||
|
POP HL |
||||
|
POP DE |
||||
|
POP BC |
||||
|
POP AF |
||||
|
|
||||
|
;LD SP,(RD_STKSAV) ; BACK TO ORIGINAL STACK FRAME |
||||
|
|
||||
|
JP $FFFF ; RETURN, $FFFF IS DYNAMICALLY UPDATED |
||||
|
REGDMP_RET .EQU $-2 ; RETURN ADDRESS GOES HERE |
||||
|
; |
||||
|
REGDMP_PC .DW 0 |
||||
|
REGDMP_SP .DW 0 |
||||
|
; |
||||
|
;RD_STKSAV .DW 0 |
||||
|
; .FILL $FF,16*2 ; 16 LEVEL PRIVATE STACK |
||||
|
;RD_STACK .EQU $ |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
; |
||||
|
STR_HALT .TEXT "\r\n\r\n*** System Halted ***$" |
||||
|
STR_TSTPT .TEXT "\r\n+++ TSTPT: $" |
||||
|
;STR_AF .DB " AF=$" |
||||
|
;STR_BC .DB " BC=$" |
||||
|
;STR_DE .DB " DE=$" |
||||
|
;STR_HL .DB " HL=$" |
||||
|
;STR_PC .DB " PC=$" |
||||
|
;STR_SP .DB " SP=$" |
||||
|
; |
||||
|
; INDIRECT JUMP TO ADDRESS IN HL |
||||
|
; |
||||
|
; MOSTLY USEFUL TO PERFORM AN INDIRECT CALL LIKE: |
||||
|
; LD HL,xxxx |
||||
|
; CALL JPHL |
||||
|
; |
||||
|
JPHL: JP (HL) |
||||
|
; |
||||
|
; ADD HL,A |
||||
|
; |
||||
|
; A REGISTER IS DESTROYED! |
||||
|
; |
||||
|
ADDHLA: |
||||
|
ADD A,L |
||||
|
LD L,A |
||||
|
RET NC |
||||
|
INC H |
||||
|
RET |
||||
|
; |
||||
|
;**************************** |
||||
|
; A(BCD) => A(BIN) |
||||
|
; [00H..99H] -> [0..99] |
||||
|
;**************************** |
||||
|
; |
||||
|
BCD2BYTE: |
||||
|
PUSH BC |
||||
|
LD C,A |
||||
|
AND 0F0H |
||||
|
SRL A |
||||
|
LD B,A |
||||
|
SRL A |
||||
|
SRL A |
||||
|
ADD A,B |
||||
|
LD B,A |
||||
|
LD A,C |
||||
|
AND 0FH |
||||
|
ADD A,B |
||||
|
POP BC |
||||
|
RET |
||||
|
; |
||||
|
;***************************** |
||||
|
; A(BIN) => A(BCD) |
||||
|
; [0..99] => [00H..99H] |
||||
|
;***************************** |
||||
|
; |
||||
|
BYTE2BCD: |
||||
|
PUSH BC |
||||
|
LD B,10 |
||||
|
LD C,-1 |
||||
|
BYTE2BCD1: |
||||
|
INC C |
||||
|
SUB B |
||||
|
JR NC,BYTE2BCD1 |
||||
|
ADD A,B |
||||
|
LD B,A |
||||
|
LD A,C |
||||
|
ADD A,A |
||||
|
ADD A,A |
||||
|
ADD A,A |
||||
|
ADD A,A |
||||
|
OR B |
||||
|
POP BC |
||||
|
RET |
||||
|
|
||||
|
#IFDEF USEDELAY |
||||
|
|
||||
|
; |
||||
|
; DELAY 16US (CPU SPEED COMPENSATED) INCUDING CALL/RET INVOCATION |
||||
|
; REGISTER A AND FLAGS DESTROYED |
||||
|
; NO COMPENSATION FOR Z180 MEMORY WAIT STATES |
||||
|
; THERE IS AN OVERHEAD OF 3TS PER INVOCATION |
||||
|
; IMPACT OF OVERHEAD DIMINISHES AS CPU SPEED INCREASES |
||||
|
; |
||||
|
; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US + 3TS DELAY |
||||
|
; NOTE: CPUSCL MUST BE >= 1! |
||||
|
; |
||||
|
; EXAMPLE: 8MHZ CPU (DELAY GOAL IS 16US) |
||||
|
; LOOP = ((6 * 16) - 5) = 91TS |
||||
|
; TOTAL COST = (91 + 40) = 131TS |
||||
|
; ACTUAL DELAY = (131 / 8) = 16.375US |
||||
|
; |
||||
|
; --- TOTAL COST = (LOOP COST + 40) TS -----------------+ |
||||
|
DELAY: ; 17TS (FROM INVOKING CALL) | |
||||
|
LD A,(CPUSCL) ; 13TS | |
||||
|
; | |
||||
|
DELAY1: ; | |
||||
|
; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | |
||||
|
DEC A ; 4TS | | |
||||
|
#IF (BIOS == BIOS_WBW) ; | | |
||||
|
#IF (CPUFAM == CPU_Z180) ; | | |
||||
|
OR A ; +4TS FOR Z180 | | |
||||
|
#ENDIF ; | | |
||||
|
#ENDIF ; | | |
||||
|
JR NZ,DELAY1 ; 12TS (NZ) / 7TS (Z) | | |
||||
|
; ----------------------------------------------+ | |
||||
|
; | |
||||
|
RET ; 10TS (RETURN) | |
||||
|
;-------------------------------------------------------+ |
||||
|
; |
||||
|
; DELAY 16US * DE (CPU SPEED COMPENSATED) |
||||
|
; REGISTER DE, A, AND FLAGS DESTROYED |
||||
|
; NO COMPENSATION FOR Z180 MEMORY WAIT STATES |
||||
|
; THERE IS A 27TS OVERHEAD FOR CALL/RET PER INVOCATION |
||||
|
; IMPACT OF OVERHEAD DIMINISHES AS DE AND/OR CPU SPEED INCREASES |
||||
|
; |
||||
|
; CPU SCALER (CPUSCL) = (CPUHMZ - 2) FOR 16US OUTER LOOP COST |
||||
|
; NOTE: CPUSCL MUST BE > 0! |
||||
|
; |
||||
|
; EXAMPLE: 8MHZ CPU, DE=6250 (DELAY GOAL IS .1 SEC OR 100,000US) |
||||
|
; INNER LOOP = ((16 * 6) - 5) = 91TS |
||||
|
; OUTER LOOP = ((91 + 37) * 6250) = 800,000TS |
||||
|
; ACTUAL DELAY = ((800,000 + 27) / 8) = 100,003US |
||||
|
; |
||||
|
; --- TOTAL COST = (OUTER LOOP + 27) TS ------------------------+ |
||||
|
VDELAY: ; 17TS (FROM INVOKING CALL) | |
||||
|
; | |
||||
|
; --- OUTER LOOP = ((INNER LOOP + 37) * DE) TS ---------+ | |
||||
|
LD A,(CPUSCL) ; 13TS | | |
||||
|
; | | |
||||
|
VDELAY1: ; | | |
||||
|
; --- INNER LOOP = ((CPUSCL * 16) - 5) TS ------+ | | |
||||
|
#IF (BIOS == BIOS_WBW) ; | | | |
||||
|
#IF (CPUFAM == CPU_Z180) ; | | | |
||||
|
OR A ; +4TS FOR Z180 | | | |
||||
|
#ENDIF ; | | | |
||||
|
#ENDIF ; | | | |
||||
|
DEC A ; 4TS | | | |
||||
|
JR NZ,VDELAY1 ; 12TS (NZ) / 7TS (Z) | | | |
||||
|
; ----------------------------------------------+ | | |
||||
|
; | | |
||||
|
DEC DE ; 6TS | | |
||||
|
#IF (BIOS == BIOS_WBW) ; | | | |
||||
|
#IF (CPUFAM == CPU_Z180) ; | | |
||||
|
OR A ; +4TS FOR Z180 | | |
||||
|
#ENDIF ; | | |
||||
|
#ENDIF ; | | |
||||
|
LD A,D ; 4TS | | |
||||
|
OR E ; 4TS | | |
||||
|
JP NZ,VDELAY ; 10TS | | |
||||
|
;-------------------------------------------------------+ | |
||||
|
; | |
||||
|
RET ; 10TS (FINAL RETURN) | |
||||
|
;---------------------------------------------------------------+ |
||||
|
; |
||||
|
; DELAY ABOUT 0.5 SECONDS |
||||
|
; 500000US / 16US = 31250 |
||||
|
; |
||||
|
LDELAY: |
||||
|
PUSH AF |
||||
|
PUSH DE |
||||
|
LD DE,31250 |
||||
|
CALL VDELAY |
||||
|
POP DE |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
; INITIALIZE DELAY SCALER BASED ON OPERATING CPU SPEED |
||||
|
; ENTER WITH A = CPU SPEED IN MHZ |
||||
|
; |
||||
|
DELAY_INIT: |
||||
|
CP 3 ; TEST FOR <= 2 (SPECIAL HANDLING) |
||||
|
JR C,DELAY_INIT1 ; IF <= 2, SPECIAL PROCESSING |
||||
|
SUB 2 ; ADJUST AS REQUIRED BY DELAY FUNCTIONS |
||||
|
JR DELAY_INIT2 ; AND CONTINUE |
||||
|
DELAY_INIT1: |
||||
|
LD A,1 ; USE THE MIN VALUE OF 1 |
||||
|
DELAY_INIT2: |
||||
|
LD (CPUSCL),A ; UPDATE CPU SCALER VALUE |
||||
|
RET |
||||
|
|
||||
|
#IF (CPUMHZ < 3) |
||||
|
CPUSCL .DB 1 ; CPU SCALER MUST BE > 0 |
||||
|
#ELSE |
||||
|
CPUSCL .DB CPUMHZ - 2 ; OTHERWISE 2 LESS THAN PHI MHZ |
||||
|
#ENDIF |
||||
|
; |
||||
|
#ENDIF |
||||
|
; |
||||
|
; SHORT DELAY FUNCTIONS. NO CLOCK SPEED COMPENSATION, SO THEY |
||||
|
; WILL RUN LONGER ON SLOWER SYSTEMS. THE NUMBER INDICATES THE |
||||
|
; NUMBER OF CALL/RET INVOCATIONS. A SINGLE CALL/RET IS |
||||
|
; 27 T-STATES ON A Z80, 25 T-STATES ON A Z180 |
||||
|
; |
||||
|
; ; Z80 Z180 |
||||
|
; ; ---- ---- |
||||
|
DLY64: CALL DLY32 ; 1728 1600 |
||||
|
DLY32: CALL DLY16 ; 864 800 |
||||
|
DLY16: CALL DLY8 ; 432 400 |
||||
|
DLY8: CALL DLY4 ; 216 200 |
||||
|
DLY4: CALL DLY2 ; 108 100 |
||||
|
DLY2: CALL DLY1 ; 54 50 |
||||
|
DLY1: RET ; 27 25 |
||||
|
; |
||||
|
; MULTIPLY 8-BIT VALUES |
||||
|
; IN: MULTIPLY H BY E |
||||
|
; OUT: HL = RESULT, E = 0, B = 0 |
||||
|
; |
||||
|
MULT8: |
||||
|
LD D,0 |
||||
|
LD L,D |
||||
|
LD B,8 |
||||
|
MULT8_LOOP: |
||||
|
ADD HL,HL |
||||
|
JR NC,MULT8_NOADD |
||||
|
ADD HL,DE |
||||
|
MULT8_NOADD: |
||||
|
DJNZ MULT8_LOOP |
||||
|
RET |
||||
|
; |
||||
|
; MULTIPLY A 16 BIT BY 8 BIT INTO 16 BIT |
||||
|
; IN: MULTIPLY DE BY A |
||||
|
; OUT: HL = RESULT, B=0, A, C, DE UNCHANGED |
||||
|
; |
||||
|
MULT8X16: |
||||
|
LD B,8 |
||||
|
LD HL,0 |
||||
|
MULT8X16_1: |
||||
|
ADD HL,HL |
||||
|
RLCA |
||||
|
JR NC,MULT8X16_2 |
||||
|
ADD HL,DE |
||||
|
MULT8X16_2: |
||||
|
DJNZ MULT8X16_1 |
||||
|
RET |
||||
|
;; |
||||
|
;; COMPUTE HL / DE |
||||
|
;; RESULT IN BC, REMAINDER IN HL, AND SET ZF DEPENDING ON REMAINDER |
||||
|
;; A, DE DESTROYED |
||||
|
;; |
||||
|
;DIV: |
||||
|
; XOR A |
||||
|
; LD BC,0 |
||||
|
;DIV1: |
||||
|
; SBC HL,DE |
||||
|
; JR C,DIV2 |
||||
|
; INC BC |
||||
|
; JR DIV1 |
||||
|
;DIV2: |
||||
|
; XOR A |
||||
|
; ADC HL,DE ; USE ADC SO ZF IS SET |
||||
|
; RET |
||||
|
;=============================================================== |
||||
|
; |
||||
|
; COMPUTE HL / DE = BC W/ REMAINDER IN HL & ZF |
||||
|
; |
||||
|
DIV16: |
||||
|
LD A,H ; HL -> AC |
||||
|
LD C,L ; ... |
||||
|
LD HL,0 ; INIT HL |
||||
|
LD B,16 ; INIT LOOP COUNT |
||||
|
DIV16A: |
||||
|
SCF |
||||
|
RL C |
||||
|
RLA |
||||
|
ADC HL,HL |
||||
|
SBC HL,DE |
||||
|
JR NC,DIV16B |
||||
|
ADD HL,DE |
||||
|
DEC C |
||||
|
DIV16B: |
||||
|
DJNZ DIV16A ; LOOP AS NEEDED |
||||
|
LD B,A ; AC -> BC |
||||
|
LD A,H ; SET ZF |
||||
|
OR L ; ... BASED ON REMAINDER |
||||
|
RET ; DONE |
||||
|
; |
||||
|
; INTEGER DIVIDE DE:HL BY C |
||||
|
; RESULT IN DE:HL, REMAINDER IN A |
||||
|
; CLOBBERS F, B |
||||
|
; |
||||
|
DIV32X8: |
||||
|
XOR A |
||||
|
LD B,32 |
||||
|
DIV32X8A: |
||||
|
ADD HL,HL |
||||
|
RL E |
||||
|
RL D |
||||
|
RLA |
||||
|
CP C |
||||
|
JR C,DIV32X8B |
||||
|
SUB C |
||||
|
INC L |
||||
|
DIV32X8B: |
||||
|
DJNZ DIV32X8A |
||||
|
RET |
||||
|
; |
||||
|
; FILL MEMORY AT HL WITH VALUE A, LENGTH IN BC, ALL REGS USED |
||||
|
; LENGTH *MUST* BE GREATER THAN 1 FOR PROPER OPERATION!!! |
||||
|
; |
||||
|
FILL: |
||||
|
LD D,H ; SET DE TO HL |
||||
|
LD E,L ; SO DESTINATION EQUALS SOURCE |
||||
|
LD (HL),A ; FILL THE FIRST BYTE WITH DESIRED VALUE |
||||
|
INC DE ; INCREMENT DESTINATION |
||||
|
DEC BC ; DECREMENT THE COUNT |
||||
|
LDIR ; DO THE REST |
||||
|
RET ; RETURN |
||||
|
; |
||||
|
; SET A BIT IN BYTE ARRAY AT HL, INDEX IN A |
||||
|
; |
||||
|
BITSET: |
||||
|
CALL BITLOC ; LOCATE THE BIT |
||||
|
OR (HL) ; SET THE SPECIFIED BIT |
||||
|
LD (HL),A ; SAVE IT |
||||
|
RET ; RETURN |
||||
|
; |
||||
|
; CLEAR A BIT IN BYTE ARRAY AT HL, INDEX IN A |
||||
|
; |
||||
|
BITCLR: |
||||
|
CALL BITLOC ; LOCATE THE BIT |
||||
|
CPL ; INVERT ALL BITS |
||||
|
AND (HL) ; CLEAR SPECIFIED BIT |
||||
|
LD (HL),A ; SAVE IT |
||||
|
RET ; RETURN |
||||
|
; |
||||
|
; GET VALUE OF A BIT IN BYTE ARRAY AT HL, INDEX IN A |
||||
|
; |
||||
|
BITTST: |
||||
|
CALL BITLOC ; LOCATE THE BIT |
||||
|
AND (HL) ; SET Z FLAG BASED ON BIT |
||||
|
RET ; RETURN |
||||
|
; |
||||
|
; LOCATE A BIT IN BYTE ARRAY AT HL, INDEX IN A |
||||
|
; RETURN WITH HL POINTING TO BYTE AND A WITH MASK FOR SPECIFIC BIT |
||||
|
; |
||||
|
BITLOC: |
||||
|
PUSH AF ; SAVE BIT INDEX |
||||
|
SRL A ; DIVIDE BY 8 TO GET BYTE INDEX |
||||
|
SRL A ; " |
||||
|
SRL A ; " |
||||
|
LD C,A ; MOVE TO BC |
||||
|
LD B,0 ; " |
||||
|
ADD HL,BC ; HL NOW POINTS TO BYTE CONTAINING BIT |
||||
|
POP AF ; RECOVER A (INDEX) |
||||
|
AND $07 ; ISOLATE REMAINDER, Z SET IF ZERO |
||||
|
LD B,A ; SETUP SHIFT COUNTER |
||||
|
LD A,1 ; SETUP A WITH MASK |
||||
|
RET Z ; DONE IF ZERO |
||||
|
BITLOC1: |
||||
|
SLA A ; SHIFT |
||||
|
DJNZ BITLOC1 ; LOOP AS NEEDED |
||||
|
RET ; DONE |
||||
|
; |
||||
|
; PRINT VALUE OF A IN DECIMAL WITH LEADING ZERO SUPPRESSION |
||||
|
; |
||||
|
PRTDECB: |
||||
|
PUSH HL |
||||
|
PUSH AF |
||||
|
LD L,A |
||||
|
LD H,0 |
||||
|
CALL PRTDEC |
||||
|
POP AF |
||||
|
POP HL |
||||
|
RET |
||||
|
; |
||||
|
; PRINT VALUE OF HL IN DECIMAL WITH LEADING ZERO SUPPRESSION |
||||
|
; |
||||
|
PRTDEC: |
||||
|
PUSH BC |
||||
|
PUSH DE |
||||
|
PUSH HL |
||||
|
LD E,'0' |
||||
|
LD BC,-10000 |
||||
|
CALL PRTDEC1 |
||||
|
LD BC,-1000 |
||||
|
CALL PRTDEC1 |
||||
|
LD BC,-100 |
||||
|
CALL PRTDEC1 |
||||
|
LD C,-10 |
||||
|
CALL PRTDEC1 |
||||
|
LD E,0 |
||||
|
LD C,-1 |
||||
|
CALL PRTDEC1 |
||||
|
POP HL |
||||
|
POP DE |
||||
|
POP BC |
||||
|
RET |
||||
|
PRTDEC1: |
||||
|
LD A,'0' - 1 |
||||
|
PRTDEC2: |
||||
|
INC A |
||||
|
ADD HL,BC |
||||
|
JR C,PRTDEC2 |
||||
|
SBC HL,BC |
||||
|
CP E |
||||
|
JR Z,PRTDEC3 |
||||
|
LD E,0 |
||||
|
CALL COUT |
||||
|
PRTDEC3: |
||||
|
RET |
||||
|
; |
||||
|
; SHIFT HL:DE BY B BITS |
||||
|
; |
||||
|
SRL32: |
||||
|
; ROTATE RIGHT 32 BITS, HIGH ORDER BITS BECOME ZERO |
||||
|
SRL D |
||||
|
RR E |
||||
|
RR H |
||||
|
RR L |
||||
|
DJNZ SRL32 |
||||
|
RET |
||||
|
; |
||||
|
SLA32: |
||||
|
; ROTATE LEFT 32 BITS, LOW ORDER BITS BECOME ZERO |
||||
|
SLA L |
||||
|
RL H |
||||
|
RL E |
||||
|
RL D |
||||
|
DJNZ SLA32 |
||||
|
RET |
||||
|
; |
||||
|
; LOAD OR STORE DE:HL |
||||
|
; |
||||
|
LD32: |
||||
|
; LD DE:HL,(HL) |
||||
|
PUSH AF |
||||
|
LD E,(HL) |
||||
|
INC HL |
||||
|
LD D,(HL) |
||||
|
INC HL |
||||
|
LD A,(HL) |
||||
|
INC HL |
||||
|
LD H,(HL) |
||||
|
LD L,A |
||||
|
POP AF |
||||
|
EX DE,HL |
||||
|
RET |
||||
|
; |
||||
|
ST32: |
||||
|
; LD (BC),DE:HL |
||||
|
PUSH AF |
||||
|
LD A,L |
||||
|
LD (BC),A |
||||
|
INC BC |
||||
|
LD A,H |
||||
|
LD (BC),A |
||||
|
INC BC |
||||
|
LD A,E |
||||
|
LD (BC),A |
||||
|
INC BC |
||||
|
LD A,D |
||||
|
LD (BC),A |
||||
|
POP AF |
||||
|
RET |
||||
|
; |
||||
|
; INC/ADD/DEC/SUB 32 BIT VALUE IN DE:HL |
||||
|
; FOR ADD/SUB, OPERAND IS IN BC |
||||
|
; |
||||
|
INC32: |
||||
|
LD BC,1 |
||||
|
ADD32: |
||||
|
ADD HL,BC |
||||
|
RET NC |
||||
|
INC DE |
||||
|
RET |
||||
|
; |
||||
|
DEC32: |
||||
|
LD BC,1 |
||||
|
SUB32: |
||||
|
OR A |
||||
|
SBC HL,BC |
||||
|
RET NC |
||||
|
DEC DE |
||||
|
RET |
||||
|
; |
||||
|
; INC32 (HL) |
||||
|
; INCREMENT 32 BIT BINARY AT ADDRESS |
||||
|
; |
||||
|
INC32HL: |
||||
|
INC (HL) |
||||
|
RET NZ |
||||
|
INC HL |
||||
|
INC (HL) |
||||
|
RET NZ |
||||
|
INC HL |
||||
|
INC (HL) |
||||
|
RET NZ |
||||
|
INC HL |
||||
|
INC (HL) |
||||
|
RET |
||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
#DEFINE RMJ 3 |
||||
|
#DEFINE RMN 1 |
||||
|
#DEFINE RUP 1 |
||||
|
#DEFINE RTP 03 |
||||
|
#DEFINE BIOSVER "3.1.1-pre.111" |
||||
@ -0,0 +1,11 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
set TOOLS=../../../../Tools |
||||
|
set PATH=%TOOLS%\tasm32;%PATH% |
||||
|
set TASMTABS=%TOOLS%\tasm32 |
||||
|
|
||||
|
tasm -t180 -g3 -fFF tstdskng.asm tstdskng.com tstdskng.lst || exit /b |
||||
|
|
||||
|
copy /Y tstdskng.com ..\..\..\..\Binary\Apps\ || exit /b |
||||
|
|
||||
@ -0,0 +1,6 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
if exist *.com del *.com |
||||
|
if exist *.lst del *.lst |
||||
|
if exist *.bin del *.bin |
||||
@ -0,0 +1,11 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
set TOOLS=../../../../Tools |
||||
|
set PATH=%TOOLS%\tasm32;%PATH% |
||||
|
set TASMTABS=%TOOLS%\tasm32 |
||||
|
|
||||
|
tasm -t180 -g3 -fFF inttest.asm inttest.com inttest.lst || exit /b |
||||
|
|
||||
|
copy /Y inttest.com ..\..\..\..\Binary\Apps\ || exit /b |
||||
|
|
||||
@ -0,0 +1,6 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
if exist *.com del *.com |
||||
|
if exist *.lst del *.lst |
||||
|
if exist *.bin del *.bin |
||||
@ -0,0 +1,11 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
set TOOLS=../../../../Tools |
||||
|
set PATH=%TOOLS%\tasm32;%PATH% |
||||
|
set TASMTABS=%TOOLS%\tasm32 |
||||
|
|
||||
|
tasm -t180 -g3 -fFF ppidetst.asm ppidetst.com ppidetst.lst || exit /b |
||||
|
|
||||
|
copy /Y ppidetst.com ..\..\..\..\Binary\Apps\ || exit /b |
||||
|
|
||||
@ -0,0 +1,6 @@ |
|||||
|
@echo off |
||||
|
setlocal |
||||
|
|
||||
|
if exist *.com del *.com |
||||
|
if exist *.lst del *.lst |
||||
|
if exist *.bin del *.bin |
||||
Loading…
Reference in new issue