mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Compare commits
5 Commits
v3.4.0-dev
...
v3.4.0-rc.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cdb9f9b40a | ||
|
|
def84eded9 | ||
|
|
d89e055f18 | ||
|
|
62f9330de8 | ||
|
|
374ed7ab97 |
@@ -5,10 +5,38 @@ NOTE: Changes require HBIOS/CBIOS/Apps sync, version bump to 3.4 to ensure integ
|
||||
- A?C: Support for EP ITX-Mini Z180 Platform
|
||||
- M?R: Significant improvement in User Guide document
|
||||
- J?P: Preliminary support for Monsputer (MON)
|
||||
|
||||
- JLC: Standardize TMS driver memory map for compatibility
|
||||
- WBW: Improved IDE device detection
|
||||
- WBW: Fixed decompression when run on Z280
|
||||
- K?B: WDATE generic HBIOS date/time utility
|
||||
- WBW: Create new DSKY framework with simple driver style interface
|
||||
- JBL: Added ColecoVision config in TMS driver
|
||||
- WBW: Added support for interrupt mode 1 on Z180
|
||||
- WBW: Added S100 platform
|
||||
- WBW: Added Duodyne platform
|
||||
- WBW: Incorporated John Monahan's S100 Monitor in S100 platform build
|
||||
- WBW: Support ESP32 on Duodyne
|
||||
- M?C: Fixed port specification when using XM.COM send transfers
|
||||
- PMS: Support for Duodyne DMA
|
||||
- WBW: Added Serial ROM (SROM.COM) utility
|
||||
- WBW: Support S100 Propeller Console
|
||||
- SCC: Added support for SC700
|
||||
- WBW: Added Heath H8 platform
|
||||
- D?J: Enhanced build to run on Raspberry Pi 4
|
||||
- WBW: Complete overhaul of ROMless boot operation
|
||||
- WBW: Prevent access to slices outside of partition
|
||||
- T?P: Contributed the HTALK utility
|
||||
- WBW: CTS stall detection
|
||||
- W?S: Updated FLASH utility to v1.3.7
|
||||
- L?N: Updated UNARC to new OS universal version
|
||||
- B?C: Added support for Z1RCC
|
||||
- M?R: User Guide enhancements and corrections
|
||||
- D?H: Added support for specification of secondary console
|
||||
- WBW: Added platform for Monsputer
|
||||
|
||||
Version 3.3
|
||||
-----------
|
||||
NOTE: v3.3 was never released
|
||||
- WBW: Support Front Panel switches
|
||||
- A?C: Preliminary support for Z80-Retro
|
||||
- A?C: Support for SD PIO
|
||||
@@ -16,7 +44,7 @@ Version 3.3
|
||||
- WBW: Support per-drive floppy configuration
|
||||
- WBW: Support for Bill Shen's VGARC
|
||||
- WBW: Support for MG014 Parallel Port module + printer
|
||||
- WBW: Support for EMM Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for IMM Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for PPA Zip Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for SyQuest SparQ Drive on PPI interface (much inspiration from Alan Cox)
|
||||
- WBW: Support for ATAPI Disk Drives (not CD-ROMs) on IDE and PPIDE interfaces
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
26
ReadMe.md
26
ReadMe.md
@@ -3,7 +3,7 @@
|
||||
**RomWBW ReadMe** \
|
||||
Version 3.4 \
|
||||
Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \
|
||||
18 Dec 2023
|
||||
27 Dec 2023
|
||||
|
||||
# Overview
|
||||
|
||||
@@ -197,6 +197,30 @@ let me know if I missed you!
|
||||
Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft BASIC Compiler,
|
||||
Microsoft Fortran Compiler, and a Games compendium.
|
||||
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide.
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
- Jose Collado has contributed enhancements to the TMS driver including
|
||||
compatibility with standard TMS register configuration.
|
||||
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
27
ReadMe.txt
27
ReadMe.txt
@@ -1,6 +1,6 @@
|
||||
RomWBW ReadMe
|
||||
Wayne Warthen (wwarthen@gmail.com)
|
||||
18 Dec 2023
|
||||
27 Dec 2023
|
||||
|
||||
|
||||
|
||||
@@ -197,6 +197,31 @@ let me know if I missed you!
|
||||
including Aztec C, HiTech C, SLR Z80ASM, Turbo Pascal, Microsoft
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games compendium.
|
||||
|
||||
- Martin R has provided substantial help reviewing and improving the
|
||||
User Guide.
|
||||
|
||||
- Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
- Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
- Kevin Boone has contributed a generic HBIOS date/time utility
|
||||
(WDATE).
|
||||
|
||||
- Matt Carroll has contributed a fix to XM.COM that corrects the port
|
||||
specification when doing a send.
|
||||
|
||||
- Dean Jenkins enhanced the build process to accommodate the Raspberry
|
||||
Pi 4.
|
||||
|
||||
- Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
- Lars Nelson has contributed several generic utilities such as a
|
||||
universal (OS agnostic) UNARC application.
|
||||
|
||||
- Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
|
||||
|
||||
@@ -187,6 +187,30 @@ please let me know if I missed you!
|
||||
BASIC Compiler, Microsoft Fortran Compiler, and a Games
|
||||
compendium.
|
||||
|
||||
* Martin R has provided substantial help reviewing and improving the
|
||||
User Guide.
|
||||
|
||||
* Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
* Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
* Matt Carroll has contributed a fix to XM.COM that corrects the
|
||||
port specification when doing a send.
|
||||
|
||||
* Dean Jenkins enhanced the build process to accommodate the
|
||||
Raspberry Pi 4.
|
||||
|
||||
* Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
* Lars Nelson has contributed several generic utilities such as
|
||||
a universal (OS agnostic) UNARC application.
|
||||
|
||||
* Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
@@ -1460,14 +1460,17 @@ standard HBIOS result code.
|
||||
|----------------------------------------|----------------------------------------|
|
||||
| B: 0x47 | A: Status |
|
||||
| C: Video Unit | |
|
||||
| D: Scope | |
|
||||
| E: Color | |
|
||||
|
||||
Assign the specified Color (E) code to be used for all subsequent
|
||||
character writes/fills. This color is also used to fill new lines
|
||||
generated by scroll operations. Refer to the color code table above for
|
||||
a list of the available color codes. Note that a given video display may
|
||||
or may not support any/all colors. The Status (A) is a standard HBIOS
|
||||
result code.
|
||||
Assign the specified Color (E) code for character foreground/background.
|
||||
If Scope (D) is 0, the specified color will be used for all
|
||||
subsequent character writes/fills. This color is also used to fill new
|
||||
lines generated by scroll operations. If Scope (D) is 1, then the
|
||||
specified foreground/background color will be applied immediately to the
|
||||
entire screen. Refer to the color code table above for a list of the
|
||||
available color codes. Note that a given video display may or may not
|
||||
support any/all colors. The Status (A) is a standard HBIOS result code.
|
||||
|
||||
### Function 0x48 -- Video Write Character (VDAWRC)
|
||||
|
||||
|
||||
@@ -3889,6 +3889,25 @@ please let me know if I missed you!
|
||||
|
||||
* Jacques Pelletier has contributed the DS1501 RTC driver code.
|
||||
|
||||
* Jose Collado has contributed enhancements to the TMS driver
|
||||
including compatibility with standard TMS register configuration.
|
||||
|
||||
* Kevin Boone has contributed a generic HBIOS date/time utility (WDATE).
|
||||
|
||||
* Matt Carroll has contributed a fix to XM.COM that corrects the
|
||||
port specification when doing a send.
|
||||
|
||||
* Dean Jenkins enhanced the build process to accommodate the
|
||||
Raspberry Pi 4.
|
||||
|
||||
* Tom Plano has contributed a new utility (HTALK) to allow talking
|
||||
directly to HBIOS COM ports.
|
||||
|
||||
* Lars Nelson has contributed several generic utilities such as
|
||||
a universal (OS agnostic) UNARC application.
|
||||
|
||||
* Dylan Hall added support for specifying a secondary console.
|
||||
|
||||
Contributions of all kinds to RomWBW are very welcome.
|
||||
|
||||
# Licensing
|
||||
|
||||
@@ -139,7 +139,7 @@ if %ROMSize% gtr 0 (
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b
|
||||
copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b
|
||||
) else (
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\ram%ROMSize%_wbw.dat %ROMName%.rom || exit /b
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin + ..\RomDsk\ram%RAMSize%_wbw.dat %ROMName%.rom || exit /b
|
||||
copy /b hbios_rom.bin + osimg.bin + osimg1.bin + osimg2.bin %ROMName%.upd || exit /b
|
||||
copy /b hbios_app.bin + osimg_small.bin %ROMName%.com || exit /b
|
||||
)
|
||||
|
||||
@@ -6,6 +6,7 @@ set -e
|
||||
export ROM_PLATFORM
|
||||
export ROM_CONFIG
|
||||
export ROMSIZE
|
||||
export RAMSIZE
|
||||
export CPUFAM
|
||||
|
||||
if [ "${ROM_PLATFORM}" == "dist" ] ; then
|
||||
@@ -114,4 +115,4 @@ fi
|
||||
|
||||
#echo OBJECTS=${OBJECTS}
|
||||
|
||||
make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE}
|
||||
make ROM_PLATFORM=${ROM_PLATFORM} ROM_CONFIG=${ROM_CONFIG} ROMSIZE=${ROMSIZE} RAMSIZE=${RAMSIZE}
|
||||
|
||||
@@ -34,8 +34,8 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP
|
||||
FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS
|
||||
FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES
|
||||
;
|
||||
RAMSIZE .SET 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
ROMSIZE .SET 256 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
RAMSIZE .SET 1536 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
ROMSIZE .SET 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!)
|
||||
MEMMGR .SET MM_ZRC ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180]
|
||||
;
|
||||
UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM)
|
||||
|
||||
@@ -53,6 +53,7 @@ ROMNAME=${ROM_PLATFORM}_${ROM_CONFIG}
|
||||
# $(info ROM_PLATFORM=$(ROM_PLATFORM))
|
||||
# $(info ROM_CONFIG=$(ROM_CONFIG))
|
||||
# $(info ROMSIZE=$(ROMSIZE))
|
||||
# $(info RAMSIZE=$(RAMSIZE))
|
||||
# $(info ROMNAME=$(ROMNAME))
|
||||
# $(info CPUFAM=$(CPUFAM))
|
||||
# $(info TASM=$(TASM))
|
||||
@@ -81,7 +82,7 @@ $(OBJECTS) : $(ROMDEPS)
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \
|
||||
cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \
|
||||
else \
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).rom ; \
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin ../RomDsk/ram$(RAMSIZE)_wbw.dat >$(ROMNAME).rom ; \
|
||||
cat hbios_rom.bin osimg.bin osimg1.bin osimg2.bin >$(ROMNAME).upd ; \
|
||||
cat hbios_app.bin osimg_small.bin > $(ROMNAME).com ; \
|
||||
fi \
|
||||
|
||||
153
Source/HBIOS/Makefile.new
Normal file
153
Source/HBIOS/Makefile.new
Normal file
@@ -0,0 +1,153 @@
|
||||
DIST_OBJECTS := DYNO_std MK4_std N8_std RCZ180_ext RCZ180_nat RCZ180_z1rcc \
|
||||
RCZ280_ext RCZ280_nat RCZ280_zz80mb RCZ280_zzrcc RCZ280_zzrcc_ram \
|
||||
RCZ80_std RCZ80_kio RCZ80_easy RCZ80_tiny RCZ80_skz RCZ80_zrc \
|
||||
RCZ80_zrc_ram RCZ80_zrc512 RPH_std SBC_std SBC_simh MBC_std \
|
||||
DUO_std SCZ180_sc126 SCZ180_sc130 SCZ180_sc131 SCZ180_sc140 \
|
||||
SCZ180_sc503 SCZ180_sc700 S100_std UNA_std Z80RETRO_std \
|
||||
ZETA_std ZETA2_std HEATH_std EPITX_std
|
||||
# RCZ80_mt RCZ80_duart MON_std
|
||||
|
||||
OBJECTS := $(DIST_OBJECTS)
|
||||
#OBJECTS := SBC_std S100_std
|
||||
OBJECTS := $(OBJECTS:=.rom) $(OBJECTS:=.com) $(OBJECTS:=.upd)
|
||||
OBJECTS := $(filter-out UNA_%.com UNA_%.upd,$(OBJECTS))
|
||||
|
||||
DEST = ../../Binary
|
||||
TOOLS = ../../Tools
|
||||
OTHERS = *.img *.rom *.com *.upd *.bin *.hex cpm.sys zsys.sys build.inc *.build.inc font*.asm *.dat hbios_env.sh
|
||||
|
||||
FONTS := font8x11c.asm font8x11u.asm font8x16c.asm font8x16u.asm font8x8c.asm font8x8u.asm \
|
||||
fontcgac.asm fontcgau.asm fontvgarcc.asm fontvgarcu.asm
|
||||
|
||||
include $(TOOLS)/Makefile.inc
|
||||
|
||||
SHELL=/bin/bash
|
||||
|
||||
font%.asm:
|
||||
cp ../Fonts/$@ .
|
||||
|
||||
camel80.bin:
|
||||
cp ../Forth/$@ .
|
||||
|
||||
tastybasic.bin:
|
||||
cp ../TastyBasic/src/$@ .
|
||||
|
||||
s100mon.bin:
|
||||
$(ZXCC) $(CPM)/SLR180 -s100mon/FH
|
||||
$(ZXCC) $(CPM)/MLOAD25 -s100mon.bin=s100mon
|
||||
|
||||
%.build.inc:
|
||||
echo $@
|
||||
cat <<-EOF >$@
|
||||
; RomWBW Configured for $(*F) at $$(date +%Y-%m-%d)
|
||||
;
|
||||
#DEFINE TIMESTAMP "$$(date +%Y-%m-%d)"
|
||||
#DEFINE CONFIG "$(*F)"
|
||||
;
|
||||
#INCLUDE "Config/$(*F).asm"
|
||||
;
|
||||
EOF
|
||||
cat $@
|
||||
|
||||
%.usrrom.bin: usrrom.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.updater.bin: updater.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.eastaegg.bin: eastaegg.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.game.bin: game.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.nascom.bin: nascom.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.romldr.bin: romldr.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.dbgmon.bin: dbgmon.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.hbios_env.com: hbios_env.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) -dBASH $< $@ $(@:.com=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.hbios_env.sh: %.hbios_env.com
|
||||
$(ZXCC) $< >$@
|
||||
|
||||
%.hbios_rom.bin: hbios.asm %.build.inc %.hbios_env.sh $(FONTS)
|
||||
. ./$(*F).hbios_env.sh
|
||||
TARGETS=("" "z80" "hd64180" "z280")
|
||||
CPU=$${TARGETS[$$CPUFAM]}
|
||||
cp $(*F).build.inc build.inc
|
||||
$(BINDIR)/uz80as -t $$CPU -dROMBOOT $< $@ $(@:.bin=.lst)
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
rm build.inc
|
||||
|
||||
%.hbios_app.bin: hbios.asm %.build.inc %.hbios_env.sh $(FONTS)
|
||||
. ./$(*F).hbios_env.sh
|
||||
TARGETS=("" "z80" "hd64180" "z280")
|
||||
CPU=$${TARGETS[$$CPUFAM]}
|
||||
cp $(*F).build.inc build.inc
|
||||
$(BINDIR)/uz80as -t $$CPU -dAPPBOOT $< $@ $(@:.bin=.lst)
|
||||
rm build.inc
|
||||
|
||||
%.osimg.bin: %.romldr.bin %.dbgmon.bin
|
||||
cat $(*F).romldr.bin $(*F).dbgmon.bin ../ZSDOS/zsys_wbw.bin ../CPM22/cpm_wbw.bin >$@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
UNA_%.osimg.bin: UNA_%.romldr.bin UNA_%.dbgmon.bin
|
||||
cat UNA_$(*F).romldr.bin UNA_$(*F).dbgmon.bin ../ZSDOS/zsys_una.bin ../CPM22/cpm_una.bin >$@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
%.osimg_small.bin: %.romldr.bin %.dbgmon.bin
|
||||
cat $(*F).romldr.bin $(*F).dbgmon.bin ../ZSDOS/zsys_wbw.bin >$@
|
||||
|
||||
%.osimg1.bin: camel80.bin %.nascom.bin tastybasic.bin %.game.bin %.eastaegg.bin netboot.mod %.updater.bin %.usrrom.bin
|
||||
cat camel80.bin $(*F).nascom.bin tastybasic.bin $(*F).game.bin $(*F).eastaegg.bin netboot.mod $(*F).updater.bin $(*F).usrrom.bin >$@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
%.imgpad2.bin: imgpad2.asm %.build.inc
|
||||
cp $(*F).build.inc build.inc
|
||||
$(TASM) $(TASMFLAGS) $< $@ $(@:.bin=.lst)
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
rm build.inc
|
||||
|
||||
S100_%.imgpad2.bin: s100mon.bin
|
||||
cp $< $@
|
||||
srec_cat $@ -Binary -Crop 0 0x7FFF -Checksum_Negative_Big_Endian 0x7FFF 1 1 -o $@ -Binary
|
||||
|
||||
%.rom: %.hbios_rom.bin %.osimg.bin %.osimg1.bin %.imgpad2.bin %.hbios_env.sh
|
||||
. ./$(*F).hbios_env.sh
|
||||
if [ $$ROMSIZE -gt 0 ] ; then RD="rom$$ROMSIZE" ; else RD="ram$$RAMSIZE" ; fi
|
||||
cat $(*F).hbios_rom.bin $(*F).osimg.bin $(*F).osimg1.bin $(*F).imgpad2.bin ../RomDsk/$${RD}_wbw.dat >$@
|
||||
|
||||
UNA_%.rom: UNA_%.osimg.bin UNA_%.hbios_env.sh
|
||||
. ./UNA_$(*F).hbios_env.sh
|
||||
cat ../UBIOS/UNA-BIOS.BIN UNA_$(*F).osimg.bin ../UBIOS/FSFAT.BIN ../RomDsk/rom$${ROMSIZE}_una.dat >$@
|
||||
cp UNA_$(*F).osimg.bin $(DEST)/UNA_WBW_SYS.bin
|
||||
cp ../RomDsk/rom$${ROMSIZE}_una.dat $(DEST)/UNA_WBW_ROM$${ROMSIZE}.bin
|
||||
|
||||
%.com: %.hbios_app.bin %.osimg_small.bin
|
||||
cat $(*F).hbios_app.bin $(*F).osimg_small.bin >$@
|
||||
|
||||
%.upd: %.hbios_rom.bin %.osimg.bin %.osimg1.bin %.imgpad2.bin
|
||||
cat $(*F).hbios_rom.bin $(*F).osimg.bin $(*F).osimg1.bin $(*F).imgpad2.bin >$@
|
||||
|
||||
@@ -3,6 +3,10 @@
|
||||
; ANSI EMULATION MODULE
|
||||
;==================================================================================================
|
||||
;
|
||||
; ENHANCED BY: JOSE L. COLLADO -- 12/21/2023 -
|
||||
; NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS
|
||||
; (SEE ANSI CONTROL SEQUENCE DISPATCHING SECTION BELOW FOR DETAILS)
|
||||
;
|
||||
; TODO:
|
||||
; 1) INSERT/DELETE CHARACTERS CTL SEQUENCES
|
||||
; 2) OTHER CTL SEQUENCES?
|
||||
@@ -61,6 +65,7 @@ ANSI_RESET:
|
||||
LD (ANSI_ATTR),A ; CLEAR ATTRIBUTES
|
||||
LD A,ANSI_DEFCOLOR ; DEFAULT COLOR
|
||||
LD (ANSI_COLOR),A ; RESET COLOR
|
||||
LD (ANSI_SCOLOR),A ; RESET SCREEN COLOR
|
||||
XOR A ; ZERO ACCUM
|
||||
LD (ANSI_WRAP),A ; CLEAR WRAP FLAG
|
||||
LD (ANSI_LNM),A ; SET LINE FEED NEW LINE MODE
|
||||
@@ -385,6 +390,17 @@ ANSI_ESCDISP2: ; ESC DISPATCHING FOR '#' INT CHAR
|
||||
; ANSI CONTROL SEQUENCE DISPATCHING
|
||||
;==================================================================================================
|
||||
;
|
||||
;--------------------------------------------------------------------------------------------------
|
||||
; ### JLC Mod - NEW ANSI PRIVATE SEQUENCE TO INIT VDU AND CHANGE DEFAULT COLORS ###
|
||||
;--------------------------------------------------------------------------------------------------
|
||||
; Follows ANSI Standards described in VT100.net for Private Sequences.
|
||||
; Implements the ESC Seq.: \ESC[{Num1};{Num2}'{' where '{' is the final char of new Private Sequence.
|
||||
; Initializes the VDU and Changes Default Colors according to the following table:
|
||||
; {Num1}: 30..37 - Foreground color (black, red, green, yellow, blue, magenta, cyan, white)
|
||||
; {Num2}: 40..47 - Background color (black, red, green, yellow, blue, magenta, cyan, white)
|
||||
;
|
||||
; Example: \ESC[37;44{ sets text to white on blue background, \ESC[0{ returns to default colors.
|
||||
;
|
||||
ANSI_CTLDISP:
|
||||
LD (ANSI_FINAL),A ; RECORD THE FINAL CHARACTER
|
||||
#IF (ANSITRACE >= 2)
|
||||
@@ -453,6 +469,11 @@ ANSI_STD1: ; DISPATCH FOR FINAL CHAR W/ NO INTERMEDIATE CHAR AND NO PRIVATE CHAR
|
||||
CP 'm' ; SGR: SELECT GRAPHIC RENDITION
|
||||
JP Z,ANSI_SGR
|
||||
; CHECK FOR ANY OTHERS HERE
|
||||
; ### JLC Mod - New Private Sequence with Parameters checked here...
|
||||
CP '{' ; SSC: SET SCREEN COLORS
|
||||
JP Z,ANSI_SSC
|
||||
;
|
||||
; ANY OTHERS ARE IGNORED
|
||||
JR ANSI_UNK ; UNKNOWN, ABORT
|
||||
;
|
||||
ANSI_DEC: ; DISPATCH ON INTERMEDIATE CHAR W/ PRIVATE CHAR = '?' (DEC)
|
||||
@@ -1147,14 +1168,15 @@ ANSI_SGR1: ; PROCESSING LOOP
|
||||
INC HL ; POINT TO NEXT PARM
|
||||
DJNZ ANSI_SGR1 ; LOOP TILL DONE
|
||||
;
|
||||
; NOW IMPLEMENT ALL CHANGES
|
||||
; NOW IMPLEMENT ALL CHANGES FOR SGR
|
||||
LD A,(ANSI_ATTR) ; GET THE ATTRIBUTE VALUE
|
||||
LD E,A ; MOVE TO E
|
||||
LD B,BF_VDASAT ; SET ATTRIBUTE FUNCTION
|
||||
CALL ANSI_VDADISP ; CALL THE FUNCTION
|
||||
LD A,(ANSI_COLOR) ; GET THE COLOR VALUE
|
||||
LD E,A ; MOVE TO E
|
||||
LD B,BF_VDASCO ; SET ATTRIBUTE FUNCTION
|
||||
LD D,0 ; SET INDIVIDUAL CHAR COLORS
|
||||
LD B,BF_VDASCO ; SET COLOR FUNCTION
|
||||
CALL ANSI_VDADISP ; CALL THE FUNCTION
|
||||
RET ; RETURN
|
||||
;
|
||||
@@ -1234,6 +1256,81 @@ ANSI_SGR_BG:
|
||||
;
|
||||
;
|
||||
;
|
||||
;......................................................................................
|
||||
; ### JLC Mod - Implement new Private Sequence to call VDASCO and Change Default Colors
|
||||
;
|
||||
ANSI_SSC: ; SET SCREEN COLOR (CUSTOM EXTENSION)
|
||||
LD A,(ANSI_PARIDX) ; GET CURRENT PARM INDEX
|
||||
INC A ; INC TO MAKE IT THE COUNT
|
||||
LD B,A ; B IS NOW LOOP COUNTER
|
||||
LD HL,ANSI_PARLST ; HL POINTS TO START OF PARM LIST
|
||||
;
|
||||
ANSI_SSC1: ; PROCESSING LOOP
|
||||
PUSH BC ; PRESERVE BC
|
||||
PUSH HL ; PRESERVE HL
|
||||
LD A,(HL)
|
||||
CALL ANSI_SSC2 ; HANDLE PARM
|
||||
POP HL ; RESTORE HL
|
||||
POP BC ; RESTORE BC
|
||||
INC HL ; POINT TO NEXT PARM
|
||||
DJNZ ANSI_SSC1 ; LOOP TILL DONE
|
||||
;
|
||||
; NOW IMPLEMENT ALL CHANGES FOR SSC
|
||||
LD A,(ANSI_SCOLOR) ; GET THE COLOR VALUE
|
||||
LD E,A ; MOVE TO E
|
||||
LD D,1 ; SET SCREEN COLORS
|
||||
LD B,BF_VDASCO ; SET COLOR FUNCTION
|
||||
CALL ANSI_VDADISP ; CALL THE FUNCTION
|
||||
RET ; RETURN
|
||||
;
|
||||
ANSI_SSC2: ; HANDLE THE REQUEST CODE
|
||||
CP 0 ; ALL OFF
|
||||
JR Z,ANSI_SSC_OFF ; DO IT
|
||||
CP 30 ; START OF FOREGROUND
|
||||
RET C ; OUT OF RANGE
|
||||
CP 38 ; END OF RANGE
|
||||
JR C,ANSI_SSC_FG ; SET FOREGROUND
|
||||
CP 40 ; START OF BACKGROUND
|
||||
RET C ; OUT OF RANGE
|
||||
CP 48 ; END OF RANGE
|
||||
JR C,ANSI_SSC_BG ; SET BACKGROUND
|
||||
RET ; OTHERWISE OUT OF RANGE
|
||||
;
|
||||
ANSI_SSC_OFF:
|
||||
LD A,ANSI_DEFCOLOR ; DEFAULT COLOR
|
||||
LD (ANSI_SCOLOR),A ; RESET COLOR
|
||||
RET
|
||||
;
|
||||
ANSI_SSC_BOLD:
|
||||
LD A,(ANSI_SCOLOR) ; LOAD CURRENT COLOR
|
||||
OR %00001000 ; SET BOLD BIT
|
||||
LD (ANSI_SCOLOR),A ; SAVE IT
|
||||
RET
|
||||
;
|
||||
ANSI_SSC_FG:
|
||||
SUB 30
|
||||
LD E,A
|
||||
LD A,(ANSI_SCOLOR)
|
||||
AND %11111000
|
||||
OR E
|
||||
LD (ANSI_SCOLOR),A
|
||||
RET
|
||||
;
|
||||
ANSI_SSC_BG:
|
||||
SUB 40
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
RLCA
|
||||
LD E,A
|
||||
LD A,(ANSI_SCOLOR)
|
||||
AND %10001111
|
||||
OR E
|
||||
LD (ANSI_SCOLOR),A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
ANSI_DECALN: ; DEC SCREEN ALIGNMENT TEST
|
||||
LD DE,0 ; PREPARE TO HOME CURSOR
|
||||
LD (ANSI_POS),DE ; SAVE NEW CURSOR POSITION
|
||||
@@ -1394,7 +1491,8 @@ ANSI_ROWS .DB 24 ; NUMBER OF ROWS ON SCREEN
|
||||
;
|
||||
ANSI_STATE .DW PANIC ; CURRENT FUNCTION FOR STATE MACHINE
|
||||
ANSI_ATTR .DB ANSI_DEFATTR ; CURRENT CHARACTER ATTRIBUTE
|
||||
ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER COLOR;
|
||||
ANSI_COLOR .DB ANSI_DEFCOLOR ; CURRENT CHARACTER FG/BG COLOR
|
||||
ANSI_SCOLOR .DB ANSI_DEFCOLOR ; CURRENT SCREEN FG/BG COLOR
|
||||
ANSI_WRAP .DB 0 ; WRAP PENDING FLAG
|
||||
ANSI_TABS .FILL 32,0 ; TAB STOP BIT MAP (256 BITS)
|
||||
ANSI_LNM .DB 0 ; LINE FEED NEW LINE MODE FLAG
|
||||
@@ -1415,3 +1513,25 @@ ANSI_VARLEN .EQU $ - ANSI_VARS
|
||||
;
|
||||
ANSI_VDAUNIT .DB $FF ; VIDEO UNIT NUM OF ATTACHED VDA DEVICE
|
||||
ANSI_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER
|
||||
;
|
||||
;=============================================================
|
||||
; BASIC ANSI COLOR TABLE (NIBBLES FOR FOREGROUND & BACKGROUND)
|
||||
; ------------------------------------------------------------
|
||||
; 0 Black
|
||||
; 1 Red
|
||||
; 2 Green
|
||||
; 3 Brown
|
||||
; 4 Blue
|
||||
; 5 Magenta
|
||||
; 6 Cyan
|
||||
; 7 White
|
||||
; 8 Gray
|
||||
; 9 Light Red
|
||||
; A Light Green
|
||||
; B Yellow
|
||||
; C Light Blue
|
||||
; D Light Magenta
|
||||
; E Light Cyan
|
||||
; F Bright White
|
||||
;=============================================================
|
||||
;
|
||||
@@ -78,12 +78,12 @@ 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 FUNCTIONALITY
|
||||
DSKYENABLE .EQU TRUE ; ENABLES DSKY FUNCTIONALITY
|
||||
DSKYDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY
|
||||
ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218)
|
||||
ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI
|
||||
PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259)
|
||||
PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI
|
||||
ICMPPIBASE .EQU $88 ; BASE I/O ADDRESS OF ICM PPI
|
||||
PKDENABLE .EQU TRUE ; ENABLES DSKY NG PKD DRIVER (8259)
|
||||
PKDPPIBASE .EQU $88 ; BASE I/O ADDRESS OF PKD PPI
|
||||
PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ)
|
||||
H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL
|
||||
;
|
||||
|
||||
1504
Source/HBIOS/ch.asm
1504
Source/HBIOS/ch.asm
File diff suppressed because it is too large
Load Diff
685
Source/HBIOS/chsd.asm
Normal file
685
Source/HBIOS/chsd.asm
Normal file
@@ -0,0 +1,685 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; CH376 SD CARD SUB-DRIVER
|
||||
;==================================================================================================
|
||||
;
|
||||
; Thanks and credit to Alan Cox. Much of this driver is based on
|
||||
; his code in FUZIX (https://github.com/EtchedPixels/FUZIX).
|
||||
;
|
||||
; This file contains the SD Card specific support for the CH37x
|
||||
; driver. This file is included by the core driver file (ch.asm) as
|
||||
; needed. Note that only the CH376 actually supports SD Card access.
|
||||
;
|
||||
; The SD Card support is implemented using the CH376 file-level
|
||||
; support. It is *not* possible to access SD Cards using raw
|
||||
; sector I/O.
|
||||
;
|
||||
; TODO:
|
||||
; - Implement auto-recovery on error status?
|
||||
;
|
||||
#DEFINE CHSD_IMGFILE "DISK.IMG"
|
||||
;
|
||||
CHSD_FASTIO .EQU TRUE ; USE INIR/OTIR?
|
||||
;
|
||||
; CHUSB DEVICE STATUS
|
||||
;
|
||||
CHSD_STOK .EQU 0
|
||||
CHSD_STNOMEDIA .EQU -1
|
||||
CHSD_STCMDERR .EQU -2
|
||||
CHSD_STIOERR .EQU -3
|
||||
CHSD_STTO .EQU -4
|
||||
CHSD_STNOTSUP .EQU -5
|
||||
CHSD_STNOFILE .EQU -6
|
||||
;
|
||||
; CHSD DEVICE CONFIGURATION
|
||||
;
|
||||
CHSD_CFGSIZ .EQU 14 ; SIZE OF USB CFG TBL ENTRIES
|
||||
;
|
||||
; CONFIG ENTRY DATA OFFSETS
|
||||
;
|
||||
; THE LOCATION OF CHSD_MODE IS SHARED BY ALL SUB-DRIVERS AND THE
|
||||
; CH_SETMODE FUNCTION IN THE MAIN DRIVER (CH.ASM). IF YOU CHANGE
|
||||
; IT, YOU MUST SYNC UP THE MAIN DRIVER AND ALL SUB-DRIVERS!
|
||||
;
|
||||
; FIRST 3 BYTES SAME AS CH CONFIG
|
||||
CHSD_STAT .EQU 3 ; LAST STATUS (BYTE)
|
||||
CHSD_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
|
||||
CHSD_LBA .EQU 8 ; CURRENT LBA (DWORD)
|
||||
CHSD_MODE .EQU 12 ; PTR TO MODE BYTE (WORD)
|
||||
;
|
||||
CHSD_CFGTBL:
|
||||
;
|
||||
#IF (CHCNT >= 1)
|
||||
CHSD_CFG0:
|
||||
.DB 0 ; DEV NUM, FILLED DYNAMICALLY
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH0BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH0_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH0SDENABLE)
|
||||
.ECHO "CHSD: IO="
|
||||
.ECHO CH0BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CHCNT >= 2)
|
||||
CHSD_CFG1:
|
||||
.DB 0 ; DEV NUM
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH1BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH1_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH1SDENABLE)
|
||||
.ECHO "CHSD: IO="
|
||||
.ECHO CH1BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF ($ - CHSD_CFGTBL) != (CHCNT * CHSD_CFGSIZ)
|
||||
.ECHO "*** INVALID CHSD CONFIG TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
.DB $FF ; END OF TABLE MARKER
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_INIT:
|
||||
LD A,(IY+CH_TYPE) ; GET DEVICE TYPE
|
||||
PUSH HL ; COPY INCOMING HL
|
||||
POP IY ; ... TO IY
|
||||
LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE
|
||||
;
|
||||
; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE
|
||||
LD A,(CHSD_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN
|
||||
LD (IY+CH_DEV),A ; UPDATE IT
|
||||
INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN
|
||||
LD (CHSD_DEVNUM),A ; SAVE IT
|
||||
;
|
||||
; ADD UNIT TO GLOBAL DISK UNIT TABLE
|
||||
LD BC,CHSD_FNTBL ; BC := FUNC TABLE ADR
|
||||
PUSH IY ; CFG ENTRY POINTER
|
||||
POP DE ; COPY TO DE
|
||||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
|
||||
;
|
||||
CALL CHSD_RESET ; RESET & DISCOVER MEDIA
|
||||
#IF (CHSDTRACE <= 1)
|
||||
CALL NZ,CHSD_PRTSTAT
|
||||
#ENDIF
|
||||
RET NZ ; ABORT ON FAILURE
|
||||
;
|
||||
; START PRINTING DEVICE INFO
|
||||
CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
;
|
||||
; PRINT STORAGE CAPACITY (BLOCK COUNT)
|
||||
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
|
||||
LD A,CHSD_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CAPACITY VALUE
|
||||
CALL PRTHEX32 ; PRINT HEX VALUE
|
||||
;
|
||||
; PRINT STORAGE SIZE IN MB
|
||||
PRTS(" SIZE=$") ; PRINT FIELD LABEL
|
||||
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
||||
CALL SRL32 ; RIGHT SHIFT
|
||||
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
|
||||
PRTS("MB$") ; PRINT SUFFIX
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; DRIVER FUNCTION TABLE
|
||||
;
|
||||
CHSD_FNTBL:
|
||||
.DW CHSD_STATUS
|
||||
.DW CHSD_RESET
|
||||
.DW CHSD_SEEK
|
||||
.DW CHSD_READ
|
||||
.DW CHSD_WRITE
|
||||
.DW CHSD_VERIFY
|
||||
.DW CHSD_FORMAT
|
||||
.DW CHSD_DEVICE
|
||||
.DW CHSD_MEDIA
|
||||
.DW CHSD_DEFMED
|
||||
.DW CHSD_CAP
|
||||
.DW CHSD_GEOM
|
||||
#IF (($ - CHSD_FNTBL) != (DIO_FNCNT * 2))
|
||||
.ECHO "*** INVALID CHSD FUNCTION TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
CHSD_VERIFY:
|
||||
CHSD_FORMAT:
|
||||
CHSD_DEFMED:
|
||||
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_READ:
|
||||
LD A,CH_MODE_SD ; REQUEST SD MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHSD_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
|
||||
LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL CHSD_RWSTART ; SET LBA OFFSET
|
||||
RET NZ
|
||||
;
|
||||
;PRTS("\n\rREAD:$") ; *DEBUG*
|
||||
LD A,CH_CMD_BYTERD ; BYTE READ
|
||||
CALL CH_CMD ; SEND COMMAND
|
||||
CALL CH_NAP
|
||||
LD A,0 ; LSB
|
||||
CALL CH_WR ; SEND IT
|
||||
LD A,2 ; MSB
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1D ; DATA READY TO READ?
|
||||
JP NZ,CHSD_IOERR ; HANDLE I/O ERROR
|
||||
;
|
||||
LD HL,(CHSD_DSKBUF)
|
||||
CHSD_READ1:
|
||||
CALL CH_CMD_RD ; SEND READ USB DATA CMD
|
||||
CALL CH_RD ; GET DATA LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
#IF (CHSD_FASTIO)
|
||||
LD B,A ; BYTE COUNT TO READ
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
INIR ; DO IT FAST
|
||||
#ELSE
|
||||
LD B,A ; SAVE IT
|
||||
CHSD_READ2:
|
||||
CALL CH_RD ; GET DATA BYTE
|
||||
LD (HL),A ; SAVE IN BUFFER
|
||||
INC HL ; INC BUF PTR
|
||||
DJNZ CHSD_READ2 ; LOOP TILL DONE W/ ALL BYTES
|
||||
#ENDIF
|
||||
;
|
||||
LD A,CH_CMD_BYTERDGO ; BYTE READ GO COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_NAP
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1D ; MORE?
|
||||
JR Z,CHSD_READ1 ; IF SO, GET MORE
|
||||
CP $14 ; GOOD FINISH?
|
||||
JP NZ,CHSD_IOERR ; HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHSD_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_WRITE:
|
||||
LD A,CH_MODE_SD ; REQUEST SD MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHSD_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
|
||||
LD (CHSD_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
CALL CHSD_RWSTART ; SET LBA OFFSET'
|
||||
RET NZ
|
||||
;
|
||||
;PRTS("\n\rWRITE:$") ; *DEBUG*
|
||||
LD A,CH_CMD_BYTEWR ; BYTE WRITE
|
||||
CALL CH_CMD ; SEND COMMAND
|
||||
LD A,0 ; LSB
|
||||
CALL CH_WR ; SEND IT
|
||||
LD A,2 ; MSB
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1E ; DATA READY TO GO?
|
||||
JP NZ,CHSD_IOERR ; HANDLE I/O ERROR
|
||||
;
|
||||
LD HL,(CHSD_DSKBUF)
|
||||
CHSD_WRITE1:
|
||||
LD A,CH_CMD_WRREQDAT ; WRITE REQUESTED DATA CMD
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_RD ; GET DATA LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
#IF (CHSD_FASTIO)
|
||||
LD B,A ; BYTE COUNT TO WRITE
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
OTIR ; DO IT FAST
|
||||
#ELSE
|
||||
LD B,A ; SAVE IT
|
||||
CHSD_WRITE2:
|
||||
CALL CH_WR ; WRITE DATA BYTE
|
||||
LD (HL),A ; SAVE IN BUFFER
|
||||
INC HL ; INC BUF PTR
|
||||
DJNZ CHSD_WRITE2 ; LOOP TILL DONE W/ ALL BYTES
|
||||
#ENDIF
|
||||
;
|
||||
LD A,CH_CMD_BYTEWRGO ; BYTE WRITE GO COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_NAP
|
||||
CALL CH_POLL ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $1E ; MORE?
|
||||
JR Z,CHSD_WRITE1 ; IF SO, SEND MORE
|
||||
CP $14 ; GOOD FINISH?
|
||||
JP NZ,CHSD_IOERR ; HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHSD_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; SEEK TO CURRENT LBA
|
||||
;
|
||||
CHSD_RWSTART:
|
||||
;PRTS("\n\rRWST:$") ; *DEBUG*
|
||||
LD A,CH_CMD_BYTE_LOC ; BYTE LOCATE COMMAND (SEEK)
|
||||
CALL CH_CMD ; SEND IT
|
||||
;
|
||||
; GET CURRENT LBA OFFSET
|
||||
LD A,CHSD_LBA ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; OFFSET = DE:HL
|
||||
;
|
||||
; CONVERT OFFSET FROM LBA TO BYTE
|
||||
LD B,9
|
||||
CHSD_RWSTART1:
|
||||
SLA L
|
||||
RL H
|
||||
RL E
|
||||
RL D
|
||||
DJNZ CHSD_RWSTART1
|
||||
;CALL PRTHEX32 ; *DEBUG*
|
||||
;
|
||||
; SEND THE BYTE OFFSET (LSB FIRST)
|
||||
LD A,L
|
||||
CALL CH_WR
|
||||
LD A,H
|
||||
CALL CH_WR
|
||||
LD A,E
|
||||
CALL CH_WR
|
||||
LD A,D
|
||||
CALL CH_WR
|
||||
;
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; CHECK RESULT
|
||||
JP NZ,CHSD_CMDERR ; HANDLE CMD ERROR
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_STATUS:
|
||||
; RETURN UNIT STATUS
|
||||
LD A,(IY+CHSD_STAT) ; GET STATUS OF SELECTED DEVICE
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; RESET THE INTERFACE AND REDISCOVER MEDIA
|
||||
;
|
||||
CHSD_RESET:
|
||||
;PRTS("\n\rRES SD:$") ; *DEBUG*
|
||||
;
|
||||
; ACTIVATE SD MODE
|
||||
LD A,CH_CMD_MODE ; SET MODE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,3 ; SD MODE
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
;
|
||||
LD A,CH_MODE_SD ; WE ARE NOW IN SD MODE
|
||||
LD L,(IY+CHSD_MODE+0) ; GET MODE PTR (LSB)
|
||||
LD H,(IY+CHSD_MODE+1) ; GET MODE PTR (MSB)
|
||||
LD (HL),A ; SAVE IT
|
||||
;
|
||||
CALL CHSD_DSKMNT ; MOUNT DISK
|
||||
RET NZ
|
||||
;
|
||||
; OPEN DISK IMAGE FILE
|
||||
LD DE,CHSD_FNAME
|
||||
CALL CHSD_FOPEN
|
||||
RET NZ
|
||||
;
|
||||
; GET FILESIZE
|
||||
CALL CHSD_FILESIZE
|
||||
RET NZ
|
||||
;
|
||||
; SET STATUS AND RETURN
|
||||
XOR A ; CLEAR STATUS
|
||||
LD (IY+CHSD_STAT),A ; RECORD STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_DEVICE:
|
||||
LD D,DIODEV_CHSD ; D := DEVICE TYPE
|
||||
LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00110010 ; SD HARD DISK ATTRIBUTES
|
||||
LD H,(IY+CH_TYPE) ; H := MODE
|
||||
LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; CHSD_GETMED
|
||||
;
|
||||
CHSD_MEDIA:
|
||||
LD A,E ; GET FLAGS
|
||||
OR A ; SET FLAGS
|
||||
JR Z,CHSD_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
|
||||
CALL CHSD_RESET ; RESET CHSD INTERFACE
|
||||
;
|
||||
CHSD_MEDIA1:
|
||||
LD A,(IY+CHSD_STAT) ; GET STATUS
|
||||
OR A ; SET FLAGS
|
||||
LD D,0 ; NO MEDIA CHANGE DETECTED
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
RET Z ; RETURN IF GOOD INIT
|
||||
LD E,MID_NONE ; SIGNAL NO MEDIA
|
||||
LD A,ERR_NOMEDIA ; NO MEDIA ERROR
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_SEEK:
|
||||
BIT 7,D ; CHECK FOR LBA FLAG
|
||||
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
|
||||
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
|
||||
LD (IY+CHSD_LBA+0),L ; SAVE NEW LBA
|
||||
LD (IY+CHSD_LBA+1),H ; ...
|
||||
LD (IY+CHSD_LBA+2),E ; ...
|
||||
LD (IY+CHSD_LBA+3),D ; ...
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_CAP:
|
||||
LD A,(IY+CHSD_STAT) ; GET STATUS
|
||||
PUSH AF ; SAVE IT
|
||||
LD A,CHSD_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL
|
||||
LD BC,512 ; 512 BYTES PER BLOCK
|
||||
POP AF ; RECOVER STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_GEOM:
|
||||
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
|
||||
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
|
||||
CALL CHSD_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
|
||||
LD L,H ; DIVIDE BY 256 FOR # TRACKS
|
||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||
LD E,16 ; SECTORS / TRACK = 16
|
||||
RET ; DONE, A STILL HAS CHSD_CAP STATUS
|
||||
;
|
||||
; CH37X HELPER ROUTINES
|
||||
;
|
||||
;
|
||||
; PERFORM DISK MOUNT
|
||||
;
|
||||
CHSD_DSKMNT:
|
||||
;PRTS("\n\rMOUNT:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKMNT ; DISK QUERY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $82 ; NO DISK?
|
||||
JP Z,CHSD_NOMEDIA ; HANDLE NO MEDIA ERROR
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHSD_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
#IF FALSE
|
||||
CALL CH_CMD_RD ; SEND READ COMMAND
|
||||
CALL CH_RD ; GET LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
LD B,A ; LOOP COUNTER
|
||||
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
|
||||
CHSD_DSKMNT1:
|
||||
CALL CH_RD ; GET A BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; BUMP BUF PTR
|
||||
DJNZ CHSD_DSKMNT1 ; LOOP FOR ALL DATA
|
||||
;
|
||||
;LD DE,HB_WRKBUF ; *DEBUG*
|
||||
;CALL DUMP_BUFFER ; *DEBUG*
|
||||
;
|
||||
CALL CHSD_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
LD HL,HB_WRKBUF + 8
|
||||
LD B,28
|
||||
CHSD_DSKMNT2:
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
CALL COUT
|
||||
DJNZ CHSD_DSKMNT2
|
||||
#ENDIF
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; SET FILE NAME
|
||||
;
|
||||
CHSD_SETFNAME:
|
||||
;PRTS("\n\rSETFNAME:$") ; *DEBUG*
|
||||
LD A,CH_CMD_SET_FN ; SET FILE NAME COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_NAP
|
||||
;CALL DELAY ; MAY NOT BE NEEDED
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
CHSD_SETFNAME1:
|
||||
;CALL DELAY
|
||||
LD A,(DE) ; GET NEXT BYTE
|
||||
INC DE ; BUMP POINTER
|
||||
CALL CH_WR ; SEND IT
|
||||
;CALL COUT ; *DEBUG*
|
||||
OR A ; CHECK FOR NUL (EOS)
|
||||
RET Z ; IF NUL, DONE
|
||||
JR CHSD_SETFNAME1 ; SEND MORE CHARACTERS
|
||||
;
|
||||
; OPEN FILE
|
||||
;
|
||||
CHSD_FOPEN:
|
||||
CALL CHSD_SETFNAME
|
||||
;PRTS("\n\rFOPEN:$") ; *DEBUG*
|
||||
LD A,CH_CMD_FOPEN ; FILE OPEN COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_POLL ; WAIT FOR RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $42 ; MISSING FILE?
|
||||
JP Z,CHSD_NOFILE ; HANDLE ERROR
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHSD_IOERR ; HANDLE ERROR
|
||||
RET ; RETURN WITH ZF SET APPROPRIATELY
|
||||
;
|
||||
; GET FILE SIZE
|
||||
;
|
||||
CHSD_FILESIZE:
|
||||
;PRTS("\n\rFSIZE:$")
|
||||
LD A,CH_CMD_FILESIZE ; FILE SIZE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,$68 ; REQUIRED CMD PARAMETER
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP
|
||||
LD A,CHSD_MEDCAP ; MEDIA CAPACITY OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
PUSH HL ; SAVE ADDRESS
|
||||
CALL CH_RD
|
||||
LD L,A
|
||||
CALL CH_RD
|
||||
LD H,A
|
||||
CALL CH_RD
|
||||
LD E,A
|
||||
CALL CH_RD
|
||||
LD D,A
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEX32 ; *DEBUG*
|
||||
LD B,9 ; ROTATE 9 BITS FOR DIV 512
|
||||
CHSD_FILESIZE1:
|
||||
SRL D
|
||||
RR E
|
||||
RR H
|
||||
RR L
|
||||
DJNZ CHSD_FILESIZE1 ; LOOP TILL DONE
|
||||
POP BC ; RECOVER ADDRESS TO BC
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEX32 ; *DEBUG*
|
||||
CALL ST32 ; STORE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
; ERROR HANDLERS
|
||||
;
|
||||
;
|
||||
CHSD_NOFILE:
|
||||
LD A,CHSD_STNOFILE
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_NOMEDIA:
|
||||
LD A,CHSD_STNOMEDIA
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_CMDERR:
|
||||
LD A,CHSD_STCMDERR
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_IOERR:
|
||||
LD A,CHSD_STIOERR
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_TO:
|
||||
LD A,CHSD_STTO
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_NOTSUP:
|
||||
LD A,CHSD_STNOTSUP
|
||||
JR CHSD_ERR
|
||||
;
|
||||
CHSD_ERR:
|
||||
LD (IY+CHSD_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
CHSD_ERR2:
|
||||
#IF (CHSDTRACE >= 2)
|
||||
CALL CHSD_PRTSTAT
|
||||
#ENDIF
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHSD_PRTERR:
|
||||
RET Z ; DONE IF NO ERRORS
|
||||
; FALL THRU TO CHSD_PRTSTAT
|
||||
;
|
||||
; PRINT FULL DEVICE STATUS LINE
|
||||
;
|
||||
CHSD_PRTSTAT:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHSD_STAT)
|
||||
CALL CHSD_PRTPREFIX ; PRINT UNIT PREFIX
|
||||
CALL PC_SPACE ; FORMATTING
|
||||
CALL CHSD_PRTSTATSTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT STATUS STRING
|
||||
;
|
||||
CHSD_PRTSTATSTR:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHSD_STAT)
|
||||
NEG
|
||||
LD HL,CHSD_STR_ST_MAP
|
||||
ADD A,A
|
||||
CALL ADDHLA
|
||||
LD E,(HL)
|
||||
INC HL
|
||||
LD D,(HL)
|
||||
CALL WRITESTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT DIAGNONSTIC PREFIX
|
||||
;
|
||||
CHSD_PRTPREFIX:
|
||||
PUSH AF
|
||||
CALL NEWLINE
|
||||
PRTS("CHSD$")
|
||||
LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM
|
||||
CALL PRTDECB
|
||||
CALL PC_COLON
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; DATA STORAGE
|
||||
;
|
||||
CHSD_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
CHSD_DSKBUF .DW 0
|
||||
;
|
||||
CHSD_FNAME .DB "/", CHSD_IMGFILE, 0
|
||||
;
|
||||
CHSD_STR_ST_MAP:
|
||||
.DW CHSD_STR_STOK
|
||||
.DW CHSD_STR_STNOMEDIA
|
||||
.DW CHSD_STR_STCMDERR
|
||||
.DW CHSD_STR_STIOERR
|
||||
.DW CHSD_STR_STTO
|
||||
.DW CHSD_STR_STNOTSUP
|
||||
.DW CHSD_STR_STNOFILE
|
||||
;
|
||||
CHSD_STR_STOK .TEXT "OK$"
|
||||
CHSD_STR_STNOMEDIA .TEXT "NO MEDIA$"
|
||||
CHSD_STR_STCMDERR .TEXT "COMMAND ERROR$"
|
||||
CHSD_STR_STIOERR .TEXT "IO ERROR$"
|
||||
CHSD_STR_STTO .TEXT "TIMEOUT$"
|
||||
CHSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
|
||||
CHSD_STR_STNOFILE .TEXT "MISSING "
|
||||
.TEXT CHSD_IMGFILE
|
||||
.TEXT " FILE$"
|
||||
CHSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
|
||||
792
Source/HBIOS/chusb.asm
Normal file
792
Source/HBIOS/chusb.asm
Normal file
@@ -0,0 +1,792 @@
|
||||
;
|
||||
;==================================================================================================
|
||||
; CH375/376 USB SUB-DRIVER
|
||||
;==================================================================================================
|
||||
;
|
||||
; Thanks and credit to Alan Cox. Much of this driver is based on
|
||||
; his code in FUZIX (https://github.com/EtchedPixels/FUZIX).
|
||||
;
|
||||
; This file contains the USB Drive specific support for the CH37x
|
||||
; driver. This file is included by the core driver file (ch.asm) as
|
||||
; needed.
|
||||
;
|
||||
; The USB support is implemented as pure raw sector I/O. The CH376
|
||||
; file-level support is not utilized.
|
||||
;
|
||||
; NOTES:
|
||||
; - There seem to be compatibility issues with older USB thumb drives.
|
||||
; Such drives will complete DISK_INIT successfully, but then return
|
||||
; an error attempting to do any I/O. The error is $17 indicating
|
||||
; the CH37x encountered an overflow during communication with the
|
||||
; device. I found that adding a DISK_MOUNT command (only possible
|
||||
; on CH376) resolved the issue for some devices, so that has been
|
||||
; added to the RESET routine when using CH376.
|
||||
;
|
||||
; TODO:
|
||||
; - Implement auto-recovery on error status?
|
||||
;
|
||||
CHUSB_FASTIO .EQU TRUE ; USE INIR/OTIR?
|
||||
;
|
||||
; CHUSB DEVICE STATUS
|
||||
;
|
||||
CHUSB_STOK .EQU 0
|
||||
CHUSB_STNOMEDIA .EQU -1
|
||||
CHUSB_STCMDERR .EQU -2
|
||||
CHUSB_STIOERR .EQU -3
|
||||
CHUSB_STTO .EQU -4
|
||||
CHUSB_STNOTSUP .EQU -5
|
||||
;
|
||||
; CHUSB DEVICE CONFIGURATION
|
||||
;
|
||||
CHUSB_CFGSIZ .EQU 14 ; SIZE OF USB CFG TBL ENTRIES
|
||||
;
|
||||
; CONFIG ENTRY DATA OFFSETS
|
||||
;
|
||||
; THE LOCATION OF CHSD_MODE IS SHARED BY ALL SUB-DRIVERS AND THE
|
||||
; CH_SETMODE FUNCTION IN THE MAIN DRIVER (CH.ASM). IF YOU CHANGE
|
||||
; IT, YOU MUST SYNC UP THE MAIN DRIVER AND ALL SUB-DRIVERS!
|
||||
;
|
||||
; FIRST 3 BYTES SAME AS CH CONFIG
|
||||
CHUSB_STAT .EQU 3 ; LAST STATUS (BYTE)
|
||||
CHUSB_MEDCAP .EQU 4 ; MEDIA CAPACITY (DWORD)
|
||||
CHUSB_LBA .EQU 8 ; CURRENT LBA (DWORD)
|
||||
CHUSB_MODE .EQU 12 ; PTR TO MODE BYTE (WORD)
|
||||
;
|
||||
CHUSB_CFGTBL:
|
||||
;
|
||||
#IF (CHCNT >= 1)
|
||||
CHUSB_CFG0:
|
||||
.DB 0 ; DEV NUM, FILLED DYNAMICALLY
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH0BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH0_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH0USBENABLE)
|
||||
.ECHO "CHUSB: IO="
|
||||
.ECHO CH0BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF (CHCNT >= 2)
|
||||
CHUSB_CFG1:
|
||||
.DB 0 ; DEV NUM
|
||||
.DB CHTYP_NONE ; DEV TYPE, FILLED DYNCAMICALLY
|
||||
.DB CH1BASE ; IO BASE ADDRESS
|
||||
.DB 0 ; DEVICE STATUS
|
||||
.DW 0,0 ; DEVICE CAPACITY
|
||||
.DW 0,0 ; CURRENT LBA
|
||||
.DW CH1_MODE ; POINTER TO MODE BYTE
|
||||
;
|
||||
#IF (CH1USBENABLE)
|
||||
.ECHO "CHUSB: IO="
|
||||
.ECHO CH1BASE
|
||||
.ECHO "\n"
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
#IF ($ - CHUSB_CFGTBL) != (CHCNT * CHUSB_CFGSIZ)
|
||||
.ECHO "*** INVALID CHUSB CONFIG TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
.DB $FF ; END OF TABLE MARKER
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_INIT:
|
||||
LD A,(IY+CH_TYPE) ; GET DEVICE TYPE
|
||||
PUSH HL ; COPY INCOMING HL
|
||||
POP IY ; ... TO IY
|
||||
LD (IY+CH_TYPE),A ; SAVE DEVICE TYPE
|
||||
;
|
||||
; UPDATE DRIVER RELATIVE UNIT NUMBER IN CONFIG TABLE
|
||||
LD A,(CHUSB_DEVNUM) ; GET NEXT UNIT NUM TO ASSIGN
|
||||
LD (IY+CH_DEV),A ; UPDATE IT
|
||||
INC A ; BUMP TO NEXT UNIT NUM TO ASSIGN
|
||||
LD (CHUSB_DEVNUM),A ; SAVE IT
|
||||
;
|
||||
; ADD UNIT TO GLOBAL DISK UNIT TABLE
|
||||
LD BC,CHUSB_FNTBL ; BC := FUNC TABLE ADR
|
||||
PUSH IY ; CFG ENTRY POINTER
|
||||
POP DE ; COPY TO DE
|
||||
CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE
|
||||
;
|
||||
CALL CHUSB_RESET ; RESET & DISCOVER MEDIA
|
||||
#IF (CHUSBTRACE <= 1)
|
||||
CALL NZ,CHUSB_PRTSTAT
|
||||
#ENDIF
|
||||
RET NZ ; ABORT ON FAILURE
|
||||
;
|
||||
; START PRINTING DEVICE INFO
|
||||
CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
;
|
||||
; PRINT STORAGE CAPACITY (BLOCK COUNT)
|
||||
PRTS(" BLOCKS=0x$") ; PRINT FIELD LABEL
|
||||
LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CAPACITY VALUE
|
||||
CALL PRTHEX32 ; PRINT HEX VALUE
|
||||
;
|
||||
; PRINT STORAGE SIZE IN MB
|
||||
PRTS(" SIZE=$") ; PRINT FIELD LABEL
|
||||
LD B,11 ; 11 BIT SHIFT TO CONVERT BLOCKS --> MB
|
||||
CALL SRL32 ; RIGHT SHIFT
|
||||
CALL PRTDEC32 ; PRINT DWORD IN DECIMAL
|
||||
PRTS("MB$") ; PRINT SUFFIX
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; DRIVER FUNCTION TABLE
|
||||
;
|
||||
CHUSB_FNTBL:
|
||||
.DW CHUSB_STATUS
|
||||
.DW CHUSB_RESET
|
||||
.DW CHUSB_SEEK
|
||||
.DW CHUSB_READ
|
||||
.DW CHUSB_WRITE
|
||||
.DW CHUSB_VERIFY
|
||||
.DW CHUSB_FORMAT
|
||||
.DW CHUSB_DEVICE
|
||||
.DW CHUSB_MEDIA
|
||||
.DW CHUSB_DEFMED
|
||||
.DW CHUSB_CAP
|
||||
.DW CHUSB_GEOM
|
||||
#IF (($ - CHUSB_FNTBL) != (DIO_FNCNT * 2))
|
||||
.ECHO "*** INVALID CHUSB FUNCTION TABLE ***\n"
|
||||
#ENDIF
|
||||
;
|
||||
CHUSB_VERIFY:
|
||||
CHUSB_FORMAT:
|
||||
CHUSB_DEFMED:
|
||||
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_READ:
|
||||
LD A,CH_MODE_USB ; REQUEST USB MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR
|
||||
LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,CH_CMD_DSKRD ; DISK READ COMMAND
|
||||
CALL CHUSB_RWSTART ; SEND CMD AND LBA
|
||||
;
|
||||
; READ THE SECTOR IN 64 BYTE CHUNKS
|
||||
LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR
|
||||
LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR
|
||||
CHUSB_READ1:
|
||||
CALL CH_POLL ; WAIT FOR DATA READY
|
||||
CP $1D ; DATA READY TO READ?
|
||||
;CALL PC_LT ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
JP NZ,CHUSB_IOERR ; HANDLE IO ERROR
|
||||
CALL CH_CMD_RD ; SEND READ USB DATA CMD
|
||||
CALL CH_RD ; READ DATA BLOCK LENGTH
|
||||
CP 64 ; AS EXPECTED?
|
||||
JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR
|
||||
;
|
||||
#IF (CHUSB_FASTIO)
|
||||
; READ 64 BYTE CHUNK
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; READ 64 BYTES
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
INIR ; DO IT FAST
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ELSE
|
||||
; BYTE READ LOOP
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; READ 64 BYTES
|
||||
CHUSB_READ2:
|
||||
CALL CH_RD ; GET NEXT BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; INC BUF PTR
|
||||
DJNZ CHUSB_READ2 ; LOOP AS NEEDED
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ENDIF
|
||||
;
|
||||
; PREPARE FOR NEXT CHUNK
|
||||
LD A,CH_CMD_DSKRDGO ; CONTINUE DISK READ
|
||||
CALL CH_CMD ; SEND IT
|
||||
DJNZ CHUSB_READ1 ; LOOP TILL DONE
|
||||
;
|
||||
; FINAL CHECK FOR COMPLETION & SUCCESS
|
||||
CALL CH_POLL ; WAIT FOR COMPLETION
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHUSB_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_WRITE:
|
||||
LD A,CH_MODE_USB ; REQUEST USB MODE
|
||||
CALL CH_SETMODE ; DO IT
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE ERROR
|
||||
;
|
||||
CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR
|
||||
LD (CHUSB_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS
|
||||
LD A,CH_CMD_DSKWR ; DISK READ COMMAND
|
||||
CALL CHUSB_RWSTART ; SEND CMD AND LBA
|
||||
;
|
||||
; WRITE THE SECTOR IN 64 BYTE CHUNKS
|
||||
LD B,8 ; 8 CHUNKS OF 64 FOR 512 BYTE SECTOR
|
||||
LD HL,(CHUSB_DSKBUF) ; GET DISK BUF ADR
|
||||
CHUSB_WRITE1:
|
||||
CALL CH_POLL ; WAIT FOR DATA READY
|
||||
CP $1E ; DATA READY TO WRITE
|
||||
;CALL PC_GT ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
JP NZ,CHUSB_IOERR ; HANDLE IO ERROR
|
||||
CALL CH_CMD_WR ; SEND WRITE USB DATA CMD
|
||||
LD A,64 ; 64 BYTE CHUNK
|
||||
CALL CH_WR ; SEND DATA BLOCK LENGTH
|
||||
;
|
||||
#IF (CHUSB_FASTIO)
|
||||
; WRITE 64 BYTE CHUNK
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; WRITE 64 BYTES
|
||||
LD C,(IY+CH_IOBASE) ; BASE PORT
|
||||
OTIR ; DO IT FAST
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ELSE
|
||||
; BYTE WRITE LOOP
|
||||
PUSH BC ; SAVE LOOP CONTROL
|
||||
LD B,64 ; WRITE 64 BYTES
|
||||
CHUSB_WRITE2:
|
||||
LD A,(HL) ; GET NEXT BYTE
|
||||
INC HL ; INC BUF PTR
|
||||
CALL CH_WR ; WRITE NEXT BYTE
|
||||
DJNZ CHUSB_WRITE2 ; LOOP AS NEEDED
|
||||
POP BC ; RESTORE LOOP CONTROL
|
||||
#ENDIF
|
||||
;
|
||||
; PREPARE FOR NEXT CHUNK
|
||||
LD A,CH_CMD_DSKWRGO ; CONTINUE DISK READ
|
||||
CALL CH_CMD ; SEND IT
|
||||
DJNZ CHUSB_WRITE1 ; LOOP TILL DONE
|
||||
;
|
||||
; FINAL CHECK FOR COMPLETION & SUCCESS
|
||||
CALL CH_POLL ; WAIT FOR COMPLETION
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHUSB_IOERR ; IF NOT, HANDLE ERROR
|
||||
;
|
||||
; INCREMENT LBA
|
||||
PUSH HL ; SAVE HL
|
||||
LD A,CHUSB_LBA ; LBA OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL INC32HL ; INCREMENT THE VALUE
|
||||
POP HL ; RESTORE HL
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; INITIATE A DISK SECTOR READ/WRITE OPERATION
|
||||
; A: READ OR WRITE OPCODE
|
||||
;
|
||||
CHUSB_RWSTART:
|
||||
CALL CH_CMD ; SEND R/W COMMAND
|
||||
;
|
||||
; SEND LBA, 4 BYTES, LITTLE ENDIAN
|
||||
LD A,CHUSB_LBA ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
LD B,4 ; SEND 4 BYTES
|
||||
CHUSB_RWSTART1:
|
||||
LD A,(HL) ; GET BYTE
|
||||
INC HL ; BUMP PTR
|
||||
CALL CH_WR ; SEND BYTE
|
||||
DJNZ CHUSB_RWSTART1 ; LOOP AS NEEDED
|
||||
;
|
||||
; REQUEST 1 SECTOR
|
||||
LD A,1 ; 1 SECTOR
|
||||
CALL CH_WR ; SEND IT
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_STATUS:
|
||||
; RETURN UNIT STATUS
|
||||
LD A,(IY+CHUSB_STAT) ; GET STATUS OF SELECTED DEVICE
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; RESET THE INTERFACE AND REDISCOVER MEDIA
|
||||
;
|
||||
CHUSB_RESET:
|
||||
;PRTS("\n\rRES USB:$") ; *DEBUG*
|
||||
;CALL CH_FLUSH ; DISCARD ANY GARBAGE
|
||||
;CALL CH_RESET ; FULL CH37X RESET
|
||||
;
|
||||
; RESET THE BUS
|
||||
LD A,CH_CMD_MODE ; SET MODE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,7 ; RESET BUS
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
;
|
||||
; ACTIVATE USB MODE
|
||||
LD A,CH_CMD_MODE ; SET MODE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD A,6 ; USB ENABLED, SEND SOF
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CALL CH_NAP ; SMALL WAIT
|
||||
;
|
||||
LD A,CH_MODE_USB ; WE ARE NOW IN USB MODE
|
||||
LD L,(IY+CHUSB_MODE+0) ; GET MODE PTR (LSB)
|
||||
LD H,(IY+CHUSB_MODE+1) ; GET MODE PTR (MSB)
|
||||
LD (HL),A ; SAVE IT
|
||||
;
|
||||
; INITIALIZE DISK
|
||||
LD B,24 ; TRY A FEW TIMES
|
||||
CHUSB_RESET1:
|
||||
;PRTS("\n\rDSKINIT:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKINIT ; DISK INIT COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
LD DE,10000 ; 10000 * 16 = 160US ???
|
||||
LD DE,20000 ; 10000 * 16 = 160US ???
|
||||
LD DE,12500 ; 1250 * 16 = 200US ???
|
||||
CALL VDELAY ; DELAY
|
||||
CALL CH_POLL ; WAIT FOR RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
JR Z,CHUSB_RESET1A ; IF SO, CHECK READY
|
||||
CP $16 ; NO MEDIA
|
||||
JP Z,CHUSB_NOMEDIA ; HANDLE IT
|
||||
CALL CH_NAP ; SMALL DELAY
|
||||
DJNZ CHUSB_RESET1 ; LOOP AS NEEDED
|
||||
JP CHUSB_TO ; HANDLE TIMEOUT
|
||||
;
|
||||
CHUSB_RESET1A:
|
||||
;CALL CHUSB_DSKRES ; DISK RESET
|
||||
;CP $14 ; GOOD?
|
||||
;JR Z,CHUSB_RESET2
|
||||
;CALL CHUSB_DSKRDY ; CHECK IF DISK READY
|
||||
;CP $14 ; GOOD?
|
||||
;JR Z,CHUSB_RESET2 ; IF SO, MOVE ON
|
||||
;DJNZ CHUSB_RESET1 ; KEEP TRYING
|
||||
;
|
||||
CHUSB_RESET2:
|
||||
; USE OF CH376 DISK_MOUNT COMMAND SEEMS TO IMPROVE
|
||||
; COMPATIBILITY WITH SOME OLDER USB THUMBDRIVES.
|
||||
LD A,(IY+CH_TYPE) ; CH37X TYPE?
|
||||
CP CHTYP_376 ; IS CH376?
|
||||
CALL Z,CHUSB_DSKMNT ; IF SO, TRY MOUNT, IGNORE ERRS
|
||||
;CALL CHUSB_AUTOSET ; *DEBUG*
|
||||
;CALL CHUSB_TSTCON ; *DEBUG*
|
||||
;CALL CHUSB_MAXLUN ; *DEBUG*
|
||||
;CALL CHUSB_DSKRDY ; *DEBUG*
|
||||
;CALL CHUSB_DSKINQ ; *DEBUG*
|
||||
;;
|
||||
CALL CHUSB_DSKSIZ ; GET AND RECORD DISK SIZE
|
||||
RET NZ ; ABORT ON ERROR
|
||||
;
|
||||
; SET STATUS AND RETURN
|
||||
XOR A ; CLEAR STATUS
|
||||
LD (IY+CHUSB_STAT),A ; RECORD STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_DEVICE:
|
||||
LD D,DIODEV_CHUSB ; D := DEVICE TYPE
|
||||
LD E,(IY+CH_DEV) ; E := PHYSICAL DEVICE NUMBER
|
||||
LD C,%00110011 ; USB HARD DISK ATTRIBUTES
|
||||
LD H,(IY+CH_TYPE) ; H := MODE
|
||||
LD L,(IY+CH_IOBASE) ; L := BASE I/O ADDRESS
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
;
|
||||
; CHUSB_GETMED
|
||||
;
|
||||
CHUSB_MEDIA:
|
||||
LD A,E ; GET FLAGS
|
||||
OR A ; SET FLAGS
|
||||
JR Z,CHUSB_MEDIA1 ; JUST REPORT CURRENT STATUS AND MEDIA
|
||||
CALL CHUSB_RESET ; RESET CHUSB INTERFACE
|
||||
;
|
||||
CHUSB_MEDIA1:
|
||||
LD A,(IY+CHUSB_STAT) ; GET STATUS
|
||||
OR A ; SET FLAGS
|
||||
LD D,0 ; NO MEDIA CHANGE DETECTED
|
||||
LD E,MID_HD ; ASSUME WE ARE OK
|
||||
RET Z ; RETURN IF GOOD INIT
|
||||
LD E,MID_NONE ; SIGNAL NO MEDIA
|
||||
LD A,ERR_NOMEDIA ; NO MEDIA ERROR
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_SEEK:
|
||||
BIT 7,D ; CHECK FOR LBA FLAG
|
||||
CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA
|
||||
RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA)
|
||||
LD (IY+CHUSB_LBA+0),L ; SAVE NEW LBA
|
||||
LD (IY+CHUSB_LBA+1),H ; ...
|
||||
LD (IY+CHUSB_LBA+2),E ; ...
|
||||
LD (IY+CHUSB_LBA+3),D ; ...
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_CAP:
|
||||
LD A,(IY+CHUSB_STAT) ; GET STATUS
|
||||
PUSH AF ; SAVE IT
|
||||
LD A,CHUSB_MEDCAP ; OFFSET TO CAPACITY FIELD
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
CALL LD32 ; GET THE CURRENT CAPACITY INTO DE:HL
|
||||
LD BC,512 ; 512 BYTES PER BLOCK
|
||||
POP AF ; RECOVER STATUS
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_GEOM:
|
||||
; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS
|
||||
; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE
|
||||
CALL CHUSB_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC
|
||||
LD L,H ; DIVIDE BY 256 FOR # TRACKS
|
||||
LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL
|
||||
LD D,16 | $80 ; HEADS / CYL = 16, SET LBA CAPABILITY BIT
|
||||
LD E,16 ; SECTORS / TRACK = 16
|
||||
RET ; DONE, A STILL HAS CHUSB_CAP STATUS
|
||||
;
|
||||
; CH37X HELPER ROUTINES
|
||||
;
|
||||
;
|
||||
; PERFORM DISK MOUNT
|
||||
;
|
||||
CHUSB_DSKMNT:
|
||||
;PRTS("\n\rMOUNT:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKMNT ; DISK QUERY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
RET NZ ; ABORT IF NOT
|
||||
;
|
||||
#IF FALSE
|
||||
CALL CH_CMD_RD ; SEND READ COMMAND
|
||||
CALL CH_RD ; GET LENGTH
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
LD B,A ; LOOP COUNTER
|
||||
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
|
||||
CHUSB_DSKMNT1:
|
||||
CALL CH_RD ; GET A BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; BUMP BUF PTR
|
||||
DJNZ CHUSB_DSKMNT1 ; LOOP FOR ALL DATA
|
||||
;
|
||||
;LD DE,HB_WRKBUF ; *DEBUG*
|
||||
;CALL DUMP_BUFFER ; *DEBUG*
|
||||
;
|
||||
CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
LD HL,HB_WRKBUF + 8
|
||||
LD B,28
|
||||
CHUSB_DSKMNT2:
|
||||
LD A,(HL)
|
||||
INC HL
|
||||
CALL COUT
|
||||
DJNZ CHUSB_DSKMNT2
|
||||
#ENDIF
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; PERFORM DISK SIZE
|
||||
;
|
||||
CHUSB_DSKSIZ:
|
||||
;PRTS("\n\rDSKSIZ:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKSIZ ; DISK SIZE COMMAND
|
||||
CALL CH_CMD ; SEND IT
|
||||
CALL CH_POLL ; WAIT FOR RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR
|
||||
CALL CH_CMD_RD ; SEND READ USB DATA CMD
|
||||
CALL CH_RD ; GET RD DATA LEN
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $08 ; MAKE SURE IT IS 8
|
||||
JP NZ,CHUSB_CMDERR ; HANDLE CMD ERROR
|
||||
LD A,CHUSB_MEDCAP ; MEDIA CAPACITY OFFSET
|
||||
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
|
||||
PUSH HL ; SAVE ADDRESS
|
||||
CALL CH_RD
|
||||
LD D,A
|
||||
CALL CH_RD
|
||||
LD E,A
|
||||
CALL CH_RD
|
||||
LD H,A
|
||||
CALL CH_RD
|
||||
LD L,A
|
||||
CALL CH_RD
|
||||
CALL CH_RD
|
||||
CALL CH_RD
|
||||
CALL CH_RD
|
||||
POP BC ; RECOVER ADDRESS TO BC
|
||||
CALL ST32 ; STORE IT
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; AND DONE
|
||||
;
|
||||
#IF FALSE
|
||||
;
|
||||
; PERFORM DISK INQUIRY
|
||||
; BASICALLY THE SCSI INQUIRY COMMAND
|
||||
;
|
||||
CHUSB_DSKINQ:
|
||||
;PRTS("\n\rINQUIRY:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKINQ ; DISK QUERY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; SUCCESS?
|
||||
RET NZ ; ABORT IF NOT
|
||||
CALL CH_CMD_RD ; SEND READ COMMAND
|
||||
CALL CH_RD ; GET LENGTH
|
||||
LD B,A ; LOOP COUNTER
|
||||
LD HL,HB_WRKBUF ; USE WORK BUFFER FOR DATA
|
||||
DSKINQ1:
|
||||
CALL CH_RD ; GET A BYTE
|
||||
LD (HL),A ; SAVE IT
|
||||
INC HL ; BUMP BUF PTR
|
||||
DJNZ DSKINQ1 ; LOOP FOR ALL DATA
|
||||
;
|
||||
;LD DE,HB_WRKBUF ; *DEBUG*
|
||||
;CALL DUMP_BUFFER ; *DEBUG*
|
||||
;
|
||||
;CALL CHUSB_PRTPREFIX ; PRINT DEVICE PREFIX
|
||||
;LD HL,HB_WRKBUF + 8
|
||||
;LD B,28
|
||||
DSKINQ2:
|
||||
;LD A,(HL)
|
||||
;INC HL
|
||||
;CALL COUT
|
||||
;DJNZ DSKINQ2
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM SET RETRIES
|
||||
;
|
||||
CHUSB_SETRETRY:
|
||||
;PRTS("\n\rSETRETRY:$") ; *DEBUG*
|
||||
LD A,CH_CMD_SETRETRY ; DISK READY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_NAP
|
||||
LD A,$25 ; CONSTANT
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP
|
||||
LD A,$BF ; MAX
|
||||
CALL CH_WR
|
||||
CALL CH_NAP
|
||||
CALL CH_RD ; GET RESULT
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM DISK RESET
|
||||
;
|
||||
CHUSB_DSKRES:
|
||||
;PRTS("\n\rDSKRES:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKRES ; DISK READY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM DISK READY
|
||||
;
|
||||
CHUSB_DSKRDY:
|
||||
;PRTS("\n\rDSKRDY:$") ; *DEBUG*
|
||||
LD A,CH_CMD_DSKRDY ; DISK READY
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
CP $14 ; *DEBUG*
|
||||
JR NZ,CHUSB_DSKRDY ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM AUTO SETUP
|
||||
;
|
||||
CHUSB_AUTOSET:
|
||||
;PRTS("\n\rAUTOSET:$") ; *DEBUG*
|
||||
LD A,CH_CMD_AUTOSET ; AUTOMATIC SETUP FOR USB
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL LDELAY ; *DEBUG*
|
||||
CALL CH_POLL ; WAIT FOR RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM TEST CONNECT
|
||||
;
|
||||
CHUSB_TSTCON:
|
||||
;PRTS("\n\rTSTCON:$") ; *DEBUG*
|
||||
LD A,CH_CMD_TSTCON ; TEST USB DEVICE CONNECT
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_NAP ; WAIT A BIT
|
||||
CALL CH_RD ; GET RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
; PERFORM GET MAX LUN
|
||||
;
|
||||
CHUSB_MAXLUN:
|
||||
;PRTS("\n\rMAXLUN:$") ; *DEBUG*
|
||||
LD A,CH_CMD_MAXLUN ; TEST USB DEVICE CONNECT
|
||||
CALL CH_CMD ; DO IT
|
||||
CALL CH_NAP ; WAIT A BIT
|
||||
LD A,$38 ; CONSTANT
|
||||
CALL CH_WR ; SEND IT
|
||||
CALL CH_NAP
|
||||
CALL CH_RD ; GET RESPONSE
|
||||
;CALL PC_SPACE ; *DEBUG*
|
||||
;CALL PRTHEXBYTE ; *DEBUG*
|
||||
;
|
||||
RET
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
; ERROR HANDLERS
|
||||
;
|
||||
;
|
||||
CHUSB_NOMEDIA:
|
||||
LD A,CHUSB_STNOMEDIA
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_CMDERR:
|
||||
LD A,CHUSB_STCMDERR
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_IOERR:
|
||||
LD A,CHUSB_STIOERR
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_TO:
|
||||
LD A,CHUSB_STTO
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_NOTSUP:
|
||||
LD A,CHUSB_STNOTSUP
|
||||
JR CHUSB_ERR
|
||||
;
|
||||
CHUSB_ERR:
|
||||
LD (IY+CHUSB_STAT),A ; SAVE NEW STATUS
|
||||
;
|
||||
CHUSB_ERR2:
|
||||
#IF (CHUSBTRACE >= 2)
|
||||
CALL CHUSB_PRTSTAT
|
||||
#ENDIF
|
||||
OR A ; SET FLAGS
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
CHUSB_PRTERR:
|
||||
RET Z ; DONE IF NO ERRORS
|
||||
; FALL THRU TO CHUSB_PRTSTAT
|
||||
;
|
||||
; PRINT FULL DEVICE STATUS LINE
|
||||
;
|
||||
CHUSB_PRTSTAT:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHUSB_STAT)
|
||||
CALL CHUSB_PRTPREFIX ; PRINT UNIT PREFIX
|
||||
CALL PC_SPACE ; FORMATTING
|
||||
CALL CHUSB_PRTSTATSTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT STATUS STRING
|
||||
;
|
||||
CHUSB_PRTSTATSTR:
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
PUSH HL
|
||||
LD A,(IY+CHUSB_STAT)
|
||||
NEG
|
||||
LD HL,CHUSB_STR_ST_MAP
|
||||
ADD A,A
|
||||
CALL ADDHLA
|
||||
LD E,(HL)
|
||||
INC HL
|
||||
LD D,(HL)
|
||||
CALL WRITESTR
|
||||
POP HL
|
||||
POP DE
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; PRINT DIAGNONSTIC PREFIX
|
||||
;
|
||||
CHUSB_PRTPREFIX:
|
||||
PUSH AF
|
||||
CALL NEWLINE
|
||||
PRTS("CHUSB$")
|
||||
LD A,(IY+CH_DEV) ; GET CURRENT DEVICE NUM
|
||||
CALL PRTDECB
|
||||
CALL PC_COLON
|
||||
POP AF
|
||||
RET
|
||||
;
|
||||
; DATA STORAGE
|
||||
;
|
||||
CHUSB_DEVNUM .DB 0 ; TEMP DEVICE NUM USED DURING INIT
|
||||
CHUSB_DSKBUF .DW 0
|
||||
;
|
||||
CHUSB_STR_ST_MAP:
|
||||
.DW CHUSB_STR_STOK
|
||||
.DW CHUSB_STR_STNOMEDIA
|
||||
.DW CHUSB_STR_STCMDERR
|
||||
.DW CHUSB_STR_STIOERR
|
||||
.DW CHUSB_STR_STTO
|
||||
.DW CHUSB_STR_STNOTSUP
|
||||
;
|
||||
CHUSB_STR_STOK .TEXT "OK$"
|
||||
CHUSB_STR_STNOMEDIA .TEXT "NO MEDIA$"
|
||||
CHUSB_STR_STCMDERR .TEXT "COMMAND ERROR$"
|
||||
CHUSB_STR_STIOERR .TEXT "IO ERROR$"
|
||||
CHUSB_STR_STTO .TEXT "TIMEOUT$"
|
||||
CHUSB_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
|
||||
CHUSB_STR_STUNK .TEXT "UNKNOWN ERROR$"
|
||||
@@ -162,7 +162,9 @@ CTCTIVT .EQU INT_CTC0A + CTCTIMCH
|
||||
;==================================================================================================
|
||||
;
|
||||
CTC_PREINIT:
|
||||
; BLINDLY RESET THE CTC ASSUMING IT IS THERE
|
||||
; BLINDLY RESET THE CTC ASSUMING IT IS THERE. PER ALAN COX
|
||||
; THE CTC CONFIGURATION IS UNDEFINED AT STARTUP. THIS SHOULD
|
||||
; PRECLUDE POSSIBLE EXTRANEOUS INTERRUPTS.
|
||||
LD A,CTC_DEFCFG
|
||||
OUT (CTCBASE),A
|
||||
OUT (CTCBASE+1),A
|
||||
|
||||
@@ -208,6 +208,11 @@ CVDU_VDASAT:
|
||||
RET
|
||||
|
||||
CVDU_VDASCO:
|
||||
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
OR A ; CHARACTER?
|
||||
JR NZ,CVDU_VDASCO_Z ; IF NOT, JUST RETURN
|
||||
|
||||
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
|
||||
; TRANSFORM TO: ----RGBI (DISCARD BACKGROUND COLOR IN HIGH NIBBLE)
|
||||
XOR A ; CLEAR A
|
||||
@@ -221,6 +226,7 @@ CVDU_VDASCO1:
|
||||
AND %11110000 ; CLEAR OUT OLD COLOR BITS
|
||||
OR E ; STUFF IN THE NEW ONES
|
||||
LD (CVDU_ATTR),A ; AND SAVE THE RESULT
|
||||
CVDU_VDASCO_Z:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
|
||||
@@ -1729,20 +1729,27 @@ DSKY_PUTLED:
|
||||
RET
|
||||
;
|
||||
DSKY_HIGHLIGHTFWDKEYS:
|
||||
LD HL,DSKY_HIGHLIGHTFWDKEYLEDS
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTFWDKEYLEDS
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHTCMDKEYS:
|
||||
LD HL,DSKY_HIGHLIGHTCMDKEYLEDS
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTCMDKEYLEDS
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHTNUMKEYS:
|
||||
LD HL,DSKY_HIGHLIGHTNUMKEYLEDS
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTNUMKEYLEDS
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHTKEYSOFF:
|
||||
LD HL,DSKY_HIGHLIGHTKEYLEDSOFF
|
||||
JR DSKY_PUTLED
|
||||
LD DE,DSKY_HIGHLIGHTKEYLEDSOFF
|
||||
JR DSKY_HIGHLIGHT
|
||||
;
|
||||
DSKY_HIGHLIGHT:
|
||||
PUSH HL
|
||||
EX DE,HL
|
||||
CALL DSKY_PUTLED
|
||||
POP HL
|
||||
RET
|
||||
;
|
||||
DSKY_HIGHLIGHTFWDKEYLEDS .DB $00,$00,$00,$30,$00,$00,$00,$00
|
||||
DSKY_HIGHLIGHTCMDKEYLEDS .DB $20,$00,$20,$3F,$00,$00,$00,$00
|
||||
|
||||
@@ -189,8 +189,13 @@ GDC_VDASAT: ; SET ATTRIBUTES
|
||||
RET
|
||||
|
||||
GDC_VDASCO: ; SET COLOR
|
||||
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
OR A ; CHARACTER?
|
||||
JR NZ,GDC_VDASCO_Z ; IF NOT, JUST RETURN
|
||||
LD A,E ; GET THE INCOMING COLOR
|
||||
LD (GDC_COLOR),A ; AND SAVE FOR LATER
|
||||
GDC_VDASCO_Z:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
|
||||
@@ -24,12 +24,9 @@
|
||||
;
|
||||
; Print all desired config values...
|
||||
;
|
||||
#if (ROMSIZE > 0)
|
||||
prtval("ROMSIZE$", ROMSIZE)
|
||||
#else
|
||||
prtval("ROMSIZE$", RAMSIZE)
|
||||
#endif
|
||||
prtval("CPUFAM$", CPUFAM)
|
||||
prtval("ROMSIZE$", ROMSIZE)
|
||||
prtval("RAMSIZE$", RAMSIZE)
|
||||
;
|
||||
ret
|
||||
;
|
||||
|
||||
@@ -140,7 +140,7 @@ PKD_INIT:
|
||||
LD A,PKDPPIBASE ; GET BASE PORT
|
||||
CALL PRTHEXBYTE ; PRINT BASE PORT
|
||||
;
|
||||
LD A,(PKD_PRESENT) ; PRESENT?
|
||||
LD A,(PKD_PRESENT) ; PRESENT?
|
||||
OR A ; SET FLAGS
|
||||
RET NZ ; YES, ALL DONE
|
||||
PRTS(" NOT PRESENT$") ; NOT PRESENT
|
||||
|
||||
@@ -201,7 +201,7 @@ TMS_INIT:
|
||||
#IF (TMSMODE == TMSMODE_MSX)
|
||||
PRTS("MSX$")
|
||||
#ENDIF
|
||||
#IF (TMSMODE == TMSMODE_COLECO) ; ### JLC Mod for completeness ###
|
||||
#IF (TMSMODE == TMSMODE_COLECO)
|
||||
PRTS("COLECO$")
|
||||
#ENDIF
|
||||
#IF (TMSMODE == TMSMODE_MSXKBD)
|
||||
@@ -215,7 +215,6 @@ TMS_INIT:
|
||||
LD A,TMS_DATREG
|
||||
CALL PRTHEXBYTE
|
||||
CALL TMS_PROBE ; CHECK FOR HW EXISTENCE
|
||||
;JP TMS_INIT1 ; ### JLC DEBUG: ALLWAYS CONTINUE ###
|
||||
JR Z,TMS_INIT1 ; CONTINUE IF PRESENT
|
||||
;
|
||||
; *** HARDWARE NOT PRESENT ***
|
||||
@@ -370,7 +369,40 @@ TMS_VDASAT:
|
||||
RET
|
||||
|
||||
TMS_VDASCO:
|
||||
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
|
||||
; ### JLC Mod - Implement Default Text Mode Colors via ANSI_VDASCO or direct HBIOS Call
|
||||
;
|
||||
; Color setting is in reg D in ANSI Format as described in RomWBW System Guide
|
||||
; Convert Color Format from ANSI to TMS shuffling bits arround and using
|
||||
; Color Conversion Table at TMS_COLOR_TBL (approximated equivalences)
|
||||
; Save converted value to (TMS_TMSCOLOR)
|
||||
;
|
||||
; TMS hardware only allows setting a global (screen) foreground/background color. So, we
|
||||
; only process this command if E is 1.
|
||||
;
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
CP 1 ; SCREEN?
|
||||
JR NZ,TMS_VDASCO_Z ; IF NOT, JUST RETURN
|
||||
;
|
||||
LD A,E ; GET COLOR BYTE
|
||||
AND $F0 ; ISOLATE BACKGROUND
|
||||
RRCA \ RRCA \ RRCA \ RRCA ; MOVE TO LOWER NIBBLE
|
||||
LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE
|
||||
CALL ADDHLA ; OFFSET TO DESIRED COLOR
|
||||
LD B,(HL) ; PUT NEW BG IN B
|
||||
;
|
||||
LD A,E ; GET COLOR BYTE
|
||||
AND $0F ; ISOLATE FOREGROUND
|
||||
LD HL,TMS_COLOR_TBL ; POINT TO COLOR CONVERSION TABLE
|
||||
CALL ADDHLA ; OFFSET TO DESIRED COLOR
|
||||
LD A,(HL) ; PUT NEW FG IN A
|
||||
RLCA \ RLCA \ RLCA \ RLCA ; MOVE TO UPPER NIBBLE
|
||||
;
|
||||
OR B ; COMBINE WITH FG
|
||||
LD C, 7 ; C = Color Register, A = Desired new Color in TMS Format
|
||||
CALL TMS_SET ; Write to specific TMS Register, Change Default Text Color
|
||||
;
|
||||
TMS_VDASCO_Z:
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET
|
||||
|
||||
TMS_VDAWRC:
|
||||
@@ -558,7 +590,7 @@ TMS_CRTINIT:
|
||||
LD HL,0
|
||||
CALL TMS_WR
|
||||
;
|
||||
; FILL ENTIRE 16KB VRAM CONTENTS with $00 ### JLC Comment fix ###
|
||||
; FILL ENTIRE 16KB VRAM CONTENTS with $00
|
||||
LD DE,$4000 ; 16KB
|
||||
TMS_CRTINIT1:
|
||||
XOR A
|
||||
@@ -614,7 +646,7 @@ TMS_LOADFONT:
|
||||
#ENDIF
|
||||
;
|
||||
; FILL TMS_FNTVADDR BYTES FROM FONTDATA
|
||||
LD DE,TMS_FNTSIZE ; ### JLC Mod for JBL compatibility ###
|
||||
LD DE,TMS_FNTSIZE
|
||||
TMS_LOADFONT1:
|
||||
LD A,(HL)
|
||||
OUT (TMS_DATREG),A
|
||||
@@ -738,7 +770,6 @@ TMS_XY2IDX:
|
||||
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
||||
LD E,A ; GET COLUMN BACK
|
||||
ADD HL,DE ; ADD IT IN
|
||||
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
|
||||
LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
|
||||
ADD HL,DE
|
||||
RET ; RETURN
|
||||
@@ -787,7 +818,6 @@ TMS_FILL1:
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
TMS_SCROLL:
|
||||
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
|
||||
LD HL,TMS_CHRVADDR ; SOURCE ADDRESS OF CHARACTER BUFFER
|
||||
LD C,TMS_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1
|
||||
;
|
||||
@@ -839,7 +869,6 @@ TMS_SCROLL3:
|
||||
;----------------------------------------------------------------------
|
||||
;
|
||||
TMS_RSCROLL:
|
||||
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
|
||||
LD HL,TMS_COLS * (TMS_ROWS - 1)
|
||||
LD DE,TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
|
||||
ADD HL,DE
|
||||
@@ -980,10 +1009,13 @@ TMS_INTHNDL:
|
||||
; TMS DRIVER - DATA
|
||||
;==================================================================================================
|
||||
;
|
||||
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
|
||||
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
|
||||
TMS_BUF .FILL 256,0 ; COPY BUFFER
|
||||
|
||||
;
|
||||
; ### JLC Mod
|
||||
; ANSI-->TMS Color Conversion Table
|
||||
TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F
|
||||
;
|
||||
;==================================================================================================
|
||||
; TMS DRIVER - INSTANCE DATA
|
||||
@@ -1055,6 +1087,10 @@ TMS_IDAT:
|
||||
; https://www.msx.org/wiki/Screen_Modes_Description#SCREEN_0_in_80-column_.28Text_mode_2.29
|
||||
; BITS 1-0 SHOULD BE 1. BITS 8-2 SHOULD BE (ADR >> 8).
|
||||
;
|
||||
; ### JLC Mod
|
||||
; TEXT MODE DEFAULT COLOR (REG 7) CAN BE CHANGED INVOKING VDASCO
|
||||
; OR VIA ANSI PRIVATE ESC SEQ. (SEE ANSI.ASM FOR DETAILS)
|
||||
;
|
||||
TMS_INITVDU: ; V9958 REGISTER SET
|
||||
.DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 FOR 80 COLS
|
||||
TMS_INITVDU_REG_1:
|
||||
@@ -1069,7 +1105,7 @@ TMS_INITVDU_REG_1:
|
||||
.DB $00 ; REG 9
|
||||
.DB $00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000)
|
||||
;
|
||||
#ELSE ; _______TMS9918 REGISTER SET ### JLC Mod for JBL compatibility & MODE II Readiness ###_______
|
||||
#ELSE ; _______TMS9918 REGISTER SET_______
|
||||
;
|
||||
TMS_INITVDU: ; V9918 REGISTER SET
|
||||
.DB $00 ; REG 0 - SET TEXT MODE, NO EXTERNAL VID
|
||||
@@ -1080,18 +1116,7 @@ TMS_INITVDU_REG_1:
|
||||
.DB $00 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0000)
|
||||
.DB $76 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT, SET TO MODE II DEFAULT VALUE
|
||||
.DB $03 ; REG 6 - NO SPRITE GENERATOR TABLE, SET TO MODE II DEFAULT VALUE
|
||||
.DB $E1 ; REG 7 - GREY ON BLACK ### JLC Mod Change default text color for better readability YMMV ###
|
||||
;
|
||||
;TMS_INITVDU:
|
||||
; .DB $00 ; REG 0 - NO EXTERNAL VID
|
||||
;TMS_INITVDU_REG_1:
|
||||
; .DB $50 ; REG 1 - ENABLE SCREEN, SET TEXT MODE & BLANK SCREEN ### JLC comment fix (NOT MODE 1) ###
|
||||
; .DB $00 ; REG 2 - PATTERN NAME TABLE := 0
|
||||
; .DB $00 ; REG 3 - NO COLOR TABLE
|
||||
; .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800)
|
||||
; .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT
|
||||
; .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE
|
||||
; .DB $F0 ; REG 7 - WHITE ON TRANSPARENT
|
||||
.DB $E1 ; REG 7 - TEXT COLOR
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
@@ -1101,3 +1126,29 @@ TMS_INITVDULEN .EQU $ - TMS_INITVDU
|
||||
#IF (CPUFAM == CPU_Z180)
|
||||
TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED
|
||||
#ENDIF
|
||||
;
|
||||
; ### JLC Mod
|
||||
;===============================================================================
|
||||
; BASIC ANSI to TMS COLOR CONVERSION TABLE (NIBBLES FOR FOREGROUND & BACKGROUND)
|
||||
; Follows RomWBW System Guide Chapter 8, HBIOS Reference
|
||||
;-------------------------------------------------------------------------------
|
||||
; ANSI Color TMS Equivalent
|
||||
;-------------------------------------------------------------------------------
|
||||
; 0 Black 1
|
||||
; 1 Red 8
|
||||
; 2 Green 2
|
||||
; 3 Brown A
|
||||
; 4 Blue 4
|
||||
; 5 Magenta 6
|
||||
; 6 Cyan C
|
||||
; 7 White F
|
||||
; 8 Gray E
|
||||
; 9 Light Red 9
|
||||
; A Light Green 3
|
||||
; B Yellow B
|
||||
; C Light Blue 5
|
||||
; D Light Magenta D
|
||||
; E Light Cyan 7
|
||||
; F Bright White F
|
||||
;===============================================================================
|
||||
;
|
||||
|
||||
@@ -237,6 +237,10 @@ VGA_VDASAT:
|
||||
JR VGA_VDASCO2 ; IMPLEMENT SETTING
|
||||
|
||||
VGA_VDASCO:
|
||||
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
||||
LD A,D ; GET CHAR/SCREEN SCOPE
|
||||
OR A ; CHARACTER?
|
||||
JR NZ,VGA_VDASCO3 ; IF NOT, JUST RETURN
|
||||
; INCOMING IS: IBGRIBGR (I=INTENSITY, B=BLUE, G=GREEN, R=RED)
|
||||
; TRANSFORM TO: -RGBIRGB (DISCARD INTENSITY BIT IN HIGH NIBBLE)
|
||||
;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#DEFINE RMN 4
|
||||
#DEFINE RUP 0
|
||||
#DEFINE RTP 0
|
||||
#DEFINE BIOSVER "3.4.0-dev.37"
|
||||
#DEFINE BIOSVER "3.4.0-rc.0"
|
||||
#define rmj RMJ
|
||||
#define rmn RMN
|
||||
#define rup RUP
|
||||
|
||||
@@ -3,5 +3,5 @@ rmn equ 4
|
||||
rup equ 0
|
||||
rtp equ 0
|
||||
biosver macro
|
||||
db "3.4.0-dev.37"
|
||||
db "3.4.0-rc.0"
|
||||
endm
|
||||
|
||||
Reference in New Issue
Block a user