From ed47d2f8b651e94217416c51d4bca2b34c4252b0 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 30 Jul 2024 15:49:02 +1000 Subject: [PATCH 01/59] ch376-native: native USB driver for the CH376 module --- .vscode/settings.json | 20 +- Source/CBIOS/cbios.asm | 4 +- Source/Doc/SystemGuide.md | 1 + Source/HBIOS/Config/RCEZ80_std.asm | 4 + Source/HBIOS/cfg_MASTER.asm | 4 + Source/HBIOS/ch376-native/Makefile | 133 ++ Source/HBIOS/ch376-native/base-drv.asm | 109 ++ Source/HBIOS/ch376-native/base-drv.s | 14 + Source/HBIOS/ch376-native/base-drv/ch376.c.s | 780 ++++++++++ .../HBIOS/ch376-native/base-drv/class_hub.c.s | 98 ++ .../ch376-native/base-drv/dev_transfers.c.s | 454 ++++++ .../HBIOS/ch376-native/base-drv/enumerate.c.s | 948 ++++++++++++ .../ch376-native/base-drv/enumerate_hub.c.s | 470 ++++++ .../base-drv/enumerate_storage.c.s | 142 ++ Source/HBIOS/ch376-native/base-drv/print.c.s | 87 ++ .../HBIOS/ch376-native/base-drv/protocol.c.s | 478 ++++++ .../HBIOS/ch376-native/base-drv/transfers.c.s | 506 +++++++ .../ch376-native/base-drv/usb-base-drv.c.s | 86 ++ .../HBIOS/ch376-native/base-drv/usb-init.c.s | 179 +++ .../HBIOS/ch376-native/base-drv/usb_state.c.s | 274 ++++ .../HBIOS/ch376-native/base-drv/work-area.c.s | 158 ++ Source/HBIOS/ch376-native/cruntime.asm | 134 ++ Source/HBIOS/ch376-native/print.asm | 32 + Source/HBIOS/ch376-native/root.md | 0 Source/HBIOS/ch376-native/scsi-drv.s | 3 + .../ch376-native/scsi-drv/class_scsi.c.s | 952 ++++++++++++ Source/HBIOS/ch376-native/scsi-drv/init.c.s | 162 ++ .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 125 ++ .../ch376-native/source-doc/.clang-format | 13 + .../ch376-native/source-doc/base-drv/ch376.c | 238 +++ .../ch376-native/source-doc/base-drv/ch376.h | 175 +++ .../source-doc/base-drv/ch376inc.h | 1311 +++++++++++++++++ .../source-doc/base-drv/class_hub.c | 9 + .../source-doc/base-drv/class_hub.h | 75 + .../ch376-native/source-doc/base-drv/delay.h | 11 + .../source-doc/base-drv/dev_transfers.c | 101 ++ .../source-doc/base-drv/dev_transfers.h | 68 + .../source-doc/base-drv/enumerate.c | 221 +++ .../source-doc/base-drv/enumerate.h | 38 + .../source-doc/base-drv/enumerate_hub.c | 80 + .../source-doc/base-drv/enumerate_hub.h | 10 + .../source-doc/base-drv/enumerate_storage.c | 27 + .../source-doc/base-drv/enumerate_storage.h | 8 + .../ch376-native/source-doc/base-drv/hbios.h | 6 + .../ch376-native/source-doc/base-drv/print.c | 9 + .../ch376-native/source-doc/base-drv/print.h | 11 + .../source-doc/base-drv/protocol.c | 152 ++ .../source-doc/base-drv/protocol.h | 82 ++ .../source-doc/base-drv/transfers.c | 172 +++ .../source-doc/base-drv/transfers.h | 103 ++ .../source-doc/base-drv/usb-base-drv.c | 9 + .../source-doc/base-drv/usb-base-drv.h | 11 + .../source-doc/base-drv/usb-init.c | 56 + .../source-doc/base-drv/usb_state.c | 90 ++ .../source-doc/base-drv/usb_state.h | 27 + .../source-doc/base-drv/work-area.c | 3 + .../source-doc/base-drv/work-area.h | 54 + .../ch376-native/source-doc/base-drv/z80.h | 17 + .../source-doc/convert-for-uz80as.sh | 50 + .../HBIOS/ch376-native/source-doc/depends.d | 106 ++ .../source-doc/scsi-drv/class_scsi.c | 168 +++ .../source-doc/scsi-drv/class_scsi.h | 196 +++ .../source-doc/scsi-drv/scsi-init.c | 35 + .../source-doc/ufi-drv/class_ufi.c | 176 +++ .../source-doc/ufi-drv/class_ufi.h | 207 +++ .../source-doc/ufi-drv/ufi-init.c | 92 ++ .../ch376-native/source-doc/ufi-drv/usb_cbi.c | 64 + .../ch376-native/source-doc/ufi-drv/usb_cbi.h | 14 + Source/HBIOS/ch376-native/ufi-drv.s | 4 + .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 705 +++++++++ .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 319 ++++ Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 222 +++ Source/HBIOS/ch376.asm | 48 + Source/HBIOS/ch376scsi.asm | 284 ++++ Source/HBIOS/ch376ufi.asm | 225 +++ Source/HBIOS/hbios.asm | 40 + Source/HBIOS/hbios.inc | 1 + 77 files changed, 12498 insertions(+), 2 deletions(-) create mode 100644 Source/HBIOS/ch376-native/Makefile create mode 100644 Source/HBIOS/ch376-native/base-drv.asm create mode 100644 Source/HBIOS/ch376-native/base-drv.s create mode 100644 Source/HBIOS/ch376-native/base-drv/ch376.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/class_hub.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/enumerate.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/print.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/protocol.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/transfers.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/usb-init.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/usb_state.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/work-area.c.s create mode 100644 Source/HBIOS/ch376-native/cruntime.asm create mode 100644 Source/HBIOS/ch376-native/print.asm create mode 100644 Source/HBIOS/ch376-native/root.md create mode 100644 Source/HBIOS/ch376-native/scsi-drv.s create mode 100644 Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s create mode 100644 Source/HBIOS/ch376-native/scsi-drv/init.c.s create mode 100644 Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/.clang-format create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/delay.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/print.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/print.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/transfers.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/work-area.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/work-area.h create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/z80.h create mode 100755 Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh create mode 100644 Source/HBIOS/ch376-native/source-doc/depends.d create mode 100644 Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c create mode 100644 Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h create mode 100644 Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.h create mode 100644 Source/HBIOS/ch376-native/ufi-drv.s create mode 100644 Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s create mode 100644 Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s create mode 100644 Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s create mode 100644 Source/HBIOS/ch376.asm create mode 100644 Source/HBIOS/ch376scsi.asm create mode 100644 Source/HBIOS/ch376ufi.asm diff --git a/.vscode/settings.json b/.vscode/settings.json index 7c12e6b0..70be832d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,22 @@ { "files.trimTrailingWhitespace": false, - "files.eol": "\r\n" + "files.eol": "\r\n", + "files.associations": { + "*.inc": "z80-macroasm", + "*.asm": "z80-macroasm", + "*.180": "z80-macroasm", + "*.asm.m4": "z80-macroasm", + "*.inc.m4": "z80-macroasm", + "*.mac": "z80-macroasm", + "*.asmpp": "z80-macroasm", + "*.zdsproj": "xml", + "ch376.h": "c", + "protocol.h": "c", + "usb_state.h": "c", + "functional": "c", + "class_scsi.h": "c", + "z80.h": "c", + "dev_transfers.h": "c", + "usb-base-drv.h": "c" + } } diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index 26c55e33..ae670c67 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -3407,6 +3407,7 @@ DEVTBL: ; DEVICE TABLE .DW DEV04, DEV05, DEV06, DEV07 .DW DEV08, DEV09, DEV10, DEV11 .DW DEV12, DEV13, DEV14, DEV15 + .DW DEV16 ; DEVUNK .DB "???$" DEV00 .DB "MD$" @@ -3424,7 +3425,8 @@ DEV11 .DB "IMM$" DEV12 .DB "SYQ$" DEV13 .DB "CHUSB$" DEV14 .DB "CHSD$" -DEV15 .EQU DEVUNK +DEV15 .DB "USB$" +DEV16 .EQU DEVUNK ; #ENDIF ; diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index 59b40f32..7b5862c3 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -1088,6 +1088,7 @@ below enumerates their values. | DIODEV_SYQ | 0x0C | Syquest Sparq Disk | syq.asm | | DIODEV_CHUSB | 0x0D | CH375/376 USB Disk | ch.asm | | DIODEV_CHSD | 0x0E | CH375/376 SD Card | ch.asm | +| DIODEV_USB | 0x0F | CH376 Native USB Device | ch376.asm | A fixed set of media types are defined. The currently defined media types identifiers are listed below. Each driver will support one or diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index f51f0d03..8383e087 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -82,3 +82,7 @@ SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER AY38910ENABLE .SET FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] AY_FORCE .SET FALSE ; AY: BYPASS AUTO-DETECT, FORCED PRESENT + +CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 4c20af26..2caf43cf 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -501,3 +501,7 @@ EZ80_WSMD_TYP .EQU EZ80WSMD_CALC ; BUS WAIT STATE CONFIG: EZ80WSMD_[CALC|CYCLES| EZ80_FLSH_WS .EQU 1 ; WAIT STATES FOR ON CHIP FLASH (0-7) EZ80_FLSH_MIN_NS .EQU 60 ; MINIMUM WAIT STATES TO APPLY TO ON-CHIP FLASH, IF EZ80_WSMD_TYP = EZ80WSMD_CALC EZ80_FWSMD_TYP .EQU EZ80WSMD_CALC ; WAIT STATE TYPE: EZ80RMMD_[CALC|WAIT] (CYCLES NOT ALLOWED) + +CHNATIVEENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile new file mode 100644 index 00000000..6a08c627 --- /dev/null +++ b/Source/HBIOS/ch376-native/Makefile @@ -0,0 +1,133 @@ +SHELL := /bin/bash +.SHELLFLAGS := -eu -o pipefail -c +.ONESHELL: +MAKEFLAGS += --warn-undefined-variables +MAKEFLAGS += --no-builtin-rules + +ZCCRELFLAGS= +ifdef RELEASE +ZCCRELFLAGS=-SO3 --max-allocs-per-node600000 --allow-unsafe-read --opt-code-speed +endif + +SRC := ./source-doc/ +LIBS := -I./$(SRC)base-drv/ + +ZCC := zcc +msx --vc -subtype=rom -startup=1 -crt0 $(SRC)crt.asm -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) + +ASSDIR := ./ + +all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s + +clean: + @rm -rf base-drv + @rm -rf scsi-drv + @rm -rf ufi-drv + +$(ASSDIR)base-drv.s: + @echo "Creating base-drv.s" + echo "; Generated File -- not to be modify directly" > $(ASSDIR)base-drv.s + for dep in $^; do + dep=$${dep#*/} + dep=$${dep#*/} + echo '#include "'ch376-native/base-drv/$${dep}'"' >> $(ASSDIR)base-drv.s + done + +$(ASSDIR)scsi-drv.s: + @echo "Creating scsi-drv.s" + echo "; Generated File -- not to be modify directly" > $(ASSDIR)scsi-drv.s + for dep in $^; do + dep=$${dep#*/} + dep=$${dep#*/} + echo '#include "'ch376-native/scsi-drv/$${dep}'"' >> $(ASSDIR)scsi-drv.s + done + +$(ASSDIR)ufi-drv.s: + @echo "Creating ufi-drv.s" + echo "; Generated File -- not to be modify directly" > $(ASSDIR)ufi-drv.s + for dep in $^; do + dep=$${dep#*/} + dep=$${dep#*/} + echo '#include "'ch376-native/ufi-drv/$${dep}'"' >> $(ASSDIR)ufi-drv.s + done + +$(ASSDIR)%.c.s: $(ASSDIR)%.c.asm + @mkdir -p $(dir $@) + echo "Converting $< to $@" + ${SRC}convert-for-uz80as.sh $< $@ + +$(ASSDIR)%.s: $(SRC)%.asm + @mkdir -p $(dir $@) + cp $< $@ + sed -i "1i\;\r\n; Generated from $< -- not to be modify directly\r\n;\r\n; " $@ + +define compile + @mkdir -p $(dir $@) + $(ZCC) --c-code-in-asm --assemble-only $< -o $@ + echo "Compiled $(notdir $@) from $(notdir $<)" +endef + +$(ASSDIR)base-drv/%.c.asm: $(SRC)base-drv/%.c; $(compile) +$(ASSDIR)scsi-drv/%.c.asm: $(SRC)scsi-drv/%.c; $(compile) +$(ASSDIR)ufi-drv/%.c.asm: $(SRC)ufi-drv/%.c; $(compile) +$(ASSDIR)%.c.asm: $(SRC)%.c; $(compile) +$(ASSDIR)libraries/delay/%.c.asm: ../apps/libraries/delay/%.c; $(compile) +$(ASSDIR)libraries/usb/%.c.asm: ../apps/libraries/usb/%.c; $(compile) + +.PHONY: format +format: SHELL:=/bin/bash +format: + @clang-format --version + find \( -name "*.c" -o -name "*.h" \) -exec echo "formating {}" \; -exec clang-format -i {} \; + +ZSDCPP_FLAGS=-iquote"." -isystem"${ZCCCFG}/../../include/_DEVELOPMENT/sdcc" $(LIBS) + +include ${SRC}depends.d + +deps: + @echo "" > ${SRC}/depends.d + # C Dependencies + (cd ${SRC} && find -name "*.c") | while read -r file; do + file_no_ext="$${file%.*}" + file_no_ext=$${file_no_ext#./} + filename=$$(basename $$file_no_ext) + from="$$filename.o" + to="${ASSDIR}$$file_no_ext.c.s" + sdcpp ${ZSDCPP_FLAGS} -MM -MF /tmp/deps.deps ./${SRC}$$file_no_ext.c + sed "s+$$from+$$to+g" /tmp/deps.deps >> ${SRC}/depends.d + done + + # configure base-drv.s to all .s files + printf "##\r\n" >> ${SRC}/depends.d + printf "./base-drv.s: " >> ${SRC}/depends.d + (cd ${SRC}/base-drv && find -name "*.c") | while read -r file; do + file_no_ext="$${file%.*}" + file_no_ext=$${file_no_ext#./} + filename=$$(basename $$file_no_ext) + printf "base-drv/$$file.s " >> ${SRC}/depends.d + done + + printf "\r\n" >> ${SRC}/depends.d + # # configure scsi-drv.s to all .s files + printf "##\r\n" >> ${SRC}/depends.d + printf "./scsi-drv.s: " >> ${SRC}/depends.d + (cd ${SRC}/scsi-drv && find -name "*.c") | while read -r file; do + file_no_ext="$${file%.*}" + file_no_ext=$${file_no_ext#./} + filename=$$(basename $$file_no_ext) + printf "scsi-drv/$$file.s " >> ${SRC}/depends.d + done + + printf "\r\n" >> ${SRC}/depends.d + # # configure ufi-drv.s to all .s files + printf "##\r\n" >> ${SRC}/depends.d + printf "./ufi-drv.s: " >> ${SRC}/depends.d + (cd ${SRC}/ufi-drv && find -name "*.c") | while read -r file; do + file_no_ext="$${file%.*}" + file_no_ext=$${file_no_ext#./} + filename=$$(basename $$file_no_ext) + printf "ufi-drv/$$file.s " >> ${SRC}/depends.d + done + + echo "" >> ${SRC}/depends.d + + echo "${SRC}depends.d created" diff --git a/Source/HBIOS/ch376-native/base-drv.asm b/Source/HBIOS/ch376-native/base-drv.asm new file mode 100644 index 00000000..8990bf92 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv.asm @@ -0,0 +1,109 @@ + +DELAY_FACTOR .EQU 640 + +CMD01_RD_USB_DATA0 .EQU 0x27 ; Read data block from current USB interrupt endpoint buffer or host endpoint receive buffer + ; output: length, data stream + +CMD10_WR_HOST_DATA .EQU 0x2C ; Write a data block to the send buffer of the USB host endpoint + ; input: length, data stream + +CH_CMD_RD_USB_DATA0 .EQU CMD01_RD_USB_DATA0 +CH_CMD_WR_HOST_DATA .EQU CMD10_WR_HOST_DATA + +; HL -> timeout +; returns +; L -> error code + +; --------------------------------- +; Function ch_wait_int_and_get_status +; --------------------------------- +_ch_wait_int_and_get_status: + ld bc, DELAY_FACTOR + +keep_waiting: + CALL _delay + ld a, $FF + in a, (_CH376_COMMAND_PORT & 0xFF) + rlca + jp nc, _ch_get_status + + dec bc + ld a, b + or c + jr nz, keep_waiting + + dec hl + ld a, h + or l + jr nz, _ch_wait_int_and_get_status + + CALL _delay + ld a, $FF + in a, (_CH376_COMMAND_PORT & 0xFF) + bit 4, a ; _CH376_COMMAND_PORT & PARA_STATE_BUSY + + ld l, 0x0C ; USB_ERR_CH376_BLOCKED; + ret nz + + ld l, 0x0D ; USB_ERR_CH376_TIMEOUT + ret + +; uint8_t ch_read_data(uint8_t *buffer) __sdcccall(1); +_ch_read_data: + ; ch_command(CH_CMD_RD_USB_DATA0); + push hl + ld l, CH_CMD_RD_USB_DATA0 + call _ch_command + pop hl + + CALL _delay + ld bc, _CH376_DATA_PORT + in a, (c) + + or a + ret z + + ld e, a + push af +read_block: + CALL _delay + in a, (c) + ld (hl), a + inc hl + dec e + jr nz, read_block + + pop af + ret + +;const uint8_t *ch_write_data(const uint8_t *buffer, uint8_t length) +_ch_write_data: +;libraries/usb/ch376.c:125: ch_command(CH_CMD_WR_HOST_DATA); + ld l, CH_CMD_WR_HOST_DATA + call _ch_command + + ld iy, 2 + add iy, sp + ld l, (iy+0) + ld h, (iy+1) + ld a, (iy+2) + + ld bc, _CH376_DATA_PORT + +; _CH376_DATA_PORT = length; + call _delay + out (c), a + + or a + ret z + + ld d, a +write_block: + call _delay + ld a, (hl) + out (c), a + inc hl + dec d + jr nz, write_block + + ret diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s new file mode 100644 index 00000000..6aa5aa97 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -0,0 +1,14 @@ +; Generated File -- not to be modify directly +#include "ch376-native/base-drv/dev_transfers.c.s" +#include "ch376-native/base-drv/enumerate.c.s" +#include "ch376-native/base-drv/usb_state.c.s" +#include "ch376-native/base-drv/class_hub.c.s" +#include "ch376-native/base-drv/enumerate_storage.c.s" +#include "ch376-native/base-drv/enumerate_hub.c.s" +#include "ch376-native/base-drv/usb-base-drv.c.s" +#include "ch376-native/base-drv/transfers.c.s" +#include "ch376-native/base-drv/print.c.s" +#include "ch376-native/base-drv/ch376.c.s" +#include "ch376-native/base-drv/protocol.c.s" +#include "ch376-native/base-drv/work-area.c.s" +#include "ch376-native/base-drv/usb-init.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s new file mode 100644 index 00000000..ea6a174c --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -0,0 +1,780 @@ +; +; Generated from source-doc/base-drv/./ch376.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_result: + DEFS 1 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./ch376.c:7: void ch_command(const uint8_t command) __z88dk_fastcall { +; --------------------------------- +; Function ch_command +; --------------------------------- +_ch_command: +;source-doc/base-drv/./ch376.c:9: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) + ld h,0xff +l_ch_command_00102: + ld a, +((_CH376_COMMAND_PORT) / 256) + in a, (((_CH376_COMMAND_PORT) & 0xFF)) + bit 4, a + jr Z,l_ch_command_00104 + dec h + jr Z,l_ch_command_00104 +;source-doc/base-drv/./ch376.c:10: delay(); + push hl + call _delay + pop hl + jr l_ch_command_00102 +l_ch_command_00104: +;source-doc/base-drv/./ch376.c:20: delay(); + push hl + call _delay + pop hl +;source-doc/base-drv/./ch376.c:21: CH376_COMMAND_PORT = command; + ld a, l + ld bc,_CH376_COMMAND_PORT + out (c),a +;source-doc/base-drv/./ch376.c:22: delay(); +;source-doc/base-drv/./ch376.c:23: } + jp _delay +;source-doc/base-drv/./ch376.c:27: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } +; --------------------------------- +; Function ch_long_wait_int_and_get_status +; --------------------------------- +_ch_long_wait_int_and_get_statu: + ld hl,0x1388 + jp _ch_wait_int_and_get_status +;source-doc/base-drv/./ch376.c:29: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } +; --------------------------------- +; Function ch_short_wait_int_and_get_statu +; --------------------------------- +_ch_short_wait_int_and_get_stat: + ld hl,0x0064 + jp _ch_wait_int_and_get_status +;source-doc/base-drv/./ch376.c:31: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } +; --------------------------------- +; Function ch_very_short_wait_int_and_get_ +; --------------------------------- +_ch_very_short_wait_int_and_get: + ld hl,0x000a + jp _ch_wait_int_and_get_status +;source-doc/base-drv/./ch376.c:33: usb_error ch_get_status(void) { +; --------------------------------- +; Function ch_get_status +; --------------------------------- +_ch_get_status: +;source-doc/base-drv/./ch376.c:34: ch_command(CH_CMD_GET_STATUS); + ld l,0x22 + call _ch_command +;source-doc/base-drv/./ch376.c:35: uint8_t ch_status = CH376_DATA_PORT; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) +;source-doc/base-drv/./ch376.c:37: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) + ld l,a + sub 0x41 + jr C,l_ch_get_status_00102 + ld a,0xb4 + sub l +;source-doc/base-drv/./ch376.c:38: return ch_status; + jr NC,l_ch_get_status_00126 +l_ch_get_status_00102: +;source-doc/base-drv/./ch376.c:40: if (ch_status == CH_CMD_RET_SUCCESS) + ld a, l +;source-doc/base-drv/./ch376.c:41: return USB_ERR_OK; + sub 0x51 + jr NZ,l_ch_get_status_00105 + ld l,a + jr l_ch_get_status_00126 +l_ch_get_status_00105: +;source-doc/base-drv/./ch376.c:43: if (ch_status == CH_USB_INT_SUCCESS) + ld a, l +;source-doc/base-drv/./ch376.c:44: return USB_ERR_OK; + sub 0x14 + jr NZ,l_ch_get_status_00107 + ld l,a + jr l_ch_get_status_00126 +l_ch_get_status_00107: +;source-doc/base-drv/./ch376.c:46: if (ch_status == CH_USB_INT_CONNECT) + ld a, l + sub 0x15 + jr NZ,l_ch_get_status_00109 +;source-doc/base-drv/./ch376.c:47: return USB_INT_CONNECT; + ld l,0x81 + jr l_ch_get_status_00126 +l_ch_get_status_00109: +;source-doc/base-drv/./ch376.c:49: if (ch_status == CH_USB_INT_DISK_READ) + ld a, l + sub 0x1d + jr NZ,l_ch_get_status_00111 +;source-doc/base-drv/./ch376.c:50: return USB_ERR_DISK_READ; + ld l,0x1d + jr l_ch_get_status_00126 +l_ch_get_status_00111: +;source-doc/base-drv/./ch376.c:52: if (ch_status == CH_USB_INT_DISK_WRITE) + ld a, l + sub 0x1e + jr NZ,l_ch_get_status_00113 +;source-doc/base-drv/./ch376.c:53: return USB_ERR_DISK_WRITE; + ld l,0x1e + jr l_ch_get_status_00126 +l_ch_get_status_00113: +;source-doc/base-drv/./ch376.c:55: if (ch_status == CH_USB_INT_DISCONNECT) { + ld a, l + sub 0x16 + jr NZ,l_ch_get_status_00115 +;source-doc/base-drv/./ch376.c:56: ch_cmd_set_usb_mode(5); + ld l,0x05 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/./ch376.c:57: return USB_ERR_NO_DEVICE; + ld l,0x05 + jr l_ch_get_status_00126 +l_ch_get_status_00115: +;source-doc/base-drv/./ch376.c:60: if (ch_status == CH_USB_INT_BUF_OVER) + ld a, l + sub 0x17 + jr NZ,l_ch_get_status_00117 +;source-doc/base-drv/./ch376.c:61: return USB_ERR_DATA_ERROR; + ld l,0x04 + jr l_ch_get_status_00126 +l_ch_get_status_00117: +;source-doc/base-drv/./ch376.c:63: ch_status &= 0x2F; + ld a, l + and 0x2f +;source-doc/base-drv/./ch376.c:65: if (ch_status == 0x2A) + cp 0x2a + jr NZ,l_ch_get_status_00119 +;source-doc/base-drv/./ch376.c:66: return USB_ERR_NAK; + ld l,0x01 + jr l_ch_get_status_00126 +l_ch_get_status_00119: +;source-doc/base-drv/./ch376.c:68: if (ch_status == 0x2E) + cp 0x2e + jr NZ,l_ch_get_status_00121 +;source-doc/base-drv/./ch376.c:69: return USB_ERR_STALL; + ld l,0x02 + jr l_ch_get_status_00126 +l_ch_get_status_00121: +;source-doc/base-drv/./ch376.c:71: ch_status &= 0x23; + and 0x23 +;source-doc/base-drv/./ch376.c:73: if (ch_status == 0x20) + cp 0x20 + jr NZ,l_ch_get_status_00123 +;source-doc/base-drv/./ch376.c:74: return USB_ERR_TIMEOUT; + ld l,0x03 + jr l_ch_get_status_00126 +l_ch_get_status_00123: +;source-doc/base-drv/./ch376.c:76: if (ch_status == 0x23) + sub 0x23 + jr NZ,l_ch_get_status_00125 +;source-doc/base-drv/./ch376.c:77: return USB_TOKEN_OUT_OF_SYNC; + ld l,0x07 + jr l_ch_get_status_00126 +l_ch_get_status_00125: +;source-doc/base-drv/./ch376.c:79: return USB_ERR_UNEXPECTED_STATUS_FROM_; + ld l,0x08 +l_ch_get_status_00126: +;source-doc/base-drv/./ch376.c:80: } + ret +;source-doc/base-drv/./ch376.c:82: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } +; --------------------------------- +; Function ch_cmd_reset_all +; --------------------------------- +_ch_cmd_reset_all: + ld l,0x05 + jp _ch_command +;source-doc/base-drv/./ch376.c:101: uint8_t ch_probe(void) { +; --------------------------------- +; Function ch_probe +; --------------------------------- +_ch_probe: +;source-doc/base-drv/./ch376.c:103: do { + ld c,0x05 +l_ch_probe_00103: +;source-doc/base-drv/./ch376.c:86: ch_command(CH_CMD_CHECK_EXIST); + push bc + ld l,0x06 + call _ch_command + pop bc +;source-doc/base-drv/./ch376.c:87: CH376_DATA_PORT = (uint8_t)~0x55; + ld a,0xaa + push bc + ld bc,_CH376_DATA_PORT + out (c),a + call _delay + pop bc +;source-doc/base-drv/./ch376.c:89: complement = CH376_DATA_PORT; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) +;source-doc/base-drv/./ch376.c:90: return complement == 0x55; + sub 0x55 + jr NZ,l_ch_probe_00102 +;source-doc/base-drv/./ch376.c:104: if (ch_cmd_check_exist()) +;source-doc/base-drv/./ch376.c:105: return true; + ld l,0x01 + jr l_ch_probe_00107 +l_ch_probe_00102: +;source-doc/base-drv/./ch376.c:107: delay_medium(); + push bc + call _delay_medium + pop bc +;source-doc/base-drv/./ch376.c:108: } while (--i != 0); + dec c + ld a, c +;source-doc/base-drv/./ch376.c:110: return false; + or a + jr NZ,l_ch_probe_00103 + ld l,a +l_ch_probe_00107: +;source-doc/base-drv/./ch376.c:111: } + ret +;source-doc/base-drv/./ch376.c:113: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +; --------------------------------- +; Function ch_cmd_set_usb_mode +; --------------------------------- +_ch_cmd_set_usb_mode: +;source-doc/base-drv/./ch376.c:114: uint8_t result = 0; + ld h,0x00 +;source-doc/base-drv/./ch376.c:116: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; + ld a,0x15 + ld bc,_CH376_COMMAND_PORT + out (c),a +;source-doc/base-drv/./ch376.c:117: delay(); + push hl + call _delay + pop hl +;source-doc/base-drv/./ch376.c:118: CH376_DATA_PORT = mode; + ld a, l + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./ch376.c:119: delay(); + push hl + call _delay + pop hl +;source-doc/base-drv/./ch376.c:123: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { + ld l,0x7f +l_ch_cmd_set_usb_mode_00103: + ld a, h + sub 0x51 + jr NZ,l_ch_cmd_set_usb_mode_00136 + ld a,0x01 + jr l_ch_cmd_set_usb_mode_00137 +l_ch_cmd_set_usb_mode_00136: + xor a +l_ch_cmd_set_usb_mode_00137: + ld c,a + bit 0,a + jr NZ,l_ch_cmd_set_usb_mode_00105 + ld a, h + sub 0x5f + jr Z,l_ch_cmd_set_usb_mode_00105 + dec l + jr Z,l_ch_cmd_set_usb_mode_00105 +;source-doc/base-drv/./ch376.c:124: result = CH376_DATA_PORT; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) + ld h, a +;source-doc/base-drv/./ch376.c:125: delay(); + push hl + call _delay + pop hl + jr l_ch_cmd_set_usb_mode_00103 +l_ch_cmd_set_usb_mode_00105: +;source-doc/base-drv/./ch376.c:128: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; + ld a, c + or a + jr Z,l_ch_cmd_set_usb_mode_00108 + ld hl,0x0000 + jr l_ch_cmd_set_usb_mode_00109 +l_ch_cmd_set_usb_mode_00108: + ld hl,0x000e +l_ch_cmd_set_usb_mode_00109: +;source-doc/base-drv/./ch376.c:129: } + ret +;source-doc/base-drv/./ch376.c:131: uint8_t ch_cmd_get_ic_version(void) { +; --------------------------------- +; Function ch_cmd_get_ic_version +; --------------------------------- +_ch_cmd_get_ic_version: +;source-doc/base-drv/./ch376.c:132: ch_command(CH_CMD_GET_IC_VER); + ld l,0x01 + call _ch_command +;source-doc/base-drv/./ch376.c:133: return CH376_DATA_PORT & 0x1f; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) + and 0x1f + ld l, a +;source-doc/base-drv/./ch376.c:134: } + ret +;source-doc/base-drv/./ch376.c:136: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { +; --------------------------------- +; Function ch_issue_token +; --------------------------------- +_ch_issue_token: +;source-doc/base-drv/./ch376.c:137: ch_command(CH_CMD_ISSUE_TKN_X); + ld l,0x4e + call _ch_command +;source-doc/base-drv/./ch376.c:138: CH376_DATA_PORT = toggle_bit; + ld hl,2+0 + add hl, sp + ld a, (hl) + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./ch376.c:139: delay(); + call _delay +;source-doc/base-drv/./ch376.c:140: CH376_DATA_PORT = endpoint << 4 | pid; + ld iy,3 + add iy, sp + ld a,(iy+0) + add a, a + add a, a + add a, a + add a, a + inc iy + or (iy+0) + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./ch376.c:141: delay(); +;source-doc/base-drv/./ch376.c:142: } + jp _delay +;source-doc/base-drv/./ch376.c:144: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { +; --------------------------------- +; Function ch_issue_token_in +; --------------------------------- +_ch_issue_token_in: +;source-doc/base-drv/./ch376.c:145: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); + ld e,l + ld d,h + ld a, (hl) + rrca + and 0x07 + ld b, a + ex de, hl + ld a, (hl) + and 0x01 + jr Z,l_ch_issue_token_in_00103 + ld a,0x80 + jr l_ch_issue_token_in_00104 +l_ch_issue_token_in_00103: + xor a +l_ch_issue_token_in_00104: + ld h,0x09 + ld l,b + push hl + push af + inc sp + call _ch_issue_token + pop af + inc sp +;source-doc/base-drv/./ch376.c:146: } + ret +;source-doc/base-drv/./ch376.c:148: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { +; --------------------------------- +; Function ch_issue_token_out +; --------------------------------- +_ch_issue_token_out: +;source-doc/base-drv/./ch376.c:149: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); + ld e,l + ld d,h + ld a, (hl) + rrca + and 0x07 + ld b, a + ex de, hl + ld a, (hl) + and 0x01 + jr Z,l_ch_issue_token_out_00103 + ld a,0x40 + jr l_ch_issue_token_out_00104 +l_ch_issue_token_out_00103: + xor a +l_ch_issue_token_out_00104: + ld h,0x01 + ld l,b + push hl + push af + inc sp + call _ch_issue_token + pop af + inc sp +;source-doc/base-drv/./ch376.c:150: } + ret +;source-doc/base-drv/./ch376.c:152: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } +; --------------------------------- +; Function ch_issue_token_out_ep0 +; --------------------------------- +_ch_issue_token_out_ep0: + ld a,0x01 + push af + inc sp + xor a + ld d,a + ld e,0x40 + push de + call _ch_issue_token + pop af + inc sp + ret +;source-doc/base-drv/./ch376.c:154: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } +; --------------------------------- +; Function ch_issue_token_in_ep0 +; --------------------------------- +_ch_issue_token_in_ep0: + ld a,0x09 + push af + inc sp + xor a + ld d,a + ld e,0x80 + push de + call _ch_issue_token + pop af + inc sp + ret +;source-doc/base-drv/./ch376.c:156: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } +; --------------------------------- +; Function ch_issue_token_setup +; --------------------------------- +_ch_issue_token_setup: + ld a,0x0d + push af + inc sp + xor a + push af + inc sp + xor a + push af + inc sp + call _ch_issue_token + pop af + inc sp + ret +;source-doc/base-drv/./ch376.c:158: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { +; --------------------------------- +; Function ch_data_in_transfer +; --------------------------------- +_ch_data_in_transfer: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/./ch376.c:162: if (buffer_size == 0) + ld a,(ix+7) + or (ix+6) + jr NZ,l_ch_data_in_transfer_00102 +;source-doc/base-drv/./ch376.c:163: return USB_ERR_OK; + ld l,0x00 + jp l_ch_data_in_transfer_00110 +l_ch_data_in_transfer_00102: +;source-doc/base-drv/./ch376.c:165: USB_MODULE_LEDS = 0x01; + ld a,0x01 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/./ch376.c:166: do { + ld c,(ix+8) + ld b,(ix+9) + pop de + push bc +l_ch_data_in_transfer_00107: +;source-doc/base-drv/./ch376.c:167: ch_issue_token_in(endpoint); + ld l,c + ld h,b + push hl + call _ch_issue_token_in + call _ch_long_wait_int_and_get_statu + ld a, l + pop bc + ld l, a +;source-doc/base-drv/./ch376.c:170: CHECK(result); + or a + jr NZ,l_ch_data_in_transfer_00110 +;source-doc/base-drv/./ch376.c:172: endpoint->toggle = !endpoint->toggle; + ld e, c + ld d, b + pop hl + ld a,(hl) + push hl + and 0x01 + xor 0x01 + and 0x01 + ld l, a + ld a, (de) + and 0xfe + or l + ld (de), a +;source-doc/base-drv/./ch376.c:174: count = ch_read_data(buffer); + push bc + ld l,(ix+4) + ld h,(ix+5) + call _ch_read_data + pop bc +;source-doc/base-drv/./ch376.c:176: if (count == 0) { + ld e,a +;source-doc/base-drv/./ch376.c:177: USB_MODULE_LEDS = 0x00; + or a + jr NZ,l_ch_data_in_transfer_00106 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/./ch376.c:178: return USB_ERR_DATA_ERROR; + ld l,0x04 + jr l_ch_data_in_transfer_00110 +l_ch_data_in_transfer_00106: +;source-doc/base-drv/./ch376.c:181: buffer += count; + ld a, e + add a,(ix+4) + ld (ix+4),a + ld a,0x00 + adc a,(ix+5) + ld (ix+5),a +;source-doc/base-drv/./ch376.c:182: buffer_size -= count; + ld d,0x00 + ld a,(ix+6) + sub e + ld (ix+6),a + ld a,(ix+7) + sbc a, d + ld (ix+7),a +;source-doc/base-drv/./ch376.c:183: } while (buffer_size > 0); + xor a + cp (ix+6) + sbc a,(ix+7) + jp PO, l_ch_data_in_transfer_00137 + xor 0x80 +l_ch_data_in_transfer_00137: + jp M, l_ch_data_in_transfer_00107 +;source-doc/base-drv/./ch376.c:185: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/./ch376.c:187: return USB_ERR_OK; + ld l,0x00 +l_ch_data_in_transfer_00110: +;source-doc/base-drv/./ch376.c:188: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./ch376.c:190: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +; --------------------------------- +; Function ch_data_in_transfer_n +; --------------------------------- +_ch_data_in_transfer_n: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./ch376.c:194: USB_MODULE_LEDS = 0x01; + ld a,0x01 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/./ch376.c:196: ch_issue_token_in(endpoint); + ld l,(ix+8) + ld h,(ix+9) + call _ch_issue_token_in +;source-doc/base-drv/./ch376.c:198: CHECK(ch_long_wait_int_and_get_status()); + call _ch_long_wait_int_and_get_statu + ld a,l + or a + jr NZ,l_ch_data_in_transfer_n_00103 +;source-doc/base-drv/./ch376.c:200: endpoint->toggle = !endpoint->toggle; + ld l,(ix+8) + ld h,(ix+9) + ld a,(hl) + and 0x01 + xor 0x01 + and 0x01 + ld e,a + ld a,(hl) + and 0xfe + or e + ld (hl),a +;source-doc/base-drv/./ch376.c:202: count = ch_read_data(buffer); + ld l,(ix+4) + ld h,(ix+5) + call _ch_read_data +;source-doc/base-drv/./ch376.c:204: *buffer_size = count; + ld c,(ix+6) + ld b,(ix+7) + ld (bc), a +;source-doc/base-drv/./ch376.c:206: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/./ch376.c:208: return USB_ERR_OK; + ld l,0x00 +l_ch_data_in_transfer_n_00103: +;source-doc/base-drv/./ch376.c:209: } + pop ix + ret +;source-doc/base-drv/./ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +; --------------------------------- +; Function ch_data_out_transfer +; --------------------------------- +_ch_data_out_transfer: + push ix + ld ix,0 + add ix,sp + push af + dec sp +;source-doc/base-drv/./ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); + ld c,(ix+8) + ld b,(ix+9) + ld e, c + ld d, b + inc de + ld a, (de) + ld (ix-3),a +;source-doc/base-drv/./ch376.c:216: USB_MODULE_LEDS = 0x02; + ld a,0x02 + push bc + ld bc,_USB_MODULE_LEDS + out (c),a + pop bc +;source-doc/base-drv/./ch376.c:218: while (buffer_length > 0) { + ld (ix-2),c + ld (ix-1),b +l_ch_data_out_transfer_00103: + xor a + cp (ix+6) + sbc a,(ix+7) + jp PO, l_ch_data_out_transfer_00130 + xor 0x80 +l_ch_data_out_transfer_00130: + jp P, l_ch_data_out_transfer_00105 +;source-doc/base-drv/./ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; + ld d,(ix-3) + ld e,0x00 + ld a, d + sub (ix+6) + ld a, e + sbc a,(ix+7) + jp PO, l_ch_data_out_transfer_00131 + xor 0x80 +l_ch_data_out_transfer_00131: + jp P, l_ch_data_out_transfer_00108 + jr l_ch_data_out_transfer_00109 +l_ch_data_out_transfer_00108: + ld d,(ix+6) + ld e,(ix+7) +l_ch_data_out_transfer_00109: +;source-doc/base-drv/./ch376.c:220: buffer = ch_write_data(buffer, size); + push bc + push de + push de + inc sp + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ch_write_data + pop af + inc sp + pop de + pop bc + ld (ix+4),l + ld (ix+5),h +;source-doc/base-drv/./ch376.c:221: buffer_length -= size; + ld e,0x00 + ld a,(ix+6) + sub d + ld (ix+6),a + ld a,(ix+7) + sbc a, e + ld (ix+7),a +;source-doc/base-drv/./ch376.c:222: ch_issue_token_out(endpoint); + ld l,c + ld h,b + push hl + call _ch_issue_token_out + call _ch_long_wait_int_and_get_statu + ld a, l + pop bc + ld l, a + or a + jr NZ,l_ch_data_out_transfer_00106 +;source-doc/base-drv/./ch376.c:226: endpoint->toggle = !endpoint->toggle; + ld e, c + ld d, b + ld l,(ix-2) + ld h,(ix-1) + ld a, (hl) + and 0x01 + xor 0x01 + and 0x01 + ld l, a + ld a, (de) + and 0xfe + or l + ld (de), a + jr l_ch_data_out_transfer_00103 +l_ch_data_out_transfer_00105: +;source-doc/base-drv/./ch376.c:229: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/./ch376.c:231: return USB_ERR_OK; + ld l,0x00 +l_ch_data_out_transfer_00106: +;source-doc/base-drv/./ch376.c:232: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./ch376.c:234: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +; --------------------------------- +; Function ch_set_usb_address +; --------------------------------- +_ch_set_usb_address: +;source-doc/base-drv/./ch376.c:235: ch_command(CH_CMD_SET_USB_ADDR); + push hl + ld l,0x13 + call _ch_command + pop hl +;source-doc/base-drv/./ch376.c:236: CH376_DATA_PORT = device_address; + ld a, l + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./ch376.c:237: delay(); +;source-doc/base-drv/./ch376.c:238: } + jp _delay +_result: + DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s new file mode 100644 index 00000000..37be1196 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s @@ -0,0 +1,98 @@ +; +; Generated from source-doc/base-drv/./class_hub.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./class_hub.c:7: usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1) { +; --------------------------------- +; Function hub_get_descriptor +; --------------------------------- +_hub_get_descriptor: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/./class_hub.c:8: return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); + ld c,l + ld b,h + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld b, a + ld a,(ix-1) + ld c,b + ld b,a + push bc + push de + ld hl,_cmd_get_hub_descriptor + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/base-drv/./class_hub.c:9: } + inc sp + pop ix + ret +_cmd_get_hub_descriptor: + DEFB +0xa0 + DEFB +0x06 + DEFB +0x00 + DEFB +0x29 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0008 diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s new file mode 100644 index 00000000..200bb6b2 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -0,0 +1,454 @@ +; +; Generated from source-doc/base-drv/./dev_transfers.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./dev_transfers.c:28: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { +; --------------------------------- +; Function usbdev_control_transfer +; --------------------------------- +_usbdev_control_transfer: +;source-doc/base-drv/./dev_transfers.c:29: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); + ld hl,2 + add hl, sp + ld e, (hl) + inc hl + ld d, (hl) + ld l, e + ld h, d + inc hl + ld b, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld iy,6 + add iy, sp + ld e,(iy+0) + ld d,(iy+1) + ld c,a + push bc + push de + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + call _usb_control_transfer + pop af + pop af + pop af +;source-doc/base-drv/./dev_transfers.c:30: } + ret +;source-doc/base-drv/./dev_transfers.c:32: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { +; --------------------------------- +; Function usbdev_blk_out_trnsfer +; --------------------------------- +_usbdev_blk_out_trnsfer: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/./dev_transfers.c:36: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + inc de + inc de + inc de +;source-doc/base-drv/./dev_transfers.c:38: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + push bc + push de + push de + push af + inc sp + ld l,(ix+8) + ld h,(ix+9) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_out_transfer + pop af + pop af + pop af + inc sp + pop de + pop bc +;source-doc/base-drv/./dev_transfers.c:40: if (result == USB_ERR_STALL) { + ld a, l + sub 0x02 + jr NZ,l_usbdev_blk_out_trnsfer_00102 +;source-doc/base-drv/./dev_transfers.c:41: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + ld l, c + ld h, b + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld b, a + ld l, e + ld h, d + ld a, (hl) + rrca + and 0x07 + push de + ld h,(ix-1) + ld l,b + push hl + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop de +;source-doc/base-drv/./dev_transfers.c:42: endpoint->toggle = 0; + ex de, hl + res 0, (hl) +;source-doc/base-drv/./dev_transfers.c:43: return USB_ERR_STALL; + ld l,0x02 +;source-doc/base-drv/./dev_transfers.c:46: RETURN_CHECK(result); +l_usbdev_blk_out_trnsfer_00102: +;source-doc/base-drv/./dev_transfers.c:47: } + inc sp + pop ix + ret +;source-doc/base-drv/./dev_transfers.c:49: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { +; --------------------------------- +; Function usbdev_bulk_in_transfer +; --------------------------------- +_usbdev_bulk_in_transfer: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/./dev_transfers.c:53: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; + ld c,(ix+4) + ld b,(ix+5) + ld hl,0x0006 + add hl, bc +;source-doc/base-drv/./dev_transfers.c:55: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); + ld e,c + ld d,b + ex de,hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + push bc + push de + push de + push af + inc sp + ld l,(ix+8) + ld h,(ix+9) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_in_transfer_n + pop af + pop af + pop af + inc sp + pop de + pop bc +;source-doc/base-drv/./dev_transfers.c:57: if (result == USB_ERR_STALL) { + ld a, l + sub 0x02 + jr NZ,l_usbdev_bulk_in_transfer_00102 +;source-doc/base-drv/./dev_transfers.c:58: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + ld l, c + ld h, b + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld b, a + ld l, e + ld h, d + ld a, (hl) + rrca + and 0x07 + push de + ld h,(ix-1) + ld l,b + push hl + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop de +;source-doc/base-drv/./dev_transfers.c:59: endpoint->toggle = 0; + ex de, hl + res 0, (hl) +;source-doc/base-drv/./dev_transfers.c:60: return USB_ERR_STALL; + ld l,0x02 +;source-doc/base-drv/./dev_transfers.c:63: RETURN_CHECK(result); +l_usbdev_bulk_in_transfer_00102: +;source-doc/base-drv/./dev_transfers.c:64: } + inc sp + pop ix + ret +;source-doc/base-drv/./dev_transfers.c:66: usb_error usbdev_dat_in_trnsfer(device_config *const device, +; --------------------------------- +; Function usbdev_dat_in_trnsfer +; --------------------------------- +_usbdev_dat_in_trnsfer: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/./dev_transfers.c:73: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + inc de + inc de + inc de + push de + ld l,(ix+10) + ld e, l + add hl, hl + add hl, de + pop de + ld h,0x00 + add hl, de +;source-doc/base-drv/./dev_transfers.c:75: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + ld e,c + ld d,b + ex de,hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + push bc + push de + push de + push af + inc sp + ld l,(ix+8) + ld h,(ix+9) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp + pop de + pop bc +;source-doc/base-drv/./dev_transfers.c:77: if (result == USB_ERR_STALL) { + ld a, l + sub 0x02 + jr NZ,l_usbdev_dat_in_trnsfer_00102 +;source-doc/base-drv/./dev_transfers.c:78: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + ld l, c + ld h, b + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld b, a + ld l, e + ld h, d + ld a, (hl) + rrca + and 0x07 + push de + ld h,(ix-1) + ld l,b + push hl + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop de +;source-doc/base-drv/./dev_transfers.c:79: endpoint->toggle = 0; + ex de, hl + res 0, (hl) +;source-doc/base-drv/./dev_transfers.c:80: return USB_ERR_STALL; + ld l,0x02 +;source-doc/base-drv/./dev_transfers.c:83: RETURN_CHECK(result); +l_usbdev_dat_in_trnsfer_00102: +;source-doc/base-drv/./dev_transfers.c:84: } + inc sp + pop ix + ret +;source-doc/base-drv/./dev_transfers.c:86: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) { +; --------------------------------- +; Function usbdev_dat_in_trnsfer_0 +; --------------------------------- +_usbdev_dat_in_trnsfer_0: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; + push hl + ld c,l + ld b,h + pop iy + inc iy + inc iy + inc iy +;source-doc/base-drv/./dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld l,(ix+4) + ld h,0x00 + push bc + push iy + push iy + push af + inc sp + push hl + push de + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp + ld d, l + pop iy + pop bc +;source-doc/base-drv/./dev_transfers.c:94: if (result == USB_ERR_STALL) { + ld a, d + sub 0x02 + jr NZ,l_usbdev_dat_in_trnsfer_0_00102 +;source-doc/base-drv/./dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + ld l, c + ld h, b + inc hl + ld d, (hl) + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld b, a + push iy + pop hl + ld a, (hl) + rrca + and 0x07 + push iy + ld e,b + push de + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop iy +;source-doc/base-drv/./dev_transfers.c:96: endpoint->toggle = 0; + push iy + pop hl + res 0, (hl) +;source-doc/base-drv/./dev_transfers.c:97: return USB_ERR_STALL; + ld a,0x02 + jr l_usbdev_dat_in_trnsfer_0_00103 +l_usbdev_dat_in_trnsfer_0_00102: +;source-doc/base-drv/./dev_transfers.c:100: RETURN_CHECK(result); + ld a, d +l_usbdev_dat_in_trnsfer_0_00103: +;source-doc/base-drv/./dev_transfers.c:101: } + pop ix + pop hl + inc sp + jp (hl) diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s new file mode 100644 index 00000000..34a3b265 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -0,0 +1,948 @@ +; +; Generated from source-doc/base-drv/./enumerate.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./enumerate.c:13: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) +; --------------------------------- +; Function parse_endpoint_keyboard +; --------------------------------- +_parse_endpoint_keyboard: +;source-doc/base-drv/./enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; + inc hl + inc hl + inc hl + push hl + pop iy +;source-doc/base-drv/./enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; + push iy + pop bc + ld l, e + ld h, d + inc hl + inc hl + ld a, (hl) + rlca + and 0x0e + ld l, a + ld a, (bc) + and 0xf1 + or l + ld (bc), a +;source-doc/base-drv/./enumerate.c:17: ep->toggle = 0; + push iy + pop hl + res 0, (hl) +;source-doc/base-drv/./enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); + push iy + pop bc + inc bc + ld hl,4 + add hl, de + ld e, (hl) + inc hl + ld a, (hl) + and 0x03 + ld d, a + ld a, e + ld (bc), a + inc bc + ld a, d + and 0x03 + ld l,a + ld a, (bc) + and 0xfc + or l + ld (bc), a +;source-doc/base-drv/./enumerate.c:19: } + ret +;source-doc/base-drv/./enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { +; --------------------------------- +; Function identify_class_driver +; --------------------------------- +_identify_class_driver: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; + ld c,(ix+4) + ld b,(ix+5) + ld hl,27 + add hl, bc + ld c, (hl) + inc hl + ld b, (hl) +;source-doc/base-drv/./enumerate.c:23: if (p->bInterfaceClass == 2) + push bc + pop iy + ld e,(iy+5) + ld a, e + sub 0x02 + jr NZ,l_identify_class_driver_00102 +;source-doc/base-drv/./enumerate.c:24: return USB_IS_CDC; + ld l,0x03 + jr l_identify_class_driver_00118 +l_identify_class_driver_00102: +;source-doc/base-drv/./enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) + ld a, e + sub 0x08 + jr NZ,l_identify_class_driver_00177 + ld a,0x01 + jr l_identify_class_driver_00178 +l_identify_class_driver_00177: + xor a +l_identify_class_driver_00178: + ld d,a + or a + jr Z,l_identify_class_driver_00104 + ld hl,0x0006 + add hl,bc + ld a, (hl) + cp 0x06 + jr Z,l_identify_class_driver_00107 + sub 0x05 + jr NZ,l_identify_class_driver_00104 +l_identify_class_driver_00107: + ld hl,0x0007 + add hl,bc + ld a, (hl) + sub 0x50 + jr NZ,l_identify_class_driver_00104 +;source-doc/base-drv/./enumerate.c:27: return USB_IS_MASS_STORAGE; + ld l,0x02 + jr l_identify_class_driver_00118 +l_identify_class_driver_00104: +;source-doc/base-drv/./enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) + ld a, d + or a + jr Z,l_identify_class_driver_00109 + ld hl,0x0006 + add hl,bc + ld a, (hl) + sub 0x04 + jr NZ,l_identify_class_driver_00109 + ld hl,0x0007 + add hl,bc + ld a, (hl) + or a + jr NZ,l_identify_class_driver_00109 +;source-doc/base-drv/./enumerate.c:30: return USB_IS_FLOPPY; + ld l,0x01 + jr l_identify_class_driver_00118 +l_identify_class_driver_00109: +;source-doc/base-drv/./enumerate.c:32: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) + ld a, e + sub 0x09 + jr NZ,l_identify_class_driver_00113 + ld hl,0x0006 + add hl,bc + ld a, (hl) + or a + jr NZ,l_identify_class_driver_00113 + ld hl,7 + add hl, bc + ld a, (hl) + or a + jr NZ,l_identify_class_driver_00113 +;source-doc/base-drv/./enumerate.c:33: return USB_IS_HUB; + ld l,0x0f + jr l_identify_class_driver_00118 +l_identify_class_driver_00113: +;source-doc/base-drv/./enumerate.c:35: if (p->bInterfaceClass == 3) + ld a, e + sub 0x03 + jr NZ,l_identify_class_driver_00117 +;source-doc/base-drv/./enumerate.c:36: return USB_IS_KEYBOARD; + ld l,0x04 + jr l_identify_class_driver_00118 +l_identify_class_driver_00117: +;source-doc/base-drv/./enumerate.c:38: return USB_IS_UNKNOWN; + ld l,0x06 +l_identify_class_driver_00118: +;source-doc/base-drv/./enumerate.c:39: } + pop ix + ret +;source-doc/base-drv/./enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { +; --------------------------------- +; Function op_interface_next +; --------------------------------- +_op_interface_next: + ex de, hl +;source-doc/base-drv/./enumerate.c:42: if (--working->interface_count == 0) + ld hl,0x0016 + add hl, de + ld a, (hl) + dec a + ld (hl), a +;source-doc/base-drv/./enumerate.c:43: return USB_ERR_OK; + or a + jr NZ,l_op_interface_next_00102 + ld l,a + jr l_op_interface_next_00103 +l_op_interface_next_00102: +;source-doc/base-drv/./enumerate.c:45: return op_id_class_drv(working); + ex de, hl + call _op_id_class_drv + ld l, a +l_op_interface_next_00103: +;source-doc/base-drv/./enumerate.c:46: } + ret +;source-doc/base-drv/./enumerate.c:48: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_endpoint_next +; --------------------------------- +_op_endpoint_next: + ex de, hl +;source-doc/base-drv/./enumerate.c:49: if (--working->endpoint_count > 0) { + ld hl,0x0017 + add hl, de + ld a, (hl) + dec a + ld (hl), a + or a + jr Z,l_op_endpoint_next_00102 +;source-doc/base-drv/./enumerate.c:50: working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; + ld hl,0x001b + add hl, de + ld c, (hl) + inc hl + ld b, (hl) + dec hl + ld a, (bc) + add a, c + ld c, a + ld a,0x00 + adc a, b + ld (hl), c + inc hl + ld (hl), a +;source-doc/base-drv/./enumerate.c:51: return op_parse_endpoint(working); + ex de, hl + jp _op_parse_endpoint + jr l_op_endpoint_next_00103 +l_op_endpoint_next_00102: +;source-doc/base-drv/./enumerate.c:54: return op_interface_next(working); + ex de, hl + call _op_interface_next + ld a, l +l_op_endpoint_next_00103: +;source-doc/base-drv/./enumerate.c:55: } + ret +;source-doc/base-drv/./enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_parse_endpoint +; --------------------------------- +_op_parse_endpoint: +;source-doc/base-drv/./enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; + ld c,l + ld b,h + ld hl,27 + add hl,bc + ld e, (hl) + inc hl + ld d, (hl) + push de + pop iy +;source-doc/base-drv/./enumerate.c:59: device_config *const device = working->p_current_device; + ld hl,29 + add hl,bc + ld e, (hl) + inc hl + ld d, (hl) +;source-doc/base-drv/./enumerate.c:61: switch (working->usb_device) { + ld l, c + ld h, b + inc hl + inc hl + ld a, (hl) + cp 0x01 + jr Z,l_op_parse_endpoint_00102 + cp 0x02 + jr Z,l_op_parse_endpoint_00102 + sub 0x04 + jr Z,l_op_parse_endpoint_00103 + jr l_op_parse_endpoint_00104 +;source-doc/base-drv/./enumerate.c:63: case USB_IS_MASS_STORAGE: { +l_op_parse_endpoint_00102: +;source-doc/base-drv/./enumerate.c:64: parse_endpoints(device, endpoint); + push bc + push iy + push de + call _parse_endpoints + pop af + pop af + pop bc +;source-doc/base-drv/./enumerate.c:65: break; + jr l_op_parse_endpoint_00104 +;source-doc/base-drv/./enumerate.c:68: case USB_IS_KEYBOARD: { +l_op_parse_endpoint_00103: +;source-doc/base-drv/./enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); + ex de, hl + push bc + push iy + pop de + call _parse_endpoint_keyboard + pop bc +;source-doc/base-drv/./enumerate.c:72: } +l_op_parse_endpoint_00104: +;source-doc/base-drv/./enumerate.c:74: return op_endpoint_next(working); + ld l, c + ld h, b +;source-doc/base-drv/./enumerate.c:75: } + jp _op_endpoint_next +;source-doc/base-drv/./enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { +; --------------------------------- +; Function configure_device +; --------------------------------- +_configure_device: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/./enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; + ld e,(ix+8) + ld d,(ix+9) + ld c, e + ld b, d + inc bc + inc bc + ld l,(ix+6) + ld h,(ix+7) + inc hl + inc hl + ld a, (hl) + ld (bc), a +;source-doc/base-drv/./enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; + ld hl,0x0001 + add hl, de + ex (sp), hl + push iy + ex (sp), hl + ld l,(ix+4) + ex (sp), hl + ex (sp), hl + ld h,(ix+5) + ex (sp), hl + pop iy + push iy + pop bc + ld hl,10 + add hl, bc + ld a, (hl) + pop hl + push hl + ld (hl), a +;source-doc/base-drv/./enumerate.c:81: dev_cfg->address = working->current_device_address; + ld c, e + ld b, d + push iy + pop hl + ld a,+((0x0018) & 0xFF) + add a,l + ld l,a + ld a,+((0x0018) / 256) + adc a,h + ld h,a + ld a, (hl) + add a, a + add a, a + add a, a + add a, a + ld l, a + ld a, (bc) + and 0x0f + or l + ld (bc), a +;source-doc/base-drv/./enumerate.c:82: dev_cfg->type = working->usb_device; + ld c, e + ld b, d + push iy + pop hl + inc hl + inc hl + ld a, (hl) + and 0x0f + ld l, a + ld a, (bc) + and 0xf0 + or l + ld (bc), a +;source-doc/base-drv/./enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); + push iy + pop bc + ld hl,36 + add hl, bc + ld c, (hl) + pop hl + ld b,(hl) + push hl + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h, c + ld l,b + push hl + push af + inc sp + call _usbtrn_set_configuration +;source-doc/base-drv/./enumerate.c:85: } + ld sp,ix + pop ix + ret +;source-doc/base-drv/./enumerate.c:87: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_capture_hub_driver_interface +; --------------------------------- +_op_capture_hub_driver_interfac: + push ix + ld ix,0 + add ix,sp + ld iy, -7 + add iy, sp + ld sp, iy +;source-doc/base-drv/./enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + push hl + ex de,hl + pop iy + ld c,(iy+28) + ld a,(iy+27) + ld (ix-4),a + ld (ix-3),c +;source-doc/base-drv/./enumerate.c:92: working->hub_config = &hub_config; + ld hl,0x0019 + add hl, de + ld (ix-2),l + ld (ix-1),h + ld hl,0 + add hl, sp + ld c, l + ld l,(ix-2) + ld b,h + ld h,(ix-1) + ld (hl), c + inc hl + ld (hl), b +;source-doc/base-drv/./enumerate.c:94: hub_config.type = USB_IS_HUB; + ld hl,0 + add hl, sp + ld a, (hl) + or 0x0f + ld (hl), a +;source-doc/base-drv/./enumerate.c:95: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); + push de + ld hl,2 + add hl, sp + push hl + ld l,(ix-4) + ld h,(ix-3) + push hl + push de + call _configure_device + pop af + pop af + pop af + ld a, l + pop de + or a + jr NZ,l_op_capture_hub_driver_interfa +;source-doc/base-drv/./enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); + ex de, hl + call _configure_usb_hub + ld a, l +l_op_capture_hub_driver_interfa: +;source-doc/base-drv/./enumerate.c:97: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./enumerate.c:99: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { +; --------------------------------- +; Function op_cap_drv_intf +; --------------------------------- +_op_cap_drv_intf: + push ix + ld ix,0 + add ix,sp + ld iy, -16 + add iy, sp + ld sp, iy +;source-doc/base-drv/./enumerate.c:102: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + ld (ix-2),l + ld (ix-1),h + ld de,0x001b + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + dec hl + ld c, e + ld b, d +;source-doc/base-drv/./enumerate.c:104: working->ptr += interface->bLength; + ld a, (bc) + add a, e + ld e, a + ld a,0x00 + adc a, d + ld (hl), e + inc hl + ld (hl), a +;source-doc/base-drv/./enumerate.c:105: working->endpoint_count = interface->bNumEndpoints; + ld a,(ix-2) + add a,0x17 + ld e, a + ld a,(ix-1) + adc a,0x00 + ld d, a + push bc + pop iy + ld a,(iy+4) + ld (de), a +;source-doc/base-drv/./enumerate.c:106: working->p_current_device = NULL; + ld l,(ix-2) + ld h,(ix-1) + ld de,0x001d + add hl,de + ld (ix-4),l + ld (ix-3),h + xor a + ld (hl), a + inc hl + ld (hl), a +;source-doc/base-drv/./enumerate.c:108: switch (working->usb_device) { + ld e,(ix-2) + ld d,(ix-1) + inc de + inc de + ld a, (de) + cp 0x06 + jr Z,l_op_cap_drv_intf_00104 + sub 0x0f + jr NZ,l_op_cap_drv_intf_00107 +;source-doc/base-drv/./enumerate.c:110: CHECK(op_capture_hub_driver_interface(working)) + ld l,(ix-2) + ld h,(ix-1) + call _op_capture_hub_driver_interfac + or a + jr Z,l_op_cap_drv_intf_00112 + ld l, a + jr l_op_cap_drv_intf_00115 +;source-doc/base-drv/./enumerate.c:114: case USB_IS_UNKNOWN: { +l_op_cap_drv_intf_00104: +;source-doc/base-drv/./enumerate.c:116: memset(&unkown_dev_cfg, 0, sizeof(device_config)); + push bc + ld hl,2 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x0c + push hl + call _memset_callee + pop bc +;source-doc/base-drv/./enumerate.c:117: working->p_current_device = &unkown_dev_cfg; + ld hl,0 + add hl, sp + ex de, hl + ld l,(ix-4) + ld h,(ix-3) + ld (hl), e + inc hl + ld (hl), d +;source-doc/base-drv/./enumerate.c:118: CHECK(configure_device(working, interface, &unkown_dev_cfg)); + ld hl,0 + add hl, sp + push hl + push bc + ld l,(ix-2) + ld h,(ix-1) + push hl + call _configure_device + pop af + pop af + pop af + ld a, l + or a + jr Z,l_op_cap_drv_intf_00112 + jr l_op_cap_drv_intf_00115 +;source-doc/base-drv/./enumerate.c:122: default: { +l_op_cap_drv_intf_00107: +;source-doc/base-drv/./enumerate.c:123: device_config *dev_cfg = find_first_free(); + push bc + call _find_first_free +;source-doc/base-drv/./enumerate.c:124: if (dev_cfg == NULL) + pop bc + ld a,h + or l + ex de,hl + jr NZ,l_op_cap_drv_intf_00109 +;source-doc/base-drv/./enumerate.c:125: return USB_ERR_OUT_OF_MEMORY; + ld l,0x83 + jr l_op_cap_drv_intf_00115 +l_op_cap_drv_intf_00109: +;source-doc/base-drv/./enumerate.c:126: working->p_current_device = dev_cfg; + ld l,(ix-4) + ld h,(ix-3) + ld (hl), e + inc hl + ld (hl), d +;source-doc/base-drv/./enumerate.c:127: CHECK(configure_device(working, interface, dev_cfg)); + push de + push bc + ld l,(ix-2) + ld h,(ix-1) + push hl + call _configure_device + pop af + pop af + pop af + ld a, l + or a +;source-doc/base-drv/./enumerate.c:130: } + jr NZ,l_op_cap_drv_intf_00115 +l_op_cap_drv_intf_00112: +;source-doc/base-drv/./enumerate.c:132: CHECK(op_parse_endpoint(working)); + ld l,(ix-2) + ld h,(ix-1) + call _op_parse_endpoint + or a + jr Z,l_op_cap_drv_intf_00114 + ld l, a + jr l_op_cap_drv_intf_00115 +l_op_cap_drv_intf_00114: +;source-doc/base-drv/./enumerate.c:134: return result; + ld l, a +l_op_cap_drv_intf_00115: +;source-doc/base-drv/./enumerate.c:135: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./enumerate.c:137: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_id_class_drv +; --------------------------------- +_op_id_class_drv: +;source-doc/base-drv/./enumerate.c:139: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; + push hl + ex de,hl + pop iy + ld l,(iy+27) + ld h,(iy+28) +;source-doc/base-drv/./enumerate.c:141: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; + ld c, e + ld b, d + inc bc + inc bc + ld l, (hl) + ld a,0x05 + sub l + jr NC,l_op_id_class_drv_00105 + push bc + push de + push de + call _identify_class_driver + pop af + ld a, l + pop de + pop bc + ld l,0x00 + jr l_op_id_class_drv_00106 +l_op_id_class_drv_00105: + xor a + ld l, a +l_op_id_class_drv_00106: + ld (bc), a +;source-doc/base-drv/./enumerate.c:143: CHECK(op_cap_drv_intf(working)); + ex de, hl + call _op_cap_drv_intf + ld a, l + or a + ret NZ +;source-doc/base-drv/./enumerate.c:145: return result; +;source-doc/base-drv/./enumerate.c:146: } + ret +;source-doc/base-drv/./enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_get_cfg_desc +; --------------------------------- +_op_get_cfg_desc: + ex de, hl +;source-doc/base-drv/./enumerate.c:151: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + ld iy,0x001f + add iy, de + push iy + pop bc + push de + push iy + push bc + ld hl,0x0000 + push hl + ld l,0x8c + push hl + call _memset_callee + pop iy + pop de +;source-doc/base-drv/./enumerate.c:153: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + ld c, e + ld b, d + inc bc + inc bc + inc bc + ld hl,7 + add hl, bc + ld a, (hl) +;source-doc/base-drv/./enumerate.c:156: working->config.buffer)); + ld c, e + ld b, d + ld hl,24 + add hl, bc + ld b, (hl) + ld l, e + ld h, d + push bc + ld bc,0x0015 + add hl, bc + pop bc + ld c, (hl) + push de + push iy + push iy + ld h,0x8c + ld l,a + push hl + push bc + call _usbtrn_gfull_cfg_desc + pop af + pop af + pop af + ld a, l + pop iy + pop de + or a + ret NZ +;source-doc/base-drv/./enumerate.c:158: working->ptr = (working->config.buffer + sizeof(config_descriptor)); + ld hl,0x001b + add hl, de + ld a, e + add a,0x1f + ld c, a + ld a, d + adc a,0x00 + ld b, a + ld a, c + add a,0x09 + ld c, a + ld a, b + adc a,0x00 + ld (hl), c + inc hl + ld (hl), a +;source-doc/base-drv/./enumerate.c:159: working->interface_count = working->config.desc.bNumInterfaces; + ld hl,0x0016 + add hl, de + ld c, l + ld b, h + push iy + pop hl + inc hl + inc hl + inc hl + inc hl + ld a, (hl) + ld (bc), a +;source-doc/base-drv/./enumerate.c:161: CHECK(op_id_class_drv(working)); + ex de, hl + call _op_id_class_drv + or a + ret NZ +;source-doc/base-drv/./enumerate.c:163: return result; +;source-doc/base-drv/./enumerate.c:164: } + ret +;source-doc/base-drv/./enumerate.c:166: usb_error read_all_configs(enumeration_state *const state) { +; --------------------------------- +; Function read_all_configs +; --------------------------------- +_read_all_configs: + push ix + ld ix,0 + add ix,sp + ld hl, -171 + add hl, sp + ld sp, hl +;source-doc/base-drv/./enumerate.c:171: memset(&working, 0, sizeof(_working)); + ld hl,0 + add hl, sp + push hl + push hl + ld hl,0x0000 + push hl + ld l,0xab + push hl + call _memset_callee +;source-doc/base-drv/./enumerate.c:172: working.state = state; + pop hl + ld e,l + ld d,h + ld a,(ix+4) + ld (hl), a + inc hl + ld a,(ix+5) + ld (hl), a +;source-doc/base-drv/./enumerate.c:174: CHECK(usbtrn_get_descriptor(&working.desc)); + push de + ld hl,5 + add hl, sp + push hl + call _usbtrn_get_descriptor + pop af + pop de + ld a, l + or a + jr NZ,l_read_all_configs_00111 +;source-doc/base-drv/./enumerate.c:176: state->next_device_address++; + ld l,(ix+4) + ld h,(ix+5) + ld c, (hl) + inc c + ld (hl), c +;source-doc/base-drv/./enumerate.c:177: working.current_device_address = state->next_device_address; + ld hl,0x0018 + add hl, de + ld (hl), c +;source-doc/base-drv/./enumerate.c:178: CHECK(usbtrn_set_address(working.current_device_address)); + push de + ld l, c + call _usbtrn_set_address + pop de + ld a, l +;source-doc/base-drv/./enumerate.c:180: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + or a + jr NZ,l_read_all_configs_00111 + ld c,a +l_read_all_configs_00109: + ld hl,20+0 + add hl, sp + ld b, (hl) + ld a, c + sub b + jr NC,l_read_all_configs_00107 +;source-doc/base-drv/./enumerate.c:181: working.config_index = config_index; + ld hl,0x0015 + add hl, de + ld (hl), c +;source-doc/base-drv/./enumerate.c:183: CHECK(op_get_cfg_desc(&working)); + push bc + push de + ld hl,4 + add hl, sp + call _op_get_cfg_desc + pop de + pop bc + or a + jr Z,l_read_all_configs_00110 + ld l, a + jr l_read_all_configs_00111 +l_read_all_configs_00110: +;source-doc/base-drv/./enumerate.c:180: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + inc c + jr l_read_all_configs_00109 +l_read_all_configs_00107: +;source-doc/base-drv/./enumerate.c:186: return USB_ERR_OK; + ld l,0x00 +l_read_all_configs_00111: +;source-doc/base-drv/./enumerate.c:187: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./enumerate.c:189: usb_error enumerate_all_devices(void) { +; --------------------------------- +; Function enumerate_all_devices +; --------------------------------- +_enumerate_all_devices: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/./enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/./enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); + ld hl,0 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x01 + push hl + call _memset_callee +;source-doc/base-drv/./enumerate.c:193: state.next_device_address = 0; + ld (ix-1),0x00 +;source-doc/base-drv/./enumerate.c:195: usb_error result = read_all_configs(&state); + ld hl,0 + add hl, sp + push hl + call _read_all_configs + pop af +;source-doc/base-drv/./enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; + ld a,(ix-1) + ld c,l + ld ((_x + 1)),a +;source-doc/base-drv/./enumerate.c:199: CHECK(result); + ld a, c + or a + jr Z,l_enumerate_all_devices_00102 + ld l, c + jr l_enumerate_all_devices_00103 +l_enumerate_all_devices_00102: +;source-doc/base-drv/./enumerate.c:201: return result; + ld l, c +l_enumerate_all_devices_00103: +;source-doc/base-drv/./enumerate.c:202: } + inc sp + pop ix + ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s new file mode 100644 index 00000000..7974a653 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -0,0 +1,470 @@ +; +; Generated from source-doc/base-drv/./enumerate_hub.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./enumerate_hub.c:13: usb_error hub_set_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { +; --------------------------------- +; Function hub_set_feature +; --------------------------------- +_hub_set_feature: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./enumerate_hub.c:15: set_feature = cmd_set_feature; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x0008 + ld hl,_cmd_set_feature + ldir +;source-doc/base-drv/./enumerate_hub.c:17: set_feature.bValue[0] = feature; + ld a,(ix+6) + ld (ix-6),a +;source-doc/base-drv/./enumerate_hub.c:18: set_feature.bIndex[0] = index; + ld a,(ix+7) + ld (ix-4),a +;source-doc/base-drv/./enumerate_hub.c:19: return usb_control_transfer(&set_feature, 0, hub_config->address, hub_config->max_packet_size); + ld l,(ix+4) + ld h,(ix+5) + ld e,l + ld d,h + inc hl + ld b, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld c,a + push bc + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer +;source-doc/base-drv/./enumerate_hub.c:20: } + ld sp,ix + pop ix + ret +_cmd_set_feature: + DEFB +0x23 + DEFB +0x03 + DEFB +0x08 + DEFB +0x00 + DEFB +0x01 + DEFB +0x00 + DEFW +0x0000 +_cmd_clear_feature: + DEFB +0x23 + DEFB +0x01 + DEFB +0x08 + DEFB +0x00 + DEFB +0x01 + DEFB +0x00 + DEFW +0x0000 +_cmd_get_status_port: + DEFB +0xa3 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x01 + DEFB +0x00 + DEFW +0x0004 +;source-doc/base-drv/./enumerate_hub.c:22: usb_error hub_clear_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { +; --------------------------------- +; Function hub_clear_feature +; --------------------------------- +_hub_clear_feature: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./enumerate_hub.c:24: clear_feature = cmd_clear_feature; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x0008 + ld hl,_cmd_clear_feature + ldir +;source-doc/base-drv/./enumerate_hub.c:26: clear_feature.bValue[0] = feature; + ld a,(ix+6) + ld (ix-6),a +;source-doc/base-drv/./enumerate_hub.c:27: clear_feature.bIndex[0] = index; + ld a,(ix+7) + ld (ix-4),a +;source-doc/base-drv/./enumerate_hub.c:28: return usb_control_transfer(&clear_feature, 0, hub_config->address, hub_config->max_packet_size); + ld l,(ix+4) + ld h,(ix+5) + ld e,l + ld d,h + inc hl + ld b, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld c,a + push bc + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer +;source-doc/base-drv/./enumerate_hub.c:29: } + ld sp,ix + pop ix + ret +;source-doc/base-drv/./enumerate_hub.c:31: usb_error hub_get_status_port(const device_config_hub *const hub_config, const uint8_t index, hub_port_status *const port_status) { +; --------------------------------- +; Function hub_get_status_port +; --------------------------------- +_hub_get_status_port: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./enumerate_hub.c:33: get_status_port = cmd_get_status_port; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x0008 + ld hl,_cmd_get_status_port + ldir +;source-doc/base-drv/./enumerate_hub.c:35: get_status_port.bIndex[0] = index; + ld a,(ix+6) + ld (ix-4),a +;source-doc/base-drv/./enumerate_hub.c:36: return usb_control_transfer(&get_status_port, port_status, hub_config->address, hub_config->max_packet_size); + ld l,(ix+4) + ld h,(ix+5) + ld e,l + ld d,h + inc hl + ld b, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld e,(ix+7) + ld d,(ix+8) + ld c,a + push bc + push de + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer +;source-doc/base-drv/./enumerate_hub.c:37: } + ld sp,ix + pop ix + ret +;source-doc/base-drv/./enumerate_hub.c:39: usb_error configure_usb_hub(_working *const working) __z88dk_fastcall { +; --------------------------------- +; Function configure_usb_hub +; --------------------------------- +_configure_usb_hub: + push ix + ld ix,0 + add ix,sp + ld iy, -14 + add iy, sp + ld sp, iy +;source-doc/base-drv/./enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config; + push hl + ld c,l + ld b,h + pop iy + ld a,(iy+25) + ld (ix-2),a + ld a,(iy+26) + ld (ix-1),a +;source-doc/base-drv/./enumerate_hub.c:47: CHECK(hub_get_descriptor(hub_config, &hub_description)); + push bc + ld hl,2 + add hl, sp + ex de, hl + ld l,(ix-2) + ld h,(ix-1) + call _hub_get_descriptor + pop bc + ld e,a + or a + jr Z,l_configure_usb_hub_00102 + ld l, e + jp l_configure_usb_hub_00129 +l_configure_usb_hub_00102: +;source-doc/base-drv/./enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts; + ld d,(ix-12) +;source-doc/base-drv/./enumerate_hub.c:50: do { +l_configure_usb_hub_00126: +;source-doc/base-drv/./enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); + push bc + push de + ld e,0x08 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_clear_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jp NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); + push bc + push de + ld e,0x08 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_set_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jp NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i); + push bc + push de + ld e,0x04 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_clear_feature + pop af + pop af + pop de + push de + ld e,0x04 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_set_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jp NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status)); + push bc + push de + ld hl,12 + add hl, sp + push hl + push de + inc sp + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_get_status_port + pop af + pop af + inc sp + pop de + pop bc + ld a, l + or a + jp NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) { + ld hl,8 + add hl, sp + ld a, (hl) + and 0x01 + jp Z, l_configure_usb_hub_00124 +;source-doc/base-drv/./enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); + push bc + push de + ld e,0x10 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_clear_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jp NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); + push bc + push de + ld e,0x11 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_clear_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jr NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); + push bc + push de + ld e,0x14 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_clear_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jr NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:67: delay_short(); + push bc + push de + call _delay_short + pop de + push de + ld hl,12 + add hl, sp + push hl + push de + inc sp + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_get_status_port + pop af + pop af + inc sp + pop de + pop bc + ld a, l + or a + jr NZ,l_configure_usb_hub_00129 +;source-doc/base-drv/./enumerate_hub.c:70: delay_short(); + push bc + push de + call _delay_short + pop de +;source-doc/base-drv/./enumerate_hub.c:72: CHECK(read_all_configs(working->state)); + pop hl + ld e,(hl) + ld c,l + ld b,h + inc hl + ld h, (hl) + push bc + push de + ld l, e + push hl + call _read_all_configs + pop af + pop de + pop bc + ld a, l + or a + jr Z,l_configure_usb_hub_00127 + jr l_configure_usb_hub_00129 +l_configure_usb_hub_00124: +;source-doc/base-drv/./enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); + push bc + push de + ld e,0x08 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + call _hub_clear_feature + pop af + pop af + pop de + pop bc + ld a, l + or a + jr NZ,l_configure_usb_hub_00129 +l_configure_usb_hub_00127: +;source-doc/base-drv/./enumerate_hub.c:77: } while (--i != 0); + dec d + ld a, d +;source-doc/base-drv/./enumerate_hub.c:79: return USB_ERR_OK; + or a + jp NZ,l_configure_usb_hub_00126 + ld l,a +l_configure_usb_hub_00129: +;source-doc/base-drv/./enumerate_hub.c:80: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s new file mode 100644 index 00000000..0c6b3b90 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s @@ -0,0 +1,142 @@ +; +; Generated from source-doc/base-drv/./enumerate_storage.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./enumerate_storage.c:5: void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint) { +; --------------------------------- +; Function parse_endpoints +; --------------------------------- +_parse_endpoints: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/./enumerate_storage.c:7: if (!(pEndpoint->bmAttributes & 0x02)) + ld c,(ix+6) + ld b,(ix+7) + push bc + pop iy + ld a,(iy+3) + ld (ix-2),a + bit 1,a +;source-doc/base-drv/./enumerate_storage.c:8: return; + jr Z,l_parse_endpoints_00108 +;source-doc/base-drv/./enumerate_storage.c:10: const uint8_t x = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); + push bc + pop iy + ld a,(iy+4) + ld (ix-1),a +;source-doc/base-drv/./enumerate_storage.c:11: endpoint_param *const eps = storage_dev->endpoints; + ld e,(ix+4) + ld d,(ix+5) + inc de + inc de + inc de +;source-doc/base-drv/./enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) + inc bc + inc bc + ld a, (bc) + ld c,a + and 0x80 + ld b,0x00 +;source-doc/base-drv/./enumerate_storage.c:14: if (pEndpoint->bmAttributes & 0x01) { // 3 -> Interrupt + bit 0,(ix-2) + jr Z,l_parse_endpoints_00106 +;source-doc/base-drv/./enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) + or b +;source-doc/base-drv/./enumerate_storage.c:16: return; + jr Z,l_parse_endpoints_00108 +;source-doc/base-drv/./enumerate_storage.c:18: ep = &eps[ENDPOINT_INTERRUPT_IN]; + ld hl,0x0006 + add hl, de + ex de, hl + jr l_parse_endpoints_00107 +l_parse_endpoints_00106: +;source-doc/base-drv/./enumerate_storage.c:21: ep = (pEndpoint->bEndpointAddress & 0x80) ? &eps[ENDPOINT_BULK_IN] : &eps[ENDPOINT_BULK_OUT]; + or b + jr Z,l_parse_endpoints_00110 + inc de + inc de + inc de +l_parse_endpoints_00110: +l_parse_endpoints_00107: +;source-doc/base-drv/./enumerate_storage.c:24: ep->number = pEndpoint->bEndpointAddress & 0x07; + ld l, e + ld h, d + ld a, c + and 0x07 + rlca + and 0x0e + ld c, a + ld a, (hl) + and 0xf1 + or c + ld (hl), a +;source-doc/base-drv/./enumerate_storage.c:25: ep->toggle = 0; + ld l, e + ld h, d + res 0, (hl) +;source-doc/base-drv/./enumerate_storage.c:26: ep->max_packet_sizex = x; + inc de + ld a,(ix-1) + ld b,0x00 + ld (de), a + inc de + ld a, b + and 0x03 + ld l,a + ld a, (de) + and 0xfc + or l + ld (de), a +l_parse_endpoints_00108: +;source-doc/base-drv/./enumerate_storage.c:27: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376-native/base-drv/print.c.s b/Source/HBIOS/ch376-native/base-drv/print.c.s new file mode 100644 index 00000000..2bfe74db --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/print.c.s @@ -0,0 +1,87 @@ +; +; Generated from source-doc/base-drv/./print.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./print.c:3: void print_device_mounted(const char *const description, const uint8_t count) { +; --------------------------------- +; Function print_device_mounted +; --------------------------------- +_print_device_mounted: +;source-doc/base-drv/./print.c:4: print_string("\r\n $"); + ld hl,print_str_0 + call _print_string +;source-doc/base-drv/./print.c:5: print_uint16(count); + ld iy,4 + add iy, sp + ld l,(iy+0) + ld h,0x00 + call _print_uint16 +;source-doc/base-drv/./print.c:6: print_string(description); + ld hl,2 + add hl, sp + ld a, (hl) + inc hl + ld h, (hl) + ld l, a + call _print_string +;source-doc/base-drv/./print.c:7: if (count > 1) + ld a,0x01 + ld iy,4 + add iy, sp + sub (iy+0) + ret NC +;source-doc/base-drv/./print.c:8: print_string("S$"); + ld hl,print_str_1 +;source-doc/base-drv/./print.c:9: } + jp _print_string +print_str_0: + DEFB 0x0d + DEFB 0x0a + DEFM " $" + DEFB 0x00 +print_str_1: + DEFM "S$" + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s new file mode 100644 index 00000000..6d9e0b73 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -0,0 +1,478 @@ +; +; Generated from source-doc/base-drv/./protocol.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./protocol.c:28: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { +; --------------------------------- +; Function usbtrn_get_descriptor +; --------------------------------- +_usbtrn_get_descriptor: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./protocol.c:31: cmd = cmd_get_device_descriptor; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x0008 + ld hl,_cmd_get_device_descriptor + ldir +;source-doc/base-drv/./protocol.c:32: cmd.wLength = 8; + ld (ix-2),0x08 + xor a + ld (ix-1),a +;source-doc/base-drv/./protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + push bc + ld a,0x08 + push af + inc sp + xor a + push af + inc sp + push de + ld hl,6 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + pop bc +;source-doc/base-drv/./protocol.c:36: CHECK(result); + ld a, l + or a + jr NZ,l_usbtrn_get_descriptor_00103 +;source-doc/base-drv/./protocol.c:38: cmd = cmd_get_device_descriptor; + ld hl,0 + add hl, sp + ex de, hl + push bc + ld bc,0x0008 + ld hl,_cmd_get_device_descriptor + ldir + pop bc +;source-doc/base-drv/./protocol.c:39: cmd.wLength = 18; + ld (ix-2),0x12 + xor a + ld (ix-1),a +;source-doc/base-drv/./protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); + ld e,(ix+4) + ld d,(ix+5) + ld hl,7 + add hl, de + ld a, (hl) + push af + inc sp + xor a + push af + inc sp + push bc + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af +;source-doc/base-drv/./protocol.c:42: RETURN_CHECK(result); +l_usbtrn_get_descriptor_00103: +;source-doc/base-drv/./protocol.c:43: } + ld sp, ix + pop ix + ret +_cmd_get_device_descriptor: + DEFB +0x80 + DEFB +0x06 + DEFB +0x00 + DEFB +0x01 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0008 +;source-doc/base-drv/./protocol.c:51: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { +; --------------------------------- +; Function usbtrn_get_descriptor2 +; --------------------------------- +_usbtrn_get_descriptor2: + push ix + ld ix,0 + add ix,sp + ld hl, -10 + add hl, sp + ld sp, hl +;source-doc/base-drv/./protocol.c:54: cmd = cmd_get_device_descriptor; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x0008 + ld hl,_cmd_get_device_descriptor + ldir + pop bc +;source-doc/base-drv/./protocol.c:55: cmd.wLength = 8; + ld (ix-4),0x08 + xor a + ld (ix-3),a +;source-doc/base-drv/./protocol.c:57: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); + ld a,(ix+4) + ld (ix-2),a + ld l, a + ld a,(ix+5) + ld (ix-1),a + ld h,a + ld e, c + ld d, b + push bc + ld b,0x08 + ld c,(ix+6) + push bc + push hl + push de + call _usb_control_transfer + pop af + pop af + pop af + ld a, l + pop bc + ld l, a +;source-doc/base-drv/./protocol.c:59: CHECK(result); + or a + jr NZ,l_usbtrn_get_descriptor2_00103 +;source-doc/base-drv/./protocol.c:61: cmd = cmd_get_device_descriptor; + ld e, c + ld d, b + push bc + ld bc,0x0008 + ld hl,_cmd_get_device_descriptor + ldir + pop bc +;source-doc/base-drv/./protocol.c:62: cmd.wLength = 18; + ld (ix-4),0x12 + xor a + ld (ix-3),a +;source-doc/base-drv/./protocol.c:63: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); + ld e,(ix+4) + ld d,(ix+5) + ld hl,7 + add hl, de + ld a, (hl) + ld e,(ix-2) + ld d,(ix-1) + push af + inc sp + ld a,(ix+6) + push af + inc sp + push de + push bc + call _usb_control_transfer + pop af + pop af + pop af +l_usbtrn_get_descriptor2_00103: +;source-doc/base-drv/./protocol.c:64: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./protocol.c:74: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { +; --------------------------------- +; Function usbtrn_set_address +; --------------------------------- +_usbtrn_set_address: + push ix + ld ix,0 + add ix,sp + ld iy, -8 + add iy, sp + ld sp, iy + ld c, l +;source-doc/base-drv/./protocol.c:76: cmd = cmd_set_device_address; + ld hl,0 + add hl, sp + ex de, hl + push bc + ld bc,0x0008 + ld hl,_cmd_set_device_address + ldir + pop bc +;source-doc/base-drv/./protocol.c:77: cmd.bValue[0] = device_address; + ld (ix-6),c +;source-doc/base-drv/./protocol.c:79: return usb_control_transfer(&cmd, 0, 0, 0); + xor a + push af + inc sp + xor a + push af + inc sp + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer +;source-doc/base-drv/./protocol.c:80: } + ld sp,ix + pop ix + ret +_cmd_set_device_address: + DEFB +0x00 + DEFB +0x05 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0000 +;source-doc/base-drv/./protocol.c:90: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { +; --------------------------------- +; Function usbtrn_set_configuration +; --------------------------------- +_usbtrn_set_configuration: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./protocol.c:92: cmd = cmd_set_configuration; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x0008 + ld hl,_cmd_set_configuration + ldir + pop bc +;source-doc/base-drv/./protocol.c:93: cmd.bValue[0] = configuration; + ld a,(ix+6) + ld (ix-6),a +;source-doc/base-drv/./protocol.c:95: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); + ld h,(ix+5) + ld l,(ix+4) + push hl + ld hl,0x0000 + push hl + push bc + call _usb_control_transfer +;source-doc/base-drv/./protocol.c:96: } + ld sp,ix + pop ix + ret +_cmd_set_configuration: + DEFB +0x00 + DEFB +0x09 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0000 +;source-doc/base-drv/./protocol.c:110: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, +; --------------------------------- +; Function usbtrn_get_config_descriptor +; --------------------------------- +_usbtrn_get_config_descriptor: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./protocol.c:116: cmd = cmd_get_config_descriptor; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x0008 + ld hl,_cmd_get_config_descriptor + ldir + pop bc +;source-doc/base-drv/./protocol.c:117: cmd.bValue[0] = config_index; + ld a,(ix+6) + ld (ix-6),a +;source-doc/base-drv/./protocol.c:118: cmd.wLength = (uint16_t)buffer_size; + ld e,(ix+7) + ld (ix-2),e + ld (ix-1),0x00 +;source-doc/base-drv/./protocol.c:120: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size)); + ld e,(ix+4) + ld d,(ix+5) + ld h,(ix+9) + ld l,(ix+8) + push hl + push de + push bc + call _usb_control_transfer +;source-doc/base-drv/./protocol.c:121: } + ld sp,ix + pop ix + ret +_cmd_get_config_descriptor: + DEFB +0x80 + DEFB +0x06 + DEFB +0x00 + DEFB +0x02 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0000 +;source-doc/base-drv/./protocol.c:123: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, +; --------------------------------- +; Function usbtrn_gfull_cfg_desc +; --------------------------------- +_usbtrn_gfull_cfg_desc: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./protocol.c:131: max_packet_size)); + ld c,(ix+8) + ld b,(ix+9) + push bc + ld a,(ix+6) + push af + inc sp + ld d,(ix+5) + ld e,0x09 + push de + ld a,(ix+4) + push af + inc sp + push bc + call _usbtrn_get_config_descriptor + pop af + pop af + pop af + pop bc + ld a, l + or a + jr NZ,l_usbtrn_gfull_cfg_desc_00107 +;source-doc/base-drv/./protocol.c:133: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; + ld l, c + ld h, b + inc hl + inc hl + ld d, (hl) +;source-doc/base-drv/./protocol.c:134: if (max_length > max_buffer_size) + ld a,(ix+7) + sub d + jr NC,l_usbtrn_gfull_cfg_desc_00104 +;source-doc/base-drv/./protocol.c:135: max_length = max_buffer_size; + ld d,(ix+7) +l_usbtrn_gfull_cfg_desc_00104: +;source-doc/base-drv/./protocol.c:137: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); + ld h,(ix+6) + ld l,(ix+5) + push hl + ld e,(ix+4) + push de + push bc + call _usbtrn_get_config_descriptor + pop af + pop af + pop af + ld a, l +;source-doc/base-drv/./protocol.c:139: return USB_ERR_OK; + or a + jr NZ,l_usbtrn_gfull_cfg_desc_00107 + ld l,a +l_usbtrn_gfull_cfg_desc_00107: +;source-doc/base-drv/./protocol.c:140: } + pop ix + ret +;source-doc/base-drv/./protocol.c:144: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { +; --------------------------------- +; Function usbtrn_clear_endpoint_halt +; --------------------------------- +_usbtrn_clear_endpoint_halt: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/base-drv/./protocol.c:146: cmd = usb_cmd_clear_endpoint_halt; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x0008 + ld hl,_usb_cmd_clear_endpoint_halt + ldir + pop bc +;source-doc/base-drv/./protocol.c:147: cmd.bIndex[0] = endpoint_number; + ld a,(ix+4) + ld (ix-4),a +;source-doc/base-drv/./protocol.c:149: usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); + ld h,(ix+6) + ld l,(ix+5) + push hl + ld hl,0x0000 + push hl + push bc + call _usb_control_transfer +;source-doc/base-drv/./protocol.c:151: RETURN_CHECK(result); +;source-doc/base-drv/./protocol.c:152: } + ld sp,ix + pop ix + ret +_usb_cmd_clear_endpoint_halt: + DEFB +0x02 + DEFB +0x01 + DEFB +0x00 + DEFB +0x00 + DEFB +0xff + DEFB +0x00 + DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s new file mode 100644 index 00000000..fc056368 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -0,0 +1,506 @@ +; +; Generated from source-doc/base-drv/./transfers.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./transfers.c:21: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, +; --------------------------------- +; Function usb_ctrl_trnsfer_ext +; --------------------------------- +_usb_ctrl_trnsfer_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:25: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+5) + sub 0x80 + jr NC,l_usb_ctrl_trnsfer_ext_00102 +;source-doc/base-drv/./transfers.c:26: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_ctrl_trnsfer_ext_00106 +l_usb_ctrl_trnsfer_ext_00102: +;source-doc/base-drv/./transfers.c:28: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+7) + or (ix+6) + jr Z,l_usb_ctrl_trnsfer_ext_00104 + ld a,(ix+7) + sub 0x80 + jr NC,l_usb_ctrl_trnsfer_ext_00104 +;source-doc/base-drv/./transfers.c:29: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_ctrl_trnsfer_ext_00106 +l_usb_ctrl_trnsfer_ext_00104: +;source-doc/base-drv/./transfers.c:31: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); + ld h,(ix+9) + ld l,(ix+8) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_control_transfer + pop af + pop af + pop af +l_usb_ctrl_trnsfer_ext_00106: +;source-doc/base-drv/./transfers.c:32: } + pop ix + ret +;source-doc/base-drv/./transfers.c:44: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +; --------------------------------- +; Function usb_control_transfer +; --------------------------------- +_usb_control_transfer: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/base-drv/./transfers.c:49: endpoint_param endpoint = {1, 0, max_packet_size}; + ld hl,0 + add hl, sp + set 0, (hl) + ld hl,0 + add hl, sp + ld a, (hl) + and 0xf1 + ld (hl), a + ld c,(ix+9) + ld b,0x00 + ld hl,1 + add hl, sp + ld (hl), c + inc hl + ld a, b + and 0x03 + ld e,a + ld a, (hl) + and 0xfc + or e + ld (hl), a +;source-doc/base-drv/./transfers.c:51: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); + ld c,(ix+4) + ld b,(ix+5) + ld a, (bc) + and 0x80 +;source-doc/base-drv/./transfers.c:53: if (transferIn && buffer == 0) + ld (ix-1),a + or a + jr Z,l_usb_control_transfer_00102 + ld a,(ix+7) + or (ix+6) + jr NZ,l_usb_control_transfer_00102 +;source-doc/base-drv/./transfers.c:54: return USB_ERR_OTHER; + ld l,0x0f + jp l_usb_control_transfer_00113 +l_usb_control_transfer_00102: +;source-doc/base-drv/./transfers.c:56: ch_set_usb_address(device_address); + push bc + ld l,(ix+8) + call _ch_set_usb_address + pop bc +;source-doc/base-drv/./transfers.c:58: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); + ld e,(ix+4) + ld d,(ix+5) + push bc + ld a,0x08 + push af + inc sp + push de + call _ch_write_data + pop af + inc sp + call _ch_issue_token_setup + call _ch_short_wait_int_and_get_stat + pop bc + ld a, l + or a + jr NZ,l_usb_control_transfer_00113 +;source-doc/base-drv/./transfers.c:62: const uint16_t length = cmd_packet->wLength; + ld hl,6 + add hl, bc + ld c, (hl) + inc hl +;source-doc/base-drv/./transfers.c:65: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) + ld a,(hl) + ld b,a + or c + jr Z,l_usb_control_transfer_00115 + ld e,(ix+6) + ld d,(ix+7) + ld a,(ix-1) + or a + jr Z,l_usb_control_transfer_00117 + ld hl,0 + add hl, sp + push hl + push bc + push de + call _ch_data_in_transfer + pop af + pop af + pop af + jr l_usb_control_transfer_00118 +l_usb_control_transfer_00117: + ld hl,0 + add hl, sp + push hl + push bc + push de + call _ch_data_out_transfer + pop af + pop af + pop af +l_usb_control_transfer_00118: + jr l_usb_control_transfer_00116 +l_usb_control_transfer_00115: +;source-doc/base-drv/./transfers.c:66: : USB_ERR_OK; + ld hl,0x0000 +l_usb_control_transfer_00116: +;source-doc/base-drv/./transfers.c:68: CHECK(result) + ld a, l + or a + jr NZ,l_usb_control_transfer_00113 +;source-doc/base-drv/./transfers.c:70: if (transferIn) { + ld a,(ix-1) + or a + jr Z,l_usb_control_transfer_00112 +;source-doc/base-drv/./transfers.c:71: ch_command(CH_CMD_WR_HOST_DATA); + ld l,0x2c + call _ch_command +;source-doc/base-drv/./transfers.c:72: CH376_DATA_PORT = 0; + ld a,0x00 + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./transfers.c:73: delay(); + call _delay +;source-doc/base-drv/./transfers.c:74: ch_issue_token_out_ep0(); + call _ch_issue_token_out_ep0 +;source-doc/base-drv/./transfers.c:75: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ + call _ch_long_wait_int_and_get_statu + ld a, l +;source-doc/base-drv/./transfers.c:77: if (result == USB_ERR_OK || result == USB_ERR_STALL) + or a + jr Z,l_usb_control_transfer_00108 + cp 0x02 + jr NZ,l_usb_control_transfer_00109 +l_usb_control_transfer_00108: +;source-doc/base-drv/./transfers.c:78: return USB_ERR_OK; + ld l,0x00 + jr l_usb_control_transfer_00113 +l_usb_control_transfer_00109: +;source-doc/base-drv/./transfers.c:80: RETURN_CHECK(result); + ld l, a + jr l_usb_control_transfer_00113 +l_usb_control_transfer_00112: +;source-doc/base-drv/./transfers.c:83: ch_issue_token_in_ep0(); + call _ch_issue_token_in_ep0 +;source-doc/base-drv/./transfers.c:84: result = ch_long_wait_int_and_get_status(); + call _ch_long_wait_int_and_get_statu +;source-doc/base-drv/./transfers.c:86: RETURN_CHECK(result); +l_usb_control_transfer_00113: +;source-doc/base-drv/./transfers.c:87: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/./transfers.c:90: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_dat_in_trnsfer_ext +; --------------------------------- +_usb_dat_in_trnsfer_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:91: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+5) + or (ix+4) + jr Z,l_usb_dat_in_trnsfer_ext_00102 + ld a,(ix+5) + sub 0x80 + jr NC,l_usb_dat_in_trnsfer_ext_00102 +;source-doc/base-drv/./transfers.c:92: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trnsfer_ext_00106 +l_usb_dat_in_trnsfer_ext_00102: +;source-doc/base-drv/./transfers.c:94: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+10) + sub 0x80 + jr NC,l_usb_dat_in_trnsfer_ext_00105 +;source-doc/base-drv/./transfers.c:95: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trnsfer_ext_00106 +l_usb_dat_in_trnsfer_ext_00105: +;source-doc/base-drv/./transfers.c:97: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld a,(ix+8) + push af + inc sp + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp +l_usb_dat_in_trnsfer_ext_00106: +;source-doc/base-drv/./transfers.c:98: } + pop ix + ret +;source-doc/base-drv/./transfers.c:101: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_dat_in_trns_n_ext +; --------------------------------- +_usb_dat_in_trns_n_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:102: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) + ld a,(ix+5) + or (ix+4) + jr Z,l_usb_dat_in_trns_n_ext_00102 + ld a,(ix+5) + and 0xc0 + jr NZ,l_usb_dat_in_trns_n_ext_00102 +;source-doc/base-drv/./transfers.c:103: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trns_n_ext_00108 +l_usb_dat_in_trns_n_ext_00102: +;source-doc/base-drv/./transfers.c:105: if (((uint16_t)endpoint & 0xC000) == 0) + ld a,(ix+10) + and 0xc0 + jr NZ,l_usb_dat_in_trns_n_ext_00105 +;source-doc/base-drv/./transfers.c:106: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trns_n_ext_00108 +l_usb_dat_in_trns_n_ext_00105: +;source-doc/base-drv/./transfers.c:108: if (((uint16_t)buffer_size & 0xC000) == 0) + ld a,(ix+7) + and 0xc0 + jr NZ,l_usb_dat_in_trns_n_ext_00107 +;source-doc/base-drv/./transfers.c:109: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trns_n_ext_00108 +l_usb_dat_in_trns_n_ext_00107: +;source-doc/base-drv/./transfers.c:111: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); + ld c,(ix+6) + ld b,(ix+7) + ld l,(ix+9) + ld h,(ix+10) + push hl + ld a,(ix+8) + push af + inc sp + push bc + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_data_in_transfer_n + pop af + pop af + pop af + inc sp +l_usb_dat_in_trns_n_ext_00108: +;source-doc/base-drv/./transfers.c:112: } + pop ix + ret +;source-doc/base-drv/./transfers.c:124: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_data_in_transfer +; --------------------------------- +_usb_data_in_transfer: +;source-doc/base-drv/./transfers.c:125: ch_set_usb_address(device_address); + ld iy,6 + add iy, sp + ld l,(iy+0) + call _ch_set_usb_address +;source-doc/base-drv/./transfers.c:127: return ch_data_in_transfer(buffer, buffer_size, endpoint); + ld iy,7 + add iy, sp + ld l,(iy+0) + ld h,(iy+1) + push hl + dec iy + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + call _ch_data_in_transfer + pop af + pop af + pop af +;source-doc/base-drv/./transfers.c:128: } + ret +;source-doc/base-drv/./transfers.c:140: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_data_in_transfer_n +; --------------------------------- +_usb_data_in_transfer_n: +;source-doc/base-drv/./transfers.c:141: ch_set_usb_address(device_address); + ld iy,6 + add iy, sp + ld l,(iy+0) + call _ch_set_usb_address +;source-doc/base-drv/./transfers.c:143: return ch_data_in_transfer_n(buffer, buffer_size, endpoint); + ld iy,7 + add iy, sp + ld l,(iy+0) + ld h,(iy+1) + push hl + dec iy + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + call _ch_data_in_transfer_n + pop af + pop af + pop af +;source-doc/base-drv/./transfers.c:144: } + ret +;source-doc/base-drv/./transfers.c:147: usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_dat_out_trns_ext +; --------------------------------- +_usb_dat_out_trns_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:149: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+5) + or (ix+4) + jr Z,l_usb_dat_out_trns_ext_00102 + ld a,(ix+5) + sub 0x80 + jr NC,l_usb_dat_out_trns_ext_00102 +;source-doc/base-drv/./transfers.c:150: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_out_trns_ext_00106 +l_usb_dat_out_trns_ext_00102: +;source-doc/base-drv/./transfers.c:152: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+10) + sub 0x80 + jr NC,l_usb_dat_out_trns_ext_00105 +;source-doc/base-drv/./transfers.c:153: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_out_trns_ext_00106 +l_usb_dat_out_trns_ext_00105: +;source-doc/base-drv/./transfers.c:155: return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld a,(ix+8) + push af + inc sp + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_data_out_transfer + pop af + pop af + pop af + inc sp +l_usb_dat_out_trns_ext_00106: +;source-doc/base-drv/./transfers.c:156: } + pop ix + ret +;source-doc/base-drv/./transfers.c:168: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_data_out_transfer +; --------------------------------- +_usb_data_out_transfer: +;source-doc/base-drv/./transfers.c:169: ch_set_usb_address(device_address); + ld iy,6 + add iy, sp + ld l,(iy+0) + call _ch_set_usb_address +;source-doc/base-drv/./transfers.c:171: return ch_data_out_transfer(buffer, buffer_size, endpoint); + ld iy,7 + add iy, sp + ld l,(iy+0) + ld h,(iy+1) + push hl + dec iy + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + dec iy + dec iy + ld l,(iy+0) + ld h,(iy+1) + push hl + call _ch_data_out_transfer + pop af + pop af + pop af +;source-doc/base-drv/./transfers.c:172: } + ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s new file mode 100644 index 00000000..46c575d9 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -0,0 +1,86 @@ +; +; Generated from source-doc/base-drv/./usb-base-drv.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_storage_count: + DEFS 1 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./usb-base-drv.c:6: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +; --------------------------------- +; Function chnative_seek +; --------------------------------- +_chnative_seek: + push ix + ld ix,0 + add ix,sp + ld c, l + ld b, h +;source-doc/base-drv/./usb-base-drv.c:7: storage_device->current_lba = lba; + ld h,(ix+5) + ld a,(ix+4) + add a,0x0c + ld l, a + jr NC,l_chnative_seek_00103 + inc h +l_chnative_seek_00103: + ld (hl), e + inc hl + ld (hl), d + inc hl + ld (hl), c + inc hl + ld (hl), b +;source-doc/base-drv/./usb-base-drv.c:8: return 0; + xor a +;source-doc/base-drv/./usb-base-drv.c:9: } + pop ix + pop hl + pop bc + jp (hl) +_storage_count: + DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s new file mode 100644 index 00000000..a376087d --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -0,0 +1,179 @@ +; +; Generated from source-doc/base-drv/./usb-init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./usb-init.c:8: static usb_error usb_host_bus_reset(void) { +; --------------------------------- +; Function usb_host_bus_reset +; --------------------------------- +_usb_host_bus_reset: +;source-doc/base-drv/./usb-init.c:9: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/./usb-init.c:10: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/./usb-init.c:12: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + ld l,0x07 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/./usb-init.c:13: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/./usb-init.c:15: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/./usb-init.c:16: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/./ch376.h:160: ch_command(CH_CMD_WRITE_VAR8); + ld l,0x0b + call _ch_command +;source-doc/base-drv/./ch376.h:161: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./ch376.h:162: delay(); + call _delay +;source-doc/base-drv/./ch376.h:163: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); + ld a,0xc0 + or 0x1f + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/./ch376.h:164: delay(); + call _delay +;source-doc/base-drv/./usb-init.c:20: return USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/./usb-init.c:21: } + ret +;source-doc/base-drv/./usb-init.c:25: void chnative_init(void) { +; --------------------------------- +; Function chnative_init +; --------------------------------- +_chnative_init: +;source-doc/base-drv/./usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld hl,_x + push hl + ld hl,0x0000 + push hl + ld l,0x69 + push hl + call _memset_callee +;source-doc/base-drv/./usb-init.c:28: ch_cmd_reset_all(); + call _ch_cmd_reset_all +;source-doc/base-drv/./usb-init.c:30: delay_medium(); + call _delay_medium +;source-doc/base-drv/./usb-init.c:32: if (!ch_probe()) { + call _ch_probe + ld a, l + or a + jr NZ,l_chnative_init_00102 +;source-doc/base-drv/./usb-init.c:33: print_string("\r\nCH376: NOT PRESENT$"); +;source-doc/base-drv/./usb-init.c:34: return; + ld hl,usb_init_str_0 + jp _print_string +l_chnative_init_00102: +;source-doc/base-drv/./usb-init.c:37: print_string("\r\nCH376: PRESENT (VER $"); + ld hl,usb_init_str_1 + call _print_string +;source-doc/base-drv/./usb-init.c:38: print_hex(ch_cmd_get_ic_version()); + call _ch_cmd_get_ic_version + call _print_hex +;source-doc/base-drv/./usb-init.c:39: print_string("); $"); + ld hl,usb_init_str_2 + call _print_string +;source-doc/base-drv/./usb-init.c:41: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/./usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { + ld c,0x00 +l_chnative_init_00107: + ld a, c + sub 0x04 + jr NC,l_chnative_init_00105 +;source-doc/base-drv/./usb-init.c:44: const uint8_t r = ch_very_short_wait_int_and_get_(); + push bc + call _ch_very_short_wait_int_and_get + ld a, l + pop bc +;source-doc/base-drv/./usb-init.c:46: if (r == USB_INT_CONNECT) { + sub 0x81 + jr NZ,l_chnative_init_00108 +;source-doc/base-drv/./usb-init.c:47: print_string("USB: CONNECTED$"); + ld hl,usb_init_str_3 + call _print_string +;source-doc/base-drv/./usb-init.c:49: enumerate_all_devices(); + jp _enumerate_all_devices +;source-doc/base-drv/./usb-init.c:51: return; + jr l_chnative_init_00109 +l_chnative_init_00108: +;source-doc/base-drv/./usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { + inc c + jr l_chnative_init_00107 +l_chnative_init_00105: +;source-doc/base-drv/./usb-init.c:55: print_string("USB: DISCONNECTED$"); + ld hl,usb_init_str_4 + jp _print_string +l_chnative_init_00109: +;source-doc/base-drv/./usb-init.c:56: } + ret +usb_init_str_0: + DEFB 0x0d + DEFB 0x0a + DEFM "CH376: NOT PRESENT$" + DEFB 0x00 +usb_init_str_1: + DEFB 0x0d + DEFB 0x0a + DEFM "CH376: PRESENT (VER $" + DEFB 0x00 +usb_init_str_2: + DEFM "); $" + DEFB 0x00 +usb_init_str_3: + DEFM "USB: CONNECTED$" + DEFB 0x00 +usb_init_str_4: + DEFM "USB: DISCONNECTED$" + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s new file mode 100644 index 00000000..363e00b9 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -0,0 +1,274 @@ +; +; Generated from source-doc/base-drv/./usb_state.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) { +; --------------------------------- +; Function find_device_config +; --------------------------------- +_find_device_config: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./usb_state.c:14: _usb_state *const p = get_usb_work_area(); +;source-doc/base-drv/./usb_state.c:16: const device_config *p_config = first_device_config(p); + ld hl,_x + call _first_device_config +;source-doc/base-drv/./usb_state.c:17: while (p_config) { +l_find_device_config_00103: + ld a, d + or e + jr Z,l_find_device_config_00105 +;source-doc/base-drv/./usb_state.c:18: const uint8_t type = p_config->type; + ld l, e + ld h, d + ld a, (hl) + and 0x0f + ld c, a +;source-doc/base-drv/./usb_state.c:20: if (type == requested_type) + ld a,(ix+4) + sub c + jr NZ,l_find_device_config_00102 +;source-doc/base-drv/./usb_state.c:21: return (device_config *)p_config; + ex de, hl + jr l_find_device_config_00106 +l_find_device_config_00102: +;source-doc/base-drv/./usb_state.c:23: p_config = next_device_config(p, p_config); + ld hl,_x + call _next_device_config + jr l_find_device_config_00103 +l_find_device_config_00105: +;source-doc/base-drv/./usb_state.c:26: return NULL; + ld hl,0x0000 +l_find_device_config_00106: +;source-doc/base-drv/./usb_state.c:27: } + pop ix + ret +_device_config_sizes: + DEFB +0x00 + DEFB +0x11 + DEFB +0x11 + DEFB +0x0c + DEFB +0x06 + DEFB 0x00 + DEFB 0x00 +;source-doc/base-drv/./usb_state.c:30: device_config *find_first_free(void) { +; --------------------------------- +; Function find_first_free +; --------------------------------- +_find_first_free: +;source-doc/base-drv/./usb_state.c:31: _usb_state *const boot_state = get_usb_work_area(); +;source-doc/base-drv/./usb_state.c:34: device_config *p = first_device_config(boot_state); + ld hl,_x + call _first_device_config +;source-doc/base-drv/./usb_state.c:35: while (p) { +l_find_first_free_00103: + ld a, d + or e + jr Z,l_find_first_free_00105 +;source-doc/base-drv/./usb_state.c:36: if (p->type == 0) + ld l, e + ld h, d + ld a, (hl) + and 0x0f + jr NZ,l_find_first_free_00102 +;source-doc/base-drv/./usb_state.c:37: return p; + ex de, hl + jr l_find_first_free_00106 +l_find_first_free_00102: +;source-doc/base-drv/./usb_state.c:39: p = next_device_config(boot_state, p); + ld hl,_x + call _next_device_config + jr l_find_first_free_00103 +l_find_first_free_00105: +;source-doc/base-drv/./usb_state.c:42: return NULL; + ld hl,0x0000 +l_find_first_free_00106: +;source-doc/base-drv/./usb_state.c:43: } + ret +;source-doc/base-drv/./usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } +; --------------------------------- +; Function first_device_config +; --------------------------------- +_first_device_config: + ex de, hl + inc de + inc de + ret +;source-doc/base-drv/./usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { +; --------------------------------- +; Function next_device_config +; --------------------------------- +_next_device_config: + ld c, l + ld b, h +;source-doc/base-drv/./usb_state.c:48: if (p->type == 0) + ld l, e + ld h, d + ld a, (hl) + and 0x0f + jr NZ,l_next_device_config_00102 +;source-doc/base-drv/./usb_state.c:49: return NULL; + ld de,0x0000 + jr l_next_device_config_00105 +l_next_device_config_00102: +;source-doc/base-drv/./usb_state.c:51: const uint8_t size = device_config_sizes[p->type]; + ld l, e + ld h, d + ld a, (hl) + and 0x0f + add a, +((_device_config_sizes) & 0xFF) + ld l, a + ld a,0x00 + adc a, +((_device_config_sizes) / 256) + ld h, a + ld l, (hl) +;source-doc/base-drv/./usb_state.c:58: const uint8_t *_p = (uint8_t *)p; +;source-doc/base-drv/./usb_state.c:59: device_config *const result = (device_config *)(_p + size); + ld h,0x00 + add hl, de + ex de, hl +;source-doc/base-drv/./usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) + ld hl,0x0068 + add hl, bc + ld a, e + sub l + ld a, d + sbc a, h + ret C +;source-doc/base-drv/./usb_state.c:62: return NULL; + ld de,0x0000 +;source-doc/base-drv/./usb_state.c:64: return result; +l_next_device_config_00105: +;source-doc/base-drv/./usb_state.c:65: } + ret +;source-doc/base-drv/./usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +; --------------------------------- +; Function get_usb_device_config +; --------------------------------- +_get_usb_device_config: + push ix + ld ix,0 + add ix,sp + dec sp + ld (ix-1),a +;source-doc/base-drv/./usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/./usb_state.c:71: uint8_t counter = 1; + ld c,0x01 +;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc + ld hl,_x + call _first_device_config + pop bc + ld b,0x01 +l_get_usb_device_config_00112: + ld a, d + or e + jr Z,l_get_usb_device_config_00105 +;source-doc/base-drv/./usb_state.c:74: if (p->type == USB_IS_FLOPPY) { + ld l, e + ld h, d + ld a, (hl) + and 0x0f + dec a + jr NZ,l_get_usb_device_config_00113 +;source-doc/base-drv/./usb_state.c:75: if (counter == device_index) + ld a,(ix-1) + sub b +;source-doc/base-drv/./usb_state.c:76: return p; + jr Z,l_get_usb_device_config_00117 +;source-doc/base-drv/./usb_state.c:77: counter++; + inc b + ld c, b +l_get_usb_device_config_00113: +;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc + ld hl,_x + call _next_device_config + pop bc + jr l_get_usb_device_config_00112 +l_get_usb_device_config_00105: +;source-doc/base-drv/./usb_state.c:81: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc + ld hl,_x + call _first_device_config + pop bc +l_get_usb_device_config_00115: + ld a, d + or e + jr Z,l_get_usb_device_config_00110 +;source-doc/base-drv/./usb_state.c:82: if (p->type == USB_IS_MASS_STORAGE) { + ld l, e + ld h, d + ld a, (hl) + and 0x0f + sub 0x02 + jr NZ,l_get_usb_device_config_00116 +;source-doc/base-drv/./usb_state.c:83: if (counter == device_index) + ld a,(ix-1) + sub c +;source-doc/base-drv/./usb_state.c:84: return p; + jr Z,l_get_usb_device_config_00117 +;source-doc/base-drv/./usb_state.c:85: counter++; + inc c +l_get_usb_device_config_00116: +;source-doc/base-drv/./usb_state.c:81: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc + ld hl,_x + call _next_device_config + pop bc + jr l_get_usb_device_config_00115 +l_get_usb_device_config_00110: +;source-doc/base-drv/./usb_state.c:89: return NULL; // is not a usb device + ld de,0x0000 +l_get_usb_device_config_00117: +;source-doc/base-drv/./usb_state.c:90: } + inc sp + pop ix + ret diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s new file mode 100644 index 00000000..7e5fcc29 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -0,0 +1,158 @@ +; +; Generated from source-doc/base-drv/./work-area.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_x: + DEFS 105 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +_x: + DEFB 0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/cruntime.asm b/Source/HBIOS/ch376-native/cruntime.asm new file mode 100644 index 00000000..29e2060e --- /dev/null +++ b/Source/HBIOS/ch376-native/cruntime.asm @@ -0,0 +1,134 @@ + +_memset_callee: + pop af ; return address + pop bc ; address to be set + pop de ; value to be set + pop hl ; number of bytes to set + push af ; restore return address + + ld a, b + or c + ret z + + ld a, e + push hl + pop de + ret z + + ld (hl), a + inc de + dec bc + ld a, b + or c + ret Z + + push hl + ldir + pop hl + ret + +; _strlen_fastcall: + +; ; enter: hl = char *s +; ; +; ; exit : hl = length +; ; bc = -(length + 1) +; ; a = 0 +; ; z flag set if 0 length +; ; carry reset +; ; +; ; uses : af, bc, hl + +; xor a +; ld c,a +; ld b,a +; cpir +; ld hl,$ffff +; sbc hl,bc + +; ret + +_memcpy_callee: + + pop af + pop bc + pop hl + pop de + push af + + + ; enter : bc = size_t n + ; hl = void *s2 = src + ; de = void *s1 = dst + ; + ; exit : hl = void *s1 = dst + ; de = ptr in s1 to one byte past last byte copied + ; bc = 0 + ; carry reset + ; + ; uses : af, bc, de, hl + + ld a,b + or c + jr Z,zero_n + +asm0_memcpy: + push de + ldir + pop hl + or a + ret + +zero_n: + push de + pop hl + ret + +; _strcat_callee: + +; pop hl +; pop de +; ex (sp),hl + + +; ; enter : hl = char *s2 = src +; ; de = char *s1 = dst +; ; +; ; exit : hl = char *s1 = dst +; ; de = ptr in s1 to terminating 0 +; ; +; ; uses : af, bc, de, hl + +; push de ; save dst + +; ex de,hl +; call __str_locate_nul ; a = 0 +; ex de,hl + +; loop: ; append s2 to s1 +; cp (hl) +; ldi +; jr NZ,loop + +; ENDIF + +; pop hl ; hl = dst +; dec de +; ret + +; __str_locate_nul: +; ; enter : hl = char *s +; ; +; ; exit : hl = ptr in s to terminating 0 +; ; bc = -(strlen + 1) +; ; a = 0 +; ; carry reset +; ; +; ; uses : af, bc, hl + +; xor a +; ld c,a +; ld b,a +; cpir +; dec hl +; ret diff --git a/Source/HBIOS/ch376-native/print.asm b/Source/HBIOS/ch376-native/print.asm new file mode 100644 index 00000000..70acafe7 --- /dev/null +++ b/Source/HBIOS/ch376-native/print.asm @@ -0,0 +1,32 @@ + + ; HL = unsigned 16 bit number to write out + ; call CHPUT to write a single ascii character (in A) +_print_uint16: + ld e, 0 + ld bc, -10000 + call num1 + ld bc, -1000 + call num1 + ld bc, -100 + call num1 + ld c, -10 + call num1 + ld c, b + +num1: ld a, '0'-1 +num2: inc a + add hl, bc + jr c, num2 + sbc hl, bc + + cp '0' + jr nz, num3 + + ld a, e + cp 1 + ret nz + ld a, '0' + +num3: + ld e, 1 + jp COUT diff --git a/Source/HBIOS/ch376-native/root.md b/Source/HBIOS/ch376-native/root.md new file mode 100644 index 00000000..e69de29b diff --git a/Source/HBIOS/ch376-native/scsi-drv.s b/Source/HBIOS/ch376-native/scsi-drv.s new file mode 100644 index 00000000..65cee345 --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv.s @@ -0,0 +1,3 @@ +; Generated File -- not to be modify directly +#include "ch376-native/scsi-drv/scsi-init.c.s" +#include "ch376-native/scsi-drv/class_scsi.c.s" diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s new file mode 100644 index 00000000..119505b8 --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -0,0 +1,952 @@ +; +; Generated from source-doc/scsi-drv/./class_scsi.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_scsi_command_block_wrapper: + DEFS 15 +_next_tag: + DEFS 2 +_csw: + DEFS 13 +_scsi_read_capacity: + DEFS 12 +_scsi_packet_inquiry: + DEFS 12 +_scsi_packet_request_sense: + DEFS 12 +_cbw: + DEFS 27 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/scsi-drv/./class_scsi.c:11: usb_error do_scsi_cmd(device_config_storage *const dev, +; --------------------------------- +; Function do_scsi_cmd +; --------------------------------- +_do_scsi_cmd: + push ix + ld ix,0 + add ix,sp + ld hl, -6 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:16: cbw->dCBWTag[0] = next_tag++; + ld c,(ix+6) + ld b,(ix+7) + ld hl,0x0004 + add hl, bc + ex (sp), hl + ld de, (_next_tag) + ld hl, (_next_tag) + inc hl + ld (_next_tag), hl + pop hl + push hl + ld (hl), e + inc hl + ld (hl), d +;source-doc/scsi-drv/./class_scsi.c:18: if (!send) + bit 0,(ix+10) + jr NZ,l_do_scsi_cmd_00102 +;source-doc/scsi-drv/./class_scsi.c:19: cbw->bmCBWFlags = 0x80; + ld hl,0x000c + add hl, bc + ld (hl),0x80 +l_do_scsi_cmd_00102: +;source-doc/scsi-drv/./class_scsi.c:22: &dev->endpoints[ENDPOINT_BULK_OUT])); + ld e,(ix+4) + ld d,(ix+5) + ld hl,0x0003 + add hl, de + ld (ix-4),l + ld (ix-3),h + ld l, e + ld h, d + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld l,(ix+6) + ld h,(ix+7) + push bc + push de + push hl + ld l,(ix-4) + ld h,(ix-3) + ex (sp), hl + push af + inc sp + ld iy,0x001f + push iy + push hl + call _usb_data_out_transfer + pop af + pop af + pop af + inc sp + ld a, l + pop de + pop bc + ld (_result+0),a + or a + jr Z,l_do_scsi_cmd_00104 + ld l, a + jp l_do_scsi_cmd_00119 +l_do_scsi_cmd_00104: +;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) { + ld hl,8 + add hl, bc + ld c, (hl) + inc hl + ld b, (hl) + inc hl + inc hl + ld a, (hl) + dec hl + ld l, (hl) + or l + or b + or c + jr Z,l_do_scsi_cmd_00113 +;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); + ld (ix-2),c + ld (ix-1),b + ld c,(ix+8) + ld b,(ix+9) +;source-doc/scsi-drv/./class_scsi.c:25: if (!send) { + bit 0,(ix+10) + jr NZ,l_do_scsi_cmd_00110 +;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); + ld iy,0x0006 + add iy, de + ld l, e + ld h, d + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + push de + push iy + push af + inc sp + ld l,(ix-2) + ld h,(ix-1) + push hl + push bc + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp + ld a, l + pop de + ld (_result+0),a + or a + jr Z,l_do_scsi_cmd_00113 + ld l, a + jr l_do_scsi_cmd_00119 +l_do_scsi_cmd_00110: +;source-doc/scsi-drv/./class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_OUT])); + ld l, e + ld h, d + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + push de + ld l,(ix-4) + ld h,(ix-3) + push hl + push af + inc sp + ld l,(ix-2) + ld h,(ix-1) + push hl + push bc + call _usb_data_out_transfer + pop af + pop af + pop af + inc sp + ld a, l + pop de + ld (_result+0),a + or a + jr Z,l_do_scsi_cmd_00113 + ld l, a + jr l_do_scsi_cmd_00119 +l_do_scsi_cmd_00113: +;source-doc/scsi-drv/./class_scsi.c:36: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); + ld hl,0x0006 + add hl, de + ex de,hl + ld c,e + ld b,d + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld d, a + push bc + push de + inc sp + ld hl,0x000d + push hl + ld hl,_csw + push hl + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp + ld a, l + ld (_result+0),a + or a + jr Z,l_do_scsi_cmd_00115 + ld l, a + jr l_do_scsi_cmd_00119 +l_do_scsi_cmd_00115: +;source-doc/scsi-drv/./class_scsi.c:38: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) + ld a, (_csw + 12) + or a + jr Z,l_do_scsi_cmd_00117 + ld bc, (_csw + 4) + pop hl + ld e,(hl) + push hl + inc hl + ld h, (hl) + ld l, e + xor a + sbc hl,bc + jr Z,l_do_scsi_cmd_00117 +;source-doc/scsi-drv/./class_scsi.c:39: return USB_ERR_FAIL; + ld l,0x0e + jr l_do_scsi_cmd_00119 +l_do_scsi_cmd_00117: +;source-doc/scsi-drv/./class_scsi.c:41: return USB_ERR_OK; + ld l,0x00 +l_do_scsi_cmd_00119: +;source-doc/scsi-drv/./class_scsi.c:42: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:46: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +; --------------------------------- +; Function get_scsi_read_capacity +; --------------------------------- +_get_scsi_read_capacity: + push ix + ld ix,0 + add ix,sp + ld hl, -27 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:48: cbw_scsi.cbw = scsi_command_block_wrapper; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:49: cbw_scsi.read_capacity = scsi_read_capacity; + ld hl,15 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,_scsi_read_capacity + ldir +;source-doc/scsi-drv/./class_scsi.c:51: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-14),0x00 +;source-doc/scsi-drv/./class_scsi.c:52: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); + ld (ix-13),0x0c +;source-doc/scsi-drv/./class_scsi.c:53: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + ld (ix-19),0x08 + xor a + ld (ix-18),a + ld (ix-17),a + ld (ix-16),a +;source-doc/scsi-drv/./class_scsi.c:55: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); + ld c,(ix+6) + ld b,(ix+7) + xor a + push af + inc sp + push bc + ld hl,3 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _do_scsi_cmd +;source-doc/scsi-drv/./class_scsi.c:56: } + ld sp,ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:60: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { +; --------------------------------- +; Function scsi_inquiry +; --------------------------------- +_scsi_inquiry: + push ix + ld ix,0 + add ix,sp + ld hl, -27 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:62: cbw_scsi.cbw = scsi_command_block_wrapper; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:63: cbw_scsi.inquiry = scsi_packet_inquiry; + ld hl,15 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,_scsi_packet_inquiry + ldir +;source-doc/scsi-drv/./class_scsi.c:65: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-14),0x00 +;source-doc/scsi-drv/./class_scsi.c:66: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); + ld (ix-13),0x0c +;source-doc/scsi-drv/./class_scsi.c:67: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; + ld (ix-19),0x24 + xor a + ld (ix-18),a + ld (ix-17),a + ld (ix-16),a +;source-doc/scsi-drv/./class_scsi.c:69: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); + ld c,(ix+6) + ld b,(ix+7) + xor a + push af + inc sp + push bc + ld hl,3 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _do_scsi_cmd +;source-doc/scsi-drv/./class_scsi.c:70: } + ld sp,ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:72: usb_error scsi_test(device_config_storage *const dev) { +; --------------------------------- +; Function scsi_test +; --------------------------------- +_scsi_test: + push ix + ld ix,0 + add ix,sp + ld hl, -27 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:74: cbw_scsi.cbw = scsi_command_block_wrapper; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:75: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); + ld hl,15 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x0c + push hl + call _memset_callee +;source-doc/scsi-drv/./class_scsi.c:77: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-14),0x00 +;source-doc/scsi-drv/./class_scsi.c:78: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); + ld (ix-13),0x0c +;source-doc/scsi-drv/./class_scsi.c:79: cbw_scsi.cbw.dCBWDataTransferLength = 0; + ld hl,8 + add hl, sp + xor a + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a +;source-doc/scsi-drv/./class_scsi.c:81: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); + xor a + push af + inc sp + ld hl,0x0000 + push hl + ld hl,3 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _do_scsi_cmd +;source-doc/scsi-drv/./class_scsi.c:82: } + ld sp,ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:86: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +; --------------------------------- +; Function scsi_request_sense +; --------------------------------- +_scsi_request_sense: + push ix + ld ix,0 + add ix,sp + ld hl, -27 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:88: cbw_scsi.cbw = scsi_command_block_wrapper; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:89: cbw_scsi.request_sense = scsi_packet_request_sense; + ld hl,15 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,_scsi_packet_request_sense + ldir +;source-doc/scsi-drv/./class_scsi.c:91: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-14),0x00 +;source-doc/scsi-drv/./class_scsi.c:92: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); + ld (ix-13),0x0c +;source-doc/scsi-drv/./class_scsi.c:93: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); + ld (ix-19),0x12 + xor a + ld (ix-18),a + ld (ix-17),a + ld (ix-16),a +;source-doc/scsi-drv/./class_scsi.c:95: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); + ld c,(ix+6) + ld b,(ix+7) + xor a + push af + inc sp + push bc + ld hl,3 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _do_scsi_cmd +;source-doc/scsi-drv/./class_scsi.c:96: } + ld sp,ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:98: usb_error scsi_sense_init(device_config_storage *const dev) { +; --------------------------------- +; Function scsi_sense_init +; --------------------------------- +_scsi_sense_init: + ld hl, -18 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:102: while ((result = scsi_test(dev)) && --counter > 0) + ld c,0x03 +l_scsi_sense_init_00102: + push bc + ld hl,22 + add hl, sp + ld c, (hl) + inc hl + ld b, (hl) + push bc + call _scsi_test + pop af + ld a, l + pop bc + ld (_result+0), a + or a + jr Z,l_scsi_sense_init_00104 + dec c + jr Z,l_scsi_sense_init_00104 +;source-doc/scsi-drv/./class_scsi.c:103: scsi_request_sense(dev, &response); + push bc + ld hl,2 + add hl, sp + push hl + ld hl,24 + add hl, sp + ld c, (hl) + inc hl + ld b, (hl) + push bc + call _scsi_request_sense + pop af + pop af + pop bc + jr l_scsi_sense_init_00102 +l_scsi_sense_init_00104: +;source-doc/scsi-drv/./class_scsi.c:105: return result; + ld a, (_result+0) + ld l, a +;source-doc/scsi-drv/./class_scsi.c:106: } + ld iy,18 + add iy, sp + ld sp, iy + ret +;source-doc/scsi-drv/./class_scsi.c:110: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +; --------------------------------- +; Function scsi_read +; --------------------------------- +_scsi_read: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/./class_scsi.c:111: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + ld hl,_cbw + push hl + ld hl,0x0000 + push hl + ld l,0x1b + push hl + call _memset_callee +;source-doc/scsi-drv/./class_scsi.c:112: cbw.cbw = scsi_command_block_wrapper; + ld de,_cbw + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:114: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:115: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + ld hl,0x0c00 + ld ((_cbw + 13)),hl +;source-doc/scsi-drv/./class_scsi.c:116: cbw.cbw.dCBWDataTransferLength = 512; + ld hl,0x0200 + ld (_cbw + 8),hl + ld h, l + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/./class_scsi.c:118: cbw.scsi_cmd.operation_code = 0x28; // read operation + ld hl, +(_cbw + 15) + ld (hl),0x28 +;source-doc/scsi-drv/./class_scsi.c:119: cbw.scsi_cmd.transfer_len[1] = 1; + ld hl, +(_cbw + 23) + ld (hl),0x01 +;source-doc/scsi-drv/./class_scsi.c:120: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld c,(ix+4) + ld b,(ix+5) + ld hl,0x000c + add hl, bc + pop af + push hl + inc hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 17)),a +;source-doc/scsi-drv/./class_scsi.c:121: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + pop hl + push hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 18)),a +;source-doc/scsi-drv/./class_scsi.c:122: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + pop hl + push hl + inc hl + ld a,(hl) + ld ((_cbw + 19)),a +;source-doc/scsi-drv/./class_scsi.c:123: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld de,_cbw + 20 + pop hl + ld a,(hl) + push hl + ld (de), a +;source-doc/scsi-drv/./class_scsi.c:125: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + ld e,(ix+6) + ld d,(ix+7) + xor a + push af + inc sp + push de + ld hl,_cbw + push hl + push bc + call _do_scsi_cmd + pop af + pop af + pop af + inc sp + ld a, l +;source-doc/scsi-drv/./class_scsi.c:127: if (result == USB_ERR_OK) + ld (_result+0),a + or a + jr NZ,l_scsi_read_00102 +;source-doc/scsi-drv/./class_scsi.c:128: dev->current_lba++; + pop hl + ld c,(hl) + push hl + inc hl + ld b, (hl) + inc hl + ld e, (hl) + inc hl + ld d, (hl) + inc c + jr NZ,l_scsi_read_00110 + inc b + jr NZ,l_scsi_read_00110 + inc de +l_scsi_read_00110: + pop hl + push hl + ld (hl), c + inc hl + ld (hl), b + inc hl + ld (hl), e + inc hl + ld (hl), d +l_scsi_read_00102: +;source-doc/scsi-drv/./class_scsi.c:129: return result; + ld a, (_result+0) + ld l, a +;source-doc/scsi-drv/./class_scsi.c:130: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:132: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +; --------------------------------- +; Function scsi_write +; --------------------------------- +_scsi_write: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/./class_scsi.c:133: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + ld hl,_cbw + push hl + ld hl,0x0000 + push hl + ld l,0x1b + push hl + call _memset_callee +;source-doc/scsi-drv/./class_scsi.c:134: cbw.cbw = scsi_command_block_wrapper; + ld de,_cbw + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:136: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:137: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + ld hl,0x0c00 + ld ((_cbw + 13)),hl +;source-doc/scsi-drv/./class_scsi.c:138: cbw.cbw.dCBWDataTransferLength = 512; + ld hl,0x0200 + ld (_cbw + 8),hl + ld h, l + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/./class_scsi.c:140: cbw.scsi_cmd.operation_code = 0x2A; // write operation + ld hl, +(_cbw + 15) + ld (hl),0x2a +;source-doc/scsi-drv/./class_scsi.c:141: cbw.scsi_cmd.transfer_len[1] = 1; + ld hl, +(_cbw + 23) + ld (hl),0x01 +;source-doc/scsi-drv/./class_scsi.c:142: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld c,(ix+4) + ld b,(ix+5) + ld hl,0x000c + add hl, bc + pop af + push hl + inc hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 17)),a +;source-doc/scsi-drv/./class_scsi.c:143: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + pop hl + push hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 18)),a +;source-doc/scsi-drv/./class_scsi.c:144: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + pop hl + push hl + inc hl + ld a,(hl) + ld ((_cbw + 19)),a +;source-doc/scsi-drv/./class_scsi.c:145: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld de,_cbw + 20 + pop hl + ld a,(hl) + push hl + ld (de), a +;source-doc/scsi-drv/./class_scsi.c:147: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + ld e,(ix+6) + ld d,(ix+7) + ld a,0x01 + push af + inc sp + push de + ld hl,_cbw + push hl + push bc + call _do_scsi_cmd + pop af + pop af + pop af + inc sp + ld a, l +;source-doc/scsi-drv/./class_scsi.c:149: if (result == USB_ERR_OK) + ld (_result+0),a + or a + jr NZ,l_scsi_write_00102 +;source-doc/scsi-drv/./class_scsi.c:150: dev->current_lba++; + pop hl + ld c,(hl) + push hl + inc hl + ld b, (hl) + inc hl + ld e, (hl) + inc hl + ld d, (hl) + inc c + jr NZ,l_scsi_write_00110 + inc b + jr NZ,l_scsi_write_00110 + inc de +l_scsi_write_00110: + pop hl + push hl + ld (hl), c + inc hl + ld (hl), b + inc hl + ld (hl), e + inc hl + ld (hl), d +l_scsi_write_00102: +;source-doc/scsi-drv/./class_scsi.c:151: return result; + ld a, (_result+0) + ld l, a +;source-doc/scsi-drv/./class_scsi.c:152: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/./class_scsi.c:154: usb_error scsi_eject(device_config_storage *const dev) { +; --------------------------------- +; Function scsi_eject +; --------------------------------- +_scsi_eject: + push ix + ld ix,0 + add ix,sp + ld hl, -21 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/./class_scsi.c:156: cbw_scsi.cbw = scsi_command_block_wrapper; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/./class_scsi.c:158: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); + ld hl,15 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x06 + push hl + call _memset_callee +;source-doc/scsi-drv/./class_scsi.c:160: cbw_scsi.eject.operation_code = 0x1B; + ld (ix-6),0x1b +;source-doc/scsi-drv/./class_scsi.c:161: cbw_scsi.eject.loej = 1; + ld hl,19 + add hl, sp + set 1, (hl) +;source-doc/scsi-drv/./class_scsi.c:163: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-8),0x00 +;source-doc/scsi-drv/./class_scsi.c:164: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); + ld (ix-7),0x06 +;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw.dCBWDataTransferLength = 0; + ld hl,8 + add hl, sp + xor a + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a +;source-doc/scsi-drv/./class_scsi.c:167: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); + xor a + push af + inc sp + ld hl,0x0000 + push hl + ld hl,3 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _do_scsi_cmd +;source-doc/scsi-drv/./class_scsi.c:168: } + ld sp,ix + pop ix + ret +_scsi_command_block_wrapper: + DEFB +0x55 + DEFB +0x53 + DEFB +0x42 + DEFB +0x43 + DEFW +0x0000 + DEFW +0x0000 + DEFB +0x00,0x00, +0x00, +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_next_tag: + DEFW +0x0000 +_csw: + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 +_scsi_read_capacity: + DEFB +0x25 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_scsi_packet_inquiry: + DEFB +0x12 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x24 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_scsi_packet_request_sense: + DEFB +0x03 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x12 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_cbw: + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00,0x00, +0x00, +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/init.c.s b/Source/HBIOS/ch376-native/scsi-drv/init.c.s new file mode 100644 index 00000000..5a8f145d --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv/init.c.s @@ -0,0 +1,162 @@ +; +; Generated from source-doc/scsi-drv/./init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/scsi-drv/./init.c:13: uint8_t chscsi_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +; --------------------------------- +; Function chscsi_seek +; --------------------------------- +_chscsi_seek: + push ix + ld ix,0 + add ix,sp + ld c, l + ld b, h +;source-doc/scsi-drv/./init.c:14: storage_device->current_lba = lba; + ld a,(ix+4) + ld h,(ix+5) + add a,0x0c + ld l, a + jr NC,l_chscsi_seek_00103 + inc h +l_chscsi_seek_00103: + ld (hl), e + inc hl + ld (hl), d + inc hl + ld (hl), c + inc hl + ld (hl), b +;source-doc/scsi-drv/./init.c:15: return 0; + xor a +;source-doc/scsi-drv/./init.c:16: } + pop ix + pop hl + pop bc + jp (hl) +;source-doc/scsi-drv/./init.c:18: void chscsi_init(void) { +; --------------------------------- +; Function chscsi_init +; --------------------------------- +_chscsi_init: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/scsi-drv/./init.c:21: do { + ld c,0x00 + ld (ix-1),0x01 +l_chscsi_init_00105: +;source-doc/scsi-drv/./init.c:22: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + push bc + ld a,(ix-1) + call _get_usb_device_config + pop bc +;source-doc/scsi-drv/./init.c:24: if (storage_device == NULL) + ld a, d + or e + jr Z,l_chscsi_init_00107 +;source-doc/scsi-drv/./init.c:27: const usb_device_type t = storage_device->type; + ld l, e + ld h, d + ld a, (hl) + and 0x0f +;source-doc/scsi-drv/./init.c:29: if (t == USB_IS_MASS_STORAGE) { + sub 0x02 + jr NZ,l_chscsi_init_00106 +;source-doc/scsi-drv/./init.c:30: storage_device->drive_index = storage_count++; + ld hl,0x0010 + add hl, de + ld (hl), c + inc c +;source-doc/scsi-drv/./init.c:31: scsi_sense_init(storage_device); + push bc + push de + push de + call _scsi_sense_init + pop af + pop de + ld hl,_ch_scsi_fntbl + call _dio_add_entry + pop bc +l_chscsi_init_00106: +;source-doc/scsi-drv/./init.c:35: } while (++index != MAX_NUMBER_OF_STORAGE_DEVICES + 1); + inc (ix-1) + ld a,(ix-1) + sub 0x05 + jr NZ,l_chscsi_init_00105 +l_chscsi_init_00107: +;source-doc/scsi-drv/./init.c:37: if (storage_count == 0) + ld a, c + or a +;source-doc/scsi-drv/./init.c:38: return; + jr Z,l_chscsi_init_00110 +;source-doc/scsi-drv/./init.c:40: print_string(" $"); + push bc + ld hl,init_str_0 + call _print_string + pop bc +;source-doc/scsi-drv/./init.c:41: print_uint16(storage_count); + ld h,0x00 + ld l, c + call _print_uint16 +;source-doc/scsi-drv/./init.c:42: print_string(" STORAGE DEVICES$"); + ld hl,init_str_1 + call _print_string +l_chscsi_init_00110: +;source-doc/scsi-drv/./init.c:43: } + inc sp + pop ix + ret +init_str_0: + DEFM " $" + DEFB 0x00 +init_str_1: + DEFM " STORAGE DEVICES$" + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s new file mode 100644 index 00000000..673285b5 --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -0,0 +1,125 @@ +; +; Generated from source-doc/scsi-drv/./scsi-init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/scsi-drv/./scsi-init.c:13: void chscsi_init(void) { +; --------------------------------- +; Function chscsi_init +; --------------------------------- +_chscsi_init: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/./scsi-init.c:15: do { + ld (ix-1),0x01 +l_chscsi_init_00105: +;source-doc/scsi-drv/./scsi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + ld a,(ix-1) + call _get_usb_device_config +;source-doc/scsi-drv/./scsi-init.c:18: if (storage_device == NULL) + ld a, d + or e + jr Z,l_chscsi_init_00107 +;source-doc/scsi-drv/./scsi-init.c:21: const usb_device_type t = storage_device->type; + ld l, e + ld h, d + ld a, (hl) + and 0x0f +;source-doc/scsi-drv/./scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { + sub 0x02 + jr NZ,l_chscsi_init_00106 +;source-doc/scsi-drv/./scsi-init.c:24: storage_device->drive_index = storage_count++; + ld hl,0x0010 + add hl, de + ld a,(_storage_count+0) + ld (ix-2),a + ld c,l + ld b,h + ld hl,_storage_count+0 + inc (hl) + ld a,(ix-2) + ld (bc), a +;source-doc/scsi-drv/./scsi-init.c:25: scsi_sense_init(storage_device); + push de + push de + call _scsi_sense_init + pop af + pop de +;source-doc/scsi-drv/./scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, storage_device); + ld hl,_ch_scsi_fntbl + call _dio_add_entry +l_chscsi_init_00106: +;source-doc/scsi-drv/./scsi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc (ix-1) + ld a,(ix-1) + sub 0x07 + jr NZ,l_chscsi_init_00105 +l_chscsi_init_00107: +;source-doc/scsi-drv/./scsi-init.c:31: if (storage_count == 0) +;source-doc/scsi-drv/./scsi-init.c:32: return; +;source-doc/scsi-drv/./scsi-init.c:34: print_device_mounted(" STORAGE DEVICE$", storage_count); + ld a,(_storage_count+0) + or a + jr Z,l_chscsi_init_00110 + push af + inc sp + ld hl,scsi_init_str_0 + push hl + call _print_device_mounted + pop af + inc sp +l_chscsi_init_00110: +;source-doc/scsi-drv/./scsi-init.c:35: } + ld sp, ix + pop ix + ret +scsi_init_str_0: + DEFM " STORAGE DEVICE$" + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/.clang-format b/Source/HBIOS/ch376-native/source-doc/.clang-format new file mode 100644 index 00000000..74924c0f --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/.clang-format @@ -0,0 +1,13 @@ +BasedOnStyle: LLVM +IndentWidth: 2 +AlignConsecutiveMacros: true +ColumnLimit: 132 +AlignConsecutiveAssignments: true +AlignConsecutiveDeclarations: true +AlignEscapedNewlines: true +AlignConsecutiveMacros: true +AlignEscapedNewlines: Right +BinPackArguments: true +BinPackParameters: false +IncludeBlocks: Preserve +SortIncludes: CaseInsensitive diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c new file mode 100644 index 00000000..7f4dca77 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -0,0 +1,238 @@ +#include "ch376.h" + +#include "print.h" + +usb_error result = 0; + +void ch_command(const uint8_t command) __z88dk_fastcall { + uint8_t counter = 255; + while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) + delay(); + + // if (counter == 0) { + // It appears that the Ch376 has become blocked + // command will fail and timeout will eventually be returned by the ch_xxx_wait_int_and_get_status + // todo consider a return value to allow callers to respond appropriately + // Experimentation would indicate that USB_RESET_ALL will still work to reset chip + // return; + // } + + delay(); + CH376_COMMAND_PORT = command; + delay(); +} + +extern usb_error ch_wait_int_and_get_status(const int16_t timeout) __z88dk_fastcall; + +usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } + +usb_error ch_short_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(100); } + +usb_error ch_very_short_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(10); } + +usb_error ch_get_status(void) { + ch_command(CH_CMD_GET_STATUS); + uint8_t ch_status = CH376_DATA_PORT; + + if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) + return ch_status; + + if (ch_status == CH_CMD_RET_SUCCESS) + return USB_ERR_OK; + + if (ch_status == CH_USB_INT_SUCCESS) + return USB_ERR_OK; + + if (ch_status == CH_USB_INT_CONNECT) + return USB_INT_CONNECT; + + if (ch_status == CH_USB_INT_DISK_READ) + return USB_ERR_DISK_READ; + + if (ch_status == CH_USB_INT_DISK_WRITE) + return USB_ERR_DISK_WRITE; + + if (ch_status == CH_USB_INT_DISCONNECT) { + ch_cmd_set_usb_mode(5); + return USB_ERR_NO_DEVICE; + } + + if (ch_status == CH_USB_INT_BUF_OVER) + return USB_ERR_DATA_ERROR; + + ch_status &= 0x2F; + + if (ch_status == 0x2A) + return USB_ERR_NAK; + + if (ch_status == 0x2E) + return USB_ERR_STALL; + + ch_status &= 0x23; + + if (ch_status == 0x20) + return USB_ERR_TIMEOUT; + + if (ch_status == 0x23) + return USB_TOKEN_OUT_OF_SYNC; + + return USB_ERR_UNEXPECTED_STATUS_FROM_HOST; +} + +void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } + +inline uint8_t ch_cmd_check_exist(void) { + uint8_t complement; + ch_command(CH_CMD_CHECK_EXIST); + CH376_DATA_PORT = (uint8_t)~0x55; + delay(); + complement = CH376_DATA_PORT; + return complement == 0x55; + // if (complement != 0x55) + // return false; + + // ch_command(CH_CMD_CHECK_EXIST); + // CH376_DATA_PORT = (uint8_t)~0x89; + // delay(); + // complement = CH376_DATA_PORT; + // return complement == 0x89; +} + +uint8_t ch_probe(void) { + uint8_t i = 5; + do { + if (ch_cmd_check_exist()) + return true; + + delay_medium(); + } while (--i != 0); + + return false; +} + +uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { + uint8_t result = 0; + + CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; + delay(); + CH376_DATA_PORT = mode; + delay(); + + uint8_t count = 127; + + while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { + result = CH376_DATA_PORT; + delay(); + } + + return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; +} + +uint8_t ch_cmd_get_ic_version(void) { + ch_command(CH_CMD_GET_IC_VER); + return CH376_DATA_PORT & 0x1f; +} + +void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { + ch_command(CH_CMD_ISSUE_TKN_X); + CH376_DATA_PORT = toggle_bit; + delay(); + CH376_DATA_PORT = endpoint << 4 | pid; + delay(); +} + +void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { + ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); +} + +void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { + ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); +} + +void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } + +void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } + +void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } + +usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { + uint8_t count; + usb_error result; + + if (buffer_size == 0) + return USB_ERR_OK; + + USB_MODULE_LEDS = 0x01; + do { + ch_issue_token_in(endpoint); + + result = ch_long_wait_int_and_get_status(); + CHECK(result); + + endpoint->toggle = !endpoint->toggle; + + count = ch_read_data(buffer); + + if (count == 0) { + USB_MODULE_LEDS = 0x00; + return USB_ERR_DATA_ERROR; + } + + buffer += count; + buffer_size -= count; + } while (buffer_size > 0); + + USB_MODULE_LEDS = 0x00; + + return USB_ERR_OK; +} + +usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { + uint8_t count; + usb_error result; + + USB_MODULE_LEDS = 0x01; + + ch_issue_token_in(endpoint); + + CHECK(ch_long_wait_int_and_get_status()); + + endpoint->toggle = !endpoint->toggle; + + count = ch_read_data(buffer); + + *buffer_size = count; + + USB_MODULE_LEDS = 0x00; + + return USB_ERR_OK; +} + +usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { + usb_error result; + const uint8_t number = endpoint->number; + const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); + + USB_MODULE_LEDS = 0x02; + + while (buffer_length > 0) { + const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; + buffer = ch_write_data(buffer, size); + buffer_length -= size; + ch_issue_token_out(endpoint); + + CHECK(ch_long_wait_int_and_get_status()); + + endpoint->toggle = !endpoint->toggle; + } + + USB_MODULE_LEDS = 0x00; + + return USB_ERR_OK; +} + +void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { + ch_command(CH_CMD_SET_USB_ADDR); + CH376_DATA_PORT = device_address; + delay(); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h new file mode 100644 index 00000000..88d38dc5 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -0,0 +1,175 @@ + +#ifndef __CH376 +#define __CH376 + +#include "ch376inc.h" +#include "delay.h" +#include + +typedef enum { + USB_ERR_OK = 0, + USB_ERR_NAK = 1, + USB_ERR_STALL = 2, + USB_ERR_TIMEOUT = 3, + USB_ERR_DATA_ERROR = 4, + USB_ERR_NO_DEVICE = 5, + USB_ERR_PANIC_BUTTON_PRESSED = 6, + USB_TOKEN_OUT_OF_SYNC = 7, + USB_ERR_UNEXPECTED_STATUS_FROM_HOST = 8, + USB_ERR_CODE_EXCEPTION = 9, + USB_ERR_MEDIA_CHANGED = 10, + USB_ERR_MEDIA_NOT_PRESENT = 11, + USB_ERR_CH376_BLOCKED = 12, + USB_ERR_CH376_TIMEOUT = 13, + USB_ERR_FAIL = 14, + USB_ERR_MAX = 14, + USB_ERR_OTHER = 15, + USB_ERR_DISK_READ = 0x1D, + USB_ERR_DISK_WRITE = 0x1E, + USB_FILERR_MIN = 0x41, + USB_ERR_OPEN_DIR = 0x41, + USB_ERR_MISS_FILE = 0x42, + USB_FILERR_MAX = 0xB4, + USB_INT_CONNECT = 0x81, + USB_BAD_ADDRESS = 0x82, + USB_ERR_OUT_OF_MEMORY = 0x83, + USB_ERR_BUFF_TO_LARGE = 0x84, + USB_ERROR_DEVICE_NOT_FOUND = 0x85, +} usb_error; + +typedef enum { CH_NAK_RETRY_DONT = 0b00, CH_NAK_RETRY_INDEFINITE = 0b10, CH_NAK_RETRY_3S = 0b11 } ch_nak_retry_type; + +typedef enum { + USB_NOT_SUPPORTED = 0, + USB_IS_FLOPPY = 1, + USB_IS_MASS_STORAGE = 2, + USB_IS_CDC = 3, + USB_IS_KEYBOARD = 4, + USB_IS_UNKNOWN = 6, + _USB_LAST_DEVICE_TYPE, + USB_IS_HUB = 15 +} usb_device_type; // 4 bits only + +typedef enum { ENDPOINT_BULK_OUT = 0, ENDPOINT_BULK_IN = 1, ENDPOINT_INTERRUPT_IN = 2 } usb_endpoint_type; + +extern int printf(const char *msg, ...); + +#if STACK_TRACE_ENABLED + +#define trace_printf printf + +#define CHECK(fn) \ + { \ + result = fn; \ + if (result != USB_ERR_OK && result != USB_ERR_STALL) { \ + if (result != USB_TOKEN_OUT_OF_SYNC) \ + printf("Error: %s:%d %d\r\n", __FILE__, __LINE__, result); \ + return result; \ + } \ + } + +#define RETURN_CHECK(fn) \ + { \ + result = fn; \ + if (result != USB_ERR_OK && result != USB_ERR_STALL) { \ + if (result != USB_TOKEN_OUT_OF_SYNC) \ + printf("Error: %s:%d %d\r\n", __FILE__, __LINE__, result); \ + return result; \ + } \ + return result; \ + } + +#define TRACE_USB_ERROR(result) \ + { \ + if (result != USB_ERR_OK) { \ + printf("USB: %s:%d %d\r\n", __FILE__, __LINE__, result); \ + } \ + } + +#else + +extern usb_error result; + +#define trace_printf(...) + +#define CHECK(fn) \ + { \ + result = fn; \ + if (result != USB_ERR_OK) \ + return result; \ + } + +#define RETURN_CHECK(fn) \ + { return fn; } + +#define TRACE_USB_ERROR(result) + +#endif + +#define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) +#define calc_max_packet_size(packet_sizex) packet_sizex + +typedef struct { + uint8_t toggle : 1; + uint8_t number : 3; + uint16_t max_packet_sizex : 10; +} endpoint_param; + +#define CH_SPEED_FULL \ + 0 /* 12Mbps full speed FullSpeed ​​(default value) \ + */ +#define CH_SPEED_LOW_FREQ 1 /* 1.5Mbps (modify frequency only) */ +#define CH_SPEED_LOW 2 /* 1.5Mbps low speed LowSpeed */ + +#define CH_MODE_HOST_RESET 7 +#define CH_MODE_HOST 6 + +typedef enum _ch376_pid { CH_PID_SETUP = DEF_USB_PID_SETUP, CH_PID_IN = DEF_USB_PID_IN, CH_PID_OUT = DEF_USB_PID_OUT } ch376_pid; + +__sfr __banked __at(0xFF88) CH376_DATA_PORT; +__sfr __banked __at(0xFF89) CH376_COMMAND_PORT; + +__sfr __banked __at(0xFF8A) USB_MODULE_LEDS; + +extern void delay_20ms(void); +extern void delay_short(void); +extern void delay_medium(void); + +extern void ch_command(const uint8_t command) __z88dk_fastcall; +extern usb_error ch_get_status(void); +extern usb_error ch_long_wait_int_and_get_status(void); +extern usb_error ch_short_wait_int_and_get_status(void); +extern usb_error ch_very_short_wait_int_and_get_status(void); +extern uint8_t ch_read_data(uint8_t *buffer) __sdcccall(1); +extern void ch_cmd_reset_all(void); +extern uint8_t ch_probe(void); +extern usb_error ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall; +extern uint8_t ch_cmd_get_ic_version(void); +extern const uint8_t *ch_write_data(const uint8_t *buffer, uint8_t length); + +extern void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall; + +extern usb_error ch_control_transfer_request_descriptor(const uint8_t descriptor_type) __z88dk_fastcall; +extern usb_error ch_control_transfer_set_address(const uint8_t device_address) __z88dk_fastcall; +extern usb_error ch_control_transfer_set_config(const uint8_t config_value) __z88dk_fastcall; +extern usb_error ch_data_in_transfer(uint8_t *buffer, int16_t data_length, endpoint_param *const endpoint); +extern usb_error ch_data_in_transfer_n(uint8_t *buffer, int8_t *const buffer_size, endpoint_param *const endpoint); +extern usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint); + +inline void ch_configure_nak_retry(const ch_nak_retry_type retry, const uint8_t number_of_retries) { + ch_command(CH_CMD_WRITE_VAR8); + CH376_DATA_PORT = CH_VAR_RETRY_TIMES; + delay(); + CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); + delay(); +} + +#define ch_configure_nak_retry_indefinite() ch_configure_nak_retry(CH_NAK_RETRY_INDEFINITE, 0x1F) +#define ch_configure_nak_retry_disable() ch_configure_nak_retry(CH_NAK_RETRY_DONT, 0x1F) +#define ch_configure_nak_retry_3s() ch_configure_nak_retry(CH_NAK_RETRY_3S, 0x1F) + +extern void ch_issue_token_setup(void); +extern void ch_issue_token_out_ep0(void); +extern void ch_issue_token_in_ep0(void); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h new file mode 100644 index 00000000..db4270a3 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h @@ -0,0 +1,1311 @@ +/* C Define for CH376 */ +/* Website: http://wch.cn */ +/* Email: tech@wch.cn */ +/* Author: W.ch 2008.10 */ +/* V1.0 for CH376 */ + +/* Oringinal file at + * https://github.com/changleo828/BOSSEN_USB_FOR_WT/blob/master/code/CH376INC.H + */ +/* google translated */ +/* other changes by Dean Netherton, 2022 */ + +#ifndef _CH376INC_H__ +#define _CH376INC_H__ + +#ifdef _cplusplus +extern " C " { +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Common types and constant definitions */ + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif +#ifndef NULL +#define NULL 0 +#endif + +#ifndef UINT8 +typedef unsigned char UINT8; +#endif +#ifndef UINT16 +typedef unsigned short UINT16; +#endif +#ifndef UINT32 +typedef unsigned long UINT32; +#endif +#ifndef PUINT8 +typedef unsigned char *PUINT8; +#endif +#ifndef PUINT16 +typedef unsigned short *PUINT16; +#endif +#ifndef PUINT32 +typedef unsigned long *PUINT32; +#endif +#ifndef UINT8V +typedef unsigned char volatile UINT8V; +#endif +#ifndef PUINT8V +typedef unsigned char volatile *PUINT8V; +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Hardware features */ + +/* USB single data packet, the maximum length of the data block, the length of + * the default buffer */ + +#define CH376_DAT_BLOCK_LEN 0x40 + +/* ************************************************ + * **************************************************** ***************** */ +/* command code */ +/* Some commands are compatible with CH375 chip, but the input data or output + * data may be partially different) */ +/* A command sequence of operations consists of: + * A command code (for the serial port mode, two synchronization codes are + * required before the command code), Several input data (can be 0), Generate an + * interrupt notification or several output data (can be 0), choose one of the + * two, if there is an interrupt notification, there must be no output data, and + * if there is output data, no interrupt will be generated Only the + * CMD01_WR_REQ_DATA command is an exception, the sequence includes: one command + * code, one output data, several input data Command code naming rules: + * CMDxy_NAME Where x and y are numbers, x indicates the minimum number of input + * data (bytes), y indicates the minimum output data (bytes), if y is H, it + * indicates that an interrupt notification is generated, Some commands can read + * and write data blocks of 0 to multiple bytes, and the number of bytes of the + * data block itself is not included in the above x or y */ +/* This file will also provide a command code format compatible with the CH375 + * chip command code by default (that is, after removing x and y). If you don't + * need it, you can defineNO_CH375_COMPATIBLE_prohibit */ + +/* ************************************************ + * **************************************************** ***************** */ +/* Main commands (manual 1), commonly used */ + +/* Get the chip and firmware version + * Output: version number (bit 7 is 0, bit 6 is 1, bit 5~bit 0 is the version + * number) The value of the version number returned by CH376 is 041H, that is, + * the version number is 01H */ +#define CMD01_GET_IC_VER 0x01 + +/* Serial port mode: set the serial port communication baud rate (the default + baud rate after power-on or reset is 9600bps, selected by D4/D5/D6 pins) + * input: baud rate division factor, baud rate division constant + * output: operation status (CMD_RET_SUCCESS or CMD_RET_ABORT, other values + ​​indicate that the operation is not + * completed) */ +#define CMD21_SET_BAUDRATE 0x02 + +/* Enter sleep state */ +#define CMD00_ENTER_SLEEP 0x03 + +/* perform a hardware reset */ +#define CMD00_RESET_ALL 0x05 + +/* Test the communication interface and working status + * input: any data + * output: bitwise negation of the input data */ +#define CMD11_CHECK_EXIST 0x06 + +/* Device mode: set the way to check the USB bus suspend state + * Input: data 10H, check method + * 00H=do not check for USB suspend, 04H=check for USB suspend at 50mS + * intervals, 05H=check for USB suspend at 10mS intervals + */ +#define CMD20_CHK_SUSPEND 0x0B + +#define CMD20_SET_SDO_INT 0x0B /* SPI interface mode: set the interrupt mode of the SDO pin of SPI */ +/* input: data 16H, interrupt mode */ +/* 10H=SDO pin is disabled for interrupt output, tri-state output is disabled + * when SCS chip selection is invalid, 90H=SDO pin is also used as interrupt + * request output when SCS chip selection is invalid */ + +#define CMD14_GET_FILE_SIZE 0x0C /* Host file mode: get current file length */ +/* input: data 68H */ +/* Output: current file length (total length 32 bits, low byte first) */ + +#define CMD50_SET_FILE_SIZE 0x0D /* host file mode: set current file length */ +/* Input: data 68H, current file length (total length 32 bits, low byte first) + */ + +/* Set USB working mode + * input: mode code + * 00H=Device mode not enabled + * 01H=Device mode enabled and using external firmware mode (serial port not + * supported) 02H=Device mode enabled and using built-in firmware mode 03H=SD + * card host mode/inactive host mode, used to manage and access files in SD card + * 04H=Host mode not enabled + * 05H=Host mode enabled + * 06H=Host mode enabled and SOF packet generated automatically + * 07H=Host mode enabled and USB bus reset + * output: operation status (CMD_RET_SUCCESS or CMD_RET_ABORT, other values + * ​​indicate that the operation is not completed) */ +#define CMD11_SET_USB_MODE 0x15 + +#define CMD01_GET_STATUS 0x22 /* Get interrupt status and cancel interrupt request */ +/* output: interrupt status */ + +#define CMD00_UNLOCK_USB \ + 0x23 /* Device mode: release the current USB buffer \ + */ + +#define CMD01_RD_USB_DATA0 \ + 0x27 /* Read data block from current USB interrupt endpoint buffer or host \ + endpoint receive buffer */ +/* output: length, data stream */ + +#define CMD01_RD_USB_DATA \ + 0x28 /* Device mode: read the data block from the endpoint buffer of the \ + current USB interrupt, and release the buffer, equivalent to \ + CMD01_RD_USB_DATA0 + CMD00_UNLOCK_USB */ +/* output: length, data stream */ + +#define CMD10_WR_USB_DATA7 \ + 0x2B /* Device mode: write data block to the send buffer of USB endpoint 2 \ + */ +/* input: length, data stream */ + +#define CMD10_WR_HOST_DATA 0x2C /* Write a data block to the send buffer of the USB host endpoint */ +/* input: length, data stream */ + +#define CMD01_WR_REQ_DATA 0x2D /* Write the requested data block to the internal specified buffer */ +/* output: length */ +/* input: data stream */ + +#define CMD20_WR_OFS_DATA \ + 0x2E /* Write a data block to the specified offset address in the internal \ + buffer */ +/* input: offset, length, stream */ + +#define CMD10_SET_FILE_NAME 0x2F /* Host file mode: set the filename of the file to be operated on */ +/* Input: 0-terminated string (no more than 14 characters including terminator + * 0) */ + +/* ************************************************ + * **************************************************** ***************** */ +/* Main command (Manual 1), commonly used, the following commands always + * generate an interrupt notification at the end of the operation, and there is + * always no output data */ + +#define CMD0H_DISK_CONNECT \ + 0x30 /* host file mode / SD card not supported: check if disk is connected \ + */ +/* output interrupt */ + +#define CMD0H_DISK_MOUNT 0x31 /* host file mode: initialize disk and test if disk is ready */ +/* output interrupt */ + +/* Host file mode : open files or directories(folders), or enumerate files and + * directories(folders) output interrupt */ +#define CMD0H_FILE_OPEN 0x32 + +#define CMD0H_FILE_ENUM_GO \ + 0x33 /* Host file mode: continue enumerating files and directories (folders) \ + */ +/* output interrupt */ + +#define CMD0H_FILE_CREATE \ + 0x34 /* Host file mode: create a new file, if the file already exists, \ + delete it first */ +/* output interrupt */ + +#define CMD0H_FILE_ERASE \ + 0x35 /* Host file mode: delete the file, if it is already opened, delete it \ + directly, otherwise the file will be opened first and then deleted, \ + and the subdirectory must be opened first */ +/* output interrupt */ + +#define CMD1H_FILE_CLOSE \ + 0x36 /* Host file mode: close the currently opened file or directory \ + (folder) */ +/* input: whether to allow to update file length */ +/* 00H=Disable update length, 01H=Allow update length */ +/* output interrupt */ + +#define CMD1H_DIR_INFO_READ 0x37 /* Host file mode: read file directory information */ +/* Input: Specify the index number of the directory information structure to be + * read in the sector */ +/* The range of the index number is 00H~0FH, and the index number 0FFH is the + * currently opened file */ +/* output interrupt */ + +#define CMD0H_DIR_INFO_SAVE \ + 0x38 /*Host file mode : save file directory information */ /* output \ + interrupt */ + +#define CMD4H_BYTE_LOCATE 0x39 /* host file mode: move current file pointer in bytes */ +/* Input: offset bytes (total length 32 bits, low byte first) */ +/* output interrupt */ + +#define CMD2H_BYTE_READ 0x3A /* host file mode: read data block from current position in bytes */ +/* Input: The number of bytes requested to be read (total length is 16 bits, low + * byte first) */ +/* output interrupt */ + +#define CMD0H_BYTE_RD_GO 0x3B /* host file mode: continue byte read */ +/* output interrupt */ + +#define CMD2H_BYTE_WRITE 0x3C /* Host file mode: write data block to current location in bytes */ +/* Input: The number of bytes requested to be written (total length is 16 bits, + * low byte first) */ +/* output interrupt */ + +#define CMD0H_BYTE_WR_GO 0x3D /* host file mode: continue byte write */ +/* output interrupt */ + +#define CMD0H_DISK_CAPACITY 0x3E /* host file mode: query disk physical capacity */ +/* output interrupt */ + +#define CMD0H_DISK_QUERY \ + 0x3F /* Host file mode: query disk space information \ + */ +/* output interrupt */ + +#define CMD0H_DIR_CREATE \ + 0x40 /* Host file mode: create a new directory (folder) and open it, if the \ + * directory already exists, open it directly \ + */ +/* output interrupt */ + +#define CMD4H_SEC_LOCATE 0x4A /* Host file mode: move the current file pointer in sectors */ +/* Input: number of offset sectors (total length 32 bits, low byte first) */ +/* output interrupt */ + +#define CMD1H_SEC_READ \ + 0x4B /* host file mode / SD card not supported: read data blocks from \ + current location in sectors */ +/* input: the number of sectors requested to be read */ +/* output interrupt */ + +#define CMD1H_SEC_WRITE \ + 0x4C /* host file mode/SD card not supported: write data block at current \ + location in sectors */ +/* input: the number of sectors requested to be written */ +/* output interrupt */ + +#define CMD0H_DISK_BOC_CMD \ + 0x50 /* host mode/SD card not supported: command to execute BulkOnly \ + * transfer protocol for USB storage \ + */ +/* output interrupt */ + +#define CMD5H_DISK_READ \ + 0x54 /* host mode/SD card not supported: read physical sectors from USB \ + storage */ +/* Input: LBA physical sector address (total length 32 bits, low byte first), + * sector number (01H~FFH) */ +/* output interrupt */ + +#define CMD0H_DISK_RD_GO \ + 0x55 /* Host mode/SD card not supported: continue to perform physical sector \ + read operation of USB storage */ +/* output interrupt */ + +#define CMD5H_DISK_WRITE \ + 0x56 /* Host mode/SD card not supported: write physical sector to USB \ + storage */ +/* Input: LBA physical sector address (total length 32 bits, low byte first), + * sector number (01H~FFH) */ +/* output interrupt */ + +#define CMD0H_DISK_WR_GO \ + 0x57 /* Host mode/SD card not supported: continue to perform physical sector \ + write operation of USB storage */ +/* output interrupt */ + +/* ************************************************ + * **************************************************** ***************** */ +/* Auxiliary command (manual 2), not commonly used or for compatibility with + * CH375 and CH372 */ + +#define CMD10_SET_USB_SPEED \ + 0x04 /* Set the USB bus speed, it will automatically return to 12Mbps full \ + speed every time CMD11_SET_USB_MODE sets the USB working mode */ +/* input: bus speed code */ +/* 00H=12Mbps full speed FullSpeed ​​(default value), 01H=1.5Mbps (modify + * frequency only), 02H=1.5Mbps low speed LowSpeed ​​*/ + +#define CMD11_GET_DEV_RATE \ + 0x0A /* Host mode: Get the data rate type of the currently connected USB \ + device */ +/* input: data 07H */ +/* output: data rate type */ +/* If bit 4 is 1, it is a 1.5Mbps low-speed USB device, otherwise it is a 12Mbps + * full-speed USB device */ + +#define CMD11_GET_TOGGLE 0x0A /* Get the synchronization status of the OUT transaction */ +/* input: data 1AH */ +/* output: sync status */ +/* If bit 4 is 1, the OUT transaction is synchronized, otherwise the OUT + * transaction is not synchronized */ + +#define CMD11_READ_VAR8 \ + 0x0A /* Read the specified 8-bit file system variable \ + */ +/* input: variable address */ +/* output: data */ + +/* #define CMD11_GET_MAX_LUN = CMD11_READ_VAR8( VAR_UDISK_LUN ) */ +/* Host mode: Get the maximum and current logical unit number of USB storage */ + +#define CMD20_SET_RETRY \ + 0x0B /* Host mode: set the number of retries for USB transaction operations \ + */ +/* Input: data 25H, number of retries */ +/* Bit 7 is 0, no retry when receiving NAK, + bit 7 is 1, bit 6 is 0, infinite retry when receiving NAK, + bit 7 is 1, bit 6 is 1, retry for up to 3 seconds when receiving NAK, + bit 5~bit 0 is the number of retries after timeout */ + +#define CMD20_WRITE_VAR8 \ + 0x0B /* Set the specified 8-bit file system variable \ + */ +/* input: variable address, data */ + +/* #define CMD20_SET_DISK_LUN = CMD20_WRITE_VAR8( VAR_UDISK_LUN ) */ +/* Host mode: set the current logical unit number of the USB memory */ + +#define CMD14_READ_VAR32 0x0C /* Read the specified 32-bit file system variable */ +/* input: variable address */ +/* output: data (total length 32 bits, low byte first) */ + +#define CMD50_WRITE_VAR32 0x0D /* Set the specified 32-bit file system variable */ +/* Input: variable address, data (total length 32 bits, low byte first) */ + +#define CMD01_DELAY_100US 0x0F /* Delay 100uS (serial port not supported) */ +/* Output: output 0 during the delay, output non-0 after the delay */ + +#define CMD40_SET_USB_ID 0x12 /* Device Mode: Set USB Vendor VID and Product PID */ +/* Input: Manufacturer ID low byte, Manufacturer ID high byte, Product ID low + * byte, Product ID high byte */ + +#define CMD10_SET_USB_ADDR 0x13 /* Set USB address */ +/* input: address value */ + +#define CMD01_TEST_CONNECT \ + 0x16 /* host mode/SD card not supported: check USB device connection status \ + */ +/* output: status (USB_INT_CONNECT or USB_INT_DISCONNECT or USB_INT_USB_READY, + * other values ​​indicate that the operation is not complete) */ + +#define CMD00_ABORT_NAK 0x17 /* Host mode: Abort current NAK retry */ + +#define CMD10_SET_ENDP2 \ + 0x18 /* Device mode (serial port not supported): set the receiver for USB \ + endpoint 0 */ +/* input: how it works */ +/* If bit 7 is 1, bit 6 is the synchronization trigger bit, otherwise the + * synchronization trigger bit remains unchanged */ +/* Bit 3~Bit 0 is the transaction response mode: 0000-ready ACK, 1110-busy NAK, + * 1111-error STALL */ + +#define CMD10_SET_ENDP3 \ + 0x19 /* Device mode (serial port not supported): set the transmitter of USB \ + endpoint 0 */ +/* input: how it works */ +/* If bit 7 is 1, bit 6 is the synchronization trigger bit, otherwise the + * synchronization trigger bit remains unchanged */ +/* Bit 3~Bit 0 is the transaction response mode: 0000~1000-Ready ACK, 1110-Busy + * NAK, 1111-Error STALL */ + +#define CMD10_SET_ENDP4 \ + 0x1A /*Device mode(serial port not supported) : set the receiver of USB endpoint 1 */ /* input: how it works */ +/* If bit 7 is 1, bit 6 is the synchronization trigger bit, otherwise the + * synchronization trigger bit remains unchanged */ +/* Bit 3~Bit 0 is the transaction response mode: 0000-ready ACK, 1110-busy NAK, + * 1111-error STALL */ + +#define CMD10_SET_ENDP5 \ + 0x1B /* Device mode (serial port not supported): set the transmitter of USB \ + endpoint 1 */ +/* input: how it works */ +/* If bit 7 is 1, bit 6 is the synchronization trigger bit, otherwise the + * synchronization trigger bit remains unchanged */ +/* Bit 3~Bit 0 is the transaction response mode: 0000~1000-Ready ACK, 1110-Busy + * NAK, 1111-Error STALL */ + +#define CMD10_SET_ENDP6 0x1C /* Set the receiver for USB endpoint 2/host endpoint */ +/* input: how it works */ +/* If bit 7 is 1, bit 6 is the synchronization trigger bit, otherwise the + * synchronization trigger bit remains unchanged */ +/* Bit 3~Bit 0 is the transaction response mode: 0000-ready ACK, 1101-ready but + * not returning ACK, 1110-busy NAK, 1111-error STALL */ + +#define CMD10_SET_ENDP7 0x1D /* Set the transmitter for USB endpoint 2/host endpoint */ +/* input: how it works */ +/* If bit 7 is 1, bit 6 is the synchronization trigger bit, otherwise the + * synchronization trigger bit remains unchanged */ +/* Bit 3~Bit 0 is the transaction response mode: 0000-ready ACK, 1101-ready but + * no response, 1110-busy NAK, 1111-error STALL + */ + +#define CMD00_DIRTY_BUFFER 0x25 /* Host file mode: clear internal disk and file buffers */ + +#define CMD10_WR_USB_DATA3 \ + 0x29 /* Device mode (serial port not supported): write data block to the \ + * send buffer of USB endpoint 0 \ + */ +/* input: length, data stream */ + +#define CMD10_WR_USB_DATA5 \ + 0x2A /* Device mode (serial port not supported): write data block to the \ + * send buffer of USB endpoint 1 \ + */ +/* input: length, data stream */ + +/* ************************************************ + * **************************************************** ***************** */ +/* Auxiliary commands (manual 2), not commonly used or for compatibility with + * CH375 and CH372, the following commands always generate an interrupt + * notification at the end of the operation, and always have no output data */ + +#define CMD1H_CLR_STALL 0x41 /* host mode: control transfer - clear endpoint error */ +/* input: endpoint number */ +/* output interrupt */ + +#define CMD1H_SET_ADDRESS 0x45 /* host mode: control transfer - set usb address */ +/* input: address value */ +/* output interrupt */ + +#define CMD1H_GET_DESCR \ + 0x46 /* host mode: control transfer - get descriptor \ + */ +/* input: descriptor type */ +/* output interrupt */ + +#define CMD1H_SET_CONFIG 0x49 /* host mode: control transfer - set usb configuration */ +/* input: config value */ +/* output interrupt */ + +#define CMD0H_AUTO_SETUP 0x4D /* host mode/SD card not supported: auto configure USB device */ +/* output interrupt */ + +#define CMD2H_ISSUE_TKN_X \ + 0x4E /* Host mode: issue sync token, execute transaction, this command can \ + replace CMD10_SET_ENDP6/CMD10_SET_ENDP7 + CMD1H_ISSUE_TOKEN */ +/* input: sync flag, transaction attributes */ +/* Bit 7 of the synchronization flag is the synchronization trigger bit of the + * host endpoint IN, bit 6 is the synchronization trigger bit of the host + * endpoint OUT, bit 5~bit 0 must be 0 */ +/* The lower 4 bits of the transaction attribute are the token, and the upper 4 + * bits are the endpoint number */ +/* output interrupt */ + +#define CMD1H_ISSUE_TOKEN \ + 0x4F /* Host mode: issue token, execute transaction, it is recommended to \ + * use CMD2H_ISSUE_TKN_X command \ + */ +/* input: transaction properties */ +/* The lower 4 bits are the token, the upper 4 bits are the endpoint number */ +/* output interrupt */ + +#define CMD0H_DISK_INIT 0x51 /* host mode/SD card not supported: initialize USB storage */ +/* output interrupt */ + +#define CMD0H_DISK_RESET \ + 0x52 /* host mode/SD card not supported: control transfer - reset usb \ + storage */ +/* output interrupt */ + +#define CMD0H_DISK_SIZE 0x53 /* Host mode/SD card not supported: Get the capacity of USB storage */ +/* output interrupt */ + +#define CMD0H_DISK_INQUIRY \ + 0x58 /* host mode/SD card not supported: query USB storage characteristics \ + */ +/* output interrupt */ + +#define CMD0H_DISK_READY 0x59 /* host mode/SD card not supported: check usb storage ready */ +/* output interrupt */ + +#define CMD0H_DISK_R_SENSE 0x5A /* host mode /SD card not supported: check usb storage error */ +/* output interrupt */ + +#define CMD0H_RD_DISK_SEC \ + 0x5B /* Host file mode: read one sector of data from disk into internal \ + buffer */ +/* output interrupt */ + +#define CMD0H_WR_DISK_SEC \ + 0x5C /* Host file mode: write data of one sector of internal buffer to disk \ + */ +/* output interrupt */ + +#define CMD0H_DISK_MAX_LUN \ + 0x5D /* Host mode: control transfer - get the maximum logical unit number of \ + USB storage */ +/* output interrupt */ + +/* ************************************************ + * **************************************************** ***************** */ +/* The following definitions are only for compatibility with the command name + * format in the INCLUDE file of CH375 */ + +#ifndef NO_CH375_COMPATIBLE_ +#define CH_CMD_GET_IC_VER CMD01_GET_IC_VER +#define CH_CMD_SET_BAUDRATE CMD21_SET_BAUDRATE +#define CH_CMD_ENTER_SLEEP CMD00_ENTER_SLEEP +#define CH_CMD_RESET_ALL CMD00_RESET_ALL +#define CH_CMD_CHECK_EXIST CMD11_CHECK_EXIST +#define CH_CMD_CHK_SUSPEND CMD20_CHK_SUSPEND +#define CH_CMD_SET_SDO_INT CMD20_SET_SDO_INT +#define CH_CMD_GET_FILE_SIZE CMD14_GET_FILE_SIZE +#define CH_CMD_SET_FILE_SIZE CMD50_SET_FILE_SIZE +#define CH_CMD_SET_USB_MODE CMD11_SET_USB_MODE +#define CH_CMD_GET_STATUS CMD01_GET_STATUS +#define CH_CMD_UNLOCK_USB CMD00_UNLOCK_USB +#define CH_CMD_RD_USB_DATA0 CMD01_RD_USB_DATA0 +#define CH_CMD_RD_USB_DATA CMD01_RD_USB_DATA +#define CH_CMD_WR_USB_DATA7 CMD10_WR_USB_DATA7 +#define CH_CMD_WR_HOST_DATA CMD10_WR_HOST_DATA +#define CH_CMD_WR_REQ_DATA CMD01_WR_REQ_DATA +#define CH_CMD_WR_OFS_DATA CMD20_WR_OFS_DATA +#define CH_CMD_SET_FILE_NAME CMD10_SET_FILE_NAME +#define CH_CMD_DISK_CONNECT CMD0H_DISK_CONNECT +#define CH_CMD_DISK_MOUNT CMD0H_DISK_MOUNT +#define CH_CMD_FILE_OPEN CMD0H_FILE_OPEN +#define CH_CMD_FILE_ENUM_GO CMD0H_FILE_ENUM_GO +#define CH_CMD_FILE_CREATE CMD0H_FILE_CREATE +#define CH_CMD_FILE_ERASE CMD0H_FILE_ERASE +#define CH_CMD_FILE_CLOSE CMD1H_FILE_CLOSE +#define CH_CMD_DIR_INFO_READ CMD1H_DIR_INFO_READ +#define CH_CMD_DIR_INFO_SAVE CMD0H_DIR_INFO_SAVE +#define CH_CMD_BYTE_LOCATE CMD4H_BYTE_LOCATE +#define CH_CMD_BYTE_READ CMD2H_BYTE_READ +#define CH_CMD_BYTE_RD_GO CMD0H_BYTE_RD_GO +#define CH_CMD_BYTE_WRITE CMD2H_BYTE_WRITE +#define CH_CMD_BYTE_WR_GO CMD0H_BYTE_WR_GO +#define CH_CMD_DISK_CAPACITY CMD0H_DISK_CAPACITY +#define CH_CMD_DISK_QUERY CMD0H_DISK_QUERY +#define CH_CMD_DIR_CREATE CMD0H_DIR_CREATE +#define CH_CMD_SEC_LOCATE CMD4H_SEC_LOCATE +#define CH_CMD_SEC_READ CMD1H_SEC_READ +#define CH_CMD_SEC_WRITE CMD1H_SEC_WRITE +#define CH_CMD_DISK_BOC_CMD CMD0H_DISK_BOC_CMD +#define CH_CMD_DISK_READ CMD5H_DISK_READ +#define CH_CMD_DISK_RD_GO CMD0H_DISK_RD_GO +#define CH_CMD_DISK_WRITE CMD5H_DISK_WRITE +#define CH_CMD_DISK_WR_GO CMD0H_DISK_WR_GO +#define CH_CMD_SET_USB_SPEED CMD10_SET_USB_SPEED +#define CH_CMD_GET_DEV_RATE CMD11_GET_DEV_RATE +#define CH_CMD_GET_TOGGLE CMD11_GET_TOGGLE +#define CH_CMD_READ_VAR8 CMD11_READ_VAR8 +#define CH_CMD_SET_RETRY CMD20_SET_RETRY +#define CH_CMD_WRITE_VAR8 CMD20_WRITE_VAR8 +#define CH_CMD_READ_VAR32 CMD14_READ_VAR32 +#define CH_CMD_WRITE_VAR32 CMD50_WRITE_VAR32 +#define CH_CMD_DELAY_100US CMD01_DELAY_100US +#define CH_CMD_SET_USB_ID CMD40_SET_USB_ID +#define CH_CMD_SET_USB_ADDR CMD10_SET_USB_ADDR +#define CH_CMD_TEST_CONNECT CMD01_TEST_CONNECT +#define CH_CMD_ABORT_NAK CMD00_ABORT_NAK +#define CH_CMD_SET_ENDP2 CMD10_SET_ENDP2 +#define CH_CMD_SET_ENDP3 CMD10_SET_ENDP3 +#define CH_CMD_SET_ENDP4 CMD10_SET_ENDP4 +#define CH_CMD_SET_ENDP5 CMD10_SET_ENDP5 +#define CH_CMD_SET_ENDP6 CMD10_SET_ENDP6 +#define CH_CMD_SET_ENDP7 CMD10_SET_ENDP7 +#define CH_CMD_DIRTY_BUFFER CMD00_DIRTY_BUFFER +#define CH_CMD_WR_USB_DATA3 CMD10_WR_USB_DATA3 +#define CH_CMD_WR_USB_DATA5 CMD10_WR_USB_DATA5 +#define CH_CMD_CLR_STALL CMD1H_CLR_STALL +#define CH_CMD_SET_ADDRESS CMD1H_SET_ADDRESS +#define CH_CMD_GET_DESCR CMD1H_GET_DESCR +#define CH_CMD_SET_CONFIG CMD1H_SET_CONFIG +#define CH_CMD_AUTO_SETUP CMD0H_AUTO_SETUP +#define CH_CMD_ISSUE_TKN_X CMD2H_ISSUE_TKN_X +#define CH_CMD_ISSUE_TOKEN CMD1H_ISSUE_TOKEN +#define CH_CMD_DISK_INIT CMD0H_DISK_INIT +#define CH_CMD_DISK_RESET CMD0H_DISK_RESET +#define CH_CMD_DISK_SIZE CMD0H_DISK_SIZE +#define CH_CMD_DISK_INQUIRY CMD0H_DISK_INQUIRY +#define CH_CMD_DISK_READY CMD0H_DISK_READY +#define CH_CMD_DISK_R_SENSE CMD0H_DISK_R_SENSE +#define CH_CMD_RD_DISK_SEC CMD0H_RD_DISK_SEC +#define CH_CMD_WR_DISK_SEC CMD0H_WR_DISK_SEC +#define CH_CMD_DISK_MAX_LUN CMD0H_DISK_MAX_LUN +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Parallel port mode, bit definition of status port (read command port) */ +#ifndef PARA_STATE_INTB +#define PARA_STATE_INTB 0x80 /* Bit 7 of parallel port status port: interrupt flag, active low */ +#define PARA_STATE_BUSY 0x10 /* Bit 4 of parallel port status port: busy flag, active high */ +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Serial mode, boot synchronization code before the operation command */ +#ifndef SER_CMD_TIMEOUT +#define SER_CMD_TIMEOUT \ + 32 /* Serial command timeout time, the unit is mS, the interval between \ + synchronization codes and between synchronization codes and command \ + codes should be as short as possible, and the processing method after \ + timeout is to discard */ +#define SER_SYNC_CODE1 0x57 /* The first serial port synchronization code to start the operation */ +#define SER_SYNC_CODE2 \ + 0xAB /* The second serial port synchronization code to start the operation \ + */ +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Operation status */ + +#ifndef CH_CMD_RET_SUCCESS +#define CH_CMD_RET_SUCCESS 0x51 /* Command operation succeeded */ +#define CH_CMD_RET_ABORT 0x5F /* Command operation failed */ +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* USB interrupt status */ + +#ifndef USB_INT_EP0_SETUP + +/* The following status codes are special event interrupts, if the USB bus + * suspend check is enabled through CMD20_CHK_SUSPEND, then the interrupt status + * of USB bus suspend and sleep wakeup must be handled */ +#define USB_INT_USB_SUSPEND 0x05 /* USB bus suspend event */ +#define USB_INT_WAKE_UP 0x06 /* Wake from sleep event */ + +/* The following status code 0XH is used for USB device mode */ +/* Only need to process in built-in firmware mode: USB_INT_EP1_OUT, + * USB_INT_EP1_IN, USB_INT_EP2_OUT, USB_INT_EP2_IN */ +/* bit 7 - bit 4 is 0000 */ +/* Bit 3-Bit 2 indicates the current transaction, 00=OUT, 10=IN, 11=SETUP */ +/* Bit 1-Bit 0 indicates the current endpoint, 00=Endpoint 0, 01=Endpoint 1, + * 10=Endpoint 2, 11=USB bus reset */ +#define USB_INT_EP0_SETUP 0x0C /* SETUP for USB endpoint 0 */ +#define USB_INT_EP0_OUT 0x00 /* OUT of USB endpoint 0 */ +#define USB_INT_EP0_IN 0x08 /* IN for USB endpoint 0 */ +#define USB_INT_EP1_OUT 0x01 /* OUT of USB endpoint 1 */ +#define USB_INT_EP1_IN 0x09 /* IN for USB endpoint 1 */ +#define USB_INT_EP2_OUT 0x02 /* OUT of USB endpoint 2 */ +#define USB_INT_EP2_IN 0x0A /* IN for USB endpoint 2 */ +/* USB_INT_BUS_RESET 0x0000XX11B */ +/* USB bus reset */ +#define USB_INT_BUS_RESET1 0x03 /* USB bus reset */ +#define USB_INT_BUS_RESET2 0x07 /* USB bus reset */ +#define USB_INT_BUS_RESET3 0x0B /* USB bus reset */ +#define USB_INT_BUS_RESET4 0x0F /* USB bus reset */ + +#endif + +/* The following status codes 2XH-3XH are used for communication failure codes + * in USB host mode */ +/* bit 7 - bit 6 is 00 */ +/* bit 5 is 1 */ +/* Bit 4 indicates whether the currently received packet is synchronized */ +/* Bit 3-Bit 0 indicates the response from the USB device when communication + * failed: 0010=ACK, 1010=NAK, 1110=STALL, 0011=DATA0, 1011=DATA1, XX00=timeout + */ +/* USB_INT_RET_ACK 0x001X0010B */ +/* ERROR: return ACK for IN transaction */ +/* USB_INT_RET_NAK 0x001X1010B */ +/* Error: return NAK */ +/* USB_INT_RET_STALL 0x001X1110B */ +/* Error: return STALL */ +/* USB_INT_RET_DATA0 0x001X0011B */ +/* Error: DATA0 returned for OUT/SETUP transactions */ +/* USB_INT_RET_DATA1 0x001X1011B */ +/* ERROR: DATA1 returned for OUT/SETUP transactions */ +/* USB_INT_RET_TOUT 0x001XXX00B */ +/* Error: return timeout */ +/* USB_INT_RET_TOGX 0x0010X011B */ +/* Error: return data out of sync for IN transaction */ +/* USB_INT_RET_PID 0x001XXXXXB */ +/* ERROR: undefined */ + +/* The following status code 1XH is used for the operation status code of USB + * host mode */ +#ifndef CH_USB_INT_SUCCESS + +/* USB transaction or transfer operation succeeded */ +#define CH_USB_INT_SUCCESS 0x14 + +/* A USB device connection event is detected, it may be a new connection or + * reconnection after disconnection */ +#define CH_USB_INT_CONNECT 0x15 + +/* USB device disconnection event detected */ +#define CH_USB_INT_DISCONNECT 0x16 + +/* The data transmitted by USB is wrong or the buffer overflows due to too much + * data */ +#define CH_USB_INT_BUF_OVER 0x17 + +/* USB device has been initialized (USB address has been assigned) */ +#define CH_USB_INT_USB_READY 0x18 + +/* USB storage request data read */ +#define CH_USB_INT_DISK_READ 0x1D + +/* USB storage request data write */ +#define CH_USB_INT_DISK_WRITE 0x1E + +/* USB storage operation failed */ +#define CH_USB_INT_DISK_ERR 0x1F +#endif + +/* The following status codes are used for file system error codes in host file + * mode */ +#ifndef ERR_DISK_DISCON +#define ERR_DISK_DISCON \ + 0x82 /* The disk has not been connected, maybe the disk has been \ + disconnected */ +#define ERR_LARGE_SECTOR \ + 0x84 /*The sector of the disk is too large, only 512 bytes per sector are \ + supported */ \ + #define ERR_TYPE_ERROR 0x92 /* The disk partition type is not \ + supported, only FAT12/FAT16/BigDOS/FAT32 is \ + supported, it needs to be re-partitioned by the \ + disk management tool */ +#define ERR_BPB_ERROR \ + 0xA1 /*The disk has not been formatted, \ + or the parameters are wrong and need to be reformatted by WINDOWS with \ + default parameters */ \ + #define ERR_DISK_FULL 0xB1 /*The disk file is too full, the remaining \ + space is too little or there is no more, and \ + disk defragmentation is required */ \ + #define ERR_FDT_OVER 0xB2 /*There are too many files in the \ + directory(folder), there is no free directory \ + entry, the number of files in the FAT12 / \ + FAT16 root directory should be less than 512, \ + and disk defragmentation is required */ \ + #define ERR_FILE_CLOSE 0xB4 /*The file has been closed, it should be \ + reopened if needed */ \ + #define ERR_OPEN_DIR 0x41 /* The directory (folder) of the specified \ + path is opened */ +#define ERR_MISS_FILE \ + 0x42 /*The file in the specified path is not found, maybe the file name is \ + wrong */ \ + #define ERR_FOUND_NAME 0x43 /* Search for a matching file name, or ask \ + to open a directory (folder) but the actual result opens the file */ +/* The following file system error codes are used for file system subroutines */ +#define ERR_MISS_DIR \ + 0xB3 /*A subdirectory(folder) of the specified path is not found, maybe the \ + directory name is wrong */ \ + #define ERR_LONG_BUF_OVER 0x48 /* long file buffer overflow */ +#define ERR_LONG_NAME_ERR \ + 0x49 /* The short file name does not have a corresponding long file name or \ + * the long file name is wrong \ + */ +#define ERR_NAME_EXIST \ + 0x4A /* A short file with the same name already exists, it is recommended to \ + regenerate another short file name */ +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* The following status codes are used for disk and file status in host file + * mode, VAR_DISK_STATUS */ +#ifndef DEF_DISK_UNKNOWN +#define DEF_DISK_UNKNOWN \ + 0x00 /*Not initialized, unknown state */ \ + #define DEF_DISK_DISCONN 0x01 /* The disk is not connected or has been \ + disconnected */ +#define DEF_DISK_CONNECT \ + 0x02 /* The disk is connected, but it has not been initialized or the disk \ + * cannot be recognized \ + */ +#define DEF_DISK_MOUNTED \ + 0x03 /* The disk has been initialized successfully, but the file system has \ + not been analyzed or the file system does not support */ +#define DEF_DISK_READY 0x10 /* The file system of the disk has been analyzed and can support */ +#define DEF_DISK_OPEN_ROOT \ + 0x12 /* The root directory has been opened and must be closed after use. \ + Note that the FAT12/FAT16 root directory is a fixed length */ +#define DEF_DISK_OPEN_DIR 0x13 /* A subdirectory (folder) has been opened */ +#define DEF_DISK_OPEN_FILE 0x14 /* The file has been opened */ +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Common definitions of file system */ + +#ifndef DEF_SECTOR_SIZE +#define DEF_SECTOR_SIZE 512 /* The default physical sector size of U disk or SD card */ +#endif + +#ifndef DEF_WILDCARD_CHAR +#define DEF_WILDCARD_CHAR 0x2A /* Wildcard '*' for pathname */ +#define DEF_SEPAR_CHAR1 0x5C /* The path name separator '\' */ +#define DEF_SEPAR_CHAR2 0x2F /* The delimiter of the path name '/' */ +#define DEF_FILE_YEAR 2004 /* Default file date: 2004 */ +#define DEF_FILE_MONTH 1 /* Default file date: January */ +#define DEF_FILE_DATE 1 /* Default file date: 1st */ +#endif + +#ifndef ATTR_DIRECTORY + +/* File directory information in FAT data area */ +typedef struct FAT_DIR_INFO { + UINT8 DIR_Name[11]; /* 00H, file name, a total of 11 bytes, fill in blanks */ + UINT8 DIR_Attr; /* 0BH, file attribute, refer to the following description */ + UINT8 DIR_NTRes; /* 0CH */ + UINT8 DIR_CrtTimeTenth; /* 0DH, the time of file creation, counted in 0.1 + second units */ + UINT16 DIR_CrtTime; /* 0EH, file creation time */ + UINT16 DIR_CrtDate; /* 10H, the date the file was created */ + UINT16 DIR_LstAccDate; /* 12H, the date of the last access operation */ + UINT16 DIR_FstClusHI; /* 14H */ + UINT16 DIR_WrtTime; /* 16H, file modification time, refer to the previous + macro MAKE_FILE_TIME */ + UINT16 DIR_WrtDate; /* 18H, file modification date, refer to the previous + macro MAKE_FILE_DATE */ + UINT16 DIR_FstClusLO; /* 1AH */ + UINT32 DIR_FileSize; /* 1CH, file length */ +} FAT_DIR_INFO, *P_FAT_DIR_INFO; /* 20H */ + +/* file attributes */ +#define ATTR_READ_ONLY 0x01 /* The file is read-only */ +#define ATTR_HIDDEN 0x02 /* file is a hidden attribute */ +#define ATTR_SYSTEM 0x04 /* The file is a system attribute */ +#define ATTR_VOLUME_ID 0x08 /* Volume label */ +#define ATTR_DIRECTORY 0x10 /* subdirectories (folders) */ +#define ATTR_ARCHIVE 0x20 /* file is archive attribute */ +#define ATTR_LONG_NAME (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID) /* long filename attribute */ +#define ATTR_LONG_NAME_MASK (ATTR_LONG_NAME | ATTR_DIRECTORY | ATTR_ARCHIVE) +/* file attribute UINT8 */ +/* bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 */ +/* Only hidden volume is undefined */ +/* Read the Tibetan standard record file */ +/* file time UINT16 */ +/* Time = (Hour<<11) + (Minute<<5) + (Second>>1) */ +#define MAKE_FILE_TIME \ + (h, m, s)((h << 11) + (m << 5) + (s >> 1)) /* Generate file time data of specified \ + hours, minutes and seconds */ +/* file date UINT16 */ +/* Date = ((Year-1980)<<9) + (Month<<5) + Day */ +#define MAKE_FILE_DATE \ + (y, m, d)(((y - 1980) << 9) + (m << 5) + d) /* Generate the file date data of the \ + specified year, month and day */ + +#define LONE_NAME_MAX_CHAR (255 * 2) /* The maximum number of characters/bytes of the long file name */ +#define LONG_NAME_PER_DIR \ + (13 * 2) /* The number of characters/bytes of the long file name in the \ + directory information structure of each file */ + +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* SCSI command and data input and output structures */ + +#ifndef SPC_CMD_INQUIRY + +/* SCSI command code */ +#define SPC_CMD_INQUIRY 0x12 +#define SPC_CMD_READ_CAPACITY 0x25 +#define SPC_CMD_READ10 0x28 +#define SPC_CMD_WRITE10 0x2A +#define SPC_CMD_TEST_READY 0x00 +#define SPC_CMD_REQUEST_SENSE 0x03 +#define SPC_CMD_MODESENSE6 0x1A +#define SPC_CMD_MODESENSE10 0x5A +#define SPC_CMD_START_STOP 0x1B + +/* BulkOnly protocol command block */ +typedef struct BULK_ONLY_CBW { + UINT32 CBW_Sig; + UINT32 CBW_Tag; + UINT8 CBW_DataLen0; /* 08H, input: data transmission length, the valid value + for input data is 0 to 48, and the valid value for + output data is 0 to 33 */ + UINT8 CBW_DataLen1; + UINT16 CBW_DataLen2; + UINT8 CBW_Flag; /* 0CH, input: transmission direction and other flags, if bit + 7 is 1, input data, if bit 0, output data or no data */ + UINT8 CBW_LUN; + UINT8 CBW_CB_Len; /* 0EH, input: the length of the command block, valid values + ​​are 1 to 16 */ + UINT8 CBW_CB_Buf[16]; /* 0FH, input: command block, the buffer is up to 16 + bytes */ +} BULK_ONLY_CBW, *P_BULK_ONLY_CBW; /* BulkOnly protocol command block, input CBW structure */ + +/* INQUIRY command return data */ +typedef struct INQUIRY_DATA { + UINT8 DeviceType; /* 00H, device type */ + UINT8 RemovableMedia; /* 01H, if bit 7 is 1, it means removable storage */ + UINT8 Versions; /* 02H, protocol version */ + UINT8 DataFormatAndEtc; /* 03H, specify the return data format */ + UINT8 AdditionalLength; /* 04H, the length of subsequent data */ + UINT8 Reserved1; + UINT8 Reserved2; + UINT8 MiscFlag; /* 07H, some control flags */ + UINT8 VendorIdStr[8]; /* 08H, Vendor information */ + UINT8 ProductIdStr[16]; /* 10H, product information */ + UINT8 ProductRevStr[4]; /* 20H, product version */ +} INQUIRY_DATA, *P_INQUIRY_DATA; /* 24H */ + +/* REQUEST SENSE command return data */ +typedef struct SENSE_DATA { + UINT8 ErrorCode; /* 00H, error code and valid bits */ + UINT8 SegmentNumber; + UINT8 SenseKeyAndEtc; /* 02H, primary key code */ + UINT8 Information0; + UINT8 Information1; + UINT8 Information2; + UINT8 Information3; + UINT8 AdditSenseLen; /* 07H, the length of subsequent data */ + UINT8 CmdSpecInfo[4]; + UINT8 AdditSenseCode; /* 0CH, additional key code */ + UINT8 AddSenCodeQual; /* 0DH, detailed additional key code */ + UINT8 FieldReplaUnit; + UINT8 SenseKeySpec[3]; +} SENSE_DATA, *P_SENSE_DATA; /* 12H */ + +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Data input and output structures in host file mode */ + +#ifndef MAX_FILE_NAME_LEN + +#define MAX_FILE_NAME_LEN \ + (13 + 1) /* The maximum length of the file name, the maximum length is 1 \ + root directory character + 8 main file names + 1 decimal point + \ + 3 type names + terminator = 14 */ + +/* Command input data and output data */ +typedef union CH376_CMD_DATA { + struct { + UINT8 mBuffer[MAX_FILE_NAME_LEN]; + } Default; + + INQUIRY_DATA DiskMountInq; /* Return: return data of INQUIRY command */ + /* CMD0H_DISK_MOUNT: Initialize the disk and test if the disk is ready, when + * executed for the first time */ + + FAT_DIR_INFO OpenDirInfo; /* Return: Enumerated file directory information */ + /* CMD0H_FILE_OPEN: Enumerate files and directories (folders) */ + + FAT_DIR_INFO EnumDirInfo; /* Return: Enumerated file directory information */ + /* CMD0H_FILE_ENUM_GO: Continue to enumerate files and directories (folders) + */ + + struct { + UINT8 mUpdateFileSz; /* Input parameter: whether to allow the file length to + be updated, or 0 to prohibit the update of the + length */ + } FileCLose; /* CMD1H_FILE_CLOSE: close the currently opened file */ + + struct { + UINT8 mDirInfoIndex; /* Input parameters: specify the index number of the + directory information structure to be read in the + sector, 0FFH is the currently opened file */ + } DirInfoRead; /* CMD1H_DIR_INFO_READ: read the directory information of the + file */ + + union { + UINT32 mByteOffset; /* Input parameter: number of offset bytes, offset in + bytes (total length 32 bits, low byte first) */ + UINT32 + mSectorLba; /* Return: the absolute linear sector number corresponding + to the current file pointer, 0FFFFFFFFH has reached the + end of the file (total length 32 bits, low byte first) */ + } ByteLocate; /* CMD4H_BYTE_LOCATE: move the current file pointer in bytes */ + + struct { + UINT16 + mByteCount; /* Input parameter: the number of bytes requested to be read + (total length is 16 bits, low byte first) */ + } ByteRead; /* CMD2H_BYTE_READ: read data block from current position in bytes + */ + + struct { + UINT16 mByteCount; /* Input parameter: the number of bytes requested to be + written (total length is 16 bits, low byte first) */ + } ByteWrite; /* CMD2H_BYTE_WRITE: Write a block of data to the current + location in bytes */ + + union { + UINT32 mSectorOffset; /* Input parameter: number of offset sectors, offset + in sector (total length 32 bits, low byte first) */ + UINT32 + mSectorLba; /* Return: the absolute linear sector number corresponding + to the current file pointer, 0FFFFFFFFH has reached the + end of the file (total length 32 bits, low byte first) */ + } SectorLocate; /* CMD4H_SEC_LOCATE: move the current file pointer in sectors + */ + + struct { + UINT8 mSectorCount; /* Input parameters: the number of sectors requested to + be read */ + /* return: the number of sectors allowed to be read */ + UINT8 mReserved1; + UINT8 mReserved2; + UINT8 mReserved3; + UINT32 mStartSector; /* Return: The starting absolute linear sector number + of the sector block allowed to be read (total length + 32 bits, low byte first) */ + } SectorRead; /* CMD1H_SEC_READ: Read the data block from the current position + in sectors */ + + struct { + UINT8 mSectorCount; /* Input parameters: the number of sectors requested to + be written */ + /* return: the number of sectors allowed to be written */ + UINT8 mReserved1; + UINT8 mReserved2; + UINT8 mReserved3; + UINT32 mStartSector; /* Return: the starting absolute linear sector number + of the sector block allowed to be written (total + length 32 bits, low byte first) */ + } SectorWrite; /* CMD1H_SEC_WRITE: Write a data block at the current location + in sectors */ + + struct { + UINT32 + mDiskSizeSec; /* Return: the total number of sectors of the entire + physical disk (total length 32 bits, low byte first) */ + } DiskCapacity; /* CMD0H_DISK_CAPACITY: Query the physical capacity of the + disk */ + + struct { + UINT32 mTotalSector; /* Return: the total number of sectors of the current + logical disk (total length is 32 bits, low byte + first) */ + UINT32 mFreeSector; /* Return: the number of remaining sectors of the + current logical disk (total length is 32 bits, low + byte first) */ + UINT8 mDiskFat; /* Return: FAT type of the current logical disk, 1-FAT12, + 2-FAT16, 3-FAT32 */ + } DiskQuery; /* CMD_DiskQuery, query disk information */ + + BULK_ONLY_CBW DiskBocCbw; /* Input parameters: CBW command structure */ + /* CMD0H_DISK_BOC_CMD: command to execute BulkOnly transfer protocol to USB + * memory */ + + struct { + UINT8 mMaxLogicUnit; /* return: the maximum logic unit number of the USB + memory */ + } DiskMaxLun; /* CMD0H_DISK_MAX_LUN: Control transfer - get the maximum + logical unit number of USB memory */ + + INQUIRY_DATA DiskInitInq; /* Return: return data of INQUIRY command */ + /* CMD0H_DISK_INIT: Initialize USB storage */ + + INQUIRY_DATA DiskInqData; /* Return: return data of INQUIRY command */ + /* CMD0H_DISK_INQUIRY: Query USB storage characteristics */ + + SENSE_DATA ReqSenseData; /* Return: REQUEST SENSE command return data */ + /* CMD0H_DISK_R_SENSE: Check for USB storage errors */ + + struct { + UINT32 mDiskSizeSec; /* Return: the total number of sectors of the entire + physical disk (total length is 32 bits, high byte + first) */ + } DiskSize; /* CMD0H_DISK_SIZE: Get the capacity of the USB memory */ + + struct { + UINT32 mStartSector; /* Input parameters: LBA sector address (total length + 32 bits, low byte first) */ + UINT8 mSectorCount; /* Input parameters: the number of sectors requested to + be read */ + } DiskRead; /* CMD5H_DISK_READ: Read data blocks from USB memory (in sectors) + */ + + struct { + UINT32 mStartSector; /* Input parameters: LBA sector address (total length + 32 bits, low byte first) */ + UINT8 mSectorCount; /* Input parameters: the number of sectors requested to + be written */ + } DiskWrite; /* CMD5H_DISK_WRITE: Write data block to USB memory (in sectors) + */ +} CH376_CMD_DATA, *P_CH376_CMD_DATA; + +#endif + +/* ************************************************ + * **************************************************** ***************** */ +/* Address of filesystem variable in host file mode */ + +#ifndef VAR_FILE_SIZE + +/* 8-bit/single-byte variable */ + +/* Basic information of the current system + * Bit 6 is used to indicate the subclass SubClass-Code of the USB storage + * device. If bit 6 is 0, it means that the subclass is 6, and if bit 6 is 1, it + * means that the subclass is other than 6 Bit 5 is used to indicate the USB + * configuration status in USB device mode and the USB device connection status + * in USB host mode In USB device mode, if bit 5 is 1, the USB configuration is + * complete, and if bit 5 is 0, it has not yet been configured In USB host mode, + * if bit 5 is 1, there is a USB device on the USB port, and if bit 5 is 0, + * there is no USB device on the USB port Bit 4 is used to indicate the buffer + * lock state in USB device mode. If bit 4 is 1, it means that the USB buffer is + * in a locked state. If bit 6 is 1, it means it has been released Other bits, + * reserved, do not modify */ +#define CH_VAR_SYS_BASE_INFO 0x20 + +/* The number of retries for the USB transaction operation + * If bit 7 is 0, it will not retry when receiving NAK, if bit 7 is 1, if bit 6 + * is 0, it will retry infinitely when receiving NAK (you can use CMD_ABORT_NAK + * command to give up retry), if bit 7 is 1, bit 6 is 1 Retry for up to 3 + * seconds when NAK is received Bit 5~Bit 0 is the number of retries after + * timeout */ +#define CH_VAR_RETRY_TIMES 0x25 + +/* Bit flag in host file mode + * Bit 1 and bit 0, FAT file system flag of the logical disk, 00-FAT12, + * 01-FAT16, 10-FAT32, 11-Illegal Bit 2, whether the FAT table data in the + * current buffer has been modified, 0-unmodified, 1-modified Bit 3, the file + * length needs to be modified flag, the current file is appended with data, + * 0-no modification is required if it is not appended, 1-modification is + * required if it has been appended Other bits, reserved, do not modify */ +#define CH_VAR_FILE_BIT_FLAG 0x26 + +/* Disk and file status in host file mode */ +#define CH_VAR_DISK_STATUS 0x2B + +/* Bit flag of SD card in host file mode + * Bit 0, SD card version, 0-only supports SD first version, 1-supports SD + * second version bit 1, auto-identification, 0-SD card, 1-MMC card Bit 2, + * automatic identification, 0-standard capacity SD card, 1-high capacity SD + * card (HC-SD) bit 4, ACMD41 command timeout bit 5, CMD1 command timeout bit 6, + * CMD58 command timeout Other bits, reserved, do not modify */ +#define CH_VAR_SD_BIT_FLAG 0x30 + +/* Sync flag for BULK-IN/BULK-OUT endpoint of USB storage device + * bit 7, sync flag for Bulk-In endpoint + * bit 6, sync flag for Bulk-In endpoint + * Bit 5~Bit 0, must be 0 */ +#define CH_VAR_UDISK_TOGGLE 0x31 + +/* The logical unit number of the USB storage device + * Bit 7~Bit 4, the current logical unit number of the USB storage device, after + * CH376 initializes the USB storage device, the default is to access the 0# + * logical unit Bit 3~Bit 0, the maximum logical unit number of the USB storage + * device, plus 1 equals the number of logical units */ +#define CH_VAR_UDISK_LUN 0x34 + +/* Number of sectors per cluster of logical disk */ +#define CH_VAR_SEC_PER_CLUS 0x38 + +/* The index number of the current file directory information in the sector */ +#define CH_VAR_FILE_DIR_INDEX 0x3B + +/* The sector offset of the current file pointer in the cluster, if it is 0xFF, + * it points to the end of the file and the end of the cluster */ +#define CH_VAR_CLUS_SEC_OFS 0x3C + +/* 32-bit/4-byte variable + * For FAT16 disk, it is the number of sectors occupied by the root directory, + * and for FAT32 disk, it is the starting cluster number of the root directory + * (total length 32 bits, low byte first) */ +#define CH_VAR_DISK_ROOT 0x44 + +/* The total number of clusters of the logical disk(total length is 32 bits, low + * byte first) */ +#define CH_VAR_DSK_TOTAL_CLUS 0x48 + +/* The starting absolute sector number LBA of the logical disk(total length is + * 32 bits, low byte first) */ +#define CH_VAR_DSK_START_LBA 0x4C + +/* The starting LBA of the data area of ​​the logical disk (total length is + * 32 bits, low byte first) */ +#define CH_VAR_DSK_DAT_START 0x50 + +/* The LBA corresponding to the data in the current disk data buffer (total + * length is 32 bits, low byte first) */ +#define CH_VAR_LBA_BUFFER 0x54 + +/* The current read and write disk start LBA address (total length 32 bits, low + * byte first) */ +#define CH_VAR_LBA_CURRENT 0x58 + +/* LBA address of the sector where the current file directory information is + * located (total length 32 bits, low byte first) + */ +#define CH_VAR_FAT_DIR_LBA 0x5C + +/* The starting cluster number of the current file or directory (folder) (total + * length 32 bits, low byte first) */ +#define CH_VAR_START_CLUSTER 0x60 + +/* The current cluster number of the current file (total length is 32 bits, low + * byte first) */ +#define CH_VAR_CURRENT_CLUST 0x64 + +/* The length of the current file (total length is 32 bits, low byte first) */ +#define CH_VAR_FILE_SIZE 0x68 + +/* The current file pointer, the byte offset of the current read and write + * position(total length 32 bits, low byte first) */ +#define CH_VAR_CURRENT_OFFSET 0x6C + +#endif + +/* ******************************************************************************************************************/ +/* Common USB definitions */ + +/* USB packet identification PID, the host mode may be used */ +#ifndef DEF_USB_PID_SETUP +#define DEF_USB_PID_NULL 0x00 /* PID reserved, undefined */ +#define DEF_USB_PID_SOF 0x05 +#define DEF_USB_PID_SETUP 0x0D +#define DEF_USB_PID_IN 0x09 +#define DEF_USB_PID_OUT 0x01 +#define DEF_USB_PID_ACK 0x02 +#define DEF_USB_PID_NAK 0x0A +#define DEF_USB_PID_STALL 0x0E +#define DEF_USB_PID_DATA0 0x03 +#define DEF_USB_PID_DATA1 0x0B +#define DEF_USB_PID_PRE 0x0C +#endif + +/* USB request type, may be used in external firmware mode */ +#ifndef DEF_USB_REQ_TYPE +#define DEF_USB_REQ_READ 0x80 /* Control read operation */ +#define DEF_USB_REQ_WRITE 0x00 /* Control write operation */ +#define DEF_USB_REQ_TYPE 0x60 /* Control request type */ +#define DEF_USB_REQ_STAND 0x00 /* Standard Request */ +#define DEF_USB_REQ_CLASS 0x20 /* Device class request */ +#define DEF_USB_REQ_VENDOR 0x40 /* Vendor Request */ +#define DEF_USB_REQ_RESERVE 0x60 /* Reservation Request */ +#endif + +/* USB standard device request, Bit 6 of RequestType 5=00 (Standard), external + * firmware mode may be used */ +#ifndef DEF_USB_GET_DESCR +#define DEF_USB_CLR_FEATURE 0x01 +#define DEF_USB_SET_FEATURE 0x03 +#define DEF_USB_GET_STATUS 0x00 +#define DEF_USB_SET_ADDRESS 0x05 +#define DEF_USB_GET_DESCR 0x06 +#define DEF_USB_SET_DESCR 0x07 +#define DEF_USB_GET_CONFIG 0x08 +#define DEF_USB_SET_CONFIG 0x09 +#define DEF_USB_GET_INTERF 0x0A +#define DEF_USB_SET_INTERF 0x0B +#define DEF_USB_SYNC_FRAME 0x0C +#endif + +// desscriptor types for CMD1H_GET_DESCR +#ifndef CH375_USB_DEVICE_DESCRIPTOR +#define CH375_USB_DEVICE_DESCRIPTOR 0x01 +#define CH375_USB_CONFIGURATION_DESCRIPTOR 0x02 +#define CH375_USB_INTERFACE_DESCRIPTOR 0x04 +#define CH375_USB_ENDPOINT_DESCRIPTOR 0x05 +#endif + +/* ************************************************ + * **************************************************** ***************** */ + +#ifdef _cplusplus +} +#endif + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.c b/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.c new file mode 100644 index 00000000..7fdc71b5 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.c @@ -0,0 +1,9 @@ +#include "class_hub.h" +#include "protocol.h" +#include "usb_state.h" + +const setup_packet cmd_get_hub_descriptor = {RT_DEVICE_TO_HOST | RT_CLASS | RT_DEVICE, 6, {0, 0x29}, {0, 0}, 8}; + +usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1) { + return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h b/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h new file mode 100644 index 00000000..7d7c75da --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h @@ -0,0 +1,75 @@ +#ifndef __CLASS_HUB +#define __CLASS_HUB + +#include "ch376.h" +#include "protocol.h" +#include + +/* +wHubCharacteristics: + D1...D0: Logical Power Switching Mode + 00: Ganged power switching (all ports power at once) + 01: Individual port power switching + 1X: Reserved. Used only on 1.0 compliant hubs that implement no power switching + + D2: Identifies a Compound Device + 0: Hub is not part of a compound device. + 1: Hub is part of a compound device. + + D4...D3: Logical Power Switching Mode + 00: Global Over-current Protection. The hub reports over-current as a summation + of all ports’ current draw, without a breakdown of individual port + over-current status. + 01: Individual Port Over-current Protection. The hub reports over-current on a + per-port basis. Each port has an over-current status. + 1X: No Over-current Protection. This option is allowed only for bus-powered +*/ + +typedef struct { + uint8_t bDescLength; + uint8_t bDescriptorType; /* HUB Descriptor Type 0x29 */ + uint8_t bNbrPorts; /* Number of ports */ + uint16_t wHubCharacteristics; /* Bitmap Hub Characteristics (see above) */ + uint8_t bPwrOn2PwrGood; /* Time (*2 ms) from port power on to power good */ + uint8_t bHubContrCurrent; /* Maximum current used by hub controller (mA).*/ + uint8_t DeviceRemovable[1]; /* bits indicating deviceRemovable and portPwrCtrlMask */ +} hub_descriptor; + +typedef struct { + union { + struct { + uint8_t port_connection : 1; + uint8_t port_enable : 1; + uint8_t port_suspend : 1; + uint8_t port_over_current : 1; + uint8_t port_reset : 1; + uint8_t reserved : 3; + uint8_t port_power : 1; + uint8_t port_low_speed : 1; + uint8_t port_high_speed : 1; + uint8_t port_test : 1; + uint8_t port_indicator : 1; + }; + + uint16_t val; + + } wPortStatus; + + union { + struct { + uint8_t c_port_connection : 1; + uint8_t c_port_enable : 1; + uint8_t c_port_suspend : 1; + uint8_t c_port_over_current : 1; + uint8_t c_port_reset : 1; + }; + + uint16_t val; + + } wPortChange; + +} hub_port_status; + +usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/delay.h b/Source/HBIOS/ch376-native/source-doc/base-drv/delay.h new file mode 100644 index 00000000..05f9d1bf --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/delay.h @@ -0,0 +1,11 @@ +#ifndef __DELAY +#define __DELAY + +#include + +extern void delay(void); +extern void delay_20ms(void); +extern void delay_short(void); +extern void delay_medium(void); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c new file mode 100644 index 00000000..e30284ea --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c @@ -0,0 +1,101 @@ +/** + * @file transfers.c + * @author Dean Netherton + * @brief A simplest implementation of common usb transfer functions, based on the CH376S chip + * @details For a basic walkthrough of the usb protocol see https://www.beyondlogic.org/usbnutshell/usb1.shtml + * @version 1.0 + * @date 2023-09-22 + * + * @copyright Copyright (c) 2023 + * + */ + +#include "dev_transfers.h" +#include "ch376.h" +#include "delay.h" +#include "protocol.h" +#include + +/** + * @brief Perform a USB control transfer (in or out) + * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer + * + * @param device the usb device + * @param cmd_packet Pointer to the setup packet - top bit of bmRequestType indicate data direction + * @param buffer Pointer of data to send or receive into + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { + return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); +} + +usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { + + usb_error result; + + endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; + + result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); + + if (result == USB_ERR_STALL) { + usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + endpoint->toggle = 0; + return USB_ERR_STALL; + } + + RETURN_CHECK(result); +} + +usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { + + usb_error result; + + endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; + + result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); + + if (result == USB_ERR_STALL) { + usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + endpoint->toggle = 0; + return USB_ERR_STALL; + } + + RETURN_CHECK(result); +} + +usb_error usbdev_dat_in_trnsfer(device_config *const device, + uint8_t *const buffer, + const uint16_t buffer_size, + const usb_endpoint_type endpoint_type) { + + usb_error result; + + endpoint_param *const endpoint = &device->endpoints[endpoint_type]; + + result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + + if (result == USB_ERR_STALL) { + usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + endpoint->toggle = 0; + return USB_ERR_STALL; + } + + RETURN_CHECK(result); +} + +usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) { + + usb_error result; + + endpoint_param *const endpoint = &device->endpoints[0]; + + result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + + if (result == USB_ERR_STALL) { + usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + endpoint->toggle = 0; + return USB_ERR_STALL; + } + + RETURN_CHECK(result); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h new file mode 100644 index 00000000..23cf0001 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -0,0 +1,68 @@ +/** + * @file transfer.h + * @author Dean Netherton + * @brief A simplest implementation of common usb transfer functions, based on the CH376S chip + * @details For a basic walkthrough of the usb protocol see https://www.beyondlogic.org/usbnutshell/usb1.shtml + * @version 1.0 + * @date 2023-09-22 + * + * @copyright Copyright (c) 2023 + * + */ + +#ifndef __USBDEV_TRANSFERS +#define __USBDEV_TRANSFERS + +#include "ch376.h" +#include "transfers.h" +#include + +typedef struct { + + uint8_t number : 3; + uint16_t max_packet_sizex : 10; +} endpoint; + +// 3 bytes +#define COMMON_DEVICE_CONFIG \ + usb_device_type type : 4; \ + uint8_t address : 4; \ + uint8_t max_packet_size; \ + uint8_t interface_number; + +typedef struct { + COMMON_DEVICE_CONFIG + endpoint_param endpoints[3]; // bulk in/out and interrupt +} device_config; + +typedef struct { + COMMON_DEVICE_CONFIG // bytes: 0-2 + endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt + uint32_t current_lba; // bytes 12-15 + uint8_t drive_index; // byte 16 +} device_config_storage; + +typedef struct { + COMMON_DEVICE_CONFIG +} device_config_hub; + +typedef struct { + COMMON_DEVICE_CONFIG + endpoint_param endpoints[1]; // Isochronous +} device_config_keyboard; + +extern usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd, uint8_t *const buffer); + +extern usb_error usbdev_blk_out_trnsfer(device_config *const device, const uint8_t *const buffer, const uint16_t buffer_size); + +extern usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size); + +extern usb_error usbdev_dat_in_trnsfer(device_config *const device, + uint8_t *const buffer, + const uint16_t buffer_size, + const usb_endpoint_type endpoint_type); + +extern usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) + __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c new file mode 100644 index 00000000..86eca0a6 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -0,0 +1,221 @@ +#include "enumerate.h" +#include "enumerate_hub.h" +#include "enumerate_storage.h" +#include "protocol.h" +#include "work-area.h" +#include + +#include "print.h" + +usb_error op_id_class_drv(_working *const working) __sdcccall(1); +usb_error op_parse_endpoint(_working *const working) __sdcccall(1); + +void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) + __sdcccall(1) { + endpoint_param *const ep = &keyboard_config->endpoints[0]; + ep->number = pEndpoint->bEndpointAddress; + ep->toggle = 0; + ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); +} + +usb_device_type identify_class_driver(_working *const working) { + const interface_descriptor *const p = (const interface_descriptor *)working->ptr; + if (p->bInterfaceClass == 2) + return USB_IS_CDC; + + if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) + return USB_IS_MASS_STORAGE; + + if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) + return USB_IS_FLOPPY; + + if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) + return USB_IS_HUB; + + if (p->bInterfaceClass == 3) + return USB_IS_KEYBOARD; + + return USB_IS_UNKNOWN; +} + +usb_error op_interface_next(_working *const working) __z88dk_fastcall { + if (--working->interface_count == 0) + return USB_ERR_OK; + + return op_id_class_drv(working); +} + +usb_error op_endpoint_next(_working *const working) __sdcccall(1) { + if (--working->endpoint_count > 0) { + working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; + return op_parse_endpoint(working); + } + + return op_interface_next(working); +} + +usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { + const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; + device_config *const device = working->p_current_device; + + switch (working->usb_device) { + case USB_IS_FLOPPY: + case USB_IS_MASS_STORAGE: { + parse_endpoints(device, endpoint); + break; + } + + case USB_IS_KEYBOARD: { + parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); + break; + } + } + + return op_endpoint_next(working); +} + +usb_error +configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { + dev_cfg->interface_number = interface->bInterfaceNumber; + dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; + dev_cfg->address = working->current_device_address; + dev_cfg->type = working->usb_device; + + return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); +} + +usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { + const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + + usb_error result; + device_config_hub hub_config; + working->hub_config = &hub_config; + + hub_config.type = USB_IS_HUB; + CHECK(configure_device(working, interface, (device_config *const)&hub_config)); + RETURN_CHECK(configure_usb_hub(working)); +} + +usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { + usb_error result; + _usb_state *const work_area = get_usb_work_area(); + const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + + working->ptr += interface->bLength; + working->endpoint_count = interface->bNumEndpoints; + working->p_current_device = NULL; + + switch (working->usb_device) { + case USB_IS_HUB: { + CHECK(op_capture_hub_driver_interface(working)) + break; + } + + case USB_IS_UNKNOWN: { + device_config unkown_dev_cfg; + memset(&unkown_dev_cfg, 0, sizeof(device_config)); + working->p_current_device = &unkown_dev_cfg; + CHECK(configure_device(working, interface, &unkown_dev_cfg)); + break; + } + + default: { + device_config *dev_cfg = find_first_free(); + if (dev_cfg == NULL) + return USB_ERR_OUT_OF_MEMORY; + working->p_current_device = dev_cfg; + CHECK(configure_device(working, interface, dev_cfg)); + break; + } + } + + CHECK(op_parse_endpoint(working)); + + return result; +} + +usb_error op_id_class_drv(_working *const working) __sdcccall(1) { + usb_error result; + const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; + + working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; + + CHECK(op_cap_drv_intf(working)); + + return result; +} + +usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { + usb_error result; + + memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + + const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + + CHECK(usbtrn_gfull_cfg_desc(working->config_index, working->current_device_address, max_packet_size, MAX_CONFIG_SIZE, + working->config.buffer)); + + working->ptr = (working->config.buffer + sizeof(config_descriptor)); + working->interface_count = working->config.desc.bNumInterfaces; + + CHECK(op_id_class_drv(working)); + + return result; +} + +usb_error read_all_configs(enumeration_state *const state) { + uint8_t result; + _usb_state *const work_area = get_usb_work_area(); + + _working working; + memset(&working, 0, sizeof(_working)); + working.state = state; + + CHECK(usbtrn_get_descriptor(&working.desc)); + + state->next_device_address++; + working.current_device_address = state->next_device_address; + CHECK(usbtrn_set_address(working.current_device_address)); + + for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + working.config_index = config_index; + + CHECK(op_get_cfg_desc(&working)); + } + + return USB_ERR_OK; +} + +usb_error enumerate_all_devices(void) { + _usb_state *const work_area = get_usb_work_area(); + enumeration_state state; + memset(&state, 0, sizeof(enumeration_state)); + state.next_device_address = 0; + + usb_error result = read_all_configs(&state); + + work_area->count_of_detected_usb_devices = state.next_device_address; + + CHECK(result); + + return result; +} + +/* + enumerate_all_devices + -> read_all_configs + -> parse_config + -> op_get_cfg_desc + -> op_id_class_drv + -> op_cap_drv_intf (increment index) + -> op_parse_endpoint + -> parse_endpoints + -> parse_endpoint_hub + -> op_endpoint_next + -> op_parse_endpoint -^ (install driver endpoint) + -> op_interface_next + -> return + -> op_id_class_drv -^ + + +*/ diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h new file mode 100644 index 00000000..f8f971b7 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h @@ -0,0 +1,38 @@ +#ifndef __USB_ENUMERATE +#define __USB_ENUMERATE + +#include "ch376.h" +#include "protocol.h" +#include "usb_state.h" + +#define MAX_CONFIG_SIZE 140 + +typedef struct { + uint8_t next_device_address; +} enumeration_state; + +typedef struct __working { + enumeration_state *state; + + usb_device_type usb_device; + device_descriptor desc; + uint8_t config_index; + uint8_t interface_count; + uint8_t endpoint_count; + uint8_t current_device_address; + device_config_hub *hub_config; + + uint8_t *ptr; + device_config *p_current_device; + + union { + uint8_t buffer[MAX_CONFIG_SIZE]; + config_descriptor desc; + } config; + +} _working; + +extern usb_error read_all_configs(enumeration_state *const state); +extern usb_error enumerate_all_devices(void); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c new file mode 100644 index 00000000..63cde3bc --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c @@ -0,0 +1,80 @@ +#include "enumerate_hub.h" +#include "class_hub.h" +#include "delay.h" +#include "protocol.h" +#include "work-area.h" +#include + +const setup_packet cmd_set_feature = {RT_HOST_TO_DEVICE | RT_CLASS | RT_OTHER, SET_FEATURE, {FEAT_PORT_POWER, 0}, {1, 0}, 0}; +const setup_packet cmd_clear_feature = {RT_HOST_TO_DEVICE | RT_CLASS | RT_OTHER, CLEAR_FEATURE, {FEAT_PORT_POWER, 0}, {1, 0}, 0}; +const setup_packet cmd_get_status_port = { + RT_DEVICE_TO_HOST | RT_CLASS | RT_OTHER, GET_STATUS, {0, 0}, {1, 0}, sizeof(hub_port_status)}; + +usb_error hub_set_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { + setup_packet set_feature; + set_feature = cmd_set_feature; + + set_feature.bValue[0] = feature; + set_feature.bIndex[0] = index; + return usb_control_transfer(&set_feature, 0, hub_config->address, hub_config->max_packet_size); +} + +usb_error hub_clear_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { + setup_packet clear_feature; + clear_feature = cmd_clear_feature; + + clear_feature.bValue[0] = feature; + clear_feature.bIndex[0] = index; + return usb_control_transfer(&clear_feature, 0, hub_config->address, hub_config->max_packet_size); +} + +usb_error hub_get_status_port(const device_config_hub *const hub_config, const uint8_t index, hub_port_status *const port_status) { + setup_packet get_status_port; + get_status_port = cmd_get_status_port; + + get_status_port.bIndex[0] = index; + return usb_control_transfer(&get_status_port, port_status, hub_config->address, hub_config->max_packet_size); +} + +usb_error configure_usb_hub(_working *const working) __z88dk_fastcall { + _usb_state *const work_area = get_usb_work_area(); + + usb_error result; + hub_descriptor hub_description; + hub_port_status port_status; + const device_config_hub *const hub_config = working->hub_config; + + CHECK(hub_get_descriptor(hub_config, &hub_description)); + + uint8_t i = hub_description.bNbrPorts; + do { + CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); + + CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); + + hub_clear_feature(hub_config, FEAT_PORT_RESET, i); + + CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i)); + + CHECK(hub_get_status_port(hub_config, i, &port_status)); + + if (port_status.wPortStatus.port_connection) { + CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHANGE, i)); + + CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); + + CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); + delay_short(); + + CHECK(hub_get_status_port(hub_config, i, &port_status)); + delay_short(); + + CHECK(read_all_configs(working->state)); + + } else { + CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); + } + } while (--i != 0); + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.h b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.h new file mode 100644 index 00000000..32be6558 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.h @@ -0,0 +1,10 @@ +#ifndef __USB_ENUMERATE_HUB +#define __USB_ENUMERATE_HUB + +#include "enumerate.h" +#include "protocol.h" +#include "usb_state.h" + +extern usb_error configure_usb_hub(_working *const working) __z88dk_fastcall; + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c new file mode 100644 index 00000000..289182d9 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c @@ -0,0 +1,27 @@ +#include "enumerate_storage.h" +#include "protocol.h" +#include + +void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint) { + + if (!(pEndpoint->bmAttributes & 0x02)) + return; + + const uint8_t x = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); + endpoint_param *const eps = storage_dev->endpoints; + endpoint_param *ep; + + if (pEndpoint->bmAttributes & 0x01) { // 3 -> Interrupt + if (!(pEndpoint->bEndpointAddress & 0x80)) + return; + + ep = &eps[ENDPOINT_INTERRUPT_IN]; + + } else { + ep = (pEndpoint->bEndpointAddress & 0x80) ? &eps[ENDPOINT_BULK_IN] : &eps[ENDPOINT_BULK_OUT]; + } + + ep->number = pEndpoint->bEndpointAddress & 0x07; + ep->toggle = 0; + ep->max_packet_sizex = x; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h new file mode 100644 index 00000000..3f4a3508 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h @@ -0,0 +1,8 @@ +#ifndef __USB_ENUMERATE_STORAGE +#define __USB_ENUMERATE_STORAGE + +#include "protocol.h" + +extern void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h new file mode 100644 index 00000000..179a5267 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h @@ -0,0 +1,6 @@ +#ifndef _HBIOS_H_ +#define _HBIOS_H_ + +extern void dio_add_entry(const uint16_t fnc_table[], const device_config_storage *const storage_device) __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.c b/Source/HBIOS/ch376-native/source-doc/base-drv/print.c new file mode 100644 index 00000000..bcec3e82 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/print.c @@ -0,0 +1,9 @@ +#include "print.h" + +void print_device_mounted(const char *const description, const uint8_t count) { + print_string("\r\n $"); + print_uint16(count); + print_string(description); + if (count > 1) + print_string("S$"); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h new file mode 100644 index 00000000..7b4c4723 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h @@ -0,0 +1,11 @@ +#ifndef __XPRINT +#define __XPRINT + +#include + +extern void print_hex(const char c) __z88dk_fastcall; +extern void print_string(const char *p) __z88dk_fastcall; +extern void print_uint16(const uint16_t n) __z88dk_fastcall; +extern void print_device_mounted(const char *const description, const uint8_t count); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c new file mode 100644 index 00000000..0b09bcdf --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c @@ -0,0 +1,152 @@ +/** + * @file protocol.c + * @author Dean Netherton + * @brief A simplest implementation of common usb transfer functions, based on the CH376S chip + * @details For a basic walkthrough of the usb protocol see https://www.beyondlogic.org/usbnutshell/usb1.shtml + * @version 1.0 + * @date 2023-09-22 + * + * @copyright Copyright (c) 2023 + * + */ + +#include "protocol.h" +#include "ch376.h" +#include "delay.h" +#include + +#include "print.h" + +const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; + +/** + * @brief Issue GET_DESCRIPTOR request to retrieve the device descriptor for usb device at address 0 + * + * @param buffer the buffer to store the device descriptor in + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { + usb_error result; + setup_packet cmd; + cmd = cmd_get_device_descriptor; + cmd.wLength = 8; + + result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); + + CHECK(result); + + cmd = cmd_get_device_descriptor; + cmd.wLength = 18; + result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); + + RETURN_CHECK(result); +} + +/** + * @brief Issue GET_DESCRIPTOR request to retrieve the device descriptor for usb device at the specified address + * + * @param buffer the buffer to store the device descriptor in + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { + usb_error result; + setup_packet cmd; + cmd = cmd_get_device_descriptor; + cmd.wLength = 8; + + result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); + + CHECK(result); + + cmd = cmd_get_device_descriptor; + cmd.wLength = 18; + RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); +} + +const setup_packet cmd_set_device_address = {0x00, 5, {0, 0}, {0, 0}, 0}; + +/** + * @brief configure device at address 0 to be assigned a new device address + * + * @param device_address the new device address + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { + setup_packet cmd; + cmd = cmd_set_device_address; + cmd.bValue[0] = device_address; + + return usb_control_transfer(&cmd, 0, 0, 0); +} + +const setup_packet cmd_set_configuration = {0x00, 9, {0, 0}, {0, 0}, 0}; + +/** + * @brief configure device at address 0 to be assigned a new configuration + * + * @param config the device to be configured + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { + setup_packet cmd; + cmd = cmd_set_configuration; + cmd.bValue[0] = configuration; + + return usb_control_transfer(&cmd, 0, device_address, max_packet_size); +} + +const setup_packet cmd_get_config_descriptor = {0x80, 6, {0, 2}, {0, 0}, 0}; + +/** + * @brief request the config descriptor for the specific config index of the specified device + * + * @param buffer the buffer to store the config descriptor in + * @param config_index the index of the config descriptor to retrieve + * @param buffer_size the size of the buffer + * @param device_address the usb address of the device + * @param max_packet_size the max packet size for control transfers (endpoint 0) + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, + const uint8_t config_index, + const uint8_t buffer_size, + const uint8_t device_address, + const uint8_t max_packet_size) { + setup_packet cmd; + cmd = cmd_get_config_descriptor; + cmd.bValue[0] = config_index; + cmd.wLength = (uint16_t)buffer_size; + + RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size)); +} + +usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, + const uint8_t device_address, + const uint8_t max_packet_size, + const uint8_t max_buffer_size, + uint8_t *const buffer) { + usb_error result; + + CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, sizeof(config_descriptor), device_address, + max_packet_size)); + + uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; + if (max_length > max_buffer_size) + max_length = max_buffer_size; + + CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); + + return USB_ERR_OK; +} + +const setup_packet usb_cmd_clear_endpoint_halt = {2, 1, {0, 0}, {255, 0}, 0}; // ;byte 4 is the endpoint to be cleared + +usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { + setup_packet cmd; + cmd = usb_cmd_clear_endpoint_halt; + cmd.bIndex[0] = endpoint_number; + + usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); + + RETURN_CHECK(result); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h new file mode 100644 index 00000000..df622b44 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h @@ -0,0 +1,82 @@ +#ifndef __HW +#define __HW + +#include "ch376.h" +#include "dev_transfers.h" +#include "transfers.h" +#include + +typedef struct _device_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t bcdUSB; + uint8_t bDeviceClass; + uint8_t bDeviceSubClass; + uint8_t bDeviceProtocol; + uint8_t bMaxPacketSize0; + uint16_t idVendor; + uint16_t idProduct; + uint16_t bcdDevice; + uint8_t iManufacturer; + uint8_t iProduct; + uint8_t iSerialNumber; + uint8_t bNumConfigurations; +} device_descriptor; + +typedef struct _config_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationvalue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} config_descriptor; + +typedef struct _interface_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +} interface_descriptor, *p_interface_descriptor; + +typedef struct _endpoint_descriptor { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} endpoint_descriptor; + +extern usb_error usbtrn_get_descriptor(device_descriptor *const buffer); +extern usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address); + +extern usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, + const uint8_t config_index, + const uint8_t buffer_size, + const uint8_t device_address, + const uint8_t max_packet_size); + +extern usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, + const uint8_t device_address, + const uint8_t max_packet_size, + const uint8_t max_buffer_size, + uint8_t *const buffer); + +extern usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration); + +extern usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall; + +extern usb_error +usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size); + +// extern usb_error usb_clear_endpoint_halt(device_config *const storage_device, const usb_endpoint_type endpoint_type); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c new file mode 100644 index 00000000..883ec873 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -0,0 +1,172 @@ +/** + * @file transfers.c + * @author Dean Netherton + * @brief A simplest implementation of common usb transfer functions, based on the CH376S chip + * @details For a basic walkthrough of the usb protocol see https://www.beyondlogic.org/usbnutshell/usb1.shtml + * @version 1.0 + * @date 2023-09-22 + * + * @copyright Copyright (c) 2023 + * + */ + +#include "transfers.h" +#include "ch376.h" +#include "delay.h" +#include "z80.h" +#include + +#define LOWER_SAFE_RAM_ADDRESS 0x8000 + +usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, + void *const buffer, + const uint8_t device_address, + const uint8_t max_packet_size) { + if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) + return USB_BAD_ADDRESS; + + if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + return USB_BAD_ADDRESS; + + return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); +} + +/** + * @brief Perform a USB control transfer (in or out) + * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer + * + * @param cmd_packet Pointer to the setup packet - top bit of bmRequestType indicate data direction + * @param buffer Pointer of data to send or receive into + * @param device_address usb device address + * @param max_packet_size Maximum packet size for endpoint + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error usb_control_transfer(const setup_packet *const cmd_packet, + void *const buffer, + const uint8_t device_address, + const uint8_t max_packet_size) { + usb_error result; + endpoint_param endpoint = {1, 0, max_packet_size}; + + const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); + + if (transferIn && buffer == 0) + return USB_ERR_OTHER; + + ch_set_usb_address(device_address); + + ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); + ch_issue_token_setup(); + CHECK(ch_short_wait_int_and_get_status()) + + const uint16_t length = cmd_packet->wLength; + + result = length != 0 + ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) + : USB_ERR_OK; + + CHECK(result) + + if (transferIn) { + ch_command(CH_CMD_WR_HOST_DATA); + CH376_DATA_PORT = 0; + delay(); + ch_issue_token_out_ep0(); + result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ + + if (result == USB_ERR_OK || result == USB_ERR_STALL) + return USB_ERR_OK; + + RETURN_CHECK(result); + } + + ch_issue_token_in_ep0(); + result = ch_long_wait_int_and_get_status(); + + RETURN_CHECK(result); +} + +usb_error +usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + return USB_BAD_ADDRESS; + + if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) + return USB_BAD_ADDRESS; + + return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); +} + +usb_error +usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) + return USB_BAD_ADDRESS; + + if (((uint16_t)endpoint & 0xC000) == 0) + return USB_BAD_ADDRESS; + + if (((uint16_t)buffer_size & 0xC000) == 0) + return USB_BAD_ADDRESS; + + return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); +} + +/** + * @brief Perform a USB data in on the specififed endpoint + * + * @param buffer the buffer to receive the data + * @param buffer_size the maximum size of data to be received + * @param device_address the usb address of the device + * @param endpoint the usb endpoint to receive from (toggle of endpoint is updated) + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error +usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + ch_set_usb_address(device_address); + + return ch_data_in_transfer(buffer, buffer_size, endpoint); +} + +/** + * @brief Perform a USB data in on the specififed endpoint + * + * @param buffer the buffer to receive the data - must be 62 bytes + * @param buffer_size on exit the actual size of data received + * @param device_address the usb address of the device + * @param endpoint the usb endpoint to receive from (toggle of endpoint is updated) + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error +usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + ch_set_usb_address(device_address); + + return ch_data_in_transfer_n(buffer, buffer_size, endpoint); +} + +usb_error +usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + + if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + return USB_BAD_ADDRESS; + + if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) + return USB_BAD_ADDRESS; + + return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint); +} + +/** + * @brief Perform a USB data out on the specififed endpoint + * + * @param buffer the buffer to send the data from + * @param buffer_size the maximum size of data to be sent + * @param device_address the usb address of the device + * @param endpoint the usb endpoint to send to (toggle of endpoint is updated) + * @return usb_error USB_ERR_OK if all good, otherwise specific error code + */ +usb_error +usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + ch_set_usb_address(device_address); + + return ch_data_out_transfer(buffer, buffer_size, endpoint); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.h new file mode 100644 index 00000000..b3d9d3ca --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.h @@ -0,0 +1,103 @@ +/** + * @file transfer.h + * @author Dean Netherton + * @brief A simplest implementation of common usb transfer functions, based on the CH376S chip + * @details For a basic walkthrough of the usb protocol see https://www.beyondlogic.org/usbnutshell/usb1.shtml + * @version 1.0 + * @date 2023-09-22 + * + * @copyright Copyright (c) 2023 + * + */ + +#ifndef __USB_TRANSFERS +#define __USB_TRANSFERS + +#include "ch376.h" +#include + +#define GET_STATUS 0 +#define CLEAR_FEATURE 1 +#define SET_FEATURE 3 +#define GET_DESCRIPTOR 6 +#define SET_DESCRIPTOR 7 +#define CLEAR_TT_BUFFER 8 +#define RESET_TT 9 +#define GET_TT_STATE 10 +#define CSTOP_TT 11 + +#define FEAT_PORT_POWER 8 +#define FEAT_PORT_RESET 4 +#define HUB_FEATURE_PORT_CONNECTION_CHANGE 16 +#define FEAT_PORT_ENABLE_CHANGE 17 +#define FEAT_PORT_RESET_CHANGE 20 + +// HUB_FEATURE_PORT_CONNECTION = 0, +// HUB_FEATURE_PORT_ENABLE = 1, +// HUB_FEATURE_PORT_SUSPEND = 2, +// HUB_FEATURE_PORT_OVER_CURRENT = 3, +// HUB_FEATURE_PORT_RESET = 4, + +// HUB_FEATURE_PORT_POWER = 8, +// HUB_FEATURE_PORT_LOW_SPEED = 9, + +// HUB_FEATURE_PORT_CONNECTION_CHANGE = 16, +// HUB_FEATURE_PORT_ENABLE_CHANGE = 17, +// HUB_FEATURE_PORT_SUSPEND_CHANGE = 18, +// HUB_FEATURE_PORT_OVER_CURRENT_CHANGE = 19, +// HUB_FEATURE_PORT_RESET_CHANGE = 20, +// HUB_FEATURE_PORT_TEST = 21, +// HUB_FEATURE_PORT_INDICATOR = 22 + +#define RT_HOST_TO_DEVICE 0b00000000 +#define RT_DEVICE_TO_HOST 0b10000000 +#define RT_STANDARD 0b00000000 +#define RT_CLASS 0b00100000 +#define RT_VENDOR 0b01000000 +#define RT_DEVICE 0b00000000 +#define RT_INTERFACE 0b00000001 +#define RT_ENDPOINT 0b00000010 +#define RT_OTHER 0b00000011 + +typedef struct _setup_packet { + uint8_t bmRequestType; + uint8_t bRequest; + uint8_t bValue[2]; + uint8_t bIndex[2]; + uint16_t wLength; +} setup_packet; + +enum libusb_request_type { + LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), + LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), + LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), + LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5), +}; + +enum libusb_request_recipient { + LIBUSB_RECIPIENT_DEVICE = 0x00, + LIBUSB_RECIPIENT_INTERFACE = 0x01, + LIBUSB_RECIPIENT_ENDPOINT = 0x02, + LIBUSB_RECIPIENT_OTHER = 0x03, +}; + +enum libusb_endpoint_direction { + LIBUSB_ENDPOINT_IN = 0x80, + LIBUSB_ENDPOINT_OUT = 0x00, +}; + +extern usb_error usb_control_transfer(const setup_packet *const cmd_packet, + void *const buffer, + const uint8_t device_address, + const uint8_t max_packet_size); + +extern usb_error +usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint); + +extern usb_error +usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint); + +extern usb_error +usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c new file mode 100644 index 00000000..84b14855 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -0,0 +1,9 @@ +#include "usb-base-drv.h" + +/* The total number of mounted storage devices (scsi and ufi) */ +uint8_t storage_count = 0; + +uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { + storage_device->current_lba = lba; + return 0; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h new file mode 100644 index 00000000..3d2abd53 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -0,0 +1,11 @@ +#ifndef __USB_BASE_DRV +#define __USB_BASE_DRV + +#include +#include + +extern uint8_t storage_count; + +extern uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c new file mode 100644 index 00000000..a76a7e3a --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c @@ -0,0 +1,56 @@ +#include "ch376.h" +#include "enumerate.h" +#include "print.h" +#include "work-area.h" +#include "z80.h" +#include + +static usb_error usb_host_bus_reset(void) { + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_configure_nak_retry_3s(); + + return USB_ERR_OK; +} + +#define ERASE_LINE "\x1B\x6C\r$" + +void chnative_init(void) { + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + + ch_cmd_reset_all(); + + delay_medium(); + + if (!ch_probe()) { + print_string("\r\nCH376: NOT PRESENT$"); + return; + } + + print_string("\r\nCH376: PRESENT (VER $"); + print_hex(ch_cmd_get_ic_version()); + print_string("); $"); + + usb_host_bus_reset(); + + for (uint8_t i = 0; i < 4; i++) { + const uint8_t r = ch_very_short_wait_int_and_get_status(); + + if (r == USB_INT_CONNECT) { + print_string("USB: CONNECTED$"); + + enumerate_all_devices(); + + return; + } + } + + print_string("USB: DISCONNECTED$"); +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c new file mode 100644 index 00000000..1138c9fe --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -0,0 +1,90 @@ +#include "usb_state.h" +#include "work-area.h" + +const uint8_t device_config_sizes[_USB_LAST_DEVICE_TYPE] = { + 0, /* USB_NOT_SUPPORTED = 0 */ + sizeof(device_config_storage), /* USB_IS_FLOPPY = 1 */ + sizeof(device_config_storage), /* USB_IS_MASS_STORAGE = 2 */ + sizeof(device_config), /* USB_IS_CDC = 3 */ + sizeof(device_config_keyboard), /* USB_IS_KEYBOARD = 4 */ +}; + +// always usb work area +device_config *find_device_config(const usb_device_type requested_type) { + _usb_state *const p = get_usb_work_area(); + + const device_config *p_config = first_device_config(p); + while (p_config) { + const uint8_t type = p_config->type; + + if (type == requested_type) + return (device_config *)p_config; + + p_config = next_device_config(p, p_config); + }; + + return NULL; +} + +// always search in boot +device_config *find_first_free(void) { + _usb_state *const boot_state = get_usb_work_area(); + + uint8_t c = 0; + device_config *p = first_device_config(boot_state); + while (p) { + if (p->type == 0) + return p; + + p = next_device_config(boot_state, p); + } + + return NULL; +} + +device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } + +device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { + if (p->type == 0) + return NULL; + + const uint8_t size = device_config_sizes[p->type]; + // TODO: bug when size is zero we dont increment the pointer + // but if we abort on size 0 - we fail to pick up other devices??? + // we should not get size of 0 unless the size entry is missing + // if (size == 0) + // return NULL; + + const uint8_t *_p = (uint8_t *)p; + device_config *const result = (device_config *)(_p + size); + + if (result >= (device_config *)&usb_state->device_configs_end) + return NULL; + + return result; +} + +// always usb work area +device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { + const _usb_state *const usb_state = get_usb_work_area(); + + uint8_t counter = 1; + + for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + if (p->type == USB_IS_FLOPPY) { + if (counter == device_index) + return p; + counter++; + } + } + + for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + if (p->type == USB_IS_MASS_STORAGE) { + if (counter == device_index) + return p; + counter++; + } + } + + return NULL; // is not a usb device +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h new file mode 100644 index 00000000..87821f27 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h @@ -0,0 +1,27 @@ +#ifndef __USB_STATE +#define __USB_STATE + +#include "ch376.h" +#include "protocol.h" +#include + +#define MAX_NUMBER_OF_DEVICES 6 +#define DEVICE_CONFIG_STRUCT_SIZE sizeof(device_config_storage) /* Assumes is largest struct */ + +typedef struct __usb_state { + uint8_t active : 1; /* if true, a usb operation/interrupt handler is active, prevent re-entrant */ + uint8_t reserved : 7; + uint8_t count_of_detected_usb_devices; + uint8_t device_configs[DEVICE_CONFIG_STRUCT_SIZE * MAX_NUMBER_OF_DEVICES]; + + uint8_t device_configs_end; // always zero to mark end +} _usb_state; + +extern device_config *find_first_free(void); +extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1); +extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1); +extern device_config *find_device_config(const usb_device_type requested_type); + +extern device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/work-area.c b/Source/HBIOS/ch376-native/source-doc/base-drv/work-area.c new file mode 100644 index 00000000..fb7f46bd --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/work-area.c @@ -0,0 +1,3 @@ +#include "usb_state.h" + +_usb_state x = {0, 0, 0}; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/work-area.h b/Source/HBIOS/ch376-native/source-doc/base-drv/work-area.h new file mode 100644 index 00000000..354f0697 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/work-area.h @@ -0,0 +1,54 @@ +#ifndef __WORK_AREA +#define __WORK_AREA + +#include "ch376.h" +#include "protocol.h" +#include "stdlib.h" +#include "usb_state.h" + +#define PRES_CF 1 /* BIT MASK FOR COMPACTFLASH PRESENT */ +#define PRES_MS 2 /* BIT MASK FOR MSX MUSIC NOR FLASH PRESENT */ +#define PRES_USB1 4 /* BIT MASK FOR USB1 STORAGE PRESENT AT BOOT UP */ +#define PRES_USB2 8 /* BIT MASK FOR USB2 STORAGE PRESENT AT BOOT UP */ +#define PRES_USB3 16 /* BIT MASK FOR USB3 STORAGE PRESENT AT BOOT UP */ +#define PRES_USB4 32 /* BIT MASK FOR USB4 STORAGE PRESENT AT BOOT UP */ +#define PRES_CH376 128 /* BIT MASK FOR CH376 PRESENT AT BOOT UP */ + +#define BIT_PRES_CF 0 /* BIT POSTION FOR COMPACTFLASH PRESENT */ +#define BIT_PRES_MS 1 /* BIT POSTION FOR MSX MUSIC NOR FLASH PRESENT */ +#define BIT_PRES_USB1 2 /* BIT POSTION FOR USB1 STORAGE PRESENT */ +#define BIT_PRES_USB2 3 /* BIT POSTION FOR USB2 STORAGE PRESENT */ +#define BIT_PRES_USB3 4 /* BIT POSTION FOR USB3 STORAGE PRESENT */ +#define BIT_PRES_USB4 5 /* BIT POSTION FOR USB4 STORAGE PRESENT */ +#define BIT_PRES_CH376 7 /* BIT POSTION FOR CH376 PRESENT */ + +typedef enum { + DEV_MAP_NONE = 0, + DEV_MAP_ROM = 1, + DEV_MAP_CF = 2, + DEV_MAP_MS = 3, + DEV_MAP_USB1 = 4, + DEV_MAP_USB2 = 5, + DEV_MAP_USB3 = 6, + DEV_MAP_USB4 = 7 +} device_map; + +typedef struct _work_area { + uint8_t read_count; /* COUNT OF SECTORS TO BE READ */ + uint16_t index; /* sector number to be read */ + uint8_t *dest; /* destination write address */ + uint8_t read_count_requested; /* number of sectors requested */ + uint8_t present; /* BIT FIELD FOR DETECTED DEVICES + (BIT 0 -> COMPACTFLASH/IDE, BIT 1-> MSX-MUSIC NOR FLASH, BITS 2-5 FOR USB)*/ + _usb_state ch376; +} work_area; + +// extern work_area *get_work_area(void); + +extern uint8_t get_number_of_usb_drives(void); + +extern _usb_state x; + +#define get_usb_work_area() (&x) + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h b/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h new file mode 100644 index 00000000..d9eaf0bb --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h @@ -0,0 +1,17 @@ +#ifndef __Z80_HELPERS +#define __Z80_HELPERS + +#include + +#define EI __asm__("EI"); +#define DI __asm__("DI"); +#define HALT __asm__("HALT"); + +typedef void (*jump_fn_t)(void) __z88dk_fastcall; + +typedef struct { + uint8_t jump_op_code; // JMP or CALL + jump_fn_t address; +} z80_jump_t; + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh new file mode 100755 index 00000000..ad00b407 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +# Check if exactly two arguments are provided +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +source_file="$1" +destination_file="$2" + +rm -f "$destination_file" + +# create a unique prefix for all generated labels +prefix=$(basename "$source_file" | cut -d. -f1 | tr '-' '_') + +sed -E \ + -e "1i\;\r\n; Generated from source-doc/${source_file} -- not to be modify directly\r\n;\r\n; " \ + -e '/SECTION IGNORE/d' \ + -e '/\sEXTERN\s/d' \ + -e '/\sGLOBAL\s/d' \ + -e '/SECTION .*/d' \ + -e 's/^IF 0/#IF 0/g' \ + -e 's/^ENDIF/#ENDIF/g' \ + -e 's/\s+cp\s+a,\((ix\+[0-9-]+)\)/\tcp\t\(\1\)/g' \ + -e 's/\s+sub\s+a,\((iy\+[0-9]+)\)/\tsub\t\(\1\)/g' \ + -e 's/\s+sub\s+a,\((ix\+[0-9]+)\)/\tsub\t\(\1\)/g' \ + -e 's/\s+sub\s+a,\((ix-[0-9]+)\)/\tsub\t\(\1\)/g' \ + -e 's/\s+or\s+a,\((ix\+[0-9-]+)\)/\tor\t\(\1\)/g' \ + -e 's/\s+or\s+a,\((ix\-[0-9-]+)\)/\tor\t\(\1\)/g' \ + -e 's/\s+or\s+a,\((iy\+[0-9-]+)\)/\tor\t\(\1\)/g' \ + -e 's/\s+cp\s+a,(0x[0-9A-Fa-f]{2})/\tcp\t\1/g' \ + -e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \ + -e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \ + -e 's/\s+and\s+a,(0x[0-9A-Fa-f]{2})/\tand\t\1/g' \ + -e 's/\s+sub\s+a,(0x[0-9A-Fa-f]{2})/\tsub\t\1/g' \ + -e 's/\s+cp\s+a,\s*a/\tcp\ta/g' \ + -e 's/\s+or\s+a,\s*a/\tor\ta/g' \ + -e 's/\s+xor\s+a,\s*a/\txor\ta/g' \ + -e 's/\s+or\s+a,\s*(b|c|d|e|h|l|iyl|iyh|ixl|ixh)/\tor\t\1/g' \ + -e 's/\s+sub\s+a,\s+(b|c|d|e|h|l|iyl|iyh|ixl|ixh)/\tsub\t\1/g' \ + -e 's/\b([a-zA-Z0-9_]{31})[a-zA-Z0-9_]+\b/\1/g' \ + -e 's/;\t+/; /g' \ + -e 's/defc\s+([a-zA-Z0-9_]+)\s*=\s*(0x[0-9A-Fa-f]+)/\1\t.EQU\t\2/' \ + -e "s/___str_([0-9]+)/${prefix}_str_\1/g" \ + "$source_file" > "$destination_file" + + + # -e '/IF 0/d' \ + # -e '/ENDIF/d' \ diff --git a/Source/HBIOS/ch376-native/source-doc/depends.d b/Source/HBIOS/ch376-native/source-doc/depends.d new file mode 100644 index 00000000..5d2e46b4 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/depends.d @@ -0,0 +1,106 @@ + +./base-drv/dev_transfers.c.s: source-doc/base-drv/dev_transfers.c \ + source-doc/base-drv/dev_transfers.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/protocol.h +./base-drv/enumerate.c.s: source-doc/base-drv/enumerate.c \ + source-doc/base-drv/enumerate.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/usb_state.h \ + source-doc/base-drv/enumerate_hub.h \ + source-doc/base-drv/enumerate_storage.h source-doc/base-drv/work-area.h \ + source-doc/base-drv/print.h +./base-drv/usb_state.c.s: source-doc/base-drv/usb_state.c \ + source-doc/base-drv/usb_state.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/work-area.h +./base-drv/class_hub.c.s: source-doc/base-drv/class_hub.c \ + source-doc/base-drv/class_hub.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/usb_state.h +./base-drv/enumerate_storage.c.s: source-doc/base-drv/enumerate_storage.c \ + source-doc/base-drv/enumerate_storage.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h +./base-drv/enumerate_hub.c.s: source-doc/base-drv/enumerate_hub.c \ + source-doc/base-drv/enumerate_hub.h source-doc/base-drv/enumerate.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/dev_transfers.h source-doc/base-drv/transfers.h \ + source-doc/base-drv/usb_state.h source-doc/base-drv/class_hub.h \ + source-doc/base-drv/work-area.h +./base-drv/usb-base-drv.c.s: source-doc/base-drv/usb-base-drv.c \ + source-doc/base-drv/usb-base-drv.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/transfers.h +./base-drv/transfers.c.s: source-doc/base-drv/transfers.c \ + source-doc/base-drv/transfers.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/z80.h +./base-drv/print.c.s: source-doc/base-drv/print.c source-doc/base-drv/print.h +./base-drv/ch376.c.s: source-doc/base-drv/ch376.c source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/print.h +./base-drv/protocol.c.s: source-doc/base-drv/protocol.c source-doc/base-drv/protocol.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/print.h +./base-drv/work-area.c.s: source-doc/base-drv/work-area.c \ + source-doc/base-drv/usb_state.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h +./base-drv/usb-init.c.s: source-doc/base-drv/usb-init.c source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/enumerate.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/dev_transfers.h source-doc/base-drv/transfers.h \ + source-doc/base-drv/usb_state.h source-doc/base-drv/print.h \ + source-doc/base-drv/work-area.h source-doc/base-drv/z80.h +./ufi-drv/ufi-init.c.s: source-doc/ufi-drv/ufi-init.c source-doc/ufi-drv/class_ufi.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/ufi-drv/usb_cbi.h \ + source-doc/base-drv/dev_transfers.h source-doc/base-drv/usb_state.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/hbios.h \ + source-doc/base-drv/print.h source-doc/base-drv/usb-base-drv.h \ + source-doc/base-drv/work-area.h source-doc/base-drv/usb_state.h +./ufi-drv/usb_cbi.c.s: source-doc/ufi-drv/usb_cbi.c source-doc/ufi-drv/usb_cbi.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/transfers.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h +./ufi-drv/class_ufi.c.s: source-doc/ufi-drv/class_ufi.c \ + source-doc/ufi-drv/class_ufi.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/dev_transfers.h source-doc/base-drv/transfers.h \ + source-doc/ufi-drv/usb_cbi.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/usb_state.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/delay.h source-doc/base-drv/z80.h +./scsi-drv/scsi-init.c.s: source-doc/scsi-drv/scsi-init.c \ + source-doc/scsi-drv/class_scsi.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/ch376.h \ + source-doc/base-drv/enumerate.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/usb_state.h source-doc/base-drv/hbios.h \ + source-doc/base-drv/print.h source-doc/base-drv/usb-base-drv.h \ + source-doc/base-drv/dev_transfers.h source-doc/base-drv/work-area.h \ + source-doc/base-drv/z80.h +./scsi-drv/class_scsi.c.s: source-doc/scsi-drv/class_scsi.c \ + source-doc/scsi-drv/class_scsi.h source-doc/base-drv/protocol.h \ + source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ + source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ + source-doc/base-drv/transfers.h source-doc/base-drv/usb_state.h \ + source-doc/base-drv/protocol.h source-doc/base-drv/z80.h +## +./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./print.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s +## +./scsi-drv.s: scsi-drv/./scsi-init.c.s scsi-drv/./class_scsi.c.s +## +./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c new file mode 100644 index 00000000..c554e345 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -0,0 +1,168 @@ +#include "class_scsi.h" +#include +#include +#include + +_scsi_command_block_wrapper scsi_command_block_wrapper = {{0x55, 0x53, 0x42, 0x43}, {0, 0}, 0, 0, 0, 0}; + +uint16_t next_tag = 0; + +_scsi_command_status_wrapper csw = {{{0}}}; +usb_error do_scsi_cmd(device_config_storage *const dev, + _scsi_command_block_wrapper *const cbw, + void *const send_receive_buffer, + const bool send) { + + cbw->dCBWTag[0] = next_tag++; + + if (!send) + cbw->bmCBWFlags = 0x80; + + CHECK(usb_data_out_transfer((uint8_t *)cbw, sizeof(_scsi_command_block_wrapper) + 16, dev->address, + &dev->endpoints[ENDPOINT_BULK_OUT])); + + if (cbw->dCBWDataTransferLength != 0) { + if (!send) { + CHECK(usb_data_in_transfer(send_receive_buffer, (uint16_t)cbw->dCBWDataTransferLength, dev->address, + &dev->endpoints[ENDPOINT_BULK_IN])); + + } else { + CHECK(usb_data_out_transfer(send_receive_buffer, (uint16_t)cbw->dCBWDataTransferLength, dev->address, + &dev->endpoints[ENDPOINT_BULK_OUT])); + } + } + + CHECK( + usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); + + if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) + return USB_ERR_FAIL; + + return USB_ERR_OK; +} + +_scsi_read_capacity scsi_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; + +usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { + cbw_scsi_read_capacity cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + cbw_scsi.read_capacity = scsi_read_capacity; + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); + cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + + return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +} + +_scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; + +usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { + cbw_scsi_inquiry cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + cbw_scsi.inquiry = scsi_packet_inquiry; + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); + cbw_scsi.cbw.dCBWDataTransferLength = 0x24; + + return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +} + +usb_error scsi_test(device_config_storage *const dev) { + cbw_scsi_test cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); + cbw_scsi.cbw.dCBWDataTransferLength = 0; + + return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +} + +_scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}}; + +usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { + cbw_scsi_request_sense cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + cbw_scsi.request_sense = scsi_packet_request_sense; + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); + cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); + + return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +} + +usb_error scsi_sense_init(device_config_storage *const dev) { + scsi_sense_result response; + uint8_t counter = 3; + + while ((result = scsi_test(dev)) && --counter > 0) + scsi_request_sense(dev, &response); + + return result; +} + +static cbw_scsi_read_write cbw = {{{0}}}; + +usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + cbw.cbw = scsi_command_block_wrapper; + + cbw.cbw.bCBWLUN = 0; + cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + cbw.cbw.dCBWDataTransferLength = 512; + + cbw.scsi_cmd.operation_code = 0x28; // read operation + cbw.scsi_cmd.transfer_len[1] = 1; + cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + cbw.scsi_cmd.lba[3] = dev->current_lba; + + result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + + if (result == USB_ERR_OK) + dev->current_lba++; + return result; +} + +usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + cbw.cbw = scsi_command_block_wrapper; + + cbw.cbw.bCBWLUN = 0; + cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + cbw.cbw.dCBWDataTransferLength = 512; + + cbw.scsi_cmd.operation_code = 0x2A; // write operation + cbw.scsi_cmd.transfer_len[1] = 1; + cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + cbw.scsi_cmd.lba[3] = dev->current_lba; + + result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + + if (result == USB_ERR_OK) + dev->current_lba++; + return result; +} + +usb_error scsi_eject(device_config_storage *const dev) { + cbw_scsi_eject cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + + memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); + + cbw_scsi.eject.operation_code = 0x1B; + cbw_scsi.eject.loej = 1; + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); + cbw_scsi.cbw.dCBWDataTransferLength = 0; + + return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +} diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h new file mode 100644 index 00000000..356da856 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -0,0 +1,196 @@ +#ifndef __CLASS_SCSI +#define __CLASS_SCSI + +#include + +typedef struct { + uint8_t dCBWSignature[4]; + uint16_t dCBWTag[2]; + uint32_t dCBWDataTransferLength; + uint8_t bmCBWFlags; + uint8_t bCBWLUN; + uint8_t bCBWCBLength; +} _scsi_command_block_wrapper; + +typedef struct { + uint8_t operation_code; + uint8_t lun; + uint8_t reserved1; + uint8_t reserved2; + uint8_t allocation_length; + uint8_t reserved3; + uint8_t pad[6]; +} _scsi_packet_request_sense; + +typedef struct { + _scsi_command_block_wrapper cbw; + _scsi_packet_request_sense request_sense; +} cbw_scsi_request_sense; + +typedef struct { + uint8_t operation_code; + + uint8_t IMMED : 1; + uint8_t reserved : 7; + + uint8_t reserved2; + + uint8_t power_condition_modifier : 4; + uint8_t reserved3 : 4; + + uint8_t start : 1; + uint8_t loej : 1; + uint8_t no_flush : 1; + uint8_t reserved4 : 1; + uint8_t power_condition : 4; + + uint8_t control; +} _scsi_packet_eject; + +typedef struct { + _scsi_command_block_wrapper cbw; + _scsi_packet_eject eject; +} cbw_scsi_eject; + +typedef struct { + uint8_t operation_code; + uint8_t lun; + uint8_t reserved1; + uint8_t reserved2; + uint8_t reserved3; + uint8_t reserved4; + uint8_t pad[6]; +} _scsi_packet_test; + +typedef struct { + _scsi_command_block_wrapper cbw; + _scsi_packet_test test; +} cbw_scsi_test; + +typedef struct { + uint8_t operation_code; + uint8_t lun; + uint8_t reserved[8]; + uint8_t pad[2]; +} _scsi_read_capacity; + +typedef struct { + _scsi_command_block_wrapper cbw; + _scsi_read_capacity read_capacity; +} cbw_scsi_read_capacity; + +typedef struct __scsi_packet_inquiry { // contains information about a specific device + uint8_t operation_code; + uint8_t lun; + uint8_t reserved1; + uint8_t reserved2; + uint8_t allocation_length; + uint8_t reserved3; + uint8_t pad[6]; +} _scsi_packet_inquiry; + +typedef struct { + _scsi_command_block_wrapper cbw; + _scsi_packet_inquiry inquiry; +} cbw_scsi_inquiry; + +typedef struct { + uint8_t device_type : 5; + uint8_t device_type_qualifier : 3; + uint8_t device_type_modifier : 7; + uint8_t removable_media : 1; + union { + uint8_t versions; + struct { + uint8_t ansi_version : 3; + uint8_t ecma_version : 3; + uint8_t iso_version : 2; + }; + }; + uint8_t response_data_format : 4; + uint8_t hi_support : 1; + uint8_t norm_aca : 1; + uint8_t terminate_task : 1; + uint8_t aerc : 1; + uint8_t additional_length; + uint8_t reserved; + uint8_t addr16 : 1; + uint8_t addr32 : 1; + uint8_t ack_req_q : 1; + uint8_t medium_changer : 1; + uint8_t multi_port : 1; + uint8_t reserved_bit2 : 1; + uint8_t enclosure_services : 1; + uint8_t reserved_bit3 : 1; + uint8_t soft_reset : 1; + uint8_t command_queue : 1; + uint8_t transfer_disable : 1; + uint8_t linked_commands : 1; + uint8_t synchronous : 1; + uint8_t wide16_bit : 1; + uint8_t wide32_bit : 1; + uint8_t relative_addressing : 1; + uint8_t vendor_information[8]; + uint8_t product_id[16]; + uint8_t product_revision[4]; + uint8_t vendor_specific[20]; + uint8_t reserved3[40]; +} scsi_inquiry_result; + +typedef struct __scsi_command_status_wrapper { + uint8_t dCSWSignature[4]; + uint16_t dCSWTag[2]; + uint8_t dCSWDataResidue[4]; + uint8_t bCSWStatus; +} _scsi_command_status_wrapper; + +typedef struct { + uint8_t number_of_blocks[4]; + uint8_t block_size[4]; +} scsi_read_capacity_result; + +typedef struct { + uint8_t error_code : 7; + uint8_t valid : 1; + uint8_t segment_number; + uint8_t sense_key : 4; + uint8_t reserved : 1; + uint8_t incorrect_length : 1; + uint8_t end_of_media : 1; + uint8_t file_mark : 1; + uint8_t information[4]; + uint8_t additional_sense_length; + uint8_t command_specific_information[4]; + uint8_t additional_sense_code; + uint8_t additional_sense_code_qualifier; + uint8_t field_replaceable_unit_code; + uint8_t sense_key_specific[3]; +} scsi_sense_result; + +typedef struct { + uint8_t operation_code; + uint8_t lun; + uint8_t lba[4]; // high-endian block number + uint8_t reserved1; + uint8_t transfer_len[2]; // high-endian in blocks of block_len (see scsi_capacity) + uint8_t reserved2; + uint8_t pad[2]; +} _scsi_packet_read_write; + +typedef struct { + _scsi_command_block_wrapper cbw; + _scsi_packet_read_write scsi_cmd; +} cbw_scsi_read_write; + +extern usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result); +extern usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result); +extern usb_error scsi_sense_init(device_config_storage *const dev); +extern usb_error scsi_test(device_config_storage *const dev); +extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result); +extern usb_error scsi_eject(device_config_storage *const dev); +extern usb_error scsi_read_write( + device_config_storage *const dev, const bool send, uint32_t sector_number, const uint8_t sector_count, uint8_t *const buffer); + +extern usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer); +extern usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer); +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c new file mode 100644 index 00000000..1511f3b5 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -0,0 +1,35 @@ +#include "class_scsi.h" +#include +#include +#include +#include +#include +#include +#include +#include + +extern const uint16_t const ch_scsi_fntbl[]; + +void chscsi_init(void) { + uint8_t index = 1; + do { + device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + + if (storage_device == NULL) + break; + + const usb_device_type t = storage_device->type; + + if (t == USB_IS_MASS_STORAGE) { + storage_device->drive_index = storage_count++; + scsi_sense_init(storage_device); + dio_add_entry(ch_scsi_fntbl, storage_device); + } + + } while (++index != MAX_NUMBER_OF_DEVICES + 1); + + if (storage_count == 0) + return; + + print_device_mounted(" STORAGE DEVICE$", storage_count); +} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c new file mode 100644 index 00000000..035c33d4 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c @@ -0,0 +1,176 @@ +#include "class_ufi.h" +#include +#include +#include +#include +#include + +const ufi_request_sense_command _ufi_cmd_request_sense = {0x03, 0, 0, 0, 0, 18, {0, 0, 0, 0, 0, 0, 0}}; +const ufi_read_format_capacities_command _ufi_cmd_read_format_capacities = {0x23, 0, 0, {0, 0, 0, 0, 0}, {0, 12}, {0, 0, 0}}; +const ufi_inquiry_command _ufi_cmd_inquiry = {0x12, 0, 0, 0, 0, 0, 0x24, {0, 0, 0, 0, 0, 0, 0}}; +const ufi_format_command _ufi_cmd_format = {0x04, 7, 0, 1, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0, 0}}; +const ufi_send_diagnostic_command _ufi_cmd_send_diagnostic = {0x1D, 0, 0, 1, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + +uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeout_counter) { + usb_error result; + ufi_request_sense_response sense; + + do { + memset(&sense, 0, sizeof(sense)); + result = ufi_test_unit_ready(storage_device, &sense); + + if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) + break; + + delay_medium(); + + } while (true); + + return result | sense.sense_key; +} + +usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_sense_response const *response) { + usb_error result; + ufi_test_unit_ready_command ufi_cmd_request_test_unit_ready; + memset(&ufi_cmd_request_test_unit_ready, 0, sizeof(ufi_test_unit_ready_command)); + + usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); + + ufi_request_sense_command ufi_cmd_request_sense; + ufi_cmd_request_sense = _ufi_cmd_request_sense; + + result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), + (uint8_t *)response, NULL); + + RETURN_CHECK(result); +} + +usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { + ufi_request_sense_command ufi_cmd_request_sense; + ufi_cmd_request_sense = _ufi_cmd_request_sense; + + usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), + (uint8_t *)response, NULL); + + RETURN_CHECK(result); +} + +usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { + usb_error result; + ufi_read_format_capacities_command ufi_cmd_read_format_capacities; + + ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities; + result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); + + TRACE_USB_ERROR(result); + CHECK(result); + + const uint8_t available_length = response->capacity_list_length; + + const uint8_t max_length = + available_length > sizeof(ufi_format_capacities_response) ? sizeof(ufi_format_capacities_response) : available_length; + + ufi_read_format_capacities_command cmd; + memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); + cmd.allocation_length[1] = max_length; + + result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); + + TRACE_USB_ERROR(result); + RETURN_CHECK(result); +} + +usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { + ufi_inquiry_command ufi_cmd_inquiry; + ufi_cmd_inquiry = _ufi_cmd_inquiry; + + usb_error result = + usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_inquiry, false, sizeof(ufi_inquiry_response), (uint8_t *)response, NULL); + + RETURN_CHECK(result); +} + +usb_error ufi_read_write_sector(device_config *const storage_device, + const bool send, + const uint16_t sector_number, + const uint8_t sector_count, + const uint8_t *const buffer, + uint8_t *const sense_codes) { + ufi_read_write_command cmd; + memset(&cmd, 0, sizeof(cmd)); + cmd.operation_code = send ? 0x2A : 0x28; + cmd.lba[2] = sector_number >> 8; + cmd.lba[3] = sector_number & 0xFF; + cmd.transfer_length[1] = sector_count; + + usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); + + RETURN_CHECK(result); +} + +/** + * Medium | Medium Type Code | Capacity | Tracks | Heads | Sectors/Track | Total Blocks | Block Length | + * DD | 1Eh | 720 KB | 80 | 2 | 9 | 1440 05A0h | 512 0200h | + * HD | 93h | 1.25 MB | 77 | 2 | 8 | 1232 04D0h | 1024 0400h | + * HD | 94h | 1.44 MB | 80 | 2 | 18 | 2880 0B40h | 512 0200h | + */ + +usb_error ufi_format(device_config *const storage_device, + const uint8_t side, + const uint8_t track_number, + const ufi_format_capacity_descriptor *const format) { + ufi_interrupt_status sense_codes; + + ufi_format_parameter_list parameter_list; + memset(¶meter_list, 0, sizeof(parameter_list)); + + ufi_format_command cmd; + cmd = _ufi_cmd_format; + // memcpy(&cmd, &_ufi_cmd_format, sizeof(cmd)); + + cmd.track_number = track_number; + cmd.interleave[1] = 0; + cmd.parameter_list_length[1] = sizeof(parameter_list); + + parameter_list.defect_list_header.side = side; + parameter_list.defect_list_header.immediate = 0; + parameter_list.defect_list_header.reserved2 = 0; + parameter_list.defect_list_header.single_track = 1; + parameter_list.defect_list_header.dcrt = 1; + parameter_list.defect_list_header.extend = 0; + parameter_list.defect_list_header.fov = 1; + parameter_list.defect_list_header.defect_list_length_msb = 0; + parameter_list.defect_list_header.defect_list_length_lsb = 8; + memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); + + usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, + (void *)&sense_codes); + + // trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list)); + + RETURN_CHECK(result); +} + +usb_error ufi_send_diagnostics(device_config *const storage_device) { + usb_error result; + ufi_send_diagnostic_command ufi_cmd_send_diagnostic; + + ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; + + result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); + + RETURN_CHECK(result); +} + +uint32_t convert_from_msb_first(const uint8_t *const buffer) { + uint32_t result; + uint8_t *p_output = ((uint8_t *)&result); + const uint8_t *p_input = buffer + 3; + + *p_output++ = *p_input--; + *p_output++ = *p_input--; + *p_output++ = *p_input--; + *p_output = *p_input--; + + return result; +} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h new file mode 100644 index 00000000..1b761bd9 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h @@ -0,0 +1,207 @@ +#ifndef __CLASS_UFI2 +#define __CLASS_UFI2 + +#include "ch376.h" +#include "protocol.h" +#include "usb_cbi.h" +#include "usb_state.h" +#include + +typedef struct { + uint8_t bASC; + uint8_t bASCQ; +} ufi_interrupt_status; + +typedef struct { + uint8_t operation_code; + uint8_t reserverd1 : 5; + uint8_t lun : 3; + uint8_t reserved1[5]; + uint8_t allocation_length[2]; + uint8_t reserved[3]; +} ufi_read_format_capacities_command; + +typedef enum { UNFORMATTED_MEDIA = 1, FORMATTED_MEDIA = 2, NO_MEDIA = 3 } UFI_DESCRIPTOR_CODE; + +#define UFI_DESCRIPTOR_CODE_UNFORMATTED_MEDIA 1 +#define UFI_DESCRIPTOR_CODE_FORMATTED_MEDIA 2 +#define UFI_DESCRIPTOR_CODE_NO_MEDIA 3 + +typedef struct { + uint8_t number_of_blocks[4]; + uint8_t descriptor_code : 2; // UFI_DESCRIPTOR_CODE + uint8_t reserved2 : 6; + uint8_t block_size[3]; +} ufi_format_capacity_descriptor; + +typedef struct { + uint8_t reserved1[3]; + uint8_t capacity_list_length; + ufi_format_capacity_descriptor descriptors[4]; // support upto +} ufi_format_capacities_response; + +typedef struct { + uint8_t operation_code; + uint8_t lun; + uint8_t reserved[10]; +} ufi_test_unit_ready_command; + +typedef struct { + uint8_t operation_code; + uint8_t evpd : 1; + uint8_t reserved1 : 4; + uint8_t lun : 3; + uint8_t page_code; + uint8_t reserved3; + uint8_t allocation_length; + uint8_t reserved4[7]; +} ufi_inquiry_command; + +typedef struct { + uint8_t operation_code; + uint8_t reserverd1 : 5; + uint8_t lun : 3; + uint8_t reserved2; + uint8_t reserved3; + uint8_t allocation_length; + uint8_t reserved4[7]; +} ufi_request_sense_command; + +typedef struct { + uint8_t error_code; + uint8_t reserved1; + uint8_t sense_key : 4; + uint8_t reserved2 : 4; + uint8_t information[4]; + uint8_t additional_length; + uint8_t reserved3[4]; + uint8_t asc; // Additional Sense Code + uint8_t ascq; // Additional Sense Code Qualifier + uint8_t reserved4[4]; +} ufi_request_sense_response; + +typedef struct { + // device_type: identifies the device currently connected to the requested logical unit. + // 00h Direct-access device (floppy) + // 1Fh none (no FDD connected to the requested logical unit) + uint8_t device_type : 5; + uint8_t reserved1 : 3; + + uint8_t reserved2 : 7; + // Removable Media Bit: this shall be set to one to indicate removable media. + uint8_t removable_media : 1; + + // ANSI Version: must contain a zero to comply with this version of the Specification. + uint8_t ansi_version : 3; + // ISO/ECMA: These fields shall be zero for the UFI device. + uint8_t ecma : 3; + uint8_t iso_version : 2; + + // Response Data Format: a value of 01h shall be used for UFI device + uint8_t response_data_format : 4; + uint8_t reserved3 : 4; + + // The Additional Length field shall specify the length in bytes of the parameters. If the Allocation Length of the + // Command Packet is too small to transfer all of the parameters, the Additional Length shall not be adjusted to + // reflect the truncation. The UFI device shall set this field to 1Fh. + uint8_t additional_length; + uint8_t reserved4[3]; + + // The Vendor Identification field contains 8 bytes of ASCII data identifying the vendor of the product. The data + // shall be left aligned within this field. + char vendor_information[8]; + + // The Product Identification field contains 16 bytes of ASCII data as defined by the vendor. The data shall be + // left-aligned within this field. + char product_id[16]; + + // The Product Revision Level field contains 4 bytes of ASCII data as defined by the vendor. + char product_revision[4]; +} ufi_inquiry_response; + +typedef struct { + uint8_t operation_code; /*0*/ + union { /*1*/ + uint8_t byte_1; + struct { + uint8_t rel_adr : 1; + uint8_t reserved1 : 2; + uint8_t fua : 1; + uint8_t dpo : 1; + uint8_t lun : 3; + }; + }; + uint8_t lba[4]; /*2, 3, 4, 5*/ + uint8_t reserved2; /*6*/ + uint8_t transfer_length[2]; /*7, 8*/ + uint8_t reserved3[3]; /*9, 10, 11*/ +} ufi_read_write_command; + +typedef struct { + struct { + uint8_t reserved1; + uint8_t side : 1; + uint8_t immediate : 1; + uint8_t reserved2 : 2; + uint8_t single_track : 1; + uint8_t dcrt : 1; + uint8_t extend : 1; + uint8_t fov : 1; + uint8_t defect_list_length_msb; + uint8_t defect_list_length_lsb; + } defect_list_header; + + ufi_format_capacity_descriptor format_descriptor; +} ufi_format_parameter_list; + +typedef struct { + uint8_t operation_code; /* 0x04 */ + uint8_t defect_list_format : 3; + uint8_t cmp_list : 1; + uint8_t format_data : 1; + uint8_t lun : 3; + uint8_t track_number; + uint8_t interleave[2]; + uint8_t reserved1[2]; + uint8_t parameter_list_length[2]; + uint8_t reserved2[3]; +} ufi_format_command; + +typedef struct { + uint8_t operation_code; /*0x1D*/ + uint8_t unit_of_l : 1; + uint8_t def_of_l : 1; + uint8_t self_test : 1; + uint8_t reserved1 : 1; + uint8_t pf : 1; + uint8_t lun : 3; + uint8_t reserved[10]; +} ufi_send_diagnostic_command; + +extern usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response); + +extern usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response); + +extern usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_sense_response const *response); + +extern usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response); + +extern usb_error ufi_read_write_sector(device_config *const storage_device, + const bool send, + const uint16_t sector_number, + const uint8_t sector_count, + const uint8_t *const buffer, + uint8_t *const sense_codes); + +uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeout_counter); + +usb_error ufi_format(device_config *const storage_device, + const uint8_t side, + const uint8_t track_number, + const ufi_format_capacity_descriptor *const format); + +usb_error ufi_send_diagnostics(device_config *const storage_device); + +uint32_t convert_from_msb_first(const uint8_t *const buffer); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c new file mode 100644 index 00000000..6cbd88bd --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -0,0 +1,92 @@ +#include "class_ufi.h" +#include +#include +#include +#include +#include +#include + +extern const uint16_t const ch_ufi_fntbl[]; + +void chufi_init(void) { + uint8_t index = 1; + + do { + device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + + if (storage_device == NULL) + break; + + const usb_device_type t = storage_device->type; + + if (t == USB_IS_FLOPPY) { + storage_device->drive_index = storage_count++; + // scsi_sense_init(storage_device); + dio_add_entry(ch_ufi_fntbl, storage_device); + } + + } while (++index != MAX_NUMBER_OF_DEVICES + 1); + + if (storage_count == 0) + return; + + print_device_mounted(" FLOPPY DRIVE$", storage_count); +} + +uint32_t chufi_get_cap(device_config *const dev) { + ufi_format_capacities_response response; + memset(&response, 0, sizeof(ufi_format_capacities_response)); + + wait_for_device_ready(dev, 25); + + // not sure if we need to do this to 'clear' some state + ufi_inquiry_response inquiry; + ufi_inquiry(dev, &inquiry); + + wait_for_device_ready(dev, 15); + + const usb_error result = ufi_read_frmt_caps(dev, &response); + if (result != USB_ERR_OK) + return 0; + + // info->sector_size = response.descriptors[0].block_size[1] << 8 + response.descriptors[0].block_size[0]; + return convert_from_msb_first(response.descriptors[0].number_of_blocks); + + // const disk_geometry *const geometry = size_to_geometry(info->number_of_sectors); + + // info->flags = INFO_FLAG_REMOVABLE | INFO_FLAG_FLOPPY; + // info->number_of_cylinders = geometry->tracks; + // info->number_of_heads = geometry->sides; + // info->number_of_sectors_per_track = geometry->sectors_per_track; + + // return 0; +} + +uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + usb_error result; + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + + if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) + return -1; // general error + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) + return -1; // error + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c new file mode 100644 index 00000000..bf43a45e --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c @@ -0,0 +1,64 @@ +#include "usb_cbi.h" +#include "dev_transfers.h" +#include "protocol.h" +#include + +setup_packet cbi2_adsc = {0x21, 0, {0, 0}, {255, 0}, 12}; // ;4th byte is interface number + +// was no clear +usb_error usb_execute_cbi(device_config *const storage_device, + const uint8_t *const cmd, + const bool send, + const uint16_t buffer_size, + uint8_t *const buffer, + uint8_t *const sense_codes) { + + usb_error result; + + const uint8_t interface_number = storage_device->interface_number; + + setup_packet adsc; + adsc = cbi2_adsc; + adsc.bIndex[0] = interface_number; + + result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); + + if (result == USB_ERR_STALL) { + if (sense_codes != NULL) + usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + + return USB_ERR_STALL; + } + + if (result != USB_ERR_OK) { + TRACE_USB_ERROR(result); + return result; + } + + if (send) { + result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); + + if (result != USB_ERR_OK) { + TRACE_USB_ERROR(result); + return result; + } + } else { + result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); + + if (result != USB_ERR_OK) { + TRACE_USB_ERROR(result); + return result; + } + } + + if (sense_codes != NULL) { + result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + + if (result != USB_ERR_OK) { + TRACE_USB_ERROR(result); + return result; + } + } + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.h new file mode 100644 index 00000000..349a7853 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.h @@ -0,0 +1,14 @@ +#ifndef __USB_CBI_H__ +#define __USB_CBI_H__ + +#include +#include + +usb_error usb_execute_cbi(device_config *const storage_device, + const uint8_t *const cmd, + const bool send, + const uint16_t buffer_size, + uint8_t *const buffer, + uint8_t *const asc); + +#endif diff --git a/Source/HBIOS/ch376-native/ufi-drv.s b/Source/HBIOS/ch376-native/ufi-drv.s new file mode 100644 index 00000000..5ed7edf6 --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv.s @@ -0,0 +1,4 @@ +; Generated File -- not to be modify directly +#include "ch376-native/ufi-drv/ufi-init.c.s" +#include "ch376-native/ufi-drv/usb_cbi.c.s" +#include "ch376-native/ufi-drv/class_ufi.c.s" diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s new file mode 100644 index 00000000..24ac5b51 --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -0,0 +1,705 @@ +; +; Generated from source-doc/ufi-drv/./class_ufi.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/ufi-drv/./class_ufi.c:14: uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeout_counter) { +; --------------------------------- +; Function wait_for_device_ready +; --------------------------------- +_wait_for_device_ready: + push ix + ld ix,0 + add ix,sp + ld hl, -18 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:18: do { + ld c,(ix+6) +l_wait_for_device_ready_00105: +;source-doc/ufi-drv/./class_ufi.c:19: memset(&sense, 0, sizeof(sense)); + push bc + ld hl,2 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x12 + push hl + call _memset_callee + ld hl,2 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ufi_test_unit_ready + pop af + pop af + ld a, l + pop bc + ld b, a +;source-doc/ufi-drv/./class_ufi.c:22: if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) + or a + jr NZ,l_wait_for_device_ready_00104 + ld hl,2 + add hl, sp + ld a, (hl) + and 0x0f + jr Z,l_wait_for_device_ready_00107 +l_wait_for_device_ready_00104: + ld a, c + dec c + or a + jr Z,l_wait_for_device_ready_00107 +;source-doc/ufi-drv/./class_ufi.c:25: delay_medium(); + push bc + call _delay_medium + pop bc +;source-doc/ufi-drv/./class_ufi.c:27: } while (true); + jr l_wait_for_device_ready_00105 +l_wait_for_device_ready_00107: +;source-doc/ufi-drv/./class_ufi.c:29: return result | sense.sense_key; + ld hl,2 + add hl, sp + ld a, (hl) + and 0x0f + or b + ld l, a +;source-doc/ufi-drv/./class_ufi.c:30: } + ld sp, ix + pop ix + ret +__ufi_cmd_request_sense: + DEFB +0x03 + DEFB 0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x12 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +__ufi_cmd_read_format_capacitie: + DEFB +0x23 + DEFB 0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x0c + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +__ufi_cmd_inquiry: + DEFB +0x12 + DEFB 0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x24 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +__ufi_cmd_format: + DEFB +0x04 + DEFB 0x17 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +__ufi_cmd_send_diagnostic: + DEFB +0x1d + DEFB 0x04 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +;source-doc/ufi-drv/./class_ufi.c:32: usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_sense_response const *response) { +; --------------------------------- +; Function ufi_test_unit_ready +; --------------------------------- +_ufi_test_unit_ready: + push ix + ld ix,0 + add ix,sp + ld hl, -24 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:35: memset(&ufi_cmd_request_test_unit_ready, 0, sizeof(ufi_test_unit_ready_command)); + ld hl,0 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x0c + push hl + call _memset_callee +;source-doc/ufi-drv/./class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); + ld hl,0x0000 + push hl + push hl + push hl + xor a + push af + inc sp + ld hl,7 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld hl,11 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:40: ufi_cmd_request_sense = _ufi_cmd_request_sense; + ld hl,12 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x000c + ld hl,__ufi_cmd_request_sense + ldir + pop bc +;source-doc/ufi-drv/./class_ufi.c:43: (uint8_t *)response, NULL); + ld e,(ix+6) + ld d,(ix+7) +;source-doc/ufi-drv/./class_ufi.c:42: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), + ld hl,0x0000 + push hl + push de + ld l,0x12 + push hl + xor a + push af + inc sp + push bc + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:45: RETURN_CHECK(result); +;source-doc/ufi-drv/./class_ufi.c:46: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:48: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { +; --------------------------------- +; Function ufi_request_sense +; --------------------------------- +_ufi_request_sense: + push ix + ld ix,0 + add ix,sp + ld hl, -12 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:50: ufi_cmd_request_sense = _ufi_cmd_request_sense; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x000c + ld hl,__ufi_cmd_request_sense + ldir + pop bc +;source-doc/ufi-drv/./class_ufi.c:52: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), + ld e,(ix+6) + ld d,(ix+7) + ld hl,0x0000 + push hl + push de + ld l,0x12 + push hl + xor a + push af + inc sp + push bc + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:55: RETURN_CHECK(result); +;source-doc/ufi-drv/./class_ufi.c:56: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:58: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { +; --------------------------------- +; Function ufi_read_frmt_caps +; --------------------------------- +_ufi_read_frmt_caps: + push ix + ld ix,0 + add ix,sp + ld hl, -24 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:62: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities; + ld hl,0 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,__ufi_cmd_read_format_capacitie + ldir +;source-doc/ufi-drv/./class_ufi.c:63: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); + ld c,(ix+6) + ld b,(ix+7) + push bc + ld hl,0x0000 + push hl + push bc + ld l,0x0c + push hl + xor a + push af + inc sp + ld hl,9 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp + ld sp, iy + pop bc +;source-doc/ufi-drv/./class_ufi.c:66: CHECK(result); + ld a, l + or a + jr NZ,l_ufi_read_frmt_caps_00103 +;source-doc/ufi-drv/./class_ufi.c:68: const uint8_t available_length = response->capacity_list_length; + ld l,(ix+6) + ld h,(ix+7) + inc hl + inc hl + inc hl + ld e, (hl) +;source-doc/ufi-drv/./class_ufi.c:70: const uint8_t max_length = + ld a,0x24 + sub e + jr NC,l_ufi_read_frmt_caps_00105 + ld e,0x24 +l_ufi_read_frmt_caps_00105: +;source-doc/ufi-drv/./class_ufi.c:74: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); + push bc + push de + ld hl,16 + add hl, sp + push hl + ld hl,6 + add hl, sp + push hl + ld hl,0x000c + push hl + call _memcpy_callee + pop de + pop bc +;source-doc/ufi-drv/./class_ufi.c:75: cmd.allocation_length[1] = max_length; + ld (ix-4),e +;source-doc/ufi-drv/./class_ufi.c:77: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); + ld hl,0x0000 + ld d,l + push hl + push bc + push de + xor a + push af + inc sp + ld hl,19 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:80: RETURN_CHECK(result); +l_ufi_read_frmt_caps_00103: +;source-doc/ufi-drv/./class_ufi.c:81: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:83: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { +; --------------------------------- +; Function ufi_inquiry +; --------------------------------- +_ufi_inquiry: + push ix + ld ix,0 + add ix,sp + ld hl, -12 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:85: ufi_cmd_inquiry = _ufi_cmd_inquiry; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x000c + ld hl,__ufi_cmd_inquiry + ldir + pop bc +;source-doc/ufi-drv/./class_ufi.c:87: usb_error result = + ld e,(ix+6) + ld d,(ix+7) + ld hl,0x0000 + push hl + push de + ld l,0x24 + push hl + xor a + push af + inc sp + push bc + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:90: RETURN_CHECK(result); +;source-doc/ufi-drv/./class_ufi.c:91: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:93: usb_error ufi_read_write_sector(device_config *const storage_device, +; --------------------------------- +; Function ufi_read_write_sector +; --------------------------------- +_ufi_read_write_sector: + push ix + ld ix,0 + add ix,sp + ld hl, -12 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:100: memset(&cmd, 0, sizeof(cmd)); + ld hl,0 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x0c + push hl + call _memset_callee +;source-doc/ufi-drv/./class_ufi.c:101: cmd.operation_code = send ? 0x2A : 0x28; + bit 0,(ix+6) + jr Z,l_ufi_read_write_sector_00103 + ld bc,0x002a + jr l_ufi_read_write_sector_00104 +l_ufi_read_write_sector_00103: + ld bc,0x0028 +l_ufi_read_write_sector_00104: + ld (ix-12),c +;source-doc/ufi-drv/./class_ufi.c:102: cmd.lba[2] = sector_number >> 8; + ld a,(ix+8) + ld (ix-8),a +;source-doc/ufi-drv/./class_ufi.c:103: cmd.lba[3] = sector_number & 0xFF; + ld a,(ix+7) + ld (ix-7),a +;source-doc/ufi-drv/./class_ufi.c:104: cmd.transfer_length[1] = sector_count; +;source-doc/ufi-drv/./class_ufi.c:106: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); + ld a,(ix+9) + ld (ix-4),a + add a, a + ld c,0x00 + ld l,(ix+12) + ld h,(ix+13) + push hl + ld l,(ix+10) + ld h,(ix+11) + push hl + ld b, a + push bc + ld a,(ix+6) + push af + inc sp + ld hl,7 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:108: RETURN_CHECK(result); +;source-doc/ufi-drv/./class_ufi.c:109: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:118: usb_error ufi_format(device_config *const storage_device, +; --------------------------------- +; Function ufi_format +; --------------------------------- +_ufi_format: + push ix + ld ix,0 + add ix,sp + ld hl, -26 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:125: memset(¶meter_list, 0, sizeof(parameter_list)); + ld hl,2 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x0c + push hl + call _memset_callee +;source-doc/ufi-drv/./class_ufi.c:128: cmd = _ufi_cmd_format; + ld hl,14 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,__ufi_cmd_format + ldir +;source-doc/ufi-drv/./class_ufi.c:131: cmd.track_number = track_number; + ld a,(ix+7) + ld (ix-10),a +;source-doc/ufi-drv/./class_ufi.c:132: cmd.interleave[1] = 0; + ld (ix-8),0x00 +;source-doc/ufi-drv/./class_ufi.c:133: cmd.parameter_list_length[1] = sizeof(parameter_list); + ld (ix-4),0x0c +;source-doc/ufi-drv/./class_ufi.c:135: parameter_list.defect_list_header.side = side; + ld hl,2+1 + add hl, sp + ex de, hl + ld a,(ix+6) + and 0x01 + ld c, a + ld a, (de) + and 0xfe + or c + ld (de), a +;source-doc/ufi-drv/./class_ufi.c:136: parameter_list.defect_list_header.immediate = 0; + ld l, e + ld h, d + res 1, (hl) +;source-doc/ufi-drv/./class_ufi.c:137: parameter_list.defect_list_header.reserved2 = 0; + ld c, e + ld b, d + ld a, (bc) + and 0xf3 + ld (bc), a +;source-doc/ufi-drv/./class_ufi.c:138: parameter_list.defect_list_header.single_track = 1; + ld l, e + ld h, d + set 4, (hl) +;source-doc/ufi-drv/./class_ufi.c:139: parameter_list.defect_list_header.dcrt = 1; + ld l, e + ld h, d + set 5, (hl) +;source-doc/ufi-drv/./class_ufi.c:140: parameter_list.defect_list_header.extend = 0; + ld l, e + ld h, d + res 6, (hl) +;source-doc/ufi-drv/./class_ufi.c:141: parameter_list.defect_list_header.fov = 1; + ld a, (de) + or 0x80 + ld (de), a +;source-doc/ufi-drv/./class_ufi.c:142: parameter_list.defect_list_header.defect_list_length_msb = 0; + ld (ix-22),0x00 +;source-doc/ufi-drv/./class_ufi.c:143: parameter_list.defect_list_header.defect_list_length_lsb = 8; + ld (ix-21),0x08 +;source-doc/ufi-drv/./class_ufi.c:144: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); + ld c,(ix+8) + ld b,(ix+9) + ld hl,6 + add hl, sp + push hl + push bc + ld hl,0x0008 + push hl + call _memcpy_callee +;source-doc/ufi-drv/./class_ufi.c:146: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, + ld hl,0 + add hl, sp + push hl + ld hl,4 + add hl, sp + push hl + ld hl,0x000c + push hl + ld a,0x01 + push af + inc sp + ld hl,21 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:151: RETURN_CHECK(result); +;source-doc/ufi-drv/./class_ufi.c:152: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:154: usb_error ufi_send_diagnostics(device_config *const storage_device) { +; --------------------------------- +; Function ufi_send_diagnostics +; --------------------------------- +_ufi_send_diagnostics: + push ix + ld ix,0 + add ix,sp + ld hl, -12 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./class_ufi.c:158: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; + ld hl,0 + add hl, sp + ld e,l + ld d,h + push hl + ld bc,0x000c + ld hl,__ufi_cmd_send_diagnostic + ldir + pop bc +;source-doc/ufi-drv/./class_ufi.c:160: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); + ld hl,0x0000 + push hl + push hl + push hl + ld a,0x01 + push af + inc sp + push bc + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_execute_cbi + ld iy,11 + add iy, sp +;source-doc/ufi-drv/./class_ufi.c:162: RETURN_CHECK(result); +;source-doc/ufi-drv/./class_ufi.c:163: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./class_ufi.c:165: uint32_t convert_from_msb_first(const uint8_t *const buffer) { +; --------------------------------- +; Function convert_from_msb_first +; --------------------------------- +_convert_from_msb_first: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/ufi-drv/./class_ufi.c:167: uint8_t *p_output = ((uint8_t *)&result); + ld hl,0 + add hl, sp + ex de, hl +;source-doc/ufi-drv/./class_ufi.c:168: const uint8_t *p_input = buffer + 3; + ld c,(ix+4) + ld b,(ix+5) + inc bc + inc bc + inc bc +;source-doc/ufi-drv/./class_ufi.c:170: *p_output++ = *p_input--; + ld a, (bc) + dec bc + ld (de), a + inc de +;source-doc/ufi-drv/./class_ufi.c:171: *p_output++ = *p_input--; + ld a, (bc) + dec bc + ld (de), a + inc de +;source-doc/ufi-drv/./class_ufi.c:172: *p_output++ = *p_input--; + ld a, (bc) + dec bc + ld (de), a + inc de +;source-doc/ufi-drv/./class_ufi.c:173: *p_output = *p_input--; + ld a, (bc) + ld (de), a +;source-doc/ufi-drv/./class_ufi.c:175: return result; + pop hl + push hl + ld e,(ix-2) + ld d,(ix-1) +;source-doc/ufi-drv/./class_ufi.c:176: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s new file mode 100644 index 00000000..6b99f86e --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -0,0 +1,319 @@ +; +; Generated from source-doc/ufi-drv/./ufi-init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/ufi-drv/./ufi-init.c:11: void chufi_init(void) { +; --------------------------------- +; Function chufi_init +; --------------------------------- +_chufi_init: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/ufi-drv/./ufi-init.c:14: do { + ld (ix-1),0x01 +l_chufi_init_00105: +;source-doc/ufi-drv/./ufi-init.c:15: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + ld a,(ix-1) + call _get_usb_device_config +;source-doc/ufi-drv/./ufi-init.c:17: if (storage_device == NULL) + ld a, d + or e + jr Z,l_chufi_init_00107 +;source-doc/ufi-drv/./ufi-init.c:20: const usb_device_type t = storage_device->type; + ld l, e + ld h, d + ld a, (hl) + and 0x0f +;source-doc/ufi-drv/./ufi-init.c:22: if (t == USB_IS_FLOPPY) { + dec a + jr NZ,l_chufi_init_00106 +;source-doc/ufi-drv/./ufi-init.c:23: storage_device->drive_index = storage_count++; + ld hl,0x0010 + add hl, de + ld a,(_storage_count+0) + ld (ix-2),a + ld c,l + ld b,h + ld hl,_storage_count+0 + inc (hl) + ld a,(ix-2) + ld (bc), a +;source-doc/ufi-drv/./ufi-init.c:25: dio_add_entry(ch_ufi_fntbl, storage_device); + ld hl,_ch_ufi_fntbl + call _dio_add_entry +l_chufi_init_00106: +;source-doc/ufi-drv/./ufi-init.c:28: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc (ix-1) + ld a,(ix-1) + sub 0x07 + jr NZ,l_chufi_init_00105 +l_chufi_init_00107: +;source-doc/ufi-drv/./ufi-init.c:30: if (storage_count == 0) +;source-doc/ufi-drv/./ufi-init.c:31: return; +;source-doc/ufi-drv/./ufi-init.c:33: print_device_mounted(" FLOPPY DRIVE$", storage_count); + ld a,(_storage_count+0) + or a + jr Z,l_chufi_init_00110 + push af + inc sp + ld hl,ufi_init_str_0 + push hl + call _print_device_mounted + pop af + inc sp +l_chufi_init_00110: +;source-doc/ufi-drv/./ufi-init.c:34: } + ld sp, ix + pop ix + ret +ufi_init_str_0: + DEFM " FLOPPY DRIVE$" + DEFB 0x00 +;source-doc/ufi-drv/./ufi-init.c:36: uint32_t chufi_get_cap(device_config *const dev) { +; --------------------------------- +; Function chufi_get_cap +; --------------------------------- +_chufi_get_cap: + push ix + ld ix,0 + add ix,sp + ld hl, -72 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./ufi-init.c:38: memset(&response, 0, sizeof(ufi_format_capacities_response)); + ld hl,0 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x24 + push hl + call _memset_callee +;source-doc/ufi-drv/./ufi-init.c:40: wait_for_device_ready(dev, 25); + ld a,0x19 + push af + inc sp + ld l,(ix+4) + ld h,(ix+5) + push hl + call _wait_for_device_ready + pop af + inc sp +;source-doc/ufi-drv/./ufi-init.c:44: ufi_inquiry(dev, &inquiry); + ld hl,36 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ufi_inquiry + pop af +;source-doc/ufi-drv/./ufi-init.c:46: wait_for_device_ready(dev, 15); + ld h,0x0f + ex (sp),hl + inc sp + ld l,(ix+4) + ld h,(ix+5) + push hl + call _wait_for_device_ready + pop af + inc sp +;source-doc/ufi-drv/./ufi-init.c:48: const usb_error result = ufi_read_frmt_caps(dev, &response); + ld hl,0 + add hl, sp + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ufi_read_frmt_caps + pop af + pop af + ld a, l +;source-doc/ufi-drv/./ufi-init.c:49: if (result != USB_ERR_OK) + or a + jr Z,l_chufi_get_cap_00102 +;source-doc/ufi-drv/./ufi-init.c:50: return 0; + ld hl,0x0000 + ld e, l + ld d, l + jr l_chufi_get_cap_00103 +l_chufi_get_cap_00102: +;source-doc/ufi-drv/./ufi-init.c:53: return convert_from_msb_first(response.descriptors[0].number_of_blocks); + ld hl,4 + add hl, sp + push hl + call _convert_from_msb_first + pop af +l_chufi_get_cap_00103: +;source-doc/ufi-drv/./ufi-init.c:63: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./ufi-init.c:65: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +; --------------------------------- +; Function chufi_read +; --------------------------------- +_chufi_read: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./ufi-init.c:67: if (wait_for_device_ready((device_config *)dev, 20) != 0) + ld c,(ix+4) + ld b,(ix+5) + push bc + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld a, l + pop bc + or a + jr Z,l_chufi_read_00102 +;source-doc/ufi-drv/./ufi-init.c:68: return -1; // Not READY! + ld l,0xff + jp l_chufi_read_00109 +l_chufi_read_00102: +;source-doc/ufi-drv/./ufi-init.c:73: memset(&sense_codes, 0, sizeof(sense_codes)); + push bc + ld hl,2 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x02 + push hl + call _memset_callee + pop bc +;source-doc/ufi-drv/./ufi-init.c:75: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) + ld e,(ix+4) + ld d,(ix+5) + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + xor a + push af + inc sp + push bc + call _ufi_read_write_sector + ld iy,10 + add iy, sp + ld sp, iy + ld a, l + pop bc + or a + jr Z,l_chufi_read_00104 +;source-doc/ufi-drv/./ufi-init.c:76: return -1; // general error + ld l,0xff + jr l_chufi_read_00109 +l_chufi_read_00104: +;source-doc/ufi-drv/./ufi-init.c:79: memset(&response, 0, sizeof(response)); + push bc + ld hl,4 + add hl, sp + push hl + ld hl,0x0000 + push hl + ld l,0x12 + push hl + call _memset_callee + pop bc +;source-doc/ufi-drv/./ufi-init.c:81: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_chufi_read_00106 +;source-doc/ufi-drv/./ufi-init.c:82: return -1; // error + ld l,0xff + jr l_chufi_read_00109 +l_chufi_read_00106: +;source-doc/ufi-drv/./ufi-init.c:86: const uint8_t sense_key = response.sense_key; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/./ufi-init.c:88: if (sense_key != 0) + and 0x0f + jr Z,l_chufi_read_00108 +;source-doc/ufi-drv/./ufi-init.c:89: return -1; + ld l,0xff + jr l_chufi_read_00109 +l_chufi_read_00108: +;source-doc/ufi-drv/./ufi-init.c:91: return USB_ERR_OK; + ld l,0x00 +l_chufi_read_00109: +;source-doc/ufi-drv/./ufi-init.c:92: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s new file mode 100644 index 00000000..852dd31b --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -0,0 +1,222 @@ +; +; Generated from source-doc/ufi-drv/./usb_cbi.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.3.0 #14210 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_cbi2_adsc: + DEFS 8 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/ufi-drv/./usb_cbi.c:9: usb_error usb_execute_cbi(device_config *const storage_device, +; --------------------------------- +; Function usb_execute_cbi +; --------------------------------- +_usb_execute_cbi: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./usb_cbi.c:18: const uint8_t interface_number = storage_device->interface_number; + ld l,(ix+4) + ld h,(ix+5) + ld c,l + ld b,h + inc hl + inc hl + ld e, (hl) +;source-doc/ufi-drv/./usb_cbi.c:21: adsc = cbi2_adsc; + push de + push bc + ex de, hl + ld hl,4 + add hl, sp + ex de, hl + ld bc,0x0008 + ld hl,_cbi2_adsc + ldir + pop bc + pop de +;source-doc/ufi-drv/./usb_cbi.c:22: adsc.bIndex[0] = interface_number; + ld (ix-4),e +;source-doc/ufi-drv/./usb_cbi.c:24: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); + ld l,(ix+6) + ld h,(ix+7) + push hl + ld hl,2 + add hl, sp + push hl + push bc + call _usbdev_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/ufi-drv/./usb_cbi.c:26: if (result == USB_ERR_STALL) { + cp 0x02 + jr NZ,l_usb_execute_cbi_00104 +;source-doc/ufi-drv/./usb_cbi.c:27: if (sense_codes != NULL) + ld a,(ix+14) + or (ix+13) + jr Z,l_usb_execute_cbi_00102 +;source-doc/ufi-drv/./usb_cbi.c:28: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + ld a,0x02 + push af + inc sp + ld hl,0x0002 + push hl + ld l,(ix+13) + ld h,(ix+14) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_dat_in_trnsfer + ld hl,7 + add hl, sp +l_usb_execute_cbi_00102: +;source-doc/ufi-drv/./usb_cbi.c:30: return USB_ERR_STALL; + ld l,0x02 + jp l_usb_execute_cbi_00118 +l_usb_execute_cbi_00104: +;source-doc/ufi-drv/./usb_cbi.c:33: if (result != USB_ERR_OK) { + or a + jr Z,l_usb_execute_cbi_00106 +;source-doc/ufi-drv/./usb_cbi.c:35: return result; + ld l, a + jr l_usb_execute_cbi_00118 +l_usb_execute_cbi_00106: +;source-doc/ufi-drv/./usb_cbi.c:38: if (send) { + bit 0,(ix+8) + jr Z,l_usb_execute_cbi_00112 +;source-doc/ufi-drv/./usb_cbi.c:39: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+11) + ld h,(ix+12) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_blk_out_trnsfer + pop af + pop af + pop af +;source-doc/ufi-drv/./usb_cbi.c:41: if (result != USB_ERR_OK) { + ld a, l + or a + jr Z,l_usb_execute_cbi_00113 +;source-doc/ufi-drv/./usb_cbi.c:43: return result; + jr l_usb_execute_cbi_00118 +l_usb_execute_cbi_00112: +;source-doc/ufi-drv/./usb_cbi.c:46: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); + ld a,0x01 + push af + inc sp + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+11) + ld h,(ix+12) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_dat_in_trnsfer + pop af + pop af + pop af + inc sp +;source-doc/ufi-drv/./usb_cbi.c:48: if (result != USB_ERR_OK) { + ld a, l + or a +;source-doc/ufi-drv/./usb_cbi.c:50: return result; + jr NZ,l_usb_execute_cbi_00118 +l_usb_execute_cbi_00113: +;source-doc/ufi-drv/./usb_cbi.c:54: if (sense_codes != NULL) { + ld a,(ix+14) + or (ix+13) + jr Z,l_usb_execute_cbi_00117 +;source-doc/ufi-drv/./usb_cbi.c:55: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + ld a,0x02 + push af + inc sp + ld hl,0x0002 + push hl + ld l,(ix+13) + ld h,(ix+14) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_dat_in_trnsfer + pop af + pop af + pop af + inc sp +;source-doc/ufi-drv/./usb_cbi.c:57: if (result != USB_ERR_OK) { + ld a, l + or a +;source-doc/ufi-drv/./usb_cbi.c:59: return result; + jr NZ,l_usb_execute_cbi_00118 +l_usb_execute_cbi_00117: +;source-doc/ufi-drv/./usb_cbi.c:63: return USB_ERR_OK; + ld l,0x00 +l_usb_execute_cbi_00118: +;source-doc/ufi-drv/./usb_cbi.c:64: } + ld sp, ix + pop ix + ret +_cbi2_adsc: + DEFB +0x21 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0xff + DEFB +0x00 + DEFW +0x000c diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm new file mode 100644 index 00000000..b0c05df3 --- /dev/null +++ b/Source/HBIOS/ch376.asm @@ -0,0 +1,48 @@ +; +;================================================================================================== +; CH376 NATIVE USB DRIVER +;================================================================================================== +; + +#DEFINE DEFM .DB +#DEFINE DEFB .DB +#DEFINE DEFW .DW + +_print_string .EQU PRTSTR + +_print_hex: + ld a, l + JP PRTHEXBYTE + +_delay: + push af + call DELAY + call DELAY + call DELAY + call DELAY + pop af + ret + +_delay_20ms: + LD DE, 1250 + JP VDELAY +; +; DELAY approx 60ms +_delay_short: + LD DE, 3750 + JP VDELAY +; +; DELAY approx 1/2 second +_delay_medium .EQU LDELAY + +_dio_add_entry: + LD B, H + LD C, L + JP DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE + +#include "./ch376-native/base-drv.asm" +#include "./ch376-native/print.asm" +#include "./ch376-native/cruntime.asm" +#include "./ch376-native/base-drv.s" + +CHNATIVE_INIT .EQU _chnative_init diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm new file mode 100644 index 00000000..576b44c2 --- /dev/null +++ b/Source/HBIOS/ch376scsi.asm @@ -0,0 +1,284 @@ +; +;================================================================================================== +; CH376 NATIVE MASS STORAGE DRIVER +;================================================================================================== +; + +#include "./ch376-native/scsi-drv.s" + + ; find and mount all Mass Storage USB devices +CHSCSI_INIT .EQU _chscsi_init + +; DRIVER FUNCTION TABLE +; +_ch_scsi_fntbl +CH_SCSI_FNTBL: + .DW CH_SCSI_STATUS + .DW CH_SCSI_RESET + .DW CH_SCSI_SEEK + .DW CH_SCSI_READ + .DW CH_SCSI_WRITE + .DW CH_SCSI_VERIFY + .DW CH_SCSI_FORMAT + .DW CH_SCSI_DEVICE + .DW CH_SCSI_MEDIA + .DW CH_SCSI_DEFMED + .DW CH_SCSI_CAP + .DW CH_SCSI_GEOM +#IF (($ - CH_SCSI_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID CH_SCSI_FNTBL FUNCTION TABLE ***\n" +#ENDIF + +CH_SCSI_STATUS: + LD A, (IY) + XOR A + RET + +CH_SCSI_RESET: + LD A, (IY) + XOR A + RET + +; ### Function 0x12 -- Disk Seek (DIOSEEK) +; +; Inputs: +; IY: device config pointer +; DEHL: Sector Address +; +; Outputs: +; A: Status +; +; This function will set the desired sector to be used for the next I/O +; operation. The returned Status (A) is a standard HBIOS result code. +; +; The double-word Sector Address (DEHL) can represent either a Logical +; Block Address (LBA) or a Cylinder/Head/Sector (CHS). Bit 7 of D is +; set (1) for LBA mode and cleared (0) for CHS mode. +; +; For LBA mode operation, the high bit is set and the rest of the +; double-word is then treated as the logical sector address. +; +; For CHS mode operation, the Sector Address (DEHL) registers are +; interpreted as: D=Head, E=Sector, and HL=Track. All values (including +; sector) are 0 relative. +; +CH_SCSI_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) + EX DE, HL + + push IY + CALL _chnative_seek + RET +; +; ### Function 0x13 -- Disk Read (DIOREAD) +; +; Inputs +; IY: device config pointer +; D: Buffer Bank ID +; E: Sector Count +; HL: Buffer Address +; +; Outputs +; A: Status +; E: Sectors Read +; +; Read Sector Count (E) sectors into the buffer located in Buffer Bank ID (D) +; at Buffer Address (HL) starting at the Current Sector. The returned +; Status (A) is a standard HBIOS result code. +; +CH_SCSI_READ: + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + + ; call scsi_read(IY, HL); + ; HL = HL + 512 + push hl + push iy + call _scsi_read + ld a, l + pop hl + pop iy + ld bc, 512 + add hl, bc + ret +; +; ### Function 0x14 -- Disk Write (DIOWRITE) +; +; Inputs +; IY: device config pointer +; D: Buffer Bank ID +; E: Sector Count +; HL: Buffer Address +; +; Outputs +; A: Status +; E: Sectors Written +; +; Write Sector Count (E) sectors from the buffer located in Buffer Bank ID (D) +; at Buffer Address (HL) starting at the Current Sector. The returned +; Status (A) is a standard HBIOS result code. +; +CH_SCSI_WRITE: + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + + ; call scsi_write(IY, HL); + ; HL = HL + 512 + push hl + push iy + call _scsi_write + ld a, l + pop hl + pop iy + ld bc, 512 + add hl, bc + ret + +CH_SCSI_VERIFY: +CH_SCSI_FORMAT: + LD A, $FF + OR A + RET +; +; ### Function 0x17 -- Disk Device (DIODEVICE) +; +; Inputs +; IY: device config pointer +; +; Outputs +; A: Status +; C: Device Attributes +; D: Device Type (DIODEV_USB) +; E: Device Number (1) +; H: Device Unit Mode (0) +; L: Device I/O Base Address +; +; Reports device information. The Status (A) is a standard +; HBIOS result code. +; +; The Device Attribute (C): +; +; | **Bits** | **Definition** | +; |---------:|--------------------------------------------------| +; | 7 | Floppy | +; | 6 | Removable | +; | 5 | High Capacity (>8 MB) | +; +; Low Capacity Devices?? +; +; | **Bits** | **Definition** | +; |---------:|--------------------------------------------------| +; | 4-3 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other | +; | 2 | Sides: 0=SS, 1=DS | +; | 1-0 | Density: 0=SD, 1=DD, 2=HD, 3=ED | +; +; High Capacity Devices +; +; | **Bits** | **Definition** | +; |---------:|--------------------------------------------------| +; | 4 | LBA Capable | +; | 3-0 | Media Type: 0=Hard Disk, 1=CF, 2=SD, 3=USB, | +; | | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH, 8=CD-ROM, | +; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | +; +CH_SCSI_DEVICE: + LD C, %01111010 ; TODO? + LD D, DIODEV_USB + LD E, (iy+16) + LD H, 0 + LD L, 0 + XOR A + RET +; +; ### Function 0x18 -- Disk Media (DIOMEDIA) +; +; Inputs +; IY: device config pointer +; E: Flags +; +; Outputs +; A: Status +; E: Media ID +; +; Report the Media ID (E) for the for media. If bit 0 of Flags (E) is set, +; then media discovery or verification will be performed. The Status +; (A) is a standard HBIOS result code. If there is no media in device, +; function will return an error status. +; +CH_SCSI_MEDIA: + LD E, MID_HD ;todo verify device still active? + XOR A + RET + +CH_SCSI_DEFMED: + LD A, $FF + OR A + RET +; +; ### Function 0x1A -- Disk Capacity (DIOCAPACITY) +; +; Inputs +; IY: device config pointer +; +; Outputs +; A: Status +; DEHL: Sector Count +; BC: Block Size +; +; +; Report the current media capacity information. +; +; +CH_SCSI_CAP: + push ix + ld ix, -8 ; reserve 8 bytes for + add ix, sp ; scsi_read_capacity_result + ld sp, ix + + push ix + push iy + call _get_scsi_read_capacity + pop iy + pop ix + + ld d, (ix) ; response.number_of_blocks[0] + ld e, (ix+1) ; response.number_of_blocks[1] + ld h, (ix+2) ; response.number_of_blocks[2] + ld l, (ix+3) ; response.number_of_blocks[3] + ld b, (ix+6) ; response.block_size[2] + ld c, (ix+7) ; response.block_size[3] + + ld ix, 8 + add ix, sp + ld sp, ix + pop ix + + xor a ; todo determine a drive status + ret +; +; ### Function 0x1B -- Disk Geometry (DIOGEOMETRY) +; +; Inputs +; IY: device config pointer +; +; Outputs +; A: Status +; D: Heads +; E: Sectors +; HL: Cylinder Count +; BC: Block Size +; +; Report the simulated geometry for the media. The Status (A) is a +; standard HBIOS result code. If the media is unknown, an error will be returned. +; +; ** Does not appear to be used?? +; +CH_SCSI_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 CH_SCSI_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 diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm new file mode 100644 index 00000000..95e819e9 --- /dev/null +++ b/Source/HBIOS/ch376ufi.asm @@ -0,0 +1,225 @@ +; +;================================================================================================== +; CH376 NATIVE MASS STORAGE DRIVER +;================================================================================================== +; + +#include "./ch376-native/ufi-drv.s" + + ; find and mount all floppy USB drives +CHUFI_INIT .EQU _chufi_init + +; DRIVER FUNCTION TABLE +; +_ch_ufi_fntbl +CH_UFI_FNTBL: + .DW CH_UFI_STATUS + .DW CH_UFI_RESET + .DW CH_UFI_SEEK + .DW CH_UFI_READ + .DW CH_UFI_WRITE + .DW CH_UFI_VERIFY + .DW CH_UFI_FORMAT + .DW CH_UFI_DEVICE + .DW CH_UFI_MEDIA + .DW CH_UFI_DEFMED + .DW CH_UFI_CAP + .DW CH_UFI_GEOM +#IF (($ - CH_UFI_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID CH_UFI_FNTBL FUNCTION TABLE ***\n" +#ENDIF + +CH_UFI_STATUS: + LD A, (IY) + XOR A + RET + +CH_UFI_RESET: + LD A, (IY) + XOR A + RET +; ### Function 0x12 -- Disk Seek (DIOSEEK) +; +; Inputs: +; IY: device config pointer +; DEHL: Sector Address +; +; Outputs: +; A: Status +; +; This function will set the desired sector to be used for the next I/O +; operation. The returned Status (A) is a standard HBIOS result code. +;if +; The double-word Sector Address (DEHL) can represent either a Logical +; Block Address (LBA) or a Cylinder/Head/Sector (CHS). Bit 7 of D is +; set (1) for LBA mode and cleared (0) for CHS mode. +; +; For LBA mode operation, the high bit is set and the rest of the +; double-word is then treated as the logical sector address. +; +; For CHS mode operation, the Sector Address (DEHL) registers are +; interpreted as: D=Head, E=Sector, and HL=Track. All values (including +; sector) are 0 relative. +; +CH_UFI_SEEK: + BIT 7, D ; CHECK FOR LBA FLAG + CALL Z, HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA - never seems to happen? + RES 7, D + EX DE, HL + + push IY + CALL _chnative_seek + RET +; +; ### Function 0x13 -- Disk Read (DIOREAD) +; +; Inputs +; IY: device config pointer +; D: Buffer Bank ID +; E: Sector Count +; HL: Buffer Address +; +; Outputs +; A: Status +; E: Sectors Read +; +; Read Sector Count (E) sectors into the buffer located in Buffer Bank ID (D) +; at Buffer Address (HL) starting at the Current Sector. The returned +; Status (A) is a standard HBIOS result code. +; +CH_UFI_READ: + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + + push hl + push iy + call _chufi_read + ld l, 0 + ld a, l + pop iy + pop hl + ld bc, 512 + add hl, bc + ret + +CH_UFI_WRITE: + EZ80_UTIL_DEBUG + + XOR A + RET + +CH_UFI_VERIFY: +CH_UFI_FORMAT: + LD HL, 0 + LD DE, 0 + LD BC, 0 + LD A, $FF + OR A + RET + +; ### Function 0x17 -- Disk Device (DIODEVICE) +; +; Inputs +; IY: device config pointer +; +; Outputs +; A: Status +; C: Device Attributes +; D: Device Type (DIODEV_USB) +; E: Device Number (1) +; H: Device Unit Mode (0) +; L: Device I/O Base Address +; +; Reports device information. The Status (A) is a standard +; HBIOS result code. +; +; The Device Attribute (C): +; +; | **Bits** | **Definition** | +; |---------:|--------------------------------------------------| +; | 7 | Floppy | +; | 6 | Removable | +; | 5 | High Capacity (>8 MB) | +; +; Low Capacity Devices?? +; +; | **Bits** | **Definition** | +; |---------:|--------------------------------------------------| +; | 4-3 | Form Factor: 0=8", 1=5.25", 2=3.5", 3=Other | +; | 2 | Sides: 0=SS, 1=DS | +; | 1-0 | Density: 0=SD, 1=DD, 2=HD, 3=ED | +; +; High Capacity Devices +; +; | **Bits** | **Definition** | +; |---------:|--------------------------------------------------| +; | 4 | LBA Capable | +; | 3-0 | Media Type: 0=Hard Disk, 1=CF, 2=SD, 3=USB, | +; | | 4=ROM, 5=RAM, 6=RAMF, 7=FLASH, 8=CD-ROM, | +; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | +; +CH_UFI_DEVICE: + LD C, %01011011 + LD D, DIODEV_USB + LD E, (iy+16) + LD H, 0 + LD L, 0 + XOR A + RET +; +; ### Function 0x18 -- Disk Media (DIOMEDIA) +; +; Inputs +; IY: device config pointer +; E: Flags +; +; Outputs +; A: Status +; E: Media ID +; +; Report the Media ID (E) for the for media. If bit 0 of Flags (E) is set, +; then media discovery or verification will be performed. The Status +; (A) is a standard HBIOS result code. If there is no media in device, +; function will return an error status. +; +CH_UFI_MEDIA: + LD E, MID_MDRAM ;todo verify device still active? + XOR A + RET + +CH_UFI_DEFMED: + LD HL, 0 + LD DE, 0 + LD BC, 0 + LD A, $FF + OR A + RET + +; +; ### Function 0x1A -- Disk Capacity (DIOCAPACITY) +; +; Inputs +; IY: device config pointer +; +; Outputs +; A: Status +; DEHL: Sector Count +; BC: Block Size +; +; +; Report the current media capacity information. +; +CH_UFI_CAP: + push iy + call _chufi_get_cap + pop iy + ld bc, 512 + xor a + ret + +CH_UFI_GEOM: + LD HL, 0 + LD DE, 0 + LD BC, 0 + LD A, $FF + OR A + RET diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d5781f95..3c8c9031 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -4165,6 +4165,15 @@ HB_INITTBL: #IF (ESPENABLE) .DW ESP_INIT #ENDIF +#IF (CHNATIVEENABLE) + .DW CHNATIVE_INIT +#ENDIF +#IF (CHSCSIENABLE) + .DW CHSCSI_INIT +#ENDIF +#IF (CHUFIENABLE) + .DW CHUFI_INIT +#ENDIF ; HB_INITTBLLEN .EQU (($ - HB_INITTBL) / 2) ; @@ -7045,6 +7054,7 @@ HB_BADINTCNT .DB 0 CALL NEWLINE ;CALL CONTINUE OR $FF ; SIGNAL INTERRUPT HANDLED + EZ80_UTIL_DEBUG RET ; ;-------------------------------------------------------------------------------------------------- @@ -8776,6 +8786,7 @@ PS_DDIMM .TEXT "IMM$" PS_DDSYQ .TEXT "SYQ$" PS_DDCHUSB .TEXT "CHUSB$" PS_DDCHSD .TEXT "CHSD$" +PS_DDCHNATUSB .TEXT "USB$" ; ; DISK TYPE STRINGS ; @@ -8790,7 +8801,10 @@ PS_DTFSH .TEXT "Flash ROM$" PS_DTRF .TEXT "RAM Floppy$" PS_DTCD .TEXT "CD-ROM$" PS_DTCRT .TEXT "Cartridge$" +PS_DTOUSBSCI .TEXT "SCSI$" +PS_DTOUSBUFI .TEXT "UFI$" PS_DTOTHER .TEXT "???$" + ; ; FLOPPY ATTRIBUTE STRINGS ; @@ -9446,6 +9460,32 @@ SIZ_YM2612 .EQU $ - ORG_YM2612 MEMECHO " bytes.\n" #ENDIF ; +#IF (CHNATIVEENABLE) +ORG_CHNATIVE .EQU $ + #INCLUDE "ch376.asm" +SIZ_CHNATIVE .EQU $ - ORG_CHNATIVE + MEMECHO "CH376 Native occupies " + MEMECHO SIZ_CHNATIVE + MEMECHO " bytes.\n" +#ENDIF +; +#IF (CHSCSIENABLE) +ORG_CHSCSI .EQU $ + #INCLUDE "ch376scsi.asm" +SIZ_CHSCSI .EQU $ - ORG_CHSCSI + MEMECHO "CH376 SCSI Mass Storage occupies " + MEMECHO SIZ_CHSCSI + MEMECHO " bytes.\n" +#ENDIF +; +#IF (CHUFIENABLE) +ORG_CHUFI .EQU $ + #INCLUDE "ch376ufi.asm" +SIZ_CHUFI .EQU $ - ORG_CHUFI + MEMECHO "CH376 UFI Floppy Storage occupies " + MEMECHO SIZ_CHUFI + MEMECHO " bytes.\n" +#ENDIF ; #IF (CPUFAM == CPU_EZ80) MEMECHO "EZ80 DRIVERS\n" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 368aeaf7..3c7a42f5 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -420,6 +420,7 @@ DIODEV_IMM .EQU $0B DIODEV_SYQ .EQU $0C DIODEV_CHUSB .EQU $0D DIODEV_CHSD .EQU $0E +DIODEV_USB .EQU $0F ; ; RTC DEVICE IDS ; From 7c3eeaff27b3f7ad48f1a87828dbeec4e2789111 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 18 Sep 2024 18:41:22 +1000 Subject: [PATCH 02/59] ch376-native: fixes --- .gitignore | 6 + Source/HBIOS/Config/RCEZ80_std.asm | 11 +- Source/HBIOS/cfg_RCEZ80.asm | 4 +- Source/HBIOS/ch376-native/Dockerfile | 6 + Source/HBIOS/ch376-native/Makefile | 15 +- Source/HBIOS/ch376-native/base-drv.asm | 1 - Source/HBIOS/ch376-native/base-drv/ch376.c.s | 446 +++++++++-------- .../HBIOS/ch376-native/base-drv/class_hub.c.s | 24 +- .../ch376-native/base-drv/dev_transfers.c.s | 209 ++++---- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 455 ++++++++++-------- .../ch376-native/base-drv/enumerate_hub.c.s | 234 +++++---- .../base-drv/enumerate_storage.c.s | 52 +- Source/HBIOS/ch376-native/base-drv/print.c.s | 31 +- .../HBIOS/ch376-native/base-drv/protocol.c.s | 235 +++++---- .../HBIOS/ch376-native/base-drv/transfers.c.s | 226 ++++----- .../ch376-native/base-drv/usb-base-drv.c.s | 15 +- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 16 +- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 21 +- .../HBIOS/ch376-native/base-drv/work-area.c.s | 2 +- Source/HBIOS/ch376-native/build-docker.sh | 0 .../ch376-native/scsi-drv/class_scsi.c.s | 355 +++++++------- Source/HBIOS/ch376-native/scsi-drv/init.c.s | 162 ------- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 18 +- .../ch376-native/source-doc/base-drv/ch376.c | 14 +- .../source-doc/base-drv/ez80-helpers.h | 1 + .../source-doc/base-drv/protocol.c | 2 + .../source-doc/base-drv/transfers.c | 6 +- .../source-doc/convert-for-uz80as.sh | 2 +- .../HBIOS/ch376-native/source-doc/depends.d | 117 +---- .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 234 ++++----- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 67 ++- Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 18 +- Source/HBIOS/util.asm | 11 + 33 files changed, 1482 insertions(+), 1534 deletions(-) create mode 100644 Source/HBIOS/ch376-native/Dockerfile create mode 100644 Source/HBIOS/ch376-native/build-docker.sh delete mode 100644 Source/HBIOS/ch376-native/scsi-drv/init.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/ez80-helpers.h diff --git a/.gitignore b/.gitignore index af06bcf5..d2ab7849 100644 --- a/.gitignore +++ b/.gitignore @@ -195,3 +195,9 @@ Tools/unix/OpenSpin/build/ Tools/unix/zxcc/config.h Tools/unix/zxcc/zxcc Binary/Apps/bbcbasic.txt + +Source/Images/hd1k_msxroms1.img +Source/Images/hd1k_msxroms1.img +Source/Images/hd1k_msxroms2.img +Source/Images/hd512_msxroms1.img +Source/Images/hd512_msxroms2.img diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 8383e087..e9f7d2db 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -50,7 +50,7 @@ CPUOSC .SET 20000000 ; CPU OSC FREQ IN MHZ ; FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS -FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ;; @@ -61,12 +61,12 @@ TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) EFENABLE .SET FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) ; -FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] ; -IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; -PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR|PIO|Z80R|EPITX|FZ80|GM|EZ512|K80W] @@ -83,6 +83,9 @@ AY38910ENABLE .SET FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] AY_FORCE .SET FALSE ; AY: BYPASS AUTO-DETECT, FORCED PRESENT +CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER +CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index 5a33c933..508548ae 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -125,7 +125,7 @@ PKDENABLE .SET FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .SET $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL -LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY +LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; @@ -426,7 +426,7 @@ EZ80_IO_MIN_NS .SET 250 ; CALCULATE AT BOOT TIME THE REQUIRED W/S OR B/C, IF EZ EZ80_IO_MIN_WS .SET 7 ; MINIMUM WAIT STATES TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CALC ; ; APPLY CYCLES, W/S OR CALCULATE CYCLES BASED ON DESIRED PERIOD -EZ80_WSMD_TYP .SET EZ80WSMD_CALC ; BUS WAIT STATE CONFIG: EZ80WSMD_[CALC|CYCLES|WAIT] +EZ80_WSMD_TYP .SET EZ80WSMD_CYCLES ; BUS WAIT STATE CONFIG: EZ80WSMD_[CALC|CYCLES|WAIT] ; ; BUS TIMING FOR ON CHIP ROM ; diff --git a/Source/HBIOS/ch376-native/Dockerfile b/Source/HBIOS/ch376-native/Dockerfile new file mode 100644 index 00000000..47156098 --- /dev/null +++ b/Source/HBIOS/ch376-native/Dockerfile @@ -0,0 +1,6 @@ +# Build with: docker build --progress plain -t romwbw-z88dk . +# run with : docker run -v ${PWD}:/src/ --privileged=true -u $(id -u ${USER}):$(id -g ${USER}) -it romwbw-z88dk:latest + +FROM z88dk/z88dk + +RUN apk add build-base diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 6a08c627..78963327 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -1,9 +1,11 @@ -SHELL := /bin/bash -.SHELLFLAGS := -eu -o pipefail -c +SHELL := /bin/sh +SHELLFLAGS := -c -e -x .ONESHELL: MAKEFLAGS += --warn-undefined-variables MAKEFLAGS += --no-builtin-rules +ZCC_EXTRA := --vc -Cs --Werror + ZCCRELFLAGS= ifdef RELEASE ZCCRELFLAGS=-SO3 --max-allocs-per-node600000 --allow-unsafe-read --opt-code-speed @@ -12,7 +14,7 @@ endif SRC := ./source-doc/ LIBS := -I./$(SRC)base-drv/ -ZCC := zcc +msx --vc -subtype=rom -startup=1 -crt0 $(SRC)crt.asm -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) +ZCC := zcc +z80 -vn -startup=0 -clib=sdcc_iy -crt0 $(SRC)crt.asm -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) ASSDIR := ./ @@ -79,7 +81,7 @@ format: @clang-format --version find \( -name "*.c" -o -name "*.h" \) -exec echo "formating {}" \; -exec clang-format -i {} \; -ZSDCPP_FLAGS=-iquote"." -isystem"${ZCCCFG}/../../include/_DEVELOPMENT/sdcc" $(LIBS) +ZSDCPP_FLAGS= -I"${ZCCCFG}../../include/_DEVELOPMENT/sdcc" $(LIBS) include ${SRC}depends.d @@ -92,7 +94,10 @@ deps: filename=$$(basename $$file_no_ext) from="$$filename.o" to="${ASSDIR}$$file_no_ext.c.s" - sdcpp ${ZSDCPP_FLAGS} -MM -MF /tmp/deps.deps ./${SRC}$$file_no_ext.c + echo -n "$${file}: " > /tmp/deps.deps + echo -n "$${file_no_ext}.c " >> /tmp/deps.deps + z88dk-ucpp ${ZSDCPP_FLAGS} -M ./${SRC}$$file_no_ext.c >> /tmp/deps.deps + touch /tmp/deps.deps sed "s+$$from+$$to+g" /tmp/deps.deps >> ${SRC}/depends.d done diff --git a/Source/HBIOS/ch376-native/base-drv.asm b/Source/HBIOS/ch376-native/base-drv.asm index 8990bf92..12e1c250 100644 --- a/Source/HBIOS/ch376-native/base-drv.asm +++ b/Source/HBIOS/ch376-native/base-drv.asm @@ -21,7 +21,6 @@ _ch_wait_int_and_get_status: ld bc, DELAY_FACTOR keep_waiting: - CALL _delay ld a, $FF in a, (_CH376_COMMAND_PORT & 0xFF) rlca diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index ea6a174c..4ef2b7d7 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -50,344 +50,363 @@ _result: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./ch376.c:7: void ch_command(const uint8_t command) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:8: void ch_command(const uint8_t command) __z88dk_fastcall { ; --------------------------------- ; Function ch_command ; --------------------------------- _ch_command: -;source-doc/base-drv/./ch376.c:9: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) +;source-doc/base-drv/./ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) ld h,0xff l_ch_command_00102: ld a, +((_CH376_COMMAND_PORT) / 256) in a, (((_CH376_COMMAND_PORT) & 0xFF)) bit 4, a jr Z,l_ch_command_00104 - dec h + dec h jr Z,l_ch_command_00104 -;source-doc/base-drv/./ch376.c:10: delay(); +;source-doc/base-drv/./ch376.c:11: delay(); push hl call _delay pop hl jr l_ch_command_00102 l_ch_command_00104: -;source-doc/base-drv/./ch376.c:20: delay(); +;source-doc/base-drv/./ch376.c:21: delay(); push hl call _delay pop hl -;source-doc/base-drv/./ch376.c:21: CH376_COMMAND_PORT = command; +;source-doc/base-drv/./ch376.c:22: CH376_COMMAND_PORT = command; ld a, l ld bc,_CH376_COMMAND_PORT out (c),a -;source-doc/base-drv/./ch376.c:22: delay(); -;source-doc/base-drv/./ch376.c:23: } +;source-doc/base-drv/./ch376.c:23: delay(); + call _delay +;source-doc/base-drv/./ch376.c:24: delay(); + call _delay +;source-doc/base-drv/./ch376.c:25: delay(); + call _delay +;source-doc/base-drv/./ch376.c:26: delay(); +;source-doc/base-drv/./ch376.c:27: } jp _delay -;source-doc/base-drv/./ch376.c:27: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } +;source-doc/base-drv/./ch376.c:31: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } ; --------------------------------- ; Function ch_long_wait_int_and_get_status ; --------------------------------- _ch_long_wait_int_and_get_statu: ld hl,0x1388 jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:29: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } +;source-doc/base-drv/./ch376.c:33: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } ; --------------------------------- ; Function ch_short_wait_int_and_get_statu ; --------------------------------- _ch_short_wait_int_and_get_stat: ld hl,0x0064 jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:31: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } +;source-doc/base-drv/./ch376.c:35: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } ; --------------------------------- ; Function ch_very_short_wait_int_and_get_ ; --------------------------------- _ch_very_short_wait_int_and_get: ld hl,0x000a jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:33: usb_error ch_get_status(void) { +;source-doc/base-drv/./ch376.c:37: usb_error ch_get_status(void) { ; --------------------------------- ; Function ch_get_status ; --------------------------------- _ch_get_status: -;source-doc/base-drv/./ch376.c:34: ch_command(CH_CMD_GET_STATUS); +;source-doc/base-drv/./ch376.c:38: ch_command(CH_CMD_GET_STATUS); ld l,0x22 call _ch_command -;source-doc/base-drv/./ch376.c:35: uint8_t ch_status = CH376_DATA_PORT; +;source-doc/base-drv/./ch376.c:39: delay(); + call _delay +;source-doc/base-drv/./ch376.c:40: delay(); + call _delay +;source-doc/base-drv/./ch376.c:41: delay(); + call _delay +;source-doc/base-drv/./ch376.c:42: delay(); + call _delay +;source-doc/base-drv/./ch376.c:43: uint8_t ch_status = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/./ch376.c:37: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) +;source-doc/base-drv/./ch376.c:45: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) ld l,a sub 0x41 jr C,l_ch_get_status_00102 ld a,0xb4 sub l -;source-doc/base-drv/./ch376.c:38: return ch_status; +;source-doc/base-drv/./ch376.c:46: return ch_status; jr NC,l_ch_get_status_00126 l_ch_get_status_00102: -;source-doc/base-drv/./ch376.c:40: if (ch_status == CH_CMD_RET_SUCCESS) +;source-doc/base-drv/./ch376.c:48: if (ch_status == CH_CMD_RET_SUCCESS) ld a, l -;source-doc/base-drv/./ch376.c:41: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:49: return USB_ERR_OK; sub 0x51 jr NZ,l_ch_get_status_00105 ld l,a jr l_ch_get_status_00126 l_ch_get_status_00105: -;source-doc/base-drv/./ch376.c:43: if (ch_status == CH_USB_INT_SUCCESS) +;source-doc/base-drv/./ch376.c:51: if (ch_status == CH_USB_INT_SUCCESS) ld a, l -;source-doc/base-drv/./ch376.c:44: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:52: return USB_ERR_OK; sub 0x14 jr NZ,l_ch_get_status_00107 ld l,a jr l_ch_get_status_00126 l_ch_get_status_00107: -;source-doc/base-drv/./ch376.c:46: if (ch_status == CH_USB_INT_CONNECT) +;source-doc/base-drv/./ch376.c:54: if (ch_status == CH_USB_INT_CONNECT) ld a, l sub 0x15 jr NZ,l_ch_get_status_00109 -;source-doc/base-drv/./ch376.c:47: return USB_INT_CONNECT; +;source-doc/base-drv/./ch376.c:55: return USB_INT_CONNECT; ld l,0x81 jr l_ch_get_status_00126 l_ch_get_status_00109: -;source-doc/base-drv/./ch376.c:49: if (ch_status == CH_USB_INT_DISK_READ) +;source-doc/base-drv/./ch376.c:57: if (ch_status == CH_USB_INT_DISK_READ) ld a, l sub 0x1d jr NZ,l_ch_get_status_00111 -;source-doc/base-drv/./ch376.c:50: return USB_ERR_DISK_READ; +;source-doc/base-drv/./ch376.c:58: return USB_ERR_DISK_READ; ld l,0x1d jr l_ch_get_status_00126 l_ch_get_status_00111: -;source-doc/base-drv/./ch376.c:52: if (ch_status == CH_USB_INT_DISK_WRITE) +;source-doc/base-drv/./ch376.c:60: if (ch_status == CH_USB_INT_DISK_WRITE) ld a, l sub 0x1e jr NZ,l_ch_get_status_00113 -;source-doc/base-drv/./ch376.c:53: return USB_ERR_DISK_WRITE; +;source-doc/base-drv/./ch376.c:61: return USB_ERR_DISK_WRITE; ld l,0x1e jr l_ch_get_status_00126 l_ch_get_status_00113: -;source-doc/base-drv/./ch376.c:55: if (ch_status == CH_USB_INT_DISCONNECT) { +;source-doc/base-drv/./ch376.c:63: if (ch_status == CH_USB_INT_DISCONNECT) { ld a, l sub 0x16 jr NZ,l_ch_get_status_00115 -;source-doc/base-drv/./ch376.c:56: ch_cmd_set_usb_mode(5); +;source-doc/base-drv/./ch376.c:64: ch_cmd_set_usb_mode(5); ld l,0x05 call _ch_cmd_set_usb_mode -;source-doc/base-drv/./ch376.c:57: return USB_ERR_NO_DEVICE; +;source-doc/base-drv/./ch376.c:65: return USB_ERR_NO_DEVICE; ld l,0x05 jr l_ch_get_status_00126 l_ch_get_status_00115: -;source-doc/base-drv/./ch376.c:60: if (ch_status == CH_USB_INT_BUF_OVER) +;source-doc/base-drv/./ch376.c:68: if (ch_status == CH_USB_INT_BUF_OVER) ld a, l sub 0x17 jr NZ,l_ch_get_status_00117 -;source-doc/base-drv/./ch376.c:61: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/./ch376.c:69: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_get_status_00126 l_ch_get_status_00117: -;source-doc/base-drv/./ch376.c:63: ch_status &= 0x2F; +;source-doc/base-drv/./ch376.c:71: ch_status &= 0x2F; ld a, l and 0x2f -;source-doc/base-drv/./ch376.c:65: if (ch_status == 0x2A) +;source-doc/base-drv/./ch376.c:73: if (ch_status == 0x2A) cp 0x2a jr NZ,l_ch_get_status_00119 -;source-doc/base-drv/./ch376.c:66: return USB_ERR_NAK; +;source-doc/base-drv/./ch376.c:74: return USB_ERR_NAK; ld l,0x01 jr l_ch_get_status_00126 l_ch_get_status_00119: -;source-doc/base-drv/./ch376.c:68: if (ch_status == 0x2E) +;source-doc/base-drv/./ch376.c:76: if (ch_status == 0x2E) cp 0x2e jr NZ,l_ch_get_status_00121 -;source-doc/base-drv/./ch376.c:69: return USB_ERR_STALL; +;source-doc/base-drv/./ch376.c:77: return USB_ERR_STALL; ld l,0x02 jr l_ch_get_status_00126 l_ch_get_status_00121: -;source-doc/base-drv/./ch376.c:71: ch_status &= 0x23; +;source-doc/base-drv/./ch376.c:79: ch_status &= 0x23; and 0x23 -;source-doc/base-drv/./ch376.c:73: if (ch_status == 0x20) +;source-doc/base-drv/./ch376.c:81: if (ch_status == 0x20) cp 0x20 jr NZ,l_ch_get_status_00123 -;source-doc/base-drv/./ch376.c:74: return USB_ERR_TIMEOUT; +;source-doc/base-drv/./ch376.c:82: return USB_ERR_TIMEOUT; ld l,0x03 jr l_ch_get_status_00126 l_ch_get_status_00123: -;source-doc/base-drv/./ch376.c:76: if (ch_status == 0x23) +;source-doc/base-drv/./ch376.c:84: if (ch_status == 0x23) sub 0x23 jr NZ,l_ch_get_status_00125 -;source-doc/base-drv/./ch376.c:77: return USB_TOKEN_OUT_OF_SYNC; +;source-doc/base-drv/./ch376.c:85: return USB_TOKEN_OUT_OF_SYNC; ld l,0x07 jr l_ch_get_status_00126 l_ch_get_status_00125: -;source-doc/base-drv/./ch376.c:79: return USB_ERR_UNEXPECTED_STATUS_FROM_; +;source-doc/base-drv/./ch376.c:87: return USB_ERR_UNEXPECTED_STATUS_FROM_; ld l,0x08 l_ch_get_status_00126: -;source-doc/base-drv/./ch376.c:80: } +;source-doc/base-drv/./ch376.c:88: } ret -;source-doc/base-drv/./ch376.c:82: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } +;source-doc/base-drv/./ch376.c:90: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } ; --------------------------------- ; Function ch_cmd_reset_all ; --------------------------------- _ch_cmd_reset_all: ld l,0x05 jp _ch_command -;source-doc/base-drv/./ch376.c:101: uint8_t ch_probe(void) { +;source-doc/base-drv/./ch376.c:109: uint8_t ch_probe(void) { ; --------------------------------- ; Function ch_probe ; --------------------------------- _ch_probe: -;source-doc/base-drv/./ch376.c:103: do { +;source-doc/base-drv/./ch376.c:111: do { ld c,0x05 l_ch_probe_00103: -;source-doc/base-drv/./ch376.c:86: ch_command(CH_CMD_CHECK_EXIST); +;source-doc/base-drv/./ch376.c:94: ch_command(CH_CMD_CHECK_EXIST); push bc ld l,0x06 call _ch_command pop bc -;source-doc/base-drv/./ch376.c:87: CH376_DATA_PORT = (uint8_t)~0x55; +;source-doc/base-drv/./ch376.c:95: CH376_DATA_PORT = (uint8_t)~0x55; ld a,0xaa push bc ld bc,_CH376_DATA_PORT out (c),a call _delay pop bc -;source-doc/base-drv/./ch376.c:89: complement = CH376_DATA_PORT; +;source-doc/base-drv/./ch376.c:97: complement = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/./ch376.c:90: return complement == 0x55; +;source-doc/base-drv/./ch376.c:98: return complement == 0x55; sub 0x55 jr NZ,l_ch_probe_00102 -;source-doc/base-drv/./ch376.c:104: if (ch_cmd_check_exist()) -;source-doc/base-drv/./ch376.c:105: return true; +;source-doc/base-drv/./ch376.c:112: if (ch_cmd_check_exist()) +;source-doc/base-drv/./ch376.c:113: return true; ld l,0x01 jr l_ch_probe_00107 l_ch_probe_00102: -;source-doc/base-drv/./ch376.c:107: delay_medium(); +;source-doc/base-drv/./ch376.c:115: delay_medium(); push bc call _delay_medium pop bc -;source-doc/base-drv/./ch376.c:108: } while (--i != 0); +;source-doc/base-drv/./ch376.c:116: } while (--i != 0); dec c - ld a, c -;source-doc/base-drv/./ch376.c:110: return false; - or a jr NZ,l_ch_probe_00103 - ld l,a +;source-doc/base-drv/./ch376.c:118: return false; + ld l,0x00 l_ch_probe_00107: -;source-doc/base-drv/./ch376.c:111: } +;source-doc/base-drv/./ch376.c:119: } ret -;source-doc/base-drv/./ch376.c:113: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:121: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { ; --------------------------------- ; Function ch_cmd_set_usb_mode ; --------------------------------- _ch_cmd_set_usb_mode: -;source-doc/base-drv/./ch376.c:114: uint8_t result = 0; - ld h,0x00 -;source-doc/base-drv/./ch376.c:116: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; + ld c, l +;source-doc/base-drv/./ch376.c:122: uint8_t result = 0; + ld b,0x00 +;source-doc/base-drv/./ch376.c:124: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; ld a,0x15 + push bc ld bc,_CH376_COMMAND_PORT out (c),a -;source-doc/base-drv/./ch376.c:117: delay(); - push hl call _delay - pop hl -;source-doc/base-drv/./ch376.c:118: CH376_DATA_PORT = mode; - ld a, l + pop bc +;source-doc/base-drv/./ch376.c:126: CH376_DATA_PORT = mode; + ld a, c + push bc ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:119: delay(); - push hl call _delay - pop hl -;source-doc/base-drv/./ch376.c:123: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { - ld l,0x7f + pop bc +;source-doc/base-drv/./ch376.c:131: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { + ld c,0x7f l_ch_cmd_set_usb_mode_00103: - ld a, h + ld a, b sub 0x51 - jr NZ,l_ch_cmd_set_usb_mode_00136 + jr NZ,l_ch_cmd_set_usb_mode_00146 ld a,0x01 - jr l_ch_cmd_set_usb_mode_00137 -l_ch_cmd_set_usb_mode_00136: + jr l_ch_cmd_set_usb_mode_00147 +l_ch_cmd_set_usb_mode_00146: xor a -l_ch_cmd_set_usb_mode_00137: - ld c,a - bit 0,a +l_ch_cmd_set_usb_mode_00147: + ld e, a + bit 0, e jr NZ,l_ch_cmd_set_usb_mode_00105 - ld a, h + ld a, b sub 0x5f jr Z,l_ch_cmd_set_usb_mode_00105 - dec l + dec c jr Z,l_ch_cmd_set_usb_mode_00105 -;source-doc/base-drv/./ch376.c:124: result = CH376_DATA_PORT; +;source-doc/base-drv/./ch376.c:132: result = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) - ld h, a -;source-doc/base-drv/./ch376.c:125: delay(); - push hl + ld b, a +;source-doc/base-drv/./ch376.c:133: delay(); + push bc call _delay - pop hl + pop bc jr l_ch_cmd_set_usb_mode_00103 l_ch_cmd_set_usb_mode_00105: -;source-doc/base-drv/./ch376.c:128: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; - ld a, c +;source-doc/base-drv/./ch376.c:136: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; + ld a, e or a jr Z,l_ch_cmd_set_usb_mode_00108 - ld hl,0x0000 + ld l,0x00 jr l_ch_cmd_set_usb_mode_00109 l_ch_cmd_set_usb_mode_00108: - ld hl,0x000e + ld l,0x0e l_ch_cmd_set_usb_mode_00109: -;source-doc/base-drv/./ch376.c:129: } +;source-doc/base-drv/./ch376.c:137: } ret -;source-doc/base-drv/./ch376.c:131: uint8_t ch_cmd_get_ic_version(void) { +;source-doc/base-drv/./ch376.c:139: uint8_t ch_cmd_get_ic_version(void) { ; --------------------------------- ; Function ch_cmd_get_ic_version ; --------------------------------- _ch_cmd_get_ic_version: -;source-doc/base-drv/./ch376.c:132: ch_command(CH_CMD_GET_IC_VER); +;source-doc/base-drv/./ch376.c:140: ch_command(CH_CMD_GET_IC_VER); ld l,0x01 call _ch_command -;source-doc/base-drv/./ch376.c:133: return CH376_DATA_PORT & 0x1f; +;source-doc/base-drv/./ch376.c:141: return CH376_DATA_PORT & 0x1f; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) and 0x1f ld l, a -;source-doc/base-drv/./ch376.c:134: } +;source-doc/base-drv/./ch376.c:142: } ret -;source-doc/base-drv/./ch376.c:136: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { +;source-doc/base-drv/./ch376.c:144: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { ; --------------------------------- ; Function ch_issue_token ; --------------------------------- _ch_issue_token: -;source-doc/base-drv/./ch376.c:137: ch_command(CH_CMD_ISSUE_TKN_X); + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./ch376.c:145: ch_command(CH_CMD_ISSUE_TKN_X); ld l,0x4e call _ch_command -;source-doc/base-drv/./ch376.c:138: CH376_DATA_PORT = toggle_bit; - ld hl,2+0 - add hl, sp - ld a, (hl) +;source-doc/base-drv/./ch376.c:146: delay(); + call _delay +;source-doc/base-drv/./ch376.c:147: delay(); + call _delay +;source-doc/base-drv/./ch376.c:148: CH376_DATA_PORT = toggle_bit; + ld a,(ix+4) ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:139: delay(); +;source-doc/base-drv/./ch376.c:149: delay(); call _delay -;source-doc/base-drv/./ch376.c:140: CH376_DATA_PORT = endpoint << 4 | pid; - ld iy,3 - add iy, sp - ld a,(iy+0) +;source-doc/base-drv/./ch376.c:150: delay(); + call _delay +;source-doc/base-drv/./ch376.c:151: CH376_DATA_PORT = endpoint << 4 | pid; + ld a,(ix+5) add a, a add a, a add a, a add a, a - inc iy - or (iy+0) + or (ix+6) ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:141: delay(); -;source-doc/base-drv/./ch376.c:142: } +;source-doc/base-drv/./ch376.c:152: delay(); + call _delay +;source-doc/base-drv/./ch376.c:153: delay(); +;source-doc/base-drv/./ch376.c:154: } + pop ix jp _delay -;source-doc/base-drv/./ch376.c:144: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:156: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_in ; --------------------------------- _ch_issue_token_in: -;source-doc/base-drv/./ch376.c:145: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); - ld e,l - ld d,h + ex de, hl +;source-doc/base-drv/./ch376.c:157: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); + ld l, e + ld h, d ld a, (hl) rrca and 0x07 @@ -402,23 +421,26 @@ l_ch_issue_token_in_00103: xor a l_ch_issue_token_in_00104: ld h,0x09 - ld l,b push hl + inc sp + push bc + inc sp push af inc sp call _ch_issue_token pop af inc sp -;source-doc/base-drv/./ch376.c:146: } +;source-doc/base-drv/./ch376.c:158: } ret -;source-doc/base-drv/./ch376.c:148: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:160: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_out ; --------------------------------- _ch_issue_token_out: -;source-doc/base-drv/./ch376.c:149: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); - ld e,l - ld d,h + ex de, hl +;source-doc/base-drv/./ch376.c:161: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); + ld l, e + ld h, d ld a, (hl) rrca and 0x07 @@ -433,16 +455,18 @@ l_ch_issue_token_out_00103: xor a l_ch_issue_token_out_00104: ld h,0x01 - ld l,b push hl + inc sp + push bc + inc sp push af inc sp call _ch_issue_token pop af inc sp -;source-doc/base-drv/./ch376.c:150: } +;source-doc/base-drv/./ch376.c:162: } ret -;source-doc/base-drv/./ch376.c:152: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } +;source-doc/base-drv/./ch376.c:164: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } ; --------------------------------- ; Function ch_issue_token_out_ep0 ; --------------------------------- @@ -458,7 +482,7 @@ _ch_issue_token_out_ep0: pop af inc sp ret -;source-doc/base-drv/./ch376.c:154: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } +;source-doc/base-drv/./ch376.c:166: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } ; --------------------------------- ; Function ch_issue_token_in_ep0 ; --------------------------------- @@ -474,7 +498,7 @@ _ch_issue_token_in_ep0: pop af inc sp ret -;source-doc/base-drv/./ch376.c:156: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } +;source-doc/base-drv/./ch376.c:168: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } ; --------------------------------- ; Function ch_issue_token_setup ; --------------------------------- @@ -492,7 +516,7 @@ _ch_issue_token_setup: pop af inc sp ret -;source-doc/base-drv/./ch376.c:158: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/./ch376.c:170: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer ; --------------------------------- @@ -501,42 +525,43 @@ _ch_data_in_transfer: ld ix,0 add ix,sp push af -;source-doc/base-drv/./ch376.c:162: if (buffer_size == 0) +;source-doc/base-drv/./ch376.c:174: if (buffer_size == 0) ld a,(ix+7) or (ix+6) jr NZ,l_ch_data_in_transfer_00102 -;source-doc/base-drv/./ch376.c:163: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:175: return USB_ERR_OK; ld l,0x00 jp l_ch_data_in_transfer_00110 l_ch_data_in_transfer_00102: -;source-doc/base-drv/./ch376.c:165: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/./ch376.c:177: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:166: do { +;source-doc/base-drv/./ch376.c:178: do { ld c,(ix+8) ld b,(ix+9) - pop de + inc sp + inc sp push bc l_ch_data_in_transfer_00107: -;source-doc/base-drv/./ch376.c:167: ch_issue_token_in(endpoint); - ld l,c - ld h,b - push hl +;source-doc/base-drv/./ch376.c:179: ch_issue_token_in(endpoint); + push bc + ld l, c + ld h, b call _ch_issue_token_in call _ch_long_wait_int_and_get_statu ld a, l pop bc ld l, a -;source-doc/base-drv/./ch376.c:170: CHECK(result); +;source-doc/base-drv/./ch376.c:182: CHECK(result); or a jr NZ,l_ch_data_in_transfer_00110 -;source-doc/base-drv/./ch376.c:172: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/./ch376.c:184: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b pop hl - ld a,(hl) push hl + ld a, (hl) and 0x01 xor 0x01 and 0x01 @@ -545,31 +570,32 @@ l_ch_data_in_transfer_00107: and 0xfe or l ld (de), a -;source-doc/base-drv/./ch376.c:174: count = ch_read_data(buffer); +;source-doc/base-drv/./ch376.c:186: count = ch_read_data(buffer); push bc ld l,(ix+4) ld h,(ix+5) call _ch_read_data + ld e, a pop bc -;source-doc/base-drv/./ch376.c:176: if (count == 0) { - ld e,a -;source-doc/base-drv/./ch376.c:177: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:188: if (count == 0) { + ld a, e +;source-doc/base-drv/./ch376.c:189: USB_MODULE_LEDS = 0x00; or a jr NZ,l_ch_data_in_transfer_00106 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:178: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/./ch376.c:190: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_data_in_transfer_00110 l_ch_data_in_transfer_00106: -;source-doc/base-drv/./ch376.c:181: buffer += count; - ld a, e - add a,(ix+4) +;source-doc/base-drv/./ch376.c:193: buffer += count; + ld a,(ix+4) + add a, e ld (ix+4),a - ld a,0x00 - adc a,(ix+5) - ld (ix+5),a -;source-doc/base-drv/./ch376.c:182: buffer_size -= count; + jr NC,l_ch_data_in_transfer_00147 + inc (ix+5) +l_ch_data_in_transfer_00147: +;source-doc/base-drv/./ch376.c:194: buffer_size -= count; ld d,0x00 ld a,(ix+6) sub e @@ -577,26 +603,26 @@ l_ch_data_in_transfer_00106: ld a,(ix+7) sbc a, d ld (ix+7),a -;source-doc/base-drv/./ch376.c:183: } while (buffer_size > 0); +;source-doc/base-drv/./ch376.c:195: } while (buffer_size > 0); xor a cp (ix+6) sbc a,(ix+7) - jp PO, l_ch_data_in_transfer_00137 + jp PO, l_ch_data_in_transfer_00148 xor 0x80 -l_ch_data_in_transfer_00137: +l_ch_data_in_transfer_00148: jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/./ch376.c:185: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:197: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:187: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:199: return USB_ERR_OK; ld l,0x00 l_ch_data_in_transfer_00110: -;source-doc/base-drv/./ch376.c:188: } +;source-doc/base-drv/./ch376.c:200: } ld sp, ix pop ix ret -;source-doc/base-drv/./ch376.c:190: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/./ch376.c:202: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- @@ -604,50 +630,53 @@ _ch_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./ch376.c:194: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/./ch376.c:206: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:196: ch_issue_token_in(endpoint); +;source-doc/base-drv/./ch376.c:208: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in -;source-doc/base-drv/./ch376.c:198: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/./ch376.c:210: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a,l or a jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/./ch376.c:200: endpoint->toggle = !endpoint->toggle; - ld l,(ix+8) - ld h,(ix+9) - ld a,(hl) +;source-doc/base-drv/./ch376.c:212: endpoint->toggle = !endpoint->toggle; + ld e,(ix+8) + ld d,(ix+9) + ld c, e + ld b, d + ex de, hl + ld a, (hl) and 0x01 xor 0x01 and 0x01 - ld e,a - ld a,(hl) + ld e, a + ld a, (bc) and 0xfe or e - ld (hl),a -;source-doc/base-drv/./ch376.c:202: count = ch_read_data(buffer); + ld (bc), a +;source-doc/base-drv/./ch376.c:214: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) call _ch_read_data -;source-doc/base-drv/./ch376.c:204: *buffer_size = count; +;source-doc/base-drv/./ch376.c:216: *buffer_size = count; ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/./ch376.c:206: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:218: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:208: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:220: return USB_ERR_OK; ld l,0x00 l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/./ch376.c:209: } +;source-doc/base-drv/./ch376.c:221: } pop ix ret -;source-doc/base-drv/./ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +;source-doc/base-drv/./ch376.c:223: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_out_transfer ; --------------------------------- @@ -657,7 +686,7 @@ _ch_data_out_transfer: add ix,sp push af dec sp -;source-doc/base-drv/./ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); +;source-doc/base-drv/./ch376.c:226: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) ld b,(ix+9) ld e, c @@ -665,43 +694,44 @@ _ch_data_out_transfer: inc de ld a, (de) ld (ix-3),a -;source-doc/base-drv/./ch376.c:216: USB_MODULE_LEDS = 0x02; +;source-doc/base-drv/./ch376.c:228: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS out (c),a pop bc -;source-doc/base-drv/./ch376.c:218: while (buffer_length > 0) { +;source-doc/base-drv/./ch376.c:230: while (buffer_length > 0) { ld (ix-2),c ld (ix-1),b l_ch_data_out_transfer_00103: xor a cp (ix+6) sbc a,(ix+7) - jp PO, l_ch_data_out_transfer_00130 + jp PO, l_ch_data_out_transfer_00138 xor 0x80 -l_ch_data_out_transfer_00130: +l_ch_data_out_transfer_00138: jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/./ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; - ld d,(ix-3) - ld e,0x00 - ld a, d - sub (ix+6) +;source-doc/base-drv/./ch376.c:231: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; + ld e,(ix-3) + ld d,0x00 ld a, e + sub (ix+6) + ld a, d sbc a,(ix+7) - jp PO, l_ch_data_out_transfer_00131 + jp PO, l_ch_data_out_transfer_00139 xor 0x80 -l_ch_data_out_transfer_00131: +l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00108 jr l_ch_data_out_transfer_00109 l_ch_data_out_transfer_00108: - ld d,(ix+6) - ld e,(ix+7) + ld e,(ix+6) + ld d,(ix+7) l_ch_data_out_transfer_00109: -;source-doc/base-drv/./ch376.c:220: buffer = ch_write_data(buffer, size); +;source-doc/base-drv/./ch376.c:232: buffer = ch_write_data(buffer, size); push bc push de - push de + ld a, e + push af inc sp ld l,(ix+4) ld h,(ix+5) @@ -713,18 +743,18 @@ l_ch_data_out_transfer_00109: pop bc ld (ix+4),l ld (ix+5),h -;source-doc/base-drv/./ch376.c:221: buffer_length -= size; - ld e,0x00 +;source-doc/base-drv/./ch376.c:233: buffer_length -= size; + ld d,0x00 ld a,(ix+6) - sub d + sub e ld (ix+6),a ld a,(ix+7) - sbc a, e + sbc a, d ld (ix+7),a -;source-doc/base-drv/./ch376.c:222: ch_issue_token_out(endpoint); - ld l,c - ld h,b - push hl +;source-doc/base-drv/./ch376.c:234: ch_issue_token_out(endpoint); + push bc + ld l, c + ld h, b call _ch_issue_token_out call _ch_long_wait_int_and_get_statu ld a, l @@ -732,7 +762,7 @@ l_ch_data_out_transfer_00109: ld l, a or a jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/./ch376.c:226: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/./ch376.c:238: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l,(ix-2) @@ -748,33 +778,33 @@ l_ch_data_out_transfer_00109: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/./ch376.c:229: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:241: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:231: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:243: return USB_ERR_OK; ld l,0x00 l_ch_data_out_transfer_00106: -;source-doc/base-drv/./ch376.c:232: } +;source-doc/base-drv/./ch376.c:244: } ld sp, ix pop ix ret -;source-doc/base-drv/./ch376.c:234: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:246: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function ch_set_usb_address ; --------------------------------- _ch_set_usb_address: -;source-doc/base-drv/./ch376.c:235: ch_command(CH_CMD_SET_USB_ADDR); +;source-doc/base-drv/./ch376.c:247: ch_command(CH_CMD_SET_USB_ADDR); push hl ld l,0x13 call _ch_command pop hl -;source-doc/base-drv/./ch376.c:236: CH376_DATA_PORT = device_address; +;source-doc/base-drv/./ch376.c:248: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:237: delay(); -;source-doc/base-drv/./ch376.c:238: } +;source-doc/base-drv/./ch376.c:249: delay(); +;source-doc/base-drv/./ch376.c:250: } jp _delay _result: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s index 37be1196..2ba02fa6 100644 --- a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -53,17 +53,12 @@ _USB_MODULE_LEDS .EQU 0xff8a ; Function hub_get_descriptor ; --------------------------------- _hub_get_descriptor: - push ix - ld ix,0 - add ix,sp - dec sp ;source-doc/base-drv/./class_hub.c:8: return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); - ld c,l + ld a,l ld b,h inc hl - ld a, (hl) - ld (ix-1),a - ld l, c + ld c, (hl) + ld l, a ld h, b ld a, (hl) rlca @@ -72,12 +67,13 @@ _hub_get_descriptor: rlca and 0x0f ld b, a - ld a,(ix-1) - ld c,b - ld b,a + ld hl,_cmd_get_hub_descriptor + ld a, c + push af + inc sp push bc + inc sp push de - ld hl,_cmd_get_hub_descriptor push hl call _usb_control_transfer pop af @@ -85,8 +81,6 @@ _hub_get_descriptor: pop af ld a, l ;source-doc/base-drv/./class_hub.c:9: } - inc sp - pop ix ret _cmd_get_hub_descriptor: DEFB +0xa0 diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 200bb6b2..962ed8e1 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -53,12 +53,12 @@ _USB_MODULE_LEDS .EQU 0xff8a ; Function usbdev_control_transfer ; --------------------------------- _usbdev_control_transfer: + push ix + ld ix,0 + add ix,sp ;source-doc/base-drv/./dev_transfers.c:29: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); - ld hl,2 - add hl, sp - ld e, (hl) - inc hl - ld d, (hl) + ld e,(ix+4) + ld d,(ix+5) ld l, e ld h, d inc hl @@ -70,23 +70,22 @@ _usbdev_control_transfer: rlca rlca and 0x0f - ld iy,6 - add iy, sp - ld e,(iy+0) - ld d,(iy+1) - ld c,a + ld e,(ix+8) + ld d,(ix+9) push bc + inc sp + push af + inc sp push de - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+6) + ld h,(ix+7) push hl call _usb_control_transfer pop af pop af pop af ;source-doc/base-drv/./dev_transfers.c:30: } + pop ix ret ;source-doc/base-drv/./dev_transfers.c:32: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { ; --------------------------------- @@ -96,15 +95,13 @@ _usbdev_blk_out_trnsfer: push ix ld ix,0 add ix,sp - dec sp + push af ;source-doc/base-drv/./dev_transfers.c:36: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; ld c,(ix+4) ld b,(ix+5) - ld e, c - ld d, b - inc de - inc de - inc de + ld hl,0x0003 + add hl, bc + ex (sp), hl ;source-doc/base-drv/./dev_transfers.c:38: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); ld l, c ld h, b @@ -115,8 +112,11 @@ _usbdev_blk_out_trnsfer: rlca and 0x0f push bc + pop de + pop hl + push hl push de - push de + push hl push af inc sp ld l,(ix+8) @@ -130,18 +130,17 @@ _usbdev_blk_out_trnsfer: pop af pop af inc sp - pop de + ld d, l pop bc ;source-doc/base-drv/./dev_transfers.c:40: if (result == USB_ERR_STALL) { - ld a, l + ld a, d sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 ;source-doc/base-drv/./dev_transfers.c:41: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); ld l, c ld h, b inc hl - ld a, (hl) - ld (ix-1),a + ld d, (hl) ld l, c ld h, b ld a, (hl) @@ -151,30 +150,33 @@ _usbdev_blk_out_trnsfer: rlca and 0x0f ld b, a - ld l, e - ld h, d + pop hl + push hl ld a, (hl) rrca and 0x07 push de - ld h,(ix-1) - ld l,b - push hl + inc sp + push bc + inc sp push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop de ;source-doc/base-drv/./dev_transfers.c:42: endpoint->toggle = 0; - ex de, hl + pop hl + push hl res 0, (hl) ;source-doc/base-drv/./dev_transfers.c:43: return USB_ERR_STALL; ld l,0x02 -;source-doc/base-drv/./dev_transfers.c:46: RETURN_CHECK(result); + jr l_usbdev_blk_out_trnsfer_00103 l_usbdev_blk_out_trnsfer_00102: +;source-doc/base-drv/./dev_transfers.c:46: RETURN_CHECK(result); + ld l, d +l_usbdev_blk_out_trnsfer_00103: ;source-doc/base-drv/./dev_transfers.c:47: } - inc sp + ld sp, ix pop ix ret ;source-doc/base-drv/./dev_transfers.c:49: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { @@ -185,16 +187,16 @@ _usbdev_bulk_in_transfer: push ix ld ix,0 add ix,sp - dec sp + push af ;source-doc/base-drv/./dev_transfers.c:53: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; ld c,(ix+4) ld b,(ix+5) ld hl,0x0006 add hl, bc + ex (sp), hl ;source-doc/base-drv/./dev_transfers.c:55: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); - ld e,c - ld d,b - ex de,hl + ld l, c + ld h, b ld a, (hl) rlca rlca @@ -202,8 +204,11 @@ _usbdev_bulk_in_transfer: rlca and 0x0f push bc + pop de + pop hl + push hl push de - push de + push hl push af inc sp ld l,(ix+8) @@ -217,18 +222,17 @@ _usbdev_bulk_in_transfer: pop af pop af inc sp - pop de + ld d, l pop bc ;source-doc/base-drv/./dev_transfers.c:57: if (result == USB_ERR_STALL) { - ld a, l + ld a, d sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 ;source-doc/base-drv/./dev_transfers.c:58: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); ld l, c ld h, b inc hl - ld a, (hl) - ld (ix-1),a + ld d, (hl) ld l, c ld h, b ld a, (hl) @@ -238,30 +242,33 @@ _usbdev_bulk_in_transfer: rlca and 0x0f ld b, a - ld l, e - ld h, d + pop hl + push hl ld a, (hl) rrca and 0x07 push de - ld h,(ix-1) - ld l,b - push hl + inc sp + push bc + inc sp push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop de ;source-doc/base-drv/./dev_transfers.c:59: endpoint->toggle = 0; - ex de, hl + pop hl + push hl res 0, (hl) ;source-doc/base-drv/./dev_transfers.c:60: return USB_ERR_STALL; ld l,0x02 -;source-doc/base-drv/./dev_transfers.c:63: RETURN_CHECK(result); + jr l_usbdev_bulk_in_transfer_00103 l_usbdev_bulk_in_transfer_00102: +;source-doc/base-drv/./dev_transfers.c:63: RETURN_CHECK(result); + ld l, d +l_usbdev_bulk_in_transfer_00103: ;source-doc/base-drv/./dev_transfers.c:64: } - inc sp + ld sp, ix pop ix ret ;source-doc/base-drv/./dev_transfers.c:66: usb_error usbdev_dat_in_trnsfer(device_config *const device, @@ -272,7 +279,7 @@ _usbdev_dat_in_trnsfer: push ix ld ix,0 add ix,sp - dec sp + push af ;source-doc/base-drv/./dev_transfers.c:73: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; ld c,(ix+4) ld b,(ix+5) @@ -282,17 +289,19 @@ _usbdev_dat_in_trnsfer: inc de inc de push de - ld l,(ix+10) - ld e, l - add hl, hl - add hl, de + ld a,(ix+10) + ld e, a + add a, a + add a, e pop de - ld h,0x00 - add hl, de + add a, e + ld (ix-2),a + ld a,0x00 + adc a, d + ld (ix-1),a ;source-doc/base-drv/./dev_transfers.c:75: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - ld e,c - ld d,b - ex de,hl + ld l, c + ld h, b ld a, (hl) rlca rlca @@ -300,8 +309,11 @@ _usbdev_dat_in_trnsfer: rlca and 0x0f push bc + pop de + pop hl + push hl push de - push de + push hl push af inc sp ld l,(ix+8) @@ -315,18 +327,17 @@ _usbdev_dat_in_trnsfer: pop af pop af inc sp - pop de + ld d, l pop bc ;source-doc/base-drv/./dev_transfers.c:77: if (result == USB_ERR_STALL) { - ld a, l + ld a, d sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 ;source-doc/base-drv/./dev_transfers.c:78: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); ld l, c ld h, b inc hl - ld a, (hl) - ld (ix-1),a + ld d, (hl) ld l, c ld h, b ld a, (hl) @@ -336,30 +347,33 @@ _usbdev_dat_in_trnsfer: rlca and 0x0f ld b, a - ld l, e - ld h, d + pop hl + push hl ld a, (hl) rrca and 0x07 push de - ld h,(ix-1) - ld l,b - push hl + inc sp + push bc + inc sp push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop de ;source-doc/base-drv/./dev_transfers.c:79: endpoint->toggle = 0; - ex de, hl + pop hl + push hl res 0, (hl) ;source-doc/base-drv/./dev_transfers.c:80: return USB_ERR_STALL; ld l,0x02 -;source-doc/base-drv/./dev_transfers.c:83: RETURN_CHECK(result); + jr l_usbdev_dat_in_trnsfer_00103 l_usbdev_dat_in_trnsfer_00102: +;source-doc/base-drv/./dev_transfers.c:83: RETURN_CHECK(result); + ld l, d +l_usbdev_dat_in_trnsfer_00103: ;source-doc/base-drv/./dev_transfers.c:84: } - inc sp + ld sp, ix pop ix ret ;source-doc/base-drv/./dev_transfers.c:86: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) { @@ -370,14 +384,16 @@ _usbdev_dat_in_trnsfer_0: push ix ld ix,0 add ix,sp + push af + push af + ld c, l + ld b, h + ld (ix-2),e + ld (ix-1),d ;source-doc/base-drv/./dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; - push hl - ld c,l - ld b,h - pop iy - inc iy - inc iy - inc iy + ld hl,0x0003 + add hl, bc + ex (sp), hl ;source-doc/base-drv/./dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); ld l, c ld h, b @@ -387,22 +403,24 @@ _usbdev_dat_in_trnsfer_0: rlca rlca and 0x0f - ld l,(ix+4) - ld h,0x00 + ld e,(ix+4) + ld d,0x00 push bc - push iy - push iy + ld l,(ix-4) + ld h,(ix-3) + push hl push af inc sp - push hl push de + ld l,(ix-2) + ld h,(ix-1) + push hl call _usb_data_in_transfer pop af pop af pop af inc sp ld d, l - pop iy pop bc ;source-doc/base-drv/./dev_transfers.c:94: if (result == USB_ERR_STALL) { ld a, d @@ -422,23 +440,23 @@ _usbdev_dat_in_trnsfer_0: rlca and 0x0f ld b, a - push iy pop hl + push hl ld a, (hl) rrca and 0x07 - push iy - ld e,b push de + inc sp + push bc + inc sp push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop iy ;source-doc/base-drv/./dev_transfers.c:96: endpoint->toggle = 0; - push iy pop hl + push hl res 0, (hl) ;source-doc/base-drv/./dev_transfers.c:97: return USB_ERR_STALL; ld a,0x02 @@ -448,6 +466,7 @@ l_usbdev_dat_in_trnsfer_0_00102: ld a, d l_usbdev_dat_in_trnsfer_0_00103: ;source-doc/base-drv/./dev_transfers.c:101: } + ld sp, ix pop ix pop hl inc sp diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 34a3b265..91a0e9bc 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -53,34 +53,41 @@ _USB_MODULE_LEDS .EQU 0xff8a ; Function parse_endpoint_keyboard ; --------------------------------- _parse_endpoint_keyboard: + push ix + ld ix,0 + add ix,sp + push af ;source-doc/base-drv/./enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; inc hl inc hl inc hl - push hl - pop iy + ld c,l + ld b,h ;source-doc/base-drv/./enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; - push iy - pop bc + inc sp + inc sp + push bc ld l, e ld h, d inc hl inc hl ld a, (hl) + pop hl + push hl rlca and 0x0e - ld l, a - ld a, (bc) + push bc + ld c, a + ld a, (hl) and 0xf1 - or l - ld (bc), a + or c + ld (hl), a + pop bc ;source-doc/base-drv/./enumerate.c:17: ep->toggle = 0; - push iy - pop hl + ld l, c + ld h, b res 0, (hl) ;source-doc/base-drv/./enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); - push iy - pop bc inc bc ld hl,4 add hl, de @@ -100,6 +107,8 @@ _parse_endpoint_keyboard: or l ld (bc), a ;source-doc/base-drv/./enumerate.c:19: } + ld sp, ix + pop ix ret ;source-doc/base-drv/./enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { ; --------------------------------- @@ -109,6 +118,8 @@ _identify_class_driver: push ix ld ix,0 add ix,sp + push af + dec sp ;source-doc/base-drv/./enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; ld c,(ix+4) ld b,(ix+5) @@ -118,39 +129,48 @@ _identify_class_driver: inc hl ld b, (hl) ;source-doc/base-drv/./enumerate.c:23: if (p->bInterfaceClass == 2) - push bc - pop iy - ld e,(iy+5) + ld e, c + ld d, b + ld hl,5 + add hl, de + ld e, (hl) ld a, e sub 0x02 jr NZ,l_identify_class_driver_00102 ;source-doc/base-drv/./enumerate.c:24: return USB_IS_CDC; ld l,0x03 - jr l_identify_class_driver_00118 + jp l_identify_class_driver_00118 l_identify_class_driver_00102: ;source-doc/base-drv/./enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) ld a, e sub 0x08 - jr NZ,l_identify_class_driver_00177 + jr NZ,l_identify_class_driver_00199 ld a,0x01 - jr l_identify_class_driver_00178 -l_identify_class_driver_00177: + jr l_identify_class_driver_00200 +l_identify_class_driver_00199: xor a -l_identify_class_driver_00178: - ld d,a +l_identify_class_driver_00200: + ld (ix-3),a + ld hl,0x0006 + add hl, bc + ld (ix-2),l + ld (ix-1),h + ld hl,0x0007 + add hl, bc + ld c, l + ld b, h + ld a,(ix-3) or a jr Z,l_identify_class_driver_00104 - ld hl,0x0006 - add hl,bc + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) cp 0x06 jr Z,l_identify_class_driver_00107 sub 0x05 jr NZ,l_identify_class_driver_00104 l_identify_class_driver_00107: - ld hl,0x0007 - add hl,bc - ld a, (hl) + ld a, (bc) sub 0x50 jr NZ,l_identify_class_driver_00104 ;source-doc/base-drv/./enumerate.c:27: return USB_IS_MASS_STORAGE; @@ -158,17 +178,15 @@ l_identify_class_driver_00107: jr l_identify_class_driver_00118 l_identify_class_driver_00104: ;source-doc/base-drv/./enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) - ld a, d + ld a,(ix-3) or a jr Z,l_identify_class_driver_00109 - ld hl,0x0006 - add hl,bc + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) sub 0x04 jr NZ,l_identify_class_driver_00109 - ld hl,0x0007 - add hl,bc - ld a, (hl) + ld a, (bc) or a jr NZ,l_identify_class_driver_00109 ;source-doc/base-drv/./enumerate.c:30: return USB_IS_FLOPPY; @@ -179,14 +197,12 @@ l_identify_class_driver_00109: ld a, e sub 0x09 jr NZ,l_identify_class_driver_00113 - ld hl,0x0006 - add hl,bc + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) or a jr NZ,l_identify_class_driver_00113 - ld hl,7 - add hl, bc - ld a, (hl) + ld a, (bc) or a jr NZ,l_identify_class_driver_00113 ;source-doc/base-drv/./enumerate.c:33: return USB_IS_HUB; @@ -205,6 +221,7 @@ l_identify_class_driver_00117: ld l,0x06 l_identify_class_driver_00118: ;source-doc/base-drv/./enumerate.c:39: } + ld sp, ix pop ix ret ;source-doc/base-drv/./enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { @@ -278,19 +295,25 @@ l_op_endpoint_next_00103: ; Function op_parse_endpoint ; --------------------------------- _op_parse_endpoint: + push ix + ld ix,0 + add ix,sp + push af ;source-doc/base-drv/./enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; ld c,l ld b,h - ld hl,27 - add hl,bc - ld e, (hl) - inc hl - ld d, (hl) - push de - pop iy + ld de,0x001c + add hl, de + ld a, (hl) + dec hl + ld l, (hl) + ld (ix-2),l + ld (ix-1),a ;source-doc/base-drv/./enumerate.c:59: device_config *const device = working->p_current_device; + ld e, c + ld d, b ld hl,29 - add hl,bc + add hl, de ld e, (hl) inc hl ld d, (hl) @@ -311,7 +334,9 @@ _op_parse_endpoint: l_op_parse_endpoint_00102: ;source-doc/base-drv/./enumerate.c:64: parse_endpoints(device, endpoint); push bc - push iy + ld l,(ix-2) + ld h,(ix-1) + push hl push de call _parse_endpoints pop af @@ -324,8 +349,8 @@ l_op_parse_endpoint_00103: ;source-doc/base-drv/./enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); ex de, hl push bc - push iy - pop de + ld e,(ix-2) + ld d,(ix-1) call _parse_endpoint_keyboard pop bc ;source-doc/base-drv/./enumerate.c:72: } @@ -333,8 +358,11 @@ l_op_parse_endpoint_00104: ;source-doc/base-drv/./enumerate.c:74: return op_endpoint_next(working); ld l, c ld h, b + call _op_endpoint_next ;source-doc/base-drv/./enumerate.c:75: } - jp _op_endpoint_next + ld sp, ix + pop ix + ret ;source-doc/base-drv/./enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { ; --------------------------------- ; Function configure_device @@ -344,84 +372,83 @@ _configure_device: ld ix,0 add ix,sp push af + push af ;source-doc/base-drv/./enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; - ld e,(ix+8) - ld d,(ix+9) - ld c, e - ld b, d + ld a,(ix+8) + ld (ix-4),a + ld a,(ix+9) + ld (ix-3),a + pop bc + push bc inc bc inc bc - ld l,(ix+6) - ld h,(ix+7) - inc hl - inc hl - ld a, (hl) + ld e,(ix+6) + ld d,(ix+7) + inc de + inc de + ld a, (de) ld (bc), a ;source-doc/base-drv/./enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; - ld hl,0x0001 - add hl, de - ex (sp), hl - push iy - ex (sp), hl - ld l,(ix+4) - ex (sp), hl - ex (sp), hl - ld h,(ix+5) - ex (sp), hl - pop iy - push iy - pop bc + ld a,(ix-4) + add a,0x01 + ld (ix-2),a + ld a,(ix-3) + adc a,0x00 + ld (ix-1),a + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b ld hl,10 - add hl, bc + add hl, de ld a, (hl) + pop de pop hl push hl + push de ld (hl), a ;source-doc/base-drv/./enumerate.c:81: dev_cfg->address = working->current_device_address; - ld c, e - ld b, d - push iy - pop hl - ld a,+((0x0018) & 0xFF) - add a,l - ld l,a - ld a,+((0x0018) / 256) - adc a,h - ld h,a + pop de + push de + ld l, c + ld h, b + push bc + ld bc,0x0018 + add hl, bc + pop bc ld a, (hl) add a, a add a, a add a, a add a, a ld l, a - ld a, (bc) + ld a, (de) and 0x0f or l - ld (bc), a + ld (de), a ;source-doc/base-drv/./enumerate.c:82: dev_cfg->type = working->usb_device; - ld c, e - ld b, d - push iy - pop hl + pop de + push de + ld l, c + ld h, b inc hl inc hl ld a, (hl) and 0x0f ld l, a - ld a, (bc) + ld a, (de) and 0xf0 or l - ld (bc), a + ld (de), a ;source-doc/base-drv/./enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); - push iy - pop bc ld hl,36 add hl, bc ld c, (hl) + ld l,(ix-2) + ld h,(ix-1) + ld b, (hl) pop hl - ld b,(hl) push hl - ex de, hl ld a, (hl) rlca rlca @@ -429,8 +456,10 @@ _configure_device: rlca and 0x0f ld h, c - ld l,b push hl + inc sp + push bc + inc sp push af inc sp call _usbtrn_set_configuration @@ -446,17 +475,21 @@ _op_capture_hub_driver_interfac: push ix ld ix,0 add ix,sp - ld iy, -7 - add iy, sp - ld sp, iy + push af + push af + push af + dec sp + ex de, hl ;source-doc/base-drv/./enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - push hl - ex de,hl - pop iy - ld c,(iy+28) - ld a,(iy+27) - ld (ix-4),a - ld (ix-3),c + ld l, e + ld h, d + ld bc,0x001c + add hl, bc + ld a, (hl) + dec hl + ld l, (hl) + ld (ix-4),l + ld (ix-3),a ;source-doc/base-drv/./enumerate.c:92: working->hub_config = &hub_config; ld hl,0x0019 add hl, de @@ -465,8 +498,8 @@ _op_capture_hub_driver_interfac: ld hl,0 add hl, sp ld c, l + ld b, h ld l,(ix-2) - ld b,h ld h,(ix-1) ld (hl), c inc hl @@ -490,9 +523,10 @@ _op_capture_hub_driver_interfac: pop af pop af pop af - ld a, l pop de - or a + ld a, l + inc l + dec l jr NZ,l_op_capture_hub_driver_interfa ;source-doc/base-drv/./enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); ex de, hl @@ -511,12 +545,16 @@ _op_cap_drv_intf: push ix ld ix,0 add ix,sp - ld iy, -16 - add iy, sp - ld sp, iy + ld c, l + ld b, h + ld hl, -16 + add hl, sp + ld sp, hl + ld (ix-2),c + ld (ix-1),b ;source-doc/base-drv/./enumerate.c:102: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - ld (ix-2),l - ld (ix-1),h + ld l,(ix-2) + ld h,(ix-1) ld de,0x001b add hl, de ld e, (hl) @@ -541,27 +579,33 @@ _op_cap_drv_intf: ld a,(ix-1) adc a,0x00 ld d, a - push bc - pop iy - ld a,(iy+4) + ld l, c + ld h, b + inc hl + inc hl + inc hl + inc hl + ld a, (hl) ld (de), a ;source-doc/base-drv/./enumerate.c:106: working->p_current_device = NULL; - ld l,(ix-2) - ld h,(ix-1) - ld de,0x001d - add hl,de - ld (ix-4),l - ld (ix-3),h + ld a,(ix-2) + add a,0x1d + ld (ix-4),a + ld a,(ix-1) + adc a,0x00 + ld (ix-3),a + ld l,(ix-4) + ld h,(ix-3) xor a ld (hl), a inc hl ld (hl), a ;source-doc/base-drv/./enumerate.c:108: switch (working->usb_device) { - ld e,(ix-2) - ld d,(ix-1) - inc de - inc de - ld a, (de) + ld l,(ix-2) + ld h,(ix-1) + inc hl + inc hl + ld a, (hl) cp 0x06 jr Z,l_op_cap_drv_intf_00104 sub 0x0f @@ -580,12 +624,11 @@ l_op_cap_drv_intf_00104: push bc ld hl,2 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x0c - push hl - call _memset_callee + ld b,0x0c +l_op_cap_drv_intf_00169: + ld (hl),0x00 + inc hl + djnz l_op_cap_drv_intf_00169 pop bc ;source-doc/base-drv/./enumerate.c:117: working->p_current_device = &unkown_dev_cfg; ld hl,0 @@ -617,11 +660,11 @@ l_op_cap_drv_intf_00107: ;source-doc/base-drv/./enumerate.c:123: device_config *dev_cfg = find_first_free(); push bc call _find_first_free -;source-doc/base-drv/./enumerate.c:124: if (dev_cfg == NULL) + ex de, hl pop bc - ld a,h - or l - ex de,hl +;source-doc/base-drv/./enumerate.c:124: if (dev_cfg == NULL) + ld a, d + or e jr NZ,l_op_cap_drv_intf_00109 ;source-doc/base-drv/./enumerate.c:125: return USB_ERR_OUT_OF_MEMORY; ld l,0x83 @@ -669,17 +712,21 @@ l_op_cap_drv_intf_00115: ; Function op_id_class_drv ; --------------------------------- _op_id_class_drv: + ex de, hl ;source-doc/base-drv/./enumerate.c:139: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; - push hl - ex de,hl - pop iy - ld l,(iy+27) - ld h,(iy+28) + ld l, e + ld h, d + ld bc,0x001c + add hl, bc + ld a, (hl) + dec hl + ld l, (hl) ;source-doc/base-drv/./enumerate.c:141: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; ld c, e ld b, d inc bc inc bc + ld h, a ld l, (hl) ld a,0x05 sub l @@ -692,11 +739,9 @@ _op_id_class_drv: ld a, l pop de pop bc - ld l,0x00 jr l_op_id_class_drv_00106 l_op_id_class_drv_00105: xor a - ld l, a l_op_id_class_drv_00106: ld (bc), a ;source-doc/base-drv/./enumerate.c:143: CHECK(op_cap_drv_intf(working)); @@ -713,22 +758,22 @@ l_op_id_class_drv_00106: ; Function op_get_cfg_desc ; --------------------------------- _op_get_cfg_desc: + push ix + ld ix,0 + add ix,sp + push af ex de, hl ;source-doc/base-drv/./enumerate.c:151: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); - ld iy,0x001f - add iy, de - push iy - pop bc - push de - push iy - push bc - ld hl,0x0000 - push hl - ld l,0x8c + ld hl,0x001f + add hl, de + ex (sp), hl + pop hl push hl - call _memset_callee - pop iy - pop de + ld b,0x8c +l_op_get_cfg_desc_00121: + ld (hl),0x00 + inc hl + djnz l_op_get_cfg_desc_00121 ;source-doc/base-drv/./enumerate.c:153: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; ld c, e ld b, d @@ -752,21 +797,23 @@ _op_get_cfg_desc: pop bc ld c, (hl) push de - push iy - push iy + ld l,(ix-2) + ld h,(ix-1) + push hl ld h,0x8c - ld l,a push hl + inc sp + push af + inc sp push bc call _usbtrn_gfull_cfg_desc pop af pop af pop af ld a, l - pop iy pop de or a - ret NZ + jr NZ,l_op_get_cfg_desc_00105 ;source-doc/base-drv/./enumerate.c:158: working->ptr = (working->config.buffer + sizeof(config_descriptor)); ld hl,0x001b add hl, de @@ -789,8 +836,8 @@ _op_get_cfg_desc: add hl, de ld c, l ld b, h - push iy pop hl + push hl inc hl inc hl inc hl @@ -801,9 +848,12 @@ _op_get_cfg_desc: ex de, hl call _op_id_class_drv or a - ret NZ + jr NZ,l_op_get_cfg_desc_00105 ;source-doc/base-drv/./enumerate.c:163: return result; +l_op_get_cfg_desc_00105: ;source-doc/base-drv/./enumerate.c:164: } + ld sp, ix + pop ix ret ;source-doc/base-drv/./enumerate.c:166: usb_error read_all_configs(enumeration_state *const state) { ; --------------------------------- @@ -819,17 +869,17 @@ _read_all_configs: ;source-doc/base-drv/./enumerate.c:171: memset(&working, 0, sizeof(_working)); ld hl,0 add hl, sp - push hl - push hl - ld hl,0x0000 - push hl - ld l,0xab - push hl - call _memset_callee + ex de, hl + ld l, e + ld h, d + ld b,0xab +l_read_all_configs_00148: + ld (hl),0x00 + inc hl + djnz l_read_all_configs_00148 ;source-doc/base-drv/./enumerate.c:172: working.state = state; - pop hl - ld e,l - ld d,h + ld l, e + ld h, d ld a,(ix+4) ld (hl), a inc hl @@ -842,23 +892,31 @@ _read_all_configs: push hl call _usbtrn_get_descriptor pop af + ld c, l pop de - ld a, l + ld a, c or a - jr NZ,l_read_all_configs_00111 + jr Z,l_read_all_configs_00102 + ld l, c + jr l_read_all_configs_00111 +l_read_all_configs_00102: ;source-doc/base-drv/./enumerate.c:176: state->next_device_address++; - ld l,(ix+4) - ld h,(ix+5) - ld c, (hl) - inc c - ld (hl), c + ld a,(ix+4) + ld c,(ix+5) + ld l, a + ld h, c + ld b, (hl) + inc b + ld l, a + ld h, c + ld (hl), b ;source-doc/base-drv/./enumerate.c:177: working.current_device_address = state->next_device_address; ld hl,0x0018 add hl, de - ld (hl), c + ld (hl), b ;source-doc/base-drv/./enumerate.c:178: CHECK(usbtrn_set_address(working.current_device_address)); push de - ld l, c + ld l, b call _usbtrn_set_address pop de ld a, l @@ -867,7 +925,7 @@ _read_all_configs: jr NZ,l_read_all_configs_00111 ld c,a l_read_all_configs_00109: - ld hl,20+0 + ld hl,20 add hl, sp ld b, (hl) ld a, c @@ -907,30 +965,29 @@ l_read_all_configs_00111: ; --------------------------------- _enumerate_all_devices: push ix - ld ix,0 - add ix,sp dec sp ;source-doc/base-drv/./enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); ;source-doc/base-drv/./enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); ld hl,0 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x01 - push hl - call _memset_callee + ex de, hl + ld l, e + ld h, d + ld (hl),0x00 ;source-doc/base-drv/./enumerate.c:193: state.next_device_address = 0; - ld (ix-1),0x00 + xor a + ld (de), a ;source-doc/base-drv/./enumerate.c:195: usb_error result = read_all_configs(&state); - ld hl,0 - add hl, sp - push hl + ld c, e + ld b, d + push de + push bc call _read_all_configs pop af + ld c, l + pop de ;source-doc/base-drv/./enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; - ld a,(ix-1) - ld c,l + ld a, (de) ld ((_x + 1)),a ;source-doc/base-drv/./enumerate.c:199: CHECK(result); ld a, c diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s index 7974a653..69ffc3bd 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -62,10 +62,15 @@ _hub_set_feature: ;source-doc/base-drv/./enumerate_hub.c:15: set_feature = cmd_set_feature; ld hl,0 add hl, sp - ex de, hl - ld bc,0x0008 + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,_cmd_set_feature + ld bc,0x0008 ldir + pop bc ;source-doc/base-drv/./enumerate_hub.c:17: set_feature.bValue[0] = feature; ld a,(ix+6) ld (ix-6),a @@ -73,26 +78,28 @@ _hub_set_feature: ld a,(ix+7) ld (ix-4),a ;source-doc/base-drv/./enumerate_hub.c:19: return usb_control_transfer(&set_feature, 0, hub_config->address, hub_config->max_packet_size); - ld l,(ix+4) - ld h,(ix+5) - ld e,l - ld d,h + ld a,(ix+4) + ld d,(ix+5) + ld l, a + ld h, d inc hl - ld b, (hl) - ex de, hl + ld e, (hl) + ld l, a + ld h, d ld a, (hl) rlca rlca rlca rlca and 0x0f - ld c,a - push bc - ld hl,0x0000 + ld h, e push hl - ld hl,4 - add hl, sp + inc sp + push af + inc sp + ld hl,0x0000 push hl + push bc call _usb_control_transfer ;source-doc/base-drv/./enumerate_hub.c:20: } ld sp,ix @@ -136,10 +143,15 @@ _hub_clear_feature: ;source-doc/base-drv/./enumerate_hub.c:24: clear_feature = cmd_clear_feature; ld hl,0 add hl, sp - ex de, hl - ld bc,0x0008 + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,_cmd_clear_feature + ld bc,0x0008 ldir + pop bc ;source-doc/base-drv/./enumerate_hub.c:26: clear_feature.bValue[0] = feature; ld a,(ix+6) ld (ix-6),a @@ -147,26 +159,28 @@ _hub_clear_feature: ld a,(ix+7) ld (ix-4),a ;source-doc/base-drv/./enumerate_hub.c:28: return usb_control_transfer(&clear_feature, 0, hub_config->address, hub_config->max_packet_size); - ld l,(ix+4) - ld h,(ix+5) - ld e,l - ld d,h + ld a,(ix+4) + ld d,(ix+5) + ld l, a + ld h, d inc hl - ld b, (hl) - ex de, hl + ld e, (hl) + ld l, a + ld h, d ld a, (hl) rlca rlca rlca rlca and 0x0f - ld c,a - push bc - ld hl,0x0000 + ld h, e push hl - ld hl,4 - add hl, sp + inc sp + push af + inc sp + ld hl,0x0000 push hl + push bc call _usb_control_transfer ;source-doc/base-drv/./enumerate_hub.c:29: } ld sp,ix @@ -187,17 +201,17 @@ _hub_get_status_port: ld hl,0 add hl, sp ex de, hl - ld bc,0x0008 ld hl,_cmd_get_status_port + ld bc,0x0008 ldir ;source-doc/base-drv/./enumerate_hub.c:35: get_status_port.bIndex[0] = index; ld a,(ix+6) ld (ix-4),a ;source-doc/base-drv/./enumerate_hub.c:36: return usb_control_transfer(&get_status_port, port_status, hub_config->address, hub_config->max_packet_size); - ld l,(ix+4) - ld h,(ix+5) - ld e,l - ld d,h + ld e,(ix+4) + ld d,(ix+5) + ld l, e + ld h, d inc hl ld b, (hl) ex de, hl @@ -209,11 +223,13 @@ _hub_get_status_port: and 0x0f ld e,(ix+7) ld d,(ix+8) - ld c,a + ld hl,0 + add hl, sp push bc + inc sp + push af + inc sp push de - ld hl,4 - add hl, sp push hl call _usb_control_transfer ;source-doc/base-drv/./enumerate_hub.c:37: } @@ -228,111 +244,104 @@ _configure_usb_hub: push ix ld ix,0 add ix,sp - ld iy, -14 - add iy, sp - ld sp, iy + ld c, l + ld b, h + ld hl, -15 + add hl, sp + ld sp, hl + ld (ix-3),c + ld (ix-2),b ;source-doc/base-drv/./enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config; - push hl - ld c,l - ld b,h - pop iy - ld a,(iy+25) - ld (ix-2),a - ld a,(iy+26) - ld (ix-1),a + ld c,(ix-3) + ld b,(ix-2) + ld hl,25 + add hl, bc + ld c, (hl) + inc hl + ld b, (hl) ;source-doc/base-drv/./enumerate_hub.c:47: CHECK(hub_get_descriptor(hub_config, &hub_description)); push bc ld hl,2 add hl, sp ex de, hl - ld l,(ix-2) - ld h,(ix-1) + ld l, c + ld h, b call _hub_get_descriptor + ld e, a pop bc - ld e,a + ld a, e or a jr Z,l_configure_usb_hub_00102 ld l, e jp l_configure_usb_hub_00129 l_configure_usb_hub_00102: ;source-doc/base-drv/./enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts; - ld d,(ix-12) + ld a,(ix-13) + ld (ix-1),a ;source-doc/base-drv/./enumerate_hub.c:50: do { l_configure_usb_hub_00126: ;source-doc/base-drv/./enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); push bc - push de + ld d,(ix-1) ld e,0x08 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_clear_feature pop af pop af - pop de pop bc ld a, l or a jp NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); push bc - push de + ld d,(ix-1) ld e,0x08 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_set_feature pop af pop af - pop de pop bc ld a, l or a jp NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i); push bc - push de + ld d,(ix-1) ld e,0x04 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_clear_feature pop af pop af - pop de - push de + pop bc +;source-doc/base-drv/./enumerate_hub.c:57: CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i)); + push bc + ld d,(ix-1) ld e,0x04 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_set_feature pop af pop af - pop de pop bc ld a, l or a jp NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status)); push bc - push de - ld hl,12 + ld hl,10 add hl, sp push hl - push de + ld a,(ix-1) + push af inc sp - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_get_status_port pop af pop af inc sp - pop de pop bc ld a, l or a @@ -342,97 +351,81 @@ l_configure_usb_hub_00126: add hl, sp ld a, (hl) and 0x01 - jp Z, l_configure_usb_hub_00124 + jr Z,l_configure_usb_hub_00124 ;source-doc/base-drv/./enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); push bc - push de + ld d,(ix-1) ld e,0x10 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_clear_feature pop af pop af - pop de pop bc ld a, l or a - jp NZ,l_configure_usb_hub_00129 + jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); push bc - push de + ld d,(ix-1) ld e,0x11 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_clear_feature pop af pop af - pop de pop bc ld a, l or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); push bc - push de + ld d,(ix-1) ld e,0x14 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_clear_feature pop af pop af - pop de pop bc ld a, l or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:67: delay_short(); push bc - push de call _delay_short - pop de - push de - ld hl,12 + pop bc +;source-doc/base-drv/./enumerate_hub.c:69: CHECK(hub_get_status_port(hub_config, i, &port_status)); + push bc + ld hl,10 add hl, sp push hl - push de + ld a,(ix-1) + push af inc sp - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_get_status_port pop af pop af inc sp - pop de pop bc ld a, l or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:70: delay_short(); push bc - push de call _delay_short - pop de + pop bc ;source-doc/base-drv/./enumerate_hub.c:72: CHECK(read_all_configs(working->state)); - pop hl - ld e,(hl) - ld c,l - ld b,h + ld l,(ix-3) + ld h,(ix-2) + ld e, (hl) inc hl - ld h, (hl) + ld d, (hl) push bc push de - ld l, e - push hl call _read_all_configs pop af - pop de pop bc ld a, l or a @@ -441,28 +434,23 @@ l_configure_usb_hub_00126: l_configure_usb_hub_00124: ;source-doc/base-drv/./enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); push bc - push de + ld d,(ix-1) ld e,0x08 push de - ld l,(ix-2) - ld h,(ix-1) - push hl + push bc call _hub_clear_feature pop af pop af - pop de pop bc ld a, l or a jr NZ,l_configure_usb_hub_00129 l_configure_usb_hub_00127: ;source-doc/base-drv/./enumerate_hub.c:77: } while (--i != 0); - dec d - ld a, d + dec (ix-1) + jp NZ, l_configure_usb_hub_00126 ;source-doc/base-drv/./enumerate_hub.c:79: return USB_ERR_OK; - or a - jp NZ,l_configure_usb_hub_00126 - ld l,a + ld l,0x00 l_configure_usb_hub_00129: ;source-doc/base-drv/./enumerate_hub.c:80: } ld sp, ix diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s index 0c6b3b90..0211f31d 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -60,17 +60,22 @@ _parse_endpoints: ;source-doc/base-drv/./enumerate_storage.c:7: if (!(pEndpoint->bmAttributes & 0x02)) ld c,(ix+6) ld b,(ix+7) - push bc - pop iy - ld a,(iy+3) + ld l, c + ld h, b + inc hl + inc hl + inc hl + ld a, (hl) ld (ix-2),a - bit 1,a + bit 1,(ix-2) ;source-doc/base-drv/./enumerate_storage.c:8: return; jr Z,l_parse_endpoints_00108 ;source-doc/base-drv/./enumerate_storage.c:10: const uint8_t x = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); - push bc - pop iy - ld a,(iy+4) + ld e, c + ld d, b + ld hl,4 + add hl, de + ld a, (hl) ld (ix-1),a ;source-doc/base-drv/./enumerate_storage.c:11: endpoint_param *const eps = storage_dev->endpoints; ld e,(ix+4) @@ -82,24 +87,27 @@ _parse_endpoints: inc bc inc bc ld a, (bc) - ld c,a + ld l,a and 0x80 - ld b,0x00 + ld c, a + xor a ;source-doc/base-drv/./enumerate_storage.c:14: if (pEndpoint->bmAttributes & 0x01) { // 3 -> Interrupt bit 0,(ix-2) jr Z,l_parse_endpoints_00106 ;source-doc/base-drv/./enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) - or b + or c ;source-doc/base-drv/./enumerate_storage.c:16: return; jr Z,l_parse_endpoints_00108 ;source-doc/base-drv/./enumerate_storage.c:18: ep = &eps[ENDPOINT_INTERRUPT_IN]; - ld hl,0x0006 - add hl, de - ex de, hl + ld a, e + add a,0x06 + ld e, a + jr NC,l_parse_endpoints_00107 + inc d jr l_parse_endpoints_00107 l_parse_endpoints_00106: ;source-doc/base-drv/./enumerate_storage.c:21: ep = (pEndpoint->bEndpointAddress & 0x80) ? &eps[ENDPOINT_BULK_IN] : &eps[ENDPOINT_BULK_OUT]; - or b + or c jr Z,l_parse_endpoints_00110 inc de inc de @@ -107,17 +115,17 @@ l_parse_endpoints_00106: l_parse_endpoints_00110: l_parse_endpoints_00107: ;source-doc/base-drv/./enumerate_storage.c:24: ep->number = pEndpoint->bEndpointAddress & 0x07; - ld l, e - ld h, d - ld a, c + ld c, e + ld b, d + ld a, l and 0x07 rlca and 0x0e - ld c, a - ld a, (hl) + ld l, a + ld a, (bc) and 0xf1 - or c - ld (hl), a + or l + ld (bc), a ;source-doc/base-drv/./enumerate_storage.c:25: ep->toggle = 0; ld l, e ld h, d diff --git a/Source/HBIOS/ch376-native/base-drv/print.c.s b/Source/HBIOS/ch376-native/base-drv/print.c.s index 2bfe74db..12d60c89 100644 --- a/Source/HBIOS/ch376-native/base-drv/print.c.s +++ b/Source/HBIOS/ch376-native/base-drv/print.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -50,33 +50,32 @@ ; Function print_device_mounted ; --------------------------------- _print_device_mounted: + push ix + ld ix,0 + add ix,sp ;source-doc/base-drv/./print.c:4: print_string("\r\n $"); ld hl,print_str_0 call _print_string ;source-doc/base-drv/./print.c:5: print_uint16(count); - ld iy,4 - add iy, sp - ld l,(iy+0) - ld h,0x00 + ld e,(ix+6) + ld d,0x00 + ex de, hl call _print_uint16 ;source-doc/base-drv/./print.c:6: print_string(description); - ld hl,2 - add hl, sp - ld a, (hl) - inc hl - ld h, (hl) - ld l, a + ld l,(ix+4) + ld h,(ix+5) call _print_string ;source-doc/base-drv/./print.c:7: if (count > 1) ld a,0x01 - ld iy,4 - add iy, sp - sub (iy+0) - ret NC + sub (ix+6) + jr NC,l_print_device_mounted_00103 ;source-doc/base-drv/./print.c:8: print_string("S$"); ld hl,print_str_1 + call _print_string +l_print_device_mounted_00103: ;source-doc/base-drv/./print.c:9: } - jp _print_string + pop ix + ret print_str_0: DEFB 0x0d DEFB 0x0a diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index 6d9e0b73..a7e42b9c 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./protocol.c:28: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { +;source-doc/base-drv/./protocol.c:29: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { ; --------------------------------- ; Function usbtrn_get_descriptor ; --------------------------------- @@ -59,18 +59,26 @@ _usbtrn_get_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:31: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/./protocol.c:32: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl - ld bc,0x0008 ld hl,_cmd_get_device_descriptor + ld bc,0x0008 ldir -;source-doc/base-drv/./protocol.c:32: cmd.wLength = 8; +;source-doc/base-drv/./protocol.c:33: cmd.wLength = 8; ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); +;source-doc/base-drv/./protocol.c:35: debugger(); + PUSH AF + PUSH BC + XOR A + LD B, 7 + DEFB 0x49, 0xD7 + POP BC + POP AF +;source-doc/base-drv/./protocol.c:36: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); ld c,(ix+4) ld b,(ix+5) ld e, c @@ -91,24 +99,24 @@ _usbtrn_get_descriptor: pop af pop af pop bc -;source-doc/base-drv/./protocol.c:36: CHECK(result); +;source-doc/base-drv/./protocol.c:38: CHECK(result); ld a, l or a jr NZ,l_usbtrn_get_descriptor_00103 -;source-doc/base-drv/./protocol.c:38: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/./protocol.c:40: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl push bc - ld bc,0x0008 ld hl,_cmd_get_device_descriptor + ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:39: cmd.wLength = 18; +;source-doc/base-drv/./protocol.c:41: cmd.wLength = 18; ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); +;source-doc/base-drv/./protocol.c:42: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); ld e,(ix+4) ld d,(ix+5) ld hl,7 @@ -127,9 +135,9 @@ _usbtrn_get_descriptor: pop af pop af pop af -;source-doc/base-drv/./protocol.c:42: RETURN_CHECK(result); +;source-doc/base-drv/./protocol.c:44: RETURN_CHECK(result); l_usbtrn_get_descriptor_00103: -;source-doc/base-drv/./protocol.c:43: } +;source-doc/base-drv/./protocol.c:45: } ld sp, ix pop ix ret @@ -141,7 +149,7 @@ _cmd_get_device_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0008 -;source-doc/base-drv/./protocol.c:51: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { +;source-doc/base-drv/./protocol.c:53: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { ; --------------------------------- ; Function usbtrn_get_descriptor2 ; --------------------------------- @@ -149,85 +157,94 @@ _usbtrn_get_descriptor2: push ix ld ix,0 add ix,sp - ld hl, -10 + ld hl, -13 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:54: cmd = cmd_get_device_descriptor; - ld hl,0 +;source-doc/base-drv/./protocol.c:56: cmd = cmd_get_device_descriptor; + ld hl,2 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x0008 + ex de, hl ld hl,_cmd_get_device_descriptor + ld bc,0x0008 ldir - pop bc -;source-doc/base-drv/./protocol.c:55: cmd.wLength = 8; - ld (ix-4),0x08 +;source-doc/base-drv/./protocol.c:57: cmd.wLength = 8; + ld (ix-5),0x08 xor a - ld (ix-3),a -;source-doc/base-drv/./protocol.c:57: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); + ld (ix-4),a +;source-doc/base-drv/./protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); ld a,(ix+4) ld (ix-2),a - ld l, a ld a,(ix+5) ld (ix-1),a - ld h,a - ld e, c - ld d, b - push bc - ld b,0x08 - ld c,(ix+6) + ld c,(ix-2) + ld b,(ix-1) + ld a,0x08 + push af + inc sp + ld a,(ix+6) + push af + inc sp push bc + ld hl,6 + add hl, sp push hl - push de call _usb_control_transfer pop af pop af pop af - ld a, l - pop bc - ld l, a -;source-doc/base-drv/./protocol.c:59: CHECK(result); + ld (ix-12),l + ld (ix-3),l +;source-doc/base-drv/./protocol.c:61: CHECK(result); + ld a,(ix-12) or a - jr NZ,l_usbtrn_get_descriptor2_00103 -;source-doc/base-drv/./protocol.c:61: cmd = cmd_get_device_descriptor; - ld e, c - ld d, b - push bc - ld bc,0x0008 + jr Z,l_usbtrn_get_descriptor2_00102 + ld l,(ix-3) + jr l_usbtrn_get_descriptor2_00103 +l_usbtrn_get_descriptor2_00102: +;source-doc/base-drv/./protocol.c:63: cmd = cmd_get_device_descriptor; + ex de, hl + ld hl,2 + add hl, sp + ex de, hl ld hl,_cmd_get_device_descriptor + ld bc,0x0008 ldir - pop bc -;source-doc/base-drv/./protocol.c:62: cmd.wLength = 18; - ld (ix-4),0x12 +;source-doc/base-drv/./protocol.c:64: cmd.wLength = 18; + ld (ix-5),0x12 xor a - ld (ix-3),a -;source-doc/base-drv/./protocol.c:63: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); - ld e,(ix+4) - ld d,(ix+5) - ld hl,7 + ld (ix-4),a +;source-doc/base-drv/./protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); + ld a,(ix+4) + ld (ix-13),a + ld a,(ix+5) + ld (ix-12),a + pop hl + push hl + ld de,0x0007 add hl, de ld a, (hl) - ld e,(ix-2) - ld d,(ix-1) + ld (ix-3),a push af inc sp ld a,(ix+6) push af inc sp - push de - push bc + ld l,(ix-2) + ld h,(ix-1) + push hl + ld hl,6 + add hl, sp + push hl call _usb_control_transfer pop af pop af pop af l_usbtrn_get_descriptor2_00103: -;source-doc/base-drv/./protocol.c:64: } +;source-doc/base-drv/./protocol.c:66: } ld sp, ix pop ix ret -;source-doc/base-drv/./protocol.c:74: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/./protocol.c:76: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function usbtrn_set_address ; --------------------------------- @@ -235,22 +252,23 @@ _usbtrn_set_address: push ix ld ix,0 add ix,sp - ld iy, -8 - add iy, sp - ld sp, iy + push af + push af + push af + push af ld c, l -;source-doc/base-drv/./protocol.c:76: cmd = cmd_set_device_address; +;source-doc/base-drv/./protocol.c:78: cmd = cmd_set_device_address; ld hl,0 add hl, sp ex de, hl push bc - ld bc,0x0008 ld hl,_cmd_set_device_address + ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:77: cmd.bValue[0] = device_address; +;source-doc/base-drv/./protocol.c:79: cmd.bValue[0] = device_address; ld (ix-6),c -;source-doc/base-drv/./protocol.c:79: return usb_control_transfer(&cmd, 0, 0, 0); +;source-doc/base-drv/./protocol.c:81: return usb_control_transfer(&cmd, 0, 0, 0); xor a push af inc sp @@ -263,7 +281,7 @@ _usbtrn_set_address: add hl, sp push hl call _usb_control_transfer -;source-doc/base-drv/./protocol.c:80: } +;source-doc/base-drv/./protocol.c:82: } ld sp,ix pop ix ret @@ -275,7 +293,7 @@ _cmd_set_device_address: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:90: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { +;source-doc/base-drv/./protocol.c:92: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { ; --------------------------------- ; Function usbtrn_set_configuration ; --------------------------------- @@ -286,20 +304,22 @@ _usbtrn_set_configuration: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:92: cmd = cmd_set_configuration; +;source-doc/base-drv/./protocol.c:94: cmd = cmd_set_configuration; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x0008 + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,_cmd_set_configuration + ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:93: cmd.bValue[0] = configuration; +;source-doc/base-drv/./protocol.c:95: cmd.bValue[0] = configuration; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./protocol.c:95: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); +;source-doc/base-drv/./protocol.c:97: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); ld h,(ix+5) ld l,(ix+4) push hl @@ -307,7 +327,7 @@ _usbtrn_set_configuration: push hl push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:96: } +;source-doc/base-drv/./protocol.c:98: } ld sp,ix pop ix ret @@ -319,7 +339,7 @@ _cmd_set_configuration: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:110: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, +;source-doc/base-drv/./protocol.c:112: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, ; --------------------------------- ; Function usbtrn_get_config_descriptor ; --------------------------------- @@ -330,24 +350,26 @@ _usbtrn_get_config_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:116: cmd = cmd_get_config_descriptor; +;source-doc/base-drv/./protocol.c:118: cmd = cmd_get_config_descriptor; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x0008 + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,_cmd_get_config_descriptor + ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:117: cmd.bValue[0] = config_index; +;source-doc/base-drv/./protocol.c:119: cmd.bValue[0] = config_index; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./protocol.c:118: cmd.wLength = (uint16_t)buffer_size; +;source-doc/base-drv/./protocol.c:120: cmd.wLength = (uint16_t)buffer_size; ld e,(ix+7) ld (ix-2),e ld (ix-1),0x00 -;source-doc/base-drv/./protocol.c:120: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size)); +;source-doc/base-drv/./protocol.c:122: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size)); ld e,(ix+4) ld d,(ix+5) ld h,(ix+9) @@ -356,7 +378,7 @@ _usbtrn_get_config_descriptor: push de push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:121: } +;source-doc/base-drv/./protocol.c:123: } ld sp,ix pop ix ret @@ -368,7 +390,7 @@ _cmd_get_config_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:123: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, +;source-doc/base-drv/./protocol.c:125: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, ; --------------------------------- ; Function usbtrn_gfull_cfg_desc ; --------------------------------- @@ -376,7 +398,7 @@ _usbtrn_gfull_cfg_desc: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./protocol.c:131: max_packet_size)); +;source-doc/base-drv/./protocol.c:133: max_packet_size)); ld c,(ix+8) ld b,(ix+9) push bc @@ -398,40 +420,43 @@ _usbtrn_gfull_cfg_desc: ld a, l or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 -;source-doc/base-drv/./protocol.c:133: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; +;source-doc/base-drv/./protocol.c:135: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; ld l, c ld h, b inc hl inc hl ld d, (hl) -;source-doc/base-drv/./protocol.c:134: if (max_length > max_buffer_size) +;source-doc/base-drv/./protocol.c:136: if (max_length > max_buffer_size) ld a,(ix+7) sub d jr NC,l_usbtrn_gfull_cfg_desc_00104 -;source-doc/base-drv/./protocol.c:135: max_length = max_buffer_size; +;source-doc/base-drv/./protocol.c:137: max_length = max_buffer_size; ld d,(ix+7) l_usbtrn_gfull_cfg_desc_00104: -;source-doc/base-drv/./protocol.c:137: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); +;source-doc/base-drv/./protocol.c:139: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); ld h,(ix+6) ld l,(ix+5) push hl - ld e,(ix+4) push de + inc sp + ld a,(ix+4) + push af + inc sp push bc call _usbtrn_get_config_descriptor pop af pop af pop af ld a, l -;source-doc/base-drv/./protocol.c:139: return USB_ERR_OK; +;source-doc/base-drv/./protocol.c:141: return USB_ERR_OK; or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 ld l,a l_usbtrn_gfull_cfg_desc_00107: -;source-doc/base-drv/./protocol.c:140: } +;source-doc/base-drv/./protocol.c:142: } pop ix ret -;source-doc/base-drv/./protocol.c:144: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { +;source-doc/base-drv/./protocol.c:146: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { ; --------------------------------- ; Function usbtrn_clear_endpoint_halt ; --------------------------------- @@ -442,20 +467,22 @@ _usbtrn_clear_endpoint_halt: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:146: cmd = usb_cmd_clear_endpoint_halt; +;source-doc/base-drv/./protocol.c:148: cmd = usb_cmd_clear_endpoint_halt; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x0008 + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,_usb_cmd_clear_endpoint_halt + ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:147: cmd.bIndex[0] = endpoint_number; +;source-doc/base-drv/./protocol.c:149: cmd.bIndex[0] = endpoint_number; ld a,(ix+4) ld (ix-4),a -;source-doc/base-drv/./protocol.c:149: usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); +;source-doc/base-drv/./protocol.c:151: usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); ld h,(ix+6) ld l,(ix+5) push hl @@ -463,8 +490,8 @@ _usbtrn_clear_endpoint_halt: push hl push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:151: RETURN_CHECK(result); -;source-doc/base-drv/./protocol.c:152: } +;source-doc/base-drv/./protocol.c:153: RETURN_CHECK(result); +;source-doc/base-drv/./protocol.c:154: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index fc056368..a080f748 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./transfers.c:21: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, +;source-doc/base-drv/./transfers.c:24: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, ; --------------------------------- ; Function usb_ctrl_trnsfer_ext ; --------------------------------- @@ -56,26 +56,26 @@ _usb_ctrl_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:25: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+5) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00102 -;source-doc/base-drv/./transfers.c:26: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:29: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00102: -;source-doc/base-drv/./transfers.c:28: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+7) or (ix+6) jr Z,l_usb_ctrl_trnsfer_ext_00104 ld a,(ix+7) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00104 -;source-doc/base-drv/./transfers.c:29: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:32: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00104: -;source-doc/base-drv/./transfers.c:31: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); +;source-doc/base-drv/./transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); ld h,(ix+9) ld l,(ix+8) push hl @@ -90,10 +90,10 @@ l_usb_ctrl_trnsfer_ext_00104: pop af pop af l_usb_ctrl_trnsfer_ext_00106: -;source-doc/base-drv/./transfers.c:32: } +;source-doc/base-drv/./transfers.c:35: } pop ix ret -;source-doc/base-drv/./transfers.c:44: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +;source-doc/base-drv/./transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, ; --------------------------------- ; Function usb_control_transfer ; --------------------------------- @@ -103,7 +103,7 @@ _usb_control_transfer: add ix,sp push af push af -;source-doc/base-drv/./transfers.c:49: endpoint_param endpoint = {1, 0, max_packet_size}; +;source-doc/base-drv/./transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; ld hl,0 add hl, sp set 0, (hl) @@ -125,28 +125,28 @@ _usb_control_transfer: and 0xfc or e ld (hl), a -;source-doc/base-drv/./transfers.c:51: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); +;source-doc/base-drv/./transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); ld c,(ix+4) ld b,(ix+5) ld a, (bc) and 0x80 -;source-doc/base-drv/./transfers.c:53: if (transferIn && buffer == 0) +;source-doc/base-drv/./transfers.c:56: if (transferIn && buffer == 0) ld (ix-1),a or a jr Z,l_usb_control_transfer_00102 ld a,(ix+7) or (ix+6) jr NZ,l_usb_control_transfer_00102 -;source-doc/base-drv/./transfers.c:54: return USB_ERR_OTHER; +;source-doc/base-drv/./transfers.c:57: return USB_ERR_OTHER; ld l,0x0f jp l_usb_control_transfer_00113 l_usb_control_transfer_00102: -;source-doc/base-drv/./transfers.c:56: ch_set_usb_address(device_address); +;source-doc/base-drv/./transfers.c:59: ch_set_usb_address(device_address); push bc ld l,(ix+8) call _ch_set_usb_address pop bc -;source-doc/base-drv/./transfers.c:58: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); +;source-doc/base-drv/./transfers.c:61: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ld e,(ix+4) ld d,(ix+5) push bc @@ -160,17 +160,18 @@ l_usb_control_transfer_00102: call _ch_issue_token_setup call _ch_short_wait_int_and_get_stat pop bc +;source-doc/base-drv/./transfers.c:64: CHECK(result); ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:62: const uint16_t length = cmd_packet->wLength; +;source-doc/base-drv/./transfers.c:66: const uint16_t length = cmd_packet->wLength; ld hl,6 add hl, bc ld c, (hl) inc hl -;source-doc/base-drv/./transfers.c:65: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) - ld a,(hl) - ld b,a + ld b, (hl) +;source-doc/base-drv/./transfers.c:69: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) + ld a, b or c jr Z,l_usb_control_transfer_00115 ld e,(ix+6) @@ -201,56 +202,56 @@ l_usb_control_transfer_00117: l_usb_control_transfer_00118: jr l_usb_control_transfer_00116 l_usb_control_transfer_00115: -;source-doc/base-drv/./transfers.c:66: : USB_ERR_OK; - ld hl,0x0000 +;source-doc/base-drv/./transfers.c:70: : USB_ERR_OK; + ld l,0x00 l_usb_control_transfer_00116: -;source-doc/base-drv/./transfers.c:68: CHECK(result) +;source-doc/base-drv/./transfers.c:72: CHECK(result) ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:70: if (transferIn) { +;source-doc/base-drv/./transfers.c:74: if (transferIn) { ld a,(ix-1) or a jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/./transfers.c:71: ch_command(CH_CMD_WR_HOST_DATA); +;source-doc/base-drv/./transfers.c:75: ch_command(CH_CMD_WR_HOST_DATA); ld l,0x2c call _ch_command -;source-doc/base-drv/./transfers.c:72: CH376_DATA_PORT = 0; +;source-doc/base-drv/./transfers.c:76: CH376_DATA_PORT = 0; ld a,0x00 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./transfers.c:73: delay(); +;source-doc/base-drv/./transfers.c:77: delay(); call _delay -;source-doc/base-drv/./transfers.c:74: ch_issue_token_out_ep0(); +;source-doc/base-drv/./transfers.c:78: ch_issue_token_out_ep0(); call _ch_issue_token_out_ep0 -;source-doc/base-drv/./transfers.c:75: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ +;source-doc/base-drv/./transfers.c:79: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ call _ch_long_wait_int_and_get_statu +;source-doc/base-drv/./transfers.c:81: if (result == USB_ERR_OK || result == USB_ERR_STALL) ld a, l -;source-doc/base-drv/./transfers.c:77: if (result == USB_ERR_OK || result == USB_ERR_STALL) or a jr Z,l_usb_control_transfer_00108 - cp 0x02 + ld a, l + sub 0x02 jr NZ,l_usb_control_transfer_00109 l_usb_control_transfer_00108: -;source-doc/base-drv/./transfers.c:78: return USB_ERR_OK; +;source-doc/base-drv/./transfers.c:82: return USB_ERR_OK; ld l,0x00 jr l_usb_control_transfer_00113 l_usb_control_transfer_00109: -;source-doc/base-drv/./transfers.c:80: RETURN_CHECK(result); - ld l, a +;source-doc/base-drv/./transfers.c:84: RETURN_CHECK(result); jr l_usb_control_transfer_00113 l_usb_control_transfer_00112: -;source-doc/base-drv/./transfers.c:83: ch_issue_token_in_ep0(); +;source-doc/base-drv/./transfers.c:87: ch_issue_token_in_ep0(); call _ch_issue_token_in_ep0 -;source-doc/base-drv/./transfers.c:84: result = ch_long_wait_int_and_get_status(); +;source-doc/base-drv/./transfers.c:88: result = ch_long_wait_int_and_get_status(); call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/./transfers.c:86: RETURN_CHECK(result); +;source-doc/base-drv/./transfers.c:90: RETURN_CHECK(result); l_usb_control_transfer_00113: -;source-doc/base-drv/./transfers.c:87: } +;source-doc/base-drv/./transfers.c:91: } ld sp, ix pop ix ret -;source-doc/base-drv/./transfers.c:90: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:94: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_in_trnsfer_ext ; --------------------------------- @@ -258,26 +259,26 @@ _usb_dat_in_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:91: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:95: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trnsfer_ext_00102 ld a,(ix+5) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/./transfers.c:92: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:96: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/./transfers.c:94: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:98: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+10) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/./transfers.c:95: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:99: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/./transfers.c:97: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/./transfers.c:101: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -296,10 +297,10 @@ l_usb_dat_in_trnsfer_ext_00105: pop af inc sp l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/./transfers.c:98: } +;source-doc/base-drv/./transfers.c:102: } pop ix ret -;source-doc/base-drv/./transfers.c:101: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:105: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_in_trns_n_ext ; --------------------------------- @@ -307,34 +308,34 @@ _usb_dat_in_trns_n_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:102: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) +;source-doc/base-drv/./transfers.c:106: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trns_n_ext_00102 ld a,(ix+5) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00102 -;source-doc/base-drv/./transfers.c:103: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:107: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00102: -;source-doc/base-drv/./transfers.c:105: if (((uint16_t)endpoint & 0xC000) == 0) +;source-doc/base-drv/./transfers.c:109: if (((uint16_t)endpoint & 0xC000) == 0) ld a,(ix+10) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00105 -;source-doc/base-drv/./transfers.c:106: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:110: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00105: -;source-doc/base-drv/./transfers.c:108: if (((uint16_t)buffer_size & 0xC000) == 0) +;source-doc/base-drv/./transfers.c:112: if (((uint16_t)buffer_size & 0xC000) == 0) ld a,(ix+7) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00107 -;source-doc/base-drv/./transfers.c:109: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:113: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00107: -;source-doc/base-drv/./transfers.c:111: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/./transfers.c:115: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); ld c,(ix+6) ld b,(ix+7) ld l,(ix+9) @@ -353,76 +354,66 @@ l_usb_dat_in_trns_n_ext_00107: pop af inc sp l_usb_dat_in_trns_n_ext_00108: -;source-doc/base-drv/./transfers.c:112: } +;source-doc/base-drv/./transfers.c:116: } pop ix ret -;source-doc/base-drv/./transfers.c:124: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:128: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer ; --------------------------------- _usb_data_in_transfer: -;source-doc/base-drv/./transfers.c:125: ch_set_usb_address(device_address); - ld iy,6 - add iy, sp - ld l,(iy+0) + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:129: ch_set_usb_address(device_address); + ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:127: return ch_data_in_transfer(buffer, buffer_size, endpoint); - ld iy,7 - add iy, sp - ld l,(iy+0) - ld h,(iy+1) +;source-doc/base-drv/./transfers.c:131: return ch_data_in_transfer(buffer, buffer_size, endpoint); + ld l,(ix+9) + ld h,(ix+10) push hl - dec iy - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+6) + ld h,(ix+7) push hl - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+4) + ld h,(ix+5) push hl call _ch_data_in_transfer pop af pop af pop af -;source-doc/base-drv/./transfers.c:128: } +;source-doc/base-drv/./transfers.c:132: } + pop ix ret -;source-doc/base-drv/./transfers.c:140: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:144: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- _usb_data_in_transfer_n: -;source-doc/base-drv/./transfers.c:141: ch_set_usb_address(device_address); - ld iy,6 - add iy, sp - ld l,(iy+0) + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:145: ch_set_usb_address(device_address); + ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:143: return ch_data_in_transfer_n(buffer, buffer_size, endpoint); - ld iy,7 - add iy, sp - ld l,(iy+0) - ld h,(iy+1) +;source-doc/base-drv/./transfers.c:147: return ch_data_in_transfer_n(buffer, buffer_size, endpoint); + ld l,(ix+9) + ld h,(ix+10) push hl - dec iy - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+6) + ld h,(ix+7) push hl - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+4) + ld h,(ix+5) push hl call _ch_data_in_transfer_n pop af pop af pop af -;source-doc/base-drv/./transfers.c:144: } +;source-doc/base-drv/./transfers.c:148: } + pop ix ret -;source-doc/base-drv/./transfers.c:147: usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:151: usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_out_trns_ext ; --------------------------------- @@ -430,26 +421,26 @@ _usb_dat_out_trns_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:149: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:153: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_out_trns_ext_00102 ld a,(ix+5) sub 0x80 jr NC,l_usb_dat_out_trns_ext_00102 -;source-doc/base-drv/./transfers.c:150: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:154: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_out_trns_ext_00106 l_usb_dat_out_trns_ext_00102: -;source-doc/base-drv/./transfers.c:152: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:156: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+10) sub 0x80 jr NC,l_usb_dat_out_trns_ext_00105 -;source-doc/base-drv/./transfers.c:153: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:157: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_out_trns_ext_00106 l_usb_dat_out_trns_ext_00105: -;source-doc/base-drv/./transfers.c:155: return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/./transfers.c:159: return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -468,39 +459,34 @@ l_usb_dat_out_trns_ext_00105: pop af inc sp l_usb_dat_out_trns_ext_00106: -;source-doc/base-drv/./transfers.c:156: } +;source-doc/base-drv/./transfers.c:160: } pop ix ret -;source-doc/base-drv/./transfers.c:168: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:172: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- _usb_data_out_transfer: -;source-doc/base-drv/./transfers.c:169: ch_set_usb_address(device_address); - ld iy,6 - add iy, sp - ld l,(iy+0) + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/./transfers.c:173: ch_set_usb_address(device_address); + ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:171: return ch_data_out_transfer(buffer, buffer_size, endpoint); - ld iy,7 - add iy, sp - ld l,(iy+0) - ld h,(iy+1) +;source-doc/base-drv/./transfers.c:175: return ch_data_out_transfer(buffer, buffer_size, endpoint); + ld l,(ix+9) + ld h,(ix+10) push hl - dec iy - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+6) + ld h,(ix+7) push hl - dec iy - dec iy - ld l,(iy+0) - ld h,(iy+1) + ld l,(ix+4) + ld h,(ix+5) push hl call _ch_data_out_transfer pop af pop af pop af -;source-doc/base-drv/./transfers.c:172: } +;source-doc/base-drv/./transfers.c:176: } + pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 46c575d9..242ccf70 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -58,16 +58,20 @@ _chnative_seek: push ix ld ix,0 add ix,sp + push af ld c, l ld b, h ;source-doc/base-drv/./usb-base-drv.c:7: storage_device->current_lba = lba; - ld h,(ix+5) ld a,(ix+4) + ld (ix-2),a + ld a,(ix+5) + ld (ix-1),a + ld a,(ix-2) add a,0x0c ld l, a - jr NC,l_chnative_seek_00103 - inc h -l_chnative_seek_00103: + ld a,(ix-1) + adc a,0x00 + ld h, a ld (hl), e inc hl ld (hl), d @@ -78,6 +82,7 @@ l_chnative_seek_00103: ;source-doc/base-drv/./usb-base-drv.c:8: return 0; xor a ;source-doc/base-drv/./usb-base-drv.c:9: } + ld sp, ix pop ix pop hl pop bc diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index a376087d..db185d27 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -78,8 +78,7 @@ _usb_host_bus_reset: ;source-doc/base-drv/./ch376.h:162: delay(); call _delay ;source-doc/base-drv/./ch376.h:163: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); - ld a,0xc0 - or 0x1f + ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a ;source-doc/base-drv/./ch376.h:164: delay(); @@ -95,12 +94,11 @@ _usb_host_bus_reset: _chnative_init: ;source-doc/base-drv/./usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); ld hl,_x - push hl - ld hl,0x0000 - push hl - ld l,0x69 - push hl - call _memset_callee + ld b,0x69 +l_chnative_init_00139: + ld (hl),0x00 + inc hl + djnz l_chnative_init_00139 ;source-doc/base-drv/./usb-init.c:28: ch_cmd_reset_all(); call _ch_cmd_reset_all ;source-doc/base-drv/./usb-init.c:30: delay_medium(); diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 363e00b9..d1352853 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -196,17 +196,15 @@ _get_usb_device_config: push ix ld ix,0 add ix,sp - dec sp + push af ld (ix-1),a ;source-doc/base-drv/./usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); ;source-doc/base-drv/./usb_state.c:71: uint8_t counter = 1; - ld c,0x01 + ld (ix-2),0x01 ;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - push bc ld hl,_x call _first_device_config - pop bc - ld b,0x01 + ld c,0x01 l_get_usb_device_config_00112: ld a, d or e @@ -220,12 +218,12 @@ l_get_usb_device_config_00112: jr NZ,l_get_usb_device_config_00113 ;source-doc/base-drv/./usb_state.c:75: if (counter == device_index) ld a,(ix-1) - sub b + sub c ;source-doc/base-drv/./usb_state.c:76: return p; jr Z,l_get_usb_device_config_00117 ;source-doc/base-drv/./usb_state.c:77: counter++; - inc b - ld c, b + inc c + ld (ix-2),c l_get_usb_device_config_00113: ;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc @@ -235,10 +233,9 @@ l_get_usb_device_config_00113: jr l_get_usb_device_config_00112 l_get_usb_device_config_00105: ;source-doc/base-drv/./usb_state.c:81: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - push bc ld hl,_x call _first_device_config - pop bc + ld c,(ix-2) l_get_usb_device_config_00115: ld a, d or e @@ -269,6 +266,6 @@ l_get_usb_device_config_00110: ld de,0x0000 l_get_usb_device_config_00117: ;source-doc/base-drv/./usb_state.c:90: } - inc sp + ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index 7e5fcc29..e084ee41 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/build-docker.sh b/Source/HBIOS/ch376-native/build-docker.sh new file mode 100644 index 00000000..e69de29b diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 119505b8..58af4d5a 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -70,7 +70,7 @@ _do_scsi_cmd: push ix ld ix,0 add ix,sp - ld hl, -6 + ld hl, -10 add hl, sp ld sp, hl ;source-doc/scsi-drv/./class_scsi.c:16: cbw->dCBWTag[0] = next_tag++; @@ -79,7 +79,10 @@ _do_scsi_cmd: ld hl,0x0004 add hl, bc ex (sp), hl - ld de, (_next_tag) + ld hl,_next_tag + ld e, (hl) + inc hl + ld d, (hl) ld hl, (_next_tag) inc hl ld (_next_tag), hl @@ -97,45 +100,50 @@ _do_scsi_cmd: ld (hl),0x80 l_do_scsi_cmd_00102: ;source-doc/scsi-drv/./class_scsi.c:22: &dev->endpoints[ENDPOINT_BULK_OUT])); - ld e,(ix+4) - ld d,(ix+5) - ld hl,0x0003 - add hl, de - ld (ix-4),l - ld (ix-3),h - ld l, e - ld h, d + ld a,(ix+4) + ld (ix-8),a + ld a,(ix+5) + ld (ix-7),a + ld a,(ix-8) + add a,0x03 + ld (ix-6),a + ld a,(ix-7) + adc a,0x00 + ld (ix-5),a + pop de + pop hl + push hl + push de ld a, (hl) rlca rlca rlca rlca and 0x0f - ld l,(ix+6) - ld h,(ix+7) + ld e,(ix+6) + ld d,(ix+7) push bc - push de + ld l,(ix-6) + ld h,(ix-5) push hl - ld l,(ix-4) - ld h,(ix-3) - ex (sp), hl push af inc sp - ld iy,0x001f - push iy + ld hl,0x001f push hl + push de call _usb_data_out_transfer pop af pop af pop af inc sp - ld a, l - pop de pop bc - ld (_result+0),a + ld a, l + ld (_result), a + ld hl,_result + ld a, (hl) or a jr Z,l_do_scsi_cmd_00104 - ld l, a + ld l, (hl) jp l_do_scsi_cmd_00119 l_do_scsi_cmd_00104: ;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) { @@ -145,11 +153,19 @@ l_do_scsi_cmd_00104: inc hl ld b, (hl) inc hl + ld e, (hl) inc hl - ld a, (hl) - dec hl - ld l, (hl) - or l + ld d, (hl) +;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); + ld a,(ix-8) + add a,0x06 + ld (ix-4),a + ld a,(ix-7) + adc a,0x00 + ld (ix-3),a +;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) { + ld a, d + or e or b or c jr Z,l_do_scsi_cmd_00113 @@ -162,18 +178,19 @@ l_do_scsi_cmd_00104: bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 ;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); - ld iy,0x0006 - add iy, de - ld l, e - ld h, d + pop de + pop hl + push hl + push de ld a, (hl) rlca rlca rlca rlca and 0x0f - push de - push iy + ld l,(ix-4) + ld h,(ix-3) + push hl push af inc sp ld l,(ix-2) @@ -186,25 +203,27 @@ l_do_scsi_cmd_00104: pop af inc sp ld a, l - pop de - ld (_result+0),a + ld (_result), a + ld hl,_result + ld a, (hl) or a jr Z,l_do_scsi_cmd_00113 - ld l, a - jr l_do_scsi_cmd_00119 + ld l, (hl) + jp l_do_scsi_cmd_00119 l_do_scsi_cmd_00110: ;source-doc/scsi-drv/./class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_OUT])); - ld l, e - ld h, d + pop de + pop hl + push hl + push de ld a, (hl) rlca rlca rlca rlca and 0x0f - push de - ld l,(ix-4) - ld h,(ix-3) + ld l,(ix-6) + ld h,(ix-5) push hl push af inc sp @@ -218,28 +237,30 @@ l_do_scsi_cmd_00110: pop af inc sp ld a, l - pop de - ld (_result+0),a + ld (_result), a + ld hl,_result + ld a, (hl) or a jr Z,l_do_scsi_cmd_00113 - ld l, a + ld l, (hl) jr l_do_scsi_cmd_00119 l_do_scsi_cmd_00113: ;source-doc/scsi-drv/./class_scsi.c:36: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); - ld hl,0x0006 - add hl, de - ex de,hl - ld c,e - ld b,d + pop de + pop hl + push hl + push de ld a, (hl) rlca rlca rlca rlca and 0x0f - ld d, a + ld b, a + ld l,(ix-4) + ld h,(ix-3) + push hl push bc - push de inc sp ld hl,0x000d push hl @@ -251,10 +272,12 @@ l_do_scsi_cmd_00113: pop af inc sp ld a, l - ld (_result+0),a + ld (_result), a + ld hl,_result + ld a, (hl) or a jr Z,l_do_scsi_cmd_00115 - ld l, a + ld l, (hl) jr l_do_scsi_cmd_00119 l_do_scsi_cmd_00115: ;source-doc/scsi-drv/./class_scsi.c:38: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) @@ -263,13 +286,13 @@ l_do_scsi_cmd_00115: jr Z,l_do_scsi_cmd_00117 ld bc, (_csw + 4) pop hl - ld e,(hl) push hl + ld a, (hl) inc hl ld h, (hl) - ld l, e - xor a - sbc hl,bc + ld l, a + cp a + sbc hl, bc jr Z,l_do_scsi_cmd_00117 ;source-doc/scsi-drv/./class_scsi.c:39: return USB_ERR_FAIL; ld l,0x0e @@ -297,15 +320,15 @@ _get_scsi_read_capacity: ld hl,0 add hl, sp ex de, hl - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:49: cbw_scsi.read_capacity = scsi_read_capacity; ld hl,15 add hl, sp ex de, hl - ld bc,0x000c ld hl,_scsi_read_capacity + ld bc,0x000c ldir ;source-doc/scsi-drv/./class_scsi.c:51: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 @@ -350,15 +373,15 @@ _scsi_inquiry: ld hl,0 add hl, sp ex de, hl - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:63: cbw_scsi.inquiry = scsi_packet_inquiry; ld hl,15 add hl, sp ex de, hl - ld bc,0x000c ld hl,_scsi_packet_inquiry + ld bc,0x000c ldir ;source-doc/scsi-drv/./class_scsi.c:65: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 @@ -403,18 +426,17 @@ _scsi_test: ld hl,0 add hl, sp ex de, hl - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:75: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,15 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x0c - push hl - call _memset_callee + ld b,0x0c +l_scsi_test_00103: + ld (hl),0x00 + inc hl + djnz l_scsi_test_00103 ;source-doc/scsi-drv/./class_scsi.c:77: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 ;source-doc/scsi-drv/./class_scsi.c:78: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); @@ -422,14 +444,15 @@ _scsi_test: ;source-doc/scsi-drv/./class_scsi.c:79: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,8 add hl, sp + ex de, hl xor a - ld (hl),a - inc hl - ld (hl),a - inc hl - ld (hl),a - inc hl - ld (hl),a + ld (de), a + inc de + ld (de), a + inc de + ld (de), a + inc de + ld (de), a ;source-doc/scsi-drv/./class_scsi.c:81: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af @@ -462,15 +485,15 @@ _scsi_request_sense: ld hl,0 add hl, sp ex de, hl - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:89: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,15 add hl, sp ex de, hl - ld bc,0x000c ld hl,_scsi_packet_request_sense + ld bc,0x000c ldir ;source-doc/scsi-drv/./class_scsi.c:91: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 @@ -505,6 +528,9 @@ _scsi_request_sense: ; Function scsi_sense_init ; --------------------------------- _scsi_sense_init: + push ix + ld ix,0 + add ix,sp ld hl, -18 add hl, sp ld sp, hl @@ -512,32 +538,26 @@ _scsi_sense_init: ld c,0x03 l_scsi_sense_init_00102: push bc - ld hl,22 - add hl, sp - ld c, (hl) - inc hl - ld b, (hl) - push bc + ld l,(ix+4) + ld h,(ix+5) + push hl call _scsi_test pop af ld a, l pop bc - ld (_result+0), a + ld (_result),a or a jr Z,l_scsi_sense_init_00104 - dec c + dec c jr Z,l_scsi_sense_init_00104 ;source-doc/scsi-drv/./class_scsi.c:103: scsi_request_sense(dev, &response); push bc ld hl,2 add hl, sp push hl - ld hl,24 - add hl, sp - ld c, (hl) - inc hl - ld b, (hl) - push bc + ld l,(ix+4) + ld h,(ix+5) + push hl call _scsi_request_sense pop af pop af @@ -545,12 +565,11 @@ l_scsi_sense_init_00102: jr l_scsi_sense_init_00102 l_scsi_sense_init_00104: ;source-doc/scsi-drv/./class_scsi.c:105: return result; - ld a, (_result+0) - ld l, a + ld hl,_result + ld l, (hl) ;source-doc/scsi-drv/./class_scsi.c:106: } - ld iy,18 - add iy, sp - ld sp, iy + ld sp, ix + pop ix ret ;source-doc/scsi-drv/./class_scsi.c:110: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- @@ -563,38 +582,40 @@ _scsi_read: push af ;source-doc/scsi-drv/./class_scsi.c:111: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld hl,_cbw - push hl - ld hl,0x0000 - push hl - ld l,0x1b - push hl - call _memset_callee + ld b,0x1b +l_scsi_read_00112: + ld (hl),0x00 + inc hl + djnz l_scsi_read_00112 ;source-doc/scsi-drv/./class_scsi.c:112: cbw.cbw = scsi_command_block_wrapper; ld de,_cbw - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:114: cbw.cbw.bCBWLUN = 0; + ld hl,_cbw + 13 + ld (hl),0x00 ;source-doc/scsi-drv/./class_scsi.c:115: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - ld hl,0x0c00 - ld ((_cbw + 13)),hl + ld hl,_cbw + 14 + ld (hl),0x0c ;source-doc/scsi-drv/./class_scsi.c:116: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 - ld (_cbw + 8),hl + ld ((_cbw + 8)), hl ld h, l - ld (_cbw + 8 + 2),hl + ld ((_cbw + 8)+2), hl ;source-doc/scsi-drv/./class_scsi.c:118: cbw.scsi_cmd.operation_code = 0x28; // read operation - ld hl, +(_cbw + 15) + ld hl,_cbw + 15 ld (hl),0x28 ;source-doc/scsi-drv/./class_scsi.c:119: cbw.scsi_cmd.transfer_len[1] = 1; - ld hl, +(_cbw + 23) + ld hl,_cbw + 23 ld (hl),0x01 ;source-doc/scsi-drv/./class_scsi.c:120: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld c,(ix+4) ld b,(ix+5) ld hl,0x000c add hl, bc - pop af + ex (sp), hl + pop hl push hl inc hl inc hl @@ -606,20 +627,22 @@ _scsi_read: push hl inc hl inc hl + inc hl + dec hl ld a, (hl) ld ((_cbw + 18)),a ;source-doc/scsi-drv/./class_scsi.c:122: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; pop hl push hl inc hl - ld a,(hl) - ld ((_cbw + 19)),a + ld d, (hl) + ld hl, +(_cbw + 19) + ld (hl), d ;source-doc/scsi-drv/./class_scsi.c:123: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld de,_cbw + 20 pop hl - ld a,(hl) push hl - ld (de), a + ld a, (hl) + ld ((_cbw + 20)),a ;source-doc/scsi-drv/./class_scsi.c:125: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) @@ -636,14 +659,15 @@ _scsi_read: pop af inc sp ld a, l + ld (_result), a ;source-doc/scsi-drv/./class_scsi.c:127: if (result == USB_ERR_OK) - ld (_result+0),a + ld a,(_result) or a jr NZ,l_scsi_read_00102 ;source-doc/scsi-drv/./class_scsi.c:128: dev->current_lba++; pop hl - ld c,(hl) push hl + ld c, (hl) inc hl ld b, (hl) inc hl @@ -651,11 +675,11 @@ _scsi_read: inc hl ld d, (hl) inc c - jr NZ,l_scsi_read_00110 + jr NZ,l_scsi_read_00114 inc b - jr NZ,l_scsi_read_00110 + jr NZ,l_scsi_read_00114 inc de -l_scsi_read_00110: +l_scsi_read_00114: pop hl push hl ld (hl), c @@ -667,8 +691,8 @@ l_scsi_read_00110: ld (hl), d l_scsi_read_00102: ;source-doc/scsi-drv/./class_scsi.c:129: return result; - ld a, (_result+0) - ld l, a + ld hl,_result + ld l, (hl) ;source-doc/scsi-drv/./class_scsi.c:130: } ld sp, ix pop ix @@ -684,38 +708,40 @@ _scsi_write: push af ;source-doc/scsi-drv/./class_scsi.c:133: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld hl,_cbw - push hl - ld hl,0x0000 - push hl - ld l,0x1b - push hl - call _memset_callee + ld b,0x1b +l_scsi_write_00112: + ld (hl),0x00 + inc hl + djnz l_scsi_write_00112 ;source-doc/scsi-drv/./class_scsi.c:134: cbw.cbw = scsi_command_block_wrapper; ld de,_cbw - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:136: cbw.cbw.bCBWLUN = 0; + ld hl,_cbw + 13 + ld (hl),0x00 ;source-doc/scsi-drv/./class_scsi.c:137: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - ld hl,0x0c00 - ld ((_cbw + 13)),hl + ld hl,_cbw + 14 + ld (hl),0x0c ;source-doc/scsi-drv/./class_scsi.c:138: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 - ld (_cbw + 8),hl + ld ((_cbw + 8)), hl ld h, l - ld (_cbw + 8 + 2),hl + ld ((_cbw + 8)+2), hl ;source-doc/scsi-drv/./class_scsi.c:140: cbw.scsi_cmd.operation_code = 0x2A; // write operation - ld hl, +(_cbw + 15) + ld hl,_cbw + 15 ld (hl),0x2a ;source-doc/scsi-drv/./class_scsi.c:141: cbw.scsi_cmd.transfer_len[1] = 1; - ld hl, +(_cbw + 23) + ld hl,_cbw + 23 ld (hl),0x01 ;source-doc/scsi-drv/./class_scsi.c:142: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld c,(ix+4) ld b,(ix+5) ld hl,0x000c add hl, bc - pop af + ex (sp), hl + pop hl push hl inc hl inc hl @@ -727,20 +753,22 @@ _scsi_write: push hl inc hl inc hl + inc hl + dec hl ld a, (hl) ld ((_cbw + 18)),a ;source-doc/scsi-drv/./class_scsi.c:144: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; pop hl push hl inc hl - ld a,(hl) - ld ((_cbw + 19)),a + ld d, (hl) + ld hl, +(_cbw + 19) + ld (hl), d ;source-doc/scsi-drv/./class_scsi.c:145: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld de,_cbw + 20 pop hl - ld a,(hl) push hl - ld (de), a + ld a, (hl) + ld ((_cbw + 20)),a ;source-doc/scsi-drv/./class_scsi.c:147: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) @@ -757,14 +785,15 @@ _scsi_write: pop af inc sp ld a, l + ld (_result), a ;source-doc/scsi-drv/./class_scsi.c:149: if (result == USB_ERR_OK) - ld (_result+0),a + ld a,(_result) or a jr NZ,l_scsi_write_00102 ;source-doc/scsi-drv/./class_scsi.c:150: dev->current_lba++; pop hl - ld c,(hl) push hl + ld c, (hl) inc hl ld b, (hl) inc hl @@ -772,11 +801,11 @@ _scsi_write: inc hl ld d, (hl) inc c - jr NZ,l_scsi_write_00110 + jr NZ,l_scsi_write_00114 inc b - jr NZ,l_scsi_write_00110 + jr NZ,l_scsi_write_00114 inc de -l_scsi_write_00110: +l_scsi_write_00114: pop hl push hl ld (hl), c @@ -788,8 +817,8 @@ l_scsi_write_00110: ld (hl), d l_scsi_write_00102: ;source-doc/scsi-drv/./class_scsi.c:151: return result; - ld a, (_result+0) - ld l, a + ld hl,_result + ld l, (hl) ;source-doc/scsi-drv/./class_scsi.c:152: } ld sp, ix pop ix @@ -809,18 +838,17 @@ _scsi_eject: ld hl,0 add hl, sp ex de, hl - ld bc,0x000f ld hl,_scsi_command_block_wrapper + ld bc,0x000f ldir ;source-doc/scsi-drv/./class_scsi.c:158: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); ld hl,15 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x06 - push hl - call _memset_callee + ld b,0x06 +l_scsi_eject_00103: + ld (hl),0x00 + inc hl + djnz l_scsi_eject_00103 ;source-doc/scsi-drv/./class_scsi.c:160: cbw_scsi.eject.operation_code = 0x1B; ld (ix-6),0x1b ;source-doc/scsi-drv/./class_scsi.c:161: cbw_scsi.eject.loej = 1; @@ -834,14 +862,15 @@ _scsi_eject: ;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,8 add hl, sp + ex de, hl xor a - ld (hl),a - inc hl - ld (hl),a - inc hl - ld (hl),a - inc hl - ld (hl),a + ld (de), a + inc de + ld (de), a + inc de + ld (de), a + inc de + ld (de), a ;source-doc/scsi-drv/./class_scsi.c:167: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af diff --git a/Source/HBIOS/ch376-native/scsi-drv/init.c.s b/Source/HBIOS/ch376-native/scsi-drv/init.c.s deleted file mode 100644 index 5a8f145d..00000000 --- a/Source/HBIOS/ch376-native/scsi-drv/init.c.s +++ /dev/null @@ -1,162 +0,0 @@ -; -; Generated from source-doc/scsi-drv/./init.c.asm -- not to be modify directly -; -; -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -#IF 0 - -; .area _INITIALIZED removed by z88dk - - -#ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- -;-------------------------------------------------------- -; code -;-------------------------------------------------------- -;source-doc/scsi-drv/./init.c:13: uint8_t chscsi_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { -; --------------------------------- -; Function chscsi_seek -; --------------------------------- -_chscsi_seek: - push ix - ld ix,0 - add ix,sp - ld c, l - ld b, h -;source-doc/scsi-drv/./init.c:14: storage_device->current_lba = lba; - ld a,(ix+4) - ld h,(ix+5) - add a,0x0c - ld l, a - jr NC,l_chscsi_seek_00103 - inc h -l_chscsi_seek_00103: - ld (hl), e - inc hl - ld (hl), d - inc hl - ld (hl), c - inc hl - ld (hl), b -;source-doc/scsi-drv/./init.c:15: return 0; - xor a -;source-doc/scsi-drv/./init.c:16: } - pop ix - pop hl - pop bc - jp (hl) -;source-doc/scsi-drv/./init.c:18: void chscsi_init(void) { -; --------------------------------- -; Function chscsi_init -; --------------------------------- -_chscsi_init: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/scsi-drv/./init.c:21: do { - ld c,0x00 - ld (ix-1),0x01 -l_chscsi_init_00105: -;source-doc/scsi-drv/./init.c:22: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - push bc - ld a,(ix-1) - call _get_usb_device_config - pop bc -;source-doc/scsi-drv/./init.c:24: if (storage_device == NULL) - ld a, d - or e - jr Z,l_chscsi_init_00107 -;source-doc/scsi-drv/./init.c:27: const usb_device_type t = storage_device->type; - ld l, e - ld h, d - ld a, (hl) - and 0x0f -;source-doc/scsi-drv/./init.c:29: if (t == USB_IS_MASS_STORAGE) { - sub 0x02 - jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/./init.c:30: storage_device->drive_index = storage_count++; - ld hl,0x0010 - add hl, de - ld (hl), c - inc c -;source-doc/scsi-drv/./init.c:31: scsi_sense_init(storage_device); - push bc - push de - push de - call _scsi_sense_init - pop af - pop de - ld hl,_ch_scsi_fntbl - call _dio_add_entry - pop bc -l_chscsi_init_00106: -;source-doc/scsi-drv/./init.c:35: } while (++index != MAX_NUMBER_OF_STORAGE_DEVICES + 1); - inc (ix-1) - ld a,(ix-1) - sub 0x05 - jr NZ,l_chscsi_init_00105 -l_chscsi_init_00107: -;source-doc/scsi-drv/./init.c:37: if (storage_count == 0) - ld a, c - or a -;source-doc/scsi-drv/./init.c:38: return; - jr Z,l_chscsi_init_00110 -;source-doc/scsi-drv/./init.c:40: print_string(" $"); - push bc - ld hl,init_str_0 - call _print_string - pop bc -;source-doc/scsi-drv/./init.c:41: print_uint16(storage_count); - ld h,0x00 - ld l, c - call _print_uint16 -;source-doc/scsi-drv/./init.c:42: print_string(" STORAGE DEVICES$"); - ld hl,init_str_1 - call _print_string -l_chscsi_init_00110: -;source-doc/scsi-drv/./init.c:43: } - inc sp - pop ix - ret -init_str_0: - DEFM " $" - DEFB 0x00 -init_str_1: - DEFM " STORAGE DEVICES$" - DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 673285b5..691f8f85 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -78,11 +78,11 @@ l_chscsi_init_00105: ;source-doc/scsi-drv/./scsi-init.c:24: storage_device->drive_index = storage_count++; ld hl,0x0010 add hl, de - ld a,(_storage_count+0) + ld c, l + ld b, h + ld hl,_storage_count + ld a, (hl) ld (ix-2),a - ld c,l - ld b,h - ld hl,_storage_count+0 inc (hl) ld a,(ix-2) ld (bc), a @@ -103,11 +103,13 @@ l_chscsi_init_00106: jr NZ,l_chscsi_init_00105 l_chscsi_init_00107: ;source-doc/scsi-drv/./scsi-init.c:31: if (storage_count == 0) -;source-doc/scsi-drv/./scsi-init.c:32: return; -;source-doc/scsi-drv/./scsi-init.c:34: print_device_mounted(" STORAGE DEVICE$", storage_count); - ld a,(_storage_count+0) + ld hl,_storage_count + ld a, (hl) or a +;source-doc/scsi-drv/./scsi-init.c:32: return; jr Z,l_chscsi_init_00110 +;source-doc/scsi-drv/./scsi-init.c:34: print_device_mounted(" STORAGE DEVICE$", storage_count); + ld a,(_storage_count) push af inc sp ld hl,scsi_init_str_0 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index 7f4dca77..3e358feb 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -1,6 +1,7 @@ #include "ch376.h" #include "print.h" +#include "ez80-helpers.h" usb_error result = 0; @@ -20,6 +21,9 @@ void ch_command(const uint8_t command) __z88dk_fastcall { delay(); CH376_COMMAND_PORT = command; delay(); + delay(); + delay(); + delay(); } extern usb_error ch_wait_int_and_get_status(const int16_t timeout) __z88dk_fastcall; @@ -32,8 +36,12 @@ usb_error ch_very_short_wait_int_and_get_status(void) { return ch_wait_int_and_g usb_error ch_get_status(void) { ch_command(CH_CMD_GET_STATUS); + delay(); + delay(); + delay(); + delay(); uint8_t ch_status = CH376_DATA_PORT; - + if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) return ch_status; @@ -135,10 +143,14 @@ uint8_t ch_cmd_get_ic_version(void) { void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { ch_command(CH_CMD_ISSUE_TKN_X); + delay(); + delay(); CH376_DATA_PORT = toggle_bit; delay(); + delay(); CH376_DATA_PORT = endpoint << 4 | pid; delay(); + delay(); } void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ez80-helpers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ez80-helpers.h new file mode 100644 index 00000000..02240c95 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ez80-helpers.h @@ -0,0 +1 @@ +#define debugger() __asm__("PUSH AF \n PUSH BC \n XOR A \n LD B, 7 \n .DB 0x49, 0xD7 \n POP BC \n POP AF") diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c index 0b09bcdf..10dbbdd4 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c @@ -16,6 +16,7 @@ #include #include "print.h" +#include "ez80-helpers.h" const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; @@ -31,6 +32,7 @@ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { cmd = cmd_get_device_descriptor; cmd.wLength = 8; + debugger(); result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); CHECK(result); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 883ec873..4c7bcbe9 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -16,6 +16,9 @@ #include "z80.h" #include +#include "print.h" +#include "ez80-helpers.h" + #define LOWER_SAFE_RAM_ADDRESS 0x8000 usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, @@ -57,7 +60,8 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet, ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ch_issue_token_setup(); - CHECK(ch_short_wait_int_and_get_status()) + result = ch_short_wait_int_and_get_status(); + CHECK(result); const uint16_t length = cmd_packet->wLength; diff --git a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh index ad00b407..8c1a1286 100755 --- a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh +++ b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # Check if exactly two arguments are provided if [ "$#" -ne 2 ]; then diff --git a/Source/HBIOS/ch376-native/source-doc/depends.d b/Source/HBIOS/ch376-native/source-doc/depends.d index 5d2e46b4..6f457cee 100644 --- a/Source/HBIOS/ch376-native/source-doc/depends.d +++ b/Source/HBIOS/ch376-native/source-doc/depends.d @@ -1,103 +1,22 @@ -./base-drv/dev_transfers.c.s: source-doc/base-drv/dev_transfers.c \ - source-doc/base-drv/dev_transfers.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/protocol.h -./base-drv/enumerate.c.s: source-doc/base-drv/enumerate.c \ - source-doc/base-drv/enumerate.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/usb_state.h \ - source-doc/base-drv/enumerate_hub.h \ - source-doc/base-drv/enumerate_storage.h source-doc/base-drv/work-area.h \ - source-doc/base-drv/print.h -./base-drv/usb_state.c.s: source-doc/base-drv/usb_state.c \ - source-doc/base-drv/usb_state.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/work-area.h -./base-drv/class_hub.c.s: source-doc/base-drv/class_hub.c \ - source-doc/base-drv/class_hub.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/usb_state.h -./base-drv/enumerate_storage.c.s: source-doc/base-drv/enumerate_storage.c \ - source-doc/base-drv/enumerate_storage.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h -./base-drv/enumerate_hub.c.s: source-doc/base-drv/enumerate_hub.c \ - source-doc/base-drv/enumerate_hub.h source-doc/base-drv/enumerate.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/dev_transfers.h source-doc/base-drv/transfers.h \ - source-doc/base-drv/usb_state.h source-doc/base-drv/class_hub.h \ - source-doc/base-drv/work-area.h -./base-drv/usb-base-drv.c.s: source-doc/base-drv/usb-base-drv.c \ - source-doc/base-drv/usb-base-drv.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/transfers.h -./base-drv/transfers.c.s: source-doc/base-drv/transfers.c \ - source-doc/base-drv/transfers.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/z80.h -./base-drv/print.c.s: source-doc/base-drv/print.c source-doc/base-drv/print.h -./base-drv/ch376.c.s: source-doc/base-drv/ch376.c source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/print.h -./base-drv/protocol.c.s: source-doc/base-drv/protocol.c source-doc/base-drv/protocol.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/print.h -./base-drv/work-area.c.s: source-doc/base-drv/work-area.c \ - source-doc/base-drv/usb_state.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h -./base-drv/usb-init.c.s: source-doc/base-drv/usb-init.c source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/enumerate.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/dev_transfers.h source-doc/base-drv/transfers.h \ - source-doc/base-drv/usb_state.h source-doc/base-drv/print.h \ - source-doc/base-drv/work-area.h source-doc/base-drv/z80.h -./ufi-drv/ufi-init.c.s: source-doc/ufi-drv/ufi-init.c source-doc/ufi-drv/class_ufi.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/ufi-drv/usb_cbi.h \ - source-doc/base-drv/dev_transfers.h source-doc/base-drv/usb_state.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/hbios.h \ - source-doc/base-drv/print.h source-doc/base-drv/usb-base-drv.h \ - source-doc/base-drv/work-area.h source-doc/base-drv/usb_state.h -./ufi-drv/usb_cbi.c.s: source-doc/ufi-drv/usb_cbi.c source-doc/ufi-drv/usb_cbi.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/transfers.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/dev_transfers.h -./ufi-drv/class_ufi.c.s: source-doc/ufi-drv/class_ufi.c \ - source-doc/ufi-drv/class_ufi.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/ch376inc.h source-doc/base-drv/delay.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/dev_transfers.h source-doc/base-drv/transfers.h \ - source-doc/ufi-drv/usb_cbi.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/usb_state.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/delay.h source-doc/base-drv/z80.h -./scsi-drv/scsi-init.c.s: source-doc/scsi-drv/scsi-init.c \ - source-doc/scsi-drv/class_scsi.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/ch376.h \ - source-doc/base-drv/enumerate.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/usb_state.h source-doc/base-drv/hbios.h \ - source-doc/base-drv/print.h source-doc/base-drv/usb-base-drv.h \ - source-doc/base-drv/dev_transfers.h source-doc/base-drv/work-area.h \ - source-doc/base-drv/z80.h -./scsi-drv/class_scsi.c.s: source-doc/scsi-drv/class_scsi.c \ - source-doc/scsi-drv/class_scsi.h source-doc/base-drv/protocol.h \ - source-doc/base-drv/ch376.h source-doc/base-drv/ch376inc.h \ - source-doc/base-drv/delay.h source-doc/base-drv/dev_transfers.h \ - source-doc/base-drv/transfers.h source-doc/base-drv/usb_state.h \ - source-doc/base-drv/protocol.h source-doc/base-drv/z80.h +./base-drv/dev_transfers.c: base-drv/dev_transfers.c ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/protocol.h +./base-drv/enumerate.c: base-drv/enumerate.c ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/print.h +./base-drv/usb_state.c: base-drv/usb_state.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/work-area.h +./base-drv/class_hub.c: base-drv/class_hub.c ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h +./base-drv/enumerate_storage.c: base-drv/enumerate_storage.c ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h +./base-drv/enumerate_hub.c: base-drv/enumerate_hub.c ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/work-area.h +./base-drv/usb-base-drv.c: base-drv/usb-base-drv.c ././source-doc/base-drv/usb-base-drv.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h +./base-drv/transfers.c: base-drv/transfers.c ././source-doc/base-drv/transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/z80.h ././source-doc/base-drv/print.h +./base-drv/print.c: base-drv/print.c ././source-doc/base-drv/print.h +./base-drv/ch376.c: base-drv/ch376.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/print.h +./base-drv/protocol.c: base-drv/protocol.c ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/print.h +./base-drv/work-area.c: base-drv/work-area.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h +./base-drv/usb-init.c: base-drv/usb-init.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/print.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/z80.h +./ufi-drv/ufi-init.c: ufi-drv/ufi-init.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h +./ufi-drv/usb_cbi.c: ufi-drv/usb_cbi.c ././source-doc/ufi-drv/usb_cbi.h +./ufi-drv/class_ufi.c: ufi-drv/class_ufi.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h +./scsi-drv/scsi-init.c: scsi-drv/scsi-init.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h +./scsi-drv/class_scsi.c: scsi-drv/class_scsi.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ## ./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./print.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s ## diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index 24ac5b51..f911d4c2 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -63,15 +63,15 @@ _wait_for_device_ready: ld c,(ix+6) l_wait_for_device_ready_00105: ;source-doc/ufi-drv/./class_ufi.c:19: memset(&sense, 0, sizeof(sense)); - push bc - ld hl,2 + ld hl,0 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x12 - push hl - call _memset_callee + ld b,0x12 +l_wait_for_device_ready_00132: + ld (hl),0x00 + inc hl + djnz l_wait_for_device_ready_00132 +;source-doc/ufi-drv/./class_ufi.c:20: result = ufi_test_unit_ready(storage_device, &sense); + push bc ld hl,2 add hl, sp push hl @@ -85,10 +85,10 @@ l_wait_for_device_ready_00105: pop bc ld b, a ;source-doc/ufi-drv/./class_ufi.c:22: if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) + ld hl,0+1+1 + add hl,sp or a jr NZ,l_wait_for_device_ready_00104 - ld hl,2 - add hl, sp ld a, (hl) and 0x0f jr Z,l_wait_for_device_ready_00107 @@ -105,8 +105,6 @@ l_wait_for_device_ready_00104: jr l_wait_for_device_ready_00105 l_wait_for_device_ready_00107: ;source-doc/ufi-drv/./class_ufi.c:29: return result | sense.sense_key; - ld hl,2 - add hl, sp ld a, (hl) and 0x0f or b @@ -194,12 +192,14 @@ _ufi_test_unit_ready: ;source-doc/ufi-drv/./class_ufi.c:35: memset(&ufi_cmd_request_test_unit_ready, 0, sizeof(ufi_test_unit_ready_command)); ld hl,0 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x0c - push hl - call _memset_callee + ex de, hl + ld l, e + ld h, d + ld b,0x0c +l_ufi_test_unit_ready_00103: + ld (hl),0x00 + inc hl + djnz l_ufi_test_unit_ready_00103 ;source-doc/ufi-drv/./class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); ld hl,0x0000 push hl @@ -208,9 +208,7 @@ _ufi_test_unit_ready: xor a push af inc sp - ld hl,7 - add hl, sp - push hl + push de ld l,(ix+4) ld h,(ix+5) push hl @@ -221,11 +219,13 @@ _ufi_test_unit_ready: ;source-doc/ufi-drv/./class_ufi.c:40: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,12 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x000c + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,__ufi_cmd_request_sense + ld bc,0x000c ldir pop bc ;source-doc/ufi-drv/./class_ufi.c:43: (uint8_t *)response, NULL); @@ -245,11 +245,9 @@ _ufi_test_unit_ready: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp ;source-doc/ufi-drv/./class_ufi.c:45: RETURN_CHECK(result); ;source-doc/ufi-drv/./class_ufi.c:46: } - ld sp, ix + ld sp,ix pop ix ret ;source-doc/ufi-drv/./class_ufi.c:48: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { @@ -266,11 +264,13 @@ _ufi_request_sense: ;source-doc/ufi-drv/./class_ufi.c:50: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x000c + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,__ufi_cmd_request_sense + ld bc,0x000c ldir pop bc ;source-doc/ufi-drv/./class_ufi.c:52: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), @@ -289,11 +289,9 @@ _ufi_request_sense: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp ;source-doc/ufi-drv/./class_ufi.c:55: RETURN_CHECK(result); ;source-doc/ufi-drv/./class_ufi.c:56: } - ld sp, ix + ld sp,ix pop ix ret ;source-doc/ufi-drv/./class_ufi.c:58: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { @@ -311,8 +309,8 @@ _ufi_read_frmt_caps: ld hl,0 add hl, sp ex de, hl - ld bc,0x000c ld hl,__ufi_cmd_read_format_capacitie + ld bc,0x000c ldir ;source-doc/ufi-drv/./class_ufi.c:63: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); ld c,(ix+6) @@ -333,20 +331,22 @@ _ufi_read_frmt_caps: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp - ld sp, iy + pop af + pop af + pop af + pop af + pop af + inc sp pop bc ;source-doc/ufi-drv/./class_ufi.c:66: CHECK(result); ld a, l or a jr NZ,l_ufi_read_frmt_caps_00103 ;source-doc/ufi-drv/./class_ufi.c:68: const uint8_t available_length = response->capacity_list_length; - ld l,(ix+6) - ld h,(ix+7) - inc hl - inc hl - inc hl + ld e,(ix+6) + ld d,(ix+7) + ld hl,3 + add hl, de ld e, (hl) ;source-doc/ufi-drv/./class_ufi.c:70: const uint8_t max_length = ld a,0x24 @@ -355,24 +355,23 @@ _ufi_read_frmt_caps: ld e,0x24 l_ufi_read_frmt_caps_00105: ;source-doc/ufi-drv/./class_ufi.c:74: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); - push bc push de + push bc + ex de, hl ld hl,16 add hl, sp - push hl - ld hl,6 + ex de, hl + ld hl,4 add hl, sp - push hl - ld hl,0x000c - push hl - call _memcpy_callee - pop de + ld bc,0x000c + ldir pop bc + pop de ;source-doc/ufi-drv/./class_ufi.c:75: cmd.allocation_length[1] = max_length; ld (ix-4),e ;source-doc/ufi-drv/./class_ufi.c:77: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); + ld d,0x00 ld hl,0x0000 - ld d,l push hl push bc push de @@ -386,8 +385,12 @@ l_ufi_read_frmt_caps_00105: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp + pop af + pop af + pop af + pop af + pop af + inc sp ;source-doc/ufi-drv/./class_ufi.c:80: RETURN_CHECK(result); l_ufi_read_frmt_caps_00103: ;source-doc/ufi-drv/./class_ufi.c:81: } @@ -408,11 +411,13 @@ _ufi_inquiry: ;source-doc/ufi-drv/./class_ufi.c:85: ufi_cmd_inquiry = _ufi_cmd_inquiry; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x000c + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,__ufi_cmd_inquiry + ld bc,0x000c ldir pop bc ;source-doc/ufi-drv/./class_ufi.c:87: usb_error result = @@ -431,11 +436,9 @@ _ufi_inquiry: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp ;source-doc/ufi-drv/./class_ufi.c:90: RETURN_CHECK(result); ;source-doc/ufi-drv/./class_ufi.c:91: } - ld sp, ix + ld sp,ix pop ix ret ;source-doc/ufi-drv/./class_ufi.c:93: usb_error ufi_read_write_sector(device_config *const storage_device, @@ -452,21 +455,20 @@ _ufi_read_write_sector: ;source-doc/ufi-drv/./class_ufi.c:100: memset(&cmd, 0, sizeof(cmd)); ld hl,0 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x0c - push hl - call _memset_callee + ld b,0x0c +l_ufi_read_write_sector_00112: + ld (hl),0x00 + inc hl + djnz l_ufi_read_write_sector_00112 ;source-doc/ufi-drv/./class_ufi.c:101: cmd.operation_code = send ? 0x2A : 0x28; bit 0,(ix+6) jr Z,l_ufi_read_write_sector_00103 - ld bc,0x002a + ld a,0x2a jr l_ufi_read_write_sector_00104 l_ufi_read_write_sector_00103: - ld bc,0x0028 + ld a,0x28 l_ufi_read_write_sector_00104: - ld (ix-12),c + ld (ix-12),a ;source-doc/ufi-drv/./class_ufi.c:102: cmd.lba[2] = sector_number >> 8; ld a,(ix+8) ld (ix-8),a @@ -474,9 +476,10 @@ l_ufi_read_write_sector_00104: ld a,(ix+7) ld (ix-7),a ;source-doc/ufi-drv/./class_ufi.c:104: cmd.transfer_length[1] = sector_count; -;source-doc/ufi-drv/./class_ufi.c:106: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); ld a,(ix+9) ld (ix-4),a +;source-doc/ufi-drv/./class_ufi.c:106: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); + ld a,(ix+9) add a, a ld c,0x00 ld l,(ix+12) @@ -497,11 +500,9 @@ l_ufi_read_write_sector_00104: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp ;source-doc/ufi-drv/./class_ufi.c:108: RETURN_CHECK(result); ;source-doc/ufi-drv/./class_ufi.c:109: } - ld sp, ix + ld sp,ix pop ix ret ;source-doc/ufi-drv/./class_ufi.c:118: usb_error ufi_format(device_config *const storage_device, @@ -519,18 +520,21 @@ _ufi_format: ld hl,2 add hl, sp push hl - ld hl,0x0000 - push hl - ld l,0x0c - push hl - call _memset_callee + ld b,0x0c +l_ufi_format_00103: + ld (hl),0x00 + inc hl + djnz l_ufi_format_00103 + pop bc ;source-doc/ufi-drv/./class_ufi.c:128: cmd = _ufi_cmd_format; ld hl,14 add hl, sp ex de, hl - ld bc,0x000c + push bc ld hl,__ufi_cmd_format + ld bc,0x000c ldir + pop bc ;source-doc/ufi-drv/./class_ufi.c:131: cmd.track_number = track_number; ld a,(ix+7) ld (ix-10),a @@ -539,26 +543,26 @@ _ufi_format: ;source-doc/ufi-drv/./class_ufi.c:133: cmd.parameter_list_length[1] = sizeof(parameter_list); ld (ix-4),0x0c ;source-doc/ufi-drv/./class_ufi.c:135: parameter_list.defect_list_header.side = side; - ld hl,2+1 - add hl, sp - ex de, hl + ld e, c + ld d, b + inc de ld a,(ix+6) and 0x01 - ld c, a + ld l, a ld a, (de) and 0xfe - or c + or l ld (de), a ;source-doc/ufi-drv/./class_ufi.c:136: parameter_list.defect_list_header.immediate = 0; ld l, e ld h, d res 1, (hl) ;source-doc/ufi-drv/./class_ufi.c:137: parameter_list.defect_list_header.reserved2 = 0; - ld c, e - ld b, d - ld a, (bc) + ld l, e + ld h, d + ld a, (hl) and 0xf3 - ld (bc), a + ld (hl), a ;source-doc/ufi-drv/./class_ufi.c:138: parameter_list.defect_list_header.single_track = 1; ld l, e ld h, d @@ -572,30 +576,30 @@ _ufi_format: ld h, d res 6, (hl) ;source-doc/ufi-drv/./class_ufi.c:141: parameter_list.defect_list_header.fov = 1; - ld a, (de) - or 0x80 - ld (de), a + ex de, hl + set 7, (hl) ;source-doc/ufi-drv/./class_ufi.c:142: parameter_list.defect_list_header.defect_list_length_msb = 0; ld (ix-22),0x00 ;source-doc/ufi-drv/./class_ufi.c:143: parameter_list.defect_list_header.defect_list_length_lsb = 8; ld (ix-21),0x08 ;source-doc/ufi-drv/./class_ufi.c:144: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); - ld c,(ix+8) - ld b,(ix+9) - ld hl,6 - add hl, sp - push hl + ld e,(ix+8) + ld d,(ix+9) push bc - ld hl,0x0008 - push hl - call _memcpy_callee + ld l, e + ld h, d + ex de, hl + ld hl,8 + add hl, sp + ex de, hl + ld bc,0x0008 + ldir + pop bc ;source-doc/ufi-drv/./class_ufi.c:146: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, ld hl,0 add hl, sp push hl - ld hl,4 - add hl, sp - push hl + push bc ld hl,0x000c push hl ld a,0x01 @@ -608,11 +612,9 @@ _ufi_format: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp ;source-doc/ufi-drv/./class_ufi.c:151: RETURN_CHECK(result); ;source-doc/ufi-drv/./class_ufi.c:152: } - ld sp, ix + ld sp,ix pop ix ret ;source-doc/ufi-drv/./class_ufi.c:154: usb_error ufi_send_diagnostics(device_config *const storage_device) { @@ -629,11 +631,13 @@ _ufi_send_diagnostics: ;source-doc/ufi-drv/./class_ufi.c:158: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x000c + ld c, l + ld b, h + ld e, c + ld d, b + push bc ld hl,__ufi_cmd_send_diagnostic + ld bc,0x000c ldir pop bc ;source-doc/ufi-drv/./class_ufi.c:160: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); @@ -649,11 +653,9 @@ _ufi_send_diagnostics: ld h,(ix+5) push hl call _usb_execute_cbi - ld iy,11 - add iy, sp ;source-doc/ufi-drv/./class_ufi.c:162: RETURN_CHECK(result); ;source-doc/ufi-drv/./class_ufi.c:163: } - ld sp, ix + ld sp,ix pop ix ret ;source-doc/ufi-drv/./class_ufi.c:165: uint32_t convert_from_msb_first(const uint8_t *const buffer) { @@ -688,10 +690,10 @@ _convert_from_msb_first: inc de ;source-doc/ufi-drv/./class_ufi.c:172: *p_output++ = *p_input--; ld a, (bc) - dec bc ld (de), a inc de ;source-doc/ufi-drv/./class_ufi.c:173: *p_output = *p_input--; + dec bc ld a, (bc) ld (de), a ;source-doc/ufi-drv/./class_ufi.c:175: return result; diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 6b99f86e..11daa508 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -78,11 +78,11 @@ l_chufi_init_00105: ;source-doc/ufi-drv/./ufi-init.c:23: storage_device->drive_index = storage_count++; ld hl,0x0010 add hl, de - ld a,(_storage_count+0) + ld c, l + ld b, h + ld hl,_storage_count + ld a, (hl) ld (ix-2),a - ld c,l - ld b,h - ld hl,_storage_count+0 inc (hl) ld a,(ix-2) ld (bc), a @@ -97,11 +97,13 @@ l_chufi_init_00106: jr NZ,l_chufi_init_00105 l_chufi_init_00107: ;source-doc/ufi-drv/./ufi-init.c:30: if (storage_count == 0) -;source-doc/ufi-drv/./ufi-init.c:31: return; -;source-doc/ufi-drv/./ufi-init.c:33: print_device_mounted(" FLOPPY DRIVE$", storage_count); - ld a,(_storage_count+0) + ld hl,_storage_count + ld a, (hl) or a +;source-doc/ufi-drv/./ufi-init.c:31: return; jr Z,l_chufi_init_00110 +;source-doc/ufi-drv/./ufi-init.c:33: print_device_mounted(" FLOPPY DRIVE$", storage_count); + ld a,(_storage_count) push af inc sp ld hl,ufi_init_str_0 @@ -131,12 +133,11 @@ _chufi_get_cap: ;source-doc/ufi-drv/./ufi-init.c:38: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x24 - push hl - call _memset_callee + ld b,0x24 +l_chufi_get_cap_00112: + ld (hl),0x00 + inc hl + djnz l_chufi_get_cap_00112 ;source-doc/ufi-drv/./ufi-init.c:40: wait_for_device_ready(dev, 25); ld a,0x19 push af @@ -219,25 +220,22 @@ _chufi_read: call _wait_for_device_ready pop af inc sp - ld a, l + ld e, l pop bc + ld a, e or a jr Z,l_chufi_read_00102 ;source-doc/ufi-drv/./ufi-init.c:68: return -1; // Not READY! ld l,0xff - jp l_chufi_read_00109 + jr l_chufi_read_00109 l_chufi_read_00102: ;source-doc/ufi-drv/./ufi-init.c:73: memset(&sense_codes, 0, sizeof(sense_codes)); - push bc - ld hl,2 + ld hl,0 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x02 - push hl - call _memset_callee - pop bc + xor a + ld (hl), a + inc hl + ld (hl), a ;source-doc/ufi-drv/./ufi-init.c:75: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) @@ -262,9 +260,11 @@ l_chufi_read_00102: inc sp push bc call _ufi_read_write_sector - ld iy,10 - add iy, sp - ld sp, iy + pop af + pop af + pop af + pop af + pop af ld a, l pop bc or a @@ -277,12 +277,11 @@ l_chufi_read_00104: push bc ld hl,4 add hl, sp - push hl - ld hl,0x0000 - push hl - ld l,0x12 - push hl - call _memset_callee + ld b,0x12 +l_chufi_read_00139: + ld (hl),0x00 + inc hl + djnz l_chufi_read_00139 pop bc ;source-doc/ufi-drv/./ufi-init.c:81: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s index 852dd31b..134682ce 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.3.0 #14210 (Linux) +; Version 4.4.0 #14648 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -62,10 +62,10 @@ _usb_execute_cbi: add hl, sp ld sp, hl ;source-doc/ufi-drv/./usb_cbi.c:18: const uint8_t interface_number = storage_device->interface_number; - ld l,(ix+4) - ld h,(ix+5) - ld c,l - ld b,h + ld c,(ix+4) + ld b,(ix+5) + ld l, c + ld h, b inc hl inc hl ld e, (hl) @@ -76,8 +76,8 @@ _usb_execute_cbi: ld hl,4 add hl, sp ex de, hl - ld bc,0x0008 ld hl,_cbi2_adsc + ld bc,0x0008 ldir pop bc pop de @@ -116,8 +116,10 @@ _usb_execute_cbi: ld h,(ix+5) push hl call _usbdev_dat_in_trnsfer - ld hl,7 - add hl, sp + pop af + pop af + pop af + inc sp l_usb_execute_cbi_00102: ;source-doc/ufi-drv/./usb_cbi.c:30: return USB_ERR_STALL; ld l,0x02 diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index 6d1ee813..d9983fd8 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -578,6 +578,17 @@ DELAY1: ; | ; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | DEC A ; 4TS | | #IF (BIOS == BIOS_WBW) ; | | + #IF (CPUFAM == CPU_EZ80) ; | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + OR A ; +?TS FOR EZ80 | | + #ENDIF ; | | #IF (CPUFAM == CPU_Z180) ; | | OR A ; +4TS FOR Z180 | | #ENDIF ; | | From b4421a05323c009699b6213722af39cf79bb5bcc Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Fri, 18 Oct 2024 12:35:19 +1100 Subject: [PATCH 03/59] ch376-native: general fixes - mass storage and floppy devices over hub seem to be working --- Source/HBIOS/ch376-native/print.asm | 7 + .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 50 ++-- .../ch376-native/source-doc/base-drv/ch376.c | 4 +- .../ch376-native/source-doc/base-drv/print.c | 9 - .../ch376-native/source-doc/base-drv/print.h | 1 - .../source-doc/base-drv/protocol.c | 2 +- .../source-doc/base-drv/transfers.c | 2 +- .../source-doc/scsi-drv/scsi-init.c | 9 +- .../source-doc/ufi-drv/class_ufi.c | 2 +- .../source-doc/ufi-drv/ufi-init.c | 47 ++-- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 214 ++++++++++++++---- Source/HBIOS/ch376ufi.asm | 35 ++- 12 files changed, 271 insertions(+), 111 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/print.c diff --git a/Source/HBIOS/ch376-native/print.asm b/Source/HBIOS/ch376-native/print.asm index 70acafe7..99d736f2 100644 --- a/Source/HBIOS/ch376-native/print.asm +++ b/Source/HBIOS/ch376-native/print.asm @@ -2,6 +2,9 @@ ; HL = unsigned 16 bit number to write out ; call CHPUT to write a single ascii character (in A) _print_uint16: + ld a, h + or l + jr z, print_zero ld e, 0 ld bc, -10000 call num1 @@ -30,3 +33,7 @@ num2: inc a num3: ld e, 1 jp COUT + +print_zero + ld a, '0' + jp COUT diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 691f8f85..025f5a54 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -66,7 +66,7 @@ l_chscsi_init_00105: ;source-doc/scsi-drv/./scsi-init.c:18: if (storage_device == NULL) ld a, d or e - jr Z,l_chscsi_init_00107 + jr Z,l_chscsi_init_00108 ;source-doc/scsi-drv/./scsi-init.c:21: const usb_device_type t = storage_device->type; ld l, e ld h, d @@ -75,7 +75,20 @@ l_chscsi_init_00105: ;source-doc/scsi-drv/./scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/./scsi-init.c:24: storage_device->drive_index = storage_count++; +;source-doc/scsi-drv/./scsi-init.c:24: print_string("\r\n MASS STORAGE @ $"); + push de + ld hl,scsi_init_str_0 + call _print_string + pop de +;source-doc/scsi-drv/./scsi-init.c:25: print_uint16(index); + ld l,(ix-1) + ld h,0x00 + push de + call _print_uint16 + ld hl,scsi_init_str_1 + call _print_string + pop de +;source-doc/scsi-drv/./scsi-init.c:28: storage_device->drive_index = storage_count++; ld hl,0x0010 add hl, de ld c, l @@ -86,42 +99,31 @@ l_chscsi_init_00105: inc (hl) ld a,(ix-2) ld (bc), a -;source-doc/scsi-drv/./scsi-init.c:25: scsi_sense_init(storage_device); +;source-doc/scsi-drv/./scsi-init.c:29: scsi_sense_init(storage_device); push de push de call _scsi_sense_init pop af pop de -;source-doc/scsi-drv/./scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/./scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/./scsi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/./scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chscsi_init_00105 -l_chscsi_init_00107: -;source-doc/scsi-drv/./scsi-init.c:31: if (storage_count == 0) - ld hl,_storage_count - ld a, (hl) - or a -;source-doc/scsi-drv/./scsi-init.c:32: return; - jr Z,l_chscsi_init_00110 -;source-doc/scsi-drv/./scsi-init.c:34: print_device_mounted(" STORAGE DEVICE$", storage_count); - ld a,(_storage_count) - push af - inc sp - ld hl,scsi_init_str_0 - push hl - call _print_device_mounted - pop af - inc sp -l_chscsi_init_00110: -;source-doc/scsi-drv/./scsi-init.c:35: } +l_chscsi_init_00108: +;source-doc/scsi-drv/./scsi-init.c:34: } ld sp, ix pop ix ret scsi_init_str_0: - DEFM " STORAGE DEVICE$" + DEFB 0x0d + DEFB 0x0a + DEFM " MASS STORAGE @ $" + DEFB 0x00 +scsi_init_str_1: + DEFM " $" DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index 3e358feb..4c7b52d1 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -1,7 +1,7 @@ #include "ch376.h" -#include "print.h" #include "ez80-helpers.h" +#include "print.h" usb_error result = 0; @@ -41,7 +41,7 @@ usb_error ch_get_status(void) { delay(); delay(); uint8_t ch_status = CH376_DATA_PORT; - + if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) return ch_status; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.c b/Source/HBIOS/ch376-native/source-doc/base-drv/print.c deleted file mode 100644 index bcec3e82..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/print.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "print.h" - -void print_device_mounted(const char *const description, const uint8_t count) { - print_string("\r\n $"); - print_uint16(count); - print_string(description); - if (count > 1) - print_string("S$"); -} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h index 7b4c4723..480f73f7 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h @@ -6,6 +6,5 @@ extern void print_hex(const char c) __z88dk_fastcall; extern void print_string(const char *p) __z88dk_fastcall; extern void print_uint16(const uint16_t n) __z88dk_fastcall; -extern void print_device_mounted(const char *const description, const uint8_t count); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c index 10dbbdd4..e5c5101c 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c @@ -15,8 +15,8 @@ #include "delay.h" #include -#include "print.h" #include "ez80-helpers.h" +#include "print.h" const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 4c7bcbe9..c19efcc5 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -16,8 +16,8 @@ #include "z80.h" #include -#include "print.h" #include "ez80-helpers.h" +#include "print.h" #define LOWER_SAFE_RAM_ADDRESS 0x8000 diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index 1511f3b5..8128f4ca 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -21,15 +21,14 @@ void chscsi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_MASS_STORAGE) { + print_string("\r\n MASS STORAGE @ $"); + print_uint16(index); + print_string(" $"); + storage_device->drive_index = storage_count++; scsi_sense_init(storage_device); dio_add_entry(ch_scsi_fntbl, storage_device); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); - - if (storage_count == 0) - return; - - print_device_mounted(" STORAGE DEVICE$", storage_count); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c index 035c33d4..ed5f265a 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c @@ -94,7 +94,7 @@ usb_error ufi_read_write_sector(device_config *const storage_device, const bool send, const uint16_t sector_number, const uint8_t sector_count, - const uint8_t *const buffer, + uint8_t *const buffer, uint8_t *const sense_codes) { ufi_read_write_command cmd; memset(&cmd, 0, sizeof(cmd)); diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 6cbd88bd..ec82dc90 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -20,17 +20,15 @@ void chufi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_FLOPPY) { + print_string("\r\n FLOPPY @ $"); + print_uint16(index); + print_string(" $"); storage_device->drive_index = storage_count++; // scsi_sense_init(storage_device); dio_add_entry(ch_ufi_fntbl, storage_device); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); - - if (storage_count == 0) - return; - - print_device_mounted(" FLOPPY DRIVE$", storage_count); } uint32_t chufi_get_cap(device_config *const dev) { @@ -49,17 +47,7 @@ uint32_t chufi_get_cap(device_config *const dev) { if (result != USB_ERR_OK) return 0; - // info->sector_size = response.descriptors[0].block_size[1] << 8 + response.descriptors[0].block_size[0]; return convert_from_msb_first(response.descriptors[0].number_of_blocks); - - // const disk_geometry *const geometry = size_to_geometry(info->number_of_sectors); - - // info->flags = INFO_FLAG_REMOVABLE | INFO_FLAG_FLOPPY; - // info->number_of_cylinders = geometry->tracks; - // info->number_of_heads = geometry->sides; - // info->number_of_sectors_per_track = geometry->sectors_per_track; - - // return 0; } uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { @@ -90,3 +78,32 @@ uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { return USB_ERR_OK; } + +usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + return -1; + } + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + return -1; + } + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 11daa508..33bbebd2 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -66,7 +66,7 @@ l_chufi_init_00105: ;source-doc/ufi-drv/./ufi-init.c:17: if (storage_device == NULL) ld a, d or e - jr Z,l_chufi_init_00107 + jr Z,l_chufi_init_00108 ;source-doc/ufi-drv/./ufi-init.c:20: const usb_device_type t = storage_device->type; ld l, e ld h, d @@ -75,7 +75,20 @@ l_chufi_init_00105: ;source-doc/ufi-drv/./ufi-init.c:22: if (t == USB_IS_FLOPPY) { dec a jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/./ufi-init.c:23: storage_device->drive_index = storage_count++; +;source-doc/ufi-drv/./ufi-init.c:23: print_string("\r\n FLOPPY @ $"); + push de + ld hl,ufi_init_str_0 + call _print_string + pop de +;source-doc/ufi-drv/./ufi-init.c:24: print_uint16(index); + ld l,(ix-1) + ld h,0x00 + push de + call _print_uint16 + ld hl,ufi_init_str_1 + call _print_string + pop de +;source-doc/ufi-drv/./ufi-init.c:26: storage_device->drive_index = storage_count++; ld hl,0x0010 add hl, de ld c, l @@ -86,40 +99,29 @@ l_chufi_init_00105: inc (hl) ld a,(ix-2) ld (bc), a -;source-doc/ufi-drv/./ufi-init.c:25: dio_add_entry(ch_ufi_fntbl, storage_device); +;source-doc/ufi-drv/./ufi-init.c:28: dio_add_entry(ch_ufi_fntbl, storage_device); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/./ufi-init.c:28: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/./ufi-init.c:31: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 -l_chufi_init_00107: -;source-doc/ufi-drv/./ufi-init.c:30: if (storage_count == 0) - ld hl,_storage_count - ld a, (hl) - or a -;source-doc/ufi-drv/./ufi-init.c:31: return; - jr Z,l_chufi_init_00110 -;source-doc/ufi-drv/./ufi-init.c:33: print_device_mounted(" FLOPPY DRIVE$", storage_count); - ld a,(_storage_count) - push af - inc sp - ld hl,ufi_init_str_0 - push hl - call _print_device_mounted - pop af - inc sp -l_chufi_init_00110: -;source-doc/ufi-drv/./ufi-init.c:34: } +l_chufi_init_00108: +;source-doc/ufi-drv/./ufi-init.c:32: } ld sp, ix pop ix ret ufi_init_str_0: - DEFM " FLOPPY DRIVE$" + DEFB 0x0d + DEFB 0x0a + DEFM " FLOPPY @ $" + DEFB 0x00 +ufi_init_str_1: + DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/./ufi-init.c:36: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/./ufi-init.c:34: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -130,7 +132,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:38: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/./ufi-init.c:36: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x24 @@ -138,7 +140,7 @@ l_chufi_get_cap_00112: ld (hl),0x00 inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/./ufi-init.c:40: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/./ufi-init.c:38: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -148,7 +150,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:44: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/./ufi-init.c:42: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -157,7 +159,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/./ufi-init.c:46: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/./ufi-init.c:44: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -167,7 +169,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:48: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/./ufi-init.c:46: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -178,27 +180,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/./ufi-init.c:49: if (result != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:47: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/./ufi-init.c:50: return 0; +;source-doc/ufi-drv/./ufi-init.c:48: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/./ufi-init.c:53: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/./ufi-init.c:50: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/./ufi-init.c:63: } +;source-doc/ufi-drv/./ufi-init.c:51: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./ufi-init.c:65: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/./ufi-init.c:53: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -209,7 +211,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:67: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/./ufi-init.c:55: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -225,18 +227,18 @@ _chufi_read: ld a, e or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/./ufi-init.c:68: return -1; // Not READY! +;source-doc/ufi-drv/./ufi-init.c:56: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/./ufi-init.c:73: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/./ufi-init.c:61: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/./ufi-init.c:75: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:63: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -269,11 +271,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/./ufi-init.c:76: return -1; // general error +;source-doc/ufi-drv/./ufi-init.c:64: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/./ufi-init.c:79: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/./ufi-init.c:67: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -283,7 +285,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/./ufi-init.c:81: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:69: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -294,25 +296,143 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/./ufi-init.c:82: return -1; // error +;source-doc/ufi-drv/./ufi-init.c:70: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/./ufi-init.c:86: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/./ufi-init.c:74: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/./ufi-init.c:88: if (sense_key != 0) +;source-doc/ufi-drv/./ufi-init.c:76: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/./ufi-init.c:89: return -1; +;source-doc/ufi-drv/./ufi-init.c:77: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/./ufi-init.c:91: return USB_ERR_OK; +;source-doc/ufi-drv/./ufi-init.c:79: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/./ufi-init.c:92: } +;source-doc/ufi-drv/./ufi-init.c:80: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/./ufi-init.c:82: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +; --------------------------------- +; Function chufi_write +; --------------------------------- +_chufi_write: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/./ufi-init.c:84: if (wait_for_device_ready((device_config *)dev, 20) != 0) + ld c,(ix+4) + ld b,(ix+5) + push bc + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld e, l + pop bc + ld a, e + or a + jr Z,l_chufi_write_00102 +;source-doc/ufi-drv/./ufi-init.c:85: return -1; // Not READY! + ld l,0xff + jr l_chufi_write_00109 +l_chufi_write_00102: +;source-doc/ufi-drv/./ufi-init.c:89: memset(&sense_codes, 0, sizeof(sense_codes)); + ld hl,0 + add hl, sp + xor a + ld (hl), a + inc hl + ld (hl), a +;source-doc/ufi-drv/./ufi-init.c:90: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + ld e,(ix+4) + ld d,(ix+5) + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + ld a,0x01 + push af + inc sp + push bc + call _ufi_read_write_sector + pop af + pop af + pop af + pop af + pop af + ld a, l + pop bc + or a + jr Z,l_chufi_write_00104 +;source-doc/ufi-drv/./ufi-init.c:91: return -1; + ld l,0xff + jr l_chufi_write_00109 +l_chufi_write_00104: +;source-doc/ufi-drv/./ufi-init.c:95: memset(&response, 0, sizeof(response)); + push bc + ld hl,4 + add hl, sp + ld b,0x12 +l_chufi_write_00139: + ld (hl),0x00 + inc hl + djnz l_chufi_write_00139 + pop bc +;source-doc/ufi-drv/./ufi-init.c:97: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_chufi_write_00106 +;source-doc/ufi-drv/./ufi-init.c:98: return -1; + ld l,0xff + jr l_chufi_write_00109 +l_chufi_write_00106: +;source-doc/ufi-drv/./ufi-init.c:103: const uint8_t sense_key = response.sense_key; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/./ufi-init.c:105: if (sense_key != 0) + and 0x0f + jr Z,l_chufi_write_00108 +;source-doc/ufi-drv/./ufi-init.c:106: return -1; + ld l,0xff + jr l_chufi_write_00109 +l_chufi_write_00108: +;source-doc/ufi-drv/./ufi-init.c:108: return USB_ERR_OK; + ld l,0x00 +l_chufi_write_00109: +;source-doc/ufi-drv/./ufi-init.c:109: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 95e819e9..330db5a3 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -100,12 +100,37 @@ CH_UFI_READ: ld bc, 512 add hl, bc ret - +; +; ### Function 0x14 -- Disk Write (DIOWRITE) +; +; Inputs +; IY: device config pointer +; D: Buffer Bank ID +; E: Sector Count +; HL: Buffer Address +; +; Outputs +; A: Status +; E: Sectors Written +; +; Write Sector Count (E) sectors from the buffer located in Buffer Bank ID (D) +; at Buffer Address (HL) starting at the Current Sector. The returned +; Status (A) is a standard HBIOS result code. +; CH_UFI_WRITE: - EZ80_UTIL_DEBUG + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR - XOR A - RET + ; call scsi_write(IY, HL); + ; HL = HL + 512 + push hl + push iy + call _chufi_write + ld a, l + pop hl + pop iy + ld bc, 512 + add hl, bc + ret CH_UFI_VERIFY: CH_UFI_FORMAT: @@ -158,7 +183,7 @@ CH_UFI_FORMAT: ; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | ; CH_UFI_DEVICE: - LD C, %01011011 + LD C, %11010110 LD D, DIODEV_USB LD E, (iy+16) LD H, 0 From 1e1554937c21cf217e59bb94ec7cc629c0be8899 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Fri, 18 Oct 2024 21:46:06 +1100 Subject: [PATCH 04/59] usb-keyboard: enumerated --- Source/HBIOS/Config/RCEZ80_std.asm | 8 +- Source/HBIOS/cfg_RCEZ80.asm | 2 +- Source/HBIOS/ch376-native/Makefile | 23 +- Source/HBIOS/ch376-native/base-drv.s | 1 - .../HBIOS/ch376-native/base-drv/class_hid.c.s | 254 ++++++++++++++++++ .../ch376-native/base-drv/usb-base-drv.c.s | 4 - .../HBIOS/ch376-native/base-drv/usb-init.c.s | 2 +- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 76 ++---- .../HBIOS/ch376-native/base-drv/work-area.c.s | 8 +- Source/HBIOS/ch376-native/keyboard.s | 3 + .../HBIOS/ch376-native/keyboard/class_hid.c.s | 254 ++++++++++++++++++ .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 134 +++++++++ .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 19 +- .../source-doc/base-drv/dev_transfers.h | 2 +- .../source-doc/base-drv/usb-base-drv.c | 4 +- .../source-doc/base-drv/usb-base-drv.h | 2 +- .../source-doc/base-drv/usb_state.c | 10 +- .../source-doc/convert-for-uz80as.sh | 1 + .../HBIOS/ch376-native/source-doc/depends.d | 15 +- .../source-doc/keyboard/class_hid.c | 46 ++++ .../source-doc/keyboard/class_hid.h | 21 ++ .../source-doc/keyboard/class_hid_keyboard.h | 24 ++ .../source-doc/keyboard/kyb-init.c | 54 ++++ .../source-doc/scsi-drv/scsi-init.c | 4 +- .../source-doc/ufi-drv/ufi-init.c | 4 +- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 101 ++++--- Source/HBIOS/ch376kyb.asm | 90 +++++++ Source/HBIOS/hbios.asm | 17 +- Source/HBIOS/std.asm | 2 + Source/HBIOS/tms.asm | 22 +- 30 files changed, 1033 insertions(+), 174 deletions(-) create mode 100644 Source/HBIOS/ch376-native/base-drv/class_hid.c.s create mode 100644 Source/HBIOS/ch376-native/keyboard.s create mode 100644 Source/HBIOS/ch376-native/keyboard/class_hid.c.s create mode 100644 Source/HBIOS/ch376-native/keyboard/kyb-init.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.h create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c create mode 100644 Source/HBIOS/ch376kyb.asm diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index e9f7d2db..c6ba7487 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -54,9 +54,9 @@ FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ;; -TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU] -TMS80COLS .SET FALSE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 +TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_MSXUKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] +TMS80COLS .SET TRUE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) EFENABLE .SET FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) @@ -89,3 +89,5 @@ CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) + +EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index 508548ae..b31bd5d2 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -249,7 +249,7 @@ VDUENABLE .SET FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .SET FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) GDCENABLE .SET FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU] +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] TMS80COLS .SET FALSE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VGAENABLE .SET FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 78963327..27dd21f7 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -18,7 +18,7 @@ ZCC := zcc +z80 -vn -startup=0 -clib=sdcc_iy -crt0 $(SRC)crt.asm -compiler=sdcc ASSDIR := ./ -all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s +all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s $(ASSDIR)keyboard.s clean: @rm -rf base-drv @@ -52,6 +52,15 @@ $(ASSDIR)ufi-drv.s: echo '#include "'ch376-native/ufi-drv/$${dep}'"' >> $(ASSDIR)ufi-drv.s done +$(ASSDIR)keyboard.s: + @echo "Creating keyboard.s" + echo "; Generated File -- not to be modify directly" > $(ASSDIR)keyboard.s + for dep in $^; do + dep=$${dep#*/} + dep=$${dep#*/} + echo '#include "'ch376-native/keyboard/$${dep}'"' >> $(ASSDIR)keyboard.s + done + $(ASSDIR)%.c.s: $(ASSDIR)%.c.asm @mkdir -p $(dir $@) echo "Converting $< to $@" @@ -70,6 +79,7 @@ endef $(ASSDIR)base-drv/%.c.asm: $(SRC)base-drv/%.c; $(compile) $(ASSDIR)scsi-drv/%.c.asm: $(SRC)scsi-drv/%.c; $(compile) +$(ASSDIR)keyboard/%.c.asm: $(SRC)keyboard/%.c; $(compile) $(ASSDIR)ufi-drv/%.c.asm: $(SRC)ufi-drv/%.c; $(compile) $(ASSDIR)%.c.asm: $(SRC)%.c; $(compile) $(ASSDIR)libraries/delay/%.c.asm: ../apps/libraries/delay/%.c; $(compile) @@ -133,6 +143,17 @@ deps: printf "ufi-drv/$$file.s " >> ${SRC}/depends.d done + printf "\r\n" >> ${SRC}/depends.d + # # configure keyboard.s to all .s files + printf "##\r\n" >> ${SRC}/depends.d + printf "./keyboard.s: " >> ${SRC}/depends.d + (cd ${SRC}/keyboard && find -name "*.c") | while read -r file; do + file_no_ext="$${file%.*}" + file_no_ext=$${file_no_ext#./} + filename=$$(basename $$file_no_ext) + printf "keyboard/$$file.s " >> ${SRC}/depends.d + done + echo "" >> ${SRC}/depends.d echo "${SRC}depends.d created" diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index 6aa5aa97..45005e37 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -7,7 +7,6 @@ #include "ch376-native/base-drv/enumerate_hub.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" #include "ch376-native/base-drv/transfers.c.s" -#include "ch376-native/base-drv/print.c.s" #include "ch376-native/base-drv/ch376.c.s" #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/work-area.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/class_hid.c.s b/Source/HBIOS/ch376-native/base-drv/class_hid.c.s new file mode 100644 index 00000000..6d750eec --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/class_hid.c.s @@ -0,0 +1,254 @@ +; +; Generated from source-doc/base-drv/./class_hid.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/./class_hid.c:6: usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { +; --------------------------------- +; Function hid_set_protocol +; --------------------------------- +_hid_set_protocol: + push ix + ld ix,0 + add ix,sp + push af + push af + push af + push af + ex de, hl +;source-doc/base-drv/./class_hid.c:9: cmd = cmd_hid_set; + push de + ex de, hl + ld hl,2 + add hl, sp + ex de, hl + ld hl,_cmd_hid_set + ld bc,0x0008 + ldir + pop de +;source-doc/base-drv/./class_hid.c:11: cmd.bRequest = HID_SET_PROTOCOL; + ld (ix-7),0x0b +;source-doc/base-drv/./class_hid.c:12: cmd.bValue[0] = protocol; + ld a,(ix+4) + ld (ix-6),a +;source-doc/base-drv/./class_hid.c:14: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); + ld l, e + ld h, d + inc hl + ld c, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h, c + push hl + inc sp + push af + inc sp + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/base-drv/./class_hid.c:16: RETURN_CHECK(result); +;source-doc/base-drv/./class_hid.c:17: } + ld sp, ix + pop ix + pop hl + inc sp + jp (hl) +_cmd_hid_set: + DEFB +0x21 + DEFB +0x0b + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0000 +;source-doc/base-drv/./class_hid.c:19: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { +; --------------------------------- +; Function hid_set_idle +; --------------------------------- +_hid_set_idle: + push ix + ld ix,0 + add ix,sp + push af + push af + push af + push af + ex de, hl +;source-doc/base-drv/./class_hid.c:22: cmd = cmd_hid_set; + push de + ex de, hl + ld hl,2 + add hl, sp + ex de, hl + ld hl,_cmd_hid_set + ld bc,0x0008 + ldir + pop de +;source-doc/base-drv/./class_hid.c:24: cmd.bRequest = HID_SET_IDLE; + ld (ix-7),0x0a +;source-doc/base-drv/./class_hid.c:25: cmd.bValue[0] = duration; + ld a,(ix+4) + ld (ix-6),a +;source-doc/base-drv/./class_hid.c:27: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); + ld l, e + ld h, d + inc hl + ld c, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h, c + push hl + inc sp + push af + inc sp + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/base-drv/./class_hid.c:29: RETURN_CHECK(result); +;source-doc/base-drv/./class_hid.c:30: } + ld sp, ix + pop ix + pop hl + inc sp + jp (hl) +;source-doc/base-drv/./class_hid.c:32: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { +; --------------------------------- +; Function hid_get_input_report +; --------------------------------- +_hid_get_input_report: + push ix + ld ix,0 + add ix,sp + ld c, l + ld b, h + ld hl, -9 + add hl, sp + ld sp, hl + ld l, c + ld h, b +;source-doc/base-drv/./class_hid.c:35: cmd = cmd_hid_set; + push de + push hl + ex de, hl + ld hl,4 + add hl, sp + ex de, hl + ld hl,_cmd_hid_set + ld bc,0x0008 + ldir + pop bc + pop de +;source-doc/base-drv/./class_hid.c:37: cmd.bmRequestType = 0xA1; + ld (ix-9),0xa1 +;source-doc/base-drv/./class_hid.c:38: cmd.bValue[0] = 1; + ld (ix-7),0x01 +;source-doc/base-drv/./class_hid.c:39: cmd.bValue[1] = 1; + ld (ix-6),0x01 +;source-doc/base-drv/./class_hid.c:40: cmd.bRequest = HID_GET_REPORT; + ld (ix-8),0x01 +;source-doc/base-drv/./class_hid.c:41: cmd.wLength = 8; + ld (ix-3),0x08 + xor a + ld (ix-2),a +;source-doc/base-drv/./class_hid.c:43: result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); + ld l, c + ld h, b + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h,(ix-1) + push hl + inc sp + push af + inc sp + push de + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/base-drv/./class_hid.c:45: RETURN_CHECK(result); +;source-doc/base-drv/./class_hid.c:46: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 242ccf70..3728d20a 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -33,8 +33,6 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk -_storage_count: - DEFS 1 #ENDIF @@ -87,5 +85,3 @@ _chnative_seek: pop hl pop bc jp (hl) -_storage_count: - DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index db185d27..5145ebfc 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -94,7 +94,7 @@ _usb_host_bus_reset: _chnative_init: ;source-doc/base-drv/./usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); ld hl,_x - ld b,0x69 + ld b,0x63 l_chnative_init_00139: ld (hl),0x00 inc hl diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index d1352853..b292e052 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -92,8 +92,8 @@ l_find_device_config_00106: ret _device_config_sizes: DEFB +0x00 - DEFB +0x11 - DEFB +0x11 + DEFB +0x10 + DEFB +0x10 DEFB +0x0c DEFB +0x06 DEFB 0x00 @@ -175,7 +175,7 @@ l_next_device_config_00102: add hl, de ex de, hl ;source-doc/base-drv/./usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) - ld hl,0x0068 + ld hl,0x0062 add hl, bc ld a, e sub l @@ -193,79 +193,41 @@ l_next_device_config_00105: ; Function get_usb_device_config ; --------------------------------- _get_usb_device_config: - push ix - ld ix,0 - add ix,sp - push af - ld (ix-1),a + ld c, a ;source-doc/base-drv/./usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/./usb_state.c:71: uint8_t counter = 1; - ld (ix-2),0x01 ;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc ld hl,_x call _first_device_config - ld c,0x01 -l_get_usb_device_config_00112: + pop bc + ld b,0x01 +l_get_usb_device_config_00107: ld a, d or e jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/./usb_state.c:74: if (p->type == USB_IS_FLOPPY) { +;source-doc/base-drv/./usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) { ld l, e ld h, d ld a, (hl) and 0x0f - dec a - jr NZ,l_get_usb_device_config_00113 + jr Z,l_get_usb_device_config_00108 ;source-doc/base-drv/./usb_state.c:75: if (counter == device_index) - ld a,(ix-1) - sub c + ld a, c + sub b ;source-doc/base-drv/./usb_state.c:76: return p; - jr Z,l_get_usb_device_config_00117 + jr Z,l_get_usb_device_config_00109 ;source-doc/base-drv/./usb_state.c:77: counter++; - inc c - ld (ix-2),c -l_get_usb_device_config_00113: + inc b +l_get_usb_device_config_00108: ;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _next_device_config pop bc - jr l_get_usb_device_config_00112 + jr l_get_usb_device_config_00107 l_get_usb_device_config_00105: -;source-doc/base-drv/./usb_state.c:81: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - ld hl,_x - call _first_device_config - ld c,(ix-2) -l_get_usb_device_config_00115: - ld a, d - or e - jr Z,l_get_usb_device_config_00110 -;source-doc/base-drv/./usb_state.c:82: if (p->type == USB_IS_MASS_STORAGE) { - ld l, e - ld h, d - ld a, (hl) - and 0x0f - sub 0x02 - jr NZ,l_get_usb_device_config_00116 -;source-doc/base-drv/./usb_state.c:83: if (counter == device_index) - ld a,(ix-1) - sub c -;source-doc/base-drv/./usb_state.c:84: return p; - jr Z,l_get_usb_device_config_00117 -;source-doc/base-drv/./usb_state.c:85: counter++; - inc c -l_get_usb_device_config_00116: -;source-doc/base-drv/./usb_state.c:81: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - push bc - ld hl,_x - call _next_device_config - pop bc - jr l_get_usb_device_config_00115 -l_get_usb_device_config_00110: -;source-doc/base-drv/./usb_state.c:89: return NULL; // is not a usb device +;source-doc/base-drv/./usb_state.c:81: return NULL; // is not a usb device ld de,0x0000 -l_get_usb_device_config_00117: -;source-doc/base-drv/./usb_state.c:90: } - ld sp, ix - pop ix +l_get_usb_device_config_00109: +;source-doc/base-drv/./usb_state.c:82: } ret diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index e084ee41..23f946c7 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -34,7 +34,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk _x: - DEFS 105 + DEFS 99 #ENDIF @@ -149,10 +149,4 @@ _x: DEFB 0x00 DEFB 0x00 DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s new file mode 100644 index 00000000..5e459709 --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -0,0 +1,3 @@ +; Generated File -- not to be modify directly +#include "ch376-native/keyboard/kyb-init.c.s" +#include "ch376-native/keyboard/class_hid.c.s" diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s new file mode 100644 index 00000000..38fa0e15 --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s @@ -0,0 +1,254 @@ +; +; Generated from source-doc/keyboard/./class_hid.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/keyboard/./class_hid.c:6: usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { +; --------------------------------- +; Function hid_set_protocol +; --------------------------------- +_hid_set_protocol: + push ix + ld ix,0 + add ix,sp + push af + push af + push af + push af + ex de, hl +;source-doc/keyboard/./class_hid.c:9: cmd = cmd_hid_set; + push de + ex de, hl + ld hl,2 + add hl, sp + ex de, hl + ld hl,_cmd_hid_set + ld bc,0x0008 + ldir + pop de +;source-doc/keyboard/./class_hid.c:11: cmd.bRequest = HID_SET_PROTOCOL; + ld (ix-7),0x0b +;source-doc/keyboard/./class_hid.c:12: cmd.bValue[0] = protocol; + ld a,(ix+4) + ld (ix-6),a +;source-doc/keyboard/./class_hid.c:14: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); + ld l, e + ld h, d + inc hl + ld c, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h, c + push hl + inc sp + push af + inc sp + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/keyboard/./class_hid.c:16: RETURN_CHECK(result); +;source-doc/keyboard/./class_hid.c:17: } + ld sp, ix + pop ix + pop hl + inc sp + jp (hl) +_cmd_hid_set: + DEFB +0x21 + DEFB +0x0b + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0000 +;source-doc/keyboard/./class_hid.c:19: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { +; --------------------------------- +; Function hid_set_idle +; --------------------------------- +_hid_set_idle: + push ix + ld ix,0 + add ix,sp + push af + push af + push af + push af + ex de, hl +;source-doc/keyboard/./class_hid.c:22: cmd = cmd_hid_set; + push de + ex de, hl + ld hl,2 + add hl, sp + ex de, hl + ld hl,_cmd_hid_set + ld bc,0x0008 + ldir + pop de +;source-doc/keyboard/./class_hid.c:24: cmd.bRequest = HID_SET_IDLE; + ld (ix-7),0x0a +;source-doc/keyboard/./class_hid.c:25: cmd.bValue[0] = duration; + ld a,(ix+4) + ld (ix-6),a +;source-doc/keyboard/./class_hid.c:27: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); + ld l, e + ld h, d + inc hl + ld c, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h, c + push hl + inc sp + push af + inc sp + ld hl,0x0000 + push hl + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/keyboard/./class_hid.c:29: RETURN_CHECK(result); +;source-doc/keyboard/./class_hid.c:30: } + ld sp, ix + pop ix + pop hl + inc sp + jp (hl) +;source-doc/keyboard/./class_hid.c:32: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { +; --------------------------------- +; Function hid_get_input_report +; --------------------------------- +_hid_get_input_report: + push ix + ld ix,0 + add ix,sp + ld c, l + ld b, h + ld hl, -9 + add hl, sp + ld sp, hl + ld l, c + ld h, b +;source-doc/keyboard/./class_hid.c:35: cmd = cmd_hid_set; + push de + push hl + ex de, hl + ld hl,4 + add hl, sp + ex de, hl + ld hl,_cmd_hid_set + ld bc,0x0008 + ldir + pop bc + pop de +;source-doc/keyboard/./class_hid.c:37: cmd.bmRequestType = 0xA1; + ld (ix-9),0xa1 +;source-doc/keyboard/./class_hid.c:38: cmd.bValue[0] = 1; + ld (ix-7),0x01 +;source-doc/keyboard/./class_hid.c:39: cmd.bValue[1] = 1; + ld (ix-6),0x01 +;source-doc/keyboard/./class_hid.c:40: cmd.bRequest = HID_GET_REPORT; + ld (ix-8),0x01 +;source-doc/keyboard/./class_hid.c:41: cmd.wLength = 8; + ld (ix-3),0x08 + xor a + ld (ix-2),a +;source-doc/keyboard/./class_hid.c:43: result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); + ld l, c + ld h, b + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and 0x0f + ld h,(ix-1) + push hl + inc sp + push af + inc sp + push de + ld hl,4 + add hl, sp + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/keyboard/./class_hid.c:45: RETURN_CHECK(result); +;source-doc/keyboard/./class_hid.c:46: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s new file mode 100644 index 00000000..ac8491a6 --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -0,0 +1,134 @@ +; +; Generated from source-doc/keyboard/./kyb-init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/keyboard/./kyb-init.c:8: void keyboard_init(void) { +; --------------------------------- +; Function keyboard_init +; --------------------------------- +_keyboard_init: +;source-doc/keyboard/./kyb-init.c:10: uint8_t index = 1; +;source-doc/keyboard/./kyb-init.c:11: do { + ld bc,0x0101 +l_keyboard_init_00105: +;source-doc/keyboard/./kyb-init.c:12: device_config_keyboard *const keyboard_config = (device_config_keyboard *)get_usb_device_config(index); + push bc + ld a, b + call _get_usb_device_config + pop bc +;source-doc/keyboard/./kyb-init.c:14: if (keyboard_config == NULL) + ld a, d + or e + jr Z,l_keyboard_init_00107 +;source-doc/keyboard/./kyb-init.c:17: const usb_device_type t = keyboard_config->type; + ld l, e + ld h, d + ld a, (hl) + and 0x0f +;source-doc/keyboard/./kyb-init.c:19: if (t == USB_IS_KEYBOARD) { + sub 0x04 + jr NZ,l_keyboard_init_00106 +;source-doc/keyboard/./kyb-init.c:20: print_string("\r\nUSB: KEYBOARD @ $"); + push bc + push de + ld hl,kyb_init_str_0 + call _print_string + pop de + pop bc +;source-doc/keyboard/./kyb-init.c:21: print_uint16(index); + ld h,0x00 + push de + ld l, c + call _print_uint16 + ld hl,kyb_init_str_1 + call _print_string + pop de +;source-doc/keyboard/./kyb-init.c:25: hid_set_protocol(keyboard_config, 1); + push de + ld a,0x01 + push af + inc sp + ex de,hl + call _hid_set_protocol + pop de +;source-doc/keyboard/./kyb-init.c:26: hid_set_idle(keyboard_config, 0x80); + ld a,0x80 + push af + inc sp + ex de, hl + call _hid_set_idle +;source-doc/keyboard/./kyb-init.c:27: return; + jr l_keyboard_init_00108 +l_keyboard_init_00106: +;source-doc/keyboard/./kyb-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc b + ld a,b + ld c,a + sub 0x07 + jr NZ,l_keyboard_init_00105 +l_keyboard_init_00107: +;source-doc/keyboard/./kyb-init.c:31: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); + ld hl,kyb_init_str_2 + jp _print_string +l_keyboard_init_00108: +;source-doc/keyboard/./kyb-init.c:32: } + ret +kyb_init_str_0: + DEFB 0x0d + DEFB 0x0a + DEFM "USB: KEYBOARD @ $" + DEFB 0x00 +kyb_init_str_1: + DEFM " $" + DEFB 0x00 +kyb_init_str_2: + DEFB 0x0d + DEFB 0x0a + DEFM "USB: KEYBOARD: NOT FOUND$" + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 025f5a54..78c5ef49 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -56,7 +56,7 @@ _chscsi_init: push ix ld ix,0 add ix,sp - push af + dec sp ;source-doc/scsi-drv/./scsi-init.c:15: do { ld (ix-1),0x01 l_chscsi_init_00105: @@ -75,7 +75,7 @@ l_chscsi_init_00105: ;source-doc/scsi-drv/./scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/./scsi-init.c:24: print_string("\r\n MASS STORAGE @ $"); +;source-doc/scsi-drv/./scsi-init.c:24: print_string("\r\nUSB: MASS STORAGE @ $"); push de ld hl,scsi_init_str_0 call _print_string @@ -88,17 +88,6 @@ l_chscsi_init_00105: ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/./scsi-init.c:28: storage_device->drive_index = storage_count++; - ld hl,0x0010 - add hl, de - ld c, l - ld b, h - ld hl,_storage_count - ld a, (hl) - ld (ix-2),a - inc (hl) - ld a,(ix-2) - ld (bc), a ;source-doc/scsi-drv/./scsi-init.c:29: scsi_sense_init(storage_device); push de push de @@ -116,13 +105,13 @@ l_chscsi_init_00106: jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: ;source-doc/scsi-drv/./scsi-init.c:34: } - ld sp, ix + inc sp pop ix ret scsi_init_str_0: DEFB 0x0d DEFB 0x0a - DEFM " MASS STORAGE @ $" + DEFM "USB: MASS STORAGE @ $" DEFB 0x00 scsi_init_str_1: DEFM " $" diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index 23cf0001..0c0a92eb 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -39,7 +39,7 @@ typedef struct { COMMON_DEVICE_CONFIG // bytes: 0-2 endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt uint32_t current_lba; // bytes 12-15 - uint8_t drive_index; // byte 16 + // uint8_t drive_index; // byte 16 } device_config_storage; typedef struct { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index 84b14855..a0ce48b2 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -1,7 +1,7 @@ #include "usb-base-drv.h" -/* The total number of mounted storage devices (scsi and ufi) */ -uint8_t storage_count = 0; +/* The total number of mounted devices (scsi, ufi and keyboard) */ +// uint8_t usb_device_count = 0; uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { storage_device->current_lba = lba; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h index 3d2abd53..0f1e89fc 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -4,7 +4,7 @@ #include #include -extern uint8_t storage_count; +// extern uint8_t usb_device_count; extern uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index 1138c9fe..fe6709b9 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -71,15 +71,7 @@ device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { uint8_t counter = 1; for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - if (p->type == USB_IS_FLOPPY) { - if (counter == device_index) - return p; - counter++; - } - } - - for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - if (p->type == USB_IS_MASS_STORAGE) { + if (p->type != USB_NOT_SUPPORTED) { if (counter == device_index) return p; counter++; diff --git a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh index 8c1a1286..c94c67c0 100755 --- a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh +++ b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh @@ -29,6 +29,7 @@ sed -E \ -e 's/\s+or\s+a,\((ix\+[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((ix\-[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((iy\+[0-9-]+)\)/\tor\t\(\1\)/g' \ + -e 's/\s+or\s+a,\((hl)\)/\tor\t\(\1\)/g' \ -e 's/\s+cp\s+a,(0x[0-9A-Fa-f]{2})/\tcp\t\1/g' \ -e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \ -e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \ diff --git a/Source/HBIOS/ch376-native/source-doc/depends.d b/Source/HBIOS/ch376-native/source-doc/depends.d index 6f457cee..9c073580 100644 --- a/Source/HBIOS/ch376-native/source-doc/depends.d +++ b/Source/HBIOS/ch376-native/source-doc/depends.d @@ -6,20 +6,23 @@ ./base-drv/enumerate_storage.c: base-drv/enumerate_storage.c ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ./base-drv/enumerate_hub.c: base-drv/enumerate_hub.c ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/work-area.h ./base-drv/usb-base-drv.c: base-drv/usb-base-drv.c ././source-doc/base-drv/usb-base-drv.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h -./base-drv/transfers.c: base-drv/transfers.c ././source-doc/base-drv/transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/z80.h ././source-doc/base-drv/print.h -./base-drv/print.c: base-drv/print.c ././source-doc/base-drv/print.h -./base-drv/ch376.c: base-drv/ch376.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/print.h -./base-drv/protocol.c: base-drv/protocol.c ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/print.h +./base-drv/transfers.c: base-drv/transfers.c ././source-doc/base-drv/transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/z80.h ././source-doc/base-drv/ez80-helpers.h ././source-doc/base-drv/print.h +./base-drv/ch376.c: base-drv/ch376.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/ez80-helpers.h ././source-doc/base-drv/print.h +./base-drv/protocol.c: base-drv/protocol.c ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/ez80-helpers.h ././source-doc/base-drv/print.h ./base-drv/work-area.c: base-drv/work-area.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ./base-drv/usb-init.c: base-drv/usb-init.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/print.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/z80.h ./ufi-drv/ufi-init.c: ufi-drv/ufi-init.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/usb_cbi.c: ufi-drv/usb_cbi.c ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/class_ufi.c: ufi-drv/class_ufi.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h +./keyboard/kyb-init.c: keyboard/kyb-init.c ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/keyboard/class_hid.h ././source-doc/keyboard/class_hid_keyboard.h +./keyboard/class_hid.c: keyboard/class_hid.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h ./scsi-drv/scsi-init.c: scsi-drv/scsi-init.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ./scsi-drv/class_scsi.c: scsi-drv/class_scsi.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ## -./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./print.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s +./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s ## ./scsi-drv.s: scsi-drv/./scsi-init.c.s scsi-drv/./class_scsi.c.s ## -./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s +./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s +## +./keyboard.s: keyboard/./kyb-init.c.s keyboard/./class_hid.c.s diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c new file mode 100644 index 00000000..b8ccd822 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c @@ -0,0 +1,46 @@ +#include "class_hid.h" +#include + +const setup_packet cmd_hid_set = {0x21, HID_SET_PROTOCOL, {0, 0}, {0, 0}, 0}; + +usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { + usb_error result; + setup_packet cmd; + cmd = cmd_hid_set; + + cmd.bRequest = HID_SET_PROTOCOL; + cmd.bValue[0] = protocol; + + result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); + + RETURN_CHECK(result); +} + +usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { + usb_error result; + setup_packet cmd; + cmd = cmd_hid_set; + + cmd.bRequest = HID_SET_IDLE; + cmd.bValue[0] = duration; + + result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); + + RETURN_CHECK(result); +} + +usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { + usb_error result; + setup_packet cmd; + cmd = cmd_hid_set; + + cmd.bmRequestType = 0xA1; + cmd.bValue[0] = 1; + cmd.bValue[1] = 1; + cmd.bRequest = HID_GET_REPORT; + cmd.wLength = 8; + + result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); + + RETURN_CHECK(result); +} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.h b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.h new file mode 100644 index 00000000..d3771b79 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.h @@ -0,0 +1,21 @@ +#ifndef __CLASS_HID_H__ +#define __CLASS_HID_H__ + +#include "ch376.h" +#include "protocol.h" + +#define HID_GET_REPORT 0x01 +#define HID_GET_IDLE 0x02 +#define HID_GET_PROTOCOL 0x03 +#define HID_SET_REPORT 0x09 +#define HID_SET_IDLE 0x0A +#define HID_SET_PROTOCOL 0x0B + +#define HID_BOOT_PROTOCOL 0x00 +#define HID_REPORT_PROTOCOL 0x01 + +extern usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1); +extern usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1); +extern usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h new file mode 100644 index 00000000..50efed90 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h @@ -0,0 +1,24 @@ +#ifndef __CLASS_HID_KEYBOARD_H__ +#define __CLASS_HID_KEYBOARD_H__ + +#include + +typedef struct { + uint8_t bModifierKeys; + uint8_t bReserved; + uint8_t keyCode[6]; +} keyboard_report; + +#define KEY_MOD_LCTRL 0x01 +#define KEY_MOD_LSHIFT 0x02 +#define KEY_MOD_LALT 0x04 +#define KEY_MOD_LMETA 0x08 +#define KEY_MOD_RCTRL 0x10 +#define KEY_MOD_RSHIFT 0x20 +#define KEY_MOD_RALT 0x40 +#define KEY_MOD_RMETA 0x80 + +extern char scancodes_table[128]; +extern char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c new file mode 100644 index 00000000..6b4bfa82 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -0,0 +1,54 @@ +#include "class_hid.h" +#include "class_hid_keyboard.h" +#include +#include +#include +#include + +void keyboard_init(void) { + + uint8_t index = 1; + do { + device_config_keyboard *const keyboard_config = (device_config_keyboard *)get_usb_device_config(index); + + if (keyboard_config == NULL) + break; + + const usb_device_type t = keyboard_config->type; + + if (t == USB_IS_KEYBOARD) { + print_string("\r\nUSB: KEYBOARD @ $"); + print_uint16(index); + print_string(" $"); + + // keyboard_config->drive_index = usb_device_count++; + hid_set_protocol(keyboard_config, 1); + hid_set_idle(keyboard_config, 0x80); + return; + } + } while (++index != MAX_NUMBER_OF_DEVICES + 1); + + print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +} + +// void drv_timi_keyboard(void) { +// _usb_state *const p = get_usb_work_area(); +// if (p->active) +// return; + +// p->active = true; + +// device_config_keyboard *const keyboard_config = (device_config_keyboard *)find_device_config(USB_IS_KEYBOARD); + +// keyboard_report report; + +// ch_configure_nak_retry_disable(); +// const usb_error result = usbdev_data_in_transfer_ep0((device_config *)keyboard_config, (uint8_t *)report, 8); +// ch_configure_nak_retry_3s(); +// if (result == 0) { +// const char c = scancode_to_char(report.bModifierKeys, report.keyCode[0]); +// key_put_into_buf(c); +// } + +// p->active = false; +// } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index 8128f4ca..37f951a4 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -21,11 +21,11 @@ void chscsi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_MASS_STORAGE) { - print_string("\r\n MASS STORAGE @ $"); + print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(" $"); - storage_device->drive_index = storage_count++; + // storage_device->drive_index = usb_device_count++; scsi_sense_init(storage_device); dio_add_entry(ch_scsi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index ec82dc90..00123530 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -20,11 +20,9 @@ void chufi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_FLOPPY) { - print_string("\r\n FLOPPY @ $"); + print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(" $"); - storage_device->drive_index = storage_count++; - // scsi_sense_init(storage_device); dio_add_entry(ch_ufi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 33bbebd2..13311dc6 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -56,7 +56,7 @@ _chufi_init: push ix ld ix,0 add ix,sp - push af + dec sp ;source-doc/ufi-drv/./ufi-init.c:14: do { ld (ix-1),0x01 l_chufi_init_00105: @@ -75,7 +75,7 @@ l_chufi_init_00105: ;source-doc/ufi-drv/./ufi-init.c:22: if (t == USB_IS_FLOPPY) { dec a jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/./ufi-init.c:23: print_string("\r\n FLOPPY @ $"); +;source-doc/ufi-drv/./ufi-init.c:23: print_string("\r\nUSB: FLOPPY @ $"); push de ld hl,ufi_init_str_0 call _print_string @@ -88,40 +88,29 @@ l_chufi_init_00105: ld hl,ufi_init_str_1 call _print_string pop de -;source-doc/ufi-drv/./ufi-init.c:26: storage_device->drive_index = storage_count++; - ld hl,0x0010 - add hl, de - ld c, l - ld b, h - ld hl,_storage_count - ld a, (hl) - ld (ix-2),a - inc (hl) - ld a,(ix-2) - ld (bc), a -;source-doc/ufi-drv/./ufi-init.c:28: dio_add_entry(ch_ufi_fntbl, storage_device); +;source-doc/ufi-drv/./ufi-init.c:26: dio_add_entry(ch_ufi_fntbl, storage_device); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/./ufi-init.c:31: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/./ufi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 l_chufi_init_00108: -;source-doc/ufi-drv/./ufi-init.c:32: } - ld sp, ix +;source-doc/ufi-drv/./ufi-init.c:30: } + inc sp pop ix ret ufi_init_str_0: DEFB 0x0d DEFB 0x0a - DEFM " FLOPPY @ $" + DEFM "USB: FLOPPY @ $" DEFB 0x00 ufi_init_str_1: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/./ufi-init.c:34: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/./ufi-init.c:32: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -132,7 +121,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:36: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/./ufi-init.c:34: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x24 @@ -140,7 +129,7 @@ l_chufi_get_cap_00112: ld (hl),0x00 inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/./ufi-init.c:38: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/./ufi-init.c:36: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -150,7 +139,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:42: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/./ufi-init.c:40: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -159,7 +148,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/./ufi-init.c:44: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/./ufi-init.c:42: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -169,7 +158,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:46: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/./ufi-init.c:44: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -180,27 +169,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/./ufi-init.c:47: if (result != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:45: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/./ufi-init.c:48: return 0; +;source-doc/ufi-drv/./ufi-init.c:46: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/./ufi-init.c:50: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/./ufi-init.c:48: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/./ufi-init.c:51: } +;source-doc/ufi-drv/./ufi-init.c:49: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./ufi-init.c:53: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/./ufi-init.c:51: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -211,7 +200,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:55: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/./ufi-init.c:53: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -227,18 +216,18 @@ _chufi_read: ld a, e or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/./ufi-init.c:56: return -1; // Not READY! +;source-doc/ufi-drv/./ufi-init.c:54: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/./ufi-init.c:61: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/./ufi-init.c:59: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/./ufi-init.c:63: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:61: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -271,11 +260,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/./ufi-init.c:64: return -1; // general error +;source-doc/ufi-drv/./ufi-init.c:62: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/./ufi-init.c:67: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/./ufi-init.c:65: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -285,7 +274,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/./ufi-init.c:69: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/./ufi-init.c:67: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -296,29 +285,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/./ufi-init.c:70: return -1; // error +;source-doc/ufi-drv/./ufi-init.c:68: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/./ufi-init.c:74: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/./ufi-init.c:72: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/./ufi-init.c:76: if (sense_key != 0) +;source-doc/ufi-drv/./ufi-init.c:74: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/./ufi-init.c:77: return -1; +;source-doc/ufi-drv/./ufi-init.c:75: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/./ufi-init.c:79: return USB_ERR_OK; +;source-doc/ufi-drv/./ufi-init.c:77: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/./ufi-init.c:80: } +;source-doc/ufi-drv/./ufi-init.c:78: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./ufi-init.c:82: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/./ufi-init.c:80: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -329,7 +318,7 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:84: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/./ufi-init.c:82: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -345,18 +334,18 @@ _chufi_write: ld a, e or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/./ufi-init.c:85: return -1; // Not READY! +;source-doc/ufi-drv/./ufi-init.c:83: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/./ufi-init.c:89: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/./ufi-init.c:87: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/./ufi-init.c:90: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { +;source-doc/ufi-drv/./ufi-init.c:88: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -389,11 +378,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/./ufi-init.c:91: return -1; +;source-doc/ufi-drv/./ufi-init.c:89: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/./ufi-init.c:95: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/./ufi-init.c:93: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -403,7 +392,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/./ufi-init.c:97: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/./ufi-init.c:95: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -414,25 +403,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/./ufi-init.c:98: return -1; +;source-doc/ufi-drv/./ufi-init.c:96: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/./ufi-init.c:103: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/./ufi-init.c:101: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/./ufi-init.c:105: if (sense_key != 0) +;source-doc/ufi-drv/./ufi-init.c:103: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/./ufi-init.c:106: return -1; +;source-doc/ufi-drv/./ufi-init.c:104: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/./ufi-init.c:108: return USB_ERR_OK; +;source-doc/ufi-drv/./ufi-init.c:106: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/./ufi-init.c:109: } +;source-doc/ufi-drv/./ufi-init.c:107: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm new file mode 100644 index 00000000..9111a045 --- /dev/null +++ b/Source/HBIOS/ch376kyb.asm @@ -0,0 +1,90 @@ +; +;================================================================================================== +; CH376 NATIVE USB KEYBOARD DRIVER +;================================================================================================== +; + +#DEFINE DEFM .DB +#DEFINE DEFB .DB +#DEFINE DEFW .DW + +#IF (SYSTIM == TM_NONE) + .ECHO "*** ERROR: MKY REQUIRES SYSTEM TIMER -- NONE CONFIGURED!!!\n" + !!! ; FORCE AN ASSEMBLY ERROR +#ENDIF + +#include "./ch376-native/keyboard.s" + + +CHUKB_INIT .EQU _keyboard_init + +; ### Function 0x4C -- Keyboard Status (VDAKST) +; +; Inputs: +; None +; +; Outputs: +; A: Status / Codes Pending +; +; Return a count of the number of key Codes Pending (A) in the keyboard buffer. +; If it is not possible to determine the actual number in the buffer, it is +; acceptable to return 1 to indicate there are key codes available to read and +; 0 if there are none available. +; The value returned in register A is used as both a Status (A) code and the +; return value. Negative values (bit 7 set) indicate a standard HBIOS result +; (error) code. Otherwise, the return value represents the number of key codes +; pending. +; +UKY_STAT: + XOR A + RET + +; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) +; +; Inputs: +; C: Video Unit +; +; Outputs: +; A: standard HBIOS result code +; +; Purged and all contents discarded. The Status (A) is a standard HBIOS result code. +; +UKY_FLUSH: + RET +; +; ### Function 0x4E -- Video Keyboard Read (VDAKRD) +; +; Inputs: +; None +; +; Outputs: +; A: Status +; C: Scancode +; D: Keystate +; E: Keycode +; +; Read the next key data from the keyboard. If a buffer is used, return the next key code in the buffer. +; If no key data is available, this function will wait indefinitely for a keypress. The Status (A) is a +; standard HBIOS result code. +; +; The Scancode (C) value is the raw scancode from the keyboard for the keypress. Scancodes are from +; the PS/2 scancode set 2 standard. +; +; The Keystate (D) is a bitmap representing the value of all modifier keys and shift states as they +; existed at the time of the keystroke. The bitmap is defined as: +; +; Bit Keystate Indication +; 7 Key pressed was from the num pad +; 6 Caps Lock was active +; 5 Num Lock was active +; 4 Scroll Lock was active +; 3 Windows key was held down +; 2 Alt key was held down +; 1 Control key was held down +; 0 Shift key was held down +; +; The Keycode (E) is generally returned as appropriate ASCII values, if possible. Special keys, like +; function keys and arrows, are returned as reserved codes as described at the start of this section. +; +UKY_READ: + RET diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 3c8c9031..2cee1798 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3979,6 +3979,11 @@ HB_PCINITTBLLEN .EQU (($ - HB_PCINITTBL) / 2) ; HB_INITTBL: ; +#IF (CHNATIVEENABLE) + ; NEED TO ENUMERATE USB DEVICES EARLY, SO THAT ACTUAL DRIVERS + ; WILL BE ABLE TO FIND THEM. + .DW CHNATIVE_INIT +#ENDIF #IF (KIOENABLE) .DW KIO_INIT #ENDIF @@ -4165,9 +4170,6 @@ HB_INITTBL: #IF (ESPENABLE) .DW ESP_INIT #ENDIF -#IF (CHNATIVEENABLE) - .DW CHNATIVE_INIT -#ENDIF #IF (CHSCSIENABLE) .DW CHSCSI_INIT #ENDIF @@ -9258,6 +9260,15 @@ SIZ_MKY .EQU $ - ORG_MKY MEMECHO " bytes.\n" #ENDIF ; +#IF (USBKYBENABLE) +ORG_UKY .EQU $ + #INCLUDE "ch376kyb.asm" +SIZ_UKY .EQU $ - ORG_UKY + MEMECHO "CH376 USB Keyboard occupies " + MEMECHO SIZ_UKY + MEMECHO " bytes.\n" +#ENDIF +; #IF (NABUKBENABLE) ORG_NABUKB .EQU $ #INCLUDE "nabukb.asm" diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index fe9b96df..9984c221 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -283,6 +283,7 @@ TMSMODE_MBC .EQU 6 ; MBC V9938/58 VIDEO BOARD TMSMODE_COLECO .EQU 7 ; COLECOVISION PORT MAPPING TMSMODE_DUO .EQU 8 ; DUODYNE PORT MAPPING TMSMODE_NABU .EQU 9 ; NABU +TMSMODE_MSXUKY .EQU 10 ; STD MSX PORTS + USB KEYBOARD ; ; CVDU VIDEO MODE SELECTIONS ; @@ -537,6 +538,7 @@ PPKENABLE .EQU FALSE ; PPK KEYBOARD DRIVER MKYENABLE .EQU FALSE ; MSX KEYBOARD DRIVER NABUKBENABLE .EQU FALSE ; NABU KEYBOARD DRIVER FVKBDENABLE .EQU FALSE ; FPGA KEYBOARD DRIVER +USBKYBENABLE .EQU TRUE ; USB KEYBOARD DRIVER ; ; VIDEO MODES ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 679bddf1..b31d063a 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -48,6 +48,7 @@ TMSKBD_KBD .EQU 1 TMSKBD_PPK .EQU 2 TMSKBD_MKY .EQU 3 TMSKBD_NABU .EQU 4 +TMSKBD_USB .EQU 5 ; TMSKBD .EQU TMSKBD_NONE ; ASSUME NONE ; @@ -93,6 +94,13 @@ TMSKBD .SET TMSKBD_MKY ; MSX KEYBOARD DEVECHO "MSXMKY" #ENDIF ; +#IF (TMSMODE == TMSMODE_MSXUKY) +TMS_DATREG .EQU $98 ; READ/WRITE DATA +TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL +TMSKBD .SET TMSKBD_USB ; MSX KEYBOARD + DEVECHO "MSX-USB_KYB" +#ENDIF +; #IF (TMSMODE == TMSMODE_MBC) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL @@ -183,6 +191,11 @@ NABUKBENABLE .SET TRUE ; INCLUDE NABU KEYBOARD SUPPORT DEVECHO "NABU" #ENDIF ; +#IF (TMSKBD == TMSKBD_USB) +USBKYBENABLE .SET TRUE ; INCLUDE USB KEYBOARD SUPPORT + DEVECHO "USB-KYB" +#ENDIF +; #IF (TMSTIMENABLE & (INTMODE > 0)) DEVECHO ", INTERRUPTS ENABLED" #ENDIF @@ -310,6 +323,9 @@ TMS_INIT1: #IF (TMSKBD == TMSKBD_NABU) CALL NABUKB_INIT ; INITIALIZE NABU KEYBOARD DRIVER #ENDIF +#IF (TMSKBD == TMSKBD_USB) + CALL CHUKB_INIT +#ENDIF #IF (TMSTIMENABLE & (INTMODE > 0)) ; @@ -393,6 +409,11 @@ TMS_FNTBL: .DW MKY_FLUSH .DW MKY_READ #ENDIF +#IF (TMSKBD == TMSKBD_USB) + .DW UKY_STAT + .DW UKY_FLUSH + .DW UKY_READ +#ENDIF #IF (TMSKBD == TMSKBD_NABU) .DW NABUKB_STAT .DW NABUKB_FLUSH @@ -1155,7 +1176,6 @@ TMS_TSTINT: RET TMS_INTHNDL: - CALL HB_TIMINT ; RETURN NZ - HANDLED OR $FF RET From 601ddee38b04238c64a675f365980f70f92a7cd4 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 20 Oct 2024 12:18:26 +1100 Subject: [PATCH 05/59] usb-keyboard: working (limited) --- .vscode/settings.json | 3 +- Source/HBIOS/ch376-native/Makefile | 9 +- Source/HBIOS/ch376-native/base-drv.s | 1 + Source/HBIOS/ch376-native/base-drv/ch376.c.s | 357 ++++++++---------- .../HBIOS/ch376-native/base-drv/class_hid.c.s | 254 ------------- .../{print.c.s => critical-section.c.s} | 55 +-- .../ch376-native/base-drv/dev_transfers.c.s | 285 +++++++------- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 285 +++++++------- .../ch376-native/base-drv/enumerate_hub.c.s | 110 +++--- .../HBIOS/ch376-native/base-drv/protocol.c.s | 172 +++++---- .../HBIOS/ch376-native/base-drv/transfers.c.s | 202 +++++----- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 10 +- Source/HBIOS/ch376-native/cruntime.asm | 122 +++--- Source/HBIOS/ch376-native/keyboard.s | 1 + .../HBIOS/ch376-native/keyboard/class_hid.c.s | 43 +-- .../keyboard/class_hid_keyboard.c.s | 343 +++++++++++++++++ .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 326 ++++++++++++++-- .../ch376-native/scsi-drv/class_scsi.c.s | 323 ++++++++-------- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 8 +- .../ch376-native/source-doc/base-drv/ch376.c | 27 +- .../ch376-native/source-doc/base-drv/ch376.h | 9 +- .../source-doc/base-drv/critical-section.c | 8 + .../source-doc/base-drv/critical-section.h | 13 + .../source-doc/base-drv/dev_transfers.c | 24 +- .../source-doc/base-drv/dev_transfers.h | 3 +- .../source-doc/base-drv/enumerate.c | 21 +- .../source-doc/base-drv/enumerate_hub.c | 2 + .../source-doc/base-drv/protocol.c | 17 +- .../source-doc/base-drv/transfers.c | 51 ++- .../ch376-native/source-doc/base-drv/z80.h | 11 - .../source-doc/convert-for-uz80as.sh | 3 +- .../HBIOS/ch376-native/source-doc/depends.d | 8 +- .../source-doc/keyboard/class_hid.c | 15 +- .../source-doc/keyboard/class_hid_keyboard.c | 343 +++++++++++++++++ .../source-doc/keyboard/kyb-init.c | 81 +++- .../source-doc/scsi-drv/class_scsi.c | 13 +- .../source-doc/scsi-drv/scsi-init.c | 1 - .../source-doc/ufi-drv/class_ufi.c | 18 +- .../ch376-native/source-doc/ufi-drv/usb_cbi.c | 21 +- .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 160 ++++---- Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 87 +++-- Source/HBIOS/ch376kyb.asm | 76 +++- Source/HBIOS/hbios.asm | 15 +- 43 files changed, 2397 insertions(+), 1539 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/base-drv/class_hid.c.s rename Source/HBIOS/ch376-native/base-drv/{print.c.s => critical-section.c.s} (63%) create mode 100644 Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.h create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c diff --git a/.vscode/settings.json b/.vscode/settings.json index 70be832d..e489b984 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,6 +17,7 @@ "class_scsi.h": "c", "z80.h": "c", "dev_transfers.h": "c", - "usb-base-drv.h": "c" + "usb-base-drv.h": "c", + "critical-section.h": "c" } } diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 27dd21f7..6cb8f757 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -22,8 +22,13 @@ all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s $(ASSDIR)keyboar clean: @rm -rf base-drv - @rm -rf scsi-drv - @rm -rf ufi-drv + rm -rf scsi-drv + rm -rf ufi-drv + rm -rf keyboard + rm ufi-drv.s + rm scsi-drv.s + rm base-drv.s + rm keyboard.s $(ASSDIR)base-drv.s: @echo "Creating base-drv.s" diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index 45005e37..cb623d53 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -1,5 +1,6 @@ ; Generated File -- not to be modify directly #include "ch376-native/base-drv/dev_transfers.c.s" +#include "ch376-native/base-drv/critical-section.c.s" #include "ch376-native/base-drv/enumerate.c.s" #include "ch376-native/base-drv/usb_state.c.s" #include "ch376-native/base-drv/class_hub.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 4ef2b7d7..8e731447 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -56,256 +56,232 @@ _result: ; --------------------------------- _ch_command: ;source-doc/base-drv/./ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) - ld h,0xff + ld c,0xff l_ch_command_00102: ld a, +((_CH376_COMMAND_PORT) / 256) in a, (((_CH376_COMMAND_PORT) & 0xFF)) bit 4, a jr Z,l_ch_command_00104 - dec h - jr Z,l_ch_command_00104 -;source-doc/base-drv/./ch376.c:11: delay(); - push hl - call _delay - pop hl - jr l_ch_command_00102 + dec c + jr NZ,l_ch_command_00102 l_ch_command_00104: -;source-doc/base-drv/./ch376.c:21: delay(); - push hl - call _delay - pop hl -;source-doc/base-drv/./ch376.c:22: CH376_COMMAND_PORT = command; +;source-doc/base-drv/./ch376.c:21: CH376_COMMAND_PORT = command; ld a, l ld bc,_CH376_COMMAND_PORT out (c),a -;source-doc/base-drv/./ch376.c:23: delay(); - call _delay -;source-doc/base-drv/./ch376.c:24: delay(); - call _delay -;source-doc/base-drv/./ch376.c:25: delay(); - call _delay -;source-doc/base-drv/./ch376.c:26: delay(); -;source-doc/base-drv/./ch376.c:27: } - jp _delay -;source-doc/base-drv/./ch376.c:31: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } +;source-doc/base-drv/./ch376.c:22: } + ret +;source-doc/base-drv/./ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } ; --------------------------------- ; Function ch_long_wait_int_and_get_status ; --------------------------------- _ch_long_wait_int_and_get_statu: ld hl,0x1388 jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:33: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } +;source-doc/base-drv/./ch376.c:28: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } ; --------------------------------- ; Function ch_short_wait_int_and_get_statu ; --------------------------------- _ch_short_wait_int_and_get_stat: ld hl,0x0064 jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:35: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } +;source-doc/base-drv/./ch376.c:30: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } ; --------------------------------- ; Function ch_very_short_wait_int_and_get_ ; --------------------------------- _ch_very_short_wait_int_and_get: ld hl,0x000a jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:37: usb_error ch_get_status(void) { +;source-doc/base-drv/./ch376.c:32: usb_error ch_get_status(void) { ; --------------------------------- ; Function ch_get_status ; --------------------------------- _ch_get_status: -;source-doc/base-drv/./ch376.c:38: ch_command(CH_CMD_GET_STATUS); +;source-doc/base-drv/./ch376.c:33: ch_command(CH_CMD_GET_STATUS); ld l,0x22 call _ch_command -;source-doc/base-drv/./ch376.c:39: delay(); - call _delay -;source-doc/base-drv/./ch376.c:40: delay(); - call _delay -;source-doc/base-drv/./ch376.c:41: delay(); - call _delay -;source-doc/base-drv/./ch376.c:42: delay(); - call _delay -;source-doc/base-drv/./ch376.c:43: uint8_t ch_status = CH376_DATA_PORT; +;source-doc/base-drv/./ch376.c:34: uint8_t ch_status = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/./ch376.c:45: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) +;source-doc/base-drv/./ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) ld l,a sub 0x41 jr C,l_ch_get_status_00102 ld a,0xb4 sub l -;source-doc/base-drv/./ch376.c:46: return ch_status; +;source-doc/base-drv/./ch376.c:37: return ch_status; jr NC,l_ch_get_status_00126 l_ch_get_status_00102: -;source-doc/base-drv/./ch376.c:48: if (ch_status == CH_CMD_RET_SUCCESS) +;source-doc/base-drv/./ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) ld a, l -;source-doc/base-drv/./ch376.c:49: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:40: return USB_ERR_OK; sub 0x51 jr NZ,l_ch_get_status_00105 ld l,a jr l_ch_get_status_00126 l_ch_get_status_00105: -;source-doc/base-drv/./ch376.c:51: if (ch_status == CH_USB_INT_SUCCESS) +;source-doc/base-drv/./ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) ld a, l -;source-doc/base-drv/./ch376.c:52: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:43: return USB_ERR_OK; sub 0x14 jr NZ,l_ch_get_status_00107 ld l,a jr l_ch_get_status_00126 l_ch_get_status_00107: -;source-doc/base-drv/./ch376.c:54: if (ch_status == CH_USB_INT_CONNECT) +;source-doc/base-drv/./ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) ld a, l sub 0x15 jr NZ,l_ch_get_status_00109 -;source-doc/base-drv/./ch376.c:55: return USB_INT_CONNECT; +;source-doc/base-drv/./ch376.c:46: return USB_INT_CONNECT; ld l,0x81 jr l_ch_get_status_00126 l_ch_get_status_00109: -;source-doc/base-drv/./ch376.c:57: if (ch_status == CH_USB_INT_DISK_READ) +;source-doc/base-drv/./ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) ld a, l sub 0x1d jr NZ,l_ch_get_status_00111 -;source-doc/base-drv/./ch376.c:58: return USB_ERR_DISK_READ; +;source-doc/base-drv/./ch376.c:49: return USB_ERR_DISK_READ; ld l,0x1d jr l_ch_get_status_00126 l_ch_get_status_00111: -;source-doc/base-drv/./ch376.c:60: if (ch_status == CH_USB_INT_DISK_WRITE) +;source-doc/base-drv/./ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) ld a, l sub 0x1e jr NZ,l_ch_get_status_00113 -;source-doc/base-drv/./ch376.c:61: return USB_ERR_DISK_WRITE; +;source-doc/base-drv/./ch376.c:52: return USB_ERR_DISK_WRITE; ld l,0x1e jr l_ch_get_status_00126 l_ch_get_status_00113: -;source-doc/base-drv/./ch376.c:63: if (ch_status == CH_USB_INT_DISCONNECT) { +;source-doc/base-drv/./ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { ld a, l sub 0x16 jr NZ,l_ch_get_status_00115 -;source-doc/base-drv/./ch376.c:64: ch_cmd_set_usb_mode(5); +;source-doc/base-drv/./ch376.c:55: ch_cmd_set_usb_mode(5); ld l,0x05 call _ch_cmd_set_usb_mode -;source-doc/base-drv/./ch376.c:65: return USB_ERR_NO_DEVICE; +;source-doc/base-drv/./ch376.c:56: return USB_ERR_NO_DEVICE; ld l,0x05 jr l_ch_get_status_00126 l_ch_get_status_00115: -;source-doc/base-drv/./ch376.c:68: if (ch_status == CH_USB_INT_BUF_OVER) +;source-doc/base-drv/./ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) ld a, l sub 0x17 jr NZ,l_ch_get_status_00117 -;source-doc/base-drv/./ch376.c:69: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/./ch376.c:60: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_get_status_00126 l_ch_get_status_00117: -;source-doc/base-drv/./ch376.c:71: ch_status &= 0x2F; +;source-doc/base-drv/./ch376.c:62: ch_status &= 0x2F; ld a, l and 0x2f -;source-doc/base-drv/./ch376.c:73: if (ch_status == 0x2A) +;source-doc/base-drv/./ch376.c:64: if (ch_status == 0x2A) cp 0x2a jr NZ,l_ch_get_status_00119 -;source-doc/base-drv/./ch376.c:74: return USB_ERR_NAK; +;source-doc/base-drv/./ch376.c:65: return USB_ERR_NAK; ld l,0x01 jr l_ch_get_status_00126 l_ch_get_status_00119: -;source-doc/base-drv/./ch376.c:76: if (ch_status == 0x2E) +;source-doc/base-drv/./ch376.c:67: if (ch_status == 0x2E) cp 0x2e jr NZ,l_ch_get_status_00121 -;source-doc/base-drv/./ch376.c:77: return USB_ERR_STALL; +;source-doc/base-drv/./ch376.c:68: return USB_ERR_STALL; ld l,0x02 jr l_ch_get_status_00126 l_ch_get_status_00121: -;source-doc/base-drv/./ch376.c:79: ch_status &= 0x23; +;source-doc/base-drv/./ch376.c:70: ch_status &= 0x23; and 0x23 -;source-doc/base-drv/./ch376.c:81: if (ch_status == 0x20) +;source-doc/base-drv/./ch376.c:72: if (ch_status == 0x20) cp 0x20 jr NZ,l_ch_get_status_00123 -;source-doc/base-drv/./ch376.c:82: return USB_ERR_TIMEOUT; +;source-doc/base-drv/./ch376.c:73: return USB_ERR_TIMEOUT; ld l,0x03 jr l_ch_get_status_00126 l_ch_get_status_00123: -;source-doc/base-drv/./ch376.c:84: if (ch_status == 0x23) +;source-doc/base-drv/./ch376.c:75: if (ch_status == 0x23) sub 0x23 jr NZ,l_ch_get_status_00125 -;source-doc/base-drv/./ch376.c:85: return USB_TOKEN_OUT_OF_SYNC; +;source-doc/base-drv/./ch376.c:76: return USB_TOKEN_OUT_OF_SYNC; ld l,0x07 jr l_ch_get_status_00126 l_ch_get_status_00125: -;source-doc/base-drv/./ch376.c:87: return USB_ERR_UNEXPECTED_STATUS_FROM_; +;source-doc/base-drv/./ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_; ld l,0x08 l_ch_get_status_00126: -;source-doc/base-drv/./ch376.c:88: } +;source-doc/base-drv/./ch376.c:79: } ret -;source-doc/base-drv/./ch376.c:90: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } +;source-doc/base-drv/./ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } ; --------------------------------- ; Function ch_cmd_reset_all ; --------------------------------- _ch_cmd_reset_all: ld l,0x05 jp _ch_command -;source-doc/base-drv/./ch376.c:109: uint8_t ch_probe(void) { +;source-doc/base-drv/./ch376.c:100: uint8_t ch_probe(void) { ; --------------------------------- ; Function ch_probe ; --------------------------------- _ch_probe: -;source-doc/base-drv/./ch376.c:111: do { +;source-doc/base-drv/./ch376.c:102: do { ld c,0x05 l_ch_probe_00103: -;source-doc/base-drv/./ch376.c:94: ch_command(CH_CMD_CHECK_EXIST); +;source-doc/base-drv/./ch376.c:85: ch_command(CH_CMD_CHECK_EXIST); push bc ld l,0x06 call _ch_command pop bc -;source-doc/base-drv/./ch376.c:95: CH376_DATA_PORT = (uint8_t)~0x55; +;source-doc/base-drv/./ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; ld a,0xaa push bc ld bc,_CH376_DATA_PORT out (c),a call _delay pop bc -;source-doc/base-drv/./ch376.c:97: complement = CH376_DATA_PORT; +;source-doc/base-drv/./ch376.c:88: complement = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/./ch376.c:98: return complement == 0x55; +;source-doc/base-drv/./ch376.c:89: return complement == 0x55; sub 0x55 jr NZ,l_ch_probe_00102 -;source-doc/base-drv/./ch376.c:112: if (ch_cmd_check_exist()) -;source-doc/base-drv/./ch376.c:113: return true; +;source-doc/base-drv/./ch376.c:103: if (ch_cmd_check_exist()) +;source-doc/base-drv/./ch376.c:104: return true; ld l,0x01 jr l_ch_probe_00107 l_ch_probe_00102: -;source-doc/base-drv/./ch376.c:115: delay_medium(); +;source-doc/base-drv/./ch376.c:106: delay_medium(); push bc call _delay_medium pop bc -;source-doc/base-drv/./ch376.c:116: } while (--i != 0); +;source-doc/base-drv/./ch376.c:107: } while (--i != 0); dec c jr NZ,l_ch_probe_00103 -;source-doc/base-drv/./ch376.c:118: return false; +;source-doc/base-drv/./ch376.c:109: return false; ld l,0x00 l_ch_probe_00107: -;source-doc/base-drv/./ch376.c:119: } +;source-doc/base-drv/./ch376.c:110: } ret -;source-doc/base-drv/./ch376.c:121: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { ; --------------------------------- ; Function ch_cmd_set_usb_mode ; --------------------------------- _ch_cmd_set_usb_mode: ld c, l -;source-doc/base-drv/./ch376.c:122: uint8_t result = 0; +;source-doc/base-drv/./ch376.c:113: uint8_t result = 0; ld b,0x00 -;source-doc/base-drv/./ch376.c:124: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; +;source-doc/base-drv/./ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; ld a,0x15 push bc ld bc,_CH376_COMMAND_PORT out (c),a call _delay pop bc -;source-doc/base-drv/./ch376.c:126: CH376_DATA_PORT = mode; +;source-doc/base-drv/./ch376.c:117: CH376_DATA_PORT = mode; ld a, c push bc ld bc,_CH376_DATA_PORT out (c),a call _delay pop bc -;source-doc/base-drv/./ch376.c:131: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { +;source-doc/base-drv/./ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { ld c,0x7f l_ch_cmd_set_usb_mode_00103: ld a, b @@ -324,17 +300,17 @@ l_ch_cmd_set_usb_mode_00147: jr Z,l_ch_cmd_set_usb_mode_00105 dec c jr Z,l_ch_cmd_set_usb_mode_00105 -;source-doc/base-drv/./ch376.c:132: result = CH376_DATA_PORT; +;source-doc/base-drv/./ch376.c:123: result = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) ld b, a -;source-doc/base-drv/./ch376.c:133: delay(); +;source-doc/base-drv/./ch376.c:124: delay(); push bc call _delay pop bc jr l_ch_cmd_set_usb_mode_00103 l_ch_cmd_set_usb_mode_00105: -;source-doc/base-drv/./ch376.c:136: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; +;source-doc/base-drv/./ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; ld a, e or a jr Z,l_ch_cmd_set_usb_mode_00108 @@ -343,24 +319,24 @@ l_ch_cmd_set_usb_mode_00105: l_ch_cmd_set_usb_mode_00108: ld l,0x0e l_ch_cmd_set_usb_mode_00109: -;source-doc/base-drv/./ch376.c:137: } +;source-doc/base-drv/./ch376.c:128: } ret -;source-doc/base-drv/./ch376.c:139: uint8_t ch_cmd_get_ic_version(void) { +;source-doc/base-drv/./ch376.c:130: uint8_t ch_cmd_get_ic_version(void) { ; --------------------------------- ; Function ch_cmd_get_ic_version ; --------------------------------- _ch_cmd_get_ic_version: -;source-doc/base-drv/./ch376.c:140: ch_command(CH_CMD_GET_IC_VER); +;source-doc/base-drv/./ch376.c:131: ch_command(CH_CMD_GET_IC_VER); ld l,0x01 call _ch_command -;source-doc/base-drv/./ch376.c:141: return CH376_DATA_PORT & 0x1f; +;source-doc/base-drv/./ch376.c:132: return CH376_DATA_PORT & 0x1f; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) and 0x1f ld l, a -;source-doc/base-drv/./ch376.c:142: } +;source-doc/base-drv/./ch376.c:133: } ret -;source-doc/base-drv/./ch376.c:144: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { +;source-doc/base-drv/./ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { ; --------------------------------- ; Function ch_issue_token ; --------------------------------- @@ -368,22 +344,14 @@ _ch_issue_token: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./ch376.c:145: ch_command(CH_CMD_ISSUE_TKN_X); +;source-doc/base-drv/./ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X); ld l,0x4e call _ch_command -;source-doc/base-drv/./ch376.c:146: delay(); - call _delay -;source-doc/base-drv/./ch376.c:147: delay(); - call _delay -;source-doc/base-drv/./ch376.c:148: CH376_DATA_PORT = toggle_bit; +;source-doc/base-drv/./ch376.c:137: CH376_DATA_PORT = toggle_bit; ld a,(ix+4) ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:149: delay(); - call _delay -;source-doc/base-drv/./ch376.c:150: delay(); - call _delay -;source-doc/base-drv/./ch376.c:151: CH376_DATA_PORT = endpoint << 4 | pid; +;source-doc/base-drv/./ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; ld a,(ix+5) add a, a add a, a @@ -392,19 +360,16 @@ _ch_issue_token: or (ix+6) ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:152: delay(); - call _delay -;source-doc/base-drv/./ch376.c:153: delay(); -;source-doc/base-drv/./ch376.c:154: } +;source-doc/base-drv/./ch376.c:139: } pop ix - jp _delay -;source-doc/base-drv/./ch376.c:156: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { + ret +;source-doc/base-drv/./ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_in ; --------------------------------- _ch_issue_token_in: ex de, hl -;source-doc/base-drv/./ch376.c:157: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); +;source-doc/base-drv/./ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); ld l, e ld h, d ld a, (hl) @@ -430,15 +395,15 @@ l_ch_issue_token_in_00104: call _ch_issue_token pop af inc sp -;source-doc/base-drv/./ch376.c:158: } +;source-doc/base-drv/./ch376.c:143: } ret -;source-doc/base-drv/./ch376.c:160: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_out ; --------------------------------- _ch_issue_token_out: ex de, hl -;source-doc/base-drv/./ch376.c:161: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); +;source-doc/base-drv/./ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); ld l, e ld h, d ld a, (hl) @@ -464,9 +429,9 @@ l_ch_issue_token_out_00104: call _ch_issue_token pop af inc sp -;source-doc/base-drv/./ch376.c:162: } +;source-doc/base-drv/./ch376.c:147: } ret -;source-doc/base-drv/./ch376.c:164: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } +;source-doc/base-drv/./ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } ; --------------------------------- ; Function ch_issue_token_out_ep0 ; --------------------------------- @@ -482,7 +447,7 @@ _ch_issue_token_out_ep0: pop af inc sp ret -;source-doc/base-drv/./ch376.c:166: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } +;source-doc/base-drv/./ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } ; --------------------------------- ; Function ch_issue_token_in_ep0 ; --------------------------------- @@ -498,7 +463,7 @@ _ch_issue_token_in_ep0: pop af inc sp ret -;source-doc/base-drv/./ch376.c:168: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } +;source-doc/base-drv/./ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } ; --------------------------------- ; Function ch_issue_token_setup ; --------------------------------- @@ -516,7 +481,7 @@ _ch_issue_token_setup: pop af inc sp ret -;source-doc/base-drv/./ch376.c:170: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/./ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer ; --------------------------------- @@ -525,38 +490,39 @@ _ch_data_in_transfer: ld ix,0 add ix,sp push af -;source-doc/base-drv/./ch376.c:174: if (buffer_size == 0) +;source-doc/base-drv/./ch376.c:158: if (buffer_size == 0) ld a,(ix+7) or (ix+6) jr NZ,l_ch_data_in_transfer_00102 -;source-doc/base-drv/./ch376.c:175: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:159: return USB_ERR_OK; ld l,0x00 - jp l_ch_data_in_transfer_00110 + jp l_ch_data_in_transfer_00111 l_ch_data_in_transfer_00102: -;source-doc/base-drv/./ch376.c:177: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/./ch376.c:161: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:178: do { +;source-doc/base-drv/./ch376.c:162: do { ld c,(ix+8) ld b,(ix+9) inc sp inc sp push bc l_ch_data_in_transfer_00107: -;source-doc/base-drv/./ch376.c:179: ch_issue_token_in(endpoint); +;source-doc/base-drv/./ch376.c:163: ch_issue_token_in(endpoint); push bc ld l, c ld h, b call _ch_issue_token_in call _ch_long_wait_int_and_get_statu - ld a, l pop bc - ld l, a -;source-doc/base-drv/./ch376.c:182: CHECK(result); + ld a, l + ld (_result), a +;source-doc/base-drv/./ch376.c:166: CHECK(result); + ld a,(_result) or a jr NZ,l_ch_data_in_transfer_00110 -;source-doc/base-drv/./ch376.c:184: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/./ch376.c:168: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b pop hl @@ -570,32 +536,32 @@ l_ch_data_in_transfer_00107: and 0xfe or l ld (de), a -;source-doc/base-drv/./ch376.c:186: count = ch_read_data(buffer); +;source-doc/base-drv/./ch376.c:170: count = ch_read_data(buffer); push bc ld l,(ix+4) ld h,(ix+5) call _ch_read_data ld e, a pop bc -;source-doc/base-drv/./ch376.c:188: if (count == 0) { +;source-doc/base-drv/./ch376.c:172: if (count == 0) { ld a, e -;source-doc/base-drv/./ch376.c:189: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:173: USB_MODULE_LEDS = 0x00; or a jr NZ,l_ch_data_in_transfer_00106 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:190: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/./ch376.c:174: return USB_ERR_DATA_ERROR; ld l,0x04 - jr l_ch_data_in_transfer_00110 + jr l_ch_data_in_transfer_00111 l_ch_data_in_transfer_00106: -;source-doc/base-drv/./ch376.c:193: buffer += count; +;source-doc/base-drv/./ch376.c:177: buffer += count; ld a,(ix+4) add a, e ld (ix+4),a - jr NC,l_ch_data_in_transfer_00147 + jr NC,l_ch_data_in_transfer_00148 inc (ix+5) -l_ch_data_in_transfer_00147: -;source-doc/base-drv/./ch376.c:194: buffer_size -= count; +l_ch_data_in_transfer_00148: +;source-doc/base-drv/./ch376.c:178: buffer_size -= count; ld d,0x00 ld a,(ix+6) sub e @@ -603,26 +569,32 @@ l_ch_data_in_transfer_00147: ld a,(ix+7) sbc a, d ld (ix+7),a -;source-doc/base-drv/./ch376.c:195: } while (buffer_size > 0); +;source-doc/base-drv/./ch376.c:179: } while (buffer_size > 0); xor a cp (ix+6) sbc a,(ix+7) - jp PO, l_ch_data_in_transfer_00148 + jp PO, l_ch_data_in_transfer_00149 xor 0x80 -l_ch_data_in_transfer_00148: +l_ch_data_in_transfer_00149: jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/./ch376.c:197: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:181: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:199: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:183: return USB_ERR_OK; ld l,0x00 + jr l_ch_data_in_transfer_00111 +;source-doc/base-drv/./ch376.c:184: done: l_ch_data_in_transfer_00110: -;source-doc/base-drv/./ch376.c:200: } +;source-doc/base-drv/./ch376.c:185: return result; + ld hl,_result + ld l, (hl) +l_ch_data_in_transfer_00111: +;source-doc/base-drv/./ch376.c:186: } ld sp, ix pop ix ret -;source-doc/base-drv/./ch376.c:202: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/./ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- @@ -630,20 +602,21 @@ _ch_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./ch376.c:206: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/./ch376.c:192: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:208: ch_issue_token_in(endpoint); +;source-doc/base-drv/./ch376.c:194: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in -;source-doc/base-drv/./ch376.c:210: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/./ch376.c:196: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu - ld a,l + ld a, l + ld b,a or a jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/./ch376.c:212: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/./ch376.c:198: endpoint->toggle = !endpoint->toggle; ld e,(ix+8) ld d,(ix+9) ld c, e @@ -658,25 +631,30 @@ _ch_data_in_transfer_n: and 0xfe or e ld (bc), a -;source-doc/base-drv/./ch376.c:214: count = ch_read_data(buffer); +;source-doc/base-drv/./ch376.c:200: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) call _ch_read_data -;source-doc/base-drv/./ch376.c:216: *buffer_size = count; +;source-doc/base-drv/./ch376.c:202: *buffer_size = count; ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/./ch376.c:218: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:204: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:220: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:206: return USB_ERR_OK; ld l,0x00 + jr l_ch_data_in_transfer_n_00104 +;source-doc/base-drv/./ch376.c:207: done: l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/./ch376.c:221: } +;source-doc/base-drv/./ch376.c:208: return result; + ld l, b +l_ch_data_in_transfer_n_00104: +;source-doc/base-drv/./ch376.c:209: } pop ix ret -;source-doc/base-drv/./ch376.c:223: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +;source-doc/base-drv/./ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_out_transfer ; --------------------------------- @@ -686,7 +664,7 @@ _ch_data_out_transfer: add ix,sp push af dec sp -;source-doc/base-drv/./ch376.c:226: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); +;source-doc/base-drv/./ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) ld b,(ix+9) ld e, c @@ -694,44 +672,42 @@ _ch_data_out_transfer: inc de ld a, (de) ld (ix-3),a -;source-doc/base-drv/./ch376.c:228: USB_MODULE_LEDS = 0x02; +;source-doc/base-drv/./ch376.c:216: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS out (c),a pop bc -;source-doc/base-drv/./ch376.c:230: while (buffer_length > 0) { +;source-doc/base-drv/./ch376.c:218: while (buffer_length > 0) { ld (ix-2),c ld (ix-1),b l_ch_data_out_transfer_00103: xor a cp (ix+6) sbc a,(ix+7) - jp PO, l_ch_data_out_transfer_00138 + jp PO, l_ch_data_out_transfer_00139 xor 0x80 -l_ch_data_out_transfer_00138: +l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/./ch376.c:231: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; - ld e,(ix-3) - ld d,0x00 - ld a, e - sub (ix+6) +;source-doc/base-drv/./ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; + ld d,(ix-3) + ld e,0x00 ld a, d + sub (ix+6) + ld a, e sbc a,(ix+7) - jp PO, l_ch_data_out_transfer_00139 + jp PO, l_ch_data_out_transfer_00140 xor 0x80 -l_ch_data_out_transfer_00139: - jp P, l_ch_data_out_transfer_00108 - jr l_ch_data_out_transfer_00109 -l_ch_data_out_transfer_00108: - ld e,(ix+6) - ld d,(ix+7) +l_ch_data_out_transfer_00140: + jp P, l_ch_data_out_transfer_00109 + jr l_ch_data_out_transfer_00110 l_ch_data_out_transfer_00109: -;source-doc/base-drv/./ch376.c:232: buffer = ch_write_data(buffer, size); + ld d,(ix+6) +l_ch_data_out_transfer_00110: +;source-doc/base-drv/./ch376.c:220: buffer = ch_write_data(buffer, size); push bc push de - ld a, e - push af + push de inc sp ld l,(ix+4) ld h,(ix+5) @@ -743,15 +719,15 @@ l_ch_data_out_transfer_00109: pop bc ld (ix+4),l ld (ix+5),h -;source-doc/base-drv/./ch376.c:233: buffer_length -= size; - ld d,0x00 +;source-doc/base-drv/./ch376.c:221: buffer_length -= size; + ld e,0x00 ld a,(ix+6) - sub e + sub d ld (ix+6),a ld a,(ix+7) - sbc a, d + sbc a, e ld (ix+7),a -;source-doc/base-drv/./ch376.c:234: ch_issue_token_out(endpoint); +;source-doc/base-drv/./ch376.c:222: ch_issue_token_out(endpoint); push bc ld l, c ld h, b @@ -762,7 +738,7 @@ l_ch_data_out_transfer_00109: ld l, a or a jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/./ch376.c:238: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/./ch376.c:226: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l,(ix-2) @@ -778,33 +754,34 @@ l_ch_data_out_transfer_00109: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/./ch376.c:241: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/./ch376.c:229: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:243: return USB_ERR_OK; +;source-doc/base-drv/./ch376.c:231: return USB_ERR_OK; ld l,0x00 +;source-doc/base-drv/./ch376.c:232: done: +;source-doc/base-drv/./ch376.c:233: return result; l_ch_data_out_transfer_00106: -;source-doc/base-drv/./ch376.c:244: } +;source-doc/base-drv/./ch376.c:234: } ld sp, ix pop ix ret -;source-doc/base-drv/./ch376.c:246: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/./ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function ch_set_usb_address ; --------------------------------- _ch_set_usb_address: -;source-doc/base-drv/./ch376.c:247: ch_command(CH_CMD_SET_USB_ADDR); +;source-doc/base-drv/./ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR); push hl ld l,0x13 call _ch_command pop hl -;source-doc/base-drv/./ch376.c:248: CH376_DATA_PORT = device_address; +;source-doc/base-drv/./ch376.c:238: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:249: delay(); -;source-doc/base-drv/./ch376.c:250: } - jp _delay +;source-doc/base-drv/./ch376.c:239: } + ret _result: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/class_hid.c.s b/Source/HBIOS/ch376-native/base-drv/class_hid.c.s deleted file mode 100644 index 6d750eec..00000000 --- a/Source/HBIOS/ch376-native/base-drv/class_hid.c.s +++ /dev/null @@ -1,254 +0,0 @@ -; -; Generated from source-doc/base-drv/./class_hid.c.asm -- not to be modify directly -; -; -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -#IF 0 - -; .area _INITIALIZED removed by z88dk - - -#ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- -;-------------------------------------------------------- -; code -;-------------------------------------------------------- -;source-doc/base-drv/./class_hid.c:6: usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { -; --------------------------------- -; Function hid_set_protocol -; --------------------------------- -_hid_set_protocol: - push ix - ld ix,0 - add ix,sp - push af - push af - push af - push af - ex de, hl -;source-doc/base-drv/./class_hid.c:9: cmd = cmd_hid_set; - push de - ex de, hl - ld hl,2 - add hl, sp - ex de, hl - ld hl,_cmd_hid_set - ld bc,0x0008 - ldir - pop de -;source-doc/base-drv/./class_hid.c:11: cmd.bRequest = HID_SET_PROTOCOL; - ld (ix-7),0x0b -;source-doc/base-drv/./class_hid.c:12: cmd.bValue[0] = protocol; - ld a,(ix+4) - ld (ix-6),a -;source-doc/base-drv/./class_hid.c:14: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); - ld l, e - ld h, d - inc hl - ld c, (hl) - ex de, hl - ld a, (hl) - rlca - rlca - rlca - rlca - and 0x0f - ld h, c - push hl - inc sp - push af - inc sp - ld hl,0x0000 - push hl - ld hl,4 - add hl, sp - push hl - call _usb_control_transfer - pop af - pop af - pop af - ld a, l -;source-doc/base-drv/./class_hid.c:16: RETURN_CHECK(result); -;source-doc/base-drv/./class_hid.c:17: } - ld sp, ix - pop ix - pop hl - inc sp - jp (hl) -_cmd_hid_set: - DEFB +0x21 - DEFB +0x0b - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFW +0x0000 -;source-doc/base-drv/./class_hid.c:19: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { -; --------------------------------- -; Function hid_set_idle -; --------------------------------- -_hid_set_idle: - push ix - ld ix,0 - add ix,sp - push af - push af - push af - push af - ex de, hl -;source-doc/base-drv/./class_hid.c:22: cmd = cmd_hid_set; - push de - ex de, hl - ld hl,2 - add hl, sp - ex de, hl - ld hl,_cmd_hid_set - ld bc,0x0008 - ldir - pop de -;source-doc/base-drv/./class_hid.c:24: cmd.bRequest = HID_SET_IDLE; - ld (ix-7),0x0a -;source-doc/base-drv/./class_hid.c:25: cmd.bValue[0] = duration; - ld a,(ix+4) - ld (ix-6),a -;source-doc/base-drv/./class_hid.c:27: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); - ld l, e - ld h, d - inc hl - ld c, (hl) - ex de, hl - ld a, (hl) - rlca - rlca - rlca - rlca - and 0x0f - ld h, c - push hl - inc sp - push af - inc sp - ld hl,0x0000 - push hl - ld hl,4 - add hl, sp - push hl - call _usb_control_transfer - pop af - pop af - pop af - ld a, l -;source-doc/base-drv/./class_hid.c:29: RETURN_CHECK(result); -;source-doc/base-drv/./class_hid.c:30: } - ld sp, ix - pop ix - pop hl - inc sp - jp (hl) -;source-doc/base-drv/./class_hid.c:32: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { -; --------------------------------- -; Function hid_get_input_report -; --------------------------------- -_hid_get_input_report: - push ix - ld ix,0 - add ix,sp - ld c, l - ld b, h - ld hl, -9 - add hl, sp - ld sp, hl - ld l, c - ld h, b -;source-doc/base-drv/./class_hid.c:35: cmd = cmd_hid_set; - push de - push hl - ex de, hl - ld hl,4 - add hl, sp - ex de, hl - ld hl,_cmd_hid_set - ld bc,0x0008 - ldir - pop bc - pop de -;source-doc/base-drv/./class_hid.c:37: cmd.bmRequestType = 0xA1; - ld (ix-9),0xa1 -;source-doc/base-drv/./class_hid.c:38: cmd.bValue[0] = 1; - ld (ix-7),0x01 -;source-doc/base-drv/./class_hid.c:39: cmd.bValue[1] = 1; - ld (ix-6),0x01 -;source-doc/base-drv/./class_hid.c:40: cmd.bRequest = HID_GET_REPORT; - ld (ix-8),0x01 -;source-doc/base-drv/./class_hid.c:41: cmd.wLength = 8; - ld (ix-3),0x08 - xor a - ld (ix-2),a -;source-doc/base-drv/./class_hid.c:43: result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); - ld l, c - ld h, b - inc hl - ld a, (hl) - ld (ix-1),a - ld l, c - ld h, b - ld a, (hl) - rlca - rlca - rlca - rlca - and 0x0f - ld h,(ix-1) - push hl - inc sp - push af - inc sp - push de - ld hl,4 - add hl, sp - push hl - call _usb_control_transfer - pop af - pop af - pop af - ld a, l -;source-doc/base-drv/./class_hid.c:45: RETURN_CHECK(result); -;source-doc/base-drv/./class_hid.c:46: } - ld sp, ix - pop ix - ret diff --git a/Source/HBIOS/ch376-native/base-drv/print.c.s b/Source/HBIOS/ch376-native/base-drv/critical-section.c.s similarity index 63% rename from Source/HBIOS/ch376-native/base-drv/print.c.s rename to Source/HBIOS/ch376-native/base-drv/critical-section.c.s index 12d60c89..97ea4e02 100644 --- a/Source/HBIOS/ch376-native/base-drv/print.c.s +++ b/Source/HBIOS/ch376-native/base-drv/critical-section.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./print.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/./critical-section.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -30,6 +30,8 @@ ; .area _INITIALIZED removed by z88dk +_in_critical_usb_section: + DEFS 1 #ENDIF @@ -45,42 +47,21 @@ ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./print.c:3: void print_device_mounted(const char *const description, const uint8_t count) { +;source-doc/base-drv/./critical-section.c:6: void critical_begin() { in_critical_usb_section++; } ; --------------------------------- -; Function print_device_mounted +; Function critical_begin ; --------------------------------- -_print_device_mounted: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/./print.c:4: print_string("\r\n $"); - ld hl,print_str_0 - call _print_string -;source-doc/base-drv/./print.c:5: print_uint16(count); - ld e,(ix+6) - ld d,0x00 - ex de, hl - call _print_uint16 -;source-doc/base-drv/./print.c:6: print_string(description); - ld l,(ix+4) - ld h,(ix+5) - call _print_string -;source-doc/base-drv/./print.c:7: if (count > 1) - ld a,0x01 - sub (ix+6) - jr NC,l_print_device_mounted_00103 -;source-doc/base-drv/./print.c:8: print_string("S$"); - ld hl,print_str_1 - call _print_string -l_print_device_mounted_00103: -;source-doc/base-drv/./print.c:9: } - pop ix +_critical_begin: + ld hl,_in_critical_usb_section + inc (hl) ret -print_str_0: - DEFB 0x0d - DEFB 0x0a - DEFM " $" - DEFB 0x00 -print_str_1: - DEFM "S$" - DEFB 0x00 +;source-doc/base-drv/./critical-section.c:8: void critical_end() { in_critical_usb_section--; } +; --------------------------------- +; Function critical_end +; --------------------------------- +_critical_end: + ld hl,_in_critical_usb_section + dec (hl) + ret +_in_critical_usb_section: + DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 962ed8e1..2412ace0 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./dev_transfers.c:28: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { +;source-doc/base-drv/./dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { ; --------------------------------- ; Function usbdev_control_transfer ; --------------------------------- @@ -56,7 +56,7 @@ _usbdev_control_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./dev_transfers.c:29: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); +;source-doc/base-drv/./dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); ld e,(ix+4) ld d,(ix+5) ld l, e @@ -84,10 +84,10 @@ _usbdev_control_transfer: pop af pop af pop af -;source-doc/base-drv/./dev_transfers.c:30: } +;source-doc/base-drv/./dev_transfers.c:33: } pop ix ret -;source-doc/base-drv/./dev_transfers.c:32: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { +;source-doc/base-drv/./dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { ; --------------------------------- ; Function usbdev_blk_out_trnsfer ; --------------------------------- @@ -96,22 +96,27 @@ _usbdev_blk_out_trnsfer: ld ix,0 add ix,sp push af -;source-doc/base-drv/./dev_transfers.c:36: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; - ld c,(ix+4) - ld b,(ix+5) - ld hl,0x0003 - add hl, bc - ex (sp), hl -;source-doc/base-drv/./dev_transfers.c:38: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); - ld l, c - ld h, b + push af +;source-doc/base-drv/./dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; + ld a,(ix+4) + ld (ix-4),a + ld a,(ix+5) + ld (ix-3),a + ld a,(ix-4) + add a,0x03 + ld (ix-2),a + ld a,(ix-3) + adc a,0x00 + ld (ix-1),a +;source-doc/base-drv/./dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); + pop hl + push hl ld a, (hl) rlca rlca rlca rlca and 0x0f - push bc pop de pop hl push hl @@ -130,19 +135,19 @@ _usbdev_blk_out_trnsfer: pop af pop af inc sp - ld d, l - pop bc -;source-doc/base-drv/./dev_transfers.c:40: if (result == USB_ERR_STALL) { - ld a, d + ld a, l + ld (_result), a +;source-doc/base-drv/./dev_transfers.c:41: if (result == USB_ERR_STALL) { + ld a,(_result) sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 -;source-doc/base-drv/./dev_transfers.c:41: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - ld l, c - ld h, b +;source-doc/base-drv/./dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + pop hl + push hl inc hl ld d, (hl) - ld l, c - ld h, b + pop hl + push hl ld a, (hl) rlca rlca @@ -150,8 +155,8 @@ _usbdev_blk_out_trnsfer: rlca and 0x0f ld b, a - pop hl - push hl + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rrca and 0x07 @@ -164,22 +169,26 @@ _usbdev_blk_out_trnsfer: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:42: endpoint->toggle = 0; +;source-doc/base-drv/./dev_transfers.c:43: endpoint->toggle = 0; + pop de pop hl push hl + push de res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:43: return USB_ERR_STALL; +;source-doc/base-drv/./dev_transfers.c:44: return USB_ERR_STALL; ld l,0x02 - jr l_usbdev_blk_out_trnsfer_00103 + jr l_usbdev_blk_out_trnsfer_00104 l_usbdev_blk_out_trnsfer_00102: -;source-doc/base-drv/./dev_transfers.c:46: RETURN_CHECK(result); - ld l, d -l_usbdev_blk_out_trnsfer_00103: -;source-doc/base-drv/./dev_transfers.c:47: } +;source-doc/base-drv/./dev_transfers.c:47: RETURN_CHECK(result); +;source-doc/base-drv/./dev_transfers.c:50: return result; + ld hl,_result + ld l, (hl) +l_usbdev_blk_out_trnsfer_00104: +;source-doc/base-drv/./dev_transfers.c:51: } ld sp, ix pop ix ret -;source-doc/base-drv/./dev_transfers.c:49: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { +;source-doc/base-drv/./dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { ; --------------------------------- ; Function usbdev_bulk_in_transfer ; --------------------------------- @@ -188,22 +197,27 @@ _usbdev_bulk_in_transfer: ld ix,0 add ix,sp push af -;source-doc/base-drv/./dev_transfers.c:53: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; - ld c,(ix+4) - ld b,(ix+5) - ld hl,0x0006 - add hl, bc - ex (sp), hl -;source-doc/base-drv/./dev_transfers.c:55: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); - ld l, c - ld h, b + push af +;source-doc/base-drv/./dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; + ld a,(ix+4) + ld (ix-4),a + ld a,(ix+5) + ld (ix-3),a + ld a,(ix-4) + add a,0x06 + ld (ix-2),a + ld a,(ix-3) + adc a,0x00 + ld (ix-1),a +;source-doc/base-drv/./dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); + pop hl + push hl ld a, (hl) rlca rlca rlca rlca and 0x0f - push bc pop de pop hl push hl @@ -222,19 +236,19 @@ _usbdev_bulk_in_transfer: pop af pop af inc sp - ld d, l - pop bc -;source-doc/base-drv/./dev_transfers.c:57: if (result == USB_ERR_STALL) { - ld a, d + ld a, l + ld (_result), a +;source-doc/base-drv/./dev_transfers.c:58: if (result == USB_ERR_STALL) { + ld a,(_result) sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 -;source-doc/base-drv/./dev_transfers.c:58: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - ld l, c - ld h, b +;source-doc/base-drv/./dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + pop hl + push hl inc hl ld d, (hl) - ld l, c - ld h, b + pop hl + push hl ld a, (hl) rlca rlca @@ -242,8 +256,8 @@ _usbdev_bulk_in_transfer: rlca and 0x0f ld b, a - pop hl - push hl + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rrca and 0x07 @@ -256,22 +270,26 @@ _usbdev_bulk_in_transfer: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:59: endpoint->toggle = 0; +;source-doc/base-drv/./dev_transfers.c:60: endpoint->toggle = 0; + pop de pop hl push hl + push de res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:60: return USB_ERR_STALL; +;source-doc/base-drv/./dev_transfers.c:61: return USB_ERR_STALL; ld l,0x02 - jr l_usbdev_bulk_in_transfer_00103 + jr l_usbdev_bulk_in_transfer_00104 l_usbdev_bulk_in_transfer_00102: -;source-doc/base-drv/./dev_transfers.c:63: RETURN_CHECK(result); - ld l, d -l_usbdev_bulk_in_transfer_00103: -;source-doc/base-drv/./dev_transfers.c:64: } +;source-doc/base-drv/./dev_transfers.c:64: RETURN_CHECK(result); +;source-doc/base-drv/./dev_transfers.c:66: return result; + ld hl,_result + ld l, (hl) +l_usbdev_bulk_in_transfer_00104: +;source-doc/base-drv/./dev_transfers.c:67: } ld sp, ix pop ix ret -;source-doc/base-drv/./dev_transfers.c:66: usb_error usbdev_dat_in_trnsfer(device_config *const device, +;source-doc/base-drv/./dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, ; --------------------------------- ; Function usbdev_dat_in_trnsfer ; --------------------------------- @@ -280,35 +298,35 @@ _usbdev_dat_in_trnsfer: ld ix,0 add ix,sp push af -;source-doc/base-drv/./dev_transfers.c:73: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; - ld c,(ix+4) - ld b,(ix+5) - ld e, c - ld d, b - inc de - inc de - inc de - push de + push af +;source-doc/base-drv/./dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; + ld a,(ix+4) + ld (ix-4),a + ld a,(ix+5) + ld (ix-3),a + pop bc + push bc + inc bc + inc bc + inc bc ld a,(ix+10) ld e, a add a, a add a, e - pop de - add a, e + add a, c ld (ix-2),a ld a,0x00 - adc a, d + adc a, b ld (ix-1),a -;source-doc/base-drv/./dev_transfers.c:75: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - ld l, c - ld h, b +;source-doc/base-drv/./dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + pop hl + push hl ld a, (hl) rlca rlca rlca rlca and 0x0f - push bc pop de pop hl push hl @@ -327,19 +345,19 @@ _usbdev_dat_in_trnsfer: pop af pop af inc sp - ld d, l - pop bc -;source-doc/base-drv/./dev_transfers.c:77: if (result == USB_ERR_STALL) { - ld a, d + ld a, l + ld (_result), a +;source-doc/base-drv/./dev_transfers.c:78: if (result == USB_ERR_STALL) { + ld a,(_result) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 -;source-doc/base-drv/./dev_transfers.c:78: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - ld l, c - ld h, b +;source-doc/base-drv/./dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + pop hl + push hl inc hl ld d, (hl) - ld l, c - ld h, b + pop hl + push hl ld a, (hl) rlca rlca @@ -347,8 +365,8 @@ _usbdev_dat_in_trnsfer: rlca and 0x0f ld b, a - pop hl - push hl + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rrca and 0x07 @@ -361,22 +379,26 @@ _usbdev_dat_in_trnsfer: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:79: endpoint->toggle = 0; +;source-doc/base-drv/./dev_transfers.c:80: endpoint->toggle = 0; + pop de pop hl push hl + push de res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:80: return USB_ERR_STALL; +;source-doc/base-drv/./dev_transfers.c:81: return USB_ERR_STALL; ld l,0x02 - jr l_usbdev_dat_in_trnsfer_00103 + jr l_usbdev_dat_in_trnsfer_00104 l_usbdev_dat_in_trnsfer_00102: -;source-doc/base-drv/./dev_transfers.c:83: RETURN_CHECK(result); - ld l, d -l_usbdev_dat_in_trnsfer_00103: -;source-doc/base-drv/./dev_transfers.c:84: } +;source-doc/base-drv/./dev_transfers.c:84: RETURN_CHECK(result); +;source-doc/base-drv/./dev_transfers.c:86: return result; + ld hl,_result + ld l, (hl) +l_usbdev_dat_in_trnsfer_00104: +;source-doc/base-drv/./dev_transfers.c:87: } ld sp, ix pop ix ret -;source-doc/base-drv/./dev_transfers.c:86: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) { +;source-doc/base-drv/./dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { ; --------------------------------- ; Function usbdev_dat_in_trnsfer_0 ; --------------------------------- @@ -386,53 +408,57 @@ _usbdev_dat_in_trnsfer_0: add ix,sp push af push af - ld c, l - ld b, h - ld (ix-2),e - ld (ix-1),d ;source-doc/base-drv/./dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; - ld hl,0x0003 - add hl, bc - ex (sp), hl + ld a,(ix+4) + ld (ix-4),a + ld a,(ix+5) + ld (ix-3),a + ld a,(ix-4) + add a,0x03 + ld (ix-2),a + ld a,(ix-3) + adc a,0x00 + ld (ix-1),a ;source-doc/base-drv/./dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - ld l, c - ld h, b + pop hl + push hl ld a, (hl) rlca rlca rlca rlca and 0x0f - ld e,(ix+4) - ld d,0x00 - push bc - ld l,(ix-4) - ld h,(ix-3) + ld c,(ix+8) + ld b,0x00 + pop de + pop hl + push hl + push de push hl push af inc sp - push de - ld l,(ix-2) - ld h,(ix-1) + push bc + ld l,(ix+6) + ld h,(ix+7) push hl call _usb_data_in_transfer pop af pop af pop af inc sp - ld d, l - pop bc + ld a, l + ld (_result), a ;source-doc/base-drv/./dev_transfers.c:94: if (result == USB_ERR_STALL) { - ld a, d + ld a,(_result) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_0_00102 ;source-doc/base-drv/./dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - ld l, c - ld h, b + pop hl + push hl inc hl ld d, (hl) - ld l, c - ld h, b + pop hl + push hl ld a, (hl) rlca rlca @@ -440,8 +466,8 @@ _usbdev_dat_in_trnsfer_0: rlca and 0x0f ld b, a - pop hl - push hl + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rrca and 0x07 @@ -455,19 +481,20 @@ _usbdev_dat_in_trnsfer_0: pop af inc sp ;source-doc/base-drv/./dev_transfers.c:96: endpoint->toggle = 0; + pop de pop hl push hl + push de res 0, (hl) ;source-doc/base-drv/./dev_transfers.c:97: return USB_ERR_STALL; - ld a,0x02 + ld l,0x02 jr l_usbdev_dat_in_trnsfer_0_00103 l_usbdev_dat_in_trnsfer_0_00102: -;source-doc/base-drv/./dev_transfers.c:100: RETURN_CHECK(result); - ld a, d +;source-doc/base-drv/./dev_transfers.c:100: return result; + ld hl,_result + ld l, (hl) l_usbdev_dat_in_trnsfer_0_00103: ;source-doc/base-drv/./dev_transfers.c:101: } ld sp, ix pop ix - pop hl - inc sp - jp (hl) + ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 91a0e9bc..f1e3e0e0 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -532,12 +532,14 @@ _op_capture_hub_driver_interfac: ex de, hl call _configure_usb_hub ld a, l +;source-doc/base-drv/./enumerate.c:97: done: l_op_capture_hub_driver_interfa: -;source-doc/base-drv/./enumerate.c:97: } +;source-doc/base-drv/./enumerate.c:98: return result; +;source-doc/base-drv/./enumerate.c:99: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:99: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { +;source-doc/base-drv/./enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { ; --------------------------------- ; Function op_cap_drv_intf ; --------------------------------- @@ -552,7 +554,7 @@ _op_cap_drv_intf: ld sp, hl ld (ix-2),c ld (ix-1),b -;source-doc/base-drv/./enumerate.c:102: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; +;source-doc/base-drv/./enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; ld l,(ix-2) ld h,(ix-1) ld de,0x001b @@ -563,7 +565,7 @@ _op_cap_drv_intf: dec hl ld c, e ld b, d -;source-doc/base-drv/./enumerate.c:104: working->ptr += interface->bLength; +;source-doc/base-drv/./enumerate.c:106: working->ptr += interface->bLength; ld a, (bc) add a, e ld e, a @@ -572,7 +574,7 @@ _op_cap_drv_intf: ld (hl), e inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:105: working->endpoint_count = interface->bNumEndpoints; +;source-doc/base-drv/./enumerate.c:107: working->endpoint_count = interface->bNumEndpoints; ld a,(ix-2) add a,0x17 ld e, a @@ -587,7 +589,7 @@ _op_cap_drv_intf: inc hl ld a, (hl) ld (de), a -;source-doc/base-drv/./enumerate.c:106: working->p_current_device = NULL; +;source-doc/base-drv/./enumerate.c:108: working->p_current_device = NULL; ld a,(ix-2) add a,0x1d ld (ix-4),a @@ -600,7 +602,7 @@ _op_cap_drv_intf: ld (hl), a inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:108: switch (working->usb_device) { +;source-doc/base-drv/./enumerate.c:110: switch (working->usb_device) { ld l,(ix-2) ld h,(ix-1) inc hl @@ -610,27 +612,26 @@ _op_cap_drv_intf: jr Z,l_op_cap_drv_intf_00104 sub 0x0f jr NZ,l_op_cap_drv_intf_00107 -;source-doc/base-drv/./enumerate.c:110: CHECK(op_capture_hub_driver_interface(working)) +;source-doc/base-drv/./enumerate.c:112: CHECK(op_capture_hub_driver_interface(working)) ld l,(ix-2) ld h,(ix-1) call _op_capture_hub_driver_interfac or a jr Z,l_op_cap_drv_intf_00112 - ld l, a - jr l_op_cap_drv_intf_00115 -;source-doc/base-drv/./enumerate.c:114: case USB_IS_UNKNOWN: { + jr l_op_cap_drv_intf_00113 +;source-doc/base-drv/./enumerate.c:116: case USB_IS_UNKNOWN: { l_op_cap_drv_intf_00104: -;source-doc/base-drv/./enumerate.c:116: memset(&unkown_dev_cfg, 0, sizeof(device_config)); +;source-doc/base-drv/./enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config)); push bc ld hl,2 add hl, sp ld b,0x0c -l_op_cap_drv_intf_00169: +l_op_cap_drv_intf_00154: ld (hl),0x00 inc hl - djnz l_op_cap_drv_intf_00169 + djnz l_op_cap_drv_intf_00154 pop bc -;source-doc/base-drv/./enumerate.c:117: working->p_current_device = &unkown_dev_cfg; +;source-doc/base-drv/./enumerate.c:119: working->p_current_device = &unkown_dev_cfg; ld hl,0 add hl, sp ex de, hl @@ -639,7 +640,7 @@ l_op_cap_drv_intf_00169: ld (hl), e inc hl ld (hl), d -;source-doc/base-drv/./enumerate.c:118: CHECK(configure_device(working, interface, &unkown_dev_cfg)); +;source-doc/base-drv/./enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); ld hl,0 add hl, sp push hl @@ -654,29 +655,29 @@ l_op_cap_drv_intf_00169: ld a, l or a jr Z,l_op_cap_drv_intf_00112 - jr l_op_cap_drv_intf_00115 -;source-doc/base-drv/./enumerate.c:122: default: { + jr l_op_cap_drv_intf_00113 +;source-doc/base-drv/./enumerate.c:124: default: { l_op_cap_drv_intf_00107: -;source-doc/base-drv/./enumerate.c:123: device_config *dev_cfg = find_first_free(); +;source-doc/base-drv/./enumerate.c:125: device_config *dev_cfg = find_first_free(); push bc call _find_first_free ex de, hl pop bc -;source-doc/base-drv/./enumerate.c:124: if (dev_cfg == NULL) +;source-doc/base-drv/./enumerate.c:126: if (dev_cfg == NULL) ld a, d or e jr NZ,l_op_cap_drv_intf_00109 -;source-doc/base-drv/./enumerate.c:125: return USB_ERR_OUT_OF_MEMORY; +;source-doc/base-drv/./enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; ld l,0x83 - jr l_op_cap_drv_intf_00115 + jr l_op_cap_drv_intf_00114 l_op_cap_drv_intf_00109: -;source-doc/base-drv/./enumerate.c:126: working->p_current_device = dev_cfg; +;source-doc/base-drv/./enumerate.c:128: working->p_current_device = dev_cfg; ld l,(ix-4) ld h,(ix-3) ld (hl), e inc hl ld (hl), d -;source-doc/base-drv/./enumerate.c:127: CHECK(configure_device(working, interface, dev_cfg)); +;source-doc/base-drv/./enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); push de push bc ld l,(ix-2) @@ -688,32 +689,29 @@ l_op_cap_drv_intf_00109: pop af ld a, l or a -;source-doc/base-drv/./enumerate.c:130: } - jr NZ,l_op_cap_drv_intf_00115 + jr NZ,l_op_cap_drv_intf_00113 +;source-doc/base-drv/./enumerate.c:132: } l_op_cap_drv_intf_00112: -;source-doc/base-drv/./enumerate.c:132: CHECK(op_parse_endpoint(working)); +;source-doc/base-drv/./enumerate.c:134: result = op_parse_endpoint(working); ld l,(ix-2) ld h,(ix-1) call _op_parse_endpoint - or a - jr Z,l_op_cap_drv_intf_00114 +;source-doc/base-drv/./enumerate.c:136: done: +l_op_cap_drv_intf_00113: +;source-doc/base-drv/./enumerate.c:137: return result; ld l, a - jr l_op_cap_drv_intf_00115 l_op_cap_drv_intf_00114: -;source-doc/base-drv/./enumerate.c:134: return result; - ld l, a -l_op_cap_drv_intf_00115: -;source-doc/base-drv/./enumerate.c:135: } +;source-doc/base-drv/./enumerate.c:138: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:137: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { +;source-doc/base-drv/./enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_id_class_drv ; --------------------------------- _op_id_class_drv: ex de, hl -;source-doc/base-drv/./enumerate.c:139: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; +;source-doc/base-drv/./enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; ld l, e ld h, d ld bc,0x001c @@ -721,16 +719,16 @@ _op_id_class_drv: ld a, (hl) dec hl ld l, (hl) -;source-doc/base-drv/./enumerate.c:141: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; + ld h, a +;source-doc/base-drv/./enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; ld c, e ld b, d inc bc inc bc - ld h, a ld l, (hl) ld a,0x05 sub l - jr NC,l_op_id_class_drv_00105 + jr NC,l_op_id_class_drv_00103 push bc push de push de @@ -739,18 +737,15 @@ _op_id_class_drv: ld a, l pop de pop bc - jr l_op_id_class_drv_00106 -l_op_id_class_drv_00105: + jr l_op_id_class_drv_00104 +l_op_id_class_drv_00103: xor a -l_op_id_class_drv_00106: +l_op_id_class_drv_00104: ld (bc), a -;source-doc/base-drv/./enumerate.c:143: CHECK(op_cap_drv_intf(working)); +;source-doc/base-drv/./enumerate.c:145: return op_cap_drv_intf(working); ex de, hl call _op_cap_drv_intf ld a, l - or a - ret NZ -;source-doc/base-drv/./enumerate.c:145: return result; ;source-doc/base-drv/./enumerate.c:146: } ret ;source-doc/base-drv/./enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { @@ -762,65 +757,81 @@ _op_get_cfg_desc: ld ix,0 add ix,sp push af - ex de, hl -;source-doc/base-drv/./enumerate.c:151: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); - ld hl,0x001f - add hl, de - ex (sp), hl + push af + ld (ix-2),l + ld (ix-1),h +;source-doc/base-drv/./enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + ld a,(ix-2) + add a,0x1f + ld (ix-4),a + ld a,(ix-1) + adc a,0x00 + ld (ix-3),a pop hl push hl ld b,0x8c -l_op_get_cfg_desc_00121: +l_op_get_cfg_desc_00113: ld (hl),0x00 inc hl - djnz l_op_get_cfg_desc_00121 -;source-doc/base-drv/./enumerate.c:153: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; - ld c, e - ld b, d + djnz l_op_get_cfg_desc_00113 +;source-doc/base-drv/./enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + pop hl + pop bc + push bc + push hl inc bc inc bc inc bc ld hl,7 add hl, bc - ld a, (hl) -;source-doc/base-drv/./enumerate.c:156: working->config.buffer)); - ld c, e - ld b, d + ld d, (hl) +;source-doc/base-drv/./enumerate.c:154: working->config.buffer)); + pop hl + pop bc + push bc + push hl ld hl,24 add hl, bc - ld b, (hl) - ld l, e - ld h, d + ld a, (hl) + pop hl + pop bc push bc - ld bc,0x0015 + push hl + ld hl,21 add hl, bc - pop bc - ld c, (hl) - push de - ld l,(ix-2) - ld h,(ix-1) + ld b, (hl) + pop hl + push hl push hl ld h,0x8c push hl inc sp + push de + inc sp push af inc sp push bc + inc sp call _usbtrn_gfull_cfg_desc pop af pop af pop af ld a, l - pop de + ld (_result), a + ld a,(_result) or a - jr NZ,l_op_get_cfg_desc_00105 -;source-doc/base-drv/./enumerate.c:158: working->ptr = (working->config.buffer + sizeof(config_descriptor)); - ld hl,0x001b + jr NZ,l_op_get_cfg_desc_00103 +;source-doc/base-drv/./enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); + pop de + pop hl + push hl + push de + ld de,0x001b add hl, de - ld a, e + ld a,(ix-2) add a,0x1f ld c, a - ld a, d + ld a,(ix-1) adc a,0x00 ld b, a ld a, c @@ -831,31 +842,37 @@ l_op_get_cfg_desc_00121: ld (hl), c inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:159: working->interface_count = working->config.desc.bNumInterfaces; - ld hl,0x0016 +;source-doc/base-drv/./enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; + ld a,(ix-2) + add a,0x16 + ld c, a + ld a,(ix-1) + adc a,0x00 + ld b, a + pop de + push de + ld hl,4 add hl, de - ld c, l - ld b, h - pop hl - push hl - inc hl - inc hl - inc hl - inc hl ld a, (hl) ld (bc), a -;source-doc/base-drv/./enumerate.c:161: CHECK(op_id_class_drv(working)); - ex de, hl +;source-doc/base-drv/./enumerate.c:159: return op_id_class_drv(working); + pop de + pop hl + push hl + push de call _op_id_class_drv - or a - jr NZ,l_op_get_cfg_desc_00105 -;source-doc/base-drv/./enumerate.c:163: return result; -l_op_get_cfg_desc_00105: -;source-doc/base-drv/./enumerate.c:164: } + jr l_op_get_cfg_desc_00104 +;source-doc/base-drv/./enumerate.c:160: done: +l_op_get_cfg_desc_00103: +;source-doc/base-drv/./enumerate.c:161: return result; + ld hl,_result + ld a, (hl) +l_op_get_cfg_desc_00104: +;source-doc/base-drv/./enumerate.c:162: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:166: usb_error read_all_configs(enumeration_state *const state) { +;source-doc/base-drv/./enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { ; --------------------------------- ; Function read_all_configs ; --------------------------------- @@ -866,18 +883,18 @@ _read_all_configs: ld hl, -171 add hl, sp ld sp, hl -;source-doc/base-drv/./enumerate.c:171: memset(&working, 0, sizeof(_working)); +;source-doc/base-drv/./enumerate.c:169: memset(&working, 0, sizeof(_working)); ld hl,0 add hl, sp ex de, hl ld l, e ld h, d ld b,0xab -l_read_all_configs_00148: +l_read_all_configs_00149: ld (hl),0x00 inc hl - djnz l_read_all_configs_00148 -;source-doc/base-drv/./enumerate.c:172: working.state = state; + djnz l_read_all_configs_00149 +;source-doc/base-drv/./enumerate.c:170: working.state = state; ld l, e ld h, d ld a,(ix+4) @@ -885,57 +902,53 @@ l_read_all_configs_00148: inc hl ld a,(ix+5) ld (hl), a -;source-doc/base-drv/./enumerate.c:174: CHECK(usbtrn_get_descriptor(&working.desc)); +;source-doc/base-drv/./enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); push de ld hl,5 add hl, sp push hl call _usbtrn_get_descriptor pop af - ld c, l + ld a, l pop de - ld a, c or a - jr Z,l_read_all_configs_00102 - ld l, c - jr l_read_all_configs_00111 -l_read_all_configs_00102: -;source-doc/base-drv/./enumerate.c:176: state->next_device_address++; + jr NZ,l_read_all_configs_00108 +;source-doc/base-drv/./enumerate.c:174: state->next_device_address++; ld a,(ix+4) - ld c,(ix+5) + ld b,(ix+5) ld l, a - ld h, c - ld b, (hl) - inc b + ld h, b + ld c, (hl) + inc c ld l, a - ld h, c - ld (hl), b -;source-doc/base-drv/./enumerate.c:177: working.current_device_address = state->next_device_address; + ld h, b + ld (hl), c +;source-doc/base-drv/./enumerate.c:175: working.current_device_address = state->next_device_address; ld hl,0x0018 add hl, de - ld (hl), b -;source-doc/base-drv/./enumerate.c:178: CHECK(usbtrn_set_address(working.current_device_address)); + ld (hl), c +;source-doc/base-drv/./enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); push de - ld l, b + ld l, c call _usbtrn_set_address - pop de ld a, l -;source-doc/base-drv/./enumerate.c:180: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + pop de +;source-doc/base-drv/./enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { or a - jr NZ,l_read_all_configs_00111 + jr NZ,l_read_all_configs_00108 ld c,a -l_read_all_configs_00109: +l_read_all_configs_00110: ld hl,20 add hl, sp ld b, (hl) ld a, c sub b jr NC,l_read_all_configs_00107 -;source-doc/base-drv/./enumerate.c:181: working.config_index = config_index; +;source-doc/base-drv/./enumerate.c:179: working.config_index = config_index; ld hl,0x0015 add hl, de ld (hl), c -;source-doc/base-drv/./enumerate.c:183: CHECK(op_get_cfg_desc(&working)); +;source-doc/base-drv/./enumerate.c:181: CHECK(op_get_cfg_desc(&working)); push bc push de ld hl,4 @@ -944,17 +957,19 @@ l_read_all_configs_00109: pop de pop bc or a - jr Z,l_read_all_configs_00110 - ld l, a - jr l_read_all_configs_00111 -l_read_all_configs_00110: -;source-doc/base-drv/./enumerate.c:180: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + jr NZ,l_read_all_configs_00108 +;source-doc/base-drv/./enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { inc c - jr l_read_all_configs_00109 + jr l_read_all_configs_00110 l_read_all_configs_00107: -;source-doc/base-drv/./enumerate.c:186: return USB_ERR_OK; +;source-doc/base-drv/./enumerate.c:184: return USB_ERR_OK; ld l,0x00 -l_read_all_configs_00111: + jr l_read_all_configs_00112 +;source-doc/base-drv/./enumerate.c:185: done: +l_read_all_configs_00108: +;source-doc/base-drv/./enumerate.c:186: return result; + ld l, a +l_read_all_configs_00112: ;source-doc/base-drv/./enumerate.c:187: } ld sp, ix pop ix @@ -989,17 +1004,9 @@ _enumerate_all_devices: ;source-doc/base-drv/./enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; ld a, (de) ld ((_x + 1)),a -;source-doc/base-drv/./enumerate.c:199: CHECK(result); - ld a, c - or a - jr Z,l_enumerate_all_devices_00102 - ld l, c - jr l_enumerate_all_devices_00103 -l_enumerate_all_devices_00102: -;source-doc/base-drv/./enumerate.c:201: return result; +;source-doc/base-drv/./enumerate.c:200: return result; ld l, c -l_enumerate_all_devices_00103: -;source-doc/base-drv/./enumerate.c:202: } +;source-doc/base-drv/./enumerate.c:201: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s index 69ffc3bd..7a66b97e 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -246,14 +246,14 @@ _configure_usb_hub: add ix,sp ld c, l ld b, h - ld hl, -15 + ld hl, -14 add hl, sp ld sp, hl - ld (ix-3),c - ld (ix-2),b + ld (ix-2),c + ld (ix-1),b ;source-doc/base-drv/./enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config; - ld c,(ix-3) - ld b,(ix-2) + ld c,(ix-2) + ld b,(ix-1) ld hl,25 add hl, bc ld c, (hl) @@ -267,85 +267,84 @@ _configure_usb_hub: ld l, c ld h, b call _hub_get_descriptor - ld e, a pop bc - ld a, e or a - jr Z,l_configure_usb_hub_00102 - ld l, e - jp l_configure_usb_hub_00129 -l_configure_usb_hub_00102: + jp NZ, l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts; - ld a,(ix-13) - ld (ix-1),a + ld d,(ix-12) ;source-doc/base-drv/./enumerate_hub.c:50: do { l_configure_usb_hub_00126: ;source-doc/base-drv/./enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); push bc - ld d,(ix-1) + push de ld e,0x08 push de push bc call _hub_clear_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a - jp NZ,l_configure_usb_hub_00129 + jp NZ, l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); push bc - ld d,(ix-1) + push de ld e,0x08 push de push bc call _hub_set_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a - jp NZ,l_configure_usb_hub_00129 + jp NZ, l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i); push bc - ld d,(ix-1) + push de ld e,0x04 push de push bc call _hub_clear_feature pop af pop af + pop de pop bc ;source-doc/base-drv/./enumerate_hub.c:57: CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i)); push bc - ld d,(ix-1) + push de ld e,0x04 push de push bc call _hub_set_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a - jp NZ,l_configure_usb_hub_00129 + jp NZ, l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status)); push bc - ld hl,10 + push de + ld hl,12 add hl, sp push hl - ld a,(ix-1) - push af + push de inc sp push bc call _hub_get_status_port pop af pop af inc sp - pop bc ld a, l + pop de + pop bc or a - jp NZ,l_configure_usb_hub_00129 + jp NZ, l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) { ld hl,8 add hl, sp @@ -354,105 +353,122 @@ l_configure_usb_hub_00126: jr Z,l_configure_usb_hub_00124 ;source-doc/base-drv/./enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); push bc - ld d,(ix-1) + push de ld e,0x10 push de push bc call _hub_clear_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); push bc - ld d,(ix-1) + push de ld e,0x11 push de push bc call _hub_clear_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); push bc - ld d,(ix-1) + push de ld e,0x14 push de push bc call _hub_clear_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:67: delay_short(); push bc + push de call _delay_short + pop de pop bc ;source-doc/base-drv/./enumerate_hub.c:69: CHECK(hub_get_status_port(hub_config, i, &port_status)); push bc - ld hl,10 + push de + ld hl,12 add hl, sp push hl - ld a,(ix-1) - push af + push de inc sp push bc call _hub_get_status_port pop af pop af inc sp - pop bc ld a, l + pop de + pop bc or a jr NZ,l_configure_usb_hub_00129 ;source-doc/base-drv/./enumerate_hub.c:70: delay_short(); push bc + push de call _delay_short + pop de pop bc ;source-doc/base-drv/./enumerate_hub.c:72: CHECK(read_all_configs(working->state)); - ld l,(ix-3) - ld h,(ix-2) - ld e, (hl) + ld l,(ix-2) + ld h,(ix-1) + ld a, (hl) inc hl - ld d, (hl) + ld h, (hl) + ld l, a push bc push de + push hl call _read_all_configs pop af - pop bc ld a, l + pop de + pop bc or a jr Z,l_configure_usb_hub_00127 jr l_configure_usb_hub_00129 l_configure_usb_hub_00124: ;source-doc/base-drv/./enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); push bc - ld d,(ix-1) + push de ld e,0x08 push de push bc call _hub_clear_feature pop af pop af - pop bc ld a, l + pop de + pop bc or a jr NZ,l_configure_usb_hub_00129 l_configure_usb_hub_00127: ;source-doc/base-drv/./enumerate_hub.c:77: } while (--i != 0); - dec (ix-1) + dec d jp NZ, l_configure_usb_hub_00126 ;source-doc/base-drv/./enumerate_hub.c:79: return USB_ERR_OK; ld l,0x00 + jr l_configure_usb_hub_00130 +;source-doc/base-drv/./enumerate_hub.c:80: done: l_configure_usb_hub_00129: -;source-doc/base-drv/./enumerate_hub.c:80: } +;source-doc/base-drv/./enumerate_hub.c:81: return result; + ld l, a +l_configure_usb_hub_00130: +;source-doc/base-drv/./enumerate_hub.c:82: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index a7e42b9c..0ffb9902 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -59,26 +59,18 @@ _usbtrn_get_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:32: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/./protocol.c:31: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl ld hl,_cmd_get_device_descriptor ld bc,0x0008 ldir -;source-doc/base-drv/./protocol.c:33: cmd.wLength = 8; +;source-doc/base-drv/./protocol.c:32: cmd.wLength = 8; ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:35: debugger(); - PUSH AF - PUSH BC - XOR A - LD B, 7 - DEFB 0x49, 0xD7 - POP BC - POP AF -;source-doc/base-drv/./protocol.c:36: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); +;source-doc/base-drv/./protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); ld c,(ix+4) ld b,(ix+5) ld e, c @@ -99,11 +91,13 @@ _usbtrn_get_descriptor: pop af pop af pop bc -;source-doc/base-drv/./protocol.c:38: CHECK(result); ld a, l + ld (_result), a +;source-doc/base-drv/./protocol.c:36: CHECK(result); + ld a,(_result) or a jr NZ,l_usbtrn_get_descriptor_00103 -;source-doc/base-drv/./protocol.c:40: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/./protocol.c:38: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl @@ -112,11 +106,11 @@ _usbtrn_get_descriptor: ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:41: cmd.wLength = 18; +;source-doc/base-drv/./protocol.c:39: cmd.wLength = 18; ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:42: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); +;source-doc/base-drv/./protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); ld e,(ix+4) ld d,(ix+5) ld hl,7 @@ -135,9 +129,15 @@ _usbtrn_get_descriptor: pop af pop af pop af -;source-doc/base-drv/./protocol.c:44: RETURN_CHECK(result); + ld a, l + ld (_result), a +;source-doc/base-drv/./protocol.c:42: RETURN_CHECK(result); +;source-doc/base-drv/./protocol.c:44: done: l_usbtrn_get_descriptor_00103: -;source-doc/base-drv/./protocol.c:45: } +;source-doc/base-drv/./protocol.c:45: return result; + ld hl,_result + ld l, (hl) +;source-doc/base-drv/./protocol.c:46: } ld sp, ix pop ix ret @@ -149,7 +149,7 @@ _cmd_get_device_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0008 -;source-doc/base-drv/./protocol.c:53: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { +;source-doc/base-drv/./protocol.c:54: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { ; --------------------------------- ; Function usbtrn_get_descriptor2 ; --------------------------------- @@ -157,34 +157,33 @@ _usbtrn_get_descriptor2: push ix ld ix,0 add ix,sp - ld hl, -13 + ld hl, -8 add hl, sp ld sp, hl ;source-doc/base-drv/./protocol.c:56: cmd = cmd_get_device_descriptor; - ld hl,2 + ld hl,0 add hl, sp ex de, hl ld hl,_cmd_get_device_descriptor ld bc,0x0008 ldir ;source-doc/base-drv/./protocol.c:57: cmd.wLength = 8; - ld (ix-5),0x08 + ld (ix-2),0x08 xor a - ld (ix-4),a -;source-doc/base-drv/./protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); - ld a,(ix+4) - ld (ix-2),a - ld a,(ix+5) ld (ix-1),a - ld c,(ix-2) - ld b,(ix-1) +;source-doc/base-drv/./protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + push bc ld a,0x08 push af inc sp ld a,(ix+6) push af inc sp - push bc + push de ld hl,6 add hl, sp push hl @@ -192,59 +191,57 @@ _usbtrn_get_descriptor2: pop af pop af pop af - ld (ix-12),l - ld (ix-3),l + pop bc + ld a, l + ld (_result), a ;source-doc/base-drv/./protocol.c:61: CHECK(result); - ld a,(ix-12) + ld a,(_result) or a - jr Z,l_usbtrn_get_descriptor2_00102 - ld l,(ix-3) - jr l_usbtrn_get_descriptor2_00103 -l_usbtrn_get_descriptor2_00102: + jr NZ,l_usbtrn_get_descriptor2_00103 ;source-doc/base-drv/./protocol.c:63: cmd = cmd_get_device_descriptor; - ex de, hl - ld hl,2 + ld hl,0 add hl, sp ex de, hl + push bc ld hl,_cmd_get_device_descriptor ld bc,0x0008 ldir + pop bc ;source-doc/base-drv/./protocol.c:64: cmd.wLength = 18; - ld (ix-5),0x12 + ld (ix-2),0x12 xor a - ld (ix-4),a + ld (ix-1),a ;source-doc/base-drv/./protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); - ld a,(ix+4) - ld (ix-13),a - ld a,(ix+5) - ld (ix-12),a - pop hl - push hl - ld de,0x0007 + ld e,(ix+4) + ld d,(ix+5) + ld hl,7 add hl, de ld a, (hl) - ld (ix-3),a push af inc sp ld a,(ix+6) push af inc sp - ld l,(ix-2) - ld h,(ix-1) - push hl - ld hl,6 + push bc + ld hl,4 add hl, sp push hl call _usb_control_transfer pop af pop af pop af + ld a, l + ld (_result), a +;source-doc/base-drv/./protocol.c:66: done: l_usbtrn_get_descriptor2_00103: -;source-doc/base-drv/./protocol.c:66: } +;source-doc/base-drv/./protocol.c:67: return result; + ld hl,_result + ld l, (hl) +;source-doc/base-drv/./protocol.c:68: } ld sp, ix pop ix ret -;source-doc/base-drv/./protocol.c:76: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/./protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function usbtrn_set_address ; --------------------------------- @@ -257,7 +254,7 @@ _usbtrn_set_address: push af push af ld c, l -;source-doc/base-drv/./protocol.c:78: cmd = cmd_set_device_address; +;source-doc/base-drv/./protocol.c:80: cmd = cmd_set_device_address; ld hl,0 add hl, sp ex de, hl @@ -266,9 +263,9 @@ _usbtrn_set_address: ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:79: cmd.bValue[0] = device_address; +;source-doc/base-drv/./protocol.c:81: cmd.bValue[0] = device_address; ld (ix-6),c -;source-doc/base-drv/./protocol.c:81: return usb_control_transfer(&cmd, 0, 0, 0); +;source-doc/base-drv/./protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0); xor a push af inc sp @@ -281,7 +278,7 @@ _usbtrn_set_address: add hl, sp push hl call _usb_control_transfer -;source-doc/base-drv/./protocol.c:82: } +;source-doc/base-drv/./protocol.c:84: } ld sp,ix pop ix ret @@ -293,7 +290,7 @@ _cmd_set_device_address: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:92: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { +;source-doc/base-drv/./protocol.c:94: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { ; --------------------------------- ; Function usbtrn_set_configuration ; --------------------------------- @@ -304,7 +301,7 @@ _usbtrn_set_configuration: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:94: cmd = cmd_set_configuration; +;source-doc/base-drv/./protocol.c:96: cmd = cmd_set_configuration; ld hl,0 add hl, sp ld c, l @@ -316,10 +313,10 @@ _usbtrn_set_configuration: ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:95: cmd.bValue[0] = configuration; +;source-doc/base-drv/./protocol.c:97: cmd.bValue[0] = configuration; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./protocol.c:97: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); +;source-doc/base-drv/./protocol.c:99: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); ld h,(ix+5) ld l,(ix+4) push hl @@ -327,7 +324,7 @@ _usbtrn_set_configuration: push hl push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:98: } +;source-doc/base-drv/./protocol.c:100: } ld sp,ix pop ix ret @@ -339,7 +336,7 @@ _cmd_set_configuration: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:112: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, +;source-doc/base-drv/./protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, ; --------------------------------- ; Function usbtrn_get_config_descriptor ; --------------------------------- @@ -350,7 +347,7 @@ _usbtrn_get_config_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:118: cmd = cmd_get_config_descriptor; +;source-doc/base-drv/./protocol.c:120: cmd = cmd_get_config_descriptor; ld hl,0 add hl, sp ld c, l @@ -362,14 +359,14 @@ _usbtrn_get_config_descriptor: ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:119: cmd.bValue[0] = config_index; +;source-doc/base-drv/./protocol.c:121: cmd.bValue[0] = config_index; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./protocol.c:120: cmd.wLength = (uint16_t)buffer_size; +;source-doc/base-drv/./protocol.c:122: cmd.wLength = (uint16_t)buffer_size; ld e,(ix+7) ld (ix-2),e ld (ix-1),0x00 -;source-doc/base-drv/./protocol.c:122: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size)); +;source-doc/base-drv/./protocol.c:124: return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size); ld e,(ix+4) ld d,(ix+5) ld h,(ix+9) @@ -378,7 +375,7 @@ _usbtrn_get_config_descriptor: push de push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:123: } +;source-doc/base-drv/./protocol.c:125: } ld sp,ix pop ix ret @@ -390,7 +387,7 @@ _cmd_get_config_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:125: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, +;source-doc/base-drv/./protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, ; --------------------------------- ; Function usbtrn_gfull_cfg_desc ; --------------------------------- @@ -398,7 +395,7 @@ _usbtrn_gfull_cfg_desc: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./protocol.c:133: max_packet_size)); +;source-doc/base-drv/./protocol.c:134: max_packet_size)); ld c,(ix+8) ld b,(ix+9) push bc @@ -418,22 +415,24 @@ _usbtrn_gfull_cfg_desc: pop af pop bc ld a, l + ld (_result), a + ld a,(_result) or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 -;source-doc/base-drv/./protocol.c:135: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; +;source-doc/base-drv/./protocol.c:136: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; ld l, c ld h, b inc hl inc hl ld d, (hl) -;source-doc/base-drv/./protocol.c:136: if (max_length > max_buffer_size) +;source-doc/base-drv/./protocol.c:137: if (max_length > max_buffer_size) ld a,(ix+7) sub d jr NC,l_usbtrn_gfull_cfg_desc_00104 -;source-doc/base-drv/./protocol.c:137: max_length = max_buffer_size; +;source-doc/base-drv/./protocol.c:138: max_length = max_buffer_size; ld d,(ix+7) l_usbtrn_gfull_cfg_desc_00104: -;source-doc/base-drv/./protocol.c:139: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); +;source-doc/base-drv/./protocol.c:140: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); ld h,(ix+6) ld l,(ix+5) push hl @@ -448,15 +447,23 @@ l_usbtrn_gfull_cfg_desc_00104: pop af pop af ld a, l -;source-doc/base-drv/./protocol.c:141: return USB_ERR_OK; + ld (_result), a + ld a,(_result) +;source-doc/base-drv/./protocol.c:142: return USB_ERR_OK; or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 ld l,a + jr l_usbtrn_gfull_cfg_desc_00108 +;source-doc/base-drv/./protocol.c:143: done: l_usbtrn_gfull_cfg_desc_00107: -;source-doc/base-drv/./protocol.c:142: } +;source-doc/base-drv/./protocol.c:144: return result; + ld hl,_result + ld l, (hl) +l_usbtrn_gfull_cfg_desc_00108: +;source-doc/base-drv/./protocol.c:145: } pop ix ret -;source-doc/base-drv/./protocol.c:146: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { +;source-doc/base-drv/./protocol.c:149: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { ; --------------------------------- ; Function usbtrn_clear_endpoint_halt ; --------------------------------- @@ -467,7 +474,7 @@ _usbtrn_clear_endpoint_halt: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:148: cmd = usb_cmd_clear_endpoint_halt; +;source-doc/base-drv/./protocol.c:151: cmd = usb_cmd_clear_endpoint_halt; ld hl,0 add hl, sp ld c, l @@ -479,10 +486,10 @@ _usbtrn_clear_endpoint_halt: ld bc,0x0008 ldir pop bc -;source-doc/base-drv/./protocol.c:149: cmd.bIndex[0] = endpoint_number; +;source-doc/base-drv/./protocol.c:152: cmd.bIndex[0] = endpoint_number; ld a,(ix+4) ld (ix-4),a -;source-doc/base-drv/./protocol.c:151: usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); +;source-doc/base-drv/./protocol.c:154: return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); ld h,(ix+6) ld l,(ix+5) push hl @@ -490,8 +497,7 @@ _usbtrn_clear_endpoint_halt: push hl push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:153: RETURN_CHECK(result); -;source-doc/base-drv/./protocol.c:154: } +;source-doc/base-drv/./protocol.c:155: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index a080f748..199747fe 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -139,14 +139,15 @@ _usb_control_transfer: jr NZ,l_usb_control_transfer_00102 ;source-doc/base-drv/./transfers.c:57: return USB_ERR_OTHER; ld l,0x0f - jp l_usb_control_transfer_00113 + jp l_usb_control_transfer_00114 l_usb_control_transfer_00102: -;source-doc/base-drv/./transfers.c:59: ch_set_usb_address(device_address); +;source-doc/base-drv/./transfers.c:59: critical_begin(); push bc + call _critical_begin ld l,(ix+8) call _ch_set_usb_address pop bc -;source-doc/base-drv/./transfers.c:61: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); +;source-doc/base-drv/./transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ld e,(ix+4) ld d,(ix+5) push bc @@ -160,25 +161,25 @@ l_usb_control_transfer_00102: call _ch_issue_token_setup call _ch_short_wait_int_and_get_stat pop bc -;source-doc/base-drv/./transfers.c:64: CHECK(result); +;source-doc/base-drv/./transfers.c:66: CHECK(result); ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:66: const uint16_t length = cmd_packet->wLength; +;source-doc/base-drv/./transfers.c:68: const uint16_t length = cmd_packet->wLength; ld hl,6 add hl, bc ld c, (hl) inc hl ld b, (hl) -;source-doc/base-drv/./transfers.c:69: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) +;source-doc/base-drv/./transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) ld a, b or c - jr Z,l_usb_control_transfer_00115 + jr Z,l_usb_control_transfer_00116 ld e,(ix+6) ld d,(ix+7) ld a,(ix-1) or a - jr Z,l_usb_control_transfer_00117 + jr Z,l_usb_control_transfer_00118 ld hl,0 add hl, sp push hl @@ -188,8 +189,8 @@ l_usb_control_transfer_00102: pop af pop af pop af - jr l_usb_control_transfer_00118 -l_usb_control_transfer_00117: + jr l_usb_control_transfer_00119 +l_usb_control_transfer_00118: ld hl,0 add hl, sp push hl @@ -199,59 +200,62 @@ l_usb_control_transfer_00117: pop af pop af pop af -l_usb_control_transfer_00118: - jr l_usb_control_transfer_00116 -l_usb_control_transfer_00115: -;source-doc/base-drv/./transfers.c:70: : USB_ERR_OK; - ld l,0x00 +l_usb_control_transfer_00119: + jr l_usb_control_transfer_00117 l_usb_control_transfer_00116: -;source-doc/base-drv/./transfers.c:72: CHECK(result) +;source-doc/base-drv/./transfers.c:72: : USB_ERR_OK; + ld l,0x00 +l_usb_control_transfer_00117: +;source-doc/base-drv/./transfers.c:74: CHECK(result) ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:74: if (transferIn) { +;source-doc/base-drv/./transfers.c:76: if (transferIn) { ld a,(ix-1) or a jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/./transfers.c:75: ch_command(CH_CMD_WR_HOST_DATA); +;source-doc/base-drv/./transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA); ld l,0x2c call _ch_command -;source-doc/base-drv/./transfers.c:76: CH376_DATA_PORT = 0; +;source-doc/base-drv/./transfers.c:78: CH376_DATA_PORT = 0; ld a,0x00 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./transfers.c:77: delay(); - call _delay -;source-doc/base-drv/./transfers.c:78: ch_issue_token_out_ep0(); +;source-doc/base-drv/./transfers.c:79: ch_issue_token_out_ep0(); call _ch_issue_token_out_ep0 -;source-doc/base-drv/./transfers.c:79: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ +;source-doc/base-drv/./transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/./transfers.c:81: if (result == USB_ERR_OK || result == USB_ERR_STALL) +;source-doc/base-drv/./transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { ld a, l or a jr Z,l_usb_control_transfer_00108 ld a, l sub 0x02 - jr NZ,l_usb_control_transfer_00109 + jr NZ,l_usb_control_transfer_00113 l_usb_control_transfer_00108: -;source-doc/base-drv/./transfers.c:82: return USB_ERR_OK; +;source-doc/base-drv/./transfers.c:83: result = USB_ERR_OK; ld l,0x00 +;source-doc/base-drv/./transfers.c:84: goto done; jr l_usb_control_transfer_00113 -l_usb_control_transfer_00109: -;source-doc/base-drv/./transfers.c:84: RETURN_CHECK(result); - jr l_usb_control_transfer_00113 +;source-doc/base-drv/./transfers.c:87: RETURN_CHECK(result); l_usb_control_transfer_00112: -;source-doc/base-drv/./transfers.c:87: ch_issue_token_in_ep0(); +;source-doc/base-drv/./transfers.c:90: ch_issue_token_in_ep0(); call _ch_issue_token_in_ep0 -;source-doc/base-drv/./transfers.c:88: result = ch_long_wait_int_and_get_status(); +;source-doc/base-drv/./transfers.c:91: result = ch_long_wait_int_and_get_status(); call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/./transfers.c:90: RETURN_CHECK(result); +;source-doc/base-drv/./transfers.c:95: done: l_usb_control_transfer_00113: -;source-doc/base-drv/./transfers.c:91: } +;source-doc/base-drv/./transfers.c:96: critical_end(); + push hl + call _critical_end + pop hl +;source-doc/base-drv/./transfers.c:97: return result; +l_usb_control_transfer_00114: +;source-doc/base-drv/./transfers.c:98: } ld sp, ix pop ix ret -;source-doc/base-drv/./transfers.c:94: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_in_trnsfer_ext ; --------------------------------- @@ -259,26 +263,26 @@ _usb_dat_in_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:95: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trnsfer_ext_00102 ld a,(ix+5) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/./transfers.c:96: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:103: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/./transfers.c:98: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/./transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+10) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/./transfers.c:99: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:106: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/./transfers.c:101: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/./transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -297,10 +301,10 @@ l_usb_dat_in_trnsfer_ext_00105: pop af inc sp l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/./transfers.c:102: } +;source-doc/base-drv/./transfers.c:109: } pop ix ret -;source-doc/base-drv/./transfers.c:105: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_in_trns_n_ext ; --------------------------------- @@ -308,34 +312,34 @@ _usb_dat_in_trns_n_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:106: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) +;source-doc/base-drv/./transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trns_n_ext_00102 ld a,(ix+5) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00102 -;source-doc/base-drv/./transfers.c:107: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:114: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00102: -;source-doc/base-drv/./transfers.c:109: if (((uint16_t)endpoint & 0xC000) == 0) +;source-doc/base-drv/./transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0) ld a,(ix+10) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00105 -;source-doc/base-drv/./transfers.c:110: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:117: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00105: -;source-doc/base-drv/./transfers.c:112: if (((uint16_t)buffer_size & 0xC000) == 0) +;source-doc/base-drv/./transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) ld a,(ix+7) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00107 -;source-doc/base-drv/./transfers.c:113: return USB_BAD_ADDRESS; +;source-doc/base-drv/./transfers.c:120: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00107: -;source-doc/base-drv/./transfers.c:115: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/./transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); ld c,(ix+6) ld b,(ix+7) ld l,(ix+9) @@ -354,10 +358,10 @@ l_usb_dat_in_trns_n_ext_00107: pop af inc sp l_usb_dat_in_trns_n_ext_00108: -;source-doc/base-drv/./transfers.c:116: } +;source-doc/base-drv/./transfers.c:123: } pop ix ret -;source-doc/base-drv/./transfers.c:128: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer ; --------------------------------- @@ -365,10 +369,12 @@ _usb_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:129: ch_set_usb_address(device_address); +;source-doc/base-drv/./transfers.c:136: critical_begin(); + call _critical_begin +;source-doc/base-drv/./transfers.c:138: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:131: return ch_data_in_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/./transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -382,10 +388,17 @@ _usb_data_in_transfer: pop af pop af pop af -;source-doc/base-drv/./transfers.c:132: } + ld a, l + ld (_result), a +;source-doc/base-drv/./transfers.c:142: critical_end(); + call _critical_end +;source-doc/base-drv/./transfers.c:144: return result; + ld hl,_result + ld l, (hl) +;source-doc/base-drv/./transfers.c:145: } pop ix ret -;source-doc/base-drv/./transfers.c:144: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- @@ -393,10 +406,12 @@ _usb_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:145: ch_set_usb_address(device_address); +;source-doc/base-drv/./transfers.c:158: critical_begin(); + call _critical_begin +;source-doc/base-drv/./transfers.c:160: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:147: return ch_data_in_transfer_n(buffer, buffer_size, endpoint); +;source-doc/base-drv/./transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -410,59 +425,17 @@ _usb_data_in_transfer_n: pop af pop af pop af -;source-doc/base-drv/./transfers.c:148: } - pop ix - ret -;source-doc/base-drv/./transfers.c:151: usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { -; --------------------------------- -; Function usb_dat_out_trns_ext -; --------------------------------- -_usb_dat_out_trns_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/./transfers.c:153: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - ld a,(ix+5) - or (ix+4) - jr Z,l_usb_dat_out_trns_ext_00102 - ld a,(ix+5) - sub 0x80 - jr NC,l_usb_dat_out_trns_ext_00102 -;source-doc/base-drv/./transfers.c:154: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_out_trns_ext_00106 -l_usb_dat_out_trns_ext_00102: -;source-doc/base-drv/./transfers.c:156: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) - ld a,(ix+10) - sub 0x80 - jr NC,l_usb_dat_out_trns_ext_00105 -;source-doc/base-drv/./transfers.c:157: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_out_trns_ext_00106 -l_usb_dat_out_trns_ext_00105: -;source-doc/base-drv/./transfers.c:159: return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint); - ld l,(ix+9) - ld h,(ix+10) - push hl - ld a,(ix+8) - push af - inc sp - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_data_out_transfer - pop af - pop af - pop af - inc sp -l_usb_dat_out_trns_ext_00106: -;source-doc/base-drv/./transfers.c:160: } + ld a, l + ld (_result), a +;source-doc/base-drv/./transfers.c:164: critical_end(); + call _critical_end +;source-doc/base-drv/./transfers.c:166: return result; + ld hl,_result + ld l, (hl) +;source-doc/base-drv/./transfers.c:167: } pop ix ret -;source-doc/base-drv/./transfers.c:172: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/./transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- @@ -470,10 +443,12 @@ _usb_data_out_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:173: ch_set_usb_address(device_address); +;source-doc/base-drv/./transfers.c:180: critical_begin(); + call _critical_begin +;source-doc/base-drv/./transfers.c:182: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:175: return ch_data_out_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/./transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -487,6 +462,13 @@ _usb_data_out_transfer: pop af pop af pop af -;source-doc/base-drv/./transfers.c:176: } + ld a, l + ld (_result), a +;source-doc/base-drv/./transfers.c:186: critical_end(); + call _critical_end +;source-doc/base-drv/./transfers.c:188: return result; + ld hl,_result + ld l, (hl) +;source-doc/base-drv/./transfers.c:189: } pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 5145ebfc..625480b2 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -68,21 +68,17 @@ _usb_host_bus_reset: call _ch_cmd_set_usb_mode ;source-doc/base-drv/./usb-init.c:16: delay_20ms(); call _delay_20ms -;source-doc/base-drv/./ch376.h:160: ch_command(CH_CMD_WRITE_VAR8); +;source-doc/base-drv/./ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); ld l,0x0b call _ch_command -;source-doc/base-drv/./ch376.h:161: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; +;source-doc/base-drv/./ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; ld a,0x25 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.h:162: delay(); - call _delay -;source-doc/base-drv/./ch376.h:163: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); +;source-doc/base-drv/./ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.h:164: delay(); - call _delay ;source-doc/base-drv/./usb-init.c:20: return USB_ERR_OK; ld l,0x00 ;source-doc/base-drv/./usb-init.c:21: } diff --git a/Source/HBIOS/ch376-native/cruntime.asm b/Source/HBIOS/ch376-native/cruntime.asm index 29e2060e..85904a82 100644 --- a/Source/HBIOS/ch376-native/cruntime.asm +++ b/Source/HBIOS/ch376-native/cruntime.asm @@ -27,26 +27,6 @@ _memset_callee: pop hl ret -; _strlen_fastcall: - -; ; enter: hl = char *s -; ; -; ; exit : hl = length -; ; bc = -(length + 1) -; ; a = 0 -; ; z flag set if 0 length -; ; carry reset -; ; -; ; uses : af, bc, hl - -; xor a -; ld c,a -; ld b,a -; cpir -; ld hl,$ffff -; sbc hl,bc - -; ret _memcpy_callee: @@ -84,51 +64,83 @@ zero_n: pop hl ret -; _strcat_callee: -; pop hl -; pop de -; ex (sp),hl +; ; =============================================================== +; ; Stefano Bodrato +; ; aralbrec: accommodate nmos z80 bug +; ; =============================================================== +; ; +; ; void z80_push_di(void) +; ; +; ; Save the current ei/di status on the stack and disable ints. +; ; +; ; =============================================================== - -; ; enter : hl = char *s2 = src -; ; de = char *s1 = dst -; ; -; ; exit : hl = char *s1 = dst -; ; de = ptr in s1 to terminating 0 +; ____sdcc_cpu_push_di: + +; ; exit : stack = ei_di_status ; ; -; ; uses : af, bc, de, hl +; ; uses : af -; push de ; save dst +; ex (sp),hl +; push hl + +; ld a,i + +; di + +; push af +; pop hl ; hl = ei_di status + +; pop af ; af = ret +; ex (sp),hl ; restore hl, push ei_di_status + +; push af -; ex de,hl -; call __str_locate_nul ; a = 0 -; ex de,hl +; ret -; loop: ; append s2 to s1 -; cp (hl) -; ldi -; jr NZ,loop -; ENDIF +; ; =============================================================== +; ; Stefano Bodrato +; ; =============================================================== +; ; +; ; void z80_pop_ei(void) +; ; +; ; Pop the ei_di_status from the stack and restore the di/ei +; ; state to what it was previously when a push was called. +; ; +; ; The "ei" in the function name has no bearing on what the +; ; function does; the name is meant to balance "z80_push_di". +; ; +; ; =============================================================== -; pop hl ; hl = dst -; dec de -; ret +; ____sdcc_cpu_pop_ei: -; __str_locate_nul: -; ; enter : hl = char *s +; ; enter : stack = ei_di_status, ret ; ; -; ; exit : hl = ptr in s to terminating 0 -; ; bc = -(strlen + 1) -; ; a = 0 -; ; carry reset +; ; uses : af + +; ex (sp),hl +; pop af ; af = old hl + +; ex (sp),hl ; hl = ei_di_status +; push af + +; ex (sp),hl ; hl restored + +; ____sdcc_cpu_pop_ei_jp: +; ; enter : stack = ret, ei_di_status ; ; -; ; uses : af, bc, hl +; ; uses : af + +; pop af ; af = ei_di_status + +; jp PO, di_state + +; ei_state: +; ei +; ret -; xor a -; ld c,a -; ld b,a -; cpir -; dec hl +; di_state: +; di ; ret diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 5e459709..cc9a7b76 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -1,3 +1,4 @@ ; Generated File -- not to be modify directly #include "ch376-native/keyboard/kyb-init.c.s" #include "ch376-native/keyboard/class_hid.c.s" +#include "ch376-native/keyboard/class_hid_keyboard.c.s" diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s index 38fa0e15..73072f3e 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s @@ -61,7 +61,7 @@ _hid_set_protocol: push af push af ex de, hl -;source-doc/keyboard/./class_hid.c:9: cmd = cmd_hid_set; +;source-doc/keyboard/./class_hid.c:8: cmd = cmd_hid_set; push de ex de, hl ld hl,2 @@ -71,12 +71,12 @@ _hid_set_protocol: ld bc,0x0008 ldir pop de -;source-doc/keyboard/./class_hid.c:11: cmd.bRequest = HID_SET_PROTOCOL; +;source-doc/keyboard/./class_hid.c:10: cmd.bRequest = HID_SET_PROTOCOL; ld (ix-7),0x0b -;source-doc/keyboard/./class_hid.c:12: cmd.bValue[0] = protocol; +;source-doc/keyboard/./class_hid.c:11: cmd.bValue[0] = protocol; ld a,(ix+4) ld (ix-6),a -;source-doc/keyboard/./class_hid.c:14: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); +;source-doc/keyboard/./class_hid.c:13: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); ld l, e ld h, d inc hl @@ -103,8 +103,7 @@ _hid_set_protocol: pop af pop af ld a, l -;source-doc/keyboard/./class_hid.c:16: RETURN_CHECK(result); -;source-doc/keyboard/./class_hid.c:17: } +;source-doc/keyboard/./class_hid.c:14: } ld sp, ix pop ix pop hl @@ -118,7 +117,7 @@ _cmd_hid_set: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/keyboard/./class_hid.c:19: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { +;source-doc/keyboard/./class_hid.c:16: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { ; --------------------------------- ; Function hid_set_idle ; --------------------------------- @@ -131,7 +130,7 @@ _hid_set_idle: push af push af ex de, hl -;source-doc/keyboard/./class_hid.c:22: cmd = cmd_hid_set; +;source-doc/keyboard/./class_hid.c:18: cmd = cmd_hid_set; push de ex de, hl ld hl,2 @@ -141,12 +140,12 @@ _hid_set_idle: ld bc,0x0008 ldir pop de -;source-doc/keyboard/./class_hid.c:24: cmd.bRequest = HID_SET_IDLE; +;source-doc/keyboard/./class_hid.c:20: cmd.bRequest = HID_SET_IDLE; ld (ix-7),0x0a -;source-doc/keyboard/./class_hid.c:25: cmd.bValue[0] = duration; +;source-doc/keyboard/./class_hid.c:21: cmd.bValue[0] = duration; ld a,(ix+4) ld (ix-6),a -;source-doc/keyboard/./class_hid.c:27: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); +;source-doc/keyboard/./class_hid.c:23: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); ld l, e ld h, d inc hl @@ -173,14 +172,13 @@ _hid_set_idle: pop af pop af ld a, l -;source-doc/keyboard/./class_hid.c:29: RETURN_CHECK(result); -;source-doc/keyboard/./class_hid.c:30: } +;source-doc/keyboard/./class_hid.c:24: } ld sp, ix pop ix pop hl inc sp jp (hl) -;source-doc/keyboard/./class_hid.c:32: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { +;source-doc/keyboard/./class_hid.c:26: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { ; --------------------------------- ; Function hid_get_input_report ; --------------------------------- @@ -195,7 +193,7 @@ _hid_get_input_report: ld sp, hl ld l, c ld h, b -;source-doc/keyboard/./class_hid.c:35: cmd = cmd_hid_set; +;source-doc/keyboard/./class_hid.c:28: cmd = cmd_hid_set; push de push hl ex de, hl @@ -207,19 +205,19 @@ _hid_get_input_report: ldir pop bc pop de -;source-doc/keyboard/./class_hid.c:37: cmd.bmRequestType = 0xA1; +;source-doc/keyboard/./class_hid.c:30: cmd.bmRequestType = 0xA1; ld (ix-9),0xa1 -;source-doc/keyboard/./class_hid.c:38: cmd.bValue[0] = 1; +;source-doc/keyboard/./class_hid.c:31: cmd.bValue[0] = 1; ld (ix-7),0x01 -;source-doc/keyboard/./class_hid.c:39: cmd.bValue[1] = 1; +;source-doc/keyboard/./class_hid.c:32: cmd.bValue[1] = 1; ld (ix-6),0x01 -;source-doc/keyboard/./class_hid.c:40: cmd.bRequest = HID_GET_REPORT; +;source-doc/keyboard/./class_hid.c:33: cmd.bRequest = HID_GET_REPORT; ld (ix-8),0x01 -;source-doc/keyboard/./class_hid.c:41: cmd.wLength = 8; +;source-doc/keyboard/./class_hid.c:34: cmd.wLength = 8; ld (ix-3),0x08 xor a ld (ix-2),a -;source-doc/keyboard/./class_hid.c:43: result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); +;source-doc/keyboard/./class_hid.c:36: return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); ld l, c ld h, b inc hl @@ -247,8 +245,7 @@ _hid_get_input_report: pop af pop af ld a, l -;source-doc/keyboard/./class_hid.c:45: RETURN_CHECK(result); -;source-doc/keyboard/./class_hid.c:46: } +;source-doc/keyboard/./class_hid.c:37: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s new file mode 100644 index 00000000..84695f4c --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -0,0 +1,343 @@ +; +; Generated from source-doc/keyboard/./class_hid_keyboard.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_scancodes_shift_table: + DEFS 128 +_scancodes_table: + DEFS 128 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/keyboard/./class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { +; --------------------------------- +; Function scancode_to_char +; --------------------------------- +_scancode_to_char: + ld c, a + ld e, l +;source-doc/keyboard/./class_hid_keyboard.c:336: if (code >= 0x80) + ld a, e + sub 0x80 + jr C,l_scancode_to_char_00102 +;source-doc/keyboard/./class_hid_keyboard.c:337: return 0; + xor a + jr l_scancode_to_char_00105 +l_scancode_to_char_00102: +;source-doc/keyboard/./class_hid_keyboard.c:339: if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) + ld a, c + and 0x22 + jr Z,l_scancode_to_char_00104 +;source-doc/keyboard/./class_hid_keyboard.c:340: return scancodes_shift_table[code]; + ld hl,_scancodes_shift_table + ld d,0x00 + add hl, de + ld a, (hl) + jr l_scancode_to_char_00105 +l_scancode_to_char_00104: +;source-doc/keyboard/./class_hid_keyboard.c:342: return scancodes_table[code]; + ld hl,_scancodes_table + ld d,0x00 + add hl, de + ld a, (hl) +l_scancode_to_char_00105: +;source-doc/keyboard/./class_hid_keyboard.c:343: } + ret +_scancodes_shift_table: + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x41 + DEFB +0x42 + DEFB +0x43 + DEFB +0x44 + DEFB +0x45 + DEFB +0x46 + DEFB +0x47 + DEFB +0x48 + DEFB +0x49 + DEFB +0x4a + DEFB +0x4b + DEFB +0x4c + DEFB +0x4d + DEFB +0x4e + DEFB +0x4f + DEFB +0x50 + DEFB +0x51 + DEFB +0x52 + DEFB +0x53 + DEFB +0x54 + DEFB +0x55 + DEFB +0x56 + DEFB +0x57 + DEFB +0x58 + DEFB +0x59 + DEFB +0x5a + DEFB +0x21 + DEFB +0x40 + DEFB +0x23 + DEFB +0x24 + DEFB +0x25 + DEFB +0x5e + DEFB +0x26 + DEFB +0x2a + DEFB +0x28 + DEFB +0x29 + DEFB +0x0d + DEFB +0x1b + DEFB +0x08 + DEFB +0x09 + DEFB +0x20 + DEFB +0x5f + DEFB +0x2b + DEFB +0x7b + DEFB +0x7d + DEFB +0x7c + DEFB +0x7e + DEFB +0x3a + DEFB +0x22 + DEFB +0x7e + DEFB +0x3c + DEFB +0x3e + DEFB +0x3f + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x2f + DEFB +0x2a + DEFB +0x2d + DEFB +0x2b + DEFB +0x0d + DEFB +0x31 + DEFB +0x32 + DEFB +0x33 + DEFB +0x34 + DEFB +0x35 + DEFB +0x36 + DEFB +0x37 + DEFB +0x38 + DEFB +0x39 + DEFB +0x30 + DEFB +0x2e + DEFB +0x5c + DEFB +0x00 + DEFB +0x00 + DEFB +0x3d + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_scancodes_table: + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x61 + DEFB +0x62 + DEFB +0x63 + DEFB +0x64 + DEFB +0x65 + DEFB +0x66 + DEFB +0x67 + DEFB +0x68 + DEFB +0x69 + DEFB +0x6a + DEFB +0x6b + DEFB +0x6c + DEFB +0x6d + DEFB +0x6e + DEFB +0x6f + DEFB +0x70 + DEFB +0x71 + DEFB +0x72 + DEFB +0x73 + DEFB +0x74 + DEFB +0x75 + DEFB +0x76 + DEFB +0x77 + DEFB +0x78 + DEFB +0x79 + DEFB +0x7a + DEFB +0x31 + DEFB +0x32 + DEFB +0x33 + DEFB +0x34 + DEFB +0x35 + DEFB +0x36 + DEFB +0x37 + DEFB +0x38 + DEFB +0x39 + DEFB +0x30 + DEFB +0x0d + DEFB +0x1b + DEFB +0x08 + DEFB +0x09 + DEFB +0x20 + DEFB +0x2d + DEFB +0x3d + DEFB +0x5b + DEFB +0x5d + DEFB +0x5c + DEFB +0x23 + DEFB +0x3b + DEFB +0x27 + DEFB +0x60 + DEFB +0x2c + DEFB +0x2e + DEFB +0x2f + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x2f + DEFB +0x2a + DEFB +0x2d + DEFB +0x2b + DEFB +0x0d + DEFB +0x31 + DEFB +0x32 + DEFB +0x33 + DEFB +0x34 + DEFB +0x35 + DEFB +0x36 + DEFB +0x37 + DEFB +0x38 + DEFB +0x39 + DEFB +0x30 + DEFB +0x2e + DEFB +0x5c + DEFB +0x00 + DEFB +0x00 + DEFB +0x3d + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index ac8491a6..86a694de 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -33,6 +33,18 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk +_keyboard_config: + DEFS 2 +_buffer: + DEFS 16 +_write_index: + DEFS 1 +_read_index: + DEFS 1 +_active: + DEFS 1 +_report: + DEFS 8 #ENDIF @@ -48,76 +60,81 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/./kyb-init.c:8: void keyboard_init(void) { +;source-doc/keyboard/./kyb-init.c:11: void keyboard_init(void) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/./kyb-init.c:10: uint8_t index = 1; -;source-doc/keyboard/./kyb-init.c:11: do { - ld bc,0x0101 +;source-doc/keyboard/./kyb-init.c:13: uint8_t index = 1; + ld c,0x01 +;source-doc/keyboard/./kyb-init.c:14: keyboard_config = NULL; + xor a + ld hl,_keyboard_config + ld (hl), a + inc hl + ld (hl), a +;source-doc/keyboard/./kyb-init.c:16: do { + ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/./kyb-init.c:12: device_config_keyboard *const keyboard_config = (device_config_keyboard *)get_usb_device_config(index); +;source-doc/keyboard/./kyb-init.c:17: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); push bc ld a, b call _get_usb_device_config + ex de, hl pop bc -;source-doc/keyboard/./kyb-init.c:14: if (keyboard_config == NULL) - ld a, d - or e + ld (_keyboard_config), hl +;source-doc/keyboard/./kyb-init.c:19: if (keyboard_config == NULL) + ld hl,_keyboard_config + 1 + ld a, (hl) + dec hl + or (hl) jr Z,l_keyboard_init_00107 -;source-doc/keyboard/./kyb-init.c:17: const usb_device_type t = keyboard_config->type; - ld l, e - ld h, d +;source-doc/keyboard/./kyb-init.c:22: const usb_device_type t = keyboard_config->type; + ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/./kyb-init.c:19: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/./kyb-init.c:24: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/./kyb-init.c:20: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/./kyb-init.c:25: print_string("\r\nUSB: KEYBOARD @ $"); push bc - push de ld hl,kyb_init_str_0 call _print_string - pop de pop bc -;source-doc/keyboard/./kyb-init.c:21: print_uint16(index); +;source-doc/keyboard/./kyb-init.c:26: print_uint16(index); ld h,0x00 - push de ld l, c call _print_uint16 +;source-doc/keyboard/./kyb-init.c:27: print_string(" $"); ld hl,kyb_init_str_1 call _print_string - pop de -;source-doc/keyboard/./kyb-init.c:25: hid_set_protocol(keyboard_config, 1); - push de +;source-doc/keyboard/./kyb-init.c:29: hid_set_protocol(keyboard_config, 1); ld a,0x01 push af inc sp - ex de,hl + ld hl, (_keyboard_config) call _hid_set_protocol - pop de -;source-doc/keyboard/./kyb-init.c:26: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/./kyb-init.c:30: hid_set_idle(keyboard_config, 0x80); ld a,0x80 push af inc sp - ex de, hl + ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/./kyb-init.c:27: return; +;source-doc/keyboard/./kyb-init.c:31: return; jr l_keyboard_init_00108 l_keyboard_init_00106: -;source-doc/keyboard/./kyb-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/keyboard/./kyb-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc b ld a,b ld c,a sub 0x07 jr NZ,l_keyboard_init_00105 l_keyboard_init_00107: -;source-doc/keyboard/./kyb-init.c:31: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/./kyb-init.c:35: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 jp _print_string l_keyboard_init_00108: -;source-doc/keyboard/./kyb-init.c:32: } +;source-doc/keyboard/./kyb-init.c:36: } ret kyb_init_str_0: DEFB 0x0d @@ -132,3 +149,256 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 +;source-doc/keyboard/./kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +; --------------------------------- +; Function keyboard_buf_put +; --------------------------------- +_keyboard_buf_put: + push ix + ld ix,0 + add ix,sp +;source-doc/keyboard/./kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) + ld a,(ix+5) + sub 0x80 + jr NC,l_keyboard_buf_put_00106 + ld a,(ix+5) + or a +;source-doc/keyboard/./kyb-init.c:50: return; // ignore ??? + jr Z,l_keyboard_buf_put_00106 +;source-doc/keyboard/./kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld a,(_write_index) + inc a + and 0x07 + ld b, a +;source-doc/keyboard/./kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full + ld a,(_read_index) + sub b + jr Z,l_keyboard_buf_put_00106 +;source-doc/keyboard/./kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; + ld de,_buffer+0 + ld hl,_write_index + ld l, (hl) + ld h,0x00 + add hl, hl + add hl, de + ld a,(ix+4) + ld (hl), a +;source-doc/keyboard/./kyb-init.c:55: buffer[write_index].key_code = key_code; + ld hl,_write_index + ld l, (hl) + ld h,0x00 + add hl, hl + add hl, de + ex de, hl + inc de + ld a,(ix+5) + ld (de), a +;source-doc/keyboard/./kyb-init.c:56: write_index = next_write_index; + ld hl,_write_index + ld (hl), b +l_keyboard_buf_put_00106: +;source-doc/keyboard/./kyb-init.c:58: } + pop ix + ret +;source-doc/keyboard/./kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { +; --------------------------------- +; Function keyboard_buf_size +; --------------------------------- +_keyboard_buf_size: +;source-doc/keyboard/./kyb-init.c:61: if (write_index >= read_index) + ld a,(_write_index) + ld hl,_read_index + sub (hl) + jr C,l_keyboard_buf_size_00102 +;source-doc/keyboard/./kyb-init.c:62: return write_index - read_index; + ld a,(_write_index) + ld hl,_read_index + sub (hl) + jr l_keyboard_buf_size_00103 +l_keyboard_buf_size_00102: +;source-doc/keyboard/./kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; + ld hl,_read_index + ld c, (hl) + ld a,0x08 + sub c + ld hl,_write_index + ld c, (hl) + add a, c +l_keyboard_buf_size_00103: +;source-doc/keyboard/./kyb-init.c:65: } + ret +;source-doc/keyboard/./kyb-init.c:67: uint32_t keyboard_buf_get_next() { +; --------------------------------- +; Function keyboard_buf_get_next +; --------------------------------- +_keyboard_buf_get_next: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/keyboard/./kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty + ld a,(_write_index) + ld hl,_read_index + sub (hl) + jr NZ,l_keyboard_buf_get_next_00102 +;source-doc/keyboard/./kyb-init.c:69: return 255 << 8; + ld hl,0xff00 + ld e, h + ld d, h + jr l_keyboard_buf_get_next_00103 +l_keyboard_buf_get_next_00102: +;source-doc/keyboard/./kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; + ld bc,_buffer+0 + ld hl,_read_index + ld l, (hl) + ld h,0x00 + add hl, hl + add hl, bc + ld d, (hl) +;source-doc/keyboard/./kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; + inc hl + ld e, (hl) +;source-doc/keyboard/./kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld hl,_read_index + ld a, (hl) + inc a + and 0x07 + ld (hl), a +;source-doc/keyboard/./kyb-init.c:74: const unsigned char c = scancode_to_char(modifier_key, key_code); + push de + ld l, e + ld a, d + call _scancode_to_char + pop de +;source-doc/keyboard/./kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; + ld (ix-1),d + ld (ix-4),0x00 + ld (ix-3),0x00 + ld (ix-2),0x00 + ld l, a + ld a,(ix-1) + ld (ix-4),e + ld (ix-3),0x00 + ld (ix-2),0x00 + ld (ix-1),0x00 + pop de + push de + ld h, a + ex de, hl +l_keyboard_buf_get_next_00103: +;source-doc/keyboard/./kyb-init.c:77: } + ld sp, ix + pop ix + ret +;source-doc/keyboard/./kyb-init.c:79: void keyboard_buf_flush() { +; --------------------------------- +; Function keyboard_buf_flush +; --------------------------------- +_keyboard_buf_flush: +;source-doc/keyboard/./kyb-init.c:80: write_index = 0; + ld hl,_write_index + ld (hl),0x00 +;source-doc/keyboard/./kyb-init.c:81: read_index = 0; + ld hl,_read_index + ld (hl),0x00 +;source-doc/keyboard/./kyb-init.c:82: } + ret +;source-doc/keyboard/./kyb-init.c:88: void keyboard_tick(void) { +; --------------------------------- +; Function keyboard_tick +; --------------------------------- +_keyboard_tick: +;source-doc/keyboard/./kyb-init.c:89: if (is_in_critical_section()) + ld hl,_in_critical_usb_section + ld a, (hl) + or a +;source-doc/keyboard/./kyb-init.c:90: return; + ret NZ +;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); + ld l,0x0b + call _ch_command +;././source-doc/base-drv//ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c),a +;././source-doc/base-drv//ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); + ld a,0x1f + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/keyboard/./kyb-init.c:93: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); + ld bc,_report + ld hl, (_keyboard_config) + ld a,0x08 + push af + inc sp + push bc + push hl + call _usbdev_dat_in_trnsfer_0 + pop af + pop af + inc sp + ld a, l + ld (_result), a +;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); + ld l,0x0b + call _ch_command +;././source-doc/base-drv//ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c),a +;././source-doc/base-drv//ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/keyboard/./kyb-init.c:95: if (result == 0) + ld hl,_result + ld a, (hl) + or a + ret NZ +;source-doc/keyboard/./kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); + ld a, (_report + 2) + ld hl,_report + 0 + ld b, (hl) + push af + inc sp + push bc + inc sp + call _keyboard_buf_put + pop af +;source-doc/keyboard/./kyb-init.c:97: } + ret +_keyboard_config: + DEFW +0x0000 +_buffer: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_write_index: + DEFB +0x00 +_read_index: + DEFB +0x00 +_active: + DEFB +0x00 +_report: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 58af4d5a..ede7d8ac 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -62,7 +62,7 @@ _cbw: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/./class_scsi.c:11: usb_error do_scsi_cmd(device_config_storage *const dev, +;source-doc/scsi-drv/./class_scsi.c:12: usb_error do_scsi_cmd(device_config_storage *const dev, ; --------------------------------- ; Function do_scsi_cmd ; --------------------------------- @@ -70,10 +70,10 @@ _do_scsi_cmd: push ix ld ix,0 add ix,sp - ld hl, -10 + ld hl, -8 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:16: cbw->dCBWTag[0] = next_tag++; +;source-doc/scsi-drv/./class_scsi.c:17: cbw->dCBWTag[0] = next_tag++; ld c,(ix+6) ld b,(ix+7) ld hl,0x0004 @@ -91,25 +91,29 @@ _do_scsi_cmd: ld (hl), e inc hl ld (hl), d -;source-doc/scsi-drv/./class_scsi.c:18: if (!send) +;source-doc/scsi-drv/./class_scsi.c:19: if (!send) bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00102 -;source-doc/scsi-drv/./class_scsi.c:19: cbw->bmCBWFlags = 0x80; +;source-doc/scsi-drv/./class_scsi.c:20: cbw->bmCBWFlags = 0x80; ld hl,0x000c add hl, bc ld (hl),0x80 l_do_scsi_cmd_00102: -;source-doc/scsi-drv/./class_scsi.c:22: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/./class_scsi.c:22: critical_begin(); + push bc + call _critical_begin + pop bc +;source-doc/scsi-drv/./class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT])); ld a,(ix+4) - ld (ix-8),a + ld (ix-6),a ld a,(ix+5) - ld (ix-7),a - ld a,(ix-8) + ld (ix-5),a + ld a,(ix-6) add a,0x03 - ld (ix-6),a - ld a,(ix-7) + ld (ix-4),a + ld a,(ix-5) adc a,0x00 - ld (ix-5),a + ld (ix-3),a pop de pop hl push hl @@ -123,8 +127,8 @@ l_do_scsi_cmd_00102: ld e,(ix+6) ld d,(ix+7) push bc - ld l,(ix-6) - ld h,(ix-5) + ld l,(ix-4) + ld h,(ix-3) push hl push af inc sp @@ -139,63 +143,53 @@ l_do_scsi_cmd_00102: pop bc ld a, l ld (_result), a - ld hl,_result - ld a, (hl) + ld a,(_result) or a - jr Z,l_do_scsi_cmd_00104 - ld l, (hl) - jp l_do_scsi_cmd_00119 -l_do_scsi_cmd_00104: -;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) { + jp NZ, l_do_scsi_cmd_00120 +;source-doc/scsi-drv/./class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { ld hl,8 add hl, bc - ld c, (hl) - inc hl - ld b, (hl) - inc hl ld e, (hl) inc hl ld d, (hl) -;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); - ld a,(ix-8) + inc hl + ld c, (hl) + inc hl + ld b, (hl) +;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); + ld a,(ix-6) add a,0x06 - ld (ix-4),a - ld a,(ix-7) + ld (ix-2),a + ld a,(ix-5) adc a,0x00 - ld (ix-3),a -;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) { - ld a, d - or e - or b + ld (ix-1),a +;source-doc/scsi-drv/./class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { + ld a, b or c + or d + or e jr Z,l_do_scsi_cmd_00113 -;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); - ld (ix-2),c - ld (ix-1),b +;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); ld c,(ix+8) ld b,(ix+9) -;source-doc/scsi-drv/./class_scsi.c:25: if (!send) { +;source-doc/scsi-drv/./class_scsi.c:28: if (!send) { bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 -;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN])); - pop de - pop hl - push hl - push de +;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); + ld l,(ix-6) + ld h,(ix-5) ld a, (hl) rlca rlca rlca rlca and 0x0f - ld l,(ix-4) - ld h,(ix-3) - push hl - push af - inc sp ld l,(ix-2) ld h,(ix-1) push hl + push af + inc sp + push de push bc call _usb_data_in_transfer pop af @@ -204,32 +198,26 @@ l_do_scsi_cmd_00104: inc sp ld a, l ld (_result), a - ld hl,_result - ld a, (hl) + ld a,(_result) or a jr Z,l_do_scsi_cmd_00113 - ld l, (hl) - jp l_do_scsi_cmd_00119 + jp l_do_scsi_cmd_00120 l_do_scsi_cmd_00110: -;source-doc/scsi-drv/./class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_OUT])); - pop de - pop hl - push hl - push de +;source-doc/scsi-drv/./class_scsi.c:34: &dev->endpoints[ENDPOINT_BULK_OUT])); + ld l,(ix-6) + ld h,(ix-5) ld a, (hl) rlca rlca rlca rlca and 0x0f - ld l,(ix-6) - ld h,(ix-5) + ld l,(ix-4) + ld h,(ix-3) push hl push af inc sp - ld l,(ix-2) - ld h,(ix-1) - push hl + push de push bc call _usb_data_out_transfer pop af @@ -238,14 +226,11 @@ l_do_scsi_cmd_00110: inc sp ld a, l ld (_result), a - ld hl,_result - ld a, (hl) + ld a,(_result) or a - jr Z,l_do_scsi_cmd_00113 - ld l, (hl) - jr l_do_scsi_cmd_00119 + jr NZ,l_do_scsi_cmd_00120 l_do_scsi_cmd_00113: -;source-doc/scsi-drv/./class_scsi.c:36: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/./class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); pop de pop hl push hl @@ -257,8 +242,8 @@ l_do_scsi_cmd_00113: rlca and 0x0f ld b, a - ld l,(ix-4) - ld h,(ix-3) + ld l,(ix-2) + ld h,(ix-1) push hl push bc inc sp @@ -273,14 +258,10 @@ l_do_scsi_cmd_00113: inc sp ld a, l ld (_result), a - ld hl,_result - ld a, (hl) + ld a,(_result) or a - jr Z,l_do_scsi_cmd_00115 - ld l, (hl) - jr l_do_scsi_cmd_00119 -l_do_scsi_cmd_00115: -;source-doc/scsi-drv/./class_scsi.c:38: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) + jr NZ,l_do_scsi_cmd_00120 +;source-doc/scsi-drv/./class_scsi.c:41: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) ld a, (_csw + 12) or a jr Z,l_do_scsi_cmd_00117 @@ -294,18 +275,26 @@ l_do_scsi_cmd_00115: cp a sbc hl, bc jr Z,l_do_scsi_cmd_00117 -;source-doc/scsi-drv/./class_scsi.c:39: return USB_ERR_FAIL; - ld l,0x0e - jr l_do_scsi_cmd_00119 +;source-doc/scsi-drv/./class_scsi.c:42: result = USB_ERR_FAIL; + ld hl,_result + ld (hl),0x0e + jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00117: -;source-doc/scsi-drv/./class_scsi.c:41: return USB_ERR_OK; - ld l,0x00 -l_do_scsi_cmd_00119: -;source-doc/scsi-drv/./class_scsi.c:42: } +;source-doc/scsi-drv/./class_scsi.c:44: result = USB_ERR_OK; + ld hl,_result + ld (hl),0x00 +;source-doc/scsi-drv/./class_scsi.c:46: done: +l_do_scsi_cmd_00120: +;source-doc/scsi-drv/./class_scsi.c:47: critical_end(); + call _critical_end +;source-doc/scsi-drv/./class_scsi.c:48: return result; + ld hl,_result + ld l, (hl) +;source-doc/scsi-drv/./class_scsi.c:49: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:46: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +;source-doc/scsi-drv/./class_scsi.c:53: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { ; --------------------------------- ; Function get_scsi_read_capacity ; --------------------------------- @@ -316,31 +305,31 @@ _get_scsi_read_capacity: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:48: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:49: cbw_scsi.read_capacity = scsi_read_capacity; +;source-doc/scsi-drv/./class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity; ld hl,15 add hl, sp ex de, hl ld hl,_scsi_read_capacity ld bc,0x000c ldir -;source-doc/scsi-drv/./class_scsi.c:51: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:52: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); +;source-doc/scsi-drv/./class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:53: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); +;source-doc/scsi-drv/./class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); ld (ix-19),0x08 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/./class_scsi.c:55: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +;source-doc/scsi-drv/./class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -354,11 +343,11 @@ _get_scsi_read_capacity: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:56: } +;source-doc/scsi-drv/./class_scsi.c:63: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:60: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { +;source-doc/scsi-drv/./class_scsi.c:67: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { ; --------------------------------- ; Function scsi_inquiry ; --------------------------------- @@ -369,31 +358,31 @@ _scsi_inquiry: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:62: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:63: cbw_scsi.inquiry = scsi_packet_inquiry; +;source-doc/scsi-drv/./class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry; ld hl,15 add hl, sp ex de, hl ld hl,_scsi_packet_inquiry ld bc,0x000c ldir -;source-doc/scsi-drv/./class_scsi.c:65: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:66: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +;source-doc/scsi-drv/./class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:67: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; +;source-doc/scsi-drv/./class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; ld (ix-19),0x24 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/./class_scsi.c:69: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +;source-doc/scsi-drv/./class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -407,11 +396,11 @@ _scsi_inquiry: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:70: } +;source-doc/scsi-drv/./class_scsi.c:77: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:72: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/./class_scsi.c:79: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -422,14 +411,14 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:74: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:75: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/./class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,15 add hl, sp ld b,0x0c @@ -437,11 +426,11 @@ l_scsi_test_00103: ld (hl),0x00 inc hl djnz l_scsi_test_00103 -;source-doc/scsi-drv/./class_scsi.c:77: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:78: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/./class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:79: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/./class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,8 add hl, sp ex de, hl @@ -453,7 +442,7 @@ l_scsi_test_00103: ld (de), a inc de ld (de), a -;source-doc/scsi-drv/./class_scsi.c:81: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/./class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -466,11 +455,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:82: } +;source-doc/scsi-drv/./class_scsi.c:89: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:86: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/./class_scsi.c:93: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -481,31 +470,31 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:88: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:89: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/./class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,15 add hl, sp ex de, hl ld hl,_scsi_packet_request_sense ld bc,0x000c ldir -;source-doc/scsi-drv/./class_scsi.c:91: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:92: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/./class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:93: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/./class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld (ix-19),0x12 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/./class_scsi.c:95: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/./class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -519,11 +508,11 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:96: } +;source-doc/scsi-drv/./class_scsi.c:103: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:98: usb_error scsi_sense_init(device_config_storage *const dev) { +;source-doc/scsi-drv/./class_scsi.c:105: usb_error scsi_sense_init(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_sense_init ; --------------------------------- @@ -534,7 +523,9 @@ _scsi_sense_init: ld hl, -18 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:102: while ((result = scsi_test(dev)) && --counter > 0) +;source-doc/scsi-drv/./class_scsi.c:109: critical_begin(); + call _critical_begin +;source-doc/scsi-drv/./class_scsi.c:110: while ((result = scsi_test(dev)) && --counter > 0) ld c,0x03 l_scsi_sense_init_00102: push bc @@ -550,7 +541,7 @@ l_scsi_sense_init_00102: jr Z,l_scsi_sense_init_00104 dec c jr Z,l_scsi_sense_init_00104 -;source-doc/scsi-drv/./class_scsi.c:103: scsi_request_sense(dev, &response); +;source-doc/scsi-drv/./class_scsi.c:111: scsi_request_sense(dev, &response); push bc ld hl,2 add hl, sp @@ -564,14 +555,16 @@ l_scsi_sense_init_00102: pop bc jr l_scsi_sense_init_00102 l_scsi_sense_init_00104: -;source-doc/scsi-drv/./class_scsi.c:105: return result; +;source-doc/scsi-drv/./class_scsi.c:112: critical_end(); + call _critical_end +;source-doc/scsi-drv/./class_scsi.c:114: return result; ld hl,_result ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:106: } +;source-doc/scsi-drv/./class_scsi.c:115: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:110: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/./class_scsi.c:119: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -580,36 +573,36 @@ _scsi_read: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/./class_scsi.c:111: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/./class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld hl,_cbw ld b,0x1b l_scsi_read_00112: ld (hl),0x00 inc hl djnz l_scsi_read_00112 -;source-doc/scsi-drv/./class_scsi.c:112: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper; ld de,_cbw ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:114: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:123: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/./class_scsi.c:115: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/./class_scsi.c:124: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/./class_scsi.c:116: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/./class_scsi.c:125: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld ((_cbw + 8)), hl ld h, l ld ((_cbw + 8)+2), hl -;source-doc/scsi-drv/./class_scsi.c:118: cbw.scsi_cmd.operation_code = 0x28; // read operation +;source-doc/scsi-drv/./class_scsi.c:127: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/./class_scsi.c:119: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/./class_scsi.c:128: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/./class_scsi.c:120: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/./class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld c,(ix+4) ld b,(ix+5) ld hl,0x000c @@ -622,7 +615,7 @@ l_scsi_read_00112: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/./class_scsi.c:121: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/./class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; pop hl push hl inc hl @@ -631,19 +624,19 @@ l_scsi_read_00112: dec hl ld a, (hl) ld ((_cbw + 18)),a -;source-doc/scsi-drv/./class_scsi.c:122: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/./class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; pop hl push hl inc hl ld d, (hl) ld hl, +(_cbw + 19) ld (hl), d -;source-doc/scsi-drv/./class_scsi.c:123: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/./class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba; pop hl push hl ld a, (hl) ld ((_cbw + 20)),a -;source-doc/scsi-drv/./class_scsi.c:125: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;source-doc/scsi-drv/./class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -660,11 +653,11 @@ l_scsi_read_00112: inc sp ld a, l ld (_result), a -;source-doc/scsi-drv/./class_scsi.c:127: if (result == USB_ERR_OK) +;source-doc/scsi-drv/./class_scsi.c:136: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/./class_scsi.c:128: dev->current_lba++; +;source-doc/scsi-drv/./class_scsi.c:137: dev->current_lba++; pop hl push hl ld c, (hl) @@ -690,14 +683,14 @@ l_scsi_read_00114: inc hl ld (hl), d l_scsi_read_00102: -;source-doc/scsi-drv/./class_scsi.c:129: return result; +;source-doc/scsi-drv/./class_scsi.c:138: return result; ld hl,_result ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:130: } +;source-doc/scsi-drv/./class_scsi.c:139: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:132: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/./class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -706,36 +699,36 @@ _scsi_write: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/./class_scsi.c:133: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/./class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld hl,_cbw ld b,0x1b l_scsi_write_00112: ld (hl),0x00 inc hl djnz l_scsi_write_00112 -;source-doc/scsi-drv/./class_scsi.c:134: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper; ld de,_cbw ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:136: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:145: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/./class_scsi.c:137: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/./class_scsi.c:146: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/./class_scsi.c:138: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/./class_scsi.c:147: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld ((_cbw + 8)), hl ld h, l ld ((_cbw + 8)+2), hl -;source-doc/scsi-drv/./class_scsi.c:140: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;source-doc/scsi-drv/./class_scsi.c:149: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/./class_scsi.c:141: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/./class_scsi.c:150: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/./class_scsi.c:142: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/./class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld c,(ix+4) ld b,(ix+5) ld hl,0x000c @@ -748,7 +741,7 @@ l_scsi_write_00112: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/./class_scsi.c:143: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/./class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; pop hl push hl inc hl @@ -757,19 +750,19 @@ l_scsi_write_00112: dec hl ld a, (hl) ld ((_cbw + 18)),a -;source-doc/scsi-drv/./class_scsi.c:144: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/./class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; pop hl push hl inc hl ld d, (hl) ld hl, +(_cbw + 19) ld (hl), d -;source-doc/scsi-drv/./class_scsi.c:145: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/./class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba; pop hl push hl ld a, (hl) ld ((_cbw + 20)),a -;source-doc/scsi-drv/./class_scsi.c:147: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;source-doc/scsi-drv/./class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) ld a,0x01 @@ -786,11 +779,11 @@ l_scsi_write_00112: inc sp ld a, l ld (_result), a -;source-doc/scsi-drv/./class_scsi.c:149: if (result == USB_ERR_OK) +;source-doc/scsi-drv/./class_scsi.c:158: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/./class_scsi.c:150: dev->current_lba++; +;source-doc/scsi-drv/./class_scsi.c:159: dev->current_lba++; pop hl push hl ld c, (hl) @@ -816,14 +809,14 @@ l_scsi_write_00114: inc hl ld (hl), d l_scsi_write_00102: -;source-doc/scsi-drv/./class_scsi.c:151: return result; +;source-doc/scsi-drv/./class_scsi.c:160: return result; ld hl,_result ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:152: } +;source-doc/scsi-drv/./class_scsi.c:161: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:154: usb_error scsi_eject(device_config_storage *const dev) { +;source-doc/scsi-drv/./class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_eject ; --------------------------------- @@ -834,14 +827,14 @@ _scsi_eject: ld hl, -21 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:156: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl ld hl,_scsi_command_block_wrapper ld bc,0x000f ldir -;source-doc/scsi-drv/./class_scsi.c:158: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); +;source-doc/scsi-drv/./class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); ld hl,15 add hl, sp ld b,0x06 @@ -849,17 +842,17 @@ l_scsi_eject_00103: ld (hl),0x00 inc hl djnz l_scsi_eject_00103 -;source-doc/scsi-drv/./class_scsi.c:160: cbw_scsi.eject.operation_code = 0x1B; +;source-doc/scsi-drv/./class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B; ld (ix-6),0x1b -;source-doc/scsi-drv/./class_scsi.c:161: cbw_scsi.eject.loej = 1; +;source-doc/scsi-drv/./class_scsi.c:170: cbw_scsi.eject.loej = 1; ld hl,19 add hl, sp set 1, (hl) -;source-doc/scsi-drv/./class_scsi.c:163: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/./class_scsi.c:172: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-8),0x00 -;source-doc/scsi-drv/./class_scsi.c:164: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +;source-doc/scsi-drv/./class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); ld (ix-7),0x06 -;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/./class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,8 add hl, sp ex de, hl @@ -871,7 +864,7 @@ l_scsi_eject_00103: ld (de), a inc de ld (de), a -;source-doc/scsi-drv/./class_scsi.c:167: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/./class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -884,7 +877,7 @@ l_scsi_eject_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:168: } +;source-doc/scsi-drv/./class_scsi.c:177: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 78c5ef49..ca652a68 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -88,23 +88,23 @@ l_chscsi_init_00105: ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/./scsi-init.c:29: scsi_sense_init(storage_device); +;source-doc/scsi-drv/./scsi-init.c:28: scsi_sense_init(storage_device); push de push de call _scsi_sense_init pop af pop de -;source-doc/scsi-drv/./scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/./scsi-init.c:29: dio_add_entry(ch_scsi_fntbl, storage_device); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/./scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/./scsi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/./scsi-init.c:34: } +;source-doc/scsi-drv/./scsi-init.c:33: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index 4c7b52d1..c939f819 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -8,7 +8,7 @@ usb_error result = 0; void ch_command(const uint8_t command) __z88dk_fastcall { uint8_t counter = 255; while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) - delay(); + ; // if (counter == 0) { // It appears that the Ch376 has become blocked @@ -18,12 +18,7 @@ void ch_command(const uint8_t command) __z88dk_fastcall { // return; // } - delay(); CH376_COMMAND_PORT = command; - delay(); - delay(); - delay(); - delay(); } extern usb_error ch_wait_int_and_get_status(const int16_t timeout) __z88dk_fastcall; @@ -36,10 +31,6 @@ usb_error ch_very_short_wait_int_and_get_status(void) { return ch_wait_int_and_g usb_error ch_get_status(void) { ch_command(CH_CMD_GET_STATUS); - delay(); - delay(); - delay(); - delay(); uint8_t ch_status = CH376_DATA_PORT; if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) @@ -143,14 +134,8 @@ uint8_t ch_cmd_get_ic_version(void) { void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { ch_command(CH_CMD_ISSUE_TKN_X); - delay(); - delay(); CH376_DATA_PORT = toggle_bit; - delay(); - delay(); CH376_DATA_PORT = endpoint << 4 | pid; - delay(); - delay(); } void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { @@ -168,8 +153,7 @@ void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { - uint8_t count; - usb_error result; + uint8_t count; if (buffer_size == 0) return USB_ERR_OK; @@ -197,6 +181,8 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par USB_MODULE_LEDS = 0x00; return USB_ERR_OK; +done: + return result; } usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { @@ -218,6 +204,8 @@ usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size USB_MODULE_LEDS = 0x00; return USB_ERR_OK; +done: + return result; } usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { @@ -241,10 +229,11 @@ usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, end USB_MODULE_LEDS = 0x00; return USB_ERR_OK; +done: + return result; } void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ch_command(CH_CMD_SET_USB_ADDR); CH376_DATA_PORT = device_address; - delay(); } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h index 88d38dc5..5695c11e 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -96,11 +96,14 @@ extern usb_error result; { \ result = fn; \ if (result != USB_ERR_OK) \ - return result; \ + goto done; \ } #define RETURN_CHECK(fn) \ - { return fn; } + { \ + result = fn; \ + goto done; \ + } #define TRACE_USB_ERROR(result) @@ -159,9 +162,7 @@ extern usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_leng inline void ch_configure_nak_retry(const ch_nak_retry_type retry, const uint8_t number_of_retries) { ch_command(CH_CMD_WRITE_VAR8); CH376_DATA_PORT = CH_VAR_RETRY_TIMES; - delay(); CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); - delay(); } #define ch_configure_nak_retry_indefinite() ch_configure_nak_retry(CH_NAK_RETRY_INDEFINITE, 0x1F) diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.c b/Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.c new file mode 100644 index 00000000..37ad03b2 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.c @@ -0,0 +1,8 @@ +#include "critical-section.h" +#include + +uint8_t in_critical_usb_section = 0; + +void critical_begin() { in_critical_usb_section++; } + +void critical_end() { in_critical_usb_section--; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.h b/Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.h new file mode 100644 index 00000000..2ddb3961 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.h @@ -0,0 +1,13 @@ +#ifndef __CRITICAL_BLOCKS_H__ +#define __CRITICAL_BLOCKS_H__ + +#include + +extern uint8_t in_critical_usb_section; + +void critical_begin(); +void critical_end(); + +#define is_in_critical_section() (in_critical_usb_section != 0) + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c index e30284ea..9abc2988 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c @@ -16,6 +16,9 @@ #include "protocol.h" #include +#include + +#include "ez80-helpers.h" /** * @brief Perform a USB control transfer (in or out) * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer @@ -31,8 +34,6 @@ usb_error usbdev_control_transfer(device_config *const device, const setup_packe usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { - usb_error result; - endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); @@ -44,12 +45,12 @@ usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const } RETURN_CHECK(result); + +done: + return result; } usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { - - usb_error result; - endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); @@ -61,6 +62,8 @@ usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffe } RETURN_CHECK(result); +done: + return result; } usb_error usbdev_dat_in_trnsfer(device_config *const device, @@ -68,8 +71,6 @@ usb_error usbdev_dat_in_trnsfer(device_config *const device, const uint16_t buffer_size, const usb_endpoint_type endpoint_type) { - usb_error result; - endpoint_param *const endpoint = &device->endpoints[endpoint_type]; result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); @@ -81,12 +82,11 @@ usb_error usbdev_dat_in_trnsfer(device_config *const device, } RETURN_CHECK(result); +done: + return result; } -usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) { - - usb_error result; - +usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { endpoint_param *const endpoint = &device->endpoints[0]; result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); @@ -97,5 +97,5 @@ usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const bu return USB_ERR_STALL; } - RETURN_CHECK(result); + return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index 0c0a92eb..8eda8748 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -62,7 +62,6 @@ extern usb_error usbdev_dat_in_trnsfer(device_config *const device, const uint16_t buffer_size, const usb_endpoint_type endpoint_type); -extern usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) - __sdcccall(1); +extern usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c index 86eca0a6..8393ec65 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -94,6 +94,8 @@ usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) hub_config.type = USB_IS_HUB; CHECK(configure_device(working, interface, (device_config *const)&hub_config)); RETURN_CHECK(configure_usb_hub(working)); +done: + return result; } usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { @@ -129,25 +131,21 @@ usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { } } - CHECK(op_parse_endpoint(working)); + result = op_parse_endpoint(working); +done: return result; } usb_error op_id_class_drv(_working *const working) __sdcccall(1) { - usb_error result; const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; - CHECK(op_cap_drv_intf(working)); - - return result; + return op_cap_drv_intf(working); } usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { - usb_error result; - memset(working->config.buffer, 0, MAX_CONFIG_SIZE); const uint8_t max_packet_size = working->desc.bMaxPacketSize0; @@ -158,8 +156,8 @@ usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { working->ptr = (working->config.buffer + sizeof(config_descriptor)); working->interface_count = working->config.desc.bNumInterfaces; - CHECK(op_id_class_drv(working)); - + return op_id_class_drv(working); +done: return result; } @@ -184,6 +182,8 @@ usb_error read_all_configs(enumeration_state *const state) { } return USB_ERR_OK; +done: + return result; } usb_error enumerate_all_devices(void) { @@ -196,8 +196,7 @@ usb_error enumerate_all_devices(void) { work_area->count_of_detected_usb_devices = state.next_device_address; - CHECK(result); - +done: return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c index 63cde3bc..d838c452 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c @@ -77,4 +77,6 @@ usb_error configure_usb_hub(_working *const working) __z88dk_fastcall { } while (--i != 0); return USB_ERR_OK; +done: + return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c index e5c5101c..73f96a85 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c @@ -27,12 +27,10 @@ const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; * @return usb_error USB_ERR_OK if all good, otherwise specific error code */ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { - usb_error result; setup_packet cmd; cmd = cmd_get_device_descriptor; cmd.wLength = 8; - debugger(); result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); CHECK(result); @@ -42,6 +40,9 @@ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); RETURN_CHECK(result); + +done: + return result; } /** @@ -51,7 +52,6 @@ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { * @return usb_error USB_ERR_OK if all good, otherwise specific error code */ usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { - usb_error result; setup_packet cmd; cmd = cmd_get_device_descriptor; cmd.wLength = 8; @@ -63,6 +63,8 @@ usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t cmd = cmd_get_device_descriptor; cmd.wLength = 18; RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); +done: + return result; } const setup_packet cmd_set_device_address = {0x00, 5, {0, 0}, {0, 0}, 0}; @@ -119,7 +121,7 @@ usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, cmd.bValue[0] = config_index; cmd.wLength = (uint16_t)buffer_size; - RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size)); + return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size); } usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, @@ -127,7 +129,6 @@ usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, const uint8_t max_packet_size, const uint8_t max_buffer_size, uint8_t *const buffer) { - usb_error result; CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, sizeof(config_descriptor), device_address, max_packet_size)); @@ -139,6 +140,8 @@ usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); return USB_ERR_OK; +done: + return result; } const setup_packet usb_cmd_clear_endpoint_halt = {2, 1, {0, 0}, {255, 0}, 0}; // ;byte 4 is the endpoint to be cleared @@ -148,7 +151,5 @@ usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_ cmd = usb_cmd_clear_endpoint_halt; cmd.bIndex[0] = endpoint_number; - usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); - - RETURN_CHECK(result); + return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index c19efcc5..a8df10ac 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -13,11 +13,11 @@ #include "transfers.h" #include "ch376.h" #include "delay.h" -#include "z80.h" -#include - #include "ez80-helpers.h" #include "print.h" +#include "z80.h" +#include +#include #define LOWER_SAFE_RAM_ADDRESS 0x8000 @@ -56,6 +56,8 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet, if (transferIn && buffer == 0) return USB_ERR_OTHER; + critical_begin(); + ch_set_usb_address(device_address); ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); @@ -74,12 +76,13 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet, if (transferIn) { ch_command(CH_CMD_WR_HOST_DATA); CH376_DATA_PORT = 0; - delay(); ch_issue_token_out_ep0(); result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ - if (result == USB_ERR_OK || result == USB_ERR_STALL) - return USB_ERR_OK; + if (result == USB_ERR_OK || result == USB_ERR_STALL) { + result = USB_ERR_OK; + goto done; + } RETURN_CHECK(result); } @@ -88,6 +91,10 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet, result = ch_long_wait_int_and_get_status(); RETURN_CHECK(result); + +done: + critical_end(); + return result; } usb_error @@ -126,9 +133,15 @@ usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t devi */ usb_error usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + critical_begin(); + ch_set_usb_address(device_address); - return ch_data_in_transfer(buffer, buffer_size, endpoint); + result = ch_data_in_transfer(buffer, buffer_size, endpoint); + + critical_end(); + + return result; } /** @@ -142,21 +155,15 @@ usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t */ usb_error usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { - ch_set_usb_address(device_address); + critical_begin(); - return ch_data_in_transfer_n(buffer, buffer_size, endpoint); -} + ch_set_usb_address(device_address); -usb_error -usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); - if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - return USB_BAD_ADDRESS; + critical_end(); - if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) - return USB_BAD_ADDRESS; - - return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint); + return result; } /** @@ -170,7 +177,13 @@ usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t */ usb_error usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + critical_begin(); + ch_set_usb_address(device_address); - return ch_data_out_transfer(buffer, buffer_size, endpoint); + result = ch_data_out_transfer(buffer, buffer_size, endpoint); + + critical_end(); + + return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h b/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h index d9eaf0bb..a086bfeb 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h @@ -3,15 +3,4 @@ #include -#define EI __asm__("EI"); -#define DI __asm__("DI"); -#define HALT __asm__("HALT"); - -typedef void (*jump_fn_t)(void) __z88dk_fastcall; - -typedef struct { - uint8_t jump_op_code; // JMP or CALL - jump_fn_t address; -} z80_jump_t; - #endif diff --git a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh index c94c67c0..3403b826 100755 --- a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh +++ b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh @@ -29,7 +29,8 @@ sed -E \ -e 's/\s+or\s+a,\((ix\+[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((ix\-[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((iy\+[0-9-]+)\)/\tor\t\(\1\)/g' \ - -e 's/\s+or\s+a,\((hl)\)/\tor\t\(\1\)/g' \ + -e 's/\s+or\s+a,\s*\((hl)\)/\tor\t\(\1\)/g' \ + -e 's/\s+sub\s+a,\s*\((hl)\)/\tsub\t\(\1\)/g' \ -e 's/\s+cp\s+a,(0x[0-9A-Fa-f]{2})/\tcp\t\1/g' \ -e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \ -e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \ diff --git a/Source/HBIOS/ch376-native/source-doc/depends.d b/Source/HBIOS/ch376-native/source-doc/depends.d index 9c073580..084400b5 100644 --- a/Source/HBIOS/ch376-native/source-doc/depends.d +++ b/Source/HBIOS/ch376-native/source-doc/depends.d @@ -1,5 +1,6 @@ ./base-drv/dev_transfers.c: base-drv/dev_transfers.c ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/protocol.h +./base-drv/critical-section.c: base-drv/critical-section.c ././source-doc/base-drv/critical-section.h ./base-drv/enumerate.c: base-drv/enumerate.c ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/print.h ./base-drv/usb_state.c: base-drv/usb_state.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/work-area.h ./base-drv/class_hub.c: base-drv/class_hub.c ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h @@ -14,15 +15,16 @@ ./ufi-drv/ufi-init.c: ufi-drv/ufi-init.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/usb_cbi.c: ufi-drv/usb_cbi.c ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/class_ufi.c: ufi-drv/class_ufi.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h -./keyboard/kyb-init.c: keyboard/kyb-init.c ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/keyboard/class_hid.h ././source-doc/keyboard/class_hid_keyboard.h +./keyboard/kyb-init.c: keyboard/kyb-init.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h ././source-doc/keyboard/class_hid_keyboard.h ./keyboard/class_hid.c: keyboard/class_hid.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h +./keyboard/class_hid_keyboard.c: keyboard/class_hid_keyboard.c ././source-doc/keyboard/class_hid_keyboard.h ./scsi-drv/scsi-init.c: scsi-drv/scsi-init.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ./scsi-drv/class_scsi.c: scsi-drv/class_scsi.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ## -./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s +./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./critical-section.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s ## ./scsi-drv.s: scsi-drv/./scsi-init.c.s scsi-drv/./class_scsi.c.s ## ./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s ## -./keyboard.s: keyboard/./kyb-init.c.s keyboard/./class_hid.c.s +./keyboard.s: keyboard/./kyb-init.c.s keyboard/./class_hid.c.s keyboard/./class_hid_keyboard.c.s diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c index b8ccd822..781d9d9f 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c @@ -4,33 +4,26 @@ const setup_packet cmd_hid_set = {0x21, HID_SET_PROTOCOL, {0, 0}, {0, 0}, 0}; usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { - usb_error result; setup_packet cmd; cmd = cmd_hid_set; cmd.bRequest = HID_SET_PROTOCOL; cmd.bValue[0] = protocol; - result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); - - RETURN_CHECK(result); + return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); } usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { - usb_error result; setup_packet cmd; cmd = cmd_hid_set; cmd.bRequest = HID_SET_IDLE; cmd.bValue[0] = duration; - result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); - - RETURN_CHECK(result); + return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); } usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { - usb_error result; setup_packet cmd; cmd = cmd_hid_set; @@ -40,7 +33,5 @@ usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t cmd.bRequest = HID_GET_REPORT; cmd.wLength = 8; - result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); - - RETURN_CHECK(result); + return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c new file mode 100644 index 00000000..6db81605 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c @@ -0,0 +1,343 @@ +#include "class_hid_keyboard.h" + +#define ESC 0x1B + +/** + * scan codes sourced from https://deskthority.net/wiki/Scancode + * + */ +char scancodes_shift_table[128] = { + 0x00, /*Reserved*/ + 0x00, /*Reserved*/ + 0x00, /*Reserved*/ + 0x00, /*Reserved*/ + + /* 0x04 */ + 'A', + 'B', + 'C', + 'D', + 'E', + 'F', + 'G', + 'H', + + /* 0x0C */ + 'I', + 'J', + 'K', + 'L', + 'M', + 'N', + 'O', + 'P', + + /* 0X14 */ + 'Q', + 'R', + 'S', + 'T', + 'U', + 'V', + 'W', + 'X', + + /* 0X1C */ + 'Y', + 'Z', + '!', + '@', + '#', + '$', + '%', + '^', + + /* 0x24 */ + '&', + '*', + '(', + ')', + '\r', + ESC, + '\b', + '\t', + + /* 0x2C */ + ' ', + '_', + '+', + '{', + '}', + '|', + '~', + ':', + + /* 0x34 */ + '"', + '~', + '<', + '>', + '?', + 0x00 /*CAPSLOCK*/, + 0x00 /* F1 */, + 0x00 /* F2 */, + + /* 0x3C */ + 0x00 /* F3 */, + 0x00 /* F4 */, + 0x00 /* F5 */, + 0x00 /* F6 */, + 0x00 /* F7 */, + 0x00 /* F8 */, + 0x00 /* F9 */, + 0x00 /* F10 */, + + /* 0x44 */ + 0x00 /* F11 */, + 0x00 /* F12 */, + 0x00 /* PRINTSCREEN */, + 0x00 /* SCROLLLOCK */, + 0x00 /* PAUSE */, + 0x00 /* INSERT */, + 0x00 /* HOME */, + 0x00 /* PAGEUP */, + + /* 0x4C */ + 0x00 /* DELETE */, + 0x00 /* END */, + 0x00 /* PAGEDOWN */, + 0x00 /* RIGHT */, + 0x00 /* LEFT */, + 0x00 /* DOWN */, + 0x00 /* UP */, + 0x00 /* NUMLOCK */, + + /* 0x54 */ + '/' /* KP / */, + '*' /* KP * */, + '-' /* KP - */, + '+' /* KP + */, + '\r' /* KP ENTER */, + '1' /* KP 1 */, + '2' /* KP 2 */, + '3' /* KP 3 */, + + /* 0x5C */ + '4' /* KP 4 */, + '5' /* KP 5 */, + '6' /* KP 6 */, + '7' /* KP 7 */, + '8' /* KP 8 */, + '9' /* KP 9 */, + '0' /* KP 0 */, + '.' /* KP . */, + + /* 0x64 */ + '\\', + 0x00 /* MENU */, + 0x00 /* POWER */, + '=' /* KP = */, + 0x00 /* F13 */, + 0x00 /* F14 */, + 0x00 /* F15 */, + 0x00 /* F16 */, + + /* 0x6C */ + 0x00 /* F17 */, + 0x00 /* F18 */, + 0x00 /* F19 */, + 0x00 /* F20 */, + 0x00 /* F21 */, + 0x00 /* F22 */, + 0x00 /* F23 */, + 0x00 /* F24 */, + + /* 0x74 */ + 0x00 /* EXECUTE */, + 0x00 /* HELP */, + 0x00 /* MENU */, + 0x00 /* SELECT */, + 0x00 /* STOP */, + 0x00 /* AGAIN */, + 0x00 /* UNDO */, + 0x00 /* CUT */, + + /* 0x7C */ + 0x00 /* COPY */, + 0x00 /* PASTE */, + 0x00 /* FIND */, + 0x00 /* MUTE */, +}; + +char scancodes_table[128] = { + 0x00, /*Reserved*/ + 0x00, /*Reserved*/ + 0x00, /*Reserved*/ + 0x00, /*Reserved*/ + + /* 0x04 */ + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + + /* 0x0C */ + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + + /* 0x14 */ + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + + /* 0x1C */ + 'y', + 'z', + '1', + '2', + '3', + '4', + '5', + '6', + + /* 0x24 */ + '7', + '8', + '9', + '0', + '\r', + ESC, + '\b', + '\t', + + /* 0x2C */ + ' ', + '-', + '=', + '[', + ']', + '\\', + '#', + ';', + + /* 0x34 */ + '\'', + '`', + ',', + '.', + '/', + 0x00 /*CAPSLOCK*/, + 0x00 /* F1 */, + 0x00 /* F2 */, + + /* 0x3C */ + 0x00 /* F3 */, + 0x00 /* F4 */, + 0x00 /* F5 */, + 0x00 /* F6 */, + 0x00 /* F7 */, + 0x00 /* F8 */, + 0x00 /* F9 */, + 0x00 /* F10 */, + + /* 0x44 */ + 0x00 /* F11 */, + 0x00 /* F12 */, + 0x00 /* PRINTSCREEN */, + 0x00 /* SCROLLLOCK */, + 0x00 /* PAUSE */, + 0x00 /* INSERT */, + 0x00 /* HOME */, + 0x00 /* PAGEUP */, + + /* 0x4C */ + 0x00 /* DELETE */, + 0x00 /* END */, + 0x00 /* PAGEDOWN */, + 0x00 /* RIGHT */, + 0x00 /* LEFT */, + 0x00 /* DOWN */, + 0x00 /* UP */, + 0x00 /* NUMLOCK */, + + /* 0x54 */ + '/' /* KP / */, + '*' /* KP * */, + '-' /* KP - */, + '+' /* KP + */, + '\r' /* KP ENTER */, + '1' /* KP 1 */, + '2' /* KP 2 */, + '3' /* KP 3 */, + + /* 0x5C */ + '4' /* KP 4 */, + '5' /* KP 5 */, + '6' /* KP 6 */, + '7' /* KP 7 */, + '8' /* KP 8 */, + '9' /* KP 9 */, + '0' /* KP 0 */, + '.' /* KP . */, + + /* 0x64 */ + '\\', + 0x00 /* MENU */, + 0x00 /* POWER */, + '=' /* KP = */, + 0x00 /* F13 */, + 0x00 /* F14 */, + 0x00 /* F15 */, + 0x00 /* F16 */, + + /* 0x6C */ + 0x00 /* F17 */, + 0x00 /* F18 */, + 0x00 /* F19 */, + 0x00 /* F20 */, + 0x00 /* F21 */, + 0x00 /* F22 */, + 0x00 /* F23 */, + 0x00 /* F24 */, + + /* 0x74 */ + 0x00 /* EXECUTE */, + 0x00 /* HELP */, + 0x00 /* MENU */, + 0x00 /* SELECT */, + 0x00 /* STOP */, + 0x00 /* AGAIN */, + 0x00 /* UNDO */, + 0x00 /* CUT */, + + /* 0x7C */ + 0x00 /* COPY */, + 0x00 /* PASTE */, + 0x00 /* FIND */, + 0x00 /* MUTE */, +}; + +char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { + if (code >= 0x80) + return 0; + + if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) + return scancodes_shift_table[code]; + + return scancodes_table[code]; +} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index 6b4bfa82..cb5b4de7 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -1,15 +1,20 @@ #include "class_hid.h" #include "class_hid_keyboard.h" +#include #include #include #include #include +static device_config_keyboard *keyboard_config = 0; + void keyboard_init(void) { - uint8_t index = 1; + uint8_t index = 1; + keyboard_config = NULL; + do { - device_config_keyboard *const keyboard_config = (device_config_keyboard *)get_usb_device_config(index); + keyboard_config = (device_config_keyboard *)get_usb_device_config(index); if (keyboard_config == NULL) break; @@ -21,7 +26,6 @@ void keyboard_init(void) { print_uint16(index); print_string(" $"); - // keyboard_config->drive_index = usb_device_count++; hid_set_protocol(keyboard_config, 1); hid_set_idle(keyboard_config, 0x80); return; @@ -31,24 +35,63 @@ void keyboard_init(void) { print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); } -// void drv_timi_keyboard(void) { -// _usb_state *const p = get_usb_work_area(); -// if (p->active) -// return; +#define KEYBOARD_BUFFER_SIZE 8 +#define KEYBOARD_BUFFER_SIZE_MASK 7 +typedef struct { + uint8_t modifier_keys; + uint8_t key_code; +} keyboard_event; +keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; +uint8_t write_index = 0; +uint8_t read_index = 0; -// p->active = true; +void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { + if (key_code >= 0x80 || key_code == 0) + return; // ignore ??? -// device_config_keyboard *const keyboard_config = (device_config_keyboard *)find_device_config(USB_IS_KEYBOARD); + uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + if (next_write_index != read_index) { // Check if buffer is not full + buffer[write_index].modifier_keys = modifier_keys; + buffer[write_index].key_code = key_code; + write_index = next_write_index; + } +} -// keyboard_report report; +uint8_t keyboard_buf_size() __sdcccall(1) { + if (write_index >= read_index) + return write_index - read_index; -// ch_configure_nak_retry_disable(); -// const usb_error result = usbdev_data_in_transfer_ep0((device_config *)keyboard_config, (uint8_t *)report, 8); -// ch_configure_nak_retry_3s(); -// if (result == 0) { -// const char c = scancode_to_char(report.bModifierKeys, report.keyCode[0]); -// key_put_into_buf(c); -// } + return KEYBOARD_BUFFER_SIZE - read_index + write_index; +} + +uint32_t keyboard_buf_get_next() { + if (write_index == read_index) // Check if buffer is empty + return 255 << 8; + + const uint8_t modifier_key = buffer[read_index].modifier_keys; + const uint8_t key_code = buffer[read_index].key_code; + read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + const unsigned char c = scancode_to_char(modifier_key, key_code); + /* D = modifier, e-> char, H = 0, L=>code */ + return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +} -// p->active = false; -// } +void keyboard_buf_flush() { + write_index = 0; + read_index = 0; +} + +uint8_t active = 0; + +keyboard_report report = {0}; + +void keyboard_tick(void) { + if (is_in_critical_section()) + return; + + ch_configure_nak_retry_disable(); + result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); + ch_configure_nak_retry_3s(); + if (result == 0) + keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); +} diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index c554e345..b4f34fc2 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -1,4 +1,5 @@ #include "class_scsi.h" +#include #include #include #include @@ -18,6 +19,8 @@ usb_error do_scsi_cmd(device_config_storage *const dev, if (!send) cbw->bmCBWFlags = 0x80; + critical_begin(); + CHECK(usb_data_out_transfer((uint8_t *)cbw, sizeof(_scsi_command_block_wrapper) + 16, dev->address, &dev->endpoints[ENDPOINT_BULK_OUT])); @@ -36,9 +39,13 @@ usb_error do_scsi_cmd(device_config_storage *const dev, usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) - return USB_ERR_FAIL; + result = USB_ERR_FAIL; + else + result = USB_ERR_OK; - return USB_ERR_OK; +done: + critical_end(); + return result; } _scsi_read_capacity scsi_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; @@ -99,8 +106,10 @@ usb_error scsi_sense_init(device_config_storage *const dev) { scsi_sense_result response; uint8_t counter = 3; + critical_begin(); while ((result = scsi_test(dev)) && --counter > 0) scsi_request_sense(dev, &response); + critical_end(); return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index 37f951a4..9838812f 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -25,7 +25,6 @@ void chscsi_init(void) { print_uint16(index); print_string(" $"); - // storage_device->drive_index = usb_device_count++; scsi_sense_init(storage_device); dio_add_entry(ch_scsi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c index ed5f265a..1a5048b8 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c @@ -41,8 +41,9 @@ usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_s result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), (uint8_t *)response, NULL); - RETURN_CHECK(result); +done: + return result; } usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { @@ -53,6 +54,8 @@ usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sen (uint8_t *)response, NULL); RETURN_CHECK(result); +done: + return result; } usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { @@ -78,6 +81,8 @@ usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_cap TRACE_USB_ERROR(result); RETURN_CHECK(result); +done: + return result; } usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { @@ -88,6 +93,8 @@ usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_inquiry, false, sizeof(ufi_inquiry_response), (uint8_t *)response, NULL); RETURN_CHECK(result); +done: + return result; } usb_error ufi_read_write_sector(device_config *const storage_device, @@ -106,6 +113,8 @@ usb_error ufi_read_write_sector(device_config *const storage_device, usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); RETURN_CHECK(result); +done: + return result; } /** @@ -149,17 +158,16 @@ usb_error ufi_format(device_config *const storage_device, // trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list)); RETURN_CHECK(result); +done: + return result; } usb_error ufi_send_diagnostics(device_config *const storage_device) { - usb_error result; ufi_send_diagnostic_command ufi_cmd_send_diagnostic; ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; - result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); - - RETURN_CHECK(result); + return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); } uint32_t convert_from_msb_first(const uint8_t *const buffer) { diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c index bf43a45e..e4b76046 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c @@ -2,6 +2,7 @@ #include "dev_transfers.h" #include "protocol.h" #include +#include setup_packet cbi2_adsc = {0x21, 0, {0, 0}, {255, 0}, 12}; // ;4th byte is interface number @@ -13,26 +14,27 @@ usb_error usb_execute_cbi(device_config *const storage_device, uint8_t *const buffer, uint8_t *const sense_codes) { - usb_error result; - const uint8_t interface_number = storage_device->interface_number; setup_packet adsc; adsc = cbi2_adsc; adsc.bIndex[0] = interface_number; + critical_begin(); + result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); if (result == USB_ERR_STALL) { if (sense_codes != NULL) usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); - return USB_ERR_STALL; + result = USB_ERR_STALL; + goto done; } if (result != USB_ERR_OK) { TRACE_USB_ERROR(result); - return result; + goto done; } if (send) { @@ -40,14 +42,14 @@ usb_error usb_execute_cbi(device_config *const storage_device, if (result != USB_ERR_OK) { TRACE_USB_ERROR(result); - return result; + goto done; } } else { result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); if (result != USB_ERR_OK) { TRACE_USB_ERROR(result); - return result; + goto done; } } @@ -56,9 +58,12 @@ usb_error usb_execute_cbi(device_config *const storage_device, if (result != USB_ERR_OK) { TRACE_USB_ERROR(result); - return result; + // goto done; } } - return USB_ERR_OK; +done: + critical_end(); + + return result; } diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index f911d4c2..4f118b63 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -196,10 +196,10 @@ _ufi_test_unit_ready: ld l, e ld h, d ld b,0x0c -l_ufi_test_unit_ready_00103: +l_ufi_test_unit_ready_00104: ld (hl),0x00 inc hl - djnz l_ufi_test_unit_ready_00103 + djnz l_ufi_test_unit_ready_00104 ;source-doc/ufi-drv/./class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); ld hl,0x0000 push hl @@ -245,12 +245,12 @@ l_ufi_test_unit_ready_00103: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:45: RETURN_CHECK(result); -;source-doc/ufi-drv/./class_ufi.c:46: } +;source-doc/ufi-drv/./class_ufi.c:46: return result; +;source-doc/ufi-drv/./class_ufi.c:47: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:48: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { +;source-doc/ufi-drv/./class_ufi.c:49: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { ; --------------------------------- ; Function ufi_request_sense ; --------------------------------- @@ -261,7 +261,7 @@ _ufi_request_sense: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:50: ufi_cmd_request_sense = _ufi_cmd_request_sense; +;source-doc/ufi-drv/./class_ufi.c:51: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,0 add hl, sp ld c, l @@ -273,7 +273,7 @@ _ufi_request_sense: ld bc,0x000c ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:52: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), +;source-doc/ufi-drv/./class_ufi.c:53: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), ld e,(ix+6) ld d,(ix+7) ld hl,0x0000 @@ -289,12 +289,12 @@ _ufi_request_sense: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:55: RETURN_CHECK(result); -;source-doc/ufi-drv/./class_ufi.c:56: } +;source-doc/ufi-drv/./class_ufi.c:58: return result; +;source-doc/ufi-drv/./class_ufi.c:59: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:58: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { +;source-doc/ufi-drv/./class_ufi.c:61: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { ; --------------------------------- ; Function ufi_read_frmt_caps ; --------------------------------- @@ -305,14 +305,14 @@ _ufi_read_frmt_caps: ld hl, -24 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:62: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities; +;source-doc/ufi-drv/./class_ufi.c:65: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities; ld hl,0 add hl, sp ex de, hl ld hl,__ufi_cmd_read_format_capacitie ld bc,0x000c ldir -;source-doc/ufi-drv/./class_ufi.c:63: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); +;source-doc/ufi-drv/./class_ufi.c:66: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); ld c,(ix+6) ld b,(ix+7) push bc @@ -337,24 +337,26 @@ _ufi_read_frmt_caps: pop af pop af inc sp + ld e, l pop bc -;source-doc/ufi-drv/./class_ufi.c:66: CHECK(result); - ld a, l +;source-doc/ufi-drv/./class_ufi.c:69: CHECK(result); + ld a,e + ld d,a or a jr NZ,l_ufi_read_frmt_caps_00103 -;source-doc/ufi-drv/./class_ufi.c:68: const uint8_t available_length = response->capacity_list_length; +;source-doc/ufi-drv/./class_ufi.c:71: const uint8_t available_length = response->capacity_list_length; ld e,(ix+6) ld d,(ix+7) ld hl,3 add hl, de ld e, (hl) -;source-doc/ufi-drv/./class_ufi.c:70: const uint8_t max_length = +;source-doc/ufi-drv/./class_ufi.c:73: const uint8_t max_length = ld a,0x24 sub e - jr NC,l_ufi_read_frmt_caps_00105 + jr NC,l_ufi_read_frmt_caps_00106 ld e,0x24 -l_ufi_read_frmt_caps_00105: -;source-doc/ufi-drv/./class_ufi.c:74: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); +l_ufi_read_frmt_caps_00106: +;source-doc/ufi-drv/./class_ufi.c:77: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); push de push bc ex de, hl @@ -367,9 +369,9 @@ l_ufi_read_frmt_caps_00105: ldir pop bc pop de -;source-doc/ufi-drv/./class_ufi.c:75: cmd.allocation_length[1] = max_length; +;source-doc/ufi-drv/./class_ufi.c:78: cmd.allocation_length[1] = max_length; ld (ix-4),e -;source-doc/ufi-drv/./class_ufi.c:77: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); +;source-doc/ufi-drv/./class_ufi.c:80: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); ld d,0x00 ld hl,0x0000 push hl @@ -391,13 +393,16 @@ l_ufi_read_frmt_caps_00105: pop af pop af inc sp -;source-doc/ufi-drv/./class_ufi.c:80: RETURN_CHECK(result); + ld d, l +;source-doc/ufi-drv/./class_ufi.c:84: done: l_ufi_read_frmt_caps_00103: -;source-doc/ufi-drv/./class_ufi.c:81: } +;source-doc/ufi-drv/./class_ufi.c:85: return result; + ld l, d +;source-doc/ufi-drv/./class_ufi.c:86: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:83: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { +;source-doc/ufi-drv/./class_ufi.c:88: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { ; --------------------------------- ; Function ufi_inquiry ; --------------------------------- @@ -408,7 +413,7 @@ _ufi_inquiry: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:85: ufi_cmd_inquiry = _ufi_cmd_inquiry; +;source-doc/ufi-drv/./class_ufi.c:90: ufi_cmd_inquiry = _ufi_cmd_inquiry; ld hl,0 add hl, sp ld c, l @@ -420,7 +425,7 @@ _ufi_inquiry: ld bc,0x000c ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:87: usb_error result = +;source-doc/ufi-drv/./class_ufi.c:92: usb_error result = ld e,(ix+6) ld d,(ix+7) ld hl,0x0000 @@ -436,12 +441,12 @@ _ufi_inquiry: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:90: RETURN_CHECK(result); -;source-doc/ufi-drv/./class_ufi.c:91: } +;source-doc/ufi-drv/./class_ufi.c:97: return result; +;source-doc/ufi-drv/./class_ufi.c:98: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:93: usb_error ufi_read_write_sector(device_config *const storage_device, +;source-doc/ufi-drv/./class_ufi.c:100: usb_error ufi_read_write_sector(device_config *const storage_device, ; --------------------------------- ; Function ufi_read_write_sector ; --------------------------------- @@ -452,33 +457,33 @@ _ufi_read_write_sector: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:100: memset(&cmd, 0, sizeof(cmd)); +;source-doc/ufi-drv/./class_ufi.c:107: memset(&cmd, 0, sizeof(cmd)); ld hl,0 add hl, sp ld b,0x0c -l_ufi_read_write_sector_00112: +l_ufi_read_write_sector_00113: ld (hl),0x00 inc hl - djnz l_ufi_read_write_sector_00112 -;source-doc/ufi-drv/./class_ufi.c:101: cmd.operation_code = send ? 0x2A : 0x28; + djnz l_ufi_read_write_sector_00113 +;source-doc/ufi-drv/./class_ufi.c:108: cmd.operation_code = send ? 0x2A : 0x28; bit 0,(ix+6) - jr Z,l_ufi_read_write_sector_00103 + jr Z,l_ufi_read_write_sector_00104 ld a,0x2a - jr l_ufi_read_write_sector_00104 -l_ufi_read_write_sector_00103: - ld a,0x28 + jr l_ufi_read_write_sector_00105 l_ufi_read_write_sector_00104: + ld a,0x28 +l_ufi_read_write_sector_00105: ld (ix-12),a -;source-doc/ufi-drv/./class_ufi.c:102: cmd.lba[2] = sector_number >> 8; +;source-doc/ufi-drv/./class_ufi.c:109: cmd.lba[2] = sector_number >> 8; ld a,(ix+8) ld (ix-8),a -;source-doc/ufi-drv/./class_ufi.c:103: cmd.lba[3] = sector_number & 0xFF; +;source-doc/ufi-drv/./class_ufi.c:110: cmd.lba[3] = sector_number & 0xFF; ld a,(ix+7) ld (ix-7),a -;source-doc/ufi-drv/./class_ufi.c:104: cmd.transfer_length[1] = sector_count; +;source-doc/ufi-drv/./class_ufi.c:111: cmd.transfer_length[1] = sector_count; ld a,(ix+9) ld (ix-4),a -;source-doc/ufi-drv/./class_ufi.c:106: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); +;source-doc/ufi-drv/./class_ufi.c:113: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); ld a,(ix+9) add a, a ld c,0x00 @@ -500,12 +505,12 @@ l_ufi_read_write_sector_00104: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:108: RETURN_CHECK(result); -;source-doc/ufi-drv/./class_ufi.c:109: } +;source-doc/ufi-drv/./class_ufi.c:117: return result; +;source-doc/ufi-drv/./class_ufi.c:118: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:118: usb_error ufi_format(device_config *const storage_device, +;source-doc/ufi-drv/./class_ufi.c:127: usb_error ufi_format(device_config *const storage_device, ; --------------------------------- ; Function ufi_format ; --------------------------------- @@ -516,17 +521,17 @@ _ufi_format: ld hl, -26 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:125: memset(¶meter_list, 0, sizeof(parameter_list)); +;source-doc/ufi-drv/./class_ufi.c:134: memset(¶meter_list, 0, sizeof(parameter_list)); ld hl,2 add hl, sp push hl ld b,0x0c -l_ufi_format_00103: +l_ufi_format_00104: ld (hl),0x00 inc hl - djnz l_ufi_format_00103 + djnz l_ufi_format_00104 pop bc -;source-doc/ufi-drv/./class_ufi.c:128: cmd = _ufi_cmd_format; +;source-doc/ufi-drv/./class_ufi.c:137: cmd = _ufi_cmd_format; ld hl,14 add hl, sp ex de, hl @@ -535,14 +540,14 @@ l_ufi_format_00103: ld bc,0x000c ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:131: cmd.track_number = track_number; +;source-doc/ufi-drv/./class_ufi.c:140: cmd.track_number = track_number; ld a,(ix+7) ld (ix-10),a -;source-doc/ufi-drv/./class_ufi.c:132: cmd.interleave[1] = 0; +;source-doc/ufi-drv/./class_ufi.c:141: cmd.interleave[1] = 0; ld (ix-8),0x00 -;source-doc/ufi-drv/./class_ufi.c:133: cmd.parameter_list_length[1] = sizeof(parameter_list); +;source-doc/ufi-drv/./class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); ld (ix-4),0x0c -;source-doc/ufi-drv/./class_ufi.c:135: parameter_list.defect_list_header.side = side; +;source-doc/ufi-drv/./class_ufi.c:144: parameter_list.defect_list_header.side = side; ld e, c ld d, b inc de @@ -553,36 +558,36 @@ l_ufi_format_00103: and 0xfe or l ld (de), a -;source-doc/ufi-drv/./class_ufi.c:136: parameter_list.defect_list_header.immediate = 0; +;source-doc/ufi-drv/./class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; ld l, e ld h, d res 1, (hl) -;source-doc/ufi-drv/./class_ufi.c:137: parameter_list.defect_list_header.reserved2 = 0; +;source-doc/ufi-drv/./class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; ld l, e ld h, d ld a, (hl) and 0xf3 ld (hl), a -;source-doc/ufi-drv/./class_ufi.c:138: parameter_list.defect_list_header.single_track = 1; +;source-doc/ufi-drv/./class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; ld l, e ld h, d set 4, (hl) -;source-doc/ufi-drv/./class_ufi.c:139: parameter_list.defect_list_header.dcrt = 1; +;source-doc/ufi-drv/./class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; ld l, e ld h, d set 5, (hl) -;source-doc/ufi-drv/./class_ufi.c:140: parameter_list.defect_list_header.extend = 0; +;source-doc/ufi-drv/./class_ufi.c:149: parameter_list.defect_list_header.extend = 0; ld l, e ld h, d res 6, (hl) -;source-doc/ufi-drv/./class_ufi.c:141: parameter_list.defect_list_header.fov = 1; +;source-doc/ufi-drv/./class_ufi.c:150: parameter_list.defect_list_header.fov = 1; ex de, hl set 7, (hl) -;source-doc/ufi-drv/./class_ufi.c:142: parameter_list.defect_list_header.defect_list_length_msb = 0; +;source-doc/ufi-drv/./class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; ld (ix-22),0x00 -;source-doc/ufi-drv/./class_ufi.c:143: parameter_list.defect_list_header.defect_list_length_lsb = 8; +;source-doc/ufi-drv/./class_ufi.c:152: parameter_list.defect_list_header.defect_list_length_lsb = 8; ld (ix-21),0x08 -;source-doc/ufi-drv/./class_ufi.c:144: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); +;source-doc/ufi-drv/./class_ufi.c:153: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); ld e,(ix+8) ld d,(ix+9) push bc @@ -595,7 +600,7 @@ l_ufi_format_00103: ld bc,0x0008 ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:146: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, +;source-doc/ufi-drv/./class_ufi.c:155: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, ld hl,0 add hl, sp push hl @@ -612,12 +617,12 @@ l_ufi_format_00103: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:151: RETURN_CHECK(result); -;source-doc/ufi-drv/./class_ufi.c:152: } +;source-doc/ufi-drv/./class_ufi.c:162: return result; +;source-doc/ufi-drv/./class_ufi.c:163: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:154: usb_error ufi_send_diagnostics(device_config *const storage_device) { +;source-doc/ufi-drv/./class_ufi.c:165: usb_error ufi_send_diagnostics(device_config *const storage_device) { ; --------------------------------- ; Function ufi_send_diagnostics ; --------------------------------- @@ -628,7 +633,7 @@ _ufi_send_diagnostics: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:158: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; +;source-doc/ufi-drv/./class_ufi.c:168: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; ld hl,0 add hl, sp ld c, l @@ -640,7 +645,7 @@ _ufi_send_diagnostics: ld bc,0x000c ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:160: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); +;source-doc/ufi-drv/./class_ufi.c:170: return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); ld hl,0x0000 push hl push hl @@ -653,12 +658,11 @@ _ufi_send_diagnostics: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:162: RETURN_CHECK(result); -;source-doc/ufi-drv/./class_ufi.c:163: } +;source-doc/ufi-drv/./class_ufi.c:171: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:165: uint32_t convert_from_msb_first(const uint8_t *const buffer) { +;source-doc/ufi-drv/./class_ufi.c:173: uint32_t convert_from_msb_first(const uint8_t *const buffer) { ; --------------------------------- ; Function convert_from_msb_first ; --------------------------------- @@ -668,40 +672,40 @@ _convert_from_msb_first: add ix,sp push af push af -;source-doc/ufi-drv/./class_ufi.c:167: uint8_t *p_output = ((uint8_t *)&result); +;source-doc/ufi-drv/./class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); ld hl,0 add hl, sp ex de, hl -;source-doc/ufi-drv/./class_ufi.c:168: const uint8_t *p_input = buffer + 3; +;source-doc/ufi-drv/./class_ufi.c:176: const uint8_t *p_input = buffer + 3; ld c,(ix+4) ld b,(ix+5) inc bc inc bc inc bc -;source-doc/ufi-drv/./class_ufi.c:170: *p_output++ = *p_input--; +;source-doc/ufi-drv/./class_ufi.c:178: *p_output++ = *p_input--; ld a, (bc) dec bc ld (de), a inc de -;source-doc/ufi-drv/./class_ufi.c:171: *p_output++ = *p_input--; +;source-doc/ufi-drv/./class_ufi.c:179: *p_output++ = *p_input--; ld a, (bc) dec bc ld (de), a inc de -;source-doc/ufi-drv/./class_ufi.c:172: *p_output++ = *p_input--; +;source-doc/ufi-drv/./class_ufi.c:180: *p_output++ = *p_input--; ld a, (bc) ld (de), a inc de -;source-doc/ufi-drv/./class_ufi.c:173: *p_output = *p_input--; +;source-doc/ufi-drv/./class_ufi.c:181: *p_output = *p_input--; dec bc ld a, (bc) ld (de), a -;source-doc/ufi-drv/./class_ufi.c:175: return result; +;source-doc/ufi-drv/./class_ufi.c:183: return result; pop hl push hl ld e,(ix-2) ld d,(ix-1) -;source-doc/ufi-drv/./class_ufi.c:176: } +;source-doc/ufi-drv/./class_ufi.c:184: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s index 134682ce..c9e23468 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -50,7 +50,7 @@ _cbi2_adsc: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/./usb_cbi.c:9: usb_error usb_execute_cbi(device_config *const storage_device, +;source-doc/ufi-drv/./usb_cbi.c:10: usb_error usb_execute_cbi(device_config *const storage_device, ; --------------------------------- ; Function usb_execute_cbi ; --------------------------------- @@ -61,7 +61,7 @@ _usb_execute_cbi: ld hl, -8 add hl, sp ld sp, hl -;source-doc/ufi-drv/./usb_cbi.c:18: const uint8_t interface_number = storage_device->interface_number; +;source-doc/ufi-drv/./usb_cbi.c:17: const uint8_t interface_number = storage_device->interface_number; ld c,(ix+4) ld b,(ix+5) ld l, c @@ -69,7 +69,7 @@ _usb_execute_cbi: inc hl inc hl ld e, (hl) -;source-doc/ufi-drv/./usb_cbi.c:21: adsc = cbi2_adsc; +;source-doc/ufi-drv/./usb_cbi.c:20: adsc = cbi2_adsc; push de push bc ex de, hl @@ -81,9 +81,13 @@ _usb_execute_cbi: ldir pop bc pop de -;source-doc/ufi-drv/./usb_cbi.c:22: adsc.bIndex[0] = interface_number; +;source-doc/ufi-drv/./usb_cbi.c:21: adsc.bIndex[0] = interface_number; ld (ix-4),e -;source-doc/ufi-drv/./usb_cbi.c:24: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); +;source-doc/ufi-drv/./usb_cbi.c:23: critical_begin(); + push bc + call _critical_begin + pop bc +;source-doc/ufi-drv/./usb_cbi.c:25: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); ld l,(ix+6) ld h,(ix+7) push hl @@ -96,14 +100,16 @@ _usb_execute_cbi: pop af pop af ld a, l -;source-doc/ufi-drv/./usb_cbi.c:26: if (result == USB_ERR_STALL) { - cp 0x02 + ld (_result), a +;source-doc/ufi-drv/./usb_cbi.c:27: if (result == USB_ERR_STALL) { + ld a,(_result) + sub 0x02 jr NZ,l_usb_execute_cbi_00104 -;source-doc/ufi-drv/./usb_cbi.c:27: if (sense_codes != NULL) +;source-doc/ufi-drv/./usb_cbi.c:28: if (sense_codes != NULL) ld a,(ix+14) or (ix+13) jr Z,l_usb_execute_cbi_00102 -;source-doc/ufi-drv/./usb_cbi.c:28: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); +;source-doc/ufi-drv/./usb_cbi.c:29: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); ld a,0x02 push af inc sp @@ -121,21 +127,20 @@ _usb_execute_cbi: pop af inc sp l_usb_execute_cbi_00102: -;source-doc/ufi-drv/./usb_cbi.c:30: return USB_ERR_STALL; - ld l,0x02 - jp l_usb_execute_cbi_00118 +;source-doc/ufi-drv/./usb_cbi.c:31: result = USB_ERR_STALL; + ld hl,_result + ld (hl),0x02 +;source-doc/ufi-drv/./usb_cbi.c:32: goto done; + jp l_usb_execute_cbi_00116 l_usb_execute_cbi_00104: -;source-doc/ufi-drv/./usb_cbi.c:33: if (result != USB_ERR_OK) { +;source-doc/ufi-drv/./usb_cbi.c:35: if (result != USB_ERR_OK) { + ld a,(_result) or a - jr Z,l_usb_execute_cbi_00106 -;source-doc/ufi-drv/./usb_cbi.c:35: return result; - ld l, a - jr l_usb_execute_cbi_00118 -l_usb_execute_cbi_00106: -;source-doc/ufi-drv/./usb_cbi.c:38: if (send) { + jp NZ, l_usb_execute_cbi_00116 +;source-doc/ufi-drv/./usb_cbi.c:40: if (send) { bit 0,(ix+8) jr Z,l_usb_execute_cbi_00112 -;source-doc/ufi-drv/./usb_cbi.c:39: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); +;source-doc/ufi-drv/./usb_cbi.c:41: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); ld l,(ix+9) ld h,(ix+10) push hl @@ -149,14 +154,16 @@ l_usb_execute_cbi_00106: pop af pop af pop af -;source-doc/ufi-drv/./usb_cbi.c:41: if (result != USB_ERR_OK) { ld a, l + ld (_result), a +;source-doc/ufi-drv/./usb_cbi.c:43: if (result != USB_ERR_OK) { + ld a,(_result) or a jr Z,l_usb_execute_cbi_00113 -;source-doc/ufi-drv/./usb_cbi.c:43: return result; - jr l_usb_execute_cbi_00118 +;source-doc/ufi-drv/./usb_cbi.c:45: goto done; + jr l_usb_execute_cbi_00116 l_usb_execute_cbi_00112: -;source-doc/ufi-drv/./usb_cbi.c:46: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); +;source-doc/ufi-drv/./usb_cbi.c:48: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); ld a,0x01 push af inc sp @@ -174,17 +181,19 @@ l_usb_execute_cbi_00112: pop af pop af inc sp -;source-doc/ufi-drv/./usb_cbi.c:48: if (result != USB_ERR_OK) { ld a, l + ld (_result), a +;source-doc/ufi-drv/./usb_cbi.c:50: if (result != USB_ERR_OK) { + ld a,(_result) or a -;source-doc/ufi-drv/./usb_cbi.c:50: return result; - jr NZ,l_usb_execute_cbi_00118 + jr NZ,l_usb_execute_cbi_00116 +;source-doc/ufi-drv/./usb_cbi.c:52: goto done; l_usb_execute_cbi_00113: -;source-doc/ufi-drv/./usb_cbi.c:54: if (sense_codes != NULL) { +;source-doc/ufi-drv/./usb_cbi.c:56: if (sense_codes != NULL) { ld a,(ix+14) or (ix+13) - jr Z,l_usb_execute_cbi_00117 -;source-doc/ufi-drv/./usb_cbi.c:55: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + jr Z,l_usb_execute_cbi_00116 +;source-doc/ufi-drv/./usb_cbi.c:57: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); ld a,0x02 push af inc sp @@ -201,16 +210,16 @@ l_usb_execute_cbi_00113: pop af pop af inc sp -;source-doc/ufi-drv/./usb_cbi.c:57: if (result != USB_ERR_OK) { ld a, l - or a -;source-doc/ufi-drv/./usb_cbi.c:59: return result; - jr NZ,l_usb_execute_cbi_00118 -l_usb_execute_cbi_00117: -;source-doc/ufi-drv/./usb_cbi.c:63: return USB_ERR_OK; - ld l,0x00 -l_usb_execute_cbi_00118: -;source-doc/ufi-drv/./usb_cbi.c:64: } + ld (_result), a +;source-doc/ufi-drv/./usb_cbi.c:65: done: +l_usb_execute_cbi_00116: +;source-doc/ufi-drv/./usb_cbi.c:66: critical_end(); + call _critical_end +;source-doc/ufi-drv/./usb_cbi.c:68: return result; + ld hl,_result + ld l, (hl) +;source-doc/ufi-drv/./usb_cbi.c:69: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 9111a045..c6a3c706 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -15,8 +15,67 @@ #include "./ch376-native/keyboard.s" +; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) +SCAN_INT_PERIOD: .EQU 3 + +; VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE +; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD +UKY_SCNCNT: .DB SCAN_INT_PERIOD + + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +UKY_INTSTK: ; 128 bytes for keyboard interrupt stack - need ~52 bytes??? + +CHUKB_INIT: + ; INSTALL INTERRUPT HANDLER + LD HL, (VEC_TICK+1) + LD (VEC_CHUKB_TICK+1), HL + + LD HL, CHUKB_TICK + LD (VEC_TICK+1), HL + + JP _keyboard_init + +CHUKB_TICK: + LD A, (UKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + DEC A + LD (UKY_SCNCNT), A + JR NZ, VEC_CHUKB_TICK + + LD A, SCAN_INT_PERIOD + LD (UKY_SCNCNT), A + + ; we gonna need a bigger stack + + EZ80_UTIL_DEBUG + + LD (UKY_INT_SP),SP ; SAVE ORIGINAL STACK FRAME + LD SP,UKY_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM + + CALL _keyboard_tick + + LD SP, $FFFF ; RESTORE ORIGINAL STACK FRAME +UKY_INT_SP .EQU $ - 2 +; + + +VEC_CHUKB_TICK: + JP HB_TICK -CHUKB_INIT .EQU _keyboard_init ; ### Function 0x4C -- Keyboard Status (VDAKST) ; @@ -36,8 +95,7 @@ CHUKB_INIT .EQU _keyboard_init ; pending. ; UKY_STAT: - XOR A - RET + JP _keyboard_buf_size ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) ; @@ -50,6 +108,8 @@ UKY_STAT: ; Purged and all contents discarded. The Status (A) is a standard HBIOS result code. ; UKY_FLUSH: + CALL _keyboard_buf_flush + XOR A RET ; ; ### Function 0x4E -- Video Keyboard Read (VDAKRD) @@ -87,4 +147,14 @@ UKY_FLUSH: ; function keys and arrows, are returned as reserved codes as described at the start of this section. ; UKY_READ: + HB_DI + CALL _keyboard_buf_get_next + HB_EI + LD A, H + OR A + JR NZ, UKY_READ + LD C, 0 + LD D, 0 + ; LD E, 'A' + XOR A RET diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 2cee1798..5140109b 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -1929,7 +1929,7 @@ ROMRESUME: LD A,BID_IMG2 ; S100 MONITOR BANK LD IX,HWMON_IMGLOC ; EXECUTION RESUMES HERE CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN - HALT ; WE SHOULD NOT COME BACK HERE! + JR $ ; HALT WE SHOULD NOT COME BACK HERE! ; S100MON_SKIP: ; RESTORE DEFAULT RELOAD REGISTER VALUE (PROBABLY NOT NEEDED) @@ -2084,7 +2084,7 @@ MBC_SINGLE: LD A,BID_BIOS ; BIOS BANK ID LD IX,HB_START1 ; EXECUTION RESUMES HERE CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN - HALT ; WE SHOULD NOT COME BACK HERE! + JR $ ; HALT WE SHOULD NOT COME BACK HERE! #ENDIF ; ; EXECUTION RESUMES HERE AFTER SWITCH TO RAM BANK @@ -3884,7 +3884,7 @@ INITSYS4: #ENDIF LD IX,0 ; ENTER AT ADDRESS 0 CALL HBX_BNKCALL ; GO THERE - HALT ; WE SHOULD NEVER COME BACK! + JR $ ; HALT WE SHOULD NEVER COME BACK! ; ;-------------------------------------------------------------------------------------------------- ; TABLE OF RECOVERY MODE INITIALIZATION ENTRY POINTS @@ -5415,7 +5415,7 @@ SYS_RESWARM: #ENDIF LD IX,0 ; ENTER AT ADDRESS 0 CALL HBX_BNKCALL ; GO THERE - HALT ; WE SHOULD NEVER COME BACK! + JR $ ; HALT WE SHOULD NEVER COME BACK! #ENDIF ; ; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON @@ -6946,7 +6946,7 @@ SYSHALT: LD DE,STR_HALT CALL WRITESTR DI - HALT + JR $ ; HALT ; ;-------------------------------------------------------------------------------------------------- ; INTERRUPT MANAGEMENT SUPPORT @@ -7056,7 +7056,6 @@ HB_BADINTCNT .DB 0 CALL NEWLINE ;CALL CONTINUE OR $FF ; SIGNAL INTERRUPT HANDLED - EZ80_UTIL_DEBUG RET ; ;-------------------------------------------------------------------------------------------------- @@ -7393,7 +7392,7 @@ Z280_DIAG: ; ;RETIL DI - HALT + JR $ ; HALT ; Z280_BADINTSTR .TEXT "BAD INT $" Z280_SSTEPSTR .TEXT "SINGLE STEP $" @@ -7463,7 +7462,7 @@ Z280_PRIVINST4: ; ; GO NO FURTHER DI - HALT + JR $ ; HALT ; Z280_PRIVINSTX: ; RESTORE REGISTERS From 04dbb0e4bb315549121755ee1643bcf1f422684e Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 16 Nov 2024 10:02:57 +1100 Subject: [PATCH 06/59] ch376-native: some cleanup of build process and an initial readme added --- Source/HBIOS/ch376-native/Dockerfile | 6 - Source/HBIOS/ch376-native/Makefile | 148 +- Source/HBIOS/ch376-native/base-drv.asm | 20 +- Source/HBIOS/ch376-native/base-drv.s | 16 +- .../HBIOS/ch376-native/base-drv/ch376.c.asm | 1136 +++++++++++++ Source/HBIOS/ch376-native/base-drv/ch376.c.s | 323 ++-- .../ch376-native/base-drv/class_hub.c.asm | 458 +++++ .../HBIOS/ch376-native/base-drv/class_hub.c.s | 22 +- .../base-drv/critical-section.c.s | 6 +- .../ch376-native/base-drv/dev_transfers.c.asm | 834 ++++++++++ .../ch376-native/base-drv/dev_transfers.c.s | 345 ++-- .../ch376-native/base-drv/enumerate.c.asm | 1472 +++++++++++++++++ .../HBIOS/ch376-native/base-drv/enumerate.c.s | 524 +++--- .../ch376-native/base-drv/enumerate_hub.c.s | 160 +- .../base-drv/enumerate_storage.c.s | 77 +- .../HBIOS/ch376-native/base-drv/protocol.c.s | 182 +- .../ch376-native/base-drv/transfers.c.asm | 829 ++++++++++ .../HBIOS/ch376-native/base-drv/transfers.c.s | 160 +- .../ch376-native/base-drv/usb-base-drv.c.asm | 441 +++++ .../ch376-native/base-drv/usb-base-drv.c.s | 22 +- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 75 +- .../ch376-native/base-drv/usb_state.c.asm | 605 +++++++ .../HBIOS/ch376-native/base-drv/usb_state.c.s | 82 +- .../ch376-native/base-drv/work-area.c.asm | 520 ++++++ .../HBIOS/ch376-native/base-drv/work-area.c.s | 2 +- Source/HBIOS/ch376-native/build-docker.sh | 0 Source/HBIOS/ch376-native/cruntime.asm | 112 +- Source/HBIOS/ch376-native/keyboard.s | 2 +- .../HBIOS/ch376-native/keyboard/class_hid.c.s | 87 +- .../keyboard/class_hid_keyboard.c.s | 24 +- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 185 +-- Source/HBIOS/ch376-native/readme.md | 60 + Source/HBIOS/ch376-native/root.md | 0 Source/HBIOS/ch376-native/scsi-drv.s | 2 +- .../ch376-native/scsi-drv/class_scsi.c.s | 432 +++-- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 26 +- .../HBIOS/ch376-native/source-doc/depends.d | 30 - Source/HBIOS/ch376-native/ufi-drv.s | 2 +- .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 265 +-- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 127 +- .../HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm | 599 +++++++ Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 72 +- Source/HBIOS/util.asm | 11 - 43 files changed, 8536 insertions(+), 1965 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/Dockerfile create mode 100644 Source/HBIOS/ch376-native/base-drv/ch376.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/class_hub.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/enumerate.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/transfers.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/usb_state.c.asm create mode 100644 Source/HBIOS/ch376-native/base-drv/work-area.c.asm delete mode 100644 Source/HBIOS/ch376-native/build-docker.sh create mode 100644 Source/HBIOS/ch376-native/readme.md delete mode 100644 Source/HBIOS/ch376-native/root.md delete mode 100644 Source/HBIOS/ch376-native/source-doc/depends.d create mode 100644 Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm diff --git a/Source/HBIOS/ch376-native/Dockerfile b/Source/HBIOS/ch376-native/Dockerfile deleted file mode 100644 index 47156098..00000000 --- a/Source/HBIOS/ch376-native/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -# Build with: docker build --progress plain -t romwbw-z88dk . -# run with : docker run -v ${PWD}:/src/ --privileged=true -u $(id -u ${USER}):$(id -g ${USER}) -it romwbw-z88dk:latest - -FROM z88dk/z88dk - -RUN apk add build-base diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 6cb8f757..ffdc9715 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -3,18 +3,21 @@ SHELLFLAGS := -c -e -x .ONESHELL: MAKEFLAGS += --warn-undefined-variables MAKEFLAGS += --no-builtin-rules - -ZCC_EXTRA := --vc -Cs --Werror - -ZCCRELFLAGS= -ifdef RELEASE -ZCCRELFLAGS=-SO3 --max-allocs-per-node600000 --allow-unsafe-read --opt-code-speed -endif +MAKEFLAGS += --always-make +ZCCRELFLAGS := -SO3 --max-allocs-per-node600000 --allow-unsafe-read --opt-code-speed SRC := ./source-doc/ LIBS := -I./$(SRC)base-drv/ +ZCCFLAGS := +z80 -vn -startup=0 -clib=sdcc_iy -crt0 $(SRC)crt.asm -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) -ZCC := zcc +z80 -vn -startup=0 -clib=sdcc_iy -crt0 $(SRC)crt.asm -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) +ZCC_PATH := $(shell command -v zcc) +ZCC := $(shell command -v zcc >/dev/null 2>&1 && echo zcc || echo 'docker run -w /host/${PWD} -v /:/host/ -u $(shell id -u ${USER}):$(shell id -g ${USER}) -t z88dk/z88dk zcc') + +ifeq ($(ZCC_PATH),) + $(info ZCC is set to use Docker to run zcc) +else + $(info ZCC is set to $(ZCC_PATH)) +endif ASSDIR := ./ @@ -30,42 +33,6 @@ clean: rm base-drv.s rm keyboard.s -$(ASSDIR)base-drv.s: - @echo "Creating base-drv.s" - echo "; Generated File -- not to be modify directly" > $(ASSDIR)base-drv.s - for dep in $^; do - dep=$${dep#*/} - dep=$${dep#*/} - echo '#include "'ch376-native/base-drv/$${dep}'"' >> $(ASSDIR)base-drv.s - done - -$(ASSDIR)scsi-drv.s: - @echo "Creating scsi-drv.s" - echo "; Generated File -- not to be modify directly" > $(ASSDIR)scsi-drv.s - for dep in $^; do - dep=$${dep#*/} - dep=$${dep#*/} - echo '#include "'ch376-native/scsi-drv/$${dep}'"' >> $(ASSDIR)scsi-drv.s - done - -$(ASSDIR)ufi-drv.s: - @echo "Creating ufi-drv.s" - echo "; Generated File -- not to be modify directly" > $(ASSDIR)ufi-drv.s - for dep in $^; do - dep=$${dep#*/} - dep=$${dep#*/} - echo '#include "'ch376-native/ufi-drv/$${dep}'"' >> $(ASSDIR)ufi-drv.s - done - -$(ASSDIR)keyboard.s: - @echo "Creating keyboard.s" - echo "; Generated File -- not to be modify directly" > $(ASSDIR)keyboard.s - for dep in $^; do - dep=$${dep#*/} - dep=$${dep#*/} - echo '#include "'ch376-native/keyboard/$${dep}'"' >> $(ASSDIR)keyboard.s - done - $(ASSDIR)%.c.s: $(ASSDIR)%.c.asm @mkdir -p $(dir $@) echo "Converting $< to $@" @@ -78,87 +45,30 @@ $(ASSDIR)%.s: $(SRC)%.asm define compile @mkdir -p $(dir $@) - $(ZCC) --c-code-in-asm --assemble-only $< -o $@ + $(ZCC) $(ZCCFLAGS) --c-code-in-asm --assemble-only $< -o $@ echo "Compiled $(notdir $@) from $(notdir $<)" endef -$(ASSDIR)base-drv/%.c.asm: $(SRC)base-drv/%.c; $(compile) -$(ASSDIR)scsi-drv/%.c.asm: $(SRC)scsi-drv/%.c; $(compile) -$(ASSDIR)keyboard/%.c.asm: $(SRC)keyboard/%.c; $(compile) -$(ASSDIR)ufi-drv/%.c.asm: $(SRC)ufi-drv/%.c; $(compile) -$(ASSDIR)%.c.asm: $(SRC)%.c; $(compile) -$(ASSDIR)libraries/delay/%.c.asm: ../apps/libraries/delay/%.c; $(compile) -$(ASSDIR)libraries/usb/%.c.asm: ../apps/libraries/usb/%.c; $(compile) - -.PHONY: format -format: SHELL:=/bin/bash -format: - @clang-format --version - find \( -name "*.c" -o -name "*.h" \) -exec echo "formating {}" \; -exec clang-format -i {} \; - ZSDCPP_FLAGS= -I"${ZCCCFG}../../include/_DEVELOPMENT/sdcc" $(LIBS) -include ${SRC}depends.d - -deps: - @echo "" > ${SRC}/depends.d - # C Dependencies - (cd ${SRC} && find -name "*.c") | while read -r file; do - file_no_ext="$${file%.*}" - file_no_ext=$${file_no_ext#./} - filename=$$(basename $$file_no_ext) - from="$$filename.o" - to="${ASSDIR}$$file_no_ext.c.s" - echo -n "$${file}: " > /tmp/deps.deps - echo -n "$${file_no_ext}.c " >> /tmp/deps.deps - z88dk-ucpp ${ZSDCPP_FLAGS} -M ./${SRC}$$file_no_ext.c >> /tmp/deps.deps - touch /tmp/deps.deps - sed "s+$$from+$$to+g" /tmp/deps.deps >> ${SRC}/depends.d - done - - # configure base-drv.s to all .s files - printf "##\r\n" >> ${SRC}/depends.d - printf "./base-drv.s: " >> ${SRC}/depends.d - (cd ${SRC}/base-drv && find -name "*.c") | while read -r file; do - file_no_ext="$${file%.*}" - file_no_ext=$${file_no_ext#./} - filename=$$(basename $$file_no_ext) - printf "base-drv/$$file.s " >> ${SRC}/depends.d +define build_subsystem = +$$(ASSDIR)$(1).s: + @echo "Creating $(1).s" + echo "; Generated File -- not to be modify directly" > $$(ASSDIR)$(1).s + for dep in $$^; do + dep=$$$${dep#*/} + dep=$$$${dep#*/} + echo '#include "'ch376-native/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s done - printf "\r\n" >> ${SRC}/depends.d - # # configure scsi-drv.s to all .s files - printf "##\r\n" >> ${SRC}/depends.d - printf "./scsi-drv.s: " >> ${SRC}/depends.d - (cd ${SRC}/scsi-drv && find -name "*.c") | while read -r file; do - file_no_ext="$${file%.*}" - file_no_ext=$${file_no_ext#./} - filename=$$(basename $$file_no_ext) - printf "scsi-drv/$$file.s " >> ${SRC}/depends.d - done - - printf "\r\n" >> ${SRC}/depends.d - # # configure ufi-drv.s to all .s files - printf "##\r\n" >> ${SRC}/depends.d - printf "./ufi-drv.s: " >> ${SRC}/depends.d - (cd ${SRC}/ufi-drv && find -name "*.c") | while read -r file; do - file_no_ext="$${file%.*}" - file_no_ext=$${file_no_ext#./} - filename=$$(basename $$file_no_ext) - printf "ufi-drv/$$file.s " >> ${SRC}/depends.d - done +$$(ASSDIR)$(1)/%.c.asm: $$(SRC)$(1)/%.c; $$(compile) - printf "\r\n" >> ${SRC}/depends.d - # # configure keyboard.s to all .s files - printf "##\r\n" >> ${SRC}/depends.d - printf "./keyboard.s: " >> ${SRC}/depends.d - (cd ${SRC}/keyboard && find -name "*.c") | while read -r file; do - file_no_ext="$${file%.*}" - file_no_ext=$${file_no_ext#./} - filename=$$(basename $$file_no_ext) - printf "keyboard/$$file.s " >> ${SRC}/depends.d - done - - echo "" >> ${SRC}/depends.d +$(1)_C_FILES := $$(wildcard $$(SRC)$(1)/*.c) +$(1)_S_FILES := $$(patsubst ./source-doc/%, ./%, $$($(1)_C_FILES:.c=.c.s)) +./$(1).s: $$($(1)_S_FILES) +endef - echo "${SRC}depends.d created" +$(eval $(call build_subsystem,base-drv)) +$(eval $(call build_subsystem,scsi-drv)) +$(eval $(call build_subsystem,keyboard)) +$(eval $(call build_subsystem,ufi-drv)) diff --git a/Source/HBIOS/ch376-native/base-drv.asm b/Source/HBIOS/ch376-native/base-drv.asm index 12e1c250..67583ba6 100644 --- a/Source/HBIOS/ch376-native/base-drv.asm +++ b/Source/HBIOS/ch376-native/base-drv.asm @@ -1,10 +1,10 @@ DELAY_FACTOR .EQU 640 -CMD01_RD_USB_DATA0 .EQU 0x27 ; Read data block from current USB interrupt endpoint buffer or host endpoint receive buffer +CMD01_RD_USB_DATA0 .EQU $27 ; Read data block from current USB interrupt endpoint buffer or host endpoint receive buffer ; output: length, data stream -CMD10_WR_HOST_DATA .EQU 0x2C ; Write a data block to the send buffer of the USB host endpoint +CMD10_WR_HOST_DATA .EQU $2C ; Write a data block to the send buffer of the USB host endpoint ; input: length, data stream CH_CMD_RD_USB_DATA0 .EQU CMD01_RD_USB_DATA0 @@ -36,26 +36,25 @@ keep_waiting: or l jr nz, _ch_wait_int_and_get_status - CALL _delay + call _delay ld a, $FF - in a, (_CH376_COMMAND_PORT & 0xFF) - bit 4, a ; _CH376_COMMAND_PORT & PARA_STATE_BUSY + in a, (_CH376_COMMAND_PORT & $FF) + bit 4, a ; _CH376_COMMAND_PORT & PARA_STATE_BUSY - ld l, 0x0C ; USB_ERR_CH376_BLOCKED; + ld l, $0C ; USB_ERR_CH376_BLOCKED; ret nz - ld l, 0x0D ; USB_ERR_CH376_TIMEOUT + ld l, $0D ; USB_ERR_CH376_TIMEOUT ret ; uint8_t ch_read_data(uint8_t *buffer) __sdcccall(1); _ch_read_data: - ; ch_command(CH_CMD_RD_USB_DATA0); push hl ld l, CH_CMD_RD_USB_DATA0 call _ch_command pop hl - CALL _delay + call _delay ld bc, _CH376_DATA_PORT in a, (c) @@ -65,7 +64,7 @@ _ch_read_data: ld e, a push af read_block: - CALL _delay + call _delay in a, (c) ld (hl), a inc hl @@ -77,7 +76,6 @@ read_block: ;const uint8_t *ch_write_data(const uint8_t *buffer, uint8_t length) _ch_write_data: -;libraries/usb/ch376.c:125: ch_command(CH_CMD_WR_HOST_DATA); ld l, CH_CMD_WR_HOST_DATA call _ch_command diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index cb623d53..fb66e985 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -1,14 +1,14 @@ ; Generated File -- not to be modify directly -#include "ch376-native/base-drv/dev_transfers.c.s" +#include "ch376-native/base-drv/ch376.c.s" +#include "ch376-native/base-drv/class_hub.c.s" #include "ch376-native/base-drv/critical-section.c.s" +#include "ch376-native/base-drv/dev_transfers.c.s" #include "ch376-native/base-drv/enumerate.c.s" -#include "ch376-native/base-drv/usb_state.c.s" -#include "ch376-native/base-drv/class_hub.c.s" -#include "ch376-native/base-drv/enumerate_storage.c.s" #include "ch376-native/base-drv/enumerate_hub.c.s" -#include "ch376-native/base-drv/usb-base-drv.c.s" -#include "ch376-native/base-drv/transfers.c.s" -#include "ch376-native/base-drv/ch376.c.s" +#include "ch376-native/base-drv/enumerate_storage.c.s" #include "ch376-native/base-drv/protocol.c.s" -#include "ch376-native/base-drv/work-area.c.s" +#include "ch376-native/base-drv/transfers.c.s" +#include "ch376-native/base-drv/usb-base-drv.c.s" #include "ch376-native/base-drv/usb-init.c.s" +#include "ch376-native/base-drv/usb_state.c.s" +#include "ch376-native/base-drv/work-area.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.asm b/Source/HBIOS/ch376-native/base-drv/ch376.c.asm new file mode 100644 index 00000000..f698491b --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.asm @@ -0,0 +1,1136 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _ch_issue_token_out + GLOBAL _ch_issue_token_in + GLOBAL _ch_issue_token + GLOBAL _result + GLOBAL _ch_command + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_probe + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_in_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_out_transfer + GLOBAL _ch_set_usb_address +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _ch_wait_int_and_get_status + GLOBAL _print_uint16 + GLOBAL _print_string + GLOBAL _print_hex + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_write_data + GLOBAL _ch_read_data + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + +_result: + DEFS 1 + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/ch376.c:8: void ch_command(const uint8_t command) __z88dk_fastcall { +; --------------------------------- +; Function ch_command +; --------------------------------- +_ch_command: +;source-doc/base-drv/ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) + ld c,0xff +l_ch_command_00102: + ld a, +((_CH376_COMMAND_PORT) / 256) + in a, (((_CH376_COMMAND_PORT) & 0xFF)) + bit 4, a + jr Z,l_ch_command_00104 + dec c + jr NZ,l_ch_command_00102 +l_ch_command_00104: +;source-doc/base-drv/ch376.c:21: CH376_COMMAND_PORT = command; + ld a, l + ld bc,_CH376_COMMAND_PORT + out (c),a +;source-doc/base-drv/ch376.c:22: } + ret +;source-doc/base-drv/ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } +; --------------------------------- +; Function ch_long_wait_int_and_get_status +; --------------------------------- +_ch_long_wait_int_and_get_status: + ld hl,0x1388 + jp _ch_wait_int_and_get_status +;source-doc/base-drv/ch376.c:28: usb_error ch_short_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(100); } +; --------------------------------- +; Function ch_short_wait_int_and_get_status +; --------------------------------- +_ch_short_wait_int_and_get_status: + ld hl,0x0064 + jp _ch_wait_int_and_get_status +;source-doc/base-drv/ch376.c:30: usb_error ch_very_short_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(10); } +; --------------------------------- +; Function ch_very_short_wait_int_and_get_status +; --------------------------------- +_ch_very_short_wait_int_and_get_status: + ld hl,0x000a + jp _ch_wait_int_and_get_status +;source-doc/base-drv/ch376.c:32: usb_error ch_get_status(void) { +; --------------------------------- +; Function ch_get_status +; --------------------------------- +_ch_get_status: +;source-doc/base-drv/ch376.c:33: ch_command(CH_CMD_GET_STATUS); + ld l,0x22 + call _ch_command +;source-doc/base-drv/ch376.c:34: uint8_t ch_status = CH376_DATA_PORT; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) +;source-doc/base-drv/ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) + ld l,a + sub a,0x41 + jr C,l_ch_get_status_00102 + ld a,0xb4 + sub a, l +;source-doc/base-drv/ch376.c:37: return ch_status; + jr NC,l_ch_get_status_00126 +l_ch_get_status_00102: +;source-doc/base-drv/ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) + ld a, l +;source-doc/base-drv/ch376.c:40: return USB_ERR_OK; + sub a,0x51 + jr NZ,l_ch_get_status_00105 + ld l,a + jr l_ch_get_status_00126 +l_ch_get_status_00105: +;source-doc/base-drv/ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) + ld a, l +;source-doc/base-drv/ch376.c:43: return USB_ERR_OK; + sub a,0x14 + jr NZ,l_ch_get_status_00107 + ld l,a + jr l_ch_get_status_00126 +l_ch_get_status_00107: +;source-doc/base-drv/ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) + ld a, l + sub a,0x15 + jr NZ,l_ch_get_status_00109 +;source-doc/base-drv/ch376.c:46: return USB_INT_CONNECT; + ld l,0x81 + jr l_ch_get_status_00126 +l_ch_get_status_00109: +;source-doc/base-drv/ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) + ld a, l + sub a,0x1d + jr NZ,l_ch_get_status_00111 +;source-doc/base-drv/ch376.c:49: return USB_ERR_DISK_READ; + ld l,0x1d + jr l_ch_get_status_00126 +l_ch_get_status_00111: +;source-doc/base-drv/ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) + ld a, l + sub a,0x1e + jr NZ,l_ch_get_status_00113 +;source-doc/base-drv/ch376.c:52: return USB_ERR_DISK_WRITE; + ld l,0x1e + jr l_ch_get_status_00126 +l_ch_get_status_00113: +;source-doc/base-drv/ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { + ld a, l + sub a,0x16 + jr NZ,l_ch_get_status_00115 +;source-doc/base-drv/ch376.c:55: ch_cmd_set_usb_mode(5); + ld l,0x05 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/ch376.c:56: return USB_ERR_NO_DEVICE; + ld l,0x05 + jr l_ch_get_status_00126 +l_ch_get_status_00115: +;source-doc/base-drv/ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) + ld a, l + sub a,0x17 + jr NZ,l_ch_get_status_00117 +;source-doc/base-drv/ch376.c:60: return USB_ERR_DATA_ERROR; + ld l,0x04 + jr l_ch_get_status_00126 +l_ch_get_status_00117: +;source-doc/base-drv/ch376.c:62: ch_status &= 0x2F; + ld a, l + and a,0x2f +;source-doc/base-drv/ch376.c:64: if (ch_status == 0x2A) + cp a,0x2a + jr NZ,l_ch_get_status_00119 +;source-doc/base-drv/ch376.c:65: return USB_ERR_NAK; + ld l,0x01 + jr l_ch_get_status_00126 +l_ch_get_status_00119: +;source-doc/base-drv/ch376.c:67: if (ch_status == 0x2E) + cp a,0x2e + jr NZ,l_ch_get_status_00121 +;source-doc/base-drv/ch376.c:68: return USB_ERR_STALL; + ld l,0x02 + jr l_ch_get_status_00126 +l_ch_get_status_00121: +;source-doc/base-drv/ch376.c:70: ch_status &= 0x23; + and a,0x23 +;source-doc/base-drv/ch376.c:72: if (ch_status == 0x20) + cp a,0x20 + jr NZ,l_ch_get_status_00123 +;source-doc/base-drv/ch376.c:73: return USB_ERR_TIMEOUT; + ld l,0x03 + jr l_ch_get_status_00126 +l_ch_get_status_00123: +;source-doc/base-drv/ch376.c:75: if (ch_status == 0x23) + sub a,0x23 + jr NZ,l_ch_get_status_00125 +;source-doc/base-drv/ch376.c:76: return USB_TOKEN_OUT_OF_SYNC; + ld l,0x07 + jr l_ch_get_status_00126 +l_ch_get_status_00125: +;source-doc/base-drv/ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_HOST; + ld l,0x08 +l_ch_get_status_00126: +;source-doc/base-drv/ch376.c:79: } + ret +;source-doc/base-drv/ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } +; --------------------------------- +; Function ch_cmd_reset_all +; --------------------------------- +_ch_cmd_reset_all: + ld l,0x05 + jp _ch_command +;source-doc/base-drv/ch376.c:100: uint8_t ch_probe(void) { +; --------------------------------- +; Function ch_probe +; --------------------------------- +_ch_probe: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/ch376.c:102: do { + ld (ix-1),0x05 +l_ch_probe_00103: +;source-doc/base-drv/ch376.c:85: ch_command(CH_CMD_CHECK_EXIST); + ld l,0x06 + call _ch_command +;source-doc/base-drv/ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; + ld a,0xaa + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/ch376.c:87: delay(); + call _delay +;source-doc/base-drv/ch376.c:88: complement = CH376_DATA_PORT; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) +;source-doc/base-drv/ch376.c:89: return complement == 0x55; + sub a,0x55 + jr NZ,l_ch_probe_00102 +;source-doc/base-drv/ch376.c:103: if (ch_cmd_check_exist()) +;source-doc/base-drv/ch376.c:104: return true; + ld l,0x01 + jr l_ch_probe_00107 +l_ch_probe_00102: +;source-doc/base-drv/ch376.c:106: delay_medium(); + call _delay_medium +;source-doc/base-drv/ch376.c:107: } while (--i != 0); + dec (ix-1) + jr NZ,l_ch_probe_00103 +;source-doc/base-drv/ch376.c:109: return false; + ld l,0x00 +l_ch_probe_00107: +;source-doc/base-drv/ch376.c:110: } + inc sp + pop ix + ret +;source-doc/base-drv/ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +; --------------------------------- +; Function ch_cmd_set_usb_mode +; --------------------------------- +_ch_cmd_set_usb_mode: + ld c, l +;source-doc/base-drv/ch376.c:113: uint8_t result = 0; + ld b,0x00 +;source-doc/base-drv/ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; + ld a,0x15 + push bc + ld bc,_CH376_COMMAND_PORT + out (c),a + call _delay + pop bc +;source-doc/base-drv/ch376.c:117: CH376_DATA_PORT = mode; + ld a, c + push bc + ld bc,_CH376_DATA_PORT + out (c),a + call _delay + pop bc +;source-doc/base-drv/ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { + ld c,0x7f +l_ch_cmd_set_usb_mode_00103: + ld a, b + sub a,0x51 + jr NZ,l_ch_cmd_set_usb_mode_00146 + ld a,0x01 + jr l_ch_cmd_set_usb_mode_00147 +l_ch_cmd_set_usb_mode_00146: + xor a,a +l_ch_cmd_set_usb_mode_00147: + ld e,a + bit 0,a + jr NZ,l_ch_cmd_set_usb_mode_00105 + ld a, b + sub a,0x5f + jr Z,l_ch_cmd_set_usb_mode_00105 + dec c + jr Z,l_ch_cmd_set_usb_mode_00105 +;source-doc/base-drv/ch376.c:123: result = CH376_DATA_PORT; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) + ld b, a +;source-doc/base-drv/ch376.c:124: delay(); + push bc + call _delay + pop bc + jr l_ch_cmd_set_usb_mode_00103 +l_ch_cmd_set_usb_mode_00105: +;source-doc/base-drv/ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; + ld a, e + or a, a + jr Z,l_ch_cmd_set_usb_mode_00108 + ld l,0x00 + jr l_ch_cmd_set_usb_mode_00109 +l_ch_cmd_set_usb_mode_00108: + ld l,0x0e +l_ch_cmd_set_usb_mode_00109: +;source-doc/base-drv/ch376.c:128: } + ret +;source-doc/base-drv/ch376.c:130: uint8_t ch_cmd_get_ic_version(void) { +; --------------------------------- +; Function ch_cmd_get_ic_version +; --------------------------------- +_ch_cmd_get_ic_version: +;source-doc/base-drv/ch376.c:131: ch_command(CH_CMD_GET_IC_VER); + ld l,0x01 + call _ch_command +;source-doc/base-drv/ch376.c:132: return CH376_DATA_PORT & 0x1f; + ld a, +((_CH376_DATA_PORT) / 256) + in a, (((_CH376_DATA_PORT) & 0xFF)) + and a,0x1f + ld l, a +;source-doc/base-drv/ch376.c:133: } + ret +;source-doc/base-drv/ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { +; --------------------------------- +; Function ch_issue_token +; --------------------------------- +_ch_issue_token: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X); + ld l,0x4e + call _ch_command +;source-doc/base-drv/ch376.c:137: CH376_DATA_PORT = toggle_bit; + ld a,(ix+4) + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; + ld a,(ix+5) + add a, a + add a, a + add a, a + add a, a + or a,(ix+6) + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/ch376.c:139: } + pop ix + ret +;source-doc/base-drv/ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { +; --------------------------------- +; Function ch_issue_token_in +; --------------------------------- +_ch_issue_token_in: +;source-doc/base-drv/ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); + ld e,l + ld d,h + ld a, (hl) + rrca + and a,0x07 + ld b, a + ex de, hl + ld a, (hl) + and a,0x01 + jr Z,l_ch_issue_token_in_00103 + ld a,0x80 + jr l_ch_issue_token_in_00104 +l_ch_issue_token_in_00103: + xor a, a +l_ch_issue_token_in_00104: + ld h,0x09 + ld l,b + push hl + push af + inc sp + call _ch_issue_token + pop af + inc sp +;source-doc/base-drv/ch376.c:143: } + ret +;source-doc/base-drv/ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { +; --------------------------------- +; Function ch_issue_token_out +; --------------------------------- +_ch_issue_token_out: +;source-doc/base-drv/ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); + ld e,l + ld d,h + ld a, (hl) + rrca + and a,0x07 + ld b, a + ex de, hl + ld a, (hl) + and a,0x01 + jr Z,l_ch_issue_token_out_00103 + ld a,0x40 + jr l_ch_issue_token_out_00104 +l_ch_issue_token_out_00103: + xor a, a +l_ch_issue_token_out_00104: + ld h,0x01 + ld l,b + push hl + push af + inc sp + call _ch_issue_token + pop af + inc sp +;source-doc/base-drv/ch376.c:147: } + ret +;source-doc/base-drv/ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } +; --------------------------------- +; Function ch_issue_token_out_ep0 +; --------------------------------- +_ch_issue_token_out_ep0: + ld a,0x01 + push af + inc sp + xor a, a + ld d,a + ld e,0x40 + push de + call _ch_issue_token + pop af + inc sp + ret +;source-doc/base-drv/ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } +; --------------------------------- +; Function ch_issue_token_in_ep0 +; --------------------------------- +_ch_issue_token_in_ep0: + ld a,0x09 + push af + inc sp + xor a, a + ld d,a + ld e,0x80 + push de + call _ch_issue_token + pop af + inc sp + ret +;source-doc/base-drv/ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } +; --------------------------------- +; Function ch_issue_token_setup +; --------------------------------- +_ch_issue_token_setup: + ld a,0x0d + push af + inc sp + xor a, a + push af + inc sp + xor a, a + push af + inc sp + call _ch_issue_token + pop af + inc sp + ret +;source-doc/base-drv/ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { +; --------------------------------- +; Function ch_data_in_transfer +; --------------------------------- +_ch_data_in_transfer: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/ch376.c:158: if (buffer_size == 0) + ld a,(ix+7) + or a,(ix+6) + jr NZ,l_ch_data_in_transfer_00102 +;source-doc/base-drv/ch376.c:159: return USB_ERR_OK; + ld l,0x00 + jp l_ch_data_in_transfer_00111 +l_ch_data_in_transfer_00102: +;source-doc/base-drv/ch376.c:161: USB_MODULE_LEDS = 0x01; + ld a,0x01 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:162: do { + ld c,(ix+8) + ld b,(ix+9) + pop de + push bc +l_ch_data_in_transfer_00107: +;source-doc/base-drv/ch376.c:163: ch_issue_token_in(endpoint); + ld l,c + ld h,b + push hl + call _ch_issue_token_in + call _ch_long_wait_int_and_get_status + pop bc + ld a, l + ld (_result), a +;source-doc/base-drv/ch376.c:166: CHECK(result); + ld a,(_result) + or a, a + jr NZ,l_ch_data_in_transfer_00110 +;source-doc/base-drv/ch376.c:168: endpoint->toggle = !endpoint->toggle; + ld e, c + ld d, b + pop hl + ld a,(hl) + push hl + and a,0x01 + xor a,0x01 + and a,0x01 + ld l, a + ld a, (de) + and a,0xfe + or a, l + ld (de), a +;source-doc/base-drv/ch376.c:170: count = ch_read_data(buffer); + push bc + ld l,(ix+4) + ld h,(ix+5) + call _ch_read_data + ld e, a + pop bc +;source-doc/base-drv/ch376.c:172: if (count == 0) { + ld a, e +;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00; + or a,a + jr NZ,l_ch_data_in_transfer_00106 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; + ld l,0x04 + jr l_ch_data_in_transfer_00111 +l_ch_data_in_transfer_00106: +;source-doc/base-drv/ch376.c:177: buffer += count; + ld a,(ix+4) + add a, e + ld (ix+4),a + jr NC,l_ch_data_in_transfer_00148 + inc (ix+5) +l_ch_data_in_transfer_00148: +;source-doc/base-drv/ch376.c:178: buffer_size -= count; + ld d,0x00 + ld a,(ix+6) + sub a, e + ld (ix+6),a + ld a,(ix+7) + sbc a, d + ld (ix+7),a +;source-doc/base-drv/ch376.c:179: } while (buffer_size > 0); + xor a, a + cp a,(ix+6) + sbc a,(ix+7) + jp PO, l_ch_data_in_transfer_00149 + xor a,0x80 +l_ch_data_in_transfer_00149: + jp M, l_ch_data_in_transfer_00107 +;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:183: return USB_ERR_OK; + ld l,0x00 + jr l_ch_data_in_transfer_00111 +;source-doc/base-drv/ch376.c:184: done: +l_ch_data_in_transfer_00110: +;source-doc/base-drv/ch376.c:185: return result; + ld hl,(_result) + ld h,+((_result) / 256) +l_ch_data_in_transfer_00111: +;source-doc/base-drv/ch376.c:186: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +; --------------------------------- +; Function ch_data_in_transfer_n +; --------------------------------- +_ch_data_in_transfer_n: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/ch376.c:192: USB_MODULE_LEDS = 0x01; + ld a,0x01 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:194: ch_issue_token_in(endpoint); + ld l,(ix+8) + ld h,(ix+9) + call _ch_issue_token_in +;source-doc/base-drv/ch376.c:196: CHECK(ch_long_wait_int_and_get_status()); + call _ch_long_wait_int_and_get_status + ld a, l + ld b, a + or a, a + jr NZ,l_ch_data_in_transfer_n_00103 +;source-doc/base-drv/ch376.c:198: endpoint->toggle = !endpoint->toggle; + ld e,(ix+8) + ld d,(ix+9) + ld c, e + ld b, d + ex de, hl + ld a, (hl) + and a,0x01 + xor a,0x01 + and a,0x01 + ld e, a + ld a, (bc) + and a,0xfe + or a, e + ld (bc), a +;source-doc/base-drv/ch376.c:200: count = ch_read_data(buffer); + ld l,(ix+4) + ld h,(ix+5) + call _ch_read_data +;source-doc/base-drv/ch376.c:202: *buffer_size = count; + ld c,(ix+6) + ld b,(ix+7) + ld (bc), a +;source-doc/base-drv/ch376.c:204: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:206: return USB_ERR_OK; + ld l,0x00 + jr l_ch_data_in_transfer_n_00104 +;source-doc/base-drv/ch376.c:207: done: +l_ch_data_in_transfer_n_00103: +;source-doc/base-drv/ch376.c:208: return result; + ld l, b +l_ch_data_in_transfer_n_00104: +;source-doc/base-drv/ch376.c:209: } + pop ix + ret +;source-doc/base-drv/ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +; --------------------------------- +; Function ch_data_out_transfer +; --------------------------------- +_ch_data_out_transfer: + push ix + ld ix,0 + add ix,sp + push af + dec sp +;source-doc/base-drv/ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); + ld c,(ix+8) + ld b,(ix+9) + ld e, c + ld d, b + inc de + ld a, (de) + ld (ix-3),a +;source-doc/base-drv/ch376.c:216: USB_MODULE_LEDS = 0x02; + ld a,0x02 + push bc + ld bc,_USB_MODULE_LEDS + out (c),a + pop bc +;source-doc/base-drv/ch376.c:218: while (buffer_length > 0) { + ld (ix-2),c + ld (ix-1),b +l_ch_data_out_transfer_00103: + xor a, a + cp a,(ix+6) + sbc a,(ix+7) + jp PO, l_ch_data_out_transfer_00139 + xor a,0x80 +l_ch_data_out_transfer_00139: + jp P, l_ch_data_out_transfer_00105 +;source-doc/base-drv/ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; + ld d,(ix-3) + ld e,0x00 + ld a, d + sub a,(ix+6) + ld a, e + sbc a,(ix+7) + jp PO, l_ch_data_out_transfer_00140 + xor a,0x80 +l_ch_data_out_transfer_00140: + jp P, l_ch_data_out_transfer_00109 + jr l_ch_data_out_transfer_00110 +l_ch_data_out_transfer_00109: + ld d,(ix+6) + ld e,(ix+7) +l_ch_data_out_transfer_00110: +;source-doc/base-drv/ch376.c:220: buffer = ch_write_data(buffer, size); + push bc + push de + push de + inc sp + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ch_write_data + pop af + inc sp + pop de + pop bc + ld (ix+4),l + ld (ix+5),h +;source-doc/base-drv/ch376.c:221: buffer_length -= size; + ld e,0x00 + ld a,(ix+6) + sub a, d + ld (ix+6),a + ld a,(ix+7) + sbc a, e + ld (ix+7),a +;source-doc/base-drv/ch376.c:222: ch_issue_token_out(endpoint); + ld l,c + ld h,b + push hl + call _ch_issue_token_out + call _ch_long_wait_int_and_get_status + ld a, l + pop bc + ld l, a + or a, a + jr NZ,l_ch_data_out_transfer_00106 +;source-doc/base-drv/ch376.c:226: endpoint->toggle = !endpoint->toggle; + ld e, c + ld d, b + ld l,(ix-2) + ld h,(ix-1) + ld a, (hl) + and a,0x01 + xor a,0x01 + and a,0x01 + ld l, a + ld a, (de) + and a,0xfe + or a, l + ld (de), a + jr l_ch_data_out_transfer_00103 +l_ch_data_out_transfer_00105: +;source-doc/base-drv/ch376.c:229: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:231: return USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/ch376.c:232: done: +;source-doc/base-drv/ch376.c:233: return result; +l_ch_data_out_transfer_00106: +;source-doc/base-drv/ch376.c:234: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +; --------------------------------- +; Function ch_set_usb_address +; --------------------------------- +_ch_set_usb_address: +;source-doc/base-drv/ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR); + push hl + ld l,0x13 + call _ch_command + pop hl +;source-doc/base-drv/ch376.c:238: CH376_DATA_PORT = device_address; + ld a, l + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/ch376.c:239: } + ret + SECTION data_compiler +_result: + DEFB +0x00 + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 8e731447..746f8893 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./ch376.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/ch376.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -50,12 +50,12 @@ _result: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./ch376.c:8: void ch_command(const uint8_t command) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:8: void ch_command(const uint8_t command) __z88dk_fastcall { ; --------------------------------- ; Function ch_command ; --------------------------------- _ch_command: -;source-doc/base-drv/./ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) +;source-doc/base-drv/ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) ld c,0xff l_ch_command_00102: ld a, +((_CH376_COMMAND_PORT) / 256) @@ -65,223 +65,224 @@ l_ch_command_00102: dec c jr NZ,l_ch_command_00102 l_ch_command_00104: -;source-doc/base-drv/./ch376.c:21: CH376_COMMAND_PORT = command; +;source-doc/base-drv/ch376.c:21: CH376_COMMAND_PORT = command; ld a, l ld bc,_CH376_COMMAND_PORT out (c),a -;source-doc/base-drv/./ch376.c:22: } +;source-doc/base-drv/ch376.c:22: } ret -;source-doc/base-drv/./ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } +;source-doc/base-drv/ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } ; --------------------------------- ; Function ch_long_wait_int_and_get_status ; --------------------------------- _ch_long_wait_int_and_get_statu: ld hl,0x1388 jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:28: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } +;source-doc/base-drv/ch376.c:28: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } ; --------------------------------- ; Function ch_short_wait_int_and_get_statu ; --------------------------------- _ch_short_wait_int_and_get_stat: ld hl,0x0064 jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:30: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } +;source-doc/base-drv/ch376.c:30: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } ; --------------------------------- ; Function ch_very_short_wait_int_and_get_ ; --------------------------------- _ch_very_short_wait_int_and_get: ld hl,0x000a jp _ch_wait_int_and_get_status -;source-doc/base-drv/./ch376.c:32: usb_error ch_get_status(void) { +;source-doc/base-drv/ch376.c:32: usb_error ch_get_status(void) { ; --------------------------------- ; Function ch_get_status ; --------------------------------- _ch_get_status: -;source-doc/base-drv/./ch376.c:33: ch_command(CH_CMD_GET_STATUS); +;source-doc/base-drv/ch376.c:33: ch_command(CH_CMD_GET_STATUS); ld l,0x22 call _ch_command -;source-doc/base-drv/./ch376.c:34: uint8_t ch_status = CH376_DATA_PORT; +;source-doc/base-drv/ch376.c:34: uint8_t ch_status = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/./ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) +;source-doc/base-drv/ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) ld l,a sub 0x41 jr C,l_ch_get_status_00102 ld a,0xb4 sub l -;source-doc/base-drv/./ch376.c:37: return ch_status; +;source-doc/base-drv/ch376.c:37: return ch_status; jr NC,l_ch_get_status_00126 l_ch_get_status_00102: -;source-doc/base-drv/./ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) +;source-doc/base-drv/ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) ld a, l -;source-doc/base-drv/./ch376.c:40: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:40: return USB_ERR_OK; sub 0x51 jr NZ,l_ch_get_status_00105 ld l,a jr l_ch_get_status_00126 l_ch_get_status_00105: -;source-doc/base-drv/./ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) +;source-doc/base-drv/ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) ld a, l -;source-doc/base-drv/./ch376.c:43: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:43: return USB_ERR_OK; sub 0x14 jr NZ,l_ch_get_status_00107 ld l,a jr l_ch_get_status_00126 l_ch_get_status_00107: -;source-doc/base-drv/./ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) +;source-doc/base-drv/ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) ld a, l sub 0x15 jr NZ,l_ch_get_status_00109 -;source-doc/base-drv/./ch376.c:46: return USB_INT_CONNECT; +;source-doc/base-drv/ch376.c:46: return USB_INT_CONNECT; ld l,0x81 jr l_ch_get_status_00126 l_ch_get_status_00109: -;source-doc/base-drv/./ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) +;source-doc/base-drv/ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) ld a, l sub 0x1d jr NZ,l_ch_get_status_00111 -;source-doc/base-drv/./ch376.c:49: return USB_ERR_DISK_READ; +;source-doc/base-drv/ch376.c:49: return USB_ERR_DISK_READ; ld l,0x1d jr l_ch_get_status_00126 l_ch_get_status_00111: -;source-doc/base-drv/./ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) +;source-doc/base-drv/ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) ld a, l sub 0x1e jr NZ,l_ch_get_status_00113 -;source-doc/base-drv/./ch376.c:52: return USB_ERR_DISK_WRITE; +;source-doc/base-drv/ch376.c:52: return USB_ERR_DISK_WRITE; ld l,0x1e jr l_ch_get_status_00126 l_ch_get_status_00113: -;source-doc/base-drv/./ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { +;source-doc/base-drv/ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { ld a, l sub 0x16 jr NZ,l_ch_get_status_00115 -;source-doc/base-drv/./ch376.c:55: ch_cmd_set_usb_mode(5); +;source-doc/base-drv/ch376.c:55: ch_cmd_set_usb_mode(5); ld l,0x05 call _ch_cmd_set_usb_mode -;source-doc/base-drv/./ch376.c:56: return USB_ERR_NO_DEVICE; +;source-doc/base-drv/ch376.c:56: return USB_ERR_NO_DEVICE; ld l,0x05 jr l_ch_get_status_00126 l_ch_get_status_00115: -;source-doc/base-drv/./ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) +;source-doc/base-drv/ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) ld a, l sub 0x17 jr NZ,l_ch_get_status_00117 -;source-doc/base-drv/./ch376.c:60: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/ch376.c:60: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_get_status_00126 l_ch_get_status_00117: -;source-doc/base-drv/./ch376.c:62: ch_status &= 0x2F; +;source-doc/base-drv/ch376.c:62: ch_status &= 0x2F; ld a, l and 0x2f -;source-doc/base-drv/./ch376.c:64: if (ch_status == 0x2A) +;source-doc/base-drv/ch376.c:64: if (ch_status == 0x2A) cp 0x2a jr NZ,l_ch_get_status_00119 -;source-doc/base-drv/./ch376.c:65: return USB_ERR_NAK; +;source-doc/base-drv/ch376.c:65: return USB_ERR_NAK; ld l,0x01 jr l_ch_get_status_00126 l_ch_get_status_00119: -;source-doc/base-drv/./ch376.c:67: if (ch_status == 0x2E) +;source-doc/base-drv/ch376.c:67: if (ch_status == 0x2E) cp 0x2e jr NZ,l_ch_get_status_00121 -;source-doc/base-drv/./ch376.c:68: return USB_ERR_STALL; +;source-doc/base-drv/ch376.c:68: return USB_ERR_STALL; ld l,0x02 jr l_ch_get_status_00126 l_ch_get_status_00121: -;source-doc/base-drv/./ch376.c:70: ch_status &= 0x23; +;source-doc/base-drv/ch376.c:70: ch_status &= 0x23; and 0x23 -;source-doc/base-drv/./ch376.c:72: if (ch_status == 0x20) +;source-doc/base-drv/ch376.c:72: if (ch_status == 0x20) cp 0x20 jr NZ,l_ch_get_status_00123 -;source-doc/base-drv/./ch376.c:73: return USB_ERR_TIMEOUT; +;source-doc/base-drv/ch376.c:73: return USB_ERR_TIMEOUT; ld l,0x03 jr l_ch_get_status_00126 l_ch_get_status_00123: -;source-doc/base-drv/./ch376.c:75: if (ch_status == 0x23) +;source-doc/base-drv/ch376.c:75: if (ch_status == 0x23) sub 0x23 jr NZ,l_ch_get_status_00125 -;source-doc/base-drv/./ch376.c:76: return USB_TOKEN_OUT_OF_SYNC; +;source-doc/base-drv/ch376.c:76: return USB_TOKEN_OUT_OF_SYNC; ld l,0x07 jr l_ch_get_status_00126 l_ch_get_status_00125: -;source-doc/base-drv/./ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_; +;source-doc/base-drv/ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_; ld l,0x08 l_ch_get_status_00126: -;source-doc/base-drv/./ch376.c:79: } +;source-doc/base-drv/ch376.c:79: } ret -;source-doc/base-drv/./ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } +;source-doc/base-drv/ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } ; --------------------------------- ; Function ch_cmd_reset_all ; --------------------------------- _ch_cmd_reset_all: ld l,0x05 jp _ch_command -;source-doc/base-drv/./ch376.c:100: uint8_t ch_probe(void) { +;source-doc/base-drv/ch376.c:100: uint8_t ch_probe(void) { ; --------------------------------- ; Function ch_probe ; --------------------------------- _ch_probe: -;source-doc/base-drv/./ch376.c:102: do { - ld c,0x05 + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/ch376.c:102: do { + ld (ix-1),0x05 l_ch_probe_00103: -;source-doc/base-drv/./ch376.c:85: ch_command(CH_CMD_CHECK_EXIST); - push bc +;source-doc/base-drv/ch376.c:85: ch_command(CH_CMD_CHECK_EXIST); ld l,0x06 call _ch_command - pop bc -;source-doc/base-drv/./ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; +;source-doc/base-drv/ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; ld a,0xaa - push bc ld bc,_CH376_DATA_PORT out (c),a +;source-doc/base-drv/ch376.c:87: delay(); call _delay - pop bc -;source-doc/base-drv/./ch376.c:88: complement = CH376_DATA_PORT; +;source-doc/base-drv/ch376.c:88: complement = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/./ch376.c:89: return complement == 0x55; +;source-doc/base-drv/ch376.c:89: return complement == 0x55; sub 0x55 jr NZ,l_ch_probe_00102 -;source-doc/base-drv/./ch376.c:103: if (ch_cmd_check_exist()) -;source-doc/base-drv/./ch376.c:104: return true; +;source-doc/base-drv/ch376.c:103: if (ch_cmd_check_exist()) +;source-doc/base-drv/ch376.c:104: return true; ld l,0x01 jr l_ch_probe_00107 l_ch_probe_00102: -;source-doc/base-drv/./ch376.c:106: delay_medium(); - push bc +;source-doc/base-drv/ch376.c:106: delay_medium(); call _delay_medium - pop bc -;source-doc/base-drv/./ch376.c:107: } while (--i != 0); - dec c +;source-doc/base-drv/ch376.c:107: } while (--i != 0); + dec (ix-1) jr NZ,l_ch_probe_00103 -;source-doc/base-drv/./ch376.c:109: return false; +;source-doc/base-drv/ch376.c:109: return false; ld l,0x00 l_ch_probe_00107: -;source-doc/base-drv/./ch376.c:110: } +;source-doc/base-drv/ch376.c:110: } + inc sp + pop ix ret -;source-doc/base-drv/./ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { ; --------------------------------- ; Function ch_cmd_set_usb_mode ; --------------------------------- _ch_cmd_set_usb_mode: ld c, l -;source-doc/base-drv/./ch376.c:113: uint8_t result = 0; +;source-doc/base-drv/ch376.c:113: uint8_t result = 0; ld b,0x00 -;source-doc/base-drv/./ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; +;source-doc/base-drv/ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; ld a,0x15 push bc ld bc,_CH376_COMMAND_PORT out (c),a call _delay pop bc -;source-doc/base-drv/./ch376.c:117: CH376_DATA_PORT = mode; +;source-doc/base-drv/ch376.c:117: CH376_DATA_PORT = mode; ld a, c push bc ld bc,_CH376_DATA_PORT out (c),a call _delay pop bc -;source-doc/base-drv/./ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { +;source-doc/base-drv/ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { ld c,0x7f l_ch_cmd_set_usb_mode_00103: ld a, b @@ -292,25 +293,25 @@ l_ch_cmd_set_usb_mode_00103: l_ch_cmd_set_usb_mode_00146: xor a l_ch_cmd_set_usb_mode_00147: - ld e, a - bit 0, e + ld e,a + bit 0,a jr NZ,l_ch_cmd_set_usb_mode_00105 ld a, b sub 0x5f jr Z,l_ch_cmd_set_usb_mode_00105 dec c jr Z,l_ch_cmd_set_usb_mode_00105 -;source-doc/base-drv/./ch376.c:123: result = CH376_DATA_PORT; +;source-doc/base-drv/ch376.c:123: result = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) ld b, a -;source-doc/base-drv/./ch376.c:124: delay(); +;source-doc/base-drv/ch376.c:124: delay(); push bc call _delay pop bc jr l_ch_cmd_set_usb_mode_00103 l_ch_cmd_set_usb_mode_00105: -;source-doc/base-drv/./ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; +;source-doc/base-drv/ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; ld a, e or a jr Z,l_ch_cmd_set_usb_mode_00108 @@ -319,24 +320,24 @@ l_ch_cmd_set_usb_mode_00105: l_ch_cmd_set_usb_mode_00108: ld l,0x0e l_ch_cmd_set_usb_mode_00109: -;source-doc/base-drv/./ch376.c:128: } +;source-doc/base-drv/ch376.c:128: } ret -;source-doc/base-drv/./ch376.c:130: uint8_t ch_cmd_get_ic_version(void) { +;source-doc/base-drv/ch376.c:130: uint8_t ch_cmd_get_ic_version(void) { ; --------------------------------- ; Function ch_cmd_get_ic_version ; --------------------------------- _ch_cmd_get_ic_version: -;source-doc/base-drv/./ch376.c:131: ch_command(CH_CMD_GET_IC_VER); +;source-doc/base-drv/ch376.c:131: ch_command(CH_CMD_GET_IC_VER); ld l,0x01 call _ch_command -;source-doc/base-drv/./ch376.c:132: return CH376_DATA_PORT & 0x1f; +;source-doc/base-drv/ch376.c:132: return CH376_DATA_PORT & 0x1f; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) and 0x1f ld l, a -;source-doc/base-drv/./ch376.c:133: } +;source-doc/base-drv/ch376.c:133: } ret -;source-doc/base-drv/./ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { +;source-doc/base-drv/ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { ; --------------------------------- ; Function ch_issue_token ; --------------------------------- @@ -344,14 +345,14 @@ _ch_issue_token: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X); +;source-doc/base-drv/ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X); ld l,0x4e call _ch_command -;source-doc/base-drv/./ch376.c:137: CH376_DATA_PORT = toggle_bit; +;source-doc/base-drv/ch376.c:137: CH376_DATA_PORT = toggle_bit; ld a,(ix+4) ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; +;source-doc/base-drv/ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; ld a,(ix+5) add a, a add a, a @@ -360,18 +361,17 @@ _ch_issue_token: or (ix+6) ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:139: } +;source-doc/base-drv/ch376.c:139: } pop ix ret -;source-doc/base-drv/./ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_in ; --------------------------------- _ch_issue_token_in: - ex de, hl -;source-doc/base-drv/./ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); - ld l, e - ld h, d +;source-doc/base-drv/ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); + ld e,l + ld d,h ld a, (hl) rrca and 0x07 @@ -386,26 +386,23 @@ l_ch_issue_token_in_00103: xor a l_ch_issue_token_in_00104: ld h,0x09 + ld l,b push hl - inc sp - push bc - inc sp push af inc sp call _ch_issue_token pop af inc sp -;source-doc/base-drv/./ch376.c:143: } +;source-doc/base-drv/ch376.c:143: } ret -;source-doc/base-drv/./ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_out ; --------------------------------- _ch_issue_token_out: - ex de, hl -;source-doc/base-drv/./ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); - ld l, e - ld h, d +;source-doc/base-drv/ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); + ld e,l + ld d,h ld a, (hl) rrca and 0x07 @@ -420,18 +417,16 @@ l_ch_issue_token_out_00103: xor a l_ch_issue_token_out_00104: ld h,0x01 + ld l,b push hl - inc sp - push bc - inc sp push af inc sp call _ch_issue_token pop af inc sp -;source-doc/base-drv/./ch376.c:147: } +;source-doc/base-drv/ch376.c:147: } ret -;source-doc/base-drv/./ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } +;source-doc/base-drv/ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } ; --------------------------------- ; Function ch_issue_token_out_ep0 ; --------------------------------- @@ -447,7 +442,7 @@ _ch_issue_token_out_ep0: pop af inc sp ret -;source-doc/base-drv/./ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } +;source-doc/base-drv/ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } ; --------------------------------- ; Function ch_issue_token_in_ep0 ; --------------------------------- @@ -463,7 +458,7 @@ _ch_issue_token_in_ep0: pop af inc sp ret -;source-doc/base-drv/./ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } +;source-doc/base-drv/ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } ; --------------------------------- ; Function ch_issue_token_setup ; --------------------------------- @@ -481,7 +476,7 @@ _ch_issue_token_setup: pop af inc sp ret -;source-doc/base-drv/./ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer ; --------------------------------- @@ -490,44 +485,43 @@ _ch_data_in_transfer: ld ix,0 add ix,sp push af -;source-doc/base-drv/./ch376.c:158: if (buffer_size == 0) +;source-doc/base-drv/ch376.c:158: if (buffer_size == 0) ld a,(ix+7) or (ix+6) jr NZ,l_ch_data_in_transfer_00102 -;source-doc/base-drv/./ch376.c:159: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:159: return USB_ERR_OK; ld l,0x00 jp l_ch_data_in_transfer_00111 l_ch_data_in_transfer_00102: -;source-doc/base-drv/./ch376.c:161: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/ch376.c:161: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:162: do { +;source-doc/base-drv/ch376.c:162: do { ld c,(ix+8) ld b,(ix+9) - inc sp - inc sp + pop de push bc l_ch_data_in_transfer_00107: -;source-doc/base-drv/./ch376.c:163: ch_issue_token_in(endpoint); - push bc - ld l, c - ld h, b +;source-doc/base-drv/ch376.c:163: ch_issue_token_in(endpoint); + ld l,c + ld h,b + push hl call _ch_issue_token_in call _ch_long_wait_int_and_get_statu pop bc ld a, l ld (_result), a -;source-doc/base-drv/./ch376.c:166: CHECK(result); +;source-doc/base-drv/ch376.c:166: CHECK(result); ld a,(_result) or a jr NZ,l_ch_data_in_transfer_00110 -;source-doc/base-drv/./ch376.c:168: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:168: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b pop hl + ld a,(hl) push hl - ld a, (hl) and 0x01 xor 0x01 and 0x01 @@ -536,32 +530,32 @@ l_ch_data_in_transfer_00107: and 0xfe or l ld (de), a -;source-doc/base-drv/./ch376.c:170: count = ch_read_data(buffer); +;source-doc/base-drv/ch376.c:170: count = ch_read_data(buffer); push bc ld l,(ix+4) ld h,(ix+5) call _ch_read_data ld e, a pop bc -;source-doc/base-drv/./ch376.c:172: if (count == 0) { +;source-doc/base-drv/ch376.c:172: if (count == 0) { ld a, e -;source-doc/base-drv/./ch376.c:173: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00; or a jr NZ,l_ch_data_in_transfer_00106 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:174: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_data_in_transfer_00111 l_ch_data_in_transfer_00106: -;source-doc/base-drv/./ch376.c:177: buffer += count; +;source-doc/base-drv/ch376.c:177: buffer += count; ld a,(ix+4) add a, e ld (ix+4),a jr NC,l_ch_data_in_transfer_00148 inc (ix+5) l_ch_data_in_transfer_00148: -;source-doc/base-drv/./ch376.c:178: buffer_size -= count; +;source-doc/base-drv/ch376.c:178: buffer_size -= count; ld d,0x00 ld a,(ix+6) sub e @@ -569,7 +563,7 @@ l_ch_data_in_transfer_00148: ld a,(ix+7) sbc a, d ld (ix+7),a -;source-doc/base-drv/./ch376.c:179: } while (buffer_size > 0); +;source-doc/base-drv/ch376.c:179: } while (buffer_size > 0); xor a cp (ix+6) sbc a,(ix+7) @@ -577,24 +571,24 @@ l_ch_data_in_transfer_00148: xor 0x80 l_ch_data_in_transfer_00149: jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/./ch376.c:181: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:183: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:183: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_00111 -;source-doc/base-drv/./ch376.c:184: done: +;source-doc/base-drv/ch376.c:184: done: l_ch_data_in_transfer_00110: -;source-doc/base-drv/./ch376.c:185: return result; - ld hl,_result - ld l, (hl) +;source-doc/base-drv/ch376.c:185: return result; + ld hl,(_result) + ld h,+((_result) / 256) l_ch_data_in_transfer_00111: -;source-doc/base-drv/./ch376.c:186: } +;source-doc/base-drv/ch376.c:186: } ld sp, ix pop ix ret -;source-doc/base-drv/./ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- @@ -602,21 +596,21 @@ _ch_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./ch376.c:192: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/ch376.c:192: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:194: ch_issue_token_in(endpoint); +;source-doc/base-drv/ch376.c:194: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in -;source-doc/base-drv/./ch376.c:196: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/ch376.c:196: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a, l - ld b,a + ld b, a or a jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/./ch376.c:198: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:198: endpoint->toggle = !endpoint->toggle; ld e,(ix+8) ld d,(ix+9) ld c, e @@ -631,30 +625,30 @@ _ch_data_in_transfer_n: and 0xfe or e ld (bc), a -;source-doc/base-drv/./ch376.c:200: count = ch_read_data(buffer); +;source-doc/base-drv/ch376.c:200: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) call _ch_read_data -;source-doc/base-drv/./ch376.c:202: *buffer_size = count; +;source-doc/base-drv/ch376.c:202: *buffer_size = count; ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/./ch376.c:204: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:204: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:206: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:206: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_n_00104 -;source-doc/base-drv/./ch376.c:207: done: +;source-doc/base-drv/ch376.c:207: done: l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/./ch376.c:208: return result; +;source-doc/base-drv/ch376.c:208: return result; ld l, b l_ch_data_in_transfer_n_00104: -;source-doc/base-drv/./ch376.c:209: } +;source-doc/base-drv/ch376.c:209: } pop ix ret -;source-doc/base-drv/./ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_out_transfer ; --------------------------------- @@ -664,7 +658,7 @@ _ch_data_out_transfer: add ix,sp push af dec sp -;source-doc/base-drv/./ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); +;source-doc/base-drv/ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) ld b,(ix+9) ld e, c @@ -672,13 +666,13 @@ _ch_data_out_transfer: inc de ld a, (de) ld (ix-3),a -;source-doc/base-drv/./ch376.c:216: USB_MODULE_LEDS = 0x02; +;source-doc/base-drv/ch376.c:216: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS out (c),a pop bc -;source-doc/base-drv/./ch376.c:218: while (buffer_length > 0) { +;source-doc/base-drv/ch376.c:218: while (buffer_length > 0) { ld (ix-2),c ld (ix-1),b l_ch_data_out_transfer_00103: @@ -689,7 +683,7 @@ l_ch_data_out_transfer_00103: xor 0x80 l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/./ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; +;source-doc/base-drv/ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; ld d,(ix-3) ld e,0x00 ld a, d @@ -703,8 +697,9 @@ l_ch_data_out_transfer_00140: jr l_ch_data_out_transfer_00110 l_ch_data_out_transfer_00109: ld d,(ix+6) + ld e,(ix+7) l_ch_data_out_transfer_00110: -;source-doc/base-drv/./ch376.c:220: buffer = ch_write_data(buffer, size); +;source-doc/base-drv/ch376.c:220: buffer = ch_write_data(buffer, size); push bc push de push de @@ -719,7 +714,7 @@ l_ch_data_out_transfer_00110: pop bc ld (ix+4),l ld (ix+5),h -;source-doc/base-drv/./ch376.c:221: buffer_length -= size; +;source-doc/base-drv/ch376.c:221: buffer_length -= size; ld e,0x00 ld a,(ix+6) sub d @@ -727,10 +722,10 @@ l_ch_data_out_transfer_00110: ld a,(ix+7) sbc a, e ld (ix+7),a -;source-doc/base-drv/./ch376.c:222: ch_issue_token_out(endpoint); - push bc - ld l, c - ld h, b +;source-doc/base-drv/ch376.c:222: ch_issue_token_out(endpoint); + ld l,c + ld h,b + push hl call _ch_issue_token_out call _ch_long_wait_int_and_get_statu ld a, l @@ -738,7 +733,7 @@ l_ch_data_out_transfer_00110: ld l, a or a jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/./ch376.c:226: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:226: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l,(ix-2) @@ -754,34 +749,34 @@ l_ch_data_out_transfer_00110: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/./ch376.c:229: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:229: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/./ch376.c:231: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:231: return USB_ERR_OK; ld l,0x00 -;source-doc/base-drv/./ch376.c:232: done: -;source-doc/base-drv/./ch376.c:233: return result; +;source-doc/base-drv/ch376.c:232: done: +;source-doc/base-drv/ch376.c:233: return result; l_ch_data_out_transfer_00106: -;source-doc/base-drv/./ch376.c:234: } +;source-doc/base-drv/ch376.c:234: } ld sp, ix pop ix ret -;source-doc/base-drv/./ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function ch_set_usb_address ; --------------------------------- _ch_set_usb_address: -;source-doc/base-drv/./ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR); +;source-doc/base-drv/ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR); push hl ld l,0x13 call _ch_command pop hl -;source-doc/base-drv/./ch376.c:238: CH376_DATA_PORT = device_address; +;source-doc/base-drv/ch376.c:238: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.c:239: } +;source-doc/base-drv/ch376.c:239: } ret _result: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.asm b/Source/HBIOS/ch376-native/base-drv/class_hub.c.asm new file mode 100644 index 00000000..15506295 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/class_hub.c.asm @@ -0,0 +1,458 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _cmd_get_hub_descriptor + GLOBAL _hub_get_descriptor +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _get_usb_device_config + GLOBAL _find_device_config + GLOBAL _next_device_config + GLOBAL _first_device_config + GLOBAL _find_first_free + GLOBAL _usbtrn_clear_endpoint_halt + GLOBAL _usbtrn_set_address + GLOBAL _usbtrn_set_configuration + GLOBAL _usbtrn_gfull_cfg_desc + GLOBAL _usbtrn_get_config_descriptor + GLOBAL _usbtrn_get_descriptor2 + GLOBAL _usbtrn_get_descriptor + GLOBAL _usbdev_dat_in_trnsfer_0 + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_control_transfer + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/class_hub.c:7: usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1) { +; --------------------------------- +; Function hub_get_descriptor +; --------------------------------- +_hub_get_descriptor: +;source-doc/base-drv/class_hub.c:8: return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); + ld a,l + ld c,h + inc hl + ld b, (hl) + ld l, a + ld h, c + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld c, a + push bc + push de + ld hl,_cmd_get_hub_descriptor + push hl + call _usb_control_transfer + pop af + pop af + pop af + ld a, l +;source-doc/base-drv/class_hub.c:9: } + ret + SECTION rodata_compiler +_cmd_get_hub_descriptor: + DEFB +0xa0 + DEFB +0x06 + DEFB +0x00 + DEFB +0x29 + DEFB +0x00 + DEFB +0x00 + DEFW +0x0008 + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s index 2ba02fa6..89e43f5d 100644 --- a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./class_hub.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/class_hub.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,39 +48,35 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./class_hub.c:7: usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1) { +;source-doc/base-drv/class_hub.c:7: usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1) { ; --------------------------------- ; Function hub_get_descriptor ; --------------------------------- _hub_get_descriptor: -;source-doc/base-drv/./class_hub.c:8: return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); +;source-doc/base-drv/class_hub.c:8: return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); ld a,l - ld b,h + ld c,h inc hl - ld c, (hl) + ld b, (hl) ld l, a - ld h, b + ld h, c ld a, (hl) rlca rlca rlca rlca and 0x0f - ld b, a - ld hl,_cmd_get_hub_descriptor - ld a, c - push af - inc sp + ld c, a push bc - inc sp push de + ld hl,_cmd_get_hub_descriptor push hl call _usb_control_transfer pop af pop af pop af ld a, l -;source-doc/base-drv/./class_hub.c:9: } +;source-doc/base-drv/class_hub.c:9: } ret _cmd_get_hub_descriptor: DEFB +0xa0 diff --git a/Source/HBIOS/ch376-native/base-drv/critical-section.c.s b/Source/HBIOS/ch376-native/base-drv/critical-section.c.s index 97ea4e02..51f86184 100644 --- a/Source/HBIOS/ch376-native/base-drv/critical-section.c.s +++ b/Source/HBIOS/ch376-native/base-drv/critical-section.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./critical-section.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/critical-section.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -47,7 +47,7 @@ _in_critical_usb_section: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./critical-section.c:6: void critical_begin() { in_critical_usb_section++; } +;source-doc/base-drv/critical-section.c:6: void critical_begin() { in_critical_usb_section++; } ; --------------------------------- ; Function critical_begin ; --------------------------------- @@ -55,7 +55,7 @@ _critical_begin: ld hl,_in_critical_usb_section inc (hl) ret -;source-doc/base-drv/./critical-section.c:8: void critical_end() { in_critical_usb_section--; } +;source-doc/base-drv/critical-section.c:8: void critical_end() { in_critical_usb_section--; } ; --------------------------------- ; Function critical_end ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm new file mode 100644 index 00000000..0d971506 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm @@ -0,0 +1,834 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _usbdev_control_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_dat_in_trnsfer_0 +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _critical_end + GLOBAL _critical_begin + GLOBAL _usbtrn_clear_endpoint_halt + GLOBAL _usbtrn_set_address + GLOBAL _usbtrn_set_configuration + GLOBAL _usbtrn_gfull_cfg_desc + GLOBAL _usbtrn_get_config_descriptor + GLOBAL _usbtrn_get_descriptor2 + GLOBAL _usbtrn_get_descriptor + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _in_critical_usb_section + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { +; --------------------------------- +; Function usbdev_control_transfer +; --------------------------------- +_usbdev_control_transfer: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); + ld l,(ix+4) + ld h,(ix+5) + ld e,l + ld d,h + inc hl + ld b, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld e,(ix+8) + ld d,(ix+9) + ld c,a + push bc + push de + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_control_transfer + pop af + pop af + pop af +;source-doc/base-drv/dev_transfers.c:33: } + pop ix + ret +;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { +; --------------------------------- +; Function usbdev_blk_out_trnsfer +; --------------------------------- +_usbdev_blk_out_trnsfer: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; + ld e,(ix+4) + ld d,(ix+5) + ld c, e + ld b, d + inc bc + inc bc + inc bc +;source-doc/base-drv/dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); + ld l, e + ld h, d + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + push bc + push de + push bc + push af + inc sp + ld l,(ix+8) + ld h,(ix+9) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_out_transfer + pop af + pop af + pop af + inc sp + pop de + pop bc + ld a, l + ld (_result), a +;source-doc/base-drv/dev_transfers.c:41: if (result == USB_ERR_STALL) { + ld a,(_result) + sub a,0x02 + jr NZ,l_usbdev_blk_out_trnsfer_00102 +;source-doc/base-drv/dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + ld l, e + ld h, d + inc hl + ld a, (hl) + ld (ix-1),a + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld d, a + ld l, c + ld h, b + ld a, (hl) + rrca + and a,0x07 + push bc + ld h,(ix-1) + ld l,d + push hl + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop bc +;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; + ld a, (bc) + and a,0xfe + ld (bc), a +;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; + ld l,0x02 + jr l_usbdev_blk_out_trnsfer_00104 +l_usbdev_blk_out_trnsfer_00102: +;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:50: return result; + ld hl,(_result) +l_usbdev_blk_out_trnsfer_00104: +;source-doc/base-drv/dev_transfers.c:51: } + inc sp + pop ix + ret +;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { +; --------------------------------- +; Function usbdev_bulk_in_transfer +; --------------------------------- +_usbdev_bulk_in_transfer: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; + ld c,(ix+4) + ld b,(ix+5) + ld hl,0x0006 + add hl, bc +;source-doc/base-drv/dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); + ld e,c + ld d,b + ex de,hl + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + push bc + push de + push de + push af + inc sp + ld l,(ix+8) + ld h,(ix+9) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_in_transfer_n + pop af + pop af + pop af + inc sp + pop de + pop bc + ld a, l + ld (_result), a +;source-doc/base-drv/dev_transfers.c:58: if (result == USB_ERR_STALL) { + ld a,(_result) + sub a,0x02 + jr NZ,l_usbdev_bulk_in_transfer_00102 +;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + ld l, c + ld h, b + inc hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld b, a + ld l, e + ld h, d + ld a, (hl) + rrca + and a,0x07 + push de + ld h,(ix-1) + ld l,b + push hl + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop de +;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; + ex de, hl + res 0, (hl) +;source-doc/base-drv/dev_transfers.c:61: return USB_ERR_STALL; + ld l,0x02 + jr l_usbdev_bulk_in_transfer_00104 +l_usbdev_bulk_in_transfer_00102: +;source-doc/base-drv/dev_transfers.c:64: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:66: return result; + ld hl,(_result) +l_usbdev_bulk_in_transfer_00104: +;source-doc/base-drv/dev_transfers.c:67: } + inc sp + pop ix + ret +;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, +; --------------------------------- +; Function usbdev_dat_in_trnsfer +; --------------------------------- +_usbdev_dat_in_trnsfer: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; + ld e,(ix+4) + ld d,(ix+5) + ld c, e + ld b, d + inc bc + inc bc + inc bc + push de + ld a,(ix+10) + ld e, a + add a, a + add a, e + pop de + add a, c + ld c, a + ld a,0x00 + adc a, b + ld b, a +;source-doc/base-drv/dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + ld l, e + ld h, d + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + push bc + push de + push bc + push af + inc sp + ld l,(ix+8) + ld h,(ix+9) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp + pop de + pop bc + ld a, l + ld (_result), a +;source-doc/base-drv/dev_transfers.c:78: if (result == USB_ERR_STALL) { + ld a,(_result) + sub a,0x02 + jr NZ,l_usbdev_dat_in_trnsfer_00102 +;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + ld l, e + ld h, d + inc hl + ld a, (hl) + ld (ix-1),a + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld d, a + ld l, c + ld h, b + ld a, (hl) + rrca + and a,0x07 + push bc + ld h,(ix-1) + ld l,d + push hl + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp + pop bc +;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; + ld a, (bc) + and a,0xfe + ld (bc), a +;source-doc/base-drv/dev_transfers.c:81: return USB_ERR_STALL; + ld l,0x02 + jr l_usbdev_dat_in_trnsfer_00104 +l_usbdev_dat_in_trnsfer_00102: +;source-doc/base-drv/dev_transfers.c:84: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:86: return result; + ld hl,(_result) +l_usbdev_dat_in_trnsfer_00104: +;source-doc/base-drv/dev_transfers.c:87: } + inc sp + pop ix + ret +;source-doc/base-drv/dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { +; --------------------------------- +; Function usbdev_dat_in_trnsfer_0 +; --------------------------------- +_usbdev_dat_in_trnsfer_0: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; + ld e,(ix+4) + ld d,(ix+5) + ld hl,0x0003 + add hl, de + ex (sp), hl +;source-doc/base-drv/dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + ld l, e + ld h, d + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld c,(ix+8) + ld b,0x00 + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + push af + inc sp + push bc + ld l,(ix+6) + ld h,(ix+7) + push hl + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp + pop de + ld a, l + ld (_result), a +;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { + ld a,(_result) + sub a,0x02 + jr NZ,l_usbdev_dat_in_trnsfer_0_00102 +;source-doc/base-drv/dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + ld l, e + ld h, d + inc hl + ld b, (hl) + ex de, hl + ld a, (hl) + rlca + rlca + rlca + rlca + and a,0x0f + ld d, a + pop hl + ld a,(hl) + push hl + rrca + and a,0x07 + ld c, d + push bc + push af + inc sp + call _usbtrn_clear_endpoint_halt + pop af + inc sp +;source-doc/base-drv/dev_transfers.c:96: endpoint->toggle = 0; + pop hl + push hl + res 0, (hl) +;source-doc/base-drv/dev_transfers.c:97: return USB_ERR_STALL; + ld l,0x02 + jr l_usbdev_dat_in_trnsfer_0_00103 +l_usbdev_dat_in_trnsfer_0_00102: +;source-doc/base-drv/dev_transfers.c:100: return result; + ld hl,(_result) +l_usbdev_dat_in_trnsfer_0_00103: +;source-doc/base-drv/dev_transfers.c:101: } + ld sp, ix + pop ix + ret + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 2412ace0..8b622ba9 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./dev_transfers.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/dev_transfers.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { +;source-doc/base-drv/dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { ; --------------------------------- ; Function usbdev_control_transfer ; --------------------------------- @@ -56,11 +56,11 @@ _usbdev_control_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); - ld e,(ix+4) - ld d,(ix+5) - ld l, e - ld h, d +;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); + ld l,(ix+4) + ld h,(ix+5) + ld e,l + ld d,h inc hl ld b, (hl) ex de, hl @@ -72,10 +72,8 @@ _usbdev_control_transfer: and 0x0f ld e,(ix+8) ld d,(ix+9) + ld c,a push bc - inc sp - push af - inc sp push de ld l,(ix+6) ld h,(ix+7) @@ -84,10 +82,10 @@ _usbdev_control_transfer: pop af pop af pop af -;source-doc/base-drv/./dev_transfers.c:33: } +;source-doc/base-drv/dev_transfers.c:33: } pop ix ret -;source-doc/base-drv/./dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { +;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { ; --------------------------------- ; Function usbdev_blk_out_trnsfer ; --------------------------------- @@ -95,33 +93,27 @@ _usbdev_blk_out_trnsfer: push ix ld ix,0 add ix,sp - push af - push af -;source-doc/base-drv/./dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; - ld a,(ix+4) - ld (ix-4),a - ld a,(ix+5) - ld (ix-3),a - ld a,(ix-4) - add a,0x03 - ld (ix-2),a - ld a,(ix-3) - adc a,0x00 - ld (ix-1),a -;source-doc/base-drv/./dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); - pop hl - push hl + dec sp +;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; + ld e,(ix+4) + ld d,(ix+5) + ld c, e + ld b, d + inc bc + inc bc + inc bc +;source-doc/base-drv/dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); + ld l, e + ld h, d ld a, (hl) rlca rlca rlca rlca and 0x0f - pop de - pop hl - push hl + push bc push de - push hl + push bc push af inc sp ld l,(ix+8) @@ -135,60 +127,60 @@ _usbdev_blk_out_trnsfer: pop af pop af inc sp + pop de + pop bc ld a, l ld (_result), a -;source-doc/base-drv/./dev_transfers.c:41: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:41: if (result == USB_ERR_STALL) { ld a,(_result) sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 -;source-doc/base-drv/./dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - pop hl - push hl +;source-doc/base-drv/dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + ld l, e + ld h, d inc hl - ld d, (hl) - pop hl - push hl + ld a, (hl) + ld (ix-1),a + ex de, hl ld a, (hl) rlca rlca rlca rlca and 0x0f - ld b, a - ld l,(ix-2) - ld h,(ix-1) + ld d, a + ld l, c + ld h, b ld a, (hl) rrca and 0x07 - push de - inc sp push bc - inc sp + ld h,(ix-1) + ld l,d + push hl push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:43: endpoint->toggle = 0; - pop de - pop hl - push hl - push de - res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:44: return USB_ERR_STALL; + pop bc +;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; + ld a, (bc) + and 0xfe + ld (bc), a +;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; ld l,0x02 jr l_usbdev_blk_out_trnsfer_00104 l_usbdev_blk_out_trnsfer_00102: -;source-doc/base-drv/./dev_transfers.c:47: RETURN_CHECK(result); -;source-doc/base-drv/./dev_transfers.c:50: return result; - ld hl,_result - ld l, (hl) +;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:50: return result; + ld hl,(_result) l_usbdev_blk_out_trnsfer_00104: -;source-doc/base-drv/./dev_transfers.c:51: } - ld sp, ix +;source-doc/base-drv/dev_transfers.c:51: } + inc sp pop ix ret -;source-doc/base-drv/./dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { +;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { ; --------------------------------- ; Function usbdev_bulk_in_transfer ; --------------------------------- @@ -196,33 +188,25 @@ _usbdev_bulk_in_transfer: push ix ld ix,0 add ix,sp - push af - push af -;source-doc/base-drv/./dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; - ld a,(ix+4) - ld (ix-4),a - ld a,(ix+5) - ld (ix-3),a - ld a,(ix-4) - add a,0x06 - ld (ix-2),a - ld a,(ix-3) - adc a,0x00 - ld (ix-1),a -;source-doc/base-drv/./dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); - pop hl - push hl + dec sp +;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; + ld c,(ix+4) + ld b,(ix+5) + ld hl,0x0006 + add hl, bc +;source-doc/base-drv/dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); + ld e,c + ld d,b + ex de,hl ld a, (hl) rlca rlca rlca rlca and 0x0f - pop de - pop hl - push hl + push bc + push de push de - push hl push af inc sp ld l,(ix+8) @@ -236,19 +220,22 @@ _usbdev_bulk_in_transfer: pop af pop af inc sp + pop de + pop bc ld a, l ld (_result), a -;source-doc/base-drv/./dev_transfers.c:58: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:58: if (result == USB_ERR_STALL) { ld a,(_result) sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 -;source-doc/base-drv/./dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - pop hl - push hl +;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); + ld l, c + ld h, b inc hl - ld d, (hl) - pop hl - push hl + ld a, (hl) + ld (ix-1),a + ld l, c + ld h, b ld a, (hl) rlca rlca @@ -256,40 +243,37 @@ _usbdev_bulk_in_transfer: rlca and 0x0f ld b, a - ld l,(ix-2) - ld h,(ix-1) + ld l, e + ld h, d ld a, (hl) rrca and 0x07 push de - inc sp - push bc - inc sp + ld h,(ix-1) + ld l,b + push hl push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:60: endpoint->toggle = 0; pop de - pop hl - push hl - push de +;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; + ex de, hl res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:61: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:61: return USB_ERR_STALL; ld l,0x02 jr l_usbdev_bulk_in_transfer_00104 l_usbdev_bulk_in_transfer_00102: -;source-doc/base-drv/./dev_transfers.c:64: RETURN_CHECK(result); -;source-doc/base-drv/./dev_transfers.c:66: return result; - ld hl,_result - ld l, (hl) +;source-doc/base-drv/dev_transfers.c:64: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:66: return result; + ld hl,(_result) l_usbdev_bulk_in_transfer_00104: -;source-doc/base-drv/./dev_transfers.c:67: } - ld sp, ix +;source-doc/base-drv/dev_transfers.c:67: } + inc sp pop ix ret -;source-doc/base-drv/./dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, +;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, ; --------------------------------- ; Function usbdev_dat_in_trnsfer ; --------------------------------- @@ -297,41 +281,38 @@ _usbdev_dat_in_trnsfer: push ix ld ix,0 add ix,sp - push af - push af -;source-doc/base-drv/./dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; - ld a,(ix+4) - ld (ix-4),a - ld a,(ix+5) - ld (ix-3),a - pop bc - push bc + dec sp +;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; + ld e,(ix+4) + ld d,(ix+5) + ld c, e + ld b, d inc bc inc bc inc bc + push de ld a,(ix+10) ld e, a add a, a add a, e + pop de add a, c - ld (ix-2),a + ld c, a ld a,0x00 adc a, b - ld (ix-1),a -;source-doc/base-drv/./dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - pop hl - push hl + ld b, a +;source-doc/base-drv/dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + ld l, e + ld h, d ld a, (hl) rlca rlca rlca rlca and 0x0f - pop de - pop hl - push hl + push bc push de - push hl + push bc push af inc sp ld l,(ix+8) @@ -345,60 +326,60 @@ _usbdev_dat_in_trnsfer: pop af pop af inc sp + pop de + pop bc ld a, l ld (_result), a -;source-doc/base-drv/./dev_transfers.c:78: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:78: if (result == USB_ERR_STALL) { ld a,(_result) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 -;source-doc/base-drv/./dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - pop hl - push hl +;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + ld l, e + ld h, d inc hl - ld d, (hl) - pop hl - push hl + ld a, (hl) + ld (ix-1),a + ex de, hl ld a, (hl) rlca rlca rlca rlca and 0x0f - ld b, a - ld l,(ix-2) - ld h,(ix-1) + ld d, a + ld l, c + ld h, b ld a, (hl) rrca and 0x07 - push de - inc sp push bc - inc sp + ld h,(ix-1) + ld l,d + push hl push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:80: endpoint->toggle = 0; - pop de - pop hl - push hl - push de - res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:81: return USB_ERR_STALL; + pop bc +;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; + ld a, (bc) + and 0xfe + ld (bc), a +;source-doc/base-drv/dev_transfers.c:81: return USB_ERR_STALL; ld l,0x02 jr l_usbdev_dat_in_trnsfer_00104 l_usbdev_dat_in_trnsfer_00102: -;source-doc/base-drv/./dev_transfers.c:84: RETURN_CHECK(result); -;source-doc/base-drv/./dev_transfers.c:86: return result; - ld hl,_result - ld l, (hl) +;source-doc/base-drv/dev_transfers.c:84: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:86: return result; + ld hl,(_result) l_usbdev_dat_in_trnsfer_00104: -;source-doc/base-drv/./dev_transfers.c:87: } - ld sp, ix +;source-doc/base-drv/dev_transfers.c:87: } + inc sp pop ix ret -;source-doc/base-drv/./dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { +;source-doc/base-drv/dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { ; --------------------------------- ; Function usbdev_dat_in_trnsfer_0 ; --------------------------------- @@ -407,21 +388,15 @@ _usbdev_dat_in_trnsfer_0: ld ix,0 add ix,sp push af - push af -;source-doc/base-drv/./dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; - ld a,(ix+4) - ld (ix-4),a - ld a,(ix+5) - ld (ix-3),a - ld a,(ix-4) - add a,0x03 - ld (ix-2),a - ld a,(ix-3) - adc a,0x00 - ld (ix-1),a -;source-doc/base-drv/./dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - pop hl - push hl +;source-doc/base-drv/dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; + ld e,(ix+4) + ld d,(ix+5) + ld hl,0x0003 + add hl, de + ex (sp), hl +;source-doc/base-drv/dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); + ld l, e + ld h, d ld a, (hl) rlca rlca @@ -430,10 +405,9 @@ _usbdev_dat_in_trnsfer_0: and 0x0f ld c,(ix+8) ld b,0x00 - pop de - pop hl - push hl push de + ld l,(ix-2) + ld h,(ix-1) push hl push af inc sp @@ -446,55 +420,50 @@ _usbdev_dat_in_trnsfer_0: pop af pop af inc sp + pop de ld a, l ld (_result), a -;source-doc/base-drv/./dev_transfers.c:94: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { ld a,(_result) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_0_00102 -;source-doc/base-drv/./dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - pop hl - push hl +;source-doc/base-drv/dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); + ld l, e + ld h, d inc hl - ld d, (hl) - pop hl - push hl + ld b, (hl) + ex de, hl ld a, (hl) rlca rlca rlca rlca and 0x0f - ld b, a - ld l,(ix-2) - ld h,(ix-1) - ld a, (hl) + ld d, a + pop hl + ld a,(hl) + push hl rrca and 0x07 - push de - inc sp + ld c, d push bc - inc sp push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/./dev_transfers.c:96: endpoint->toggle = 0; - pop de +;source-doc/base-drv/dev_transfers.c:96: endpoint->toggle = 0; pop hl push hl - push de res 0, (hl) -;source-doc/base-drv/./dev_transfers.c:97: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:97: return USB_ERR_STALL; ld l,0x02 jr l_usbdev_dat_in_trnsfer_0_00103 l_usbdev_dat_in_trnsfer_0_00102: -;source-doc/base-drv/./dev_transfers.c:100: return result; - ld hl,_result - ld l, (hl) +;source-doc/base-drv/dev_transfers.c:100: return result; + ld hl,(_result) l_usbdev_dat_in_trnsfer_0_00103: -;source-doc/base-drv/./dev_transfers.c:101: } +;source-doc/base-drv/dev_transfers.c:101: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.asm b/Source/HBIOS/ch376-native/base-drv/enumerate.c.asm new file mode 100644 index 00000000..5fbd81a5 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.asm @@ -0,0 +1,1472 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _op_get_cfg_desc + GLOBAL _op_cap_drv_intf + GLOBAL _op_capture_hub_driver_interface + GLOBAL _configure_device + GLOBAL _op_endpoint_next + GLOBAL _op_interface_next + GLOBAL _identify_class_driver + GLOBAL _parse_endpoint_keyboard + GLOBAL _op_parse_endpoint + GLOBAL _op_id_class_drv + GLOBAL _read_all_configs + GLOBAL _enumerate_all_devices +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _print_uint16 + GLOBAL _print_string + GLOBAL _print_hex + GLOBAL _ffsll_callee + GLOBAL _ffsll + GLOBAL _strxfrm_callee + GLOBAL _strxfrm + GLOBAL _strupr_fastcall + GLOBAL _strupr + GLOBAL _strtok_r_callee + GLOBAL _strtok_r + GLOBAL _strtok_callee + GLOBAL _strtok + GLOBAL _strstrip_fastcall + GLOBAL _strstrip + GLOBAL _strstr_callee + GLOBAL _strstr + GLOBAL _strspn_callee + GLOBAL _strspn + GLOBAL _strsep_callee + GLOBAL _strsep + GLOBAL _strrstrip_fastcall + GLOBAL _strrstrip + GLOBAL _strrstr_callee + GLOBAL _strrstr + GLOBAL _strrspn_callee + GLOBAL _strrspn + GLOBAL _strrev_fastcall + GLOBAL _strrev + GLOBAL _strrcspn_callee + GLOBAL _strrcspn + GLOBAL _strrchr_callee + GLOBAL _strrchr + GLOBAL _strpbrk_callee + GLOBAL _strpbrk + GLOBAL _strnlen_callee + GLOBAL _strnlen + GLOBAL _strnicmp_callee + GLOBAL _strnicmp + GLOBAL _strndup_callee + GLOBAL _strndup + GLOBAL _strncpy_callee + GLOBAL _strncpy + GLOBAL _strncmp_callee + GLOBAL _strncmp + GLOBAL _strnchr_callee + GLOBAL _strnchr + GLOBAL _strncat_callee + GLOBAL _strncat + GLOBAL _strncasecmp_callee + GLOBAL _strncasecmp + GLOBAL _strlwr_fastcall + GLOBAL _strlwr + GLOBAL _strlen_fastcall + GLOBAL _strlen + GLOBAL _strlcpy_callee + GLOBAL _strlcpy + GLOBAL _strlcat_callee + GLOBAL _strlcat + GLOBAL _stricmp_callee + GLOBAL _stricmp + GLOBAL _strerror_fastcall + GLOBAL _strerror + GLOBAL _strdup_fastcall + GLOBAL _strdup + GLOBAL _strcspn_callee + GLOBAL _strcspn + GLOBAL _strcpy_callee + GLOBAL _strcpy + GLOBAL _strcoll_callee + GLOBAL _strcoll + GLOBAL _strcmp_callee + GLOBAL _strcmp + GLOBAL _strchrnul_callee + GLOBAL _strchrnul + GLOBAL _strchr_callee + GLOBAL _strchr + GLOBAL _strcat_callee + GLOBAL _strcat + GLOBAL _strcasecmp_callee + GLOBAL _strcasecmp + GLOBAL _stpncpy_callee + GLOBAL _stpncpy + GLOBAL _stpcpy_callee + GLOBAL _stpcpy + GLOBAL _memswap_callee + GLOBAL _memswap + GLOBAL _memset_wr_callee + GLOBAL _memset_wr + GLOBAL _memset_callee + GLOBAL _memset + GLOBAL _memrchr_callee + GLOBAL _memrchr + GLOBAL _memmove_callee + GLOBAL _memmove + GLOBAL _memmem_callee + GLOBAL _memmem + GLOBAL _memcpy_callee + GLOBAL _memcpy + GLOBAL _memcmp_callee + GLOBAL _memcmp + GLOBAL _memchr_callee + GLOBAL _memchr + GLOBAL _memccpy_callee + GLOBAL _memccpy + GLOBAL _ffsl_fastcall + GLOBAL _ffsl + GLOBAL _ffs_fastcall + GLOBAL _ffs + GLOBAL __strrstrip__fastcall + GLOBAL __strrstrip_ + GLOBAL __memupr__callee + GLOBAL __memupr_ + GLOBAL __memstrcpy__callee + GLOBAL __memstrcpy_ + GLOBAL __memlwr__callee + GLOBAL __memlwr_ + GLOBAL _rawmemchr_callee + GLOBAL _rawmemchr + GLOBAL _strnset_callee + GLOBAL _strnset + GLOBAL _strset_callee + GLOBAL _strset + GLOBAL _rindex_callee + GLOBAL _rindex + GLOBAL _index_callee + GLOBAL _index + GLOBAL _bzero_callee + GLOBAL _bzero + GLOBAL _bcopy_callee + GLOBAL _bcopy + GLOBAL _bcmp_callee + GLOBAL _bcmp + GLOBAL _get_number_of_usb_drives + GLOBAL _parse_endpoints + GLOBAL _configure_usb_hub + GLOBAL _get_usb_device_config + GLOBAL _find_device_config + GLOBAL _next_device_config + GLOBAL _first_device_config + GLOBAL _find_first_free + GLOBAL _usbtrn_clear_endpoint_halt + GLOBAL _usbtrn_set_address + GLOBAL _usbtrn_set_configuration + GLOBAL _usbtrn_gfull_cfg_desc + GLOBAL _usbtrn_get_config_descriptor + GLOBAL _usbtrn_get_descriptor2 + GLOBAL _usbtrn_get_descriptor + GLOBAL _usbdev_dat_in_trnsfer_0 + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_control_transfer + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _x + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/enumerate.c:13: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) +; --------------------------------- +; Function parse_endpoint_keyboard +; --------------------------------- +_parse_endpoint_keyboard: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; + inc hl + inc hl + inc hl +;source-doc/base-drv/enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; + ld c,l + ld b,h + ex (sp),hl + ld l, e + ld h, d + inc hl + inc hl + ld a, (hl) + pop hl + push hl + rlca + and a,0x0e + push bc + ld c, a + ld a, (hl) + and a,0xf1 + or a, c + ld (hl), a +;source-doc/base-drv/enumerate.c:17: ep->toggle = 0; + pop hl + ld c,l + ld b,h + res 0, (hl) +;source-doc/base-drv/enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); + inc bc + ld hl,4 + add hl, de + ld e, (hl) + inc hl + ld a, (hl) + and a,0x03 + ld d, a + ld a, e + ld (bc), a + inc bc + ld a, d + and a,0x03 + ld l,a + ld a, (bc) + and a,0xfc + or a, l + ld (bc), a +;source-doc/base-drv/enumerate.c:19: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { +; --------------------------------- +; Function identify_class_driver +; --------------------------------- +_identify_class_driver: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; + ld c,(ix+4) + ld b,(ix+5) + ld hl,27 + add hl, bc + ld c, (hl) + inc hl + ld b, (hl) +;source-doc/base-drv/enumerate.c:23: if (p->bInterfaceClass == 2) + ld hl,5 + add hl,bc + ld a,(hl) + ld e,a + sub a,0x02 + jr NZ,l_identify_class_driver_00102 +;source-doc/base-drv/enumerate.c:24: return USB_IS_CDC; + ld l,0x03 + jr l_identify_class_driver_00118 +l_identify_class_driver_00102: +;source-doc/base-drv/enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) + ld a, e + sub a,0x08 + jr NZ,l_identify_class_driver_00199 + ld a,0x01 + jr l_identify_class_driver_00200 +l_identify_class_driver_00199: + xor a,a +l_identify_class_driver_00200: + ld d,a + or a, a + jr Z,l_identify_class_driver_00104 + ld hl,0x0006 + add hl,bc + ld a, (hl) + cp a,0x06 + jr Z,l_identify_class_driver_00107 + sub a,0x05 + jr NZ,l_identify_class_driver_00104 +l_identify_class_driver_00107: + ld hl,0x0007 + add hl,bc + ld a, (hl) + sub a,0x50 + jr NZ,l_identify_class_driver_00104 +;source-doc/base-drv/enumerate.c:27: return USB_IS_MASS_STORAGE; + ld l,0x02 + jr l_identify_class_driver_00118 +l_identify_class_driver_00104: +;source-doc/base-drv/enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) + ld a, d + or a, a + jr Z,l_identify_class_driver_00109 + ld hl,0x0006 + add hl,bc + ld a, (hl) + sub a,0x04 + jr NZ,l_identify_class_driver_00109 + ld hl,0x0007 + add hl,bc + ld a, (hl) + or a, a + jr NZ,l_identify_class_driver_00109 +;source-doc/base-drv/enumerate.c:30: return USB_IS_FLOPPY; + ld l,0x01 + jr l_identify_class_driver_00118 +l_identify_class_driver_00109: +;source-doc/base-drv/enumerate.c:32: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) + ld a, e + sub a,0x09 + jr NZ,l_identify_class_driver_00113 + ld hl,0x0006 + add hl,bc + ld a, (hl) + or a, a + jr NZ,l_identify_class_driver_00113 + ld hl,7 + add hl, bc + ld a, (hl) + or a, a + jr NZ,l_identify_class_driver_00113 +;source-doc/base-drv/enumerate.c:33: return USB_IS_HUB; + ld l,0x0f + jr l_identify_class_driver_00118 +l_identify_class_driver_00113: +;source-doc/base-drv/enumerate.c:35: if (p->bInterfaceClass == 3) + ld a, e + sub a,0x03 + jr NZ,l_identify_class_driver_00117 +;source-doc/base-drv/enumerate.c:36: return USB_IS_KEYBOARD; + ld l,0x04 + jr l_identify_class_driver_00118 +l_identify_class_driver_00117: +;source-doc/base-drv/enumerate.c:38: return USB_IS_UNKNOWN; + ld l,0x06 +l_identify_class_driver_00118: +;source-doc/base-drv/enumerate.c:39: } + pop ix + ret +;source-doc/base-drv/enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { +; --------------------------------- +; Function op_interface_next +; --------------------------------- +_op_interface_next: + ex de, hl +;source-doc/base-drv/enumerate.c:42: if (--working->interface_count == 0) + ld hl,0x0016 + add hl, de + ld a, (hl) + dec a + ld (hl), a +;source-doc/base-drv/enumerate.c:43: return USB_ERR_OK; + or a,a + jr NZ,l_op_interface_next_00102 + ld l,a + jr l_op_interface_next_00103 +l_op_interface_next_00102: +;source-doc/base-drv/enumerate.c:45: return op_id_class_drv(working); + ex de, hl + call _op_id_class_drv + ld l, a +l_op_interface_next_00103: +;source-doc/base-drv/enumerate.c:46: } + ret +;source-doc/base-drv/enumerate.c:48: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_endpoint_next +; --------------------------------- +_op_endpoint_next: + ex de, hl +;source-doc/base-drv/enumerate.c:49: if (--working->endpoint_count > 0) { + ld hl,0x0017 + add hl, de + ld a, (hl) + dec a + ld (hl), a + or a, a + jr Z,l_op_endpoint_next_00102 +;source-doc/base-drv/enumerate.c:50: working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; + ld hl,0x001b + add hl, de + ld c, (hl) + inc hl + ld b, (hl) + dec hl + ld a, (bc) + add a, c + ld c, a + ld a,0x00 + adc a, b + ld (hl), c + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:51: return op_parse_endpoint(working); + ex de, hl + jp _op_parse_endpoint + jr l_op_endpoint_next_00103 +l_op_endpoint_next_00102: +;source-doc/base-drv/enumerate.c:54: return op_interface_next(working); + ex de, hl + call _op_interface_next + ld a, l +l_op_endpoint_next_00103: +;source-doc/base-drv/enumerate.c:55: } + ret +;source-doc/base-drv/enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_parse_endpoint +; --------------------------------- +_op_parse_endpoint: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; + ld de,0x001c + ld c,l + ld b,h + add hl, de + ld a, (hl) + dec hl + ld l, (hl) + ld (ix-2),l + ld (ix-1),a +;source-doc/base-drv/enumerate.c:59: device_config *const device = working->p_current_device; + ld hl,29 + add hl,bc + ld e, (hl) + inc hl + ld d, (hl) +;source-doc/base-drv/enumerate.c:61: switch (working->usb_device) { + ld l, c + ld h, b + inc hl + inc hl + ld a, (hl) + cp a,0x01 + jr Z,l_op_parse_endpoint_00102 + cp a,0x02 + jr Z,l_op_parse_endpoint_00102 + sub a,0x04 + jr Z,l_op_parse_endpoint_00103 + jr l_op_parse_endpoint_00104 +;source-doc/base-drv/enumerate.c:63: case USB_IS_MASS_STORAGE: { +l_op_parse_endpoint_00102: +;source-doc/base-drv/enumerate.c:64: parse_endpoints(device, endpoint); + push bc + ld l,(ix-2) + ld h,(ix-1) + push hl + push de + call _parse_endpoints + pop af + pop af + pop bc +;source-doc/base-drv/enumerate.c:65: break; + jr l_op_parse_endpoint_00104 +;source-doc/base-drv/enumerate.c:68: case USB_IS_KEYBOARD: { +l_op_parse_endpoint_00103: +;source-doc/base-drv/enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); + ex de, hl + push bc + ld e,(ix-2) + ld d,(ix-1) + call _parse_endpoint_keyboard + pop bc +;source-doc/base-drv/enumerate.c:72: } +l_op_parse_endpoint_00104: +;source-doc/base-drv/enumerate.c:74: return op_endpoint_next(working); + ld l, c + ld h, b + call _op_endpoint_next +;source-doc/base-drv/enumerate.c:75: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { +; --------------------------------- +; Function configure_device +; --------------------------------- +_configure_device: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/base-drv/enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; + ld a,(ix+8) + ld (ix-4),a + ld a,(ix+9) + ld (ix-3),a + pop bc + push bc + inc bc + inc bc + ld e,(ix+6) + ld d,(ix+7) + inc de + inc de + ld a, (de) + ld (bc), a +;source-doc/base-drv/enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; + ld a,(ix-4) + add a,0x01 + ld (ix-2),a + ld a,(ix-3) + adc a,0x00 + ld (ix-1),a + ld c,(ix+4) + ld b,(ix+5) + ld hl,10 + add hl,bc + ld a, (hl) + pop de + pop hl + push hl +;source-doc/base-drv/enumerate.c:81: dev_cfg->address = working->current_device_address; + ld (hl),a + push de + ld hl,0x0018 + add hl,bc + ld a, (hl) + add a, a + add a, a + add a, a + add a, a + ld l, a + ld a, (de) + and a,0x0f + or a, l + ld (de), a +;source-doc/base-drv/enumerate.c:82: dev_cfg->type = working->usb_device; + pop de + push de + ld l, c + ld h, b + inc hl + inc hl + ld a, (hl) + and a,0x0f + ld l, a + ld a, (de) + and a,0xf0 + or a, l + ld (de), a +;source-doc/base-drv/enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); + ld hl,36 + add hl, bc + ld b, (hl) + ld l,(ix-2) + ld h,(ix-1) + ld d, (hl) + pop hl + ld a,(hl) + push hl + rlca + rlca + rlca + rlca + and a,0x0f + ld c, d + push bc + push af + inc sp + call _usbtrn_set_configuration +;source-doc/base-drv/enumerate.c:85: } + ld sp,ix + pop ix + ret +;source-doc/base-drv/enumerate.c:87: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_capture_hub_driver_interface +; --------------------------------- +_op_capture_hub_driver_interface: + push ix + ld ix,0 + add ix,sp + push af + push af + push af + dec sp + ex de, hl +;source-doc/base-drv/enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + ld hl,0x001c + add hl,de + ld a, (hl) + dec hl + ld l, (hl) + ld (ix-4),l + ld (ix-3),a +;source-doc/base-drv/enumerate.c:92: working->hub_config = &hub_config; + ld hl,0x0019 + add hl, de + ld (ix-2),l + ld (ix-1),h + ld hl,0 + add hl, sp + ld c, l + ld l,(ix-2) + ld b,h + ld h,(ix-1) + ld (hl), c + inc hl + ld (hl), b +;source-doc/base-drv/enumerate.c:94: hub_config.type = USB_IS_HUB; + ld hl,0 + add hl, sp + ld a, (hl) + or a,0x0f + ld (hl), a +;source-doc/base-drv/enumerate.c:95: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); + push de + ld hl,2 + add hl, sp + push hl + ld l,(ix-4) + ld h,(ix-3) + push hl + push de + call _configure_device + pop af + pop af + pop af + pop de + ld a, l + inc l + dec l + jr NZ,l_op_capture_hub_driver_interface_00103 +;source-doc/base-drv/enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); + ex de, hl + call _configure_usb_hub + ld a, l +;source-doc/base-drv/enumerate.c:97: done: +l_op_capture_hub_driver_interface_00103: +;source-doc/base-drv/enumerate.c:98: return result; +;source-doc/base-drv/enumerate.c:99: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { +; --------------------------------- +; Function op_cap_drv_intf +; --------------------------------- +_op_cap_drv_intf: + push ix + ld ix,0 + add ix,sp + ld c, l + ld b, h + ld hl, -16 + add hl, sp + ld sp, hl +;source-doc/base-drv/enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + ld (ix-2),c + ld l, c + ld (ix-1),b + ld h,b + ld de,0x001b + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + dec hl + ld c, e + ld b, d +;source-doc/base-drv/enumerate.c:106: working->ptr += interface->bLength; + ld a, (bc) + add a, e + ld e, a + ld a,0x00 + adc a, d + ld (hl), e + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:107: working->endpoint_count = interface->bNumEndpoints; + ld a,(ix-2) + add a,0x17 + ld e, a + ld a,(ix-1) + adc a,0x00 + ld d, a + ld l, c + ld h, b + inc hl + inc hl + inc hl + inc hl + ld a, (hl) + ld (de), a +;source-doc/base-drv/enumerate.c:108: working->p_current_device = NULL; + ld a,(ix-2) + add a,0x1d + ld (ix-4),a + ld l,a + ld a,(ix-1) + adc a,0x00 + ld (ix-3),a + ld h,a + xor a, a + ld (hl), a + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:110: switch (working->usb_device) { + ld l,(ix-2) + ld h,(ix-1) + inc hl + inc hl + ld a, (hl) + cp a,0x06 + jr Z,l_op_cap_drv_intf_00104 + sub a,0x0f + jr NZ,l_op_cap_drv_intf_00107 +;source-doc/base-drv/enumerate.c:112: CHECK(op_capture_hub_driver_interface(working)) + ld l,(ix-2) + ld h,(ix-1) + call _op_capture_hub_driver_interface + or a, a + jr Z,l_op_cap_drv_intf_00112 + jr l_op_cap_drv_intf_00113 +;source-doc/base-drv/enumerate.c:116: case USB_IS_UNKNOWN: { +l_op_cap_drv_intf_00104: +;source-doc/base-drv/enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config)); + push bc + ld hl,2 + add hl, sp + ld b,0x06 +l_op_cap_drv_intf_00154: + xor a, a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_op_cap_drv_intf_00154 + pop bc +;source-doc/base-drv/enumerate.c:119: working->p_current_device = &unkown_dev_cfg; + ld hl,0 + add hl, sp + ex de, hl + ld l,(ix-4) + ld h,(ix-3) + ld (hl), e + inc hl + ld (hl), d +;source-doc/base-drv/enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); + ld hl,0 + add hl, sp + push hl + push bc + ld l,(ix-2) + ld h,(ix-1) + push hl + call _configure_device + pop af + pop af + pop af + ld a, l + or a, a + jr Z,l_op_cap_drv_intf_00112 + jr l_op_cap_drv_intf_00113 +;source-doc/base-drv/enumerate.c:124: default: { +l_op_cap_drv_intf_00107: +;source-doc/base-drv/enumerate.c:125: device_config *dev_cfg = find_first_free(); + push bc + call _find_first_free +;source-doc/base-drv/enumerate.c:126: if (dev_cfg == NULL) + pop bc + ld a,h + or a,l + ex de,hl + jr NZ,l_op_cap_drv_intf_00109 +;source-doc/base-drv/enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; + ld l,0x83 + jr l_op_cap_drv_intf_00114 +l_op_cap_drv_intf_00109: +;source-doc/base-drv/enumerate.c:128: working->p_current_device = dev_cfg; + ld l,(ix-4) + ld h,(ix-3) + ld (hl), e + inc hl + ld (hl), d +;source-doc/base-drv/enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); + push de + push bc + ld l,(ix-2) + ld h,(ix-1) + push hl + call _configure_device + pop af + pop af + pop af + ld a, l + or a, a + jr NZ,l_op_cap_drv_intf_00113 +;source-doc/base-drv/enumerate.c:132: } +l_op_cap_drv_intf_00112: +;source-doc/base-drv/enumerate.c:134: result = op_parse_endpoint(working); + ld l,(ix-2) + ld h,(ix-1) + call _op_parse_endpoint +;source-doc/base-drv/enumerate.c:136: done: +l_op_cap_drv_intf_00113: +;source-doc/base-drv/enumerate.c:137: return result; + ld l, a +l_op_cap_drv_intf_00114: +;source-doc/base-drv/enumerate.c:138: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_id_class_drv +; --------------------------------- +_op_id_class_drv: + ex de, hl +;source-doc/base-drv/enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; + ld hl,0x001c + add hl,de + ld a, (hl) + dec hl + ld l, (hl) +;source-doc/base-drv/enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; + ld c, e + ld b, d + inc bc + inc bc + ld h, a + ld l, (hl) + ld a,0x05 + sub a, l + jr NC,l_op_id_class_drv_00103 + push bc + push de + push de + call _identify_class_driver + pop af + ld a, l + pop de + pop bc + jr l_op_id_class_drv_00104 +l_op_id_class_drv_00103: + xor a, a +l_op_id_class_drv_00104: + ld (bc), a +;source-doc/base-drv/enumerate.c:145: return op_cap_drv_intf(working); + ex de, hl + call _op_cap_drv_intf + ld a, l +;source-doc/base-drv/enumerate.c:146: } + ret +;source-doc/base-drv/enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { +; --------------------------------- +; Function op_get_cfg_desc +; --------------------------------- +_op_get_cfg_desc: + push ix + ld ix,0 + add ix,sp + push af + ex de, hl +;source-doc/base-drv/enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + ld hl,0x001f + add hl, de + pop af + push hl + ld b,0x46 +l_op_get_cfg_desc_00113: + xor a, a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_op_get_cfg_desc_00113 +;source-doc/base-drv/enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + ld c, e + ld b, d + inc bc + inc bc + inc bc + ld hl,7 + add hl, bc + ld a, (hl) +;source-doc/base-drv/enumerate.c:154: working->config.buffer)); + ld c, e + ld b, d + ld hl,24 + add hl, bc + ld b, (hl) + ld l, e + ld h, d + push bc + ld bc,0x0015 + add hl, bc + pop bc + ld c, (hl) + push de + ld l,(ix-2) + ld h,(ix-1) + push hl + ld h,0x8c + ld l,a + push hl + push bc + call _usbtrn_gfull_cfg_desc + pop af + pop af + pop af + pop de + ld a, l + ld (_result), a + ld a,(_result) + or a, a + jr NZ,l_op_get_cfg_desc_00103 +;source-doc/base-drv/enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); + ld hl,0x001b + add hl, de + ld a, e + add a,0x1f + ld c, a + ld a, d + adc a,0x00 + ld b, a + ld a, c + add a,0x09 + ld c, a + ld a, b + adc a,0x00 + ld (hl), c + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; + ld hl,0x0016 + add hl, de + ld c, l + ld b, h + pop hl + push hl + inc hl + inc hl + inc hl + inc hl + ld a, (hl) + ld (bc), a +;source-doc/base-drv/enumerate.c:159: return op_id_class_drv(working); + ex de, hl + call _op_id_class_drv + jr l_op_get_cfg_desc_00104 +;source-doc/base-drv/enumerate.c:160: done: +l_op_get_cfg_desc_00103: +;source-doc/base-drv/enumerate.c:161: return result; + ld hl,_result + ld a, (hl) +l_op_get_cfg_desc_00104: +;source-doc/base-drv/enumerate.c:162: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { +; --------------------------------- +; Function read_all_configs +; --------------------------------- +_read_all_configs: + push ix + ld ix,0 + add ix,sp + ld hl, -171 + add hl, sp + ld sp, hl +;source-doc/base-drv/enumerate.c:169: memset(&working, 0, sizeof(_working)); + ld hl,0 + add hl, sp + ld (hl),0x00 + ld e, l + ld d, h + inc de + ld bc,0x00aa + ldir +;source-doc/base-drv/enumerate.c:170: working.state = state; + ld a,(ix+4) + ld hl,0 + add hl, sp + ld (hl), a + ld a,(ix+5) + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); + ld hl,3 + add hl, sp + push hl + call _usbtrn_get_descriptor + pop af + ld a, l + or a, a + jr NZ,l_read_all_configs_00108 +;source-doc/base-drv/enumerate.c:174: state->next_device_address++; + ld e,(ix+4) + ld d,(ix+5) + ld a, (de) + inc a + ld c,a + ld (de), a +;source-doc/base-drv/enumerate.c:175: working.current_device_address = state->next_device_address; + ld hl,24 + add hl, sp + ld (hl), c +;source-doc/base-drv/enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); + ld l, c + call _usbtrn_set_address + ld a, l +;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + or a,a + jr NZ,l_read_all_configs_00108 + ld c,a +l_read_all_configs_00110: + ld hl,20 + add hl, sp + ld b, (hl) + ld a, c + sub a, b + jr NC,l_read_all_configs_00107 +;source-doc/base-drv/enumerate.c:179: working.config_index = config_index; + inc hl + ld (hl), c +;source-doc/base-drv/enumerate.c:181: CHECK(op_get_cfg_desc(&working)); + push bc + ld hl,2 + add hl, sp + call _op_get_cfg_desc + pop bc + or a, a + jr NZ,l_read_all_configs_00108 +;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { + inc c + jr l_read_all_configs_00110 +l_read_all_configs_00107: +;source-doc/base-drv/enumerate.c:184: return USB_ERR_OK; + ld l,0x00 + jr l_read_all_configs_00112 +;source-doc/base-drv/enumerate.c:185: done: +l_read_all_configs_00108: +;source-doc/base-drv/enumerate.c:186: return result; + ld l, a +l_read_all_configs_00112: +;source-doc/base-drv/enumerate.c:187: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { +; --------------------------------- +; Function enumerate_all_devices +; --------------------------------- +_enumerate_all_devices: + push ix + dec sp +;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); + ld hl,0 + add hl, sp + ld e,l + ld d,h +;source-doc/base-drv/enumerate.c:193: state.next_device_address = 0; + xor a,a + ld (hl),a + ld (de), a +;source-doc/base-drv/enumerate.c:195: usb_error result = read_all_configs(&state); + push de + push de + call _read_all_configs + pop af + ld c, l + pop de +;source-doc/base-drv/enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; + ld a, (de) + ld ((_x + 1)),a +;source-doc/base-drv/enumerate.c:200: return result; + ld l, c +;source-doc/base-drv/enumerate.c:201: } + inc sp + pop ix + ret + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index f1e3e0e0..37dc3d50 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./enumerate.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/enumerate.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./enumerate.c:13: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) +;source-doc/base-drv/enumerate.c:13: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) ; --------------------------------- ; Function parse_endpoint_keyboard ; --------------------------------- @@ -57,16 +57,14 @@ _parse_endpoint_keyboard: ld ix,0 add ix,sp push af -;source-doc/base-drv/./enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; +;source-doc/base-drv/enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; inc hl inc hl inc hl +;source-doc/base-drv/enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; ld c,l ld b,h -;source-doc/base-drv/./enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; - inc sp - inc sp - push bc + ex (sp),hl ld l, e ld h, d inc hl @@ -82,12 +80,12 @@ _parse_endpoint_keyboard: and 0xf1 or c ld (hl), a - pop bc -;source-doc/base-drv/./enumerate.c:17: ep->toggle = 0; - ld l, c - ld h, b +;source-doc/base-drv/enumerate.c:17: ep->toggle = 0; + pop hl + ld c,l + ld b,h res 0, (hl) -;source-doc/base-drv/./enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); +;source-doc/base-drv/enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); inc bc ld hl,4 add hl, de @@ -106,11 +104,11 @@ _parse_endpoint_keyboard: and 0xfc or l ld (bc), a -;source-doc/base-drv/./enumerate.c:19: } +;source-doc/base-drv/enumerate.c:19: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { +;source-doc/base-drv/enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { ; --------------------------------- ; Function identify_class_driver ; --------------------------------- @@ -118,9 +116,7 @@ _identify_class_driver: push ix ld ix,0 add ix,sp - push af - dec sp -;source-doc/base-drv/./enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; +;source-doc/base-drv/enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; ld c,(ix+4) ld b,(ix+5) ld hl,27 @@ -128,20 +124,18 @@ _identify_class_driver: ld c, (hl) inc hl ld b, (hl) -;source-doc/base-drv/./enumerate.c:23: if (p->bInterfaceClass == 2) - ld e, c - ld d, b +;source-doc/base-drv/enumerate.c:23: if (p->bInterfaceClass == 2) ld hl,5 - add hl, de - ld e, (hl) - ld a, e + add hl,bc + ld a,(hl) + ld e,a sub 0x02 jr NZ,l_identify_class_driver_00102 -;source-doc/base-drv/./enumerate.c:24: return USB_IS_CDC; +;source-doc/base-drv/enumerate.c:24: return USB_IS_CDC; ld l,0x03 - jp l_identify_class_driver_00118 + jr l_identify_class_driver_00118 l_identify_class_driver_00102: -;source-doc/base-drv/./enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) +;source-doc/base-drv/enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) ld a, e sub 0x08 jr NZ,l_identify_class_driver_00199 @@ -150,112 +144,108 @@ l_identify_class_driver_00102: l_identify_class_driver_00199: xor a l_identify_class_driver_00200: - ld (ix-3),a - ld hl,0x0006 - add hl, bc - ld (ix-2),l - ld (ix-1),h - ld hl,0x0007 - add hl, bc - ld c, l - ld b, h - ld a,(ix-3) + ld d,a or a jr Z,l_identify_class_driver_00104 - ld l,(ix-2) - ld h,(ix-1) + ld hl,0x0006 + add hl,bc ld a, (hl) cp 0x06 jr Z,l_identify_class_driver_00107 sub 0x05 jr NZ,l_identify_class_driver_00104 l_identify_class_driver_00107: - ld a, (bc) + ld hl,0x0007 + add hl,bc + ld a, (hl) sub 0x50 jr NZ,l_identify_class_driver_00104 -;source-doc/base-drv/./enumerate.c:27: return USB_IS_MASS_STORAGE; +;source-doc/base-drv/enumerate.c:27: return USB_IS_MASS_STORAGE; ld l,0x02 jr l_identify_class_driver_00118 l_identify_class_driver_00104: -;source-doc/base-drv/./enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) - ld a,(ix-3) +;source-doc/base-drv/enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) + ld a, d or a jr Z,l_identify_class_driver_00109 - ld l,(ix-2) - ld h,(ix-1) + ld hl,0x0006 + add hl,bc ld a, (hl) sub 0x04 jr NZ,l_identify_class_driver_00109 - ld a, (bc) + ld hl,0x0007 + add hl,bc + ld a, (hl) or a jr NZ,l_identify_class_driver_00109 -;source-doc/base-drv/./enumerate.c:30: return USB_IS_FLOPPY; +;source-doc/base-drv/enumerate.c:30: return USB_IS_FLOPPY; ld l,0x01 jr l_identify_class_driver_00118 l_identify_class_driver_00109: -;source-doc/base-drv/./enumerate.c:32: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) +;source-doc/base-drv/enumerate.c:32: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) ld a, e sub 0x09 jr NZ,l_identify_class_driver_00113 - ld l,(ix-2) - ld h,(ix-1) + ld hl,0x0006 + add hl,bc ld a, (hl) or a jr NZ,l_identify_class_driver_00113 - ld a, (bc) + ld hl,7 + add hl, bc + ld a, (hl) or a jr NZ,l_identify_class_driver_00113 -;source-doc/base-drv/./enumerate.c:33: return USB_IS_HUB; +;source-doc/base-drv/enumerate.c:33: return USB_IS_HUB; ld l,0x0f jr l_identify_class_driver_00118 l_identify_class_driver_00113: -;source-doc/base-drv/./enumerate.c:35: if (p->bInterfaceClass == 3) +;source-doc/base-drv/enumerate.c:35: if (p->bInterfaceClass == 3) ld a, e sub 0x03 jr NZ,l_identify_class_driver_00117 -;source-doc/base-drv/./enumerate.c:36: return USB_IS_KEYBOARD; +;source-doc/base-drv/enumerate.c:36: return USB_IS_KEYBOARD; ld l,0x04 jr l_identify_class_driver_00118 l_identify_class_driver_00117: -;source-doc/base-drv/./enumerate.c:38: return USB_IS_UNKNOWN; +;source-doc/base-drv/enumerate.c:38: return USB_IS_UNKNOWN; ld l,0x06 l_identify_class_driver_00118: -;source-doc/base-drv/./enumerate.c:39: } - ld sp, ix +;source-doc/base-drv/enumerate.c:39: } pop ix ret -;source-doc/base-drv/./enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { +;source-doc/base-drv/enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { ; --------------------------------- ; Function op_interface_next ; --------------------------------- _op_interface_next: ex de, hl -;source-doc/base-drv/./enumerate.c:42: if (--working->interface_count == 0) +;source-doc/base-drv/enumerate.c:42: if (--working->interface_count == 0) ld hl,0x0016 add hl, de ld a, (hl) dec a ld (hl), a -;source-doc/base-drv/./enumerate.c:43: return USB_ERR_OK; +;source-doc/base-drv/enumerate.c:43: return USB_ERR_OK; or a jr NZ,l_op_interface_next_00102 ld l,a jr l_op_interface_next_00103 l_op_interface_next_00102: -;source-doc/base-drv/./enumerate.c:45: return op_id_class_drv(working); +;source-doc/base-drv/enumerate.c:45: return op_id_class_drv(working); ex de, hl call _op_id_class_drv ld l, a l_op_interface_next_00103: -;source-doc/base-drv/./enumerate.c:46: } +;source-doc/base-drv/enumerate.c:46: } ret -;source-doc/base-drv/./enumerate.c:48: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:48: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_endpoint_next ; --------------------------------- _op_endpoint_next: ex de, hl -;source-doc/base-drv/./enumerate.c:49: if (--working->endpoint_count > 0) { +;source-doc/base-drv/enumerate.c:49: if (--working->endpoint_count > 0) { ld hl,0x0017 add hl, de ld a, (hl) @@ -263,7 +253,7 @@ _op_endpoint_next: ld (hl), a or a jr Z,l_op_endpoint_next_00102 -;source-doc/base-drv/./enumerate.c:50: working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; +;source-doc/base-drv/enumerate.c:50: working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; ld hl,0x001b add hl, de ld c, (hl) @@ -278,19 +268,19 @@ _op_endpoint_next: ld (hl), c inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:51: return op_parse_endpoint(working); +;source-doc/base-drv/enumerate.c:51: return op_parse_endpoint(working); ex de, hl jp _op_parse_endpoint jr l_op_endpoint_next_00103 l_op_endpoint_next_00102: -;source-doc/base-drv/./enumerate.c:54: return op_interface_next(working); +;source-doc/base-drv/enumerate.c:54: return op_interface_next(working); ex de, hl call _op_interface_next ld a, l l_op_endpoint_next_00103: -;source-doc/base-drv/./enumerate.c:55: } +;source-doc/base-drv/enumerate.c:55: } ret -;source-doc/base-drv/./enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_parse_endpoint ; --------------------------------- @@ -299,25 +289,23 @@ _op_parse_endpoint: ld ix,0 add ix,sp push af -;source-doc/base-drv/./enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; +;source-doc/base-drv/enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; + ld de,0x001c ld c,l ld b,h - ld de,0x001c add hl, de ld a, (hl) dec hl ld l, (hl) ld (ix-2),l ld (ix-1),a -;source-doc/base-drv/./enumerate.c:59: device_config *const device = working->p_current_device; - ld e, c - ld d, b +;source-doc/base-drv/enumerate.c:59: device_config *const device = working->p_current_device; ld hl,29 - add hl, de + add hl,bc ld e, (hl) inc hl ld d, (hl) -;source-doc/base-drv/./enumerate.c:61: switch (working->usb_device) { +;source-doc/base-drv/enumerate.c:61: switch (working->usb_device) { ld l, c ld h, b inc hl @@ -330,9 +318,9 @@ _op_parse_endpoint: sub 0x04 jr Z,l_op_parse_endpoint_00103 jr l_op_parse_endpoint_00104 -;source-doc/base-drv/./enumerate.c:63: case USB_IS_MASS_STORAGE: { +;source-doc/base-drv/enumerate.c:63: case USB_IS_MASS_STORAGE: { l_op_parse_endpoint_00102: -;source-doc/base-drv/./enumerate.c:64: parse_endpoints(device, endpoint); +;source-doc/base-drv/enumerate.c:64: parse_endpoints(device, endpoint); push bc ld l,(ix-2) ld h,(ix-1) @@ -342,28 +330,28 @@ l_op_parse_endpoint_00102: pop af pop af pop bc -;source-doc/base-drv/./enumerate.c:65: break; +;source-doc/base-drv/enumerate.c:65: break; jr l_op_parse_endpoint_00104 -;source-doc/base-drv/./enumerate.c:68: case USB_IS_KEYBOARD: { +;source-doc/base-drv/enumerate.c:68: case USB_IS_KEYBOARD: { l_op_parse_endpoint_00103: -;source-doc/base-drv/./enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); +;source-doc/base-drv/enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); ex de, hl push bc ld e,(ix-2) ld d,(ix-1) call _parse_endpoint_keyboard pop bc -;source-doc/base-drv/./enumerate.c:72: } +;source-doc/base-drv/enumerate.c:72: } l_op_parse_endpoint_00104: -;source-doc/base-drv/./enumerate.c:74: return op_endpoint_next(working); +;source-doc/base-drv/enumerate.c:74: return op_endpoint_next(working); ld l, c ld h, b call _op_endpoint_next -;source-doc/base-drv/./enumerate.c:75: } +;source-doc/base-drv/enumerate.c:75: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { +;source-doc/base-drv/enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { ; --------------------------------- ; Function configure_device ; --------------------------------- @@ -373,7 +361,7 @@ _configure_device: add ix,sp push af push af -;source-doc/base-drv/./enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; +;source-doc/base-drv/enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; ld a,(ix+8) ld (ix-4),a ld a,(ix+9) @@ -388,7 +376,7 @@ _configure_device: inc de ld a, (de) ld (bc), a -;source-doc/base-drv/./enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; +;source-doc/base-drv/enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; ld a,(ix-4) add a,0x01 ld (ix-2),a @@ -397,25 +385,17 @@ _configure_device: ld (ix-1),a ld c,(ix+4) ld b,(ix+5) - ld e, c - ld d, b ld hl,10 - add hl, de + add hl,bc ld a, (hl) pop de pop hl push hl +;source-doc/base-drv/enumerate.c:81: dev_cfg->address = working->current_device_address; + ld (hl),a push de - ld (hl), a -;source-doc/base-drv/./enumerate.c:81: dev_cfg->address = working->current_device_address; - pop de - push de - ld l, c - ld h, b - push bc - ld bc,0x0018 - add hl, bc - pop bc + ld hl,0x0018 + add hl,bc ld a, (hl) add a, a add a, a @@ -426,7 +406,7 @@ _configure_device: and 0x0f or l ld (de), a -;source-doc/base-drv/./enumerate.c:82: dev_cfg->type = working->usb_device; +;source-doc/base-drv/enumerate.c:82: dev_cfg->type = working->usb_device; pop de push de ld l, c @@ -440,34 +420,31 @@ _configure_device: and 0xf0 or l ld (de), a -;source-doc/base-drv/./enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); +;source-doc/base-drv/enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); ld hl,36 add hl, bc - ld c, (hl) + ld b, (hl) ld l,(ix-2) ld h,(ix-1) - ld b, (hl) + ld d, (hl) pop hl + ld a,(hl) push hl - ld a, (hl) rlca rlca rlca rlca and 0x0f - ld h, c - push hl - inc sp + ld c, d push bc - inc sp push af inc sp call _usbtrn_set_configuration -;source-doc/base-drv/./enumerate.c:85: } +;source-doc/base-drv/enumerate.c:85: } ld sp,ix pop ix ret -;source-doc/base-drv/./enumerate.c:87: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:87: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_capture_hub_driver_interface ; --------------------------------- @@ -480,17 +457,15 @@ _op_capture_hub_driver_interfac: push af dec sp ex de, hl -;source-doc/base-drv/./enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - ld l, e - ld h, d - ld bc,0x001c - add hl, bc +;source-doc/base-drv/enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + ld hl,0x001c + add hl,de ld a, (hl) dec hl ld l, (hl) ld (ix-4),l ld (ix-3),a -;source-doc/base-drv/./enumerate.c:92: working->hub_config = &hub_config; +;source-doc/base-drv/enumerate.c:92: working->hub_config = &hub_config; ld hl,0x0019 add hl, de ld (ix-2),l @@ -498,19 +473,19 @@ _op_capture_hub_driver_interfac: ld hl,0 add hl, sp ld c, l - ld b, h ld l,(ix-2) + ld b,h ld h,(ix-1) ld (hl), c inc hl ld (hl), b -;source-doc/base-drv/./enumerate.c:94: hub_config.type = USB_IS_HUB; +;source-doc/base-drv/enumerate.c:94: hub_config.type = USB_IS_HUB; ld hl,0 add hl, sp ld a, (hl) or 0x0f ld (hl), a -;source-doc/base-drv/./enumerate.c:95: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); +;source-doc/base-drv/enumerate.c:95: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); push de ld hl,2 add hl, sp @@ -528,18 +503,18 @@ _op_capture_hub_driver_interfac: inc l dec l jr NZ,l_op_capture_hub_driver_interfa -;source-doc/base-drv/./enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); +;source-doc/base-drv/enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); ex de, hl call _configure_usb_hub ld a, l -;source-doc/base-drv/./enumerate.c:97: done: +;source-doc/base-drv/enumerate.c:97: done: l_op_capture_hub_driver_interfa: -;source-doc/base-drv/./enumerate.c:98: return result; -;source-doc/base-drv/./enumerate.c:99: } +;source-doc/base-drv/enumerate.c:98: return result; +;source-doc/base-drv/enumerate.c:99: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { +;source-doc/base-drv/enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { ; --------------------------------- ; Function op_cap_drv_intf ; --------------------------------- @@ -552,11 +527,11 @@ _op_cap_drv_intf: ld hl, -16 add hl, sp ld sp, hl +;source-doc/base-drv/enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; ld (ix-2),c + ld l, c ld (ix-1),b -;source-doc/base-drv/./enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - ld l,(ix-2) - ld h,(ix-1) + ld h,b ld de,0x001b add hl, de ld e, (hl) @@ -565,7 +540,7 @@ _op_cap_drv_intf: dec hl ld c, e ld b, d -;source-doc/base-drv/./enumerate.c:106: working->ptr += interface->bLength; +;source-doc/base-drv/enumerate.c:106: working->ptr += interface->bLength; ld a, (bc) add a, e ld e, a @@ -574,7 +549,7 @@ _op_cap_drv_intf: ld (hl), e inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:107: working->endpoint_count = interface->bNumEndpoints; +;source-doc/base-drv/enumerate.c:107: working->endpoint_count = interface->bNumEndpoints; ld a,(ix-2) add a,0x17 ld e, a @@ -589,20 +564,20 @@ _op_cap_drv_intf: inc hl ld a, (hl) ld (de), a -;source-doc/base-drv/./enumerate.c:108: working->p_current_device = NULL; +;source-doc/base-drv/enumerate.c:108: working->p_current_device = NULL; ld a,(ix-2) add a,0x1d ld (ix-4),a + ld l,a ld a,(ix-1) adc a,0x00 ld (ix-3),a - ld l,(ix-4) - ld h,(ix-3) + ld h,a xor a ld (hl), a inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:110: switch (working->usb_device) { +;source-doc/base-drv/enumerate.c:110: switch (working->usb_device) { ld l,(ix-2) ld h,(ix-1) inc hl @@ -612,26 +587,29 @@ _op_cap_drv_intf: jr Z,l_op_cap_drv_intf_00104 sub 0x0f jr NZ,l_op_cap_drv_intf_00107 -;source-doc/base-drv/./enumerate.c:112: CHECK(op_capture_hub_driver_interface(working)) +;source-doc/base-drv/enumerate.c:112: CHECK(op_capture_hub_driver_interface(working)) ld l,(ix-2) ld h,(ix-1) call _op_capture_hub_driver_interfac or a jr Z,l_op_cap_drv_intf_00112 jr l_op_cap_drv_intf_00113 -;source-doc/base-drv/./enumerate.c:116: case USB_IS_UNKNOWN: { +;source-doc/base-drv/enumerate.c:116: case USB_IS_UNKNOWN: { l_op_cap_drv_intf_00104: -;source-doc/base-drv/./enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config)); +;source-doc/base-drv/enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config)); push bc ld hl,2 add hl, sp - ld b,0x0c + ld b,0x06 l_op_cap_drv_intf_00154: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_op_cap_drv_intf_00154 pop bc -;source-doc/base-drv/./enumerate.c:119: working->p_current_device = &unkown_dev_cfg; +;source-doc/base-drv/enumerate.c:119: working->p_current_device = &unkown_dev_cfg; ld hl,0 add hl, sp ex de, hl @@ -640,7 +618,7 @@ l_op_cap_drv_intf_00154: ld (hl), e inc hl ld (hl), d -;source-doc/base-drv/./enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); +;source-doc/base-drv/enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); ld hl,0 add hl, sp push hl @@ -656,28 +634,28 @@ l_op_cap_drv_intf_00154: or a jr Z,l_op_cap_drv_intf_00112 jr l_op_cap_drv_intf_00113 -;source-doc/base-drv/./enumerate.c:124: default: { +;source-doc/base-drv/enumerate.c:124: default: { l_op_cap_drv_intf_00107: -;source-doc/base-drv/./enumerate.c:125: device_config *dev_cfg = find_first_free(); +;source-doc/base-drv/enumerate.c:125: device_config *dev_cfg = find_first_free(); push bc call _find_first_free - ex de, hl +;source-doc/base-drv/enumerate.c:126: if (dev_cfg == NULL) pop bc -;source-doc/base-drv/./enumerate.c:126: if (dev_cfg == NULL) - ld a, d - or e + ld a,h + or l + ex de,hl jr NZ,l_op_cap_drv_intf_00109 -;source-doc/base-drv/./enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; +;source-doc/base-drv/enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; ld l,0x83 jr l_op_cap_drv_intf_00114 l_op_cap_drv_intf_00109: -;source-doc/base-drv/./enumerate.c:128: working->p_current_device = dev_cfg; +;source-doc/base-drv/enumerate.c:128: working->p_current_device = dev_cfg; ld l,(ix-4) ld h,(ix-3) ld (hl), e inc hl ld (hl), d -;source-doc/base-drv/./enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); +;source-doc/base-drv/enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); push de push bc ld l,(ix-2) @@ -690,41 +668,39 @@ l_op_cap_drv_intf_00109: ld a, l or a jr NZ,l_op_cap_drv_intf_00113 -;source-doc/base-drv/./enumerate.c:132: } +;source-doc/base-drv/enumerate.c:132: } l_op_cap_drv_intf_00112: -;source-doc/base-drv/./enumerate.c:134: result = op_parse_endpoint(working); +;source-doc/base-drv/enumerate.c:134: result = op_parse_endpoint(working); ld l,(ix-2) ld h,(ix-1) call _op_parse_endpoint -;source-doc/base-drv/./enumerate.c:136: done: +;source-doc/base-drv/enumerate.c:136: done: l_op_cap_drv_intf_00113: -;source-doc/base-drv/./enumerate.c:137: return result; +;source-doc/base-drv/enumerate.c:137: return result; ld l, a l_op_cap_drv_intf_00114: -;source-doc/base-drv/./enumerate.c:138: } +;source-doc/base-drv/enumerate.c:138: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_id_class_drv ; --------------------------------- _op_id_class_drv: ex de, hl -;source-doc/base-drv/./enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; - ld l, e - ld h, d - ld bc,0x001c - add hl, bc +;source-doc/base-drv/enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; + ld hl,0x001c + add hl,de ld a, (hl) dec hl ld l, (hl) - ld h, a -;source-doc/base-drv/./enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; +;source-doc/base-drv/enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; ld c, e ld b, d inc bc inc bc + ld h, a ld l, (hl) ld a,0x05 sub l @@ -742,13 +718,13 @@ l_op_id_class_drv_00103: xor a l_op_id_class_drv_00104: ld (bc), a -;source-doc/base-drv/./enumerate.c:145: return op_cap_drv_intf(working); +;source-doc/base-drv/enumerate.c:145: return op_cap_drv_intf(working); ex de, hl call _op_cap_drv_intf ld a, l -;source-doc/base-drv/./enumerate.c:146: } +;source-doc/base-drv/enumerate.c:146: } ret -;source-doc/base-drv/./enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_get_cfg_desc ; --------------------------------- @@ -757,81 +733,67 @@ _op_get_cfg_desc: ld ix,0 add ix,sp push af - push af - ld (ix-2),l - ld (ix-1),h -;source-doc/base-drv/./enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); - ld a,(ix-2) - add a,0x1f - ld (ix-4),a - ld a,(ix-1) - adc a,0x00 - ld (ix-3),a - pop hl + ex de, hl +;source-doc/base-drv/enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + ld hl,0x001f + add hl, de + pop af push hl - ld b,0x8c + ld b,0x46 l_op_get_cfg_desc_00113: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_op_get_cfg_desc_00113 -;source-doc/base-drv/./enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; - pop hl - pop bc - push bc - push hl +;source-doc/base-drv/enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + ld c, e + ld b, d inc bc inc bc inc bc ld hl,7 add hl, bc - ld d, (hl) -;source-doc/base-drv/./enumerate.c:154: working->config.buffer)); - pop hl - pop bc - push bc - push hl + ld a, (hl) +;source-doc/base-drv/enumerate.c:154: working->config.buffer)); + ld c, e + ld b, d ld hl,24 add hl, bc - ld a, (hl) - pop hl - pop bc + ld b, (hl) + ld l, e + ld h, d push bc - push hl - ld hl,21 + ld bc,0x0015 add hl, bc - ld b, (hl) - pop hl - push hl + pop bc + ld c, (hl) + push de + ld l,(ix-2) + ld h,(ix-1) push hl ld h,0x8c + ld l,a push hl - inc sp - push de - inc sp - push af - inc sp push bc - inc sp call _usbtrn_gfull_cfg_desc pop af pop af pop af + pop de ld a, l ld (_result), a ld a,(_result) or a jr NZ,l_op_get_cfg_desc_00103 -;source-doc/base-drv/./enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); - pop de - pop hl - push hl - push de - ld de,0x001b +;source-doc/base-drv/enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); + ld hl,0x001b add hl, de - ld a,(ix-2) + ld a, e add a,0x1f ld c, a - ld a,(ix-1) + ld a, d adc a,0x00 ld b, a ld a, c @@ -842,37 +804,34 @@ l_op_get_cfg_desc_00113: ld (hl), c inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; - ld a,(ix-2) - add a,0x16 - ld c, a - ld a,(ix-1) - adc a,0x00 - ld b, a - pop de - push de - ld hl,4 +;source-doc/base-drv/enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; + ld hl,0x0016 add hl, de - ld a, (hl) - ld (bc), a -;source-doc/base-drv/./enumerate.c:159: return op_id_class_drv(working); - pop de + ld c, l + ld b, h pop hl push hl - push de + inc hl + inc hl + inc hl + inc hl + ld a, (hl) + ld (bc), a +;source-doc/base-drv/enumerate.c:159: return op_id_class_drv(working); + ex de, hl call _op_id_class_drv jr l_op_get_cfg_desc_00104 -;source-doc/base-drv/./enumerate.c:160: done: +;source-doc/base-drv/enumerate.c:160: done: l_op_get_cfg_desc_00103: -;source-doc/base-drv/./enumerate.c:161: return result; +;source-doc/base-drv/enumerate.c:161: return result; ld hl,_result ld a, (hl) l_op_get_cfg_desc_00104: -;source-doc/base-drv/./enumerate.c:162: } +;source-doc/base-drv/enumerate.c:162: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { +;source-doc/base-drv/enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { ; --------------------------------- ; Function read_all_configs ; --------------------------------- @@ -883,57 +842,48 @@ _read_all_configs: ld hl, -171 add hl, sp ld sp, hl -;source-doc/base-drv/./enumerate.c:169: memset(&working, 0, sizeof(_working)); +;source-doc/base-drv/enumerate.c:169: memset(&working, 0, sizeof(_working)); ld hl,0 add hl, sp - ex de, hl - ld l, e - ld h, d - ld b,0xab -l_read_all_configs_00149: ld (hl),0x00 - inc hl - djnz l_read_all_configs_00149 -;source-doc/base-drv/./enumerate.c:170: working.state = state; - ld l, e - ld h, d + ld e, l + ld d, h + inc de + ld bc,0x00aa + ldir +;source-doc/base-drv/enumerate.c:170: working.state = state; ld a,(ix+4) + ld hl,0 + add hl, sp ld (hl), a - inc hl ld a,(ix+5) + inc hl ld (hl), a -;source-doc/base-drv/./enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); - push de - ld hl,5 +;source-doc/base-drv/enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); + ld hl,3 add hl, sp push hl call _usbtrn_get_descriptor pop af ld a, l - pop de or a jr NZ,l_read_all_configs_00108 -;source-doc/base-drv/./enumerate.c:174: state->next_device_address++; - ld a,(ix+4) - ld b,(ix+5) - ld l, a - ld h, b - ld c, (hl) - inc c - ld l, a - ld h, b - ld (hl), c -;source-doc/base-drv/./enumerate.c:175: working.current_device_address = state->next_device_address; - ld hl,0x0018 - add hl, de +;source-doc/base-drv/enumerate.c:174: state->next_device_address++; + ld e,(ix+4) + ld d,(ix+5) + ld a, (de) + inc a + ld c,a + ld (de), a +;source-doc/base-drv/enumerate.c:175: working.current_device_address = state->next_device_address; + ld hl,24 + add hl, sp ld (hl), c -;source-doc/base-drv/./enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); - push de +;source-doc/base-drv/enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); ld l, c call _usbtrn_set_address ld a, l - pop de -;source-doc/base-drv/./enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { +;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { or a jr NZ,l_read_all_configs_00108 ld c,a @@ -944,69 +894,63 @@ l_read_all_configs_00110: ld a, c sub b jr NC,l_read_all_configs_00107 -;source-doc/base-drv/./enumerate.c:179: working.config_index = config_index; - ld hl,0x0015 - add hl, de +;source-doc/base-drv/enumerate.c:179: working.config_index = config_index; + inc hl ld (hl), c -;source-doc/base-drv/./enumerate.c:181: CHECK(op_get_cfg_desc(&working)); +;source-doc/base-drv/enumerate.c:181: CHECK(op_get_cfg_desc(&working)); push bc - push de - ld hl,4 + ld hl,2 add hl, sp call _op_get_cfg_desc - pop de pop bc or a jr NZ,l_read_all_configs_00108 -;source-doc/base-drv/./enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { +;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { inc c jr l_read_all_configs_00110 l_read_all_configs_00107: -;source-doc/base-drv/./enumerate.c:184: return USB_ERR_OK; +;source-doc/base-drv/enumerate.c:184: return USB_ERR_OK; ld l,0x00 jr l_read_all_configs_00112 -;source-doc/base-drv/./enumerate.c:185: done: +;source-doc/base-drv/enumerate.c:185: done: l_read_all_configs_00108: -;source-doc/base-drv/./enumerate.c:186: return result; +;source-doc/base-drv/enumerate.c:186: return result; ld l, a l_read_all_configs_00112: -;source-doc/base-drv/./enumerate.c:187: } +;source-doc/base-drv/enumerate.c:187: } ld sp, ix pop ix ret -;source-doc/base-drv/./enumerate.c:189: usb_error enumerate_all_devices(void) { +;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { ; --------------------------------- ; Function enumerate_all_devices ; --------------------------------- _enumerate_all_devices: push ix dec sp -;source-doc/base-drv/./enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); -;source-doc/base-drv/./enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); +;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); ld hl,0 add hl, sp - ex de, hl - ld l, e - ld h, d - ld (hl),0x00 -;source-doc/base-drv/./enumerate.c:193: state.next_device_address = 0; + ld e,l + ld d,h +;source-doc/base-drv/enumerate.c:193: state.next_device_address = 0; xor a + ld (hl),a ld (de), a -;source-doc/base-drv/./enumerate.c:195: usb_error result = read_all_configs(&state); - ld c, e - ld b, d +;source-doc/base-drv/enumerate.c:195: usb_error result = read_all_configs(&state); + push de push de - push bc call _read_all_configs pop af ld c, l pop de -;source-doc/base-drv/./enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; +;source-doc/base-drv/enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; ld a, (de) ld ((_x + 1)),a -;source-doc/base-drv/./enumerate.c:200: return result; +;source-doc/base-drv/enumerate.c:200: return result; ld l, c -;source-doc/base-drv/./enumerate.c:201: } +;source-doc/base-drv/enumerate.c:201: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s index 7a66b97e..0fc01bd3 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./enumerate_hub.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/enumerate_hub.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./enumerate_hub.c:13: usb_error hub_set_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { +;source-doc/base-drv/enumerate_hub.c:13: usb_error hub_set_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { ; --------------------------------- ; Function hub_set_feature ; --------------------------------- @@ -59,49 +59,44 @@ _hub_set_feature: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./enumerate_hub.c:15: set_feature = cmd_set_feature; +;source-doc/base-drv/enumerate_hub.c:15: set_feature = cmd_set_feature; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,_cmd_set_feature + ld e,l + ld d,h + push hl ld bc,0x0008 + ld hl,_cmd_set_feature ldir pop bc -;source-doc/base-drv/./enumerate_hub.c:17: set_feature.bValue[0] = feature; +;source-doc/base-drv/enumerate_hub.c:17: set_feature.bValue[0] = feature; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./enumerate_hub.c:18: set_feature.bIndex[0] = index; +;source-doc/base-drv/enumerate_hub.c:18: set_feature.bIndex[0] = index; ld a,(ix+7) ld (ix-4),a -;source-doc/base-drv/./enumerate_hub.c:19: return usb_control_transfer(&set_feature, 0, hub_config->address, hub_config->max_packet_size); +;source-doc/base-drv/enumerate_hub.c:19: return usb_control_transfer(&set_feature, 0, hub_config->address, hub_config->max_packet_size); + ld e,(ix+5) ld a,(ix+4) - ld d,(ix+5) ld l, a - ld h, d + ld h, e inc hl - ld e, (hl) + ld d, (hl) ld l, a - ld h, d + ld h, e ld a, (hl) rlca rlca rlca rlca and 0x0f - ld h, e - push hl - inc sp - push af - inc sp + ld e,a + push de ld hl,0x0000 push hl push bc call _usb_control_transfer -;source-doc/base-drv/./enumerate_hub.c:20: } +;source-doc/base-drv/enumerate_hub.c:20: } ld sp,ix pop ix ret @@ -129,7 +124,7 @@ _cmd_get_status_port: DEFB +0x01 DEFB +0x00 DEFW +0x0004 -;source-doc/base-drv/./enumerate_hub.c:22: usb_error hub_clear_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { +;source-doc/base-drv/enumerate_hub.c:22: usb_error hub_clear_feature(const device_config_hub *const hub_config, const uint8_t feature, const uint8_t index) { ; --------------------------------- ; Function hub_clear_feature ; --------------------------------- @@ -140,53 +135,48 @@ _hub_clear_feature: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./enumerate_hub.c:24: clear_feature = cmd_clear_feature; +;source-doc/base-drv/enumerate_hub.c:24: clear_feature = cmd_clear_feature; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,_cmd_clear_feature + ld e,l + ld d,h + push hl ld bc,0x0008 + ld hl,_cmd_clear_feature ldir pop bc -;source-doc/base-drv/./enumerate_hub.c:26: clear_feature.bValue[0] = feature; +;source-doc/base-drv/enumerate_hub.c:26: clear_feature.bValue[0] = feature; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./enumerate_hub.c:27: clear_feature.bIndex[0] = index; +;source-doc/base-drv/enumerate_hub.c:27: clear_feature.bIndex[0] = index; ld a,(ix+7) ld (ix-4),a -;source-doc/base-drv/./enumerate_hub.c:28: return usb_control_transfer(&clear_feature, 0, hub_config->address, hub_config->max_packet_size); +;source-doc/base-drv/enumerate_hub.c:28: return usb_control_transfer(&clear_feature, 0, hub_config->address, hub_config->max_packet_size); + ld e,(ix+5) ld a,(ix+4) - ld d,(ix+5) ld l, a - ld h, d + ld h, e inc hl - ld e, (hl) + ld d, (hl) ld l, a - ld h, d + ld h, e ld a, (hl) rlca rlca rlca rlca and 0x0f - ld h, e - push hl - inc sp - push af - inc sp + ld e,a + push de ld hl,0x0000 push hl push bc call _usb_control_transfer -;source-doc/base-drv/./enumerate_hub.c:29: } +;source-doc/base-drv/enumerate_hub.c:29: } ld sp,ix pop ix ret -;source-doc/base-drv/./enumerate_hub.c:31: usb_error hub_get_status_port(const device_config_hub *const hub_config, const uint8_t index, hub_port_status *const port_status) { +;source-doc/base-drv/enumerate_hub.c:31: usb_error hub_get_status_port(const device_config_hub *const hub_config, const uint8_t index, hub_port_status *const port_status) { ; --------------------------------- ; Function hub_get_status_port ; --------------------------------- @@ -197,21 +187,21 @@ _hub_get_status_port: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./enumerate_hub.c:33: get_status_port = cmd_get_status_port; +;source-doc/base-drv/enumerate_hub.c:33: get_status_port = cmd_get_status_port; ld hl,0 add hl, sp ex de, hl - ld hl,_cmd_get_status_port ld bc,0x0008 + ld hl,_cmd_get_status_port ldir -;source-doc/base-drv/./enumerate_hub.c:35: get_status_port.bIndex[0] = index; +;source-doc/base-drv/enumerate_hub.c:35: get_status_port.bIndex[0] = index; ld a,(ix+6) ld (ix-4),a -;source-doc/base-drv/./enumerate_hub.c:36: return usb_control_transfer(&get_status_port, port_status, hub_config->address, hub_config->max_packet_size); - ld e,(ix+4) - ld d,(ix+5) - ld l, e - ld h, d +;source-doc/base-drv/enumerate_hub.c:36: return usb_control_transfer(&get_status_port, port_status, hub_config->address, hub_config->max_packet_size); + ld l,(ix+4) + ld h,(ix+5) + ld e,l + ld d,h inc hl ld b, (hl) ex de, hl @@ -223,20 +213,18 @@ _hub_get_status_port: and 0x0f ld e,(ix+7) ld d,(ix+8) - ld hl,0 - add hl, sp + ld c,a push bc - inc sp - push af - inc sp push de + ld hl,4 + add hl, sp push hl call _usb_control_transfer -;source-doc/base-drv/./enumerate_hub.c:37: } +;source-doc/base-drv/enumerate_hub.c:37: } ld sp,ix pop ix ret -;source-doc/base-drv/./enumerate_hub.c:39: usb_error configure_usb_hub(_working *const working) __z88dk_fastcall { +;source-doc/base-drv/enumerate_hub.c:39: usb_error configure_usb_hub(_working *const working) __z88dk_fastcall { ; --------------------------------- ; Function configure_usb_hub ; --------------------------------- @@ -249,32 +237,30 @@ _configure_usb_hub: ld hl, -14 add hl, sp ld sp, hl +;source-doc/base-drv/enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config; ld (ix-2),c ld (ix-1),b -;source-doc/base-drv/./enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config; - ld c,(ix-2) - ld b,(ix-1) ld hl,25 add hl, bc ld c, (hl) inc hl ld b, (hl) -;source-doc/base-drv/./enumerate_hub.c:47: CHECK(hub_get_descriptor(hub_config, &hub_description)); +;source-doc/base-drv/enumerate_hub.c:47: CHECK(hub_get_descriptor(hub_config, &hub_description)); push bc ld hl,2 add hl, sp - ex de, hl - ld l, c - ld h, b + ld e,c + ld d,b + ex de,hl call _hub_get_descriptor pop bc or a jp NZ, l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts; +;source-doc/base-drv/enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts; ld d,(ix-12) -;source-doc/base-drv/./enumerate_hub.c:50: do { +;source-doc/base-drv/enumerate_hub.c:50: do { l_configure_usb_hub_00126: -;source-doc/base-drv/./enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); +;source-doc/base-drv/enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); push bc push de ld e,0x08 @@ -288,7 +274,7 @@ l_configure_usb_hub_00126: pop bc or a jp NZ, l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); +;source-doc/base-drv/enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); push bc push de ld e,0x08 @@ -302,7 +288,7 @@ l_configure_usb_hub_00126: pop bc or a jp NZ, l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i); +;source-doc/base-drv/enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i); push bc push de ld e,0x04 @@ -313,7 +299,7 @@ l_configure_usb_hub_00126: pop af pop de pop bc -;source-doc/base-drv/./enumerate_hub.c:57: CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i)); +;source-doc/base-drv/enumerate_hub.c:57: CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i)); push bc push de ld e,0x04 @@ -327,7 +313,7 @@ l_configure_usb_hub_00126: pop bc or a jp NZ, l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status)); +;source-doc/base-drv/enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status)); push bc push de ld hl,12 @@ -345,13 +331,13 @@ l_configure_usb_hub_00126: pop bc or a jp NZ, l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) { +;source-doc/base-drv/enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) { ld hl,8 add hl, sp ld a, (hl) and 0x01 jr Z,l_configure_usb_hub_00124 -;source-doc/base-drv/./enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); +;source-doc/base-drv/enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); push bc push de ld e,0x10 @@ -365,7 +351,7 @@ l_configure_usb_hub_00126: pop bc or a jr NZ,l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); +;source-doc/base-drv/enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); push bc push de ld e,0x11 @@ -379,7 +365,7 @@ l_configure_usb_hub_00126: pop bc or a jr NZ,l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); +;source-doc/base-drv/enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); push bc push de ld e,0x14 @@ -393,13 +379,13 @@ l_configure_usb_hub_00126: pop bc or a jr NZ,l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:67: delay_short(); +;source-doc/base-drv/enumerate_hub.c:67: delay_short(); push bc push de call _delay_short pop de pop bc -;source-doc/base-drv/./enumerate_hub.c:69: CHECK(hub_get_status_port(hub_config, i, &port_status)); +;source-doc/base-drv/enumerate_hub.c:69: CHECK(hub_get_status_port(hub_config, i, &port_status)); push bc push de ld hl,12 @@ -417,13 +403,13 @@ l_configure_usb_hub_00126: pop bc or a jr NZ,l_configure_usb_hub_00129 -;source-doc/base-drv/./enumerate_hub.c:70: delay_short(); +;source-doc/base-drv/enumerate_hub.c:70: delay_short(); push bc push de call _delay_short pop de pop bc -;source-doc/base-drv/./enumerate_hub.c:72: CHECK(read_all_configs(working->state)); +;source-doc/base-drv/enumerate_hub.c:72: CHECK(read_all_configs(working->state)); ld l,(ix-2) ld h,(ix-1) ld a, (hl) @@ -442,7 +428,7 @@ l_configure_usb_hub_00126: jr Z,l_configure_usb_hub_00127 jr l_configure_usb_hub_00129 l_configure_usb_hub_00124: -;source-doc/base-drv/./enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); +;source-doc/base-drv/enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); push bc push de ld e,0x08 @@ -457,18 +443,18 @@ l_configure_usb_hub_00124: or a jr NZ,l_configure_usb_hub_00129 l_configure_usb_hub_00127: -;source-doc/base-drv/./enumerate_hub.c:77: } while (--i != 0); +;source-doc/base-drv/enumerate_hub.c:77: } while (--i != 0); dec d jp NZ, l_configure_usb_hub_00126 -;source-doc/base-drv/./enumerate_hub.c:79: return USB_ERR_OK; +;source-doc/base-drv/enumerate_hub.c:79: return USB_ERR_OK; ld l,0x00 jr l_configure_usb_hub_00130 -;source-doc/base-drv/./enumerate_hub.c:80: done: +;source-doc/base-drv/enumerate_hub.c:80: done: l_configure_usb_hub_00129: -;source-doc/base-drv/./enumerate_hub.c:81: return result; +;source-doc/base-drv/enumerate_hub.c:81: return result; ld l, a l_configure_usb_hub_00130: -;source-doc/base-drv/./enumerate_hub.c:82: } +;source-doc/base-drv/enumerate_hub.c:82: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s index 0211f31d..72982a22 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./enumerate_storage.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/enumerate_storage.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./enumerate_storage.c:5: void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint) { +;source-doc/base-drv/enumerate_storage.c:5: void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint) { ; --------------------------------- ; Function parse_endpoints ; --------------------------------- @@ -57,80 +57,75 @@ _parse_endpoints: ld ix,0 add ix,sp push af -;source-doc/base-drv/./enumerate_storage.c:7: if (!(pEndpoint->bmAttributes & 0x02)) - ld c,(ix+6) - ld b,(ix+7) - ld l, c - ld h, b +;source-doc/base-drv/enumerate_storage.c:7: if (!(pEndpoint->bmAttributes & 0x02)) + ld l,(ix+6) + ld h,(ix+7) + ld c,l + ld b,h inc hl inc hl inc hl ld a, (hl) ld (ix-2),a - bit 1,(ix-2) -;source-doc/base-drv/./enumerate_storage.c:8: return; + bit 1,a +;source-doc/base-drv/enumerate_storage.c:8: return; jr Z,l_parse_endpoints_00108 -;source-doc/base-drv/./enumerate_storage.c:10: const uint8_t x = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); - ld e, c - ld d, b +;source-doc/base-drv/enumerate_storage.c:10: const uint8_t x = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); ld hl,4 - add hl, de + add hl,bc ld a, (hl) ld (ix-1),a -;source-doc/base-drv/./enumerate_storage.c:11: endpoint_param *const eps = storage_dev->endpoints; +;source-doc/base-drv/enumerate_storage.c:11: endpoint_param *const eps = storage_dev->endpoints; ld e,(ix+4) ld d,(ix+5) inc de inc de inc de -;source-doc/base-drv/./enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) +;source-doc/base-drv/enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) inc bc inc bc ld a, (bc) - ld l,a + ld c,a and 0x80 - ld c, a - xor a -;source-doc/base-drv/./enumerate_storage.c:14: if (pEndpoint->bmAttributes & 0x01) { // 3 -> Interrupt + ld b,0x00 +;source-doc/base-drv/enumerate_storage.c:14: if (pEndpoint->bmAttributes & 0x01) { // 3 -> Interrupt bit 0,(ix-2) jr Z,l_parse_endpoints_00106 -;source-doc/base-drv/./enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) - or c -;source-doc/base-drv/./enumerate_storage.c:16: return; +;source-doc/base-drv/enumerate_storage.c:15: if (!(pEndpoint->bEndpointAddress & 0x80)) + or b +;source-doc/base-drv/enumerate_storage.c:16: return; jr Z,l_parse_endpoints_00108 -;source-doc/base-drv/./enumerate_storage.c:18: ep = &eps[ENDPOINT_INTERRUPT_IN]; - ld a, e - add a,0x06 - ld e, a - jr NC,l_parse_endpoints_00107 - inc d +;source-doc/base-drv/enumerate_storage.c:18: ep = &eps[ENDPOINT_INTERRUPT_IN]; + ld hl,0x0006 + add hl, de + ex de, hl jr l_parse_endpoints_00107 l_parse_endpoints_00106: -;source-doc/base-drv/./enumerate_storage.c:21: ep = (pEndpoint->bEndpointAddress & 0x80) ? &eps[ENDPOINT_BULK_IN] : &eps[ENDPOINT_BULK_OUT]; - or c +;source-doc/base-drv/enumerate_storage.c:21: ep = (pEndpoint->bEndpointAddress & 0x80) ? &eps[ENDPOINT_BULK_IN] : &eps[ENDPOINT_BULK_OUT]; + or b jr Z,l_parse_endpoints_00110 inc de inc de inc de l_parse_endpoints_00110: l_parse_endpoints_00107: -;source-doc/base-drv/./enumerate_storage.c:24: ep->number = pEndpoint->bEndpointAddress & 0x07; - ld c, e - ld b, d - ld a, l +;source-doc/base-drv/enumerate_storage.c:24: ep->number = pEndpoint->bEndpointAddress & 0x07; + ld l, e + ld h, d + ld a, c and 0x07 rlca and 0x0e - ld l, a - ld a, (bc) + ld c, a + ld a, (hl) and 0xf1 - or l - ld (bc), a -;source-doc/base-drv/./enumerate_storage.c:25: ep->toggle = 0; + or c + ld (hl), a +;source-doc/base-drv/enumerate_storage.c:25: ep->toggle = 0; ld l, e ld h, d res 0, (hl) -;source-doc/base-drv/./enumerate_storage.c:26: ep->max_packet_sizex = x; +;source-doc/base-drv/enumerate_storage.c:26: ep->max_packet_sizex = x; inc de ld a,(ix-1) ld b,0x00 @@ -144,7 +139,7 @@ l_parse_endpoints_00107: or l ld (de), a l_parse_endpoints_00108: -;source-doc/base-drv/./enumerate_storage.c:27: } +;source-doc/base-drv/enumerate_storage.c:27: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index 0ffb9902..d91b03d5 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./protocol.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/protocol.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./protocol.c:29: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { +;source-doc/base-drv/protocol.c:29: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { ; --------------------------------- ; Function usbtrn_get_descriptor ; --------------------------------- @@ -59,18 +59,18 @@ _usbtrn_get_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:31: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:31: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl - ld hl,_cmd_get_device_descriptor ld bc,0x0008 + ld hl,_cmd_get_device_descriptor ldir -;source-doc/base-drv/./protocol.c:32: cmd.wLength = 8; +;source-doc/base-drv/protocol.c:32: cmd.wLength = 8; ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); +;source-doc/base-drv/protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); ld c,(ix+4) ld b,(ix+5) ld e, c @@ -93,24 +93,24 @@ _usbtrn_get_descriptor: pop bc ld a, l ld (_result), a -;source-doc/base-drv/./protocol.c:36: CHECK(result); +;source-doc/base-drv/protocol.c:36: CHECK(result); ld a,(_result) or a jr NZ,l_usbtrn_get_descriptor_00103 -;source-doc/base-drv/./protocol.c:38: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:38: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl push bc - ld hl,_cmd_get_device_descriptor ld bc,0x0008 + ld hl,_cmd_get_device_descriptor ldir pop bc -;source-doc/base-drv/./protocol.c:39: cmd.wLength = 18; +;source-doc/base-drv/protocol.c:39: cmd.wLength = 18; ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); +;source-doc/base-drv/protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); ld e,(ix+4) ld d,(ix+5) ld hl,7 @@ -131,13 +131,12 @@ _usbtrn_get_descriptor: pop af ld a, l ld (_result), a -;source-doc/base-drv/./protocol.c:42: RETURN_CHECK(result); -;source-doc/base-drv/./protocol.c:44: done: +;source-doc/base-drv/protocol.c:42: RETURN_CHECK(result); +;source-doc/base-drv/protocol.c:44: done: l_usbtrn_get_descriptor_00103: -;source-doc/base-drv/./protocol.c:45: return result; - ld hl,_result - ld l, (hl) -;source-doc/base-drv/./protocol.c:46: } +;source-doc/base-drv/protocol.c:45: return result; + ld hl,(_result) +;source-doc/base-drv/protocol.c:46: } ld sp, ix pop ix ret @@ -149,7 +148,7 @@ _cmd_get_device_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0008 -;source-doc/base-drv/./protocol.c:54: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { +;source-doc/base-drv/protocol.c:54: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { ; --------------------------------- ; Function usbtrn_get_descriptor2 ; --------------------------------- @@ -160,29 +159,26 @@ _usbtrn_get_descriptor2: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:56: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:56: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl - ld hl,_cmd_get_device_descriptor ld bc,0x0008 + ld hl,_cmd_get_device_descriptor ldir -;source-doc/base-drv/./protocol.c:57: cmd.wLength = 8; +;source-doc/base-drv/protocol.c:57: cmd.wLength = 8; ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); +;source-doc/base-drv/protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); ld c,(ix+4) ld b,(ix+5) ld e, c ld d, b push bc - ld a,0x08 - push af - inc sp - ld a,(ix+6) - push af - inc sp + ld h,0x08 + ld l,(ix+6) + push hl push de ld hl,6 add hl, sp @@ -194,34 +190,31 @@ _usbtrn_get_descriptor2: pop bc ld a, l ld (_result), a -;source-doc/base-drv/./protocol.c:61: CHECK(result); +;source-doc/base-drv/protocol.c:61: CHECK(result); ld a,(_result) or a jr NZ,l_usbtrn_get_descriptor2_00103 -;source-doc/base-drv/./protocol.c:63: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:63: cmd = cmd_get_device_descriptor; ld hl,0 add hl, sp ex de, hl push bc - ld hl,_cmd_get_device_descriptor ld bc,0x0008 + ld hl,_cmd_get_device_descriptor ldir pop bc -;source-doc/base-drv/./protocol.c:64: cmd.wLength = 18; +;source-doc/base-drv/protocol.c:64: cmd.wLength = 18; ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/./protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); +;source-doc/base-drv/protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); ld e,(ix+4) ld d,(ix+5) ld hl,7 add hl, de - ld a, (hl) - push af - inc sp - ld a,(ix+6) - push af - inc sp + ld h,(hl) + ld l,(ix+6) + push hl push bc ld hl,4 add hl, sp @@ -232,16 +225,15 @@ _usbtrn_get_descriptor2: pop af ld a, l ld (_result), a -;source-doc/base-drv/./protocol.c:66: done: +;source-doc/base-drv/protocol.c:66: done: l_usbtrn_get_descriptor2_00103: -;source-doc/base-drv/./protocol.c:67: return result; - ld hl,_result - ld l, (hl) -;source-doc/base-drv/./protocol.c:68: } +;source-doc/base-drv/protocol.c:67: return result; + ld hl,(_result) +;source-doc/base-drv/protocol.c:68: } ld sp, ix pop ix ret -;source-doc/base-drv/./protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function usbtrn_set_address ; --------------------------------- @@ -254,18 +246,18 @@ _usbtrn_set_address: push af push af ld c, l -;source-doc/base-drv/./protocol.c:80: cmd = cmd_set_device_address; +;source-doc/base-drv/protocol.c:80: cmd = cmd_set_device_address; ld hl,0 add hl, sp ex de, hl push bc - ld hl,_cmd_set_device_address ld bc,0x0008 + ld hl,_cmd_set_device_address ldir pop bc -;source-doc/base-drv/./protocol.c:81: cmd.bValue[0] = device_address; +;source-doc/base-drv/protocol.c:81: cmd.bValue[0] = device_address; ld (ix-6),c -;source-doc/base-drv/./protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0); +;source-doc/base-drv/protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0); xor a push af inc sp @@ -278,7 +270,7 @@ _usbtrn_set_address: add hl, sp push hl call _usb_control_transfer -;source-doc/base-drv/./protocol.c:84: } +;source-doc/base-drv/protocol.c:84: } ld sp,ix pop ix ret @@ -290,7 +282,7 @@ _cmd_set_device_address: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:94: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { +;source-doc/base-drv/protocol.c:94: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { ; --------------------------------- ; Function usbtrn_set_configuration ; --------------------------------- @@ -301,22 +293,20 @@ _usbtrn_set_configuration: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:96: cmd = cmd_set_configuration; +;source-doc/base-drv/protocol.c:96: cmd = cmd_set_configuration; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,_cmd_set_configuration + ld e,l + ld d,h + push hl ld bc,0x0008 + ld hl,_cmd_set_configuration ldir pop bc -;source-doc/base-drv/./protocol.c:97: cmd.bValue[0] = configuration; +;source-doc/base-drv/protocol.c:97: cmd.bValue[0] = configuration; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./protocol.c:99: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); +;source-doc/base-drv/protocol.c:99: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); ld h,(ix+5) ld l,(ix+4) push hl @@ -324,7 +314,7 @@ _usbtrn_set_configuration: push hl push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:100: } +;source-doc/base-drv/protocol.c:100: } ld sp,ix pop ix ret @@ -336,7 +326,7 @@ _cmd_set_configuration: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, +;source-doc/base-drv/protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, ; --------------------------------- ; Function usbtrn_get_config_descriptor ; --------------------------------- @@ -347,26 +337,24 @@ _usbtrn_get_config_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:120: cmd = cmd_get_config_descriptor; +;source-doc/base-drv/protocol.c:120: cmd = cmd_get_config_descriptor; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,_cmd_get_config_descriptor + ld e,l + ld d,h + push hl ld bc,0x0008 + ld hl,_cmd_get_config_descriptor ldir pop bc -;source-doc/base-drv/./protocol.c:121: cmd.bValue[0] = config_index; +;source-doc/base-drv/protocol.c:121: cmd.bValue[0] = config_index; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/./protocol.c:122: cmd.wLength = (uint16_t)buffer_size; +;source-doc/base-drv/protocol.c:122: cmd.wLength = (uint16_t)buffer_size; ld e,(ix+7) ld (ix-2),e ld (ix-1),0x00 -;source-doc/base-drv/./protocol.c:124: return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size); +;source-doc/base-drv/protocol.c:124: return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size); ld e,(ix+4) ld d,(ix+5) ld h,(ix+9) @@ -375,7 +363,7 @@ _usbtrn_get_config_descriptor: push de push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:125: } +;source-doc/base-drv/protocol.c:125: } ld sp,ix pop ix ret @@ -387,7 +375,7 @@ _cmd_get_config_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/./protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, +;source-doc/base-drv/protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, ; --------------------------------- ; Function usbtrn_gfull_cfg_desc ; --------------------------------- @@ -395,7 +383,7 @@ _usbtrn_gfull_cfg_desc: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./protocol.c:134: max_packet_size)); +;source-doc/base-drv/protocol.c:134: max_packet_size)); ld c,(ix+8) ld b,(ix+9) push bc @@ -419,28 +407,25 @@ _usbtrn_gfull_cfg_desc: ld a,(_result) or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 -;source-doc/base-drv/./protocol.c:136: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; +;source-doc/base-drv/protocol.c:136: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; ld l, c ld h, b inc hl inc hl ld d, (hl) -;source-doc/base-drv/./protocol.c:137: if (max_length > max_buffer_size) +;source-doc/base-drv/protocol.c:137: if (max_length > max_buffer_size) ld a,(ix+7) sub d jr NC,l_usbtrn_gfull_cfg_desc_00104 -;source-doc/base-drv/./protocol.c:138: max_length = max_buffer_size; +;source-doc/base-drv/protocol.c:138: max_length = max_buffer_size; ld d,(ix+7) l_usbtrn_gfull_cfg_desc_00104: -;source-doc/base-drv/./protocol.c:140: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); +;source-doc/base-drv/protocol.c:140: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); ld h,(ix+6) ld l,(ix+5) push hl + ld e,(ix+4) push de - inc sp - ld a,(ix+4) - push af - inc sp push bc call _usbtrn_get_config_descriptor pop af @@ -449,21 +434,20 @@ l_usbtrn_gfull_cfg_desc_00104: ld a, l ld (_result), a ld a,(_result) -;source-doc/base-drv/./protocol.c:142: return USB_ERR_OK; +;source-doc/base-drv/protocol.c:142: return USB_ERR_OK; or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 ld l,a jr l_usbtrn_gfull_cfg_desc_00108 -;source-doc/base-drv/./protocol.c:143: done: +;source-doc/base-drv/protocol.c:143: done: l_usbtrn_gfull_cfg_desc_00107: -;source-doc/base-drv/./protocol.c:144: return result; - ld hl,_result - ld l, (hl) +;source-doc/base-drv/protocol.c:144: return result; + ld hl,(_result) l_usbtrn_gfull_cfg_desc_00108: -;source-doc/base-drv/./protocol.c:145: } +;source-doc/base-drv/protocol.c:145: } pop ix ret -;source-doc/base-drv/./protocol.c:149: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { +;source-doc/base-drv/protocol.c:149: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { ; --------------------------------- ; Function usbtrn_clear_endpoint_halt ; --------------------------------- @@ -474,22 +458,20 @@ _usbtrn_clear_endpoint_halt: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/./protocol.c:151: cmd = usb_cmd_clear_endpoint_halt; +;source-doc/base-drv/protocol.c:151: cmd = usb_cmd_clear_endpoint_halt; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,_usb_cmd_clear_endpoint_halt + ld e,l + ld d,h + push hl ld bc,0x0008 + ld hl,_usb_cmd_clear_endpoint_halt ldir pop bc -;source-doc/base-drv/./protocol.c:152: cmd.bIndex[0] = endpoint_number; +;source-doc/base-drv/protocol.c:152: cmd.bIndex[0] = endpoint_number; ld a,(ix+4) ld (ix-4),a -;source-doc/base-drv/./protocol.c:154: return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); +;source-doc/base-drv/protocol.c:154: return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); ld h,(ix+6) ld l,(ix+5) push hl @@ -497,7 +479,7 @@ _usbtrn_clear_endpoint_halt: push hl push bc call _usb_control_transfer -;source-doc/base-drv/./protocol.c:155: } +;source-doc/base-drv/protocol.c:155: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.asm b/Source/HBIOS/ch376-native/base-drv/transfers.c.asm new file mode 100644 index 00000000..0bc83830 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.asm @@ -0,0 +1,829 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _usb_dat_in_trns_n_ext + GLOBAL _usb_dat_in_trnsfer_ext + GLOBAL _usb_ctrl_trnsfer_ext + GLOBAL _usb_control_transfer + GLOBAL _usb_data_in_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_out_transfer +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _critical_end + GLOBAL _critical_begin + GLOBAL _print_uint16 + GLOBAL _print_string + GLOBAL _print_hex + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _in_critical_usb_section + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/transfers.c:24: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, +; --------------------------------- +; Function usb_ctrl_trnsfer_ext +; --------------------------------- +_usb_ctrl_trnsfer_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+5) + sub a,0x80 + jr NC,l_usb_ctrl_trnsfer_ext_00102 +;source-doc/base-drv/transfers.c:29: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_ctrl_trnsfer_ext_00106 +l_usb_ctrl_trnsfer_ext_00102: +;source-doc/base-drv/transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+7) + or a,(ix+6) + jr Z,l_usb_ctrl_trnsfer_ext_00104 + ld a,(ix+7) + sub a,0x80 + jr NC,l_usb_ctrl_trnsfer_ext_00104 +;source-doc/base-drv/transfers.c:32: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_ctrl_trnsfer_ext_00106 +l_usb_ctrl_trnsfer_ext_00104: +;source-doc/base-drv/transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); + ld h,(ix+9) + ld l,(ix+8) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_control_transfer + pop af + pop af + pop af +l_usb_ctrl_trnsfer_ext_00106: +;source-doc/base-drv/transfers.c:35: } + pop ix + ret +;source-doc/base-drv/transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +; --------------------------------- +; Function usb_control_transfer +; --------------------------------- +_usb_control_transfer: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/base-drv/transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; + ld hl,0 + add hl, sp + set 0, (hl) + ld hl,0 + add hl, sp + ld a, (hl) + and a,0xf1 + ld (hl), a + ld c,(ix+9) + ld b,0x00 + ld hl,1 + add hl, sp + ld (hl), c + inc hl + ld a, b + and a,0x03 + ld e,a + ld a, (hl) + and a,0xfc + or a, e + ld (hl), a +;source-doc/base-drv/transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); + ld c,(ix+4) + ld b,(ix+5) + ld a, (bc) + and a,0x80 +;source-doc/base-drv/transfers.c:56: if (transferIn && buffer == 0) + ld (ix-1),a + or a, a + jr Z,l_usb_control_transfer_00102 + ld a,(ix+7) + or a,(ix+6) + jr NZ,l_usb_control_transfer_00102 +;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; + ld l,0x0f + jp l_usb_control_transfer_00114 +l_usb_control_transfer_00102: +;source-doc/base-drv/transfers.c:59: critical_begin(); + push bc + call _critical_begin + ld l,(ix+8) + call _ch_set_usb_address + pop bc +;source-doc/base-drv/transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); + ld e,(ix+4) + ld d,(ix+5) + push bc + ld a,0x08 + push af + inc sp + push de + call _ch_write_data + pop af + inc sp + call _ch_issue_token_setup + call _ch_short_wait_int_and_get_status + pop bc +;source-doc/base-drv/transfers.c:66: CHECK(result); + ld a, l + or a, a + jr NZ,l_usb_control_transfer_00113 +;source-doc/base-drv/transfers.c:68: const uint16_t length = cmd_packet->wLength; + ld hl,6 + add hl, bc + ld c, (hl) + inc hl +;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) + ld a,(hl) + ld b,a + or a, c + jr Z,l_usb_control_transfer_00116 + ld e,(ix+6) + ld d,(ix+7) + ld a,(ix-1) + or a, a + jr Z,l_usb_control_transfer_00118 + ld hl,0 + add hl, sp + push hl + push bc + push de + call _ch_data_in_transfer + pop af + pop af + pop af + jr l_usb_control_transfer_00119 +l_usb_control_transfer_00118: + ld hl,0 + add hl, sp + push hl + push bc + push de + call _ch_data_out_transfer + pop af + pop af + pop af +l_usb_control_transfer_00119: + jr l_usb_control_transfer_00117 +l_usb_control_transfer_00116: +;source-doc/base-drv/transfers.c:72: : USB_ERR_OK; + ld l,0x00 +l_usb_control_transfer_00117: +;source-doc/base-drv/transfers.c:74: CHECK(result) + ld a, l + or a, a + jr NZ,l_usb_control_transfer_00113 +;source-doc/base-drv/transfers.c:76: if (transferIn) { + ld a,(ix-1) + or a, a + jr Z,l_usb_control_transfer_00112 +;source-doc/base-drv/transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA); + ld l,0x2c + call _ch_command +;source-doc/base-drv/transfers.c:78: CH376_DATA_PORT = 0; + ld a,0x00 + ld bc,_CH376_DATA_PORT + out (c),a +;source-doc/base-drv/transfers.c:79: ch_issue_token_out_ep0(); + call _ch_issue_token_out_ep0 +;source-doc/base-drv/transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ + call _ch_long_wait_int_and_get_status +;source-doc/base-drv/transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { + ld a,l + or a, a + jr Z,l_usb_control_transfer_00108 + sub a,0x02 + jr NZ,l_usb_control_transfer_00113 +l_usb_control_transfer_00108: +;source-doc/base-drv/transfers.c:83: result = USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/transfers.c:84: goto done; + jr l_usb_control_transfer_00113 +;source-doc/base-drv/transfers.c:87: RETURN_CHECK(result); +l_usb_control_transfer_00112: +;source-doc/base-drv/transfers.c:90: ch_issue_token_in_ep0(); + call _ch_issue_token_in_ep0 +;source-doc/base-drv/transfers.c:91: result = ch_long_wait_int_and_get_status(); + call _ch_long_wait_int_and_get_status +;source-doc/base-drv/transfers.c:95: done: +l_usb_control_transfer_00113: +;source-doc/base-drv/transfers.c:96: critical_end(); + push hl + call _critical_end + pop hl +;source-doc/base-drv/transfers.c:97: return result; +l_usb_control_transfer_00114: +;source-doc/base-drv/transfers.c:98: } + ld sp, ix + pop ix + ret +;source-doc/base-drv/transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_dat_in_trnsfer_ext +; --------------------------------- +_usb_dat_in_trnsfer_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+5) + or a,(ix+4) + jr Z,l_usb_dat_in_trnsfer_ext_00102 + ld a,(ix+5) + sub a,0x80 + jr NC,l_usb_dat_in_trnsfer_ext_00102 +;source-doc/base-drv/transfers.c:103: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trnsfer_ext_00106 +l_usb_dat_in_trnsfer_ext_00102: +;source-doc/base-drv/transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) + ld a,(ix+10) + sub a,0x80 + jr NC,l_usb_dat_in_trnsfer_ext_00105 +;source-doc/base-drv/transfers.c:106: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trnsfer_ext_00106 +l_usb_dat_in_trnsfer_ext_00105: +;source-doc/base-drv/transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld a,(ix+8) + push af + inc sp + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_data_in_transfer + pop af + pop af + pop af + inc sp +l_usb_dat_in_trnsfer_ext_00106: +;source-doc/base-drv/transfers.c:109: } + pop ix + ret +;source-doc/base-drv/transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_dat_in_trns_n_ext +; --------------------------------- +_usb_dat_in_trns_n_ext: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) + ld a,(ix+5) + or a,(ix+4) + jr Z,l_usb_dat_in_trns_n_ext_00102 + ld a,(ix+5) + and a,0xc0 + jr NZ,l_usb_dat_in_trns_n_ext_00102 +;source-doc/base-drv/transfers.c:114: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trns_n_ext_00108 +l_usb_dat_in_trns_n_ext_00102: +;source-doc/base-drv/transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0) + ld a,(ix+10) + and a,0xc0 + jr NZ,l_usb_dat_in_trns_n_ext_00105 +;source-doc/base-drv/transfers.c:117: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trns_n_ext_00108 +l_usb_dat_in_trns_n_ext_00105: +;source-doc/base-drv/transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) + ld a,(ix+7) + and a,0xc0 + jr NZ,l_usb_dat_in_trns_n_ext_00107 +;source-doc/base-drv/transfers.c:120: return USB_BAD_ADDRESS; + ld l,0x82 + jr l_usb_dat_in_trns_n_ext_00108 +l_usb_dat_in_trns_n_ext_00107: +;source-doc/base-drv/transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); + ld c,(ix+6) + ld b,(ix+7) + ld l,(ix+9) + ld h,(ix+10) + push hl + ld a,(ix+8) + push af + inc sp + push bc + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usb_data_in_transfer_n + pop af + pop af + pop af + inc sp +l_usb_dat_in_trns_n_ext_00108: +;source-doc/base-drv/transfers.c:123: } + pop ix + ret +;source-doc/base-drv/transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_data_in_transfer +; --------------------------------- +_usb_data_in_transfer: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/transfers.c:136: critical_begin(); + call _critical_begin +;source-doc/base-drv/transfers.c:138: ch_set_usb_address(device_address); + ld l,(ix+8) + call _ch_set_usb_address +;source-doc/base-drv/transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ch_data_in_transfer + pop af + pop af + pop af + ld a, l + ld (_result), a +;source-doc/base-drv/transfers.c:142: critical_end(); + call _critical_end +;source-doc/base-drv/transfers.c:144: return result; + ld hl,(_result) +;source-doc/base-drv/transfers.c:145: } + pop ix + ret +;source-doc/base-drv/transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_data_in_transfer_n +; --------------------------------- +_usb_data_in_transfer_n: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/transfers.c:158: critical_begin(); + call _critical_begin +;source-doc/base-drv/transfers.c:160: ch_set_usb_address(device_address); + ld l,(ix+8) + call _ch_set_usb_address +;source-doc/base-drv/transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ch_data_in_transfer_n + pop af + pop af + pop af + ld a, l + ld (_result), a +;source-doc/base-drv/transfers.c:164: critical_end(); + call _critical_end +;source-doc/base-drv/transfers.c:166: return result; + ld hl,(_result) +;source-doc/base-drv/transfers.c:167: } + pop ix + ret +;source-doc/base-drv/transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +; --------------------------------- +; Function usb_data_out_transfer +; --------------------------------- +_usb_data_out_transfer: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/transfers.c:180: critical_begin(); + call _critical_begin +;source-doc/base-drv/transfers.c:182: ch_set_usb_address(device_address); + ld l,(ix+8) + call _ch_set_usb_address +;source-doc/base-drv/transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _ch_data_out_transfer + pop af + pop af + pop af + ld a, l + ld (_result), a +;source-doc/base-drv/transfers.c:186: critical_end(); + call _critical_end +;source-doc/base-drv/transfers.c:188: return result; + ld hl,(_result) +;source-doc/base-drv/transfers.c:189: } + pop ix + ret + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index 199747fe..cd7bb9a1 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./transfers.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/transfers.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./transfers.c:24: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, +;source-doc/base-drv/transfers.c:24: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, ; --------------------------------- ; Function usb_ctrl_trnsfer_ext ; --------------------------------- @@ -56,26 +56,26 @@ _usb_ctrl_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+5) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00102 -;source-doc/base-drv/./transfers.c:29: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:29: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00102: -;source-doc/base-drv/./transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+7) or (ix+6) jr Z,l_usb_ctrl_trnsfer_ext_00104 ld a,(ix+7) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00104 -;source-doc/base-drv/./transfers.c:32: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:32: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00104: -;source-doc/base-drv/./transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); +;source-doc/base-drv/transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); ld h,(ix+9) ld l,(ix+8) push hl @@ -90,10 +90,10 @@ l_usb_ctrl_trnsfer_ext_00104: pop af pop af l_usb_ctrl_trnsfer_ext_00106: -;source-doc/base-drv/./transfers.c:35: } +;source-doc/base-drv/transfers.c:35: } pop ix ret -;source-doc/base-drv/./transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +;source-doc/base-drv/transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, ; --------------------------------- ; Function usb_control_transfer ; --------------------------------- @@ -103,7 +103,7 @@ _usb_control_transfer: add ix,sp push af push af -;source-doc/base-drv/./transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; +;source-doc/base-drv/transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; ld hl,0 add hl, sp set 0, (hl) @@ -125,29 +125,29 @@ _usb_control_transfer: and 0xfc or e ld (hl), a -;source-doc/base-drv/./transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); +;source-doc/base-drv/transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); ld c,(ix+4) ld b,(ix+5) ld a, (bc) and 0x80 -;source-doc/base-drv/./transfers.c:56: if (transferIn && buffer == 0) +;source-doc/base-drv/transfers.c:56: if (transferIn && buffer == 0) ld (ix-1),a or a jr Z,l_usb_control_transfer_00102 ld a,(ix+7) or (ix+6) jr NZ,l_usb_control_transfer_00102 -;source-doc/base-drv/./transfers.c:57: return USB_ERR_OTHER; +;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; ld l,0x0f jp l_usb_control_transfer_00114 l_usb_control_transfer_00102: -;source-doc/base-drv/./transfers.c:59: critical_begin(); +;source-doc/base-drv/transfers.c:59: critical_begin(); push bc call _critical_begin ld l,(ix+8) call _ch_set_usb_address pop bc -;source-doc/base-drv/./transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); +;source-doc/base-drv/transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ld e,(ix+4) ld d,(ix+5) push bc @@ -161,18 +161,18 @@ l_usb_control_transfer_00102: call _ch_issue_token_setup call _ch_short_wait_int_and_get_stat pop bc -;source-doc/base-drv/./transfers.c:66: CHECK(result); +;source-doc/base-drv/transfers.c:66: CHECK(result); ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:68: const uint16_t length = cmd_packet->wLength; +;source-doc/base-drv/transfers.c:68: const uint16_t length = cmd_packet->wLength; ld hl,6 add hl, bc ld c, (hl) inc hl - ld b, (hl) -;source-doc/base-drv/./transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) - ld a, b +;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) + ld a,(hl) + ld b,a or c jr Z,l_usb_control_transfer_00116 ld e,(ix+6) @@ -203,59 +203,58 @@ l_usb_control_transfer_00118: l_usb_control_transfer_00119: jr l_usb_control_transfer_00117 l_usb_control_transfer_00116: -;source-doc/base-drv/./transfers.c:72: : USB_ERR_OK; +;source-doc/base-drv/transfers.c:72: : USB_ERR_OK; ld l,0x00 l_usb_control_transfer_00117: -;source-doc/base-drv/./transfers.c:74: CHECK(result) +;source-doc/base-drv/transfers.c:74: CHECK(result) ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:76: if (transferIn) { +;source-doc/base-drv/transfers.c:76: if (transferIn) { ld a,(ix-1) or a jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/./transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA); +;source-doc/base-drv/transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA); ld l,0x2c call _ch_command -;source-doc/base-drv/./transfers.c:78: CH376_DATA_PORT = 0; +;source-doc/base-drv/transfers.c:78: CH376_DATA_PORT = 0; ld a,0x00 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./transfers.c:79: ch_issue_token_out_ep0(); +;source-doc/base-drv/transfers.c:79: ch_issue_token_out_ep0(); call _ch_issue_token_out_ep0 -;source-doc/base-drv/./transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ +;source-doc/base-drv/transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/./transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { - ld a, l +;source-doc/base-drv/transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { + ld a,l or a jr Z,l_usb_control_transfer_00108 - ld a, l sub 0x02 jr NZ,l_usb_control_transfer_00113 l_usb_control_transfer_00108: -;source-doc/base-drv/./transfers.c:83: result = USB_ERR_OK; +;source-doc/base-drv/transfers.c:83: result = USB_ERR_OK; ld l,0x00 -;source-doc/base-drv/./transfers.c:84: goto done; +;source-doc/base-drv/transfers.c:84: goto done; jr l_usb_control_transfer_00113 -;source-doc/base-drv/./transfers.c:87: RETURN_CHECK(result); +;source-doc/base-drv/transfers.c:87: RETURN_CHECK(result); l_usb_control_transfer_00112: -;source-doc/base-drv/./transfers.c:90: ch_issue_token_in_ep0(); +;source-doc/base-drv/transfers.c:90: ch_issue_token_in_ep0(); call _ch_issue_token_in_ep0 -;source-doc/base-drv/./transfers.c:91: result = ch_long_wait_int_and_get_status(); +;source-doc/base-drv/transfers.c:91: result = ch_long_wait_int_and_get_status(); call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/./transfers.c:95: done: +;source-doc/base-drv/transfers.c:95: done: l_usb_control_transfer_00113: -;source-doc/base-drv/./transfers.c:96: critical_end(); +;source-doc/base-drv/transfers.c:96: critical_end(); push hl call _critical_end pop hl -;source-doc/base-drv/./transfers.c:97: return result; +;source-doc/base-drv/transfers.c:97: return result; l_usb_control_transfer_00114: -;source-doc/base-drv/./transfers.c:98: } +;source-doc/base-drv/transfers.c:98: } ld sp, ix pop ix ret -;source-doc/base-drv/./transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_in_trnsfer_ext ; --------------------------------- @@ -263,26 +262,26 @@ _usb_dat_in_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trnsfer_ext_00102 ld a,(ix+5) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/./transfers.c:103: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:103: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/./transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) ld a,(ix+10) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/./transfers.c:106: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:106: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/./transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -301,10 +300,10 @@ l_usb_dat_in_trnsfer_ext_00105: pop af inc sp l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/./transfers.c:109: } +;source-doc/base-drv/transfers.c:109: } pop ix ret -;source-doc/base-drv/./transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_dat_in_trns_n_ext ; --------------------------------- @@ -312,34 +311,34 @@ _usb_dat_in_trns_n_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) +;source-doc/base-drv/transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trns_n_ext_00102 ld a,(ix+5) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00102 -;source-doc/base-drv/./transfers.c:114: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:114: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00102: -;source-doc/base-drv/./transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0) +;source-doc/base-drv/transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0) ld a,(ix+10) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00105 -;source-doc/base-drv/./transfers.c:117: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:117: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00105: -;source-doc/base-drv/./transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) +;source-doc/base-drv/transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) ld a,(ix+7) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00107 -;source-doc/base-drv/./transfers.c:120: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:120: return USB_BAD_ADDRESS; ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00107: -;source-doc/base-drv/./transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); ld c,(ix+6) ld b,(ix+7) ld l,(ix+9) @@ -358,10 +357,10 @@ l_usb_dat_in_trns_n_ext_00107: pop af inc sp l_usb_dat_in_trns_n_ext_00108: -;source-doc/base-drv/./transfers.c:123: } +;source-doc/base-drv/transfers.c:123: } pop ix ret -;source-doc/base-drv/./transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer ; --------------------------------- @@ -369,12 +368,12 @@ _usb_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:136: critical_begin(); +;source-doc/base-drv/transfers.c:136: critical_begin(); call _critical_begin -;source-doc/base-drv/./transfers.c:138: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:138: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -390,15 +389,14 @@ _usb_data_in_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/./transfers.c:142: critical_end(); +;source-doc/base-drv/transfers.c:142: critical_end(); call _critical_end -;source-doc/base-drv/./transfers.c:144: return result; - ld hl,_result - ld l, (hl) -;source-doc/base-drv/./transfers.c:145: } +;source-doc/base-drv/transfers.c:144: return result; + ld hl,(_result) +;source-doc/base-drv/transfers.c:145: } pop ix ret -;source-doc/base-drv/./transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- @@ -406,12 +404,12 @@ _usb_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:158: critical_begin(); +;source-doc/base-drv/transfers.c:158: critical_begin(); call _critical_begin -;source-doc/base-drv/./transfers.c:160: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:160: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -427,15 +425,14 @@ _usb_data_in_transfer_n: pop af ld a, l ld (_result), a -;source-doc/base-drv/./transfers.c:164: critical_end(); +;source-doc/base-drv/transfers.c:164: critical_end(); call _critical_end -;source-doc/base-drv/./transfers.c:166: return result; - ld hl,_result - ld l, (hl) -;source-doc/base-drv/./transfers.c:167: } +;source-doc/base-drv/transfers.c:166: return result; + ld hl,(_result) +;source-doc/base-drv/transfers.c:167: } pop ix ret -;source-doc/base-drv/./transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- @@ -443,12 +440,12 @@ _usb_data_out_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./transfers.c:180: critical_begin(); +;source-doc/base-drv/transfers.c:180: critical_begin(); call _critical_begin -;source-doc/base-drv/./transfers.c:182: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:182: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/./transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -464,11 +461,10 @@ _usb_data_out_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/./transfers.c:186: critical_end(); +;source-doc/base-drv/transfers.c:186: critical_end(); call _critical_end -;source-doc/base-drv/./transfers.c:188: return result; - ld hl,_result - ld l, (hl) -;source-doc/base-drv/./transfers.c:189: } +;source-doc/base-drv/transfers.c:188: return result; + ld hl,(_result) +;source-doc/base-drv/transfers.c:189: } pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm new file mode 100644 index 00000000..2668b656 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm @@ -0,0 +1,441 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _chnative_seek +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _usbdev_dat_in_trnsfer_0 + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_control_transfer + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/usb-base-drv.c:6: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +; --------------------------------- +; Function chnative_seek +; --------------------------------- +_chnative_seek: + push ix +;source-doc/base-drv/usb-base-drv.c:7: storage_device->current_lba = lba; + ld ix,0 + add ix,sp + ld c,(ix+4) + ld b,(ix+5) + push bc + ld a,(ix-2) + add a,0x0c + ld c,l + ld b,h + ld l, a + ld a,(ix-1) + adc a,0x00 + ld h, a + ld (hl), e + inc hl + ld (hl), d + inc hl + ld (hl), c + inc hl + ld (hl), b +;source-doc/base-drv/usb-base-drv.c:8: return 0; + xor a, a +;source-doc/base-drv/usb-base-drv.c:9: } + ld sp, ix + pop ix + pop hl + pop bc + jp (hl) + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 3728d20a..2484c0eb 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./usb-base-drv.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/usb-base-drv.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,24 +48,22 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./usb-base-drv.c:6: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +;source-doc/base-drv/usb-base-drv.c:6: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { ; --------------------------------- ; Function chnative_seek ; --------------------------------- _chnative_seek: push ix +;source-doc/base-drv/usb-base-drv.c:7: storage_device->current_lba = lba; ld ix,0 add ix,sp - push af - ld c, l - ld b, h -;source-doc/base-drv/./usb-base-drv.c:7: storage_device->current_lba = lba; - ld a,(ix+4) - ld (ix-2),a - ld a,(ix+5) - ld (ix-1),a + ld c,(ix+4) + ld b,(ix+5) + push bc ld a,(ix-2) add a,0x0c + ld c,l + ld b,h ld l, a ld a,(ix-1) adc a,0x00 @@ -77,9 +75,9 @@ _chnative_seek: ld (hl), c inc hl ld (hl), b -;source-doc/base-drv/./usb-base-drv.c:8: return 0; +;source-doc/base-drv/usb-base-drv.c:8: return 0; xor a -;source-doc/base-drv/./usb-base-drv.c:9: } +;source-doc/base-drv/usb-base-drv.c:9: } ld sp, ix pop ix pop hl diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 625480b2..53dbab60 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./usb-init.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/usb-init.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,109 +48,110 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./usb-init.c:8: static usb_error usb_host_bus_reset(void) { +;source-doc/base-drv/usb-init.c:8: static usb_error usb_host_bus_reset(void) { ; --------------------------------- ; Function usb_host_bus_reset ; --------------------------------- _usb_host_bus_reset: -;source-doc/base-drv/./usb-init.c:9: ch_cmd_set_usb_mode(CH_MODE_HOST); +;source-doc/base-drv/usb-init.c:9: ch_cmd_set_usb_mode(CH_MODE_HOST); ld l,0x06 call _ch_cmd_set_usb_mode -;source-doc/base-drv/./usb-init.c:10: delay_20ms(); +;source-doc/base-drv/usb-init.c:10: delay_20ms(); call _delay_20ms -;source-doc/base-drv/./usb-init.c:12: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); +;source-doc/base-drv/usb-init.c:12: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); ld l,0x07 call _ch_cmd_set_usb_mode -;source-doc/base-drv/./usb-init.c:13: delay_20ms(); +;source-doc/base-drv/usb-init.c:13: delay_20ms(); call _delay_20ms -;source-doc/base-drv/./usb-init.c:15: ch_cmd_set_usb_mode(CH_MODE_HOST); +;source-doc/base-drv/usb-init.c:15: ch_cmd_set_usb_mode(CH_MODE_HOST); ld l,0x06 call _ch_cmd_set_usb_mode -;source-doc/base-drv/./usb-init.c:16: delay_20ms(); +;source-doc/base-drv/usb-init.c:16: delay_20ms(); call _delay_20ms -;source-doc/base-drv/./ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); +;source-doc/base-drv/ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); ld l,0x0b call _ch_command -;source-doc/base-drv/./ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; +;source-doc/base-drv/ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; ld a,0x25 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); +;source-doc/base-drv/ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/./usb-init.c:20: return USB_ERR_OK; +;source-doc/base-drv/usb-init.c:20: return USB_ERR_OK; ld l,0x00 -;source-doc/base-drv/./usb-init.c:21: } +;source-doc/base-drv/usb-init.c:21: } ret -;source-doc/base-drv/./usb-init.c:25: void chnative_init(void) { +;source-doc/base-drv/usb-init.c:25: void chnative_init(void) { ; --------------------------------- ; Function chnative_init ; --------------------------------- _chnative_init: -;source-doc/base-drv/./usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); +;source-doc/base-drv/usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); ld hl,_x - ld b,0x63 -l_chnative_init_00139: ld (hl),0x00 - inc hl - djnz l_chnative_init_00139 -;source-doc/base-drv/./usb-init.c:28: ch_cmd_reset_all(); + ld e, l + ld d, h + inc de + ld bc,0x0062 + ldir +;source-doc/base-drv/usb-init.c:28: ch_cmd_reset_all(); call _ch_cmd_reset_all -;source-doc/base-drv/./usb-init.c:30: delay_medium(); +;source-doc/base-drv/usb-init.c:30: delay_medium(); call _delay_medium -;source-doc/base-drv/./usb-init.c:32: if (!ch_probe()) { +;source-doc/base-drv/usb-init.c:32: if (!ch_probe()) { call _ch_probe ld a, l or a jr NZ,l_chnative_init_00102 -;source-doc/base-drv/./usb-init.c:33: print_string("\r\nCH376: NOT PRESENT$"); -;source-doc/base-drv/./usb-init.c:34: return; +;source-doc/base-drv/usb-init.c:33: print_string("\r\nCH376: NOT PRESENT$"); +;source-doc/base-drv/usb-init.c:34: return; ld hl,usb_init_str_0 jp _print_string l_chnative_init_00102: -;source-doc/base-drv/./usb-init.c:37: print_string("\r\nCH376: PRESENT (VER $"); +;source-doc/base-drv/usb-init.c:37: print_string("\r\nCH376: PRESENT (VER $"); ld hl,usb_init_str_1 call _print_string -;source-doc/base-drv/./usb-init.c:38: print_hex(ch_cmd_get_ic_version()); +;source-doc/base-drv/usb-init.c:38: print_hex(ch_cmd_get_ic_version()); call _ch_cmd_get_ic_version call _print_hex -;source-doc/base-drv/./usb-init.c:39: print_string("); $"); +;source-doc/base-drv/usb-init.c:39: print_string("); $"); ld hl,usb_init_str_2 call _print_string -;source-doc/base-drv/./usb-init.c:41: usb_host_bus_reset(); +;source-doc/base-drv/usb-init.c:41: usb_host_bus_reset(); call _usb_host_bus_reset -;source-doc/base-drv/./usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { +;source-doc/base-drv/usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { ld c,0x00 l_chnative_init_00107: ld a, c sub 0x04 jr NC,l_chnative_init_00105 -;source-doc/base-drv/./usb-init.c:44: const uint8_t r = ch_very_short_wait_int_and_get_(); +;source-doc/base-drv/usb-init.c:44: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get ld a, l pop bc -;source-doc/base-drv/./usb-init.c:46: if (r == USB_INT_CONNECT) { +;source-doc/base-drv/usb-init.c:46: if (r == USB_INT_CONNECT) { sub 0x81 jr NZ,l_chnative_init_00108 -;source-doc/base-drv/./usb-init.c:47: print_string("USB: CONNECTED$"); +;source-doc/base-drv/usb-init.c:47: print_string("USB: CONNECTED$"); ld hl,usb_init_str_3 call _print_string -;source-doc/base-drv/./usb-init.c:49: enumerate_all_devices(); +;source-doc/base-drv/usb-init.c:49: enumerate_all_devices(); jp _enumerate_all_devices -;source-doc/base-drv/./usb-init.c:51: return; +;source-doc/base-drv/usb-init.c:51: return; jr l_chnative_init_00109 l_chnative_init_00108: -;source-doc/base-drv/./usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { +;source-doc/base-drv/usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { inc c jr l_chnative_init_00107 l_chnative_init_00105: -;source-doc/base-drv/./usb-init.c:55: print_string("USB: DISCONNECTED$"); +;source-doc/base-drv/usb-init.c:55: print_string("USB: DISCONNECTED$"); ld hl,usb_init_str_4 jp _print_string l_chnative_init_00109: -;source-doc/base-drv/./usb-init.c:56: } +;source-doc/base-drv/usb-init.c:56: } ret usb_init_str_0: DEFB 0x0d diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.asm b/Source/HBIOS/ch376-native/base-drv/usb_state.c.asm new file mode 100644 index 00000000..a6764589 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.asm @@ -0,0 +1,605 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _device_config_sizes + GLOBAL _find_device_config + GLOBAL _find_first_free + GLOBAL _first_device_config + GLOBAL _next_device_config + GLOBAL _get_usb_device_config +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _get_number_of_usb_drives + GLOBAL _usbtrn_clear_endpoint_halt + GLOBAL _usbtrn_set_address + GLOBAL _usbtrn_set_configuration + GLOBAL _usbtrn_gfull_cfg_desc + GLOBAL _usbtrn_get_config_descriptor + GLOBAL _usbtrn_get_descriptor2 + GLOBAL _usbtrn_get_descriptor + GLOBAL _usbdev_dat_in_trnsfer_0 + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_control_transfer + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _x + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/base-drv/usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) { +; --------------------------------- +; Function find_device_config +; --------------------------------- +_find_device_config: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:16: const device_config *p_config = first_device_config(p); + ld hl,_x + call _first_device_config +;source-doc/base-drv/usb_state.c:17: while (p_config) { +l_find_device_config_00103: + ld a, d + or a, e + jr Z,l_find_device_config_00105 +;source-doc/base-drv/usb_state.c:18: const uint8_t type = p_config->type; + ld l, e + ld h, d + ld a, (hl) + and a,0x0f + ld c, a +;source-doc/base-drv/usb_state.c:20: if (type == requested_type) + ld a,(ix+4) + sub a, c + jr NZ,l_find_device_config_00102 +;source-doc/base-drv/usb_state.c:21: return (device_config *)p_config; + ex de, hl + jr l_find_device_config_00106 +l_find_device_config_00102: +;source-doc/base-drv/usb_state.c:23: p_config = next_device_config(p, p_config); + ld hl,_x + call _next_device_config + jr l_find_device_config_00103 +l_find_device_config_00105: +;source-doc/base-drv/usb_state.c:26: return NULL; + ld hl,0x0000 +l_find_device_config_00106: +;source-doc/base-drv/usb_state.c:27: } + pop ix + ret + SECTION rodata_compiler +_device_config_sizes: + DEFB +0x00 + DEFB +0x10 + DEFB +0x10 + DEFB +0x0c + DEFB +0x06 + DEFB 0x00 + DEFB 0x00 + SECTION code_compiler +;source-doc/base-drv/usb_state.c:30: device_config *find_first_free(void) { +; --------------------------------- +; Function find_first_free +; --------------------------------- +_find_first_free: +;source-doc/base-drv/usb_state.c:31: _usb_state *const boot_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:34: device_config *p = first_device_config(boot_state); + ld hl,_x + call _first_device_config +;source-doc/base-drv/usb_state.c:35: while (p) { +l_find_first_free_00103: + ld a, d + or a, e + jr Z,l_find_first_free_00105 +;source-doc/base-drv/usb_state.c:36: if (p->type == 0) + ld l, e + ld h, d + ld a, (hl) + and a,0x0f + jr NZ,l_find_first_free_00102 +;source-doc/base-drv/usb_state.c:37: return p; + ex de, hl + jr l_find_first_free_00106 +l_find_first_free_00102: +;source-doc/base-drv/usb_state.c:39: p = next_device_config(boot_state, p); + ld hl,_x + call _next_device_config + jr l_find_first_free_00103 +l_find_first_free_00105: +;source-doc/base-drv/usb_state.c:42: return NULL; + ld hl,0x0000 +l_find_first_free_00106: +;source-doc/base-drv/usb_state.c:43: } + ret +;source-doc/base-drv/usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } +; --------------------------------- +; Function first_device_config +; --------------------------------- +_first_device_config: + ex de, hl + inc de + inc de + ret +;source-doc/base-drv/usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { +; --------------------------------- +; Function next_device_config +; --------------------------------- +_next_device_config: + ld c, l + ld b, h +;source-doc/base-drv/usb_state.c:48: if (p->type == 0) + ld l, e + ld h, d + ld a, (hl) + and a,0x0f + jr NZ,l_next_device_config_00102 +;source-doc/base-drv/usb_state.c:49: return NULL; + ld de,0x0000 + jr l_next_device_config_00105 +l_next_device_config_00102: +;source-doc/base-drv/usb_state.c:51: const uint8_t size = device_config_sizes[p->type]; + ld l, e + ld h, d + ld a, (hl) + and a,0x0f + add a, +((_device_config_sizes) & 0xFF) + ld l, a + ld a,0x00 + adc a, +((_device_config_sizes) / 256) + ld h, a + ld l, (hl) +;source-doc/base-drv/usb_state.c:58: const uint8_t *_p = (uint8_t *)p; +;source-doc/base-drv/usb_state.c:59: device_config *const result = (device_config *)(_p + size); + ld h,0x00 + add hl, de + ex de, hl +;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) + ld hl,0x0062 + add hl, bc + ld a, e + sub a, l + ld a, d + sbc a, h + ret C +;source-doc/base-drv/usb_state.c:62: return NULL; + ld de,0x0000 +;source-doc/base-drv/usb_state.c:64: return result; +l_next_device_config_00105: +;source-doc/base-drv/usb_state.c:65: } + ret +;source-doc/base-drv/usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +; --------------------------------- +; Function get_usb_device_config +; --------------------------------- +_get_usb_device_config: + ld c, a +;source-doc/base-drv/usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc + ld hl,_x + call _first_device_config + pop bc + ld b,0x01 +l_get_usb_device_config_00107: + ld a, d + or a, e + jr Z,l_get_usb_device_config_00105 +;source-doc/base-drv/usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) { + ld l, e + ld h, d + ld a, (hl) + and a,0x0f + jr Z,l_get_usb_device_config_00108 +;source-doc/base-drv/usb_state.c:75: if (counter == device_index) + ld a, c + sub a, b +;source-doc/base-drv/usb_state.c:76: return p; + jr Z,l_get_usb_device_config_00109 +;source-doc/base-drv/usb_state.c:77: counter++; + inc b +l_get_usb_device_config_00108: +;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { + push bc + ld hl,_x + call _next_device_config + pop bc + jr l_get_usb_device_config_00107 +l_get_usb_device_config_00105: +;source-doc/base-drv/usb_state.c:81: return NULL; // is not a usb device + ld de,0x0000 +l_get_usb_device_config_00109: +;source-doc/base-drv/usb_state.c:82: } + ret + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index b292e052..0f59f64d 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./usb_state.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/usb_state.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/./usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) { +;source-doc/base-drv/usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) { ; --------------------------------- ; Function find_device_config ; --------------------------------- @@ -56,38 +56,38 @@ _find_device_config: push ix ld ix,0 add ix,sp -;source-doc/base-drv/./usb_state.c:14: _usb_state *const p = get_usb_work_area(); -;source-doc/base-drv/./usb_state.c:16: const device_config *p_config = first_device_config(p); +;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:16: const device_config *p_config = first_device_config(p); ld hl,_x call _first_device_config -;source-doc/base-drv/./usb_state.c:17: while (p_config) { +;source-doc/base-drv/usb_state.c:17: while (p_config) { l_find_device_config_00103: ld a, d or e jr Z,l_find_device_config_00105 -;source-doc/base-drv/./usb_state.c:18: const uint8_t type = p_config->type; +;source-doc/base-drv/usb_state.c:18: const uint8_t type = p_config->type; ld l, e ld h, d ld a, (hl) and 0x0f ld c, a -;source-doc/base-drv/./usb_state.c:20: if (type == requested_type) +;source-doc/base-drv/usb_state.c:20: if (type == requested_type) ld a,(ix+4) sub c jr NZ,l_find_device_config_00102 -;source-doc/base-drv/./usb_state.c:21: return (device_config *)p_config; +;source-doc/base-drv/usb_state.c:21: return (device_config *)p_config; ex de, hl jr l_find_device_config_00106 l_find_device_config_00102: -;source-doc/base-drv/./usb_state.c:23: p_config = next_device_config(p, p_config); +;source-doc/base-drv/usb_state.c:23: p_config = next_device_config(p, p_config); ld hl,_x call _next_device_config jr l_find_device_config_00103 l_find_device_config_00105: -;source-doc/base-drv/./usb_state.c:26: return NULL; +;source-doc/base-drv/usb_state.c:26: return NULL; ld hl,0x0000 l_find_device_config_00106: -;source-doc/base-drv/./usb_state.c:27: } +;source-doc/base-drv/usb_state.c:27: } pop ix ret _device_config_sizes: @@ -98,41 +98,41 @@ _device_config_sizes: DEFB +0x06 DEFB 0x00 DEFB 0x00 -;source-doc/base-drv/./usb_state.c:30: device_config *find_first_free(void) { +;source-doc/base-drv/usb_state.c:30: device_config *find_first_free(void) { ; --------------------------------- ; Function find_first_free ; --------------------------------- _find_first_free: -;source-doc/base-drv/./usb_state.c:31: _usb_state *const boot_state = get_usb_work_area(); -;source-doc/base-drv/./usb_state.c:34: device_config *p = first_device_config(boot_state); +;source-doc/base-drv/usb_state.c:31: _usb_state *const boot_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:34: device_config *p = first_device_config(boot_state); ld hl,_x call _first_device_config -;source-doc/base-drv/./usb_state.c:35: while (p) { +;source-doc/base-drv/usb_state.c:35: while (p) { l_find_first_free_00103: ld a, d or e jr Z,l_find_first_free_00105 -;source-doc/base-drv/./usb_state.c:36: if (p->type == 0) +;source-doc/base-drv/usb_state.c:36: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_find_first_free_00102 -;source-doc/base-drv/./usb_state.c:37: return p; +;source-doc/base-drv/usb_state.c:37: return p; ex de, hl jr l_find_first_free_00106 l_find_first_free_00102: -;source-doc/base-drv/./usb_state.c:39: p = next_device_config(boot_state, p); +;source-doc/base-drv/usb_state.c:39: p = next_device_config(boot_state, p); ld hl,_x call _next_device_config jr l_find_first_free_00103 l_find_first_free_00105: -;source-doc/base-drv/./usb_state.c:42: return NULL; +;source-doc/base-drv/usb_state.c:42: return NULL; ld hl,0x0000 l_find_first_free_00106: -;source-doc/base-drv/./usb_state.c:43: } +;source-doc/base-drv/usb_state.c:43: } ret -;source-doc/base-drv/./usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } +;source-doc/base-drv/usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } ; --------------------------------- ; Function first_device_config ; --------------------------------- @@ -141,24 +141,24 @@ _first_device_config: inc de inc de ret -;source-doc/base-drv/./usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { ; --------------------------------- ; Function next_device_config ; --------------------------------- _next_device_config: ld c, l ld b, h -;source-doc/base-drv/./usb_state.c:48: if (p->type == 0) +;source-doc/base-drv/usb_state.c:48: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_next_device_config_00102 -;source-doc/base-drv/./usb_state.c:49: return NULL; +;source-doc/base-drv/usb_state.c:49: return NULL; ld de,0x0000 jr l_next_device_config_00105 l_next_device_config_00102: -;source-doc/base-drv/./usb_state.c:51: const uint8_t size = device_config_sizes[p->type]; +;source-doc/base-drv/usb_state.c:51: const uint8_t size = device_config_sizes[p->type]; ld l, e ld h, d ld a, (hl) @@ -169,12 +169,12 @@ l_next_device_config_00102: adc a, +((_device_config_sizes) / 256) ld h, a ld l, (hl) -;source-doc/base-drv/./usb_state.c:58: const uint8_t *_p = (uint8_t *)p; -;source-doc/base-drv/./usb_state.c:59: device_config *const result = (device_config *)(_p + size); +;source-doc/base-drv/usb_state.c:58: const uint8_t *_p = (uint8_t *)p; +;source-doc/base-drv/usb_state.c:59: device_config *const result = (device_config *)(_p + size); ld h,0x00 add hl, de ex de, hl -;source-doc/base-drv/./usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) +;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) ld hl,0x0062 add hl, bc ld a, e @@ -182,20 +182,20 @@ l_next_device_config_00102: ld a, d sbc a, h ret C -;source-doc/base-drv/./usb_state.c:62: return NULL; +;source-doc/base-drv/usb_state.c:62: return NULL; ld de,0x0000 -;source-doc/base-drv/./usb_state.c:64: return result; +;source-doc/base-drv/usb_state.c:64: return result; l_next_device_config_00105: -;source-doc/base-drv/./usb_state.c:65: } +;source-doc/base-drv/usb_state.c:65: } ret -;source-doc/base-drv/./usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { ; --------------------------------- ; Function get_usb_device_config ; --------------------------------- _get_usb_device_config: ld c, a -;source-doc/base-drv/./usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _first_device_config @@ -205,29 +205,29 @@ l_get_usb_device_config_00107: ld a, d or e jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/./usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) { +;source-doc/base-drv/usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) { ld l, e ld h, d ld a, (hl) and 0x0f jr Z,l_get_usb_device_config_00108 -;source-doc/base-drv/./usb_state.c:75: if (counter == device_index) +;source-doc/base-drv/usb_state.c:75: if (counter == device_index) ld a, c sub b -;source-doc/base-drv/./usb_state.c:76: return p; +;source-doc/base-drv/usb_state.c:76: return p; jr Z,l_get_usb_device_config_00109 -;source-doc/base-drv/./usb_state.c:77: counter++; +;source-doc/base-drv/usb_state.c:77: counter++; inc b l_get_usb_device_config_00108: -;source-doc/base-drv/./usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _next_device_config pop bc jr l_get_usb_device_config_00107 l_get_usb_device_config_00105: -;source-doc/base-drv/./usb_state.c:81: return NULL; // is not a usb device +;source-doc/base-drv/usb_state.c:81: return NULL; // is not a usb device ld de,0x0000 l_get_usb_device_config_00109: -;source-doc/base-drv/./usb_state.c:82: } +;source-doc/base-drv/usb_state.c:82: } ret diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.asm b/Source/HBIOS/ch376-native/base-drv/work-area.c.asm new file mode 100644 index 00000000..0f2e36fc --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.asm @@ -0,0 +1,520 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _x +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _get_usb_device_config + GLOBAL _find_device_config + GLOBAL _next_device_config + GLOBAL _first_device_config + GLOBAL _find_first_free + GLOBAL _usbtrn_clear_endpoint_halt + GLOBAL _usbtrn_set_address + GLOBAL _usbtrn_set_configuration + GLOBAL _usbtrn_gfull_cfg_desc + GLOBAL _usbtrn_get_config_descriptor + GLOBAL _usbtrn_get_descriptor2 + GLOBAL _usbtrn_get_descriptor + GLOBAL _usbdev_dat_in_trnsfer_0 + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_control_transfer + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + +_x: + DEFS 99 + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION data_compiler +_x: + DEFB 0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index 23f946c7..6f872426 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/base-drv/./work-area.c.asm -- not to be modify directly +; Generated from source-doc/base-drv/work-area.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/build-docker.sh b/Source/HBIOS/ch376-native/build-docker.sh deleted file mode 100644 index e69de29b..00000000 diff --git a/Source/HBIOS/ch376-native/cruntime.asm b/Source/HBIOS/ch376-native/cruntime.asm index 85904a82..9eb4231d 100644 --- a/Source/HBIOS/ch376-native/cruntime.asm +++ b/Source/HBIOS/ch376-native/cruntime.asm @@ -20,21 +20,20 @@ _memset_callee: dec bc ld a, b or c - ret Z + ret z push hl ldir pop hl ret - _memcpy_callee: - pop af - pop bc - pop hl - pop de - push af + pop af + pop bc + pop hl + pop de + push af ; enter : bc = size_t n @@ -48,99 +47,18 @@ _memcpy_callee: ; ; uses : af, bc, de, hl - ld a,b - or c - jr Z,zero_n + ld a, b + or c + jr z, zero_n asm0_memcpy: - push de - ldir - pop hl - or a - ret + push de + ldir + pop hl + or a + ret zero_n: push de pop hl - ret - - -; ; =============================================================== -; ; Stefano Bodrato -; ; aralbrec: accommodate nmos z80 bug -; ; =============================================================== -; ; -; ; void z80_push_di(void) -; ; -; ; Save the current ei/di status on the stack and disable ints. -; ; -; ; =============================================================== - -; ____sdcc_cpu_push_di: - -; ; exit : stack = ei_di_status -; ; -; ; uses : af - -; ex (sp),hl -; push hl - -; ld a,i - -; di - -; push af -; pop hl ; hl = ei_di status - -; pop af ; af = ret -; ex (sp),hl ; restore hl, push ei_di_status - -; push af - -; ret - - -; ; =============================================================== -; ; Stefano Bodrato -; ; =============================================================== -; ; -; ; void z80_pop_ei(void) -; ; -; ; Pop the ei_di_status from the stack and restore the di/ei -; ; state to what it was previously when a push was called. -; ; -; ; The "ei" in the function name has no bearing on what the -; ; function does; the name is meant to balance "z80_push_di". -; ; -; ; =============================================================== - -; ____sdcc_cpu_pop_ei: - -; ; enter : stack = ei_di_status, ret -; ; -; ; uses : af - -; ex (sp),hl -; pop af ; af = old hl - -; ex (sp),hl ; hl = ei_di_status -; push af - -; ex (sp),hl ; hl restored - -; ____sdcc_cpu_pop_ei_jp: -; ; enter : stack = ret, ei_di_status -; ; -; ; uses : af - -; pop af ; af = ei_di_status - -; jp PO, di_state - -; ei_state: -; ei -; ret - -; di_state: -; di -; ret + ret diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index cc9a7b76..1925a521 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -1,4 +1,4 @@ ; Generated File -- not to be modify directly -#include "ch376-native/keyboard/kyb-init.c.s" #include "ch376-native/keyboard/class_hid.c.s" #include "ch376-native/keyboard/class_hid_keyboard.c.s" +#include "ch376-native/keyboard/kyb-init.c.s" diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s index 73072f3e..06fc1a0e 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/keyboard/./class_hid.c.asm -- not to be modify directly +; Generated from source-doc/keyboard/class_hid.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/./class_hid.c:6: usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { +;source-doc/keyboard/class_hid.c:6: usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { ; --------------------------------- ; Function hid_set_protocol ; --------------------------------- @@ -60,27 +60,25 @@ _hid_set_protocol: push af push af push af - ex de, hl -;source-doc/keyboard/./class_hid.c:8: cmd = cmd_hid_set; - push de - ex de, hl +;source-doc/keyboard/class_hid.c:8: cmd = cmd_hid_set; + push hl ld hl,2 add hl, sp ex de, hl - ld hl,_cmd_hid_set ld bc,0x0008 + ld hl,_cmd_hid_set ldir pop de -;source-doc/keyboard/./class_hid.c:10: cmd.bRequest = HID_SET_PROTOCOL; +;source-doc/keyboard/class_hid.c:10: cmd.bRequest = HID_SET_PROTOCOL; ld (ix-7),0x0b -;source-doc/keyboard/./class_hid.c:11: cmd.bValue[0] = protocol; +;source-doc/keyboard/class_hid.c:11: cmd.bValue[0] = protocol; ld a,(ix+4) ld (ix-6),a -;source-doc/keyboard/./class_hid.c:13: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); +;source-doc/keyboard/class_hid.c:13: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); ld l, e ld h, d inc hl - ld c, (hl) + ld b, (hl) ex de, hl ld a, (hl) rlca @@ -88,11 +86,8 @@ _hid_set_protocol: rlca rlca and 0x0f - ld h, c - push hl - inc sp - push af - inc sp + ld c,a + push bc ld hl,0x0000 push hl ld hl,4 @@ -103,7 +98,7 @@ _hid_set_protocol: pop af pop af ld a, l -;source-doc/keyboard/./class_hid.c:14: } +;source-doc/keyboard/class_hid.c:14: } ld sp, ix pop ix pop hl @@ -117,7 +112,7 @@ _cmd_hid_set: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/keyboard/./class_hid.c:16: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { +;source-doc/keyboard/class_hid.c:16: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { ; --------------------------------- ; Function hid_set_idle ; --------------------------------- @@ -129,27 +124,25 @@ _hid_set_idle: push af push af push af - ex de, hl -;source-doc/keyboard/./class_hid.c:18: cmd = cmd_hid_set; - push de - ex de, hl +;source-doc/keyboard/class_hid.c:18: cmd = cmd_hid_set; + push hl ld hl,2 add hl, sp ex de, hl - ld hl,_cmd_hid_set ld bc,0x0008 + ld hl,_cmd_hid_set ldir pop de -;source-doc/keyboard/./class_hid.c:20: cmd.bRequest = HID_SET_IDLE; +;source-doc/keyboard/class_hid.c:20: cmd.bRequest = HID_SET_IDLE; ld (ix-7),0x0a -;source-doc/keyboard/./class_hid.c:21: cmd.bValue[0] = duration; +;source-doc/keyboard/class_hid.c:21: cmd.bValue[0] = duration; ld a,(ix+4) ld (ix-6),a -;source-doc/keyboard/./class_hid.c:23: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); +;source-doc/keyboard/class_hid.c:23: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); ld l, e ld h, d inc hl - ld c, (hl) + ld b, (hl) ex de, hl ld a, (hl) rlca @@ -157,11 +150,8 @@ _hid_set_idle: rlca rlca and 0x0f - ld h, c - push hl - inc sp - push af - inc sp + ld c,a + push bc ld hl,0x0000 push hl ld hl,4 @@ -172,13 +162,13 @@ _hid_set_idle: pop af pop af ld a, l -;source-doc/keyboard/./class_hid.c:24: } +;source-doc/keyboard/class_hid.c:24: } ld sp, ix pop ix pop hl inc sp jp (hl) -;source-doc/keyboard/./class_hid.c:26: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { +;source-doc/keyboard/class_hid.c:26: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { ; --------------------------------- ; Function hid_get_input_report ; --------------------------------- @@ -193,31 +183,32 @@ _hid_get_input_report: ld sp, hl ld l, c ld h, b -;source-doc/keyboard/./class_hid.c:28: cmd = cmd_hid_set; +;source-doc/keyboard/class_hid.c:28: cmd = cmd_hid_set; push de push hl ex de, hl ld hl,4 add hl, sp ex de, hl - ld hl,_cmd_hid_set ld bc,0x0008 + ld hl,_cmd_hid_set ldir pop bc pop de -;source-doc/keyboard/./class_hid.c:30: cmd.bmRequestType = 0xA1; +;source-doc/keyboard/class_hid.c:30: cmd.bmRequestType = 0xA1; ld (ix-9),0xa1 -;source-doc/keyboard/./class_hid.c:31: cmd.bValue[0] = 1; - ld (ix-7),0x01 -;source-doc/keyboard/./class_hid.c:32: cmd.bValue[1] = 1; - ld (ix-6),0x01 -;source-doc/keyboard/./class_hid.c:33: cmd.bRequest = HID_GET_REPORT; - ld (ix-8),0x01 -;source-doc/keyboard/./class_hid.c:34: cmd.wLength = 8; +;source-doc/keyboard/class_hid.c:31: cmd.bValue[0] = 1; +;source-doc/keyboard/class_hid.c:32: cmd.bValue[1] = 1; +;source-doc/keyboard/class_hid.c:33: cmd.bRequest = HID_GET_REPORT; + ld a,0x01 + ld (ix-7),a + ld (ix-6),a + ld (ix-8),a +;source-doc/keyboard/class_hid.c:34: cmd.wLength = 8; ld (ix-3),0x08 xor a ld (ix-2),a -;source-doc/keyboard/./class_hid.c:36: return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); +;source-doc/keyboard/class_hid.c:36: return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); ld l, c ld h, b inc hl @@ -232,10 +223,8 @@ _hid_get_input_report: rlca and 0x0f ld h,(ix-1) + ld l,a push hl - inc sp - push af - inc sp push de ld hl,4 add hl, sp @@ -245,7 +234,7 @@ _hid_get_input_report: pop af pop af ld a, l -;source-doc/keyboard/./class_hid.c:37: } +;source-doc/keyboard/class_hid.c:37: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s index 84695f4c..c9530ea6 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/keyboard/./class_hid_keyboard.c.asm -- not to be modify directly +; Generated from source-doc/keyboard/class_hid_keyboard.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -49,39 +49,39 @@ _scancodes_table: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/./class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { +;source-doc/keyboard/class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { ; --------------------------------- ; Function scancode_to_char ; --------------------------------- _scancode_to_char: ld c, a - ld e, l -;source-doc/keyboard/./class_hid_keyboard.c:336: if (code >= 0x80) - ld a, e +;source-doc/keyboard/class_hid_keyboard.c:336: if (code >= 0x80) + ld a,l + ld e,l sub 0x80 jr C,l_scancode_to_char_00102 -;source-doc/keyboard/./class_hid_keyboard.c:337: return 0; +;source-doc/keyboard/class_hid_keyboard.c:337: return 0; xor a jr l_scancode_to_char_00105 l_scancode_to_char_00102: -;source-doc/keyboard/./class_hid_keyboard.c:339: if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) +;source-doc/keyboard/class_hid_keyboard.c:339: if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) ld a, c and 0x22 jr Z,l_scancode_to_char_00104 -;source-doc/keyboard/./class_hid_keyboard.c:340: return scancodes_shift_table[code]; - ld hl,_scancodes_shift_table +;source-doc/keyboard/class_hid_keyboard.c:340: return scancodes_shift_table[code]; ld d,0x00 + ld hl,_scancodes_shift_table add hl, de ld a, (hl) jr l_scancode_to_char_00105 l_scancode_to_char_00104: -;source-doc/keyboard/./class_hid_keyboard.c:342: return scancodes_table[code]; - ld hl,_scancodes_table +;source-doc/keyboard/class_hid_keyboard.c:342: return scancodes_table[code]; ld d,0x00 + ld hl,_scancodes_table add hl, de ld a, (hl) l_scancode_to_char_00105: -;source-doc/keyboard/./class_hid_keyboard.c:343: } +;source-doc/keyboard/class_hid_keyboard.c:343: } ret _scancodes_shift_table: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 86a694de..d877b11f 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/keyboard/./kyb-init.c.asm -- not to be modify directly +; Generated from source-doc/keyboard/kyb-init.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -60,81 +60,77 @@ _report: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/./kyb-init.c:11: void keyboard_init(void) { +;source-doc/keyboard/kyb-init.c:11: void keyboard_init(void) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/./kyb-init.c:13: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:13: uint8_t index = 1; ld c,0x01 -;source-doc/keyboard/./kyb-init.c:14: keyboard_config = NULL; - xor a - ld hl,_keyboard_config - ld (hl), a - inc hl - ld (hl), a -;source-doc/keyboard/./kyb-init.c:16: do { +;source-doc/keyboard/kyb-init.c:14: keyboard_config = NULL; + ld hl,0x0000 + ld (_keyboard_config),hl +;source-doc/keyboard/kyb-init.c:16: do { ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/./kyb-init.c:17: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); +;source-doc/keyboard/kyb-init.c:17: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); push bc ld a, b call _get_usb_device_config ex de, hl pop bc ld (_keyboard_config), hl -;source-doc/keyboard/./kyb-init.c:19: if (keyboard_config == NULL) - ld hl,_keyboard_config + 1 - ld a, (hl) - dec hl - or (hl) +;source-doc/keyboard/kyb-init.c:19: if (keyboard_config == NULL) + ld hl,(_keyboard_config) + ld a,h + or l jr Z,l_keyboard_init_00107 -;source-doc/keyboard/./kyb-init.c:22: const usb_device_type t = keyboard_config->type; +;source-doc/keyboard/kyb-init.c:22: const usb_device_type t = keyboard_config->type; ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/./kyb-init.c:24: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/kyb-init.c:24: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/./kyb-init.c:25: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:25: print_string("\r\nUSB: KEYBOARD @ $"); push bc ld hl,kyb_init_str_0 call _print_string pop bc -;source-doc/keyboard/./kyb-init.c:26: print_uint16(index); +;source-doc/keyboard/kyb-init.c:26: print_uint16(index); ld h,0x00 ld l, c call _print_uint16 -;source-doc/keyboard/./kyb-init.c:27: print_string(" $"); +;source-doc/keyboard/kyb-init.c:27: print_string(" $"); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/./kyb-init.c:29: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb-init.c:29: hid_set_protocol(keyboard_config, 1); ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/./kyb-init.c:30: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:30: hid_set_idle(keyboard_config, 0x80); ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/./kyb-init.c:31: return; +;source-doc/keyboard/kyb-init.c:31: return; jr l_keyboard_init_00108 l_keyboard_init_00106: -;source-doc/keyboard/./kyb-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/keyboard/kyb-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc b ld a,b - ld c,a + ld c,b sub 0x07 jr NZ,l_keyboard_init_00105 l_keyboard_init_00107: -;source-doc/keyboard/./kyb-init.c:35: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:35: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 jp _print_string l_keyboard_init_00108: -;source-doc/keyboard/./kyb-init.c:36: } +;source-doc/keyboard/kyb-init.c:36: } ret kyb_init_str_0: DEFB 0x0d @@ -149,7 +145,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/./kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -157,35 +153,33 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/./kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) ld a,(ix+5) sub 0x80 jr NC,l_keyboard_buf_put_00106 ld a,(ix+5) or a -;source-doc/keyboard/./kyb-init.c:50: return; // ignore ??? +;source-doc/keyboard/kyb-init.c:50: return; // ignore ??? jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/./kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_write_index) inc a and 0x07 - ld b, a -;source-doc/keyboard/./kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full + ld c, a +;source-doc/keyboard/kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full ld a,(_read_index) - sub b + sub c jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/./kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; ld de,_buffer+0 - ld hl,_write_index - ld l, (hl) + ld hl,(_write_index) ld h,0x00 add hl, hl add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/./kyb-init.c:55: buffer[write_index].key_code = key_code; - ld hl,_write_index - ld l, (hl) +;source-doc/keyboard/kyb-init.c:55: buffer[write_index].key_code = key_code; + ld hl,(_write_index) ld h,0x00 add hl, hl add hl, de @@ -193,30 +187,30 @@ _keyboard_buf_put: inc de ld a,(ix+5) ld (de), a -;source-doc/keyboard/./kyb-init.c:56: write_index = next_write_index; +;source-doc/keyboard/kyb-init.c:56: write_index = next_write_index; ld hl,_write_index - ld (hl), b + ld (hl), c l_keyboard_buf_put_00106: -;source-doc/keyboard/./kyb-init.c:58: } +;source-doc/keyboard/kyb-init.c:58: } pop ix ret -;source-doc/keyboard/./kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/./kyb-init.c:61: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:61: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/./kyb-init.c:62: return write_index - read_index; +;source-doc/keyboard/kyb-init.c:62: return write_index - read_index; ld a,(_write_index) ld hl,_read_index sub (hl) jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/./kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ld hl,_read_index ld c, (hl) ld a,0x08 @@ -225,9 +219,9 @@ l_keyboard_buf_size_00102: ld c, (hl) add a, c l_keyboard_buf_size_00103: -;source-doc/keyboard/./kyb-init.c:65: } +;source-doc/keyboard/kyb-init.c:65: } ret -;source-doc/keyboard/./kyb-init.c:67: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:67: uint32_t keyboard_buf_get_next() { ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -237,83 +231,84 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/./kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/./kyb-init.c:69: return 255 << 8; +;source-doc/keyboard/kyb-init.c:69: return 255 << 8; ld hl,0xff00 ld e, h ld d, h jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/./kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; ld bc,_buffer+0 - ld hl,_read_index - ld l, (hl) + ld hl,(_read_index) ld h,0x00 add hl, hl add hl, bc - ld d, (hl) -;source-doc/keyboard/./kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; + ld b, (hl) +;source-doc/keyboard/kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; inc hl - ld e, (hl) -;source-doc/keyboard/./kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld c, (hl) +;source-doc/keyboard/kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld hl,_read_index ld a, (hl) inc a and 0x07 ld (hl), a -;source-doc/keyboard/./kyb-init.c:74: const unsigned char c = scancode_to_char(modifier_key, key_code); - push de - ld l, e - ld a, d +;source-doc/keyboard/kyb-init.c:74: const unsigned char c = scancode_to_char(modifier_key, key_code); + push bc + ld l, c + ld a, b call _scancode_to_char - pop de -;source-doc/keyboard/./kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; - ld (ix-1),d - ld (ix-4),0x00 - ld (ix-3),0x00 - ld (ix-2),0x00 - ld l, a - ld a,(ix-1) - ld (ix-4),e - ld (ix-3),0x00 - ld (ix-2),0x00 - ld (ix-1),0x00 - pop de - push de - ld h, a - ex de, hl + ld e, a + pop bc +;source-doc/keyboard/kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; + xor a + ld (ix-1),b + xor a + ld (ix-4),a + ld (ix-3),a + ld (ix-2),a + xor a + ld d,(ix-1) + ld (ix-4),c + xor a + ld (ix-3),a + ld (ix-2),a + ld (ix-1),a + pop hl + push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/./kyb-init.c:77: } +;source-doc/keyboard/kyb-init.c:77: } ld sp, ix pop ix ret -;source-doc/keyboard/./kyb-init.c:79: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:79: void keyboard_buf_flush() { ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/./kyb-init.c:80: write_index = 0; +;source-doc/keyboard/kyb-init.c:80: write_index = 0; ld hl,_write_index ld (hl),0x00 -;source-doc/keyboard/./kyb-init.c:81: read_index = 0; +;source-doc/keyboard/kyb-init.c:81: read_index = 0; ld hl,_read_index ld (hl),0x00 -;source-doc/keyboard/./kyb-init.c:82: } +;source-doc/keyboard/kyb-init.c:82: } ret -;source-doc/keyboard/./kyb-init.c:88: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:88: void keyboard_tick(void) { ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/./kyb-init.c:89: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:89: if (is_in_critical_section()) ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/./kyb-init.c:90: return; +;source-doc/keyboard/kyb-init.c:90: return; ret NZ ;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); ld l,0x0b @@ -326,7 +321,7 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/./kyb-init.c:93: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); +;source-doc/keyboard/kyb-init.c:93: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); ld bc,_report ld hl, (_keyboard_config) ld a,0x08 @@ -351,22 +346,20 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/./kyb-init.c:95: if (result == 0) +;source-doc/keyboard/kyb-init.c:95: if (result == 0) ld hl,_result ld a, (hl) or a ret NZ -;source-doc/keyboard/./kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); +;source-doc/keyboard/kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); ld a, (_report + 2) - ld hl,_report + 0 - ld b, (hl) - push af - inc sp + ld hl,_report + ld c, (hl) + ld b,a push bc - inc sp call _keyboard_buf_put pop af -;source-doc/keyboard/./kyb-init.c:97: } +;source-doc/keyboard/kyb-init.c:97: } ret _keyboard_config: DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/readme.md b/Source/HBIOS/ch376-native/readme.md new file mode 100644 index 00000000..8fbb46fb --- /dev/null +++ b/Source/HBIOS/ch376-native/readme.md @@ -0,0 +1,60 @@ +# Native CH376 Driver + +The native CH376 HBIOS driver is written in c, using z88dk's zcc compiler. + +The build process, is a 3 stage process. + +1. Compile all the C code to assembly files (.asm) +2. Translate the produced .asm files syntax to compile with the RomWBW assembler (.s) +3. Assemble the driver .s files as per the standard HBIOS build process + +The original C code and produced/translated .s files are all committed units in the repo. But it is +expected, that only the c files are to be modified/updated. + +The .s files are checked in, to builders to not require the C compiler tool chain (z88dk) to be installed. + +The c compiling/translating process is also only support on linux, as the script to translate the .asm files +to .s files is a linux bash script. (Although the script can be easily run within Windows's Sub-system for linux) + +## Compiling the C code + +To compile the c code, to update the .s files: + +Within the `Source/HBIOS/ch376-native` directly: + +``` +make +``` + +The make script will search for z88dk's `zcc` compiler, if not found, will attempt to use a docker wrapper. +It will not work if z88dk or docker is not installed. + +## USB Native Driver systems + +The usb driver is divided into a few sub-system, which can be individually enabled within the standard HBIOS config files. + +### base-drv + +The `base-drv` system contains the core code to discover, enumerate, and communicate to USB devices. + +It also includes the driver code for enumerate and operating USB devices on USB hubs. + +### scsi-drv + +The `scsi-drv` system can be enabled with the HBIOS config `CHSCSIENABLE` + +When activated, access to most USB mass storage devices (thumb drives, magnetic usb drives) is enabled. + +### ufi-drv + +The `ufi-drv` system can be enabled with the HBIOS config `CHUFIENABLE` + +When activated, access to 3.5" Floppy USB devices will be enabled. + +### keyboard + +The `keyboard` system can be enabled with the HBIOS config `USBKYBENABLE` + +When activated, usb keyboards can be used as input devices. + + diff --git a/Source/HBIOS/ch376-native/root.md b/Source/HBIOS/ch376-native/root.md deleted file mode 100644 index e69de29b..00000000 diff --git a/Source/HBIOS/ch376-native/scsi-drv.s b/Source/HBIOS/ch376-native/scsi-drv.s index 65cee345..d43a4464 100644 --- a/Source/HBIOS/ch376-native/scsi-drv.s +++ b/Source/HBIOS/ch376-native/scsi-drv.s @@ -1,3 +1,3 @@ ; Generated File -- not to be modify directly -#include "ch376-native/scsi-drv/scsi-init.c.s" #include "ch376-native/scsi-drv/class_scsi.c.s" +#include "ch376-native/scsi-drv/scsi-init.c.s" diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index ede7d8ac..b921d313 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/scsi-drv/./class_scsi.c.asm -- not to be modify directly +; Generated from source-doc/scsi-drv/class_scsi.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -62,7 +62,7 @@ _cbw: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/./class_scsi.c:12: usb_error do_scsi_cmd(device_config_storage *const dev, +;source-doc/scsi-drv/class_scsi.c:12: usb_error do_scsi_cmd(device_config_storage *const dev, ; --------------------------------- ; Function do_scsi_cmd ; --------------------------------- @@ -70,19 +70,16 @@ _do_scsi_cmd: push ix ld ix,0 add ix,sp - ld hl, -8 + ld hl, -6 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:17: cbw->dCBWTag[0] = next_tag++; +;source-doc/scsi-drv/class_scsi.c:17: cbw->dCBWTag[0] = next_tag++; ld c,(ix+6) ld b,(ix+7) ld hl,0x0004 add hl, bc ex (sp), hl - ld hl,_next_tag - ld e, (hl) - inc hl - ld d, (hl) + ld de,(_next_tag) ld hl, (_next_tag) inc hl ld (_next_tag), hl @@ -91,33 +88,31 @@ _do_scsi_cmd: ld (hl), e inc hl ld (hl), d -;source-doc/scsi-drv/./class_scsi.c:19: if (!send) +;source-doc/scsi-drv/class_scsi.c:19: if (!send) bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00102 -;source-doc/scsi-drv/./class_scsi.c:20: cbw->bmCBWFlags = 0x80; +;source-doc/scsi-drv/class_scsi.c:20: cbw->bmCBWFlags = 0x80; ld hl,0x000c add hl, bc ld (hl),0x80 l_do_scsi_cmd_00102: -;source-doc/scsi-drv/./class_scsi.c:22: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:22: critical_begin(); push bc call _critical_begin pop bc -;source-doc/scsi-drv/./class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT])); ld a,(ix+4) - ld (ix-6),a + ld (ix-4),a ld a,(ix+5) - ld (ix-5),a - ld a,(ix-6) + ld (ix-3),a + ld a,(ix-4) add a,0x03 - ld (ix-4),a - ld a,(ix-5) + ld (ix-2),a + ld a,(ix-3) adc a,0x00 - ld (ix-3),a - pop de - pop hl - push hl - push de + ld (ix-1),a + ld l,(ix-4) + ld h,(ix-3) ld a, (hl) rlca rlca @@ -127,8 +122,8 @@ l_do_scsi_cmd_00102: ld e,(ix+6) ld d,(ix+7) push bc - ld l,(ix-4) - ld h,(ix-3) + ld l,(ix-2) + ld h,(ix-1) push hl push af inc sp @@ -146,7 +141,7 @@ l_do_scsi_cmd_00102: ld a,(_result) or a jp NZ, l_do_scsi_cmd_00120 -;source-doc/scsi-drv/./class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { +;source-doc/scsi-drv/class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { ld hl,8 add hl, bc ld e, (hl) @@ -155,29 +150,26 @@ l_do_scsi_cmd_00102: inc hl ld c, (hl) inc hl - ld b, (hl) -;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); - ld a,(ix-6) - add a,0x06 - ld (ix-2),a - ld a,(ix-5) - adc a,0x00 - ld (ix-1),a -;source-doc/scsi-drv/./class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { - ld a, b + ld a, (hl) or c or d or e jr Z,l_do_scsi_cmd_00113 -;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); ld c,(ix+8) ld b,(ix+9) -;source-doc/scsi-drv/./class_scsi.c:28: if (!send) { +;source-doc/scsi-drv/class_scsi.c:28: if (!send) { bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 -;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); - ld l,(ix-6) - ld h,(ix-5) +;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); + ld a,(ix-4) + add a,0x06 + ld (ix-2),a + ld a,(ix-3) + adc a,0x00 + ld (ix-1),a + ld l,(ix-4) + ld h,(ix-3) ld a, (hl) rlca rlca @@ -203,17 +195,17 @@ l_do_scsi_cmd_00102: jr Z,l_do_scsi_cmd_00113 jp l_do_scsi_cmd_00120 l_do_scsi_cmd_00110: -;source-doc/scsi-drv/./class_scsi.c:34: &dev->endpoints[ENDPOINT_BULK_OUT])); - ld l,(ix-6) - ld h,(ix-5) +;source-doc/scsi-drv/class_scsi.c:34: &dev->endpoints[ENDPOINT_BULK_OUT])); + ld l,(ix-4) + ld h,(ix-3) ld a, (hl) rlca rlca rlca rlca and 0x0f - ld l,(ix-4) - ld h,(ix-3) + ld l,(ix-2) + ld h,(ix-1) push hl push af inc sp @@ -230,11 +222,15 @@ l_do_scsi_cmd_00110: or a jr NZ,l_do_scsi_cmd_00120 l_do_scsi_cmd_00113: -;source-doc/scsi-drv/./class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); - pop de - pop hl - push hl - push de +;source-doc/scsi-drv/class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); + ld a,(ix-4) + add a,0x06 + ld e, a + ld a,(ix-3) + adc a,0x00 + ld d, a + ld l,(ix-4) + ld h,(ix-3) ld a, (hl) rlca rlca @@ -242,9 +238,7 @@ l_do_scsi_cmd_00113: rlca and 0x0f ld b, a - ld l,(ix-2) - ld h,(ix-1) - push hl + push de push bc inc sp ld hl,0x000d @@ -261,40 +255,39 @@ l_do_scsi_cmd_00113: ld a,(_result) or a jr NZ,l_do_scsi_cmd_00120 -;source-doc/scsi-drv/./class_scsi.c:41: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) +;source-doc/scsi-drv/class_scsi.c:41: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) ld a, (_csw + 12) or a jr Z,l_do_scsi_cmd_00117 ld bc, (_csw + 4) pop hl + ld a,(hl) push hl - ld a, (hl) inc hl ld h, (hl) ld l, a - cp a - sbc hl, bc + xor a + sbc hl,bc jr Z,l_do_scsi_cmd_00117 -;source-doc/scsi-drv/./class_scsi.c:42: result = USB_ERR_FAIL; +;source-doc/scsi-drv/class_scsi.c:42: result = USB_ERR_FAIL; ld hl,_result ld (hl),0x0e jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00117: -;source-doc/scsi-drv/./class_scsi.c:44: result = USB_ERR_OK; +;source-doc/scsi-drv/class_scsi.c:44: result = USB_ERR_OK; ld hl,_result ld (hl),0x00 -;source-doc/scsi-drv/./class_scsi.c:46: done: +;source-doc/scsi-drv/class_scsi.c:46: done: l_do_scsi_cmd_00120: -;source-doc/scsi-drv/./class_scsi.c:47: critical_end(); +;source-doc/scsi-drv/class_scsi.c:47: critical_end(); call _critical_end -;source-doc/scsi-drv/./class_scsi.c:48: return result; - ld hl,_result - ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:49: } +;source-doc/scsi-drv/class_scsi.c:48: return result; + ld hl,(_result) +;source-doc/scsi-drv/class_scsi.c:49: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:53: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +;source-doc/scsi-drv/class_scsi.c:53: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { ; --------------------------------- ; Function get_scsi_read_capacity ; --------------------------------- @@ -305,31 +298,31 @@ _get_scsi_read_capacity: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity; +;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity; ld hl,15 add hl, sp ex de, hl - ld hl,_scsi_read_capacity ld bc,0x000c + ld hl,_scsi_read_capacity ldir -;source-doc/scsi-drv/./class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); +;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); ld (ix-19),0x08 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/./class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +;source-doc/scsi-drv/class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -343,11 +336,11 @@ _get_scsi_read_capacity: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:63: } +;source-doc/scsi-drv/class_scsi.c:63: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:67: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { +;source-doc/scsi-drv/class_scsi.c:67: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { ; --------------------------------- ; Function scsi_inquiry ; --------------------------------- @@ -358,31 +351,31 @@ _scsi_inquiry: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry; +;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry; ld hl,15 add hl, sp ex de, hl - ld hl,_scsi_packet_inquiry ld bc,0x000c + ld hl,_scsi_packet_inquiry ldir -;source-doc/scsi-drv/./class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; +;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; ld (ix-19),0x24 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/./class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +;source-doc/scsi-drv/class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -396,11 +389,11 @@ _scsi_inquiry: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:77: } +;source-doc/scsi-drv/class_scsi.c:77: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:79: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:79: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -411,38 +404,40 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,15 add hl, sp - ld b,0x0c + ld b,0x06 l_scsi_test_00103: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_scsi_test_00103 -;source-doc/scsi-drv/./class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,8 add hl, sp - ex de, hl xor a - ld (de), a - inc de - ld (de), a - inc de - ld (de), a - inc de - ld (de), a -;source-doc/scsi-drv/./class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a +;source-doc/scsi-drv/class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -455,11 +450,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:89: } +;source-doc/scsi-drv/class_scsi.c:89: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:93: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:93: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -470,31 +465,31 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,15 add hl, sp ex de, hl - ld hl,_scsi_packet_request_sense ld bc,0x000c + ld hl,_scsi_packet_request_sense ldir -;source-doc/scsi-drv/./class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/./class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/./class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld (ix-19),0x12 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/./class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -508,11 +503,11 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:103: } +;source-doc/scsi-drv/class_scsi.c:103: } ld sp,ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:105: usb_error scsi_sense_init(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:105: usb_error scsi_sense_init(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_sense_init ; --------------------------------- @@ -523,9 +518,9 @@ _scsi_sense_init: ld hl, -18 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:109: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:109: critical_begin(); call _critical_begin -;source-doc/scsi-drv/./class_scsi.c:110: while ((result = scsi_test(dev)) && --counter > 0) +;source-doc/scsi-drv/class_scsi.c:110: while ((result = scsi_test(dev)) && --counter > 0) ld c,0x03 l_scsi_sense_init_00102: push bc @@ -541,10 +536,10 @@ l_scsi_sense_init_00102: jr Z,l_scsi_sense_init_00104 dec c jr Z,l_scsi_sense_init_00104 -;source-doc/scsi-drv/./class_scsi.c:111: scsi_request_sense(dev, &response); - push bc - ld hl,2 +;source-doc/scsi-drv/class_scsi.c:111: scsi_request_sense(dev, &response); + ld hl,0 add hl, sp + push bc push hl ld l,(ix+4) ld h,(ix+5) @@ -555,16 +550,15 @@ l_scsi_sense_init_00102: pop bc jr l_scsi_sense_init_00102 l_scsi_sense_init_00104: -;source-doc/scsi-drv/./class_scsi.c:112: critical_end(); +;source-doc/scsi-drv/class_scsi.c:112: critical_end(); call _critical_end -;source-doc/scsi-drv/./class_scsi.c:114: return result; - ld hl,_result - ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:115: } +;source-doc/scsi-drv/class_scsi.c:114: return result; + ld hl,(_result) +;source-doc/scsi-drv/class_scsi.c:115: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:119: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:119: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -573,70 +567,67 @@ _scsi_read: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/./class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld hl,_cbw - ld b,0x1b -l_scsi_read_00112: ld (hl),0x00 - inc hl - djnz l_scsi_read_00112 -;source-doc/scsi-drv/./class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper; + ld e, l + ld d, h + inc de + ld bc,0x001a + ldir +;source-doc/scsi-drv/class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper; ld de,_cbw - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:123: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:123: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/./class_scsi.c:124: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/./class_scsi.c:125: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 - ld ((_cbw + 8)), hl + ld (_cbw + 8),hl ld h, l - ld ((_cbw + 8)+2), hl -;source-doc/scsi-drv/./class_scsi.c:127: cbw.scsi_cmd.operation_code = 0x28; // read operation + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/class_scsi.c:127: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/./class_scsi.c:128: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:128: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/./class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld c,(ix+4) ld b,(ix+5) ld hl,0x000c add hl, bc - ex (sp), hl - pop hl + pop af push hl inc hl inc hl inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/./class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; pop hl push hl inc hl inc hl - inc hl - dec hl ld a, (hl) ld ((_cbw + 18)),a -;source-doc/scsi-drv/./class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; pop hl push hl inc hl - ld d, (hl) - ld hl, +(_cbw + 19) - ld (hl), d -;source-doc/scsi-drv/./class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld a,(hl) + ld ((_cbw + 19)),a +;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba; pop hl + ld a,(hl) push hl - ld a, (hl) ld ((_cbw + 20)),a -;source-doc/scsi-drv/./class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;source-doc/scsi-drv/class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -653,14 +644,14 @@ l_scsi_read_00112: inc sp ld a, l ld (_result), a -;source-doc/scsi-drv/./class_scsi.c:136: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:136: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/./class_scsi.c:137: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:137: dev->current_lba++; pop hl + ld c,(hl) push hl - ld c, (hl) inc hl ld b, (hl) inc hl @@ -668,11 +659,11 @@ l_scsi_read_00112: inc hl ld d, (hl) inc c - jr NZ,l_scsi_read_00114 + jr NZ,l_scsi_read_00112 inc b - jr NZ,l_scsi_read_00114 + jr NZ,l_scsi_read_00112 inc de -l_scsi_read_00114: +l_scsi_read_00112: pop hl push hl ld (hl), c @@ -683,14 +674,13 @@ l_scsi_read_00114: inc hl ld (hl), d l_scsi_read_00102: -;source-doc/scsi-drv/./class_scsi.c:138: return result; - ld hl,_result - ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:139: } +;source-doc/scsi-drv/class_scsi.c:138: return result; + ld hl,(_result) +;source-doc/scsi-drv/class_scsi.c:139: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -699,70 +689,67 @@ _scsi_write: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/./class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld hl,_cbw - ld b,0x1b -l_scsi_write_00112: ld (hl),0x00 - inc hl - djnz l_scsi_write_00112 -;source-doc/scsi-drv/./class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper; + ld e, l + ld d, h + inc de + ld bc,0x001a + ldir +;source-doc/scsi-drv/class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper; ld de,_cbw - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:145: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:145: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/./class_scsi.c:146: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/./class_scsi.c:147: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 - ld ((_cbw + 8)), hl + ld (_cbw + 8),hl ld h, l - ld ((_cbw + 8)+2), hl -;source-doc/scsi-drv/./class_scsi.c:149: cbw.scsi_cmd.operation_code = 0x2A; // write operation + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/class_scsi.c:149: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/./class_scsi.c:150: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:150: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/./class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld c,(ix+4) ld b,(ix+5) ld hl,0x000c add hl, bc - ex (sp), hl - pop hl + pop af push hl inc hl inc hl inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/./class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; pop hl push hl inc hl inc hl - inc hl - dec hl ld a, (hl) ld ((_cbw + 18)),a -;source-doc/scsi-drv/./class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; pop hl push hl inc hl - ld d, (hl) - ld hl, +(_cbw + 19) - ld (hl), d -;source-doc/scsi-drv/./class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld a,(hl) + ld ((_cbw + 19)),a +;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba; pop hl + ld a,(hl) push hl - ld a, (hl) ld ((_cbw + 20)),a -;source-doc/scsi-drv/./class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;source-doc/scsi-drv/class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) ld a,0x01 @@ -779,14 +766,14 @@ l_scsi_write_00112: inc sp ld a, l ld (_result), a -;source-doc/scsi-drv/./class_scsi.c:158: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:158: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/./class_scsi.c:159: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:159: dev->current_lba++; pop hl + ld c,(hl) push hl - ld c, (hl) inc hl ld b, (hl) inc hl @@ -794,11 +781,11 @@ l_scsi_write_00112: inc hl ld d, (hl) inc c - jr NZ,l_scsi_write_00114 + jr NZ,l_scsi_write_00112 inc b - jr NZ,l_scsi_write_00114 + jr NZ,l_scsi_write_00112 inc de -l_scsi_write_00114: +l_scsi_write_00112: pop hl push hl ld (hl), c @@ -809,14 +796,13 @@ l_scsi_write_00114: inc hl ld (hl), d l_scsi_write_00102: -;source-doc/scsi-drv/./class_scsi.c:160: return result; - ld hl,_result - ld l, (hl) -;source-doc/scsi-drv/./class_scsi.c:161: } +;source-doc/scsi-drv/class_scsi.c:160: return result; + ld hl,(_result) +;source-doc/scsi-drv/class_scsi.c:161: } ld sp, ix pop ix ret -;source-doc/scsi-drv/./class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_eject ; --------------------------------- @@ -827,44 +813,46 @@ _scsi_eject: ld hl, -21 add hl, sp ld sp, hl -;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ex de, hl - ld hl,_scsi_command_block_wrapper ld bc,0x000f + ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/./class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); +;source-doc/scsi-drv/class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); ld hl,15 add hl, sp - ld b,0x06 + ld b,0x03 l_scsi_eject_00103: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_scsi_eject_00103 -;source-doc/scsi-drv/./class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B; +;source-doc/scsi-drv/class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B; ld (ix-6),0x1b -;source-doc/scsi-drv/./class_scsi.c:170: cbw_scsi.eject.loej = 1; +;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.loej = 1; ld hl,19 add hl, sp set 1, (hl) -;source-doc/scsi-drv/./class_scsi.c:172: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-8),0x00 -;source-doc/scsi-drv/./class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); ld (ix-7),0x06 -;source-doc/scsi-drv/./class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,8 add hl, sp - ex de, hl xor a - ld (de), a - inc de - ld (de), a - inc de - ld (de), a - inc de - ld (de), a -;source-doc/scsi-drv/./class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a + inc hl + ld (hl),a +;source-doc/scsi-drv/class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -877,7 +865,7 @@ l_scsi_eject_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/./class_scsi.c:177: } +;source-doc/scsi-drv/class_scsi.c:177: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index ca652a68..2009fae2 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/scsi-drv/./scsi-init.c.asm -- not to be modify directly +; Generated from source-doc/scsi-drv/scsi-init.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/./scsi-init.c:13: void chscsi_init(void) { +;source-doc/scsi-drv/scsi-init.c:13: void chscsi_init(void) { ; --------------------------------- ; Function chscsi_init ; --------------------------------- @@ -57,30 +57,30 @@ _chscsi_init: ld ix,0 add ix,sp dec sp -;source-doc/scsi-drv/./scsi-init.c:15: do { +;source-doc/scsi-drv/scsi-init.c:15: do { ld (ix-1),0x01 l_chscsi_init_00105: -;source-doc/scsi-drv/./scsi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +;source-doc/scsi-drv/scsi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); ld a,(ix-1) call _get_usb_device_config -;source-doc/scsi-drv/./scsi-init.c:18: if (storage_device == NULL) +;source-doc/scsi-drv/scsi-init.c:18: if (storage_device == NULL) ld a, d or e jr Z,l_chscsi_init_00108 -;source-doc/scsi-drv/./scsi-init.c:21: const usb_device_type t = storage_device->type; +;source-doc/scsi-drv/scsi-init.c:21: const usb_device_type t = storage_device->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/scsi-drv/./scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { +;source-doc/scsi-drv/scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/./scsi-init.c:24: print_string("\r\nUSB: MASS STORAGE @ $"); +;source-doc/scsi-drv/scsi-init.c:24: print_string("\r\nUSB: MASS STORAGE @ $"); push de ld hl,scsi_init_str_0 call _print_string pop de -;source-doc/scsi-drv/./scsi-init.c:25: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:25: print_uint16(index); ld l,(ix-1) ld h,0x00 push de @@ -88,23 +88,23 @@ l_chscsi_init_00105: ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/./scsi-init.c:28: scsi_sense_init(storage_device); +;source-doc/scsi-drv/scsi-init.c:28: scsi_sense_init(storage_device); push de push de call _scsi_sense_init pop af pop de -;source-doc/scsi-drv/./scsi-init.c:29: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/scsi-init.c:29: dio_add_entry(ch_scsi_fntbl, storage_device); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/./scsi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/./scsi-init.c:33: } +;source-doc/scsi-drv/scsi-init.c:33: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/depends.d b/Source/HBIOS/ch376-native/source-doc/depends.d deleted file mode 100644 index 084400b5..00000000 --- a/Source/HBIOS/ch376-native/source-doc/depends.d +++ /dev/null @@ -1,30 +0,0 @@ - -./base-drv/dev_transfers.c: base-drv/dev_transfers.c ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/protocol.h -./base-drv/critical-section.c: base-drv/critical-section.c ././source-doc/base-drv/critical-section.h -./base-drv/enumerate.c: base-drv/enumerate.c ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/print.h -./base-drv/usb_state.c: base-drv/usb_state.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/work-area.h -./base-drv/class_hub.c: base-drv/class_hub.c ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h -./base-drv/enumerate_storage.c: base-drv/enumerate_storage.c ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h -./base-drv/enumerate_hub.c: base-drv/enumerate_hub.c ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/work-area.h -./base-drv/usb-base-drv.c: base-drv/usb-base-drv.c ././source-doc/base-drv/usb-base-drv.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h -./base-drv/transfers.c: base-drv/transfers.c ././source-doc/base-drv/transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/z80.h ././source-doc/base-drv/ez80-helpers.h ././source-doc/base-drv/print.h -./base-drv/ch376.c: base-drv/ch376.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/ez80-helpers.h ././source-doc/base-drv/print.h -./base-drv/protocol.c: base-drv/protocol.c ././source-doc/base-drv/protocol.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/ez80-helpers.h ././source-doc/base-drv/print.h -./base-drv/work-area.c: base-drv/work-area.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h -./base-drv/usb-init.c: base-drv/usb-init.c ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/print.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/z80.h -./ufi-drv/ufi-init.c: ufi-drv/ufi-init.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h -./ufi-drv/usb_cbi.c: ufi-drv/usb_cbi.c ././source-doc/ufi-drv/usb_cbi.h -./ufi-drv/class_ufi.c: ufi-drv/class_ufi.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h -./keyboard/kyb-init.c: keyboard/kyb-init.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h ././source-doc/keyboard/class_hid_keyboard.h -./keyboard/class_hid.c: keyboard/class_hid.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h -./keyboard/class_hid_keyboard.c: keyboard/class_hid_keyboard.c ././source-doc/keyboard/class_hid_keyboard.h -./scsi-drv/scsi-init.c: scsi-drv/scsi-init.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h -./scsi-drv/class_scsi.c: scsi-drv/class_scsi.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h -## -./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./critical-section.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s -## -./scsi-drv.s: scsi-drv/./scsi-init.c.s scsi-drv/./class_scsi.c.s -## -./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s -## -./keyboard.s: keyboard/./kyb-init.c.s keyboard/./class_hid.c.s keyboard/./class_hid_keyboard.c.s diff --git a/Source/HBIOS/ch376-native/ufi-drv.s b/Source/HBIOS/ch376-native/ufi-drv.s index 5ed7edf6..d900a14a 100644 --- a/Source/HBIOS/ch376-native/ufi-drv.s +++ b/Source/HBIOS/ch376-native/ufi-drv.s @@ -1,4 +1,4 @@ ; Generated File -- not to be modify directly +#include "ch376-native/ufi-drv/class_ufi.c.s" #include "ch376-native/ufi-drv/ufi-init.c.s" #include "ch376-native/ufi-drv/usb_cbi.c.s" -#include "ch376-native/ufi-drv/class_ufi.c.s" diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index 4f118b63..702a6eb0 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/ufi-drv/./class_ufi.c.asm -- not to be modify directly +; Generated from source-doc/ufi-drv/class_ufi.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/./class_ufi.c:14: uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeout_counter) { +;source-doc/ufi-drv/class_ufi.c:14: uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeout_counter) { ; --------------------------------- ; Function wait_for_device_ready ; --------------------------------- @@ -59,18 +59,21 @@ _wait_for_device_ready: ld hl, -18 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:18: do { +;source-doc/ufi-drv/class_ufi.c:18: do { ld c,(ix+6) l_wait_for_device_ready_00105: -;source-doc/ufi-drv/./class_ufi.c:19: memset(&sense, 0, sizeof(sense)); +;source-doc/ufi-drv/class_ufi.c:19: memset(&sense, 0, sizeof(sense)); ld hl,0 add hl, sp - ld b,0x12 + ld b,0x09 l_wait_for_device_ready_00132: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_wait_for_device_ready_00132 -;source-doc/ufi-drv/./class_ufi.c:20: result = ufi_test_unit_ready(storage_device, &sense); +;source-doc/ufi-drv/class_ufi.c:20: result = ufi_test_unit_ready(storage_device, &sense); push bc ld hl,2 add hl, sp @@ -84,11 +87,11 @@ l_wait_for_device_ready_00132: ld a, l pop bc ld b, a -;source-doc/ufi-drv/./class_ufi.c:22: if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) - ld hl,0+1+1 - add hl,sp +;source-doc/ufi-drv/class_ufi.c:22: if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) or a jr NZ,l_wait_for_device_ready_00104 + ld hl,2 + add hl, sp ld a, (hl) and 0x0f jr Z,l_wait_for_device_ready_00107 @@ -97,19 +100,21 @@ l_wait_for_device_ready_00104: dec c or a jr Z,l_wait_for_device_ready_00107 -;source-doc/ufi-drv/./class_ufi.c:25: delay_medium(); +;source-doc/ufi-drv/class_ufi.c:25: delay_medium(); push bc call _delay_medium pop bc -;source-doc/ufi-drv/./class_ufi.c:27: } while (true); +;source-doc/ufi-drv/class_ufi.c:27: } while (true); jr l_wait_for_device_ready_00105 l_wait_for_device_ready_00107: -;source-doc/ufi-drv/./class_ufi.c:29: return result | sense.sense_key; +;source-doc/ufi-drv/class_ufi.c:29: return result | sense.sense_key; + ld hl,2 + add hl, sp ld a, (hl) and 0x0f or b ld l, a -;source-doc/ufi-drv/./class_ufi.c:30: } +;source-doc/ufi-drv/class_ufi.c:30: } ld sp, ix pop ix ret @@ -178,7 +183,7 @@ __ufi_cmd_send_diagnostic: DEFB +0x00 DEFB +0x00 DEFB +0x00 -;source-doc/ufi-drv/./class_ufi.c:32: usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_sense_response const *response) { +;source-doc/ufi-drv/class_ufi.c:32: usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_sense_response const *response) { ; --------------------------------- ; Function ufi_test_unit_ready ; --------------------------------- @@ -189,18 +194,20 @@ _ufi_test_unit_ready: ld hl, -24 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:35: memset(&ufi_cmd_request_test_unit_ready, 0, sizeof(ufi_test_unit_ready_command)); +;source-doc/ufi-drv/class_ufi.c:35: memset(&ufi_cmd_request_test_unit_ready, 0, sizeof(ufi_test_unit_ready_command)); ld hl,0 add hl, sp - ex de, hl - ld l, e - ld h, d - ld b,0x0c + ld e,l + ld d,h + ld b,0x06 l_ufi_test_unit_ready_00104: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_ufi_test_unit_ready_00104 -;source-doc/ufi-drv/./class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); +;source-doc/ufi-drv/class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); ld hl,0x0000 push hl push hl @@ -216,22 +223,20 @@ l_ufi_test_unit_ready_00104: ld hl,11 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:40: ufi_cmd_request_sense = _ufi_cmd_request_sense; +;source-doc/ufi-drv/class_ufi.c:40: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,12 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,__ufi_cmd_request_sense + ld e,l + ld d,h + push hl ld bc,0x000c + ld hl,__ufi_cmd_request_sense ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:43: (uint8_t *)response, NULL); +;source-doc/ufi-drv/class_ufi.c:43: (uint8_t *)response, NULL); ld e,(ix+6) ld d,(ix+7) -;source-doc/ufi-drv/./class_ufi.c:42: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), +;source-doc/ufi-drv/class_ufi.c:42: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), ld hl,0x0000 push hl push de @@ -245,12 +250,12 @@ l_ufi_test_unit_ready_00104: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:46: return result; -;source-doc/ufi-drv/./class_ufi.c:47: } +;source-doc/ufi-drv/class_ufi.c:46: return result; +;source-doc/ufi-drv/class_ufi.c:47: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:49: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { +;source-doc/ufi-drv/class_ufi.c:49: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { ; --------------------------------- ; Function ufi_request_sense ; --------------------------------- @@ -261,19 +266,17 @@ _ufi_request_sense: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:51: ufi_cmd_request_sense = _ufi_cmd_request_sense; +;source-doc/ufi-drv/class_ufi.c:51: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,__ufi_cmd_request_sense + ld e,l + ld d,h + push hl ld bc,0x000c + ld hl,__ufi_cmd_request_sense ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:53: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), +;source-doc/ufi-drv/class_ufi.c:53: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), ld e,(ix+6) ld d,(ix+7) ld hl,0x0000 @@ -289,12 +292,12 @@ _ufi_request_sense: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:58: return result; -;source-doc/ufi-drv/./class_ufi.c:59: } +;source-doc/ufi-drv/class_ufi.c:58: return result; +;source-doc/ufi-drv/class_ufi.c:59: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:61: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { +;source-doc/ufi-drv/class_ufi.c:61: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { ; --------------------------------- ; Function ufi_read_frmt_caps ; --------------------------------- @@ -305,14 +308,14 @@ _ufi_read_frmt_caps: ld hl, -24 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:65: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities; +;source-doc/ufi-drv/class_ufi.c:65: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities; ld hl,0 add hl, sp ex de, hl - ld hl,__ufi_cmd_read_format_capacitie ld bc,0x000c + ld hl,__ufi_cmd_read_format_capacitie ldir -;source-doc/ufi-drv/./class_ufi.c:66: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); +;source-doc/ufi-drv/class_ufi.c:66: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL); ld c,(ix+6) ld b,(ix+7) push bc @@ -339,24 +342,24 @@ _ufi_read_frmt_caps: inc sp ld e, l pop bc -;source-doc/ufi-drv/./class_ufi.c:69: CHECK(result); +;source-doc/ufi-drv/class_ufi.c:69: CHECK(result); ld a,e - ld d,a + ld l,a or a jr NZ,l_ufi_read_frmt_caps_00103 -;source-doc/ufi-drv/./class_ufi.c:71: const uint8_t available_length = response->capacity_list_length; +;source-doc/ufi-drv/class_ufi.c:71: const uint8_t available_length = response->capacity_list_length; ld e,(ix+6) ld d,(ix+7) ld hl,3 add hl, de ld e, (hl) -;source-doc/ufi-drv/./class_ufi.c:73: const uint8_t max_length = +;source-doc/ufi-drv/class_ufi.c:73: const uint8_t max_length = ld a,0x24 sub e jr NC,l_ufi_read_frmt_caps_00106 ld e,0x24 l_ufi_read_frmt_caps_00106: -;source-doc/ufi-drv/./class_ufi.c:77: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); +;source-doc/ufi-drv/class_ufi.c:77: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); push de push bc ex de, hl @@ -369,11 +372,11 @@ l_ufi_read_frmt_caps_00106: ldir pop bc pop de -;source-doc/ufi-drv/./class_ufi.c:78: cmd.allocation_length[1] = max_length; +;source-doc/ufi-drv/class_ufi.c:78: cmd.allocation_length[1] = max_length; ld (ix-4),e -;source-doc/ufi-drv/./class_ufi.c:80: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); - ld d,0x00 +;source-doc/ufi-drv/class_ufi.c:80: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL); ld hl,0x0000 + ld d,l push hl push bc push de @@ -393,16 +396,14 @@ l_ufi_read_frmt_caps_00106: pop af pop af inc sp - ld d, l -;source-doc/ufi-drv/./class_ufi.c:84: done: +;source-doc/ufi-drv/class_ufi.c:84: done: l_ufi_read_frmt_caps_00103: -;source-doc/ufi-drv/./class_ufi.c:85: return result; - ld l, d -;source-doc/ufi-drv/./class_ufi.c:86: } +;source-doc/ufi-drv/class_ufi.c:85: return result; +;source-doc/ufi-drv/class_ufi.c:86: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:88: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { +;source-doc/ufi-drv/class_ufi.c:88: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { ; --------------------------------- ; Function ufi_inquiry ; --------------------------------- @@ -413,19 +414,17 @@ _ufi_inquiry: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:90: ufi_cmd_inquiry = _ufi_cmd_inquiry; +;source-doc/ufi-drv/class_ufi.c:90: ufi_cmd_inquiry = _ufi_cmd_inquiry; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,__ufi_cmd_inquiry + ld e,l + ld d,h + push hl ld bc,0x000c + ld hl,__ufi_cmd_inquiry ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:92: usb_error result = +;source-doc/ufi-drv/class_ufi.c:92: usb_error result = ld e,(ix+6) ld d,(ix+7) ld hl,0x0000 @@ -441,12 +440,12 @@ _ufi_inquiry: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:97: return result; -;source-doc/ufi-drv/./class_ufi.c:98: } +;source-doc/ufi-drv/class_ufi.c:97: return result; +;source-doc/ufi-drv/class_ufi.c:98: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:100: usb_error ufi_read_write_sector(device_config *const storage_device, +;source-doc/ufi-drv/class_ufi.c:100: usb_error ufi_read_write_sector(device_config *const storage_device, ; --------------------------------- ; Function ufi_read_write_sector ; --------------------------------- @@ -457,15 +456,22 @@ _ufi_read_write_sector: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:107: memset(&cmd, 0, sizeof(cmd)); +;source-doc/ufi-drv/class_ufi.c:107: memset(&cmd, 0, sizeof(cmd)); ld hl,0 add hl, sp - ld b,0x0c + ld e,l + ld d,h + ld b,0x06 l_ufi_read_write_sector_00113: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_ufi_read_write_sector_00113 -;source-doc/ufi-drv/./class_ufi.c:108: cmd.operation_code = send ? 0x2A : 0x28; +;source-doc/ufi-drv/class_ufi.c:108: cmd.operation_code = send ? 0x2A : 0x28; + ld c, e + ld b, d bit 0,(ix+6) jr Z,l_ufi_read_write_sector_00104 ld a,0x2a @@ -473,18 +479,17 @@ l_ufi_read_write_sector_00113: l_ufi_read_write_sector_00104: ld a,0x28 l_ufi_read_write_sector_00105: - ld (ix-12),a -;source-doc/ufi-drv/./class_ufi.c:109: cmd.lba[2] = sector_number >> 8; + ld (bc), a +;source-doc/ufi-drv/class_ufi.c:109: cmd.lba[2] = sector_number >> 8; ld a,(ix+8) ld (ix-8),a -;source-doc/ufi-drv/./class_ufi.c:110: cmd.lba[3] = sector_number & 0xFF; +;source-doc/ufi-drv/class_ufi.c:110: cmd.lba[3] = sector_number & 0xFF; ld a,(ix+7) ld (ix-7),a -;source-doc/ufi-drv/./class_ufi.c:111: cmd.transfer_length[1] = sector_count; +;source-doc/ufi-drv/class_ufi.c:111: cmd.transfer_length[1] = sector_count; +;source-doc/ufi-drv/class_ufi.c:113: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); ld a,(ix+9) ld (ix-4),a -;source-doc/ufi-drv/./class_ufi.c:113: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); - ld a,(ix+9) add a, a ld c,0x00 ld l,(ix+12) @@ -498,19 +503,17 @@ l_ufi_read_write_sector_00105: ld a,(ix+6) push af inc sp - ld hl,7 - add hl, sp - push hl + push de ld l,(ix+4) ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:117: return result; -;source-doc/ufi-drv/./class_ufi.c:118: } +;source-doc/ufi-drv/class_ufi.c:117: return result; +;source-doc/ufi-drv/class_ufi.c:118: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:127: usb_error ufi_format(device_config *const storage_device, +;source-doc/ufi-drv/class_ufi.c:127: usb_error ufi_format(device_config *const storage_device, ; --------------------------------- ; Function ufi_format ; --------------------------------- @@ -521,33 +524,36 @@ _ufi_format: ld hl, -26 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:134: memset(¶meter_list, 0, sizeof(parameter_list)); +;source-doc/ufi-drv/class_ufi.c:134: memset(¶meter_list, 0, sizeof(parameter_list)); ld hl,2 add hl, sp push hl - ld b,0x0c + ld b,0x06 l_ufi_format_00104: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_ufi_format_00104 pop bc -;source-doc/ufi-drv/./class_ufi.c:137: cmd = _ufi_cmd_format; +;source-doc/ufi-drv/class_ufi.c:137: cmd = _ufi_cmd_format; ld hl,14 add hl, sp ex de, hl push bc - ld hl,__ufi_cmd_format ld bc,0x000c + ld hl,__ufi_cmd_format ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:140: cmd.track_number = track_number; +;source-doc/ufi-drv/class_ufi.c:140: cmd.track_number = track_number; ld a,(ix+7) ld (ix-10),a -;source-doc/ufi-drv/./class_ufi.c:141: cmd.interleave[1] = 0; +;source-doc/ufi-drv/class_ufi.c:141: cmd.interleave[1] = 0; ld (ix-8),0x00 -;source-doc/ufi-drv/./class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); +;source-doc/ufi-drv/class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); ld (ix-4),0x0c -;source-doc/ufi-drv/./class_ufi.c:144: parameter_list.defect_list_header.side = side; +;source-doc/ufi-drv/class_ufi.c:144: parameter_list.defect_list_header.side = side; ld e, c ld d, b inc de @@ -558,49 +564,46 @@ l_ufi_format_00104: and 0xfe or l ld (de), a -;source-doc/ufi-drv/./class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; +;source-doc/ufi-drv/class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; ld l, e ld h, d res 1, (hl) -;source-doc/ufi-drv/./class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; +;source-doc/ufi-drv/class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; ld l, e ld h, d ld a, (hl) and 0xf3 ld (hl), a -;source-doc/ufi-drv/./class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; +;source-doc/ufi-drv/class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; ld l, e ld h, d set 4, (hl) -;source-doc/ufi-drv/./class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; +;source-doc/ufi-drv/class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; ld l, e ld h, d set 5, (hl) -;source-doc/ufi-drv/./class_ufi.c:149: parameter_list.defect_list_header.extend = 0; +;source-doc/ufi-drv/class_ufi.c:149: parameter_list.defect_list_header.extend = 0; ld l, e ld h, d res 6, (hl) -;source-doc/ufi-drv/./class_ufi.c:150: parameter_list.defect_list_header.fov = 1; +;source-doc/ufi-drv/class_ufi.c:150: parameter_list.defect_list_header.fov = 1; ex de, hl set 7, (hl) -;source-doc/ufi-drv/./class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; +;source-doc/ufi-drv/class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; ld (ix-22),0x00 -;source-doc/ufi-drv/./class_ufi.c:152: parameter_list.defect_list_header.defect_list_length_lsb = 8; +;source-doc/ufi-drv/class_ufi.c:152: parameter_list.defect_list_header.defect_list_length_lsb = 8; ld (ix-21),0x08 -;source-doc/ufi-drv/./class_ufi.c:153: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); +;source-doc/ufi-drv/class_ufi.c:153: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); ld e,(ix+8) ld d,(ix+9) push bc - ld l, e - ld h, d - ex de, hl ld hl,8 add hl, sp ex de, hl ld bc,0x0008 ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:155: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, +;source-doc/ufi-drv/class_ufi.c:155: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, ld hl,0 add hl, sp push hl @@ -617,12 +620,12 @@ l_ufi_format_00104: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:162: return result; -;source-doc/ufi-drv/./class_ufi.c:163: } +;source-doc/ufi-drv/class_ufi.c:162: return result; +;source-doc/ufi-drv/class_ufi.c:163: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:165: usb_error ufi_send_diagnostics(device_config *const storage_device) { +;source-doc/ufi-drv/class_ufi.c:165: usb_error ufi_send_diagnostics(device_config *const storage_device) { ; --------------------------------- ; Function ufi_send_diagnostics ; --------------------------------- @@ -633,19 +636,17 @@ _ufi_send_diagnostics: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/./class_ufi.c:168: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; +;source-doc/ufi-drv/class_ufi.c:168: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; ld hl,0 add hl, sp - ld c, l - ld b, h - ld e, c - ld d, b - push bc - ld hl,__ufi_cmd_send_diagnostic + ld e,l + ld d,h + push hl ld bc,0x000c + ld hl,__ufi_cmd_send_diagnostic ldir pop bc -;source-doc/ufi-drv/./class_ufi.c:170: return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); +;source-doc/ufi-drv/class_ufi.c:170: return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); ld hl,0x0000 push hl push hl @@ -658,11 +659,11 @@ _ufi_send_diagnostics: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/./class_ufi.c:171: } +;source-doc/ufi-drv/class_ufi.c:171: } ld sp,ix pop ix ret -;source-doc/ufi-drv/./class_ufi.c:173: uint32_t convert_from_msb_first(const uint8_t *const buffer) { +;source-doc/ufi-drv/class_ufi.c:173: uint32_t convert_from_msb_first(const uint8_t *const buffer) { ; --------------------------------- ; Function convert_from_msb_first ; --------------------------------- @@ -672,40 +673,40 @@ _convert_from_msb_first: add ix,sp push af push af -;source-doc/ufi-drv/./class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); +;source-doc/ufi-drv/class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); ld hl,0 add hl, sp ex de, hl -;source-doc/ufi-drv/./class_ufi.c:176: const uint8_t *p_input = buffer + 3; +;source-doc/ufi-drv/class_ufi.c:176: const uint8_t *p_input = buffer + 3; ld c,(ix+4) ld b,(ix+5) inc bc inc bc inc bc -;source-doc/ufi-drv/./class_ufi.c:178: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:178: *p_output++ = *p_input--; ld a, (bc) dec bc ld (de), a inc de -;source-doc/ufi-drv/./class_ufi.c:179: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:179: *p_output++ = *p_input--; ld a, (bc) dec bc ld (de), a inc de -;source-doc/ufi-drv/./class_ufi.c:180: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:180: *p_output++ = *p_input--; ld a, (bc) ld (de), a inc de -;source-doc/ufi-drv/./class_ufi.c:181: *p_output = *p_input--; +;source-doc/ufi-drv/class_ufi.c:181: *p_output = *p_input--; dec bc ld a, (bc) ld (de), a -;source-doc/ufi-drv/./class_ufi.c:183: return result; +;source-doc/ufi-drv/class_ufi.c:183: return result; pop hl push hl ld e,(ix-2) ld d,(ix-1) -;source-doc/ufi-drv/./class_ufi.c:184: } +;source-doc/ufi-drv/class_ufi.c:184: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 13311dc6..a3f39762 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/ufi-drv/./ufi-init.c.asm -- not to be modify directly +; Generated from source-doc/ufi-drv/ufi-init.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/./ufi-init.c:11: void chufi_init(void) { +;source-doc/ufi-drv/ufi-init.c:11: void chufi_init(void) { ; --------------------------------- ; Function chufi_init ; --------------------------------- @@ -57,30 +57,30 @@ _chufi_init: ld ix,0 add ix,sp dec sp -;source-doc/ufi-drv/./ufi-init.c:14: do { +;source-doc/ufi-drv/ufi-init.c:14: do { ld (ix-1),0x01 l_chufi_init_00105: -;source-doc/ufi-drv/./ufi-init.c:15: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +;source-doc/ufi-drv/ufi-init.c:15: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); ld a,(ix-1) call _get_usb_device_config -;source-doc/ufi-drv/./ufi-init.c:17: if (storage_device == NULL) +;source-doc/ufi-drv/ufi-init.c:17: if (storage_device == NULL) ld a, d or e jr Z,l_chufi_init_00108 -;source-doc/ufi-drv/./ufi-init.c:20: const usb_device_type t = storage_device->type; +;source-doc/ufi-drv/ufi-init.c:20: const usb_device_type t = storage_device->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/ufi-drv/./ufi-init.c:22: if (t == USB_IS_FLOPPY) { +;source-doc/ufi-drv/ufi-init.c:22: if (t == USB_IS_FLOPPY) { dec a jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/./ufi-init.c:23: print_string("\r\nUSB: FLOPPY @ $"); +;source-doc/ufi-drv/ufi-init.c:23: print_string("\r\nUSB: FLOPPY @ $"); push de ld hl,ufi_init_str_0 call _print_string pop de -;source-doc/ufi-drv/./ufi-init.c:24: print_uint16(index); +;source-doc/ufi-drv/ufi-init.c:24: print_uint16(index); ld l,(ix-1) ld h,0x00 push de @@ -88,17 +88,17 @@ l_chufi_init_00105: ld hl,ufi_init_str_1 call _print_string pop de -;source-doc/ufi-drv/./ufi-init.c:26: dio_add_entry(ch_ufi_fntbl, storage_device); +;source-doc/ufi-drv/ufi-init.c:26: dio_add_entry(ch_ufi_fntbl, storage_device); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/./ufi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 l_chufi_init_00108: -;source-doc/ufi-drv/./ufi-init.c:30: } +;source-doc/ufi-drv/ufi-init.c:30: } inc sp pop ix ret @@ -110,7 +110,7 @@ ufi_init_str_0: ufi_init_str_1: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/./ufi-init.c:32: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:32: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -121,15 +121,18 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:34: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/ufi-init.c:34: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp - ld b,0x24 + ld b,0x12 l_chufi_get_cap_00112: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/./ufi-init.c:36: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:36: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -139,7 +142,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:40: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/ufi-init.c:40: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -148,7 +151,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/./ufi-init.c:42: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/ufi-init.c:42: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -158,7 +161,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/./ufi-init.c:44: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/ufi-init.c:44: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -169,27 +172,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/./ufi-init.c:45: if (result != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:45: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/./ufi-init.c:46: return 0; +;source-doc/ufi-drv/ufi-init.c:46: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/./ufi-init.c:48: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/ufi-init.c:48: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/./ufi-init.c:49: } +;source-doc/ufi-drv/ufi-init.c:49: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./ufi-init.c:51: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:51: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -200,7 +203,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:53: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:53: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -211,23 +214,22 @@ _chufi_read: call _wait_for_device_ready pop af inc sp - ld e, l + ld a, l pop bc - ld a, e or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/./ufi-init.c:54: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:54: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/./ufi-init.c:59: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:59: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/./ufi-init.c:61: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:61: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -260,21 +262,24 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/./ufi-init.c:62: return -1; // general error +;source-doc/ufi-drv/ufi-init.c:62: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/./ufi-init.c:65: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:65: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp - ld b,0x12 + ld b,0x09 l_chufi_read_00139: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/./ufi-init.c:67: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:67: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -285,29 +290,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/./ufi-init.c:68: return -1; // error +;source-doc/ufi-drv/ufi-init.c:68: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/./ufi-init.c:72: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:72: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/./ufi-init.c:74: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:74: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/./ufi-init.c:75: return -1; +;source-doc/ufi-drv/ufi-init.c:75: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/./ufi-init.c:77: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:77: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/./ufi-init.c:78: } +;source-doc/ufi-drv/ufi-init.c:78: } ld sp, ix pop ix ret -;source-doc/ufi-drv/./ufi-init.c:80: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:80: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -318,7 +323,7 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/./ufi-init.c:82: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:82: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -329,23 +334,22 @@ _chufi_write: call _wait_for_device_ready pop af inc sp - ld e, l + ld a, l pop bc - ld a, e or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/./ufi-init.c:83: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:83: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/./ufi-init.c:87: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:87: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/./ufi-init.c:88: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:88: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -378,21 +382,24 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/./ufi-init.c:89: return -1; +;source-doc/ufi-drv/ufi-init.c:89: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/./ufi-init.c:93: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:93: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp - ld b,0x12 + ld b,0x09 l_chufi_write_00139: - ld (hl),0x00 + xor a + ld (hl), a + inc hl + ld (hl), a inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/./ufi-init.c:95: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:95: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -403,25 +410,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/./ufi-init.c:96: return -1; +;source-doc/ufi-drv/ufi-init.c:96: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/./ufi-init.c:101: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:101: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/./ufi-init.c:103: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:103: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/./ufi-init.c:104: return -1; +;source-doc/ufi-drv/ufi-init.c:104: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/./ufi-init.c:106: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:106: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/./ufi-init.c:107: } +;source-doc/ufi-drv/ufi-init.c:107: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm new file mode 100644 index 00000000..f0aa966b --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm @@ -0,0 +1,599 @@ +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.4.0 #14648 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + EXTERN __divschar + EXTERN __divschar_callee + EXTERN __divsint + EXTERN __divsint_callee + EXTERN __divslong + EXTERN __divslong_callee + EXTERN __divslonglong + EXTERN __divslonglong_callee + EXTERN __divsuchar + EXTERN __divsuchar_callee + EXTERN __divuchar + EXTERN __divuchar_callee + EXTERN __divuint + EXTERN __divuint_callee + EXTERN __divulong + EXTERN __divulong_callee + EXTERN __divulonglong + EXTERN __divulonglong_callee + EXTERN __divuschar + EXTERN __divuschar_callee + EXTERN __modschar + EXTERN __modschar_callee + EXTERN __modsint + EXTERN __modsint_callee + EXTERN __modslong + EXTERN __modslong_callee + EXTERN __modslonglong + EXTERN __modslonglong_callee + EXTERN __modsuchar + EXTERN __modsuchar_callee + EXTERN __moduchar + EXTERN __moduchar_callee + EXTERN __moduint + EXTERN __moduint_callee + EXTERN __modulong + EXTERN __modulong_callee + EXTERN __modulonglong + EXTERN __modulonglong_callee + EXTERN __moduschar + EXTERN __moduschar_callee + EXTERN __mulint + EXTERN __mulint_callee + EXTERN __mullong + EXTERN __mullong_callee + EXTERN __mullonglong + EXTERN __mullonglong_callee + EXTERN __mulschar + EXTERN __mulschar_callee + EXTERN __mulsuchar + EXTERN __mulsuchar_callee + EXTERN __muluchar + EXTERN __muluchar_callee + EXTERN __muluschar + EXTERN __muluschar_callee + EXTERN __rlslonglong + EXTERN __rlslonglong_callee + EXTERN __rlulonglong + EXTERN __rlulonglong_callee + EXTERN __rrslonglong + EXTERN __rrslonglong_callee + EXTERN __rrulonglong + EXTERN __rrulonglong_callee + EXTERN ___mulsint2slong + EXTERN ___mulsint2slong_callee + EXTERN ___muluint2ulong + EXTERN ___muluint2ulong_callee + EXTERN ___sdcc_call_hl + EXTERN ___sdcc_call_iy + EXTERN ___sdcc_enter_ix + EXTERN banked_call + EXTERN _banked_ret + EXTERN ___fs2schar + EXTERN ___fs2schar_callee + EXTERN ___fs2sint + EXTERN ___fs2sint_callee + EXTERN ___fs2slong + EXTERN ___fs2slong_callee + EXTERN ___fs2slonglong + EXTERN ___fs2slonglong_callee + EXTERN ___fs2uchar + EXTERN ___fs2uchar_callee + EXTERN ___fs2uint + EXTERN ___fs2uint_callee + EXTERN ___fs2ulong + EXTERN ___fs2ulong_callee + EXTERN ___fs2ulonglong + EXTERN ___fs2ulonglong_callee + EXTERN ___fsadd + EXTERN ___fsadd_callee + EXTERN ___fsdiv + EXTERN ___fsdiv_callee + EXTERN ___fseq + EXTERN ___fseq_callee + EXTERN ___fsgt + EXTERN ___fsgt_callee + EXTERN ___fslt + EXTERN ___fslt_callee + EXTERN ___fsmul + EXTERN ___fsmul_callee + EXTERN ___fsneq + EXTERN ___fsneq_callee + EXTERN ___fssub + EXTERN ___fssub_callee + EXTERN ___schar2fs + EXTERN ___schar2fs_callee + EXTERN ___sint2fs + EXTERN ___sint2fs_callee + EXTERN ___slong2fs + EXTERN ___slong2fs_callee + EXTERN ___slonglong2fs + EXTERN ___slonglong2fs_callee + EXTERN ___uchar2fs + EXTERN ___uchar2fs_callee + EXTERN ___uint2fs + EXTERN ___uint2fs_callee + EXTERN ___ulong2fs + EXTERN ___ulong2fs_callee + EXTERN ___ulonglong2fs + EXTERN ___ulonglong2fs_callee + EXTERN ____sdcc_2_copy_src_mhl_dst_deix + EXTERN ____sdcc_2_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_deix + EXTERN ____sdcc_4_copy_src_mhl_dst_bcix + EXTERN ____sdcc_4_copy_src_mhl_dst_mbc + EXTERN ____sdcc_4_ldi_nosave_bc + EXTERN ____sdcc_4_ldi_save_bc + EXTERN ____sdcc_4_push_hlix + EXTERN ____sdcc_4_push_mhl + EXTERN ____sdcc_lib_setmem_hl + EXTERN ____sdcc_ll_add_de_bc_hl + EXTERN ____sdcc_ll_add_de_bc_hlix + EXTERN ____sdcc_ll_add_de_hlix_bc + EXTERN ____sdcc_ll_add_de_hlix_bcix + EXTERN ____sdcc_ll_add_deix_bc_hl + EXTERN ____sdcc_ll_add_deix_hlix + EXTERN ____sdcc_ll_add_hlix_bc_deix + EXTERN ____sdcc_ll_add_hlix_deix_bc + EXTERN ____sdcc_ll_add_hlix_deix_bcix + EXTERN ____sdcc_ll_asr_hlix_a + EXTERN ____sdcc_ll_asr_mbc_a + EXTERN ____sdcc_ll_copy_src_de_dst_hlix + EXTERN ____sdcc_ll_copy_src_de_dst_hlsp + EXTERN ____sdcc_ll_copy_src_deix_dst_hl + EXTERN ____sdcc_ll_copy_src_deix_dst_hlix + EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp + EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp + EXTERN ____sdcc_ll_copy_src_hl_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_de + EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm + EXTERN ____sdcc_ll_lsl_hlix_a + EXTERN ____sdcc_ll_lsl_mbc_a + EXTERN ____sdcc_ll_lsr_hlix_a + EXTERN ____sdcc_ll_lsr_mbc_a + EXTERN ____sdcc_ll_push_hlix + EXTERN ____sdcc_ll_push_mhl + EXTERN ____sdcc_ll_sub_de_bc_hl + EXTERN ____sdcc_ll_sub_de_bc_hlix + EXTERN ____sdcc_ll_sub_de_hlix_bc + EXTERN ____sdcc_ll_sub_de_hlix_bcix + EXTERN ____sdcc_ll_sub_deix_bc_hl + EXTERN ____sdcc_ll_sub_deix_hlix + EXTERN ____sdcc_ll_sub_hlix_bc_deix + EXTERN ____sdcc_ll_sub_hlix_deix_bc + EXTERN ____sdcc_ll_sub_hlix_deix_bcix + EXTERN ____sdcc_load_debc_deix + EXTERN ____sdcc_load_dehl_deix + EXTERN ____sdcc_load_debc_mhl + EXTERN ____sdcc_load_hlde_mhl + EXTERN ____sdcc_store_dehl_bcix + EXTERN ____sdcc_store_debc_hlix + EXTERN ____sdcc_store_debc_mhl + EXTERN ____sdcc_cpu_pop_ei + EXTERN ____sdcc_cpu_pop_ei_jp + EXTERN ____sdcc_cpu_push_di + EXTERN ____sdcc_outi + EXTERN ____sdcc_outi_128 + EXTERN ____sdcc_outi_256 + EXTERN ____sdcc_ldi + EXTERN ____sdcc_ldi_128 + EXTERN ____sdcc_ldi_256 + EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix + EXTERN ____sdcc_4_or_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_dehl_dst_bcix + EXTERN ____sdcc_4_and_src_dehl_dst_bcix + EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc + EXTERN ____sdcc_4_cpl_src_mhl_dst_debc + EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc + EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc + EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- + GLOBAL _cbi2_adsc + GLOBAL _usb_execute_cbi +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- + GLOBAL _critical_end + GLOBAL _critical_begin + GLOBAL _usbtrn_clear_endpoint_halt + GLOBAL _usbtrn_set_address + GLOBAL _usbtrn_set_configuration + GLOBAL _usbtrn_gfull_cfg_desc + GLOBAL _usbtrn_get_config_descriptor + GLOBAL _usbtrn_get_descriptor2 + GLOBAL _usbtrn_get_descriptor + GLOBAL _usbdev_dat_in_trnsfer_0 + GLOBAL _usbdev_dat_in_trnsfer + GLOBAL _usbdev_bulk_in_transfer + GLOBAL _usbdev_blk_out_trnsfer + GLOBAL _usbdev_control_transfer + GLOBAL _usb_data_out_transfer + GLOBAL _usb_data_in_transfer_n + GLOBAL _usb_data_in_transfer + GLOBAL _usb_control_transfer + GLOBAL _ch_issue_token_in_ep0 + GLOBAL _ch_issue_token_out_ep0 + GLOBAL _ch_issue_token_setup + GLOBAL _ch_data_out_transfer + GLOBAL _ch_data_in_transfer_n + GLOBAL _ch_data_in_transfer + GLOBAL _ch_control_transfer_set_config + GLOBAL _ch_control_transfer_set_address + GLOBAL _ch_control_transfer_request_descriptor + GLOBAL _ch_set_usb_address + GLOBAL _ch_write_data + GLOBAL _ch_cmd_get_ic_version + GLOBAL _ch_cmd_set_usb_mode + GLOBAL _ch_probe + GLOBAL _ch_cmd_reset_all + GLOBAL _ch_read_data + GLOBAL _ch_very_short_wait_int_and_get_status + GLOBAL _ch_short_wait_int_and_get_status + GLOBAL _ch_long_wait_int_and_get_status + GLOBAL _ch_get_status + GLOBAL _ch_command + GLOBAL _delay_medium + GLOBAL _delay_short + GLOBAL _delay_20ms + GLOBAL _printf + GLOBAL _delay + GLOBAL _ulltoa_callee + GLOBAL _ulltoa + GLOBAL _strtoull_callee + GLOBAL _strtoull + GLOBAL _strtoll_callee + GLOBAL _strtoll + GLOBAL _lltoa_callee + GLOBAL _lltoa + GLOBAL _llabs_callee + GLOBAL _llabs + GLOBAL __lldivu__callee + GLOBAL __lldivu_ + GLOBAL __lldiv__callee + GLOBAL __lldiv_ + GLOBAL _atoll_callee + GLOBAL _atoll + GLOBAL _realloc_unlocked_callee + GLOBAL _realloc_unlocked + GLOBAL _malloc_unlocked_fastcall + GLOBAL _malloc_unlocked + GLOBAL _free_unlocked_fastcall + GLOBAL _free_unlocked + GLOBAL _calloc_unlocked_callee + GLOBAL _calloc_unlocked + GLOBAL _aligned_alloc_unlocked_callee + GLOBAL _aligned_alloc_unlocked + GLOBAL _realloc_callee + GLOBAL _realloc + GLOBAL _malloc_fastcall + GLOBAL _malloc + GLOBAL _free_fastcall + GLOBAL _free + GLOBAL _calloc_callee + GLOBAL _calloc + GLOBAL _aligned_alloc_callee + GLOBAL _aligned_alloc + GLOBAL _utoa_callee + GLOBAL _utoa + GLOBAL _ultoa_callee + GLOBAL _ultoa + GLOBAL _system_fastcall + GLOBAL _system + GLOBAL _strtoul_callee + GLOBAL _strtoul + GLOBAL _strtol_callee + GLOBAL _strtol + GLOBAL _strtof_callee + GLOBAL _strtof + GLOBAL _strtod_callee + GLOBAL _strtod + GLOBAL _srand_fastcall + GLOBAL _srand + GLOBAL _rand + GLOBAL _quick_exit_fastcall + GLOBAL _quick_exit + GLOBAL _qsort_callee + GLOBAL _qsort + GLOBAL _ltoa_callee + GLOBAL _ltoa + GLOBAL _labs_fastcall + GLOBAL _labs + GLOBAL _itoa_callee + GLOBAL _itoa + GLOBAL _ftoh_callee + GLOBAL _ftoh + GLOBAL _ftog_callee + GLOBAL _ftog + GLOBAL _ftoe_callee + GLOBAL _ftoe + GLOBAL _ftoa_callee + GLOBAL _ftoa + GLOBAL _exit_fastcall + GLOBAL _exit + GLOBAL _dtoh_callee + GLOBAL _dtoh + GLOBAL _dtog_callee + GLOBAL _dtog + GLOBAL _dtoe_callee + GLOBAL _dtoe + GLOBAL _dtoa_callee + GLOBAL _dtoa + GLOBAL _bsearch_callee + GLOBAL _bsearch + GLOBAL _atol_fastcall + GLOBAL _atol + GLOBAL _atoi_fastcall + GLOBAL _atoi + GLOBAL _atof_fastcall + GLOBAL _atof + GLOBAL _atexit_fastcall + GLOBAL _atexit + GLOBAL _at_quick_exit_fastcall + GLOBAL _at_quick_exit + GLOBAL _abs_fastcall + GLOBAL _abs + GLOBAL _abort + GLOBAL __strtou__callee + GLOBAL __strtou_ + GLOBAL __strtoi__callee + GLOBAL __strtoi_ + GLOBAL __random_uniform_xor_8__fastcall + GLOBAL __random_uniform_xor_8_ + GLOBAL __random_uniform_xor_32__fastcall + GLOBAL __random_uniform_xor_32_ + GLOBAL __random_uniform_cmwc_8__fastcall + GLOBAL __random_uniform_cmwc_8_ + GLOBAL __shellsort__callee + GLOBAL __shellsort_ + GLOBAL __quicksort__callee + GLOBAL __quicksort_ + GLOBAL __insertion_sort__callee + GLOBAL __insertion_sort_ + GLOBAL __ldivu__callee + GLOBAL __ldivu_ + GLOBAL __ldiv__callee + GLOBAL __ldiv_ + GLOBAL __divu__callee + GLOBAL __divu_ + GLOBAL __div__callee + GLOBAL __div_ + GLOBAL _in_critical_usb_section + GLOBAL _result +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +defc _CH376_DATA_PORT = 0xff88 +defc _CH376_COMMAND_PORT = 0xff89 +defc _USB_MODULE_LEDS = 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + SECTION bss_compiler +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +IF 0 + +; .area _INITIALIZED removed by z88dk + +_cbi2_adsc: + DEFS 8 + +ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- + SECTION code_crt_init +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- + SECTION IGNORE +;-------------------------------------------------------- +; code +;-------------------------------------------------------- + SECTION code_compiler +;source-doc/ufi-drv/usb_cbi.c:10: usb_error usb_execute_cbi(device_config *const storage_device, +; --------------------------------- +; Function usb_execute_cbi +; --------------------------------- +_usb_execute_cbi: + push ix + ld ix,0 + add ix,sp + ld hl, -8 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/usb_cbi.c:17: const uint8_t interface_number = storage_device->interface_number; + ld l,(ix+4) + ld h,(ix+5) + ld c,l + ld b,h + inc hl + inc hl + ld e, (hl) +;source-doc/ufi-drv/usb_cbi.c:20: adsc = cbi2_adsc; + push de + push bc + ex de, hl + ld hl,4 + add hl, sp + ex de, hl + ld bc,0x0008 + ld hl,_cbi2_adsc + ldir + pop bc + pop de +;source-doc/ufi-drv/usb_cbi.c:21: adsc.bIndex[0] = interface_number; + ld (ix-4),e +;source-doc/ufi-drv/usb_cbi.c:23: critical_begin(); + push bc + call _critical_begin + pop bc +;source-doc/ufi-drv/usb_cbi.c:25: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); + ld l,(ix+6) + ld h,(ix+7) + push hl + ld hl,2 + add hl, sp + push hl + push bc + call _usbdev_control_transfer + pop af + pop af + pop af + ld a, l + ld (_result), a +;source-doc/ufi-drv/usb_cbi.c:27: if (result == USB_ERR_STALL) { + ld a,(_result) + sub a,0x02 + jr NZ,l_usb_execute_cbi_00104 +;source-doc/ufi-drv/usb_cbi.c:28: if (sense_codes != NULL) + ld a,(ix+14) + or a,(ix+13) + jr Z,l_usb_execute_cbi_00102 +;source-doc/ufi-drv/usb_cbi.c:29: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + ld a,0x02 + push af + inc sp + ld hl,0x0002 + push hl + ld l,(ix+13) + ld h,(ix+14) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_dat_in_trnsfer + ld hl,7 + add hl, sp + ld sp, hl +l_usb_execute_cbi_00102: +;source-doc/ufi-drv/usb_cbi.c:31: result = USB_ERR_STALL; + ld hl,_result + ld (hl),0x02 +;source-doc/ufi-drv/usb_cbi.c:32: goto done; + jp l_usb_execute_cbi_00116 +l_usb_execute_cbi_00104: +;source-doc/ufi-drv/usb_cbi.c:35: if (result != USB_ERR_OK) { + ld a,(_result) + or a, a + jp NZ, l_usb_execute_cbi_00116 +;source-doc/ufi-drv/usb_cbi.c:40: if (send) { + bit 0,(ix+8) + jr Z,l_usb_execute_cbi_00112 +;source-doc/ufi-drv/usb_cbi.c:41: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+11) + ld h,(ix+12) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_blk_out_trnsfer + pop af + pop af + pop af + ld a, l + ld (_result), a +;source-doc/ufi-drv/usb_cbi.c:43: if (result != USB_ERR_OK) { + ld a,(_result) + or a, a + jr Z,l_usb_execute_cbi_00113 +;source-doc/ufi-drv/usb_cbi.c:45: goto done; + jr l_usb_execute_cbi_00116 +l_usb_execute_cbi_00112: +;source-doc/ufi-drv/usb_cbi.c:48: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); + ld a,0x01 + push af + inc sp + ld l,(ix+9) + ld h,(ix+10) + push hl + ld l,(ix+11) + ld h,(ix+12) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_dat_in_trnsfer + pop af + pop af + pop af + inc sp + ld a, l + ld (_result), a +;source-doc/ufi-drv/usb_cbi.c:50: if (result != USB_ERR_OK) { + ld a,(_result) + or a, a + jr NZ,l_usb_execute_cbi_00116 +;source-doc/ufi-drv/usb_cbi.c:52: goto done; +l_usb_execute_cbi_00113: +;source-doc/ufi-drv/usb_cbi.c:56: if (sense_codes != NULL) { + ld a,(ix+14) + or a,(ix+13) + jr Z,l_usb_execute_cbi_00116 +;source-doc/ufi-drv/usb_cbi.c:57: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); + ld a,0x02 + push af + inc sp + ld hl,0x0002 + push hl + ld l,(ix+13) + ld h,(ix+14) + push hl + ld l,(ix+4) + ld h,(ix+5) + push hl + call _usbdev_dat_in_trnsfer + pop af + pop af + pop af + inc sp + ld a, l + ld (_result), a +;source-doc/ufi-drv/usb_cbi.c:65: done: +l_usb_execute_cbi_00116: +;source-doc/ufi-drv/usb_cbi.c:66: critical_end(); + call _critical_end +;source-doc/ufi-drv/usb_cbi.c:68: return result; + ld hl,(_result) +;source-doc/ufi-drv/usb_cbi.c:69: } + ld sp, ix + pop ix + ret + SECTION data_compiler +_cbi2_adsc: + DEFB +0x21 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0xff + DEFB +0x00 + DEFW +0x000c + SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s index c9e23468..79d7c299 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -1,5 +1,5 @@ ; -; Generated from source-doc/ufi-drv/./usb_cbi.c.asm -- not to be modify directly +; Generated from source-doc/ufi-drv/usb_cbi.c.asm -- not to be modify directly ; ; ;-------------------------------------------------------- @@ -50,7 +50,7 @@ _cbi2_adsc: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/./usb_cbi.c:10: usb_error usb_execute_cbi(device_config *const storage_device, +;source-doc/ufi-drv/usb_cbi.c:10: usb_error usb_execute_cbi(device_config *const storage_device, ; --------------------------------- ; Function usb_execute_cbi ; --------------------------------- @@ -61,33 +61,33 @@ _usb_execute_cbi: ld hl, -8 add hl, sp ld sp, hl -;source-doc/ufi-drv/./usb_cbi.c:17: const uint8_t interface_number = storage_device->interface_number; - ld c,(ix+4) - ld b,(ix+5) - ld l, c - ld h, b +;source-doc/ufi-drv/usb_cbi.c:17: const uint8_t interface_number = storage_device->interface_number; + ld l,(ix+4) + ld h,(ix+5) + ld c,l + ld b,h inc hl inc hl ld e, (hl) -;source-doc/ufi-drv/./usb_cbi.c:20: adsc = cbi2_adsc; +;source-doc/ufi-drv/usb_cbi.c:20: adsc = cbi2_adsc; push de push bc ex de, hl ld hl,4 add hl, sp ex de, hl - ld hl,_cbi2_adsc ld bc,0x0008 + ld hl,_cbi2_adsc ldir pop bc pop de -;source-doc/ufi-drv/./usb_cbi.c:21: adsc.bIndex[0] = interface_number; +;source-doc/ufi-drv/usb_cbi.c:21: adsc.bIndex[0] = interface_number; ld (ix-4),e -;source-doc/ufi-drv/./usb_cbi.c:23: critical_begin(); +;source-doc/ufi-drv/usb_cbi.c:23: critical_begin(); push bc call _critical_begin pop bc -;source-doc/ufi-drv/./usb_cbi.c:25: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); +;source-doc/ufi-drv/usb_cbi.c:25: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); ld l,(ix+6) ld h,(ix+7) push hl @@ -101,15 +101,15 @@ _usb_execute_cbi: pop af ld a, l ld (_result), a -;source-doc/ufi-drv/./usb_cbi.c:27: if (result == USB_ERR_STALL) { +;source-doc/ufi-drv/usb_cbi.c:27: if (result == USB_ERR_STALL) { ld a,(_result) sub 0x02 jr NZ,l_usb_execute_cbi_00104 -;source-doc/ufi-drv/./usb_cbi.c:28: if (sense_codes != NULL) +;source-doc/ufi-drv/usb_cbi.c:28: if (sense_codes != NULL) ld a,(ix+14) or (ix+13) jr Z,l_usb_execute_cbi_00102 -;source-doc/ufi-drv/./usb_cbi.c:29: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); +;source-doc/ufi-drv/usb_cbi.c:29: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); ld a,0x02 push af inc sp @@ -122,25 +122,24 @@ _usb_execute_cbi: ld h,(ix+5) push hl call _usbdev_dat_in_trnsfer - pop af - pop af - pop af - inc sp + ld hl,7 + add hl, sp + ld sp, hl l_usb_execute_cbi_00102: -;source-doc/ufi-drv/./usb_cbi.c:31: result = USB_ERR_STALL; +;source-doc/ufi-drv/usb_cbi.c:31: result = USB_ERR_STALL; ld hl,_result ld (hl),0x02 -;source-doc/ufi-drv/./usb_cbi.c:32: goto done; +;source-doc/ufi-drv/usb_cbi.c:32: goto done; jp l_usb_execute_cbi_00116 l_usb_execute_cbi_00104: -;source-doc/ufi-drv/./usb_cbi.c:35: if (result != USB_ERR_OK) { +;source-doc/ufi-drv/usb_cbi.c:35: if (result != USB_ERR_OK) { ld a,(_result) or a jp NZ, l_usb_execute_cbi_00116 -;source-doc/ufi-drv/./usb_cbi.c:40: if (send) { +;source-doc/ufi-drv/usb_cbi.c:40: if (send) { bit 0,(ix+8) jr Z,l_usb_execute_cbi_00112 -;source-doc/ufi-drv/./usb_cbi.c:41: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); +;source-doc/ufi-drv/usb_cbi.c:41: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); ld l,(ix+9) ld h,(ix+10) push hl @@ -156,14 +155,14 @@ l_usb_execute_cbi_00104: pop af ld a, l ld (_result), a -;source-doc/ufi-drv/./usb_cbi.c:43: if (result != USB_ERR_OK) { +;source-doc/ufi-drv/usb_cbi.c:43: if (result != USB_ERR_OK) { ld a,(_result) or a jr Z,l_usb_execute_cbi_00113 -;source-doc/ufi-drv/./usb_cbi.c:45: goto done; +;source-doc/ufi-drv/usb_cbi.c:45: goto done; jr l_usb_execute_cbi_00116 l_usb_execute_cbi_00112: -;source-doc/ufi-drv/./usb_cbi.c:48: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); +;source-doc/ufi-drv/usb_cbi.c:48: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); ld a,0x01 push af inc sp @@ -183,17 +182,17 @@ l_usb_execute_cbi_00112: inc sp ld a, l ld (_result), a -;source-doc/ufi-drv/./usb_cbi.c:50: if (result != USB_ERR_OK) { +;source-doc/ufi-drv/usb_cbi.c:50: if (result != USB_ERR_OK) { ld a,(_result) or a jr NZ,l_usb_execute_cbi_00116 -;source-doc/ufi-drv/./usb_cbi.c:52: goto done; +;source-doc/ufi-drv/usb_cbi.c:52: goto done; l_usb_execute_cbi_00113: -;source-doc/ufi-drv/./usb_cbi.c:56: if (sense_codes != NULL) { +;source-doc/ufi-drv/usb_cbi.c:56: if (sense_codes != NULL) { ld a,(ix+14) or (ix+13) jr Z,l_usb_execute_cbi_00116 -;source-doc/ufi-drv/./usb_cbi.c:57: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); +;source-doc/ufi-drv/usb_cbi.c:57: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); ld a,0x02 push af inc sp @@ -212,14 +211,13 @@ l_usb_execute_cbi_00113: inc sp ld a, l ld (_result), a -;source-doc/ufi-drv/./usb_cbi.c:65: done: +;source-doc/ufi-drv/usb_cbi.c:65: done: l_usb_execute_cbi_00116: -;source-doc/ufi-drv/./usb_cbi.c:66: critical_end(); +;source-doc/ufi-drv/usb_cbi.c:66: critical_end(); call _critical_end -;source-doc/ufi-drv/./usb_cbi.c:68: return result; - ld hl,_result - ld l, (hl) -;source-doc/ufi-drv/./usb_cbi.c:69: } +;source-doc/ufi-drv/usb_cbi.c:68: return result; + ld hl,(_result) +;source-doc/ufi-drv/usb_cbi.c:69: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/util.asm b/Source/HBIOS/util.asm index d9983fd8..6d1ee813 100644 --- a/Source/HBIOS/util.asm +++ b/Source/HBIOS/util.asm @@ -578,17 +578,6 @@ DELAY1: ; | ; --- LOOP = ((CPUSCL * 16) - 5) TS ------------+ | DEC A ; 4TS | | #IF (BIOS == BIOS_WBW) ; | | - #IF (CPUFAM == CPU_EZ80) ; | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - OR A ; +?TS FOR EZ80 | | - #ENDIF ; | | #IF (CPUFAM == CPU_Z180) ; | | OR A ; +4TS FOR Z180 | | #ENDIF ; | | From a92bd780c8439acee8a21f0b018a974ac9e44186 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 17 Nov 2024 09:11:08 +1100 Subject: [PATCH 07/59] ch376-native: removed some intermediate files that should not have beeen committed --- Source/HBIOS/ch376-native/Makefile | 21 +- Source/HBIOS/ch376-native/base-drv/.gitignore | 1 + .../HBIOS/ch376-native/base-drv/ch376.c.asm | 1136 ------------- .../ch376-native/base-drv/class_hub.c.asm | 458 ----- .../ch376-native/base-drv/dev_transfers.c.asm | 834 ---------- .../ch376-native/base-drv/enumerate.c.asm | 1472 ----------------- .../ch376-native/base-drv/transfers.c.asm | 829 ---------- .../ch376-native/base-drv/usb-base-drv.c.asm | 441 ----- .../ch376-native/base-drv/usb_state.c.asm | 605 ------- .../ch376-native/base-drv/work-area.c.asm | 520 ------ Source/HBIOS/ch376-native/cruntime.asm | 69 + Source/HBIOS/ch376-native/keyboard/.gitignore | 1 + Source/HBIOS/ch376-native/scsi-drv/.gitignore | 1 + Source/HBIOS/ch376-native/ufi-drv/.gitignore | 1 + .../HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm | 599 ------- 15 files changed, 82 insertions(+), 6906 deletions(-) create mode 100644 Source/HBIOS/ch376-native/base-drv/.gitignore delete mode 100644 Source/HBIOS/ch376-native/base-drv/ch376.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/class_hub.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/enumerate.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/transfers.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/usb_state.c.asm delete mode 100644 Source/HBIOS/ch376-native/base-drv/work-area.c.asm create mode 100644 Source/HBIOS/ch376-native/keyboard/.gitignore create mode 100644 Source/HBIOS/ch376-native/scsi-drv/.gitignore create mode 100644 Source/HBIOS/ch376-native/ufi-drv/.gitignore delete mode 100644 Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index ffdc9715..6f25245a 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -8,7 +8,7 @@ ZCCRELFLAGS := -SO3 --max-allocs-per-node600000 --allow-unsafe-read --opt-code-s SRC := ./source-doc/ LIBS := -I./$(SRC)base-drv/ -ZCCFLAGS := +z80 -vn -startup=0 -clib=sdcc_iy -crt0 $(SRC)crt.asm -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) +ZCCFLAGS := +z80 -vn -startup=0 -clib=sdcc_iy -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) ZCC_PATH := $(shell command -v zcc) ZCC := $(shell command -v zcc >/dev/null 2>&1 && echo zcc || echo 'docker run -w /host/${PWD} -v /:/host/ -u $(shell id -u ${USER}):$(shell id -g ${USER}) -t z88dk/z88dk zcc') @@ -24,10 +24,14 @@ ASSDIR := ./ all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s $(ASSDIR)keyboard.s clean: - @rm -rf base-drv - rm -rf scsi-drv - rm -rf ufi-drv - rm -rf keyboard + @rm -rf base-drv/*.s + rm -rf base-drv/*.asm + rm -rf scsi-drv/*.s + rm -rf scsi-drv/*.asm + rm -rf ufi-drv/*.s + rm -rf ufi-drv/*.asm + rm -rf keyboard/*.s + rm -rf keyboard/*.asm rm ufi-drv.s rm scsi-drv.s rm base-drv.s @@ -38,19 +42,12 @@ $(ASSDIR)%.c.s: $(ASSDIR)%.c.asm echo "Converting $< to $@" ${SRC}convert-for-uz80as.sh $< $@ -$(ASSDIR)%.s: $(SRC)%.asm - @mkdir -p $(dir $@) - cp $< $@ - sed -i "1i\;\r\n; Generated from $< -- not to be modify directly\r\n;\r\n; " $@ - define compile @mkdir -p $(dir $@) $(ZCC) $(ZCCFLAGS) --c-code-in-asm --assemble-only $< -o $@ echo "Compiled $(notdir $@) from $(notdir $<)" endef -ZSDCPP_FLAGS= -I"${ZCCCFG}../../include/_DEVELOPMENT/sdcc" $(LIBS) - define build_subsystem = $$(ASSDIR)$(1).s: @echo "Creating $(1).s" diff --git a/Source/HBIOS/ch376-native/base-drv/.gitignore b/Source/HBIOS/ch376-native/base-drv/.gitignore new file mode 100644 index 00000000..f4cb8488 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/.gitignore @@ -0,0 +1 @@ +*.asm diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.asm b/Source/HBIOS/ch376-native/base-drv/ch376.c.asm deleted file mode 100644 index f698491b..00000000 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.asm +++ /dev/null @@ -1,1136 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _ch_issue_token_out - GLOBAL _ch_issue_token_in - GLOBAL _ch_issue_token - GLOBAL _result - GLOBAL _ch_command - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_probe - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_in_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_out_transfer - GLOBAL _ch_set_usb_address -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _ch_wait_int_and_get_status - GLOBAL _print_uint16 - GLOBAL _print_string - GLOBAL _print_hex - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_write_data - GLOBAL _ch_read_data - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - -_result: - DEFS 1 - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/ch376.c:8: void ch_command(const uint8_t command) __z88dk_fastcall { -; --------------------------------- -; Function ch_command -; --------------------------------- -_ch_command: -;source-doc/base-drv/ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) - ld c,0xff -l_ch_command_00102: - ld a, +((_CH376_COMMAND_PORT) / 256) - in a, (((_CH376_COMMAND_PORT) & 0xFF)) - bit 4, a - jr Z,l_ch_command_00104 - dec c - jr NZ,l_ch_command_00102 -l_ch_command_00104: -;source-doc/base-drv/ch376.c:21: CH376_COMMAND_PORT = command; - ld a, l - ld bc,_CH376_COMMAND_PORT - out (c),a -;source-doc/base-drv/ch376.c:22: } - ret -;source-doc/base-drv/ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } -; --------------------------------- -; Function ch_long_wait_int_and_get_status -; --------------------------------- -_ch_long_wait_int_and_get_status: - ld hl,0x1388 - jp _ch_wait_int_and_get_status -;source-doc/base-drv/ch376.c:28: usb_error ch_short_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(100); } -; --------------------------------- -; Function ch_short_wait_int_and_get_status -; --------------------------------- -_ch_short_wait_int_and_get_status: - ld hl,0x0064 - jp _ch_wait_int_and_get_status -;source-doc/base-drv/ch376.c:30: usb_error ch_very_short_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(10); } -; --------------------------------- -; Function ch_very_short_wait_int_and_get_status -; --------------------------------- -_ch_very_short_wait_int_and_get_status: - ld hl,0x000a - jp _ch_wait_int_and_get_status -;source-doc/base-drv/ch376.c:32: usb_error ch_get_status(void) { -; --------------------------------- -; Function ch_get_status -; --------------------------------- -_ch_get_status: -;source-doc/base-drv/ch376.c:33: ch_command(CH_CMD_GET_STATUS); - ld l,0x22 - call _ch_command -;source-doc/base-drv/ch376.c:34: uint8_t ch_status = CH376_DATA_PORT; - ld a, +((_CH376_DATA_PORT) / 256) - in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) - ld l,a - sub a,0x41 - jr C,l_ch_get_status_00102 - ld a,0xb4 - sub a, l -;source-doc/base-drv/ch376.c:37: return ch_status; - jr NC,l_ch_get_status_00126 -l_ch_get_status_00102: -;source-doc/base-drv/ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) - ld a, l -;source-doc/base-drv/ch376.c:40: return USB_ERR_OK; - sub a,0x51 - jr NZ,l_ch_get_status_00105 - ld l,a - jr l_ch_get_status_00126 -l_ch_get_status_00105: -;source-doc/base-drv/ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) - ld a, l -;source-doc/base-drv/ch376.c:43: return USB_ERR_OK; - sub a,0x14 - jr NZ,l_ch_get_status_00107 - ld l,a - jr l_ch_get_status_00126 -l_ch_get_status_00107: -;source-doc/base-drv/ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) - ld a, l - sub a,0x15 - jr NZ,l_ch_get_status_00109 -;source-doc/base-drv/ch376.c:46: return USB_INT_CONNECT; - ld l,0x81 - jr l_ch_get_status_00126 -l_ch_get_status_00109: -;source-doc/base-drv/ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) - ld a, l - sub a,0x1d - jr NZ,l_ch_get_status_00111 -;source-doc/base-drv/ch376.c:49: return USB_ERR_DISK_READ; - ld l,0x1d - jr l_ch_get_status_00126 -l_ch_get_status_00111: -;source-doc/base-drv/ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) - ld a, l - sub a,0x1e - jr NZ,l_ch_get_status_00113 -;source-doc/base-drv/ch376.c:52: return USB_ERR_DISK_WRITE; - ld l,0x1e - jr l_ch_get_status_00126 -l_ch_get_status_00113: -;source-doc/base-drv/ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { - ld a, l - sub a,0x16 - jr NZ,l_ch_get_status_00115 -;source-doc/base-drv/ch376.c:55: ch_cmd_set_usb_mode(5); - ld l,0x05 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/ch376.c:56: return USB_ERR_NO_DEVICE; - ld l,0x05 - jr l_ch_get_status_00126 -l_ch_get_status_00115: -;source-doc/base-drv/ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) - ld a, l - sub a,0x17 - jr NZ,l_ch_get_status_00117 -;source-doc/base-drv/ch376.c:60: return USB_ERR_DATA_ERROR; - ld l,0x04 - jr l_ch_get_status_00126 -l_ch_get_status_00117: -;source-doc/base-drv/ch376.c:62: ch_status &= 0x2F; - ld a, l - and a,0x2f -;source-doc/base-drv/ch376.c:64: if (ch_status == 0x2A) - cp a,0x2a - jr NZ,l_ch_get_status_00119 -;source-doc/base-drv/ch376.c:65: return USB_ERR_NAK; - ld l,0x01 - jr l_ch_get_status_00126 -l_ch_get_status_00119: -;source-doc/base-drv/ch376.c:67: if (ch_status == 0x2E) - cp a,0x2e - jr NZ,l_ch_get_status_00121 -;source-doc/base-drv/ch376.c:68: return USB_ERR_STALL; - ld l,0x02 - jr l_ch_get_status_00126 -l_ch_get_status_00121: -;source-doc/base-drv/ch376.c:70: ch_status &= 0x23; - and a,0x23 -;source-doc/base-drv/ch376.c:72: if (ch_status == 0x20) - cp a,0x20 - jr NZ,l_ch_get_status_00123 -;source-doc/base-drv/ch376.c:73: return USB_ERR_TIMEOUT; - ld l,0x03 - jr l_ch_get_status_00126 -l_ch_get_status_00123: -;source-doc/base-drv/ch376.c:75: if (ch_status == 0x23) - sub a,0x23 - jr NZ,l_ch_get_status_00125 -;source-doc/base-drv/ch376.c:76: return USB_TOKEN_OUT_OF_SYNC; - ld l,0x07 - jr l_ch_get_status_00126 -l_ch_get_status_00125: -;source-doc/base-drv/ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_HOST; - ld l,0x08 -l_ch_get_status_00126: -;source-doc/base-drv/ch376.c:79: } - ret -;source-doc/base-drv/ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } -; --------------------------------- -; Function ch_cmd_reset_all -; --------------------------------- -_ch_cmd_reset_all: - ld l,0x05 - jp _ch_command -;source-doc/base-drv/ch376.c:100: uint8_t ch_probe(void) { -; --------------------------------- -; Function ch_probe -; --------------------------------- -_ch_probe: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/base-drv/ch376.c:102: do { - ld (ix-1),0x05 -l_ch_probe_00103: -;source-doc/base-drv/ch376.c:85: ch_command(CH_CMD_CHECK_EXIST); - ld l,0x06 - call _ch_command -;source-doc/base-drv/ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; - ld a,0xaa - ld bc,_CH376_DATA_PORT - out (c),a -;source-doc/base-drv/ch376.c:87: delay(); - call _delay -;source-doc/base-drv/ch376.c:88: complement = CH376_DATA_PORT; - ld a, +((_CH376_DATA_PORT) / 256) - in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/ch376.c:89: return complement == 0x55; - sub a,0x55 - jr NZ,l_ch_probe_00102 -;source-doc/base-drv/ch376.c:103: if (ch_cmd_check_exist()) -;source-doc/base-drv/ch376.c:104: return true; - ld l,0x01 - jr l_ch_probe_00107 -l_ch_probe_00102: -;source-doc/base-drv/ch376.c:106: delay_medium(); - call _delay_medium -;source-doc/base-drv/ch376.c:107: } while (--i != 0); - dec (ix-1) - jr NZ,l_ch_probe_00103 -;source-doc/base-drv/ch376.c:109: return false; - ld l,0x00 -l_ch_probe_00107: -;source-doc/base-drv/ch376.c:110: } - inc sp - pop ix - ret -;source-doc/base-drv/ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { -; --------------------------------- -; Function ch_cmd_set_usb_mode -; --------------------------------- -_ch_cmd_set_usb_mode: - ld c, l -;source-doc/base-drv/ch376.c:113: uint8_t result = 0; - ld b,0x00 -;source-doc/base-drv/ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; - ld a,0x15 - push bc - ld bc,_CH376_COMMAND_PORT - out (c),a - call _delay - pop bc -;source-doc/base-drv/ch376.c:117: CH376_DATA_PORT = mode; - ld a, c - push bc - ld bc,_CH376_DATA_PORT - out (c),a - call _delay - pop bc -;source-doc/base-drv/ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { - ld c,0x7f -l_ch_cmd_set_usb_mode_00103: - ld a, b - sub a,0x51 - jr NZ,l_ch_cmd_set_usb_mode_00146 - ld a,0x01 - jr l_ch_cmd_set_usb_mode_00147 -l_ch_cmd_set_usb_mode_00146: - xor a,a -l_ch_cmd_set_usb_mode_00147: - ld e,a - bit 0,a - jr NZ,l_ch_cmd_set_usb_mode_00105 - ld a, b - sub a,0x5f - jr Z,l_ch_cmd_set_usb_mode_00105 - dec c - jr Z,l_ch_cmd_set_usb_mode_00105 -;source-doc/base-drv/ch376.c:123: result = CH376_DATA_PORT; - ld a, +((_CH376_DATA_PORT) / 256) - in a, (((_CH376_DATA_PORT) & 0xFF)) - ld b, a -;source-doc/base-drv/ch376.c:124: delay(); - push bc - call _delay - pop bc - jr l_ch_cmd_set_usb_mode_00103 -l_ch_cmd_set_usb_mode_00105: -;source-doc/base-drv/ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; - ld a, e - or a, a - jr Z,l_ch_cmd_set_usb_mode_00108 - ld l,0x00 - jr l_ch_cmd_set_usb_mode_00109 -l_ch_cmd_set_usb_mode_00108: - ld l,0x0e -l_ch_cmd_set_usb_mode_00109: -;source-doc/base-drv/ch376.c:128: } - ret -;source-doc/base-drv/ch376.c:130: uint8_t ch_cmd_get_ic_version(void) { -; --------------------------------- -; Function ch_cmd_get_ic_version -; --------------------------------- -_ch_cmd_get_ic_version: -;source-doc/base-drv/ch376.c:131: ch_command(CH_CMD_GET_IC_VER); - ld l,0x01 - call _ch_command -;source-doc/base-drv/ch376.c:132: return CH376_DATA_PORT & 0x1f; - ld a, +((_CH376_DATA_PORT) / 256) - in a, (((_CH376_DATA_PORT) & 0xFF)) - and a,0x1f - ld l, a -;source-doc/base-drv/ch376.c:133: } - ret -;source-doc/base-drv/ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { -; --------------------------------- -; Function ch_issue_token -; --------------------------------- -_ch_issue_token: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X); - ld l,0x4e - call _ch_command -;source-doc/base-drv/ch376.c:137: CH376_DATA_PORT = toggle_bit; - ld a,(ix+4) - ld bc,_CH376_DATA_PORT - out (c),a -;source-doc/base-drv/ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; - ld a,(ix+5) - add a, a - add a, a - add a, a - add a, a - or a,(ix+6) - ld bc,_CH376_DATA_PORT - out (c),a -;source-doc/base-drv/ch376.c:139: } - pop ix - ret -;source-doc/base-drv/ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { -; --------------------------------- -; Function ch_issue_token_in -; --------------------------------- -_ch_issue_token_in: -;source-doc/base-drv/ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); - ld e,l - ld d,h - ld a, (hl) - rrca - and a,0x07 - ld b, a - ex de, hl - ld a, (hl) - and a,0x01 - jr Z,l_ch_issue_token_in_00103 - ld a,0x80 - jr l_ch_issue_token_in_00104 -l_ch_issue_token_in_00103: - xor a, a -l_ch_issue_token_in_00104: - ld h,0x09 - ld l,b - push hl - push af - inc sp - call _ch_issue_token - pop af - inc sp -;source-doc/base-drv/ch376.c:143: } - ret -;source-doc/base-drv/ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { -; --------------------------------- -; Function ch_issue_token_out -; --------------------------------- -_ch_issue_token_out: -;source-doc/base-drv/ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); - ld e,l - ld d,h - ld a, (hl) - rrca - and a,0x07 - ld b, a - ex de, hl - ld a, (hl) - and a,0x01 - jr Z,l_ch_issue_token_out_00103 - ld a,0x40 - jr l_ch_issue_token_out_00104 -l_ch_issue_token_out_00103: - xor a, a -l_ch_issue_token_out_00104: - ld h,0x01 - ld l,b - push hl - push af - inc sp - call _ch_issue_token - pop af - inc sp -;source-doc/base-drv/ch376.c:147: } - ret -;source-doc/base-drv/ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } -; --------------------------------- -; Function ch_issue_token_out_ep0 -; --------------------------------- -_ch_issue_token_out_ep0: - ld a,0x01 - push af - inc sp - xor a, a - ld d,a - ld e,0x40 - push de - call _ch_issue_token - pop af - inc sp - ret -;source-doc/base-drv/ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } -; --------------------------------- -; Function ch_issue_token_in_ep0 -; --------------------------------- -_ch_issue_token_in_ep0: - ld a,0x09 - push af - inc sp - xor a, a - ld d,a - ld e,0x80 - push de - call _ch_issue_token - pop af - inc sp - ret -;source-doc/base-drv/ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } -; --------------------------------- -; Function ch_issue_token_setup -; --------------------------------- -_ch_issue_token_setup: - ld a,0x0d - push af - inc sp - xor a, a - push af - inc sp - xor a, a - push af - inc sp - call _ch_issue_token - pop af - inc sp - ret -;source-doc/base-drv/ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { -; --------------------------------- -; Function ch_data_in_transfer -; --------------------------------- -_ch_data_in_transfer: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/base-drv/ch376.c:158: if (buffer_size == 0) - ld a,(ix+7) - or a,(ix+6) - jr NZ,l_ch_data_in_transfer_00102 -;source-doc/base-drv/ch376.c:159: return USB_ERR_OK; - ld l,0x00 - jp l_ch_data_in_transfer_00111 -l_ch_data_in_transfer_00102: -;source-doc/base-drv/ch376.c:161: USB_MODULE_LEDS = 0x01; - ld a,0x01 - ld bc,_USB_MODULE_LEDS - out (c),a -;source-doc/base-drv/ch376.c:162: do { - ld c,(ix+8) - ld b,(ix+9) - pop de - push bc -l_ch_data_in_transfer_00107: -;source-doc/base-drv/ch376.c:163: ch_issue_token_in(endpoint); - ld l,c - ld h,b - push hl - call _ch_issue_token_in - call _ch_long_wait_int_and_get_status - pop bc - ld a, l - ld (_result), a -;source-doc/base-drv/ch376.c:166: CHECK(result); - ld a,(_result) - or a, a - jr NZ,l_ch_data_in_transfer_00110 -;source-doc/base-drv/ch376.c:168: endpoint->toggle = !endpoint->toggle; - ld e, c - ld d, b - pop hl - ld a,(hl) - push hl - and a,0x01 - xor a,0x01 - and a,0x01 - ld l, a - ld a, (de) - and a,0xfe - or a, l - ld (de), a -;source-doc/base-drv/ch376.c:170: count = ch_read_data(buffer); - push bc - ld l,(ix+4) - ld h,(ix+5) - call _ch_read_data - ld e, a - pop bc -;source-doc/base-drv/ch376.c:172: if (count == 0) { - ld a, e -;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00; - or a,a - jr NZ,l_ch_data_in_transfer_00106 - ld bc,_USB_MODULE_LEDS - out (c),a -;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; - ld l,0x04 - jr l_ch_data_in_transfer_00111 -l_ch_data_in_transfer_00106: -;source-doc/base-drv/ch376.c:177: buffer += count; - ld a,(ix+4) - add a, e - ld (ix+4),a - jr NC,l_ch_data_in_transfer_00148 - inc (ix+5) -l_ch_data_in_transfer_00148: -;source-doc/base-drv/ch376.c:178: buffer_size -= count; - ld d,0x00 - ld a,(ix+6) - sub a, e - ld (ix+6),a - ld a,(ix+7) - sbc a, d - ld (ix+7),a -;source-doc/base-drv/ch376.c:179: } while (buffer_size > 0); - xor a, a - cp a,(ix+6) - sbc a,(ix+7) - jp PO, l_ch_data_in_transfer_00149 - xor a,0x80 -l_ch_data_in_transfer_00149: - jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c),a -;source-doc/base-drv/ch376.c:183: return USB_ERR_OK; - ld l,0x00 - jr l_ch_data_in_transfer_00111 -;source-doc/base-drv/ch376.c:184: done: -l_ch_data_in_transfer_00110: -;source-doc/base-drv/ch376.c:185: return result; - ld hl,(_result) - ld h,+((_result) / 256) -l_ch_data_in_transfer_00111: -;source-doc/base-drv/ch376.c:186: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { -; --------------------------------- -; Function ch_data_in_transfer_n -; --------------------------------- -_ch_data_in_transfer_n: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/ch376.c:192: USB_MODULE_LEDS = 0x01; - ld a,0x01 - ld bc,_USB_MODULE_LEDS - out (c),a -;source-doc/base-drv/ch376.c:194: ch_issue_token_in(endpoint); - ld l,(ix+8) - ld h,(ix+9) - call _ch_issue_token_in -;source-doc/base-drv/ch376.c:196: CHECK(ch_long_wait_int_and_get_status()); - call _ch_long_wait_int_and_get_status - ld a, l - ld b, a - or a, a - jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/ch376.c:198: endpoint->toggle = !endpoint->toggle; - ld e,(ix+8) - ld d,(ix+9) - ld c, e - ld b, d - ex de, hl - ld a, (hl) - and a,0x01 - xor a,0x01 - and a,0x01 - ld e, a - ld a, (bc) - and a,0xfe - or a, e - ld (bc), a -;source-doc/base-drv/ch376.c:200: count = ch_read_data(buffer); - ld l,(ix+4) - ld h,(ix+5) - call _ch_read_data -;source-doc/base-drv/ch376.c:202: *buffer_size = count; - ld c,(ix+6) - ld b,(ix+7) - ld (bc), a -;source-doc/base-drv/ch376.c:204: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c),a -;source-doc/base-drv/ch376.c:206: return USB_ERR_OK; - ld l,0x00 - jr l_ch_data_in_transfer_n_00104 -;source-doc/base-drv/ch376.c:207: done: -l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/ch376.c:208: return result; - ld l, b -l_ch_data_in_transfer_n_00104: -;source-doc/base-drv/ch376.c:209: } - pop ix - ret -;source-doc/base-drv/ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { -; --------------------------------- -; Function ch_data_out_transfer -; --------------------------------- -_ch_data_out_transfer: - push ix - ld ix,0 - add ix,sp - push af - dec sp -;source-doc/base-drv/ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); - ld c,(ix+8) - ld b,(ix+9) - ld e, c - ld d, b - inc de - ld a, (de) - ld (ix-3),a -;source-doc/base-drv/ch376.c:216: USB_MODULE_LEDS = 0x02; - ld a,0x02 - push bc - ld bc,_USB_MODULE_LEDS - out (c),a - pop bc -;source-doc/base-drv/ch376.c:218: while (buffer_length > 0) { - ld (ix-2),c - ld (ix-1),b -l_ch_data_out_transfer_00103: - xor a, a - cp a,(ix+6) - sbc a,(ix+7) - jp PO, l_ch_data_out_transfer_00139 - xor a,0x80 -l_ch_data_out_transfer_00139: - jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; - ld d,(ix-3) - ld e,0x00 - ld a, d - sub a,(ix+6) - ld a, e - sbc a,(ix+7) - jp PO, l_ch_data_out_transfer_00140 - xor a,0x80 -l_ch_data_out_transfer_00140: - jp P, l_ch_data_out_transfer_00109 - jr l_ch_data_out_transfer_00110 -l_ch_data_out_transfer_00109: - ld d,(ix+6) - ld e,(ix+7) -l_ch_data_out_transfer_00110: -;source-doc/base-drv/ch376.c:220: buffer = ch_write_data(buffer, size); - push bc - push de - push de - inc sp - ld l,(ix+4) - ld h,(ix+5) - push hl - call _ch_write_data - pop af - inc sp - pop de - pop bc - ld (ix+4),l - ld (ix+5),h -;source-doc/base-drv/ch376.c:221: buffer_length -= size; - ld e,0x00 - ld a,(ix+6) - sub a, d - ld (ix+6),a - ld a,(ix+7) - sbc a, e - ld (ix+7),a -;source-doc/base-drv/ch376.c:222: ch_issue_token_out(endpoint); - ld l,c - ld h,b - push hl - call _ch_issue_token_out - call _ch_long_wait_int_and_get_status - ld a, l - pop bc - ld l, a - or a, a - jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/ch376.c:226: endpoint->toggle = !endpoint->toggle; - ld e, c - ld d, b - ld l,(ix-2) - ld h,(ix-1) - ld a, (hl) - and a,0x01 - xor a,0x01 - and a,0x01 - ld l, a - ld a, (de) - and a,0xfe - or a, l - ld (de), a - jr l_ch_data_out_transfer_00103 -l_ch_data_out_transfer_00105: -;source-doc/base-drv/ch376.c:229: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c),a -;source-doc/base-drv/ch376.c:231: return USB_ERR_OK; - ld l,0x00 -;source-doc/base-drv/ch376.c:232: done: -;source-doc/base-drv/ch376.c:233: return result; -l_ch_data_out_transfer_00106: -;source-doc/base-drv/ch376.c:234: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { -; --------------------------------- -; Function ch_set_usb_address -; --------------------------------- -_ch_set_usb_address: -;source-doc/base-drv/ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR); - push hl - ld l,0x13 - call _ch_command - pop hl -;source-doc/base-drv/ch376.c:238: CH376_DATA_PORT = device_address; - ld a, l - ld bc,_CH376_DATA_PORT - out (c),a -;source-doc/base-drv/ch376.c:239: } - ret - SECTION data_compiler -_result: - DEFB +0x00 - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.asm b/Source/HBIOS/ch376-native/base-drv/class_hub.c.asm deleted file mode 100644 index 15506295..00000000 --- a/Source/HBIOS/ch376-native/base-drv/class_hub.c.asm +++ /dev/null @@ -1,458 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _cmd_get_hub_descriptor - GLOBAL _hub_get_descriptor -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _get_usb_device_config - GLOBAL _find_device_config - GLOBAL _next_device_config - GLOBAL _first_device_config - GLOBAL _find_first_free - GLOBAL _usbtrn_clear_endpoint_halt - GLOBAL _usbtrn_set_address - GLOBAL _usbtrn_set_configuration - GLOBAL _usbtrn_gfull_cfg_desc - GLOBAL _usbtrn_get_config_descriptor - GLOBAL _usbtrn_get_descriptor2 - GLOBAL _usbtrn_get_descriptor - GLOBAL _usbdev_dat_in_trnsfer_0 - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_control_transfer - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/class_hub.c:7: usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1) { -; --------------------------------- -; Function hub_get_descriptor -; --------------------------------- -_hub_get_descriptor: -;source-doc/base-drv/class_hub.c:8: return usb_control_transfer(&cmd_get_hub_descriptor, hub_description, hub_config->address, hub_config->max_packet_size); - ld a,l - ld c,h - inc hl - ld b, (hl) - ld l, a - ld h, c - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld c, a - push bc - push de - ld hl,_cmd_get_hub_descriptor - push hl - call _usb_control_transfer - pop af - pop af - pop af - ld a, l -;source-doc/base-drv/class_hub.c:9: } - ret - SECTION rodata_compiler -_cmd_get_hub_descriptor: - DEFB +0xa0 - DEFB +0x06 - DEFB +0x00 - DEFB +0x29 - DEFB +0x00 - DEFB +0x00 - DEFW +0x0008 - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm deleted file mode 100644 index 0d971506..00000000 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.asm +++ /dev/null @@ -1,834 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _usbdev_control_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_dat_in_trnsfer_0 -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _critical_end - GLOBAL _critical_begin - GLOBAL _usbtrn_clear_endpoint_halt - GLOBAL _usbtrn_set_address - GLOBAL _usbtrn_set_configuration - GLOBAL _usbtrn_gfull_cfg_desc - GLOBAL _usbtrn_get_config_descriptor - GLOBAL _usbtrn_get_descriptor2 - GLOBAL _usbtrn_get_descriptor - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _in_critical_usb_section - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { -; --------------------------------- -; Function usbdev_control_transfer -; --------------------------------- -_usbdev_control_transfer: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); - ld l,(ix+4) - ld h,(ix+5) - ld e,l - ld d,h - inc hl - ld b, (hl) - ex de, hl - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld e,(ix+8) - ld d,(ix+9) - ld c,a - push bc - push de - ld l,(ix+6) - ld h,(ix+7) - push hl - call _usb_control_transfer - pop af - pop af - pop af -;source-doc/base-drv/dev_transfers.c:33: } - pop ix - ret -;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { -; --------------------------------- -; Function usbdev_blk_out_trnsfer -; --------------------------------- -_usbdev_blk_out_trnsfer: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; - ld e,(ix+4) - ld d,(ix+5) - ld c, e - ld b, d - inc bc - inc bc - inc bc -;source-doc/base-drv/dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); - ld l, e - ld h, d - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - push bc - push de - push bc - push af - inc sp - ld l,(ix+8) - ld h,(ix+9) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - call _usb_data_out_transfer - pop af - pop af - pop af - inc sp - pop de - pop bc - ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:41: if (result == USB_ERR_STALL) { - ld a,(_result) - sub a,0x02 - jr NZ,l_usbdev_blk_out_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - ld l, e - ld h, d - inc hl - ld a, (hl) - ld (ix-1),a - ex de, hl - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld d, a - ld l, c - ld h, b - ld a, (hl) - rrca - and a,0x07 - push bc - ld h,(ix-1) - ld l,d - push hl - push af - inc sp - call _usbtrn_clear_endpoint_halt - pop af - inc sp - pop bc -;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; - ld a, (bc) - and a,0xfe - ld (bc), a -;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; - ld l,0x02 - jr l_usbdev_blk_out_trnsfer_00104 -l_usbdev_blk_out_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); -;source-doc/base-drv/dev_transfers.c:50: return result; - ld hl,(_result) -l_usbdev_blk_out_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:51: } - inc sp - pop ix - ret -;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { -; --------------------------------- -; Function usbdev_bulk_in_transfer -; --------------------------------- -_usbdev_bulk_in_transfer: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; - ld c,(ix+4) - ld b,(ix+5) - ld hl,0x0006 - add hl, bc -;source-doc/base-drv/dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); - ld e,c - ld d,b - ex de,hl - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - push bc - push de - push de - push af - inc sp - ld l,(ix+8) - ld h,(ix+9) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - call _usb_data_in_transfer_n - pop af - pop af - pop af - inc sp - pop de - pop bc - ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:58: if (result == USB_ERR_STALL) { - ld a,(_result) - sub a,0x02 - jr NZ,l_usbdev_bulk_in_transfer_00102 -;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - ld l, c - ld h, b - inc hl - ld a, (hl) - ld (ix-1),a - ld l, c - ld h, b - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld b, a - ld l, e - ld h, d - ld a, (hl) - rrca - and a,0x07 - push de - ld h,(ix-1) - ld l,b - push hl - push af - inc sp - call _usbtrn_clear_endpoint_halt - pop af - inc sp - pop de -;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; - ex de, hl - res 0, (hl) -;source-doc/base-drv/dev_transfers.c:61: return USB_ERR_STALL; - ld l,0x02 - jr l_usbdev_bulk_in_transfer_00104 -l_usbdev_bulk_in_transfer_00102: -;source-doc/base-drv/dev_transfers.c:64: RETURN_CHECK(result); -;source-doc/base-drv/dev_transfers.c:66: return result; - ld hl,(_result) -l_usbdev_bulk_in_transfer_00104: -;source-doc/base-drv/dev_transfers.c:67: } - inc sp - pop ix - ret -;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, -; --------------------------------- -; Function usbdev_dat_in_trnsfer -; --------------------------------- -_usbdev_dat_in_trnsfer: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; - ld e,(ix+4) - ld d,(ix+5) - ld c, e - ld b, d - inc bc - inc bc - inc bc - push de - ld a,(ix+10) - ld e, a - add a, a - add a, e - pop de - add a, c - ld c, a - ld a,0x00 - adc a, b - ld b, a -;source-doc/base-drv/dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - ld l, e - ld h, d - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - push bc - push de - push bc - push af - inc sp - ld l,(ix+8) - ld h,(ix+9) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - call _usb_data_in_transfer - pop af - pop af - pop af - inc sp - pop de - pop bc - ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:78: if (result == USB_ERR_STALL) { - ld a,(_result) - sub a,0x02 - jr NZ,l_usbdev_dat_in_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - ld l, e - ld h, d - inc hl - ld a, (hl) - ld (ix-1),a - ex de, hl - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld d, a - ld l, c - ld h, b - ld a, (hl) - rrca - and a,0x07 - push bc - ld h,(ix-1) - ld l,d - push hl - push af - inc sp - call _usbtrn_clear_endpoint_halt - pop af - inc sp - pop bc -;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; - ld a, (bc) - and a,0xfe - ld (bc), a -;source-doc/base-drv/dev_transfers.c:81: return USB_ERR_STALL; - ld l,0x02 - jr l_usbdev_dat_in_trnsfer_00104 -l_usbdev_dat_in_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:84: RETURN_CHECK(result); -;source-doc/base-drv/dev_transfers.c:86: return result; - ld hl,(_result) -l_usbdev_dat_in_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:87: } - inc sp - pop ix - ret -;source-doc/base-drv/dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { -; --------------------------------- -; Function usbdev_dat_in_trnsfer_0 -; --------------------------------- -_usbdev_dat_in_trnsfer_0: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/base-drv/dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; - ld e,(ix+4) - ld d,(ix+5) - ld hl,0x0003 - add hl, de - ex (sp), hl -;source-doc/base-drv/dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); - ld l, e - ld h, d - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld c,(ix+8) - ld b,0x00 - push de - ld l,(ix-2) - ld h,(ix-1) - push hl - push af - inc sp - push bc - ld l,(ix+6) - ld h,(ix+7) - push hl - call _usb_data_in_transfer - pop af - pop af - pop af - inc sp - pop de - ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { - ld a,(_result) - sub a,0x02 - jr NZ,l_usbdev_dat_in_trnsfer_0_00102 -;source-doc/base-drv/dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - ld l, e - ld h, d - inc hl - ld b, (hl) - ex de, hl - ld a, (hl) - rlca - rlca - rlca - rlca - and a,0x0f - ld d, a - pop hl - ld a,(hl) - push hl - rrca - and a,0x07 - ld c, d - push bc - push af - inc sp - call _usbtrn_clear_endpoint_halt - pop af - inc sp -;source-doc/base-drv/dev_transfers.c:96: endpoint->toggle = 0; - pop hl - push hl - res 0, (hl) -;source-doc/base-drv/dev_transfers.c:97: return USB_ERR_STALL; - ld l,0x02 - jr l_usbdev_dat_in_trnsfer_0_00103 -l_usbdev_dat_in_trnsfer_0_00102: -;source-doc/base-drv/dev_transfers.c:100: return result; - ld hl,(_result) -l_usbdev_dat_in_trnsfer_0_00103: -;source-doc/base-drv/dev_transfers.c:101: } - ld sp, ix - pop ix - ret - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.asm b/Source/HBIOS/ch376-native/base-drv/enumerate.c.asm deleted file mode 100644 index 5fbd81a5..00000000 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.asm +++ /dev/null @@ -1,1472 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _op_get_cfg_desc - GLOBAL _op_cap_drv_intf - GLOBAL _op_capture_hub_driver_interface - GLOBAL _configure_device - GLOBAL _op_endpoint_next - GLOBAL _op_interface_next - GLOBAL _identify_class_driver - GLOBAL _parse_endpoint_keyboard - GLOBAL _op_parse_endpoint - GLOBAL _op_id_class_drv - GLOBAL _read_all_configs - GLOBAL _enumerate_all_devices -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _print_uint16 - GLOBAL _print_string - GLOBAL _print_hex - GLOBAL _ffsll_callee - GLOBAL _ffsll - GLOBAL _strxfrm_callee - GLOBAL _strxfrm - GLOBAL _strupr_fastcall - GLOBAL _strupr - GLOBAL _strtok_r_callee - GLOBAL _strtok_r - GLOBAL _strtok_callee - GLOBAL _strtok - GLOBAL _strstrip_fastcall - GLOBAL _strstrip - GLOBAL _strstr_callee - GLOBAL _strstr - GLOBAL _strspn_callee - GLOBAL _strspn - GLOBAL _strsep_callee - GLOBAL _strsep - GLOBAL _strrstrip_fastcall - GLOBAL _strrstrip - GLOBAL _strrstr_callee - GLOBAL _strrstr - GLOBAL _strrspn_callee - GLOBAL _strrspn - GLOBAL _strrev_fastcall - GLOBAL _strrev - GLOBAL _strrcspn_callee - GLOBAL _strrcspn - GLOBAL _strrchr_callee - GLOBAL _strrchr - GLOBAL _strpbrk_callee - GLOBAL _strpbrk - GLOBAL _strnlen_callee - GLOBAL _strnlen - GLOBAL _strnicmp_callee - GLOBAL _strnicmp - GLOBAL _strndup_callee - GLOBAL _strndup - GLOBAL _strncpy_callee - GLOBAL _strncpy - GLOBAL _strncmp_callee - GLOBAL _strncmp - GLOBAL _strnchr_callee - GLOBAL _strnchr - GLOBAL _strncat_callee - GLOBAL _strncat - GLOBAL _strncasecmp_callee - GLOBAL _strncasecmp - GLOBAL _strlwr_fastcall - GLOBAL _strlwr - GLOBAL _strlen_fastcall - GLOBAL _strlen - GLOBAL _strlcpy_callee - GLOBAL _strlcpy - GLOBAL _strlcat_callee - GLOBAL _strlcat - GLOBAL _stricmp_callee - GLOBAL _stricmp - GLOBAL _strerror_fastcall - GLOBAL _strerror - GLOBAL _strdup_fastcall - GLOBAL _strdup - GLOBAL _strcspn_callee - GLOBAL _strcspn - GLOBAL _strcpy_callee - GLOBAL _strcpy - GLOBAL _strcoll_callee - GLOBAL _strcoll - GLOBAL _strcmp_callee - GLOBAL _strcmp - GLOBAL _strchrnul_callee - GLOBAL _strchrnul - GLOBAL _strchr_callee - GLOBAL _strchr - GLOBAL _strcat_callee - GLOBAL _strcat - GLOBAL _strcasecmp_callee - GLOBAL _strcasecmp - GLOBAL _stpncpy_callee - GLOBAL _stpncpy - GLOBAL _stpcpy_callee - GLOBAL _stpcpy - GLOBAL _memswap_callee - GLOBAL _memswap - GLOBAL _memset_wr_callee - GLOBAL _memset_wr - GLOBAL _memset_callee - GLOBAL _memset - GLOBAL _memrchr_callee - GLOBAL _memrchr - GLOBAL _memmove_callee - GLOBAL _memmove - GLOBAL _memmem_callee - GLOBAL _memmem - GLOBAL _memcpy_callee - GLOBAL _memcpy - GLOBAL _memcmp_callee - GLOBAL _memcmp - GLOBAL _memchr_callee - GLOBAL _memchr - GLOBAL _memccpy_callee - GLOBAL _memccpy - GLOBAL _ffsl_fastcall - GLOBAL _ffsl - GLOBAL _ffs_fastcall - GLOBAL _ffs - GLOBAL __strrstrip__fastcall - GLOBAL __strrstrip_ - GLOBAL __memupr__callee - GLOBAL __memupr_ - GLOBAL __memstrcpy__callee - GLOBAL __memstrcpy_ - GLOBAL __memlwr__callee - GLOBAL __memlwr_ - GLOBAL _rawmemchr_callee - GLOBAL _rawmemchr - GLOBAL _strnset_callee - GLOBAL _strnset - GLOBAL _strset_callee - GLOBAL _strset - GLOBAL _rindex_callee - GLOBAL _rindex - GLOBAL _index_callee - GLOBAL _index - GLOBAL _bzero_callee - GLOBAL _bzero - GLOBAL _bcopy_callee - GLOBAL _bcopy - GLOBAL _bcmp_callee - GLOBAL _bcmp - GLOBAL _get_number_of_usb_drives - GLOBAL _parse_endpoints - GLOBAL _configure_usb_hub - GLOBAL _get_usb_device_config - GLOBAL _find_device_config - GLOBAL _next_device_config - GLOBAL _first_device_config - GLOBAL _find_first_free - GLOBAL _usbtrn_clear_endpoint_halt - GLOBAL _usbtrn_set_address - GLOBAL _usbtrn_set_configuration - GLOBAL _usbtrn_gfull_cfg_desc - GLOBAL _usbtrn_get_config_descriptor - GLOBAL _usbtrn_get_descriptor2 - GLOBAL _usbtrn_get_descriptor - GLOBAL _usbdev_dat_in_trnsfer_0 - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_control_transfer - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _x - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/enumerate.c:13: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) -; --------------------------------- -; Function parse_endpoint_keyboard -; --------------------------------- -_parse_endpoint_keyboard: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/base-drv/enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; - inc hl - inc hl - inc hl -;source-doc/base-drv/enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; - ld c,l - ld b,h - ex (sp),hl - ld l, e - ld h, d - inc hl - inc hl - ld a, (hl) - pop hl - push hl - rlca - and a,0x0e - push bc - ld c, a - ld a, (hl) - and a,0xf1 - or a, c - ld (hl), a -;source-doc/base-drv/enumerate.c:17: ep->toggle = 0; - pop hl - ld c,l - ld b,h - res 0, (hl) -;source-doc/base-drv/enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); - inc bc - ld hl,4 - add hl, de - ld e, (hl) - inc hl - ld a, (hl) - and a,0x03 - ld d, a - ld a, e - ld (bc), a - inc bc - ld a, d - and a,0x03 - ld l,a - ld a, (bc) - and a,0xfc - or a, l - ld (bc), a -;source-doc/base-drv/enumerate.c:19: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { -; --------------------------------- -; Function identify_class_driver -; --------------------------------- -_identify_class_driver: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; - ld c,(ix+4) - ld b,(ix+5) - ld hl,27 - add hl, bc - ld c, (hl) - inc hl - ld b, (hl) -;source-doc/base-drv/enumerate.c:23: if (p->bInterfaceClass == 2) - ld hl,5 - add hl,bc - ld a,(hl) - ld e,a - sub a,0x02 - jr NZ,l_identify_class_driver_00102 -;source-doc/base-drv/enumerate.c:24: return USB_IS_CDC; - ld l,0x03 - jr l_identify_class_driver_00118 -l_identify_class_driver_00102: -;source-doc/base-drv/enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) - ld a, e - sub a,0x08 - jr NZ,l_identify_class_driver_00199 - ld a,0x01 - jr l_identify_class_driver_00200 -l_identify_class_driver_00199: - xor a,a -l_identify_class_driver_00200: - ld d,a - or a, a - jr Z,l_identify_class_driver_00104 - ld hl,0x0006 - add hl,bc - ld a, (hl) - cp a,0x06 - jr Z,l_identify_class_driver_00107 - sub a,0x05 - jr NZ,l_identify_class_driver_00104 -l_identify_class_driver_00107: - ld hl,0x0007 - add hl,bc - ld a, (hl) - sub a,0x50 - jr NZ,l_identify_class_driver_00104 -;source-doc/base-drv/enumerate.c:27: return USB_IS_MASS_STORAGE; - ld l,0x02 - jr l_identify_class_driver_00118 -l_identify_class_driver_00104: -;source-doc/base-drv/enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) - ld a, d - or a, a - jr Z,l_identify_class_driver_00109 - ld hl,0x0006 - add hl,bc - ld a, (hl) - sub a,0x04 - jr NZ,l_identify_class_driver_00109 - ld hl,0x0007 - add hl,bc - ld a, (hl) - or a, a - jr NZ,l_identify_class_driver_00109 -;source-doc/base-drv/enumerate.c:30: return USB_IS_FLOPPY; - ld l,0x01 - jr l_identify_class_driver_00118 -l_identify_class_driver_00109: -;source-doc/base-drv/enumerate.c:32: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) - ld a, e - sub a,0x09 - jr NZ,l_identify_class_driver_00113 - ld hl,0x0006 - add hl,bc - ld a, (hl) - or a, a - jr NZ,l_identify_class_driver_00113 - ld hl,7 - add hl, bc - ld a, (hl) - or a, a - jr NZ,l_identify_class_driver_00113 -;source-doc/base-drv/enumerate.c:33: return USB_IS_HUB; - ld l,0x0f - jr l_identify_class_driver_00118 -l_identify_class_driver_00113: -;source-doc/base-drv/enumerate.c:35: if (p->bInterfaceClass == 3) - ld a, e - sub a,0x03 - jr NZ,l_identify_class_driver_00117 -;source-doc/base-drv/enumerate.c:36: return USB_IS_KEYBOARD; - ld l,0x04 - jr l_identify_class_driver_00118 -l_identify_class_driver_00117: -;source-doc/base-drv/enumerate.c:38: return USB_IS_UNKNOWN; - ld l,0x06 -l_identify_class_driver_00118: -;source-doc/base-drv/enumerate.c:39: } - pop ix - ret -;source-doc/base-drv/enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { -; --------------------------------- -; Function op_interface_next -; --------------------------------- -_op_interface_next: - ex de, hl -;source-doc/base-drv/enumerate.c:42: if (--working->interface_count == 0) - ld hl,0x0016 - add hl, de - ld a, (hl) - dec a - ld (hl), a -;source-doc/base-drv/enumerate.c:43: return USB_ERR_OK; - or a,a - jr NZ,l_op_interface_next_00102 - ld l,a - jr l_op_interface_next_00103 -l_op_interface_next_00102: -;source-doc/base-drv/enumerate.c:45: return op_id_class_drv(working); - ex de, hl - call _op_id_class_drv - ld l, a -l_op_interface_next_00103: -;source-doc/base-drv/enumerate.c:46: } - ret -;source-doc/base-drv/enumerate.c:48: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { -; --------------------------------- -; Function op_endpoint_next -; --------------------------------- -_op_endpoint_next: - ex de, hl -;source-doc/base-drv/enumerate.c:49: if (--working->endpoint_count > 0) { - ld hl,0x0017 - add hl, de - ld a, (hl) - dec a - ld (hl), a - or a, a - jr Z,l_op_endpoint_next_00102 -;source-doc/base-drv/enumerate.c:50: working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; - ld hl,0x001b - add hl, de - ld c, (hl) - inc hl - ld b, (hl) - dec hl - ld a, (bc) - add a, c - ld c, a - ld a,0x00 - adc a, b - ld (hl), c - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:51: return op_parse_endpoint(working); - ex de, hl - jp _op_parse_endpoint - jr l_op_endpoint_next_00103 -l_op_endpoint_next_00102: -;source-doc/base-drv/enumerate.c:54: return op_interface_next(working); - ex de, hl - call _op_interface_next - ld a, l -l_op_endpoint_next_00103: -;source-doc/base-drv/enumerate.c:55: } - ret -;source-doc/base-drv/enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { -; --------------------------------- -; Function op_parse_endpoint -; --------------------------------- -_op_parse_endpoint: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/base-drv/enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; - ld de,0x001c - ld c,l - ld b,h - add hl, de - ld a, (hl) - dec hl - ld l, (hl) - ld (ix-2),l - ld (ix-1),a -;source-doc/base-drv/enumerate.c:59: device_config *const device = working->p_current_device; - ld hl,29 - add hl,bc - ld e, (hl) - inc hl - ld d, (hl) -;source-doc/base-drv/enumerate.c:61: switch (working->usb_device) { - ld l, c - ld h, b - inc hl - inc hl - ld a, (hl) - cp a,0x01 - jr Z,l_op_parse_endpoint_00102 - cp a,0x02 - jr Z,l_op_parse_endpoint_00102 - sub a,0x04 - jr Z,l_op_parse_endpoint_00103 - jr l_op_parse_endpoint_00104 -;source-doc/base-drv/enumerate.c:63: case USB_IS_MASS_STORAGE: { -l_op_parse_endpoint_00102: -;source-doc/base-drv/enumerate.c:64: parse_endpoints(device, endpoint); - push bc - ld l,(ix-2) - ld h,(ix-1) - push hl - push de - call _parse_endpoints - pop af - pop af - pop bc -;source-doc/base-drv/enumerate.c:65: break; - jr l_op_parse_endpoint_00104 -;source-doc/base-drv/enumerate.c:68: case USB_IS_KEYBOARD: { -l_op_parse_endpoint_00103: -;source-doc/base-drv/enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); - ex de, hl - push bc - ld e,(ix-2) - ld d,(ix-1) - call _parse_endpoint_keyboard - pop bc -;source-doc/base-drv/enumerate.c:72: } -l_op_parse_endpoint_00104: -;source-doc/base-drv/enumerate.c:74: return op_endpoint_next(working); - ld l, c - ld h, b - call _op_endpoint_next -;source-doc/base-drv/enumerate.c:75: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { -; --------------------------------- -; Function configure_device -; --------------------------------- -_configure_device: - push ix - ld ix,0 - add ix,sp - push af - push af -;source-doc/base-drv/enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; - ld a,(ix+8) - ld (ix-4),a - ld a,(ix+9) - ld (ix-3),a - pop bc - push bc - inc bc - inc bc - ld e,(ix+6) - ld d,(ix+7) - inc de - inc de - ld a, (de) - ld (bc), a -;source-doc/base-drv/enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; - ld a,(ix-4) - add a,0x01 - ld (ix-2),a - ld a,(ix-3) - adc a,0x00 - ld (ix-1),a - ld c,(ix+4) - ld b,(ix+5) - ld hl,10 - add hl,bc - ld a, (hl) - pop de - pop hl - push hl -;source-doc/base-drv/enumerate.c:81: dev_cfg->address = working->current_device_address; - ld (hl),a - push de - ld hl,0x0018 - add hl,bc - ld a, (hl) - add a, a - add a, a - add a, a - add a, a - ld l, a - ld a, (de) - and a,0x0f - or a, l - ld (de), a -;source-doc/base-drv/enumerate.c:82: dev_cfg->type = working->usb_device; - pop de - push de - ld l, c - ld h, b - inc hl - inc hl - ld a, (hl) - and a,0x0f - ld l, a - ld a, (de) - and a,0xf0 - or a, l - ld (de), a -;source-doc/base-drv/enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); - ld hl,36 - add hl, bc - ld b, (hl) - ld l,(ix-2) - ld h,(ix-1) - ld d, (hl) - pop hl - ld a,(hl) - push hl - rlca - rlca - rlca - rlca - and a,0x0f - ld c, d - push bc - push af - inc sp - call _usbtrn_set_configuration -;source-doc/base-drv/enumerate.c:85: } - ld sp,ix - pop ix - ret -;source-doc/base-drv/enumerate.c:87: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { -; --------------------------------- -; Function op_capture_hub_driver_interface -; --------------------------------- -_op_capture_hub_driver_interface: - push ix - ld ix,0 - add ix,sp - push af - push af - push af - dec sp - ex de, hl -;source-doc/base-drv/enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - ld hl,0x001c - add hl,de - ld a, (hl) - dec hl - ld l, (hl) - ld (ix-4),l - ld (ix-3),a -;source-doc/base-drv/enumerate.c:92: working->hub_config = &hub_config; - ld hl,0x0019 - add hl, de - ld (ix-2),l - ld (ix-1),h - ld hl,0 - add hl, sp - ld c, l - ld l,(ix-2) - ld b,h - ld h,(ix-1) - ld (hl), c - inc hl - ld (hl), b -;source-doc/base-drv/enumerate.c:94: hub_config.type = USB_IS_HUB; - ld hl,0 - add hl, sp - ld a, (hl) - or a,0x0f - ld (hl), a -;source-doc/base-drv/enumerate.c:95: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); - push de - ld hl,2 - add hl, sp - push hl - ld l,(ix-4) - ld h,(ix-3) - push hl - push de - call _configure_device - pop af - pop af - pop af - pop de - ld a, l - inc l - dec l - jr NZ,l_op_capture_hub_driver_interface_00103 -;source-doc/base-drv/enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); - ex de, hl - call _configure_usb_hub - ld a, l -;source-doc/base-drv/enumerate.c:97: done: -l_op_capture_hub_driver_interface_00103: -;source-doc/base-drv/enumerate.c:98: return result; -;source-doc/base-drv/enumerate.c:99: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { -; --------------------------------- -; Function op_cap_drv_intf -; --------------------------------- -_op_cap_drv_intf: - push ix - ld ix,0 - add ix,sp - ld c, l - ld b, h - ld hl, -16 - add hl, sp - ld sp, hl -;source-doc/base-drv/enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - ld (ix-2),c - ld l, c - ld (ix-1),b - ld h,b - ld de,0x001b - add hl, de - ld e, (hl) - inc hl - ld d, (hl) - dec hl - ld c, e - ld b, d -;source-doc/base-drv/enumerate.c:106: working->ptr += interface->bLength; - ld a, (bc) - add a, e - ld e, a - ld a,0x00 - adc a, d - ld (hl), e - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:107: working->endpoint_count = interface->bNumEndpoints; - ld a,(ix-2) - add a,0x17 - ld e, a - ld a,(ix-1) - adc a,0x00 - ld d, a - ld l, c - ld h, b - inc hl - inc hl - inc hl - inc hl - ld a, (hl) - ld (de), a -;source-doc/base-drv/enumerate.c:108: working->p_current_device = NULL; - ld a,(ix-2) - add a,0x1d - ld (ix-4),a - ld l,a - ld a,(ix-1) - adc a,0x00 - ld (ix-3),a - ld h,a - xor a, a - ld (hl), a - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:110: switch (working->usb_device) { - ld l,(ix-2) - ld h,(ix-1) - inc hl - inc hl - ld a, (hl) - cp a,0x06 - jr Z,l_op_cap_drv_intf_00104 - sub a,0x0f - jr NZ,l_op_cap_drv_intf_00107 -;source-doc/base-drv/enumerate.c:112: CHECK(op_capture_hub_driver_interface(working)) - ld l,(ix-2) - ld h,(ix-1) - call _op_capture_hub_driver_interface - or a, a - jr Z,l_op_cap_drv_intf_00112 - jr l_op_cap_drv_intf_00113 -;source-doc/base-drv/enumerate.c:116: case USB_IS_UNKNOWN: { -l_op_cap_drv_intf_00104: -;source-doc/base-drv/enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config)); - push bc - ld hl,2 - add hl, sp - ld b,0x06 -l_op_cap_drv_intf_00154: - xor a, a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_op_cap_drv_intf_00154 - pop bc -;source-doc/base-drv/enumerate.c:119: working->p_current_device = &unkown_dev_cfg; - ld hl,0 - add hl, sp - ex de, hl - ld l,(ix-4) - ld h,(ix-3) - ld (hl), e - inc hl - ld (hl), d -;source-doc/base-drv/enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); - ld hl,0 - add hl, sp - push hl - push bc - ld l,(ix-2) - ld h,(ix-1) - push hl - call _configure_device - pop af - pop af - pop af - ld a, l - or a, a - jr Z,l_op_cap_drv_intf_00112 - jr l_op_cap_drv_intf_00113 -;source-doc/base-drv/enumerate.c:124: default: { -l_op_cap_drv_intf_00107: -;source-doc/base-drv/enumerate.c:125: device_config *dev_cfg = find_first_free(); - push bc - call _find_first_free -;source-doc/base-drv/enumerate.c:126: if (dev_cfg == NULL) - pop bc - ld a,h - or a,l - ex de,hl - jr NZ,l_op_cap_drv_intf_00109 -;source-doc/base-drv/enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; - ld l,0x83 - jr l_op_cap_drv_intf_00114 -l_op_cap_drv_intf_00109: -;source-doc/base-drv/enumerate.c:128: working->p_current_device = dev_cfg; - ld l,(ix-4) - ld h,(ix-3) - ld (hl), e - inc hl - ld (hl), d -;source-doc/base-drv/enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); - push de - push bc - ld l,(ix-2) - ld h,(ix-1) - push hl - call _configure_device - pop af - pop af - pop af - ld a, l - or a, a - jr NZ,l_op_cap_drv_intf_00113 -;source-doc/base-drv/enumerate.c:132: } -l_op_cap_drv_intf_00112: -;source-doc/base-drv/enumerate.c:134: result = op_parse_endpoint(working); - ld l,(ix-2) - ld h,(ix-1) - call _op_parse_endpoint -;source-doc/base-drv/enumerate.c:136: done: -l_op_cap_drv_intf_00113: -;source-doc/base-drv/enumerate.c:137: return result; - ld l, a -l_op_cap_drv_intf_00114: -;source-doc/base-drv/enumerate.c:138: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { -; --------------------------------- -; Function op_id_class_drv -; --------------------------------- -_op_id_class_drv: - ex de, hl -;source-doc/base-drv/enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; - ld hl,0x001c - add hl,de - ld a, (hl) - dec hl - ld l, (hl) -;source-doc/base-drv/enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; - ld c, e - ld b, d - inc bc - inc bc - ld h, a - ld l, (hl) - ld a,0x05 - sub a, l - jr NC,l_op_id_class_drv_00103 - push bc - push de - push de - call _identify_class_driver - pop af - ld a, l - pop de - pop bc - jr l_op_id_class_drv_00104 -l_op_id_class_drv_00103: - xor a, a -l_op_id_class_drv_00104: - ld (bc), a -;source-doc/base-drv/enumerate.c:145: return op_cap_drv_intf(working); - ex de, hl - call _op_cap_drv_intf - ld a, l -;source-doc/base-drv/enumerate.c:146: } - ret -;source-doc/base-drv/enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { -; --------------------------------- -; Function op_get_cfg_desc -; --------------------------------- -_op_get_cfg_desc: - push ix - ld ix,0 - add ix,sp - push af - ex de, hl -;source-doc/base-drv/enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); - ld hl,0x001f - add hl, de - pop af - push hl - ld b,0x46 -l_op_get_cfg_desc_00113: - xor a, a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_op_get_cfg_desc_00113 -;source-doc/base-drv/enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; - ld c, e - ld b, d - inc bc - inc bc - inc bc - ld hl,7 - add hl, bc - ld a, (hl) -;source-doc/base-drv/enumerate.c:154: working->config.buffer)); - ld c, e - ld b, d - ld hl,24 - add hl, bc - ld b, (hl) - ld l, e - ld h, d - push bc - ld bc,0x0015 - add hl, bc - pop bc - ld c, (hl) - push de - ld l,(ix-2) - ld h,(ix-1) - push hl - ld h,0x8c - ld l,a - push hl - push bc - call _usbtrn_gfull_cfg_desc - pop af - pop af - pop af - pop de - ld a, l - ld (_result), a - ld a,(_result) - or a, a - jr NZ,l_op_get_cfg_desc_00103 -;source-doc/base-drv/enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); - ld hl,0x001b - add hl, de - ld a, e - add a,0x1f - ld c, a - ld a, d - adc a,0x00 - ld b, a - ld a, c - add a,0x09 - ld c, a - ld a, b - adc a,0x00 - ld (hl), c - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; - ld hl,0x0016 - add hl, de - ld c, l - ld b, h - pop hl - push hl - inc hl - inc hl - inc hl - inc hl - ld a, (hl) - ld (bc), a -;source-doc/base-drv/enumerate.c:159: return op_id_class_drv(working); - ex de, hl - call _op_id_class_drv - jr l_op_get_cfg_desc_00104 -;source-doc/base-drv/enumerate.c:160: done: -l_op_get_cfg_desc_00103: -;source-doc/base-drv/enumerate.c:161: return result; - ld hl,_result - ld a, (hl) -l_op_get_cfg_desc_00104: -;source-doc/base-drv/enumerate.c:162: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { -; --------------------------------- -; Function read_all_configs -; --------------------------------- -_read_all_configs: - push ix - ld ix,0 - add ix,sp - ld hl, -171 - add hl, sp - ld sp, hl -;source-doc/base-drv/enumerate.c:169: memset(&working, 0, sizeof(_working)); - ld hl,0 - add hl, sp - ld (hl),0x00 - ld e, l - ld d, h - inc de - ld bc,0x00aa - ldir -;source-doc/base-drv/enumerate.c:170: working.state = state; - ld a,(ix+4) - ld hl,0 - add hl, sp - ld (hl), a - ld a,(ix+5) - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); - ld hl,3 - add hl, sp - push hl - call _usbtrn_get_descriptor - pop af - ld a, l - or a, a - jr NZ,l_read_all_configs_00108 -;source-doc/base-drv/enumerate.c:174: state->next_device_address++; - ld e,(ix+4) - ld d,(ix+5) - ld a, (de) - inc a - ld c,a - ld (de), a -;source-doc/base-drv/enumerate.c:175: working.current_device_address = state->next_device_address; - ld hl,24 - add hl, sp - ld (hl), c -;source-doc/base-drv/enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); - ld l, c - call _usbtrn_set_address - ld a, l -;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { - or a,a - jr NZ,l_read_all_configs_00108 - ld c,a -l_read_all_configs_00110: - ld hl,20 - add hl, sp - ld b, (hl) - ld a, c - sub a, b - jr NC,l_read_all_configs_00107 -;source-doc/base-drv/enumerate.c:179: working.config_index = config_index; - inc hl - ld (hl), c -;source-doc/base-drv/enumerate.c:181: CHECK(op_get_cfg_desc(&working)); - push bc - ld hl,2 - add hl, sp - call _op_get_cfg_desc - pop bc - or a, a - jr NZ,l_read_all_configs_00108 -;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { - inc c - jr l_read_all_configs_00110 -l_read_all_configs_00107: -;source-doc/base-drv/enumerate.c:184: return USB_ERR_OK; - ld l,0x00 - jr l_read_all_configs_00112 -;source-doc/base-drv/enumerate.c:185: done: -l_read_all_configs_00108: -;source-doc/base-drv/enumerate.c:186: return result; - ld l, a -l_read_all_configs_00112: -;source-doc/base-drv/enumerate.c:187: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { -; --------------------------------- -; Function enumerate_all_devices -; --------------------------------- -_enumerate_all_devices: - push ix - dec sp -;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); -;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); - ld hl,0 - add hl, sp - ld e,l - ld d,h -;source-doc/base-drv/enumerate.c:193: state.next_device_address = 0; - xor a,a - ld (hl),a - ld (de), a -;source-doc/base-drv/enumerate.c:195: usb_error result = read_all_configs(&state); - push de - push de - call _read_all_configs - pop af - ld c, l - pop de -;source-doc/base-drv/enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; - ld a, (de) - ld ((_x + 1)),a -;source-doc/base-drv/enumerate.c:200: return result; - ld l, c -;source-doc/base-drv/enumerate.c:201: } - inc sp - pop ix - ret - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.asm b/Source/HBIOS/ch376-native/base-drv/transfers.c.asm deleted file mode 100644 index 0bc83830..00000000 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.asm +++ /dev/null @@ -1,829 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _usb_dat_in_trns_n_ext - GLOBAL _usb_dat_in_trnsfer_ext - GLOBAL _usb_ctrl_trnsfer_ext - GLOBAL _usb_control_transfer - GLOBAL _usb_data_in_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_out_transfer -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _critical_end - GLOBAL _critical_begin - GLOBAL _print_uint16 - GLOBAL _print_string - GLOBAL _print_hex - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _in_critical_usb_section - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/transfers.c:24: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, -; --------------------------------- -; Function usb_ctrl_trnsfer_ext -; --------------------------------- -_usb_ctrl_trnsfer_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) - ld a,(ix+5) - sub a,0x80 - jr NC,l_usb_ctrl_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:29: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_ctrl_trnsfer_ext_00106 -l_usb_ctrl_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - ld a,(ix+7) - or a,(ix+6) - jr Z,l_usb_ctrl_trnsfer_ext_00104 - ld a,(ix+7) - sub a,0x80 - jr NC,l_usb_ctrl_trnsfer_ext_00104 -;source-doc/base-drv/transfers.c:32: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_ctrl_trnsfer_ext_00106 -l_usb_ctrl_trnsfer_ext_00104: -;source-doc/base-drv/transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); - ld h,(ix+9) - ld l,(ix+8) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_control_transfer - pop af - pop af - pop af -l_usb_ctrl_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:35: } - pop ix - ret -;source-doc/base-drv/transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, -; --------------------------------- -; Function usb_control_transfer -; --------------------------------- -_usb_control_transfer: - push ix - ld ix,0 - add ix,sp - push af - push af -;source-doc/base-drv/transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; - ld hl,0 - add hl, sp - set 0, (hl) - ld hl,0 - add hl, sp - ld a, (hl) - and a,0xf1 - ld (hl), a - ld c,(ix+9) - ld b,0x00 - ld hl,1 - add hl, sp - ld (hl), c - inc hl - ld a, b - and a,0x03 - ld e,a - ld a, (hl) - and a,0xfc - or a, e - ld (hl), a -;source-doc/base-drv/transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); - ld c,(ix+4) - ld b,(ix+5) - ld a, (bc) - and a,0x80 -;source-doc/base-drv/transfers.c:56: if (transferIn && buffer == 0) - ld (ix-1),a - or a, a - jr Z,l_usb_control_transfer_00102 - ld a,(ix+7) - or a,(ix+6) - jr NZ,l_usb_control_transfer_00102 -;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; - ld l,0x0f - jp l_usb_control_transfer_00114 -l_usb_control_transfer_00102: -;source-doc/base-drv/transfers.c:59: critical_begin(); - push bc - call _critical_begin - ld l,(ix+8) - call _ch_set_usb_address - pop bc -;source-doc/base-drv/transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); - ld e,(ix+4) - ld d,(ix+5) - push bc - ld a,0x08 - push af - inc sp - push de - call _ch_write_data - pop af - inc sp - call _ch_issue_token_setup - call _ch_short_wait_int_and_get_status - pop bc -;source-doc/base-drv/transfers.c:66: CHECK(result); - ld a, l - or a, a - jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:68: const uint16_t length = cmd_packet->wLength; - ld hl,6 - add hl, bc - ld c, (hl) - inc hl -;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) - ld a,(hl) - ld b,a - or a, c - jr Z,l_usb_control_transfer_00116 - ld e,(ix+6) - ld d,(ix+7) - ld a,(ix-1) - or a, a - jr Z,l_usb_control_transfer_00118 - ld hl,0 - add hl, sp - push hl - push bc - push de - call _ch_data_in_transfer - pop af - pop af - pop af - jr l_usb_control_transfer_00119 -l_usb_control_transfer_00118: - ld hl,0 - add hl, sp - push hl - push bc - push de - call _ch_data_out_transfer - pop af - pop af - pop af -l_usb_control_transfer_00119: - jr l_usb_control_transfer_00117 -l_usb_control_transfer_00116: -;source-doc/base-drv/transfers.c:72: : USB_ERR_OK; - ld l,0x00 -l_usb_control_transfer_00117: -;source-doc/base-drv/transfers.c:74: CHECK(result) - ld a, l - or a, a - jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:76: if (transferIn) { - ld a,(ix-1) - or a, a - jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA); - ld l,0x2c - call _ch_command -;source-doc/base-drv/transfers.c:78: CH376_DATA_PORT = 0; - ld a,0x00 - ld bc,_CH376_DATA_PORT - out (c),a -;source-doc/base-drv/transfers.c:79: ch_issue_token_out_ep0(); - call _ch_issue_token_out_ep0 -;source-doc/base-drv/transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ - call _ch_long_wait_int_and_get_status -;source-doc/base-drv/transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { - ld a,l - or a, a - jr Z,l_usb_control_transfer_00108 - sub a,0x02 - jr NZ,l_usb_control_transfer_00113 -l_usb_control_transfer_00108: -;source-doc/base-drv/transfers.c:83: result = USB_ERR_OK; - ld l,0x00 -;source-doc/base-drv/transfers.c:84: goto done; - jr l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:87: RETURN_CHECK(result); -l_usb_control_transfer_00112: -;source-doc/base-drv/transfers.c:90: ch_issue_token_in_ep0(); - call _ch_issue_token_in_ep0 -;source-doc/base-drv/transfers.c:91: result = ch_long_wait_int_and_get_status(); - call _ch_long_wait_int_and_get_status -;source-doc/base-drv/transfers.c:95: done: -l_usb_control_transfer_00113: -;source-doc/base-drv/transfers.c:96: critical_end(); - push hl - call _critical_end - pop hl -;source-doc/base-drv/transfers.c:97: return result; -l_usb_control_transfer_00114: -;source-doc/base-drv/transfers.c:98: } - ld sp, ix - pop ix - ret -;source-doc/base-drv/transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { -; --------------------------------- -; Function usb_dat_in_trnsfer_ext -; --------------------------------- -_usb_dat_in_trnsfer_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - ld a,(ix+5) - or a,(ix+4) - jr Z,l_usb_dat_in_trnsfer_ext_00102 - ld a,(ix+5) - sub a,0x80 - jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:103: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_in_trnsfer_ext_00106 -l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) - ld a,(ix+10) - sub a,0x80 - jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/transfers.c:106: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_in_trnsfer_ext_00106 -l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); - ld l,(ix+9) - ld h,(ix+10) - push hl - ld a,(ix+8) - push af - inc sp - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_data_in_transfer - pop af - pop af - pop af - inc sp -l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:109: } - pop ix - ret -;source-doc/base-drv/transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { -; --------------------------------- -; Function usb_dat_in_trns_n_ext -; --------------------------------- -_usb_dat_in_trns_n_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) - ld a,(ix+5) - or a,(ix+4) - jr Z,l_usb_dat_in_trns_n_ext_00102 - ld a,(ix+5) - and a,0xc0 - jr NZ,l_usb_dat_in_trns_n_ext_00102 -;source-doc/base-drv/transfers.c:114: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_in_trns_n_ext_00108 -l_usb_dat_in_trns_n_ext_00102: -;source-doc/base-drv/transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0) - ld a,(ix+10) - and a,0xc0 - jr NZ,l_usb_dat_in_trns_n_ext_00105 -;source-doc/base-drv/transfers.c:117: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_in_trns_n_ext_00108 -l_usb_dat_in_trns_n_ext_00105: -;source-doc/base-drv/transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) - ld a,(ix+7) - and a,0xc0 - jr NZ,l_usb_dat_in_trns_n_ext_00107 -;source-doc/base-drv/transfers.c:120: return USB_BAD_ADDRESS; - ld l,0x82 - jr l_usb_dat_in_trns_n_ext_00108 -l_usb_dat_in_trns_n_ext_00107: -;source-doc/base-drv/transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); - ld c,(ix+6) - ld b,(ix+7) - ld l,(ix+9) - ld h,(ix+10) - push hl - ld a,(ix+8) - push af - inc sp - push bc - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_data_in_transfer_n - pop af - pop af - pop af - inc sp -l_usb_dat_in_trns_n_ext_00108: -;source-doc/base-drv/transfers.c:123: } - pop ix - ret -;source-doc/base-drv/transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { -; --------------------------------- -; Function usb_data_in_transfer -; --------------------------------- -_usb_data_in_transfer: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:136: critical_begin(); - call _critical_begin -;source-doc/base-drv/transfers.c:138: ch_set_usb_address(device_address); - ld l,(ix+8) - call _ch_set_usb_address -;source-doc/base-drv/transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint); - ld l,(ix+9) - ld h,(ix+10) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _ch_data_in_transfer - pop af - pop af - pop af - ld a, l - ld (_result), a -;source-doc/base-drv/transfers.c:142: critical_end(); - call _critical_end -;source-doc/base-drv/transfers.c:144: return result; - ld hl,(_result) -;source-doc/base-drv/transfers.c:145: } - pop ix - ret -;source-doc/base-drv/transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { -; --------------------------------- -; Function usb_data_in_transfer_n -; --------------------------------- -_usb_data_in_transfer_n: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:158: critical_begin(); - call _critical_begin -;source-doc/base-drv/transfers.c:160: ch_set_usb_address(device_address); - ld l,(ix+8) - call _ch_set_usb_address -;source-doc/base-drv/transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); - ld l,(ix+9) - ld h,(ix+10) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _ch_data_in_transfer_n - pop af - pop af - pop af - ld a, l - ld (_result), a -;source-doc/base-drv/transfers.c:164: critical_end(); - call _critical_end -;source-doc/base-drv/transfers.c:166: return result; - ld hl,(_result) -;source-doc/base-drv/transfers.c:167: } - pop ix - ret -;source-doc/base-drv/transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { -; --------------------------------- -; Function usb_data_out_transfer -; --------------------------------- -_usb_data_out_transfer: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:180: critical_begin(); - call _critical_begin -;source-doc/base-drv/transfers.c:182: ch_set_usb_address(device_address); - ld l,(ix+8) - call _ch_set_usb_address -;source-doc/base-drv/transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint); - ld l,(ix+9) - ld h,(ix+10) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _ch_data_out_transfer - pop af - pop af - pop af - ld a, l - ld (_result), a -;source-doc/base-drv/transfers.c:186: critical_end(); - call _critical_end -;source-doc/base-drv/transfers.c:188: return result; - ld hl,(_result) -;source-doc/base-drv/transfers.c:189: } - pop ix - ret - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm deleted file mode 100644 index 2668b656..00000000 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.asm +++ /dev/null @@ -1,441 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _chnative_seek -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _usbdev_dat_in_trnsfer_0 - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_control_transfer - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/usb-base-drv.c:6: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { -; --------------------------------- -; Function chnative_seek -; --------------------------------- -_chnative_seek: - push ix -;source-doc/base-drv/usb-base-drv.c:7: storage_device->current_lba = lba; - ld ix,0 - add ix,sp - ld c,(ix+4) - ld b,(ix+5) - push bc - ld a,(ix-2) - add a,0x0c - ld c,l - ld b,h - ld l, a - ld a,(ix-1) - adc a,0x00 - ld h, a - ld (hl), e - inc hl - ld (hl), d - inc hl - ld (hl), c - inc hl - ld (hl), b -;source-doc/base-drv/usb-base-drv.c:8: return 0; - xor a, a -;source-doc/base-drv/usb-base-drv.c:9: } - ld sp, ix - pop ix - pop hl - pop bc - jp (hl) - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.asm b/Source/HBIOS/ch376-native/base-drv/usb_state.c.asm deleted file mode 100644 index a6764589..00000000 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.asm +++ /dev/null @@ -1,605 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _device_config_sizes - GLOBAL _find_device_config - GLOBAL _find_first_free - GLOBAL _first_device_config - GLOBAL _next_device_config - GLOBAL _get_usb_device_config -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _get_number_of_usb_drives - GLOBAL _usbtrn_clear_endpoint_halt - GLOBAL _usbtrn_set_address - GLOBAL _usbtrn_set_configuration - GLOBAL _usbtrn_gfull_cfg_desc - GLOBAL _usbtrn_get_config_descriptor - GLOBAL _usbtrn_get_descriptor2 - GLOBAL _usbtrn_get_descriptor - GLOBAL _usbdev_dat_in_trnsfer_0 - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_control_transfer - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _x - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/base-drv/usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) { -; --------------------------------- -; Function find_device_config -; --------------------------------- -_find_device_config: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:16: const device_config *p_config = first_device_config(p); - ld hl,_x - call _first_device_config -;source-doc/base-drv/usb_state.c:17: while (p_config) { -l_find_device_config_00103: - ld a, d - or a, e - jr Z,l_find_device_config_00105 -;source-doc/base-drv/usb_state.c:18: const uint8_t type = p_config->type; - ld l, e - ld h, d - ld a, (hl) - and a,0x0f - ld c, a -;source-doc/base-drv/usb_state.c:20: if (type == requested_type) - ld a,(ix+4) - sub a, c - jr NZ,l_find_device_config_00102 -;source-doc/base-drv/usb_state.c:21: return (device_config *)p_config; - ex de, hl - jr l_find_device_config_00106 -l_find_device_config_00102: -;source-doc/base-drv/usb_state.c:23: p_config = next_device_config(p, p_config); - ld hl,_x - call _next_device_config - jr l_find_device_config_00103 -l_find_device_config_00105: -;source-doc/base-drv/usb_state.c:26: return NULL; - ld hl,0x0000 -l_find_device_config_00106: -;source-doc/base-drv/usb_state.c:27: } - pop ix - ret - SECTION rodata_compiler -_device_config_sizes: - DEFB +0x00 - DEFB +0x10 - DEFB +0x10 - DEFB +0x0c - DEFB +0x06 - DEFB 0x00 - DEFB 0x00 - SECTION code_compiler -;source-doc/base-drv/usb_state.c:30: device_config *find_first_free(void) { -; --------------------------------- -; Function find_first_free -; --------------------------------- -_find_first_free: -;source-doc/base-drv/usb_state.c:31: _usb_state *const boot_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:34: device_config *p = first_device_config(boot_state); - ld hl,_x - call _first_device_config -;source-doc/base-drv/usb_state.c:35: while (p) { -l_find_first_free_00103: - ld a, d - or a, e - jr Z,l_find_first_free_00105 -;source-doc/base-drv/usb_state.c:36: if (p->type == 0) - ld l, e - ld h, d - ld a, (hl) - and a,0x0f - jr NZ,l_find_first_free_00102 -;source-doc/base-drv/usb_state.c:37: return p; - ex de, hl - jr l_find_first_free_00106 -l_find_first_free_00102: -;source-doc/base-drv/usb_state.c:39: p = next_device_config(boot_state, p); - ld hl,_x - call _next_device_config - jr l_find_first_free_00103 -l_find_first_free_00105: -;source-doc/base-drv/usb_state.c:42: return NULL; - ld hl,0x0000 -l_find_first_free_00106: -;source-doc/base-drv/usb_state.c:43: } - ret -;source-doc/base-drv/usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } -; --------------------------------- -; Function first_device_config -; --------------------------------- -_first_device_config: - ex de, hl - inc de - inc de - ret -;source-doc/base-drv/usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { -; --------------------------------- -; Function next_device_config -; --------------------------------- -_next_device_config: - ld c, l - ld b, h -;source-doc/base-drv/usb_state.c:48: if (p->type == 0) - ld l, e - ld h, d - ld a, (hl) - and a,0x0f - jr NZ,l_next_device_config_00102 -;source-doc/base-drv/usb_state.c:49: return NULL; - ld de,0x0000 - jr l_next_device_config_00105 -l_next_device_config_00102: -;source-doc/base-drv/usb_state.c:51: const uint8_t size = device_config_sizes[p->type]; - ld l, e - ld h, d - ld a, (hl) - and a,0x0f - add a, +((_device_config_sizes) & 0xFF) - ld l, a - ld a,0x00 - adc a, +((_device_config_sizes) / 256) - ld h, a - ld l, (hl) -;source-doc/base-drv/usb_state.c:58: const uint8_t *_p = (uint8_t *)p; -;source-doc/base-drv/usb_state.c:59: device_config *const result = (device_config *)(_p + size); - ld h,0x00 - add hl, de - ex de, hl -;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) - ld hl,0x0062 - add hl, bc - ld a, e - sub a, l - ld a, d - sbc a, h - ret C -;source-doc/base-drv/usb_state.c:62: return NULL; - ld de,0x0000 -;source-doc/base-drv/usb_state.c:64: return result; -l_next_device_config_00105: -;source-doc/base-drv/usb_state.c:65: } - ret -;source-doc/base-drv/usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { -; --------------------------------- -; Function get_usb_device_config -; --------------------------------- -_get_usb_device_config: - ld c, a -;source-doc/base-drv/usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - push bc - ld hl,_x - call _first_device_config - pop bc - ld b,0x01 -l_get_usb_device_config_00107: - ld a, d - or a, e - jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) { - ld l, e - ld h, d - ld a, (hl) - and a,0x0f - jr Z,l_get_usb_device_config_00108 -;source-doc/base-drv/usb_state.c:75: if (counter == device_index) - ld a, c - sub a, b -;source-doc/base-drv/usb_state.c:76: return p; - jr Z,l_get_usb_device_config_00109 -;source-doc/base-drv/usb_state.c:77: counter++; - inc b -l_get_usb_device_config_00108: -;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { - push bc - ld hl,_x - call _next_device_config - pop bc - jr l_get_usb_device_config_00107 -l_get_usb_device_config_00105: -;source-doc/base-drv/usb_state.c:81: return NULL; // is not a usb device - ld de,0x0000 -l_get_usb_device_config_00109: -;source-doc/base-drv/usb_state.c:82: } - ret - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.asm b/Source/HBIOS/ch376-native/base-drv/work-area.c.asm deleted file mode 100644 index 0f2e36fc..00000000 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.asm +++ /dev/null @@ -1,520 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _x -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _get_usb_device_config - GLOBAL _find_device_config - GLOBAL _next_device_config - GLOBAL _first_device_config - GLOBAL _find_first_free - GLOBAL _usbtrn_clear_endpoint_halt - GLOBAL _usbtrn_set_address - GLOBAL _usbtrn_set_configuration - GLOBAL _usbtrn_gfull_cfg_desc - GLOBAL _usbtrn_get_config_descriptor - GLOBAL _usbtrn_get_descriptor2 - GLOBAL _usbtrn_get_descriptor - GLOBAL _usbdev_dat_in_trnsfer_0 - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_control_transfer - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - -_x: - DEFS 99 - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION data_compiler -_x: - DEFB 0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB +0x00 - SECTION IGNORE diff --git a/Source/HBIOS/ch376-native/cruntime.asm b/Source/HBIOS/ch376-native/cruntime.asm index 9eb4231d..74426810 100644 --- a/Source/HBIOS/ch376-native/cruntime.asm +++ b/Source/HBIOS/ch376-native/cruntime.asm @@ -62,3 +62,72 @@ zero_n: push de pop hl ret + +.if 0 +; required if --optimise-for-size is targetted +; but there appears to be a regression that stop the driver from working +; if optimised for size is selected +___sdcc_enter_ix: + ex (sp), ix + push ix + ld ix, 2 + add ix, sp + ret + +____sdcc_lib_setmem_hl: +l_setmem_hl: + ret + +____sdcc_load_debc_mhl: + ld c, (hl) + inc hl + ld b, (hl) + inc hl + ld e, (hl) + inc hl + ld d, (hl) + ret + +____sdcc_4_push_hlix: + pop af + push af + push af + push af + + push de + + push ix + pop de + + add hl, de + + ex de, hl + + ld hl, 2+2 + add hl, sp + + ex de, hl + + ldi + ldi + ldi + ld a, (hl) + ld (de), a + + inc bc + inc bc + inc bc + + pop de + ret + +____sdcc_store_debc_mhl: + ld (hl), c + inc hl + ld (hl), b + inc hl + ld (hl), e + inc hl + ld (hl), d + ret +.endif diff --git a/Source/HBIOS/ch376-native/keyboard/.gitignore b/Source/HBIOS/ch376-native/keyboard/.gitignore new file mode 100644 index 00000000..f4cb8488 --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard/.gitignore @@ -0,0 +1 @@ +*.asm diff --git a/Source/HBIOS/ch376-native/scsi-drv/.gitignore b/Source/HBIOS/ch376-native/scsi-drv/.gitignore new file mode 100644 index 00000000..f4cb8488 --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv/.gitignore @@ -0,0 +1 @@ +*.asm diff --git a/Source/HBIOS/ch376-native/ufi-drv/.gitignore b/Source/HBIOS/ch376-native/ufi-drv/.gitignore new file mode 100644 index 00000000..f4cb8488 --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/.gitignore @@ -0,0 +1 @@ +*.asm diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm deleted file mode 100644 index f0aa966b..00000000 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.asm +++ /dev/null @@ -1,599 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - EXTERN __divschar - EXTERN __divschar_callee - EXTERN __divsint - EXTERN __divsint_callee - EXTERN __divslong - EXTERN __divslong_callee - EXTERN __divslonglong - EXTERN __divslonglong_callee - EXTERN __divsuchar - EXTERN __divsuchar_callee - EXTERN __divuchar - EXTERN __divuchar_callee - EXTERN __divuint - EXTERN __divuint_callee - EXTERN __divulong - EXTERN __divulong_callee - EXTERN __divulonglong - EXTERN __divulonglong_callee - EXTERN __divuschar - EXTERN __divuschar_callee - EXTERN __modschar - EXTERN __modschar_callee - EXTERN __modsint - EXTERN __modsint_callee - EXTERN __modslong - EXTERN __modslong_callee - EXTERN __modslonglong - EXTERN __modslonglong_callee - EXTERN __modsuchar - EXTERN __modsuchar_callee - EXTERN __moduchar - EXTERN __moduchar_callee - EXTERN __moduint - EXTERN __moduint_callee - EXTERN __modulong - EXTERN __modulong_callee - EXTERN __modulonglong - EXTERN __modulonglong_callee - EXTERN __moduschar - EXTERN __moduschar_callee - EXTERN __mulint - EXTERN __mulint_callee - EXTERN __mullong - EXTERN __mullong_callee - EXTERN __mullonglong - EXTERN __mullonglong_callee - EXTERN __mulschar - EXTERN __mulschar_callee - EXTERN __mulsuchar - EXTERN __mulsuchar_callee - EXTERN __muluchar - EXTERN __muluchar_callee - EXTERN __muluschar - EXTERN __muluschar_callee - EXTERN __rlslonglong - EXTERN __rlslonglong_callee - EXTERN __rlulonglong - EXTERN __rlulonglong_callee - EXTERN __rrslonglong - EXTERN __rrslonglong_callee - EXTERN __rrulonglong - EXTERN __rrulonglong_callee - EXTERN ___mulsint2slong - EXTERN ___mulsint2slong_callee - EXTERN ___muluint2ulong - EXTERN ___muluint2ulong_callee - EXTERN ___sdcc_call_hl - EXTERN ___sdcc_call_iy - EXTERN ___sdcc_enter_ix - EXTERN banked_call - EXTERN _banked_ret - EXTERN ___fs2schar - EXTERN ___fs2schar_callee - EXTERN ___fs2sint - EXTERN ___fs2sint_callee - EXTERN ___fs2slong - EXTERN ___fs2slong_callee - EXTERN ___fs2slonglong - EXTERN ___fs2slonglong_callee - EXTERN ___fs2uchar - EXTERN ___fs2uchar_callee - EXTERN ___fs2uint - EXTERN ___fs2uint_callee - EXTERN ___fs2ulong - EXTERN ___fs2ulong_callee - EXTERN ___fs2ulonglong - EXTERN ___fs2ulonglong_callee - EXTERN ___fsadd - EXTERN ___fsadd_callee - EXTERN ___fsdiv - EXTERN ___fsdiv_callee - EXTERN ___fseq - EXTERN ___fseq_callee - EXTERN ___fsgt - EXTERN ___fsgt_callee - EXTERN ___fslt - EXTERN ___fslt_callee - EXTERN ___fsmul - EXTERN ___fsmul_callee - EXTERN ___fsneq - EXTERN ___fsneq_callee - EXTERN ___fssub - EXTERN ___fssub_callee - EXTERN ___schar2fs - EXTERN ___schar2fs_callee - EXTERN ___sint2fs - EXTERN ___sint2fs_callee - EXTERN ___slong2fs - EXTERN ___slong2fs_callee - EXTERN ___slonglong2fs - EXTERN ___slonglong2fs_callee - EXTERN ___uchar2fs - EXTERN ___uchar2fs_callee - EXTERN ___uint2fs - EXTERN ___uint2fs_callee - EXTERN ___ulong2fs - EXTERN ___ulong2fs_callee - EXTERN ___ulonglong2fs - EXTERN ___ulonglong2fs_callee - EXTERN ____sdcc_2_copy_src_mhl_dst_deix - EXTERN ____sdcc_2_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_deix - EXTERN ____sdcc_4_copy_src_mhl_dst_bcix - EXTERN ____sdcc_4_copy_src_mhl_dst_mbc - EXTERN ____sdcc_4_ldi_nosave_bc - EXTERN ____sdcc_4_ldi_save_bc - EXTERN ____sdcc_4_push_hlix - EXTERN ____sdcc_4_push_mhl - EXTERN ____sdcc_lib_setmem_hl - EXTERN ____sdcc_ll_add_de_bc_hl - EXTERN ____sdcc_ll_add_de_bc_hlix - EXTERN ____sdcc_ll_add_de_hlix_bc - EXTERN ____sdcc_ll_add_de_hlix_bcix - EXTERN ____sdcc_ll_add_deix_bc_hl - EXTERN ____sdcc_ll_add_deix_hlix - EXTERN ____sdcc_ll_add_hlix_bc_deix - EXTERN ____sdcc_ll_add_hlix_deix_bc - EXTERN ____sdcc_ll_add_hlix_deix_bcix - EXTERN ____sdcc_ll_asr_hlix_a - EXTERN ____sdcc_ll_asr_mbc_a - EXTERN ____sdcc_ll_copy_src_de_dst_hlix - EXTERN ____sdcc_ll_copy_src_de_dst_hlsp - EXTERN ____sdcc_ll_copy_src_deix_dst_hl - EXTERN ____sdcc_ll_copy_src_deix_dst_hlix - EXTERN ____sdcc_ll_copy_src_deixm_dst_hlsp - EXTERN ____sdcc_ll_copy_src_desp_dst_hlsp - EXTERN ____sdcc_ll_copy_src_hl_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_de - EXTERN ____sdcc_ll_copy_src_hlsp_dst_deixm - EXTERN ____sdcc_ll_lsl_hlix_a - EXTERN ____sdcc_ll_lsl_mbc_a - EXTERN ____sdcc_ll_lsr_hlix_a - EXTERN ____sdcc_ll_lsr_mbc_a - EXTERN ____sdcc_ll_push_hlix - EXTERN ____sdcc_ll_push_mhl - EXTERN ____sdcc_ll_sub_de_bc_hl - EXTERN ____sdcc_ll_sub_de_bc_hlix - EXTERN ____sdcc_ll_sub_de_hlix_bc - EXTERN ____sdcc_ll_sub_de_hlix_bcix - EXTERN ____sdcc_ll_sub_deix_bc_hl - EXTERN ____sdcc_ll_sub_deix_hlix - EXTERN ____sdcc_ll_sub_hlix_bc_deix - EXTERN ____sdcc_ll_sub_hlix_deix_bc - EXTERN ____sdcc_ll_sub_hlix_deix_bcix - EXTERN ____sdcc_load_debc_deix - EXTERN ____sdcc_load_dehl_deix - EXTERN ____sdcc_load_debc_mhl - EXTERN ____sdcc_load_hlde_mhl - EXTERN ____sdcc_store_dehl_bcix - EXTERN ____sdcc_store_debc_hlix - EXTERN ____sdcc_store_debc_mhl - EXTERN ____sdcc_cpu_pop_ei - EXTERN ____sdcc_cpu_pop_ei_jp - EXTERN ____sdcc_cpu_push_di - EXTERN ____sdcc_outi - EXTERN ____sdcc_outi_128 - EXTERN ____sdcc_outi_256 - EXTERN ____sdcc_ldi - EXTERN ____sdcc_ldi_128 - EXTERN ____sdcc_ldi_256 - EXTERN ____sdcc_4_copy_srcd_hlix_dst_deix - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_deix - EXTERN ____sdcc_4_or_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_dehl_dst_bcix - EXTERN ____sdcc_4_and_src_dehl_dst_bcix - EXTERN ____sdcc_4_xor_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_mbc_mhl_dst_debc - EXTERN ____sdcc_4_cpl_src_mhl_dst_debc - EXTERN ____sdcc_4_xor_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_or_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_mhl_dst_debc - EXTERN ____sdcc_4_and_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_or_src_debc_hlix_dst_debc - EXTERN ____sdcc_4_xor_src_debc_hlix_dst_debc - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - GLOBAL _cbi2_adsc - GLOBAL _usb_execute_cbi -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- - GLOBAL _critical_end - GLOBAL _critical_begin - GLOBAL _usbtrn_clear_endpoint_halt - GLOBAL _usbtrn_set_address - GLOBAL _usbtrn_set_configuration - GLOBAL _usbtrn_gfull_cfg_desc - GLOBAL _usbtrn_get_config_descriptor - GLOBAL _usbtrn_get_descriptor2 - GLOBAL _usbtrn_get_descriptor - GLOBAL _usbdev_dat_in_trnsfer_0 - GLOBAL _usbdev_dat_in_trnsfer - GLOBAL _usbdev_bulk_in_transfer - GLOBAL _usbdev_blk_out_trnsfer - GLOBAL _usbdev_control_transfer - GLOBAL _usb_data_out_transfer - GLOBAL _usb_data_in_transfer_n - GLOBAL _usb_data_in_transfer - GLOBAL _usb_control_transfer - GLOBAL _ch_issue_token_in_ep0 - GLOBAL _ch_issue_token_out_ep0 - GLOBAL _ch_issue_token_setup - GLOBAL _ch_data_out_transfer - GLOBAL _ch_data_in_transfer_n - GLOBAL _ch_data_in_transfer - GLOBAL _ch_control_transfer_set_config - GLOBAL _ch_control_transfer_set_address - GLOBAL _ch_control_transfer_request_descriptor - GLOBAL _ch_set_usb_address - GLOBAL _ch_write_data - GLOBAL _ch_cmd_get_ic_version - GLOBAL _ch_cmd_set_usb_mode - GLOBAL _ch_probe - GLOBAL _ch_cmd_reset_all - GLOBAL _ch_read_data - GLOBAL _ch_very_short_wait_int_and_get_status - GLOBAL _ch_short_wait_int_and_get_status - GLOBAL _ch_long_wait_int_and_get_status - GLOBAL _ch_get_status - GLOBAL _ch_command - GLOBAL _delay_medium - GLOBAL _delay_short - GLOBAL _delay_20ms - GLOBAL _printf - GLOBAL _delay - GLOBAL _ulltoa_callee - GLOBAL _ulltoa - GLOBAL _strtoull_callee - GLOBAL _strtoull - GLOBAL _strtoll_callee - GLOBAL _strtoll - GLOBAL _lltoa_callee - GLOBAL _lltoa - GLOBAL _llabs_callee - GLOBAL _llabs - GLOBAL __lldivu__callee - GLOBAL __lldivu_ - GLOBAL __lldiv__callee - GLOBAL __lldiv_ - GLOBAL _atoll_callee - GLOBAL _atoll - GLOBAL _realloc_unlocked_callee - GLOBAL _realloc_unlocked - GLOBAL _malloc_unlocked_fastcall - GLOBAL _malloc_unlocked - GLOBAL _free_unlocked_fastcall - GLOBAL _free_unlocked - GLOBAL _calloc_unlocked_callee - GLOBAL _calloc_unlocked - GLOBAL _aligned_alloc_unlocked_callee - GLOBAL _aligned_alloc_unlocked - GLOBAL _realloc_callee - GLOBAL _realloc - GLOBAL _malloc_fastcall - GLOBAL _malloc - GLOBAL _free_fastcall - GLOBAL _free - GLOBAL _calloc_callee - GLOBAL _calloc - GLOBAL _aligned_alloc_callee - GLOBAL _aligned_alloc - GLOBAL _utoa_callee - GLOBAL _utoa - GLOBAL _ultoa_callee - GLOBAL _ultoa - GLOBAL _system_fastcall - GLOBAL _system - GLOBAL _strtoul_callee - GLOBAL _strtoul - GLOBAL _strtol_callee - GLOBAL _strtol - GLOBAL _strtof_callee - GLOBAL _strtof - GLOBAL _strtod_callee - GLOBAL _strtod - GLOBAL _srand_fastcall - GLOBAL _srand - GLOBAL _rand - GLOBAL _quick_exit_fastcall - GLOBAL _quick_exit - GLOBAL _qsort_callee - GLOBAL _qsort - GLOBAL _ltoa_callee - GLOBAL _ltoa - GLOBAL _labs_fastcall - GLOBAL _labs - GLOBAL _itoa_callee - GLOBAL _itoa - GLOBAL _ftoh_callee - GLOBAL _ftoh - GLOBAL _ftog_callee - GLOBAL _ftog - GLOBAL _ftoe_callee - GLOBAL _ftoe - GLOBAL _ftoa_callee - GLOBAL _ftoa - GLOBAL _exit_fastcall - GLOBAL _exit - GLOBAL _dtoh_callee - GLOBAL _dtoh - GLOBAL _dtog_callee - GLOBAL _dtog - GLOBAL _dtoe_callee - GLOBAL _dtoe - GLOBAL _dtoa_callee - GLOBAL _dtoa - GLOBAL _bsearch_callee - GLOBAL _bsearch - GLOBAL _atol_fastcall - GLOBAL _atol - GLOBAL _atoi_fastcall - GLOBAL _atoi - GLOBAL _atof_fastcall - GLOBAL _atof - GLOBAL _atexit_fastcall - GLOBAL _atexit - GLOBAL _at_quick_exit_fastcall - GLOBAL _at_quick_exit - GLOBAL _abs_fastcall - GLOBAL _abs - GLOBAL _abort - GLOBAL __strtou__callee - GLOBAL __strtou_ - GLOBAL __strtoi__callee - GLOBAL __strtoi_ - GLOBAL __random_uniform_xor_8__fastcall - GLOBAL __random_uniform_xor_8_ - GLOBAL __random_uniform_xor_32__fastcall - GLOBAL __random_uniform_xor_32_ - GLOBAL __random_uniform_cmwc_8__fastcall - GLOBAL __random_uniform_cmwc_8_ - GLOBAL __shellsort__callee - GLOBAL __shellsort_ - GLOBAL __quicksort__callee - GLOBAL __quicksort_ - GLOBAL __insertion_sort__callee - GLOBAL __insertion_sort_ - GLOBAL __ldivu__callee - GLOBAL __ldivu_ - GLOBAL __ldiv__callee - GLOBAL __ldiv_ - GLOBAL __divu__callee - GLOBAL __divu_ - GLOBAL __div__callee - GLOBAL __div_ - GLOBAL _in_critical_usb_section - GLOBAL _result -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -defc _CH376_DATA_PORT = 0xff88 -defc _CH376_COMMAND_PORT = 0xff89 -defc _USB_MODULE_LEDS = 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - SECTION bss_compiler -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -IF 0 - -; .area _INITIALIZED removed by z88dk - -_cbi2_adsc: - DEFS 8 - -ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - SECTION code_crt_init -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - SECTION IGNORE -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - SECTION code_compiler -;source-doc/ufi-drv/usb_cbi.c:10: usb_error usb_execute_cbi(device_config *const storage_device, -; --------------------------------- -; Function usb_execute_cbi -; --------------------------------- -_usb_execute_cbi: - push ix - ld ix,0 - add ix,sp - ld hl, -8 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/usb_cbi.c:17: const uint8_t interface_number = storage_device->interface_number; - ld l,(ix+4) - ld h,(ix+5) - ld c,l - ld b,h - inc hl - inc hl - ld e, (hl) -;source-doc/ufi-drv/usb_cbi.c:20: adsc = cbi2_adsc; - push de - push bc - ex de, hl - ld hl,4 - add hl, sp - ex de, hl - ld bc,0x0008 - ld hl,_cbi2_adsc - ldir - pop bc - pop de -;source-doc/ufi-drv/usb_cbi.c:21: adsc.bIndex[0] = interface_number; - ld (ix-4),e -;source-doc/ufi-drv/usb_cbi.c:23: critical_begin(); - push bc - call _critical_begin - pop bc -;source-doc/ufi-drv/usb_cbi.c:25: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); - ld l,(ix+6) - ld h,(ix+7) - push hl - ld hl,2 - add hl, sp - push hl - push bc - call _usbdev_control_transfer - pop af - pop af - pop af - ld a, l - ld (_result), a -;source-doc/ufi-drv/usb_cbi.c:27: if (result == USB_ERR_STALL) { - ld a,(_result) - sub a,0x02 - jr NZ,l_usb_execute_cbi_00104 -;source-doc/ufi-drv/usb_cbi.c:28: if (sense_codes != NULL) - ld a,(ix+14) - or a,(ix+13) - jr Z,l_usb_execute_cbi_00102 -;source-doc/ufi-drv/usb_cbi.c:29: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); - ld a,0x02 - push af - inc sp - ld hl,0x0002 - push hl - ld l,(ix+13) - ld h,(ix+14) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usbdev_dat_in_trnsfer - ld hl,7 - add hl, sp - ld sp, hl -l_usb_execute_cbi_00102: -;source-doc/ufi-drv/usb_cbi.c:31: result = USB_ERR_STALL; - ld hl,_result - ld (hl),0x02 -;source-doc/ufi-drv/usb_cbi.c:32: goto done; - jp l_usb_execute_cbi_00116 -l_usb_execute_cbi_00104: -;source-doc/ufi-drv/usb_cbi.c:35: if (result != USB_ERR_OK) { - ld a,(_result) - or a, a - jp NZ, l_usb_execute_cbi_00116 -;source-doc/ufi-drv/usb_cbi.c:40: if (send) { - bit 0,(ix+8) - jr Z,l_usb_execute_cbi_00112 -;source-doc/ufi-drv/usb_cbi.c:41: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size); - ld l,(ix+9) - ld h,(ix+10) - push hl - ld l,(ix+11) - ld h,(ix+12) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usbdev_blk_out_trnsfer - pop af - pop af - pop af - ld a, l - ld (_result), a -;source-doc/ufi-drv/usb_cbi.c:43: if (result != USB_ERR_OK) { - ld a,(_result) - or a, a - jr Z,l_usb_execute_cbi_00113 -;source-doc/ufi-drv/usb_cbi.c:45: goto done; - jr l_usb_execute_cbi_00116 -l_usb_execute_cbi_00112: -;source-doc/ufi-drv/usb_cbi.c:48: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); - ld a,0x01 - push af - inc sp - ld l,(ix+9) - ld h,(ix+10) - push hl - ld l,(ix+11) - ld h,(ix+12) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usbdev_dat_in_trnsfer - pop af - pop af - pop af - inc sp - ld a, l - ld (_result), a -;source-doc/ufi-drv/usb_cbi.c:50: if (result != USB_ERR_OK) { - ld a,(_result) - or a, a - jr NZ,l_usb_execute_cbi_00116 -;source-doc/ufi-drv/usb_cbi.c:52: goto done; -l_usb_execute_cbi_00113: -;source-doc/ufi-drv/usb_cbi.c:56: if (sense_codes != NULL) { - ld a,(ix+14) - or a,(ix+13) - jr Z,l_usb_execute_cbi_00116 -;source-doc/ufi-drv/usb_cbi.c:57: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); - ld a,0x02 - push af - inc sp - ld hl,0x0002 - push hl - ld l,(ix+13) - ld h,(ix+14) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usbdev_dat_in_trnsfer - pop af - pop af - pop af - inc sp - ld a, l - ld (_result), a -;source-doc/ufi-drv/usb_cbi.c:65: done: -l_usb_execute_cbi_00116: -;source-doc/ufi-drv/usb_cbi.c:66: critical_end(); - call _critical_end -;source-doc/ufi-drv/usb_cbi.c:68: return result; - ld hl,(_result) -;source-doc/ufi-drv/usb_cbi.c:69: } - ld sp, ix - pop ix - ret - SECTION data_compiler -_cbi2_adsc: - DEFB +0x21 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0xff - DEFB +0x00 - DEFW +0x000c - SECTION IGNORE From db0afaedfabb48ea3832dc9fef95000e95c195f3 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 21 Nov 2024 17:46:59 +1100 Subject: [PATCH 08/59] ch376-native/ez80: timing adjustments --- Source/HBIOS/cfg_RCEZ80.asm | 4 ++-- Source/HBIOS/std.asm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index b31bd5d2..1b6f006a 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -411,7 +411,7 @@ EZ80TIMER .SET EZ80TMR_FIRM ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] EZ80IOBASE .SET $FF ; EZ80 I/O BASE ADDRESS FOR EXTERNAL IO ; ; BUS TIMING FOR PAGED MEMORY ACCESS (CS3) -EZ80_MEM_CYCLES .SET 3 ; MEMORY BUS CYCLES (1-15) TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CYCLES +EZ80_MEM_CYCLES .SET 2 ; MEMORY BUS CYCLES (1-15) TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CYCLES EZ80_MEM_MIN_NS .SET 100 ; CALCULATE AT BOOT TIME THE REQUIRED W/S OR B/C, IF EZ80_WSMD_TYP = EZ80WSMD_CALC EZ80_MEM_WS .SET 5 ; MEMORY WAIT STATES (0-7) TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_WAIT EZ80_MEM_MIN_WS .SET 0 ; MINIMUM WAIT STATES TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CALC @@ -426,7 +426,7 @@ EZ80_IO_MIN_NS .SET 250 ; CALCULATE AT BOOT TIME THE REQUIRED W/S OR B/C, IF EZ EZ80_IO_MIN_WS .SET 7 ; MINIMUM WAIT STATES TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CALC ; ; APPLY CYCLES, W/S OR CALCULATE CYCLES BASED ON DESIRED PERIOD -EZ80_WSMD_TYP .SET EZ80WSMD_CYCLES ; BUS WAIT STATE CONFIG: EZ80WSMD_[CALC|CYCLES|WAIT] +EZ80_WSMD_TYP .SET EZ80WSMD_CALC ; BUS WAIT STATE CONFIG: EZ80WSMD_[CALC|CYCLES|WAIT] ; ; BUS TIMING FOR ON CHIP ROM ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 9984c221..ceec2404 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -538,7 +538,7 @@ PPKENABLE .EQU FALSE ; PPK KEYBOARD DRIVER MKYENABLE .EQU FALSE ; MSX KEYBOARD DRIVER NABUKBENABLE .EQU FALSE ; NABU KEYBOARD DRIVER FVKBDENABLE .EQU FALSE ; FPGA KEYBOARD DRIVER -USBKYBENABLE .EQU TRUE ; USB KEYBOARD DRIVER +USBKYBENABLE .EQU FALSE ; USB KEYBOARD DRIVER ; ; VIDEO MODES ; From 3b0f00520e688eeb21ebaeced628a32eb4a87499 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 24 Nov 2024 09:51:24 +1100 Subject: [PATCH 09/59] gitignore: added *.cat and some extract img files --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index d2ab7849..ec961a07 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,9 @@ Source/Images/hd1k_msxroms1.img Source/Images/hd1k_msxroms2.img Source/Images/hd512_msxroms1.img Source/Images/hd512_msxroms2.img +Source/Images/fd144_z3plus.img +Source/Images/hd1k_z3plus.img +Source/Images/hd512_z3plus.img + +Source/Images/*.cat +Source/RomDsk/*.cat From e6143beb25bb350999b6f0462d6f16005883cf01 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Fri, 6 Dec 2024 10:13:10 +1100 Subject: [PATCH 10/59] ch376-native: attempt to fix issue with slices not working - restored drive_index counter --- Dockerfile | 12 +- .../ch376-native/base-drv/usb-base-drv.c.s | 4 + .../HBIOS/ch376-native/base-drv/usb-init.c.s | 2 +- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 6 +- .../HBIOS/ch376-native/base-drv/work-area.c.s | 8 +- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 34 +++++- .../source-doc/base-drv/dev_transfers.h | 4 +- .../source-doc/base-drv/usb-base-drv.c | 4 +- .../source-doc/base-drv/usb-base-drv.h | 2 +- .../source-doc/scsi-drv/scsi-init.c | 4 +- .../source-doc/ufi-drv/ufi-init.c | 3 + .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 108 +++++++++++------- Source/HBIOS/ch376.asm | 4 + Source/HBIOS/ch376scsi.asm | 8 +- 14 files changed, 132 insertions(+), 71 deletions(-) diff --git a/Dockerfile b/Dockerfile index d2e716e1..da6c902b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:jammy-20240111 as basebuilder +FROM ubuntu:jammy-20240111 AS basebuilder # This docker file can be used to build a tool chain docker image for building RomWBW images. @@ -10,7 +10,7 @@ FROM ubuntu:jammy-20240111 as basebuilder # After you have built the above image (called romwbw-chain), you can use it to compile and build the RomWBW images # as per the standard make scripts within RomWBW. # Start a new terminal, cd to where you have clone RomWBW, and then run this command: -# docker run -v ${PWD}:/src/ --privileged=true -u $(id -u ${USER}):$(id -g ${USER}) -it romwbw-chain:latest +# docker run -v ${PWD}:/src/ --privileged=true -u $(id -u ${USER}):$(id -g ${USER}) -it romwbw-chain # you can now compile and build the required images: @@ -21,13 +21,11 @@ FROM ubuntu:jammy-20240111 as basebuilder # when finish, type 'exit' to return to back to your standard terminal session LABEL Maintainer="Dean Netherton" \ - Description="spike to use clang for ez80 target" + Description="RomWBW builder platform" ENV DEBIAN_FRONTEND=noninteractive - RUN dpkg --add-architecture i386 -RUN sed -i 's/http:\/\/archive\.ubuntu\.com\/ubuntu/http:\/\/au.archive.ubuntu.com\/ubuntu/g' /etc/apt/sources.list RUN apt update -y RUN apt dist-upgrade -y RUN apt install -y --no-install-recommends cmake lzip ca-certificates mtools build-essential dos2unix libboost-all-dev texinfo texi2html libxml2-dev subversion bison flex zlib1g-dev m4 git wget dosfstools curl @@ -35,10 +33,10 @@ RUN apt install -y --no-install-recommends cmake lzip ca-certificates mtools bui RUN mkdir work WORKDIR /work -FROM basebuilder as main +FROM basebuilder AS main LABEL Maintainer="Dean Netherton" \ - Description="spike to build RomWBW" + Description="RomWBW builder platform" RUN mkdir /src WORKDIR /src/ diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 2484c0eb..bdc2d537 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -33,6 +33,8 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk +_storage_count: + DEFS 1 #ENDIF @@ -83,3 +85,5 @@ _chnative_seek: pop hl pop bc jp (hl) +_storage_count: + DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 53dbab60..5ea251ce 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -94,7 +94,7 @@ _chnative_init: ld e, l ld d, h inc de - ld bc,0x0062 + ld bc,0x0068 ldir ;source-doc/base-drv/usb-init.c:28: ch_cmd_reset_all(); call _ch_cmd_reset_all diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 0f59f64d..62bea257 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -92,8 +92,8 @@ l_find_device_config_00106: ret _device_config_sizes: DEFB +0x00 - DEFB +0x10 - DEFB +0x10 + DEFB +0x11 + DEFB +0x11 DEFB +0x0c DEFB +0x06 DEFB 0x00 @@ -175,7 +175,7 @@ l_next_device_config_00102: add hl, de ex de, hl ;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) - ld hl,0x0062 + ld hl,0x0068 add hl, bc ld a, e sub l diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index 6f872426..adb9c88a 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -34,7 +34,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk _x: - DEFS 99 + DEFS 105 #ENDIF @@ -149,4 +149,10 @@ _x: DEFB 0x00 DEFB 0x00 DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 2009fae2..aac79d77 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -56,7 +56,7 @@ _chscsi_init: push ix ld ix,0 add ix,sp - dec sp + push af ;source-doc/scsi-drv/scsi-init.c:15: do { ld (ix-1),0x01 l_chscsi_init_00105: @@ -88,24 +88,43 @@ l_chscsi_init_00105: ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:28: scsi_sense_init(storage_device); +;source-doc/scsi-drv/scsi-init.c:27: print_uint16(storage_count); + ld hl,(_storage_count) + ld h,0x00 + push de + call _print_uint16 + ld hl,scsi_init_str_2 + call _print_string + pop de +;source-doc/scsi-drv/scsi-init.c:29: storage_device->drive_index = storage_count++; + ld hl,0x0010 + add hl, de + ld c, l + ld b, h + ld hl,_storage_count + ld a, (hl) + ld (ix-2),a + inc (hl) + ld a,(ix-2) + ld (bc), a +;source-doc/scsi-drv/scsi-init.c:30: scsi_sense_init(storage_device); push de push de call _scsi_sense_init pop af pop de -;source-doc/scsi-drv/scsi-init.c:29: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/scsi-init.c:31: dio_add_entry(ch_scsi_fntbl, storage_device); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:33: } - inc sp +;source-doc/scsi-drv/scsi-init.c:35: } + ld sp, ix pop ix ret scsi_init_str_0: @@ -114,5 +133,8 @@ scsi_init_str_0: DEFM "USB: MASS STORAGE @ $" DEFB 0x00 scsi_init_str_1: + DEFM ":$" + DEFB 0x00 +scsi_init_str_2: DEFM " $" DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index 8eda8748..6a29097f 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -37,9 +37,9 @@ typedef struct { typedef struct { COMMON_DEVICE_CONFIG // bytes: 0-2 - endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt + endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt uint32_t current_lba; // bytes 12-15 - // uint8_t drive_index; // byte 16 + uint8_t drive_index; // byte 16 } device_config_storage; typedef struct { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index a0ce48b2..3320fd4d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -1,7 +1,7 @@ #include "usb-base-drv.h" -/* The total number of mounted devices (scsi, ufi and keyboard) */ -// uint8_t usb_device_count = 0; +/* The total number of storage devices (scsi, ufi) */ +uint8_t storage_count = 0; uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { storage_device->current_lba = lba; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h index 0f1e89fc..3d2abd53 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -4,7 +4,7 @@ #include #include -// extern uint8_t usb_device_count; +extern uint8_t storage_count; extern uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1); diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index 9838812f..5032703b 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -23,8 +23,10 @@ void chscsi_init(void) { if (t == USB_IS_MASS_STORAGE) { print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); + print_string(":$"); + print_uint16(storage_count); print_string(" $"); - + storage_device->drive_index = storage_count++; scsi_sense_init(storage_device); dio_add_entry(ch_scsi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 00123530..9ddcebb0 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -22,7 +22,10 @@ void chufi_init(void) { if (t == USB_IS_FLOPPY) { print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); + print_string(":$"); + print_uint16(storage_count); print_string(" $"); + storage_device->drive_index = storage_count++; dio_add_entry(ch_ufi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index a3f39762..f613d00f 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -56,7 +56,7 @@ _chufi_init: push ix ld ix,0 add ix,sp - dec sp + push af ;source-doc/ufi-drv/ufi-init.c:14: do { ld (ix-1),0x01 l_chufi_init_00105: @@ -88,18 +88,37 @@ l_chufi_init_00105: ld hl,ufi_init_str_1 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:26: dio_add_entry(ch_ufi_fntbl, storage_device); +;source-doc/ufi-drv/ufi-init.c:26: print_uint16(storage_count); + ld hl,(_storage_count) + ld h,0x00 + push de + call _print_uint16 + ld hl,ufi_init_str_2 + call _print_string + pop de +;source-doc/ufi-drv/ufi-init.c:28: storage_device->drive_index = storage_count++; + ld hl,0x0010 + add hl, de + ld c, l + ld b, h + ld hl,_storage_count + ld a, (hl) + ld (ix-2),a + inc (hl) + ld a,(ix-2) + ld (bc), a +;source-doc/ufi-drv/ufi-init.c:29: dio_add_entry(ch_ufi_fntbl, storage_device); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 l_chufi_init_00108: -;source-doc/ufi-drv/ufi-init.c:30: } - inc sp +;source-doc/ufi-drv/ufi-init.c:33: } + ld sp, ix pop ix ret ufi_init_str_0: @@ -108,9 +127,12 @@ ufi_init_str_0: DEFM "USB: FLOPPY @ $" DEFB 0x00 ufi_init_str_1: + DEFM ":$" + DEFB 0x00 +ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:32: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:35: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -121,7 +143,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:34: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/ufi-init.c:37: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x12 @@ -132,7 +154,7 @@ l_chufi_get_cap_00112: ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:36: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:39: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -142,7 +164,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:40: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/ufi-init.c:43: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -151,7 +173,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/ufi-init.c:42: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/ufi-init.c:45: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -161,7 +183,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:44: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/ufi-init.c:47: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -172,27 +194,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/ufi-init.c:45: if (result != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:48: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:46: return 0; +;source-doc/ufi-drv/ufi-init.c:49: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/ufi-init.c:48: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/ufi-init.c:51: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/ufi-init.c:49: } +;source-doc/ufi-drv/ufi-init.c:52: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:51: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:54: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -203,7 +225,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:53: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:56: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -218,18 +240,18 @@ _chufi_read: pop bc or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:54: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:57: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:59: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:62: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:61: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:64: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -262,11 +284,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:62: return -1; // general error +;source-doc/ufi-drv/ufi-init.c:65: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:65: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:68: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -279,7 +301,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:67: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:70: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -290,29 +312,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:68: return -1; // error +;source-doc/ufi-drv/ufi-init.c:71: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:72: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:75: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:74: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:77: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:75: return -1; +;source-doc/ufi-drv/ufi-init.c:78: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:77: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:80: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:78: } +;source-doc/ufi-drv/ufi-init.c:81: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:80: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:83: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -323,7 +345,7 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:82: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:85: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -338,18 +360,18 @@ _chufi_write: pop bc or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:83: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:86: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:87: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:90: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:88: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:91: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -382,11 +404,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:89: return -1; +;source-doc/ufi-drv/ufi-init.c:92: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:93: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:96: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -399,7 +421,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:95: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:98: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -410,25 +432,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:96: return -1; +;source-doc/ufi-drv/ufi-init.c:99: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:101: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:104: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:103: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:106: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:104: return -1; +;source-doc/ufi-drv/ufi-init.c:107: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:106: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:109: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:107: } +;source-doc/ufi-drv/ufi-init.c:110: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm index b0c05df3..dd446f6e 100644 --- a/Source/HBIOS/ch376.asm +++ b/Source/HBIOS/ch376.asm @@ -20,6 +20,10 @@ _delay: call DELAY call DELAY call DELAY + call DELAY + call DELAY + call DELAY + call DELAY pop af ret diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 576b44c2..df82a184 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -30,12 +30,12 @@ CH_SCSI_FNTBL: #ENDIF CH_SCSI_STATUS: - LD A, (IY) + ; LD A, (IY) XOR A RET CH_SCSI_RESET: - LD A, (IY) + ; LD A, (IY) XOR A RET @@ -182,9 +182,9 @@ CH_SCSI_FORMAT: ; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | ; CH_SCSI_DEVICE: - LD C, %01111010 ; TODO? + LD C, %00111010 ; TODO? LD D, DIODEV_USB - LD E, (iy+16) + LD E, (iy+16) ;???? device_config_storage.drive_index LD H, 0 LD L, 0 XOR A From 3f8bc4359643334ad1dcf48a88c80b7590395be5 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 14 Jan 2025 13:01:15 +1100 Subject: [PATCH 11/59] ch376-native: enabled usb drivers for z80 config --- .gitignore | 30 ++-- Source/HBIOS/Config/RCZ80_std.asm | 8 + .../ch376-native/base-drv/dev_transfers.c.s | 84 +++++------ .../HBIOS/ch376-native/base-drv/protocol.c.s | 108 ++++++------- .../HBIOS/ch376-native/base-drv/transfers.c.s | 142 +++++++++--------- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 6 +- .../keyboard/class_hid_keyboard.c.s | 14 +- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 80 +++++----- .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 64 ++++---- Source/HBIOS/ch376kyb.asm | 4 +- 10 files changed, 269 insertions(+), 271 deletions(-) diff --git a/.gitignore b/.gitignore index ec961a07..6bf81d86 100644 --- a/.gitignore +++ b/.gitignore @@ -114,20 +114,24 @@ Source/ZPM3/genbnk.dat Source/ZSDOS/zsdos.err # Lets explicit list all generate untracked binary files +Binary/*.upd +Binary/Apps/bbcbasic.txt +Binary/Apps/copysl.doc +Binary/Apps/copysl.doc +Binary/Apps/fdu.doc +Binary/Apps/fdu.doc Binary/Apps/Tunes/bgm.vgm Binary/Apps/Tunes/ending.vgm Binary/Apps/Tunes/inchina.vgm Binary/Apps/Tunes/shirakaw.vgm Binary/Apps/Tunes/startdem.vgm Binary/Apps/Tunes/wonder01.vgm -Binary/Apps/copysl.doc -Binary/Apps/fdu.doc Binary/Apps/zmconfig.ovr Binary/Apps/zminit.ovr -Binary/Apps/zmp.doc -Binary/Apps/zmp.hlp Binary/Apps/zmp.cfg +Binary/Apps/zmp.doc Binary/Apps/zmp.fon +Binary/Apps/zmp.hlp Binary/Apps/zmterm.ovr Binary/Apps/zmxfer.ovr Binary/CPM3/bdos3.spr @@ -146,13 +150,12 @@ Binary/CPNET/cpn12ser.lbr Binary/CPNET/cpn3duo.lbr Binary/CPNET/cpn3mt.lbr Binary/CPNET/cpn3ser.lbr -Binary/*.upd +Binary/hd1k_prefix.dat Binary/ZPM3/bnkbdos3.spr Binary/ZPM3/bnkbios3.spr Binary/ZPM3/gencpm.dat Binary/ZPM3/resbdos3.spr Binary/ZPM3/zinstal.zpm -Binary/hd1k_prefix.dat Source/BPBIOS/def-ww.lib Source/CPNET/cpn12duo.lbr Source/CPNET/cpn12mt.lbr @@ -177,6 +180,8 @@ Source/Fonts/fontvgarcc.bin Source/Fonts/fontvgarcu.asm Source/HBIOS/*.upd Source/HBIOS/build_env.cmd +Source/HBIOS/build_env.cmd +Source/HBIOS/hbios_env.sh Source/HBIOS/hbios_env.sh Source/HBIOS/netboot.mod Source/Images/*.cat @@ -194,16 +199,3 @@ Source/ZPM3/setz3.com Tools/unix/OpenSpin/build/ Tools/unix/zxcc/config.h Tools/unix/zxcc/zxcc -Binary/Apps/bbcbasic.txt - -Source/Images/hd1k_msxroms1.img -Source/Images/hd1k_msxroms1.img -Source/Images/hd1k_msxroms2.img -Source/Images/hd512_msxroms1.img -Source/Images/hd512_msxroms2.img -Source/Images/fd144_z3plus.img -Source/Images/hd1k_z3plus.img -Source/Images/hd512_z3plus.img - -Source/Images/*.cat -Source/RomDsk/*.cat diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index 80e756b3..bd6a44ac 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -106,3 +106,11 @@ SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER AY38910ENABLE .SET FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] AY_FORCE .SET FALSE ; AY: BYPASS AUTO-DETECT, FORCED PRESENT + +CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER +CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER +CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +USBKYBENABLE .SET TRUE ; USB KEYBOARD DRIVER diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 8b622ba9..475fbd05 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { +;source-doc/base-drv/dev_transfers.c:24: * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer ; --------------------------------- ; Function usbdev_control_transfer ; --------------------------------- @@ -56,7 +56,7 @@ _usbdev_control_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); +;source-doc/base-drv/dev_transfers.c:25: * ld l,(ix+4) ld h,(ix+5) ld e,l @@ -82,10 +82,10 @@ _usbdev_control_transfer: pop af pop af pop af -;source-doc/base-drv/dev_transfers.c:33: } +;source-doc/base-drv/dev_transfers.c:26: * @param device the usb device pop ix ret -;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { +;source-doc/base-drv/dev_transfers.c:28: * @param buffer Pointer of data to send or receive into ; --------------------------------- ; Function usbdev_blk_out_trnsfer ; --------------------------------- @@ -94,7 +94,7 @@ _usbdev_blk_out_trnsfer: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; +;source-doc/base-drv/dev_transfers.c:30: */ ld e,(ix+4) ld d,(ix+5) ld c, e @@ -102,7 +102,7 @@ _usbdev_blk_out_trnsfer: inc bc inc bc inc bc -;source-doc/base-drv/dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); +;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); ld l, e ld h, d ld a, (hl) @@ -131,11 +131,11 @@ _usbdev_blk_out_trnsfer: pop bc ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:41: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:34: ld a,(_result) sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); +;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { ld l, e ld h, d inc hl @@ -164,23 +164,23 @@ _usbdev_blk_out_trnsfer: pop af inc sp pop bc -;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:36: ld a, (bc) and 0xfe ld (bc), a -;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; ld l,0x02 jr l_usbdev_blk_out_trnsfer_00104 l_usbdev_blk_out_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); -;source-doc/base-drv/dev_transfers.c:50: return result; +;source-doc/base-drv/dev_transfers.c:40: +;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; ld hl,(_result) l_usbdev_blk_out_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:51: } +;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; inc sp pop ix ret -;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { +;source-doc/base-drv/dev_transfers.c:46: ; --------------------------------- ; Function usbdev_bulk_in_transfer ; --------------------------------- @@ -189,12 +189,12 @@ _usbdev_bulk_in_transfer: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; +;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); ld c,(ix+4) ld b,(ix+5) ld hl,0x0006 add hl, bc -;source-doc/base-drv/dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); +;source-doc/base-drv/dev_transfers.c:49: done: ld e,c ld d,b ex de,hl @@ -224,11 +224,11 @@ _usbdev_bulk_in_transfer: pop bc ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:58: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:51: } ld a,(_result) sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 -;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); +;source-doc/base-drv/dev_transfers.c:52: ld l, c ld h, b inc hl @@ -258,22 +258,22 @@ _usbdev_bulk_in_transfer: pop af inc sp pop de -;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { ex de, hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:61: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; ld l,0x02 jr l_usbdev_bulk_in_transfer_00104 l_usbdev_bulk_in_transfer_00102: -;source-doc/base-drv/dev_transfers.c:64: RETURN_CHECK(result); -;source-doc/base-drv/dev_transfers.c:66: return result; +;source-doc/base-drv/dev_transfers.c:57: +;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); ld hl,(_result) l_usbdev_bulk_in_transfer_00104: -;source-doc/base-drv/dev_transfers.c:67: } +;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; inc sp pop ix ret -;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, +;source-doc/base-drv/dev_transfers.c:62: } ; --------------------------------- ; Function usbdev_dat_in_trnsfer ; --------------------------------- @@ -282,7 +282,7 @@ _usbdev_dat_in_trnsfer: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; +;source-doc/base-drv/dev_transfers.c:67: } ld e,(ix+4) ld d,(ix+5) ld c, e @@ -301,7 +301,7 @@ _usbdev_dat_in_trnsfer: ld a,0x00 adc a, b ld b, a -;source-doc/base-drv/dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); +;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, ld l, e ld h, d ld a, (hl) @@ -330,11 +330,11 @@ _usbdev_dat_in_trnsfer: pop bc ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:78: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:71: const uint16_t buffer_size, ld a,(_result) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); +;source-doc/base-drv/dev_transfers.c:72: const usb_endpoint_type endpoint_type) { ld l, e ld h, d inc hl @@ -363,23 +363,23 @@ _usbdev_dat_in_trnsfer: pop af inc sp pop bc -;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:73: ld a, (bc) and 0xfe ld (bc), a -;source-doc/base-drv/dev_transfers.c:81: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; ld l,0x02 jr l_usbdev_dat_in_trnsfer_00104 l_usbdev_dat_in_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:84: RETURN_CHECK(result); -;source-doc/base-drv/dev_transfers.c:86: return result; +;source-doc/base-drv/dev_transfers.c:77: +;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); ld hl,(_result) l_usbdev_dat_in_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:87: } +;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; inc sp pop ix ret -;source-doc/base-drv/dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { +;source-doc/base-drv/dev_transfers.c:82: } ; --------------------------------- ; Function usbdev_dat_in_trnsfer_0 ; --------------------------------- @@ -388,13 +388,13 @@ _usbdev_dat_in_trnsfer_0: ld ix,0 add ix,sp push af -;source-doc/base-drv/dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; +;source-doc/base-drv/dev_transfers.c:83: ld e,(ix+4) ld d,(ix+5) ld hl,0x0003 add hl, de ex (sp), hl -;source-doc/base-drv/dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); +;source-doc/base-drv/dev_transfers.c:85: done: ld l, e ld h, d ld a, (hl) @@ -423,11 +423,11 @@ _usbdev_dat_in_trnsfer_0: pop de ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:87: } ld a,(_result) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_0_00102 -;source-doc/base-drv/dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); +;source-doc/base-drv/dev_transfers.c:88: ld l, e ld h, d inc hl @@ -452,18 +452,18 @@ _usbdev_dat_in_trnsfer_0: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:96: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { pop hl push hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:97: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; ld l,0x02 jr l_usbdev_dat_in_trnsfer_0_00103 l_usbdev_dat_in_trnsfer_0_00102: -;source-doc/base-drv/dev_transfers.c:100: return result; +;source-doc/base-drv/dev_transfers.c:93: ld hl,(_result) l_usbdev_dat_in_trnsfer_0_00103: -;source-doc/base-drv/dev_transfers.c:101: } +;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index d91b03d5..c63f157d 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/protocol.c:29: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { +;source-doc/base-drv/protocol.c:25: * ; --------------------------------- ; Function usbtrn_get_descriptor ; --------------------------------- @@ -59,18 +59,18 @@ _usbtrn_get_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:31: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:27: * @return usb_error USB_ERR_OK if all good, otherwise specific error code ld hl,0 add hl, sp ex de, hl ld bc,0x0008 ld hl,_cmd_get_device_descriptor ldir -;source-doc/base-drv/protocol.c:32: cmd.wLength = 8; +;source-doc/base-drv/protocol.c:28: */ ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); +;source-doc/base-drv/protocol.c:30: setup_packet cmd; ld c,(ix+4) ld b,(ix+5) ld e, c @@ -93,11 +93,11 @@ _usbtrn_get_descriptor: pop bc ld a, l ld (_result), a -;source-doc/base-drv/protocol.c:36: CHECK(result); +;source-doc/base-drv/protocol.c:32: cmd.wLength = 8; ld a,(_result) or a jr NZ,l_usbtrn_get_descriptor_00103 -;source-doc/base-drv/protocol.c:38: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); ld hl,0 add hl, sp ex de, hl @@ -106,11 +106,11 @@ _usbtrn_get_descriptor: ld hl,_cmd_get_device_descriptor ldir pop bc -;source-doc/base-drv/protocol.c:39: cmd.wLength = 18; +;source-doc/base-drv/protocol.c:35: ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); +;source-doc/base-drv/protocol.c:36: CHECK(result); ld e,(ix+4) ld d,(ix+5) ld hl,7 @@ -131,12 +131,12 @@ _usbtrn_get_descriptor: pop af ld a, l ld (_result), a -;source-doc/base-drv/protocol.c:42: RETURN_CHECK(result); -;source-doc/base-drv/protocol.c:44: done: +;source-doc/base-drv/protocol.c:38: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); l_usbtrn_get_descriptor_00103: -;source-doc/base-drv/protocol.c:45: return result; +;source-doc/base-drv/protocol.c:41: ld hl,(_result) -;source-doc/base-drv/protocol.c:46: } +;source-doc/base-drv/protocol.c:42: RETURN_CHECK(result); ld sp, ix pop ix ret @@ -148,7 +148,7 @@ _cmd_get_device_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0008 -;source-doc/base-drv/protocol.c:54: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { +;source-doc/base-drv/protocol.c:46: } ; --------------------------------- ; Function usbtrn_get_descriptor2 ; --------------------------------- @@ -159,18 +159,18 @@ _usbtrn_get_descriptor2: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:56: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:48: /** ld hl,0 add hl, sp ex de, hl ld bc,0x0008 ld hl,_cmd_get_device_descriptor ldir -;source-doc/base-drv/protocol.c:57: cmd.wLength = 8; +;source-doc/base-drv/protocol.c:49: * @brief Issue GET_DESCRIPTOR request to retrieve the device descriptor for usb device at the specified address ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); +;source-doc/base-drv/protocol.c:51: * @param buffer the buffer to store the device descriptor in ld c,(ix+4) ld b,(ix+5) ld e, c @@ -190,11 +190,11 @@ _usbtrn_get_descriptor2: pop bc ld a, l ld (_result), a -;source-doc/base-drv/protocol.c:61: CHECK(result); +;source-doc/base-drv/protocol.c:53: */ ld a,(_result) or a jr NZ,l_usbtrn_get_descriptor2_00103 -;source-doc/base-drv/protocol.c:63: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:55: setup_packet cmd; ld hl,0 add hl, sp ex de, hl @@ -203,11 +203,11 @@ _usbtrn_get_descriptor2: ld hl,_cmd_get_device_descriptor ldir pop bc -;source-doc/base-drv/protocol.c:64: cmd.wLength = 18; +;source-doc/base-drv/protocol.c:56: cmd = cmd_get_device_descriptor; ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); +;source-doc/base-drv/protocol.c:57: cmd.wLength = 8; ld e,(ix+4) ld d,(ix+5) ld hl,7 @@ -225,15 +225,15 @@ _usbtrn_get_descriptor2: pop af ld a, l ld (_result), a -;source-doc/base-drv/protocol.c:66: done: +;source-doc/base-drv/protocol.c:58: l_usbtrn_get_descriptor2_00103: -;source-doc/base-drv/protocol.c:67: return result; +;source-doc/base-drv/protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); ld hl,(_result) -;source-doc/base-drv/protocol.c:68: } +;source-doc/base-drv/protocol.c:60: ld sp, ix pop ix ret -;source-doc/base-drv/protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/protocol.c:66: done: ; --------------------------------- ; Function usbtrn_set_address ; --------------------------------- @@ -246,7 +246,7 @@ _usbtrn_set_address: push af push af ld c, l -;source-doc/base-drv/protocol.c:80: cmd = cmd_set_device_address; +;source-doc/base-drv/protocol.c:68: } ld hl,0 add hl, sp ex de, hl @@ -255,9 +255,9 @@ _usbtrn_set_address: ld hl,_cmd_set_device_address ldir pop bc -;source-doc/base-drv/protocol.c:81: cmd.bValue[0] = device_address; +;source-doc/base-drv/protocol.c:69: ld (ix-6),c -;source-doc/base-drv/protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0); +;source-doc/base-drv/protocol.c:71: xor a push af inc sp @@ -270,7 +270,7 @@ _usbtrn_set_address: add hl, sp push hl call _usb_control_transfer -;source-doc/base-drv/protocol.c:84: } +;source-doc/base-drv/protocol.c:72: /** ld sp,ix pop ix ret @@ -282,7 +282,7 @@ _cmd_set_device_address: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/protocol.c:94: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) { +;source-doc/base-drv/protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function usbtrn_set_configuration ; --------------------------------- @@ -293,7 +293,7 @@ _usbtrn_set_configuration: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:96: cmd = cmd_set_configuration; +;source-doc/base-drv/protocol.c:80: cmd = cmd_set_device_address; ld hl,0 add hl, sp ld e,l @@ -303,10 +303,10 @@ _usbtrn_set_configuration: ld hl,_cmd_set_configuration ldir pop bc -;source-doc/base-drv/protocol.c:97: cmd.bValue[0] = configuration; +;source-doc/base-drv/protocol.c:81: cmd.bValue[0] = device_address; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/protocol.c:99: return usb_control_transfer(&cmd, 0, device_address, max_packet_size); +;source-doc/base-drv/protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0); ld h,(ix+5) ld l,(ix+4) push hl @@ -314,7 +314,7 @@ _usbtrn_set_configuration: push hl push bc call _usb_control_transfer -;source-doc/base-drv/protocol.c:100: } +;source-doc/base-drv/protocol.c:84: } ld sp,ix pop ix ret @@ -326,7 +326,7 @@ _cmd_set_configuration: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, +;source-doc/base-drv/protocol.c:90: * ; --------------------------------- ; Function usbtrn_get_config_descriptor ; --------------------------------- @@ -337,7 +337,7 @@ _usbtrn_get_config_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:120: cmd = cmd_get_config_descriptor; +;source-doc/base-drv/protocol.c:96: cmd = cmd_set_configuration; ld hl,0 add hl, sp ld e,l @@ -347,14 +347,14 @@ _usbtrn_get_config_descriptor: ld hl,_cmd_get_config_descriptor ldir pop bc -;source-doc/base-drv/protocol.c:121: cmd.bValue[0] = config_index; +;source-doc/base-drv/protocol.c:97: cmd.bValue[0] = configuration; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/protocol.c:122: cmd.wLength = (uint16_t)buffer_size; +;source-doc/base-drv/protocol.c:98: ld e,(ix+7) ld (ix-2),e ld (ix-1),0x00 -;source-doc/base-drv/protocol.c:124: return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size); +;source-doc/base-drv/protocol.c:100: } ld e,(ix+4) ld d,(ix+5) ld h,(ix+9) @@ -363,7 +363,7 @@ _usbtrn_get_config_descriptor: push de push bc call _usb_control_transfer -;source-doc/base-drv/protocol.c:125: } +;source-doc/base-drv/protocol.c:101: ld sp,ix pop ix ret @@ -375,7 +375,7 @@ _cmd_get_config_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, +;source-doc/base-drv/protocol.c:103: ; --------------------------------- ; Function usbtrn_gfull_cfg_desc ; --------------------------------- @@ -383,7 +383,7 @@ _usbtrn_gfull_cfg_desc: push ix ld ix,0 add ix,sp -;source-doc/base-drv/protocol.c:134: max_packet_size)); +;source-doc/base-drv/protocol.c:110: * @param device_address the usb address of the device ld c,(ix+8) ld b,(ix+9) push bc @@ -407,20 +407,20 @@ _usbtrn_gfull_cfg_desc: ld a,(_result) or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 -;source-doc/base-drv/protocol.c:136: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength; +;source-doc/base-drv/protocol.c:112: * @return usb_error USB_ERR_OK if all good, otherwise specific error code ld l, c ld h, b inc hl inc hl ld d, (hl) -;source-doc/base-drv/protocol.c:137: if (max_length > max_buffer_size) +;source-doc/base-drv/protocol.c:113: */ ld a,(ix+7) sub d jr NC,l_usbtrn_gfull_cfg_desc_00104 -;source-doc/base-drv/protocol.c:138: max_length = max_buffer_size; +;source-doc/base-drv/protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, ld d,(ix+7) l_usbtrn_gfull_cfg_desc_00104: -;source-doc/base-drv/protocol.c:140: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); +;source-doc/base-drv/protocol.c:116: const uint8_t buffer_size, ld h,(ix+6) ld l,(ix+5) push hl @@ -434,20 +434,20 @@ l_usbtrn_gfull_cfg_desc_00104: ld a, l ld (_result), a ld a,(_result) -;source-doc/base-drv/protocol.c:142: return USB_ERR_OK; +;source-doc/base-drv/protocol.c:118: const uint8_t max_packet_size) { or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 ld l,a jr l_usbtrn_gfull_cfg_desc_00108 -;source-doc/base-drv/protocol.c:143: done: +;source-doc/base-drv/protocol.c:119: setup_packet cmd; l_usbtrn_gfull_cfg_desc_00107: -;source-doc/base-drv/protocol.c:144: return result; +;source-doc/base-drv/protocol.c:120: cmd = cmd_get_config_descriptor; ld hl,(_result) l_usbtrn_gfull_cfg_desc_00108: -;source-doc/base-drv/protocol.c:145: } +;source-doc/base-drv/protocol.c:121: cmd.bValue[0] = config_index; pop ix ret -;source-doc/base-drv/protocol.c:149: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) { +;source-doc/base-drv/protocol.c:125: } ; --------------------------------- ; Function usbtrn_clear_endpoint_halt ; --------------------------------- @@ -458,7 +458,7 @@ _usbtrn_clear_endpoint_halt: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:151: cmd = usb_cmd_clear_endpoint_halt; +;source-doc/base-drv/protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, ld hl,0 add hl, sp ld e,l @@ -468,10 +468,10 @@ _usbtrn_clear_endpoint_halt: ld hl,_usb_cmd_clear_endpoint_halt ldir pop bc -;source-doc/base-drv/protocol.c:152: cmd.bIndex[0] = endpoint_number; +;source-doc/base-drv/protocol.c:128: const uint8_t device_address, ld a,(ix+4) ld (ix-4),a -;source-doc/base-drv/protocol.c:154: return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size); +;source-doc/base-drv/protocol.c:130: const uint8_t max_buffer_size, ld h,(ix+6) ld l,(ix+5) push hl @@ -479,7 +479,7 @@ _usbtrn_clear_endpoint_halt: push hl push bc call _usb_control_transfer -;source-doc/base-drv/protocol.c:155: } +;source-doc/base-drv/protocol.c:131: uint8_t *const buffer) { ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index cd7bb9a1..0cf7ef14 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/transfers.c:24: usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, +;source-doc/base-drv/transfers.c:23: ; --------------------------------- ; Function usb_ctrl_trnsfer_ext ; --------------------------------- @@ -56,26 +56,26 @@ _usb_ctrl_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:27: const uint8_t max_packet_size) { ld a,(ix+5) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:29: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:30: ld a,(ix+7) or (ix+6) jr Z,l_usb_ctrl_trnsfer_ext_00104 ld a,(ix+7) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00104 -;source-doc/base-drv/transfers.c:32: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00104: -;source-doc/base-drv/transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); +;source-doc/base-drv/transfers.c:33: ld h,(ix+9) ld l,(ix+8) push hl @@ -90,10 +90,10 @@ l_usb_ctrl_trnsfer_ext_00104: pop af pop af l_usb_ctrl_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:35: } +;source-doc/base-drv/transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); pop ix ret -;source-doc/base-drv/transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +;source-doc/base-drv/transfers.c:38: * @brief Perform a USB control transfer (in or out) ; --------------------------------- ; Function usb_control_transfer ; --------------------------------- @@ -103,7 +103,7 @@ _usb_control_transfer: add ix,sp push af push af -;source-doc/base-drv/transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; +;source-doc/base-drv/transfers.c:43: * @param device_address usb device address ld hl,0 add hl, sp set 0, (hl) @@ -125,29 +125,29 @@ _usb_control_transfer: and 0xfc or e ld (hl), a -;source-doc/base-drv/transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); +;source-doc/base-drv/transfers.c:45: * @return usb_error USB_ERR_OK if all good, otherwise specific error code ld c,(ix+4) ld b,(ix+5) ld a, (bc) and 0x80 -;source-doc/base-drv/transfers.c:56: if (transferIn && buffer == 0) +;source-doc/base-drv/transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, ld (ix-1),a or a jr Z,l_usb_control_transfer_00102 ld a,(ix+7) or (ix+6) jr NZ,l_usb_control_transfer_00102 -;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; +;source-doc/base-drv/transfers.c:48: void *const buffer, ld l,0x0f jp l_usb_control_transfer_00114 l_usb_control_transfer_00102: -;source-doc/base-drv/transfers.c:59: critical_begin(); +;source-doc/base-drv/transfers.c:50: const uint8_t max_packet_size) { push bc call _critical_begin ld l,(ix+8) call _ch_set_usb_address pop bc -;source-doc/base-drv/transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); +;source-doc/base-drv/transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); ld e,(ix+4) ld d,(ix+5) push bc @@ -161,16 +161,16 @@ l_usb_control_transfer_00102: call _ch_issue_token_setup call _ch_short_wait_int_and_get_stat pop bc -;source-doc/base-drv/transfers.c:66: CHECK(result); +;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:68: const uint16_t length = cmd_packet->wLength; +;source-doc/base-drv/transfers.c:59: critical_begin(); ld hl,6 add hl, bc ld c, (hl) inc hl -;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) +;source-doc/base-drv/transfers.c:62: ld a,(hl) ld b,a or c @@ -203,58 +203,58 @@ l_usb_control_transfer_00118: l_usb_control_transfer_00119: jr l_usb_control_transfer_00117 l_usb_control_transfer_00116: -;source-doc/base-drv/transfers.c:72: : USB_ERR_OK; +;source-doc/base-drv/transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ld l,0x00 l_usb_control_transfer_00117: -;source-doc/base-drv/transfers.c:74: CHECK(result) +;source-doc/base-drv/transfers.c:65: result = ch_short_wait_int_and_get_statu(); ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:76: if (transferIn) { +;source-doc/base-drv/transfers.c:67: ld a,(ix-1) or a jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA); +;source-doc/base-drv/transfers.c:68: const uint16_t length = cmd_packet->wLength; ld l,0x2c call _ch_command -;source-doc/base-drv/transfers.c:78: CH376_DATA_PORT = 0; +;source-doc/base-drv/transfers.c:69: ld a,0x00 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/transfers.c:79: ch_issue_token_out_ep0(); +;source-doc/base-drv/transfers.c:70: result = length != 0 call _ch_issue_token_out_ep0 -;source-doc/base-drv/transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ +;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { +;source-doc/base-drv/transfers.c:73: ld a,l or a jr Z,l_usb_control_transfer_00108 sub 0x02 jr NZ,l_usb_control_transfer_00113 l_usb_control_transfer_00108: -;source-doc/base-drv/transfers.c:83: result = USB_ERR_OK; +;source-doc/base-drv/transfers.c:74: CHECK(result) ld l,0x00 -;source-doc/base-drv/transfers.c:84: goto done; +;source-doc/base-drv/transfers.c:75: jr l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:87: RETURN_CHECK(result); +;source-doc/base-drv/transfers.c:78: CH376_DATA_PORT = 0; l_usb_control_transfer_00112: -;source-doc/base-drv/transfers.c:90: ch_issue_token_in_ep0(); +;source-doc/base-drv/transfers.c:81: call _ch_issue_token_in_ep0 -;source-doc/base-drv/transfers.c:91: result = ch_long_wait_int_and_get_status(); +;source-doc/base-drv/transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/transfers.c:95: done: +;source-doc/base-drv/transfers.c:86: l_usb_control_transfer_00113: -;source-doc/base-drv/transfers.c:96: critical_end(); +;source-doc/base-drv/transfers.c:87: RETURN_CHECK(result); push hl call _critical_end pop hl -;source-doc/base-drv/transfers.c:97: return result; +;source-doc/base-drv/transfers.c:88: } l_usb_control_transfer_00114: -;source-doc/base-drv/transfers.c:98: } +;source-doc/base-drv/transfers.c:89: ld sp, ix pop ix ret -;source-doc/base-drv/transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:92: ; --------------------------------- ; Function usb_dat_in_trnsfer_ext ; --------------------------------- @@ -262,26 +262,26 @@ _usb_dat_in_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:93: RETURN_CHECK(result); ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trnsfer_ext_00102 ld a,(ix+5) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:103: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:94: ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:96: critical_end(); ld a,(ix+10) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/transfers.c:106: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:97: return result; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/transfers.c:99: ld l,(ix+9) ld h,(ix+10) push hl @@ -300,10 +300,10 @@ l_usb_dat_in_trnsfer_ext_00105: pop af inc sp l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:109: } +;source-doc/base-drv/transfers.c:100: usb_error pop ix ret -;source-doc/base-drv/transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:103: return USB_BAD_ADDRESS; ; --------------------------------- ; Function usb_dat_in_trns_n_ext ; --------------------------------- @@ -311,34 +311,34 @@ _usb_dat_in_trns_n_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) +;source-doc/base-drv/transfers.c:104: ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trns_n_ext_00102 ld a,(ix+5) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00102 -;source-doc/base-drv/transfers.c:114: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00102: -;source-doc/base-drv/transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0) +;source-doc/base-drv/transfers.c:107: ld a,(ix+10) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00105 -;source-doc/base-drv/transfers.c:117: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00105: -;source-doc/base-drv/transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) +;source-doc/base-drv/transfers.c:110: ld a,(ix+7) and 0xc0 jr NZ,l_usb_dat_in_trns_n_ext_00107 -;source-doc/base-drv/transfers.c:120: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:111: usb_error ld l,0x82 jr l_usb_dat_in_trns_n_ext_00108 l_usb_dat_in_trns_n_ext_00107: -;source-doc/base-drv/transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) ld c,(ix+6) ld b,(ix+7) ld l,(ix+9) @@ -357,10 +357,10 @@ l_usb_dat_in_trns_n_ext_00107: pop af inc sp l_usb_dat_in_trns_n_ext_00108: -;source-doc/base-drv/transfers.c:123: } +;source-doc/base-drv/transfers.c:114: return USB_BAD_ADDRESS; pop ix ret -;source-doc/base-drv/transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) ; --------------------------------- ; Function usb_data_in_transfer ; --------------------------------- @@ -368,12 +368,12 @@ _usb_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:136: critical_begin(); +;source-doc/base-drv/transfers.c:120: return USB_BAD_ADDRESS; call _critical_begin -;source-doc/base-drv/transfers.c:138: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:124: ld l,(ix+9) ld h,(ix+10) push hl @@ -389,14 +389,14 @@ _usb_data_in_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:142: critical_end(); +;source-doc/base-drv/transfers.c:126: * @brief Perform a USB data in on the specififed endpoint call _critical_end -;source-doc/base-drv/transfers.c:144: return result; +;source-doc/base-drv/transfers.c:128: * @param buffer the buffer to receive the data ld hl,(_result) -;source-doc/base-drv/transfers.c:145: } +;source-doc/base-drv/transfers.c:129: * @param buffer_size the maximum size of data to be received pop ix ret -;source-doc/base-drv/transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:134: usb_error ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- @@ -404,12 +404,12 @@ _usb_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:158: critical_begin(); +;source-doc/base-drv/transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { call _critical_begin -;source-doc/base-drv/transfers.c:160: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:137: ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:139: ld l,(ix+9) ld h,(ix+10) push hl @@ -425,14 +425,14 @@ _usb_data_in_transfer_n: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:164: critical_end(); +;source-doc/base-drv/transfers.c:141: call _critical_end -;source-doc/base-drv/transfers.c:166: return result; +;source-doc/base-drv/transfers.c:143: ld hl,(_result) -;source-doc/base-drv/transfers.c:167: } +;source-doc/base-drv/transfers.c:144: return result; pop ix ret -;source-doc/base-drv/transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:149: * ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- @@ -440,12 +440,12 @@ _usb_data_out_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:180: critical_begin(); +;source-doc/base-drv/transfers.c:150: * @param buffer the buffer to receive the data - must be 62 bytes call _critical_begin -;source-doc/base-drv/transfers.c:182: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:152: * @param device_address the usb address of the device ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:154: * @return usb_error USB_ERR_OK if all good, otherwise specific error code ld l,(ix+9) ld h,(ix+10) push hl @@ -461,10 +461,10 @@ _usb_data_out_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:186: critical_end(); +;source-doc/base-drv/transfers.c:156: usb_error call _critical_end -;source-doc/base-drv/transfers.c:188: return result; +;source-doc/base-drv/transfers.c:158: critical_begin(); ld hl,(_result) -;source-doc/base-drv/transfers.c:189: } +;source-doc/base-drv/transfers.c:159: pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 5ea251ce..4b6c6555 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -68,14 +68,14 @@ _usb_host_bus_reset: call _ch_cmd_set_usb_mode ;source-doc/base-drv/usb-init.c:16: delay_20ms(); call _delay_20ms -;source-doc/base-drv/ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); +;source-doc/base-drv/ch376.h:110: #endif ld l,0x0b call _ch_command -;source-doc/base-drv/ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; +;source-doc/base-drv/ch376.h:111: ld a,0x25 ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); +;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s index c9530ea6..d997d258 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -49,39 +49,39 @@ _scancodes_table: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { +;source-doc/keyboard/class_hid_keyboard.c:333: }; ; --------------------------------- ; Function scancode_to_char ; --------------------------------- _scancode_to_char: ld c, a -;source-doc/keyboard/class_hid_keyboard.c:336: if (code >= 0x80) +;source-doc/keyboard/class_hid_keyboard.c:334: ld a,l ld e,l sub 0x80 jr C,l_scancode_to_char_00102 -;source-doc/keyboard/class_hid_keyboard.c:337: return 0; +;source-doc/keyboard/class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { xor a jr l_scancode_to_char_00105 l_scancode_to_char_00102: -;source-doc/keyboard/class_hid_keyboard.c:339: if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) +;source-doc/keyboard/class_hid_keyboard.c:337: return 0; ld a, c and 0x22 jr Z,l_scancode_to_char_00104 -;source-doc/keyboard/class_hid_keyboard.c:340: return scancodes_shift_table[code]; +;source-doc/keyboard/class_hid_keyboard.c:338: ld d,0x00 ld hl,_scancodes_shift_table add hl, de ld a, (hl) jr l_scancode_to_char_00105 l_scancode_to_char_00104: -;source-doc/keyboard/class_hid_keyboard.c:342: return scancodes_table[code]; +;source-doc/keyboard/class_hid_keyboard.c:340: return scancodes_shift_table[code]; ld d,0x00 ld hl,_scancodes_table add hl, de ld a, (hl) l_scancode_to_char_00105: -;source-doc/keyboard/class_hid_keyboard.c:343: } +;source-doc/keyboard/class_hid_keyboard.c:341: ret _scancodes_shift_table: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index d877b11f..7419d950 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -145,7 +145,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:47: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -153,24 +153,24 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { ld a,(ix+5) sub 0x80 jr NC,l_keyboard_buf_put_00106 ld a,(ix+5) or a -;source-doc/keyboard/kyb-init.c:50: return; // ignore ??? +;source-doc/keyboard/kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:51: ld a,(_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) sub c jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 ld hl,(_write_index) ld h,0x00 @@ -178,7 +178,7 @@ _keyboard_buf_put: add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/kyb-init.c:55: buffer[write_index].key_code = key_code; +;source-doc/keyboard/kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; ld hl,(_write_index) ld h,0x00 add hl, hl @@ -187,30 +187,30 @@ _keyboard_buf_put: inc de ld a,(ix+5) ld (de), a -;source-doc/keyboard/kyb-init.c:56: write_index = next_write_index; +;source-doc/keyboard/kyb-init.c:55: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:58: } +;source-doc/keyboard/kyb-init.c:57: } pop ix ret -;source-doc/keyboard/kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:59: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:61: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:62: return write_index - read_index; +;source-doc/keyboard/kyb-init.c:61: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:63: ld hl,_read_index ld c, (hl) ld a,0x08 @@ -219,9 +219,9 @@ l_keyboard_buf_size_00102: ld c, (hl) add a, c l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:65: } +;source-doc/keyboard/kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret -;source-doc/keyboard/kyb-init.c:67: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:66: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -231,41 +231,41 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:67: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:69: return 255 << 8; +;source-doc/keyboard/kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, h ld d, h jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:70: ld bc,_buffer+0 ld hl,(_read_index) ld h,0x00 add hl, hl add hl, bc ld b, (hl) -;source-doc/keyboard/kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; ld hl,_read_index ld a, (hl) inc a and 0x07 ld (hl), a -;source-doc/keyboard/kyb-init.c:74: const unsigned char c = scancode_to_char(modifier_key, key_code); +;source-doc/keyboard/kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:75: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -282,46 +282,46 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:77: } +;source-doc/keyboard/kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:79: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:78: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:80: write_index = 0; +;source-doc/keyboard/kyb-init.c:79: void keyboard_buf_flush() { ld hl,_write_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:81: read_index = 0; +;source-doc/keyboard/kyb-init.c:80: write_index = 0; ld hl,_read_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:82: } +;source-doc/keyboard/kyb-init.c:81: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:88: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:87: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:89: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:88: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:90: return; +;source-doc/keyboard/kyb-init.c:89: if (is_in_critical_section()) ret NZ -;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); +;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b call _ch_command -;././source-doc/base-drv//ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; +;././source-doc/base-drv//ch376.h:111: ld a,0x25 ld bc,_CH376_DATA_PORT out (c),a -;././source-doc/base-drv//ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); +;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) ld a,0x1f ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:93: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); +;source-doc/keyboard/kyb-init.c:92: ch_configure_nak_retry_disable(); ld bc,_report ld hl, (_keyboard_config) ld a,0x08 @@ -335,23 +335,23 @@ _keyboard_tick: inc sp ld a, l ld (_result), a -;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8); +;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b call _ch_command -;././source-doc/base-drv//ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES; +;././source-doc/base-drv//ch376.h:111: ld a,0x25 ld bc,_CH376_DATA_PORT out (c),a -;././source-doc/base-drv//ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); +;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:95: if (result == 0) +;source-doc/keyboard/kyb-init.c:94: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) or a ret NZ -;source-doc/keyboard/kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); +;source-doc/keyboard/kyb-init.c:95: if (result == 0) ld a, (_report + 2) ld hl,_report ld c, (hl) @@ -359,7 +359,7 @@ _keyboard_tick: push bc call _keyboard_buf_put pop af -;source-doc/keyboard/kyb-init.c:97: } +;source-doc/keyboard/kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); ret _keyboard_config: DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index 702a6eb0..c0be3f53 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -513,7 +513,7 @@ l_ufi_read_write_sector_00105: ld sp,ix pop ix ret -;source-doc/ufi-drv/class_ufi.c:127: usb_error ufi_format(device_config *const storage_device, +;source-doc/ufi-drv/class_ufi.c:123: * HD | 93h | 1.25 MB | 77 | 2 | 8 | 1232 04D0h | 1024 0400h | ; --------------------------------- ; Function ufi_format ; --------------------------------- @@ -524,7 +524,7 @@ _ufi_format: ld hl, -26 add hl, sp ld sp, hl -;source-doc/ufi-drv/class_ufi.c:134: memset(¶meter_list, 0, sizeof(parameter_list)); +;source-doc/ufi-drv/class_ufi.c:130: const ufi_format_capacity_descriptor *const format) { ld hl,2 add hl, sp push hl @@ -537,7 +537,7 @@ l_ufi_format_00104: inc hl djnz l_ufi_format_00104 pop bc -;source-doc/ufi-drv/class_ufi.c:137: cmd = _ufi_cmd_format; +;source-doc/ufi-drv/class_ufi.c:133: ufi_format_parameter_list parameter_list; ld hl,14 add hl, sp ex de, hl @@ -546,14 +546,14 @@ l_ufi_format_00104: ld hl,__ufi_cmd_format ldir pop bc -;source-doc/ufi-drv/class_ufi.c:140: cmd.track_number = track_number; +;source-doc/ufi-drv/class_ufi.c:136: ufi_format_command cmd; ld a,(ix+7) ld (ix-10),a -;source-doc/ufi-drv/class_ufi.c:141: cmd.interleave[1] = 0; +;source-doc/ufi-drv/class_ufi.c:137: cmd = _ufi_cmd_format; ld (ix-8),0x00 -;source-doc/ufi-drv/class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); +;source-doc/ufi-drv/class_ufi.c:138: // memcpy(&cmd, &_ufi_cmd_format, sizeof(cmd)); ld (ix-4),0x0c -;source-doc/ufi-drv/class_ufi.c:144: parameter_list.defect_list_header.side = side; +;source-doc/ufi-drv/class_ufi.c:140: cmd.track_number = track_number; ld e, c ld d, b inc de @@ -564,36 +564,36 @@ l_ufi_format_00104: and 0xfe or l ld (de), a -;source-doc/ufi-drv/class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; +;source-doc/ufi-drv/class_ufi.c:141: cmd.interleave[1] = 0; ld l, e ld h, d res 1, (hl) -;source-doc/ufi-drv/class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; +;source-doc/ufi-drv/class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); ld l, e ld h, d ld a, (hl) and 0xf3 ld (hl), a -;source-doc/ufi-drv/class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; +;source-doc/ufi-drv/class_ufi.c:143: ld l, e ld h, d set 4, (hl) -;source-doc/ufi-drv/class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; +;source-doc/ufi-drv/class_ufi.c:144: parameter_list.defect_list_header.side = side; ld l, e ld h, d set 5, (hl) -;source-doc/ufi-drv/class_ufi.c:149: parameter_list.defect_list_header.extend = 0; +;source-doc/ufi-drv/class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; ld l, e ld h, d res 6, (hl) -;source-doc/ufi-drv/class_ufi.c:150: parameter_list.defect_list_header.fov = 1; +;source-doc/ufi-drv/class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; ex de, hl set 7, (hl) -;source-doc/ufi-drv/class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; +;source-doc/ufi-drv/class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; ld (ix-22),0x00 -;source-doc/ufi-drv/class_ufi.c:152: parameter_list.defect_list_header.defect_list_length_lsb = 8; +;source-doc/ufi-drv/class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; ld (ix-21),0x08 -;source-doc/ufi-drv/class_ufi.c:153: memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); +;source-doc/ufi-drv/class_ufi.c:149: parameter_list.defect_list_header.extend = 0; ld e,(ix+8) ld d,(ix+9) push bc @@ -603,7 +603,7 @@ l_ufi_format_00104: ld bc,0x0008 ldir pop bc -;source-doc/ufi-drv/class_ufi.c:155: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)¶meter_list, +;source-doc/ufi-drv/class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; ld hl,0 add hl, sp push hl @@ -620,12 +620,12 @@ l_ufi_format_00104: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/class_ufi.c:162: return result; -;source-doc/ufi-drv/class_ufi.c:163: } +;source-doc/ufi-drv/class_ufi.c:158: // trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list)); +;source-doc/ufi-drv/class_ufi.c:159: ld sp,ix pop ix ret -;source-doc/ufi-drv/class_ufi.c:165: usb_error ufi_send_diagnostics(device_config *const storage_device) { +;source-doc/ufi-drv/class_ufi.c:161: done: ; --------------------------------- ; Function ufi_send_diagnostics ; --------------------------------- @@ -636,7 +636,7 @@ _ufi_send_diagnostics: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/class_ufi.c:168: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; +;source-doc/ufi-drv/class_ufi.c:164: ld hl,0 add hl, sp ld e,l @@ -646,7 +646,7 @@ _ufi_send_diagnostics: ld hl,__ufi_cmd_send_diagnostic ldir pop bc -;source-doc/ufi-drv/class_ufi.c:170: return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL); +;source-doc/ufi-drv/class_ufi.c:166: ufi_send_diagnostic_command ufi_cmd_send_diagnostic; ld hl,0x0000 push hl push hl @@ -659,11 +659,11 @@ _ufi_send_diagnostics: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/class_ufi.c:171: } +;source-doc/ufi-drv/class_ufi.c:167: ld sp,ix pop ix ret -;source-doc/ufi-drv/class_ufi.c:173: uint32_t convert_from_msb_first(const uint8_t *const buffer) { +;source-doc/ufi-drv/class_ufi.c:169: ; --------------------------------- ; Function convert_from_msb_first ; --------------------------------- @@ -673,40 +673,40 @@ _convert_from_msb_first: add ix,sp push af push af -;source-doc/ufi-drv/class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); +;source-doc/ufi-drv/class_ufi.c:171: } ld hl,0 add hl, sp ex de, hl -;source-doc/ufi-drv/class_ufi.c:176: const uint8_t *p_input = buffer + 3; +;source-doc/ufi-drv/class_ufi.c:172: ld c,(ix+4) ld b,(ix+5) inc bc inc bc inc bc -;source-doc/ufi-drv/class_ufi.c:178: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:174: uint32_t result; ld a, (bc) dec bc ld (de), a inc de -;source-doc/ufi-drv/class_ufi.c:179: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); ld a, (bc) dec bc ld (de), a inc de -;source-doc/ufi-drv/class_ufi.c:180: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:176: const uint8_t *p_input = buffer + 3; ld a, (bc) ld (de), a inc de -;source-doc/ufi-drv/class_ufi.c:181: *p_output = *p_input--; +;source-doc/ufi-drv/class_ufi.c:177: dec bc ld a, (bc) ld (de), a -;source-doc/ufi-drv/class_ufi.c:183: return result; +;source-doc/ufi-drv/class_ufi.c:179: *p_output++ = *p_input--; pop hl push hl ld e,(ix-2) ld d,(ix-1) -;source-doc/ufi-drv/class_ufi.c:184: } +;source-doc/ufi-drv/class_ufi.c:180: *p_output++ = *p_input--; ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index c6a3c706..b1e917e1 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -3,6 +3,7 @@ ; CH376 NATIVE USB KEYBOARD DRIVER ;================================================================================================== ; +; This driver is designed to work within the TMS video driver for a CRT solution. #DEFINE DEFM .DB #DEFINE DEFB .DB @@ -61,8 +62,6 @@ CHUKB_TICK: ; we gonna need a bigger stack - EZ80_UTIL_DEBUG - LD (UKY_INT_SP),SP ; SAVE ORIGINAL STACK FRAME LD SP,UKY_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM @@ -155,6 +154,5 @@ UKY_READ: JR NZ, UKY_READ LD C, 0 LD D, 0 - ; LD E, 'A' XOR A RET From bf2a45f83ea1373df5393320401d9b843b082948 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 12:10:13 +1100 Subject: [PATCH 12/59] ch376-native: updated github action build scripts to also attempt to transpile driver from c to assembly --- .github/workflows/commit.yml | 6 ++++-- .github/workflows/release.yml | 3 ++- Makefile | 7 ++++++- Source/HBIOS/ch376-native/Makefile | 14 ++++++++++++-- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml index 2110be86..2729cf20 100644 --- a/.github/workflows/commit.yml +++ b/.github/workflows/commit.yml @@ -26,7 +26,8 @@ jobs: run: | export TZ='America/Los_Angeles' sudo apt-get install srecord - make distlog + make transpile-c-code + make distlog --trace rm -rf .git* - name: List Output @@ -58,7 +59,8 @@ jobs: run: | export TZ='America/Los_Angeles' brew install srecord - make distlog + make transpile-c-code + make distlog --trace rm -rf .git* - name: List Output diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e48d5225..e418df06 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,8 @@ jobs: export TZ='America/Los_Angeles' sudo apt-get install libncurses-dev sudo apt-get install srecord - make distlog + make transpile-c-code + make distlog --trace rm -rf .git* - name: Create Package Archive diff --git a/Makefile b/Makefile index 87fb9244..91b8f819 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: tools source clean clobber diff dist .ONESHELL: -.SHELLFLAGS = -cex +.SHELLFLAGS = -ce all: tools source @@ -22,6 +22,11 @@ clobber: clean diff: $(MAKE) --directory Source diff +# Convert c code to assembly code +transpile-c-code: + @cd Source/HBIOS/ch376-native + $(MAKE) -j + dist: $(MAKE) ROM_PLATFORM=dist $(MAKE) --directory Tools clean diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 6f25245a..8c6e40a0 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -11,10 +11,15 @@ LIBS := -I./$(SRC)base-drv/ ZCCFLAGS := +z80 -vn -startup=0 -clib=sdcc_iy -compiler=sdcc -Cs--std=c23 -Cs--Werror $(ZCCRELFLAGS) $(LIBS) ZCC_PATH := $(shell command -v zcc) +DOCKER_PATH := $(shell command -v docker) ZCC := $(shell command -v zcc >/dev/null 2>&1 && echo zcc || echo 'docker run -w /host/${PWD} -v /:/host/ -u $(shell id -u ${USER}):$(shell id -g ${USER}) -t z88dk/z88dk zcc') ifeq ($(ZCC_PATH),) - $(info ZCC is set to use Docker to run zcc) + ifeq ($(DOCKER_PATH),) + .DEFAULT_GOAL := skip + else + $(info ZCC is set to use Docker to run zcc) + endif else $(info ZCC is set to $(ZCC_PATH)) endif @@ -23,6 +28,10 @@ ASSDIR := ./ all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s $(ASSDIR)keyboard.s +skip: + @echo "Unable to compile ch376 native to assembly. Install docker or z88dk." + exit 0 + clean: @rm -rf base-drv/*.s rm -rf base-drv/*.asm @@ -43,7 +52,8 @@ $(ASSDIR)%.c.s: $(ASSDIR)%.c.asm ${SRC}convert-for-uz80as.sh $< $@ define compile - @mkdir -p $(dir $@) + @set -e + mkdir -p $(dir $@) $(ZCC) $(ZCCFLAGS) --c-code-in-asm --assemble-only $< -o $@ echo "Compiled $(notdir $@) from $(notdir $<)" endef From ea3ba6e0d4af03eb9c01473bfeb8a86287a39942 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 12:12:37 +1100 Subject: [PATCH 13/59] ch376-native: remove transpiling of c code from mac-os gha build --- .github/workflows/commit.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml index 2729cf20..03ec1d72 100644 --- a/.github/workflows/commit.yml +++ b/.github/workflows/commit.yml @@ -59,7 +59,6 @@ jobs: run: | export TZ='America/Los_Angeles' brew install srecord - make transpile-c-code make distlog --trace rm -rf .git* From f63c3247640843b896a4ebc64f25f1e6a5cf6fee Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 12:16:15 +1100 Subject: [PATCH 14/59] ch376-native: remove --trace for mac-os --- .github/workflows/commit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml index 03ec1d72..33eaad76 100644 --- a/.github/workflows/commit.yml +++ b/.github/workflows/commit.yml @@ -59,7 +59,7 @@ jobs: run: | export TZ='America/Los_Angeles' brew install srecord - make distlog --trace + make distlog rm -rf .git* - name: List Output From 72ec983c4ff927771bbdb19bd8cc5f167485dbd4 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 14:08:42 +1100 Subject: [PATCH 15/59] ch376: added build option CHNATIVEFORCE to always force detection of module on boot --- Dockerfile | 2 +- Source/HBIOS/Config/RCZ80_std.asm | 1 + Source/HBIOS/cfg_MASTER.asm | 1 + Source/HBIOS/ch376-native/Makefile | 5 + .../HBIOS/ch376-native/base-drv/usb-init.c.s | 188 ++++++++++++++---- .../source-doc/base-drv/usb-init.c | 33 ++- Source/HBIOS/ch376.asm | 1 + Source/HBIOS/hbios.asm | 4 + 8 files changed, 186 insertions(+), 49 deletions(-) diff --git a/Dockerfile b/Dockerfile index da6c902b..86317c2f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:jammy-20240111 AS basebuilder # cd Tools && make # cd Source && make # at least once to build many common units -# cd Source && make rom ROM_PLATFORM=RCEZ80 ROM_CONFIG=std +# cd Source && make rom ROM_PLATFORM=RCZ80 ROM_CONFIG=std # when finish, type 'exit' to return to back to your standard terminal session diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index bd6a44ac..dd81ef6b 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -111,6 +111,7 @@ CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) USBKYBENABLE .SET TRUE ; USB KEYBOARD DRIVER diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 2caf43cf..98c64851 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -505,3 +505,4 @@ EZ80_FWSMD_TYP .EQU EZ80WSMD_CALC ; WAIT STATE TYPE: EZ80RMMD_[CALC|WAIT] (CYCL CHNATIVEENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEFORCE .EQU FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED (REQUIRES CHNATIVEENABLE) diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 8c6e40a0..1b6c1369 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -79,3 +79,8 @@ $(eval $(call build_subsystem,base-drv)) $(eval $(call build_subsystem,scsi-drv)) $(eval $(call build_subsystem,keyboard)) $(eval $(call build_subsystem,ufi-drv)) + +.PHONY: format +format: SHELL:=/bin/bash +format: + @find \( -name "*.c" -o -name "*.h" \) -exec echo "formating {}" \; -exec clang-format -i {} \; diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 4b6c6555..bcc038af 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -83,11 +83,15 @@ _usb_host_bus_reset: ld l,0x00 ;source-doc/base-drv/usb-init.c:21: } ret -;source-doc/base-drv/usb-init.c:25: void chnative_init(void) { +;source-doc/base-drv/usb-init.c:25: void _chnative_init(bool forced) { ; --------------------------------- -; Function chnative_init +; Function _chnative_init ; --------------------------------- -_chnative_init: +__chnative_init: + push ix + ld ix,0 + add ix,sp + dec sp ;source-doc/base-drv/usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); ld hl,_x ld (hl),0x00 @@ -100,75 +104,175 @@ _chnative_init: call _ch_cmd_reset_all ;source-doc/base-drv/usb-init.c:30: delay_medium(); call _delay_medium -;source-doc/base-drv/usb-init.c:32: if (!ch_probe()) { +;source-doc/base-drv/usb-init.c:32: if(forced) { + bit 0,(ix+4) + jr Z,l__chnative_init_00110 +;source-doc/base-drv/usb-init.c:33: bool indicator = true; + ld (ix-1),0x01 +;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$"); + ld hl,usb_init_str_0 + call _print_string +;source-doc/base-drv/usb-init.c:35: while(!ch_probe()) { +l__chnative_init_00104: call _ch_probe ld a, l or a - jr NZ,l_chnative_init_00102 -;source-doc/base-drv/usb-init.c:33: print_string("\r\nCH376: NOT PRESENT$"); -;source-doc/base-drv/usb-init.c:34: return; - ld hl,usb_init_str_0 - jp _print_string -l_chnative_init_00102: -;source-doc/base-drv/usb-init.c:37: print_string("\r\nCH376: PRESENT (VER $"); + jr NZ,l__chnative_init_00106 +;source-doc/base-drv/usb-init.c:36: if (indicator) + bit 0,(ix-1) + jr Z,l__chnative_init_00102 +;source-doc/base-drv/usb-init.c:37: print_string("\b $"); ld hl,usb_init_str_1 call _print_string -;source-doc/base-drv/usb-init.c:38: print_hex(ch_cmd_get_ic_version()); + jr l__chnative_init_00103 +l__chnative_init_00102: +;source-doc/base-drv/usb-init.c:39: print_string("\b*$"); + ld hl,usb_init_str_2 + call _print_string +l__chnative_init_00103: +;source-doc/base-drv/usb-init.c:41: delay_medium(); + call _delay_medium +;source-doc/base-drv/usb-init.c:42: indicator = !indicator; + ld a,(ix-1) + xor 0x01 + ld (ix-1),a + jr l__chnative_init_00104 +l__chnative_init_00106: +;source-doc/base-drv/usb-init.c:45: print_string("\bPRESENT (VER $"); + ld hl,usb_init_str_3 + call _print_string + jr l__chnative_init_00111 +l__chnative_init_00110: +;source-doc/base-drv/usb-init.c:48: if (!ch_probe()) { + call _ch_probe + ld a, l + or a + jr NZ,l__chnative_init_00108 +;source-doc/base-drv/usb-init.c:49: print_string("\r\nCH376: NOT PRESENT$"); + ld hl,usb_init_str_4 + call _print_string +;source-doc/base-drv/usb-init.c:50: return; + jr l__chnative_init_00118 +l__chnative_init_00108: +;source-doc/base-drv/usb-init.c:53: print_string("\r\nCH376: PRESENT (VER $"); + ld hl,usb_init_str_5 + call _print_string +l__chnative_init_00111: +;source-doc/base-drv/usb-init.c:56: print_hex(ch_cmd_get_ic_version()); call _ch_cmd_get_ic_version call _print_hex -;source-doc/base-drv/usb-init.c:39: print_string("); $"); - ld hl,usb_init_str_2 +;source-doc/base-drv/usb-init.c:57: print_string("); $"); + ld hl,usb_init_str_6 call _print_string -;source-doc/base-drv/usb-init.c:41: usb_host_bus_reset(); +;source-doc/base-drv/usb-init.c:59: usb_host_bus_reset(); call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { +;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { ld c,0x00 -l_chnative_init_00107: - ld a, c - sub 0x04 - jr NC,l_chnative_init_00105 -;source-doc/base-drv/usb-init.c:44: const uint8_t r = ch_very_short_wait_int_and_get_(); +l__chnative_init_00116: + bit 0,(ix+4) + jr Z,l__chnative_init_00120 + ld de,0x000a + jr l__chnative_init_00121 +l__chnative_init_00120: + ld de,0x0005 +l__chnative_init_00121: + ld b, c + ld l,0x00 + ld a, b + sub e + ld a, l + sbc a, d + jp PO, l__chnative_init_00185 + xor 0x80 +l__chnative_init_00185: + jp P, l__chnative_init_00114 +;source-doc/base-drv/usb-init.c:62: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get ld a, l pop bc -;source-doc/base-drv/usb-init.c:46: if (r == USB_INT_CONNECT) { +;source-doc/base-drv/usb-init.c:64: if (r == USB_INT_CONNECT) { sub 0x81 - jr NZ,l_chnative_init_00108 -;source-doc/base-drv/usb-init.c:47: print_string("USB: CONNECTED$"); - ld hl,usb_init_str_3 + jr NZ,l__chnative_init_00117 +;source-doc/base-drv/usb-init.c:65: print_string("USB: CONNECTED$"); + ld hl,usb_init_str_7 call _print_string -;source-doc/base-drv/usb-init.c:49: enumerate_all_devices(); - jp _enumerate_all_devices -;source-doc/base-drv/usb-init.c:51: return; - jr l_chnative_init_00109 -l_chnative_init_00108: -;source-doc/base-drv/usb-init.c:43: for (uint8_t i = 0; i < 4; i++) { +;source-doc/base-drv/usb-init.c:67: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb-init.c:69: return; + jr l__chnative_init_00118 +l__chnative_init_00117: +;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { inc c - jr l_chnative_init_00107 -l_chnative_init_00105: -;source-doc/base-drv/usb-init.c:55: print_string("USB: DISCONNECTED$"); - ld hl,usb_init_str_4 - jp _print_string -l_chnative_init_00109: -;source-doc/base-drv/usb-init.c:56: } + jr l__chnative_init_00116 +l__chnative_init_00114: +;source-doc/base-drv/usb-init.c:73: print_string("USB: DISCONNECTED$"); + ld hl,usb_init_str_8 + call _print_string +l__chnative_init_00118: +;source-doc/base-drv/usb-init.c:74: } + inc sp + pop ix ret usb_init_str_0: DEFB 0x0d DEFB 0x0a - DEFM "CH376: NOT PRESENT$" + DEFM "CH376: *$" DEFB 0x00 usb_init_str_1: + DEFB 0x08 + DEFM " $" + DEFB 0x00 +usb_init_str_2: + DEFB 0x08 + DEFM "*$" + DEFB 0x00 +usb_init_str_3: + DEFB 0x08 + DEFM "PRESENT (VER $" + DEFB 0x00 +usb_init_str_4: + DEFB 0x0d + DEFB 0x0a + DEFM "CH376: NOT PRESENT$" + DEFB 0x00 +usb_init_str_5: DEFB 0x0d DEFB 0x0a DEFM "CH376: PRESENT (VER $" DEFB 0x00 -usb_init_str_2: +usb_init_str_6: DEFM "); $" DEFB 0x00 -usb_init_str_3: +usb_init_str_7: DEFM "USB: CONNECTED$" DEFB 0x00 -usb_init_str_4: +usb_init_str_8: DEFM "USB: DISCONNECTED$" DEFB 0x00 +;source-doc/base-drv/usb-init.c:77: void chnative_init_force(void) { +; --------------------------------- +; Function chnative_init_force +; --------------------------------- +_chnative_init_force: +;source-doc/base-drv/usb-init.c:78: _chnative_init(true); + ld a,0x01 + push af + inc sp + call __chnative_init + inc sp +;source-doc/base-drv/usb-init.c:79: } + ret +;source-doc/base-drv/usb-init.c:81: void chnative_init(void) { +; --------------------------------- +; Function chnative_init +; --------------------------------- +_chnative_init: +;source-doc/base-drv/usb-init.c:82: _chnative_init(false); + xor a + push af + inc sp + call __chnative_init + inc sp +;source-doc/base-drv/usb-init.c:83: } + ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c index a76a7e3a..7adbadea 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c @@ -22,25 +22,42 @@ static usb_error usb_host_bus_reset(void) { #define ERASE_LINE "\x1B\x6C\r$" -void chnative_init(void) { +void _chnative_init(bool forced) { memset(get_usb_work_area(), 0, sizeof(_usb_state)); ch_cmd_reset_all(); delay_medium(); - if (!ch_probe()) { - print_string("\r\nCH376: NOT PRESENT$"); - return; + if (forced) { + bool indicator = true; + print_string("\r\nCH376: *$"); + while (!ch_probe()) { + if (indicator) + print_string("\b $"); + else + print_string("\b*$"); + + delay_medium(); + indicator = !indicator; + } + + print_string("\bPRESENT (VER $"); + } else { + if (!ch_probe()) { + print_string("\r\nCH376: NOT PRESENT$"); + return; + } + + print_string("\r\nCH376: PRESENT (VER $"); } - print_string("\r\nCH376: PRESENT (VER $"); print_hex(ch_cmd_get_ic_version()); print_string("); $"); usb_host_bus_reset(); - for (uint8_t i = 0; i < 4; i++) { + for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { const uint8_t r = ch_very_short_wait_int_and_get_status(); if (r == USB_INT_CONNECT) { @@ -54,3 +71,7 @@ void chnative_init(void) { print_string("USB: DISCONNECTED$"); } + +void chnative_init_force(void) { _chnative_init(true); } + +void chnative_init(void) { _chnative_init(false); } diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm index dd446f6e..5374a471 100644 --- a/Source/HBIOS/ch376.asm +++ b/Source/HBIOS/ch376.asm @@ -50,3 +50,4 @@ _dio_add_entry: #include "./ch376-native/base-drv.s" CHNATIVE_INIT .EQU _chnative_init +CHNATIVE_INITF .EQU _chnative_init_force diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 5140109b..322ff378 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3982,8 +3982,12 @@ HB_INITTBL: #IF (CHNATIVEENABLE) ; NEED TO ENUMERATE USB DEVICES EARLY, SO THAT ACTUAL DRIVERS ; WILL BE ABLE TO FIND THEM. +#IF (CHNATIVEFORCE) + .DW CHNATIVE_INITF +#ELSE .DW CHNATIVE_INIT #ENDIF +#ENDIF #IF (KIOENABLE) .DW KIO_INIT #ENDIF From ca6979d97e2ee24b3711beb18215eef350567ce3 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 17:04:39 +1100 Subject: [PATCH 16/59] ch376: increased rate of keyboard scanining and considers all keycodes state transmitted --- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 44 +++--- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 140 ++++++++++++------ .../source-doc/base-drv/dev_transfers.h | 2 +- .../source-doc/keyboard/kyb-init.c | 12 +- Source/HBIOS/ch376kyb.asm | 13 +- 5 files changed, 134 insertions(+), 77 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index bcc038af..34a0654d 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -104,7 +104,7 @@ __chnative_init: call _ch_cmd_reset_all ;source-doc/base-drv/usb-init.c:30: delay_medium(); call _delay_medium -;source-doc/base-drv/usb-init.c:32: if(forced) { +;source-doc/base-drv/usb-init.c:32: if (forced) { bit 0,(ix+4) jr Z,l__chnative_init_00110 ;source-doc/base-drv/usb-init.c:33: bool indicator = true; @@ -112,7 +112,7 @@ __chnative_init: ;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$"); ld hl,usb_init_str_0 call _print_string -;source-doc/base-drv/usb-init.c:35: while(!ch_probe()) { +;source-doc/base-drv/usb-init.c:35: while (!ch_probe()) { l__chnative_init_00104: call _ch_probe ld a, l @@ -143,30 +143,30 @@ l__chnative_init_00106: call _print_string jr l__chnative_init_00111 l__chnative_init_00110: -;source-doc/base-drv/usb-init.c:48: if (!ch_probe()) { +;source-doc/base-drv/usb-init.c:47: if (!ch_probe()) { call _ch_probe ld a, l or a jr NZ,l__chnative_init_00108 -;source-doc/base-drv/usb-init.c:49: print_string("\r\nCH376: NOT PRESENT$"); +;source-doc/base-drv/usb-init.c:48: print_string("\r\nCH376: NOT PRESENT$"); ld hl,usb_init_str_4 call _print_string -;source-doc/base-drv/usb-init.c:50: return; +;source-doc/base-drv/usb-init.c:49: return; jr l__chnative_init_00118 l__chnative_init_00108: -;source-doc/base-drv/usb-init.c:53: print_string("\r\nCH376: PRESENT (VER $"); +;source-doc/base-drv/usb-init.c:52: print_string("\r\nCH376: PRESENT (VER $"); ld hl,usb_init_str_5 call _print_string l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:56: print_hex(ch_cmd_get_ic_version()); +;source-doc/base-drv/usb-init.c:55: print_hex(ch_cmd_get_ic_version()); call _ch_cmd_get_ic_version call _print_hex -;source-doc/base-drv/usb-init.c:57: print_string("); $"); +;source-doc/base-drv/usb-init.c:56: print_string("); $"); ld hl,usb_init_str_6 call _print_string -;source-doc/base-drv/usb-init.c:59: usb_host_bus_reset(); +;source-doc/base-drv/usb-init.c:58: usb_host_bus_reset(); call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { ld c,0x00 l__chnative_init_00116: bit 0,(ix+4) @@ -186,31 +186,31 @@ l__chnative_init_00121: xor 0x80 l__chnative_init_00185: jp P, l__chnative_init_00114 -;source-doc/base-drv/usb-init.c:62: const uint8_t r = ch_very_short_wait_int_and_get_(); +;source-doc/base-drv/usb-init.c:61: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get ld a, l pop bc -;source-doc/base-drv/usb-init.c:64: if (r == USB_INT_CONNECT) { +;source-doc/base-drv/usb-init.c:63: if (r == USB_INT_CONNECT) { sub 0x81 jr NZ,l__chnative_init_00117 -;source-doc/base-drv/usb-init.c:65: print_string("USB: CONNECTED$"); +;source-doc/base-drv/usb-init.c:64: print_string("USB: CONNECTED$"); ld hl,usb_init_str_7 call _print_string -;source-doc/base-drv/usb-init.c:67: enumerate_all_devices(); +;source-doc/base-drv/usb-init.c:66: enumerate_all_devices(); call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:69: return; +;source-doc/base-drv/usb-init.c:68: return; jr l__chnative_init_00118 l__chnative_init_00117: -;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { inc c jr l__chnative_init_00116 l__chnative_init_00114: -;source-doc/base-drv/usb-init.c:73: print_string("USB: DISCONNECTED$"); +;source-doc/base-drv/usb-init.c:72: print_string("USB: DISCONNECTED$"); ld hl,usb_init_str_8 call _print_string l__chnative_init_00118: -;source-doc/base-drv/usb-init.c:74: } +;source-doc/base-drv/usb-init.c:73: } inc sp pop ix ret @@ -250,29 +250,25 @@ usb_init_str_7: usb_init_str_8: DEFM "USB: DISCONNECTED$" DEFB 0x00 -;source-doc/base-drv/usb-init.c:77: void chnative_init_force(void) { +;source-doc/base-drv/usb-init.c:75: void chnative_init_force(void) { _chnative_init(true); } ; --------------------------------- ; Function chnative_init_force ; --------------------------------- _chnative_init_force: -;source-doc/base-drv/usb-init.c:78: _chnative_init(true); ld a,0x01 push af inc sp call __chnative_init inc sp -;source-doc/base-drv/usb-init.c:79: } ret -;source-doc/base-drv/usb-init.c:81: void chnative_init(void) { +;source-doc/base-drv/usb-init.c:77: void chnative_init(void) { _chnative_init(false); } ; --------------------------------- ; Function chnative_init ; --------------------------------- _chnative_init: -;source-doc/base-drv/usb-init.c:82: _chnative_init(false); xor a push af inc sp call __chnative_init inc sp -;source-doc/base-drv/usb-init.c:83: } ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 7419d950..93a3a03b 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -41,6 +41,8 @@ _write_index: DEFS 1 _read_index: DEFS 1 +_previous_keyCodes: + DEFS 6 _active: DEFS 1 _report: @@ -145,7 +147,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:47: +;source-doc/keyboard/kyb-init.c:49: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -153,24 +155,42 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:50: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { ld a,(ix+5) sub 0x80 - jr NC,l_keyboard_buf_put_00106 + jr NC,l_keyboard_buf_put_00112 ld a,(ix+5) or a -;source-doc/keyboard/kyb-init.c:49: if (key_code >= 0x80 || key_code == 0) - jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:51: +;source-doc/keyboard/kyb-init.c:51: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:54: // if already reported, just skip it + jr Z,l_keyboard_buf_put_00112 + ld c,0x00 +l_keyboard_buf_put_00110: + ld a, c + sub 0x06 + jr NC,l_keyboard_buf_put_00106 +;source-doc/keyboard/kyb-init.c:55: for (uint8_t i = 0; i < 6; i++) + ld b,0x00 + ld hl,_previous_keyCodes + add hl, bc + ld a,(ix+5) + sub (hl) +;source-doc/keyboard/kyb-init.c:56: if (previous_keyCodes[i] == key_code) + jr Z,l_keyboard_buf_put_00112 +;source-doc/keyboard/kyb-init.c:54: // if already reported, just skip it + inc c + jr l_keyboard_buf_put_00110 +l_keyboard_buf_put_00106: +;source-doc/keyboard/kyb-init.c:58: ld a,(_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:59: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) sub c - jr Z,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full + jr Z,l_keyboard_buf_put_00112 +;source-doc/keyboard/kyb-init.c:60: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 ld hl,(_write_index) ld h,0x00 @@ -178,7 +198,7 @@ _keyboard_buf_put: add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:61: buffer[write_index].modifier_keys = modifier_keys; ld hl,(_write_index) ld h,0x00 add hl, hl @@ -187,30 +207,30 @@ _keyboard_buf_put: inc de ld a,(ix+5) ld (de), a -;source-doc/keyboard/kyb-init.c:55: buffer[write_index].key_code = key_code; +;source-doc/keyboard/kyb-init.c:62: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c -l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:57: } +l_keyboard_buf_put_00112: +;source-doc/keyboard/kyb-init.c:64: } pop ix ret -;source-doc/keyboard/kyb-init.c:59: +;source-doc/keyboard/kyb-init.c:66: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:67: uint8_t keyboard_buf_size() __sdcccall(1) { ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:61: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:68: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:63: +;source-doc/keyboard/kyb-init.c:70: ld hl,_read_index ld c, (hl) ld a,0x08 @@ -219,9 +239,9 @@ l_keyboard_buf_size_00102: ld c, (hl) add a, c l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:71: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret -;source-doc/keyboard/kyb-init.c:66: +;source-doc/keyboard/kyb-init.c:73: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -231,41 +251,41 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:67: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:74: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:75: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, h ld d, h jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:70: +;source-doc/keyboard/kyb-init.c:77: ld bc,_buffer+0 ld hl,(_read_index) ld h,0x00 add hl, hl add hl, bc ld b, (hl) -;source-doc/keyboard/kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:78: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:79: const uint8_t key_code = buffer[read_index].key_code; ld hl,_read_index ld a, (hl) inc a and 0x07 ld (hl), a -;source-doc/keyboard/kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:80: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:75: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:82: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -282,34 +302,34 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:83: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:78: +;source-doc/keyboard/kyb-init.c:85: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:79: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:86: void keyboard_buf_flush() { ld hl,_write_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:80: write_index = 0; +;source-doc/keyboard/kyb-init.c:87: write_index = 0; ld hl,_read_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:81: read_index = 0; +;source-doc/keyboard/kyb-init.c:88: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:87: +;source-doc/keyboard/kyb-init.c:94: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:88: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:95: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:89: if (is_in_critical_section()) - ret NZ +;source-doc/keyboard/kyb-init.c:96: if (is_in_critical_section()) + jr NZ,l_keyboard_tick_00111 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b call _ch_command @@ -321,8 +341,8 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:92: ch_configure_nak_retry_disable(); - ld bc,_report +;source-doc/keyboard/kyb-init.c:99: ch_configure_nak_retry_disable(); + ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 push af @@ -346,20 +366,47 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:94: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:101: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) +;source-doc/keyboard/kyb-init.c:102: if (result == 0) or a - ret NZ -;source-doc/keyboard/kyb-init.c:95: if (result == 0) - ld a, (_report + 2) + jr NZ,l_keyboard_tick_00111 + ld c,a +l_keyboard_tick_00109: + ld a, c + sub 0x06 + ret NC +;source-doc/keyboard/kyb-init.c:103: for (uint8_t i = 0; i < 6; i++) { + ld a,+((_report+2) & 0xFF) + add a, c + ld e, a + ld a,+((_report+2) / 256) + adc a,0x00 + ld d, a + ld a, (de) ld hl,_report - ld c, (hl) + ld b, (hl) + push bc + push de + ld c,b ld b,a push bc call _keyboard_buf_put pop af -;source-doc/keyboard/kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); + pop de + pop bc +;source-doc/keyboard/kyb-init.c:104: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); + ld b,0x00 + ld hl,_previous_keyCodes + add hl, bc + ld a, (de) + ld (hl), a +;source-doc/keyboard/kyb-init.c:102: if (result == 0) + inc c + jr l_keyboard_tick_00109 +l_keyboard_tick_00111: +;source-doc/keyboard/kyb-init.c:106: } ret _keyboard_config: DEFW +0x0000 @@ -384,6 +431,13 @@ _write_index: DEFB +0x00 _read_index: DEFB +0x00 +_previous_keyCodes: + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 _active: DEFB +0x00 _report: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index 6a29097f..cd7eaa75 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -37,7 +37,7 @@ typedef struct { typedef struct { COMMON_DEVICE_CONFIG // bytes: 0-2 - endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt + endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt uint32_t current_lba; // bytes 12-15 uint8_t drive_index; // byte 16 } device_config_storage; diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index cb5b4de7..0b599779 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -45,10 +45,17 @@ keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; uint8_t write_index = 0; uint8_t read_index = 0; +uint8_t previous_keyCodes[6] = {0}; + void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { if (key_code >= 0x80 || key_code == 0) return; // ignore ??? + // if already reported, just skip it + for (uint8_t i = 0; i < 6; i++) + if (previous_keyCodes[i] == key_code) + return; + uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (next_write_index != read_index) { // Check if buffer is not full buffer[write_index].modifier_keys = modifier_keys; @@ -93,5 +100,8 @@ void keyboard_tick(void) { result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); ch_configure_nak_retry_3s(); if (result == 0) - keyboard_buf_put(report.bModifierKeys, report.keyCode[0]); + for (uint8_t i = 0; i < 6; i++) { + keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); + previous_keyCodes[i] = report.keyCode[i]; + } } diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b1e917e1..b6f3af6c 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -16,12 +16,8 @@ #include "./ch376-native/keyboard.s" -; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60)) -SCAN_INT_PERIOD: .EQU 3 - -; VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE -; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD -UKY_SCNCNT: .DB SCAN_INT_PERIOD +; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 2ND INTERRUPT (2/60)) +SCAN_INT_PERIOD: .EQU 2 .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -52,10 +48,11 @@ CHUKB_INIT: JP _keyboard_init CHUKB_TICK: - LD A, (UKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. +UKY_SCNCNT .EQU $ - 1 DEC A LD (UKY_SCNCNT), A - JR NZ, VEC_CHUKB_TICK + JP NZ, HB_TICK LD A, SCAN_INT_PERIOD LD (UKY_SCNCNT), A From 9cbd8937d7f2815b4f2e6e65d652acc768f34e0c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 17:29:24 +1100 Subject: [PATCH 17/59] ch376-native: keyboard driver now support CAPS LOCK key --- .../keyboard/class_hid_keyboard.c.s | 70 +++++++-- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 133 ++++++++++-------- .../source-doc/keyboard/class_hid_keyboard.c | 21 ++- .../source-doc/keyboard/class_hid_keyboard.h | 2 + .../source-doc/keyboard/kyb-init.c | 9 +- 5 files changed, 162 insertions(+), 73 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s index d997d258..185b058b 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -30,6 +30,8 @@ ; .area _INITIALIZED removed by z88dk +_caps_lock_engaged: + DEFS 1 _scancodes_shift_table: DEFS 128 _scancodes_table: @@ -49,40 +51,88 @@ _scancodes_table: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/class_hid_keyboard.c:333: }; +;source-doc/keyboard/class_hid_keyboard.c:337: }; +; --------------------------------- +; Function char_with_caps_lock +; --------------------------------- +_char_with_caps_lock: + ld c, a +;source-doc/keyboard/class_hid_keyboard.c:338: + ld hl,_caps_lock_engaged + bit 0, (hl) + jr NZ,l_char_with_caps_lock_00102 +;source-doc/keyboard/class_hid_keyboard.c:339: char char_with_caps_lock(const char c) __sdcccall(1) { + ld a, c + jr l_char_with_caps_lock_00109 +l_char_with_caps_lock_00102: +;source-doc/keyboard/class_hid_keyboard.c:341: return c; + ld a, c + sub 0x41 + jr C,l_char_with_caps_lock_00104 + ld a,0x5a + sub c + jr C,l_char_with_caps_lock_00104 +;source-doc/keyboard/class_hid_keyboard.c:342: + ld a, c + add a,0x20 + jr l_char_with_caps_lock_00109 +l_char_with_caps_lock_00104: +;source-doc/keyboard/class_hid_keyboard.c:344: return c - 'A' + 'a'; + ld a, c + sub 0x61 + jr C,l_char_with_caps_lock_00107 + ld a,0x7a + sub c + jr C,l_char_with_caps_lock_00107 +;source-doc/keyboard/class_hid_keyboard.c:345: + ld a, c + add a,0xe0 + jr l_char_with_caps_lock_00109 +l_char_with_caps_lock_00107: +;source-doc/keyboard/class_hid_keyboard.c:347: return c - 'a' + 'A'; + ld a, c +l_char_with_caps_lock_00109: +;source-doc/keyboard/class_hid_keyboard.c:348: + ret +;source-doc/keyboard/class_hid_keyboard.c:350: } ; --------------------------------- ; Function scancode_to_char ; --------------------------------- _scancode_to_char: ld c, a -;source-doc/keyboard/class_hid_keyboard.c:334: +;source-doc/keyboard/class_hid_keyboard.c:351: ld a,l ld e,l sub 0x80 jr C,l_scancode_to_char_00102 -;source-doc/keyboard/class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { +;source-doc/keyboard/class_hid_keyboard.c:352: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { xor a jr l_scancode_to_char_00105 l_scancode_to_char_00102: -;source-doc/keyboard/class_hid_keyboard.c:337: return 0; +;source-doc/keyboard/class_hid_keyboard.c:354: return 0; ld a, c and 0x22 jr Z,l_scancode_to_char_00104 -;source-doc/keyboard/class_hid_keyboard.c:338: +;source-doc/keyboard/class_hid_keyboard.c:355: ld d,0x00 ld hl,_scancodes_shift_table add hl, de - ld a, (hl) - jr l_scancode_to_char_00105 + ld a,(hl) + ld c,a + jp _char_with_caps_lock l_scancode_to_char_00104: -;source-doc/keyboard/class_hid_keyboard.c:340: return scancodes_shift_table[code]; +;source-doc/keyboard/class_hid_keyboard.c:357: return char_with_caps_lock(scancodes_shift_table[code]); ld d,0x00 ld hl,_scancodes_table add hl, de - ld a, (hl) + ld a,(hl) + ld c,a + jp _char_with_caps_lock l_scancode_to_char_00105: -;source-doc/keyboard/class_hid_keyboard.c:341: +;source-doc/keyboard/class_hid_keyboard.c:358: ret +_caps_lock_engaged: + DEFB +0x01 _scancodes_shift_table: DEFB +0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 93a3a03b..9a558c3b 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -62,77 +62,77 @@ _report: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:11: void keyboard_init(void) { +;source-doc/keyboard/kyb-init.c:12: void keyboard_init(void) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:13: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:14: uint8_t index = 1; ld c,0x01 -;source-doc/keyboard/kyb-init.c:14: keyboard_config = NULL; +;source-doc/keyboard/kyb-init.c:15: keyboard_config = NULL; ld hl,0x0000 ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:16: do { +;source-doc/keyboard/kyb-init.c:17: do { ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:17: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); +;source-doc/keyboard/kyb-init.c:18: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); push bc ld a, b call _get_usb_device_config ex de, hl pop bc ld (_keyboard_config), hl -;source-doc/keyboard/kyb-init.c:19: if (keyboard_config == NULL) +;source-doc/keyboard/kyb-init.c:20: if (keyboard_config == NULL) ld hl,(_keyboard_config) ld a,h or l jr Z,l_keyboard_init_00107 -;source-doc/keyboard/kyb-init.c:22: const usb_device_type t = keyboard_config->type; +;source-doc/keyboard/kyb-init.c:23: const usb_device_type t = keyboard_config->type; ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/kyb-init.c:24: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/kyb-init.c:25: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:25: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:26: print_string("\r\nUSB: KEYBOARD @ $"); push bc ld hl,kyb_init_str_0 call _print_string pop bc -;source-doc/keyboard/kyb-init.c:26: print_uint16(index); +;source-doc/keyboard/kyb-init.c:27: print_uint16(index); ld h,0x00 ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:27: print_string(" $"); +;source-doc/keyboard/kyb-init.c:28: print_string(" $"); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:29: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb-init.c:30: hid_set_protocol(keyboard_config, 1); ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:30: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:31: hid_set_idle(keyboard_config, 0x80); ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb-init.c:31: return; +;source-doc/keyboard/kyb-init.c:32: return; jr l_keyboard_init_00108 l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/keyboard/kyb-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc b ld a,b ld c,b sub 0x07 jr NZ,l_keyboard_init_00105 l_keyboard_init_00107: -;source-doc/keyboard/kyb-init.c:35: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 jp _print_string l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:36: } +;source-doc/keyboard/kyb-init.c:37: } ret kyb_init_str_0: DEFB 0x0d @@ -147,7 +147,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:49: +;source-doc/keyboard/kyb-init.c:50: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -155,42 +155,42 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb-init.c:50: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:51: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { ld a,(ix+5) sub 0x80 jr NC,l_keyboard_buf_put_00112 ld a,(ix+5) or a -;source-doc/keyboard/kyb-init.c:51: if (key_code >= 0x80 || key_code == 0) -;source-doc/keyboard/kyb-init.c:54: // if already reported, just skip it +;source-doc/keyboard/kyb-init.c:52: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it jr Z,l_keyboard_buf_put_00112 ld c,0x00 l_keyboard_buf_put_00110: ld a, c sub 0x06 jr NC,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:55: for (uint8_t i = 0; i < 6; i++) +;source-doc/keyboard/kyb-init.c:56: for (uint8_t i = 0; i < 6; i++) ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a,(ix+5) sub (hl) -;source-doc/keyboard/kyb-init.c:56: if (previous_keyCodes[i] == key_code) +;source-doc/keyboard/kyb-init.c:57: if (previous_keyCodes[i] == key_code) jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:54: // if already reported, just skip it +;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it inc c jr l_keyboard_buf_put_00110 l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:58: +;source-doc/keyboard/kyb-init.c:59: ld a,(_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:59: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:60: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) sub c jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:60: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb-init.c:61: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 ld hl,(_write_index) ld h,0x00 @@ -198,7 +198,7 @@ l_keyboard_buf_put_00106: add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/kyb-init.c:61: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:62: buffer[write_index].modifier_keys = modifier_keys; ld hl,(_write_index) ld h,0x00 add hl, hl @@ -207,30 +207,30 @@ l_keyboard_buf_put_00106: inc de ld a,(ix+5) ld (de), a -;source-doc/keyboard/kyb-init.c:62: buffer[write_index].key_code = key_code; +;source-doc/keyboard/kyb-init.c:63: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c l_keyboard_buf_put_00112: -;source-doc/keyboard/kyb-init.c:64: } +;source-doc/keyboard/kyb-init.c:65: } pop ix ret -;source-doc/keyboard/kyb-init.c:66: +;source-doc/keyboard/kyb-init.c:67: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:67: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:68: uint8_t keyboard_buf_size() __sdcccall(1) { ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:68: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:69: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:70: +;source-doc/keyboard/kyb-init.c:71: ld hl,_read_index ld c, (hl) ld a,0x08 @@ -239,9 +239,9 @@ l_keyboard_buf_size_00102: ld c, (hl) add a, c l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:71: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:72: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret -;source-doc/keyboard/kyb-init.c:73: +;source-doc/keyboard/kyb-init.c:74: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -251,41 +251,54 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:74: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:75: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:75: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:76: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, h ld d, h - jr l_keyboard_buf_get_next_00103 + jr l_keyboard_buf_get_next_00105 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:77: +;source-doc/keyboard/kyb-init.c:78: ld bc,_buffer+0 ld hl,(_read_index) ld h,0x00 add hl, hl add hl, bc ld b, (hl) -;source-doc/keyboard/kyb-init.c:78: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:79: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:79: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:80: const uint8_t key_code = buffer[read_index].key_code; ld hl,_read_index ld a, (hl) inc a and 0x07 ld (hl), a -;source-doc/keyboard/kyb-init.c:80: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:82: + ld a, c + sub 0x39 + jr NZ,l_keyboard_buf_get_next_00104 +;source-doc/keyboard/kyb-init.c:83: if (key_code == KEY_CODE_CAPS_LOCK) { + ld hl,_caps_lock_engaged + ld a, (hl) + xor 0x01 + ld (hl), a +;source-doc/keyboard/kyb-init.c:84: caps_lock_engaged = !caps_lock_engaged; + call _keyboard_buf_get_next + jr l_keyboard_buf_get_next_00105 +l_keyboard_buf_get_next_00104: +;source-doc/keyboard/kyb-init.c:87: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:82: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:89: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -301,34 +314,34 @@ l_keyboard_buf_get_next_00102: ld (ix-1),a pop hl push hl -l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:83: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +l_keyboard_buf_get_next_00105: +;source-doc/keyboard/kyb-init.c:90: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:85: +;source-doc/keyboard/kyb-init.c:92: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:86: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:93: void keyboard_buf_flush() { ld hl,_write_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:87: write_index = 0; +;source-doc/keyboard/kyb-init.c:94: write_index = 0; ld hl,_read_index ld (hl),0x00 -;source-doc/keyboard/kyb-init.c:88: read_index = 0; +;source-doc/keyboard/kyb-init.c:95: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:94: +;source-doc/keyboard/kyb-init.c:101: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:95: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:102: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:96: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:103: if (is_in_critical_section()) jr NZ,l_keyboard_tick_00111 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b @@ -341,7 +354,7 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:99: ch_configure_nak_retry_disable(); +;source-doc/keyboard/kyb-init.c:106: ch_configure_nak_retry_disable(); ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -366,10 +379,10 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c),a -;source-doc/keyboard/kyb-init.c:101: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:108: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) -;source-doc/keyboard/kyb-init.c:102: if (result == 0) +;source-doc/keyboard/kyb-init.c:109: if (result == 0) or a jr NZ,l_keyboard_tick_00111 ld c,a @@ -377,7 +390,7 @@ l_keyboard_tick_00109: ld a, c sub 0x06 ret NC -;source-doc/keyboard/kyb-init.c:103: for (uint8_t i = 0; i < 6; i++) { +;source-doc/keyboard/kyb-init.c:110: for (uint8_t i = 0; i < 6; i++) { ld a,+((_report+2) & 0xFF) add a, c ld e, a @@ -396,17 +409,17 @@ l_keyboard_tick_00109: pop af pop de pop bc -;source-doc/keyboard/kyb-init.c:104: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); +;source-doc/keyboard/kyb-init.c:111: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a, (de) ld (hl), a -;source-doc/keyboard/kyb-init.c:102: if (result == 0) +;source-doc/keyboard/kyb-init.c:109: if (result == 0) inc c jr l_keyboard_tick_00109 l_keyboard_tick_00111: -;source-doc/keyboard/kyb-init.c:106: } +;source-doc/keyboard/kyb-init.c:113: } ret _keyboard_config: DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c index 6db81605..7522a3c1 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c @@ -2,6 +2,8 @@ #define ESC 0x1B +bool caps_lock_engaged = true; + /** * scan codes sourced from https://deskthority.net/wiki/Scancode * @@ -241,6 +243,8 @@ char scancodes_table[128] = { ',', '.', '/', + + /* 0x39 */ 0x00 /*CAPSLOCK*/, 0x00 /* F1 */, 0x00 /* F2 */, @@ -332,12 +336,25 @@ char scancodes_table[128] = { 0x00 /* MUTE */, }; +char char_with_caps_lock(const char c) __sdcccall(1) { + if (!caps_lock_engaged) + return c; + + if (c >= 'A' && c <= 'Z') + return c - 'A' + 'a'; + + if (c >= 'a' && c <= 'z') + return c - 'a' + 'A'; + + return c; +} + char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { if (code >= 0x80) return 0; if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) - return scancodes_shift_table[code]; + return char_with_caps_lock(scancodes_shift_table[code]); - return scancodes_table[code]; + return char_with_caps_lock(scancodes_table[code]); } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h index 50efed90..8d179f4f 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h @@ -18,6 +18,8 @@ typedef struct { #define KEY_MOD_RALT 0x40 #define KEY_MOD_RMETA 0x80 +#define KEY_CODE_CAPS_LOCK 0x39 + extern char scancodes_table[128]; extern char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1); diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index 0b599779..e0b1e59a 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -7,6 +7,7 @@ #include static device_config_keyboard *keyboard_config = 0; +extern bool caps_lock_engaged; void keyboard_init(void) { @@ -78,7 +79,13 @@ uint32_t keyboard_buf_get_next() { const uint8_t modifier_key = buffer[read_index].modifier_keys; const uint8_t key_code = buffer[read_index].key_code; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - const unsigned char c = scancode_to_char(modifier_key, key_code); + + if (key_code == KEY_CODE_CAPS_LOCK) { + caps_lock_engaged = !caps_lock_engaged; + return keyboard_buf_get_next(); + } + + const unsigned char c = scancode_to_char(modifier_key, key_code); /* D = modifier, e-> char, H = 0, L=>code */ return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; } From 1a44fbee0fc25f808f906ce8f694a2a1a075ee0c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 22 Jan 2025 18:13:12 +1100 Subject: [PATCH 18/59] ch376: implemented CTRL key combinations --- .../HBIOS/ch376-native/keyboard/class_hid.c.s | 70 ---------------- .../keyboard/class_hid_keyboard.c.s | 81 +++++++++++++++++-- .../source-doc/keyboard/class_hid.c | 13 --- .../source-doc/keyboard/class_hid_keyboard.c | 23 ++++++ 4 files changed, 97 insertions(+), 90 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s index 06fc1a0e..a893b7fd 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s @@ -168,73 +168,3 @@ _hid_set_idle: pop hl inc sp jp (hl) -;source-doc/keyboard/class_hid.c:26: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { -; --------------------------------- -; Function hid_get_input_report -; --------------------------------- -_hid_get_input_report: - push ix - ld ix,0 - add ix,sp - ld c, l - ld b, h - ld hl, -9 - add hl, sp - ld sp, hl - ld l, c - ld h, b -;source-doc/keyboard/class_hid.c:28: cmd = cmd_hid_set; - push de - push hl - ex de, hl - ld hl,4 - add hl, sp - ex de, hl - ld bc,0x0008 - ld hl,_cmd_hid_set - ldir - pop bc - pop de -;source-doc/keyboard/class_hid.c:30: cmd.bmRequestType = 0xA1; - ld (ix-9),0xa1 -;source-doc/keyboard/class_hid.c:31: cmd.bValue[0] = 1; -;source-doc/keyboard/class_hid.c:32: cmd.bValue[1] = 1; -;source-doc/keyboard/class_hid.c:33: cmd.bRequest = HID_GET_REPORT; - ld a,0x01 - ld (ix-7),a - ld (ix-6),a - ld (ix-8),a -;source-doc/keyboard/class_hid.c:34: cmd.wLength = 8; - ld (ix-3),0x08 - xor a - ld (ix-2),a -;source-doc/keyboard/class_hid.c:36: return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); - ld l, c - ld h, b - inc hl - ld a, (hl) - ld (ix-1),a - ld l, c - ld h, b - ld a, (hl) - rlca - rlca - rlca - rlca - and 0x0f - ld h,(ix-1) - ld l,a - push hl - push de - ld hl,4 - add hl, sp - push hl - call _usb_control_transfer - pop af - pop af - pop af - ld a, l -;source-doc/keyboard/class_hid.c:37: } - ld sp, ix - pop ix - ret diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s index 185b058b..44aa6d22 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -107,29 +107,96 @@ _scancode_to_char: jr C,l_scancode_to_char_00102 ;source-doc/keyboard/class_hid_keyboard.c:352: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { xor a - jr l_scancode_to_char_00105 + jr l_scancode_to_char_00123 l_scancode_to_char_00102: ;source-doc/keyboard/class_hid_keyboard.c:354: return 0; ld a, c - and 0x22 - jr Z,l_scancode_to_char_00104 + and 0x11 + jr Z,l_scancode_to_char_00120 ;source-doc/keyboard/class_hid_keyboard.c:355: + ld a, e + sub 0x04 + jr C,l_scancode_to_char_00104 + ld a,0x1d + sub e + jr C,l_scancode_to_char_00104 +;source-doc/keyboard/class_hid_keyboard.c:356: if ((modifier_keys & (KEY_MOD_LCTRL | KEY_MOD_RCTRL))) { + ld a, e + add a,0xfd + jr l_scancode_to_char_00123 +l_scancode_to_char_00104: +;source-doc/keyboard/class_hid_keyboard.c:358: return code - 3; + ld a,e + cp 0x1f + jr Z,l_scancode_to_char_00106 + sub 0x2c + jr NZ,l_scancode_to_char_00107 +l_scancode_to_char_00106: +;source-doc/keyboard/class_hid_keyboard.c:359: + xor a + jr l_scancode_to_char_00123 +l_scancode_to_char_00107: +;source-doc/keyboard/class_hid_keyboard.c:361: return 0; + ld a, e + sub 0x2f + jr NZ,l_scancode_to_char_00110 +;source-doc/keyboard/class_hid_keyboard.c:362: + ld a,0x1b + jr l_scancode_to_char_00123 +l_scancode_to_char_00110: +;source-doc/keyboard/class_hid_keyboard.c:364: return 27; + ld a, e + sub 0x31 + jr NZ,l_scancode_to_char_00112 +;source-doc/keyboard/class_hid_keyboard.c:365: + ld a,0x1c + jr l_scancode_to_char_00123 +l_scancode_to_char_00112: +;source-doc/keyboard/class_hid_keyboard.c:367: return 28; + ld a, e + sub 0x30 + jr NZ,l_scancode_to_char_00114 +;source-doc/keyboard/class_hid_keyboard.c:368: + ld a,0x1d + jr l_scancode_to_char_00123 +l_scancode_to_char_00114: +;source-doc/keyboard/class_hid_keyboard.c:370: return 29; + ld a, e + sub 0x23 + jr NZ,l_scancode_to_char_00116 +;source-doc/keyboard/class_hid_keyboard.c:371: + ld a,0x1e + jr l_scancode_to_char_00123 +l_scancode_to_char_00116: +;source-doc/keyboard/class_hid_keyboard.c:373: return 30; + ld a, e + sub 0x2d + jr NZ,l_scancode_to_char_00120 +;source-doc/keyboard/class_hid_keyboard.c:374: + ld a,0x1f + jr l_scancode_to_char_00123 +l_scancode_to_char_00120: +;source-doc/keyboard/class_hid_keyboard.c:377: } + ld a, c + and 0x22 + jr Z,l_scancode_to_char_00122 +;source-doc/keyboard/class_hid_keyboard.c:378: ld d,0x00 ld hl,_scancodes_shift_table add hl, de ld a,(hl) ld c,a jp _char_with_caps_lock -l_scancode_to_char_00104: -;source-doc/keyboard/class_hid_keyboard.c:357: return char_with_caps_lock(scancodes_shift_table[code]); +l_scancode_to_char_00122: +;source-doc/keyboard/class_hid_keyboard.c:380: return char_with_caps_lock(scancodes_shift_table[code]); ld d,0x00 ld hl,_scancodes_table add hl, de ld a,(hl) ld c,a jp _char_with_caps_lock -l_scancode_to_char_00105: -;source-doc/keyboard/class_hid_keyboard.c:358: +l_scancode_to_char_00123: +;source-doc/keyboard/class_hid_keyboard.c:381: ret _caps_lock_engaged: DEFB +0x01 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c index 781d9d9f..e8c0a7b3 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c @@ -22,16 +22,3 @@ usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t du return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size); } - -usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { - setup_packet cmd; - cmd = cmd_hid_set; - - cmd.bmRequestType = 0xA1; - cmd.bValue[0] = 1; - cmd.bValue[1] = 1; - cmd.bRequest = HID_GET_REPORT; - cmd.wLength = 8; - - return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size); -} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c index 7522a3c1..94c1d2c3 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c @@ -353,6 +353,29 @@ char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccal if (code >= 0x80) return 0; + if ((modifier_keys & (KEY_MOD_LCTRL | KEY_MOD_RCTRL))) { + if (code >= 4 && code <= 0x1d) + return code - 3; + + if (code == 0x1F || code == 0x2C) //@ or SPACE + return 0; + + if (code == 0x2F) // [ + return 27; + + if (code == 0x31) // back slash + return 28; + + if (code == 0x30) // ] + return 29; + + if (code == 0x23) //^ + return 30; + + if (code == 0x2D) //_ + return 31; + } + if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) return char_with_caps_lock(scancodes_shift_table[code]); From 93d7c7ed77b05306ce472d8531d336689b98636f Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 23 Jan 2025 20:41:37 +1100 Subject: [PATCH 19/59] ch376-native: fixed and extend indicator led operation --- Source/HBIOS/Config/RCEZ80_std.asm | 1 + Source/HBIOS/ch376-native/base-drv/ch376.c.s | 93 +++++++++++-------- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 87 +++++++++++------ .../ch376-native/source-doc/base-drv/ch376.c | 15 +-- .../source-doc/base-drv/usb-init.c | 14 ++- 5 files changed, 134 insertions(+), 76 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index c6ba7487..97c6a788 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -87,6 +87,7 @@ CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 746f8893..48b93254 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -539,9 +539,10 @@ l_ch_data_in_transfer_00107: pop bc ;source-doc/base-drv/ch376.c:172: if (count == 0) { ld a, e -;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00; or a jr NZ,l_ch_data_in_transfer_00106 +;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c),a ;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; @@ -571,24 +572,28 @@ l_ch_data_in_transfer_00148: xor 0x80 l_ch_data_in_transfer_00149: jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00; - ld a,0x00 +;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/ch376.c:183: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:182: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_00111 ;source-doc/base-drv/ch376.c:184: done: l_ch_data_in_transfer_00110: -;source-doc/base-drv/ch376.c:185: return result; +;source-doc/base-drv/ch376.c:185: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:186: return result; ld hl,(_result) ld h,+((_result) / 256) l_ch_data_in_transfer_00111: -;source-doc/base-drv/ch376.c:186: } +;source-doc/base-drv/ch376.c:187: } ld sp, ix pop ix ret -;source-doc/base-drv/ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:189: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- @@ -596,21 +601,21 @@ _ch_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/ch376.c:192: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/ch376.c:193: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/ch376.c:194: ch_issue_token_in(endpoint); +;source-doc/base-drv/ch376.c:195: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in -;source-doc/base-drv/ch376.c:196: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/ch376.c:197: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a, l ld b, a or a jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/ch376.c:198: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:199: endpoint->toggle = !endpoint->toggle; ld e,(ix+8) ld d,(ix+9) ld c, e @@ -625,30 +630,36 @@ _ch_data_in_transfer_n: and 0xfe or e ld (bc), a -;source-doc/base-drv/ch376.c:200: count = ch_read_data(buffer); +;source-doc/base-drv/ch376.c:201: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) call _ch_read_data -;source-doc/base-drv/ch376.c:202: *buffer_size = count; +;source-doc/base-drv/ch376.c:203: *buffer_size = count; ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/ch376.c:204: USB_MODULE_LEDS = 0x00; - ld a,0x00 +;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/ch376.c:206: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:207: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_n_00104 -;source-doc/base-drv/ch376.c:207: done: +;source-doc/base-drv/ch376.c:208: done: l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/ch376.c:208: return result; +;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x03; + ld a,0x03 + push bc + ld bc,_USB_MODULE_LEDS + out (c),a + pop bc +;source-doc/base-drv/ch376.c:210: return result; ld l, b l_ch_data_in_transfer_n_00104: -;source-doc/base-drv/ch376.c:209: } +;source-doc/base-drv/ch376.c:211: } pop ix ret -;source-doc/base-drv/ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:213: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_out_transfer ; --------------------------------- @@ -658,7 +669,7 @@ _ch_data_out_transfer: add ix,sp push af dec sp -;source-doc/base-drv/ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); +;source-doc/base-drv/ch376.c:216: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) ld b,(ix+9) ld e, c @@ -666,13 +677,13 @@ _ch_data_out_transfer: inc de ld a, (de) ld (ix-3),a -;source-doc/base-drv/ch376.c:216: USB_MODULE_LEDS = 0x02; +;source-doc/base-drv/ch376.c:218: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS out (c),a pop bc -;source-doc/base-drv/ch376.c:218: while (buffer_length > 0) { +;source-doc/base-drv/ch376.c:220: while (buffer_length > 0) { ld (ix-2),c ld (ix-1),b l_ch_data_out_transfer_00103: @@ -683,7 +694,7 @@ l_ch_data_out_transfer_00103: xor 0x80 l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; +;source-doc/base-drv/ch376.c:221: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; ld d,(ix-3) ld e,0x00 ld a, d @@ -699,7 +710,7 @@ l_ch_data_out_transfer_00109: ld d,(ix+6) ld e,(ix+7) l_ch_data_out_transfer_00110: -;source-doc/base-drv/ch376.c:220: buffer = ch_write_data(buffer, size); +;source-doc/base-drv/ch376.c:222: buffer = ch_write_data(buffer, size); push bc push de push de @@ -714,7 +725,7 @@ l_ch_data_out_transfer_00110: pop bc ld (ix+4),l ld (ix+5),h -;source-doc/base-drv/ch376.c:221: buffer_length -= size; +;source-doc/base-drv/ch376.c:223: buffer_length -= size; ld e,0x00 ld a,(ix+6) sub d @@ -722,7 +733,7 @@ l_ch_data_out_transfer_00110: ld a,(ix+7) sbc a, e ld (ix+7),a -;source-doc/base-drv/ch376.c:222: ch_issue_token_out(endpoint); +;source-doc/base-drv/ch376.c:224: ch_issue_token_out(endpoint); ld l,c ld h,b push hl @@ -733,7 +744,7 @@ l_ch_data_out_transfer_00110: ld l, a or a jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/ch376.c:226: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:228: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l,(ix-2) @@ -749,34 +760,40 @@ l_ch_data_out_transfer_00110: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/ch376.c:229: USB_MODULE_LEDS = 0x00; - ld a,0x00 +;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c),a -;source-doc/base-drv/ch376.c:231: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:232: return USB_ERR_OK; ld l,0x00 -;source-doc/base-drv/ch376.c:232: done: -;source-doc/base-drv/ch376.c:233: return result; + jr l_ch_data_out_transfer_00107 +;source-doc/base-drv/ch376.c:234: done: l_ch_data_out_transfer_00106: -;source-doc/base-drv/ch376.c:234: } +;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/ch376.c:236: return result; +l_ch_data_out_transfer_00107: +;source-doc/base-drv/ch376.c:237: } ld sp, ix pop ix ret -;source-doc/base-drv/ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:239: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function ch_set_usb_address ; --------------------------------- _ch_set_usb_address: -;source-doc/base-drv/ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR); +;source-doc/base-drv/ch376.c:240: ch_command(CH_CMD_SET_USB_ADDR); push hl ld l,0x13 call _ch_command pop hl -;source-doc/base-drv/ch376.c:238: CH376_DATA_PORT = device_address; +;source-doc/base-drv/ch376.c:241: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT out (c),a -;source-doc/base-drv/ch376.c:239: } +;source-doc/base-drv/ch376.c:242: } ret _result: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 34a0654d..d4e25782 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -100,73 +100,92 @@ __chnative_init: inc de ld bc,0x0068 ldir -;source-doc/base-drv/usb-init.c:28: ch_cmd_reset_all(); +;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:30: ch_cmd_reset_all(); call _ch_cmd_reset_all -;source-doc/base-drv/usb-init.c:30: delay_medium(); +;source-doc/base-drv/usb-init.c:32: delay_medium(); call _delay_medium -;source-doc/base-drv/usb-init.c:32: if (forced) { +;source-doc/base-drv/usb-init.c:34: if (forced) { bit 0,(ix+4) jr Z,l__chnative_init_00110 -;source-doc/base-drv/usb-init.c:33: bool indicator = true; +;source-doc/base-drv/usb-init.c:35: bool indicator = true; ld (ix-1),0x01 -;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$"); +;source-doc/base-drv/usb-init.c:36: print_string("\r\nCH376: *$"); ld hl,usb_init_str_0 call _print_string -;source-doc/base-drv/usb-init.c:35: while (!ch_probe()) { +;source-doc/base-drv/usb-init.c:37: while (!ch_probe()) { l__chnative_init_00104: call _ch_probe ld a, l or a jr NZ,l__chnative_init_00106 -;source-doc/base-drv/usb-init.c:36: if (indicator) +;source-doc/base-drv/usb-init.c:38: if (indicator) { bit 0,(ix-1) jr Z,l__chnative_init_00102 -;source-doc/base-drv/usb-init.c:37: print_string("\b $"); +;source-doc/base-drv/usb-init.c:39: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:40: print_string("\b $"); ld hl,usb_init_str_1 call _print_string jr l__chnative_init_00103 l__chnative_init_00102: -;source-doc/base-drv/usb-init.c:39: print_string("\b*$"); +;source-doc/base-drv/usb-init.c:42: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:43: print_string("\b*$"); ld hl,usb_init_str_2 call _print_string l__chnative_init_00103: -;source-doc/base-drv/usb-init.c:41: delay_medium(); +;source-doc/base-drv/usb-init.c:46: delay_medium(); call _delay_medium -;source-doc/base-drv/usb-init.c:42: indicator = !indicator; +;source-doc/base-drv/usb-init.c:47: indicator = !indicator; ld a,(ix-1) xor 0x01 ld (ix-1),a jr l__chnative_init_00104 l__chnative_init_00106: -;source-doc/base-drv/usb-init.c:45: print_string("\bPRESENT (VER $"); +;source-doc/base-drv/usb-init.c:50: print_string("\bPRESENT (VER $"); ld hl,usb_init_str_3 call _print_string jr l__chnative_init_00111 l__chnative_init_00110: -;source-doc/base-drv/usb-init.c:47: if (!ch_probe()) { +;source-doc/base-drv/usb-init.c:52: if (!ch_probe()) { call _ch_probe ld a, l +;source-doc/base-drv/usb-init.c:53: USB_MODULE_LEDS = 0x00; or a jr NZ,l__chnative_init_00108 -;source-doc/base-drv/usb-init.c:48: print_string("\r\nCH376: NOT PRESENT$"); + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:54: print_string("\r\nCH376: NOT PRESENT$"); ld hl,usb_init_str_4 call _print_string -;source-doc/base-drv/usb-init.c:49: return; +;source-doc/base-drv/usb-init.c:55: return; jr l__chnative_init_00118 l__chnative_init_00108: -;source-doc/base-drv/usb-init.c:52: print_string("\r\nCH376: PRESENT (VER $"); +;source-doc/base-drv/usb-init.c:58: print_string("\r\nCH376: PRESENT (VER $"); ld hl,usb_init_str_5 call _print_string l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:55: print_hex(ch_cmd_get_ic_version()); +;source-doc/base-drv/usb-init.c:61: USB_MODULE_LEDS = 0x01; + ld a,0x01 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:63: print_hex(ch_cmd_get_ic_version()); call _ch_cmd_get_ic_version call _print_hex -;source-doc/base-drv/usb-init.c:56: print_string("); $"); +;source-doc/base-drv/usb-init.c:64: print_string("); $"); ld hl,usb_init_str_6 call _print_string -;source-doc/base-drv/usb-init.c:58: usb_host_bus_reset(); +;source-doc/base-drv/usb-init.c:66: usb_host_bus_reset(); call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { ld c,0x00 l__chnative_init_00116: bit 0,(ix+4) @@ -186,31 +205,39 @@ l__chnative_init_00121: xor 0x80 l__chnative_init_00185: jp P, l__chnative_init_00114 -;source-doc/base-drv/usb-init.c:61: const uint8_t r = ch_very_short_wait_int_and_get_(); +;source-doc/base-drv/usb-init.c:69: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get ld a, l pop bc -;source-doc/base-drv/usb-init.c:63: if (r == USB_INT_CONNECT) { +;source-doc/base-drv/usb-init.c:71: if (r == USB_INT_CONNECT) { sub 0x81 jr NZ,l__chnative_init_00117 -;source-doc/base-drv/usb-init.c:64: print_string("USB: CONNECTED$"); +;source-doc/base-drv/usb-init.c:72: print_string("USB: CONNECTED$"); ld hl,usb_init_str_7 call _print_string -;source-doc/base-drv/usb-init.c:66: enumerate_all_devices(); +;source-doc/base-drv/usb-init.c:74: enumerate_all_devices(); call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:68: return; +;source-doc/base-drv/usb-init.c:76: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:77: return; jr l__chnative_init_00118 l__chnative_init_00117: -;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { inc c jr l__chnative_init_00116 l__chnative_init_00114: -;source-doc/base-drv/usb-init.c:72: print_string("USB: DISCONNECTED$"); +;source-doc/base-drv/usb-init.c:81: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c),a +;source-doc/base-drv/usb-init.c:82: print_string("USB: DISCONNECTED$"); ld hl,usb_init_str_8 call _print_string l__chnative_init_00118: -;source-doc/base-drv/usb-init.c:73: } +;source-doc/base-drv/usb-init.c:83: } inc sp pop ix ret @@ -250,7 +277,7 @@ usb_init_str_7: usb_init_str_8: DEFM "USB: DISCONNECTED$" DEFB 0x00 -;source-doc/base-drv/usb-init.c:75: void chnative_init_force(void) { _chnative_init(true); } +;source-doc/base-drv/usb-init.c:85: void chnative_init_force(void) { _chnative_init(true); } ; --------------------------------- ; Function chnative_init_force ; --------------------------------- @@ -261,7 +288,7 @@ _chnative_init_force: call __chnative_init inc sp ret -;source-doc/base-drv/usb-init.c:77: void chnative_init(void) { _chnative_init(false); } +;source-doc/base-drv/usb-init.c:87: void chnative_init(void) { _chnative_init(false); } ; --------------------------------- ; Function chnative_init ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index c939f819..c26a70d3 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -170,7 +170,7 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par count = ch_read_data(buffer); if (count == 0) { - USB_MODULE_LEDS = 0x00; + USB_MODULE_LEDS = 0x03; return USB_ERR_DATA_ERROR; } @@ -178,10 +178,11 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par buffer_size -= count; } while (buffer_size > 0); - USB_MODULE_LEDS = 0x00; - + USB_MODULE_LEDS = 0x03; return USB_ERR_OK; + done: + USB_MODULE_LEDS = 0x03; return result; } @@ -201,10 +202,11 @@ usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size *buffer_size = count; - USB_MODULE_LEDS = 0x00; + USB_MODULE_LEDS = 0x03; return USB_ERR_OK; done: + USB_MODULE_LEDS = 0x03; return result; } @@ -226,10 +228,11 @@ usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, end endpoint->toggle = !endpoint->toggle; } - USB_MODULE_LEDS = 0x00; - + USB_MODULE_LEDS = 0x03; return USB_ERR_OK; + done: + USB_MODULE_LEDS = 0x03; return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c index 7adbadea..fa7ba6f0 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c @@ -25,6 +25,8 @@ static usb_error usb_host_bus_reset(void) { void _chnative_init(bool forced) { memset(get_usb_work_area(), 0, sizeof(_usb_state)); + USB_MODULE_LEDS = 0x00; + ch_cmd_reset_all(); delay_medium(); @@ -33,10 +35,13 @@ void _chnative_init(bool forced) { bool indicator = true; print_string("\r\nCH376: *$"); while (!ch_probe()) { - if (indicator) + if (indicator) { + USB_MODULE_LEDS = 0x00; print_string("\b $"); - else + } else { + USB_MODULE_LEDS = 0x03; print_string("\b*$"); + } delay_medium(); indicator = !indicator; @@ -45,6 +50,7 @@ void _chnative_init(bool forced) { print_string("\bPRESENT (VER $"); } else { if (!ch_probe()) { + USB_MODULE_LEDS = 0x00; print_string("\r\nCH376: NOT PRESENT$"); return; } @@ -52,6 +58,8 @@ void _chnative_init(bool forced) { print_string("\r\nCH376: PRESENT (VER $"); } + USB_MODULE_LEDS = 0x01; + print_hex(ch_cmd_get_ic_version()); print_string("); $"); @@ -65,10 +73,12 @@ void _chnative_init(bool forced) { enumerate_all_devices(); + USB_MODULE_LEDS = 0x03; return; } } + USB_MODULE_LEDS = 0x00; print_string("USB: DISCONNECTED$"); } From eec2147826be2977fbe2cbf7df750735f8bea1b4 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 27 Feb 2025 19:58:59 +1100 Subject: [PATCH 20/59] ch376-native: applied z88dk version 20250224 --- Source/HBIOS/ch376-native/Makefile | 2 +- Source/HBIOS/ch376-native/base-drv/ch376.c.s | 132 +++--- .../HBIOS/ch376-native/base-drv/class_hub.c.s | 2 +- .../base-drv/critical-section.c.s | 2 +- .../ch376-native/base-drv/dev_transfers.c.s | 218 ++++----- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 357 +++++++------- .../ch376-native/base-drv/enumerate_hub.c.s | 30 +- .../base-drv/enumerate_storage.c.s | 4 +- .../HBIOS/ch376-native/base-drv/protocol.c.s | 64 +-- .../HBIOS/ch376-native/base-drv/transfers.c.s | 21 +- .../ch376-native/base-drv/usb-base-drv.c.s | 21 +- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 37 +- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 16 +- .../HBIOS/ch376-native/base-drv/work-area.c.s | 2 +- .../HBIOS/ch376-native/keyboard/class_hid.c.s | 4 +- .../keyboard/class_hid_keyboard.c.s | 8 +- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 51 +- .../ch376-native/scsi-drv/class_scsi.c.s | 436 ++++++++++-------- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 6 +- .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 177 +++---- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 6 +- Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 5 +- 22 files changed, 819 insertions(+), 782 deletions(-) diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index 1b6c1369..cd6f25b0 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -12,7 +12,7 @@ ZCCFLAGS := +z80 -vn -startup=0 -clib=sdcc_iy -compiler=sdcc -Cs--std=c23 -Cs-- ZCC_PATH := $(shell command -v zcc) DOCKER_PATH := $(shell command -v docker) -ZCC := $(shell command -v zcc >/dev/null 2>&1 && echo zcc || echo 'docker run -w /host/${PWD} -v /:/host/ -u $(shell id -u ${USER}):$(shell id -g ${USER}) -t z88dk/z88dk zcc') +ZCC := $(shell command -v zcc >/dev/null 2>&1 && echo zcc || echo 'docker run -w /host/${PWD} -v /:/host/ -u $(shell id -u ${USER}):$(shell id -g ${USER}) -t z88dk/z88dk:20250224 zcc') ifeq ($(ZCC_PATH),) ifeq ($(DOCKER_PATH),) diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 48b93254..0277a1e8 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -56,19 +56,18 @@ _result: ; --------------------------------- _ch_command: ;source-doc/base-drv/ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) - ld c,0xff + ld b,0xff l_ch_command_00102: ld a, +((_CH376_COMMAND_PORT) / 256) in a, (((_CH376_COMMAND_PORT) & 0xFF)) bit 4, a jr Z,l_ch_command_00104 - dec c - jr NZ,l_ch_command_00102 + djnz l_ch_command_00102 l_ch_command_00104: ;source-doc/base-drv/ch376.c:21: CH376_COMMAND_PORT = command; ld a, l ld bc,_CH376_COMMAND_PORT - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:22: } ret ;source-doc/base-drv/ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } @@ -104,57 +103,51 @@ _ch_get_status: ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) ;source-doc/base-drv/ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) - ld l,a - sub 0x41 + cp 0x41 jr C,l_ch_get_status_00102 - ld a,0xb4 - sub l + cp 0xb5 + jr NC,l_ch_get_status_00102 ;source-doc/base-drv/ch376.c:37: return ch_status; - jr NC,l_ch_get_status_00126 + ld l, a + jr l_ch_get_status_00126 l_ch_get_status_00102: ;source-doc/base-drv/ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) - ld a, l -;source-doc/base-drv/ch376.c:40: return USB_ERR_OK; - sub 0x51 + cp 0x51 jr NZ,l_ch_get_status_00105 - ld l,a +;source-doc/base-drv/ch376.c:40: return USB_ERR_OK; + ld l,0x00 jr l_ch_get_status_00126 l_ch_get_status_00105: ;source-doc/base-drv/ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) - ld a, l -;source-doc/base-drv/ch376.c:43: return USB_ERR_OK; - sub 0x14 + cp 0x14 jr NZ,l_ch_get_status_00107 - ld l,a +;source-doc/base-drv/ch376.c:43: return USB_ERR_OK; + ld l,0x00 jr l_ch_get_status_00126 l_ch_get_status_00107: ;source-doc/base-drv/ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) - ld a, l - sub 0x15 + cp 0x15 jr NZ,l_ch_get_status_00109 ;source-doc/base-drv/ch376.c:46: return USB_INT_CONNECT; ld l,0x81 jr l_ch_get_status_00126 l_ch_get_status_00109: ;source-doc/base-drv/ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) - ld a, l - sub 0x1d + cp 0x1d jr NZ,l_ch_get_status_00111 ;source-doc/base-drv/ch376.c:49: return USB_ERR_DISK_READ; ld l,0x1d jr l_ch_get_status_00126 l_ch_get_status_00111: ;source-doc/base-drv/ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) - ld a, l - sub 0x1e + cp 0x1e jr NZ,l_ch_get_status_00113 ;source-doc/base-drv/ch376.c:52: return USB_ERR_DISK_WRITE; ld l,0x1e jr l_ch_get_status_00126 l_ch_get_status_00113: ;source-doc/base-drv/ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { - ld a, l - sub 0x16 + cp 0x16 jr NZ,l_ch_get_status_00115 ;source-doc/base-drv/ch376.c:55: ch_cmd_set_usb_mode(5); ld l,0x05 @@ -164,15 +157,13 @@ l_ch_get_status_00113: jr l_ch_get_status_00126 l_ch_get_status_00115: ;source-doc/base-drv/ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) - ld a, l - sub 0x17 + cp 0x17 jr NZ,l_ch_get_status_00117 ;source-doc/base-drv/ch376.c:60: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_get_status_00126 l_ch_get_status_00117: ;source-doc/base-drv/ch376.c:62: ch_status &= 0x2F; - ld a, l and 0x2f ;source-doc/base-drv/ch376.c:64: if (ch_status == 0x2A) cp 0x2a @@ -234,7 +225,7 @@ l_ch_probe_00103: ;source-doc/base-drv/ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; ld a,0xaa ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:87: delay(); call _delay ;source-doc/base-drv/ch376.c:88: complement = CH376_DATA_PORT; @@ -272,14 +263,16 @@ _ch_cmd_set_usb_mode: ld a,0x15 push bc ld bc,_CH376_COMMAND_PORT - out (c),a + out (c), a +;source-doc/base-drv/ch376.c:116: delay(); call _delay pop bc ;source-doc/base-drv/ch376.c:117: CH376_DATA_PORT = mode; ld a, c push bc ld bc,_CH376_DATA_PORT - out (c),a + out (c), a +;source-doc/base-drv/ch376.c:118: delay(); call _delay pop bc ;source-doc/base-drv/ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { @@ -351,7 +344,7 @@ _ch_issue_token: ;source-doc/base-drv/ch376.c:137: CH376_DATA_PORT = toggle_bit; ld a,(ix+4) ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; ld a,(ix+5) add a, a @@ -360,7 +353,7 @@ _ch_issue_token: add a, a or (ix+6) ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:139: } pop ix ret @@ -484,7 +477,6 @@ _ch_data_in_transfer: push ix ld ix,0 add ix,sp - push af ;source-doc/base-drv/ch376.c:158: if (buffer_size == 0) ld a,(ix+7) or (ix+6) @@ -496,18 +488,17 @@ l_ch_data_in_transfer_00102: ;source-doc/base-drv/ch376.c:161: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:162: do { ld c,(ix+8) ld b,(ix+9) - pop de - push bc l_ch_data_in_transfer_00107: ;source-doc/base-drv/ch376.c:163: ch_issue_token_in(endpoint); ld l,c ld h,b push hl call _ch_issue_token_in +;source-doc/base-drv/ch376.c:165: result = ch_long_wait_int_and_get_status(); call _ch_long_wait_int_and_get_statu pop bc ld a, l @@ -519,9 +510,9 @@ l_ch_data_in_transfer_00107: ;source-doc/base-drv/ch376.c:168: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b - pop hl - ld a,(hl) - push hl + ld l, e + ld h, d + ld a, (hl) and 0x01 xor 0x01 and 0x01 @@ -544,7 +535,7 @@ l_ch_data_in_transfer_00107: ;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_data_in_transfer_00111 @@ -575,7 +566,7 @@ l_ch_data_in_transfer_00149: ;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:182: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_00111 @@ -584,13 +575,11 @@ l_ch_data_in_transfer_00110: ;source-doc/base-drv/ch376.c:185: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:186: return result; - ld hl,(_result) - ld h,+((_result) / 256) + ld hl, (_result) l_ch_data_in_transfer_00111: ;source-doc/base-drv/ch376.c:187: } - ld sp, ix pop ix ret ;source-doc/base-drv/ch376.c:189: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { @@ -604,32 +593,28 @@ _ch_data_in_transfer_n: ;source-doc/base-drv/ch376.c:193: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:195: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in ;source-doc/base-drv/ch376.c:197: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu - ld a, l - ld b, a + ld a,l or a jr NZ,l_ch_data_in_transfer_n_00103 ;source-doc/base-drv/ch376.c:199: endpoint->toggle = !endpoint->toggle; - ld e,(ix+8) - ld d,(ix+9) - ld c, e - ld b, d - ex de, hl + ld l,(ix+8) + ld h,(ix+9) ld a, (hl) and 0x01 xor 0x01 and 0x01 - ld e, a - ld a, (bc) + ld c, a + ld a, (hl) and 0xfe - or e - ld (bc), a + or c + ld (hl), a ;source-doc/base-drv/ch376.c:201: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) @@ -641,7 +626,7 @@ _ch_data_in_transfer_n: ;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:207: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_n_00104 @@ -649,12 +634,9 @@ _ch_data_in_transfer_n: l_ch_data_in_transfer_n_00103: ;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x03; ld a,0x03 - push bc ld bc,_USB_MODULE_LEDS - out (c),a - pop bc + out (c), a ;source-doc/base-drv/ch376.c:210: return result; - ld l, b l_ch_data_in_transfer_n_00104: ;source-doc/base-drv/ch376.c:211: } pop ix @@ -667,7 +649,6 @@ _ch_data_out_transfer: push ix ld ix,0 add ix,sp - push af dec sp ;source-doc/base-drv/ch376.c:216: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) @@ -676,16 +657,14 @@ _ch_data_out_transfer: ld d, b inc de ld a, (de) - ld (ix-3),a + ld (ix-1),a ;source-doc/base-drv/ch376.c:218: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a pop bc ;source-doc/base-drv/ch376.c:220: while (buffer_length > 0) { - ld (ix-2),c - ld (ix-1),b l_ch_data_out_transfer_00103: xor a cp (ix+6) @@ -695,7 +674,7 @@ l_ch_data_out_transfer_00103: l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00105 ;source-doc/base-drv/ch376.c:221: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; - ld d,(ix-3) + ld d,(ix-1) ld e,0x00 ld a, d sub (ix+6) @@ -738,6 +717,7 @@ l_ch_data_out_transfer_00110: ld h,b push hl call _ch_issue_token_out +;source-doc/base-drv/ch376.c:226: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a, l pop bc @@ -747,8 +727,8 @@ l_ch_data_out_transfer_00110: ;source-doc/base-drv/ch376.c:228: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b - ld l,(ix-2) - ld h,(ix-1) + ld l, e + ld h, d ld a, (hl) and 0x01 xor 0x01 @@ -763,7 +743,7 @@ l_ch_data_out_transfer_00105: ;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:232: return USB_ERR_OK; ld l,0x00 jr l_ch_data_out_transfer_00107 @@ -772,11 +752,11 @@ l_ch_data_out_transfer_00106: ;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:236: return result; l_ch_data_out_transfer_00107: ;source-doc/base-drv/ch376.c:237: } - ld sp, ix + inc sp pop ix ret ;source-doc/base-drv/ch376.c:239: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { @@ -792,7 +772,7 @@ _ch_set_usb_address: ;source-doc/base-drv/ch376.c:241: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/ch376.c:242: } ret _result: diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s index 89e43f5d..056266f9 100644 --- a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/critical-section.c.s b/Source/HBIOS/ch376-native/base-drv/critical-section.c.s index 51f86184..62766348 100644 --- a/Source/HBIOS/ch376-native/base-drv/critical-section.c.s +++ b/Source/HBIOS/ch376-native/base-drv/critical-section.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 475fbd05..3060aa9c 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -93,27 +93,31 @@ _usbdev_blk_out_trnsfer: push ix ld ix,0 add ix,sp - dec sp + push af + push af ;source-doc/base-drv/dev_transfers.c:30: */ ld e,(ix+4) ld d,(ix+5) - ld c, e - ld b, d - inc bc - inc bc - inc bc + ld hl,0x0003 + add hl, de + ex (sp), hl ;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); - ld l, e - ld h, d - ld a, (hl) + ld (ix-2),e + ld (ix-1),d + pop bc + pop hl + ld a,(hl) + push hl + push bc rlca rlca rlca rlca and 0x0f - push bc push de - push bc + ld l,(ix-4) + ld h,(ix-3) + push hl push af inc sp ld l,(ix+8) @@ -128,56 +132,52 @@ _usbdev_blk_out_trnsfer: pop af inc sp pop de - pop bc ld a, l ld (_result), a ;source-doc/base-drv/dev_transfers.c:34: - ld a,(_result) + ld hl,_result + ld a, (hl) sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 ;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { - ld l, e - ld h, d - inc hl - ld a, (hl) - ld (ix-1),a ex de, hl + inc hl + ld d, (hl) + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rlca rlca rlca rlca and 0x0f - ld d, a - ld l, c - ld h, b - ld a, (hl) + ld b, a + pop hl + ld a,(hl) + push hl rrca and 0x07 - push bc - ld h,(ix-1) - ld l,d - push hl + ld e,b + push de push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop bc ;source-doc/base-drv/dev_transfers.c:36: - ld a, (bc) - and 0xfe - ld (bc), a + pop hl + push hl + res 0, (hl) ;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; ld l,0x02 jr l_usbdev_blk_out_trnsfer_00104 l_usbdev_blk_out_trnsfer_00102: ;source-doc/base-drv/dev_transfers.c:40: ;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; - ld hl,(_result) + ld hl, (_result) l_usbdev_blk_out_trnsfer_00104: ;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; - inc sp + ld sp, ix pop ix ret ;source-doc/base-drv/dev_transfers.c:46: @@ -188,25 +188,31 @@ _usbdev_bulk_in_transfer: push ix ld ix,0 add ix,sp - dec sp + push af + push af ;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); - ld c,(ix+4) - ld b,(ix+5) + ld e,(ix+4) + ld d,(ix+5) ld hl,0x0006 - add hl, bc + add hl, de + ex (sp), hl ;source-doc/base-drv/dev_transfers.c:49: done: - ld e,c - ld d,b - ex de,hl - ld a, (hl) + ld (ix-2),e + ld (ix-1),d + pop bc + pop hl + ld a,(hl) + push hl + push bc rlca rlca rlca rlca and 0x0f - push bc - push de push de + ld l,(ix-4) + ld h,(ix-3) + push hl push af inc sp ld l,(ix+8) @@ -221,21 +227,19 @@ _usbdev_bulk_in_transfer: pop af inc sp pop de - pop bc ld a, l ld (_result), a ;source-doc/base-drv/dev_transfers.c:51: } - ld a,(_result) + ld hl,_result + ld a, (hl) sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 ;source-doc/base-drv/dev_transfers.c:52: - ld l, c - ld h, b + ex de, hl inc hl - ld a, (hl) - ld (ix-1),a - ld l, c - ld h, b + ld d, (hl) + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rlca rlca @@ -243,23 +247,21 @@ _usbdev_bulk_in_transfer: rlca and 0x0f ld b, a - ld l, e - ld h, d - ld a, (hl) + pop hl + ld a,(hl) + push hl rrca and 0x07 + ld e,b push de - ld h,(ix-1) - ld l,b - push hl push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop de ;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { - ex de, hl + pop hl + push hl res 0, (hl) ;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; ld l,0x02 @@ -267,10 +269,10 @@ _usbdev_bulk_in_transfer: l_usbdev_bulk_in_transfer_00102: ;source-doc/base-drv/dev_transfers.c:57: ;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - ld hl,(_result) + ld hl, (_result) l_usbdev_bulk_in_transfer_00104: ;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; - inc sp + ld sp, ix pop ix ret ;source-doc/base-drv/dev_transfers.c:62: } @@ -281,7 +283,8 @@ _usbdev_dat_in_trnsfer: push ix ld ix,0 add ix,sp - dec sp + push af + push af ;source-doc/base-drv/dev_transfers.c:67: } ld e,(ix+4) ld d,(ix+5) @@ -297,22 +300,27 @@ _usbdev_dat_in_trnsfer: add a, e pop de add a, c - ld c, a + ld (ix-4),a ld a,0x00 adc a, b - ld b, a + ld (ix-3),a ;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, - ld l, e - ld h, d - ld a, (hl) + ld (ix-2),e + ld (ix-1),d + pop bc + pop hl + ld a,(hl) + push hl + push bc rlca rlca rlca rlca and 0x0f - push bc push de - push bc + ld l,(ix-4) + ld h,(ix-3) + push hl push af inc sp ld l,(ix+8) @@ -327,56 +335,52 @@ _usbdev_dat_in_trnsfer: pop af inc sp pop de - pop bc ld a, l ld (_result), a ;source-doc/base-drv/dev_transfers.c:71: const uint16_t buffer_size, - ld a,(_result) + ld hl,_result + ld a, (hl) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 ;source-doc/base-drv/dev_transfers.c:72: const usb_endpoint_type endpoint_type) { - ld l, e - ld h, d - inc hl - ld a, (hl) - ld (ix-1),a ex de, hl + inc hl + ld d, (hl) + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rlca rlca rlca rlca and 0x0f - ld d, a - ld l, c - ld h, b - ld a, (hl) + ld b, a + pop hl + ld a,(hl) + push hl rrca and 0x07 - push bc - ld h,(ix-1) - ld l,d - push hl + ld e,b + push de push af inc sp call _usbtrn_clear_endpoint_halt pop af inc sp - pop bc ;source-doc/base-drv/dev_transfers.c:73: - ld a, (bc) - and 0xfe - ld (bc), a + pop hl + push hl + res 0, (hl) ;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; ld l,0x02 jr l_usbdev_dat_in_trnsfer_00104 l_usbdev_dat_in_trnsfer_00102: ;source-doc/base-drv/dev_transfers.c:77: ;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - ld hl,(_result) + ld hl, (_result) l_usbdev_dat_in_trnsfer_00104: ;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; - inc sp + ld sp, ix pop ix ret ;source-doc/base-drv/dev_transfers.c:82: } @@ -388,6 +392,7 @@ _usbdev_dat_in_trnsfer_0: ld ix,0 add ix,sp push af + push af ;source-doc/base-drv/dev_transfers.c:83: ld e,(ix+4) ld d,(ix+5) @@ -395,9 +400,13 @@ _usbdev_dat_in_trnsfer_0: add hl, de ex (sp), hl ;source-doc/base-drv/dev_transfers.c:85: done: - ld l, e - ld h, d - ld a, (hl) + ld (ix-2),e + ld (ix-1),d + pop bc + pop hl + ld a,(hl) + push hl + push bc rlca rlca rlca @@ -406,8 +415,8 @@ _usbdev_dat_in_trnsfer_0: ld c,(ix+8) ld b,0x00 push de - ld l,(ix-2) - ld h,(ix-1) + ld l,(ix-4) + ld h,(ix-3) push hl push af inc sp @@ -424,29 +433,30 @@ _usbdev_dat_in_trnsfer_0: ld a, l ld (_result), a ;source-doc/base-drv/dev_transfers.c:87: } - ld a,(_result) + ld hl,_result + ld a, (hl) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_0_00102 ;source-doc/base-drv/dev_transfers.c:88: - ld l, e - ld h, d - inc hl - ld b, (hl) ex de, hl + inc hl + ld d, (hl) + ld l,(ix-2) + ld h,(ix-1) ld a, (hl) rlca rlca rlca rlca and 0x0f - ld d, a + ld b, a pop hl ld a,(hl) push hl rrca and 0x07 - ld c, d - push bc + ld e,b + push de push af inc sp call _usbtrn_clear_endpoint_halt @@ -461,7 +471,7 @@ _usbdev_dat_in_trnsfer_0: jr l_usbdev_dat_in_trnsfer_0_00103 l_usbdev_dat_in_trnsfer_0_00102: ;source-doc/base-drv/dev_transfers.c:93: - ld hl,(_result) + ld hl, (_result) l_usbdev_dat_in_trnsfer_0_00103: ;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { ld sp, ix diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 37dc3d50..6a6c17c2 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -99,7 +99,7 @@ _parse_endpoint_keyboard: inc bc ld a, d and 0x03 - ld l,a + ld l, a ld a, (bc) and 0xfc or l @@ -362,74 +362,77 @@ _configure_device: push af push af ;source-doc/base-drv/enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; - ld a,(ix+8) - ld (ix-4),a - ld a,(ix+9) - ld (ix-3),a - pop bc - push bc - inc bc - inc bc - ld e,(ix+6) - ld d,(ix+7) + ld c,(ix+8) + ld b,(ix+9) + ld e, c + ld d, b inc de inc de - ld a, (de) - ld (bc), a + ld l,(ix+6) + ld h,(ix+7) + inc hl + inc hl + ld a, (hl) + ld (de), a ;source-doc/base-drv/enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; - ld a,(ix-4) - add a,0x01 - ld (ix-2),a - ld a,(ix-3) - adc a,0x00 - ld (ix-1),a - ld c,(ix+4) - ld b,(ix+5) - ld hl,10 - add hl,bc + ld hl,0x0001 + add hl, bc + ex (sp), hl + ld e,(ix+4) + ld d,(ix+5) + ld hl,0x000a + add hl,de ld a, (hl) - pop de pop hl push hl + ld (hl), a ;source-doc/base-drv/enumerate.c:81: dev_cfg->address = working->current_device_address; - ld (hl),a - push de - ld hl,0x0018 - add hl,bc + ld (ix-2),c + ld (ix-1),b + ld l, e + ld h, d + ld a,+((0x0018) & 0xFF) + add a,l + ld l,a + ld a,+((0x0018) / 256) + adc a,h + ld h,a ld a, (hl) + ld l,(ix-2) + ld h,(ix-1) add a, a add a, a add a, a add a, a - ld l, a - ld a, (de) + push bc + ld c, a + ld a, (hl) and 0x0f - or l - ld (de), a + or c + ld (hl), a + pop bc ;source-doc/base-drv/enumerate.c:82: dev_cfg->type = working->usb_device; - pop de - push de - ld l, c - ld h, b + ld l, e + ld h, d inc hl inc hl ld a, (hl) and 0x0f ld l, a - ld a, (de) + ld a, (bc) and 0xf0 or l - ld (de), a + ld (bc), a ;source-doc/base-drv/enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); ld hl,36 - add hl, bc + add hl, de ld b, (hl) - ld l,(ix-2) - ld h,(ix-1) - ld d, (hl) pop hl - ld a,(hl) + ld d,(hl) push hl + ld l,(ix-2) + ld h,(ix-1) + ld a, (hl) rlca rlca rlca @@ -454,7 +457,6 @@ _op_capture_hub_driver_interfac: add ix,sp push af push af - push af dec sp ex de, hl ;source-doc/base-drv/enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; @@ -463,22 +465,20 @@ _op_capture_hub_driver_interfac: ld a, (hl) dec hl ld l, (hl) - ld (ix-4),l - ld (ix-3),a + ld (ix-2),l + ld (ix-1),a ;source-doc/base-drv/enumerate.c:92: working->hub_config = &hub_config; ld hl,0x0019 add hl, de - ld (ix-2),l - ld (ix-1),h + ld c, l + ld b, h ld hl,0 add hl, sp - ld c, l - ld l,(ix-2) - ld b,h - ld h,(ix-1) - ld (hl), c - inc hl - ld (hl), b + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a ;source-doc/base-drv/enumerate.c:94: hub_config.type = USB_IS_HUB; ld hl,0 add hl, sp @@ -490,8 +490,8 @@ _op_capture_hub_driver_interfac: ld hl,2 add hl, sp push hl - ld l,(ix-4) - ld h,(ix-3) + ld l,(ix-2) + ld h,(ix-1) push hl push de call _configure_device @@ -524,7 +524,7 @@ _op_cap_drv_intf: add ix,sp ld c, l ld b, h - ld hl, -16 + ld hl, -14 add hl, sp ld sp, hl ;source-doc/base-drv/enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; @@ -567,12 +567,12 @@ _op_cap_drv_intf: ;source-doc/base-drv/enumerate.c:108: working->p_current_device = NULL; ld a,(ix-2) add a,0x1d - ld (ix-4),a - ld l,a + ld e, a ld a,(ix-1) adc a,0x00 - ld (ix-3),a - ld h,a + ld d, a + ld l, e + ld h, d xor a ld (hl), a inc hl @@ -612,15 +612,12 @@ l_op_cap_drv_intf_00154: ;source-doc/base-drv/enumerate.c:119: working->p_current_device = &unkown_dev_cfg; ld hl,0 add hl, sp - ex de, hl - ld l,(ix-4) - ld h,(ix-3) - ld (hl), e - inc hl - ld (hl), d + ld a, l + ld (de), a + inc de + ld a, h + ld (de), a ;source-doc/base-drv/enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); - ld hl,0 - add hl, sp push hl push bc ld l,(ix-2) @@ -638,25 +635,26 @@ l_op_cap_drv_intf_00154: l_op_cap_drv_intf_00107: ;source-doc/base-drv/enumerate.c:125: device_config *dev_cfg = find_first_free(); push bc + push de call _find_first_free -;source-doc/base-drv/enumerate.c:126: if (dev_cfg == NULL) + pop de pop bc - ld a,h +;source-doc/base-drv/enumerate.c:126: if (dev_cfg == NULL) + ld a, h or l - ex de,hl jr NZ,l_op_cap_drv_intf_00109 ;source-doc/base-drv/enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; ld l,0x83 jr l_op_cap_drv_intf_00114 l_op_cap_drv_intf_00109: ;source-doc/base-drv/enumerate.c:128: working->p_current_device = dev_cfg; - ld l,(ix-4) - ld h,(ix-3) - ld (hl), e - inc hl - ld (hl), d + ld a, l + ld (de), a + inc de + ld a, h + ld (de), a ;source-doc/base-drv/enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); - push de + push hl push bc ld l,(ix-2) ld h,(ix-1) @@ -690,34 +688,32 @@ l_op_cap_drv_intf_00114: _op_id_class_drv: ex de, hl ;source-doc/base-drv/enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; - ld hl,0x001c + ld hl,27 add hl,de - ld a, (hl) - dec hl - ld l, (hl) + ld c, (hl) + inc hl + ld b, (hl) ;source-doc/base-drv/enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; - ld c, e - ld b, d - inc bc - inc bc - ld h, a - ld l, (hl) - ld a,0x05 - sub l - jr NC,l_op_id_class_drv_00103 - push bc + ld l, e + ld h, d + inc hl + inc hl + ld a, (bc) + cp 0x06 + jr C,l_op_id_class_drv_00103 + push hl push de push de call _identify_class_driver pop af ld a, l pop de - pop bc + pop hl jr l_op_id_class_drv_00104 l_op_id_class_drv_00103: xor a l_op_id_class_drv_00104: - ld (bc), a + ld (hl), a ;source-doc/base-drv/enumerate.c:145: return op_cap_drv_intf(working); ex de, hl call _op_cap_drv_intf @@ -732,13 +728,13 @@ _op_get_cfg_desc: push ix ld ix,0 add ix,sp - push af - ex de, hl + dec sp + ld c, l + ld b, h ;source-doc/base-drv/enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); ld hl,0x001f - add hl, de - pop af - push hl + add hl, bc + push bc ld b,0x46 l_op_get_cfg_desc_00113: xor a @@ -747,88 +743,77 @@ l_op_get_cfg_desc_00113: ld (hl), a inc hl djnz l_op_get_cfg_desc_00113 + pop bc ;source-doc/base-drv/enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; - ld c, e - ld b, d - inc bc - inc bc - inc bc - ld hl,7 - add hl, bc + ld e,c + ld d,b + ld hl,10 + add hl,bc ld a, (hl) + ld (ix-1),a ;source-doc/base-drv/enumerate.c:154: working->config.buffer)); - ld c, e - ld b, d - ld hl,24 + ld hl,0x001f add hl, bc - ld b, (hl) - ld l, e - ld h, d + ex de, hl + ld hl,0x0018 + add hl,bc + ld a, (hl) + ld hl,0x0015 + add hl,bc + ld h, (hl) push bc - ld bc,0x0015 - add hl, bc - pop bc - ld c, (hl) push de - ld l,(ix-2) - ld h,(ix-1) - push hl - ld h,0x8c - ld l,a + ld d,0x8c + push de + inc sp + ld d,(ix-1) + push de + inc sp + ld l,h + ld h,a push hl - push bc call _usbtrn_gfull_cfg_desc pop af pop af pop af - pop de + pop bc ld a, l ld (_result), a - ld a,(_result) + ld hl,_result + ld a, (hl) or a jr NZ,l_op_get_cfg_desc_00103 ;source-doc/base-drv/enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); ld hl,0x001b - add hl, de - ld a, e - add a,0x1f - ld c, a - ld a, d - adc a,0x00 - ld b, a + add hl, bc ld a, c - add a,0x09 - ld c, a + add a,0x28 + ld e, a ld a, b adc a,0x00 - ld (hl), c + ld (hl), e inc hl ld (hl), a ;source-doc/base-drv/enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; ld hl,0x0016 - add hl, de - ld c, l - ld b, h - pop hl - push hl - inc hl - inc hl - inc hl - inc hl + add hl, bc + ex de, hl + ld hl,0x0023 + add hl,bc ld a, (hl) - ld (bc), a + ld (de), a ;source-doc/base-drv/enumerate.c:159: return op_id_class_drv(working); - ex de, hl + ld l, c + ld h, b call _op_id_class_drv jr l_op_get_cfg_desc_00104 ;source-doc/base-drv/enumerate.c:160: done: l_op_get_cfg_desc_00103: ;source-doc/base-drv/enumerate.c:161: return result; - ld hl,_result - ld a, (hl) + ld a, (_result) l_op_get_cfg_desc_00104: ;source-doc/base-drv/enumerate.c:162: } - ld sp, ix + inc sp pop ix ret ;source-doc/base-drv/enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { @@ -845,44 +830,56 @@ _read_all_configs: ;source-doc/base-drv/enumerate.c:169: memset(&working, 0, sizeof(_working)); ld hl,0 add hl, sp + ld e,l + ld d,h + ld b,0x56 + jr l_read_all_configs_00150 +l_read_all_configs_00149: ld (hl),0x00 - ld e, l - ld d, h - inc de - ld bc,0x00aa - ldir + inc hl +l_read_all_configs_00150: + ld (hl),0x00 + inc hl + djnz l_read_all_configs_00149 ;source-doc/base-drv/enumerate.c:170: working.state = state; + ld l, e + ld h, d ld a,(ix+4) - ld hl,0 - add hl, sp ld (hl), a - ld a,(ix+5) inc hl + ld a,(ix+5) ld (hl), a ;source-doc/base-drv/enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); - ld hl,3 + push de + ld hl,5 add hl, sp push hl call _usbtrn_get_descriptor pop af ld a, l + pop de or a jr NZ,l_read_all_configs_00108 ;source-doc/base-drv/enumerate.c:174: state->next_device_address++; - ld e,(ix+4) - ld d,(ix+5) - ld a, (de) - inc a - ld c,a - ld (de), a + ld b,(ix+5) + ld a,(ix+4) + ld l, a + ld h, b + ld c, (hl) + inc c + ld l, a + ld h, b + ld (hl), c ;source-doc/base-drv/enumerate.c:175: working.current_device_address = state->next_device_address; - ld hl,24 - add hl, sp + ld hl,0x0018 + add hl, de ld (hl), c ;source-doc/base-drv/enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); + push de ld l, c call _usbtrn_set_address ld a, l + pop de ;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { or a jr NZ,l_read_all_configs_00108 @@ -895,13 +892,16 @@ l_read_all_configs_00110: sub b jr NC,l_read_all_configs_00107 ;source-doc/base-drv/enumerate.c:179: working.config_index = config_index; - inc hl + ld hl,0x0015 + add hl, de ld (hl), c ;source-doc/base-drv/enumerate.c:181: CHECK(op_get_cfg_desc(&working)); + ld l, e + ld h, d push bc - ld hl,2 - add hl, sp + push de call _op_get_cfg_desc + pop de pop bc or a jr NZ,l_read_all_configs_00108 @@ -934,22 +934,23 @@ _enumerate_all_devices: add hl, sp ld e,l ld d,h + ld (hl),0x00 ;source-doc/base-drv/enumerate.c:193: state.next_device_address = 0; + ld c, e + ld b, d xor a - ld (hl),a - ld (de), a + ld (bc), a ;source-doc/base-drv/enumerate.c:195: usb_error result = read_all_configs(&state); - push de + push bc push de call _read_all_configs pop af - ld c, l - pop de + pop bc ;source-doc/base-drv/enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; - ld a, (de) - ld ((_x + 1)),a + ld de,_x + 1 + ld a, (bc) + ld (de), a ;source-doc/base-drv/enumerate.c:200: return result; - ld l, c ;source-doc/base-drv/enumerate.c:201: } inc sp pop ix diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s index 0fc01bd3..958d7061 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -190,35 +190,37 @@ _hub_get_status_port: ;source-doc/base-drv/enumerate_hub.c:33: get_status_port = cmd_get_status_port; ld hl,0 add hl, sp - ex de, hl + ld e,l + ld d,h + push hl ld bc,0x0008 ld hl,_cmd_get_status_port ldir + pop bc ;source-doc/base-drv/enumerate_hub.c:35: get_status_port.bIndex[0] = index; ld a,(ix+6) ld (ix-4),a ;source-doc/base-drv/enumerate_hub.c:36: return usb_control_transfer(&get_status_port, port_status, hub_config->address, hub_config->max_packet_size); - ld l,(ix+4) - ld h,(ix+5) - ld e,l - ld d,h + ld e,(ix+5) + ld a,(ix+4) + ld l, a + ld h, e inc hl - ld b, (hl) - ex de, hl + ld d, (hl) + ld l, a + ld h, e ld a, (hl) rlca rlca rlca rlca and 0x0f - ld e,(ix+7) - ld d,(ix+8) - ld c,a - push bc + ld l,(ix+7) + ld h,(ix+8) + ld e,a push de - ld hl,4 - add hl, sp push hl + push bc call _usb_control_transfer ;source-doc/base-drv/enumerate_hub.c:37: } ld sp,ix diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s index 72982a22..d8e57ed5 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -133,7 +133,7 @@ l_parse_endpoints_00107: inc de ld a, b and 0x03 - ld l,a + ld l, a ld a, (de) and 0xfc or l diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index c63f157d..c22b7e5e 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -73,9 +73,10 @@ _usbtrn_get_descriptor: ;source-doc/base-drv/protocol.c:30: setup_packet cmd; ld c,(ix+4) ld b,(ix+5) - ld e, c - ld d, b push bc + push bc + ld e,c + ld d,b ld a,0x08 push af inc sp @@ -83,13 +84,14 @@ _usbtrn_get_descriptor: push af inc sp push de - ld hl,6 + ld hl,8 add hl, sp push hl call _usb_control_transfer pop af pop af pop af + pop de pop bc ld a, l ld (_result), a @@ -98,30 +100,30 @@ _usbtrn_get_descriptor: or a jr NZ,l_usbtrn_get_descriptor_00103 ;source-doc/base-drv/protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); - ld hl,0 + push de + push bc + ld hl,4 add hl, sp ex de, hl - push bc ld bc,0x0008 ld hl,_cmd_get_device_descriptor ldir pop bc + pop de ;source-doc/base-drv/protocol.c:35: ld (ix-2),0x12 xor a ld (ix-1),a ;source-doc/base-drv/protocol.c:36: CHECK(result); - ld e,(ix+4) - ld d,(ix+5) ld hl,7 - add hl, de + add hl, bc ld a, (hl) push af inc sp xor a push af inc sp - push bc + push de ld hl,4 add hl, sp push hl @@ -135,7 +137,7 @@ _usbtrn_get_descriptor: ;source-doc/base-drv/protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); l_usbtrn_get_descriptor_00103: ;source-doc/base-drv/protocol.c:41: - ld hl,(_result) + ld hl, (_result) ;source-doc/base-drv/protocol.c:42: RETURN_CHECK(result); ld sp, ix pop ix @@ -173,20 +175,22 @@ _usbtrn_get_descriptor2: ;source-doc/base-drv/protocol.c:51: * @param buffer the buffer to store the device descriptor in ld c,(ix+4) ld b,(ix+5) - ld e, c - ld d, b push bc + push bc + ld e,c + ld d,b ld h,0x08 ld l,(ix+6) push hl push de - ld hl,6 + ld hl,8 add hl, sp push hl call _usb_control_transfer pop af pop af pop af + pop de pop bc ld a, l ld (_result), a @@ -195,27 +199,27 @@ _usbtrn_get_descriptor2: or a jr NZ,l_usbtrn_get_descriptor2_00103 ;source-doc/base-drv/protocol.c:55: setup_packet cmd; - ld hl,0 + push de + push bc + ld hl,4 add hl, sp ex de, hl - push bc ld bc,0x0008 ld hl,_cmd_get_device_descriptor ldir pop bc + pop de ;source-doc/base-drv/protocol.c:56: cmd = cmd_get_device_descriptor; ld (ix-2),0x12 xor a ld (ix-1),a ;source-doc/base-drv/protocol.c:57: cmd.wLength = 8; - ld e,(ix+4) - ld d,(ix+5) ld hl,7 - add hl, de + add hl, bc ld h,(hl) ld l,(ix+6) push hl - push bc + push de ld hl,4 add hl, sp push hl @@ -228,7 +232,7 @@ _usbtrn_get_descriptor2: ;source-doc/base-drv/protocol.c:58: l_usbtrn_get_descriptor2_00103: ;source-doc/base-drv/protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); - ld hl,(_result) + ld hl, (_result) ;source-doc/base-drv/protocol.c:60: ld sp, ix pop ix @@ -247,10 +251,10 @@ _usbtrn_set_address: push af ld c, l ;source-doc/base-drv/protocol.c:68: } - ld hl,0 + push bc + ld hl,2 add hl, sp ex de, hl - push bc ld bc,0x0008 ld hl,_cmd_set_device_address ldir @@ -351,9 +355,13 @@ _usbtrn_get_config_descriptor: ld a,(ix+6) ld (ix-6),a ;source-doc/base-drv/protocol.c:98: + ld hl,0x0006 + add hl, bc ld e,(ix+7) - ld (ix-2),e - ld (ix-1),0x00 + xor a + ld (hl), e + inc hl + ld (hl), a ;source-doc/base-drv/protocol.c:100: } ld e,(ix+4) ld d,(ix+5) @@ -408,8 +416,8 @@ _usbtrn_gfull_cfg_desc: or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 ;source-doc/base-drv/protocol.c:112: * @return usb_error USB_ERR_OK if all good, otherwise specific error code - ld l, c - ld h, b + ld l,(ix+8) + ld h,(ix+9) inc hl inc hl ld d, (hl) @@ -442,7 +450,7 @@ l_usbtrn_gfull_cfg_desc_00104: ;source-doc/base-drv/protocol.c:119: setup_packet cmd; l_usbtrn_gfull_cfg_desc_00107: ;source-doc/base-drv/protocol.c:120: cmd = cmd_get_config_descriptor; - ld hl,(_result) + ld hl, (_result) l_usbtrn_gfull_cfg_desc_00108: ;source-doc/base-drv/protocol.c:121: cmd.bValue[0] = config_index; pop ix diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index 0cf7ef14..47e2cfb1 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -120,7 +120,7 @@ _usb_control_transfer: inc hl ld a, b and 0x03 - ld e,a + ld e, a ld a, (hl) and 0xfc or e @@ -144,6 +144,7 @@ l_usb_control_transfer_00102: ;source-doc/base-drv/transfers.c:50: const uint8_t max_packet_size) { push bc call _critical_begin +;source-doc/base-drv/transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; ld l,(ix+8) call _ch_set_usb_address pop bc @@ -158,7 +159,9 @@ l_usb_control_transfer_00102: call _ch_write_data pop af inc sp +;source-doc/base-drv/transfers.c:55: call _ch_issue_token_setup +;source-doc/base-drv/transfers.c:56: if (transferIn && buffer == 0) call _ch_short_wait_int_and_get_stat pop bc ;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; @@ -175,13 +178,13 @@ l_usb_control_transfer_00102: ld b,a or c jr Z,l_usb_control_transfer_00116 + ld hl,0 + add hl, sp ld e,(ix+6) ld d,(ix+7) ld a,(ix-1) or a jr Z,l_usb_control_transfer_00118 - ld hl,0 - add hl, sp push hl push bc push de @@ -191,8 +194,6 @@ l_usb_control_transfer_00102: pop af jr l_usb_control_transfer_00119 l_usb_control_transfer_00118: - ld hl,0 - add hl, sp push hl push bc push de @@ -220,7 +221,7 @@ l_usb_control_transfer_00117: ;source-doc/base-drv/transfers.c:69: ld a,0x00 ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/transfers.c:70: result = length != 0 call _ch_issue_token_out_ep0 ;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) @@ -392,7 +393,7 @@ _usb_data_in_transfer: ;source-doc/base-drv/transfers.c:126: * @brief Perform a USB data in on the specififed endpoint call _critical_end ;source-doc/base-drv/transfers.c:128: * @param buffer the buffer to receive the data - ld hl,(_result) + ld hl, (_result) ;source-doc/base-drv/transfers.c:129: * @param buffer_size the maximum size of data to be received pop ix ret @@ -428,7 +429,7 @@ _usb_data_in_transfer_n: ;source-doc/base-drv/transfers.c:141: call _critical_end ;source-doc/base-drv/transfers.c:143: - ld hl,(_result) + ld hl, (_result) ;source-doc/base-drv/transfers.c:144: return result; pop ix ret @@ -464,7 +465,7 @@ _usb_data_out_transfer: ;source-doc/base-drv/transfers.c:156: usb_error call _critical_end ;source-doc/base-drv/transfers.c:158: critical_begin(); - ld hl,(_result) + ld hl, (_result) ;source-doc/base-drv/transfers.c:159: pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index bdc2d537..314f6d9f 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -56,20 +56,18 @@ _storage_count: ; --------------------------------- _chnative_seek: push ix -;source-doc/base-drv/usb-base-drv.c:7: storage_device->current_lba = lba; ld ix,0 add ix,sp - ld c,(ix+4) - ld b,(ix+5) - push bc - ld a,(ix-2) + ld c, l + ld b, h +;source-doc/base-drv/usb-base-drv.c:7: storage_device->current_lba = lba; + ld h,(ix+5) + ld a,(ix+4) add a,0x0c - ld c,l - ld b,h ld l, a - ld a,(ix-1) - adc a,0x00 - ld h, a + jr NC,l_chnative_seek_00103 + inc h +l_chnative_seek_00103: ld (hl), e inc hl ld (hl), d @@ -80,7 +78,6 @@ _chnative_seek: ;source-doc/base-drv/usb-base-drv.c:8: return 0; xor a ;source-doc/base-drv/usb-base-drv.c:9: } - ld sp, ix pop ix pop hl pop bc diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index d4e25782..90f05110 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -74,11 +74,11 @@ _usb_host_bus_reset: ;source-doc/base-drv/ch376.h:111: ld a,0x25 ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) ld a,0xdf ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:20: return USB_ERR_OK; ld l,0x00 ;source-doc/base-drv/usb-init.c:21: } @@ -103,7 +103,7 @@ __chnative_init: ;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:30: ch_cmd_reset_all(); call _ch_cmd_reset_all ;source-doc/base-drv/usb-init.c:32: delay_medium(); @@ -128,7 +128,7 @@ l__chnative_init_00104: ;source-doc/base-drv/usb-init.c:39: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:40: print_string("\b $"); ld hl,usb_init_str_1 call _print_string @@ -137,7 +137,7 @@ l__chnative_init_00102: ;source-doc/base-drv/usb-init.c:42: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:43: print_string("\b*$"); ld hl,usb_init_str_2 call _print_string @@ -162,7 +162,7 @@ l__chnative_init_00110: or a jr NZ,l__chnative_init_00108 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:54: print_string("\r\nCH376: NOT PRESENT$"); ld hl,usb_init_str_4 call _print_string @@ -176,7 +176,7 @@ l__chnative_init_00111: ;source-doc/base-drv/usb-init.c:61: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:63: print_hex(ch_cmd_get_ic_version()); call _ch_cmd_get_ic_version call _print_hex @@ -190,21 +190,14 @@ l__chnative_init_00111: l__chnative_init_00116: bit 0,(ix+4) jr Z,l__chnative_init_00120 - ld de,0x000a + ld b,0x0a jr l__chnative_init_00121 l__chnative_init_00120: - ld de,0x0005 + ld b,0x05 l__chnative_init_00121: - ld b, c - ld l,0x00 - ld a, b - sub e - ld a, l - sbc a, d - jp PO, l__chnative_init_00185 - xor 0x80 -l__chnative_init_00185: - jp P, l__chnative_init_00114 + ld a, c + sub b + jr NC,l__chnative_init_00114 ;source-doc/base-drv/usb-init.c:69: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get @@ -221,7 +214,7 @@ l__chnative_init_00185: ;source-doc/base-drv/usb-init.c:76: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:77: return; jr l__chnative_init_00118 l__chnative_init_00117: @@ -232,7 +225,7 @@ l__chnative_init_00114: ;source-doc/base-drv/usb-init.c:81: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS - out (c),a + out (c), a ;source-doc/base-drv/usb-init.c:82: print_string("USB: DISCONNECTED$"); ld hl,usb_init_str_8 call _print_string diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 62bea257..e494fb01 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -70,10 +70,8 @@ l_find_device_config_00103: ld h, d ld a, (hl) and 0x0f - ld c, a ;source-doc/base-drv/usb_state.c:20: if (type == requested_type) - ld a,(ix+4) - sub c + sub (ix+4) jr NZ,l_find_device_config_00102 ;source-doc/base-drv/usb_state.c:21: return (device_config *)p_config; ex de, hl @@ -168,12 +166,14 @@ l_next_device_config_00102: ld a,0x00 adc a, +((_device_config_sizes) / 256) ld h, a - ld l, (hl) + ld a, (hl) ;source-doc/base-drv/usb_state.c:58: const uint8_t *_p = (uint8_t *)p; ;source-doc/base-drv/usb_state.c:59: device_config *const result = (device_config *)(_p + size); - ld h,0x00 - add hl, de - ex de, hl + add a, e + ld e, a + ld a,0x00 + adc a, d + ld d, a ;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) ld hl,0x0068 add hl, bc diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index adb9c88a..0449816b 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s index a893b7fd..f53b35a5 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -62,6 +62,7 @@ _hid_set_protocol: push af ;source-doc/keyboard/class_hid.c:8: cmd = cmd_hid_set; push hl + ex de,hl ld hl,2 add hl, sp ex de, hl @@ -126,6 +127,7 @@ _hid_set_idle: push af ;source-doc/keyboard/class_hid.c:18: cmd = cmd_hid_set; push hl + ex de,hl ld hl,2 add hl, sp ex de, hl diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s index 44aa6d22..0c16292f 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -184,16 +184,14 @@ l_scancode_to_char_00120: ld d,0x00 ld hl,_scancodes_shift_table add hl, de - ld a,(hl) - ld c,a + ld a, (hl) jp _char_with_caps_lock l_scancode_to_char_00122: ;source-doc/keyboard/class_hid_keyboard.c:380: return char_with_caps_lock(scancodes_shift_table[code]); ld d,0x00 ld hl,_scancodes_table add hl, de - ld a,(hl) - ld c,a + ld a, (hl) jp _char_with_caps_lock l_scancode_to_char_00123: ;source-doc/keyboard/class_hid_keyboard.c:381: diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 9a558c3b..e7fed9b8 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -173,8 +173,8 @@ l_keyboard_buf_put_00110: ld b,0x00 ld hl,_previous_keyCodes add hl, bc - ld a,(ix+5) - sub (hl) + ld a, (hl) + sub (ix+5) ;source-doc/keyboard/kyb-init.c:57: if (previous_keyCodes[i] == key_code) jr Z,l_keyboard_buf_put_00112 ;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it @@ -182,7 +182,7 @@ l_keyboard_buf_put_00110: jr l_keyboard_buf_put_00110 l_keyboard_buf_put_00106: ;source-doc/keyboard/kyb-init.c:59: - ld a,(_write_index) + ld a, (_write_index) inc a and 0x07 ld c, a @@ -192,21 +192,20 @@ l_keyboard_buf_put_00106: jr Z,l_keyboard_buf_put_00112 ;source-doc/keyboard/kyb-init.c:61: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 - ld hl,(_write_index) + ld hl, (_write_index) ld h,0x00 add hl, hl add hl, de ld a,(ix+4) ld (hl), a ;source-doc/keyboard/kyb-init.c:62: buffer[write_index].modifier_keys = modifier_keys; - ld hl,(_write_index) + ld hl, (_write_index) ld h,0x00 add hl, hl add hl, de - ex de, hl - inc de + inc hl ld a,(ix+5) - ld (de), a + ld (hl), a ;source-doc/keyboard/kyb-init.c:63: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c @@ -231,13 +230,11 @@ _keyboard_buf_size: jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: ;source-doc/keyboard/kyb-init.c:71: - ld hl,_read_index - ld c, (hl) + ld hl, (_read_index) ld a,0x08 - sub c - ld hl,_write_index - ld c, (hl) - add a, c + sub l + ld hl, (_write_index) + add a, l l_keyboard_buf_size_00103: ;source-doc/keyboard/kyb-init.c:72: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret @@ -264,7 +261,7 @@ _keyboard_buf_get_next: l_keyboard_buf_get_next_00102: ;source-doc/keyboard/kyb-init.c:78: ld bc,_buffer+0 - ld hl,(_read_index) + ld hl, (_read_index) ld h,0x00 add hl, hl add hl, bc @@ -273,11 +270,10 @@ l_keyboard_buf_get_next_00102: inc hl ld c, (hl) ;source-doc/keyboard/kyb-init.c:80: const uint8_t key_code = buffer[read_index].key_code; - ld hl,_read_index - ld a, (hl) + ld a, (_read_index) inc a and 0x07 - ld (hl), a + ld (_read_index),a ;source-doc/keyboard/kyb-init.c:82: ld a, c sub 0x39 @@ -325,11 +321,10 @@ l_keyboard_buf_get_next_00105: ; --------------------------------- _keyboard_buf_flush: ;source-doc/keyboard/kyb-init.c:93: void keyboard_buf_flush() { - ld hl,_write_index - ld (hl),0x00 ;source-doc/keyboard/kyb-init.c:94: write_index = 0; - ld hl,_read_index - ld (hl),0x00 + xor a + ld (_write_index),a + ld (_read_index),a ;source-doc/keyboard/kyb-init.c:95: read_index = 0; ret ;source-doc/keyboard/kyb-init.c:101: @@ -349,13 +344,13 @@ _keyboard_tick: ;././source-doc/base-drv//ch376.h:111: ld a,0x25 ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) ld a,0x1f ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/keyboard/kyb-init.c:106: ch_configure_nak_retry_disable(); - ld bc,_report+0 + ld bc,_report ld hl, (_keyboard_config) ld a,0x08 push af @@ -374,11 +369,11 @@ _keyboard_tick: ;././source-doc/base-drv//ch376.h:111: ld a,0x25 ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) ld a,0xdf ld bc,_CH376_DATA_PORT - out (c),a + out (c), a ;source-doc/keyboard/kyb-init.c:108: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index b921d313..672829ab 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -70,7 +70,7 @@ _do_scsi_cmd: push ix ld ix,0 add ix,sp - ld hl, -6 + ld hl, -8 add hl, sp ld sp, hl ;source-doc/scsi-drv/class_scsi.c:17: cbw->dCBWTag[0] = next_tag++; @@ -79,7 +79,10 @@ _do_scsi_cmd: ld hl,0x0004 add hl, bc ex (sp), hl - ld de,(_next_tag) + ld a, (_next_tag) + ld e, a + ld hl,_next_tag + 1 + ld d, (hl) ld hl, (_next_tag) inc hl ld (_next_tag), hl @@ -102,39 +105,43 @@ l_do_scsi_cmd_00102: pop bc ;source-doc/scsi-drv/class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT])); ld a,(ix+4) - ld (ix-4),a + ld (ix-6),a + ld e, a ld a,(ix+5) + ld (ix-5),a + ld d,a + inc de + inc de + inc de + ld a,(ix-6) + ld (ix-4),a + ld l, a + ld a,(ix-5) ld (ix-3),a - ld a,(ix-4) - add a,0x03 - ld (ix-2),a - ld a,(ix-3) - adc a,0x00 - ld (ix-1),a - ld l,(ix-4) - ld h,(ix-3) + ld h,a ld a, (hl) rlca rlca rlca rlca and 0x0f - ld e,(ix+6) - ld d,(ix+7) + ld l,(ix+6) + ld h,(ix+7) push bc - ld l,(ix-2) - ld h,(ix-1) - push hl + push de + push de push af inc sp + push hl ld hl,0x001f + ex (sp), hl push hl - push de call _usb_data_out_transfer pop af pop af pop af inc sp + pop de pop bc ld a, l ld (_result), a @@ -144,30 +151,33 @@ l_do_scsi_cmd_00102: ;source-doc/scsi-drv/class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { ld hl,8 add hl, bc - ld e, (hl) + ld c, (hl) inc hl - ld d, (hl) + ld b, (hl) inc hl - ld c, (hl) inc hl ld a, (hl) + dec hl + ld l, (hl) + or l + or b or c - or d - or e jr Z,l_do_scsi_cmd_00113 ;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); - ld c,(ix+8) - ld b,(ix+9) + ld a,(ix+8) + ld (ix-2),a + ld a,(ix+9) + ld (ix-1),a ;source-doc/scsi-drv/class_scsi.c:28: if (!send) { bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 ;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); - ld a,(ix-4) + ld a,(ix-6) add a,0x06 - ld (ix-2),a - ld a,(ix-3) + ld e, a + ld a,(ix-5) adc a,0x00 - ld (ix-1),a + ld d, a ld l,(ix-4) ld h,(ix-3) ld a, (hl) @@ -176,13 +186,13 @@ l_do_scsi_cmd_00102: rlca rlca and 0x0f - ld l,(ix-2) - ld h,(ix-1) - push hl + push de push af inc sp - push de push bc + ld l,(ix-2) + ld h,(ix-1) + push hl call _usb_data_in_transfer pop af pop af @@ -204,13 +214,13 @@ l_do_scsi_cmd_00110: rlca rlca and 0x0f - ld l,(ix-2) - ld h,(ix-1) - push hl + push de push af inc sp - push de push bc + ld l,(ix-2) + ld h,(ix-1) + push hl call _usb_data_out_transfer pop af pop af @@ -223,10 +233,10 @@ l_do_scsi_cmd_00110: jr NZ,l_do_scsi_cmd_00120 l_do_scsi_cmd_00113: ;source-doc/scsi-drv/class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); - ld a,(ix-4) + ld a,(ix-6) add a,0x06 ld e, a - ld a,(ix-3) + ld a,(ix-5) adc a,0x00 ld d, a ld l,(ix-4) @@ -275,14 +285,14 @@ l_do_scsi_cmd_00113: jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00117: ;source-doc/scsi-drv/class_scsi.c:44: result = USB_ERR_OK; - ld hl,_result - ld (hl),0x00 + xor a + ld (_result),a ;source-doc/scsi-drv/class_scsi.c:46: done: l_do_scsi_cmd_00120: ;source-doc/scsi-drv/class_scsi.c:47: critical_end(); call _critical_end ;source-doc/scsi-drv/class_scsi.c:48: return result; - ld hl,(_result) + ld hl, (_result) ;source-doc/scsi-drv/class_scsi.c:49: } ld sp, ix pop ix @@ -301,37 +311,43 @@ _get_scsi_read_capacity: ;source-doc/scsi-drv/class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp - ex de, hl + ld e,l + ld d,h + push hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir ;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity; - ld hl,15 + ld hl,17 add hl, sp ex de, hl ld bc,0x000c ld hl,_scsi_read_capacity ldir + pop bc ;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 ;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); ld (ix-13),0x0c ;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - ld (ix-19),0x08 + ld hl,0x0008 + add hl, bc + ld (hl),0x08 + inc hl xor a - ld (ix-18),a - ld (ix-17),a - ld (ix-16),a + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); - ld c,(ix+6) - ld b,(ix+7) + ld e,(ix+6) + ld d,(ix+7) xor a push af inc sp + push de push bc - ld hl,3 - add hl, sp - push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -354,37 +370,43 @@ _scsi_inquiry: ;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp - ex de, hl + ld e,l + ld d,h + push hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir ;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry; - ld hl,15 + ld hl,17 add hl, sp ex de, hl ld bc,0x000c ld hl,_scsi_packet_inquiry ldir + pop bc ;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 ;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); ld (ix-13),0x0c ;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; - ld (ix-19),0x24 + ld hl,0x0008 + add hl, bc + ld (hl),0x24 + inc hl xor a - ld (ix-18),a - ld (ix-17),a - ld (ix-16),a + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); - ld c,(ix+6) - ld b,(ix+7) + ld e,(ix+6) + ld d,(ix+7) xor a push af inc sp + push de push bc - ld hl,3 - add hl, sp - push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -407,12 +429,14 @@ _scsi_test: ;source-doc/scsi-drv/class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp - ex de, hl + ld e,l + ld d,h + push hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir ;source-doc/scsi-drv/class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); - ld hl,15 + ld hl,17 add hl, sp ld b,0x06 l_scsi_test_00103: @@ -422,30 +446,29 @@ l_scsi_test_00103: ld (hl), a inc hl djnz l_scsi_test_00103 + pop bc ;source-doc/scsi-drv/class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 ;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c ;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0; - ld hl,8 - add hl, sp + ld hl,0x0008 + add hl, bc xor a - ld (hl),a + ld (hl), a inc hl - ld (hl),a + ld (hl), a inc hl - ld (hl),a + ld (hl), a inc hl - ld (hl),a + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp ld hl,0x0000 push hl - ld hl,3 - add hl, sp - push hl + push bc ld l,(ix+4) ld h,(ix+5) push hl @@ -468,37 +491,43 @@ _scsi_request_sense: ;source-doc/scsi-drv/class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp - ex de, hl + ld e,l + ld d,h + push hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir ;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense; - ld hl,15 + ld hl,17 add hl, sp ex de, hl ld bc,0x000c ld hl,_scsi_packet_request_sense ldir + pop bc ;source-doc/scsi-drv/class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 ;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c ;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); - ld (ix-19),0x12 + ld hl,0x0008 + add hl, bc + ld (hl),0x12 + inc hl xor a - ld (ix-18),a - ld (ix-17),a - ld (ix-16),a + ld (hl), a + inc hl + ld (hl), a + inc hl + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); - ld c,(ix+6) - ld b,(ix+7) + ld e,(ix+6) + ld d,(ix+7) xor a push af inc sp + push de push bc - ld hl,3 - add hl, sp - push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -553,7 +582,7 @@ l_scsi_sense_init_00104: ;source-doc/scsi-drv/class_scsi.c:112: critical_end(); call _critical_end ;source-doc/scsi-drv/class_scsi.c:114: return result; - ld hl,(_result) + ld hl, (_result) ;source-doc/scsi-drv/class_scsi.c:115: } ld sp, ix pop ix @@ -566,17 +595,20 @@ _scsi_read: push ix ld ix,0 add ix,sp - push af ;source-doc/scsi-drv/class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - ld hl,_cbw + ld de,_cbw + ld l, e + ld h, d + ld b,0x0e + jr l_scsi_read_00113 +l_scsi_read_00112: ld (hl),0x00 - ld e, l - ld d, h - inc de - ld bc,0x001a - ldir + inc hl +l_scsi_read_00113: + ld (hl),0x00 + inc hl + djnz l_scsi_read_00112 ;source-doc/scsi-drv/class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper; - ld de,_cbw ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir @@ -598,50 +630,52 @@ _scsi_read: ld hl,_cbw + 23 ld (hl),0x01 ;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld c,(ix+4) - ld b,(ix+5) - ld hl,0x000c - add hl, bc - pop af - push hl + ld l,(ix+4) + ld h,(ix+5) + ld bc,0x000c + add hl,bc + ld c,l + ld b,h inc hl inc hl inc hl ld a, (hl) ld ((_cbw + 17)),a ;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; - pop hl - push hl - inc hl - inc hl - ld a, (hl) - ld ((_cbw + 18)),a ;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - pop hl - push hl + ld l,c + ld h,b + inc hl inc hl ld a,(hl) - ld ((_cbw + 19)),a + ld ((_cbw + 18)),a + dec hl + ld e, (hl) + ld hl, +(_cbw + 19) + ld (hl), e ;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba; - pop hl - ld a,(hl) - push hl - ld ((_cbw + 20)),a + ld a, (bc) + inc hl + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) + push bc xor a push af inc sp push de ld hl,_cbw push hl - push bc + ld l,(ix+4) + ld h,(ix+5) + push hl call _do_scsi_cmd pop af pop af pop af inc sp + pop bc ld a, l ld (_result), a ;source-doc/scsi-drv/class_scsi.c:136: if (result == USB_ERR_OK) @@ -649,35 +683,37 @@ _scsi_read: or a jr NZ,l_scsi_read_00102 ;source-doc/scsi-drv/class_scsi.c:137: dev->current_lba++; - pop hl - ld c,(hl) - push hl - inc hl - ld b, (hl) - inc hl + ld l, c + ld h, b ld e, (hl) inc hl ld d, (hl) - inc c - jr NZ,l_scsi_read_00112 - inc b - jr NZ,l_scsi_read_00112 - inc de -l_scsi_read_00112: - pop hl - push hl - ld (hl), c - inc hl - ld (hl), b inc hl - ld (hl), e + ld a,(hl) inc hl - ld (hl), d + ld h,(hl) + ld l,a + inc e + jr NZ,l_scsi_read_00114 + inc d + jr NZ,l_scsi_read_00114 + inc hl +l_scsi_read_00114: + ld a, e + ld (bc), a + inc bc + ld a, d + ld (bc), a + inc bc + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a l_scsi_read_00102: ;source-doc/scsi-drv/class_scsi.c:138: return result; - ld hl,(_result) + ld hl, (_result) ;source-doc/scsi-drv/class_scsi.c:139: } - ld sp, ix pop ix ret ;source-doc/scsi-drv/class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { @@ -688,17 +724,20 @@ _scsi_write: push ix ld ix,0 add ix,sp - push af ;source-doc/scsi-drv/class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - ld hl,_cbw + ld de,_cbw + ld l, e + ld h, d + ld b,0x0e + jr l_scsi_write_00113 +l_scsi_write_00112: ld (hl),0x00 - ld e, l - ld d, h - inc de - ld bc,0x001a - ldir + inc hl +l_scsi_write_00113: + ld (hl),0x00 + inc hl + djnz l_scsi_write_00112 ;source-doc/scsi-drv/class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper; - ld de,_cbw ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir @@ -720,50 +759,52 @@ _scsi_write: ld hl,_cbw + 23 ld (hl),0x01 ;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld c,(ix+4) - ld b,(ix+5) - ld hl,0x000c - add hl, bc - pop af - push hl + ld l,(ix+4) + ld h,(ix+5) + ld bc,0x000c + add hl,bc + ld c,l + ld b,h inc hl inc hl inc hl ld a, (hl) ld ((_cbw + 17)),a ;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; - pop hl - push hl - inc hl - inc hl - ld a, (hl) - ld ((_cbw + 18)),a ;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - pop hl - push hl + ld l,c + ld h,b + inc hl inc hl ld a,(hl) - ld ((_cbw + 19)),a + ld ((_cbw + 18)),a + dec hl + ld e, (hl) + ld hl, +(_cbw + 19) + ld (hl), e ;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba; - pop hl - ld a,(hl) - push hl - ld ((_cbw + 20)),a + ld a, (bc) + inc hl + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) + push bc ld a,0x01 push af inc sp push de ld hl,_cbw push hl - push bc + ld l,(ix+4) + ld h,(ix+5) + push hl call _do_scsi_cmd pop af pop af pop af inc sp + pop bc ld a, l ld (_result), a ;source-doc/scsi-drv/class_scsi.c:158: if (result == USB_ERR_OK) @@ -771,35 +812,37 @@ _scsi_write: or a jr NZ,l_scsi_write_00102 ;source-doc/scsi-drv/class_scsi.c:159: dev->current_lba++; - pop hl - ld c,(hl) - push hl - inc hl - ld b, (hl) - inc hl + ld l, c + ld h, b ld e, (hl) inc hl ld d, (hl) - inc c - jr NZ,l_scsi_write_00112 - inc b - jr NZ,l_scsi_write_00112 - inc de -l_scsi_write_00112: - pop hl - push hl - ld (hl), c - inc hl - ld (hl), b inc hl - ld (hl), e + ld a,(hl) inc hl - ld (hl), d + ld h,(hl) + ld l,a + inc e + jr NZ,l_scsi_write_00114 + inc d + jr NZ,l_scsi_write_00114 + inc hl +l_scsi_write_00114: + ld a, e + ld (bc), a + inc bc + ld a, d + ld (bc), a + inc bc + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a l_scsi_write_00102: ;source-doc/scsi-drv/class_scsi.c:160: return result; - ld hl,(_result) + ld hl, (_result) ;source-doc/scsi-drv/class_scsi.c:161: } - ld sp, ix pop ix ret ;source-doc/scsi-drv/class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) { @@ -816,12 +859,14 @@ _scsi_eject: ;source-doc/scsi-drv/class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp - ex de, hl + ld e,l + ld d,h + push hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir ;source-doc/scsi-drv/class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - ld hl,15 + ld hl,17 add hl, sp ld b,0x03 l_scsi_eject_00103: @@ -831,6 +876,7 @@ l_scsi_eject_00103: ld (hl), a inc hl djnz l_scsi_eject_00103 + pop bc ;source-doc/scsi-drv/class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B; ld (ix-6),0x1b ;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.loej = 1; @@ -842,25 +888,23 @@ l_scsi_eject_00103: ;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); ld (ix-7),0x06 ;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0; - ld hl,8 - add hl, sp + ld hl,0x0008 + add hl, bc xor a - ld (hl),a + ld (hl), a inc hl - ld (hl),a + ld (hl), a inc hl - ld (hl),a + ld (hl), a inc hl - ld (hl),a + ld (hl), a ;source-doc/scsi-drv/class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp ld hl,0x0000 push hl - ld hl,3 - add hl, sp - push hl + push bc ld l,(ix+4) ld h,(ix+5) push hl diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index aac79d77..c1e9efbb 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -85,14 +85,16 @@ l_chscsi_init_00105: ld h,0x00 push de call _print_uint16 +;source-doc/scsi-drv/scsi-init.c:26: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de ;source-doc/scsi-drv/scsi-init.c:27: print_uint16(storage_count); - ld hl,(_storage_count) + ld hl, (_storage_count) ld h,0x00 push de call _print_uint16 +;source-doc/scsi-drv/scsi-init.c:28: print_string(" $"); ld hl,scsi_init_str_2 call _print_string pop de diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index c0be3f53..82a0a022 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -197,8 +197,6 @@ _ufi_test_unit_ready: ;source-doc/ufi-drv/class_ufi.c:35: memset(&ufi_cmd_request_test_unit_ready, 0, sizeof(ufi_test_unit_ready_command)); ld hl,0 add hl, sp - ld e,l - ld d,h ld b,0x06 l_ufi_test_unit_ready_00104: xor a @@ -215,7 +213,9 @@ l_ufi_test_unit_ready_00104: xor a push af inc sp - push de + ld hl,7 + add hl, sp + push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -226,26 +226,25 @@ l_ufi_test_unit_ready_00104: ;source-doc/ufi-drv/class_ufi.c:40: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,12 add hl, sp - ld e,l - ld d,h - push hl + ex de, hl ld bc,0x000c ld hl,__ufi_cmd_request_sense ldir - pop bc ;source-doc/ufi-drv/class_ufi.c:43: (uint8_t *)response, NULL); - ld e,(ix+6) - ld d,(ix+7) + ld c,(ix+6) + ld b,(ix+7) ;source-doc/ufi-drv/class_ufi.c:42: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), ld hl,0x0000 push hl - push de + push bc ld l,0x12 push hl xor a push af inc sp - push bc + ld hl,19 + add hl, sp + push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -269,25 +268,24 @@ _ufi_request_sense: ;source-doc/ufi-drv/class_ufi.c:51: ufi_cmd_request_sense = _ufi_cmd_request_sense; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl + ex de, hl ld bc,0x000c ld hl,__ufi_cmd_request_sense ldir - pop bc ;source-doc/ufi-drv/class_ufi.c:53: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), - ld e,(ix+6) - ld d,(ix+7) + ld c,(ix+6) + ld b,(ix+7) ld hl,0x0000 push hl - push de + push bc ld l,0x12 push hl xor a push af inc sp - push bc + ld hl,7 + add hl, sp + push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -340,29 +338,30 @@ _ufi_read_frmt_caps: pop af pop af inc sp - ld e, l + ld a, l pop bc + ld l, a ;source-doc/ufi-drv/class_ufi.c:69: CHECK(result); - ld a,e - ld l,a or a jr NZ,l_ufi_read_frmt_caps_00103 ;source-doc/ufi-drv/class_ufi.c:71: const uint8_t available_length = response->capacity_list_length; - ld e,(ix+6) - ld d,(ix+7) - ld hl,3 - add hl, de - ld e, (hl) + ld l,(ix+6) + ld h,(ix+7) + inc hl + inc hl + inc hl + ld a, (hl) ;source-doc/ufi-drv/class_ufi.c:73: const uint8_t max_length = - ld a,0x24 - sub e - jr NC,l_ufi_read_frmt_caps_00106 + cp 0x25 + jr C,l_ufi_read_frmt_caps_00106 ld e,0x24 + jr l_ufi_read_frmt_caps_00107 l_ufi_read_frmt_caps_00106: + ld e, a +l_ufi_read_frmt_caps_00107: ;source-doc/ufi-drv/class_ufi.c:77: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd)); push de push bc - ex de, hl ld hl,16 add hl, sp ex de, hl @@ -417,25 +416,24 @@ _ufi_inquiry: ;source-doc/ufi-drv/class_ufi.c:90: ufi_cmd_inquiry = _ufi_cmd_inquiry; ld hl,0 add hl, sp - ld e,l - ld d,h - push hl + ex de, hl ld bc,0x000c ld hl,__ufi_cmd_inquiry ldir - pop bc ;source-doc/ufi-drv/class_ufi.c:92: usb_error result = - ld e,(ix+6) - ld d,(ix+7) + ld c,(ix+6) + ld b,(ix+7) ld hl,0x0000 push hl - push de + push bc ld l,0x24 push hl xor a push af inc sp - push bc + ld hl,7 + add hl, sp + push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -459,8 +457,6 @@ _ufi_read_write_sector: ;source-doc/ufi-drv/class_ufi.c:107: memset(&cmd, 0, sizeof(cmd)); ld hl,0 add hl, sp - ld e,l - ld d,h ld b,0x06 l_ufi_read_write_sector_00113: xor a @@ -470,8 +466,6 @@ l_ufi_read_write_sector_00113: inc hl djnz l_ufi_read_write_sector_00113 ;source-doc/ufi-drv/class_ufi.c:108: cmd.operation_code = send ? 0x2A : 0x28; - ld c, e - ld b, d bit 0,(ix+6) jr Z,l_ufi_read_write_sector_00104 ld a,0x2a @@ -479,7 +473,7 @@ l_ufi_read_write_sector_00113: l_ufi_read_write_sector_00104: ld a,0x28 l_ufi_read_write_sector_00105: - ld (bc), a + ld (ix-12),a ;source-doc/ufi-drv/class_ufi.c:109: cmd.lba[2] = sector_number >> 8; ld a,(ix+8) ld (ix-8),a @@ -491,6 +485,7 @@ l_ufi_read_write_sector_00105: ld a,(ix+9) ld (ix-4),a add a, a + ld b, a ld c,0x00 ld l,(ix+12) ld h,(ix+13) @@ -498,12 +493,13 @@ l_ufi_read_write_sector_00105: ld l,(ix+10) ld h,(ix+11) push hl - ld b, a push bc ld a,(ix+6) push af inc sp - push de + ld hl,7 + add hl, sp + push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -527,7 +523,8 @@ _ufi_format: ;source-doc/ufi-drv/class_ufi.c:130: const ufi_format_capacity_descriptor *const format) { ld hl,2 add hl, sp - push hl + ld e,l + ld d,h ld b,0x06 l_ufi_format_00104: xor a @@ -536,16 +533,15 @@ l_ufi_format_00104: ld (hl), a inc hl djnz l_ufi_format_00104 - pop bc ;source-doc/ufi-drv/class_ufi.c:133: ufi_format_parameter_list parameter_list; - ld hl,14 + push de + ld hl,16 add hl, sp ex de, hl - push bc ld bc,0x000c ld hl,__ufi_cmd_format ldir - pop bc + pop de ;source-doc/ufi-drv/class_ufi.c:136: ufi_format_command cmd; ld a,(ix+7) ld (ix-10),a @@ -554,60 +550,68 @@ l_ufi_format_00104: ;source-doc/ufi-drv/class_ufi.c:138: // memcpy(&cmd, &_ufi_cmd_format, sizeof(cmd)); ld (ix-4),0x0c ;source-doc/ufi-drv/class_ufi.c:140: cmd.track_number = track_number; - ld e, c - ld d, b - inc de + ld c, e + ld b, d + inc bc ld a,(ix+6) and 0x01 ld l, a - ld a, (de) + ld a, (bc) and 0xfe or l - ld (de), a + ld (bc), a ;source-doc/ufi-drv/class_ufi.c:141: cmd.interleave[1] = 0; ld l, e ld h, d + inc hl res 1, (hl) ;source-doc/ufi-drv/class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); - ld l, e - ld h, d - ld a, (hl) + ld c, e + ld b, d + inc bc + ld a, (bc) and 0xf3 - ld (hl), a + ld (bc), a ;source-doc/ufi-drv/class_ufi.c:143: ld l, e ld h, d + inc hl set 4, (hl) ;source-doc/ufi-drv/class_ufi.c:144: parameter_list.defect_list_header.side = side; ld l, e ld h, d + inc hl set 5, (hl) ;source-doc/ufi-drv/class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; ld l, e ld h, d + inc hl res 6, (hl) ;source-doc/ufi-drv/class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; - ex de, hl + ld l, e + ld h, d + inc hl set 7, (hl) ;source-doc/ufi-drv/class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; ld (ix-22),0x00 ;source-doc/ufi-drv/class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; ld (ix-21),0x08 ;source-doc/ufi-drv/class_ufi.c:149: parameter_list.defect_list_header.extend = 0; - ld e,(ix+8) - ld d,(ix+9) - push bc - ld hl,8 - add hl, sp - ex de, hl + inc de + inc de + inc de + inc de + ld l,(ix+8) + ld h,(ix+9) ld bc,0x0008 ldir - pop bc ;source-doc/ufi-drv/class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; ld hl,0 add hl, sp push hl - push bc + ld hl,4 + add hl, sp + push hl ld hl,0x000c push hl ld a,0x01 @@ -639,13 +643,10 @@ _ufi_send_diagnostics: ;source-doc/ufi-drv/class_ufi.c:164: ld hl,0 add hl, sp - ld e,l - ld d,h - push hl + ex de, hl ld bc,0x000c ld hl,__ufi_cmd_send_diagnostic ldir - pop bc ;source-doc/ufi-drv/class_ufi.c:166: ufi_send_diagnostic_command ufi_cmd_send_diagnostic; ld hl,0x0000 push hl @@ -654,7 +655,9 @@ _ufi_send_diagnostics: ld a,0x01 push af inc sp - push bc + ld hl,7 + add hl, sp + push hl ld l,(ix+4) ld h,(ix+5) push hl @@ -678,28 +681,28 @@ _convert_from_msb_first: add hl, sp ex de, hl ;source-doc/ufi-drv/class_ufi.c:172: - ld c,(ix+4) - ld b,(ix+5) - inc bc - inc bc - inc bc + ld l,(ix+4) + ld h,(ix+5) + inc hl + inc hl + inc hl ;source-doc/ufi-drv/class_ufi.c:174: uint32_t result; - ld a, (bc) - dec bc + ld a, (hl) + dec hl ld (de), a inc de ;source-doc/ufi-drv/class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); - ld a, (bc) - dec bc + ld a, (hl) + dec hl ld (de), a inc de ;source-doc/ufi-drv/class_ufi.c:176: const uint8_t *p_input = buffer + 3; - ld a, (bc) + ld a, (hl) ld (de), a inc de ;source-doc/ufi-drv/class_ufi.c:177: - dec bc - ld a, (bc) + dec hl + ld a, (hl) ld (de), a ;source-doc/ufi-drv/class_ufi.c:179: *p_output++ = *p_input--; pop hl diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index f613d00f..fa74e62a 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -85,14 +85,16 @@ l_chufi_init_00105: ld h,0x00 push de call _print_uint16 +;source-doc/ufi-drv/ufi-init.c:25: print_string(":$"); ld hl,ufi_init_str_1 call _print_string pop de ;source-doc/ufi-drv/ufi-init.c:26: print_uint16(storage_count); - ld hl,(_storage_count) + ld hl, (_storage_count) ld h,0x00 push de call _print_uint16 +;source-doc/ufi-drv/ufi-init.c:27: print_string(" $"); ld hl,ufi_init_str_2 call _print_string pop de diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s index 79d7c299..0db067ee 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -4,7 +4,7 @@ ; ;-------------------------------------------------------- ; File Created by SDCC : free open source ISO C Compiler -; Version 4.4.0 #14648 (Linux) +; Version 4.5.0 #15248 (Linux) ;-------------------------------------------------------- ; Processed by Z88DK ;-------------------------------------------------------- @@ -72,7 +72,6 @@ _usb_execute_cbi: ;source-doc/ufi-drv/usb_cbi.c:20: adsc = cbi2_adsc; push de push bc - ex de, hl ld hl,4 add hl, sp ex de, hl @@ -216,7 +215,7 @@ l_usb_execute_cbi_00116: ;source-doc/ufi-drv/usb_cbi.c:66: critical_end(); call _critical_end ;source-doc/ufi-drv/usb_cbi.c:68: return result; - ld hl,(_result) + ld hl, (_result) ;source-doc/ufi-drv/usb_cbi.c:69: } ld sp, ix pop ix From ce0d04226e81295c73128978c8763483351aced3 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 27 Feb 2025 20:56:16 +1100 Subject: [PATCH 21/59] ch376-native: extended CHNATIVEFORCE option to wait upto approx 5 seconds for at least one connected device --- Source/HBIOS/ch376-native/Makefile | 1 + .../HBIOS/ch376-native/base-drv/usb-init.c.s | 96 +++++++++++---- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 111 +++++++++--------- .../source-doc/base-drv/usb-init.c | 19 ++- .../source-doc/base-drv/usb_state.c | 11 +- .../source-doc/base-drv/usb_state.h | 2 +- 6 files changed, 154 insertions(+), 86 deletions(-) diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index cd6f25b0..a0989a7e 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -46,6 +46,7 @@ clean: rm base-drv.s rm keyboard.s +.PRECIOUS: $(ASSDIR)%.c.asm $(ASSDIR)%.c.s: $(ASSDIR)%.c.asm @mkdir -p $(dir $@) echo "Converting $< to $@" diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 90f05110..ba928203 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -167,7 +167,7 @@ l__chnative_init_00110: ld hl,usb_init_str_4 call _print_string ;source-doc/base-drv/usb-init.c:55: return; - jr l__chnative_init_00118 + jp l__chnative_init_00127 l__chnative_init_00108: ;source-doc/base-drv/usb-init.c:58: print_string("\r\nCH376: PRESENT (VER $"); ld hl,usb_init_str_5 @@ -185,19 +185,19 @@ l__chnative_init_00111: call _print_string ;source-doc/base-drv/usb-init.c:66: usb_host_bus_reset(); call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 80 : 5); i++) { ld c,0x00 -l__chnative_init_00116: +l__chnative_init_00125: bit 0,(ix+4) - jr Z,l__chnative_init_00120 - ld b,0x0a - jr l__chnative_init_00121 -l__chnative_init_00120: + jr Z,l__chnative_init_00129 + ld b,0x50 + jr l__chnative_init_00130 +l__chnative_init_00129: ld b,0x05 -l__chnative_init_00121: +l__chnative_init_00130: ld a, c sub b - jr NC,l__chnative_init_00114 + jr NC,l__chnative_init_00121 ;source-doc/base-drv/usb-init.c:69: const uint8_t r = ch_very_short_wait_int_and_get_(); push bc call _ch_very_short_wait_int_and_get @@ -205,32 +205,72 @@ l__chnative_init_00121: pop bc ;source-doc/base-drv/usb-init.c:71: if (r == USB_INT_CONNECT) { sub 0x81 - jr NZ,l__chnative_init_00117 + jr NZ,l__chnative_init_00126 ;source-doc/base-drv/usb-init.c:72: print_string("USB: CONNECTED$"); ld hl,usb_init_str_7 call _print_string ;source-doc/base-drv/usb-init.c:74: enumerate_all_devices(); call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:76: USB_MODULE_LEDS = 0x03; +;source-doc/base-drv/usb-init.c:76: if (forced && count_of_devices() == 0) { + bit 0,(ix+4) + jr Z,l__chnative_init_00118 + call _count_of_devices + or a + jr NZ,l__chnative_init_00118 +;source-doc/base-drv/usb-init.c:77: print_string("\r\nUSB: SCANNING $"); + ld hl,usb_init_str_8 + call _print_string +;source-doc/base-drv/usb-init.c:79: for (i = 0; i < 10; i++) { + ld (ix-1),0x00 +l__chnative_init_00122: +;source-doc/base-drv/usb-init.c:80: print_string(".$"); + ld hl,usb_init_str_9 + call _print_string +;source-doc/base-drv/usb-init.c:81: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld hl,_x + ld (hl),0x00 + ld e, l + ld d, h + inc de + ld bc,0x0068 + ldir +;source-doc/base-drv/usb-init.c:82: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-init.c:84: delay_medium(); + call _delay_medium +;source-doc/base-drv/usb-init.c:85: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb-init.c:87: if (count_of_devices() > 0) + call _count_of_devices + or a + jr NZ,l__chnative_init_00118 +;source-doc/base-drv/usb-init.c:79: for (i = 0; i < 10; i++) { + inc (ix-1) + ld a,(ix-1) + sub 0x0a + jr C,l__chnative_init_00122 +;source-doc/base-drv/usb-init.c:92: connected: +l__chnative_init_00118: +;source-doc/base-drv/usb-init.c:93: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/usb-init.c:77: return; - jr l__chnative_init_00118 -l__chnative_init_00117: -;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { +;source-doc/base-drv/usb-init.c:94: return; + jr l__chnative_init_00127 +l__chnative_init_00126: +;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 80 : 5); i++) { inc c - jr l__chnative_init_00116 -l__chnative_init_00114: -;source-doc/base-drv/usb-init.c:81: USB_MODULE_LEDS = 0x00; + jr l__chnative_init_00125 +l__chnative_init_00121: +;source-doc/base-drv/usb-init.c:98: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/usb-init.c:82: print_string("USB: DISCONNECTED$"); - ld hl,usb_init_str_8 +;source-doc/base-drv/usb-init.c:99: print_string("USB: DISCONNECTED$"); + ld hl,usb_init_str_10 call _print_string -l__chnative_init_00118: -;source-doc/base-drv/usb-init.c:83: } +l__chnative_init_00127: +;source-doc/base-drv/usb-init.c:100: } inc sp pop ix ret @@ -268,9 +308,17 @@ usb_init_str_7: DEFM "USB: CONNECTED$" DEFB 0x00 usb_init_str_8: + DEFB 0x0d + DEFB 0x0a + DEFM "USB: SCANNING $" + DEFB 0x00 +usb_init_str_9: + DEFM ".$" + DEFB 0x00 +usb_init_str_10: DEFM "USB: DISCONNECTED$" DEFB 0x00 -;source-doc/base-drv/usb-init.c:85: void chnative_init_force(void) { _chnative_init(true); } +;source-doc/base-drv/usb-init.c:102: void chnative_init_force(void) { _chnative_init(true); } ; --------------------------------- ; Function chnative_init_force ; --------------------------------- @@ -281,7 +329,7 @@ _chnative_init_force: call __chnative_init inc sp ret -;source-doc/base-drv/usb-init.c:87: void chnative_init(void) { _chnative_init(false); } +;source-doc/base-drv/usb-init.c:104: void chnative_init(void) { _chnative_init(false); } ; --------------------------------- ; Function chnative_init ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index e494fb01..660e8572 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -48,45 +48,44 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) { +;source-doc/base-drv/usb_state.c:13: uint8_t count_of_devices(void) __sdcccall(1) { ; --------------------------------- -; Function find_device_config +; Function count_of_devices ; --------------------------------- -_find_device_config: - push ix - ld ix,0 - add ix,sp +_count_of_devices: ;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:16: const device_config *p_config = first_device_config(p); +;source-doc/base-drv/usb_state.c:18: const device_config *p_config = first_device_config(p); ld hl,_x call _first_device_config -;source-doc/base-drv/usb_state.c:17: while (p_config) { -l_find_device_config_00103: +;source-doc/base-drv/usb_state.c:19: while (p_config) { + ld c,0x00 +l_count_of_devices_00104: ld a, d or e - jr Z,l_find_device_config_00105 -;source-doc/base-drv/usb_state.c:18: const uint8_t type = p_config->type; + jr Z,l_count_of_devices_00106 +;source-doc/base-drv/usb_state.c:20: const uint8_t type = p_config->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/base-drv/usb_state.c:20: if (type == requested_type) - sub (ix+4) - jr NZ,l_find_device_config_00102 -;source-doc/base-drv/usb_state.c:21: return (device_config *)p_config; - ex de, hl - jr l_find_device_config_00106 -l_find_device_config_00102: -;source-doc/base-drv/usb_state.c:23: p_config = next_device_config(p, p_config); +;source-doc/base-drv/usb_state.c:22: if (type != USB_IS_HUB && type) + cp 0x0f + jr Z,l_count_of_devices_00102 + or a + jr Z,l_count_of_devices_00102 +;source-doc/base-drv/usb_state.c:23: count++; + inc c +l_count_of_devices_00102: +;source-doc/base-drv/usb_state.c:26: p_config = next_device_config(p, p_config); + push bc ld hl,_x call _next_device_config - jr l_find_device_config_00103 -l_find_device_config_00105: -;source-doc/base-drv/usb_state.c:26: return NULL; - ld hl,0x0000 -l_find_device_config_00106: -;source-doc/base-drv/usb_state.c:27: } - pop ix + pop bc + jr l_count_of_devices_00104 +l_count_of_devices_00106: +;source-doc/base-drv/usb_state.c:29: return count; + ld a, c +;source-doc/base-drv/usb_state.c:30: } ret _device_config_sizes: DEFB +0x00 @@ -96,41 +95,41 @@ _device_config_sizes: DEFB +0x06 DEFB 0x00 DEFB 0x00 -;source-doc/base-drv/usb_state.c:30: device_config *find_first_free(void) { +;source-doc/base-drv/usb_state.c:33: device_config *find_first_free(void) { ; --------------------------------- ; Function find_first_free ; --------------------------------- _find_first_free: -;source-doc/base-drv/usb_state.c:31: _usb_state *const boot_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:34: device_config *p = first_device_config(boot_state); +;source-doc/base-drv/usb_state.c:34: _usb_state *const boot_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:37: device_config *p = first_device_config(boot_state); ld hl,_x call _first_device_config -;source-doc/base-drv/usb_state.c:35: while (p) { +;source-doc/base-drv/usb_state.c:38: while (p) { l_find_first_free_00103: ld a, d or e jr Z,l_find_first_free_00105 -;source-doc/base-drv/usb_state.c:36: if (p->type == 0) +;source-doc/base-drv/usb_state.c:39: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_find_first_free_00102 -;source-doc/base-drv/usb_state.c:37: return p; +;source-doc/base-drv/usb_state.c:40: return p; ex de, hl jr l_find_first_free_00106 l_find_first_free_00102: -;source-doc/base-drv/usb_state.c:39: p = next_device_config(boot_state, p); +;source-doc/base-drv/usb_state.c:42: p = next_device_config(boot_state, p); ld hl,_x call _next_device_config jr l_find_first_free_00103 l_find_first_free_00105: -;source-doc/base-drv/usb_state.c:42: return NULL; +;source-doc/base-drv/usb_state.c:45: return NULL; ld hl,0x0000 l_find_first_free_00106: -;source-doc/base-drv/usb_state.c:43: } +;source-doc/base-drv/usb_state.c:46: } ret -;source-doc/base-drv/usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } +;source-doc/base-drv/usb_state.c:48: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } ; --------------------------------- ; Function first_device_config ; --------------------------------- @@ -139,24 +138,24 @@ _first_device_config: inc de inc de ret -;source-doc/base-drv/usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:50: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { ; --------------------------------- ; Function next_device_config ; --------------------------------- _next_device_config: ld c, l ld b, h -;source-doc/base-drv/usb_state.c:48: if (p->type == 0) +;source-doc/base-drv/usb_state.c:51: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_next_device_config_00102 -;source-doc/base-drv/usb_state.c:49: return NULL; +;source-doc/base-drv/usb_state.c:52: return NULL; ld de,0x0000 jr l_next_device_config_00105 l_next_device_config_00102: -;source-doc/base-drv/usb_state.c:51: const uint8_t size = device_config_sizes[p->type]; +;source-doc/base-drv/usb_state.c:54: const uint8_t size = device_config_sizes[p->type]; ld l, e ld h, d ld a, (hl) @@ -167,14 +166,14 @@ l_next_device_config_00102: adc a, +((_device_config_sizes) / 256) ld h, a ld a, (hl) -;source-doc/base-drv/usb_state.c:58: const uint8_t *_p = (uint8_t *)p; -;source-doc/base-drv/usb_state.c:59: device_config *const result = (device_config *)(_p + size); +;source-doc/base-drv/usb_state.c:61: const uint8_t *_p = (uint8_t *)p; +;source-doc/base-drv/usb_state.c:62: device_config *const result = (device_config *)(_p + size); add a, e ld e, a ld a,0x00 adc a, d ld d, a -;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end) +;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end) ld hl,0x0068 add hl, bc ld a, e @@ -182,20 +181,20 @@ l_next_device_config_00102: ld a, d sbc a, h ret C -;source-doc/base-drv/usb_state.c:62: return NULL; +;source-doc/base-drv/usb_state.c:65: return NULL; ld de,0x0000 -;source-doc/base-drv/usb_state.c:64: return result; +;source-doc/base-drv/usb_state.c:67: return result; l_next_device_config_00105: -;source-doc/base-drv/usb_state.c:65: } +;source-doc/base-drv/usb_state.c:68: } ret -;source-doc/base-drv/usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:71: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { ; --------------------------------- ; Function get_usb_device_config ; --------------------------------- _get_usb_device_config: ld c, a -;source-doc/base-drv/usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:72: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _first_device_config @@ -205,29 +204,29 @@ l_get_usb_device_config_00107: ld a, d or e jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) { +;source-doc/base-drv/usb_state.c:77: if (p->type != USB_NOT_SUPPORTED) { ld l, e ld h, d ld a, (hl) and 0x0f jr Z,l_get_usb_device_config_00108 -;source-doc/base-drv/usb_state.c:75: if (counter == device_index) +;source-doc/base-drv/usb_state.c:78: if (counter == device_index) ld a, c sub b -;source-doc/base-drv/usb_state.c:76: return p; +;source-doc/base-drv/usb_state.c:79: return p; jr Z,l_get_usb_device_config_00109 -;source-doc/base-drv/usb_state.c:77: counter++; +;source-doc/base-drv/usb_state.c:80: counter++; inc b l_get_usb_device_config_00108: -;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _next_device_config pop bc jr l_get_usb_device_config_00107 l_get_usb_device_config_00105: -;source-doc/base-drv/usb_state.c:81: return NULL; // is not a usb device +;source-doc/base-drv/usb_state.c:84: return NULL; // is not a usb device ld de,0x0000 l_get_usb_device_config_00109: -;source-doc/base-drv/usb_state.c:82: } +;source-doc/base-drv/usb_state.c:85: } ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c index fa7ba6f0..fb898799 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c @@ -65,7 +65,7 @@ void _chnative_init(bool forced) { usb_host_bus_reset(); - for (uint8_t i = 0; i < (forced ? 10 : 5); i++) { + for (uint8_t i = 0; i < (forced ? 80 : 5); i++) { const uint8_t r = ch_very_short_wait_int_and_get_status(); if (r == USB_INT_CONNECT) { @@ -73,6 +73,23 @@ void _chnative_init(bool forced) { enumerate_all_devices(); + if (forced && count_of_devices() == 0) { + print_string("\r\nUSB: SCANNING $"); + + for (i = 0; i < 10; i++) { + print_string(".$"); + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + usb_host_bus_reset(); + + delay_medium(); + enumerate_all_devices(); + + if (count_of_devices() > 0) + goto connected; + } + } + + connected: USB_MODULE_LEDS = 0x03; return; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index fe6709b9..ce6e460d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -10,20 +10,23 @@ const uint8_t device_config_sizes[_USB_LAST_DEVICE_TYPE] = { }; // always usb work area -device_config *find_device_config(const usb_device_type requested_type) { +uint8_t count_of_devices(void) __sdcccall(1) { _usb_state *const p = get_usb_work_area(); + uint8_t count = 0; + const device_config *p_config = first_device_config(p); while (p_config) { const uint8_t type = p_config->type; - if (type == requested_type) - return (device_config *)p_config; + if (type != USB_IS_HUB && type) + count++; + ; p_config = next_device_config(p, p_config); }; - return NULL; + return count; } // always search in boot diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h index 87821f27..d5246a1b 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h @@ -20,7 +20,7 @@ typedef struct __usb_state { extern device_config *find_first_free(void); extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1); extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1); -extern device_config *find_device_config(const usb_device_type requested_type); +extern uint8_t count_of_devices(void) __sdcccall(1); extern device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1); From 9c96e7c7a25807bd3da3b0bfa548fc2b224a8c6f Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 29 Mar 2025 18:52:34 +1100 Subject: [PATCH 22/59] ch376-native: fixed issue with TMSMODE_MSXUKY selected when no usb keyboard is present on boot The TMS driver would always install a USB keyboard pooling interrupt, despite no keyboard present This would load the CPU and prevent other I/O operations --- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 99 ++++++++++--------- .../source-doc/keyboard/kyb-init.c | 5 +- Source/HBIOS/ch376kyb.asm | 6 +- 3 files changed, 59 insertions(+), 51 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index e7fed9b8..8bcaa66e 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -62,7 +62,7 @@ _report: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:12: void keyboard_init(void) { +;source-doc/keyboard/kyb-init.c:12: uint8_t keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- @@ -118,7 +118,8 @@ l_keyboard_init_00105: inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb-init.c:32: return; +;source-doc/keyboard/kyb-init.c:32: return 1; + ld a,0x01 jr l_keyboard_init_00108 l_keyboard_init_00106: ;source-doc/keyboard/kyb-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1); @@ -130,9 +131,11 @@ l_keyboard_init_00106: l_keyboard_init_00107: ;source-doc/keyboard/kyb-init.c:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 - jp _print_string + call _print_string +;source-doc/keyboard/kyb-init.c:37: return 0; + xor a l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:37: } +;source-doc/keyboard/kyb-init.c:38: } ret kyb_init_str_0: DEFB 0x0d @@ -147,7 +150,7 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:50: +;source-doc/keyboard/kyb-init.c:51: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- @@ -155,42 +158,42 @@ _keyboard_buf_put: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb-init.c:51: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { +;source-doc/keyboard/kyb-init.c:52: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { ld a,(ix+5) sub 0x80 jr NC,l_keyboard_buf_put_00112 ld a,(ix+5) or a -;source-doc/keyboard/kyb-init.c:52: if (key_code >= 0x80 || key_code == 0) -;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it +;source-doc/keyboard/kyb-init.c:53: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it jr Z,l_keyboard_buf_put_00112 ld c,0x00 l_keyboard_buf_put_00110: ld a, c sub 0x06 jr NC,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:56: for (uint8_t i = 0; i < 6; i++) +;source-doc/keyboard/kyb-init.c:57: for (uint8_t i = 0; i < 6; i++) ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a, (hl) sub (ix+5) -;source-doc/keyboard/kyb-init.c:57: if (previous_keyCodes[i] == key_code) +;source-doc/keyboard/kyb-init.c:58: if (previous_keyCodes[i] == key_code) jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it +;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it inc c jr l_keyboard_buf_put_00110 l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:59: +;source-doc/keyboard/kyb-init.c:60: ld a, (_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:60: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb-init.c:61: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) sub c jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:61: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb-init.c:62: if (next_write_index != read_index) { // Check if buffer is not full ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 @@ -198,7 +201,7 @@ l_keyboard_buf_put_00106: add hl, de ld a,(ix+4) ld (hl), a -;source-doc/keyboard/kyb-init.c:62: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:63: buffer[write_index].modifier_keys = modifier_keys; ld hl, (_write_index) ld h,0x00 add hl, hl @@ -206,39 +209,39 @@ l_keyboard_buf_put_00106: inc hl ld a,(ix+5) ld (hl), a -;source-doc/keyboard/kyb-init.c:63: buffer[write_index].key_code = key_code; +;source-doc/keyboard/kyb-init.c:64: buffer[write_index].key_code = key_code; ld hl,_write_index ld (hl), c l_keyboard_buf_put_00112: -;source-doc/keyboard/kyb-init.c:65: } +;source-doc/keyboard/kyb-init.c:66: } pop ix ret -;source-doc/keyboard/kyb-init.c:67: +;source-doc/keyboard/kyb-init.c:68: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:68: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:69: uint8_t keyboard_buf_size() __sdcccall(1) { ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:69: if (write_index >= read_index) +;source-doc/keyboard/kyb-init.c:70: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:71: +;source-doc/keyboard/kyb-init.c:72: ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:72: return KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb-init.c:73: return KEYBOARD_BUFFER_SIZE - read_index + write_index; ret -;source-doc/keyboard/kyb-init.c:74: +;source-doc/keyboard/kyb-init.c:75: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -248,53 +251,53 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:75: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:76: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:76: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:77: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, h ld d, h jr l_keyboard_buf_get_next_00105 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:78: +;source-doc/keyboard/kyb-init.c:79: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 add hl, hl add hl, bc ld b, (hl) -;source-doc/keyboard/kyb-init.c:79: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:80: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:80: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:81: const uint8_t key_code = buffer[read_index].key_code; ld a, (_read_index) inc a and 0x07 ld (_read_index),a -;source-doc/keyboard/kyb-init.c:82: +;source-doc/keyboard/kyb-init.c:83: ld a, c sub 0x39 jr NZ,l_keyboard_buf_get_next_00104 -;source-doc/keyboard/kyb-init.c:83: if (key_code == KEY_CODE_CAPS_LOCK) { +;source-doc/keyboard/kyb-init.c:84: if (key_code == KEY_CODE_CAPS_LOCK) { ld hl,_caps_lock_engaged ld a, (hl) xor 0x01 ld (hl), a -;source-doc/keyboard/kyb-init.c:84: caps_lock_engaged = !caps_lock_engaged; +;source-doc/keyboard/kyb-init.c:85: caps_lock_engaged = !caps_lock_engaged; call _keyboard_buf_get_next jr l_keyboard_buf_get_next_00105 l_keyboard_buf_get_next_00104: -;source-doc/keyboard/kyb-init.c:87: +;source-doc/keyboard/kyb-init.c:88: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:89: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:90: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -311,32 +314,32 @@ l_keyboard_buf_get_next_00104: pop hl push hl l_keyboard_buf_get_next_00105: -;source-doc/keyboard/kyb-init.c:90: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:91: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:92: +;source-doc/keyboard/kyb-init.c:93: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:93: void keyboard_buf_flush() { -;source-doc/keyboard/kyb-init.c:94: write_index = 0; +;source-doc/keyboard/kyb-init.c:94: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:95: write_index = 0; xor a ld (_write_index),a ld (_read_index),a -;source-doc/keyboard/kyb-init.c:95: read_index = 0; +;source-doc/keyboard/kyb-init.c:96: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:101: +;source-doc/keyboard/kyb-init.c:102: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:102: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:103: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:103: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:104: if (is_in_critical_section()) jr NZ,l_keyboard_tick_00111 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b @@ -349,7 +352,7 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:106: ch_configure_nak_retry_disable(); +;source-doc/keyboard/kyb-init.c:107: ch_configure_nak_retry_disable(); ld bc,_report ld hl, (_keyboard_config) ld a,0x08 @@ -374,10 +377,10 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:108: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:109: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) -;source-doc/keyboard/kyb-init.c:109: if (result == 0) +;source-doc/keyboard/kyb-init.c:110: if (result == 0) or a jr NZ,l_keyboard_tick_00111 ld c,a @@ -385,7 +388,7 @@ l_keyboard_tick_00109: ld a, c sub 0x06 ret NC -;source-doc/keyboard/kyb-init.c:110: for (uint8_t i = 0; i < 6; i++) { +;source-doc/keyboard/kyb-init.c:111: for (uint8_t i = 0; i < 6; i++) { ld a,+((_report+2) & 0xFF) add a, c ld e, a @@ -404,17 +407,17 @@ l_keyboard_tick_00109: pop af pop de pop bc -;source-doc/keyboard/kyb-init.c:111: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); +;source-doc/keyboard/kyb-init.c:112: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a, (de) ld (hl), a -;source-doc/keyboard/kyb-init.c:109: if (result == 0) +;source-doc/keyboard/kyb-init.c:110: if (result == 0) inc c jr l_keyboard_tick_00109 l_keyboard_tick_00111: -;source-doc/keyboard/kyb-init.c:113: } +;source-doc/keyboard/kyb-init.c:114: } ret _keyboard_config: DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index e0b1e59a..aba62ac5 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -9,7 +9,7 @@ static device_config_keyboard *keyboard_config = 0; extern bool caps_lock_engaged; -void keyboard_init(void) { +uint8_t keyboard_init(void) __sdcccall(1) { uint8_t index = 1; keyboard_config = NULL; @@ -29,11 +29,12 @@ void keyboard_init(void) { hid_set_protocol(keyboard_config, 1); hid_set_idle(keyboard_config, 0x80); - return; + return 1; } } while (++index != MAX_NUMBER_OF_DEVICES + 1); print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); + return 0; } #define KEYBOARD_BUFFER_SIZE 8 diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b6f3af6c..ac971673 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -38,6 +38,10 @@ SCAN_INT_PERIOD: .EQU 2 UKY_INTSTK: ; 128 bytes for keyboard interrupt stack - need ~52 bytes??? CHUKB_INIT: + CALL _keyboard_init + OR A + RET Z + ; INSTALL INTERRUPT HANDLER LD HL, (VEC_TICK+1) LD (VEC_CHUKB_TICK+1), HL @@ -45,7 +49,7 @@ CHUKB_INIT: LD HL, CHUKB_TICK LD (VEC_TICK+1), HL - JP _keyboard_init + RET CHUKB_TICK: LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. From 60cf40f0b86e773200fecae6e8131864abc7460c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 29 Mar 2025 18:53:57 +1100 Subject: [PATCH 23/59] ez80: EZ80_MEM_MIN_WS adjusted from 0 to 1 --- Source/HBIOS/cfg_RCEZ80.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index 1b6f006a..20a512a9 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -414,7 +414,7 @@ EZ80IOBASE .SET $FF ; EZ80 I/O BASE ADDRESS FOR EXTERNAL IO EZ80_MEM_CYCLES .SET 2 ; MEMORY BUS CYCLES (1-15) TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CYCLES EZ80_MEM_MIN_NS .SET 100 ; CALCULATE AT BOOT TIME THE REQUIRED W/S OR B/C, IF EZ80_WSMD_TYP = EZ80WSMD_CALC EZ80_MEM_WS .SET 5 ; MEMORY WAIT STATES (0-7) TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_WAIT -EZ80_MEM_MIN_WS .SET 0 ; MINIMUM WAIT STATES TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CALC +EZ80_MEM_MIN_WS .SET 1 ; MINIMUM WAIT STATES TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CALC ; ; BUS TIMING FOR EXTERNAL I/O ACCESS (CS2) EZ80_IO_CYCLES .SET 4 ; IO BUS CYCLES (1-15) TO APPLY, IF EZ80_WSMD_TYP = EZ80WSMD_CYCLES From b98c506baf41367c335d79fb618981c654da6ae7 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 5 Apr 2025 14:49:14 +1100 Subject: [PATCH 24/59] ch376-native: reduce some of the hardcoded delay for i/o operations --- Source/HBIOS/ch376.asm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm index 5374a471..1739ef22 100644 --- a/Source/HBIOS/ch376.asm +++ b/Source/HBIOS/ch376.asm @@ -18,12 +18,6 @@ _delay: push af call DELAY call DELAY - call DELAY - call DELAY - call DELAY - call DELAY - call DELAY - call DELAY pop af ret From 2b1d703c4e3a35e60c644d5c6bdfbb1c8b6155af Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 5 Apr 2025 19:20:31 +1100 Subject: [PATCH 25/59] ch376-native: further reduce some of the hardcoded delay for i/o operations --- Source/HBIOS/ch376.asm | 1 - 1 file changed, 1 deletion(-) diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm index 1739ef22..125d1322 100644 --- a/Source/HBIOS/ch376.asm +++ b/Source/HBIOS/ch376.asm @@ -17,7 +17,6 @@ _print_hex: _delay: push af call DELAY - call DELAY pop af ret From 62d5a7b825d119d138660116a07bb599a630ffe7 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 12 Apr 2025 16:49:41 +1000 Subject: [PATCH 26/59] ch376-native: leds default to off and on during activity --- Source/HBIOS/ch376-native/base-drv/ch376.c.s | 27 +++++++++---------- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 19 ++++++------- .../ch376-native/source-doc/base-drv/ch376.c | 14 +++++----- .../source-doc/base-drv/usb-init.c | 10 +++---- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 0277a1e8..bec3ed6c 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -530,10 +530,9 @@ l_ch_data_in_transfer_00107: pop bc ;source-doc/base-drv/ch376.c:172: if (count == 0) { ld a, e +;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00; or a jr NZ,l_ch_data_in_transfer_00106 -;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x03; - ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; @@ -563,8 +562,8 @@ l_ch_data_in_transfer_00148: xor 0x80 l_ch_data_in_transfer_00149: jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:182: return USB_ERR_OK; @@ -572,8 +571,8 @@ l_ch_data_in_transfer_00149: jr l_ch_data_in_transfer_00111 ;source-doc/base-drv/ch376.c:184: done: l_ch_data_in_transfer_00110: -;source-doc/base-drv/ch376.c:185: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/ch376.c:185: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:186: return result; @@ -623,8 +622,8 @@ _ch_data_in_transfer_n: ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:207: return USB_ERR_OK; @@ -632,8 +631,8 @@ _ch_data_in_transfer_n: jr l_ch_data_in_transfer_n_00104 ;source-doc/base-drv/ch376.c:208: done: l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:210: return result; @@ -740,8 +739,8 @@ l_ch_data_out_transfer_00110: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:232: return USB_ERR_OK; @@ -749,8 +748,8 @@ l_ch_data_out_transfer_00105: jr l_ch_data_out_transfer_00107 ;source-doc/base-drv/ch376.c:234: done: l_ch_data_out_transfer_00106: -;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/ch376.c:236: return result; diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index ba928203..909ce1fb 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -100,8 +100,8 @@ __chnative_init: inc de ld bc,0x0068 ldir -;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x00; - ld a,0x00 +;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/usb-init.c:30: ch_cmd_reset_all(); @@ -158,9 +158,10 @@ l__chnative_init_00110: ;source-doc/base-drv/usb-init.c:52: if (!ch_probe()) { call _ch_probe ld a, l -;source-doc/base-drv/usb-init.c:53: USB_MODULE_LEDS = 0x00; or a jr NZ,l__chnative_init_00108 +;source-doc/base-drv/usb-init.c:53: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/usb-init.c:54: print_string("\r\nCH376: NOT PRESENT$"); @@ -173,8 +174,8 @@ l__chnative_init_00108: ld hl,usb_init_str_5 call _print_string l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:61: USB_MODULE_LEDS = 0x01; - ld a,0x01 +;source-doc/base-drv/usb-init.c:61: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/usb-init.c:63: print_hex(ch_cmd_get_ic_version()); @@ -251,8 +252,8 @@ l__chnative_init_00122: jr C,l__chnative_init_00122 ;source-doc/base-drv/usb-init.c:92: connected: l__chnative_init_00118: -;source-doc/base-drv/usb-init.c:93: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/usb-init.c:93: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/usb-init.c:94: return; @@ -262,8 +263,8 @@ l__chnative_init_00126: inc c jr l__chnative_init_00125 l__chnative_init_00121: -;source-doc/base-drv/usb-init.c:98: USB_MODULE_LEDS = 0x00; - ld a,0x00 +;source-doc/base-drv/usb-init.c:98: USB_MODULE_LEDS = 0x03; + ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/usb-init.c:99: print_string("USB: DISCONNECTED$"); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index c26a70d3..33c5264e 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -170,7 +170,7 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par count = ch_read_data(buffer); if (count == 0) { - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return USB_ERR_DATA_ERROR; } @@ -178,11 +178,11 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par buffer_size -= count; } while (buffer_size > 0); - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return USB_ERR_OK; done: - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return result; } @@ -202,11 +202,11 @@ usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size *buffer_size = count; - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return USB_ERR_OK; done: - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return result; } @@ -228,11 +228,11 @@ usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, end endpoint->toggle = !endpoint->toggle; } - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return USB_ERR_OK; done: - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c index fb898799..6f67636d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c @@ -25,7 +25,7 @@ static usb_error usb_host_bus_reset(void) { void _chnative_init(bool forced) { memset(get_usb_work_area(), 0, sizeof(_usb_state)); - USB_MODULE_LEDS = 0x00; + USB_MODULE_LEDS = 0x03; ch_cmd_reset_all(); @@ -50,7 +50,7 @@ void _chnative_init(bool forced) { print_string("\bPRESENT (VER $"); } else { if (!ch_probe()) { - USB_MODULE_LEDS = 0x00; + USB_MODULE_LEDS = 0x03; print_string("\r\nCH376: NOT PRESENT$"); return; } @@ -58,7 +58,7 @@ void _chnative_init(bool forced) { print_string("\r\nCH376: PRESENT (VER $"); } - USB_MODULE_LEDS = 0x01; + USB_MODULE_LEDS = 0x00; print_hex(ch_cmd_get_ic_version()); print_string("); $"); @@ -90,12 +90,12 @@ void _chnative_init(bool forced) { } connected: - USB_MODULE_LEDS = 0x03; + USB_MODULE_LEDS = 0x00; return; } } - USB_MODULE_LEDS = 0x00; + USB_MODULE_LEDS = 0x03; print_string("USB: DISCONNECTED$"); } From 3f6fc215e9b641802605f73d0f63cdb15ffbad66 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 12 Apr 2025 20:42:29 +1000 Subject: [PATCH 27/59] ch376-native: UKY_READ fixed issue with incorrect H value when no characters in buffer --- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 54 +++++++------------ .../source-doc/keyboard/kyb-init.c | 15 ++++-- Source/HBIOS/ch376kyb.asm | 3 +- 3 files changed, 31 insertions(+), 41 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 8bcaa66e..0c1f1012 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -258,9 +258,9 @@ _keyboard_buf_get_next: jr NZ,l_keyboard_buf_get_next_00102 ;source-doc/keyboard/kyb-init.c:77: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 - ld e, h - ld d, h - jr l_keyboard_buf_get_next_00105 + ld e, l + ld d, l + jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: ;source-doc/keyboard/kyb-init.c:79: ld bc,_buffer+0 @@ -277,27 +277,14 @@ l_keyboard_buf_get_next_00102: inc a and 0x07 ld (_read_index),a -;source-doc/keyboard/kyb-init.c:83: - ld a, c - sub 0x39 - jr NZ,l_keyboard_buf_get_next_00104 -;source-doc/keyboard/kyb-init.c:84: if (key_code == KEY_CODE_CAPS_LOCK) { - ld hl,_caps_lock_engaged - ld a, (hl) - xor 0x01 - ld (hl), a -;source-doc/keyboard/kyb-init.c:85: caps_lock_engaged = !caps_lock_engaged; - call _keyboard_buf_get_next - jr l_keyboard_buf_get_next_00105 -l_keyboard_buf_get_next_00104: -;source-doc/keyboard/kyb-init.c:88: +;source-doc/keyboard/kyb-init.c:93: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:90: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:95: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -313,33 +300,33 @@ l_keyboard_buf_get_next_00104: ld (ix-1),a pop hl push hl -l_keyboard_buf_get_next_00105: -;source-doc/keyboard/kyb-init.c:91: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +l_keyboard_buf_get_next_00103: +;source-doc/keyboard/kyb-init.c:96: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:93: +;source-doc/keyboard/kyb-init.c:98: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:94: void keyboard_buf_flush() { -;source-doc/keyboard/kyb-init.c:95: write_index = 0; +;source-doc/keyboard/kyb-init.c:99: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:100: write_index = 0; xor a ld (_write_index),a ld (_read_index),a -;source-doc/keyboard/kyb-init.c:96: read_index = 0; +;source-doc/keyboard/kyb-init.c:101: read_index = 0; ret -;source-doc/keyboard/kyb-init.c:102: +;source-doc/keyboard/kyb-init.c:107: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:103: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:108: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:104: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:109: if (is_in_critical_section()) jr NZ,l_keyboard_tick_00111 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b @@ -352,7 +339,6 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:107: ch_configure_nak_retry_disable(); ld bc,_report ld hl, (_keyboard_config) ld a,0x08 @@ -377,10 +363,10 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:109: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:114: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) -;source-doc/keyboard/kyb-init.c:110: if (result == 0) +;source-doc/keyboard/kyb-init.c:115: if (result == 0) or a jr NZ,l_keyboard_tick_00111 ld c,a @@ -388,7 +374,7 @@ l_keyboard_tick_00109: ld a, c sub 0x06 ret NC -;source-doc/keyboard/kyb-init.c:111: for (uint8_t i = 0; i < 6; i++) { +;source-doc/keyboard/kyb-init.c:116: for (uint8_t i = 0; i < 6; i++) { ld a,+((_report+2) & 0xFF) add a, c ld e, a @@ -407,17 +393,17 @@ l_keyboard_tick_00109: pop af pop de pop bc -;source-doc/keyboard/kyb-init.c:112: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); +;source-doc/keyboard/kyb-init.c:117: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); ld b,0x00 ld hl,_previous_keyCodes add hl, bc ld a, (de) ld (hl), a -;source-doc/keyboard/kyb-init.c:110: if (result == 0) +;source-doc/keyboard/kyb-init.c:115: if (result == 0) inc c jr l_keyboard_tick_00109 l_keyboard_tick_00111: -;source-doc/keyboard/kyb-init.c:114: } +;source-doc/keyboard/kyb-init.c:119: } ret _keyboard_config: DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index aba62ac5..9b566097 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -75,16 +75,21 @@ uint8_t keyboard_buf_size() __sdcccall(1) { uint32_t keyboard_buf_get_next() { if (write_index == read_index) // Check if buffer is empty - return 255 << 8; + return 0x0000FF00; // H = -1, D, E, L = 0 const uint8_t modifier_key = buffer[read_index].modifier_keys; const uint8_t key_code = buffer[read_index].key_code; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - if (key_code == KEY_CODE_CAPS_LOCK) { - caps_lock_engaged = !caps_lock_engaged; - return keyboard_buf_get_next(); - } + //D: Modifier keys - aka Keystate + //E: ASCII Code + //H: 0 + //L: KeyCode aka scan code + + // if (key_code == KEY_CODE_CAPS_LOCK) { + // caps_lock_engaged = !caps_lock_engaged; + // return keyboard_buf_get_next(); + // } const unsigned char c = scancode_to_char(modifier_key, key_code); /* D = modifier, e-> char, H = 0, L=>code */ diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index ac971673..f65397ea 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -153,7 +153,6 @@ UKY_READ: LD A, H OR A JR NZ, UKY_READ - LD C, 0 - LD D, 0 + LD C, L XOR A RET From 7e9c08993d0f9b1e944045bcc20f2c968530e17c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 13 Apr 2025 17:21:56 +1000 Subject: [PATCH 28/59] ch376-native: UKY_STAT extended to also return current USB key report --- Source/HBIOS/ansi.asm | 2 +- Source/HBIOS/ch376kyb.asm | 55 ++++++++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/Source/HBIOS/ansi.asm b/Source/HBIOS/ansi.asm index 8ca7e7f5..3bd77be0 100644 --- a/Source/HBIOS/ansi.asm +++ b/Source/HBIOS/ansi.asm @@ -1554,4 +1554,4 @@ ANSI_DEVNUM .DB $FF ; TERMINAL DEVICE NUMBER ; E Light Cyan ; F Bright White ;============================================================= -; \ No newline at end of file +; diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index f65397ea..b7059445 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -52,7 +52,7 @@ CHUKB_INIT: RET CHUKB_TICK: - LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. + LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS. UKY_SCNCNT .EQU $ - 1 DEC A LD (UKY_SCNCNT), A @@ -84,23 +84,46 @@ VEC_CHUKB_TICK: ; ; Outputs: ; A: Status / Codes Pending +; A': Current Modifier Key State +; B, C, D, E, H, L: Up to 6 active key codes ; -; Return a count of the number of key Codes Pending (A) in the keyboard buffer. -; If it is not possible to determine the actual number in the buffer, it is -; acceptable to return 1 to indicate there are key codes available to read and +; Return a count of the number of key Codes Pending (A) in the keyboard buffer. +; If it is not possible to determine the actual number in the buffer, it is +; acceptable to return 1 to indicate there are key codes available to read and ; 0 if there are none available. -; The value returned in register A is used as both a Status (A) code and the -; return value. Negative values (bit 7 set) indicate a standard HBIOS result -; (error) code. Otherwise, the return value represents the number of key codes +; The value returned in register A is used as both a Status (A) code and the +; return value. Negative values (bit 7 set) indicate a standard HBIOS result +; (error) code. Otherwise, the return value represents the number of key codes ; pending. ; +; USB Extension +; Returns the most current USB Key Report +; (See https://wiki.osdev.org/USB_Human_Interface_Devices). +; The report indicates the current keyboard state, irrespective of the +; character queue. +; The A' register contains the current modifier key state +; The B, C, D, E, H, L contain the 0 to 6 USB scancodes. +; UKY_STAT: - JP _keyboard_buf_size + HB_DI + call _keyboard_buf_size + HB_EI + ld iy, _report + ex af, af' + ld a, (iy) + ex af, af' + ld b, (iy+2) + ld c, (iy+3) + ld d, (iy+4) + ld e, (iy+5) + ld h, (iy+6) + ld l, (iy+7) + ret ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) ; ; Inputs: -; C: Video Unit +; None ; ; Outputs: ; A: standard HBIOS result code @@ -108,7 +131,9 @@ UKY_STAT: ; Purged and all contents discarded. The Status (A) is a standard HBIOS result code. ; UKY_FLUSH: + HB_DI CALL _keyboard_buf_flush + HB_EI XOR A RET ; @@ -124,16 +149,16 @@ UKY_FLUSH: ; E: Keycode ; ; Read the next key data from the keyboard. If a buffer is used, return the next key code in the buffer. -; If no key data is available, this function will wait indefinitely for a keypress. The Status (A) is a +; If no key data is available, this function will wait indefinitely for a key press. The Status (A) is a ; standard HBIOS result code. ; -; The Scancode (C) value is the raw scancode from the keyboard for the keypress. Scancodes are from -; the PS/2 scancode set 2 standard. +; The Scancode (C) value is the raw scan code from the keyboard for the key press. Scan codes are standard +; usb scan codes ; -; The Keystate (D) is a bitmap representing the value of all modifier keys and shift states as they +; The Keystate (D) is a bitmap representing the value of all modifier keys and shift states as they ; existed at the time of the keystroke. The bitmap is defined as: ; -; Bit Keystate Indication +; Bit Key state Indication ; 7 Key pressed was from the num pad ; 6 Caps Lock was active ; 5 Num Lock was active @@ -143,7 +168,7 @@ UKY_FLUSH: ; 1 Control key was held down ; 0 Shift key was held down ; -; The Keycode (E) is generally returned as appropriate ASCII values, if possible. Special keys, like +; The Keycode (E) is generally returned as appropriate ASCII values, if possible. Special keys, like ; function keys and arrows, are returned as reserved codes as described at the start of this section. ; UKY_READ: From 22c26dba3611f43388a9cd90562f28078877ab6f Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 16 Apr 2025 09:55:27 +1000 Subject: [PATCH 29/59] ch376-native: UKY_STATE: usb extension returns a 'buffered' hid report (upto 8) --- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 466 +++++++++++++----- .../source-doc/convert-for-uz80as.sh | 2 + .../source-doc/keyboard/class_hid_keyboard.h | 2 +- .../source-doc/keyboard/kyb-init.c | 129 +++-- Source/HBIOS/ch376kyb.asm | 45 +- 5 files changed, 458 insertions(+), 186 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 0c1f1012..528450d8 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -41,12 +41,18 @@ _write_index: DEFS 1 _read_index: DEFS 1 -_previous_keyCodes: - DEFS 6 -_active: +_alt_write_index: DEFS 1 +_alt_read_index: + DEFS 1 +_reports: + DEFS 64 +_queued_report: + DEFS 2 _report: DEFS 8 +_previous: + DEFS 8 #ENDIF @@ -62,80 +68,80 @@ _report: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:12: uint8_t keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:30: ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:14: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:31: uint8_t keyboard_init(void) __sdcccall(1) { ld c,0x01 -;source-doc/keyboard/kyb-init.c:15: keyboard_config = NULL; +;source-doc/keyboard/kyb-init.c:32: uint8_t index = 1; ld hl,0x0000 ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:17: do { +;source-doc/keyboard/kyb-init.c:34: ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:18: keyboard_config = (device_config_keyboard *)get_usb_device_config(index); +;source-doc/keyboard/kyb-init.c:35: do { push bc ld a, b call _get_usb_device_config ex de, hl pop bc ld (_keyboard_config), hl -;source-doc/keyboard/kyb-init.c:20: if (keyboard_config == NULL) +;source-doc/keyboard/kyb-init.c:37: ld hl,(_keyboard_config) ld a,h or l jr Z,l_keyboard_init_00107 -;source-doc/keyboard/kyb-init.c:23: const usb_device_type t = keyboard_config->type; +;source-doc/keyboard/kyb-init.c:40: ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/kyb-init.c:25: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/kyb-init.c:42: sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:26: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:43: if (t == USB_IS_KEYBOARD) { push bc ld hl,kyb_init_str_0 call _print_string pop bc -;source-doc/keyboard/kyb-init.c:27: print_uint16(index); +;source-doc/keyboard/kyb-init.c:44: print_string("\r\nUSB: KEYBOARD @ $"); ld h,0x00 ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:28: print_string(" $"); +;source-doc/keyboard/kyb-init.c:45: print_uint16(index); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:30: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb-init.c:47: ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:31: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:48: hid_set_protocol(keyboard_config, 1); ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb-init.c:32: return 1; +;source-doc/keyboard/kyb-init.c:49: hid_set_idle(keyboard_config, 0x80); ld a,0x01 jr l_keyboard_init_00108 l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/keyboard/kyb-init.c:51: } inc b ld a,b ld c,b sub 0x07 jr NZ,l_keyboard_init_00105 l_keyboard_init_00107: -;source-doc/keyboard/kyb-init.c:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:53: ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:37: return 0; +;source-doc/keyboard/kyb-init.c:54: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); xor a l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:38: } +;source-doc/keyboard/kyb-init.c:55: return 0; ret kyb_init_str_0: DEFB 0x0d @@ -150,98 +156,206 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:51: +;source-doc/keyboard/kyb-init.c:57: +; --------------------------------- +; Function report_diff +; --------------------------------- +_report_diff: +;source-doc/keyboard/kyb-init.c:58: static uint8_t report_diff() __sdcccall(1) { + ld de,_report+0 +;source-doc/keyboard/kyb-init.c:59: uint8_t *a = (uint8_t *)&report; +;source-doc/keyboard/kyb-init.c:62: uint8_t i = sizeof(report); + ld b,0x08 + ld hl,_previous +l_report_diff_00103: +;source-doc/keyboard/kyb-init.c:63: do { + ld a, (de) + inc de + ld c, (hl) + inc hl + sub c + jr Z,l_report_diff_00104 +;source-doc/keyboard/kyb-init.c:64: if (*a++ != *b++) + ld a,0x01 + jr l_report_diff_00106 +l_report_diff_00104: +;source-doc/keyboard/kyb-init.c:65: return true; + djnz l_report_diff_00103 +;source-doc/keyboard/kyb-init.c:67: + xor a +l_report_diff_00106: +;source-doc/keyboard/kyb-init.c:68: return false; + ret +;source-doc/keyboard/kyb-init.c:70: +; --------------------------------- +; Function report_put +; --------------------------------- +_report_put: +;source-doc/keyboard/kyb-init.c:71: static void report_put() { + ld a, (_alt_write_index) + inc a + and 0x07 + ld c, a +;source-doc/keyboard/kyb-init.c:73: + ld a,(_alt_read_index) + sub c + ret Z +;source-doc/keyboard/kyb-init.c:74: if (next_write_index != alt_read_index) { // Check if buffer is not full + ld de,_reports+0 + ld hl, (_alt_write_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + add hl, de + ex de, hl + push bc + ld bc,0x0008 + ld hl,_report + ldir + pop bc +;source-doc/keyboard/kyb-init.c:75: reports[alt_write_index] = report; + ld hl,_alt_write_index + ld (hl), c +;source-doc/keyboard/kyb-init.c:77: } + ret +;source-doc/keyboard/kyb-init.c:79: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: - push ix - ld ix,0 - add ix,sp -;source-doc/keyboard/kyb-init.c:52: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { - ld a,(ix+5) - sub 0x80 - jr NC,l_keyboard_buf_put_00112 - ld a,(ix+5) + ld c, a +;source-doc/keyboard/kyb-init.c:80: static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { + ld a,l + ld e,l + cp 0x80 + jr NC,l_keyboard_buf_put_00111 or a -;source-doc/keyboard/kyb-init.c:53: if (key_code >= 0x80 || key_code == 0) -;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it - jr Z,l_keyboard_buf_put_00112 - ld c,0x00 -l_keyboard_buf_put_00110: - ld a, c - sub 0x06 - jr NC,l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:57: for (uint8_t i = 0; i < 6; i++) - ld b,0x00 - ld hl,_previous_keyCodes - add hl, bc - ld a, (hl) - sub (ix+5) -;source-doc/keyboard/kyb-init.c:58: if (previous_keyCodes[i] == key_code) - jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:56: // if already reported, just skip it - inc c - jr l_keyboard_buf_put_00110 +;source-doc/keyboard/kyb-init.c:81: if (key_code >= 0x80 || key_code == 0) + jr Z,l_keyboard_buf_put_00111 +;source-doc/keyboard/kyb-init.c:85: uint8_t i = 6; +;source-doc/keyboard/kyb-init.c:86: uint8_t *a = previous.keyCode; + ld b,0x06 + ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:60: +;source-doc/keyboard/kyb-init.c:87: do { + ld a, (hl) + inc hl + sub e +;source-doc/keyboard/kyb-init.c:88: if (*a++ == key_code) + ret Z +;source-doc/keyboard/kyb-init.c:89: return; + djnz l_keyboard_buf_put_00106 +;source-doc/keyboard/kyb-init.c:91: ld a, (_write_index) inc a and 0x07 - ld c, a -;source-doc/keyboard/kyb-init.c:61: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld d, a +;source-doc/keyboard/kyb-init.c:92: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) - sub c - jr Z,l_keyboard_buf_put_00112 -;source-doc/keyboard/kyb-init.c:62: if (next_write_index != read_index) { // Check if buffer is not full - ld de,_buffer+0 + sub d + ret Z +;source-doc/keyboard/kyb-init.c:93: if (next_write_index != read_index) { // Check if buffer is not full ld hl, (_write_index) ld h,0x00 add hl, hl - add hl, de - ld a,(ix+4) - ld (hl), a -;source-doc/keyboard/kyb-init.c:63: buffer[write_index].modifier_keys = modifier_keys; + ld a,+((_buffer) & 0xFF) + add a,l + ld l,a + ld a,+((_buffer) / 256) + adc a,h + ld h,a + ld (hl), c +;source-doc/keyboard/kyb-init.c:94: buffer[write_index].modifier_keys = modifier_keys; ld hl, (_write_index) ld h,0x00 add hl, hl - add hl, de + ld bc,_buffer + add hl, bc inc hl - ld a,(ix+5) - ld (hl), a -;source-doc/keyboard/kyb-init.c:64: buffer[write_index].key_code = key_code; + ld (hl), e +;source-doc/keyboard/kyb-init.c:95: buffer[write_index].key_code = key_code; ld hl,_write_index - ld (hl), c -l_keyboard_buf_put_00112: -;source-doc/keyboard/kyb-init.c:66: } - pop ix + ld (hl), d +l_keyboard_buf_put_00111: +;source-doc/keyboard/kyb-init.c:97: } ret -;source-doc/keyboard/kyb-init.c:68: +;source-doc/keyboard/kyb-init.c:99: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:69: uint8_t keyboard_buf_size() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:103: + ld a,(_alt_write_index) + ld hl,_alt_read_index + sub (hl) + jr C,l_keyboard_buf_size_00102 +;source-doc/keyboard/kyb-init.c:104: if (alt_write_index >= alt_read_index) + ld a,(_alt_write_index) + ld hl,_alt_read_index + sub (hl) + ld d, a + jr l_keyboard_buf_size_00103 +l_keyboard_buf_size_00102: +;source-doc/keyboard/kyb-init.c:106: else + ld hl, (_alt_read_index) + ld a,0x08 + sub l + ld hl, (_alt_write_index) + add a, l + ld d, a +l_keyboard_buf_size_00103: +;source-doc/keyboard/kyb-init.c:108: + ld a, d + or a + jr NZ,l_keyboard_buf_size_00105 +;source-doc/keyboard/kyb-init.c:109: if (alt_size == 0) + ld hl,0x0000 + ld (_queued_report),hl + jr l_keyboard_buf_size_00106 +l_keyboard_buf_size_00105: +;source-doc/keyboard/kyb-init.c:111: else { + ld hl, (_alt_read_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + ld bc,_reports + add hl, bc + ld (_queued_report), hl +;source-doc/keyboard/kyb-init.c:112: queued_report = &reports[alt_read_index]; + ld a, (_alt_read_index) + inc a + and 0x07 + ld (_alt_read_index),a +l_keyboard_buf_size_00106: +;source-doc/keyboard/kyb-init.c:115: ld a,(_write_index) ld hl,_read_index sub (hl) - jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:70: if (write_index >= read_index) + jr C,l_keyboard_buf_size_00108 +;source-doc/keyboard/kyb-init.c:116: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) - jr l_keyboard_buf_size_00103 -l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:72: + ld e, a + jr l_keyboard_buf_size_00109 +l_keyboard_buf_size_00108: +;source-doc/keyboard/kyb-init.c:118: else ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l -l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:73: return KEYBOARD_BUFFER_SIZE - read_index + write_index; + ld e, a +l_keyboard_buf_size_00109: +;source-doc/keyboard/kyb-init.c:120: + xor a + xor a + ex de, hl +;source-doc/keyboard/kyb-init.c:121: return (uint16_t)alt_size << 8 | (uint16_t)size; ret -;source-doc/keyboard/kyb-init.c:75: +;source-doc/keyboard/kyb-init.c:123: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -251,40 +365,40 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:76: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:124: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:77: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:125: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, l ld d, l jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:79: +;source-doc/keyboard/kyb-init.c:127: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 add hl, hl add hl, bc ld b, (hl) -;source-doc/keyboard/kyb-init.c:80: const uint8_t modifier_key = buffer[read_index].modifier_keys; +;source-doc/keyboard/kyb-init.c:128: const uint8_t modifier_key = buffer[read_index].modifier_keys; inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:81: const uint8_t key_code = buffer[read_index].key_code; +;source-doc/keyboard/kyb-init.c:129: const uint8_t key_code = buffer[read_index].key_code; ld a, (_read_index) inc a and 0x07 ld (_read_index),a -;source-doc/keyboard/kyb-init.c:93: +;source-doc/keyboard/kyb-init.c:136: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:95: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:138: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -301,33 +415,51 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:96: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:139: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:98: +;source-doc/keyboard/kyb-init.c:141: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:99: void keyboard_buf_flush() { -;source-doc/keyboard/kyb-init.c:100: write_index = 0; +;source-doc/keyboard/kyb-init.c:142: void keyboard_buf_flush() { + xor a + ld (_alt_read_index),a + ld (_alt_write_index),a xor a - ld (_write_index),a ld (_read_index),a -;source-doc/keyboard/kyb-init.c:101: read_index = 0; + ld (_write_index),a +;source-doc/keyboard/kyb-init.c:145: uint8_t i = sizeof(previous); + ld de,_previous+0 +;source-doc/keyboard/kyb-init.c:146: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb-init.c:147: uint8_t *b = (uint8_t *)report; + ld b,0x08 + ld hl,_report +l_keyboard_buf_flush_00101: +;source-doc/keyboard/kyb-init.c:148: do { + xor a + ld (de), a + inc de +;source-doc/keyboard/kyb-init.c:149: *a++ = 0; + ld (hl),0x00 + inc hl +;source-doc/keyboard/kyb-init.c:150: *b++ = 0; + djnz l_keyboard_buf_flush_00101 +;source-doc/keyboard/kyb-init.c:151: } while (--i != 0); ret -;source-doc/keyboard/kyb-init.c:107: +;source-doc/keyboard/kyb-init.c:153: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:108: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:154: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:109: if (is_in_critical_section()) - jr NZ,l_keyboard_tick_00111 +;source-doc/keyboard/kyb-init.c:155: if (is_in_critical_section()) + jr NZ,l_keyboard_tick_00112 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b call _ch_command @@ -339,7 +471,8 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a - ld bc,_report +;source-doc/keyboard/kyb-init.c:158: ch_configure_nak_retry_disable(); + ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 push af @@ -363,47 +496,41 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:114: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:160: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) -;source-doc/keyboard/kyb-init.c:115: if (result == 0) or a - jr NZ,l_keyboard_tick_00111 - ld c,a -l_keyboard_tick_00109: - ld a, c - sub 0x06 - ret NC -;source-doc/keyboard/kyb-init.c:116: for (uint8_t i = 0; i < 6; i++) { - ld a,+((_report+2) & 0xFF) - add a, c - ld e, a - ld a,+((_report+2) / 256) - adc a,0x00 - ld d, a - ld a, (de) - ld hl,_report - ld b, (hl) - push bc - push de - ld c,b - ld b,a + jr NZ,l_keyboard_tick_00112 +;source-doc/keyboard/kyb-init.c:161: if (result == 0) { + call _report_diff + or a + jr Z,l_keyboard_tick_00112 +;source-doc/keyboard/kyb-init.c:162: if (report_diff()) { + call _report_put +;source-doc/keyboard/kyb-init.c:164: uint8_t i = 6; + ld b,0x06 +l_keyboard_tick_00103: +;source-doc/keyboard/kyb-init.c:165: do { + ld l, b + dec l + ld h,0x00 + ld de, +(_report + 2) + add hl, de + ld c, (hl) + ld a,(_report) push bc + ld l, c call _keyboard_buf_put - pop af - pop de pop bc -;source-doc/keyboard/kyb-init.c:117: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); - ld b,0x00 - ld hl,_previous_keyCodes - add hl, bc - ld a, (de) - ld (hl), a -;source-doc/keyboard/kyb-init.c:115: if (result == 0) - inc c - jr l_keyboard_tick_00109 -l_keyboard_tick_00111: -;source-doc/keyboard/kyb-init.c:119: } +;source-doc/keyboard/kyb-init.c:166: keyboard_buf_put(report.bModifierKeys, report.keyCode[i-1]); + djnz l_keyboard_tick_00103 +;source-doc/keyboard/kyb-init.c:167: } while (--i != 0); + ld de,_previous + ld bc,0x0008 + ld hl,_report + ldir +l_keyboard_tick_00112: +;source-doc/keyboard/kyb-init.c:170: } ret _keyboard_config: DEFW +0x0000 @@ -428,15 +555,77 @@ _write_index: DEFB +0x00 _read_index: DEFB +0x00 -_previous_keyCodes: +_alt_write_index: + DEFB +0x00 +_alt_read_index: + DEFB +0x00 +_reports: + DEFB +0x00 DEFB +0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 -_active: - DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_queued_report: + DEFW +0x0000 _report: DEFB +0x00 DEFB +0x00 @@ -446,3 +635,12 @@ _report: DEFB 0x00 DEFB 0x00 DEFB 0x00 +_previous: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh index 3403b826..5bcd0523 100755 --- a/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh +++ b/Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh @@ -35,6 +35,8 @@ sed -E \ -e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \ -e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \ -e 's/\s+and\s+a,(0x[0-9A-Fa-f]{2})/\tand\t\1/g' \ + -e 's/\s+and\s+a,\s*a/\tand\ta/g' \ + -e 's/\s+and\s+a,\s*(b|c|d|e|h|l|iyl|iyh|ixl|ixh)/\tand\t\1/g' \ -e 's/\s+sub\s+a,(0x[0-9A-Fa-f]{2})/\tsub\t\1/g' \ -e 's/\s+cp\s+a,\s*a/\tcp\ta/g' \ -e 's/\s+or\s+a,\s*a/\tor\ta/g' \ diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h index 8d179f4f..1edf527f 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h @@ -7,7 +7,7 @@ typedef struct { uint8_t bModifierKeys; uint8_t bReserved; uint8_t keyCode[6]; -} keyboard_report; +} keyboard_report_t; #define KEY_MOD_LCTRL 0x01 #define KEY_MOD_LSHIFT 0x02 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index 9b566097..a2005fa6 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -4,13 +4,31 @@ #include #include #include +#include #include +#define KEYBOARD_BUFFER_SIZE 8 +#define KEYBOARD_BUFFER_SIZE_MASK 7 +typedef struct { + uint8_t modifier_keys; + uint8_t key_code; +} keyboard_event; + static device_config_keyboard *keyboard_config = 0; -extern bool caps_lock_engaged; -uint8_t keyboard_init(void) __sdcccall(1) { +static keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; +static uint8_t write_index = 0; +static uint8_t read_index = 0; + +static uint8_t alt_write_index = 0; +static uint8_t alt_read_index = 0; +static keyboard_report_t reports[KEYBOARD_BUFFER_SIZE] = {{0}}; +static keyboard_report_t *queued_report = NULL; +static keyboard_report_t report = {0}; +static keyboard_report_t previous = {0}; + +uint8_t keyboard_init(void) __sdcccall(1) { uint8_t index = 1; keyboard_config = NULL; @@ -37,26 +55,39 @@ uint8_t keyboard_init(void) __sdcccall(1) { return 0; } -#define KEYBOARD_BUFFER_SIZE 8 -#define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef struct { - uint8_t modifier_keys; - uint8_t key_code; -} keyboard_event; -keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; -uint8_t write_index = 0; -uint8_t read_index = 0; +static uint8_t report_diff() __sdcccall(1) { + uint8_t *a = (uint8_t *)&report; + uint8_t *b = (uint8_t *)&previous; -uint8_t previous_keyCodes[6] = {0}; + uint8_t i = sizeof(report); + do { + if (*a++ != *b++) + return true; + } while (--i != 0); -void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { + return false; +} + +static void report_put() { + uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + if (next_write_index != alt_read_index) { // Check if buffer is not full + reports[alt_write_index] = report; + alt_write_index = next_write_index; + } +} + +static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { if (key_code >= 0x80 || key_code == 0) return; // ignore ??? // if already reported, just skip it - for (uint8_t i = 0; i < 6; i++) - if (previous_keyCodes[i] == key_code) + uint8_t i = 6; + uint8_t *a = previous.keyCode; + do { + if (*a++ == key_code) return; + } while (--i != 0); uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (next_write_index != read_index) { // Check if buffer is not full @@ -66,30 +97,42 @@ void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { } } -uint8_t keyboard_buf_size() __sdcccall(1) { +uint16_t keyboard_buf_size() { + uint8_t size; + uint8_t alt_size; + + if (alt_write_index >= alt_read_index) + alt_size = alt_write_index - alt_read_index; + else + alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; + + if (alt_size == 0) + queued_report = NULL; + else { + queued_report = &reports[alt_read_index]; + alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + } + if (write_index >= read_index) - return write_index - read_index; + size = write_index - read_index; + else + size = KEYBOARD_BUFFER_SIZE - read_index + write_index; - return KEYBOARD_BUFFER_SIZE - read_index + write_index; + return (uint16_t)alt_size << 8 | (uint16_t)size; } uint32_t keyboard_buf_get_next() { if (write_index == read_index) // Check if buffer is empty - return 0x0000FF00; // H = -1, D, E, L = 0 + return 0x0000FF00; // H = -1, D, E, L = 0 const uint8_t modifier_key = buffer[read_index].modifier_keys; const uint8_t key_code = buffer[read_index].key_code; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - //D: Modifier keys - aka Keystate - //E: ASCII Code - //H: 0 - //L: KeyCode aka scan code - - // if (key_code == KEY_CODE_CAPS_LOCK) { - // caps_lock_engaged = !caps_lock_engaged; - // return keyboard_buf_get_next(); - // } + // D: Modifier keys - aka Keystate + // E: ASCII Code + // H: 0 + // L: KeyCode aka scan code const unsigned char c = scancode_to_char(modifier_key, key_code); /* D = modifier, e-> char, H = 0, L=>code */ @@ -97,24 +140,32 @@ uint32_t keyboard_buf_get_next() { } void keyboard_buf_flush() { - write_index = 0; - read_index = 0; -} + write_index = read_index = alt_write_index = alt_read_index = 0; -uint8_t active = 0; - -keyboard_report report = {0}; + uint8_t i = sizeof(previous); + uint8_t *a = (uint8_t *)previous; + uint8_t *b = (uint8_t *)report; + do { + *a++ = 0; + *b++ = 0; + } while (--i != 0); +} void keyboard_tick(void) { if (is_in_critical_section()) return; ch_configure_nak_retry_disable(); - result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); + result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); ch_configure_nak_retry_3s(); - if (result == 0) - for (uint8_t i = 0; i < 6; i++) { - keyboard_buf_put(report.bModifierKeys, report.keyCode[i]); - previous_keyCodes[i] = report.keyCode[i]; + if (result == 0) { + if (report_diff()) { + report_put(); + uint8_t i = 6; + do { + keyboard_buf_put(report.bModifierKeys, report.keyCode[i - 1]); + } while (--i != 0); + previous = report; } + } } diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b7059445..82b08ba6 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -84,8 +84,9 @@ VEC_CHUKB_TICK: ; ; Outputs: ; A: Status / Codes Pending -; A': Current Modifier Key State -; B, C, D, E, H, L: Up to 6 active key codes +; B: Number of buffered usb reports +; A': USB Report Modifier Key State (valid if B > 0) +; B', C', D', E', H', L': USB Report's 6 key codes (valid only if B > 0) ; ; Return a count of the number of key Codes Pending (A) in the keyboard buffer. ; If it is not possible to determine the actual number in the buffer, it is @@ -96,28 +97,48 @@ VEC_CHUKB_TICK: ; (error) code. Otherwise, the return value represents the number of key codes ; pending. ; -; USB Extension -; Returns the most current USB Key Report -; (See https://wiki.osdev.org/USB_Human_Interface_Devices). -; The report indicates the current keyboard state, irrespective of the -; character queue. -; The A' register contains the current modifier key state -; The B, C, D, E, H, L contain the 0 to 6 USB scancodes. -; +; USB Keyboard Extension: +; Returns the current USB HID keyboard report data. +; Register B contains the number of buffered reports available: +; B = 0: No reports available +; B > 0: At least one report available (will be consumed after reading) +; When a report is available (B > 0): +; A': Contains modifier key states +; B',C',D',E',H',L': Contains up to 6 concurrent key codes +; See USB HID Usage Tables specification for key codes + UKY_STAT: HB_DI call _keyboard_buf_size HB_EI - ld iy, _report + ld a, l + ld b, h ex af, af' + ld a, b + or a + jr z, no_queued_reports + ld iy, (_queued_report) ld a, (iy) ex af, af' + exx ld b, (iy+2) ld c, (iy+3) ld d, (iy+4) ld e, (iy+5) ld h, (iy+6) ld l, (iy+7) + exx + ret + +no_queued_reports: + ex af, af' + exx + ld bc, 0 + ld d, b + ld e, b + ld l, b + ld h, b + exx ret ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) @@ -169,7 +190,7 @@ UKY_FLUSH: ; 0 Shift key was held down ; ; The Keycode (E) is generally returned as appropriate ASCII values, if possible. Special keys, like -; function keys and arrows, are returned as reserved codes as described at the start of this section. +; function keys and arrows, are returned as reserved codes. ; UKY_READ: HB_DI From 9abba42df7d3703fb3b51239d5bc501c577c7d9d Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 16 Apr 2025 15:52:57 +1000 Subject: [PATCH 30/59] ch376-native: keyboard int handler optimisations --- Dockerfile | 2 +- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 259 ++++++++---------- .../source-doc/keyboard/kyb-init.c | 31 +-- Source/HBIOS/ch376kyb.asm | 16 +- 4 files changed, 146 insertions(+), 162 deletions(-) diff --git a/Dockerfile b/Dockerfile index 86317c2f..da6c902b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,7 @@ FROM ubuntu:jammy-20240111 AS basebuilder # cd Tools && make # cd Source && make # at least once to build many common units -# cd Source && make rom ROM_PLATFORM=RCZ80 ROM_CONFIG=std +# cd Source && make rom ROM_PLATFORM=RCEZ80 ROM_CONFIG=std # when finish, type 'exit' to return to back to your standard terminal session diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 528450d8..db2be91a 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -68,80 +68,80 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:30: +;source-doc/keyboard/kyb-init.c:27: ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:31: uint8_t keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:28: uint8_t keyboard_init(void) __sdcccall(1) { ld c,0x01 -;source-doc/keyboard/kyb-init.c:32: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:29: uint8_t index = 1; ld hl,0x0000 ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:34: +;source-doc/keyboard/kyb-init.c:31: ld b,0x01 l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:35: do { +;source-doc/keyboard/kyb-init.c:32: do { push bc ld a, b call _get_usb_device_config ex de, hl pop bc ld (_keyboard_config), hl -;source-doc/keyboard/kyb-init.c:37: +;source-doc/keyboard/kyb-init.c:34: ld hl,(_keyboard_config) ld a,h or l jr Z,l_keyboard_init_00107 -;source-doc/keyboard/kyb-init.c:40: +;source-doc/keyboard/kyb-init.c:37: ld hl, (_keyboard_config) ld a, (hl) and 0x0f -;source-doc/keyboard/kyb-init.c:42: +;source-doc/keyboard/kyb-init.c:39: sub 0x04 jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:43: if (t == USB_IS_KEYBOARD) { +;source-doc/keyboard/kyb-init.c:40: if (t == USB_IS_KEYBOARD) { push bc ld hl,kyb_init_str_0 call _print_string pop bc -;source-doc/keyboard/kyb-init.c:44: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:41: print_string("\r\nUSB: KEYBOARD @ $"); ld h,0x00 ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:45: print_uint16(index); +;source-doc/keyboard/kyb-init.c:42: print_uint16(index); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:47: +;source-doc/keyboard/kyb-init.c:44: ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:48: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb-init.c:45: hid_set_protocol(keyboard_config, 1); ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb-init.c:49: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:46: hid_set_idle(keyboard_config, 0x80); ld a,0x01 jr l_keyboard_init_00108 l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:51: } +;source-doc/keyboard/kyb-init.c:48: } inc b ld a,b ld c,b sub 0x07 jr NZ,l_keyboard_init_00105 l_keyboard_init_00107: -;source-doc/keyboard/kyb-init.c:53: +;source-doc/keyboard/kyb-init.c:50: ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:54: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:51: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); xor a l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:55: return 0; +;source-doc/keyboard/kyb-init.c:52: return 0; ret kyb_init_str_0: DEFB 0x0d @@ -156,51 +156,51 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:57: +;source-doc/keyboard/kyb-init.c:54: ; --------------------------------- ; Function report_diff ; --------------------------------- _report_diff: -;source-doc/keyboard/kyb-init.c:58: static uint8_t report_diff() __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:55: static uint8_t report_diff() __sdcccall(1) { ld de,_report+0 -;source-doc/keyboard/kyb-init.c:59: uint8_t *a = (uint8_t *)&report; -;source-doc/keyboard/kyb-init.c:62: uint8_t i = sizeof(report); +;source-doc/keyboard/kyb-init.c:56: uint8_t *a = (uint8_t *)&report; +;source-doc/keyboard/kyb-init.c:59: uint8_t i = sizeof(report); ld b,0x08 ld hl,_previous l_report_diff_00103: -;source-doc/keyboard/kyb-init.c:63: do { +;source-doc/keyboard/kyb-init.c:60: do { ld a, (de) inc de ld c, (hl) inc hl sub c jr Z,l_report_diff_00104 -;source-doc/keyboard/kyb-init.c:64: if (*a++ != *b++) +;source-doc/keyboard/kyb-init.c:61: if (*a++ != *b++) ld a,0x01 jr l_report_diff_00106 l_report_diff_00104: -;source-doc/keyboard/kyb-init.c:65: return true; +;source-doc/keyboard/kyb-init.c:62: return true; djnz l_report_diff_00103 -;source-doc/keyboard/kyb-init.c:67: +;source-doc/keyboard/kyb-init.c:64: xor a l_report_diff_00106: -;source-doc/keyboard/kyb-init.c:68: return false; +;source-doc/keyboard/kyb-init.c:65: return false; ret -;source-doc/keyboard/kyb-init.c:70: +;source-doc/keyboard/kyb-init.c:67: ; --------------------------------- ; Function report_put ; --------------------------------- _report_put: -;source-doc/keyboard/kyb-init.c:71: static void report_put() { +;source-doc/keyboard/kyb-init.c:68: static void report_put() { ld a, (_alt_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb-init.c:73: +;source-doc/keyboard/kyb-init.c:70: ld a,(_alt_read_index) sub c ret Z -;source-doc/keyboard/kyb-init.c:74: if (next_write_index != alt_read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb-init.c:71: if (next_write_index != alt_read_index) { // Check if buffer is not full ld de,_reports+0 ld hl, (_alt_write_index) ld h,0x00 @@ -214,90 +214,90 @@ _report_put: ld hl,_report ldir pop bc -;source-doc/keyboard/kyb-init.c:75: reports[alt_write_index] = report; +;source-doc/keyboard/kyb-init.c:72: reports[alt_write_index] = report; ld hl,_alt_write_index ld (hl), c -;source-doc/keyboard/kyb-init.c:77: } +;source-doc/keyboard/kyb-init.c:74: } ret -;source-doc/keyboard/kyb-init.c:79: +;source-doc/keyboard/kyb-init.c:76: ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: ld c, a -;source-doc/keyboard/kyb-init.c:80: static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { - ld a,l - ld e,l +;source-doc/keyboard/kyb-init.c:77: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { + ld b,0x00 + ld hl,+(_report + 2) + add hl, bc +;source-doc/keyboard/kyb-init.c:78: const uint8_t key_code = report.keyCode[indx]; + ld a,(hl) + ld c,a cp 0x80 jr NC,l_keyboard_buf_put_00111 or a -;source-doc/keyboard/kyb-init.c:81: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb-init.c:79: if (key_code >= 0x80 || key_code == 0) jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb-init.c:85: uint8_t i = 6; -;source-doc/keyboard/kyb-init.c:86: uint8_t *a = previous.keyCode; +;source-doc/keyboard/kyb-init.c:83: uint8_t i = 6; +;source-doc/keyboard/kyb-init.c:84: uint8_t *a = previous.keyCode; ld b,0x06 ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:87: do { +;source-doc/keyboard/kyb-init.c:85: do { ld a, (hl) inc hl - sub e -;source-doc/keyboard/kyb-init.c:88: if (*a++ == key_code) + sub c +;source-doc/keyboard/kyb-init.c:86: if (*a++ == key_code) ret Z -;source-doc/keyboard/kyb-init.c:89: return; +;source-doc/keyboard/kyb-init.c:87: return; djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:91: +;source-doc/keyboard/kyb-init.c:89: ld a, (_write_index) inc a and 0x07 - ld d, a -;source-doc/keyboard/kyb-init.c:92: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld b, a +;source-doc/keyboard/kyb-init.c:90: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_read_index) - sub d + sub b ret Z -;source-doc/keyboard/kyb-init.c:93: if (next_write_index != read_index) { // Check if buffer is not full - ld hl, (_write_index) - ld h,0x00 - add hl, hl - ld a,+((_buffer) & 0xFF) - add a,l - ld l,a - ld a,+((_buffer) / 256) - adc a,h - ld h,a - ld (hl), c -;source-doc/keyboard/kyb-init.c:94: buffer[write_index].modifier_keys = modifier_keys; +;source-doc/keyboard/kyb-init.c:91: if (next_write_index != read_index) { // Check if buffer is not full + ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 add hl, hl - ld bc,_buffer - add hl, bc - inc hl - ld (hl), e -;source-doc/keyboard/kyb-init.c:95: buffer[write_index].key_code = key_code; + add hl, de + ex de, hl + ld hl,(_report) + xor a + xor a + ld a, c + ld (de), a + inc de + ld a, l + ld (de), a +;source-doc/keyboard/kyb-init.c:92: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; ld hl,_write_index - ld (hl), d + ld (hl), b l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb-init.c:97: } +;source-doc/keyboard/kyb-init.c:94: } ret -;source-doc/keyboard/kyb-init.c:99: +;source-doc/keyboard/kyb-init.c:96: ; --------------------------------- ; Function keyboard_buf_size ; --------------------------------- _keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:103: +;source-doc/keyboard/kyb-init.c:100: ld a,(_alt_write_index) ld hl,_alt_read_index sub (hl) jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:104: if (alt_write_index >= alt_read_index) +;source-doc/keyboard/kyb-init.c:101: if (alt_write_index >= alt_read_index) ld a,(_alt_write_index) ld hl,_alt_read_index sub (hl) ld d, a jr l_keyboard_buf_size_00103 l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:106: else +;source-doc/keyboard/kyb-init.c:103: else ld hl, (_alt_read_index) ld a,0x08 sub l @@ -305,57 +305,43 @@ l_keyboard_buf_size_00102: add a, l ld d, a l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:108: +;source-doc/keyboard/kyb-init.c:105: ld a, d or a - jr NZ,l_keyboard_buf_size_00105 -;source-doc/keyboard/kyb-init.c:109: if (alt_size == 0) - ld hl,0x0000 - ld (_queued_report),hl - jr l_keyboard_buf_size_00106 -l_keyboard_buf_size_00105: -;source-doc/keyboard/kyb-init.c:111: else { - ld hl, (_alt_read_index) - ld h,0x00 - add hl, hl - add hl, hl - add hl, hl - ld bc,_reports - add hl, bc - ld (_queued_report), hl -;source-doc/keyboard/kyb-init.c:112: queued_report = &reports[alt_read_index]; + jr Z,l_keyboard_buf_size_00105 +;source-doc/keyboard/kyb-init.c:106: if (alt_size != 0) ld a, (_alt_read_index) inc a and 0x07 ld (_alt_read_index),a -l_keyboard_buf_size_00106: -;source-doc/keyboard/kyb-init.c:115: +l_keyboard_buf_size_00105: +;source-doc/keyboard/kyb-init.c:108: ld a,(_write_index) ld hl,_read_index sub (hl) - jr C,l_keyboard_buf_size_00108 -;source-doc/keyboard/kyb-init.c:116: if (write_index >= read_index) + jr C,l_keyboard_buf_size_00107 +;source-doc/keyboard/kyb-init.c:109: if (write_index >= read_index) ld a,(_write_index) ld hl,_read_index sub (hl) ld e, a - jr l_keyboard_buf_size_00109 -l_keyboard_buf_size_00108: -;source-doc/keyboard/kyb-init.c:118: else + jr l_keyboard_buf_size_00108 +l_keyboard_buf_size_00107: +;source-doc/keyboard/kyb-init.c:111: else ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l ld e, a -l_keyboard_buf_size_00109: -;source-doc/keyboard/kyb-init.c:120: +l_keyboard_buf_size_00108: +;source-doc/keyboard/kyb-init.c:113: xor a xor a ex de, hl -;source-doc/keyboard/kyb-init.c:121: return (uint16_t)alt_size << 8 | (uint16_t)size; +;source-doc/keyboard/kyb-init.c:114: return (uint16_t)alt_size << 8 | (uint16_t)size; ret -;source-doc/keyboard/kyb-init.c:123: +;source-doc/keyboard/kyb-init.c:116: ; --------------------------------- ; Function keyboard_buf_get_next ; --------------------------------- @@ -365,40 +351,40 @@ _keyboard_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb-init.c:124: uint32_t keyboard_buf_get_next() { +;source-doc/keyboard/kyb-init.c:117: uint32_t keyboard_buf_get_next() { ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:125: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb-init.c:118: if (write_index == read_index) // Check if buffer is empty ld hl,0xff00 ld e, l ld d, l jr l_keyboard_buf_get_next_00103 l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:127: +;source-doc/keyboard/kyb-init.c:120: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 add hl, hl add hl, bc - ld b, (hl) -;source-doc/keyboard/kyb-init.c:128: const uint8_t modifier_key = buffer[read_index].modifier_keys; - inc hl ld c, (hl) -;source-doc/keyboard/kyb-init.c:129: const uint8_t key_code = buffer[read_index].key_code; + inc hl + ld b, (hl) +;source-doc/keyboard/kyb-init.c:121: const uint8_t modifier_key = buffer[read_index] >> 8; +;source-doc/keyboard/kyb-init.c:122: const uint8_t key_code = buffer[read_index] & 255; ld a, (_read_index) inc a and 0x07 ld (_read_index),a -;source-doc/keyboard/kyb-init.c:136: +;source-doc/keyboard/kyb-init.c:129: push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb-init.c:138: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb-init.c:131: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -415,50 +401,50 @@ l_keyboard_buf_get_next_00102: pop hl push hl l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:139: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb-init.c:132: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; ld sp, ix pop ix ret -;source-doc/keyboard/kyb-init.c:141: +;source-doc/keyboard/kyb-init.c:134: ; --------------------------------- ; Function keyboard_buf_flush ; --------------------------------- _keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:142: void keyboard_buf_flush() { +;source-doc/keyboard/kyb-init.c:135: void keyboard_buf_flush() { xor a ld (_alt_read_index),a ld (_alt_write_index),a xor a ld (_read_index),a ld (_write_index),a -;source-doc/keyboard/kyb-init.c:145: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb-init.c:138: uint8_t i = sizeof(previous); ld de,_previous+0 -;source-doc/keyboard/kyb-init.c:146: uint8_t *a = (uint8_t *)previous; -;source-doc/keyboard/kyb-init.c:147: uint8_t *b = (uint8_t *)report; +;source-doc/keyboard/kyb-init.c:139: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb-init.c:140: uint8_t *b = (uint8_t *)report; ld b,0x08 ld hl,_report l_keyboard_buf_flush_00101: -;source-doc/keyboard/kyb-init.c:148: do { +;source-doc/keyboard/kyb-init.c:141: do { xor a ld (de), a inc de -;source-doc/keyboard/kyb-init.c:149: *a++ = 0; +;source-doc/keyboard/kyb-init.c:142: *a++ = 0; ld (hl),0x00 inc hl -;source-doc/keyboard/kyb-init.c:150: *b++ = 0; +;source-doc/keyboard/kyb-init.c:143: *b++ = 0; djnz l_keyboard_buf_flush_00101 -;source-doc/keyboard/kyb-init.c:151: } while (--i != 0); +;source-doc/keyboard/kyb-init.c:144: } while (--i != 0); ret -;source-doc/keyboard/kyb-init.c:153: +;source-doc/keyboard/kyb-init.c:146: ; --------------------------------- ; Function keyboard_tick ; --------------------------------- _keyboard_tick: -;source-doc/keyboard/kyb-init.c:154: void keyboard_tick(void) { +;source-doc/keyboard/kyb-init.c:147: void keyboard_tick(void) { ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb-init.c:155: if (is_in_critical_section()) +;source-doc/keyboard/kyb-init.c:148: if (is_in_critical_section()) jr NZ,l_keyboard_tick_00112 ;././source-doc/base-drv//ch376.h:110: #endif ld l,0x0b @@ -471,7 +457,7 @@ _keyboard_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:158: ch_configure_nak_retry_disable(); +;source-doc/keyboard/kyb-init.c:151: ch_configure_nak_retry_disable(); ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -496,47 +482,40 @@ _keyboard_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb-init.c:160: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb-init.c:153: ch_configure_nak_retry_3s(); ld hl,_result ld a, (hl) or a jr NZ,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:161: if (result == 0) { +;source-doc/keyboard/kyb-init.c:154: if (result == 0) { call _report_diff or a jr Z,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:162: if (report_diff()) { +;source-doc/keyboard/kyb-init.c:155: if (report_diff()) { call _report_put -;source-doc/keyboard/kyb-init.c:164: uint8_t i = 6; +;source-doc/keyboard/kyb-init.c:157: uint8_t i = 6; ld b,0x06 l_keyboard_tick_00103: -;source-doc/keyboard/kyb-init.c:165: do { - ld l, b - dec l - ld h,0x00 - ld de, +(_report + 2) - add hl, de - ld c, (hl) - ld a,(_report) +;source-doc/keyboard/kyb-init.c:158: do { + ld a, b + dec a push bc - ld l, c call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb-init.c:166: keyboard_buf_put(report.bModifierKeys, report.keyCode[i-1]); +;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i-1); djnz l_keyboard_tick_00103 -;source-doc/keyboard/kyb-init.c:167: } while (--i != 0); +;source-doc/keyboard/kyb-init.c:160: } while (--i != 0); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_keyboard_tick_00112: -;source-doc/keyboard/kyb-init.c:170: } +;source-doc/keyboard/kyb-init.c:163: } ret _keyboard_config: DEFW +0x0000 _buffer: - DEFB +0x00 - DEFB +0x00 + DEFW +0x0000 DEFB 0x00 DEFB 0x00 DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index a2005fa6..5da58857 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -9,16 +9,13 @@ #define KEYBOARD_BUFFER_SIZE 8 #define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef struct { - uint8_t modifier_keys; - uint8_t key_code; -} keyboard_event; +typedef uint16_t modifier_and_code_t; static device_config_keyboard *keyboard_config = 0; -static keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}}; -static uint8_t write_index = 0; -static uint8_t read_index = 0; +static modifier_and_code_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; +static uint8_t write_index = 0; +static uint8_t read_index = 0; static uint8_t alt_write_index = 0; static uint8_t alt_read_index = 0; @@ -77,7 +74,8 @@ static void report_put() { } } -static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) __sdcccall(1) { +static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { + const uint8_t key_code = report.keyCode[indx]; if (key_code >= 0x80 || key_code == 0) return; // ignore ??? @@ -91,9 +89,8 @@ static void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (next_write_index != read_index) { // Check if buffer is not full - buffer[write_index].modifier_keys = modifier_keys; - buffer[write_index].key_code = key_code; - write_index = next_write_index; + buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + write_index = next_write_index; } } @@ -106,12 +103,8 @@ uint16_t keyboard_buf_size() { else alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; - if (alt_size == 0) - queued_report = NULL; - else { - queued_report = &reports[alt_read_index]; + if (alt_size != 0) alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - } if (write_index >= read_index) size = write_index - read_index; @@ -125,8 +118,8 @@ uint32_t keyboard_buf_get_next() { if (write_index == read_index) // Check if buffer is empty return 0x0000FF00; // H = -1, D, E, L = 0 - const uint8_t modifier_key = buffer[read_index].modifier_keys; - const uint8_t key_code = buffer[read_index].key_code; + const uint8_t modifier_key = buffer[read_index] >> 8; + const uint8_t key_code = buffer[read_index] & 255; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; // D: Modifier keys - aka Keystate @@ -163,7 +156,7 @@ void keyboard_tick(void) { report_put(); uint8_t i = 6; do { - keyboard_buf_put(report.bModifierKeys, report.keyCode[i - 1]); + keyboard_buf_put(i - 1); } while (--i != 0); previous = report; } diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 82b08ba6..391762d1 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -108,6 +108,16 @@ VEC_CHUKB_TICK: ; See USB HID Usage Tables specification for key codes UKY_STAT: + exx + ld hl, (_alt_read_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + ld bc,_reports + add hl, bc + push hl ; address of potential que'd next usb report + HB_DI call _keyboard_buf_size HB_EI @@ -116,10 +126,11 @@ UKY_STAT: ex af, af' ld a, b or a + pop iy ; retrieve the next que'd usb_report address jr z, no_queued_reports - ld iy, (_queued_report) + ld a, (iy) - ex af, af' + ex af, af' exx ld b, (iy+2) ld c, (iy+3) @@ -202,3 +213,4 @@ UKY_READ: LD C, L XOR A RET + From b7234d339a5d72d85df58c6e00285416fe047731 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 17 Apr 2025 09:48:56 +1000 Subject: [PATCH 31/59] ch376-native: fixed usb scsi/ufi issue with reading/writing more than 512 bytes in one invocation --- Source/HBIOS/ch376scsi.asm | 4 ++-- Source/HBIOS/ch376ufi.asm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index df82a184..31c71dfc 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -97,8 +97,8 @@ CH_SCSI_READ: push iy call _scsi_read ld a, l - pop hl pop iy + pop hl ld bc, 512 add hl, bc ret @@ -128,8 +128,8 @@ CH_SCSI_WRITE: push iy call _scsi_write ld a, l - pop hl pop iy + pop hl ld bc, 512 add hl, bc ret diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 330db5a3..07a85a6d 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -126,8 +126,8 @@ CH_UFI_WRITE: push iy call _chufi_write ld a, l - pop hl pop iy + pop hl ld bc, 512 add hl, bc ret From 149ab3ca8a905ba013f668235e41f6b0b41947c0 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 19 Apr 2025 09:05:38 +1000 Subject: [PATCH 32/59] ch376-native: bumped to version 3.5.1-rc.0+ch376native --- Source/HBIOS/ch376-native/keyboard/kyb-init.c.s | 2 +- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index db2be91a..24eb9429 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -502,7 +502,7 @@ l_keyboard_tick_00103: push bc call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i-1); +;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i - 1); djnz l_keyboard_tick_00103 ;source-doc/keyboard/kyb-init.c:160: } while (--i != 0); ld de,_previous diff --git a/Source/ver.inc b/Source/ver.inc index 82728c37..8ce7cbc9 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 6 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.6.0-dev.5" +#DEFINE BIOSVER "3.6.0-dev.5+ch376native" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index cf87bab0..1f4d086c 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 6 rup equ 0 rtp equ 0 biosver macro - db "3.6.0-dev.5" + db "3.6.0-dev.5+ch376native" endm From 580d7761e131a09906a74b2e31662325a056386a Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 19 Apr 2025 16:25:50 +1000 Subject: [PATCH 33/59] ch376-native: cleaned up formatting for ch376inc.h --- .vscode/settings.json | 5 +- Source/HBIOS/ch376-native/base-drv/ch376.c.s | 66 ++++----- .../ch376-native/source-doc/base-drv/ch376.c | 1 + .../source-doc/base-drv/ch376inc.h | 132 ++++++++++-------- .../source-doc/base-drv/transfers.c | 2 +- Source/HBIOS/ez80instr.inc | 2 + 6 files changed, 113 insertions(+), 95 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index e489b984..b1314ed9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,7 @@ "*.mac": "z80-macroasm", "*.asmpp": "z80-macroasm", "*.zdsproj": "xml", + "*.Z80": "z80-macroasm", "ch376.h": "c", "protocol.h": "c", "usb_state.h": "c", @@ -18,6 +19,8 @@ "z80.h": "c", "dev_transfers.h": "c", "usb-base-drv.h": "c", - "critical-section.h": "c" + "critical-section.h": "c", + "enumerate.h": "c", + "ch376inc.h": "c" } } diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index bec3ed6c..54dde6cc 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -581,7 +581,7 @@ l_ch_data_in_transfer_00111: ;source-doc/base-drv/ch376.c:187: } pop ix ret -;source-doc/base-drv/ch376.c:189: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:190: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- @@ -589,20 +589,20 @@ _ch_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/ch376.c:193: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/ch376.c:194: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:195: ch_issue_token_in(endpoint); +;source-doc/base-drv/ch376.c:196: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in -;source-doc/base-drv/ch376.c:197: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/ch376.c:198: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a,l or a jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/ch376.c:199: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:200: endpoint->toggle = !endpoint->toggle; ld l,(ix+8) ld h,(ix+9) ld a, (hl) @@ -614,33 +614,33 @@ _ch_data_in_transfer_n: and 0xfe or c ld (hl), a -;source-doc/base-drv/ch376.c:201: count = ch_read_data(buffer); +;source-doc/base-drv/ch376.c:202: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) call _ch_read_data -;source-doc/base-drv/ch376.c:203: *buffer_size = count; +;source-doc/base-drv/ch376.c:204: *buffer_size = count; ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:206: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:207: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:208: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_n_00104 -;source-doc/base-drv/ch376.c:208: done: +;source-doc/base-drv/ch376.c:209: done: l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:210: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:210: return result; +;source-doc/base-drv/ch376.c:211: return result; l_ch_data_in_transfer_n_00104: -;source-doc/base-drv/ch376.c:211: } +;source-doc/base-drv/ch376.c:212: } pop ix ret -;source-doc/base-drv/ch376.c:213: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:214: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_out_transfer ; --------------------------------- @@ -649,7 +649,7 @@ _ch_data_out_transfer: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/ch376.c:216: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); +;source-doc/base-drv/ch376.c:217: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) ld b,(ix+9) ld e, c @@ -657,13 +657,13 @@ _ch_data_out_transfer: inc de ld a, (de) ld (ix-1),a -;source-doc/base-drv/ch376.c:218: USB_MODULE_LEDS = 0x02; +;source-doc/base-drv/ch376.c:219: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS out (c), a pop bc -;source-doc/base-drv/ch376.c:220: while (buffer_length > 0) { +;source-doc/base-drv/ch376.c:221: while (buffer_length > 0) { l_ch_data_out_transfer_00103: xor a cp (ix+6) @@ -672,7 +672,7 @@ l_ch_data_out_transfer_00103: xor 0x80 l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/ch376.c:221: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; +;source-doc/base-drv/ch376.c:222: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; ld d,(ix-1) ld e,0x00 ld a, d @@ -688,7 +688,7 @@ l_ch_data_out_transfer_00109: ld d,(ix+6) ld e,(ix+7) l_ch_data_out_transfer_00110: -;source-doc/base-drv/ch376.c:222: buffer = ch_write_data(buffer, size); +;source-doc/base-drv/ch376.c:223: buffer = ch_write_data(buffer, size); push bc push de push de @@ -703,7 +703,7 @@ l_ch_data_out_transfer_00110: pop bc ld (ix+4),l ld (ix+5),h -;source-doc/base-drv/ch376.c:223: buffer_length -= size; +;source-doc/base-drv/ch376.c:224: buffer_length -= size; ld e,0x00 ld a,(ix+6) sub d @@ -711,19 +711,19 @@ l_ch_data_out_transfer_00110: ld a,(ix+7) sbc a, e ld (ix+7),a -;source-doc/base-drv/ch376.c:224: ch_issue_token_out(endpoint); +;source-doc/base-drv/ch376.c:225: ch_issue_token_out(endpoint); ld l,c ld h,b push hl call _ch_issue_token_out -;source-doc/base-drv/ch376.c:226: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/ch376.c:227: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a, l pop bc ld l, a or a jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/ch376.c:228: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:229: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l, e @@ -739,40 +739,40 @@ l_ch_data_out_transfer_00110: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:232: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:232: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:233: return USB_ERR_OK; ld l,0x00 jr l_ch_data_out_transfer_00107 -;source-doc/base-drv/ch376.c:234: done: +;source-doc/base-drv/ch376.c:235: done: l_ch_data_out_transfer_00106: -;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:236: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:236: return result; +;source-doc/base-drv/ch376.c:237: return result; l_ch_data_out_transfer_00107: -;source-doc/base-drv/ch376.c:237: } +;source-doc/base-drv/ch376.c:238: } inc sp pop ix ret -;source-doc/base-drv/ch376.c:239: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:240: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function ch_set_usb_address ; --------------------------------- _ch_set_usb_address: -;source-doc/base-drv/ch376.c:240: ch_command(CH_CMD_SET_USB_ADDR); +;source-doc/base-drv/ch376.c:241: ch_command(CH_CMD_SET_USB_ADDR); push hl ld l,0x13 call _ch_command pop hl -;source-doc/base-drv/ch376.c:241: CH376_DATA_PORT = device_address; +;source-doc/base-drv/ch376.c:242: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.c:242: } +;source-doc/base-drv/ch376.c:243: } ret _result: DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index 33c5264e..e8d9a87b 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -186,6 +186,7 @@ done: return result; } +//TODO: review: does buffer_size need to be signed? usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { uint8_t count; usb_error result; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h index db4270a3..ec760bca 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h @@ -759,49 +759,53 @@ typedef unsigned char volatile *PUINT8V; /* The following status codes are used for file system error codes in host file * mode */ #ifndef ERR_DISK_DISCON -#define ERR_DISK_DISCON \ - 0x82 /* The disk has not been connected, maybe the disk has been \ - disconnected */ -#define ERR_LARGE_SECTOR \ - 0x84 /*The sector of the disk is too large, only 512 bytes per sector are \ - supported */ \ - #define ERR_TYPE_ERROR 0x92 /* The disk partition type is not \ - supported, only FAT12/FAT16/BigDOS/FAT32 is \ - supported, it needs to be re-partitioned by the \ - disk management tool */ -#define ERR_BPB_ERROR \ - 0xA1 /*The disk has not been formatted, \ - or the parameters are wrong and need to be reformatted by WINDOWS with \ - default parameters */ \ - #define ERR_DISK_FULL 0xB1 /*The disk file is too full, the remaining \ - space is too little or there is no more, and \ - disk defragmentation is required */ \ - #define ERR_FDT_OVER 0xB2 /*There are too many files in the \ - directory(folder), there is no free directory \ - entry, the number of files in the FAT12 / \ - FAT16 root directory should be less than 512, \ - and disk defragmentation is required */ \ - #define ERR_FILE_CLOSE 0xB4 /*The file has been closed, it should be \ - reopened if needed */ \ - #define ERR_OPEN_DIR 0x41 /* The directory (folder) of the specified \ - path is opened */ -#define ERR_MISS_FILE \ - 0x42 /*The file in the specified path is not found, maybe the file name is \ - wrong */ \ - #define ERR_FOUND_NAME 0x43 /* Search for a matching file name, or ask \ - to open a directory (folder) but the actual result opens the file */ + +/* The disk has not been connected, maybe the disk has been disconnected */ +#define ERR_DISK_DISCON 0x82 + +/*The sector of the disk is too large, only 512 bytes per sector are supported */ +#define ERR_LARGE_SECTOR 0x84 + +/* The disk partition type is not supported, only FAT12/FAT16/BigDOS/FAT32 is supported, it needs to be re-partitioned by the disk + * management tool */ +#define ERR_TYPE_ERROR 0x92 + +/* The disk has not been formatted, or the parameters are wrong and need to be reformatted by WINDOWS with default parameters */ +#define ERR_BPB_ERROR 0xA1 + +/* The disk file is too full, the remaining space is too little or there is no more, and disk defragmentation is required */ +#define ERR_DISK_FULL 0xB1 + +/* There are too many files in the directory(folder), there is no free directory entry, the number of files in the FAT12 / FAT16 + * root directory should be less than 512, and disk defragmentation is required */ +#define ERR_FDT_OVER 0xB2 + +/*The file has been closed, it should be reopened if needed */ +#define ERR_FILE_CLOSE 0xB4 + +/* The directory (folder) of the specified path is opened */ +#define ERR_OPEN_DIR 0x41 + +/* The file in the specified path is not found, maybe the file name is wrong */ +#define ERR_MISS_FILE 0x42 + +/* Search for a matching file name, or ask to open a directory (folder) but the actual result opens the file */ + /* The following file system error codes are used for file system subroutines */ -#define ERR_MISS_DIR \ - 0xB3 /*A subdirectory(folder) of the specified path is not found, maybe the \ - directory name is wrong */ \ - #define ERR_LONG_BUF_OVER 0x48 /* long file buffer overflow */ -#define ERR_LONG_NAME_ERR \ - 0x49 /* The short file name does not have a corresponding long file name or \ - * the long file name is wrong \ - */ -#define ERR_NAME_EXIST \ - 0x4A /* A short file with the same name already exists, it is recommended to \ - regenerate another short file name */ +#define ERR_FOUND_NAME 0x43 + +/* A subdirectory(folder) of the specified path is not found, maybe the directory name is wrong */ +#define ERR_MISS_DIR 0xB3 + +/* long file buffer overflow */ +#define ERR_LONG_BUF_OVER 0x48 + +/* The short file name does not have a corresponding long file name or the long file name is wrong */ +#define ERR_LONG_NAME_ERR 0x49 + +/* A short file with the same name already exists, it is recommended to regenerate another short file name */ +#define ERR_NAME_EXIST 0x4A + #endif /* ************************************************ @@ -809,23 +813,30 @@ typedef unsigned char volatile *PUINT8V; /* The following status codes are used for disk and file status in host file * mode, VAR_DISK_STATUS */ #ifndef DEF_DISK_UNKNOWN -#define DEF_DISK_UNKNOWN \ - 0x00 /*Not initialized, unknown state */ \ - #define DEF_DISK_DISCONN 0x01 /* The disk is not connected or has been \ - disconnected */ -#define DEF_DISK_CONNECT \ - 0x02 /* The disk is connected, but it has not been initialized or the disk \ - * cannot be recognized \ - */ -#define DEF_DISK_MOUNTED \ - 0x03 /* The disk has been initialized successfully, but the file system has \ - not been analyzed or the file system does not support */ -#define DEF_DISK_READY 0x10 /* The file system of the disk has been analyzed and can support */ -#define DEF_DISK_OPEN_ROOT \ - 0x12 /* The root directory has been opened and must be closed after use. \ - Note that the FAT12/FAT16 root directory is a fixed length */ -#define DEF_DISK_OPEN_DIR 0x13 /* A subdirectory (folder) has been opened */ -#define DEF_DISK_OPEN_FILE 0x14 /* The file has been opened */ + +/*Not initialized, unknown state */ +#define DEF_DISK_UNKNOWN 0x00 + +/* The disk is not connected or has been disconnected */ +#define DEF_DISK_DISCONN 0x01 + +/* The disk is connected, but it has not been initialized or the disk cannot be recognized */ +#define DEF_DISK_CONNECT 0x02 + +/* The disk has been initialized successfully, but the file system has not been analyzed or the file system does not support */ +#define DEF_DISK_MOUNTED 0x03 + +/* The file system of the disk has been analyzed and can support */ +#define DEF_DISK_READY 0x10 + +/* The root directory has been opened and must be closed after use. Note that the FAT12/FAT16 root directory is a fixed length */ +#define DEF_DISK_OPEN_ROOT 0x12 + +/* A subdirectory (folder) has been opened */ +#define DEF_DISK_OPEN_DIR 0x13 + +/* The file has been opened */ +#define DEF_DISK_OPEN_FILE 0x14 #endif /* ************************************************ @@ -833,7 +844,8 @@ typedef unsigned char volatile *PUINT8V; /* Common definitions of file system */ #ifndef DEF_SECTOR_SIZE -#define DEF_SECTOR_SIZE 512 /* The default physical sector size of U disk or SD card */ +/* The default physical sector size of U disk or SD card */ +#define DEF_SECTOR_SIZE 512 #endif #ifndef DEF_WILDCARD_CHAR diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index a8df10ac..5b8ef9ae 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -159,7 +159,7 @@ usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_ ch_set_usb_address(device_address); - result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); + result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); //does ch_data_in_transfer_n size need to be signed? critical_end(); diff --git a/Source/HBIOS/ez80instr.inc b/Source/HBIOS/ez80instr.inc index 5da3db4d..4729f8f0 100644 --- a/Source/HBIOS/ez80instr.inc +++ b/Source/HBIOS/ez80instr.inc @@ -47,6 +47,8 @@ #DEFINE EZ80_TMR_IS_TICK_ISR LD A, 2 \ LD B, 10 \ EZ80_FN #DEFINE EZ80_TMR_DELAY LD A, 2 \ LD B, 11 \ EZ80_FN + #DEFINE EZ80_EX_USB_INIT LD A, 6 \ LD B, 0 \ EZ80_FN + #DEFINE EZ80_THROTTLE_START(p,store) \ #DEFCONT \ PUSH AF #DEFCONT \ PUSH BC From 7e8560f9a971a881037a69eb49c17132ac7f549b Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 20 Apr 2025 09:45:57 +1000 Subject: [PATCH 34/59] ch376-native: fixed issue with enumerating devices with interfaces containing no endpoints --- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 8 +- .../ch376-native/scsi-drv/class_scsi.c.s | 214 +++++++++--------- .../ch376-native/source-doc/base-drv/ch376.c | 2 +- .../source-doc/base-drv/enumerate.c | 2 +- .../source-doc/base-drv/transfers.c | 2 +- .../source-doc/scsi-drv/class_scsi.c | 15 +- .../source-doc/scsi-drv/class_scsi.h | 5 +- Source/HBIOS/ch376scsi.asm | 2 +- 8 files changed, 125 insertions(+), 125 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 6a6c17c2..d6ec0f46 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -245,10 +245,12 @@ l_op_interface_next_00103: ; --------------------------------- _op_endpoint_next: ex de, hl -;source-doc/base-drv/enumerate.c:49: if (--working->endpoint_count > 0) { +;source-doc/base-drv/enumerate.c:49: if (working->endpoint_count != 0 && --working->endpoint_count > 0) { ld hl,0x0017 add hl, de ld a, (hl) + or a + jr Z,l_op_endpoint_next_00102 dec a ld (hl), a or a @@ -271,13 +273,13 @@ _op_endpoint_next: ;source-doc/base-drv/enumerate.c:51: return op_parse_endpoint(working); ex de, hl jp _op_parse_endpoint - jr l_op_endpoint_next_00103 + jr l_op_endpoint_next_00104 l_op_endpoint_next_00102: ;source-doc/base-drv/enumerate.c:54: return op_interface_next(working); ex de, hl call _op_interface_next ld a, l -l_op_endpoint_next_00103: +l_op_endpoint_next_00104: ;source-doc/base-drv/enumerate.c:55: } ret ;source-doc/base-drv/enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 672829ab..bc712804 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -39,7 +39,7 @@ _next_tag: DEFS 2 _csw: DEFS 13 -_scsi_read_capacity: +_scsi_packet_read_capacity: DEFS 12 _scsi_packet_inquiry: DEFS 12 @@ -62,7 +62,7 @@ _cbw: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/class_scsi.c:12: usb_error do_scsi_cmd(device_config_storage *const dev, +;source-doc/scsi-drv/class_scsi.c:13: usb_error do_scsi_cmd(device_config_storage *const dev, ; --------------------------------- ; Function do_scsi_cmd ; --------------------------------- @@ -73,7 +73,7 @@ _do_scsi_cmd: ld hl, -8 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:17: cbw->dCBWTag[0] = next_tag++; +;source-doc/scsi-drv/class_scsi.c:18: cbw->dCBWTag[0] = next_tag++; ld c,(ix+6) ld b,(ix+7) ld hl,0x0004 @@ -91,19 +91,19 @@ _do_scsi_cmd: ld (hl), e inc hl ld (hl), d -;source-doc/scsi-drv/class_scsi.c:19: if (!send) +;source-doc/scsi-drv/class_scsi.c:20: if (!send) bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00102 -;source-doc/scsi-drv/class_scsi.c:20: cbw->bmCBWFlags = 0x80; +;source-doc/scsi-drv/class_scsi.c:21: cbw->bmCBWFlags = 0x80; ld hl,0x000c add hl, bc ld (hl),0x80 l_do_scsi_cmd_00102: -;source-doc/scsi-drv/class_scsi.c:22: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:23: critical_begin(); push bc call _critical_begin pop bc -;source-doc/scsi-drv/class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:26: &dev->endpoints[ENDPOINT_BULK_OUT])); ld a,(ix+4) ld (ix-6),a ld e, a @@ -148,7 +148,7 @@ l_do_scsi_cmd_00102: ld a,(_result) or a jp NZ, l_do_scsi_cmd_00120 -;source-doc/scsi-drv/class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) { +;source-doc/scsi-drv/class_scsi.c:28: if (cbw->dCBWDataTransferLength != 0) { ld hl,8 add hl, bc ld c, (hl) @@ -163,15 +163,15 @@ l_do_scsi_cmd_00102: or b or c jr Z,l_do_scsi_cmd_00113 -;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix+8) ld (ix-2),a ld a,(ix+9) ld (ix-1),a -;source-doc/scsi-drv/class_scsi.c:28: if (!send) { +;source-doc/scsi-drv/class_scsi.c:29: if (!send) { bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 -;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix-6) add a,0x06 ld e, a @@ -205,7 +205,7 @@ l_do_scsi_cmd_00102: jr Z,l_do_scsi_cmd_00113 jp l_do_scsi_cmd_00120 l_do_scsi_cmd_00110: -;source-doc/scsi-drv/class_scsi.c:34: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:35: &dev->endpoints[ENDPOINT_BULK_OUT])); ld l,(ix-4) ld h,(ix-3) ld a, (hl) @@ -232,7 +232,7 @@ l_do_scsi_cmd_00110: or a jr NZ,l_do_scsi_cmd_00120 l_do_scsi_cmd_00113: -;source-doc/scsi-drv/class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:40: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix-6) add a,0x06 ld e, a @@ -265,7 +265,7 @@ l_do_scsi_cmd_00113: ld a,(_result) or a jr NZ,l_do_scsi_cmd_00120 -;source-doc/scsi-drv/class_scsi.c:41: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) +;source-doc/scsi-drv/class_scsi.c:42: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) ld a, (_csw + 12) or a jr Z,l_do_scsi_cmd_00117 @@ -279,36 +279,36 @@ l_do_scsi_cmd_00113: xor a sbc hl,bc jr Z,l_do_scsi_cmd_00117 -;source-doc/scsi-drv/class_scsi.c:42: result = USB_ERR_FAIL; +;source-doc/scsi-drv/class_scsi.c:43: result = USB_ERR_FAIL; ld hl,_result ld (hl),0x0e jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00117: -;source-doc/scsi-drv/class_scsi.c:44: result = USB_ERR_OK; +;source-doc/scsi-drv/class_scsi.c:45: result = USB_ERR_OK; xor a ld (_result),a -;source-doc/scsi-drv/class_scsi.c:46: done: +;source-doc/scsi-drv/class_scsi.c:47: done: l_do_scsi_cmd_00120: -;source-doc/scsi-drv/class_scsi.c:47: critical_end(); +;source-doc/scsi-drv/class_scsi.c:48: critical_end(); call _critical_end -;source-doc/scsi-drv/class_scsi.c:48: return result; +;source-doc/scsi-drv/class_scsi.c:49: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:49: } +;source-doc/scsi-drv/class_scsi.c:50: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:53: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { ; --------------------------------- -; Function get_scsi_read_capacity +; Function scsi_read_capacity ; --------------------------------- -_get_scsi_read_capacity: +_scsi_read_capacity: push ix ld ix,0 add ix,sp ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -317,19 +317,19 @@ _get_scsi_read_capacity: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity; +;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.read_capacity = scsi_packet_read_capacity; ld hl,17 add hl, sp ex de, hl ld bc,0x000c - ld hl,_scsi_read_capacity + ld hl,_scsi_packet_read_capacity ldir pop bc -;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); +;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); +;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); ld hl,0x0008 add hl, bc ld (hl),0x08 @@ -340,7 +340,7 @@ _get_scsi_read_capacity: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -352,11 +352,11 @@ _get_scsi_read_capacity: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:63: } +;source-doc/scsi-drv/class_scsi.c:64: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:67: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { +;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { ; --------------------------------- ; Function scsi_inquiry ; --------------------------------- @@ -367,7 +367,7 @@ _scsi_inquiry: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -376,7 +376,7 @@ _scsi_inquiry: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry; +;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.inquiry = scsi_packet_inquiry; ld hl,17 add hl, sp ex de, hl @@ -384,11 +384,11 @@ _scsi_inquiry: ld hl,_scsi_packet_inquiry ldir pop bc -;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; +;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; ld hl,0x0008 add hl, bc ld (hl),0x24 @@ -399,7 +399,7 @@ _scsi_inquiry: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -411,11 +411,11 @@ _scsi_inquiry: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:77: } +;source-doc/scsi-drv/class_scsi.c:78: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:79: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:80: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -426,7 +426,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:82: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -435,7 +435,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:83: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -447,11 +447,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:87: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -462,7 +462,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:89: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -473,11 +473,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:89: } +;source-doc/scsi-drv/class_scsi.c:90: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:93: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:94: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -488,7 +488,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -497,7 +497,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:97: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -505,11 +505,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -520,7 +520,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:103: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -532,11 +532,11 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:103: } +;source-doc/scsi-drv/class_scsi.c:104: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:105: usb_error scsi_sense_init(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:106: usb_error scsi_sense_init(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_sense_init ; --------------------------------- @@ -547,9 +547,9 @@ _scsi_sense_init: ld hl, -18 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:109: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:110: critical_begin(); call _critical_begin -;source-doc/scsi-drv/class_scsi.c:110: while ((result = scsi_test(dev)) && --counter > 0) +;source-doc/scsi-drv/class_scsi.c:111: while ((result = scsi_test(dev)) && --counter > 0) ld c,0x03 l_scsi_sense_init_00102: push bc @@ -565,7 +565,7 @@ l_scsi_sense_init_00102: jr Z,l_scsi_sense_init_00104 dec c jr Z,l_scsi_sense_init_00104 -;source-doc/scsi-drv/class_scsi.c:111: scsi_request_sense(dev, &response); +;source-doc/scsi-drv/class_scsi.c:112: scsi_request_sense(dev, &response); ld hl,0 add hl, sp push bc @@ -579,15 +579,15 @@ l_scsi_sense_init_00102: pop bc jr l_scsi_sense_init_00102 l_scsi_sense_init_00104: -;source-doc/scsi-drv/class_scsi.c:112: critical_end(); +;source-doc/scsi-drv/class_scsi.c:113: critical_end(); call _critical_end -;source-doc/scsi-drv/class_scsi.c:114: return result; +;source-doc/scsi-drv/class_scsi.c:115: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:115: } +;source-doc/scsi-drv/class_scsi.c:116: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:119: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:120: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -595,7 +595,7 @@ _scsi_read: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:121: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -608,28 +608,28 @@ l_scsi_read_00113: ld (hl),0x00 inc hl djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:122: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:123: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:126: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:127: cbw.scsi_cmd.operation_code = 0x28; // read operation +;source-doc/scsi-drv/class_scsi.c:128: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/class_scsi.c:128: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld l,(ix+4) ld h,(ix+5) ld bc,0x000c @@ -641,8 +641,8 @@ l_scsi_read_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; ld l,c ld h,b inc hl @@ -653,11 +653,11 @@ l_scsi_read_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:133: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;source-doc/scsi-drv/class_scsi.c:135: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) push bc @@ -678,11 +678,11 @@ l_scsi_read_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:136: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:137: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/class_scsi.c:137: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:138: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -711,12 +711,12 @@ l_scsi_read_00114: ld a, h ld (bc), a l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:138: return result; +;source-doc/scsi-drv/class_scsi.c:139: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:139: } +;source-doc/scsi-drv/class_scsi.c:140: } pop ix ret -;source-doc/scsi-drv/class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:142: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -724,7 +724,7 @@ _scsi_write: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:143: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -737,28 +737,28 @@ l_scsi_write_00113: ld (hl),0x00 inc hl djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:144: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:145: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:148: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:149: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;source-doc/scsi-drv/class_scsi.c:150: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/class_scsi.c:150: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld l,(ix+4) ld h,(ix+5) ld bc,0x000c @@ -770,8 +770,8 @@ l_scsi_write_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; ld l,c ld h,b inc hl @@ -782,11 +782,11 @@ l_scsi_write_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:155: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;source-doc/scsi-drv/class_scsi.c:157: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) push bc @@ -807,11 +807,11 @@ l_scsi_write_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:158: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:159: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/class_scsi.c:159: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:160: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -840,12 +840,12 @@ l_scsi_write_00114: ld a, h ld (bc), a l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:160: return result; +;source-doc/scsi-drv/class_scsi.c:161: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:161: } +;source-doc/scsi-drv/class_scsi.c:162: } pop ix ret -;source-doc/scsi-drv/class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:164: usb_error scsi_eject(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_eject ; --------------------------------- @@ -856,7 +856,7 @@ _scsi_eject: ld hl, -21 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:166: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -865,7 +865,7 @@ _scsi_eject: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); +;source-doc/scsi-drv/class_scsi.c:168: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); ld hl,17 add hl, sp ld b,0x03 @@ -877,17 +877,17 @@ l_scsi_eject_00103: inc hl djnz l_scsi_eject_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B; +;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.operation_code = 0x1B; ld (ix-6),0x1b -;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.loej = 1; +;source-doc/scsi-drv/class_scsi.c:171: cbw_scsi.eject.loej = 1; ld hl,19 add hl, sp set 1, (hl) -;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-8),0x00 -;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); ld (ix-7),0x06 -;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:175: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -898,7 +898,7 @@ l_scsi_eject_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:177: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -909,7 +909,7 @@ l_scsi_eject_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:177: } +;source-doc/scsi-drv/class_scsi.c:178: } ld sp,ix pop ix ret @@ -940,7 +940,7 @@ _csw: DEFB 0x00 DEFB 0x00 DEFB +0x00 -_scsi_read_capacity: +_scsi_packet_read_capacity: DEFB +0x25 DEFB +0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index e8d9a87b..376a5ef2 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -186,7 +186,7 @@ done: return result; } -//TODO: review: does buffer_size need to be signed? +// TODO: review: does buffer_size need to be signed? usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { uint8_t count; usb_error result; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c index 8393ec65..d294985b 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -46,7 +46,7 @@ usb_error op_interface_next(_working *const working) __z88dk_fastcall { } usb_error op_endpoint_next(_working *const working) __sdcccall(1) { - if (--working->endpoint_count > 0) { + if (working->endpoint_count != 0 && --working->endpoint_count > 0) { working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; return op_parse_endpoint(working); } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 5b8ef9ae..2aab410e 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -159,7 +159,7 @@ usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_ ch_set_usb_address(device_address); - result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); //does ch_data_in_transfer_n size need to be signed? + result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); // does ch_data_in_transfer_n size need to be signed? critical_end(); diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index b4f34fc2..86e962c9 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -9,10 +9,11 @@ _scsi_command_block_wrapper scsi_command_block_wrapper = {{0x55, 0x53, 0x42, 0x4 uint16_t next_tag = 0; _scsi_command_status_wrapper csw = {{{0}}}; -usb_error do_scsi_cmd(device_config_storage *const dev, - _scsi_command_block_wrapper *const cbw, - void *const send_receive_buffer, - const bool send) { + +usb_error do_scsi_cmd(device_config_storage *const dev, + _scsi_command_block_wrapper *const cbw, + void *const send_receive_buffer, + const bool send) { cbw->dCBWTag[0] = next_tag++; @@ -48,12 +49,12 @@ done: return result; } -_scsi_read_capacity scsi_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; +_scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; -usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { cbw_scsi_read_capacity cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; - cbw_scsi.read_capacity = scsi_read_capacity; + cbw_scsi.read_capacity = scsi_packet_read_capacity; cbw_scsi.cbw.bCBWLUN = 0; cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h index 356da856..bcdcc031 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -182,15 +182,12 @@ typedef struct { _scsi_packet_read_write scsi_cmd; } cbw_scsi_read_write; -extern usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result); +extern usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result); extern usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result); extern usb_error scsi_sense_init(device_config_storage *const dev); extern usb_error scsi_test(device_config_storage *const dev); extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result); extern usb_error scsi_eject(device_config_storage *const dev); -extern usb_error scsi_read_write( - device_config_storage *const dev, const bool send, uint32_t sector_number, const uint8_t sector_count, uint8_t *const buffer); - extern usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer); extern usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer); #endif diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 31c71dfc..5fad919e 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -237,7 +237,7 @@ CH_SCSI_CAP: push ix push iy - call _get_scsi_read_capacity + call _scsi_read_capacity pop iy pop ix From 802c1b41ff83e04751067f3da123e3365b5c1c6b Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 20 Apr 2025 11:25:34 +1000 Subject: [PATCH 35/59] ch376-native: refactored usb init/enumerating --- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 458 +++++++++++------- .../source-doc/base-drv/usb-init.c | 140 ++++-- 2 files changed, 379 insertions(+), 219 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 909ce1fb..b3429367 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s @@ -83,243 +83,365 @@ _usb_host_bus_reset: ld l,0x00 ;source-doc/base-drv/usb-init.c:21: } ret -;source-doc/base-drv/usb-init.c:25: void _chnative_init(bool forced) { +;source-doc/base-drv/usb-init.c:25: uint16_t ch376_init(uint8_t state) { ; --------------------------------- -; Function _chnative_init +; Function ch376_init ; --------------------------------- -__chnative_init: +_ch376_init: push ix ld ix,0 add ix,sp - dec sp -;source-doc/base-drv/usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld hl,_x - ld (hl),0x00 - ld e, l - ld d, h - inc de - ld bc,0x0068 - ldir ;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/usb-init.c:30: ch_cmd_reset_all(); +;source-doc/base-drv/usb-init.c:30: if (state == 0) { + ld a,(ix+4) + or a + jr NZ,l_ch376_init_00104 +;source-doc/base-drv/usb-init.c:31: ch_cmd_reset_all(); call _ch_cmd_reset_all ;source-doc/base-drv/usb-init.c:32: delay_medium(); call _delay_medium -;source-doc/base-drv/usb-init.c:34: if (forced) { - bit 0,(ix+4) - jr Z,l__chnative_init_00110 -;source-doc/base-drv/usb-init.c:35: bool indicator = true; - ld (ix-1),0x01 -;source-doc/base-drv/usb-init.c:36: print_string("\r\nCH376: *$"); - ld hl,usb_init_str_0 - call _print_string -;source-doc/base-drv/usb-init.c:37: while (!ch_probe()) { -l__chnative_init_00104: +;source-doc/base-drv/usb-init.c:34: if (!ch_probe()) { call _ch_probe ld a, l +;source-doc/base-drv/usb-init.c:35: USB_MODULE_LEDS = 0x00; or a - jr NZ,l__chnative_init_00106 -;source-doc/base-drv/usb-init.c:38: if (indicator) { - bit 0,(ix-1) - jr Z,l__chnative_init_00102 -;source-doc/base-drv/usb-init.c:39: USB_MODULE_LEDS = 0x00; + jr NZ,l_ch376_init_00102 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-init.c:36: return 0xFF00; + ld hl,0xff00 + jp l_ch376_init_00113 +l_ch376_init_00102: +;source-doc/base-drv/usb-init.c:38: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/usb-init.c:40: print_string("\b $"); - ld hl,usb_init_str_1 - call _print_string - jr l__chnative_init_00103 -l__chnative_init_00102: -;source-doc/base-drv/usb-init.c:42: USB_MODULE_LEDS = 0x03; - ld a,0x03 +;source-doc/base-drv/usb-init.c:39: return 1; + ld hl,0x0001 + jr l_ch376_init_00113 +l_ch376_init_00104: +;source-doc/base-drv/usb-init.c:42: if (state == 1) { + ld a,(ix+4) + dec a + jr NZ,l_ch376_init_00106 +;source-doc/base-drv/usb-init.c:43: r = ch_cmd_get_ic_version(); + call _ch_cmd_get_ic_version +;source-doc/base-drv/usb-init.c:45: USB_MODULE_LEDS = 0x00; + ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/usb-init.c:43: print_string("\b*$"); +;source-doc/base-drv/usb-init.c:46: return (uint16_t)r << 8 | 2; + xor a + ld h, l + ld l,0x02 + jr l_ch376_init_00113 +l_ch376_init_00106: +;source-doc/base-drv/usb-init.c:49: if (state == 2) { + ld a,(ix+4) + sub 0x02 + jr NZ,l_ch376_init_00159 + ld a,0x01 + jr l_ch376_init_00160 +l_ch376_init_00159: + xor a +l_ch376_init_00160: + ld c,a + or a + jr Z,l_ch376_init_00110 +;source-doc/base-drv/usb-init.c:50: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-init.c:52: r = ch_very_short_wait_int_and_get_(); + call _ch_very_short_wait_int_and_get + ld a, l +;source-doc/base-drv/usb-init.c:54: if (r != USB_INT_CONNECT) { + sub 0x81 + jr Z,l_ch376_init_00108 +;source-doc/base-drv/usb-init.c:55: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-init.c:56: return 2; + ld hl,0x0002 + jr l_ch376_init_00113 +l_ch376_init_00108: +;source-doc/base-drv/usb-init.c:59: return 3; + ld hl,0x0003 + jr l_ch376_init_00113 +l_ch376_init_00110: +;source-doc/base-drv/usb-init.c:62: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld b,0x35 + ld hl,_x + jr l_ch376_init_00163 +l_ch376_init_00162: + ld (hl),0x00 + inc hl +l_ch376_init_00163: + ld (hl),0x00 + inc hl + djnz l_ch376_init_00162 +;source-doc/base-drv/usb-init.c:63: if (state != 2) { + bit 0, c + jr NZ,l_ch376_init_00112 +;source-doc/base-drv/usb-init.c:64: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-init.c:65: delay_medium(); + call _delay_medium +l_ch376_init_00112: +;source-doc/base-drv/usb-init.c:67: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb-init.c:68: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-init.c:69: return (uint16_t)count_of_devices() << 8 | state + 1; + call _count_of_devices + ld c,(ix+4) + ld b,0x00 + inc bc + or b + ld h, a + ld l, c +l_ch376_init_00113: +;source-doc/base-drv/usb-init.c:70: } + pop ix + ret +;source-doc/base-drv/usb-init.c:72: static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { +; --------------------------------- +; Function wait_for_state +; --------------------------------- +_wait_for_state: + push ix + ld ix,0 + add ix,sp + dec sp + ld (ix-1),a + ld b, l +;source-doc/base-drv/usb-init.c:73: uint16_t r = state; + ld e, b +;source-doc/base-drv/usb-init.c:75: for (uint8_t i = 0; i < loop_counter; i++) { + ld d,0x00 + ld c,d +l_wait_for_state_00108: + ld a, c + sub (ix-1) + jr NC,l_wait_for_state_00106 +;source-doc/base-drv/usb-init.c:76: if (state == desired_state) + ld a,(ix+4) + sub b + jr Z,l_wait_for_state_00106 +;source-doc/base-drv/usb-init.c:79: if (i & 1) + bit 0, c + jr Z,l_wait_for_state_00104 +;source-doc/base-drv/usb-init.c:80: print_string("\b $"); + push bc + ld hl,usb_init_str_0 + call _print_string + pop bc + jr l_wait_for_state_00105 +l_wait_for_state_00104: +;source-doc/base-drv/usb-init.c:82: print_string("\b*$"); + push bc + ld hl,usb_init_str_1 + call _print_string + pop bc +l_wait_for_state_00105: +;source-doc/base-drv/usb-init.c:84: r = ch376_init(state); + push bc + push bc + inc sp + call _ch376_init + inc sp + ex de, hl + pop bc +;source-doc/base-drv/usb-init.c:85: state = r & 255; + ld b, e +;source-doc/base-drv/usb-init.c:75: for (uint8_t i = 0; i < loop_counter; i++) { + inc c + jr l_wait_for_state_00108 +l_wait_for_state_00106: +;source-doc/base-drv/usb-init.c:88: return r; +;source-doc/base-drv/usb-init.c:89: } + inc sp + pop ix + pop hl + inc sp + jp (hl) +usb_init_str_0: + DEFB 0x08 + DEFM " $" + DEFB 0x00 +usb_init_str_1: + DEFB 0x08 + DEFM "*$" + DEFB 0x00 +;source-doc/base-drv/usb-init.c:91: void _chnative_init(bool forced) { +; --------------------------------- +; Function _chnative_init +; --------------------------------- +__chnative_init: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/usb-init.c:94: const uint8_t loop_counter = forced ? 40 : 5; + bit 0,(ix+4) + jr Z,l__chnative_init_00113 + ld a,0x28 + jr l__chnative_init_00114 +l__chnative_init_00113: + ld a,0x05 +l__chnative_init_00114: + ld (ix-1),a +;source-doc/base-drv/usb-init.c:96: print_string("\r\nCH376: *$"); ld hl,usb_init_str_2 call _print_string -l__chnative_init_00103: -;source-doc/base-drv/usb-init.c:46: delay_medium(); - call _delay_medium -;source-doc/base-drv/usb-init.c:47: indicator = !indicator; +;source-doc/base-drv/usb-init.c:98: r = wait_for_state(loop_counter, state, 1); + ld a,0x01 + push af + inc sp + ld l,0x00 ld a,(ix-1) - xor 0x01 - ld (ix-1),a - jr l__chnative_init_00104 -l__chnative_init_00106: -;source-doc/base-drv/usb-init.c:50: print_string("\bPRESENT (VER $"); + call _wait_for_state + ld b, e +;source-doc/base-drv/usb-init.c:99: state = r & 255; +;source-doc/base-drv/usb-init.c:101: print_string("\bPRESENT (VER $"); + push bc ld hl,usb_init_str_3 call _print_string - jr l__chnative_init_00111 -l__chnative_init_00110: -;source-doc/base-drv/usb-init.c:52: if (!ch_probe()) { - call _ch_probe - ld a, l - or a - jr NZ,l__chnative_init_00108 -;source-doc/base-drv/usb-init.c:53: USB_MODULE_LEDS = 0x03; - ld a,0x03 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:54: print_string("\r\nCH376: NOT PRESENT$"); +;source-doc/base-drv/usb-init.c:103: r = ch376_init(state); + inc sp + call _ch376_init + inc sp + ex de, hl +;source-doc/base-drv/usb-init.c:104: state = r & 255; + ld c, e +;source-doc/base-drv/usb-init.c:105: if (state != 2) { + ld a, c + sub 0x02 + jr Z,l__chnative_init_00102 +;source-doc/base-drv/usb-init.c:106: print_string("\rCH376: $"); ld hl,usb_init_str_4 call _print_string -;source-doc/base-drv/usb-init.c:55: return; - jp l__chnative_init_00127 -l__chnative_init_00108: -;source-doc/base-drv/usb-init.c:58: print_string("\r\nCH376: PRESENT (VER $"); +;source-doc/base-drv/usb-init.c:107: print_string("VERSION FAILURE\r\n$"); ld hl,usb_init_str_5 call _print_string -l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:61: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:63: print_hex(ch_cmd_get_ic_version()); - call _ch_cmd_get_ic_version +;source-doc/base-drv/usb-init.c:108: return; + jr l__chnative_init_00111 +l__chnative_init_00102: +;source-doc/base-drv/usb-init.c:111: print_hex(r >> 8); + push bc + ld l, d call _print_hex -;source-doc/base-drv/usb-init.c:64: print_string("); $"); +;source-doc/base-drv/usb-init.c:112: print_string("); $"); ld hl,usb_init_str_6 call _print_string -;source-doc/base-drv/usb-init.c:66: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 80 : 5); i++) { - ld c,0x00 -l__chnative_init_00125: - bit 0,(ix+4) - jr Z,l__chnative_init_00129 - ld b,0x50 - jr l__chnative_init_00130 -l__chnative_init_00129: - ld b,0x05 -l__chnative_init_00130: - ld a, c - sub b - jr NC,l__chnative_init_00121 -;source-doc/base-drv/usb-init.c:69: const uint8_t r = ch_very_short_wait_int_and_get_(); - push bc - call _ch_very_short_wait_int_and_get - ld a, l - pop bc -;source-doc/base-drv/usb-init.c:71: if (r == USB_INT_CONNECT) { - sub 0x81 - jr NZ,l__chnative_init_00126 -;source-doc/base-drv/usb-init.c:72: print_string("USB: CONNECTED$"); +;source-doc/base-drv/usb-init.c:114: print_string("USB: *$"); ld hl,usb_init_str_7 call _print_string -;source-doc/base-drv/usb-init.c:74: enumerate_all_devices(); - call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:76: if (forced && count_of_devices() == 0) { - bit 0,(ix+4) - jr Z,l__chnative_init_00118 - call _count_of_devices - or a - jr NZ,l__chnative_init_00118 -;source-doc/base-drv/usb-init.c:77: print_string("\r\nUSB: SCANNING $"); + pop bc +;source-doc/base-drv/usb-init.c:116: r = wait_for_state(loop_counter, state, 3); + ld a,0x03 + push af + inc sp + ld l, c + ld a,(ix-1) + call _wait_for_state + ld b, e +;source-doc/base-drv/usb-init.c:117: state = r & 255; +;source-doc/base-drv/usb-init.c:119: if (state == 2) { + ld a, b + sub 0x02 + jr NZ,l__chnative_init_00104 +;source-doc/base-drv/usb-init.c:120: print_string("\bDISCONNECTED$"); ld hl,usb_init_str_8 call _print_string -;source-doc/base-drv/usb-init.c:79: for (i = 0; i < 10; i++) { - ld (ix-1),0x00 -l__chnative_init_00122: -;source-doc/base-drv/usb-init.c:80: print_string(".$"); +;source-doc/base-drv/usb-init.c:121: return; + jr l__chnative_init_00111 +l__chnative_init_00104: +;source-doc/base-drv/usb-init.c:124: print_string("\bCONNECTED$"); + push bc ld hl,usb_init_str_9 call _print_string -;source-doc/base-drv/usb-init.c:81: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld hl,_x - ld (hl),0x00 - ld e, l - ld d, h - inc de - ld bc,0x0068 - ldir -;source-doc/base-drv/usb-init.c:82: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:84: delay_medium(); - call _delay_medium -;source-doc/base-drv/usb-init.c:85: enumerate_all_devices(); - call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:87: if (count_of_devices() > 0) - call _count_of_devices - or a - jr NZ,l__chnative_init_00118 -;source-doc/base-drv/usb-init.c:79: for (i = 0; i < 10; i++) { - inc (ix-1) - ld a,(ix-1) - sub 0x0a - jr C,l__chnative_init_00122 -;source-doc/base-drv/usb-init.c:92: connected: -l__chnative_init_00118: -;source-doc/base-drv/usb-init.c:93: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/usb-init.c:127: r = ch376_init(state); + inc sp + call _ch376_init + inc sp + ex de, hl +;source-doc/base-drv/usb-init.c:128: state = r & 255; + ld b, e +;source-doc/base-drv/usb-init.c:130: for (uint8_t i = 0; i < loop_counter; i++) { + ld c,0x00 +l__chnative_init_00109: + ld a, c + sub (ix-1) + jr NC,l__chnative_init_00111 +;source-doc/base-drv/usb-init.c:131: if (r >> 8 != 0) ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:94: return; - jr l__chnative_init_00127 -l__chnative_init_00126: -;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 80 : 5); i++) { - inc c - jr l__chnative_init_00125 -l__chnative_init_00121: -;source-doc/base-drv/usb-init.c:98: USB_MODULE_LEDS = 0x03; - ld a,0x03 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:99: print_string("USB: DISCONNECTED$"); + or d + jr NZ,l__chnative_init_00111 +;source-doc/base-drv/usb-init.c:134: print_string(".$"); + push bc ld hl,usb_init_str_10 call _print_string -l__chnative_init_00127: -;source-doc/base-drv/usb-init.c:100: } + pop bc +;source-doc/base-drv/usb-init.c:135: r = ch376_init(state); + push bc + push bc + inc sp + call _ch376_init + inc sp + ex de, hl + pop bc +;source-doc/base-drv/usb-init.c:136: state = r & 255; + ld b, e +;source-doc/base-drv/usb-init.c:130: for (uint8_t i = 0; i < loop_counter; i++) { + inc c + jr l__chnative_init_00109 +l__chnative_init_00111: +;source-doc/base-drv/usb-init.c:138: } inc sp pop ix ret -usb_init_str_0: +usb_init_str_2: DEFB 0x0d DEFB 0x0a DEFM "CH376: *$" DEFB 0x00 -usb_init_str_1: - DEFB 0x08 - DEFM " $" - DEFB 0x00 -usb_init_str_2: - DEFB 0x08 - DEFM "*$" - DEFB 0x00 usb_init_str_3: DEFB 0x08 DEFM "PRESENT (VER $" DEFB 0x00 usb_init_str_4: DEFB 0x0d - DEFB 0x0a - DEFM "CH376: NOT PRESENT$" + DEFM "CH376: $" DEFB 0x00 usb_init_str_5: + DEFM "VERSION FAILURE" DEFB 0x0d DEFB 0x0a - DEFM "CH376: PRESENT (VER $" + DEFM "$" DEFB 0x00 usb_init_str_6: DEFM "); $" DEFB 0x00 usb_init_str_7: - DEFM "USB: CONNECTED$" + DEFM "USB: *$" DEFB 0x00 usb_init_str_8: - DEFB 0x0d - DEFB 0x0a - DEFM "USB: SCANNING $" + DEFB 0x08 + DEFM "DISCONNECTED$" DEFB 0x00 usb_init_str_9: - DEFM ".$" + DEFB 0x08 + DEFM "CONNECTED$" DEFB 0x00 usb_init_str_10: - DEFM "USB: DISCONNECTED$" + DEFM ".$" DEFB 0x00 -;source-doc/base-drv/usb-init.c:102: void chnative_init_force(void) { _chnative_init(true); } +;source-doc/base-drv/usb-init.c:140: void chnative_init_force(void) { _chnative_init(true); } ; --------------------------------- ; Function chnative_init_force ; --------------------------------- @@ -330,7 +452,7 @@ _chnative_init_force: call __chnative_init inc sp ret -;source-doc/base-drv/usb-init.c:104: void chnative_init(void) { _chnative_init(false); } +;source-doc/base-drv/usb-init.c:142: void chnative_init(void) { _chnative_init(false); } ; --------------------------------- ; Function chnative_init ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c index 6f67636d..5a5fea30 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c @@ -22,81 +22,119 @@ static usb_error usb_host_bus_reset(void) { #define ERASE_LINE "\x1B\x6C\r$" -void _chnative_init(bool forced) { - memset(get_usb_work_area(), 0, sizeof(_usb_state)); +uint16_t ch376_init(uint8_t state) { + uint8_t r; USB_MODULE_LEDS = 0x03; - ch_cmd_reset_all(); + if (state == 0) { + ch_cmd_reset_all(); + delay_medium(); - delay_medium(); + if (!ch_probe()) { + USB_MODULE_LEDS = 0x00; + return 0xFF00; + } + USB_MODULE_LEDS = 0x00; + return 1; + } - if (forced) { - bool indicator = true; - print_string("\r\nCH376: *$"); - while (!ch_probe()) { - if (indicator) { - USB_MODULE_LEDS = 0x00; - print_string("\b $"); - } else { - USB_MODULE_LEDS = 0x03; - print_string("\b*$"); - } + if (state == 1) { + r = ch_cmd_get_ic_version(); - delay_medium(); - indicator = !indicator; - } + USB_MODULE_LEDS = 0x00; + return (uint16_t)r << 8 | 2; + } - print_string("\bPRESENT (VER $"); - } else { - if (!ch_probe()) { - USB_MODULE_LEDS = 0x03; - print_string("\r\nCH376: NOT PRESENT$"); - return; + if (state == 2) { + usb_host_bus_reset(); + + r = ch_very_short_wait_int_and_get_status(); + + if (r != USB_INT_CONNECT) { + USB_MODULE_LEDS = 0x00; + return 2; } - print_string("\r\nCH376: PRESENT (VER $"); + return 3; } + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + if (state != 2) { + usb_host_bus_reset(); + delay_medium(); + } + enumerate_all_devices(); USB_MODULE_LEDS = 0x00; + return (uint16_t)count_of_devices() << 8 | state + 1; +} - print_hex(ch_cmd_get_ic_version()); - print_string("); $"); +static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { + uint16_t r = state; - usb_host_bus_reset(); + for (uint8_t i = 0; i < loop_counter; i++) { + if (state == desired_state) + break; - for (uint8_t i = 0; i < (forced ? 80 : 5); i++) { - const uint8_t r = ch_very_short_wait_int_and_get_status(); + if (i & 1) + print_string("\b $"); + else + print_string("\b*$"); - if (r == USB_INT_CONNECT) { - print_string("USB: CONNECTED$"); + r = ch376_init(state); + state = r & 255; + } - enumerate_all_devices(); + return r; +} - if (forced && count_of_devices() == 0) { - print_string("\r\nUSB: SCANNING $"); +void _chnative_init(bool forced) { + uint8_t state = 0; + uint16_t r; + const uint8_t loop_counter = forced ? 40 : 5; - for (i = 0; i < 10; i++) { - print_string(".$"); - memset(get_usb_work_area(), 0, sizeof(_usb_state)); - usb_host_bus_reset(); + print_string("\r\nCH376: *$"); - delay_medium(); - enumerate_all_devices(); + r = wait_for_state(loop_counter, state, 1); + state = r & 255; - if (count_of_devices() > 0) - goto connected; - } - } + print_string("\bPRESENT (VER $"); - connected: - USB_MODULE_LEDS = 0x00; - return; - } + r = ch376_init(state); + state = r & 255; + if (state != 2) { + print_string("\rCH376: $"); + print_string("VERSION FAILURE\r\n$"); + return; } - USB_MODULE_LEDS = 0x03; - print_string("USB: DISCONNECTED$"); + print_hex(r >> 8); + print_string("); $"); + + print_string("USB: *$"); + + r = wait_for_state(loop_counter, state, 3); + state = r & 255; + + if (state == 2) { + print_string("\bDISCONNECTED$"); + return; + } + + print_string("\bCONNECTED$"); + + // enumerate.... + r = ch376_init(state); + state = r & 255; + + for (uint8_t i = 0; i < loop_counter; i++) { + if (r >> 8 != 0) + break; + + print_string(".$"); + r = ch376_init(state); + state = r & 255; + } } void chnative_init_force(void) { _chnative_init(true); } From 347b7e6a06ae847233b82d9174cbac2effca0560 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 20 Apr 2025 11:34:50 +1000 Subject: [PATCH 36/59] ch376-native: refactor: extracted chnative_init to its own file --- Source/HBIOS/ch376-native/base-drv.s | 3 +- .../ch376-native/base-drv/ch376_init.c.s | 302 ++++++++++++++++++ .../HBIOS/ch376-native/base-drv/usb_init.c.s | 210 ++++++++++++ .../source-doc/base-drv/ch376_init.c | 74 +++++ .../source-doc/base-drv/usb-init.c | 142 -------- .../source-doc/base-drv/usb_init.c | 69 ++++ .../source-doc/base-drv/usb_init.h | 8 + 7 files changed, 665 insertions(+), 143 deletions(-) create mode 100644 Source/HBIOS/ch376-native/base-drv/ch376_init.c.s create mode 100644 Source/HBIOS/ch376-native/base-drv/usb_init.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c delete mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index fb66e985..ed11de0a 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -1,5 +1,6 @@ ; Generated File -- not to be modify directly #include "ch376-native/base-drv/ch376.c.s" +#include "ch376-native/base-drv/ch376_init.c.s" #include "ch376-native/base-drv/class_hub.c.s" #include "ch376-native/base-drv/critical-section.c.s" #include "ch376-native/base-drv/dev_transfers.c.s" @@ -9,6 +10,6 @@ #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/transfers.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" -#include "ch376-native/base-drv/usb-init.c.s" +#include "ch376-native/base-drv/usb_init.c.s" #include "ch376-native/base-drv/usb_state.c.s" #include "ch376-native/base-drv/work-area.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s new file mode 100644 index 00000000..2081c4db --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -0,0 +1,302 @@ +; +; Generated from source-doc/base-drv/ch376_init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/ch376_init.c:4: static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { +; --------------------------------- +; Function wait_for_state +; --------------------------------- +_wait_for_state: + push ix + ld ix,0 + add ix,sp + dec sp + ld (ix-1),a + ld b, l +;source-doc/base-drv/ch376_init.c:5: uint16_t r = state; + ld e, b +;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) { + ld d,0x00 + ld c,d +l_wait_for_state_00108: + ld a, c + sub (ix-1) + jr NC,l_wait_for_state_00106 +;source-doc/base-drv/ch376_init.c:8: if (state == desired_state) + ld a,(ix+4) + sub b + jr Z,l_wait_for_state_00106 +;source-doc/base-drv/ch376_init.c:11: if (i & 1) + bit 0, c + jr Z,l_wait_for_state_00104 +;source-doc/base-drv/ch376_init.c:12: print_string("\b $"); + push bc + ld hl,ch376_init_str_0 + call _print_string + pop bc + jr l_wait_for_state_00105 +l_wait_for_state_00104: +;source-doc/base-drv/ch376_init.c:14: print_string("\b*$"); + push bc + ld hl,ch376_init_str_1 + call _print_string + pop bc +l_wait_for_state_00105: +;source-doc/base-drv/ch376_init.c:16: r = usb_init(state); + push bc + push bc + inc sp + call _usb_init + inc sp + ex de, hl + pop bc +;source-doc/base-drv/ch376_init.c:17: state = r & 255; + ld b, e +;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) { + inc c + jr l_wait_for_state_00108 +l_wait_for_state_00106: +;source-doc/base-drv/ch376_init.c:20: return r; +;source-doc/base-drv/ch376_init.c:21: } + inc sp + pop ix + pop hl + inc sp + jp (hl) +ch376_init_str_0: + DEFB 0x08 + DEFM " $" + DEFB 0x00 +ch376_init_str_1: + DEFB 0x08 + DEFM "*$" + DEFB 0x00 +;source-doc/base-drv/ch376_init.c:23: static void _chnative_init(bool forced) { +; --------------------------------- +; Function _chnative_init +; --------------------------------- +__chnative_init: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/ch376_init.c:26: const uint8_t loop_counter = forced ? 40 : 5; + bit 0,(ix+4) + jr Z,l__chnative_init_00113 + ld a,0x28 + jr l__chnative_init_00114 +l__chnative_init_00113: + ld a,0x05 +l__chnative_init_00114: + ld (ix-1),a +;source-doc/base-drv/ch376_init.c:28: print_string("\r\nCH376: *$"); + ld hl,ch376_init_str_2 + call _print_string +;source-doc/base-drv/ch376_init.c:30: r = wait_for_state(loop_counter, state, 1); + ld a,0x01 + push af + inc sp + ld l,0x00 + ld a,(ix-1) + call _wait_for_state + ld b, e +;source-doc/base-drv/ch376_init.c:31: state = r & 255; +;source-doc/base-drv/ch376_init.c:33: print_string("\bPRESENT (VER $"); + push bc + ld hl,ch376_init_str_3 + call _print_string +;source-doc/base-drv/ch376_init.c:35: r = usb_init(state); + inc sp + call _usb_init + inc sp + ex de, hl +;source-doc/base-drv/ch376_init.c:36: state = r & 255; + ld c, e +;source-doc/base-drv/ch376_init.c:37: if (state != 2) { + ld a, c + sub 0x02 + jr Z,l__chnative_init_00102 +;source-doc/base-drv/ch376_init.c:38: print_string("\rCH376: $"); + ld hl,ch376_init_str_4 + call _print_string +;source-doc/base-drv/ch376_init.c:39: print_string("VERSION FAILURE\r\n$"); + ld hl,ch376_init_str_5 + call _print_string +;source-doc/base-drv/ch376_init.c:40: return; + jr l__chnative_init_00111 +l__chnative_init_00102: +;source-doc/base-drv/ch376_init.c:43: print_hex(r >> 8); + push bc + ld l, d + call _print_hex +;source-doc/base-drv/ch376_init.c:44: print_string("); $"); + ld hl,ch376_init_str_6 + call _print_string +;source-doc/base-drv/ch376_init.c:46: print_string("USB: *$"); + ld hl,ch376_init_str_7 + call _print_string + pop bc +;source-doc/base-drv/ch376_init.c:48: r = wait_for_state(loop_counter, state, 3); + ld a,0x03 + push af + inc sp + ld l, c + ld a,(ix-1) + call _wait_for_state + ld b, e +;source-doc/base-drv/ch376_init.c:49: state = r & 255; +;source-doc/base-drv/ch376_init.c:51: if (state == 2) { + ld a, b + sub 0x02 + jr NZ,l__chnative_init_00104 +;source-doc/base-drv/ch376_init.c:52: print_string("\bDISCONNECTED$"); + ld hl,ch376_init_str_8 + call _print_string +;source-doc/base-drv/ch376_init.c:53: return; + jr l__chnative_init_00111 +l__chnative_init_00104: +;source-doc/base-drv/ch376_init.c:56: print_string("\bCONNECTED$"); + push bc + ld hl,ch376_init_str_9 + call _print_string +;source-doc/base-drv/ch376_init.c:59: r = usb_init(state); + inc sp + call _usb_init + inc sp + ex de, hl +;source-doc/base-drv/ch376_init.c:60: state = r & 255; + ld b, e +;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { + ld c,0x00 +l__chnative_init_00109: + ld a, c + sub (ix-1) + jr NC,l__chnative_init_00111 +;source-doc/base-drv/ch376_init.c:63: if (r >> 8 != 0) + ld a,0x00 + or d + jr NZ,l__chnative_init_00111 +;source-doc/base-drv/ch376_init.c:66: print_string(".$"); + push bc + ld hl,ch376_init_str_10 + call _print_string + pop bc +;source-doc/base-drv/ch376_init.c:67: r = usb_init(state); + push bc + push bc + inc sp + call _usb_init + inc sp + ex de, hl + pop bc +;source-doc/base-drv/ch376_init.c:68: state = r & 255; + ld b, e +;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { + inc c + jr l__chnative_init_00109 +l__chnative_init_00111: +;source-doc/base-drv/ch376_init.c:70: } + inc sp + pop ix + ret +ch376_init_str_2: + DEFB 0x0d + DEFB 0x0a + DEFM "CH376: *$" + DEFB 0x00 +ch376_init_str_3: + DEFB 0x08 + DEFM "PRESENT (VER $" + DEFB 0x00 +ch376_init_str_4: + DEFB 0x0d + DEFM "CH376: $" + DEFB 0x00 +ch376_init_str_5: + DEFM "VERSION FAILURE" + DEFB 0x0d + DEFB 0x0a + DEFM "$" + DEFB 0x00 +ch376_init_str_6: + DEFM "); $" + DEFB 0x00 +ch376_init_str_7: + DEFM "USB: *$" + DEFB 0x00 +ch376_init_str_8: + DEFB 0x08 + DEFM "DISCONNECTED$" + DEFB 0x00 +ch376_init_str_9: + DEFB 0x08 + DEFM "CONNECTED$" + DEFB 0x00 +ch376_init_str_10: + DEFM ".$" + DEFB 0x00 +;source-doc/base-drv/ch376_init.c:72: void chnative_init_force(void) { _chnative_init(true); } +; --------------------------------- +; Function chnative_init_force +; --------------------------------- +_chnative_init_force: + ld a,0x01 + push af + inc sp + call __chnative_init + inc sp + ret +;source-doc/base-drv/ch376_init.c:74: void chnative_init(void) { _chnative_init(false); } +; --------------------------------- +; Function chnative_init +; --------------------------------- +_chnative_init: + xor a + push af + inc sp + call __chnative_init + inc sp + ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s new file mode 100644 index 00000000..09fd1e9b --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s @@ -0,0 +1,210 @@ +; +; Generated from source-doc/base-drv/usb_init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/usb_init.c:7: static usb_error usb_host_bus_reset(void) { +; --------------------------------- +; Function usb_host_bus_reset +; --------------------------------- +_usb_host_bus_reset: +;source-doc/base-drv/usb_init.c:8: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb_init.c:9: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb_init.c:11: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + ld l,0x07 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb_init.c:12: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb_init.c:14: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb_init.c:15: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/ch376.h:110: #endif + ld l,0x0b + call _ch_command +;source-doc/base-drv/ch376.h:111: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/usb_init.c:19: return USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/usb_init.c:20: } + ret +;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) { +; --------------------------------- +; Function usb_init +; --------------------------------- +_usb_init: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/usb_init.c:27: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:29: if (state == 0) { + ld a,(ix+4) + or a + jr NZ,l_usb_init_00104 +;source-doc/base-drv/usb_init.c:30: ch_cmd_reset_all(); + call _ch_cmd_reset_all +;source-doc/base-drv/usb_init.c:31: delay_medium(); + call _delay_medium +;source-doc/base-drv/usb_init.c:33: if (!ch_probe()) { + call _ch_probe + ld a, l +;source-doc/base-drv/usb_init.c:34: USB_MODULE_LEDS = 0x00; + or a + jr NZ,l_usb_init_00102 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:35: return 0xFF00; + ld hl,0xff00 + jp l_usb_init_00113 +l_usb_init_00102: +;source-doc/base-drv/usb_init.c:37: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:38: return 1; + ld hl,0x0001 + jr l_usb_init_00113 +l_usb_init_00104: +;source-doc/base-drv/usb_init.c:41: if (state == 1) { + ld a,(ix+4) + dec a + jr NZ,l_usb_init_00106 +;source-doc/base-drv/usb_init.c:42: r = ch_cmd_get_ic_version(); + call _ch_cmd_get_ic_version +;source-doc/base-drv/usb_init.c:44: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:45: return (uint16_t)r << 8 | 2; + xor a + ld h, l + ld l,0x02 + jr l_usb_init_00113 +l_usb_init_00106: +;source-doc/base-drv/usb_init.c:48: if (state == 2) { + ld a,(ix+4) + sub 0x02 + jr NZ,l_usb_init_00159 + ld a,0x01 + jr l_usb_init_00160 +l_usb_init_00159: + xor a +l_usb_init_00160: + ld c,a + or a + jr Z,l_usb_init_00110 +;source-doc/base-drv/usb_init.c:49: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb_init.c:51: r = ch_very_short_wait_int_and_get_(); + call _ch_very_short_wait_int_and_get + ld a, l +;source-doc/base-drv/usb_init.c:53: if (r != USB_INT_CONNECT) { + sub 0x81 + jr Z,l_usb_init_00108 +;source-doc/base-drv/usb_init.c:54: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:55: return 2; + ld hl,0x0002 + jr l_usb_init_00113 +l_usb_init_00108: +;source-doc/base-drv/usb_init.c:58: return 3; + ld hl,0x0003 + jr l_usb_init_00113 +l_usb_init_00110: +;source-doc/base-drv/usb_init.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld b,0x35 + ld hl,_x + jr l_usb_init_00163 +l_usb_init_00162: + ld (hl),0x00 + inc hl +l_usb_init_00163: + ld (hl),0x00 + inc hl + djnz l_usb_init_00162 +;source-doc/base-drv/usb_init.c:62: if (state != 2) { + bit 0, c + jr NZ,l_usb_init_00112 +;source-doc/base-drv/usb_init.c:63: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb_init.c:64: delay_medium(); + call _delay_medium +l_usb_init_00112: +;source-doc/base-drv/usb_init.c:66: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb_init.c:67: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | state + 1; + call _count_of_devices + ld c,(ix+4) + ld b,0x00 + inc bc + or b + ld h, a + ld l, c +l_usb_init_00113: +;source-doc/base-drv/usb_init.c:69: } + pop ix + ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c new file mode 100644 index 00000000..642695a1 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c @@ -0,0 +1,74 @@ +#include "print.h" +#include "usb_init.h" + +static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { + uint16_t r = state; + + for (uint8_t i = 0; i < loop_counter; i++) { + if (state == desired_state) + break; + + if (i & 1) + print_string("\b $"); + else + print_string("\b*$"); + + r = usb_init(state); + state = r & 255; + } + + return r; +} + +static void _chnative_init(bool forced) { + uint8_t state = 0; + uint16_t r; + const uint8_t loop_counter = forced ? 40 : 5; + + print_string("\r\nCH376: *$"); + + r = wait_for_state(loop_counter, state, 1); + state = r & 255; + + print_string("\bPRESENT (VER $"); + + r = usb_init(state); + state = r & 255; + if (state != 2) { + print_string("\rCH376: $"); + print_string("VERSION FAILURE\r\n$"); + return; + } + + print_hex(r >> 8); + print_string("); $"); + + print_string("USB: *$"); + + r = wait_for_state(loop_counter, state, 3); + state = r & 255; + + if (state == 2) { + print_string("\bDISCONNECTED$"); + return; + } + + print_string("\bCONNECTED$"); + + // enumerate.... + r = usb_init(state); + state = r & 255; + + for (uint8_t i = 0; i < loop_counter; i++) { + if (r >> 8 != 0) + break; + + print_string(".$"); + r = usb_init(state); + state = r & 255; + } +} + +void chnative_init_force(void) { _chnative_init(true); } + +void chnative_init(void) { _chnative_init(false); } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c deleted file mode 100644 index 5a5fea30..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "ch376.h" -#include "enumerate.h" -#include "print.h" -#include "work-area.h" -#include "z80.h" -#include - -static usb_error usb_host_bus_reset(void) { - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_configure_nak_retry_3s(); - - return USB_ERR_OK; -} - -#define ERASE_LINE "\x1B\x6C\r$" - -uint16_t ch376_init(uint8_t state) { - uint8_t r; - - USB_MODULE_LEDS = 0x03; - - if (state == 0) { - ch_cmd_reset_all(); - delay_medium(); - - if (!ch_probe()) { - USB_MODULE_LEDS = 0x00; - return 0xFF00; - } - USB_MODULE_LEDS = 0x00; - return 1; - } - - if (state == 1) { - r = ch_cmd_get_ic_version(); - - USB_MODULE_LEDS = 0x00; - return (uint16_t)r << 8 | 2; - } - - if (state == 2) { - usb_host_bus_reset(); - - r = ch_very_short_wait_int_and_get_status(); - - if (r != USB_INT_CONNECT) { - USB_MODULE_LEDS = 0x00; - return 2; - } - - return 3; - } - - memset(get_usb_work_area(), 0, sizeof(_usb_state)); - if (state != 2) { - usb_host_bus_reset(); - delay_medium(); - } - enumerate_all_devices(); - USB_MODULE_LEDS = 0x00; - return (uint16_t)count_of_devices() << 8 | state + 1; -} - -static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { - uint16_t r = state; - - for (uint8_t i = 0; i < loop_counter; i++) { - if (state == desired_state) - break; - - if (i & 1) - print_string("\b $"); - else - print_string("\b*$"); - - r = ch376_init(state); - state = r & 255; - } - - return r; -} - -void _chnative_init(bool forced) { - uint8_t state = 0; - uint16_t r; - const uint8_t loop_counter = forced ? 40 : 5; - - print_string("\r\nCH376: *$"); - - r = wait_for_state(loop_counter, state, 1); - state = r & 255; - - print_string("\bPRESENT (VER $"); - - r = ch376_init(state); - state = r & 255; - if (state != 2) { - print_string("\rCH376: $"); - print_string("VERSION FAILURE\r\n$"); - return; - } - - print_hex(r >> 8); - print_string("); $"); - - print_string("USB: *$"); - - r = wait_for_state(loop_counter, state, 3); - state = r & 255; - - if (state == 2) { - print_string("\bDISCONNECTED$"); - return; - } - - print_string("\bCONNECTED$"); - - // enumerate.... - r = ch376_init(state); - state = r & 255; - - for (uint8_t i = 0; i < loop_counter; i++) { - if (r >> 8 != 0) - break; - - print_string(".$"); - r = ch376_init(state); - state = r & 255; - } -} - -void chnative_init_force(void) { _chnative_init(true); } - -void chnative_init(void) { _chnative_init(false); } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c new file mode 100644 index 00000000..319f9416 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c @@ -0,0 +1,69 @@ +#include "usb_init.h" +#include "ch376.h" +#include "enumerate.h" +#include "work-area.h" +#include + +static usb_error usb_host_bus_reset(void) { + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_configure_nak_retry_3s(); + + return USB_ERR_OK; +} + +#define ERASE_LINE "\x1B\x6C\r$" + +uint16_t usb_init(uint8_t state) { + uint8_t r; + + USB_MODULE_LEDS = 0x03; + + if (state == 0) { + ch_cmd_reset_all(); + delay_medium(); + + if (!ch_probe()) { + USB_MODULE_LEDS = 0x00; + return 0xFF00; + } + USB_MODULE_LEDS = 0x00; + return 1; + } + + if (state == 1) { + r = ch_cmd_get_ic_version(); + + USB_MODULE_LEDS = 0x00; + return (uint16_t)r << 8 | 2; + } + + if (state == 2) { + usb_host_bus_reset(); + + r = ch_very_short_wait_int_and_get_status(); + + if (r != USB_INT_CONNECT) { + USB_MODULE_LEDS = 0x00; + return 2; + } + + return 3; + } + + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + if (state != 2) { + usb_host_bus_reset(); + delay_medium(); + } + enumerate_all_devices(); + USB_MODULE_LEDS = 0x00; + return (uint16_t)count_of_devices() << 8 | state + 1; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h new file mode 100644 index 00000000..08808955 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h @@ -0,0 +1,8 @@ +#ifndef __USB_INIT +#define __USB_INIT + +#include + +extern uint16_t usb_init(uint8_t state); + +#endif From c350d153da319c2b2ec0935917e41ceeb16520df Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 20 Apr 2025 13:44:31 +1000 Subject: [PATCH 37/59] ch376-native: optimised calling convention for usb_init --- .../ch376-native/base-drv/ch376_init.c.s | 50 ++++++++----------- .../HBIOS/ch376-native/base-drv/usb_init.c.s | 21 +++----- .../source-doc/base-drv/usb_init.c | 4 +- .../source-doc/base-drv/usb_init.h | 2 +- 4 files changed, 32 insertions(+), 45 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s index 2081c4db..e6eb0011 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -55,22 +55,22 @@ _wait_for_state: add ix,sp dec sp ld (ix-1),a - ld b, l ;source-doc/base-drv/ch376_init.c:5: uint16_t r = state; - ld e, b + ld c,l + ld e,l ;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) { ld d,0x00 - ld c,d + ld b,d l_wait_for_state_00108: - ld a, c + ld a, b sub (ix-1) jr NC,l_wait_for_state_00106 ;source-doc/base-drv/ch376_init.c:8: if (state == desired_state) ld a,(ix+4) - sub b + sub c jr Z,l_wait_for_state_00106 ;source-doc/base-drv/ch376_init.c:11: if (i & 1) - bit 0, c + bit 0, b jr Z,l_wait_for_state_00104 ;source-doc/base-drv/ch376_init.c:12: print_string("\b $"); push bc @@ -87,16 +87,14 @@ l_wait_for_state_00104: l_wait_for_state_00105: ;source-doc/base-drv/ch376_init.c:16: r = usb_init(state); push bc - push bc - inc sp + ld l, c call _usb_init - inc sp ex de, hl pop bc ;source-doc/base-drv/ch376_init.c:17: state = r & 255; - ld b, e + ld c, e ;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) { - inc c + inc b jr l_wait_for_state_00108 l_wait_for_state_00106: ;source-doc/base-drv/ch376_init.c:20: return r; @@ -142,16 +140,15 @@ l__chnative_init_00114: ld l,0x00 ld a,(ix-1) call _wait_for_state - ld b, e ;source-doc/base-drv/ch376_init.c:31: state = r & 255; ;source-doc/base-drv/ch376_init.c:33: print_string("\bPRESENT (VER $"); - push bc + push de ld hl,ch376_init_str_3 call _print_string + pop de ;source-doc/base-drv/ch376_init.c:35: r = usb_init(state); - inc sp + ld l, e call _usb_init - inc sp ex de, hl ;source-doc/base-drv/ch376_init.c:36: state = r & 255; ld c, e @@ -186,10 +183,9 @@ l__chnative_init_00102: ld l, c ld a,(ix-1) call _wait_for_state - ld b, e ;source-doc/base-drv/ch376_init.c:49: state = r & 255; ;source-doc/base-drv/ch376_init.c:51: if (state == 2) { - ld a, b + ld a, e sub 0x02 jr NZ,l__chnative_init_00104 ;source-doc/base-drv/ch376_init.c:52: print_string("\bDISCONNECTED$"); @@ -199,20 +195,20 @@ l__chnative_init_00102: jr l__chnative_init_00111 l__chnative_init_00104: ;source-doc/base-drv/ch376_init.c:56: print_string("\bCONNECTED$"); - push bc + push de ld hl,ch376_init_str_9 call _print_string + pop de ;source-doc/base-drv/ch376_init.c:59: r = usb_init(state); - inc sp + ld l, e call _usb_init - inc sp ex de, hl ;source-doc/base-drv/ch376_init.c:60: state = r & 255; - ld b, e + ld c, e ;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { - ld c,0x00 + ld b,0x00 l__chnative_init_00109: - ld a, c + ld a, b sub (ix-1) jr NC,l__chnative_init_00111 ;source-doc/base-drv/ch376_init.c:63: if (r >> 8 != 0) @@ -226,16 +222,14 @@ l__chnative_init_00109: pop bc ;source-doc/base-drv/ch376_init.c:67: r = usb_init(state); push bc - push bc - inc sp + ld l, c call _usb_init - inc sp ex de, hl pop bc ;source-doc/base-drv/ch376_init.c:68: state = r & 255; - ld b, e + ld c, e ;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { - inc c + inc b jr l__chnative_init_00109 l__chnative_init_00111: ;source-doc/base-drv/ch376_init.c:70: } diff --git a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s index 09fd1e9b..1d3054c2 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s @@ -83,20 +83,17 @@ _usb_host_bus_reset: ld l,0x00 ;source-doc/base-drv/usb_init.c:20: } ret -;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) { +;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) __z88dk_fastcall { ; --------------------------------- ; Function usb_init ; --------------------------------- _usb_init: - push ix - ld ix,0 - add ix,sp ;source-doc/base-drv/usb_init.c:27: USB_MODULE_LEDS = 0x03; ld a,0x03 ld bc,_USB_MODULE_LEDS out (c), a ;source-doc/base-drv/usb_init.c:29: if (state == 0) { - ld a,(ix+4) + ld a, l or a jr NZ,l_usb_init_00104 ;source-doc/base-drv/usb_init.c:30: ch_cmd_reset_all(); @@ -124,7 +121,7 @@ l_usb_init_00102: jr l_usb_init_00113 l_usb_init_00104: ;source-doc/base-drv/usb_init.c:41: if (state == 1) { - ld a,(ix+4) + ld a, l dec a jr NZ,l_usb_init_00106 ;source-doc/base-drv/usb_init.c:42: r = ch_cmd_get_ic_version(); @@ -140,7 +137,7 @@ l_usb_init_00104: jr l_usb_init_00113 l_usb_init_00106: ;source-doc/base-drv/usb_init.c:48: if (state == 2) { - ld a,(ix+4) + ld a, l sub 0x02 jr NZ,l_usb_init_00159 ld a,0x01 @@ -196,15 +193,11 @@ l_usb_init_00112: ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | state + 1; +;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | 4; call _count_of_devices - ld c,(ix+4) - ld b,0x00 - inc bc - or b ld h, a - ld l, c + xor a + ld l,0x04 l_usb_init_00113: ;source-doc/base-drv/usb_init.c:69: } - pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c index 319f9416..3585cc28 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c @@ -21,7 +21,7 @@ static usb_error usb_host_bus_reset(void) { #define ERASE_LINE "\x1B\x6C\r$" -uint16_t usb_init(uint8_t state) { +uint16_t usb_init(uint8_t state) __z88dk_fastcall { uint8_t r; USB_MODULE_LEDS = 0x03; @@ -65,5 +65,5 @@ uint16_t usb_init(uint8_t state) { } enumerate_all_devices(); USB_MODULE_LEDS = 0x00; - return (uint16_t)count_of_devices() << 8 | state + 1; + return (uint16_t)count_of_devices() << 8 | 4; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h index 08808955..ed6af87d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h @@ -3,6 +3,6 @@ #include -extern uint16_t usb_init(uint8_t state); +extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; #endif From 2b5a224a4f47d89b67057aaf2942e4b58de6c138 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 20 Apr 2025 14:22:21 +1000 Subject: [PATCH 38/59] ch376-native: refactor: moved drive index tracking logic out of drivers into usb framework --- .vscode/settings.json | 4 +- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 109 ++++++++++++++---- .../base-drv/enumerate_storage.c.s | 2 +- .../ch376-native/base-drv/usb-base-drv.c.s | 12 +- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 29 ++--- .../source-doc/base-drv/enumerate.c | 24 +++- .../source-doc/base-drv/enumerate.h | 3 +- .../source-doc/base-drv/enumerate_storage.c | 2 +- .../source-doc/base-drv/enumerate_storage.h | 2 +- .../source-doc/base-drv/usb-base-drv.c | 3 - .../source-doc/scsi-drv/scsi-init.c | 3 +- .../source-doc/ufi-drv/ufi-init.c | 3 +- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 103 ++++++++--------- 13 files changed, 180 insertions(+), 119 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b1314ed9..a1edd90b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -21,6 +21,8 @@ "usb-base-drv.h": "c", "critical-section.h": "c", "enumerate.h": "c", - "ch376inc.h": "c" + "ch376inc.h": "c", + "enumerate_storage.h": "c", + "work-area.h": "c" } } diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index d6ec0f46..4a86dcf6 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -322,7 +322,7 @@ _op_parse_endpoint: jr l_op_parse_endpoint_00104 ;source-doc/base-drv/enumerate.c:63: case USB_IS_MASS_STORAGE: { l_op_parse_endpoint_00102: -;source-doc/base-drv/enumerate.c:64: parse_endpoints(device, endpoint); +;source-doc/base-drv/enumerate.c:64: parse_endpoints((device_config_storage *)device, endpoint); push bc ld l,(ix-2) ld h,(ix-1) @@ -923,37 +923,102 @@ l_read_all_configs_00112: ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { +;source-doc/base-drv/enumerate.c:189: static uint8_t count_storage_devs(enumeration_state *state) { +; --------------------------------- +; Function count_storage_devs +; --------------------------------- +_count_storage_devs: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/enumerate.c:192: do { + ld c,0x01 +l_count_storage_devs_00106: +;source-doc/base-drv/enumerate.c:193: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + push bc + ld a, c + call _get_usb_device_config + pop bc +;source-doc/base-drv/enumerate.c:195: if (storage_device == NULL) + ld a, d + or e + jr Z,l_count_storage_devs_00108 +;source-doc/base-drv/enumerate.c:198: const usb_device_type t = storage_device->type; + ld l, e + ld h, d + ld a, (hl) + and 0x0f +;source-doc/base-drv/enumerate.c:200: if (t == USB_IS_FLOPPY || t == USB_IS_MASS_STORAGE) + cp 0x01 + jr Z,l_count_storage_devs_00103 + sub 0x02 + jr NZ,l_count_storage_devs_00107 +l_count_storage_devs_00103: +;source-doc/base-drv/enumerate.c:201: storage_device->drive_index = state->storage_count++; + ld hl,0x0010 + add hl, de + ex de, hl + ld l,(ix+4) + ld h,(ix+5) + inc hl + ld a, (hl) + ld b, a + inc b + ld (hl), b + ld (de), a +l_count_storage_devs_00107: +;source-doc/base-drv/enumerate.c:203: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc c + ld a, c + sub 0x07 + jr NZ,l_count_storage_devs_00106 +l_count_storage_devs_00108: +;source-doc/base-drv/enumerate.c:205: return state->storage_count; + ld l,(ix+4) + ld h,(ix+5) + inc hl + ld l, (hl) +;source-doc/base-drv/enumerate.c:206: } + pop ix + ret +;source-doc/base-drv/enumerate.c:208: usb_error enumerate_all_devices(void) { ; --------------------------------- ; Function enumerate_all_devices ; --------------------------------- _enumerate_all_devices: push ix - dec sp -;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); -;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); + ld ix,0 + add ix,sp + push af +;source-doc/base-drv/enumerate.c:209: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/enumerate.c:211: memset(&state, 0, sizeof(enumeration_state)); ld hl,0 add hl, sp - ld e,l - ld d,h - ld (hl),0x00 -;source-doc/base-drv/enumerate.c:193: state.next_device_address = 0; - ld c, e - ld b, d xor a - ld (bc), a -;source-doc/base-drv/enumerate.c:195: usb_error result = read_all_configs(&state); - push bc - push de + ld (hl), a + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:213: usb_error result = read_all_configs(&state); + ld hl,0 + add hl, sp + push hl + push hl call _read_all_configs pop af + ld c, l + pop hl +;source-doc/base-drv/enumerate.c:215: count_storage_devs(&state); + push bc + push hl + call _count_storage_devs + pop af pop bc -;source-doc/base-drv/enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; - ld de,_x + 1 - ld a, (bc) - ld (de), a -;source-doc/base-drv/enumerate.c:200: return result; -;source-doc/base-drv/enumerate.c:201: } - inc sp +;source-doc/base-drv/enumerate.c:217: work_area->count_of_detected_usb_devices = state.next_device_address; + ld a,(ix-2) + ld ((_x + 1)),a +;source-doc/base-drv/enumerate.c:220: return result; + ld l, c +;source-doc/base-drv/enumerate.c:221: } + ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s index d8e57ed5..0b85b094 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/enumerate_storage.c:5: void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint) { +;source-doc/base-drv/enumerate_storage.c:5: void parse_endpoints(device_config_storage *const storage_dev, const endpoint_descriptor const *pEndpoint) { ; --------------------------------- ; Function parse_endpoints ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 314f6d9f..8006021c 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -33,8 +33,6 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk -_storage_count: - DEFS 1 #ENDIF @@ -50,7 +48,7 @@ _storage_count: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb-base-drv.c:6: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +;source-doc/base-drv/usb-base-drv.c:3: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { ; --------------------------------- ; Function chnative_seek ; --------------------------------- @@ -60,7 +58,7 @@ _chnative_seek: add ix,sp ld c, l ld b, h -;source-doc/base-drv/usb-base-drv.c:7: storage_device->current_lba = lba; +;source-doc/base-drv/usb-base-drv.c:4: storage_device->current_lba = lba; ld h,(ix+5) ld a,(ix+4) add a,0x0c @@ -75,12 +73,10 @@ l_chnative_seek_00103: ld (hl), c inc hl ld (hl), b -;source-doc/base-drv/usb-base-drv.c:8: return 0; +;source-doc/base-drv/usb-base-drv.c:5: return 0; xor a -;source-doc/base-drv/usb-base-drv.c:9: } +;source-doc/base-drv/usb-base-drv.c:6: } pop ix pop hl pop bc jp (hl) -_storage_count: - DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index c1e9efbb..e4be4af6 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -56,7 +56,7 @@ _chscsi_init: push ix ld ix,0 add ix,sp - push af + dec sp ;source-doc/scsi-drv/scsi-init.c:15: do { ld (ix-1),0x01 l_chscsi_init_00105: @@ -89,8 +89,10 @@ l_chscsi_init_00105: ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:27: print_uint16(storage_count); - ld hl, (_storage_count) +;source-doc/scsi-drv/scsi-init.c:27: print_uint16(storage_device->drive_index); + ld hl,16 + add hl,de + ld l, (hl) ld h,0x00 push de call _print_uint16 @@ -98,35 +100,24 @@ l_chscsi_init_00105: ld hl,scsi_init_str_2 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:29: storage_device->drive_index = storage_count++; - ld hl,0x0010 - add hl, de - ld c, l - ld b, h - ld hl,_storage_count - ld a, (hl) - ld (ix-2),a - inc (hl) - ld a,(ix-2) - ld (bc), a -;source-doc/scsi-drv/scsi-init.c:30: scsi_sense_init(storage_device); +;source-doc/scsi-drv/scsi-init.c:29: scsi_sense_init(storage_device); push de push de call _scsi_sense_init pop af pop de -;source-doc/scsi-drv/scsi-init.c:31: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:35: } - ld sp, ix +;source-doc/scsi-drv/scsi-init.c:34: } + inc sp pop ix ret scsi_init_str_0: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c index d294985b..aec85045 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -61,7 +61,7 @@ usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { switch (working->usb_device) { case USB_IS_FLOPPY: case USB_IS_MASS_STORAGE: { - parse_endpoints(device, endpoint); + parse_endpoints((device_config_storage *)device, endpoint); break; } @@ -186,14 +186,34 @@ done: return result; } +static uint8_t count_storage_devs(enumeration_state *state) { + + uint8_t index = 1; + do { + device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); + + if (storage_device == NULL) + break; + + const usb_device_type t = storage_device->type; + + if (t == USB_IS_FLOPPY || t == USB_IS_MASS_STORAGE) + storage_device->drive_index = state->storage_count++; + + } while (++index != MAX_NUMBER_OF_DEVICES + 1); + + return state->storage_count; +} + usb_error enumerate_all_devices(void) { _usb_state *const work_area = get_usb_work_area(); enumeration_state state; memset(&state, 0, sizeof(enumeration_state)); - state.next_device_address = 0; usb_error result = read_all_configs(&state); + count_storage_devs(&state); + work_area->count_of_detected_usb_devices = state.next_device_address; done: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h index f8f971b7..f057a5ce 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.h @@ -8,7 +8,8 @@ #define MAX_CONFIG_SIZE 140 typedef struct { - uint8_t next_device_address; + uint8_t next_device_address; /* Track the count of installed usb devices*/ + uint8_t storage_count; /* Track the count of storage devices (scsi, ufi) */ } enumeration_state; typedef struct __working { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c index 289182d9..b2ab79ef 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.c @@ -2,7 +2,7 @@ #include "protocol.h" #include -void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint) { +void parse_endpoints(device_config_storage *const storage_dev, const endpoint_descriptor const *pEndpoint) { if (!(pEndpoint->bmAttributes & 0x02)) return; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h index 3f4a3508..849fa3a4 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h @@ -3,6 +3,6 @@ #include "protocol.h" -extern void parse_endpoints(device_config *const storage_dev, const endpoint_descriptor const *pEndpoint); +extern void parse_endpoints(device_config_storage *const storage_dev, const endpoint_descriptor const *pEndpoint); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index 3320fd4d..928b24f4 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -1,8 +1,5 @@ #include "usb-base-drv.h" -/* The total number of storage devices (scsi, ufi) */ -uint8_t storage_count = 0; - uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { storage_device->current_lba = lba; return 0; diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index 5032703b..cbcaed45 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -24,9 +24,8 @@ void chscsi_init(void) { print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(":$"); - print_uint16(storage_count); + print_uint16(storage_device->drive_index); print_string(" $"); - storage_device->drive_index = storage_count++; scsi_sense_init(storage_device); dio_add_entry(ch_scsi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 9ddcebb0..5ba62e95 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -23,9 +23,8 @@ void chufi_init(void) { print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(":$"); - print_uint16(storage_count); + print_uint16(storage_device->drive_index); print_string(" $"); - storage_device->drive_index = storage_count++; dio_add_entry(ch_ufi_fntbl, storage_device); } diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index fa74e62a..627967a4 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -56,7 +56,7 @@ _chufi_init: push ix ld ix,0 add ix,sp - push af + dec sp ;source-doc/ufi-drv/ufi-init.c:14: do { ld (ix-1),0x01 l_chufi_init_00105: @@ -89,8 +89,10 @@ l_chufi_init_00105: ld hl,ufi_init_str_1 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:26: print_uint16(storage_count); - ld hl, (_storage_count) +;source-doc/ufi-drv/ufi-init.c:26: print_uint16(storage_device->drive_index); + ld hl,16 + add hl,de + ld l, (hl) ld h,0x00 push de call _print_uint16 @@ -98,29 +100,18 @@ l_chufi_init_00105: ld hl,ufi_init_str_2 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:28: storage_device->drive_index = storage_count++; - ld hl,0x0010 - add hl, de - ld c, l - ld b, h - ld hl,_storage_count - ld a, (hl) - ld (ix-2),a - inc (hl) - ld a,(ix-2) - ld (bc), a -;source-doc/ufi-drv/ufi-init.c:29: dio_add_entry(ch_ufi_fntbl, storage_device); +;source-doc/ufi-drv/ufi-init.c:28: dio_add_entry(ch_ufi_fntbl, storage_device); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:31: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 l_chufi_init_00108: -;source-doc/ufi-drv/ufi-init.c:33: } - ld sp, ix +;source-doc/ufi-drv/ufi-init.c:32: } + inc sp pop ix ret ufi_init_str_0: @@ -134,7 +125,7 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:35: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:34: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -145,7 +136,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:37: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/ufi-init.c:36: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x12 @@ -156,7 +147,7 @@ l_chufi_get_cap_00112: ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:39: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:38: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -166,7 +157,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:43: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/ufi-init.c:42: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -175,7 +166,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/ufi-init.c:45: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -185,7 +176,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:47: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/ufi-init.c:46: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -196,27 +187,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/ufi-init.c:48: if (result != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:47: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:49: return 0; +;source-doc/ufi-drv/ufi-init.c:48: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/ufi-init.c:51: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/ufi-init.c:50: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/ufi-init.c:52: } +;source-doc/ufi-drv/ufi-init.c:51: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:54: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:53: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -227,7 +218,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:56: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:55: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -242,18 +233,18 @@ _chufi_read: pop bc or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:57: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:56: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:62: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:61: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:64: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:63: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -286,11 +277,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:65: return -1; // general error +;source-doc/ufi-drv/ufi-init.c:64: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:68: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:67: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -303,7 +294,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:70: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:69: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -314,29 +305,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:71: return -1; // error +;source-doc/ufi-drv/ufi-init.c:70: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:75: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:74: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:77: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:76: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:78: return -1; +;source-doc/ufi-drv/ufi-init.c:77: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:80: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:79: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:81: } +;source-doc/ufi-drv/ufi-init.c:80: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:83: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:82: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -347,7 +338,7 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:85: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:84: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -362,18 +353,18 @@ _chufi_write: pop bc or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:86: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:85: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:90: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:89: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:91: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:90: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -406,11 +397,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:92: return -1; +;source-doc/ufi-drv/ufi-init.c:91: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:96: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:95: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -423,7 +414,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:98: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:97: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -434,25 +425,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:99: return -1; +;source-doc/ufi-drv/ufi-init.c:98: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:104: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:103: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:106: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:105: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:107: return -1; +;source-doc/ufi-drv/ufi-init.c:106: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:109: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:108: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:110: } +;source-doc/ufi-drv/ufi-init.c:109: } ld sp, ix pop ix ret From 179abe708788af94c0a23e35988ab374904f084c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 21 Apr 2025 14:41:53 +1000 Subject: [PATCH 39/59] ch376-native: refactor: separating driver state and hbios state --- .vscode/settings.json | 3 +- Source/HBIOS/ch376-native/base-drv.s | 1 + .../base-drv/hbios-driver-storage.c.s | 114 ++++++++++++ .../ch376-native/scsi-drv/class_scsi.c.s | 118 ++++++++----- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 91 +++++++--- .../base-drv/hbios-driver-storage.c | 11 ++ .../base-drv/hbios-driver-storage.h | 16 ++ .../ch376-native/source-doc/base-drv/hbios.h | 2 +- .../source-doc/scsi-drv/class_scsi.c | 8 +- .../source-doc/scsi-drv/class_scsi.h | 2 +- .../source-doc/scsi-drv/scsi-init.c | 10 +- .../source-doc/ufi-drv/ufi-init.c | 10 +- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 165 +++++++++++------- Source/HBIOS/ch376scsi.asm | 53 +++++- Source/HBIOS/ch376ufi.asm | 47 ++++- 15 files changed, 495 insertions(+), 156 deletions(-) create mode 100644 Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c create mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h diff --git a/.vscode/settings.json b/.vscode/settings.json index a1edd90b..7b5d2f7c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,6 +23,7 @@ "enumerate.h": "c", "ch376inc.h": "c", "enumerate_storage.h": "c", - "work-area.h": "c" + "work-area.h": "c", + "hbios-driver-storage.h": "c" } } diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index ed11de0a..2f0a85d6 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -7,6 +7,7 @@ #include "ch376-native/base-drv/enumerate.c.s" #include "ch376-native/base-drv/enumerate_hub.c.s" #include "ch376-native/base-drv/enumerate_storage.c.s" +#include "ch376-native/base-drv/hbios-driver-storage.c.s" #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/transfers.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s new file mode 100644 index 00000000..578b9289 --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s @@ -0,0 +1,114 @@ +; +; Generated from source-doc/base-drv/hbios-driver-storage.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_hbios_usb_storage_devices: + DEFS 24 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/hbios-driver-storage.c:5: uint8_t find_storage_dev(void) { +; --------------------------------- +; Function find_storage_dev +; --------------------------------- +_find_storage_dev: +;source-doc/base-drv/hbios-driver-storage.c:6: for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) + ld c,0x00 + ld de,_hbios_usb_storage_devices+0 + ld b,c +l_find_storage_dev_00105: + ld a, b + sub 0x06 + jr NC,l_find_storage_dev_00103 +;source-doc/base-drv/hbios-driver-storage.c:7: if (hbios_usb_storage_devices[i].storage_device == NULL) + ld l, b + ld h,0x00 + add hl, hl + add hl, hl + add hl, de + ld a, (hl) + inc hl + ld l, (hl) + or l + jr NZ,l_find_storage_dev_00106 +;source-doc/base-drv/hbios-driver-storage.c:8: return i; + ld l, c + jr l_find_storage_dev_00107 +l_find_storage_dev_00106: +;source-doc/base-drv/hbios-driver-storage.c:6: for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) + inc b + ld c, b + jr l_find_storage_dev_00105 +l_find_storage_dev_00103: +;source-doc/base-drv/hbios-driver-storage.c:10: return -1; + ld l,0xff +l_find_storage_dev_00107: +;source-doc/base-drv/hbios-driver-storage.c:11: } + ret +_hbios_usb_storage_devices: + DEFW +0x0000 + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index bc712804..a56b867a 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -587,7 +587,22 @@ l_scsi_sense_init_00104: ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:120: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:120: void spike_x(void) { +; --------------------------------- +; Function spike_x +; --------------------------------- +_spike_x: +;source-doc/scsi-drv/class_scsi.c:121: scsi_read(5, NULL); + ld hl,0x0000 + push hl + ld l,0x05 + push hl + call _scsi_read + pop af + pop af +;source-doc/scsi-drv/class_scsi.c:122: } + ret +;source-doc/scsi-drv/class_scsi.c:124: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -595,7 +610,13 @@ _scsi_read: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:121: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + push af +;source-doc/scsi-drv/class_scsi.c:125: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + pop bc + push de +;source-doc/scsi-drv/class_scsi.c:127: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -608,30 +629,30 @@ l_scsi_read_00113: ld (hl),0x00 inc hl djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:122: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:128: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:130: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:131: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:126: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:132: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:128: cbw.scsi_cmd.operation_code = 0x28; // read operation +;source-doc/scsi-drv/class_scsi.c:134: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:135: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix+4) - ld h,(ix+5) +;source-doc/scsi-drv/class_scsi.c:136: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld l,(ix-2) + ld h,(ix-1) ld bc,0x000c add hl,bc ld c,l @@ -641,8 +662,8 @@ l_scsi_read_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:137: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:138: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; ld l,c ld h,b inc hl @@ -653,11 +674,11 @@ l_scsi_read_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:133: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:135: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;source-doc/scsi-drv/class_scsi.c:141: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) push bc @@ -667,8 +688,8 @@ l_scsi_read_00113: push de ld hl,_cbw push hl - ld l,(ix+4) - ld h,(ix+5) + ld l,(ix-2) + ld h,(ix-1) push hl call _do_scsi_cmd pop af @@ -678,11 +699,11 @@ l_scsi_read_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:137: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:143: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/class_scsi.c:138: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:144: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -711,12 +732,13 @@ l_scsi_read_00114: ld a, h ld (bc), a l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:139: return result; +;source-doc/scsi-drv/class_scsi.c:145: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:140: } +;source-doc/scsi-drv/class_scsi.c:146: } + ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:142: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:148: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -724,7 +746,7 @@ _scsi_write: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:143: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:149: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -737,28 +759,28 @@ l_scsi_write_00113: ld (hl),0x00 inc hl djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:144: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:150: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:152: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:153: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:148: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:154: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:150: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;source-doc/scsi-drv/class_scsi.c:156: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:157: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/class_scsi.c:158: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld l,(ix+4) ld h,(ix+5) ld bc,0x000c @@ -770,8 +792,8 @@ l_scsi_write_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:159: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:160: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; ld l,c ld h,b inc hl @@ -782,11 +804,11 @@ l_scsi_write_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:155: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:157: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;source-doc/scsi-drv/class_scsi.c:163: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) push bc @@ -807,11 +829,11 @@ l_scsi_write_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:159: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:165: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/class_scsi.c:160: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:166: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -840,12 +862,12 @@ l_scsi_write_00114: ld a, h ld (bc), a l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:161: return result; +;source-doc/scsi-drv/class_scsi.c:167: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:162: } +;source-doc/scsi-drv/class_scsi.c:168: } pop ix ret -;source-doc/scsi-drv/class_scsi.c:164: usb_error scsi_eject(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:170: usb_error scsi_eject(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_eject ; --------------------------------- @@ -856,7 +878,7 @@ _scsi_eject: ld hl, -21 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:166: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -865,7 +887,7 @@ _scsi_eject: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:168: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); +;source-doc/scsi-drv/class_scsi.c:174: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); ld hl,17 add hl, sp ld b,0x03 @@ -877,17 +899,17 @@ l_scsi_eject_00103: inc hl djnz l_scsi_eject_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.operation_code = 0x1B; +;source-doc/scsi-drv/class_scsi.c:176: cbw_scsi.eject.operation_code = 0x1B; ld (ix-6),0x1b -;source-doc/scsi-drv/class_scsi.c:171: cbw_scsi.eject.loej = 1; +;source-doc/scsi-drv/class_scsi.c:177: cbw_scsi.eject.loej = 1; ld hl,19 add hl, sp set 1, (hl) -;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:179: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-8),0x00 -;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +;source-doc/scsi-drv/class_scsi.c:180: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); ld (ix-7),0x06 -;source-doc/scsi-drv/class_scsi.c:175: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:181: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -898,7 +920,7 @@ l_scsi_eject_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:177: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:183: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -909,7 +931,7 @@ l_scsi_eject_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:178: } +;source-doc/scsi-drv/class_scsi.c:184: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index e4be4af6..147acfaa 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/scsi-init.c:13: void chscsi_init(void) { +;source-doc/scsi-drv/scsi-init.c:14: void chscsi_init(void) { ; --------------------------------- ; Function chscsi_init ; --------------------------------- @@ -56,68 +56,105 @@ _chscsi_init: push ix ld ix,0 add ix,sp - dec sp -;source-doc/scsi-drv/scsi-init.c:15: do { + ld hl, -5 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/scsi-init.c:16: do { ld (ix-1),0x01 l_chscsi_init_00105: -;source-doc/scsi-drv/scsi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +;source-doc/scsi-drv/scsi-init.c:17: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); ld a,(ix-1) call _get_usb_device_config -;source-doc/scsi-drv/scsi-init.c:18: if (storage_device == NULL) +;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL) ld a, d or e - jr Z,l_chscsi_init_00108 -;source-doc/scsi-drv/scsi-init.c:21: const usb_device_type t = storage_device->type; + jp Z, l_chscsi_init_00108 +;source-doc/scsi-drv/scsi-init.c:22: const usb_device_type t = storage_device->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/scsi-drv/scsi-init.c:23: if (t == USB_IS_MASS_STORAGE) { +;source-doc/scsi-drv/scsi-init.c:24: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/scsi-init.c:24: print_string("\r\nUSB: MASS STORAGE @ $"); +;source-doc/scsi-drv/scsi-init.c:25: const uint8_t dev_index = find_storage_dev(); //index == -1 (no more left) should never happen + push de + call _find_storage_dev + ld c, l + pop de +;source-doc/scsi-drv/scsi-init.c:26: hbios_usb_storage_devices[dev_index].storage_device = storage_device; + ld (ix-5),c + ld (ix-4),0x00 + pop hl + push hl + add hl, hl + add hl, hl + ld a, l + add a, +((_hbios_usb_storage_devices) & 0xFF) + ld (ix-3),a + ld l,a + ld a,h + adc a,+((_hbios_usb_storage_devices) / 256) + ld (ix-2),a + ld h,a + ld (hl), e + inc hl + ld (hl), d +;source-doc/scsi-drv/scsi-init.c:27: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + ld l,(ix-3) + ld h,(ix-2) + inc hl + inc hl + inc c + ld (hl), c +;source-doc/scsi-drv/scsi-init.c:28: hbios_usb_storage_devices[dev_index].usb_device = index; + ld c,(ix-3) + ld b,(ix-2) + inc bc + inc bc + inc bc + ld a,(ix-1) + ld (bc), a +;source-doc/scsi-drv/scsi-init.c:30: print_string("\r\nUSB: MASS STORAGE @ $"); push de ld hl,scsi_init_str_0 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:25: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:31: print_uint16(index); ld l,(ix-1) ld h,0x00 push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:26: print_string(":$"); +;source-doc/scsi-drv/scsi-init.c:32: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:27: print_uint16(storage_device->drive_index); - ld hl,16 - add hl,de - ld l, (hl) - ld h,0x00 +;source-doc/scsi-drv/scsi-init.c:33: print_uint16(dev_index + 1); + pop hl + push hl + inc hl push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:28: print_string(" $"); +;source-doc/scsi-drv/scsi-init.c:34: print_string(" $"); ld hl,scsi_init_str_2 call _print_string - pop de -;source-doc/scsi-drv/scsi-init.c:29: scsi_sense_init(storage_device); - push de - push de +;source-doc/scsi-drv/scsi-init.c:35: scsi_sense_init(storage_device); call _scsi_sense_init pop af - pop de -;source-doc/scsi-drv/scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device); +;source-doc/scsi-drv/scsi-init.c:36: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); + ld e,(ix-3) + ld d,(ix-2) ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:39: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jr NZ,l_chscsi_init_00105 + jp NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:34: } - inc sp +;source-doc/scsi-drv/scsi-init.c:40: } + ld sp, ix pop ix ret scsi_init_str_0: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c new file mode 100644 index 00000000..a5a426a4 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c @@ -0,0 +1,11 @@ +#include "hbios-driver-storage.h" + +hbios_storage_device_t hbios_usb_storage_devices[MAX_NUMBER_OF_DEVICES] = {{NULL}}; + +uint8_t find_storage_dev(void) { + for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) + if (hbios_usb_storage_devices[i].storage_device == NULL) + return i; + + return -1; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h new file mode 100644 index 00000000..ec15480d --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h @@ -0,0 +1,16 @@ +#ifndef __HBIOS_DRIVER_STORAGE +#define __HBIOS_DRIVER_STORAGE + +#include "usb_state.h" + +typedef struct _hbios_storage_device { + device_config_storage * storage_device; + uint8_t drive_index; + uint8_t usb_device; +} hbios_storage_device_t; + +extern hbios_storage_device_t hbios_usb_storage_devices[MAX_NUMBER_OF_DEVICES]; + +uint8_t find_storage_dev(void); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h index 179a5267..3c4c83e8 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios.h @@ -1,6 +1,6 @@ #ifndef _HBIOS_H_ #define _HBIOS_H_ -extern void dio_add_entry(const uint16_t fnc_table[], const device_config_storage *const storage_device) __sdcccall(1); +extern void dio_add_entry(const uint16_t fnc_table[], const void *const storage_device) __sdcccall(1); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index 86e962c9..762e41c2 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -117,7 +117,13 @@ usb_error scsi_sense_init(device_config_storage *const dev) { static cbw_scsi_read_write cbw = {{{0}}}; -usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) { +void spike_x(void) { + scsi_read(5, NULL); +} + +usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); cbw.cbw = scsi_command_block_wrapper; diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h index bcdcc031..5e5b63bf 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -188,6 +188,6 @@ extern usb_error scsi_sense_init(device_config_storage *const dev); extern usb_error scsi_test(device_config_storage *const dev); extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result); extern usb_error scsi_eject(device_config_storage *const dev); -extern usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer); +extern usb_error scsi_read(const uint16_t dev, uint8_t *const buffer); extern usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index cbcaed45..6438ef4d 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -7,6 +7,7 @@ #include #include #include +#include "hbios-driver-storage.h" extern const uint16_t const ch_scsi_fntbl[]; @@ -21,13 +22,18 @@ void chscsi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_MASS_STORAGE) { + const uint8_t dev_index = find_storage_dev(); //index == -1 (no more left) should never happen + hbios_usb_storage_devices[dev_index].storage_device = storage_device; + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + hbios_usb_storage_devices[dev_index].usb_device = index; + print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(":$"); - print_uint16(storage_device->drive_index); + print_uint16(dev_index + 1); print_string(" $"); scsi_sense_init(storage_device); - dio_add_entry(ch_scsi_fntbl, storage_device); + dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 5ba62e95..ebd6a64f 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -5,6 +5,7 @@ #include #include #include +#include "hbios-driver-storage.h" extern const uint16_t const ch_ufi_fntbl[]; @@ -20,12 +21,17 @@ void chufi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_FLOPPY) { + const uint8_t dev_index = find_storage_dev(); //dev_index == -1 (no more left) should never happen + hbios_usb_storage_devices[dev_index].storage_device = storage_device; + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + hbios_usb_storage_devices[dev_index].usb_device = index; + print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(":$"); - print_uint16(storage_device->drive_index); + print_uint16(dev_index + 1); print_string(" $"); - dio_add_entry(ch_ufi_fntbl, storage_device); + dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); } } while (++index != MAX_NUMBER_OF_DEVICES + 1); diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 627967a4..377e8fb6 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/ufi-init.c:11: void chufi_init(void) { +;source-doc/ufi-drv/ufi-init.c:12: void chufi_init(void) { ; --------------------------------- ; Function chufi_init ; --------------------------------- @@ -56,62 +56,103 @@ _chufi_init: push ix ld ix,0 add ix,sp + push af dec sp -;source-doc/ufi-drv/ufi-init.c:14: do { +;source-doc/ufi-drv/ufi-init.c:15: do { ld (ix-1),0x01 l_chufi_init_00105: -;source-doc/ufi-drv/ufi-init.c:15: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +;source-doc/ufi-drv/ufi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); ld a,(ix-1) call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:17: if (storage_device == NULL) +;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL) ld a, d or e jr Z,l_chufi_init_00108 -;source-doc/ufi-drv/ufi-init.c:20: const usb_device_type t = storage_device->type; +;source-doc/ufi-drv/ufi-init.c:21: const usb_device_type t = storage_device->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/ufi-drv/ufi-init.c:22: if (t == USB_IS_FLOPPY) { +;source-doc/ufi-drv/ufi-init.c:23: if (t == USB_IS_FLOPPY) { dec a jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/ufi-init.c:23: print_string("\r\nUSB: FLOPPY @ $"); +;source-doc/ufi-drv/ufi-init.c:24: const uint8_t dev_index = find_storage_dev(); //dev_index == -1 (no more left) should never happen push de + call _find_storage_dev + ld c, l + pop de +;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].storage_device = storage_device; + ld (ix-3),c + ld (ix-2),0x00 + pop hl + push hl + add hl, hl + add hl, hl + ld a,+((_hbios_usb_storage_devices) & 0xFF) + add a,l + ld l,a + ld a,+((_hbios_usb_storage_devices) / 256) + adc a,h + ld h,a + ld (hl), e + inc hl + ld (hl), d + dec hl +;source-doc/ufi-drv/ufi-init.c:26: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + ld e, l + ld d, h + inc de + inc de + ld a, c + inc a + ld (de), a +;source-doc/ufi-drv/ufi-init.c:27: hbios_usb_storage_devices[dev_index].usb_device = index; + ld c, l + ld b, h + inc bc + inc bc + inc bc + ld a,(ix-1) + ld (bc), a +;source-doc/ufi-drv/ufi-init.c:29: print_string("\r\nUSB: FLOPPY @ $"); + push hl ld hl,ufi_init_str_0 call _print_string - pop de -;source-doc/ufi-drv/ufi-init.c:24: print_uint16(index); - ld l,(ix-1) - ld h,0x00 - push de + pop hl +;source-doc/ufi-drv/ufi-init.c:30: print_uint16(index); + ld e,(ix-1) + ld d,0x00 + push hl + ex de, hl call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:25: print_string(":$"); +;source-doc/ufi-drv/ufi-init.c:31: print_string(":$"); ld hl,ufi_init_str_1 call _print_string + pop hl +;source-doc/ufi-drv/ufi-init.c:32: print_uint16(dev_index + 1); pop de -;source-doc/ufi-drv/ufi-init.c:26: print_uint16(storage_device->drive_index); - ld hl,16 - add hl,de - ld l, (hl) - ld h,0x00 push de + inc de + push hl + ex de, hl call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:27: print_string(" $"); +;source-doc/ufi-drv/ufi-init.c:33: print_string(" $"); ld hl,ufi_init_str_2 call _print_string - pop de -;source-doc/ufi-drv/ufi-init.c:28: dio_add_entry(ch_ufi_fntbl, storage_device); + pop hl +;source-doc/ufi-drv/ufi-init.c:34: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); + ex de, hl ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:31: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:37: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 l_chufi_init_00108: -;source-doc/ufi-drv/ufi-init.c:32: } - inc sp +;source-doc/ufi-drv/ufi-init.c:38: } + ld sp, ix pop ix ret ufi_init_str_0: @@ -125,7 +166,7 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:34: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:40: uint32_t chufi_get_cap(device_config *const dev) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -136,7 +177,7 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:36: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/ufi-init.c:42: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x12 @@ -147,7 +188,7 @@ l_chufi_get_cap_00112: ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:38: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 25); ld a,0x19 push af inc sp @@ -157,7 +198,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:42: ufi_inquiry(dev, &inquiry); +;source-doc/ufi-drv/ufi-init.c:48: ufi_inquiry(dev, &inquiry); ld hl,36 add hl, sp push hl @@ -166,7 +207,7 @@ l_chufi_get_cap_00112: push hl call _ufi_inquiry pop af -;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 15); +;source-doc/ufi-drv/ufi-init.c:50: wait_for_device_ready(dev, 15); ld h,0x0f ex (sp),hl inc sp @@ -176,7 +217,7 @@ l_chufi_get_cap_00112: call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:46: const usb_error result = ufi_read_frmt_caps(dev, &response); +;source-doc/ufi-drv/ufi-init.c:52: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl @@ -187,27 +228,27 @@ l_chufi_get_cap_00112: pop af pop af ld a, l -;source-doc/ufi-drv/ufi-init.c:47: if (result != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:53: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:48: return 0; +;source-doc/ufi-drv/ufi-init.c:54: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/ufi-init.c:50: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/ufi-init.c:56: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/ufi-init.c:51: } +;source-doc/ufi-drv/ufi-init.c:57: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:53: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:59: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -218,7 +259,7 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:55: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:61: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -233,18 +274,18 @@ _chufi_read: pop bc or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:56: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:62: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:61: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:67: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:63: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:69: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -277,11 +318,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:64: return -1; // general error +;source-doc/ufi-drv/ufi-init.c:70: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:67: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:73: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -294,7 +335,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:69: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:75: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -305,29 +346,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:70: return -1; // error +;source-doc/ufi-drv/ufi-init.c:76: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:74: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:80: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:76: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:82: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:77: return -1; +;source-doc/ufi-drv/ufi-init.c:83: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:79: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:85: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:80: } +;source-doc/ufi-drv/ufi-init.c:86: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:82: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:88: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -338,7 +379,7 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:84: if (wait_for_device_ready((device_config *)dev, 20) != 0) +;source-doc/ufi-drv/ufi-init.c:90: if (wait_for_device_ready((device_config *)dev, 20) != 0) ld c,(ix+4) ld b,(ix+5) push bc @@ -353,18 +394,18 @@ _chufi_write: pop bc or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:85: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:91: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:89: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:95: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:90: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:96: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { ld e,(ix+4) ld d,(ix+5) ld hl,12 @@ -397,11 +438,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:91: return -1; +;source-doc/ufi-drv/ufi-init.c:97: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:95: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:101: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -414,7 +455,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:97: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:103: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -425,25 +466,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:98: return -1; +;source-doc/ufi-drv/ufi-init.c:104: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:103: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:109: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:105: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:111: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:106: return -1; +;source-doc/ufi-drv/ufi-init.c:112: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:108: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:114: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:109: } +;source-doc/ufi-drv/ufi-init.c:115: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 5fad919e..74c3283d 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -30,12 +30,10 @@ CH_SCSI_FNTBL: #ENDIF CH_SCSI_STATUS: - ; LD A, (IY) XOR A RET CH_SCSI_RESET: - ; LD A, (IY) XOR A RET @@ -68,7 +66,14 @@ CH_SCSI_SEEK: RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) EX DE, HL + EXX push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + EXX CALL _chnative_seek RET ; @@ -89,6 +94,13 @@ CH_SCSI_SEEK: ; Status (A) is a standard HBIOS result code. ; CH_SCSI_READ: + EXX + ld d, 0 + ld e, (iy+3) + push de + pop iy + EXX + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR ; call scsi_read(IY, HL); @@ -120,6 +132,16 @@ CH_SCSI_READ: ; Status (A) is a standard HBIOS result code. ; CH_SCSI_WRITE: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR ; call scsi_write(IY, HL); @@ -182,11 +204,10 @@ CH_SCSI_FORMAT: ; | | 9=Cartridge, 10=usb-scsi, 11=usb-ufi | ; CH_SCSI_DEVICE: - LD C, %00111010 ; TODO? + LD C, %00111010 LD D, DIODEV_USB - LD E, (iy+16) ;???? device_config_storage.drive_index - LD H, 0 - LD L, 0 + LD E, (iy+2) ; drive_index + LD HL, 0 XOR A RET ; @@ -230,6 +251,16 @@ CH_SCSI_DEFMED: ; ; CH_SCSI_CAP: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + push ix ld ix, -8 ; reserve 8 bytes for add ix, sp ; scsi_read_capacity_result @@ -274,6 +305,16 @@ CH_SCSI_CAP: ; ** Does not appear to be used?? ; CH_SCSI_GEOM: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + ; 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 CH_SCSI_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 07a85a6d..521e76a9 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -30,12 +30,10 @@ CH_UFI_FNTBL: #ENDIF CH_UFI_STATUS: - LD A, (IY) XOR A RET CH_UFI_RESET: - LD A, (IY) XOR A RET ; ### Function 0x12 -- Disk Seek (DIOSEEK) @@ -62,6 +60,16 @@ CH_UFI_RESET: ; sector) are 0 relative. ; CH_UFI_SEEK: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + BIT 7, D ; CHECK FOR LBA FLAG CALL Z, HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA - never seems to happen? RES 7, D @@ -88,6 +96,16 @@ CH_UFI_SEEK: ; Status (A) is a standard HBIOS result code. ; CH_UFI_READ: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR push hl @@ -118,6 +136,16 @@ CH_UFI_READ: ; Status (A) is a standard HBIOS result code. ; CH_UFI_WRITE: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR ; call scsi_write(IY, HL); @@ -185,9 +213,8 @@ CH_UFI_FORMAT: CH_UFI_DEVICE: LD C, %11010110 LD D, DIODEV_USB - LD E, (iy+16) - LD H, 0 - LD L, 0 + LD E, (iy+2) ; drive_index + LD HL, 0 XOR A RET ; @@ -234,6 +261,16 @@ CH_UFI_DEFMED: ; Report the current media capacity information. ; CH_UFI_CAP: + EXX + push IY + POP HL + LD E, (HL) + INC HL + LD D, (HL) + PUSH DE + POP IY + EXX + push iy call _chufi_get_cap pop iy From 4e23c9104d1f037fb77376664d4cfa7ab89542a9 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 21 Apr 2025 16:26:59 +1000 Subject: [PATCH 40/59] ch376-native: refactor usb scsi/ufi function to replace use of config* with dev_index int --- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 95 +---- .../base-drv/hbios-driver-storage.c.s | 24 +- .../ch376-native/base-drv/usb-base-drv.c.s | 42 +- .../HBIOS/ch376-native/base-drv/usb_init.c.s | 2 +- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 6 +- .../HBIOS/ch376-native/base-drv/work-area.c.s | 8 +- .../ch376-native/scsi-drv/class_scsi.c.s | 360 ++++++------------ .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 82 ++-- .../source-doc/base-drv/dev_transfers.h | 1 - .../source-doc/base-drv/enumerate.c | 21 - .../base-drv/hbios-driver-storage.c | 4 +- .../base-drv/hbios-driver-storage.h | 1 - .../source-doc/base-drv/usb-base-drv.c | 7 +- .../source-doc/base-drv/usb-base-drv.h | 7 +- .../source-doc/scsi-drv/class_scsi.c | 66 ++-- .../source-doc/scsi-drv/class_scsi.h | 18 +- .../source-doc/scsi-drv/scsi-init.c | 9 +- .../source-doc/ufi-drv/class_ufi.h | 2 + .../source-doc/ufi-drv/ufi-init.c | 19 +- .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 220 +++++------ Source/HBIOS/ch376scsi.asm | 128 +++---- Source/HBIOS/ch376ufi.asm | 93 +++-- 22 files changed, 465 insertions(+), 750 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 4a86dcf6..68f236e6 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -923,65 +923,7 @@ l_read_all_configs_00112: ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:189: static uint8_t count_storage_devs(enumeration_state *state) { -; --------------------------------- -; Function count_storage_devs -; --------------------------------- -_count_storage_devs: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/enumerate.c:192: do { - ld c,0x01 -l_count_storage_devs_00106: -;source-doc/base-drv/enumerate.c:193: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - push bc - ld a, c - call _get_usb_device_config - pop bc -;source-doc/base-drv/enumerate.c:195: if (storage_device == NULL) - ld a, d - or e - jr Z,l_count_storage_devs_00108 -;source-doc/base-drv/enumerate.c:198: const usb_device_type t = storage_device->type; - ld l, e - ld h, d - ld a, (hl) - and 0x0f -;source-doc/base-drv/enumerate.c:200: if (t == USB_IS_FLOPPY || t == USB_IS_MASS_STORAGE) - cp 0x01 - jr Z,l_count_storage_devs_00103 - sub 0x02 - jr NZ,l_count_storage_devs_00107 -l_count_storage_devs_00103: -;source-doc/base-drv/enumerate.c:201: storage_device->drive_index = state->storage_count++; - ld hl,0x0010 - add hl, de - ex de, hl - ld l,(ix+4) - ld h,(ix+5) - inc hl - ld a, (hl) - ld b, a - inc b - ld (hl), b - ld (de), a -l_count_storage_devs_00107: -;source-doc/base-drv/enumerate.c:203: } while (++index != MAX_NUMBER_OF_DEVICES + 1); - inc c - ld a, c - sub 0x07 - jr NZ,l_count_storage_devs_00106 -l_count_storage_devs_00108: -;source-doc/base-drv/enumerate.c:205: return state->storage_count; - ld l,(ix+4) - ld h,(ix+5) - inc hl - ld l, (hl) -;source-doc/base-drv/enumerate.c:206: } - pop ix - ret -;source-doc/base-drv/enumerate.c:208: usb_error enumerate_all_devices(void) { +;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { ; --------------------------------- ; Function enumerate_all_devices ; --------------------------------- @@ -990,35 +932,28 @@ _enumerate_all_devices: ld ix,0 add ix,sp push af -;source-doc/base-drv/enumerate.c:209: _usb_state *const work_area = get_usb_work_area(); -;source-doc/base-drv/enumerate.c:211: memset(&state, 0, sizeof(enumeration_state)); +;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); ld hl,0 add hl, sp + ld e,l + ld d,h xor a ld (hl), a inc hl ld (hl), a -;source-doc/base-drv/enumerate.c:213: usb_error result = read_all_configs(&state); - ld hl,0 - add hl, sp - push hl - push hl +;source-doc/base-drv/enumerate.c:194: usb_error result = read_all_configs(&state); + push de + push de call _read_all_configs pop af - ld c, l - pop hl -;source-doc/base-drv/enumerate.c:215: count_storage_devs(&state); - push bc - push hl - call _count_storage_devs - pop af - pop bc -;source-doc/base-drv/enumerate.c:217: work_area->count_of_detected_usb_devices = state.next_device_address; - ld a,(ix-2) - ld ((_x + 1)),a -;source-doc/base-drv/enumerate.c:220: return result; - ld l, c -;source-doc/base-drv/enumerate.c:221: } + pop de +;source-doc/base-drv/enumerate.c:196: work_area->count_of_detected_usb_devices = state.next_device_address; + ld bc,_x + 1 + ld a, (de) + ld (bc), a +;source-doc/base-drv/enumerate.c:199: return result; +;source-doc/base-drv/enumerate.c:200: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s index 578b9289..dfc56fb0 100644 --- a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s @@ -34,7 +34,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk _hbios_usb_storage_devices: - DEFS 24 + DEFS 12 #ENDIF @@ -55,7 +55,7 @@ _hbios_usb_storage_devices: ; Function find_storage_dev ; --------------------------------- _find_storage_dev: -;source-doc/base-drv/hbios-driver-storage.c:6: for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) +;source-doc/base-drv/hbios-driver-storage.c:6: for (uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) ld c,0x00 ld de,_hbios_usb_storage_devices+0 ld b,c @@ -63,22 +63,19 @@ l_find_storage_dev_00105: ld a, b sub 0x06 jr NC,l_find_storage_dev_00103 -;source-doc/base-drv/hbios-driver-storage.c:7: if (hbios_usb_storage_devices[i].storage_device == NULL) +;source-doc/base-drv/hbios-driver-storage.c:7: if (hbios_usb_storage_devices[i].drive_index == 0) ld l, b ld h,0x00 add hl, hl - add hl, hl add hl, de ld a, (hl) - inc hl - ld l, (hl) - or l + or a jr NZ,l_find_storage_dev_00106 ;source-doc/base-drv/hbios-driver-storage.c:8: return i; ld l, c jr l_find_storage_dev_00107 l_find_storage_dev_00106: -;source-doc/base-drv/hbios-driver-storage.c:6: for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) +;source-doc/base-drv/hbios-driver-storage.c:6: for (uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) inc b ld c, b jr l_find_storage_dev_00105 @@ -89,7 +86,6 @@ l_find_storage_dev_00107: ;source-doc/base-drv/hbios-driver-storage.c:11: } ret _hbios_usb_storage_devices: - DEFW +0x0000 DEFB +0x00 DEFB +0x00 DEFB 0x00 @@ -102,13 +98,3 @@ _hbios_usb_storage_devices: DEFB 0x00 DEFB 0x00 DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 8006021c..f8e7284e 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -48,35 +48,27 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb-base-drv.c:3: uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { +;source-doc/base-drv/usb-base-drv.c:4: uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { ; --------------------------------- -; Function chnative_seek +; Function scsi_seek ; --------------------------------- -_chnative_seek: +_scsi_seek: push ix ld ix,0 add ix,sp - ld c, l - ld b, h -;source-doc/base-drv/usb-base-drv.c:4: storage_device->current_lba = lba; - ld h,(ix+5) +;source-doc/base-drv/usb-base-drv.c:5: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) - add a,0x0c - ld l, a - jr NC,l_chnative_seek_00103 - inc h -l_chnative_seek_00103: - ld (hl), e - inc hl - ld (hl), d - inc hl - ld (hl), c - inc hl - ld (hl), b -;source-doc/base-drv/usb-base-drv.c:5: return 0; - xor a -;source-doc/base-drv/usb-base-drv.c:6: } + call _get_usb_device_config +;source-doc/base-drv/usb-base-drv.c:7: dev->current_lba = lba; + ld hl,0x000c + add hl, de + ex de, hl + ld hl,6 + add hl, sp + ld bc,0x0004 + ldir +;source-doc/base-drv/usb-base-drv.c:8: return 0; + ld l,0x00 +;source-doc/base-drv/usb-base-drv.c:9: } pop ix - pop hl - pop bc - jp (hl) + ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s index 1d3054c2..a8b35de0 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s @@ -169,7 +169,7 @@ l_usb_init_00108: jr l_usb_init_00113 l_usb_init_00110: ;source-doc/base-drv/usb_init.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld b,0x35 + ld b,0x32 ld hl,_x jr l_usb_init_00163 l_usb_init_00162: diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 660e8572..6c8e49a5 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -89,8 +89,8 @@ l_count_of_devices_00106: ret _device_config_sizes: DEFB +0x00 - DEFB +0x11 - DEFB +0x11 + DEFB +0x10 + DEFB +0x10 DEFB +0x0c DEFB +0x06 DEFB 0x00 @@ -174,7 +174,7 @@ l_next_device_config_00102: adc a, d ld d, a ;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end) - ld hl,0x0068 + ld hl,0x0062 add hl, bc ld a, e sub l diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index 0449816b..e08c9fe6 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -34,7 +34,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk _x: - DEFS 105 + DEFS 99 #ENDIF @@ -149,10 +149,4 @@ _x: DEFB 0x00 DEFB 0x00 DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index a56b867a..02c7bc98 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -41,8 +41,6 @@ _csw: DEFS 13 _scsi_packet_read_capacity: DEFS 12 -_scsi_packet_inquiry: - DEFS 12 _scsi_packet_request_sense: DEFS 12 _cbw: @@ -297,7 +295,7 @@ l_do_scsi_cmd_00120: ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { ; --------------------------------- ; Function scsi_read_capacity ; --------------------------------- @@ -308,114 +306,58 @@ _scsi_read_capacity: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper; - ld hl,0 +;source-doc/scsi-drv/class_scsi.c:55: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw = scsi_command_block_wrapper; + push de + ld hl,2 add hl, sp - ld e,l - ld d,h - push hl + ex de, hl ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.read_capacity = scsi_packet_read_capacity; + pop de +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.read_capacity = scsi_packet_read_capacity; + push de ld hl,17 add hl, sp ex de, hl ld bc,0x000c ld hl,_scsi_packet_read_capacity ldir - pop bc -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0; + pop de +;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); +;source-doc/scsi-drv/class_scsi.c:62: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - ld hl,0x0008 - add hl, bc - ld (hl),0x08 - inc hl +;source-doc/scsi-drv/class_scsi.c:63: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + ld (ix-19),0x08 xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); - ld e,(ix+6) - ld d,(ix+7) + ld (ix-18),a + ld (ix-17),a + ld (ix-16),a +;source-doc/scsi-drv/class_scsi.c:65: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); + ld c,(ix+6) + ld b,(ix+7) xor a push af inc sp - push de push bc - ld l,(ix+4) - ld h,(ix+5) - push hl - call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:64: } - ld sp,ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { -; --------------------------------- -; Function scsi_inquiry -; --------------------------------- -_scsi_inquiry: - push ix - ld ix,0 - add ix,sp - ld hl, -27 + ld hl,3 add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper; - ld hl,0 - add hl, sp - ld e,l - ld d,h push hl - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.inquiry = scsi_packet_inquiry; - ld hl,17 - add hl, sp - ex de, hl - ld bc,0x000c - ld hl,_scsi_packet_inquiry - ldir - pop bc -;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0; - ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); - ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = 0x24; - ld hl,0x0008 - add hl, bc - ld (hl),0x24 - inc hl - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); - ld e,(ix+6) - ld d,(ix+7) - xor a - push af - inc sp push de - push bc - ld l,(ix+4) - ld h,(ix+5) - push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:78: } - ld sp,ix + pop af + pop af + pop af + inc sp +;source-doc/scsi-drv/class_scsi.c:66: } + ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:80: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:84: static usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -426,7 +368,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:82: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -435,7 +377,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:83: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:87: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -447,11 +389,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:89: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:90: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:87: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:91: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -462,7 +404,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:89: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:93: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -473,11 +415,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:90: } +;source-doc/scsi-drv/class_scsi.c:94: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:94: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:98: static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -488,7 +430,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -497,7 +439,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:97: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -505,11 +447,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:103: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:104: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:105: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -520,7 +462,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:103: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:107: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -532,11 +474,11 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:104: } +;source-doc/scsi-drv/class_scsi.c:108: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:106: usb_error scsi_sense_init(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:110: usb_error scsi_sense_init(const uint16_t dev_index) { ; --------------------------------- ; Function scsi_sense_init ; --------------------------------- @@ -547,62 +489,52 @@ _scsi_sense_init: ld hl, -18 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:110: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:111: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/scsi-drv/class_scsi.c:116: critical_begin(); + push de call _critical_begin -;source-doc/scsi-drv/class_scsi.c:111: while ((result = scsi_test(dev)) && --counter > 0) + pop de +;source-doc/scsi-drv/class_scsi.c:117: while ((result = scsi_test(dev)) && --counter > 0) ld c,0x03 l_scsi_sense_init_00102: push bc - ld l,(ix+4) - ld h,(ix+5) - push hl + push de + push de call _scsi_test pop af ld a, l + pop de pop bc ld (_result),a or a jr Z,l_scsi_sense_init_00104 dec c jr Z,l_scsi_sense_init_00104 -;source-doc/scsi-drv/class_scsi.c:112: scsi_request_sense(dev, &response); +;source-doc/scsi-drv/class_scsi.c:118: scsi_request_sense(dev, &response); ld hl,0 add hl, sp push bc + push de push hl - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _scsi_request_sense pop af pop af + pop de pop bc jr l_scsi_sense_init_00102 l_scsi_sense_init_00104: -;source-doc/scsi-drv/class_scsi.c:113: critical_end(); +;source-doc/scsi-drv/class_scsi.c:119: critical_end(); call _critical_end -;source-doc/scsi-drv/class_scsi.c:115: return result; +;source-doc/scsi-drv/class_scsi.c:121: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:116: } +;source-doc/scsi-drv/class_scsi.c:122: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:120: void spike_x(void) { -; --------------------------------- -; Function spike_x -; --------------------------------- -_spike_x: -;source-doc/scsi-drv/class_scsi.c:121: scsi_read(5, NULL); - ld hl,0x0000 - push hl - ld l,0x05 - push hl - call _scsi_read - pop af - pop af -;source-doc/scsi-drv/class_scsi.c:122: } - ret -;source-doc/scsi-drv/class_scsi.c:124: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:126: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_read ; --------------------------------- @@ -611,12 +543,12 @@ _scsi_read: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/class_scsi.c:125: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/scsi-drv/class_scsi.c:127: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config pop bc push de -;source-doc/scsi-drv/class_scsi.c:127: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/class_scsi.c:129: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -629,28 +561,28 @@ l_scsi_read_00113: ld (hl),0x00 inc hl djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:128: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:130: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:130: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:132: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:131: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:133: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:132: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:134: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:134: cbw.scsi_cmd.operation_code = 0x28; // read operation +;source-doc/scsi-drv/class_scsi.c:136: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/class_scsi.c:135: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:137: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:136: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; +;source-doc/scsi-drv/class_scsi.c:138: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; ld l,(ix-2) ld h,(ix-1) ld bc,0x000c @@ -662,8 +594,8 @@ l_scsi_read_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:137: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:138: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:140: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; ld l,c ld h,b inc hl @@ -674,11 +606,11 @@ l_scsi_read_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:141: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:141: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); +;source-doc/scsi-drv/class_scsi.c:143: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); ld e,(ix+6) ld d,(ix+7) push bc @@ -699,11 +631,11 @@ l_scsi_read_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:143: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:145: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/class_scsi.c:144: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:146: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -732,13 +664,13 @@ l_scsi_read_00114: ld a, h ld (bc), a l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:145: return result; +;source-doc/scsi-drv/class_scsi.c:147: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:146: } +;source-doc/scsi-drv/class_scsi.c:148: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:148: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/scsi-drv/class_scsi.c:150: usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function scsi_write ; --------------------------------- @@ -746,7 +678,13 @@ _scsi_write: push ix ld ix,0 add ix,sp -;source-doc/scsi-drv/class_scsi.c:149: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + push af +;source-doc/scsi-drv/class_scsi.c:151: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + pop bc + push de +;source-doc/scsi-drv/class_scsi.c:153: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -759,30 +697,30 @@ l_scsi_write_00113: ld (hl),0x00 inc hl djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:150: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:154: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:152: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:156: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:153: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/class_scsi.c:157: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:154: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/class_scsi.c:158: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:156: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;source-doc/scsi-drv/class_scsi.c:160: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/class_scsi.c:157: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:158: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix+4) - ld h,(ix+5) +;source-doc/scsi-drv/class_scsi.c:162: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld l,(ix-2) + ld h,(ix-1) ld bc,0x000c add hl,bc ld c,l @@ -792,8 +730,8 @@ l_scsi_write_00113: inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:159: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:160: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; +;source-doc/scsi-drv/class_scsi.c:163: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/class_scsi.c:164: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; ld l,c ld h,b inc hl @@ -804,11 +742,11 @@ l_scsi_write_00113: ld e, (hl) ld hl, +(_cbw + 19) ld (hl), e -;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.lba[3] = dev->current_lba; +;source-doc/scsi-drv/class_scsi.c:165: cbw.scsi_cmd.lba[3] = dev->current_lba; ld a, (bc) inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:163: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); +;source-doc/scsi-drv/class_scsi.c:167: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); ld e,(ix+6) ld d,(ix+7) push bc @@ -818,8 +756,8 @@ l_scsi_write_00113: push de ld hl,_cbw push hl - ld l,(ix+4) - ld h,(ix+5) + ld l,(ix-2) + ld h,(ix-1) push hl call _do_scsi_cmd pop af @@ -829,11 +767,11 @@ l_scsi_write_00113: pop bc ld a, l ld (_result), a -;source-doc/scsi-drv/class_scsi.c:165: if (result == USB_ERR_OK) +;source-doc/scsi-drv/class_scsi.c:169: if (result == USB_ERR_OK) ld a,(_result) or a jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/class_scsi.c:166: dev->current_lba++; +;source-doc/scsi-drv/class_scsi.c:170: dev->current_lba++; ld l, c ld h, b ld e, (hl) @@ -862,77 +800,10 @@ l_scsi_write_00114: ld a, h ld (bc), a l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:167: return result; +;source-doc/scsi-drv/class_scsi.c:171: return result; ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:168: } - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:170: usb_error scsi_eject(device_config_storage *const dev) { -; --------------------------------- -; Function scsi_eject -; --------------------------------- -_scsi_eject: - push ix - ld ix,0 - add ix,sp - ld hl, -21 - add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw = scsi_command_block_wrapper; - ld hl,0 - add hl, sp - ld e,l - ld d,h - push hl - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:174: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - ld hl,17 - add hl, sp - ld b,0x03 -l_scsi_eject_00103: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_scsi_eject_00103 - pop bc -;source-doc/scsi-drv/class_scsi.c:176: cbw_scsi.eject.operation_code = 0x1B; - ld (ix-6),0x1b -;source-doc/scsi-drv/class_scsi.c:177: cbw_scsi.eject.loej = 1; - ld hl,19 - add hl, sp - set 1, (hl) -;source-doc/scsi-drv/class_scsi.c:179: cbw_scsi.cbw.bCBWLUN = 0; - ld (ix-8),0x00 -;source-doc/scsi-drv/class_scsi.c:180: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); - ld (ix-7),0x06 -;source-doc/scsi-drv/class_scsi.c:181: cbw_scsi.cbw.dCBWDataTransferLength = 0; - ld hl,0x0008 - add hl, bc - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:183: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); - xor a - push af - inc sp - ld hl,0x0000 - push hl - push bc - ld l,(ix+4) - ld h,(ix+5) - push hl - call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:184: } - ld sp,ix +;source-doc/scsi-drv/class_scsi.c:172: } + ld sp, ix pop ix ret _scsi_command_block_wrapper: @@ -975,19 +846,6 @@ _scsi_packet_read_capacity: DEFB +0x00 DEFB +0x00 DEFB +0x00 -_scsi_packet_inquiry: - DEFB +0x12 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x24 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 _scsi_packet_request_sense: DEFB +0x03 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 147acfaa..904c8ba8 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -56,104 +56,90 @@ _chscsi_init: push ix ld ix,0 add ix,sp - ld hl, -5 - add hl, sp - ld sp, hl + push af + dec sp ;source-doc/scsi-drv/scsi-init.c:16: do { ld (ix-1),0x01 l_chscsi_init_00105: ;source-doc/scsi-drv/scsi-init.c:17: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); ld a,(ix-1) call _get_usb_device_config + ld l, e ;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL) - ld a, d + ld a,d + ld h,a or e - jp Z, l_chscsi_init_00108 + jr Z,l_chscsi_init_00108 ;source-doc/scsi-drv/scsi-init.c:22: const usb_device_type t = storage_device->type; - ld l, e - ld h, d ld a, (hl) and 0x0f ;source-doc/scsi-drv/scsi-init.c:24: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/scsi-init.c:25: const uint8_t dev_index = find_storage_dev(); //index == -1 (no more left) should never happen - push de +;source-doc/scsi-drv/scsi-init.c:25: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen call _find_storage_dev - ld c, l - pop de -;source-doc/scsi-drv/scsi-init.c:26: hbios_usb_storage_devices[dev_index].storage_device = storage_device; - ld (ix-5),c - ld (ix-4),0x00 - pop hl - push hl - add hl, hl +;source-doc/scsi-drv/scsi-init.c:26: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + ld c,l + ld e,l + ld d,0x00 + ld h, d add hl, hl ld a, l add a, +((_hbios_usb_storage_devices) & 0xFF) ld (ix-3),a - ld l,a - ld a,h - adc a,+((_hbios_usb_storage_devices) / 256) + ld a, h + adc a, +((_hbios_usb_storage_devices) / 256) ld (ix-2),a - ld h,a - ld (hl), e - inc hl - ld (hl), d -;source-doc/scsi-drv/scsi-init.c:27: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - ld l,(ix-3) - ld h,(ix-2) - inc hl - inc hl + pop hl + push hl inc c ld (hl), c -;source-doc/scsi-drv/scsi-init.c:28: hbios_usb_storage_devices[dev_index].usb_device = index; - ld c,(ix-3) - ld b,(ix-2) - inc bc - inc bc +;source-doc/scsi-drv/scsi-init.c:27: hbios_usb_storage_devices[dev_index].usb_device = index; + pop bc + push bc inc bc ld a,(ix-1) ld (bc), a -;source-doc/scsi-drv/scsi-init.c:30: print_string("\r\nUSB: MASS STORAGE @ $"); +;source-doc/scsi-drv/scsi-init.c:29: print_string("\r\nUSB: MASS STORAGE @ $"); push de ld hl,scsi_init_str_0 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:31: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:30: print_uint16(index); ld l,(ix-1) ld h,0x00 + push hl push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:32: print_string(":$"); +;source-doc/scsi-drv/scsi-init.c:31: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:33: print_uint16(dev_index + 1); pop hl +;source-doc/scsi-drv/scsi-init.c:32: print_uint16(dev_index + 1); + inc de push hl - inc hl - push de + ex de, hl call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:34: print_string(" $"); +;source-doc/scsi-drv/scsi-init.c:33: print_string(" $"); ld hl,scsi_init_str_2 call _print_string -;source-doc/scsi-drv/scsi-init.c:35: scsi_sense_init(storage_device); +;source-doc/scsi-drv/scsi-init.c:34: scsi_sense_init(index); call _scsi_sense_init pop af -;source-doc/scsi-drv/scsi-init.c:36: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); - ld e,(ix-3) - ld d,(ix-2) +;source-doc/scsi-drv/scsi-init.c:35: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); + pop de + push de ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:39: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/scsi-drv/scsi-init.c:38: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jp NZ,l_chscsi_init_00105 + jr NZ,l_chscsi_init_00105 l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:40: } +;source-doc/scsi-drv/scsi-init.c:39: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h index cd7eaa75..54342438 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h @@ -39,7 +39,6 @@ typedef struct { COMMON_DEVICE_CONFIG // bytes: 0-2 endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt uint32_t current_lba; // bytes 12-15 - uint8_t drive_index; // byte 16 } device_config_storage; typedef struct { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c index aec85045..f4131d8c 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -186,25 +186,6 @@ done: return result; } -static uint8_t count_storage_devs(enumeration_state *state) { - - uint8_t index = 1; - do { - device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - - if (storage_device == NULL) - break; - - const usb_device_type t = storage_device->type; - - if (t == USB_IS_FLOPPY || t == USB_IS_MASS_STORAGE) - storage_device->drive_index = state->storage_count++; - - } while (++index != MAX_NUMBER_OF_DEVICES + 1); - - return state->storage_count; -} - usb_error enumerate_all_devices(void) { _usb_state *const work_area = get_usb_work_area(); enumeration_state state; @@ -212,8 +193,6 @@ usb_error enumerate_all_devices(void) { usb_error result = read_all_configs(&state); - count_storage_devs(&state); - work_area->count_of_detected_usb_devices = state.next_device_address; done: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c index a5a426a4..a0b208b6 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.c @@ -3,8 +3,8 @@ hbios_storage_device_t hbios_usb_storage_devices[MAX_NUMBER_OF_DEVICES] = {{NULL}}; uint8_t find_storage_dev(void) { - for(uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) - if (hbios_usb_storage_devices[i].storage_device == NULL) + for (uint8_t i = 0; i < MAX_NUMBER_OF_DEVICES; i++) + if (hbios_usb_storage_devices[i].drive_index == 0) return i; return -1; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h index ec15480d..437bee01 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/hbios-driver-storage.h @@ -4,7 +4,6 @@ #include "usb_state.h" typedef struct _hbios_storage_device { - device_config_storage * storage_device; uint8_t drive_index; uint8_t usb_device; } hbios_storage_device_t; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index 928b24f4..6f349813 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -1,6 +1,9 @@ #include "usb-base-drv.h" +#include "usb_state.h" -uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1) { - storage_device->current_lba = lba; +uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + dev->current_lba = lba; return 0; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h index 3d2abd53..f5039fd2 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -1,11 +1,12 @@ #ifndef __USB_BASE_DRV #define __USB_BASE_DRV +#include "usb_state.h" #include #include -extern uint8_t storage_count; - -extern uint8_t chnative_seek(const uint32_t lba, device_config_storage *const storage_device) __sdcccall(1); +// ufi_seek is an alias for scsi_seek +extern usb_error scsi_seek(const uint16_t dev_index, const uint32_t lba); +extern usb_error ufi_seek(const uint16_t dev_index, const uint32_t lba); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index 762e41c2..e5da0b94 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -51,7 +51,9 @@ done: _scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; -usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) { +usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + cbw_scsi_read_capacity cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.read_capacity = scsi_packet_read_capacity; @@ -63,21 +65,23 @@ usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacit return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); } -_scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; +// _scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; -usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) { - cbw_scsi_inquiry cbw_scsi; - cbw_scsi.cbw = scsi_command_block_wrapper; - cbw_scsi.inquiry = scsi_packet_inquiry; +// usb_error scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result) { +// device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - cbw_scsi.cbw.bCBWLUN = 0; - cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); - cbw_scsi.cbw.dCBWDataTransferLength = 0x24; +// cbw_scsi_inquiry cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; +// cbw_scsi.inquiry = scsi_packet_inquiry; - return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); -} +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +// cbw_scsi.cbw.dCBWDataTransferLength = 0x24; -usb_error scsi_test(device_config_storage *const dev) { +// return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +// } + +static usb_error scsi_test(device_config_storage *const dev) { cbw_scsi_test cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); @@ -91,7 +95,7 @@ usb_error scsi_test(device_config_storage *const dev) { _scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}}; -usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { cbw_scsi_request_sense cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.request_sense = scsi_packet_request_sense; @@ -103,7 +107,9 @@ usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); } -usb_error scsi_sense_init(device_config_storage *const dev) { +usb_error scsi_sense_init(const uint16_t dev_index) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + scsi_sense_result response; uint8_t counter = 3; @@ -117,11 +123,7 @@ usb_error scsi_sense_init(device_config_storage *const dev) { static cbw_scsi_read_write cbw = {{{0}}}; -void spike_x(void) { - scsi_read(5, NULL); -} - -usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); memset(&cbw, 0, sizeof(cbw_scsi_read_write)); @@ -145,7 +147,9 @@ usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { return result; } -usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { +usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); cbw.cbw = scsi_command_block_wrapper; @@ -167,18 +171,18 @@ usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) { return result; } -usb_error scsi_eject(device_config_storage *const dev) { - cbw_scsi_eject cbw_scsi; - cbw_scsi.cbw = scsi_command_block_wrapper; +// usb_error scsi_eject(device_config_storage *const dev) { +// cbw_scsi_eject cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; - memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); +// memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - cbw_scsi.eject.operation_code = 0x1B; - cbw_scsi.eject.loej = 1; +// cbw_scsi.eject.operation_code = 0x1B; +// cbw_scsi.eject.loej = 1; - cbw_scsi.cbw.bCBWLUN = 0; - cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); - cbw_scsi.cbw.dCBWDataTransferLength = 0; +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +// cbw_scsi.cbw.dCBWDataTransferLength = 0; - return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); -} +// return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +// } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h index 5e5b63bf..989e5bec 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -182,12 +182,14 @@ typedef struct { _scsi_packet_read_write scsi_cmd; } cbw_scsi_read_write; -extern usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result); -extern usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result); -extern usb_error scsi_sense_init(device_config_storage *const dev); -extern usb_error scsi_test(device_config_storage *const dev); -extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result); -extern usb_error scsi_eject(device_config_storage *const dev); -extern usb_error scsi_read(const uint16_t dev, uint8_t *const buffer); -extern usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer); +extern usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *result); +extern usb_error scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result); +extern usb_error scsi_sense_init(const uint16_t dev_index); +// extern usb_error scsi_request_sense(const uint16_t dev_index, scsi_sense_result *const sens_result); +// extern usb_error scsi_eject(device_config_storage *const dev); +extern usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer); + +extern usb_error scsi_seek(const uint16_t dev_index, const uint32_t lba); + #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index 6438ef4d..e4928d0f 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -1,4 +1,5 @@ #include "class_scsi.h" +#include "hbios-driver-storage.h" #include #include #include @@ -7,7 +8,6 @@ #include #include #include -#include "hbios-driver-storage.h" extern const uint16_t const ch_scsi_fntbl[]; @@ -22,17 +22,16 @@ void chscsi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_MASS_STORAGE) { - const uint8_t dev_index = find_storage_dev(); //index == -1 (no more left) should never happen - hbios_usb_storage_devices[dev_index].storage_device = storage_device; + const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - hbios_usb_storage_devices[dev_index].usb_device = index; + hbios_usb_storage_devices[dev_index].usb_device = index; print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(":$"); print_uint16(dev_index + 1); print_string(" $"); - scsi_sense_init(storage_device); + scsi_sense_init(index); dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); } diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h index 1b761bd9..2649fc18 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h @@ -204,4 +204,6 @@ usb_error ufi_send_diagnostics(device_config *const storage_device); uint32_t convert_from_msb_first(const uint8_t *const buffer); +extern usb_error ufi_seek(const uint16_t dev_index, const uint32_t lba); + #endif diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index ebd6a64f..3a1af894 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -1,11 +1,11 @@ #include "class_ufi.h" +#include "hbios-driver-storage.h" #include #include #include #include #include #include -#include "hbios-driver-storage.h" extern const uint16_t const ch_ufi_fntbl[]; @@ -21,11 +21,10 @@ void chufi_init(void) { const usb_device_type t = storage_device->type; if (t == USB_IS_FLOPPY) { - const uint8_t dev_index = find_storage_dev(); //dev_index == -1 (no more left) should never happen - hbios_usb_storage_devices[dev_index].storage_device = storage_device; + const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - hbios_usb_storage_devices[dev_index].usb_device = index; - + hbios_usb_storage_devices[dev_index].usb_device = index; + print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(":$"); @@ -37,7 +36,9 @@ void chufi_init(void) { } while (++index != MAX_NUMBER_OF_DEVICES + 1); } -uint32_t chufi_get_cap(device_config *const dev) { +uint32_t chufi_get_cap(const uint16_t dev_index) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ufi_format_capacities_response response; memset(&response, 0, sizeof(ufi_format_capacities_response)); @@ -56,7 +57,8 @@ uint32_t chufi_get_cap(device_config *const dev) { return convert_from_msb_first(response.descriptors[0].number_of_blocks); } -uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); if (wait_for_device_ready((device_config *)dev, 20) != 0) return -1; // Not READY! @@ -85,7 +87,8 @@ uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { return USB_ERR_OK; } -usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); if (wait_for_device_ready((device_config *)dev, 20) != 0) return -1; // Not READY! diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 377e8fb6..78a119d8 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -64,94 +64,74 @@ l_chufi_init_00105: ;source-doc/ufi-drv/ufi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); ld a,(ix-1) call _get_usb_device_config + ld l, e ;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL) - ld a, d + ld a,d + ld h,a or e jr Z,l_chufi_init_00108 ;source-doc/ufi-drv/ufi-init.c:21: const usb_device_type t = storage_device->type; - ld l, e - ld h, d ld a, (hl) and 0x0f ;source-doc/ufi-drv/ufi-init.c:23: if (t == USB_IS_FLOPPY) { dec a jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/ufi-init.c:24: const uint8_t dev_index = find_storage_dev(); //dev_index == -1 (no more left) should never happen - push de +;source-doc/ufi-drv/ufi-init.c:24: const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen call _find_storage_dev - ld c, l - pop de -;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].storage_device = storage_device; - ld (ix-3),c +;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; + ld (ix-3),l ld (ix-2),0x00 + ld c,l pop hl push hl add hl, hl - add hl, hl - ld a,+((_hbios_usb_storage_devices) & 0xFF) - add a,l - ld l,a - ld a,+((_hbios_usb_storage_devices) / 256) - adc a,h - ld h,a - ld (hl), e - inc hl - ld (hl), d - dec hl -;source-doc/ufi-drv/ufi-init.c:26: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - ld e, l - ld d, h - inc de - inc de - ld a, c - inc a - ld (de), a -;source-doc/ufi-drv/ufi-init.c:27: hbios_usb_storage_devices[dev_index].usb_device = index; - ld c, l - ld b, h - inc bc - inc bc + ld de,_hbios_usb_storage_devices + add hl, de + ld e,l + ld d,h + inc c + ld (hl), c +;source-doc/ufi-drv/ufi-init.c:26: hbios_usb_storage_devices[dev_index].usb_device = index; + ld c, e + ld b, d inc bc ld a,(ix-1) ld (bc), a -;source-doc/ufi-drv/ufi-init.c:29: print_string("\r\nUSB: FLOPPY @ $"); - push hl +;source-doc/ufi-drv/ufi-init.c:28: print_string("\r\nUSB: FLOPPY @ $"); + push de ld hl,ufi_init_str_0 call _print_string - pop hl -;source-doc/ufi-drv/ufi-init.c:30: print_uint16(index); - ld e,(ix-1) - ld d,0x00 - push hl - ex de, hl + pop de +;source-doc/ufi-drv/ufi-init.c:29: print_uint16(index); + ld l,(ix-1) + ld h,0x00 + push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:31: print_string(":$"); +;source-doc/ufi-drv/ufi-init.c:30: print_string(":$"); ld hl,ufi_init_str_1 call _print_string - pop hl -;source-doc/ufi-drv/ufi-init.c:32: print_uint16(dev_index + 1); pop de - push de - inc de +;source-doc/ufi-drv/ufi-init.c:31: print_uint16(dev_index + 1); + pop hl push hl - ex de, hl + inc hl + push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:33: print_string(" $"); +;source-doc/ufi-drv/ufi-init.c:32: print_string(" $"); ld hl,ufi_init_str_2 call _print_string - pop hl -;source-doc/ufi-drv/ufi-init.c:34: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); - ex de, hl + pop de +;source-doc/ufi-drv/ufi-init.c:33: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:37: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +;source-doc/ufi-drv/ufi-init.c:36: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 jr NZ,l_chufi_init_00105 l_chufi_init_00108: -;source-doc/ufi-drv/ufi-init.c:38: } +;source-doc/ufi-drv/ufi-init.c:37: } ld sp, ix pop ix ret @@ -166,7 +146,7 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:40: uint32_t chufi_get_cap(device_config *const dev) { +;source-doc/ufi-drv/ufi-init.c:39: uint32_t chufi_get_cap(const uint16_t dev_index) { ; --------------------------------- ; Function chufi_get_cap ; --------------------------------- @@ -177,7 +157,10 @@ _chufi_get_cap: ld hl, -72 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:42: memset(&response, 0, sizeof(ufi_format_capacities_response)); +;source-doc/ufi-drv/ufi-init.c:40: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi-init.c:43: memset(&response, 0, sizeof(ufi_format_capacities_response)); ld hl,0 add hl, sp ld b,0x12 @@ -188,67 +171,66 @@ l_chufi_get_cap_00112: ld (hl), a inc hl djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:44: wait_for_device_ready(dev, 25); +;source-doc/ufi-drv/ufi-init.c:45: wait_for_device_ready(dev, 25); + push de ld a,0x19 push af inc sp - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:48: ufi_inquiry(dev, &inquiry); - ld hl,36 + pop de +;source-doc/ufi-drv/ufi-init.c:49: ufi_inquiry(dev, &inquiry); + push de + ld hl,38 add hl, sp push hl - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _ufi_inquiry pop af -;source-doc/ufi-drv/ufi-init.c:50: wait_for_device_ready(dev, 15); - ld h,0x0f - ex (sp),hl + pop af + pop de +;source-doc/ufi-drv/ufi-init.c:51: wait_for_device_ready(dev, 15); + push de + ld a,0x0f + push af inc sp - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _wait_for_device_ready pop af inc sp -;source-doc/ufi-drv/ufi-init.c:52: const usb_error result = ufi_read_frmt_caps(dev, &response); + pop de +;source-doc/ufi-drv/ufi-init.c:53: const usb_error result = ufi_read_frmt_caps(dev, &response); ld hl,0 add hl, sp push hl - ld l,(ix+4) - ld h,(ix+5) - push hl + push de call _ufi_read_frmt_caps pop af pop af ld a, l -;source-doc/ufi-drv/ufi-init.c:53: if (result != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:54: if (result != USB_ERR_OK) or a jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:54: return 0; +;source-doc/ufi-drv/ufi-init.c:55: return 0; ld hl,0x0000 ld e, l ld d, l jr l_chufi_get_cap_00103 l_chufi_get_cap_00102: -;source-doc/ufi-drv/ufi-init.c:56: return convert_from_msb_first(response.descriptors[0].number_of_blocks); +;source-doc/ufi-drv/ufi-init.c:57: return convert_from_msb_first(response.descriptors[0].number_of_blocks); ld hl,4 add hl, sp push hl call _convert_from_msb_first pop af l_chufi_get_cap_00103: -;source-doc/ufi-drv/ufi-init.c:57: } +;source-doc/ufi-drv/ufi-init.c:58: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:59: uint8_t chufi_read(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:60: uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_read ; --------------------------------- @@ -259,10 +241,14 @@ _chufi_read: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:61: if (wait_for_device_ready((device_config *)dev, 20) != 0) - ld c,(ix+4) - ld b,(ix+5) - push bc +;source-doc/ufi-drv/ufi-init.c:61: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi-init.c:63: if (wait_for_device_ready((device_config *)dev, 20) != 0) + push de + ld c,e + ld b,d + push de ld a,0x14 push af inc sp @@ -271,23 +257,22 @@ _chufi_read: pop af inc sp ld a, l + pop de pop bc or a jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:62: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:64: return -1; // Not READY! ld l,0xff jr l_chufi_read_00109 l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:67: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:69: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:69: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) - ld e,(ix+4) - ld d,(ix+5) +;source-doc/ufi-drv/ufi-init.c:71: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) ld hl,12 add hl, de ld e, (hl) @@ -318,11 +303,11 @@ l_chufi_read_00102: pop bc or a jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:70: return -1; // general error +;source-doc/ufi-drv/ufi-init.c:72: return -1; // general error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:73: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:75: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -335,7 +320,7 @@ l_chufi_read_00139: inc hl djnz l_chufi_read_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:75: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) +;source-doc/ufi-drv/ufi-init.c:77: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) ld hl,2 add hl, sp push hl @@ -346,29 +331,29 @@ l_chufi_read_00139: ld a, l or a jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:76: return -1; // error +;source-doc/ufi-drv/ufi-init.c:78: return -1; // error ld l,0xff jr l_chufi_read_00109 l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:80: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:82: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:82: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:84: if (sense_key != 0) and 0x0f jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:83: return -1; +;source-doc/ufi-drv/ufi-init.c:85: return -1; ld l,0xff jr l_chufi_read_00109 l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:85: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:87: return USB_ERR_OK; ld l,0x00 l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:86: } +;source-doc/ufi-drv/ufi-init.c:88: } ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi-init.c:88: usb_error chufi_write(device_config_storage *const dev, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi-init.c:90: usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function chufi_write ; --------------------------------- @@ -379,10 +364,14 @@ _chufi_write: ld hl, -20 add hl, sp ld sp, hl -;source-doc/ufi-drv/ufi-init.c:90: if (wait_for_device_ready((device_config *)dev, 20) != 0) - ld c,(ix+4) - ld b,(ix+5) - push bc +;source-doc/ufi-drv/ufi-init.c:91: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi-init.c:93: if (wait_for_device_ready((device_config *)dev, 20) != 0) + push de + ld c,e + ld b,d + push de ld a,0x14 push af inc sp @@ -391,23 +380,22 @@ _chufi_write: pop af inc sp ld a, l + pop de pop bc or a jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:91: return -1; // Not READY! +;source-doc/ufi-drv/ufi-init.c:94: return -1; // Not READY! ld l,0xff jr l_chufi_write_00109 l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:95: memset(&sense_codes, 0, sizeof(sense_codes)); +;source-doc/ufi-drv/ufi-init.c:98: memset(&sense_codes, 0, sizeof(sense_codes)); ld hl,0 add hl, sp xor a ld (hl), a inc hl ld (hl), a -;source-doc/ufi-drv/ufi-init.c:96: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { - ld e,(ix+4) - ld d,(ix+5) +;source-doc/ufi-drv/ufi-init.c:99: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { ld hl,12 add hl, de ld e, (hl) @@ -438,11 +426,11 @@ l_chufi_write_00102: pop bc or a jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:97: return -1; +;source-doc/ufi-drv/ufi-init.c:100: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:101: memset(&response, 0, sizeof(response)); +;source-doc/ufi-drv/ufi-init.c:104: memset(&response, 0, sizeof(response)); push bc ld hl,4 add hl, sp @@ -455,7 +443,7 @@ l_chufi_write_00139: inc hl djnz l_chufi_write_00139 pop bc -;source-doc/ufi-drv/ufi-init.c:103: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { +;source-doc/ufi-drv/ufi-init.c:106: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { ld hl,2 add hl, sp push hl @@ -466,25 +454,25 @@ l_chufi_write_00139: ld a, l or a jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:104: return -1; +;source-doc/ufi-drv/ufi-init.c:107: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:109: const uint8_t sense_key = response.sense_key; +;source-doc/ufi-drv/ufi-init.c:112: const uint8_t sense_key = response.sense_key; ld hl,4 add hl, sp ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:111: if (sense_key != 0) +;source-doc/ufi-drv/ufi-init.c:114: if (sense_key != 0) and 0x0f jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:112: return -1; +;source-doc/ufi-drv/ufi-init.c:115: return -1; ld l,0xff jr l_chufi_write_00109 l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:114: return USB_ERR_OK; +;source-doc/ufi-drv/ufi-init.c:117: return USB_ERR_OK; ld l,0x00 l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:115: } +;source-doc/ufi-drv/ufi-init.c:118: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 74c3283d..1144e48d 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -61,20 +61,26 @@ CH_SCSI_RESET: ; sector) are 0 relative. ; CH_SCSI_SEEK: + EXX + LD D, 0 + LD E, (IY+1) ; usb_device + PUSH DE + POP IY + EXX + 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) - EX DE, HL - EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) PUSH DE - EXX - CALL _chnative_seek + PUSH HL + PUSH IY + CALL _scsi_seek + POP IY + POP HL + POP DE + + XOR A RET ; ; ### Function 0x13 -- Disk Read (DIOREAD) @@ -95,25 +101,25 @@ CH_SCSI_SEEK: ; CH_SCSI_READ: EXX - ld d, 0 - ld e, (iy+3) - push de - pop iy + LD D, 0 + LD E, (IY+1) ; usb_device + PUSH DE + POP IY EXX CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR ; call scsi_read(IY, HL); ; HL = HL + 512 - push hl - push iy + PUSH HL + PUSH IY call _scsi_read - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc - ret + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC + RET ; ; ### Function 0x14 -- Disk Write (DIOWRITE) ; @@ -133,11 +139,8 @@ CH_SCSI_READ: ; CH_SCSI_WRITE: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX @@ -146,14 +149,14 @@ CH_SCSI_WRITE: ; call scsi_write(IY, HL); ; HL = HL + 512 - push hl - push iy + PUSH HL + PUSH IY call _scsi_write - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC ret CH_SCSI_VERIFY: @@ -206,7 +209,7 @@ CH_SCSI_FORMAT: CH_SCSI_DEVICE: LD C, %00111010 LD D, DIODEV_USB - LD E, (iy+2) ; drive_index + LD E, (IY+0) ; drive_index LD HL, 0 XOR A RET @@ -252,40 +255,37 @@ CH_SCSI_DEFMED: ; CH_SCSI_CAP: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX - push ix - ld ix, -8 ; reserve 8 bytes for - add ix, sp ; scsi_read_capacity_result - ld sp, ix + PUSH IX + LD IX, -8 ; reserve 8 bytes for + ADD IX, SP ; scsi_read_capacity_result + LD SP, IX - push ix - push iy + PUSH IX + PUSH IY call _scsi_read_capacity - pop iy - pop ix + POP IY + POP IX - ld d, (ix) ; response.number_of_blocks[0] - ld e, (ix+1) ; response.number_of_blocks[1] - ld h, (ix+2) ; response.number_of_blocks[2] - ld l, (ix+3) ; response.number_of_blocks[3] - ld b, (ix+6) ; response.block_size[2] - ld c, (ix+7) ; response.block_size[3] + LD D, (IX) ; response.number_of_blocks[0] + LD E, (IX+1) ; response.number_of_blocks[1] + LD H, (IX+2) ; response.number_of_blocks[2] + LD L, (IX+3) ; response.number_of_blocks[3] + LD B, (IX+6) ; response.block_size[2] + LD C, (IX+7) ; response.block_size[3] - ld ix, 8 - add ix, sp - ld sp, ix - pop ix + LD IX, 8 + ADD IX, SP + LD SP, IX + POP IX - xor a ; todo determine a drive status - ret + XOR A ; todo determine a drive status + RET ; ; ### Function 0x1B -- Disk Geometry (DIOGEOMETRY) ; @@ -305,16 +305,6 @@ CH_SCSI_CAP: ; ** Does not appear to be used?? ; CH_SCSI_GEOM: - EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) - PUSH DE - POP IY - EXX - ; 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 CH_SCSI_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 521e76a9..e8b5c8ac 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -5,6 +5,7 @@ ; #include "./ch376-native/ufi-drv.s" +_ufi_seek .EQU _scsi_seek ; find and mount all floppy USB drives CHUFI_INIT .EQU _chufi_init @@ -61,22 +62,25 @@ CH_UFI_RESET: ; CH_UFI_SEEK: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX - BIT 7, D ; CHECK FOR LBA FLAG - CALL Z, HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA - never seems to happen? - RES 7, D - EX DE, HL + 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) + + PUSH DE + PUSH HL + PUSH IY + CALL _ufi_seek + POP IY + POP HL + POP DE - push IY - CALL _chnative_seek + XOR A RET ; ; ### Function 0x13 -- Disk Read (DIOREAD) @@ -97,27 +101,24 @@ CH_UFI_SEEK: ; CH_UFI_READ: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR - push hl - push iy + PUSH HL + PUSH IY call _chufi_read - ld l, 0 - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc - ret + LD L, 0 + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC + RET ; ; ### Function 0x14 -- Disk Write (DIOWRITE) ; @@ -137,11 +138,8 @@ CH_UFI_READ: ; CH_UFI_WRITE: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX @@ -150,15 +148,15 @@ CH_UFI_WRITE: ; call scsi_write(IY, HL); ; HL = HL + 512 - push hl - push iy + PUSH HL + PUSH IY call _chufi_write - ld a, l - pop iy - pop hl - ld bc, 512 - add hl, bc - ret + LD A, L + POP IY + POP HL + LD BC, 512 + ADD HL, BC + RET CH_UFI_VERIFY: CH_UFI_FORMAT: @@ -213,7 +211,7 @@ CH_UFI_FORMAT: CH_UFI_DEVICE: LD C, %11010110 LD D, DIODEV_USB - LD E, (iy+2) ; drive_index + LD E, (IY+0) ; drive_index LD HL, 0 XOR A RET @@ -262,21 +260,18 @@ CH_UFI_DEFMED: ; CH_UFI_CAP: EXX - push IY - POP HL - LD E, (HL) - INC HL - LD D, (HL) + LD D, 0 + LD E, (IY+1) ; usb_device PUSH DE POP IY EXX - push iy + PUSH IY call _chufi_get_cap - pop iy - ld bc, 512 - xor a - ret + POP IY + LD BC, 512 + XOR A + RET CH_UFI_GEOM: LD HL, 0 From ecb95cc16124468a144996e1196e39e6dafafbe7 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 21 Apr 2025 18:27:32 +1000 Subject: [PATCH 41/59] ch376-native: refactor clear separation of driver and usb functions --- .vscode/settings.json | 4 +- Source/HBIOS/ch376-native/base-drv.s | 1 - .../ch376-native/base-drv/ch376_init.c.s | 3 + .../ch376-native/base-drv/usb-base-drv.c.s | 167 ++++- .../HBIOS/ch376-native/base-drv/usb-init.c.s | 465 -------------- .../HBIOS/ch376-native/base-drv/usb_init.c.s | 203 ------ .../HBIOS/ch376-native/base-drv/usb_state.c.s | 109 ++-- Source/HBIOS/ch376-native/keyboard.s | 1 + .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 575 ++--------------- .../ch376-native/keyboard/kyb_driver.c.s | 583 ++++++++++++++++++ Source/HBIOS/ch376-native/scsi-drv.s | 1 + .../ch376-native/scsi-drv/class_scsi.c.s | 464 +------------- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 67 +- .../ch376-native/scsi-drv/scsi_driver.c.s | 482 +++++++++++++++ .../ch376-native/source-doc/base-drv/ch376.h | 1 + .../source-doc/base-drv/ch376_init.c | 2 +- .../source-doc/base-drv/usb-base-drv.c | 71 ++- .../source-doc/base-drv/usb-base-drv.h | 4 +- .../source-doc/base-drv/usb_init.c | 69 --- .../source-doc/base-drv/usb_init.h | 8 - .../source-doc/base-drv/usb_state.c | 13 + .../source-doc/base-drv/usb_state.h | 5 +- .../source-doc/keyboard/kyb-init.c | 148 +---- .../source-doc/keyboard/kyb_driver.c | 150 +++++ .../source-doc/keyboard/kyb_driver.h | 12 + .../source-doc/scsi-drv/class_scsi.c | 116 +--- .../source-doc/scsi-drv/class_scsi.h | 19 +- .../source-doc/scsi-drv/scsi-init.c | 19 +- .../source-doc/scsi-drv/scsi_driver.c | 118 ++++ .../source-doc/scsi-drv/scsi_driver.h | 14 + .../source-doc/ufi-drv/ufi-init.c | 97 +-- .../source-doc/ufi-drv/ufi_driver.c | 85 +++ .../source-doc/ufi-drv/ufi_driver.h | 11 + Source/HBIOS/ch376-native/ufi-drv.s | 1 + .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 403 ++---------- .../HBIOS/ch376-native/ufi-drv/ufi_driver.c.s | 380 ++++++++++++ Source/HBIOS/ch376kyb.asm | 8 +- Source/HBIOS/ch376scsi.asm | 8 +- Source/HBIOS/ch376ufi.asm | 8 +- 39 files changed, 2318 insertions(+), 2577 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/base-drv/usb-init.c.s delete mode 100644 Source/HBIOS/ch376-native/base-drv/usb_init.c.s create mode 100644 Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s create mode 100644 Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s delete mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c delete mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h create mode 100644 Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c create mode 100644 Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c create mode 100644 Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h create mode 100644 Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s diff --git a/.vscode/settings.json b/.vscode/settings.json index 7b5d2f7c..f7b26e28 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,8 @@ "ch376inc.h": "c", "enumerate_storage.h": "c", "work-area.h": "c", - "hbios-driver-storage.h": "c" + "hbios-driver-storage.h": "c", + "class_hid_keyboard.h": "c", + "print.h": "c" } } diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index 2f0a85d6..a06f93b2 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -11,6 +11,5 @@ #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/transfers.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" -#include "ch376-native/base-drv/usb_init.c.s" #include "ch376-native/base-drv/usb_state.c.s" #include "ch376-native/base-drv/work-area.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s index e6eb0011..06098a7e 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -19,6 +19,9 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index f8e7284e..5ebcdd96 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -48,18 +48,171 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb-base-drv.c:4: uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { +;source-doc/base-drv/usb-base-drv.c:7: static usb_error usb_host_bus_reset(void) { ; --------------------------------- -; Function scsi_seek +; Function usb_host_bus_reset ; --------------------------------- -_scsi_seek: +_usb_host_bus_reset: +;source-doc/base-drv/usb-base-drv.c:8: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb-base-drv.c:9: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb-base-drv.c:11: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + ld l,0x07 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb-base-drv.c:12: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb-base-drv.c:14: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb-base-drv.c:15: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/ch376.h:111: #endif + ld l,0x0b + call _ch_command +;source-doc/base-drv/ch376.h:112: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/usb-base-drv.c:19: return USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/usb-base-drv.c:20: } + ret +;source-doc/base-drv/usb-base-drv.c:24: uint16_t usb_init(uint8_t state) __z88dk_fastcall { +; --------------------------------- +; Function usb_init +; --------------------------------- +_usb_init: +;source-doc/base-drv/usb-base-drv.c:27: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:29: if (state == 0) { + ld a, l + or a + jr NZ,l_usb_init_00104 +;source-doc/base-drv/usb-base-drv.c:30: ch_cmd_reset_all(); + call _ch_cmd_reset_all +;source-doc/base-drv/usb-base-drv.c:31: delay_medium(); + call _delay_medium +;source-doc/base-drv/usb-base-drv.c:33: if (!ch_probe()) { + call _ch_probe + ld a, l +;source-doc/base-drv/usb-base-drv.c:34: USB_MODULE_LEDS = 0x00; + or a + jr NZ,l_usb_init_00102 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:35: return 0xFF00; + ld hl,0xff00 + jp l_usb_init_00113 +l_usb_init_00102: +;source-doc/base-drv/usb-base-drv.c:37: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:38: return 1; + ld hl,0x0001 + jr l_usb_init_00113 +l_usb_init_00104: +;source-doc/base-drv/usb-base-drv.c:41: if (state == 1) { + ld a, l + dec a + jr NZ,l_usb_init_00106 +;source-doc/base-drv/usb-base-drv.c:42: r = ch_cmd_get_ic_version(); + call _ch_cmd_get_ic_version +;source-doc/base-drv/usb-base-drv.c:44: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:45: return (uint16_t)r << 8 | 2; + xor a + ld h, l + ld l,0x02 + jr l_usb_init_00113 +l_usb_init_00106: +;source-doc/base-drv/usb-base-drv.c:48: if (state == 2) { + ld a, l + sub 0x02 + jr NZ,l_usb_init_00159 + ld a,0x01 + jr l_usb_init_00160 +l_usb_init_00159: + xor a +l_usb_init_00160: + ld c,a + or a + jr Z,l_usb_init_00110 +;source-doc/base-drv/usb-base-drv.c:49: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-base-drv.c:51: r = ch_very_short_wait_int_and_get_(); + call _ch_very_short_wait_int_and_get + ld a, l +;source-doc/base-drv/usb-base-drv.c:53: if (r != USB_INT_CONNECT) { + sub 0x81 + jr Z,l_usb_init_00108 +;source-doc/base-drv/usb-base-drv.c:54: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:55: return 2; + ld hl,0x0002 + jr l_usb_init_00113 +l_usb_init_00108: +;source-doc/base-drv/usb-base-drv.c:58: return 3; + ld hl,0x0003 + jr l_usb_init_00113 +l_usb_init_00110: +;source-doc/base-drv/usb-base-drv.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld b,0x32 + ld hl,_x + jr l_usb_init_00163 +l_usb_init_00162: + ld (hl),0x00 + inc hl +l_usb_init_00163: + ld (hl),0x00 + inc hl + djnz l_usb_init_00162 +;source-doc/base-drv/usb-base-drv.c:62: if (state != 2) { + bit 0, c + jr NZ,l_usb_init_00112 +;source-doc/base-drv/usb-base-drv.c:63: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb-base-drv.c:64: delay_medium(); + call _delay_medium +l_usb_init_00112: +;source-doc/base-drv/usb-base-drv.c:66: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb-base-drv.c:67: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb-base-drv.c:68: return (uint16_t)count_of_devices() << 8 | 4; + call _count_of_devices + ld h, a + xor a + ld l,0x04 +l_usb_init_00113: +;source-doc/base-drv/usb-base-drv.c:69: } + ret +;source-doc/base-drv/usb-base-drv.c:71: uint8_t usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { +; --------------------------------- +; Function usb_scsi_seek +; --------------------------------- +_usb_scsi_seek: push ix ld ix,0 add ix,sp -;source-doc/base-drv/usb-base-drv.c:5: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/base-drv/usb-base-drv.c:72: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config -;source-doc/base-drv/usb-base-drv.c:7: dev->current_lba = lba; +;source-doc/base-drv/usb-base-drv.c:74: dev->current_lba = lba; ld hl,0x000c add hl, de ex de, hl @@ -67,8 +220,8 @@ _scsi_seek: add hl, sp ld bc,0x0004 ldir -;source-doc/base-drv/usb-base-drv.c:8: return 0; +;source-doc/base-drv/usb-base-drv.c:75: return 0; ld l,0x00 -;source-doc/base-drv/usb-base-drv.c:9: } +;source-doc/base-drv/usb-base-drv.c:76: } pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s deleted file mode 100644 index b3429367..00000000 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ /dev/null @@ -1,465 +0,0 @@ -; -; Generated from source-doc/base-drv/usb-init.c.asm -- not to be modify directly -; -; -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.5.0 #15248 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -#IF 0 - -; .area _INITIALIZED removed by z88dk - - -#ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- -;-------------------------------------------------------- -; code -;-------------------------------------------------------- -;source-doc/base-drv/usb-init.c:8: static usb_error usb_host_bus_reset(void) { -; --------------------------------- -; Function usb_host_bus_reset -; --------------------------------- -_usb_host_bus_reset: -;source-doc/base-drv/usb-init.c:9: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb-init.c:10: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb-init.c:12: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - ld l,0x07 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb-init.c:13: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb-init.c:15: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb-init.c:16: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/ch376.h:110: #endif - ld l,0x0b - call _ch_command -;source-doc/base-drv/ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0xdf - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/usb-init.c:20: return USB_ERR_OK; - ld l,0x00 -;source-doc/base-drv/usb-init.c:21: } - ret -;source-doc/base-drv/usb-init.c:25: uint16_t ch376_init(uint8_t state) { -; --------------------------------- -; Function ch376_init -; --------------------------------- -_ch376_init: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x03; - ld a,0x03 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:30: if (state == 0) { - ld a,(ix+4) - or a - jr NZ,l_ch376_init_00104 -;source-doc/base-drv/usb-init.c:31: ch_cmd_reset_all(); - call _ch_cmd_reset_all -;source-doc/base-drv/usb-init.c:32: delay_medium(); - call _delay_medium -;source-doc/base-drv/usb-init.c:34: if (!ch_probe()) { - call _ch_probe - ld a, l -;source-doc/base-drv/usb-init.c:35: USB_MODULE_LEDS = 0x00; - or a - jr NZ,l_ch376_init_00102 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:36: return 0xFF00; - ld hl,0xff00 - jp l_ch376_init_00113 -l_ch376_init_00102: -;source-doc/base-drv/usb-init.c:38: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:39: return 1; - ld hl,0x0001 - jr l_ch376_init_00113 -l_ch376_init_00104: -;source-doc/base-drv/usb-init.c:42: if (state == 1) { - ld a,(ix+4) - dec a - jr NZ,l_ch376_init_00106 -;source-doc/base-drv/usb-init.c:43: r = ch_cmd_get_ic_version(); - call _ch_cmd_get_ic_version -;source-doc/base-drv/usb-init.c:45: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:46: return (uint16_t)r << 8 | 2; - xor a - ld h, l - ld l,0x02 - jr l_ch376_init_00113 -l_ch376_init_00106: -;source-doc/base-drv/usb-init.c:49: if (state == 2) { - ld a,(ix+4) - sub 0x02 - jr NZ,l_ch376_init_00159 - ld a,0x01 - jr l_ch376_init_00160 -l_ch376_init_00159: - xor a -l_ch376_init_00160: - ld c,a - or a - jr Z,l_ch376_init_00110 -;source-doc/base-drv/usb-init.c:50: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:52: r = ch_very_short_wait_int_and_get_(); - call _ch_very_short_wait_int_and_get - ld a, l -;source-doc/base-drv/usb-init.c:54: if (r != USB_INT_CONNECT) { - sub 0x81 - jr Z,l_ch376_init_00108 -;source-doc/base-drv/usb-init.c:55: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:56: return 2; - ld hl,0x0002 - jr l_ch376_init_00113 -l_ch376_init_00108: -;source-doc/base-drv/usb-init.c:59: return 3; - ld hl,0x0003 - jr l_ch376_init_00113 -l_ch376_init_00110: -;source-doc/base-drv/usb-init.c:62: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld b,0x35 - ld hl,_x - jr l_ch376_init_00163 -l_ch376_init_00162: - ld (hl),0x00 - inc hl -l_ch376_init_00163: - ld (hl),0x00 - inc hl - djnz l_ch376_init_00162 -;source-doc/base-drv/usb-init.c:63: if (state != 2) { - bit 0, c - jr NZ,l_ch376_init_00112 -;source-doc/base-drv/usb-init.c:64: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb-init.c:65: delay_medium(); - call _delay_medium -l_ch376_init_00112: -;source-doc/base-drv/usb-init.c:67: enumerate_all_devices(); - call _enumerate_all_devices -;source-doc/base-drv/usb-init.c:68: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb-init.c:69: return (uint16_t)count_of_devices() << 8 | state + 1; - call _count_of_devices - ld c,(ix+4) - ld b,0x00 - inc bc - or b - ld h, a - ld l, c -l_ch376_init_00113: -;source-doc/base-drv/usb-init.c:70: } - pop ix - ret -;source-doc/base-drv/usb-init.c:72: static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { -; --------------------------------- -; Function wait_for_state -; --------------------------------- -_wait_for_state: - push ix - ld ix,0 - add ix,sp - dec sp - ld (ix-1),a - ld b, l -;source-doc/base-drv/usb-init.c:73: uint16_t r = state; - ld e, b -;source-doc/base-drv/usb-init.c:75: for (uint8_t i = 0; i < loop_counter; i++) { - ld d,0x00 - ld c,d -l_wait_for_state_00108: - ld a, c - sub (ix-1) - jr NC,l_wait_for_state_00106 -;source-doc/base-drv/usb-init.c:76: if (state == desired_state) - ld a,(ix+4) - sub b - jr Z,l_wait_for_state_00106 -;source-doc/base-drv/usb-init.c:79: if (i & 1) - bit 0, c - jr Z,l_wait_for_state_00104 -;source-doc/base-drv/usb-init.c:80: print_string("\b $"); - push bc - ld hl,usb_init_str_0 - call _print_string - pop bc - jr l_wait_for_state_00105 -l_wait_for_state_00104: -;source-doc/base-drv/usb-init.c:82: print_string("\b*$"); - push bc - ld hl,usb_init_str_1 - call _print_string - pop bc -l_wait_for_state_00105: -;source-doc/base-drv/usb-init.c:84: r = ch376_init(state); - push bc - push bc - inc sp - call _ch376_init - inc sp - ex de, hl - pop bc -;source-doc/base-drv/usb-init.c:85: state = r & 255; - ld b, e -;source-doc/base-drv/usb-init.c:75: for (uint8_t i = 0; i < loop_counter; i++) { - inc c - jr l_wait_for_state_00108 -l_wait_for_state_00106: -;source-doc/base-drv/usb-init.c:88: return r; -;source-doc/base-drv/usb-init.c:89: } - inc sp - pop ix - pop hl - inc sp - jp (hl) -usb_init_str_0: - DEFB 0x08 - DEFM " $" - DEFB 0x00 -usb_init_str_1: - DEFB 0x08 - DEFM "*$" - DEFB 0x00 -;source-doc/base-drv/usb-init.c:91: void _chnative_init(bool forced) { -; --------------------------------- -; Function _chnative_init -; --------------------------------- -__chnative_init: - push ix - ld ix,0 - add ix,sp - dec sp -;source-doc/base-drv/usb-init.c:94: const uint8_t loop_counter = forced ? 40 : 5; - bit 0,(ix+4) - jr Z,l__chnative_init_00113 - ld a,0x28 - jr l__chnative_init_00114 -l__chnative_init_00113: - ld a,0x05 -l__chnative_init_00114: - ld (ix-1),a -;source-doc/base-drv/usb-init.c:96: print_string("\r\nCH376: *$"); - ld hl,usb_init_str_2 - call _print_string -;source-doc/base-drv/usb-init.c:98: r = wait_for_state(loop_counter, state, 1); - ld a,0x01 - push af - inc sp - ld l,0x00 - ld a,(ix-1) - call _wait_for_state - ld b, e -;source-doc/base-drv/usb-init.c:99: state = r & 255; -;source-doc/base-drv/usb-init.c:101: print_string("\bPRESENT (VER $"); - push bc - ld hl,usb_init_str_3 - call _print_string -;source-doc/base-drv/usb-init.c:103: r = ch376_init(state); - inc sp - call _ch376_init - inc sp - ex de, hl -;source-doc/base-drv/usb-init.c:104: state = r & 255; - ld c, e -;source-doc/base-drv/usb-init.c:105: if (state != 2) { - ld a, c - sub 0x02 - jr Z,l__chnative_init_00102 -;source-doc/base-drv/usb-init.c:106: print_string("\rCH376: $"); - ld hl,usb_init_str_4 - call _print_string -;source-doc/base-drv/usb-init.c:107: print_string("VERSION FAILURE\r\n$"); - ld hl,usb_init_str_5 - call _print_string -;source-doc/base-drv/usb-init.c:108: return; - jr l__chnative_init_00111 -l__chnative_init_00102: -;source-doc/base-drv/usb-init.c:111: print_hex(r >> 8); - push bc - ld l, d - call _print_hex -;source-doc/base-drv/usb-init.c:112: print_string("); $"); - ld hl,usb_init_str_6 - call _print_string -;source-doc/base-drv/usb-init.c:114: print_string("USB: *$"); - ld hl,usb_init_str_7 - call _print_string - pop bc -;source-doc/base-drv/usb-init.c:116: r = wait_for_state(loop_counter, state, 3); - ld a,0x03 - push af - inc sp - ld l, c - ld a,(ix-1) - call _wait_for_state - ld b, e -;source-doc/base-drv/usb-init.c:117: state = r & 255; -;source-doc/base-drv/usb-init.c:119: if (state == 2) { - ld a, b - sub 0x02 - jr NZ,l__chnative_init_00104 -;source-doc/base-drv/usb-init.c:120: print_string("\bDISCONNECTED$"); - ld hl,usb_init_str_8 - call _print_string -;source-doc/base-drv/usb-init.c:121: return; - jr l__chnative_init_00111 -l__chnative_init_00104: -;source-doc/base-drv/usb-init.c:124: print_string("\bCONNECTED$"); - push bc - ld hl,usb_init_str_9 - call _print_string -;source-doc/base-drv/usb-init.c:127: r = ch376_init(state); - inc sp - call _ch376_init - inc sp - ex de, hl -;source-doc/base-drv/usb-init.c:128: state = r & 255; - ld b, e -;source-doc/base-drv/usb-init.c:130: for (uint8_t i = 0; i < loop_counter; i++) { - ld c,0x00 -l__chnative_init_00109: - ld a, c - sub (ix-1) - jr NC,l__chnative_init_00111 -;source-doc/base-drv/usb-init.c:131: if (r >> 8 != 0) - ld a,0x00 - or d - jr NZ,l__chnative_init_00111 -;source-doc/base-drv/usb-init.c:134: print_string(".$"); - push bc - ld hl,usb_init_str_10 - call _print_string - pop bc -;source-doc/base-drv/usb-init.c:135: r = ch376_init(state); - push bc - push bc - inc sp - call _ch376_init - inc sp - ex de, hl - pop bc -;source-doc/base-drv/usb-init.c:136: state = r & 255; - ld b, e -;source-doc/base-drv/usb-init.c:130: for (uint8_t i = 0; i < loop_counter; i++) { - inc c - jr l__chnative_init_00109 -l__chnative_init_00111: -;source-doc/base-drv/usb-init.c:138: } - inc sp - pop ix - ret -usb_init_str_2: - DEFB 0x0d - DEFB 0x0a - DEFM "CH376: *$" - DEFB 0x00 -usb_init_str_3: - DEFB 0x08 - DEFM "PRESENT (VER $" - DEFB 0x00 -usb_init_str_4: - DEFB 0x0d - DEFM "CH376: $" - DEFB 0x00 -usb_init_str_5: - DEFM "VERSION FAILURE" - DEFB 0x0d - DEFB 0x0a - DEFM "$" - DEFB 0x00 -usb_init_str_6: - DEFM "); $" - DEFB 0x00 -usb_init_str_7: - DEFM "USB: *$" - DEFB 0x00 -usb_init_str_8: - DEFB 0x08 - DEFM "DISCONNECTED$" - DEFB 0x00 -usb_init_str_9: - DEFB 0x08 - DEFM "CONNECTED$" - DEFB 0x00 -usb_init_str_10: - DEFM ".$" - DEFB 0x00 -;source-doc/base-drv/usb-init.c:140: void chnative_init_force(void) { _chnative_init(true); } -; --------------------------------- -; Function chnative_init_force -; --------------------------------- -_chnative_init_force: - ld a,0x01 - push af - inc sp - call __chnative_init - inc sp - ret -;source-doc/base-drv/usb-init.c:142: void chnative_init(void) { _chnative_init(false); } -; --------------------------------- -; Function chnative_init -; --------------------------------- -_chnative_init: - xor a - push af - inc sp - call __chnative_init - inc sp - ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s deleted file mode 100644 index a8b35de0..00000000 --- a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s +++ /dev/null @@ -1,203 +0,0 @@ -; -; Generated from source-doc/base-drv/usb_init.c.asm -- not to be modify directly -; -; -;-------------------------------------------------------- -; File Created by SDCC : free open source ISO C Compiler -; Version 4.5.0 #15248 (Linux) -;-------------------------------------------------------- -; Processed by Z88DK -;-------------------------------------------------------- - - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- -;-------------------------------------------------------- -; Externals used -;-------------------------------------------------------- -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - -#IF 0 - -; .area _INITIALIZED removed by z88dk - - -#ENDIF - -;-------------------------------------------------------- -; absolute external ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- -;-------------------------------------------------------- -; code -;-------------------------------------------------------- -;source-doc/base-drv/usb_init.c:7: static usb_error usb_host_bus_reset(void) { -; --------------------------------- -; Function usb_host_bus_reset -; --------------------------------- -_usb_host_bus_reset: -;source-doc/base-drv/usb_init.c:8: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb_init.c:9: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb_init.c:11: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - ld l,0x07 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb_init.c:12: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/usb_init.c:14: ch_cmd_set_usb_mode(CH_MODE_HOST); - ld l,0x06 - call _ch_cmd_set_usb_mode -;source-doc/base-drv/usb_init.c:15: delay_20ms(); - call _delay_20ms -;source-doc/base-drv/ch376.h:110: #endif - ld l,0x0b - call _ch_command -;source-doc/base-drv/ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0xdf - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/base-drv/usb_init.c:19: return USB_ERR_OK; - ld l,0x00 -;source-doc/base-drv/usb_init.c:20: } - ret -;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) __z88dk_fastcall { -; --------------------------------- -; Function usb_init -; --------------------------------- -_usb_init: -;source-doc/base-drv/usb_init.c:27: USB_MODULE_LEDS = 0x03; - ld a,0x03 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:29: if (state == 0) { - ld a, l - or a - jr NZ,l_usb_init_00104 -;source-doc/base-drv/usb_init.c:30: ch_cmd_reset_all(); - call _ch_cmd_reset_all -;source-doc/base-drv/usb_init.c:31: delay_medium(); - call _delay_medium -;source-doc/base-drv/usb_init.c:33: if (!ch_probe()) { - call _ch_probe - ld a, l -;source-doc/base-drv/usb_init.c:34: USB_MODULE_LEDS = 0x00; - or a - jr NZ,l_usb_init_00102 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:35: return 0xFF00; - ld hl,0xff00 - jp l_usb_init_00113 -l_usb_init_00102: -;source-doc/base-drv/usb_init.c:37: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:38: return 1; - ld hl,0x0001 - jr l_usb_init_00113 -l_usb_init_00104: -;source-doc/base-drv/usb_init.c:41: if (state == 1) { - ld a, l - dec a - jr NZ,l_usb_init_00106 -;source-doc/base-drv/usb_init.c:42: r = ch_cmd_get_ic_version(); - call _ch_cmd_get_ic_version -;source-doc/base-drv/usb_init.c:44: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:45: return (uint16_t)r << 8 | 2; - xor a - ld h, l - ld l,0x02 - jr l_usb_init_00113 -l_usb_init_00106: -;source-doc/base-drv/usb_init.c:48: if (state == 2) { - ld a, l - sub 0x02 - jr NZ,l_usb_init_00159 - ld a,0x01 - jr l_usb_init_00160 -l_usb_init_00159: - xor a -l_usb_init_00160: - ld c,a - or a - jr Z,l_usb_init_00110 -;source-doc/base-drv/usb_init.c:49: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb_init.c:51: r = ch_very_short_wait_int_and_get_(); - call _ch_very_short_wait_int_and_get - ld a, l -;source-doc/base-drv/usb_init.c:53: if (r != USB_INT_CONNECT) { - sub 0x81 - jr Z,l_usb_init_00108 -;source-doc/base-drv/usb_init.c:54: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:55: return 2; - ld hl,0x0002 - jr l_usb_init_00113 -l_usb_init_00108: -;source-doc/base-drv/usb_init.c:58: return 3; - ld hl,0x0003 - jr l_usb_init_00113 -l_usb_init_00110: -;source-doc/base-drv/usb_init.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); - ld b,0x32 - ld hl,_x - jr l_usb_init_00163 -l_usb_init_00162: - ld (hl),0x00 - inc hl -l_usb_init_00163: - ld (hl),0x00 - inc hl - djnz l_usb_init_00162 -;source-doc/base-drv/usb_init.c:62: if (state != 2) { - bit 0, c - jr NZ,l_usb_init_00112 -;source-doc/base-drv/usb_init.c:63: usb_host_bus_reset(); - call _usb_host_bus_reset -;source-doc/base-drv/usb_init.c:64: delay_medium(); - call _delay_medium -l_usb_init_00112: -;source-doc/base-drv/usb_init.c:66: enumerate_all_devices(); - call _enumerate_all_devices -;source-doc/base-drv/usb_init.c:67: USB_MODULE_LEDS = 0x00; - ld a,0x00 - ld bc,_USB_MODULE_LEDS - out (c), a -;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | 4; - call _count_of_devices - ld h, a - xor a - ld l,0x04 -l_usb_init_00113: -;source-doc/base-drv/usb_init.c:69: } - ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 6c8e49a5..4fdc511a 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -48,44 +48,44 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/usb_state.c:13: uint8_t count_of_devices(void) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:17: uint8_t count_of_devices(void) __sdcccall(1) { ; --------------------------------- ; Function count_of_devices ; --------------------------------- _count_of_devices: -;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:18: const device_config *p_config = first_device_config(p); +;source-doc/base-drv/usb_state.c:18: _usb_state *const p = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:22: const device_config *p_config = first_device_config(p); ld hl,_x call _first_device_config -;source-doc/base-drv/usb_state.c:19: while (p_config) { +;source-doc/base-drv/usb_state.c:23: while (p_config) { ld c,0x00 l_count_of_devices_00104: ld a, d or e jr Z,l_count_of_devices_00106 -;source-doc/base-drv/usb_state.c:20: const uint8_t type = p_config->type; +;source-doc/base-drv/usb_state.c:24: const uint8_t type = p_config->type; ld l, e ld h, d ld a, (hl) and 0x0f -;source-doc/base-drv/usb_state.c:22: if (type != USB_IS_HUB && type) +;source-doc/base-drv/usb_state.c:26: if (type != USB_IS_HUB && type) cp 0x0f jr Z,l_count_of_devices_00102 or a jr Z,l_count_of_devices_00102 -;source-doc/base-drv/usb_state.c:23: count++; +;source-doc/base-drv/usb_state.c:27: count++; inc c l_count_of_devices_00102: -;source-doc/base-drv/usb_state.c:26: p_config = next_device_config(p, p_config); +;source-doc/base-drv/usb_state.c:30: p_config = next_device_config(p, p_config); push bc ld hl,_x call _next_device_config pop bc jr l_count_of_devices_00104 l_count_of_devices_00106: -;source-doc/base-drv/usb_state.c:29: return count; +;source-doc/base-drv/usb_state.c:33: return count; ld a, c -;source-doc/base-drv/usb_state.c:30: } +;source-doc/base-drv/usb_state.c:34: } ret _device_config_sizes: DEFB +0x00 @@ -95,41 +95,41 @@ _device_config_sizes: DEFB +0x06 DEFB 0x00 DEFB 0x00 -;source-doc/base-drv/usb_state.c:33: device_config *find_first_free(void) { +;source-doc/base-drv/usb_state.c:37: device_config *find_first_free(void) { ; --------------------------------- ; Function find_first_free ; --------------------------------- _find_first_free: -;source-doc/base-drv/usb_state.c:34: _usb_state *const boot_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:37: device_config *p = first_device_config(boot_state); +;source-doc/base-drv/usb_state.c:38: _usb_state *const boot_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:41: device_config *p = first_device_config(boot_state); ld hl,_x call _first_device_config -;source-doc/base-drv/usb_state.c:38: while (p) { +;source-doc/base-drv/usb_state.c:42: while (p) { l_find_first_free_00103: ld a, d or e jr Z,l_find_first_free_00105 -;source-doc/base-drv/usb_state.c:39: if (p->type == 0) +;source-doc/base-drv/usb_state.c:43: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_find_first_free_00102 -;source-doc/base-drv/usb_state.c:40: return p; +;source-doc/base-drv/usb_state.c:44: return p; ex de, hl jr l_find_first_free_00106 l_find_first_free_00102: -;source-doc/base-drv/usb_state.c:42: p = next_device_config(boot_state, p); +;source-doc/base-drv/usb_state.c:46: p = next_device_config(boot_state, p); ld hl,_x call _next_device_config jr l_find_first_free_00103 l_find_first_free_00105: -;source-doc/base-drv/usb_state.c:45: return NULL; +;source-doc/base-drv/usb_state.c:49: return NULL; ld hl,0x0000 l_find_first_free_00106: -;source-doc/base-drv/usb_state.c:46: } +;source-doc/base-drv/usb_state.c:50: } ret -;source-doc/base-drv/usb_state.c:48: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } +;source-doc/base-drv/usb_state.c:52: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; } ; --------------------------------- ; Function first_device_config ; --------------------------------- @@ -138,24 +138,24 @@ _first_device_config: inc de inc de ret -;source-doc/base-drv/usb_state.c:50: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:54: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) { ; --------------------------------- ; Function next_device_config ; --------------------------------- _next_device_config: ld c, l ld b, h -;source-doc/base-drv/usb_state.c:51: if (p->type == 0) +;source-doc/base-drv/usb_state.c:55: if (p->type == 0) ld l, e ld h, d ld a, (hl) and 0x0f jr NZ,l_next_device_config_00102 -;source-doc/base-drv/usb_state.c:52: return NULL; +;source-doc/base-drv/usb_state.c:56: return NULL; ld de,0x0000 jr l_next_device_config_00105 l_next_device_config_00102: -;source-doc/base-drv/usb_state.c:54: const uint8_t size = device_config_sizes[p->type]; +;source-doc/base-drv/usb_state.c:58: const uint8_t size = device_config_sizes[p->type]; ld l, e ld h, d ld a, (hl) @@ -166,14 +166,14 @@ l_next_device_config_00102: adc a, +((_device_config_sizes) / 256) ld h, a ld a, (hl) -;source-doc/base-drv/usb_state.c:61: const uint8_t *_p = (uint8_t *)p; -;source-doc/base-drv/usb_state.c:62: device_config *const result = (device_config *)(_p + size); +;source-doc/base-drv/usb_state.c:65: const uint8_t *_p = (uint8_t *)p; +;source-doc/base-drv/usb_state.c:66: device_config *const result = (device_config *)(_p + size); add a, e ld e, a ld a,0x00 adc a, d ld d, a -;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end) +;source-doc/base-drv/usb_state.c:68: if (result >= (device_config *)&usb_state->device_configs_end) ld hl,0x0062 add hl, bc ld a, e @@ -181,20 +181,20 @@ l_next_device_config_00102: ld a, d sbc a, h ret C -;source-doc/base-drv/usb_state.c:65: return NULL; +;source-doc/base-drv/usb_state.c:69: return NULL; ld de,0x0000 -;source-doc/base-drv/usb_state.c:67: return result; +;source-doc/base-drv/usb_state.c:71: return result; l_next_device_config_00105: -;source-doc/base-drv/usb_state.c:68: } +;source-doc/base-drv/usb_state.c:72: } ret -;source-doc/base-drv/usb_state.c:71: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:75: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { ; --------------------------------- ; Function get_usb_device_config ; --------------------------------- _get_usb_device_config: ld c, a -;source-doc/base-drv/usb_state.c:72: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:76: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:80: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _first_device_config @@ -204,29 +204,58 @@ l_get_usb_device_config_00107: ld a, d or e jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/usb_state.c:77: if (p->type != USB_NOT_SUPPORTED) { +;source-doc/base-drv/usb_state.c:81: if (p->type != USB_NOT_SUPPORTED) { ld l, e ld h, d ld a, (hl) and 0x0f jr Z,l_get_usb_device_config_00108 -;source-doc/base-drv/usb_state.c:78: if (counter == device_index) +;source-doc/base-drv/usb_state.c:82: if (counter == device_index) ld a, c sub b -;source-doc/base-drv/usb_state.c:79: return p; +;source-doc/base-drv/usb_state.c:83: return p; jr Z,l_get_usb_device_config_00109 -;source-doc/base-drv/usb_state.c:80: counter++; +;source-doc/base-drv/usb_state.c:84: counter++; inc b l_get_usb_device_config_00108: -;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:80: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _next_device_config pop bc jr l_get_usb_device_config_00107 l_get_usb_device_config_00105: -;source-doc/base-drv/usb_state.c:84: return NULL; // is not a usb device +;source-doc/base-drv/usb_state.c:88: return NULL; // is not a usb device ld de,0x0000 l_get_usb_device_config_00109: -;source-doc/base-drv/usb_state.c:85: } +;source-doc/base-drv/usb_state.c:89: } + ret +;source-doc/base-drv/usb_state.c:91: usb_device_type get_usb_device_type(const uint8_t dev_index) { +; --------------------------------- +; Function get_usb_device_type +; --------------------------------- +_get_usb_device_type: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/usb_state.c:92: const device_config *dev = get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + ld l, e +;source-doc/base-drv/usb_state.c:94: if (dev == NULL) + ld a,d + ld h,a + or e + jr NZ,l_get_usb_device_type_00102 +;source-doc/base-drv/usb_state.c:95: return -1; + ld l,0xff + jr l_get_usb_device_type_00103 +l_get_usb_device_type_00102: +;source-doc/base-drv/usb_state.c:97: return dev->type; + ld a, (hl) + and 0x0f + ld l, a +l_get_usb_device_type_00103: +;source-doc/base-drv/usb_state.c:98: } + pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 1925a521..af3a439c 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -2,3 +2,4 @@ #include "ch376-native/keyboard/class_hid.c.s" #include "ch376-native/keyboard/class_hid_keyboard.c.s" #include "ch376-native/keyboard/kyb-init.c.s" +#include "ch376-native/keyboard/kyb_driver.c.s" diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 24eb9429..05982773 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -33,26 +33,6 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk -_keyboard_config: - DEFS 2 -_buffer: - DEFS 16 -_write_index: - DEFS 1 -_read_index: - DEFS 1 -_alt_write_index: - DEFS 1 -_alt_read_index: - DEFS 1 -_reports: - DEFS 64 -_queued_report: - DEFS 2 -_report: - DEFS 8 -_previous: - DEFS 8 #ENDIF @@ -68,80 +48,66 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:27: +;source-doc/keyboard/kyb-init.c:6: uint8_t keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- _keyboard_init: -;source-doc/keyboard/kyb-init.c:28: uint8_t keyboard_init(void) __sdcccall(1) { - ld c,0x01 -;source-doc/keyboard/kyb-init.c:29: uint8_t index = 1; - ld hl,0x0000 - ld (_keyboard_config),hl -;source-doc/keyboard/kyb-init.c:31: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/keyboard/kyb-init.c:7: uint8_t index = 1; +;source-doc/keyboard/kyb-init.c:9: do { ld b,0x01 -l_keyboard_init_00105: -;source-doc/keyboard/kyb-init.c:32: do { + ld (ix-1),b +l_keyboard_init_00103: +;source-doc/keyboard/kyb-init.c:10: usb_device_type t = get_usb_device_type(index); push bc - ld a, b - call _get_usb_device_config - ex de, hl + push bc + inc sp + call _get_usb_device_type + inc sp + ld a, l pop bc - ld (_keyboard_config), hl -;source-doc/keyboard/kyb-init.c:34: - ld hl,(_keyboard_config) - ld a,h - or l - jr Z,l_keyboard_init_00107 -;source-doc/keyboard/kyb-init.c:37: - ld hl, (_keyboard_config) - ld a, (hl) - and 0x0f -;source-doc/keyboard/kyb-init.c:39: +;source-doc/keyboard/kyb-init.c:12: if (t == USB_IS_KEYBOARD) { sub 0x04 - jr NZ,l_keyboard_init_00106 -;source-doc/keyboard/kyb-init.c:40: if (t == USB_IS_KEYBOARD) { - push bc + jr NZ,l_keyboard_init_00104 +;source-doc/keyboard/kyb-init.c:13: print_string("\r\nUSB: KEYBOARD @ $"); ld hl,kyb_init_str_0 call _print_string - pop bc -;source-doc/keyboard/kyb-init.c:41: print_string("\r\nUSB: KEYBOARD @ $"); +;source-doc/keyboard/kyb-init.c:14: print_uint16(index); + ld l,(ix-1) ld h,0x00 - ld l, c call _print_uint16 -;source-doc/keyboard/kyb-init.c:42: print_uint16(index); +;source-doc/keyboard/kyb-init.c:15: print_string(" $"); ld hl,kyb_init_str_1 call _print_string -;source-doc/keyboard/kyb-init.c:44: - ld a,0x01 +;source-doc/keyboard/kyb-init.c:17: usb_kyb_init(index); + ld a,(ix-1) push af inc sp - ld hl, (_keyboard_config) - call _hid_set_protocol -;source-doc/keyboard/kyb-init.c:45: hid_set_protocol(keyboard_config, 1); - ld a,0x80 - push af + call _usb_kyb_init inc sp - ld hl, (_keyboard_config) - call _hid_set_idle -;source-doc/keyboard/kyb-init.c:46: hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb-init.c:18: return 1; ld a,0x01 - jr l_keyboard_init_00108 -l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:48: } + jr l_keyboard_init_00106 +l_keyboard_init_00104: +;source-doc/keyboard/kyb-init.c:20: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc b - ld a,b - ld c,b + ld (ix-1),b + ld a, b sub 0x07 - jr NZ,l_keyboard_init_00105 -l_keyboard_init_00107: -;source-doc/keyboard/kyb-init.c:50: + jr NZ,l_keyboard_init_00103 +;source-doc/keyboard/kyb-init.c:22: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:51: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:23: return 0; xor a -l_keyboard_init_00108: -;source-doc/keyboard/kyb-init.c:52: return 0; +l_keyboard_init_00106: +;source-doc/keyboard/kyb-init.c:24: } + inc sp + pop ix ret kyb_init_str_0: DEFB 0x0d @@ -156,470 +122,3 @@ kyb_init_str_2: DEFB 0x0a DEFM "USB: KEYBOARD: NOT FOUND$" DEFB 0x00 -;source-doc/keyboard/kyb-init.c:54: -; --------------------------------- -; Function report_diff -; --------------------------------- -_report_diff: -;source-doc/keyboard/kyb-init.c:55: static uint8_t report_diff() __sdcccall(1) { - ld de,_report+0 -;source-doc/keyboard/kyb-init.c:56: uint8_t *a = (uint8_t *)&report; -;source-doc/keyboard/kyb-init.c:59: uint8_t i = sizeof(report); - ld b,0x08 - ld hl,_previous -l_report_diff_00103: -;source-doc/keyboard/kyb-init.c:60: do { - ld a, (de) - inc de - ld c, (hl) - inc hl - sub c - jr Z,l_report_diff_00104 -;source-doc/keyboard/kyb-init.c:61: if (*a++ != *b++) - ld a,0x01 - jr l_report_diff_00106 -l_report_diff_00104: -;source-doc/keyboard/kyb-init.c:62: return true; - djnz l_report_diff_00103 -;source-doc/keyboard/kyb-init.c:64: - xor a -l_report_diff_00106: -;source-doc/keyboard/kyb-init.c:65: return false; - ret -;source-doc/keyboard/kyb-init.c:67: -; --------------------------------- -; Function report_put -; --------------------------------- -_report_put: -;source-doc/keyboard/kyb-init.c:68: static void report_put() { - ld a, (_alt_write_index) - inc a - and 0x07 - ld c, a -;source-doc/keyboard/kyb-init.c:70: - ld a,(_alt_read_index) - sub c - ret Z -;source-doc/keyboard/kyb-init.c:71: if (next_write_index != alt_read_index) { // Check if buffer is not full - ld de,_reports+0 - ld hl, (_alt_write_index) - ld h,0x00 - add hl, hl - add hl, hl - add hl, hl - add hl, de - ex de, hl - push bc - ld bc,0x0008 - ld hl,_report - ldir - pop bc -;source-doc/keyboard/kyb-init.c:72: reports[alt_write_index] = report; - ld hl,_alt_write_index - ld (hl), c -;source-doc/keyboard/kyb-init.c:74: } - ret -;source-doc/keyboard/kyb-init.c:76: -; --------------------------------- -; Function keyboard_buf_put -; --------------------------------- -_keyboard_buf_put: - ld c, a -;source-doc/keyboard/kyb-init.c:77: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { - ld b,0x00 - ld hl,+(_report + 2) - add hl, bc -;source-doc/keyboard/kyb-init.c:78: const uint8_t key_code = report.keyCode[indx]; - ld a,(hl) - ld c,a - cp 0x80 - jr NC,l_keyboard_buf_put_00111 - or a -;source-doc/keyboard/kyb-init.c:79: if (key_code >= 0x80 || key_code == 0) - jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb-init.c:83: uint8_t i = 6; -;source-doc/keyboard/kyb-init.c:84: uint8_t *a = previous.keyCode; - ld b,0x06 - ld hl,+(_previous + 2) -l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb-init.c:85: do { - ld a, (hl) - inc hl - sub c -;source-doc/keyboard/kyb-init.c:86: if (*a++ == key_code) - ret Z -;source-doc/keyboard/kyb-init.c:87: return; - djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb-init.c:89: - ld a, (_write_index) - inc a - and 0x07 - ld b, a -;source-doc/keyboard/kyb-init.c:90: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - ld a,(_read_index) - sub b - ret Z -;source-doc/keyboard/kyb-init.c:91: if (next_write_index != read_index) { // Check if buffer is not full - ld de,_buffer+0 - ld hl, (_write_index) - ld h,0x00 - add hl, hl - add hl, de - ex de, hl - ld hl,(_report) - xor a - xor a - ld a, c - ld (de), a - inc de - ld a, l - ld (de), a -;source-doc/keyboard/kyb-init.c:92: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; - ld hl,_write_index - ld (hl), b -l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb-init.c:94: } - ret -;source-doc/keyboard/kyb-init.c:96: -; --------------------------------- -; Function keyboard_buf_size -; --------------------------------- -_keyboard_buf_size: -;source-doc/keyboard/kyb-init.c:100: - ld a,(_alt_write_index) - ld hl,_alt_read_index - sub (hl) - jr C,l_keyboard_buf_size_00102 -;source-doc/keyboard/kyb-init.c:101: if (alt_write_index >= alt_read_index) - ld a,(_alt_write_index) - ld hl,_alt_read_index - sub (hl) - ld d, a - jr l_keyboard_buf_size_00103 -l_keyboard_buf_size_00102: -;source-doc/keyboard/kyb-init.c:103: else - ld hl, (_alt_read_index) - ld a,0x08 - sub l - ld hl, (_alt_write_index) - add a, l - ld d, a -l_keyboard_buf_size_00103: -;source-doc/keyboard/kyb-init.c:105: - ld a, d - or a - jr Z,l_keyboard_buf_size_00105 -;source-doc/keyboard/kyb-init.c:106: if (alt_size != 0) - ld a, (_alt_read_index) - inc a - and 0x07 - ld (_alt_read_index),a -l_keyboard_buf_size_00105: -;source-doc/keyboard/kyb-init.c:108: - ld a,(_write_index) - ld hl,_read_index - sub (hl) - jr C,l_keyboard_buf_size_00107 -;source-doc/keyboard/kyb-init.c:109: if (write_index >= read_index) - ld a,(_write_index) - ld hl,_read_index - sub (hl) - ld e, a - jr l_keyboard_buf_size_00108 -l_keyboard_buf_size_00107: -;source-doc/keyboard/kyb-init.c:111: else - ld hl, (_read_index) - ld a,0x08 - sub l - ld hl, (_write_index) - add a, l - ld e, a -l_keyboard_buf_size_00108: -;source-doc/keyboard/kyb-init.c:113: - xor a - xor a - ex de, hl -;source-doc/keyboard/kyb-init.c:114: return (uint16_t)alt_size << 8 | (uint16_t)size; - ret -;source-doc/keyboard/kyb-init.c:116: -; --------------------------------- -; Function keyboard_buf_get_next -; --------------------------------- -_keyboard_buf_get_next: - push ix - ld ix,0 - add ix,sp - push af - push af -;source-doc/keyboard/kyb-init.c:117: uint32_t keyboard_buf_get_next() { - ld a,(_write_index) - ld hl,_read_index - sub (hl) - jr NZ,l_keyboard_buf_get_next_00102 -;source-doc/keyboard/kyb-init.c:118: if (write_index == read_index) // Check if buffer is empty - ld hl,0xff00 - ld e, l - ld d, l - jr l_keyboard_buf_get_next_00103 -l_keyboard_buf_get_next_00102: -;source-doc/keyboard/kyb-init.c:120: - ld bc,_buffer+0 - ld hl, (_read_index) - ld h,0x00 - add hl, hl - add hl, bc - ld c, (hl) - inc hl - ld b, (hl) -;source-doc/keyboard/kyb-init.c:121: const uint8_t modifier_key = buffer[read_index] >> 8; -;source-doc/keyboard/kyb-init.c:122: const uint8_t key_code = buffer[read_index] & 255; - ld a, (_read_index) - inc a - and 0x07 - ld (_read_index),a -;source-doc/keyboard/kyb-init.c:129: - push bc - ld l, c - ld a, b - call _scancode_to_char - ld e, a - pop bc -;source-doc/keyboard/kyb-init.c:131: /* D = modifier, e-> char, H = 0, L=>code */ - xor a - ld (ix-1),b - xor a - ld (ix-4),a - ld (ix-3),a - ld (ix-2),a - xor a - ld d,(ix-1) - ld (ix-4),c - xor a - ld (ix-3),a - ld (ix-2),a - ld (ix-1),a - pop hl - push hl -l_keyboard_buf_get_next_00103: -;source-doc/keyboard/kyb-init.c:132: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; - ld sp, ix - pop ix - ret -;source-doc/keyboard/kyb-init.c:134: -; --------------------------------- -; Function keyboard_buf_flush -; --------------------------------- -_keyboard_buf_flush: -;source-doc/keyboard/kyb-init.c:135: void keyboard_buf_flush() { - xor a - ld (_alt_read_index),a - ld (_alt_write_index),a - xor a - ld (_read_index),a - ld (_write_index),a -;source-doc/keyboard/kyb-init.c:138: uint8_t i = sizeof(previous); - ld de,_previous+0 -;source-doc/keyboard/kyb-init.c:139: uint8_t *a = (uint8_t *)previous; -;source-doc/keyboard/kyb-init.c:140: uint8_t *b = (uint8_t *)report; - ld b,0x08 - ld hl,_report -l_keyboard_buf_flush_00101: -;source-doc/keyboard/kyb-init.c:141: do { - xor a - ld (de), a - inc de -;source-doc/keyboard/kyb-init.c:142: *a++ = 0; - ld (hl),0x00 - inc hl -;source-doc/keyboard/kyb-init.c:143: *b++ = 0; - djnz l_keyboard_buf_flush_00101 -;source-doc/keyboard/kyb-init.c:144: } while (--i != 0); - ret -;source-doc/keyboard/kyb-init.c:146: -; --------------------------------- -; Function keyboard_tick -; --------------------------------- -_keyboard_tick: -;source-doc/keyboard/kyb-init.c:147: void keyboard_tick(void) { - ld hl,_in_critical_usb_section - ld a, (hl) - or a -;source-doc/keyboard/kyb-init.c:148: if (is_in_critical_section()) - jr NZ,l_keyboard_tick_00112 -;././source-doc/base-drv//ch376.h:110: #endif - ld l,0x0b - call _ch_command -;././source-doc/base-drv//ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0x1f - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/keyboard/kyb-init.c:151: ch_configure_nak_retry_disable(); - ld bc,_report+0 - ld hl, (_keyboard_config) - ld a,0x08 - push af - inc sp - push bc - push hl - call _usbdev_dat_in_trnsfer_0 - pop af - pop af - inc sp - ld a, l - ld (_result), a -;././source-doc/base-drv//ch376.h:110: #endif - ld l,0x0b - call _ch_command -;././source-doc/base-drv//ch376.h:111: - ld a,0x25 - ld bc,_CH376_DATA_PORT - out (c), a -;././source-doc/base-drv//ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) - ld a,0xdf - ld bc,_CH376_DATA_PORT - out (c), a -;source-doc/keyboard/kyb-init.c:153: ch_configure_nak_retry_3s(); - ld hl,_result - ld a, (hl) - or a - jr NZ,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:154: if (result == 0) { - call _report_diff - or a - jr Z,l_keyboard_tick_00112 -;source-doc/keyboard/kyb-init.c:155: if (report_diff()) { - call _report_put -;source-doc/keyboard/kyb-init.c:157: uint8_t i = 6; - ld b,0x06 -l_keyboard_tick_00103: -;source-doc/keyboard/kyb-init.c:158: do { - ld a, b - dec a - push bc - call _keyboard_buf_put - pop bc -;source-doc/keyboard/kyb-init.c:159: keyboard_buf_put(i - 1); - djnz l_keyboard_tick_00103 -;source-doc/keyboard/kyb-init.c:160: } while (--i != 0); - ld de,_previous - ld bc,0x0008 - ld hl,_report - ldir -l_keyboard_tick_00112: -;source-doc/keyboard/kyb-init.c:163: } - ret -_keyboard_config: - DEFW +0x0000 -_buffer: - DEFW +0x0000 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 -_write_index: - DEFB +0x00 -_read_index: - DEFB +0x00 -_alt_write_index: - DEFB +0x00 -_alt_read_index: - DEFB +0x00 -_reports: - DEFB +0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 -_queued_report: - DEFW +0x0000 -_report: - DEFB +0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 -_previous: - DEFB +0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s new file mode 100644 index 00000000..0ede7fe4 --- /dev/null +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -0,0 +1,583 @@ +; +; Generated from source-doc/keyboard/kyb_driver.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_keyboard_config: + DEFS 2 +_buffer: + DEFS 16 +_write_index: + DEFS 1 +_read_index: + DEFS 1 +_alt_write_index: + DEFS 1 +_alt_read_index: + DEFS 1 +_reports: + DEFS 64 +_queued_report: + DEFS 2 +_report: + DEFS 8 +_previous: + DEFS 8 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/keyboard/kyb_driver.c:26: +; --------------------------------- +; Function report_diff +; --------------------------------- +_report_diff: +;source-doc/keyboard/kyb_driver.c:27: static uint8_t report_diff() __sdcccall(1) { + ld de,_report+0 +;source-doc/keyboard/kyb_driver.c:28: uint8_t *a = (uint8_t *)&report; +;source-doc/keyboard/kyb_driver.c:31: uint8_t i = sizeof(report); + ld b,0x08 + ld hl,_previous +l_report_diff_00103: +;source-doc/keyboard/kyb_driver.c:32: do { + ld a, (de) + inc de + ld c, (hl) + inc hl + sub c + jr Z,l_report_diff_00104 +;source-doc/keyboard/kyb_driver.c:33: if (*a++ != *b++) + ld a,0x01 + jr l_report_diff_00106 +l_report_diff_00104: +;source-doc/keyboard/kyb_driver.c:34: return true; + djnz l_report_diff_00103 +;source-doc/keyboard/kyb_driver.c:36: + xor a +l_report_diff_00106: +;source-doc/keyboard/kyb_driver.c:37: return false; + ret +;source-doc/keyboard/kyb_driver.c:39: +; --------------------------------- +; Function report_put +; --------------------------------- +_report_put: +;source-doc/keyboard/kyb_driver.c:40: static void report_put() { + ld a, (_alt_write_index) + inc a + and 0x07 + ld c, a +;source-doc/keyboard/kyb_driver.c:42: + ld a,(_alt_read_index) + sub c + ret Z +;source-doc/keyboard/kyb_driver.c:43: if (next_write_index != alt_read_index) { // Check if buffer is not full + ld de,_reports+0 + ld hl, (_alt_write_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + add hl, de + ex de, hl + push bc + ld bc,0x0008 + ld hl,_report + ldir + pop bc +;source-doc/keyboard/kyb_driver.c:44: reports[alt_write_index] = report; + ld hl,_alt_write_index + ld (hl), c +;source-doc/keyboard/kyb_driver.c:46: } + ret +;source-doc/keyboard/kyb_driver.c:48: +; --------------------------------- +; Function keyboard_buf_put +; --------------------------------- +_keyboard_buf_put: + ld c, a +;source-doc/keyboard/kyb_driver.c:49: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { + ld b,0x00 + ld hl,+(_report + 2) + add hl, bc +;source-doc/keyboard/kyb_driver.c:50: const uint8_t key_code = report.keyCode[indx]; + ld a,(hl) + ld c,a + cp 0x80 + jr NC,l_keyboard_buf_put_00111 + or a +;source-doc/keyboard/kyb_driver.c:51: if (key_code >= 0x80 || key_code == 0) + jr Z,l_keyboard_buf_put_00111 +;source-doc/keyboard/kyb_driver.c:55: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:56: uint8_t *a = previous.keyCode; + ld b,0x06 + ld hl,+(_previous + 2) +l_keyboard_buf_put_00106: +;source-doc/keyboard/kyb_driver.c:57: do { + ld a, (hl) + inc hl + sub c +;source-doc/keyboard/kyb_driver.c:58: if (*a++ == key_code) + ret Z +;source-doc/keyboard/kyb_driver.c:59: return; + djnz l_keyboard_buf_put_00106 +;source-doc/keyboard/kyb_driver.c:61: + ld a, (_write_index) + inc a + and 0x07 + ld b, a +;source-doc/keyboard/kyb_driver.c:62: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld a,(_read_index) + sub b + ret Z +;source-doc/keyboard/kyb_driver.c:63: if (next_write_index != read_index) { // Check if buffer is not full + ld de,_buffer+0 + ld hl, (_write_index) + ld h,0x00 + add hl, hl + add hl, de + ex de, hl + ld hl,(_report) + xor a + xor a + ld a, c + ld (de), a + inc de + ld a, l + ld (de), a +;source-doc/keyboard/kyb_driver.c:64: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + ld hl,_write_index + ld (hl), b +l_keyboard_buf_put_00111: +;source-doc/keyboard/kyb_driver.c:66: } + ret +;source-doc/keyboard/kyb_driver.c:68: +; --------------------------------- +; Function usb_kyb_buf_size +; --------------------------------- +_usb_kyb_buf_size: +;source-doc/keyboard/kyb_driver.c:72: + ld a,(_alt_write_index) + ld hl,_alt_read_index + sub (hl) + jr C,l_usb_kyb_buf_size_00102 +;source-doc/keyboard/kyb_driver.c:73: if (alt_write_index >= alt_read_index) + ld a,(_alt_write_index) + ld hl,_alt_read_index + sub (hl) + ld d, a + jr l_usb_kyb_buf_size_00103 +l_usb_kyb_buf_size_00102: +;source-doc/keyboard/kyb_driver.c:75: else + ld hl, (_alt_read_index) + ld a,0x08 + sub l + ld hl, (_alt_write_index) + add a, l + ld d, a +l_usb_kyb_buf_size_00103: +;source-doc/keyboard/kyb_driver.c:77: + ld a, d + or a + jr Z,l_usb_kyb_buf_size_00105 +;source-doc/keyboard/kyb_driver.c:78: if (alt_size != 0) + ld a, (_alt_read_index) + inc a + and 0x07 + ld (_alt_read_index),a +l_usb_kyb_buf_size_00105: +;source-doc/keyboard/kyb_driver.c:80: + ld a,(_write_index) + ld hl,_read_index + sub (hl) + jr C,l_usb_kyb_buf_size_00107 +;source-doc/keyboard/kyb_driver.c:81: if (write_index >= read_index) + ld a,(_write_index) + ld hl,_read_index + sub (hl) + ld e, a + jr l_usb_kyb_buf_size_00108 +l_usb_kyb_buf_size_00107: +;source-doc/keyboard/kyb_driver.c:83: else + ld hl, (_read_index) + ld a,0x08 + sub l + ld hl, (_write_index) + add a, l + ld e, a +l_usb_kyb_buf_size_00108: +;source-doc/keyboard/kyb_driver.c:85: + xor a + xor a + ex de, hl +;source-doc/keyboard/kyb_driver.c:86: return (uint16_t)alt_size << 8 | (uint16_t)size; + ret +;source-doc/keyboard/kyb_driver.c:88: +; --------------------------------- +; Function usb_kyb_buf_get_next +; --------------------------------- +_usb_kyb_buf_get_next: + push ix + ld ix,0 + add ix,sp + push af + push af +;source-doc/keyboard/kyb_driver.c:89: uint32_t usb_kyb_buf_get_next() { + ld a,(_write_index) + ld hl,_read_index + sub (hl) + jr NZ,l_usb_kyb_buf_get_next_00102 +;source-doc/keyboard/kyb_driver.c:90: if (write_index == read_index) // Check if buffer is empty + ld hl,0xff00 + ld e, l + ld d, l + jr l_usb_kyb_buf_get_next_00103 +l_usb_kyb_buf_get_next_00102: +;source-doc/keyboard/kyb_driver.c:92: + ld bc,_buffer+0 + ld hl, (_read_index) + ld h,0x00 + add hl, hl + add hl, bc + ld c, (hl) + inc hl + ld b, (hl) +;source-doc/keyboard/kyb_driver.c:93: const uint8_t modifier_key = buffer[read_index] >> 8; +;source-doc/keyboard/kyb_driver.c:94: const uint8_t key_code = buffer[read_index] & 255; + ld a, (_read_index) + inc a + and 0x07 + ld (_read_index),a +;source-doc/keyboard/kyb_driver.c:101: + push bc + ld l, c + ld a, b + call _scancode_to_char + ld e, a + pop bc +;source-doc/keyboard/kyb_driver.c:103: /* D = modifier, e-> char, H = 0, L=>code */ + xor a + ld (ix-1),b + xor a + ld (ix-4),a + ld (ix-3),a + ld (ix-2),a + xor a + ld d,(ix-1) + ld (ix-4),c + xor a + ld (ix-3),a + ld (ix-2),a + ld (ix-1),a + pop hl + push hl +l_usb_kyb_buf_get_next_00103: +;source-doc/keyboard/kyb_driver.c:104: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; + ld sp, ix + pop ix + ret +;source-doc/keyboard/kyb_driver.c:106: +; --------------------------------- +; Function usb_kyb_flush +; --------------------------------- +_usb_kyb_flush: +;source-doc/keyboard/kyb_driver.c:107: void usb_kyb_flush() { + xor a + ld (_alt_read_index),a + ld (_alt_write_index),a + xor a + ld (_read_index),a + ld (_write_index),a +;source-doc/keyboard/kyb_driver.c:110: uint8_t i = sizeof(previous); + ld de,_previous+0 +;source-doc/keyboard/kyb_driver.c:111: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb_driver.c:112: uint8_t *b = (uint8_t *)report; + ld b,0x08 + ld hl,_report +l_usb_kyb_flush_00101: +;source-doc/keyboard/kyb_driver.c:113: do { + xor a + ld (de), a + inc de +;source-doc/keyboard/kyb_driver.c:114: *a++ = 0; + ld (hl),0x00 + inc hl +;source-doc/keyboard/kyb_driver.c:115: *b++ = 0; + djnz l_usb_kyb_flush_00101 +;source-doc/keyboard/kyb_driver.c:116: } while (--i != 0); + ret +;source-doc/keyboard/kyb_driver.c:118: +; --------------------------------- +; Function usb_kyb_tick +; --------------------------------- +_usb_kyb_tick: +;source-doc/keyboard/kyb_driver.c:119: void usb_kyb_tick(void) { + ld hl,_in_critical_usb_section + ld a, (hl) + or a +;source-doc/keyboard/kyb_driver.c:120: if (is_in_critical_section()) + jr NZ,l_usb_kyb_tick_00112 +;././source-doc/base-drv//ch376.h:111: #endif + ld l,0x0b + call _ch_command +;././source-doc/base-drv//ch376.h:112: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;././source-doc/base-drv//ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0x1f + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/keyboard/kyb_driver.c:123: ch_configure_nak_retry_disable(); + ld bc,_report+0 + ld hl, (_keyboard_config) + ld a,0x08 + push af + inc sp + push bc + push hl + call _usbdev_dat_in_trnsfer_0 + pop af + pop af + inc sp + ld a, l + ld (_result), a +;././source-doc/base-drv//ch376.h:111: #endif + ld l,0x0b + call _ch_command +;././source-doc/base-drv//ch376.h:112: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;././source-doc/base-drv//ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/keyboard/kyb_driver.c:125: ch_configure_nak_retry_3s(); + ld hl,_result + ld a, (hl) + or a + jr NZ,l_usb_kyb_tick_00112 +;source-doc/keyboard/kyb_driver.c:126: if (result == 0) { + call _report_diff + or a + jr Z,l_usb_kyb_tick_00112 +;source-doc/keyboard/kyb_driver.c:127: if (report_diff()) { + call _report_put +;source-doc/keyboard/kyb_driver.c:129: uint8_t i = 6; + ld b,0x06 +l_usb_kyb_tick_00103: +;source-doc/keyboard/kyb_driver.c:130: do { + ld a, b + dec a + push bc + call _keyboard_buf_put + pop bc +;source-doc/keyboard/kyb_driver.c:131: keyboard_buf_put(i - 1); + djnz l_usb_kyb_tick_00103 +;source-doc/keyboard/kyb_driver.c:132: } while (--i != 0); + ld de,_previous + ld bc,0x0008 + ld hl,_report + ldir +l_usb_kyb_tick_00112: +;source-doc/keyboard/kyb_driver.c:135: } + ret +;source-doc/keyboard/kyb_driver.c:137: +; --------------------------------- +; Function usb_kyb_init +; --------------------------------- +_usb_kyb_init: + push ix + ld ix,0 + add ix,sp +;source-doc/keyboard/kyb_driver.c:139: uint8_t result; + ld a,(ix+4) + call _get_usb_device_config + ex de, hl + ld (_keyboard_config), hl +;source-doc/keyboard/kyb_driver.c:141: + ld hl,_keyboard_config + 1 + ld a, (hl) + dec hl + or (hl) + jr NZ,l_usb_kyb_init_00102 +;source-doc/keyboard/kyb_driver.c:142: if (keyboard_config == NULL) + ld l,0x0f + jr l_usb_kyb_init_00106 +l_usb_kyb_init_00102: +;source-doc/keyboard/kyb_driver.c:144: + ld a,0x01 + push af + inc sp + ld hl, (_keyboard_config) + call _hid_set_protocol + ld l, a + or a + jr NZ,l_usb_kyb_init_00105 +;source-doc/keyboard/kyb_driver.c:145: CHECK(hid_set_protocol(keyboard_config, 1)); + ld a,0x80 + push af + inc sp + ld hl, (_keyboard_config) + call _hid_set_idle + ld l, a +;source-doc/keyboard/kyb_driver.c:147: +;source-doc/keyboard/kyb_driver.c:148: done: +l_usb_kyb_init_00105: +l_usb_kyb_init_00106: +;source-doc/keyboard/kyb_driver.c:149: return result; + pop ix + ret +_keyboard_config: + DEFW +0x0000 +_buffer: + DEFW +0x0000 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_write_index: + DEFB +0x00 +_read_index: + DEFB +0x00 +_alt_write_index: + DEFB +0x00 +_alt_read_index: + DEFB +0x00 +_reports: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_queued_report: + DEFW +0x0000 +_report: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 +_previous: + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv.s b/Source/HBIOS/ch376-native/scsi-drv.s index d43a4464..ed91cc53 100644 --- a/Source/HBIOS/ch376-native/scsi-drv.s +++ b/Source/HBIOS/ch376-native/scsi-drv.s @@ -1,3 +1,4 @@ ; Generated File -- not to be modify directly #include "ch376-native/scsi-drv/class_scsi.c.s" #include "ch376-native/scsi-drv/scsi-init.c.s" +#include "ch376-native/scsi-drv/scsi_driver.c.s" diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 02c7bc98..3c142a8a 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -39,12 +39,8 @@ _next_tag: DEFS 2 _csw: DEFS 13 -_scsi_packet_read_capacity: - DEFS 12 _scsi_packet_request_sense: DEFS 12 -_cbw: - DEFS 27 #ENDIF @@ -295,69 +291,7 @@ l_do_scsi_cmd_00120: ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { -; --------------------------------- -; Function scsi_read_capacity -; --------------------------------- -_scsi_read_capacity: - push ix - ld ix,0 - add ix,sp - ld hl, -27 - add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:55: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw = scsi_command_block_wrapper; - push de - ld hl,2 - add hl, sp - ex de, hl - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir - pop de -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.read_capacity = scsi_packet_read_capacity; - push de - ld hl,17 - add hl, sp - ex de, hl - ld bc,0x000c - ld hl,_scsi_packet_read_capacity - ldir - pop de -;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.bCBWLUN = 0; - ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:62: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); - ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:63: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - ld (ix-19),0x08 - xor a - ld (ix-18),a - ld (ix-17),a - ld (ix-16),a -;source-doc/scsi-drv/class_scsi.c:65: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); - ld c,(ix+6) - ld b,(ix+7) - xor a - push af - inc sp - push bc - ld hl,3 - add hl, sp - push hl - push de - call _do_scsi_cmd - pop af - pop af - pop af - inc sp -;source-doc/scsi-drv/class_scsi.c:66: } - ld sp, ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:84: static usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:52: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -368,7 +302,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:54: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -377,7 +311,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:87: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:55: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -389,11 +323,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:89: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:90: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:91: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -404,7 +338,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:93: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:61: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -415,11 +349,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:94: } +;source-doc/scsi-drv/class_scsi.c:62: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:98: static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:66: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -430,7 +364,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:68: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -439,7 +373,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -447,11 +381,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:103: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:104: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:105: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -462,7 +396,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:107: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:75: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -474,338 +408,10 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:108: } +;source-doc/scsi-drv/class_scsi.c:76: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:110: usb_error scsi_sense_init(const uint16_t dev_index) { -; --------------------------------- -; Function scsi_sense_init -; --------------------------------- -_scsi_sense_init: - push ix - ld ix,0 - add ix,sp - ld hl, -18 - add hl, sp - ld sp, hl -;source-doc/scsi-drv/class_scsi.c:111: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/scsi-drv/class_scsi.c:116: critical_begin(); - push de - call _critical_begin - pop de -;source-doc/scsi-drv/class_scsi.c:117: while ((result = scsi_test(dev)) && --counter > 0) - ld c,0x03 -l_scsi_sense_init_00102: - push bc - push de - push de - call _scsi_test - pop af - ld a, l - pop de - pop bc - ld (_result),a - or a - jr Z,l_scsi_sense_init_00104 - dec c - jr Z,l_scsi_sense_init_00104 -;source-doc/scsi-drv/class_scsi.c:118: scsi_request_sense(dev, &response); - ld hl,0 - add hl, sp - push bc - push de - push hl - push de - call _scsi_request_sense - pop af - pop af - pop de - pop bc - jr l_scsi_sense_init_00102 -l_scsi_sense_init_00104: -;source-doc/scsi-drv/class_scsi.c:119: critical_end(); - call _critical_end -;source-doc/scsi-drv/class_scsi.c:121: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:122: } - ld sp, ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:126: usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function scsi_read -; --------------------------------- -_scsi_read: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/scsi-drv/class_scsi.c:127: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config - pop bc - push de -;source-doc/scsi-drv/class_scsi.c:129: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - ld de,_cbw - ld l, e - ld h, d - ld b,0x0e - jr l_scsi_read_00113 -l_scsi_read_00112: - ld (hl),0x00 - inc hl -l_scsi_read_00113: - ld (hl),0x00 - inc hl - djnz l_scsi_read_00112 -;source-doc/scsi-drv/class_scsi.c:130: cbw.cbw = scsi_command_block_wrapper; - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:132: cbw.cbw.bCBWLUN = 0; - ld hl,_cbw + 13 - ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:133: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - ld hl,_cbw + 14 - ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:134: cbw.cbw.dCBWDataTransferLength = 512; - ld hl,0x0200 - ld (_cbw + 8),hl - ld h, l - ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:136: cbw.scsi_cmd.operation_code = 0x28; // read operation - ld hl,_cbw + 15 - ld (hl),0x28 -;source-doc/scsi-drv/class_scsi.c:137: cbw.scsi_cmd.transfer_len[1] = 1; - ld hl,_cbw + 23 - ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:138: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix-2) - ld h,(ix-1) - ld bc,0x000c - add hl,bc - ld c,l - ld b,h - inc hl - inc hl - inc hl - ld a, (hl) - ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:139: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:140: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - ld l,c - ld h,b - inc hl - inc hl - ld a,(hl) - ld ((_cbw + 18)),a - dec hl - ld e, (hl) - ld hl, +(_cbw + 19) - ld (hl), e -;source-doc/scsi-drv/class_scsi.c:141: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld a, (bc) - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:143: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); - ld e,(ix+6) - ld d,(ix+7) - push bc - xor a - push af - inc sp - push de - ld hl,_cbw - push hl - ld l,(ix-2) - ld h,(ix-1) - push hl - call _do_scsi_cmd - pop af - pop af - pop af - inc sp - pop bc - ld a, l - ld (_result), a -;source-doc/scsi-drv/class_scsi.c:145: if (result == USB_ERR_OK) - ld a,(_result) - or a - jr NZ,l_scsi_read_00102 -;source-doc/scsi-drv/class_scsi.c:146: dev->current_lba++; - ld l, c - ld h, b - ld e, (hl) - inc hl - ld d, (hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - inc e - jr NZ,l_scsi_read_00114 - inc d - jr NZ,l_scsi_read_00114 - inc hl -l_scsi_read_00114: - ld a, e - ld (bc), a - inc bc - ld a, d - ld (bc), a - inc bc - ld a, l - ld (bc), a - inc bc - ld a, h - ld (bc), a -l_scsi_read_00102: -;source-doc/scsi-drv/class_scsi.c:147: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:148: } - ld sp, ix - pop ix - ret -;source-doc/scsi-drv/class_scsi.c:150: usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function scsi_write -; --------------------------------- -_scsi_write: - push ix - ld ix,0 - add ix,sp - push af -;source-doc/scsi-drv/class_scsi.c:151: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config - pop bc - push de -;source-doc/scsi-drv/class_scsi.c:153: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - ld de,_cbw - ld l, e - ld h, d - ld b,0x0e - jr l_scsi_write_00113 -l_scsi_write_00112: - ld (hl),0x00 - inc hl -l_scsi_write_00113: - ld (hl),0x00 - inc hl - djnz l_scsi_write_00112 -;source-doc/scsi-drv/class_scsi.c:154: cbw.cbw = scsi_command_block_wrapper; - ld bc,0x000f - ld hl,_scsi_command_block_wrapper - ldir -;source-doc/scsi-drv/class_scsi.c:156: cbw.cbw.bCBWLUN = 0; - ld hl,_cbw + 13 - ld (hl),0x00 -;source-doc/scsi-drv/class_scsi.c:157: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - ld hl,_cbw + 14 - ld (hl),0x0c -;source-doc/scsi-drv/class_scsi.c:158: cbw.cbw.dCBWDataTransferLength = 512; - ld hl,0x0200 - ld (_cbw + 8),hl - ld h, l - ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/class_scsi.c:160: cbw.scsi_cmd.operation_code = 0x2A; // write operation - ld hl,_cbw + 15 - ld (hl),0x2a -;source-doc/scsi-drv/class_scsi.c:161: cbw.scsi_cmd.transfer_len[1] = 1; - ld hl,_cbw + 23 - ld (hl),0x01 -;source-doc/scsi-drv/class_scsi.c:162: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix-2) - ld h,(ix-1) - ld bc,0x000c - add hl,bc - ld c,l - ld b,h - inc hl - inc hl - inc hl - ld a, (hl) - ld ((_cbw + 17)),a -;source-doc/scsi-drv/class_scsi.c:163: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/class_scsi.c:164: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - ld l,c - ld h,b - inc hl - inc hl - ld a,(hl) - ld ((_cbw + 18)),a - dec hl - ld e, (hl) - ld hl, +(_cbw + 19) - ld (hl), e -;source-doc/scsi-drv/class_scsi.c:165: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld a, (bc) - inc hl - ld (hl), a -;source-doc/scsi-drv/class_scsi.c:167: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); - ld e,(ix+6) - ld d,(ix+7) - push bc - ld a,0x01 - push af - inc sp - push de - ld hl,_cbw - push hl - ld l,(ix-2) - ld h,(ix-1) - push hl - call _do_scsi_cmd - pop af - pop af - pop af - inc sp - pop bc - ld a, l - ld (_result), a -;source-doc/scsi-drv/class_scsi.c:169: if (result == USB_ERR_OK) - ld a,(_result) - or a - jr NZ,l_scsi_write_00102 -;source-doc/scsi-drv/class_scsi.c:170: dev->current_lba++; - ld l, c - ld h, b - ld e, (hl) - inc hl - ld d, (hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - inc e - jr NZ,l_scsi_write_00114 - inc d - jr NZ,l_scsi_write_00114 - inc hl -l_scsi_write_00114: - ld a, e - ld (bc), a - inc bc - ld a, d - ld (bc), a - inc bc - ld a, l - ld (bc), a - inc bc - ld a, h - ld (bc), a -l_scsi_write_00102: -;source-doc/scsi-drv/class_scsi.c:171: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:172: } - ld sp, ix - pop ix - ret _scsi_command_block_wrapper: DEFB +0x55 DEFB +0x53 @@ -833,19 +439,6 @@ _csw: DEFB 0x00 DEFB 0x00 DEFB +0x00 -_scsi_packet_read_capacity: - DEFB +0x25 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 _scsi_packet_request_sense: DEFB +0x03 DEFB +0x00 @@ -859,28 +452,3 @@ _scsi_packet_request_sense: DEFB +0x00 DEFB +0x00 DEFB +0x00 -_cbw: - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB +0x00,0x00, +0x00, +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 904c8ba8..884b2adc 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/scsi-init.c:14: void chscsi_init(void) { +;source-doc/scsi-drv/scsi-init.c:9: void chscsi_init(void) { ; --------------------------------- ; Function chscsi_init ; --------------------------------- @@ -58,88 +58,83 @@ _chscsi_init: add ix,sp push af dec sp -;source-doc/scsi-drv/scsi-init.c:16: do { +;source-doc/scsi-drv/scsi-init.c:11: do { ld (ix-1),0x01 -l_chscsi_init_00105: -;source-doc/scsi-drv/scsi-init.c:17: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +l_chscsi_init_00103: +;source-doc/scsi-drv/scsi-init.c:12: usb_device_type t = get_usb_device_type(index); ld a,(ix-1) - call _get_usb_device_config - ld l, e -;source-doc/scsi-drv/scsi-init.c:19: if (storage_device == NULL) - ld a,d - ld h,a - or e - jr Z,l_chscsi_init_00108 -;source-doc/scsi-drv/scsi-init.c:22: const usb_device_type t = storage_device->type; - ld a, (hl) - and 0x0f -;source-doc/scsi-drv/scsi-init.c:24: if (t == USB_IS_MASS_STORAGE) { + push af + inc sp + call _get_usb_device_type + inc sp + ld a, l +;source-doc/scsi-drv/scsi-init.c:14: if (t == USB_IS_MASS_STORAGE) { sub 0x02 - jr NZ,l_chscsi_init_00106 -;source-doc/scsi-drv/scsi-init.c:25: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen + jr NZ,l_chscsi_init_00104 +;source-doc/scsi-drv/scsi-init.c:15: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen call _find_storage_dev -;source-doc/scsi-drv/scsi-init.c:26: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; +;source-doc/scsi-drv/scsi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; ld c,l ld e,l ld d,0x00 - ld h, d - add hl, hl - ld a, l + ld a, e + ld b, d + add a, a + rl b add a, +((_hbios_usb_storage_devices) & 0xFF) ld (ix-3),a - ld a, h + ld a, b adc a, +((_hbios_usb_storage_devices) / 256) ld (ix-2),a pop hl push hl inc c ld (hl), c -;source-doc/scsi-drv/scsi-init.c:27: hbios_usb_storage_devices[dev_index].usb_device = index; +;source-doc/scsi-drv/scsi-init.c:18: hbios_usb_storage_devices[dev_index].usb_device = index; pop bc push bc inc bc ld a,(ix-1) ld (bc), a -;source-doc/scsi-drv/scsi-init.c:29: print_string("\r\nUSB: MASS STORAGE @ $"); +;source-doc/scsi-drv/scsi-init.c:20: print_string("\r\nUSB: MASS STORAGE @ $"); push de ld hl,scsi_init_str_0 call _print_string pop de -;source-doc/scsi-drv/scsi-init.c:30: print_uint16(index); +;source-doc/scsi-drv/scsi-init.c:21: print_uint16(index); ld l,(ix-1) ld h,0x00 push hl push de call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:31: print_string(":$"); +;source-doc/scsi-drv/scsi-init.c:22: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de pop hl -;source-doc/scsi-drv/scsi-init.c:32: print_uint16(dev_index + 1); +;source-doc/scsi-drv/scsi-init.c:23: print_uint16(dev_index + 1); inc de push hl ex de, hl call _print_uint16 -;source-doc/scsi-drv/scsi-init.c:33: print_string(" $"); +;source-doc/scsi-drv/scsi-init.c:24: print_string(" $"); ld hl,scsi_init_str_2 call _print_string -;source-doc/scsi-drv/scsi-init.c:34: scsi_sense_init(index); - call _scsi_sense_init +;source-doc/scsi-drv/scsi-init.c:25: usb_scsi_init(index); + call _usb_scsi_init pop af -;source-doc/scsi-drv/scsi-init.c:35: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); +;source-doc/scsi-drv/scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); pop de push de ld hl,_ch_scsi_fntbl call _dio_add_entry -l_chscsi_init_00106: -;source-doc/scsi-drv/scsi-init.c:38: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +l_chscsi_init_00104: +;source-doc/scsi-drv/scsi-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jr NZ,l_chscsi_init_00105 -l_chscsi_init_00108: -;source-doc/scsi-drv/scsi-init.c:39: } + jr NZ,l_chscsi_init_00103 +;source-doc/scsi-drv/scsi-init.c:30: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s new file mode 100644 index 00000000..cf87d6aa --- /dev/null +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s @@ -0,0 +1,482 @@ +; +; Generated from source-doc/scsi-drv/scsi_driver.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + +_scsi_packet_read_capacity: + DEFS 12 +_cbw: + DEFS 27 + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/scsi-drv/scsi_driver.c:8: usb_error usb_scsi_init(const uint16_t dev_index) { +; --------------------------------- +; Function usb_scsi_init +; --------------------------------- +_usb_scsi_init: + push ix + ld ix,0 + add ix,sp + ld hl, -18 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/scsi_driver.c:9: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/scsi-drv/scsi_driver.c:14: critical_begin(); + push de + call _critical_begin + pop de +;source-doc/scsi-drv/scsi_driver.c:15: while ((result = scsi_test(dev)) && --counter > 0) + ld c,0x03 +l_usb_scsi_init_00102: + push bc + push de + push de + call _scsi_test + pop af + ld a, l + pop de + pop bc + ld (_result),a + or a + jr Z,l_usb_scsi_init_00104 + dec c + jr Z,l_usb_scsi_init_00104 +;source-doc/scsi-drv/scsi_driver.c:16: scsi_request_sense(dev, &response); + ld hl,0 + add hl, sp + push bc + push de + push hl + push de + call _scsi_request_sense + pop af + pop af + pop de + pop bc + jr l_usb_scsi_init_00102 +l_usb_scsi_init_00104: +;source-doc/scsi-drv/scsi_driver.c:17: critical_end(); + call _critical_end +;source-doc/scsi-drv/scsi_driver.c:19: return result; + ld hl, (_result) +;source-doc/scsi-drv/scsi_driver.c:20: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/scsi_driver.c:24: usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { +; --------------------------------- +; Function usb_scsi_read_capacity +; --------------------------------- +_usb_scsi_read_capacity: + push ix + ld ix,0 + add ix,sp + ld hl, -27 + add hl, sp + ld sp, hl +;source-doc/scsi-drv/scsi_driver.c:25: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/scsi-drv/scsi_driver.c:28: cbw_scsi.cbw = scsi_command_block_wrapper; + push de + ld hl,2 + add hl, sp + ex de, hl + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir + pop de +;source-doc/scsi-drv/scsi_driver.c:29: cbw_scsi.read_capacity = scsi_packet_read_capacity; + push de + ld hl,17 + add hl, sp + ex de, hl + ld bc,0x000c + ld hl,_scsi_packet_read_capacity + ldir + pop de +;source-doc/scsi-drv/scsi_driver.c:31: cbw_scsi.cbw.bCBWLUN = 0; + ld (ix-14),0x00 +;source-doc/scsi-drv/scsi_driver.c:32: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); + ld (ix-13),0x0c +;source-doc/scsi-drv/scsi_driver.c:33: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + ld (ix-19),0x08 + xor a + ld (ix-18),a + ld (ix-17),a + ld (ix-16),a +;source-doc/scsi-drv/scsi_driver.c:35: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); + ld c,(ix+6) + ld b,(ix+7) + xor a + push af + inc sp + push bc + ld hl,3 + add hl, sp + push hl + push de + call _do_scsi_cmd + pop af + pop af + pop af + inc sp +;source-doc/scsi-drv/scsi_driver.c:36: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/scsi_driver.c:56: usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_scsi_read +; --------------------------------- +_usb_scsi_read: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/scsi_driver.c:57: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + pop bc + push de +;source-doc/scsi-drv/scsi_driver.c:59: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + ld de,_cbw + ld l, e + ld h, d + ld b,0x0e + jr l_usb_scsi_read_00113 +l_usb_scsi_read_00112: + ld (hl),0x00 + inc hl +l_usb_scsi_read_00113: + ld (hl),0x00 + inc hl + djnz l_usb_scsi_read_00112 +;source-doc/scsi-drv/scsi_driver.c:60: cbw.cbw = scsi_command_block_wrapper; + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/scsi_driver.c:62: cbw.cbw.bCBWLUN = 0; + ld hl,_cbw + 13 + ld (hl),0x00 +;source-doc/scsi-drv/scsi_driver.c:63: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + ld hl,_cbw + 14 + ld (hl),0x0c +;source-doc/scsi-drv/scsi_driver.c:64: cbw.cbw.dCBWDataTransferLength = 512; + ld hl,0x0200 + ld (_cbw + 8),hl + ld h, l + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/scsi_driver.c:66: cbw.scsi_cmd.operation_code = 0x28; // read operation + ld hl,_cbw + 15 + ld (hl),0x28 +;source-doc/scsi-drv/scsi_driver.c:67: cbw.scsi_cmd.transfer_len[1] = 1; + ld hl,_cbw + 23 + ld (hl),0x01 +;source-doc/scsi-drv/scsi_driver.c:68: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld l,(ix-2) + ld h,(ix-1) + ld bc,0x000c + add hl,bc + ld c,l + ld b,h + inc hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 17)),a +;source-doc/scsi-drv/scsi_driver.c:69: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/scsi_driver.c:70: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + ld l,c + ld h,b + inc hl + inc hl + ld a,(hl) + ld ((_cbw + 18)),a + dec hl + ld e, (hl) + ld hl, +(_cbw + 19) + ld (hl), e +;source-doc/scsi-drv/scsi_driver.c:71: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld a, (bc) + inc hl + ld (hl), a +;source-doc/scsi-drv/scsi_driver.c:73: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + ld e,(ix+6) + ld d,(ix+7) + push bc + xor a + push af + inc sp + push de + ld hl,_cbw + push hl + ld l,(ix-2) + ld h,(ix-1) + push hl + call _do_scsi_cmd + pop af + pop af + pop af + inc sp + pop bc + ld a, l + ld (_result), a +;source-doc/scsi-drv/scsi_driver.c:75: if (result == USB_ERR_OK) + ld a,(_result) + or a + jr NZ,l_usb_scsi_read_00102 +;source-doc/scsi-drv/scsi_driver.c:76: dev->current_lba++; + ld l, c + ld h, b + ld e, (hl) + inc hl + ld d, (hl) + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + inc e + jr NZ,l_usb_scsi_read_00114 + inc d + jr NZ,l_usb_scsi_read_00114 + inc hl +l_usb_scsi_read_00114: + ld a, e + ld (bc), a + inc bc + ld a, d + ld (bc), a + inc bc + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a +l_usb_scsi_read_00102: +;source-doc/scsi-drv/scsi_driver.c:77: return result; + ld hl, (_result) +;source-doc/scsi-drv/scsi_driver.c:78: } + ld sp, ix + pop ix + ret +;source-doc/scsi-drv/scsi_driver.c:80: usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_scsi_write +; --------------------------------- +_usb_scsi_write: + push ix + ld ix,0 + add ix,sp + push af +;source-doc/scsi-drv/scsi_driver.c:81: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config + pop bc + push de +;source-doc/scsi-drv/scsi_driver.c:83: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + ld de,_cbw + ld l, e + ld h, d + ld b,0x0e + jr l_usb_scsi_write_00113 +l_usb_scsi_write_00112: + ld (hl),0x00 + inc hl +l_usb_scsi_write_00113: + ld (hl),0x00 + inc hl + djnz l_usb_scsi_write_00112 +;source-doc/scsi-drv/scsi_driver.c:84: cbw.cbw = scsi_command_block_wrapper; + ld bc,0x000f + ld hl,_scsi_command_block_wrapper + ldir +;source-doc/scsi-drv/scsi_driver.c:86: cbw.cbw.bCBWLUN = 0; + ld hl,_cbw + 13 + ld (hl),0x00 +;source-doc/scsi-drv/scsi_driver.c:87: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + ld hl,_cbw + 14 + ld (hl),0x0c +;source-doc/scsi-drv/scsi_driver.c:88: cbw.cbw.dCBWDataTransferLength = 512; + ld hl,0x0200 + ld (_cbw + 8),hl + ld h, l + ld (_cbw + 8 + 2),hl +;source-doc/scsi-drv/scsi_driver.c:90: cbw.scsi_cmd.operation_code = 0x2A; // write operation + ld hl,_cbw + 15 + ld (hl),0x2a +;source-doc/scsi-drv/scsi_driver.c:91: cbw.scsi_cmd.transfer_len[1] = 1; + ld hl,_cbw + 23 + ld (hl),0x01 +;source-doc/scsi-drv/scsi_driver.c:92: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + ld l,(ix-2) + ld h,(ix-1) + ld bc,0x000c + add hl,bc + ld c,l + ld b,h + inc hl + inc hl + inc hl + ld a, (hl) + ld ((_cbw + 17)),a +;source-doc/scsi-drv/scsi_driver.c:93: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; +;source-doc/scsi-drv/scsi_driver.c:94: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + ld l,c + ld h,b + inc hl + inc hl + ld a,(hl) + ld ((_cbw + 18)),a + dec hl + ld e, (hl) + ld hl, +(_cbw + 19) + ld (hl), e +;source-doc/scsi-drv/scsi_driver.c:95: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld a, (bc) + inc hl + ld (hl), a +;source-doc/scsi-drv/scsi_driver.c:97: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + ld e,(ix+6) + ld d,(ix+7) + push bc + ld a,0x01 + push af + inc sp + push de + ld hl,_cbw + push hl + ld l,(ix-2) + ld h,(ix-1) + push hl + call _do_scsi_cmd + pop af + pop af + pop af + inc sp + pop bc + ld a, l + ld (_result), a +;source-doc/scsi-drv/scsi_driver.c:99: if (result == USB_ERR_OK) + ld a,(_result) + or a + jr NZ,l_usb_scsi_write_00102 +;source-doc/scsi-drv/scsi_driver.c:100: dev->current_lba++; + ld l, c + ld h, b + ld e, (hl) + inc hl + ld d, (hl) + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + inc e + jr NZ,l_usb_scsi_write_00114 + inc d + jr NZ,l_usb_scsi_write_00114 + inc hl +l_usb_scsi_write_00114: + ld a, e + ld (bc), a + inc bc + ld a, d + ld (bc), a + inc bc + ld a, l + ld (bc), a + inc bc + ld a, h + ld (bc), a +l_usb_scsi_write_00102: +;source-doc/scsi-drv/scsi_driver.c:101: return result; + ld hl, (_result) +;source-doc/scsi-drv/scsi_driver.c:102: } + ld sp, ix + pop ix + ret +_scsi_packet_read_capacity: + DEFB +0x25 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_cbw: + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00,0x00, +0x00, +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 + DEFB +0x00 + DEFB 0x00 + DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h index 5695c11e..381e84e1 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -48,6 +48,7 @@ typedef enum { USB_IS_UNKNOWN = 6, _USB_LAST_DEVICE_TYPE, USB_IS_HUB = 15 + } usb_device_type; // 4 bits only typedef enum { ENDPOINT_BULK_OUT = 0, ENDPOINT_BULK_IN = 1, ENDPOINT_INTERRUPT_IN = 2 } usb_endpoint_type; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c index 642695a1..2498751e 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c @@ -1,5 +1,5 @@ #include "print.h" -#include "usb_init.h" +#include "usb-base-drv.h" static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { uint16_t r = state; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index 6f349813..fb29c190 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -1,7 +1,74 @@ #include "usb-base-drv.h" -#include "usb_state.h" +#include "ch376.h" +#include "enumerate.h" +#include "work-area.h" +#include -uint8_t scsi_seek(const uint16_t dev_index, const uint32_t lba) { +static usb_error usb_host_bus_reset(void) { + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_configure_nak_retry_3s(); + + return USB_ERR_OK; +} + +#define ERASE_LINE "\x1B\x6C\r$" + +uint16_t usb_init(uint8_t state) __z88dk_fastcall { + uint8_t r; + + USB_MODULE_LEDS = 0x03; + + if (state == 0) { + ch_cmd_reset_all(); + delay_medium(); + + if (!ch_probe()) { + USB_MODULE_LEDS = 0x00; + return 0xFF00; + } + USB_MODULE_LEDS = 0x00; + return 1; + } + + if (state == 1) { + r = ch_cmd_get_ic_version(); + + USB_MODULE_LEDS = 0x00; + return (uint16_t)r << 8 | 2; + } + + if (state == 2) { + usb_host_bus_reset(); + + r = ch_very_short_wait_int_and_get_status(); + + if (r != USB_INT_CONNECT) { + USB_MODULE_LEDS = 0x00; + return 2; + } + + return 3; + } + + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + if (state != 2) { + usb_host_bus_reset(); + delay_medium(); + } + enumerate_all_devices(); + USB_MODULE_LEDS = 0x00; + return (uint16_t)count_of_devices() << 8 | 4; +} + +uint8_t usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); dev->current_lba = lba; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h index f5039fd2..249e894b 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -5,8 +5,10 @@ #include #include +extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; + // ufi_seek is an alias for scsi_seek -extern usb_error scsi_seek(const uint16_t dev_index, const uint32_t lba); +extern usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba); extern usb_error ufi_seek(const uint16_t dev_index, const uint32_t lba); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c deleted file mode 100644 index 3585cc28..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c +++ /dev/null @@ -1,69 +0,0 @@ -#include "usb_init.h" -#include "ch376.h" -#include "enumerate.h" -#include "work-area.h" -#include - -static usb_error usb_host_bus_reset(void) { - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_configure_nak_retry_3s(); - - return USB_ERR_OK; -} - -#define ERASE_LINE "\x1B\x6C\r$" - -uint16_t usb_init(uint8_t state) __z88dk_fastcall { - uint8_t r; - - USB_MODULE_LEDS = 0x03; - - if (state == 0) { - ch_cmd_reset_all(); - delay_medium(); - - if (!ch_probe()) { - USB_MODULE_LEDS = 0x00; - return 0xFF00; - } - USB_MODULE_LEDS = 0x00; - return 1; - } - - if (state == 1) { - r = ch_cmd_get_ic_version(); - - USB_MODULE_LEDS = 0x00; - return (uint16_t)r << 8 | 2; - } - - if (state == 2) { - usb_host_bus_reset(); - - r = ch_very_short_wait_int_and_get_status(); - - if (r != USB_INT_CONNECT) { - USB_MODULE_LEDS = 0x00; - return 2; - } - - return 3; - } - - memset(get_usb_work_area(), 0, sizeof(_usb_state)); - if (state != 2) { - usb_host_bus_reset(); - delay_medium(); - } - enumerate_all_devices(); - USB_MODULE_LEDS = 0x00; - return (uint16_t)count_of_devices() << 8 | 4; -} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h deleted file mode 100644 index ed6af87d..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __USB_INIT -#define __USB_INIT - -#include - -extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; - -#endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index ce6e460d..cb16cd19 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -1,6 +1,10 @@ #include "usb_state.h" +#include "ch376.h" #include "work-area.h" +extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1); +extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1); + const uint8_t device_config_sizes[_USB_LAST_DEVICE_TYPE] = { 0, /* USB_NOT_SUPPORTED = 0 */ sizeof(device_config_storage), /* USB_IS_FLOPPY = 1 */ @@ -83,3 +87,12 @@ device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { return NULL; // is not a usb device } + +usb_device_type get_usb_device_type(const uint8_t dev_index) { + const device_config *dev = get_usb_device_config(dev_index); + + if (dev == NULL) + return -1; + + return dev->type; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h index d5246a1b..a5205ee3 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h @@ -18,10 +18,9 @@ typedef struct __usb_state { } _usb_state; extern device_config *find_first_free(void); -extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1); -extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1); extern uint8_t count_of_devices(void) __sdcccall(1); - extern device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1); +extern usb_device_type get_usb_device_type(const uint8_t dev_index); + #endif diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index 5da58857..df623d4a 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -1,49 +1,20 @@ -#include "class_hid.h" -#include "class_hid_keyboard.h" -#include -#include +#include "kyb_driver.h" #include #include -#include #include -#define KEYBOARD_BUFFER_SIZE 8 -#define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef uint16_t modifier_and_code_t; - -static device_config_keyboard *keyboard_config = 0; - -static modifier_and_code_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; -static uint8_t write_index = 0; -static uint8_t read_index = 0; - -static uint8_t alt_write_index = 0; -static uint8_t alt_read_index = 0; -static keyboard_report_t reports[KEYBOARD_BUFFER_SIZE] = {{0}}; - -static keyboard_report_t *queued_report = NULL; -static keyboard_report_t report = {0}; -static keyboard_report_t previous = {0}; - uint8_t keyboard_init(void) __sdcccall(1) { - uint8_t index = 1; - keyboard_config = NULL; + uint8_t index = 1; do { - keyboard_config = (device_config_keyboard *)get_usb_device_config(index); - - if (keyboard_config == NULL) - break; - - const usb_device_type t = keyboard_config->type; + usb_device_type t = get_usb_device_type(index); if (t == USB_IS_KEYBOARD) { print_string("\r\nUSB: KEYBOARD @ $"); print_uint16(index); print_string(" $"); - hid_set_protocol(keyboard_config, 1); - hid_set_idle(keyboard_config, 0x80); + usb_kyb_init(index); return 1; } } while (++index != MAX_NUMBER_OF_DEVICES + 1); @@ -51,114 +22,3 @@ uint8_t keyboard_init(void) __sdcccall(1) { print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); return 0; } - -static uint8_t report_diff() __sdcccall(1) { - uint8_t *a = (uint8_t *)&report; - uint8_t *b = (uint8_t *)&previous; - - uint8_t i = sizeof(report); - do { - if (*a++ != *b++) - return true; - } while (--i != 0); - - return false; -} - -static void report_put() { - uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - - if (next_write_index != alt_read_index) { // Check if buffer is not full - reports[alt_write_index] = report; - alt_write_index = next_write_index; - } -} - -static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { - const uint8_t key_code = report.keyCode[indx]; - if (key_code >= 0x80 || key_code == 0) - return; // ignore ??? - - // if already reported, just skip it - uint8_t i = 6; - uint8_t *a = previous.keyCode; - do { - if (*a++ == key_code) - return; - } while (--i != 0); - - uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - if (next_write_index != read_index) { // Check if buffer is not full - buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; - write_index = next_write_index; - } -} - -uint16_t keyboard_buf_size() { - uint8_t size; - uint8_t alt_size; - - if (alt_write_index >= alt_read_index) - alt_size = alt_write_index - alt_read_index; - else - alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; - - if (alt_size != 0) - alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - - if (write_index >= read_index) - size = write_index - read_index; - else - size = KEYBOARD_BUFFER_SIZE - read_index + write_index; - - return (uint16_t)alt_size << 8 | (uint16_t)size; -} - -uint32_t keyboard_buf_get_next() { - if (write_index == read_index) // Check if buffer is empty - return 0x0000FF00; // H = -1, D, E, L = 0 - - const uint8_t modifier_key = buffer[read_index] >> 8; - const uint8_t key_code = buffer[read_index] & 255; - read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - - // D: Modifier keys - aka Keystate - // E: ASCII Code - // H: 0 - // L: KeyCode aka scan code - - const unsigned char c = scancode_to_char(modifier_key, key_code); - /* D = modifier, e-> char, H = 0, L=>code */ - return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; -} - -void keyboard_buf_flush() { - write_index = read_index = alt_write_index = alt_read_index = 0; - - uint8_t i = sizeof(previous); - uint8_t *a = (uint8_t *)previous; - uint8_t *b = (uint8_t *)report; - do { - *a++ = 0; - *b++ = 0; - } while (--i != 0); -} - -void keyboard_tick(void) { - if (is_in_critical_section()) - return; - - ch_configure_nak_retry_disable(); - result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); - ch_configure_nak_retry_3s(); - if (result == 0) { - if (report_diff()) { - report_put(); - uint8_t i = 6; - do { - keyboard_buf_put(i - 1); - } while (--i != 0); - previous = report; - } - } -} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c new file mode 100644 index 00000000..64ba8968 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -0,0 +1,150 @@ +#include "kyb_driver.h" +#include "class_hid.h" +#include "class_hid_keyboard.h" +#include +#include +#include +#include + +#define KEYBOARD_BUFFER_SIZE 8 +#define KEYBOARD_BUFFER_SIZE_MASK 7 +typedef uint16_t modifier_and_code_t; + +static device_config_keyboard *keyboard_config = 0; + +static modifier_and_code_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; +static uint8_t write_index = 0; +static uint8_t read_index = 0; + +static uint8_t alt_write_index = 0; +static uint8_t alt_read_index = 0; +static keyboard_report_t reports[KEYBOARD_BUFFER_SIZE] = {{0}}; + +static keyboard_report_t *queued_report = NULL; +static keyboard_report_t report = {0}; +static keyboard_report_t previous = {0}; + +static uint8_t report_diff() __sdcccall(1) { + uint8_t *a = (uint8_t *)&report; + uint8_t *b = (uint8_t *)&previous; + + uint8_t i = sizeof(report); + do { + if (*a++ != *b++) + return true; + } while (--i != 0); + + return false; +} + +static void report_put() { + uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + if (next_write_index != alt_read_index) { // Check if buffer is not full + reports[alt_write_index] = report; + alt_write_index = next_write_index; + } +} + +static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { + const uint8_t key_code = report.keyCode[indx]; + if (key_code >= 0x80 || key_code == 0) + return; // ignore ??? + + // if already reported, just skip it + uint8_t i = 6; + uint8_t *a = previous.keyCode; + do { + if (*a++ == key_code) + return; + } while (--i != 0); + + uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + if (next_write_index != read_index) { // Check if buffer is not full + buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + write_index = next_write_index; + } +} + +uint16_t usb_kyb_buf_size() { + uint8_t size; + uint8_t alt_size; + + if (alt_write_index >= alt_read_index) + alt_size = alt_write_index - alt_read_index; + else + alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; + + if (alt_size != 0) + alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + if (write_index >= read_index) + size = write_index - read_index; + else + size = KEYBOARD_BUFFER_SIZE - read_index + write_index; + + return (uint16_t)alt_size << 8 | (uint16_t)size; +} + +uint32_t usb_kyb_buf_get_next() { + if (write_index == read_index) // Check if buffer is empty + return 0x0000FF00; // H = -1, D, E, L = 0 + + const uint8_t modifier_key = buffer[read_index] >> 8; + const uint8_t key_code = buffer[read_index] & 255; + read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + + // D: Modifier keys - aka Keystate + // E: ASCII Code + // H: 0 + // L: KeyCode aka scan code + + const unsigned char c = scancode_to_char(modifier_key, key_code); + /* D = modifier, e-> char, H = 0, L=>code */ + return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +} + +void usb_kyb_flush() { + write_index = read_index = alt_write_index = alt_read_index = 0; + + uint8_t i = sizeof(previous); + uint8_t *a = (uint8_t *)previous; + uint8_t *b = (uint8_t *)report; + do { + *a++ = 0; + *b++ = 0; + } while (--i != 0); +} + +void usb_kyb_tick(void) { + if (is_in_critical_section()) + return; + + ch_configure_nak_retry_disable(); + result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); + ch_configure_nak_retry_3s(); + if (result == 0) { + if (report_diff()) { + report_put(); + uint8_t i = 6; + do { + keyboard_buf_put(i - 1); + } while (--i != 0); + previous = report; + } + } +} + +usb_error usb_kyb_init(const uint8_t dev_index) { + uint8_t result; + keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); + + if (keyboard_config == NULL) + return USB_ERR_OTHER; + + CHECK(hid_set_protocol(keyboard_config, 1)); + return hid_set_idle(keyboard_config, 0x80); + +done: + return result; +} diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h new file mode 100644 index 00000000..8d3b4f1f --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h @@ -0,0 +1,12 @@ +#ifndef __KYB_DRIVER__ +#define __KYB_DRIVER__ + +#include +#include + +extern usb_error usb_kyb_init(const uint8_t dev_index); +extern void usb_kyb_flush(); +extern uint32_t usb_kyb_buf_get_next(); +extern uint16_t usb_kyb_buf_size(); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index e5da0b94..de2a26ae 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -49,39 +49,7 @@ done: return result; } -_scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; - -usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - cbw_scsi_read_capacity cbw_scsi; - cbw_scsi.cbw = scsi_command_block_wrapper; - cbw_scsi.read_capacity = scsi_packet_read_capacity; - - cbw_scsi.cbw.bCBWLUN = 0; - cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); - cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); - - return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); -} - -// _scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; - -// usb_error scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result) { -// device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - -// cbw_scsi_inquiry cbw_scsi; -// cbw_scsi.cbw = scsi_command_block_wrapper; -// cbw_scsi.inquiry = scsi_packet_inquiry; - -// cbw_scsi.cbw.bCBWLUN = 0; -// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); -// cbw_scsi.cbw.dCBWDataTransferLength = 0x24; - -// return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); -// } - -static usb_error scsi_test(device_config_storage *const dev) { +usb_error scsi_test(device_config_storage *const dev) { cbw_scsi_test cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); @@ -95,7 +63,7 @@ static usb_error scsi_test(device_config_storage *const dev) { _scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}}; -static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { cbw_scsi_request_sense cbw_scsi; cbw_scsi.cbw = scsi_command_block_wrapper; cbw_scsi.request_sense = scsi_packet_request_sense; @@ -106,83 +74,3 @@ static usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); } - -usb_error scsi_sense_init(const uint16_t dev_index) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - scsi_sense_result response; - uint8_t counter = 3; - - critical_begin(); - while ((result = scsi_test(dev)) && --counter > 0) - scsi_request_sense(dev, &response); - critical_end(); - - return result; -} - -static cbw_scsi_read_write cbw = {{{0}}}; - -usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - cbw.cbw = scsi_command_block_wrapper; - - cbw.cbw.bCBWLUN = 0; - cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - cbw.cbw.dCBWDataTransferLength = 512; - - cbw.scsi_cmd.operation_code = 0x28; // read operation - cbw.scsi_cmd.transfer_len[1] = 1; - cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; - cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - cbw.scsi_cmd.lba[3] = dev->current_lba; - - result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); - - if (result == USB_ERR_OK) - dev->current_lba++; - return result; -} - -usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - memset(&cbw, 0, sizeof(cbw_scsi_read_write)); - cbw.cbw = scsi_command_block_wrapper; - - cbw.cbw.bCBWLUN = 0; - cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); - cbw.cbw.dCBWDataTransferLength = 512; - - cbw.scsi_cmd.operation_code = 0x2A; // write operation - cbw.scsi_cmd.transfer_len[1] = 1; - cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; - cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - cbw.scsi_cmd.lba[3] = dev->current_lba; - - result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); - - if (result == USB_ERR_OK) - dev->current_lba++; - return result; -} - -// usb_error scsi_eject(device_config_storage *const dev) { -// cbw_scsi_eject cbw_scsi; -// cbw_scsi.cbw = scsi_command_block_wrapper; - -// memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); - -// cbw_scsi.eject.operation_code = 0x1B; -// cbw_scsi.eject.loej = 1; - -// cbw_scsi.cbw.bCBWLUN = 0; -// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); -// cbw_scsi.cbw.dCBWDataTransferLength = 0; - -// return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); -// } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h index 989e5bec..2c5d6fe9 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h @@ -182,14 +182,15 @@ typedef struct { _scsi_packet_read_write scsi_cmd; } cbw_scsi_read_write; -extern usb_error scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *result); -extern usb_error scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result); -extern usb_error scsi_sense_init(const uint16_t dev_index); -// extern usb_error scsi_request_sense(const uint16_t dev_index, scsi_sense_result *const sens_result); -// extern usb_error scsi_eject(device_config_storage *const dev); -extern usb_error scsi_read(const uint16_t dev_index, uint8_t *const buffer); -extern usb_error scsi_write(const uint16_t dev_index, uint8_t *const buffer); - -extern usb_error scsi_seek(const uint16_t dev_index, const uint32_t lba); +extern _scsi_command_block_wrapper scsi_command_block_wrapper; + +extern usb_error do_scsi_cmd(device_config_storage *const dev, + _scsi_command_block_wrapper *const cbw, + void *const send_receive_buffer, + const bool send); + +extern usb_error scsi_test(device_config_storage *const dev); + +extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index e4928d0f..cbde4ae9 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -1,28 +1,19 @@ -#include "class_scsi.h" #include "hbios-driver-storage.h" -#include -#include +#include "scsi_driver.h" #include #include #include -#include -#include -#include extern const uint16_t const ch_scsi_fntbl[]; void chscsi_init(void) { uint8_t index = 1; do { - device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - - if (storage_device == NULL) - break; - - const usb_device_type t = storage_device->type; + usb_device_type t = get_usb_device_type(index); if (t == USB_IS_MASS_STORAGE) { - const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen + const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; hbios_usb_storage_devices[dev_index].usb_device = index; @@ -31,7 +22,7 @@ void chscsi_init(void) { print_string(":$"); print_uint16(dev_index + 1); print_string(" $"); - scsi_sense_init(index); + usb_scsi_init(index); dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c new file mode 100644 index 00000000..fd24aa02 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c @@ -0,0 +1,118 @@ +#include "scsi_driver.h" +#include "class_scsi.h" +#include +#include +#include +#include + +usb_error usb_scsi_init(const uint16_t dev_index) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + scsi_sense_result response; + uint8_t counter = 3; + + critical_begin(); + while ((result = scsi_test(dev)) && --counter > 0) + scsi_request_sense(dev, &response); + critical_end(); + + return result; +} + +_scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; + +usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + cbw_scsi_read_capacity cbw_scsi; + cbw_scsi.cbw = scsi_command_block_wrapper; + cbw_scsi.read_capacity = scsi_packet_read_capacity; + + cbw_scsi.cbw.bCBWLUN = 0; + cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); + cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); + + return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +} + +// _scsi_packet_inquiry scsi_packet_inquiry = {0x12, 0, 0, 0, 0x24, 0, {0, 0, 0, 0, 0, 0}}; + +// usb_error usb_scsi_inquiry(const uint16_t dev_index, scsi_inquiry_result *inq_result) { +// device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + +// cbw_scsi_inquiry cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; +// cbw_scsi.inquiry = scsi_packet_inquiry; + +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry); +// cbw_scsi.cbw.dCBWDataTransferLength = 0x24; + +// return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false); +// } + +static cbw_scsi_read_write cbw = {{{0}}}; + +usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + cbw.cbw = scsi_command_block_wrapper; + + cbw.cbw.bCBWLUN = 0; + cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + cbw.cbw.dCBWDataTransferLength = 512; + + cbw.scsi_cmd.operation_code = 0x28; // read operation + cbw.scsi_cmd.transfer_len[1] = 1; + cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + cbw.scsi_cmd.lba[3] = dev->current_lba; + + result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + + if (result == USB_ERR_OK) + dev->current_lba++; + return result; +} + +usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + memset(&cbw, 0, sizeof(cbw_scsi_read_write)); + cbw.cbw = scsi_command_block_wrapper; + + cbw.cbw.bCBWLUN = 0; + cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); + cbw.cbw.dCBWDataTransferLength = 512; + + cbw.scsi_cmd.operation_code = 0x2A; // write operation + cbw.scsi_cmd.transfer_len[1] = 1; + cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + cbw.scsi_cmd.lba[3] = dev->current_lba; + + result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + + if (result == USB_ERR_OK) + dev->current_lba++; + return result; +} + +// usb_error scsi_eject(device_config_storage *const dev) { +// cbw_scsi_eject cbw_scsi; +// cbw_scsi.cbw = scsi_command_block_wrapper; + +// memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject)); + +// cbw_scsi.eject.operation_code = 0x1B; +// cbw_scsi.eject.loej = 1; + +// cbw_scsi.cbw.bCBWLUN = 0; +// cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject); +// cbw_scsi.cbw.dCBWDataTransferLength = 0; + +// return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +// } diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h new file mode 100644 index 00000000..92e57912 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h @@ -0,0 +1,14 @@ +#ifndef __SCSI_DRIVER__ +#define __SCSI_DRIVER__ + +#include "class_scsi.h" +#include +#include + +extern usb_error usb_scsi_init(const uint16_t dev_index); +extern usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *result); +extern usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba); + +#endif diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 3a1af894..7fd37bd2 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -1,11 +1,7 @@ -#include "class_ufi.h" #include "hbios-driver-storage.h" -#include #include #include -#include -#include -#include +#include extern const uint16_t const ch_ufi_fntbl[]; @@ -13,15 +9,11 @@ void chufi_init(void) { uint8_t index = 1; do { - device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); - - if (storage_device == NULL) - break; - - const usb_device_type t = storage_device->type; + usb_device_type t = get_usb_device_type(index); if (t == USB_IS_FLOPPY) { - const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; hbios_usb_storage_devices[dev_index].usb_device = index; @@ -35,84 +27,3 @@ void chufi_init(void) { } while (++index != MAX_NUMBER_OF_DEVICES + 1); } - -uint32_t chufi_get_cap(const uint16_t dev_index) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - ufi_format_capacities_response response; - memset(&response, 0, sizeof(ufi_format_capacities_response)); - - wait_for_device_ready(dev, 25); - - // not sure if we need to do this to 'clear' some state - ufi_inquiry_response inquiry; - ufi_inquiry(dev, &inquiry); - - wait_for_device_ready(dev, 15); - - const usb_error result = ufi_read_frmt_caps(dev, &response); - if (result != USB_ERR_OK) - return 0; - - return convert_from_msb_first(response.descriptors[0].number_of_blocks); -} - -uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - if (wait_for_device_ready((device_config *)dev, 20) != 0) - return -1; // Not READY! - - usb_error result; - ufi_interrupt_status sense_codes; - - memset(&sense_codes, 0, sizeof(sense_codes)); - - if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) - return -1; // general error - - ufi_request_sense_response response; - memset(&response, 0, sizeof(response)); - - if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) - return -1; // error - - const uint8_t asc = response.asc; - const uint8_t ascq = response.ascq; - const uint8_t sense_key = response.sense_key; - - if (sense_key != 0) - return -1; - - return USB_ERR_OK; -} - -usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { - device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - - if (wait_for_device_ready((device_config *)dev, 20) != 0) - return -1; // Not READY! - - ufi_interrupt_status sense_codes; - - memset(&sense_codes, 0, sizeof(sense_codes)); - if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { - return -1; - } - - ufi_request_sense_response response; - memset(&response, 0, sizeof(response)); - - if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { - return -1; - } - - const uint8_t asc = response.asc; - const uint8_t ascq = response.ascq; - const uint8_t sense_key = response.sense_key; - - if (sense_key != 0) - return -1; - - return USB_ERR_OK; -} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c new file mode 100644 index 00000000..b1b12ce5 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c @@ -0,0 +1,85 @@ +#include "ufi_driver.h" +#include "class_ufi.h" +#include +#include + +uint32_t usb_ufi_get_cap(const uint16_t dev_index) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + ufi_format_capacities_response response; + memset(&response, 0, sizeof(ufi_format_capacities_response)); + + wait_for_device_ready(dev, 25); + + // not sure if we need to do this to 'clear' some state + ufi_inquiry_response inquiry; + ufi_inquiry(dev, &inquiry); + + wait_for_device_ready(dev, 15); + + const usb_error result = ufi_read_frmt_caps(dev, &response); + if (result != USB_ERR_OK) + return 0; + + return convert_from_msb_first(response.descriptors[0].number_of_blocks); +} + +uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + usb_error result; + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + + if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) + return -1; // general error + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) + return -1; // error + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} + +usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer) { + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + + if (wait_for_device_ready((device_config *)dev, 20) != 0) + return -1; // Not READY! + + ufi_interrupt_status sense_codes; + + memset(&sense_codes, 0, sizeof(sense_codes)); + if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + return -1; + } + + ufi_request_sense_response response; + memset(&response, 0, sizeof(response)); + + if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + return -1; + } + + const uint8_t asc = response.asc; + const uint8_t ascq = response.ascq; + const uint8_t sense_key = response.sense_key; + + if (sense_key != 0) + return -1; + + return USB_ERR_OK; +} diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h new file mode 100644 index 00000000..45fee9cf --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h @@ -0,0 +1,11 @@ +#ifndef __UFI_DRIVER__ +#define __UFI_DRIVER__ + +#include +#include + +extern uint32_t usb_ufi_get_cap(const uint16_t dev_index); +extern uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer); + +#endif diff --git a/Source/HBIOS/ch376-native/ufi-drv.s b/Source/HBIOS/ch376-native/ufi-drv.s index d900a14a..fb337a02 100644 --- a/Source/HBIOS/ch376-native/ufi-drv.s +++ b/Source/HBIOS/ch376-native/ufi-drv.s @@ -1,4 +1,5 @@ ; Generated File -- not to be modify directly #include "ch376-native/ufi-drv/class_ufi.c.s" #include "ch376-native/ufi-drv/ufi-init.c.s" +#include "ch376-native/ufi-drv/ufi_driver.c.s" #include "ch376-native/ufi-drv/usb_cbi.c.s" diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 78a119d8..6a75bf9a 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/ufi-drv/ufi-init.c:12: void chufi_init(void) { +;source-doc/ufi-drv/ufi-init.c:8: void chufi_init(void) { ; --------------------------------- ; Function chufi_init ; --------------------------------- @@ -58,80 +58,77 @@ _chufi_init: add ix,sp push af dec sp -;source-doc/ufi-drv/ufi-init.c:15: do { +;source-doc/ufi-drv/ufi-init.c:11: do { ld (ix-1),0x01 -l_chufi_init_00105: -;source-doc/ufi-drv/ufi-init.c:16: device_config_storage *const storage_device = (device_config_storage *)get_usb_device_config(index); +l_chufi_init_00103: +;source-doc/ufi-drv/ufi-init.c:12: usb_device_type t = get_usb_device_type(index); ld a,(ix-1) - call _get_usb_device_config - ld l, e -;source-doc/ufi-drv/ufi-init.c:18: if (storage_device == NULL) - ld a,d - ld h,a - or e - jr Z,l_chufi_init_00108 -;source-doc/ufi-drv/ufi-init.c:21: const usb_device_type t = storage_device->type; - ld a, (hl) - and 0x0f -;source-doc/ufi-drv/ufi-init.c:23: if (t == USB_IS_FLOPPY) { - dec a - jr NZ,l_chufi_init_00106 -;source-doc/ufi-drv/ufi-init.c:24: const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + push af + inc sp + call _get_usb_device_type + inc sp +;source-doc/ufi-drv/ufi-init.c:14: if (t == USB_IS_FLOPPY) { + dec l + jr NZ,l_chufi_init_00104 +;source-doc/ufi-drv/ufi-init.c:15: const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen call _find_storage_dev -;source-doc/ufi-drv/ufi-init.c:25: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; +;source-doc/ufi-drv/ufi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; ld (ix-3),l ld (ix-2),0x00 + ld a,l ld c,l - pop hl - push hl - add hl, hl - ld de,_hbios_usb_storage_devices - add hl, de - ld e,l - ld d,h + ld b,0x00 + add a, a + rl b + add a, +((_hbios_usb_storage_devices) & 0xFF) + ld e, a + ld a, b + adc a, +((_hbios_usb_storage_devices) / 256) + ld d, a + ld l, e + ld h, d inc c ld (hl), c -;source-doc/ufi-drv/ufi-init.c:26: hbios_usb_storage_devices[dev_index].usb_device = index; +;source-doc/ufi-drv/ufi-init.c:18: hbios_usb_storage_devices[dev_index].usb_device = index; ld c, e ld b, d inc bc ld a,(ix-1) ld (bc), a -;source-doc/ufi-drv/ufi-init.c:28: print_string("\r\nUSB: FLOPPY @ $"); +;source-doc/ufi-drv/ufi-init.c:20: print_string("\r\nUSB: FLOPPY @ $"); push de ld hl,ufi_init_str_0 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:29: print_uint16(index); +;source-doc/ufi-drv/ufi-init.c:21: print_uint16(index); ld l,(ix-1) ld h,0x00 push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:30: print_string(":$"); +;source-doc/ufi-drv/ufi-init.c:22: print_string(":$"); ld hl,ufi_init_str_1 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:31: print_uint16(dev_index + 1); +;source-doc/ufi-drv/ufi-init.c:23: print_uint16(dev_index + 1); pop hl push hl inc hl push de call _print_uint16 -;source-doc/ufi-drv/ufi-init.c:32: print_string(" $"); +;source-doc/ufi-drv/ufi-init.c:24: print_string(" $"); ld hl,ufi_init_str_2 call _print_string pop de -;source-doc/ufi-drv/ufi-init.c:33: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); +;source-doc/ufi-drv/ufi-init.c:25: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); ld hl,_ch_ufi_fntbl call _dio_add_entry -l_chufi_init_00106: -;source-doc/ufi-drv/ufi-init.c:36: } while (++index != MAX_NUMBER_OF_DEVICES + 1); +l_chufi_init_00104: +;source-doc/ufi-drv/ufi-init.c:28: } while (++index != MAX_NUMBER_OF_DEVICES + 1); inc (ix-1) ld a,(ix-1) sub 0x07 - jr NZ,l_chufi_init_00105 -l_chufi_init_00108: -;source-doc/ufi-drv/ufi-init.c:37: } + jr NZ,l_chufi_init_00103 +;source-doc/ufi-drv/ufi-init.c:29: } ld sp, ix pop ix ret @@ -146,333 +143,3 @@ ufi_init_str_1: ufi_init_str_2: DEFM " $" DEFB 0x00 -;source-doc/ufi-drv/ufi-init.c:39: uint32_t chufi_get_cap(const uint16_t dev_index) { -; --------------------------------- -; Function chufi_get_cap -; --------------------------------- -_chufi_get_cap: - push ix - ld ix,0 - add ix,sp - ld hl, -72 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/ufi-init.c:40: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:43: memset(&response, 0, sizeof(ufi_format_capacities_response)); - ld hl,0 - add hl, sp - ld b,0x12 -l_chufi_get_cap_00112: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_chufi_get_cap_00112 -;source-doc/ufi-drv/ufi-init.c:45: wait_for_device_ready(dev, 25); - push de - ld a,0x19 - push af - inc sp - push de - call _wait_for_device_ready - pop af - inc sp - pop de -;source-doc/ufi-drv/ufi-init.c:49: ufi_inquiry(dev, &inquiry); - push de - ld hl,38 - add hl, sp - push hl - push de - call _ufi_inquiry - pop af - pop af - pop de -;source-doc/ufi-drv/ufi-init.c:51: wait_for_device_ready(dev, 15); - push de - ld a,0x0f - push af - inc sp - push de - call _wait_for_device_ready - pop af - inc sp - pop de -;source-doc/ufi-drv/ufi-init.c:53: const usb_error result = ufi_read_frmt_caps(dev, &response); - ld hl,0 - add hl, sp - push hl - push de - call _ufi_read_frmt_caps - pop af - pop af - ld a, l -;source-doc/ufi-drv/ufi-init.c:54: if (result != USB_ERR_OK) - or a - jr Z,l_chufi_get_cap_00102 -;source-doc/ufi-drv/ufi-init.c:55: return 0; - ld hl,0x0000 - ld e, l - ld d, l - jr l_chufi_get_cap_00103 -l_chufi_get_cap_00102: -;source-doc/ufi-drv/ufi-init.c:57: return convert_from_msb_first(response.descriptors[0].number_of_blocks); - ld hl,4 - add hl, sp - push hl - call _convert_from_msb_first - pop af -l_chufi_get_cap_00103: -;source-doc/ufi-drv/ufi-init.c:58: } - ld sp, ix - pop ix - ret -;source-doc/ufi-drv/ufi-init.c:60: uint8_t chufi_read(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function chufi_read -; --------------------------------- -_chufi_read: - push ix - ld ix,0 - add ix,sp - ld hl, -20 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/ufi-init.c:61: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:63: if (wait_for_device_ready((device_config *)dev, 20) != 0) - push de - ld c,e - ld b,d - push de - ld a,0x14 - push af - inc sp - push bc - call _wait_for_device_ready - pop af - inc sp - ld a, l - pop de - pop bc - or a - jr Z,l_chufi_read_00102 -;source-doc/ufi-drv/ufi-init.c:64: return -1; // Not READY! - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00102: -;source-doc/ufi-drv/ufi-init.c:69: memset(&sense_codes, 0, sizeof(sense_codes)); - ld hl,0 - add hl, sp - xor a - ld (hl), a - inc hl - ld (hl), a -;source-doc/ufi-drv/ufi-init.c:71: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) - ld hl,12 - add hl, de - ld e, (hl) - inc hl - ld d, (hl) - push bc - ld hl,2 - add hl, sp - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld a,0x01 - push af - inc sp - push de - xor a - push af - inc sp - push bc - call _ufi_read_write_sector - pop af - pop af - pop af - pop af - pop af - ld a, l - pop bc - or a - jr Z,l_chufi_read_00104 -;source-doc/ufi-drv/ufi-init.c:72: return -1; // general error - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00104: -;source-doc/ufi-drv/ufi-init.c:75: memset(&response, 0, sizeof(response)); - push bc - ld hl,4 - add hl, sp - ld b,0x09 -l_chufi_read_00139: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_chufi_read_00139 - pop bc -;source-doc/ufi-drv/ufi-init.c:77: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) - ld hl,2 - add hl, sp - push hl - push bc - call _ufi_request_sense - pop af - pop af - ld a, l - or a - jr Z,l_chufi_read_00106 -;source-doc/ufi-drv/ufi-init.c:78: return -1; // error - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00106: -;source-doc/ufi-drv/ufi-init.c:82: const uint8_t sense_key = response.sense_key; - ld hl,4 - add hl, sp - ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:84: if (sense_key != 0) - and 0x0f - jr Z,l_chufi_read_00108 -;source-doc/ufi-drv/ufi-init.c:85: return -1; - ld l,0xff - jr l_chufi_read_00109 -l_chufi_read_00108: -;source-doc/ufi-drv/ufi-init.c:87: return USB_ERR_OK; - ld l,0x00 -l_chufi_read_00109: -;source-doc/ufi-drv/ufi-init.c:88: } - ld sp, ix - pop ix - ret -;source-doc/ufi-drv/ufi-init.c:90: usb_error chufi_write(const uint16_t dev_index, uint8_t *const buffer) { -; --------------------------------- -; Function chufi_write -; --------------------------------- -_chufi_write: - push ix - ld ix,0 - add ix,sp - ld hl, -20 - add hl, sp - ld sp, hl -;source-doc/ufi-drv/ufi-init.c:91: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); - ld a,(ix+4) - call _get_usb_device_config -;source-doc/ufi-drv/ufi-init.c:93: if (wait_for_device_ready((device_config *)dev, 20) != 0) - push de - ld c,e - ld b,d - push de - ld a,0x14 - push af - inc sp - push bc - call _wait_for_device_ready - pop af - inc sp - ld a, l - pop de - pop bc - or a - jr Z,l_chufi_write_00102 -;source-doc/ufi-drv/ufi-init.c:94: return -1; // Not READY! - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00102: -;source-doc/ufi-drv/ufi-init.c:98: memset(&sense_codes, 0, sizeof(sense_codes)); - ld hl,0 - add hl, sp - xor a - ld (hl), a - inc hl - ld (hl), a -;source-doc/ufi-drv/ufi-init.c:99: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { - ld hl,12 - add hl, de - ld e, (hl) - inc hl - ld d, (hl) - push bc - ld hl,2 - add hl, sp - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld a,0x01 - push af - inc sp - push de - ld a,0x01 - push af - inc sp - push bc - call _ufi_read_write_sector - pop af - pop af - pop af - pop af - pop af - ld a, l - pop bc - or a - jr Z,l_chufi_write_00104 -;source-doc/ufi-drv/ufi-init.c:100: return -1; - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00104: -;source-doc/ufi-drv/ufi-init.c:104: memset(&response, 0, sizeof(response)); - push bc - ld hl,4 - add hl, sp - ld b,0x09 -l_chufi_write_00139: - xor a - ld (hl), a - inc hl - ld (hl), a - inc hl - djnz l_chufi_write_00139 - pop bc -;source-doc/ufi-drv/ufi-init.c:106: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { - ld hl,2 - add hl, sp - push hl - push bc - call _ufi_request_sense - pop af - pop af - ld a, l - or a - jr Z,l_chufi_write_00106 -;source-doc/ufi-drv/ufi-init.c:107: return -1; - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00106: -;source-doc/ufi-drv/ufi-init.c:112: const uint8_t sense_key = response.sense_key; - ld hl,4 - add hl, sp - ld a, (hl) -;source-doc/ufi-drv/ufi-init.c:114: if (sense_key != 0) - and 0x0f - jr Z,l_chufi_write_00108 -;source-doc/ufi-drv/ufi-init.c:115: return -1; - ld l,0xff - jr l_chufi_write_00109 -l_chufi_write_00108: -;source-doc/ufi-drv/ufi-init.c:117: return USB_ERR_OK; - ld l,0x00 -l_chufi_write_00109: -;source-doc/ufi-drv/ufi-init.c:118: } - ld sp, ix - pop ix - ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s new file mode 100644 index 00000000..277d864c --- /dev/null +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s @@ -0,0 +1,380 @@ +; +; Generated from source-doc/ufi-drv/ufi_driver.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/ufi-drv/ufi_driver.c:6: uint32_t usb_ufi_get_cap(const uint16_t dev_index) { +; --------------------------------- +; Function usb_ufi_get_cap +; --------------------------------- +_usb_ufi_get_cap: + push ix + ld ix,0 + add ix,sp + ld hl, -72 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/ufi_driver.c:7: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi_driver.c:10: memset(&response, 0, sizeof(ufi_format_capacities_response)); + ld hl,0 + add hl, sp + ld b,0x12 +l_usb_ufi_get_cap_00112: + xor a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_usb_ufi_get_cap_00112 +;source-doc/ufi-drv/ufi_driver.c:12: wait_for_device_ready(dev, 25); + push de + ld a,0x19 + push af + inc sp + push de + call _wait_for_device_ready + pop af + inc sp + pop de +;source-doc/ufi-drv/ufi_driver.c:16: ufi_inquiry(dev, &inquiry); + push de + ld hl,38 + add hl, sp + push hl + push de + call _ufi_inquiry + pop af + pop af + pop de +;source-doc/ufi-drv/ufi_driver.c:18: wait_for_device_ready(dev, 15); + push de + ld a,0x0f + push af + inc sp + push de + call _wait_for_device_ready + pop af + inc sp + pop de +;source-doc/ufi-drv/ufi_driver.c:20: const usb_error result = ufi_read_frmt_caps(dev, &response); + ld hl,0 + add hl, sp + push hl + push de + call _ufi_read_frmt_caps + pop af + pop af + ld a, l +;source-doc/ufi-drv/ufi_driver.c:21: if (result != USB_ERR_OK) + or a + jr Z,l_usb_ufi_get_cap_00102 +;source-doc/ufi-drv/ufi_driver.c:22: return 0; + ld hl,0x0000 + ld e, l + ld d, l + jr l_usb_ufi_get_cap_00103 +l_usb_ufi_get_cap_00102: +;source-doc/ufi-drv/ufi_driver.c:24: return convert_from_msb_first(response.descriptors[0].number_of_blocks); + ld hl,4 + add hl, sp + push hl + call _convert_from_msb_first + pop af +l_usb_ufi_get_cap_00103: +;source-doc/ufi-drv/ufi_driver.c:25: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/ufi_driver.c:27: uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_ufi_read +; --------------------------------- +_usb_ufi_read: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/ufi_driver.c:28: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi_driver.c:30: if (wait_for_device_ready((device_config *)dev, 20) != 0) + push de + ld c,e + ld b,d + push de + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld a, l + pop de + pop bc + or a + jr Z,l_usb_ufi_read_00102 +;source-doc/ufi-drv/ufi_driver.c:31: return -1; // Not READY! + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00102: +;source-doc/ufi-drv/ufi_driver.c:36: memset(&sense_codes, 0, sizeof(sense_codes)); + ld hl,0 + add hl, sp + xor a + ld (hl), a + inc hl + ld (hl), a +;source-doc/ufi-drv/ufi_driver.c:38: if (ufi_read_write_sector((device_config *)dev, false, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes) != USB_ERR_OK) + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + xor a + push af + inc sp + push bc + call _ufi_read_write_sector + pop af + pop af + pop af + pop af + pop af + ld a, l + pop bc + or a + jr Z,l_usb_ufi_read_00104 +;source-doc/ufi-drv/ufi_driver.c:39: return -1; // general error + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00104: +;source-doc/ufi-drv/ufi_driver.c:42: memset(&response, 0, sizeof(response)); + push bc + ld hl,4 + add hl, sp + ld b,0x09 +l_usb_ufi_read_00139: + xor a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_usb_ufi_read_00139 + pop bc +;source-doc/ufi-drv/ufi_driver.c:44: if ((result = ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_usb_ufi_read_00106 +;source-doc/ufi-drv/ufi_driver.c:45: return -1; // error + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00106: +;source-doc/ufi-drv/ufi_driver.c:49: const uint8_t sense_key = response.sense_key; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/ufi_driver.c:51: if (sense_key != 0) + and 0x0f + jr Z,l_usb_ufi_read_00108 +;source-doc/ufi-drv/ufi_driver.c:52: return -1; + ld l,0xff + jr l_usb_ufi_read_00109 +l_usb_ufi_read_00108: +;source-doc/ufi-drv/ufi_driver.c:54: return USB_ERR_OK; + ld l,0x00 +l_usb_ufi_read_00109: +;source-doc/ufi-drv/ufi_driver.c:55: } + ld sp, ix + pop ix + ret +;source-doc/ufi-drv/ufi_driver.c:57: usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer) { +; --------------------------------- +; Function usb_ufi_write +; --------------------------------- +_usb_ufi_write: + push ix + ld ix,0 + add ix,sp + ld hl, -20 + add hl, sp + ld sp, hl +;source-doc/ufi-drv/ufi_driver.c:58: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); + ld a,(ix+4) + call _get_usb_device_config +;source-doc/ufi-drv/ufi_driver.c:60: if (wait_for_device_ready((device_config *)dev, 20) != 0) + push de + ld c,e + ld b,d + push de + ld a,0x14 + push af + inc sp + push bc + call _wait_for_device_ready + pop af + inc sp + ld a, l + pop de + pop bc + or a + jr Z,l_usb_ufi_write_00102 +;source-doc/ufi-drv/ufi_driver.c:61: return -1; // Not READY! + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00102: +;source-doc/ufi-drv/ufi_driver.c:65: memset(&sense_codes, 0, sizeof(sense_codes)); + ld hl,0 + add hl, sp + xor a + ld (hl), a + inc hl + ld (hl), a +;source-doc/ufi-drv/ufi_driver.c:66: if ((ufi_read_write_sector((device_config *)dev, true, dev->current_lba, 1, buffer, (uint8_t *)&sense_codes)) != USB_ERR_OK) { + ld hl,12 + add hl, de + ld e, (hl) + inc hl + ld d, (hl) + push bc + ld hl,2 + add hl, sp + push hl + ld l,(ix+6) + ld h,(ix+7) + push hl + ld a,0x01 + push af + inc sp + push de + ld a,0x01 + push af + inc sp + push bc + call _ufi_read_write_sector + pop af + pop af + pop af + pop af + pop af + ld a, l + pop bc + or a + jr Z,l_usb_ufi_write_00104 +;source-doc/ufi-drv/ufi_driver.c:67: return -1; + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00104: +;source-doc/ufi-drv/ufi_driver.c:71: memset(&response, 0, sizeof(response)); + push bc + ld hl,4 + add hl, sp + ld b,0x09 +l_usb_ufi_write_00139: + xor a + ld (hl), a + inc hl + ld (hl), a + inc hl + djnz l_usb_ufi_write_00139 + pop bc +;source-doc/ufi-drv/ufi_driver.c:73: if ((ufi_request_sense((device_config *)dev, &response)) != USB_ERR_OK) { + ld hl,2 + add hl, sp + push hl + push bc + call _ufi_request_sense + pop af + pop af + ld a, l + or a + jr Z,l_usb_ufi_write_00106 +;source-doc/ufi-drv/ufi_driver.c:74: return -1; + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00106: +;source-doc/ufi-drv/ufi_driver.c:79: const uint8_t sense_key = response.sense_key; + ld hl,4 + add hl, sp + ld a, (hl) +;source-doc/ufi-drv/ufi_driver.c:81: if (sense_key != 0) + and 0x0f + jr Z,l_usb_ufi_write_00108 +;source-doc/ufi-drv/ufi_driver.c:82: return -1; + ld l,0xff + jr l_usb_ufi_write_00109 +l_usb_ufi_write_00108: +;source-doc/ufi-drv/ufi_driver.c:84: return USB_ERR_OK; + ld l,0x00 +l_usb_ufi_write_00109: +;source-doc/ufi-drv/ufi_driver.c:85: } + ld sp, ix + pop ix + ret diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 391762d1..917a28f9 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -66,7 +66,7 @@ UKY_SCNCNT .EQU $ - 1 LD (UKY_INT_SP),SP ; SAVE ORIGINAL STACK FRAME LD SP,UKY_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM - CALL _keyboard_tick + CALL _usb_kyb_tick LD SP, $FFFF ; RESTORE ORIGINAL STACK FRAME UKY_INT_SP .EQU $ - 2 @@ -119,7 +119,7 @@ UKY_STAT: push hl ; address of potential que'd next usb report HB_DI - call _keyboard_buf_size + call _usb_kyb_buf_size HB_EI ld a, l ld b, h @@ -164,7 +164,7 @@ no_queued_reports: ; UKY_FLUSH: HB_DI - CALL _keyboard_buf_flush + CALL _usb_kyb_flush HB_EI XOR A RET @@ -205,7 +205,7 @@ UKY_FLUSH: ; UKY_READ: HB_DI - CALL _keyboard_buf_get_next + CALL _usb_kyb_buf_get_next HB_EI LD A, H OR A diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 1144e48d..0aab0cef 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -75,7 +75,7 @@ CH_SCSI_SEEK: PUSH DE PUSH HL PUSH IY - CALL _scsi_seek + CALL _usb_scsi_seek POP IY POP HL POP DE @@ -113,7 +113,7 @@ CH_SCSI_READ: ; HL = HL + 512 PUSH HL PUSH IY - call _scsi_read + CALL _usb_scsi_read LD A, L POP IY POP HL @@ -151,7 +151,7 @@ CH_SCSI_WRITE: ; HL = HL + 512 PUSH HL PUSH IY - call _scsi_write + CALL _usb_scsi_write LD A, L POP IY POP HL @@ -268,7 +268,7 @@ CH_SCSI_CAP: PUSH IX PUSH IY - call _scsi_read_capacity + CALL _usb_scsi_read_capacity POP IY POP IX diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index e8b5c8ac..3154c7c5 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -5,7 +5,7 @@ ; #include "./ch376-native/ufi-drv.s" -_ufi_seek .EQU _scsi_seek +_ufi_seek .EQU _usb_scsi_seek ; find and mount all floppy USB drives CHUFI_INIT .EQU _chufi_init @@ -111,7 +111,7 @@ CH_UFI_READ: PUSH HL PUSH IY - call _chufi_read + CALL _usb_ufi_read LD L, 0 LD A, L POP IY @@ -150,7 +150,7 @@ CH_UFI_WRITE: ; HL = HL + 512 PUSH HL PUSH IY - call _chufi_write + CALL _usb_ufi_write LD A, L POP IY POP HL @@ -267,7 +267,7 @@ CH_UFI_CAP: EXX PUSH IY - call _chufi_get_cap + CALL _usb_ufi_get_cap POP IY LD BC, 512 XOR A From e24860f4749f0589731e108afc451661b7b2fc08 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 22 Apr 2025 10:04:59 +1000 Subject: [PATCH 42/59] ch376-native: minor code cleanup --- Source/HBIOS/ch376-native/base-drv/ch376.c.s | 4 +- .../ch376-native/base-drv/dev_transfers.c.s | 84 ++++---- .../ch376-native/base-drv/enumerate_hub.c.s | 8 +- .../HBIOS/ch376-native/base-drv/transfers.c.s | 187 ++++++------------ .../ch376-native/base-drv/usb-base-drv.c.s | 10 +- .../HBIOS/ch376-native/base-drv/usb_state.c.s | 32 +-- .../ch376-native/keyboard/kyb_driver.c.s | 12 +- .../ch376-native/source-doc/base-drv/ch376.c | 4 +- .../ch376-native/source-doc/base-drv/ch376.h | 3 +- .../source-doc/base-drv/class_hub.h | 51 ++--- .../source-doc/base-drv/dev_transfers.c | 5 +- .../source-doc/base-drv/enumerate_hub.c | 2 +- .../source-doc/base-drv/enumerate_storage.h | 1 + .../ch376-native/source-doc/base-drv/print.h | 1 + .../source-doc/base-drv/transfers.c | 19 +- .../source-doc/base-drv/usb-base-drv.c | 4 +- .../source-doc/base-drv/usb-base-drv.h | 2 +- .../source-doc/base-drv/usb_state.c | 1 - .../ch376-native/source-doc/base-drv/z80.h | 6 - 19 files changed, 172 insertions(+), 264 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/source-doc/base-drv/z80.h diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 54dde6cc..35d7c3cb 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -251,7 +251,7 @@ l_ch_probe_00107: inc sp pop ix ret -;source-doc/base-drv/ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:112: usb_error ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { ; --------------------------------- ; Function ch_cmd_set_usb_mode ; --------------------------------- @@ -581,7 +581,7 @@ l_ch_data_in_transfer_00111: ;source-doc/base-drv/ch376.c:187: } pop ix ret -;source-doc/base-drv/ch376.c:190: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:190: usb_error ch_data_in_transfer_n(uint8_t *const buffer, uint8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 3060aa9c..baa56e99 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/dev_transfers.c:24: * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer +;source-doc/base-drv/dev_transfers.c:23: * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer ; --------------------------------- ; Function usbdev_control_transfer ; --------------------------------- @@ -56,7 +56,7 @@ _usbdev_control_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/dev_transfers.c:25: * +;source-doc/base-drv/dev_transfers.c:24: * ld l,(ix+4) ld h,(ix+5) ld e,l @@ -82,10 +82,10 @@ _usbdev_control_transfer: pop af pop af pop af -;source-doc/base-drv/dev_transfers.c:26: * @param device the usb device +;source-doc/base-drv/dev_transfers.c:25: * @param device the usb device pop ix ret -;source-doc/base-drv/dev_transfers.c:28: * @param buffer Pointer of data to send or receive into +;source-doc/base-drv/dev_transfers.c:27: * @param buffer Pointer of data to send or receive into ; --------------------------------- ; Function usbdev_blk_out_trnsfer ; --------------------------------- @@ -95,13 +95,13 @@ _usbdev_blk_out_trnsfer: add ix,sp push af push af -;source-doc/base-drv/dev_transfers.c:30: */ +;source-doc/base-drv/dev_transfers.c:29: */ ld e,(ix+4) ld d,(ix+5) ld hl,0x0003 add hl, de ex (sp), hl -;source-doc/base-drv/dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); +;source-doc/base-drv/dev_transfers.c:31: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); ld (ix-2),e ld (ix-1),d pop bc @@ -134,12 +134,12 @@ _usbdev_blk_out_trnsfer: pop de ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:34: +;source-doc/base-drv/dev_transfers.c:33: ld hl,_result ld a, (hl) sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { +;source-doc/base-drv/dev_transfers.c:34: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { ex de, hl inc hl ld d, (hl) @@ -164,23 +164,23 @@ _usbdev_blk_out_trnsfer: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:36: +;source-doc/base-drv/dev_transfers.c:35: pop hl push hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; +;source-doc/base-drv/dev_transfers.c:36: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; ld l,0x02 jr l_usbdev_blk_out_trnsfer_00104 l_usbdev_blk_out_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:40: -;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:39: +;source-doc/base-drv/dev_transfers.c:42: endpoint->toggle = 0; ld hl, (_result) l_usbdev_blk_out_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:43: return USB_ERR_STALL; ld sp, ix pop ix ret -;source-doc/base-drv/dev_transfers.c:46: +;source-doc/base-drv/dev_transfers.c:45: ; --------------------------------- ; Function usbdev_bulk_in_transfer ; --------------------------------- @@ -190,13 +190,13 @@ _usbdev_bulk_in_transfer: add ix,sp push af push af -;source-doc/base-drv/dev_transfers.c:47: RETURN_CHECK(result); +;source-doc/base-drv/dev_transfers.c:46: RETURN_CHECK(result); ld e,(ix+4) ld d,(ix+5) ld hl,0x0006 add hl, de ex (sp), hl -;source-doc/base-drv/dev_transfers.c:49: done: +;source-doc/base-drv/dev_transfers.c:48: done: ld (ix-2),e ld (ix-1),d pop bc @@ -229,12 +229,12 @@ _usbdev_bulk_in_transfer: pop de ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:51: } +;source-doc/base-drv/dev_transfers.c:50: } ld hl,_result ld a, (hl) sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 -;source-doc/base-drv/dev_transfers.c:52: +;source-doc/base-drv/dev_transfers.c:51: ex de, hl inc hl ld d, (hl) @@ -259,23 +259,23 @@ _usbdev_bulk_in_transfer: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { +;source-doc/base-drv/dev_transfers.c:52: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { pop hl push hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; +;source-doc/base-drv/dev_transfers.c:53: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; ld l,0x02 jr l_usbdev_bulk_in_transfer_00104 l_usbdev_bulk_in_transfer_00102: -;source-doc/base-drv/dev_transfers.c:57: -;source-doc/base-drv/dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); +;source-doc/base-drv/dev_transfers.c:56: +;source-doc/base-drv/dev_transfers.c:58: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); ld hl, (_result) l_usbdev_bulk_in_transfer_00104: -;source-doc/base-drv/dev_transfers.c:60: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:59: endpoint->toggle = 0; ld sp, ix pop ix ret -;source-doc/base-drv/dev_transfers.c:62: } +;source-doc/base-drv/dev_transfers.c:61: } ; --------------------------------- ; Function usbdev_dat_in_trnsfer ; --------------------------------- @@ -285,7 +285,7 @@ _usbdev_dat_in_trnsfer: add ix,sp push af push af -;source-doc/base-drv/dev_transfers.c:67: } +;source-doc/base-drv/dev_transfers.c:66: } ld e,(ix+4) ld d,(ix+5) ld c, e @@ -304,7 +304,7 @@ _usbdev_dat_in_trnsfer: ld a,0x00 adc a, b ld (ix-3),a -;source-doc/base-drv/dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device, +;source-doc/base-drv/dev_transfers.c:68: usb_error usbdev_dat_in_trnsfer(device_config *const device, ld (ix-2),e ld (ix-1),d pop bc @@ -337,12 +337,12 @@ _usbdev_dat_in_trnsfer: pop de ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:71: const uint16_t buffer_size, +;source-doc/base-drv/dev_transfers.c:70: const uint16_t buffer_size, ld hl,_result ld a, (hl) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:72: const usb_endpoint_type endpoint_type) { +;source-doc/base-drv/dev_transfers.c:71: const usb_endpoint_type endpoint_type) { ex de, hl inc hl ld d, (hl) @@ -367,23 +367,23 @@ _usbdev_dat_in_trnsfer: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:73: +;source-doc/base-drv/dev_transfers.c:72: pop hl push hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; +;source-doc/base-drv/dev_transfers.c:73: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; ld l,0x02 jr l_usbdev_dat_in_trnsfer_00104 l_usbdev_dat_in_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:77: -;source-doc/base-drv/dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); +;source-doc/base-drv/dev_transfers.c:76: +;source-doc/base-drv/dev_transfers.c:78: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); ld hl, (_result) l_usbdev_dat_in_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:80: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:79: endpoint->toggle = 0; ld sp, ix pop ix ret -;source-doc/base-drv/dev_transfers.c:82: } +;source-doc/base-drv/dev_transfers.c:81: } ; --------------------------------- ; Function usbdev_dat_in_trnsfer_0 ; --------------------------------- @@ -393,13 +393,13 @@ _usbdev_dat_in_trnsfer_0: add ix,sp push af push af -;source-doc/base-drv/dev_transfers.c:83: +;source-doc/base-drv/dev_transfers.c:82: ld e,(ix+4) ld d,(ix+5) ld hl,0x0003 add hl, de ex (sp), hl -;source-doc/base-drv/dev_transfers.c:85: done: +;source-doc/base-drv/dev_transfers.c:84: done: ld (ix-2),e ld (ix-1),d pop bc @@ -432,12 +432,12 @@ _usbdev_dat_in_trnsfer_0: pop de ld a, l ld (_result), a -;source-doc/base-drv/dev_transfers.c:87: } +;source-doc/base-drv/dev_transfers.c:86: } ld hl,_result ld a, (hl) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_0_00102 -;source-doc/base-drv/dev_transfers.c:88: +;source-doc/base-drv/dev_transfers.c:87: ex de, hl inc hl ld d, (hl) @@ -462,18 +462,18 @@ _usbdev_dat_in_trnsfer_0: call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { +;source-doc/base-drv/dev_transfers.c:88: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { pop hl push hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; +;source-doc/base-drv/dev_transfers.c:89: endpoint_param *const endpoint = &device->endpoints[0]; ld l,0x02 jr l_usbdev_dat_in_trnsfer_0_00103 l_usbdev_dat_in_trnsfer_0_00102: -;source-doc/base-drv/dev_transfers.c:93: +;source-doc/base-drv/dev_transfers.c:92: ld hl, (_result) l_usbdev_dat_in_trnsfer_0_00103: -;source-doc/base-drv/dev_transfers.c:94: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:93: if (result == USB_ERR_STALL) { ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s index 958d7061..061b599a 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -333,11 +333,9 @@ l_configure_usb_hub_00126: pop bc or a jp NZ, l_configure_usb_hub_00129 -;source-doc/base-drv/enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) { - ld hl,8 - add hl, sp - ld a, (hl) - and 0x01 +;source-doc/base-drv/enumerate_hub.c:61: if (port_status.wPortStatus & PORT_STAT_CONNECTION) { + ld e,(ix-6) + bit 0, e jr Z,l_configure_usb_hub_00124 ;source-doc/base-drv/enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); push bc diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index 47e2cfb1..a7e24d4e 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/transfers.c:23: +;source-doc/base-drv/transfers.c:22: ; --------------------------------- ; Function usb_ctrl_trnsfer_ext ; --------------------------------- @@ -56,26 +56,26 @@ _usb_ctrl_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:27: const uint8_t max_packet_size) { +;source-doc/base-drv/transfers.c:26: const uint8_t max_packet_size) { ld a,(ix+5) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:28: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:27: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:30: +;source-doc/base-drv/transfers.c:29: ld a,(ix+7) or (ix+6) jr Z,l_usb_ctrl_trnsfer_ext_00104 ld a,(ix+7) sub 0x80 jr NC,l_usb_ctrl_trnsfer_ext_00104 -;source-doc/base-drv/transfers.c:31: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:30: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) ld l,0x82 jr l_usb_ctrl_trnsfer_ext_00106 l_usb_ctrl_trnsfer_ext_00104: -;source-doc/base-drv/transfers.c:33: +;source-doc/base-drv/transfers.c:32: ld h,(ix+9) ld l,(ix+8) push hl @@ -90,10 +90,10 @@ l_usb_ctrl_trnsfer_ext_00104: pop af pop af l_usb_ctrl_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:34: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); +;source-doc/base-drv/transfers.c:33: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); pop ix ret -;source-doc/base-drv/transfers.c:38: * @brief Perform a USB control transfer (in or out) +;source-doc/base-drv/transfers.c:37: * @brief Perform a USB control transfer (in or out) ; --------------------------------- ; Function usb_control_transfer ; --------------------------------- @@ -103,7 +103,7 @@ _usb_control_transfer: add ix,sp push af push af -;source-doc/base-drv/transfers.c:43: * @param device_address usb device address +;source-doc/base-drv/transfers.c:42: * @param device_address usb device address ld hl,0 add hl, sp set 0, (hl) @@ -125,30 +125,30 @@ _usb_control_transfer: and 0xfc or e ld (hl), a -;source-doc/base-drv/transfers.c:45: * @return usb_error USB_ERR_OK if all good, otherwise specific error code +;source-doc/base-drv/transfers.c:44: * @return usb_error USB_ERR_OK if all good, otherwise specific error code ld c,(ix+4) ld b,(ix+5) ld a, (bc) and 0x80 -;source-doc/base-drv/transfers.c:47: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +;source-doc/base-drv/transfers.c:46: usb_error usb_control_transfer(const setup_packet *const cmd_packet, ld (ix-1),a or a jr Z,l_usb_control_transfer_00102 ld a,(ix+7) or (ix+6) jr NZ,l_usb_control_transfer_00102 -;source-doc/base-drv/transfers.c:48: void *const buffer, +;source-doc/base-drv/transfers.c:47: void *const buffer, ld l,0x0f jp l_usb_control_transfer_00114 l_usb_control_transfer_00102: -;source-doc/base-drv/transfers.c:50: const uint8_t max_packet_size) { +;source-doc/base-drv/transfers.c:49: const uint8_t max_packet_size) { push bc call _critical_begin -;source-doc/base-drv/transfers.c:52: endpoint_param endpoint = {1, 0, max_packet_size}; +;source-doc/base-drv/transfers.c:51: endpoint_param endpoint = {1, 0, max_packet_size}; ld l,(ix+8) call _ch_set_usb_address pop bc -;source-doc/base-drv/transfers.c:54: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); +;source-doc/base-drv/transfers.c:53: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); ld e,(ix+4) ld d,(ix+5) push bc @@ -159,21 +159,21 @@ l_usb_control_transfer_00102: call _ch_write_data pop af inc sp -;source-doc/base-drv/transfers.c:55: +;source-doc/base-drv/transfers.c:54: call _ch_issue_token_setup -;source-doc/base-drv/transfers.c:56: if (transferIn && buffer == 0) +;source-doc/base-drv/transfers.c:55: if (transferIn && buffer == 0) call _ch_short_wait_int_and_get_stat pop bc -;source-doc/base-drv/transfers.c:57: return USB_ERR_OTHER; +;source-doc/base-drv/transfers.c:56: return USB_ERR_OTHER; ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:59: critical_begin(); +;source-doc/base-drv/transfers.c:58: critical_begin(); ld hl,6 add hl, bc ld c, (hl) inc hl -;source-doc/base-drv/transfers.c:62: +;source-doc/base-drv/transfers.c:61: ld a,(hl) ld b,a or c @@ -204,58 +204,58 @@ l_usb_control_transfer_00118: l_usb_control_transfer_00119: jr l_usb_control_transfer_00117 l_usb_control_transfer_00116: -;source-doc/base-drv/transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); +;source-doc/base-drv/transfers.c:62: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ld l,0x00 l_usb_control_transfer_00117: -;source-doc/base-drv/transfers.c:65: result = ch_short_wait_int_and_get_statu(); +;source-doc/base-drv/transfers.c:64: result = ch_short_wait_int_and_get_statu(); ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:67: +;source-doc/base-drv/transfers.c:66: ld a,(ix-1) or a jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/transfers.c:68: const uint16_t length = cmd_packet->wLength; +;source-doc/base-drv/transfers.c:67: const uint16_t length = cmd_packet->wLength; ld l,0x2c call _ch_command -;source-doc/base-drv/transfers.c:69: +;source-doc/base-drv/transfers.c:68: ld a,0x00 ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/transfers.c:70: result = length != 0 +;source-doc/base-drv/transfers.c:69: result = length != 0 call _ch_issue_token_out_ep0 -;source-doc/base-drv/transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) +;source-doc/base-drv/transfers.c:70: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/transfers.c:73: +;source-doc/base-drv/transfers.c:72: ld a,l or a jr Z,l_usb_control_transfer_00108 sub 0x02 jr NZ,l_usb_control_transfer_00113 l_usb_control_transfer_00108: -;source-doc/base-drv/transfers.c:74: CHECK(result) +;source-doc/base-drv/transfers.c:73: CHECK(result) ld l,0x00 -;source-doc/base-drv/transfers.c:75: +;source-doc/base-drv/transfers.c:74: jr l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:78: CH376_DATA_PORT = 0; +;source-doc/base-drv/transfers.c:77: CH376_DATA_PORT = 0; l_usb_control_transfer_00112: -;source-doc/base-drv/transfers.c:81: +;source-doc/base-drv/transfers.c:80: call _ch_issue_token_in_ep0 -;source-doc/base-drv/transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) { +;source-doc/base-drv/transfers.c:81: if (result == USB_ERR_OK || result == USB_ERR_STALL) { call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/transfers.c:86: +;source-doc/base-drv/transfers.c:85: l_usb_control_transfer_00113: -;source-doc/base-drv/transfers.c:87: RETURN_CHECK(result); +;source-doc/base-drv/transfers.c:86: RETURN_CHECK(result); push hl call _critical_end pop hl -;source-doc/base-drv/transfers.c:88: } +;source-doc/base-drv/transfers.c:87: } l_usb_control_transfer_00114: -;source-doc/base-drv/transfers.c:89: +;source-doc/base-drv/transfers.c:88: ld sp, ix pop ix ret -;source-doc/base-drv/transfers.c:92: +;source-doc/base-drv/transfers.c:91: ; --------------------------------- ; Function usb_dat_in_trnsfer_ext ; --------------------------------- @@ -263,26 +263,26 @@ _usb_dat_in_trnsfer_ext: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:93: RETURN_CHECK(result); +;source-doc/base-drv/transfers.c:92: RETURN_CHECK(result); ld a,(ix+5) or (ix+4) jr Z,l_usb_dat_in_trnsfer_ext_00102 ld a,(ix+5) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:94: +;source-doc/base-drv/transfers.c:93: ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:96: critical_end(); +;source-doc/base-drv/transfers.c:95: critical_end(); ld a,(ix+10) sub 0x80 jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/transfers.c:97: return result; +;source-doc/base-drv/transfers.c:96: return result; ld l,0x82 jr l_usb_dat_in_trnsfer_ext_00106 l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/transfers.c:99: +;source-doc/base-drv/transfers.c:98: ld l,(ix+9) ld h,(ix+10) push hl @@ -301,67 +301,10 @@ l_usb_dat_in_trnsfer_ext_00105: pop af inc sp l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:100: usb_error +;source-doc/base-drv/transfers.c:99: usb_error pop ix ret -;source-doc/base-drv/transfers.c:103: return USB_BAD_ADDRESS; -; --------------------------------- -; Function usb_dat_in_trns_n_ext -; --------------------------------- -_usb_dat_in_trns_n_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:104: - ld a,(ix+5) - or (ix+4) - jr Z,l_usb_dat_in_trns_n_ext_00102 - ld a,(ix+5) - and 0xc0 - jr NZ,l_usb_dat_in_trns_n_ext_00102 -;source-doc/base-drv/transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) - ld l,0x82 - jr l_usb_dat_in_trns_n_ext_00108 -l_usb_dat_in_trns_n_ext_00102: -;source-doc/base-drv/transfers.c:107: - ld a,(ix+10) - and 0xc0 - jr NZ,l_usb_dat_in_trns_n_ext_00105 -;source-doc/base-drv/transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); - ld l,0x82 - jr l_usb_dat_in_trns_n_ext_00108 -l_usb_dat_in_trns_n_ext_00105: -;source-doc/base-drv/transfers.c:110: - ld a,(ix+7) - and 0xc0 - jr NZ,l_usb_dat_in_trns_n_ext_00107 -;source-doc/base-drv/transfers.c:111: usb_error - ld l,0x82 - jr l_usb_dat_in_trns_n_ext_00108 -l_usb_dat_in_trns_n_ext_00107: -;source-doc/base-drv/transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) - ld c,(ix+6) - ld b,(ix+7) - ld l,(ix+9) - ld h,(ix+10) - push hl - ld a,(ix+8) - push af - inc sp - push bc - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_data_in_transfer_n - pop af - pop af - pop af - inc sp -l_usb_dat_in_trns_n_ext_00108: -;source-doc/base-drv/transfers.c:114: return USB_BAD_ADDRESS; - pop ix - ret -;source-doc/base-drv/transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0) +;source-doc/base-drv/transfers.c:104: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) ; --------------------------------- ; Function usb_data_in_transfer ; --------------------------------- @@ -369,12 +312,12 @@ _usb_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:120: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:105: return USB_BAD_ADDRESS; call _critical_begin -;source-doc/base-drv/transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/transfers.c:107: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:124: +;source-doc/base-drv/transfers.c:109: ld l,(ix+9) ld h,(ix+10) push hl @@ -390,14 +333,14 @@ _usb_data_in_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:126: * @brief Perform a USB data in on the specififed endpoint +;source-doc/base-drv/transfers.c:111: * @brief Perform a USB data in on the specififed endpoint call _critical_end -;source-doc/base-drv/transfers.c:128: * @param buffer the buffer to receive the data +;source-doc/base-drv/transfers.c:113: * @param buffer the buffer to receive the data ld hl, (_result) -;source-doc/base-drv/transfers.c:129: * @param buffer_size the maximum size of data to be received +;source-doc/base-drv/transfers.c:114: * @param buffer_size the maximum size of data to be received pop ix ret -;source-doc/base-drv/transfers.c:134: usb_error +;source-doc/base-drv/transfers.c:119: usb_error ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- @@ -405,12 +348,12 @@ _usb_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:120: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { call _critical_begin -;source-doc/base-drv/transfers.c:137: +;source-doc/base-drv/transfers.c:122: ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:139: +;source-doc/base-drv/transfers.c:124: ld l,(ix+9) ld h,(ix+10) push hl @@ -426,14 +369,14 @@ _usb_data_in_transfer_n: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:141: +;source-doc/base-drv/transfers.c:126: call _critical_end -;source-doc/base-drv/transfers.c:143: +;source-doc/base-drv/transfers.c:128: ld hl, (_result) -;source-doc/base-drv/transfers.c:144: return result; +;source-doc/base-drv/transfers.c:129: return result; pop ix ret -;source-doc/base-drv/transfers.c:149: * +;source-doc/base-drv/transfers.c:134: * ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- @@ -441,12 +384,12 @@ _usb_data_out_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:150: * @param buffer the buffer to receive the data - must be 62 bytes +;source-doc/base-drv/transfers.c:135: * @param buffer the buffer to receive the data - must be 62 bytes call _critical_begin -;source-doc/base-drv/transfers.c:152: * @param device_address the usb address of the device +;source-doc/base-drv/transfers.c:137: * @param device_address the usb address of the device ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:154: * @return usb_error USB_ERR_OK if all good, otherwise specific error code +;source-doc/base-drv/transfers.c:139: * @return usb_error USB_ERR_OK if all good, otherwise specific error code ld l,(ix+9) ld h,(ix+10) push hl @@ -462,10 +405,10 @@ _usb_data_out_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:156: usb_error +;source-doc/base-drv/transfers.c:141: usb_error call _critical_end -;source-doc/base-drv/transfers.c:158: critical_begin(); +;source-doc/base-drv/transfers.c:143: critical_begin(); ld hl, (_result) -;source-doc/base-drv/transfers.c:159: +;source-doc/base-drv/transfers.c:144: pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 5ebcdd96..d343f3af 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -68,14 +68,14 @@ _usb_host_bus_reset: call _ch_cmd_set_usb_mode ;source-doc/base-drv/usb-base-drv.c:15: delay_20ms(); call _delay_20ms -;source-doc/base-drv/ch376.h:111: #endif +;source-doc/base-drv/ch376.h:111: ld l,0x0b call _ch_command -;source-doc/base-drv/ch376.h:112: +;source-doc/base-drv/ch376.h:112: #endif ld a,0x25 ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) +;source-doc/base-drv/ch376.h:113: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a @@ -201,7 +201,7 @@ l_usb_init_00112: l_usb_init_00113: ;source-doc/base-drv/usb-base-drv.c:69: } ret -;source-doc/base-drv/usb-base-drv.c:71: uint8_t usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { +;source-doc/base-drv/usb-base-drv.c:71: usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { ; --------------------------------- ; Function usb_scsi_seek ; --------------------------------- @@ -220,7 +220,7 @@ _usb_scsi_seek: add hl, sp ld bc,0x0004 ldir -;source-doc/base-drv/usb-base-drv.c:75: return 0; +;source-doc/base-drv/usb-base-drv.c:75: return USB_ERR_OK; ld l,0x00 ;source-doc/base-drv/usb-base-drv.c:76: } pop ix diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 4fdc511a..12167692 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -187,14 +187,14 @@ l_next_device_config_00102: l_next_device_config_00105: ;source-doc/base-drv/usb_state.c:72: } ret -;source-doc/base-drv/usb_state.c:75: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { +;source-doc/base-drv/usb_state.c:74: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { ; --------------------------------- ; Function get_usb_device_config ; --------------------------------- _get_usb_device_config: ld c, a -;source-doc/base-drv/usb_state.c:76: const _usb_state *const usb_state = get_usb_work_area(); -;source-doc/base-drv/usb_state.c:80: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:75: const _usb_state *const usb_state = get_usb_work_area(); +;source-doc/base-drv/usb_state.c:79: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _first_device_config @@ -204,33 +204,33 @@ l_get_usb_device_config_00107: ld a, d or e jr Z,l_get_usb_device_config_00105 -;source-doc/base-drv/usb_state.c:81: if (p->type != USB_NOT_SUPPORTED) { +;source-doc/base-drv/usb_state.c:80: if (p->type != USB_NOT_SUPPORTED) { ld l, e ld h, d ld a, (hl) and 0x0f jr Z,l_get_usb_device_config_00108 -;source-doc/base-drv/usb_state.c:82: if (counter == device_index) +;source-doc/base-drv/usb_state.c:81: if (counter == device_index) ld a, c sub b -;source-doc/base-drv/usb_state.c:83: return p; +;source-doc/base-drv/usb_state.c:82: return p; jr Z,l_get_usb_device_config_00109 -;source-doc/base-drv/usb_state.c:84: counter++; +;source-doc/base-drv/usb_state.c:83: counter++; inc b l_get_usb_device_config_00108: -;source-doc/base-drv/usb_state.c:80: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { +;source-doc/base-drv/usb_state.c:79: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) { push bc ld hl,_x call _next_device_config pop bc jr l_get_usb_device_config_00107 l_get_usb_device_config_00105: -;source-doc/base-drv/usb_state.c:88: return NULL; // is not a usb device +;source-doc/base-drv/usb_state.c:87: return NULL; // is not a usb device ld de,0x0000 l_get_usb_device_config_00109: -;source-doc/base-drv/usb_state.c:89: } +;source-doc/base-drv/usb_state.c:88: } ret -;source-doc/base-drv/usb_state.c:91: usb_device_type get_usb_device_type(const uint8_t dev_index) { +;source-doc/base-drv/usb_state.c:90: usb_device_type get_usb_device_type(const uint8_t dev_index) { ; --------------------------------- ; Function get_usb_device_type ; --------------------------------- @@ -238,24 +238,24 @@ _get_usb_device_type: push ix ld ix,0 add ix,sp -;source-doc/base-drv/usb_state.c:92: const device_config *dev = get_usb_device_config(dev_index); +;source-doc/base-drv/usb_state.c:91: const device_config *dev = get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config ld l, e -;source-doc/base-drv/usb_state.c:94: if (dev == NULL) +;source-doc/base-drv/usb_state.c:93: if (dev == NULL) ld a,d ld h,a or e jr NZ,l_get_usb_device_type_00102 -;source-doc/base-drv/usb_state.c:95: return -1; +;source-doc/base-drv/usb_state.c:94: return -1; ld l,0xff jr l_get_usb_device_type_00103 l_get_usb_device_type_00102: -;source-doc/base-drv/usb_state.c:97: return dev->type; +;source-doc/base-drv/usb_state.c:96: return dev->type; ld a, (hl) and 0x0f ld l, a l_get_usb_device_type_00103: -;source-doc/base-drv/usb_state.c:98: } +;source-doc/base-drv/usb_state.c:97: } pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index 0ede7fe4..f262150b 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -358,14 +358,14 @@ _usb_kyb_tick: or a ;source-doc/keyboard/kyb_driver.c:120: if (is_in_critical_section()) jr NZ,l_usb_kyb_tick_00112 -;././source-doc/base-drv//ch376.h:111: #endif +;././source-doc/base-drv//ch376.h:111: ld l,0x0b call _ch_command -;././source-doc/base-drv//ch376.h:112: +;././source-doc/base-drv//ch376.h:112: #endif ld a,0x25 ld bc,_CH376_DATA_PORT out (c), a -;././source-doc/base-drv//ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) +;././source-doc/base-drv//ch376.h:113: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a @@ -383,14 +383,14 @@ _usb_kyb_tick: inc sp ld a, l ld (_result), a -;././source-doc/base-drv//ch376.h:111: #endif +;././source-doc/base-drv//ch376.h:111: ld l,0x0b call _ch_command -;././source-doc/base-drv//ch376.h:112: +;././source-doc/base-drv//ch376.h:112: #endif ld a,0x25 ld bc,_CH376_DATA_PORT out (c), a -;././source-doc/base-drv//ch376.h:113: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) +;././source-doc/base-drv//ch376.h:113: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index 376a5ef2..bf825ee3 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -109,7 +109,7 @@ uint8_t ch_probe(void) { return false; } -uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +usb_error ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { uint8_t result = 0; CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; @@ -187,7 +187,7 @@ done: } // TODO: review: does buffer_size need to be signed? -usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { +usb_error ch_data_in_transfer_n(uint8_t *const buffer, uint8_t *const buffer_size, endpoint_param *const endpoint) { uint8_t count; usb_error result; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h index 381e84e1..f9240966 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -4,6 +4,7 @@ #include "ch376inc.h" #include "delay.h" +#include #include typedef enum { @@ -157,7 +158,7 @@ extern usb_error ch_control_transfer_request_descriptor(const uint8_t descriptor extern usb_error ch_control_transfer_set_address(const uint8_t device_address) __z88dk_fastcall; extern usb_error ch_control_transfer_set_config(const uint8_t config_value) __z88dk_fastcall; extern usb_error ch_data_in_transfer(uint8_t *buffer, int16_t data_length, endpoint_param *const endpoint); -extern usb_error ch_data_in_transfer_n(uint8_t *buffer, int8_t *const buffer_size, endpoint_param *const endpoint); +extern usb_error ch_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, endpoint_param *const endpoint); extern usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint); inline void ch_configure_nak_retry(const ch_nak_retry_type retry, const uint8_t number_of_retries) { diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h b/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h index 7d7c75da..73d05184 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/class_hub.h @@ -36,40 +36,27 @@ typedef struct { } hub_descriptor; typedef struct { - union { - struct { - uint8_t port_connection : 1; - uint8_t port_enable : 1; - uint8_t port_suspend : 1; - uint8_t port_over_current : 1; - uint8_t port_reset : 1; - uint8_t reserved : 3; - uint8_t port_power : 1; - uint8_t port_low_speed : 1; - uint8_t port_high_speed : 1; - uint8_t port_test : 1; - uint8_t port_indicator : 1; - }; - - uint16_t val; - - } wPortStatus; - - union { - struct { - uint8_t c_port_connection : 1; - uint8_t c_port_enable : 1; - uint8_t c_port_suspend : 1; - uint8_t c_port_over_current : 1; - uint8_t c_port_reset : 1; - }; - - uint16_t val; - - } wPortChange; - + uint16_t wPortStatus; + uint16_t wPortChange; } hub_port_status; +#define PORT_STAT_CONNECTION 0x0001 +#define PORT_STAT_ENABLE 0x0002 +#define PORT_STAT_SUSPEND 0x0004 +#define PORT_STAT_OVERCURRENT 0x0008 +#define PORT_STAT_RESET 0x0010 +#define PORT_STAT_POWER 0x0100 +#define PORT_STAT_LOW_SPEED 0x0200 +#define PORT_STAT_HIGH_SPEED 0x0400 +#define PORT_STAT_TEST 0x0800 +#define PORT_STAT_INDICATOR 0x1000 + +#define PORT_STAT_C_CONNECTION 0x0001 +#define PORT_STAT_C_ENABLE 0x0002 +#define PORT_STAT_C_SUSPEND 0x0004 +#define PORT_STAT_C_OVERCURRENT 0x0008 +#define PORT_STAT_C_RESET 0x0010 + usb_error hub_get_descriptor(const device_config_hub *const hub_config, hub_descriptor *const hub_description) __sdcccall(1); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c index 9abc2988..99e08a5a 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c @@ -12,13 +12,12 @@ #include "dev_transfers.h" #include "ch376.h" +#include "critical-section.h" #include "delay.h" +#include "ez80-helpers.h" #include "protocol.h" #include -#include - -#include "ez80-helpers.h" /** * @brief Perform a USB control transfer (in or out) * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c index d838c452..1db8ddb2 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c @@ -58,7 +58,7 @@ usb_error configure_usb_hub(_working *const working) __z88dk_fastcall { CHECK(hub_get_status_port(hub_config, i, &port_status)); - if (port_status.wPortStatus.port_connection) { + if (port_status.wPortStatus & PORT_STAT_CONNECTION) { CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHANGE, i)); CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h index 849fa3a4..17f81a8a 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_storage.h @@ -1,6 +1,7 @@ #ifndef __USB_ENUMERATE_STORAGE #define __USB_ENUMERATE_STORAGE +#include "dev_transfers.h" #include "protocol.h" extern void parse_endpoints(device_config_storage *const storage_dev, const endpoint_descriptor const *pEndpoint); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h index 480f73f7..df7491b3 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/print.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/print.h @@ -1,6 +1,7 @@ #ifndef __XPRINT #define __XPRINT +#include #include extern void print_hex(const char c) __z88dk_fastcall; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 2aab410e..5e35afee 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -12,11 +12,10 @@ #include "transfers.h" #include "ch376.h" +#include "critical-section.h" #include "delay.h" #include "ez80-helpers.h" #include "print.h" -#include "z80.h" -#include #include #define LOWER_SAFE_RAM_ADDRESS 0x8000 @@ -108,20 +107,6 @@ usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_ return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); } -usb_error -usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { - if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0) - return USB_BAD_ADDRESS; - - if (((uint16_t)endpoint & 0xC000) == 0) - return USB_BAD_ADDRESS; - - if (((uint16_t)buffer_size & 0xC000) == 0) - return USB_BAD_ADDRESS; - - return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint); -} - /** * @brief Perform a USB data in on the specififed endpoint * @@ -145,7 +130,7 @@ usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t } /** - * @brief Perform a USB data in on the specififed endpoint + * @brief Perform a USB data in on the specified endpoint * * @param buffer the buffer to receive the data - must be 62 bytes * @param buffer_size on exit the actual size of data received diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c index fb29c190..b809de1d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c @@ -68,9 +68,9 @@ uint16_t usb_init(uint8_t state) __z88dk_fastcall { return (uint16_t)count_of_devices() << 8 | 4; } -uint8_t usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { +usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) { device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); dev->current_lba = lba; - return 0; + return USB_ERR_OK; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h index 249e894b..a2ab3b1a 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h @@ -1,8 +1,8 @@ #ifndef __USB_BASE_DRV #define __USB_BASE_DRV +#include "dev_transfers.h" #include "usb_state.h" -#include #include extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index cb16cd19..0824b4ef 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -71,7 +71,6 @@ device_config *next_device_config(const _usb_state *const usb_state, const devic return result; } -// always usb work area device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { const _usb_state *const usb_state = get_usb_work_area(); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h b/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h deleted file mode 100644 index a086bfeb..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/z80.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __Z80_HELPERS -#define __Z80_HELPERS - -#include - -#endif From 242c0047497a6ebe739ac077ed9bc44d84e6e5f3 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 22 Apr 2025 14:42:14 +1000 Subject: [PATCH 43/59] ch376-native: keyboard: cleaner separation of concerns --- Source/HBIOS/ch376-native/Makefile | 12 +- Source/HBIOS/ch376-native/keyboard.s | 1 + .../ch376-native/keyboard/kyb_driver.c.s | 175 ++++++++++-------- .../source-doc/keyboard/kyb_driver.asm | 74 ++++++++ .../source-doc/keyboard/kyb_driver.c | 17 +- .../source-doc/keyboard/kyb_driver.h | 4 +- Source/HBIOS/ch376kyb.asm | 56 +----- 7 files changed, 199 insertions(+), 140 deletions(-) create mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index a0989a7e..d16b6405 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -66,14 +66,20 @@ $$(ASSDIR)$(1).s: for dep in $$^; do dep=$$$${dep#*/} dep=$$$${dep#*/} - echo '#include "'ch376-native/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + if [ -n "$$$${dep%%*.asm}" ]; then + echo '#include "'ch376-native/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + else + echo '#include "'ch376-native/source-doc/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + fi done $$(ASSDIR)$(1)/%.c.asm: $$(SRC)$(1)/%.c; $$(compile) +# $$(ASSDIR)$(1)/%.asm: $$(SRC)$(1)/%.asm; echo $$@ $$< $(1)_C_FILES := $$(wildcard $$(SRC)$(1)/*.c) -$(1)_S_FILES := $$(patsubst ./source-doc/%, ./%, $$($(1)_C_FILES:.c=.c.s)) -./$(1).s: $$($(1)_S_FILES) +$(1)_ASM_FILES := $$(wildcard $$(SRC)$(1)/*.asm) +$(1)_C_S_FILES := $$(patsubst ./source-doc/%, ./%, $$($(1)_C_FILES:.c=.c.s)) +./$(1).s: $$($(1)_C_S_FILES) $$($(1)_ASM_FILES) endef $(eval $(call build_subsystem,base-drv)) diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index af3a439c..8ceed645 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -3,3 +3,4 @@ #include "ch376-native/keyboard/class_hid_keyboard.c.s" #include "ch376-native/keyboard/kyb-init.c.s" #include "ch376-native/keyboard/kyb_driver.c.s" +#include "ch376-native/source-doc/keyboard/kyb_driver.asm" diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index f262150b..ded935b2 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -68,51 +68,51 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb_driver.c:26: +;source-doc/keyboard/kyb_driver.c:28: #define EI __asm__("EI") ; --------------------------------- ; Function report_diff ; --------------------------------- _report_diff: -;source-doc/keyboard/kyb_driver.c:27: static uint8_t report_diff() __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:29: ld de,_report+0 -;source-doc/keyboard/kyb_driver.c:28: uint8_t *a = (uint8_t *)&report; -;source-doc/keyboard/kyb_driver.c:31: uint8_t i = sizeof(report); +;source-doc/keyboard/kyb_driver.c:30: static uint8_t report_diff() __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:33: ld b,0x08 ld hl,_previous l_report_diff_00103: -;source-doc/keyboard/kyb_driver.c:32: do { +;source-doc/keyboard/kyb_driver.c:34: uint8_t i = sizeof(report); ld a, (de) inc de ld c, (hl) inc hl sub c jr Z,l_report_diff_00104 -;source-doc/keyboard/kyb_driver.c:33: if (*a++ != *b++) +;source-doc/keyboard/kyb_driver.c:35: do { ld a,0x01 jr l_report_diff_00106 l_report_diff_00104: -;source-doc/keyboard/kyb_driver.c:34: return true; +;source-doc/keyboard/kyb_driver.c:36: if (*a++ != *b++) djnz l_report_diff_00103 -;source-doc/keyboard/kyb_driver.c:36: +;source-doc/keyboard/kyb_driver.c:38: } while (--i != 0); xor a l_report_diff_00106: -;source-doc/keyboard/kyb_driver.c:37: return false; - ret ;source-doc/keyboard/kyb_driver.c:39: + ret +;source-doc/keyboard/kyb_driver.c:41: } ; --------------------------------- ; Function report_put ; --------------------------------- _report_put: -;source-doc/keyboard/kyb_driver.c:40: static void report_put() { +;source-doc/keyboard/kyb_driver.c:42: ld a, (_alt_write_index) inc a and 0x07 ld c, a -;source-doc/keyboard/kyb_driver.c:42: +;source-doc/keyboard/kyb_driver.c:44: uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_alt_read_index) sub c ret Z -;source-doc/keyboard/kyb_driver.c:43: if (next_write_index != alt_read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb_driver.c:45: ld de,_reports+0 ld hl, (_alt_write_index) ld h,0x00 @@ -126,52 +126,52 @@ _report_put: ld hl,_report ldir pop bc -;source-doc/keyboard/kyb_driver.c:44: reports[alt_write_index] = report; +;source-doc/keyboard/kyb_driver.c:46: if (next_write_index != alt_read_index) { // Check if buffer is not full ld hl,_alt_write_index ld (hl), c -;source-doc/keyboard/kyb_driver.c:46: } +;source-doc/keyboard/kyb_driver.c:48: alt_write_index = next_write_index; ret -;source-doc/keyboard/kyb_driver.c:48: +;source-doc/keyboard/kyb_driver.c:50: } ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: ld c, a -;source-doc/keyboard/kyb_driver.c:49: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:51: ld b,0x00 ld hl,+(_report + 2) add hl, bc -;source-doc/keyboard/kyb_driver.c:50: const uint8_t key_code = report.keyCode[indx]; +;source-doc/keyboard/kyb_driver.c:52: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { ld a,(hl) ld c,a cp 0x80 jr NC,l_keyboard_buf_put_00111 or a -;source-doc/keyboard/kyb_driver.c:51: if (key_code >= 0x80 || key_code == 0) +;source-doc/keyboard/kyb_driver.c:53: const uint8_t key_code = report.keyCode[indx]; jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb_driver.c:55: uint8_t i = 6; -;source-doc/keyboard/kyb_driver.c:56: uint8_t *a = previous.keyCode; +;source-doc/keyboard/kyb_driver.c:57: // if already reported, just skip it +;source-doc/keyboard/kyb_driver.c:58: uint8_t i = 6; ld b,0x06 ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb_driver.c:57: do { +;source-doc/keyboard/kyb_driver.c:59: uint8_t *a = previous.keyCode; ld a, (hl) inc hl sub c -;source-doc/keyboard/kyb_driver.c:58: if (*a++ == key_code) +;source-doc/keyboard/kyb_driver.c:60: do { ret Z -;source-doc/keyboard/kyb_driver.c:59: return; +;source-doc/keyboard/kyb_driver.c:61: if (*a++ == key_code) djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb_driver.c:61: +;source-doc/keyboard/kyb_driver.c:63: } while (--i != 0); ld a, (_write_index) inc a and 0x07 ld b, a -;source-doc/keyboard/kyb_driver.c:62: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb_driver.c:64: ld a,(_read_index) sub b ret Z -;source-doc/keyboard/kyb_driver.c:63: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb_driver.c:65: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 @@ -186,30 +186,32 @@ l_keyboard_buf_put_00106: inc de ld a, l ld (de), a -;source-doc/keyboard/kyb_driver.c:64: buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; +;source-doc/keyboard/kyb_driver.c:66: if (next_write_index != read_index) { // Check if buffer is not full ld hl,_write_index ld (hl), b l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb_driver.c:66: } +;source-doc/keyboard/kyb_driver.c:68: write_index = next_write_index; ret -;source-doc/keyboard/kyb_driver.c:68: +;source-doc/keyboard/kyb_driver.c:70: } ; --------------------------------- ; Function usb_kyb_buf_size ; --------------------------------- _usb_kyb_buf_size: -;source-doc/keyboard/kyb_driver.c:72: +;source-doc/keyboard/kyb_driver.c:71: + DI +;source-doc/keyboard/kyb_driver.c:76: uint8_t alt_size; ld a,(_alt_write_index) ld hl,_alt_read_index sub (hl) jr C,l_usb_kyb_buf_size_00102 -;source-doc/keyboard/kyb_driver.c:73: if (alt_write_index >= alt_read_index) +;source-doc/keyboard/kyb_driver.c:77: ld a,(_alt_write_index) ld hl,_alt_read_index sub (hl) ld d, a jr l_usb_kyb_buf_size_00103 l_usb_kyb_buf_size_00102: -;source-doc/keyboard/kyb_driver.c:75: else +;source-doc/keyboard/kyb_driver.c:79: alt_size = alt_write_index - alt_read_index; ld hl, (_alt_read_index) ld a,0x08 sub l @@ -217,29 +219,29 @@ l_usb_kyb_buf_size_00102: add a, l ld d, a l_usb_kyb_buf_size_00103: -;source-doc/keyboard/kyb_driver.c:77: +;source-doc/keyboard/kyb_driver.c:81: alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; ld a, d or a jr Z,l_usb_kyb_buf_size_00105 -;source-doc/keyboard/kyb_driver.c:78: if (alt_size != 0) +;source-doc/keyboard/kyb_driver.c:82: ld a, (_alt_read_index) inc a and 0x07 ld (_alt_read_index),a l_usb_kyb_buf_size_00105: -;source-doc/keyboard/kyb_driver.c:80: +;source-doc/keyboard/kyb_driver.c:84: alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_usb_kyb_buf_size_00107 -;source-doc/keyboard/kyb_driver.c:81: if (write_index >= read_index) +;source-doc/keyboard/kyb_driver.c:85: ld a,(_write_index) ld hl,_read_index sub (hl) ld e, a jr l_usb_kyb_buf_size_00108 l_usb_kyb_buf_size_00107: -;source-doc/keyboard/kyb_driver.c:83: else +;source-doc/keyboard/kyb_driver.c:87: size = write_index - read_index; ld hl, (_read_index) ld a,0x08 sub l @@ -247,13 +249,15 @@ l_usb_kyb_buf_size_00107: add a, l ld e, a l_usb_kyb_buf_size_00108: -;source-doc/keyboard/kyb_driver.c:85: +;source-doc/keyboard/kyb_driver.c:89: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; + EI +;source-doc/keyboard/kyb_driver.c:90: xor a xor a ex de, hl -;source-doc/keyboard/kyb_driver.c:86: return (uint16_t)alt_size << 8 | (uint16_t)size; +;source-doc/keyboard/kyb_driver.c:91: EI; ret -;source-doc/keyboard/kyb_driver.c:88: +;source-doc/keyboard/kyb_driver.c:93: } ; --------------------------------- ; Function usb_kyb_buf_get_next ; --------------------------------- @@ -263,18 +267,20 @@ _usb_kyb_buf_get_next: add ix,sp push af push af -;source-doc/keyboard/kyb_driver.c:89: uint32_t usb_kyb_buf_get_next() { +;source-doc/keyboard/kyb_driver.c:94: ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_usb_kyb_buf_get_next_00102 -;source-doc/keyboard/kyb_driver.c:90: if (write_index == read_index) // Check if buffer is empty +;source-doc/keyboard/kyb_driver.c:95: uint32_t usb_kyb_buf_get_next() { ld hl,0xff00 ld e, l ld d, l jr l_usb_kyb_buf_get_next_00103 l_usb_kyb_buf_get_next_00102: -;source-doc/keyboard/kyb_driver.c:92: +;source-doc/keyboard/kyb_driver.c:97: return 0x0000FF00; // H = -1, D, E, L = 0 + DI +;source-doc/keyboard/kyb_driver.c:98: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 @@ -283,20 +289,23 @@ l_usb_kyb_buf_get_next_00102: ld c, (hl) inc hl ld b, (hl) -;source-doc/keyboard/kyb_driver.c:93: const uint8_t modifier_key = buffer[read_index] >> 8; -;source-doc/keyboard/kyb_driver.c:94: const uint8_t key_code = buffer[read_index] & 255; +;source-doc/keyboard/kyb_driver.c:99: DI; +;source-doc/keyboard/kyb_driver.c:100: const uint8_t modifier_key = buffer[read_index] >> 8; ld a, (_read_index) inc a and 0x07 - ld (_read_index),a -;source-doc/keyboard/kyb_driver.c:101: + ld hl,_read_index + ld (hl), a +;source-doc/keyboard/kyb_driver.c:101: const uint8_t key_code = buffer[read_index] & 255; + EI +;source-doc/keyboard/kyb_driver.c:107: // L: KeyCode aka scan code push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb_driver.c:103: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb_driver.c:110: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -313,50 +322,56 @@ l_usb_kyb_buf_get_next_00102: pop hl push hl l_usb_kyb_buf_get_next_00103: -;source-doc/keyboard/kyb_driver.c:104: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; +;source-doc/keyboard/kyb_driver.c:111: ld sp, ix pop ix ret -;source-doc/keyboard/kyb_driver.c:106: +;source-doc/keyboard/kyb_driver.c:113: } ; --------------------------------- ; Function usb_kyb_flush ; --------------------------------- _usb_kyb_flush: -;source-doc/keyboard/kyb_driver.c:107: void usb_kyb_flush() { +;source-doc/keyboard/kyb_driver.c:114: + DI +;source-doc/keyboard/kyb_driver.c:115: uint8_t usb_kyb_flush() __sdcccall(1) { xor a ld (_alt_read_index),a ld (_alt_write_index),a xor a ld (_read_index),a ld (_write_index),a -;source-doc/keyboard/kyb_driver.c:110: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb_driver.c:118: ld de,_previous+0 -;source-doc/keyboard/kyb_driver.c:111: uint8_t *a = (uint8_t *)previous; -;source-doc/keyboard/kyb_driver.c:112: uint8_t *b = (uint8_t *)report; +;source-doc/keyboard/kyb_driver.c:119: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb_driver.c:120: uint8_t *a = (uint8_t *)previous; ld b,0x08 ld hl,_report l_usb_kyb_flush_00101: -;source-doc/keyboard/kyb_driver.c:113: do { +;source-doc/keyboard/kyb_driver.c:121: uint8_t *b = (uint8_t *)report; xor a ld (de), a inc de -;source-doc/keyboard/kyb_driver.c:114: *a++ = 0; +;source-doc/keyboard/kyb_driver.c:122: do { ld (hl),0x00 inc hl -;source-doc/keyboard/kyb_driver.c:115: *b++ = 0; +;source-doc/keyboard/kyb_driver.c:123: *a++ = 0; djnz l_usb_kyb_flush_00101 -;source-doc/keyboard/kyb_driver.c:116: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:125: } while (--i != 0); + EI +;source-doc/keyboard/kyb_driver.c:127: EI; + xor a +;source-doc/keyboard/kyb_driver.c:128: ret -;source-doc/keyboard/kyb_driver.c:118: +;source-doc/keyboard/kyb_driver.c:130: } ; --------------------------------- ; Function usb_kyb_tick ; --------------------------------- _usb_kyb_tick: -;source-doc/keyboard/kyb_driver.c:119: void usb_kyb_tick(void) { +;source-doc/keyboard/kyb_driver.c:131: ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb_driver.c:120: if (is_in_critical_section()) +;source-doc/keyboard/kyb_driver.c:132: void usb_kyb_tick(void) { jr NZ,l_usb_kyb_tick_00112 ;././source-doc/base-drv//ch376.h:111: ld l,0x0b @@ -369,7 +384,7 @@ _usb_kyb_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:123: ch_configure_nak_retry_disable(); +;source-doc/keyboard/kyb_driver.c:135: ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -394,37 +409,37 @@ _usb_kyb_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:125: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb_driver.c:137: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); ld hl,_result ld a, (hl) or a jr NZ,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:126: if (result == 0) { +;source-doc/keyboard/kyb_driver.c:138: ch_configure_nak_retry_3s(); call _report_diff or a jr Z,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:127: if (report_diff()) { +;source-doc/keyboard/kyb_driver.c:139: if (result == 0) { call _report_put -;source-doc/keyboard/kyb_driver.c:129: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:141: report_put(); ld b,0x06 l_usb_kyb_tick_00103: -;source-doc/keyboard/kyb_driver.c:130: do { +;source-doc/keyboard/kyb_driver.c:142: uint8_t i = 6; ld a, b dec a push bc call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb_driver.c:131: keyboard_buf_put(i - 1); +;source-doc/keyboard/kyb_driver.c:143: do { djnz l_usb_kyb_tick_00103 -;source-doc/keyboard/kyb_driver.c:132: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:144: keyboard_buf_put(i - 1); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_usb_kyb_tick_00112: -;source-doc/keyboard/kyb_driver.c:135: } +;source-doc/keyboard/kyb_driver.c:147: } ret -;source-doc/keyboard/kyb_driver.c:137: +;source-doc/keyboard/kyb_driver.c:149: } ; --------------------------------- ; Function usb_kyb_init ; --------------------------------- @@ -432,22 +447,22 @@ _usb_kyb_init: push ix ld ix,0 add ix,sp -;source-doc/keyboard/kyb_driver.c:139: uint8_t result; +;source-doc/keyboard/kyb_driver.c:151: usb_error usb_kyb_init(const uint8_t dev_index) { ld a,(ix+4) call _get_usb_device_config ex de, hl ld (_keyboard_config), hl -;source-doc/keyboard/kyb_driver.c:141: +;source-doc/keyboard/kyb_driver.c:153: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); ld hl,_keyboard_config + 1 ld a, (hl) dec hl or (hl) jr NZ,l_usb_kyb_init_00102 -;source-doc/keyboard/kyb_driver.c:142: if (keyboard_config == NULL) +;source-doc/keyboard/kyb_driver.c:154: ld l,0x0f jr l_usb_kyb_init_00106 l_usb_kyb_init_00102: -;source-doc/keyboard/kyb_driver.c:144: +;source-doc/keyboard/kyb_driver.c:156: return USB_ERR_OTHER; ld a,0x01 push af inc sp @@ -456,18 +471,18 @@ l_usb_kyb_init_00102: ld l, a or a jr NZ,l_usb_kyb_init_00105 -;source-doc/keyboard/kyb_driver.c:145: CHECK(hid_set_protocol(keyboard_config, 1)); +;source-doc/keyboard/kyb_driver.c:157: ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle ld l, a -;source-doc/keyboard/kyb_driver.c:147: -;source-doc/keyboard/kyb_driver.c:148: done: +;source-doc/keyboard/kyb_driver.c:159: return hid_set_idle(keyboard_config, 0x80); +;source-doc/keyboard/kyb_driver.c:160: l_usb_kyb_init_00105: l_usb_kyb_init_00106: -;source-doc/keyboard/kyb_driver.c:149: return result; +;source-doc/keyboard/kyb_driver.c:161: done: pop ix ret _keyboard_config: diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm new file mode 100644 index 00000000..9285b572 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm @@ -0,0 +1,74 @@ + +; +; Inputs: +; None +; +; Outputs: +; A: Status / Codes Pending +; B: Number of buffered usb reports +; A': USB Report Modifier Key State (valid if B > 0) +; B', C', D', E', H', L': USB Report's 6 key codes (valid only if B > 0) +; +; Return a count of the number of key Codes Pending (A) in the keyboard buffer. +; If it is not possible to determine the actual number in the buffer, it is +; acceptable to return 1 to indicate there are key codes available to read and +; 0 if there are none available. +; The value returned in register A is used as both a Status (A) code and the +; return value. Negative values (bit 7 set) indicate a standard HBIOS result +; (error) code. Otherwise, the return value represents the number of key codes +; pending. +; +; USB Keyboard Extension: +; Returns the current USB HID keyboard report data. +; Register B contains the number of buffered reports available: +; B = 0: No reports available +; B > 0: At least one report available (will be consumed after reading) +; When a report is available (B > 0): +; A': Contains modifier key states +; B',C',D',E',H',L': Contains up to 6 concurrent key codes +; See USB HID Usage Tables specification for key codes + +_usb_kyb_report: + exx + ld hl, (_alt_read_index) + ld h,0x00 + add hl, hl + add hl, hl + add hl, hl + ld bc,_reports + add hl, bc + push hl ; address of potential que'd next usb report + + call _usb_kyb_buf_size + ld a, l + ld b, h + ex af, af' + ld a, b + or a + pop iy ; retrieve the next que'd usb_report address + jr z, no_queued_reports + + ld a, (iy) + ex af, af' + exx + ld b, (iy+2) + ld c, (iy+3) + ld d, (iy+4) + ld e, (iy+5) + ld h, (iy+6) + ld l, (iy+7) + exx + ret + +no_queued_reports: + ex af, af' + exx + ld bc, 0 + ld d, b + ld e, b + ld l, b + ld h, b + exx + ret + + diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c index 64ba8968..b16735f4 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -24,6 +24,9 @@ static keyboard_report_t *queued_report = NULL; static keyboard_report_t report = {0}; static keyboard_report_t previous = {0}; +#define DI __asm__("DI") +#define EI __asm__("EI") + static uint8_t report_diff() __sdcccall(1) { uint8_t *a = (uint8_t *)&report; uint8_t *b = (uint8_t *)&previous; @@ -67,6 +70,8 @@ static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { } uint16_t usb_kyb_buf_size() { + DI; + uint8_t size; uint8_t alt_size; @@ -83,6 +88,7 @@ uint16_t usb_kyb_buf_size() { else size = KEYBOARD_BUFFER_SIZE - read_index + write_index; + EI; return (uint16_t)alt_size << 8 | (uint16_t)size; } @@ -90,10 +96,11 @@ uint32_t usb_kyb_buf_get_next() { if (write_index == read_index) // Check if buffer is empty return 0x0000FF00; // H = -1, D, E, L = 0 + DI; const uint8_t modifier_key = buffer[read_index] >> 8; const uint8_t key_code = buffer[read_index] & 255; read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - + EI; // D: Modifier keys - aka Keystate // E: ASCII Code // H: 0 @@ -101,10 +108,12 @@ uint32_t usb_kyb_buf_get_next() { const unsigned char c = scancode_to_char(modifier_key, key_code); /* D = modifier, e-> char, H = 0, L=>code */ + return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; } -void usb_kyb_flush() { +uint8_t usb_kyb_flush() __sdcccall(1) { + DI; write_index = read_index = alt_write_index = alt_read_index = 0; uint8_t i = sizeof(previous); @@ -114,6 +123,10 @@ void usb_kyb_flush() { *a++ = 0; *b++ = 0; } while (--i != 0); + + EI; + + return 0; } void usb_kyb_tick(void) { diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h index 8d3b4f1f..0e3ef51e 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h @@ -5,8 +5,8 @@ #include extern usb_error usb_kyb_init(const uint8_t dev_index); -extern void usb_kyb_flush(); +extern uint8_t usb_kyb_flush() __sdcccall(1); extern uint32_t usb_kyb_buf_get_next(); -extern uint16_t usb_kyb_buf_size(); +// extern usb_kyb_report(); #endif diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 917a28f9..b368ac77 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -76,7 +76,6 @@ UKY_INT_SP .EQU $ - 2 VEC_CHUKB_TICK: JP HB_TICK - ; ### Function 0x4C -- Keyboard Status (VDAKST) ; ; Inputs: @@ -107,50 +106,7 @@ VEC_CHUKB_TICK: ; B',C',D',E',H',L': Contains up to 6 concurrent key codes ; See USB HID Usage Tables specification for key codes -UKY_STAT: - exx - ld hl, (_alt_read_index) - ld h,0x00 - add hl, hl - add hl, hl - add hl, hl - ld bc,_reports - add hl, bc - push hl ; address of potential que'd next usb report - - HB_DI - call _usb_kyb_buf_size - HB_EI - ld a, l - ld b, h - ex af, af' - ld a, b - or a - pop iy ; retrieve the next que'd usb_report address - jr z, no_queued_reports - - ld a, (iy) - ex af, af' - exx - ld b, (iy+2) - ld c, (iy+3) - ld d, (iy+4) - ld e, (iy+5) - ld h, (iy+6) - ld l, (iy+7) - exx - ret - -no_queued_reports: - ex af, af' - exx - ld bc, 0 - ld d, b - ld e, b - ld l, b - ld h, b - exx - ret +UKY_STAT .EQU _usb_kyb_report ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) ; @@ -162,12 +118,8 @@ no_queued_reports: ; ; Purged and all contents discarded. The Status (A) is a standard HBIOS result code. ; -UKY_FLUSH: - HB_DI - CALL _usb_kyb_flush - HB_EI - XOR A - RET +UKY_FLUSH .EQU _usb_kyb_flush + ; ; ### Function 0x4E -- Video Keyboard Read (VDAKRD) ; @@ -204,9 +156,7 @@ UKY_FLUSH: ; function keys and arrows, are returned as reserved codes. ; UKY_READ: - HB_DI CALL _usb_kyb_buf_get_next - HB_EI LD A, H OR A JR NZ, UKY_READ From d1722923fd4d089c102d916d313a68016b73faaa Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 22 Apr 2025 19:55:50 +1000 Subject: [PATCH 44/59] ch376-native: added new config CHNATIVEEZ80 to enable use of ez80's firmware version of usb support --- Source/HBIOS/Config/RCEZ80_std.asm | 5 +- Source/HBIOS/ch376-native/Makefile | 20 +++- Source/HBIOS/ch376-native/base-drv.s | 24 +++++ .../HBIOS/ch376-native/base-drv/usb_state.c.s | 14 +-- Source/HBIOS/ch376-native/ez80-firmware.asm | 91 +++++++++++++++++++ Source/HBIOS/ch376-native/keyboard.s | 8 ++ .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 28 +++--- Source/HBIOS/ch376-native/scsi-drv.s | 4 + .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 62 ++++++------- .../source-doc/base-drv/usb_state.c | 2 +- .../source-doc/base-drv/usb_state.h | 2 +- .../source-doc/keyboard/kyb-init.c | 2 +- .../source-doc/scsi-drv/scsi-init.c | 4 +- .../source-doc/ufi-drv/ufi-init.c | 4 +- Source/HBIOS/ch376-native/ufi-drv.s | 6 ++ .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 69 +++++++------- Source/HBIOS/ch376.asm | 21 +++-- Source/HBIOS/ch376kyb.asm | 9 +- Source/HBIOS/ch376scsi.asm | 1 + Source/HBIOS/ch376ufi.asm | 1 + Source/HBIOS/ez80cpudrv.asm | 52 +++++++++-- Source/HBIOS/ez80instr.inc | 17 +++- Source/HBIOS/hbios.asm | 22 ++--- 23 files changed, 341 insertions(+), 127 deletions(-) create mode 100644 Source/HBIOS/ch376-native/ez80-firmware.asm diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 97c6a788..4975e3de 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -55,7 +55,7 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ;; TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSXUKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] +TMSMODE .SET TMSMODE_MSX ;UKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] TMS80COLS .SET TRUE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -89,6 +89,7 @@ CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) -CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEEZ80 .SET TRUE EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index d16b6405..95ab59ab 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/Source/HBIOS/ch376-native/Makefile @@ -59,6 +59,8 @@ define compile echo "Compiled $(notdir $@) from $(notdir $<)" endef +FIRMWARE_ALT = kyb-init ch376_init scsi-init ufi-init hbios-driver-storage + define build_subsystem = $$(ASSDIR)$(1).s: @echo "Creating $(1).s" @@ -66,10 +68,22 @@ $$(ASSDIR)$(1).s: for dep in $$^; do dep=$$$${dep#*/} dep=$$$${dep#*/} - if [ -n "$$$${dep%%*.asm}" ]; then - echo '#include "'ch376-native/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + filename=$$$${dep##*/} + basename=$$$${filename%.*.*} + if echo "$(FIRMWARE_ALT)" | grep -w -q "$$$${basename}"; then + if [ -n "$$$${dep%%*.asm}" ]; then + echo '#include "'ch376-native/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + else + echo '#include "'ch376-native/source-doc/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + fi else - echo '#include "'ch376-native/source-doc/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + echo '#IF (!CHNATIVEEZ80)' >> $$(ASSDIR)$(1).s + if [ -n "$$$${dep%%*.asm}" ]; then + echo '#include "'ch376-native/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + else + echo '#include "'ch376-native/source-doc/$(1)/$$$${dep}'"' >> $$(ASSDIR)$(1).s + fi + echo '#ENDIF' >> $$(ASSDIR)$(1).s fi done diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index a06f93b2..e534c158 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -1,15 +1,39 @@ ; Generated File -- not to be modify directly +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/ch376.c.s" +#ENDIF #include "ch376-native/base-drv/ch376_init.c.s" +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/class_hub.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/critical-section.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/dev_transfers.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/enumerate.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/enumerate_hub.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/enumerate_storage.c.s" +#ENDIF #include "ch376-native/base-drv/hbios-driver-storage.c.s" +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/protocol.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/transfers.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/usb-base-drv.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/usb_state.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/base-drv/work-area.c.s" +#ENDIF diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 12167692..9cf0c5af 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -230,11 +230,11 @@ l_get_usb_device_config_00105: l_get_usb_device_config_00109: ;source-doc/base-drv/usb_state.c:88: } ret -;source-doc/base-drv/usb_state.c:90: usb_device_type get_usb_device_type(const uint8_t dev_index) { +;source-doc/base-drv/usb_state.c:90: usb_device_type usb_get_device_type(const uint16_t dev_index) { ; --------------------------------- -; Function get_usb_device_type +; Function usb_get_device_type ; --------------------------------- -_get_usb_device_type: +_usb_get_device_type: push ix ld ix,0 add ix,sp @@ -246,16 +246,16 @@ _get_usb_device_type: ld a,d ld h,a or e - jr NZ,l_get_usb_device_type_00102 + jr NZ,l_usb_get_device_type_00102 ;source-doc/base-drv/usb_state.c:94: return -1; ld l,0xff - jr l_get_usb_device_type_00103 -l_get_usb_device_type_00102: + jr l_usb_get_device_type_00103 +l_usb_get_device_type_00102: ;source-doc/base-drv/usb_state.c:96: return dev->type; ld a, (hl) and 0x0f ld l, a -l_get_usb_device_type_00103: +l_usb_get_device_type_00103: ;source-doc/base-drv/usb_state.c:97: } pop ix ret diff --git a/Source/HBIOS/ch376-native/ez80-firmware.asm b/Source/HBIOS/ch376-native/ez80-firmware.asm new file mode 100644 index 00000000..b83bc751 --- /dev/null +++ b/Source/HBIOS/ch376-native/ez80-firmware.asm @@ -0,0 +1,91 @@ +; delegate usb function to firmware of ez80 module + +; extern uint16_t usb_init(uint8_t state) __z88dk_fastcall; +_usb_init: + EZ80_EX_USB_INIT + RET + +; usb_error usb_scsi_seek(const uint16_t dev_index, const uint32_t lba) +_usb_scsi_seek: + ; iy+2 : dev_index + ; iy+4:5:6:7 : lba + LD IY, 0 + ADD IY, SP + EZ80_EXTN_IY_TO_MB_IY + + LD C, (IY+2) + LD_DE_IY_P_.L(4) ; LD.L DE, (IY+4) + LD L, (IY+7) + EZ80_EX_USB_STORAGE_SEEK + LD L, A + RET + +; usb_error usb_scsi_init(const uint16_t dev_index) +_usb_scsi_init: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + EZ80_EX_USB_SCSI_INIT + LD L, A + RET + +; usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer); +_usb_scsi_read: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + LD E, (IY+4) + LD D, (IY+5) + EZ80_EXTN_DE_TO_MB_DE + EZ80_EX_USB_SCSI_READ + LD L, A + RET + +; usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) +_usb_scsi_write: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + LD E, (IY+4) + LD D, (IY+5) + EZ80_EXTN_DE_TO_MB_DE + EZ80_EX_USB_SCSI_WRITE + LD L, A + RET + +; usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) +_usb_scsi_read_capacity: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + LD E, (IY+4) + LD D, (IY+5) + EZ80_EXTN_DE_TO_MB_DE + EZ80_EX_USB_SCSI_READ_CAP + LD L, A + RET + +_usb_ufi_read: +_usb_ufi_write: +_usb_ufi_get_cap: + +_usb_kyb_flush: +_usb_kyb_report: +_usb_kyb_buf_get_next: +_usb_kyb_init: + RET + +;usb_device_type usb_get_device_type(const uint16_t dev_index) +_usb_get_device_type: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + EZ80_EX_USB_GET_DEV_TYPE + LD L, A + RET + diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 8ceed645..345b8994 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -1,6 +1,14 @@ ; Generated File -- not to be modify directly +#IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/class_hid.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/class_hid_keyboard.c.s" +#ENDIF #include "ch376-native/keyboard/kyb-init.c.s" +#IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/kyb_driver.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/source-doc/keyboard/kyb_driver.asm" +#ENDIF diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 05982773..29ff5fa0 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -59,26 +59,30 @@ _keyboard_init: dec sp ;source-doc/keyboard/kyb-init.c:7: uint8_t index = 1; ;source-doc/keyboard/kyb-init.c:9: do { - ld b,0x01 - ld (ix-1),b + ld c,0x01 + ld (ix-1),c l_keyboard_init_00103: -;source-doc/keyboard/kyb-init.c:10: usb_device_type t = get_usb_device_type(index); +;source-doc/keyboard/kyb-init.c:10: usb_device_type t = usb_get_device_type(index); + ld e, c + ld d,0x00 push bc - push bc - inc sp - call _get_usb_device_type - inc sp + push de + push de + call _usb_get_device_type + pop af ld a, l + pop de pop bc ;source-doc/keyboard/kyb-init.c:12: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00104 ;source-doc/keyboard/kyb-init.c:13: print_string("\r\nUSB: KEYBOARD @ $"); + push de ld hl,kyb_init_str_0 call _print_string + pop de ;source-doc/keyboard/kyb-init.c:14: print_uint16(index); - ld l,(ix-1) - ld h,0x00 + ex de, hl call _print_uint16 ;source-doc/keyboard/kyb-init.c:15: print_string(" $"); ld hl,kyb_init_str_1 @@ -94,9 +98,9 @@ l_keyboard_init_00103: jr l_keyboard_init_00106 l_keyboard_init_00104: ;source-doc/keyboard/kyb-init.c:20: } while (++index != MAX_NUMBER_OF_DEVICES + 1); - inc b - ld (ix-1),b - ld a, b + inc c + ld (ix-1),c + ld a, c sub 0x07 jr NZ,l_keyboard_init_00103 ;source-doc/keyboard/kyb-init.c:22: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); diff --git a/Source/HBIOS/ch376-native/scsi-drv.s b/Source/HBIOS/ch376-native/scsi-drv.s index ed91cc53..3723445a 100644 --- a/Source/HBIOS/ch376-native/scsi-drv.s +++ b/Source/HBIOS/ch376-native/scsi-drv.s @@ -1,4 +1,8 @@ ; Generated File -- not to be modify directly +#IF (!CHNATIVEEZ80) #include "ch376-native/scsi-drv/class_scsi.c.s" +#ENDIF #include "ch376-native/scsi-drv/scsi-init.c.s" +#IF (!CHNATIVEEZ80) #include "ch376-native/scsi-drv/scsi_driver.c.s" +#ENDIF diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index 884b2adc..a94977e8 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -61,71 +61,71 @@ _chscsi_init: ;source-doc/scsi-drv/scsi-init.c:11: do { ld (ix-1),0x01 l_chscsi_init_00103: -;source-doc/scsi-drv/scsi-init.c:12: usb_device_type t = get_usb_device_type(index); +;source-doc/scsi-drv/scsi-init.c:12: usb_device_type t = usb_get_device_type(index); ld a,(ix-1) - push af - inc sp - call _get_usb_device_type - inc sp + ld (ix-3),a + ld (ix-2),0x00 + pop hl + push hl + push hl + call _usb_get_device_type + pop af ld a, l ;source-doc/scsi-drv/scsi-init.c:14: if (t == USB_IS_MASS_STORAGE) { sub 0x02 jr NZ,l_chscsi_init_00104 ;source-doc/scsi-drv/scsi-init.c:15: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen call _find_storage_dev -;source-doc/scsi-drv/scsi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - ld c,l - ld e,l - ld d,0x00 - ld a, e - ld b, d +;source-doc/scsi-drv/scsi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index+1; + ld a, l + ld c,0x00 add a, a - rl b + rl c add a, +((_hbios_usb_storage_devices) & 0xFF) - ld (ix-3),a - ld a, b + ld e, a + ld a, c adc a, +((_hbios_usb_storage_devices) / 256) - ld (ix-2),a - pop hl - push hl - inc c - ld (hl), c + ld d, a + ld c, e + ld b, d + ld a, l + inc a + ld (bc), a ;source-doc/scsi-drv/scsi-init.c:18: hbios_usb_storage_devices[dev_index].usb_device = index; - pop bc - push bc + ld c, e + ld b, d inc bc ld a,(ix-1) ld (bc), a ;source-doc/scsi-drv/scsi-init.c:20: print_string("\r\nUSB: MASS STORAGE @ $"); + push hl push de ld hl,scsi_init_str_0 call _print_string - pop de ;source-doc/scsi-drv/scsi-init.c:21: print_uint16(index); - ld l,(ix-1) + ld l,(ix-3) ld h,0x00 - push hl - push de call _print_uint16 ;source-doc/scsi-drv/scsi-init.c:22: print_string(":$"); ld hl,scsi_init_str_1 call _print_string pop de pop hl -;source-doc/scsi-drv/scsi-init.c:23: print_uint16(dev_index + 1); - inc de - push hl - ex de, hl +;source-doc/scsi-drv/scsi-init.c:23: print_uint16(dev_index); + ld h,0x00 + push de call _print_uint16 ;source-doc/scsi-drv/scsi-init.c:24: print_string(" $"); ld hl,scsi_init_str_2 call _print_string ;source-doc/scsi-drv/scsi-init.c:25: usb_scsi_init(index); + ld l,(ix-3) + ld h,0x00 + push hl call _usb_scsi_init pop af -;source-doc/scsi-drv/scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); pop de - push de +;source-doc/scsi-drv/scsi-init.c:26: dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); ld hl,_ch_scsi_fntbl call _dio_add_entry l_chscsi_init_00104: diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index 0824b4ef..28c2f9b0 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c @@ -87,7 +87,7 @@ device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) { return NULL; // is not a usb device } -usb_device_type get_usb_device_type(const uint8_t dev_index) { +usb_device_type usb_get_device_type(const uint16_t dev_index) { const device_config *dev = get_usb_device_config(dev_index); if (dev == NULL) diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h index a5205ee3..c360f788 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h @@ -21,6 +21,6 @@ extern device_config *find_first_free(void); extern uint8_t count_of_devices(void) __sdcccall(1); extern device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1); -extern usb_device_type get_usb_device_type(const uint8_t dev_index); +extern usb_device_type usb_get_device_type(const uint16_t dev_index); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index df623d4a..8c22724a 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -7,7 +7,7 @@ uint8_t keyboard_init(void) __sdcccall(1) { uint8_t index = 1; do { - usb_device_type t = get_usb_device_type(index); + usb_device_type t = usb_get_device_type(index); if (t == USB_IS_KEYBOARD) { print_string("\r\nUSB: KEYBOARD @ $"); diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c index cbde4ae9..481e8262 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c @@ -9,7 +9,7 @@ extern const uint16_t const ch_scsi_fntbl[]; void chscsi_init(void) { uint8_t index = 1; do { - usb_device_type t = get_usb_device_type(index); + usb_device_type t = usb_get_device_type(index); if (t == USB_IS_MASS_STORAGE) { const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen @@ -20,7 +20,7 @@ void chscsi_init(void) { print_string("\r\nUSB: MASS STORAGE @ $"); print_uint16(index); print_string(":$"); - print_uint16(dev_index + 1); + print_uint16(dev_index); print_string(" $"); usb_scsi_init(index); dio_add_entry(ch_scsi_fntbl, &hbios_usb_storage_devices[dev_index]); diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c index 7fd37bd2..4fb47fc0 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c @@ -9,7 +9,7 @@ void chufi_init(void) { uint8_t index = 1; do { - usb_device_type t = get_usb_device_type(index); + usb_device_type t = usb_get_device_type(index); if (t == USB_IS_FLOPPY) { const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen @@ -20,7 +20,7 @@ void chufi_init(void) { print_string("\r\nUSB: FLOPPY @ $"); print_uint16(index); print_string(":$"); - print_uint16(dev_index + 1); + print_uint16(dev_index); print_string(" $"); dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); } diff --git a/Source/HBIOS/ch376-native/ufi-drv.s b/Source/HBIOS/ch376-native/ufi-drv.s index fb337a02..d37ebb30 100644 --- a/Source/HBIOS/ch376-native/ufi-drv.s +++ b/Source/HBIOS/ch376-native/ufi-drv.s @@ -1,5 +1,11 @@ ; Generated File -- not to be modify directly +#IF (!CHNATIVEEZ80) #include "ch376-native/ufi-drv/class_ufi.c.s" +#ENDIF #include "ch376-native/ufi-drv/ufi-init.c.s" +#IF (!CHNATIVEEZ80) #include "ch376-native/ufi-drv/ufi_driver.c.s" +#ENDIF +#IF (!CHNATIVEEZ80) #include "ch376-native/ufi-drv/usb_cbi.c.s" +#ENDIF diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 6a75bf9a..71b36ff0 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -57,69 +57,66 @@ _chufi_init: ld ix,0 add ix,sp push af - dec sp ;source-doc/ufi-drv/ufi-init.c:11: do { ld (ix-1),0x01 l_chufi_init_00103: -;source-doc/ufi-drv/ufi-init.c:12: usb_device_type t = get_usb_device_type(index); - ld a,(ix-1) - push af - inc sp - call _get_usb_device_type - inc sp +;source-doc/ufi-drv/ufi-init.c:12: usb_device_type t = usb_get_device_type(index); + ld e,(ix-1) + ld d,0x00 + push de + push de + call _usb_get_device_type + pop af + pop de ;source-doc/ufi-drv/ufi-init.c:14: if (t == USB_IS_FLOPPY) { dec l jr NZ,l_chufi_init_00104 ;source-doc/ufi-drv/ufi-init.c:15: const uint8_t dev_index = find_storage_dev(); // dev_index == -1 (no more left) should never happen + push de call _find_storage_dev -;source-doc/ufi-drv/ufi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; - ld (ix-3),l - ld (ix-2),0x00 - ld a,l - ld c,l - ld b,0x00 - add a, a - rl b - add a, +((_hbios_usb_storage_devices) & 0xFF) - ld e, a - ld a, b - adc a, +((_hbios_usb_storage_devices) / 256) - ld d, a - ld l, e - ld h, d - inc c - ld (hl), c + ld (ix-2),l + pop de +;source-doc/ufi-drv/ufi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index+1; + ld l,(ix-2) + ld h,0x00 + add hl, hl + ld bc,_hbios_usb_storage_devices + add hl, bc + ld a,(ix-2) + inc a + ld (hl),a ;source-doc/ufi-drv/ufi-init.c:18: hbios_usb_storage_devices[dev_index].usb_device = index; - ld c, e - ld b, d - inc bc + inc hl ld a,(ix-1) - ld (bc), a + ld (hl),a + dec hl ;source-doc/ufi-drv/ufi-init.c:20: print_string("\r\nUSB: FLOPPY @ $"); + push hl push de ld hl,ufi_init_str_0 call _print_string pop de + pop hl ;source-doc/ufi-drv/ufi-init.c:21: print_uint16(index); - ld l,(ix-1) - ld h,0x00 - push de + push hl + ex de, hl call _print_uint16 ;source-doc/ufi-drv/ufi-init.c:22: print_string(":$"); ld hl,ufi_init_str_1 call _print_string - pop de -;source-doc/ufi-drv/ufi-init.c:23: print_uint16(dev_index + 1); pop hl +;source-doc/ufi-drv/ufi-init.c:23: print_uint16(dev_index); + ld e,(ix-2) + ld d,0x00 push hl - inc hl - push de + ex de, hl call _print_uint16 ;source-doc/ufi-drv/ufi-init.c:24: print_string(" $"); ld hl,ufi_init_str_2 call _print_string - pop de + pop hl ;source-doc/ufi-drv/ufi-init.c:25: dio_add_entry(ch_ufi_fntbl, &hbios_usb_storage_devices[dev_index]); + ex de, hl ld hl,_ch_ufi_fntbl call _dio_add_entry l_chufi_init_00104: diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm index 125d1322..fb87df07 100644 --- a/Source/HBIOS/ch376.asm +++ b/Source/HBIOS/ch376.asm @@ -14,6 +14,17 @@ _print_hex: ld a, l JP PRTHEXBYTE +_dio_add_entry: + LD B, H + LD C, L + JP DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE + +#IF (CHNATIVEEZ80) + +#include "./ch376-native/ez80-firmware.asm" + +#ELSE + _delay: push af call DELAY @@ -32,15 +43,13 @@ _delay_short: ; DELAY approx 1/2 second _delay_medium .EQU LDELAY -_dio_add_entry: - LD B, H - LD C, L - JP DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK DEV TABLE - +#include "./ch376-native/cruntime.asm" #include "./ch376-native/base-drv.asm" +#ENDIF + #include "./ch376-native/print.asm" -#include "./ch376-native/cruntime.asm" #include "./ch376-native/base-drv.s" CHNATIVE_INIT .EQU _chnative_init CHNATIVE_INITF .EQU _chnative_init_force + diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index b368ac77..87c337b8 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -9,13 +9,19 @@ #DEFINE DEFB .DB #DEFINE DEFW .DW +#IF (!CHNATIVEEZ80) #IF (SYSTIM == TM_NONE) .ECHO "*** ERROR: MKY REQUIRES SYSTEM TIMER -- NONE CONFIGURED!!!\n" !!! ; FORCE AN ASSEMBLY ERROR #ENDIF +#ENDIF #include "./ch376-native/keyboard.s" +#IF (CHNATIVEEZ80) +CHUKB_INIT .EQU _keyboard_init + +#ELSE ; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 2ND INTERRUPT (2/60)) SCAN_INT_PERIOD: .EQU 2 @@ -76,6 +82,8 @@ UKY_INT_SP .EQU $ - 2 VEC_CHUKB_TICK: JP HB_TICK +#ENDIF + ; ### Function 0x4C -- Keyboard Status (VDAKST) ; ; Inputs: @@ -163,4 +171,3 @@ UKY_READ: LD C, L XOR A RET - diff --git a/Source/HBIOS/ch376scsi.asm b/Source/HBIOS/ch376scsi.asm index 0aab0cef..653031cf 100644 --- a/Source/HBIOS/ch376scsi.asm +++ b/Source/HBIOS/ch376scsi.asm @@ -210,6 +210,7 @@ CH_SCSI_DEVICE: LD C, %00111010 LD D, DIODEV_USB LD E, (IY+0) ; drive_index + DEC E LD HL, 0 XOR A RET diff --git a/Source/HBIOS/ch376ufi.asm b/Source/HBIOS/ch376ufi.asm index 3154c7c5..ab2e18fb 100644 --- a/Source/HBIOS/ch376ufi.asm +++ b/Source/HBIOS/ch376ufi.asm @@ -212,6 +212,7 @@ CH_UFI_DEVICE: LD C, %11010110 LD D, DIODEV_USB LD E, (IY+0) ; drive_index + DEC E LD HL, 0 XOR A RET diff --git a/Source/HBIOS/ez80cpudrv.asm b/Source/HBIOS/ez80cpudrv.asm index 494f717b..510a8eec 100644 --- a/Source/HBIOS/ez80cpudrv.asm +++ b/Source/HBIOS/ez80cpudrv.asm @@ -40,13 +40,20 @@ EZ80_PREINIT: LD A, 5 LD (HB_CPUTYPE),A - ; DETECT IF USING ALT-FIRMWARE - LD A, C - AND $80 - LD (EZ80_ALT_FIRM), A LD (EZ80_PLT_VERSION), HL LD (EZ80_PLT_VERSION+2), DE + ; need version 0.4.x.x at miniumum + LD HL, 4-1 + XOR A + SBC HL, DE + + JR c, EZ80_VEROK + CPL + +EZ80_VEROK: + LD (EZ80_VER_WARNING), A + EXX LD A, C LD (EZ80_BUILD_DATE), A ; DAY @@ -272,11 +279,12 @@ EZ80_RPT_FIRMWARE: CALL PC_LEADING_ZERO CALL PRTDECB - LD A, (EZ80_ALT_FIRM) - OR A - RET Z - CALL PRTSTRD - .TEXT " (ALT)$" + LD A, (EZ80_VER_WARNING) + OR A + RET Z + CALL PRTSTRD + .TEXT " (WARN-VER-OOD)$" + RET PC_LEADING_ZERO: @@ -302,7 +310,7 @@ EZ80_PLT_FLSHWS: EZ80_PLT_VERSION: .DB 0, 0, 0, 0 -EZ80_ALT_FIRM: +EZ80_VER_WARNING: .DB 0 EZ80_BUILD_DATE: @@ -331,3 +339,27 @@ _EZ80_CPY_UHL_TO_EHL: .DB $49, $E1 ; POP.L HL POP IX RET + +; set the upper byte (u of DE) to MB. +_EZ80_EXTN_DE_TO_MB_DE: + PUSH IY + .DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0 + .DB $49, $FD, $39 ; ADD.L IY, SP + .DB $49, $FD, $1F, $FD ; LD.L (IY-3), DE + .DB $ED, $6E ; LD A, MB + .DB $49, $FD, $77, $FF ; LD.L (IY-1), A + .DB $49, $FD, $17, $FD ; LD.L DE, (IY-3) + POP IY + RET + +; set the upper byte (u of IY) to MB. +_EZ80_EXTN_IY_TO_MB_IY: + PUSH IX + .DB $5B, $DD, $21, $00, $00, $00 ; LD.LIL IX, 0 + .DB $49, $DD, $39 ; ADD.L IX, SP + .DB $49, $DD, $3E, $FD ; LD.L (IX-3), IY + .DB $ED, $6E ; LD A, MB + .DB $49, $DD, $77, $FF ; LD.L (IX-1), A + .DB $49, $DD, $31, $FD ; LD.L IY, (IX-3) + POP IX + RET diff --git a/Source/HBIOS/ez80instr.inc b/Source/HBIOS/ez80instr.inc index 4729f8f0..2daa3268 100644 --- a/Source/HBIOS/ez80instr.inc +++ b/Source/HBIOS/ez80instr.inc @@ -47,7 +47,13 @@ #DEFINE EZ80_TMR_IS_TICK_ISR LD A, 2 \ LD B, 10 \ EZ80_FN #DEFINE EZ80_TMR_DELAY LD A, 2 \ LD B, 11 \ EZ80_FN - #DEFINE EZ80_EX_USB_INIT LD A, 6 \ LD B, 0 \ EZ80_FN + #DEFINE EZ80_EX_USB_INIT LD A, 6 \ LD B, 255 \ EZ80_FN + #DEFINE EZ80_EX_USB_STORAGE_SEEK LD A, 6 \ LD B, 254 \ EZ80_FN + #DEFINE EZ80_EX_USB_SCSI_INIT LD A, 6 \ LD B, 253 \ EZ80_FN + #DEFINE EZ80_EX_USB_GET_DEV_TYPE LD A, 6 \ LD B, 252 \ EZ80_FN + #DEFINE EZ80_EX_USB_SCSI_READ LD A, 6 \ LD B, 0 \ EZ80_FN + #DEFINE EZ80_EX_USB_SCSI_WRITE LD A, 6 \ LD B, 1 \ EZ80_FN + #DEFINE EZ80_EX_USB_SCSI_READ_CAP LD A, 6 \ LD B, 2 \ EZ80_FN #DEFINE EZ80_THROTTLE_START(p,store) \ #DEFCONT \ PUSH AF @@ -114,6 +120,13 @@ #defcont \ .DB $49 #defcont \ SBC HL, BC + ; LD.L DE,(IY+d) $49, $FD, $17, d + #DEFINE LD_DE_IY_P_.L(dd) \ + #DEFCONT \ .DB $49 + #DEFCONT \ .DB $FD + #DEFCONT \ .DB $17 + #DEFCONT \ .DB dd + IO_SEGMENT .EQU $FF ; THE UPPER 8-BIT ADDRESS FOR I/O #DEFINE OUT_NN_A(addr) \ @@ -128,6 +141,8 @@ IO_SEGMENT .EQU $FF ; THE UPPER 8-BIT ADDRESS FOR I/O #define EZ80_CPY_EHL_TO_UHL CALL _EZ80_CPY_EHL_TO_UHL #define EZ80_CPY_UHL_TO_EHL CALL _EZ80_CPY_UHL_TO_EHL +#define EZ80_EXTN_DE_TO_MB_DE CALL _EZ80_EXTN_DE_TO_MB_DE +#DEFINE EZ80_EXTN_IY_TO_MB_IY CALL _EZ80_EXTN_IY_TO_MB_IY #ELSE #DEFINE EZ80_IO diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 322ff378..07631237 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -9263,15 +9263,6 @@ SIZ_MKY .EQU $ - ORG_MKY MEMECHO " bytes.\n" #ENDIF ; -#IF (USBKYBENABLE) -ORG_UKY .EQU $ - #INCLUDE "ch376kyb.asm" -SIZ_UKY .EQU $ - ORG_UKY - MEMECHO "CH376 USB Keyboard occupies " - MEMECHO SIZ_UKY - MEMECHO " bytes.\n" -#ENDIF -; #IF (NABUKBENABLE) ORG_NABUKB .EQU $ #INCLUDE "nabukb.asm" @@ -9487,7 +9478,7 @@ SIZ_CHNATIVE .EQU $ - ORG_CHNATIVE ORG_CHSCSI .EQU $ #INCLUDE "ch376scsi.asm" SIZ_CHSCSI .EQU $ - ORG_CHSCSI - MEMECHO "CH376 SCSI Mass Storage occupies " + MEMECHO " CH376 SCSI Mass Storage occupies " MEMECHO SIZ_CHSCSI MEMECHO " bytes.\n" #ENDIF @@ -9496,11 +9487,20 @@ SIZ_CHSCSI .EQU $ - ORG_CHSCSI ORG_CHUFI .EQU $ #INCLUDE "ch376ufi.asm" SIZ_CHUFI .EQU $ - ORG_CHUFI - MEMECHO "CH376 UFI Floppy Storage occupies " + MEMECHO " CH376 UFI Floppy Storage occupies " MEMECHO SIZ_CHUFI MEMECHO " bytes.\n" #ENDIF ; +#IF (USBKYBENABLE) +ORG_UKY .EQU $ + #INCLUDE "ch376kyb.asm" +SIZ_UKY .EQU $ - ORG_UKY + MEMECHO " CH376 USB Keyboard occupies " + MEMECHO SIZ_UKY + MEMECHO " bytes.\n" +#ENDIF +; #IF (CPUFAM == CPU_EZ80) MEMECHO "EZ80 DRIVERS\n" ORG_EZ80DRVS .EQU $ From f0133d1b1bec8e66fcf2f6a9697d0b4111cab417 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 23 Apr 2025 11:36:25 +1000 Subject: [PATCH 45/59] ch376-native: ufi driver refactor - removed use of bit fields to ensure compatibility with other c compilers --- Source/HBIOS/Config/RCEZ80_std.asm | 4 +- .../HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 2 +- .../source-doc/ufi-drv/class_ufi.c | 23 ++-- .../source-doc/ufi-drv/class_ufi.h | 71 ++++------- .../source-doc/ufi-drv/ufi_driver.c | 6 +- .../source-doc/ufi-drv/ufi_driver.h | 2 +- .../HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 114 ++++++------------ .../HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 2 +- .../HBIOS/ch376-native/ufi-drv/ufi_driver.c.s | 18 ++- 9 files changed, 82 insertions(+), 160 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 4975e3de..65ef248f 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -89,7 +89,7 @@ CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) -CHUFIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET TRUE +CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEEZ80 .SET FALSE EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index a94977e8..c8a696e9 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -76,7 +76,7 @@ l_chscsi_init_00103: jr NZ,l_chscsi_init_00104 ;source-doc/scsi-drv/scsi-init.c:15: const uint8_t dev_index = find_storage_dev(); // index == -1 (no more left) should never happen call _find_storage_dev -;source-doc/scsi-drv/scsi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index+1; +;source-doc/scsi-drv/scsi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; ld a, l ld c,0x00 add a, a diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c index 1a5048b8..5dc980e9 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c @@ -5,11 +5,11 @@ #include #include -const ufi_request_sense_command _ufi_cmd_request_sense = {0x03, 0, 0, 0, 0, 18, {0, 0, 0, 0, 0, 0, 0}}; -const ufi_read_format_capacities_command _ufi_cmd_read_format_capacities = {0x23, 0, 0, {0, 0, 0, 0, 0}, {0, 12}, {0, 0, 0}}; -const ufi_inquiry_command _ufi_cmd_inquiry = {0x12, 0, 0, 0, 0, 0, 0x24, {0, 0, 0, 0, 0, 0, 0}}; -const ufi_format_command _ufi_cmd_format = {0x04, 7, 0, 1, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0, 0}}; -const ufi_send_diagnostic_command _ufi_cmd_send_diagnostic = {0x1D, 0, 0, 1, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; +const ufi_request_sense_command _ufi_cmd_request_sense = {0x03, 0, 0, 0, 18, {0, 0, 0, 0, 0, 0, 0}}; +const ufi_read_format_capacities_command _ufi_cmd_read_format_capacities = {0x23, 0, {0, 0, 0, 0, 0}, {0, 12}, {0, 0, 0}}; +const ufi_inquiry_command _ufi_cmd_inquiry = {0x12, 0, 0, 0, 0x24, {0, 0, 0, 0, 0, 0, 0}}; +const ufi_format_command _ufi_cmd_format = {0x04, 7 | 1 << 4, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0, 0}}; +const ufi_send_diagnostic_command _ufi_cmd_send_diagnostic = {0x1D, 1 << 2, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeout_counter) { usb_error result; @@ -19,14 +19,14 @@ uint8_t wait_for_device_ready(device_config *const storage_device, uint8_t timeo memset(&sense, 0, sizeof(sense)); result = ufi_test_unit_ready(storage_device, &sense); - if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) + if ((result == USB_ERR_OK && (sense.sense_key & 15) == 0) || timeout_counter-- == 0) break; delay_medium(); } while (true); - return result | sense.sense_key; + return result | (sense.sense_key & 15); } usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_sense_response const *response) { @@ -141,13 +141,8 @@ usb_error ufi_format(device_config *const storage_device, cmd.interleave[1] = 0; cmd.parameter_list_length[1] = sizeof(parameter_list); - parameter_list.defect_list_header.side = side; - parameter_list.defect_list_header.immediate = 0; - parameter_list.defect_list_header.reserved2 = 0; - parameter_list.defect_list_header.single_track = 1; - parameter_list.defect_list_header.dcrt = 1; - parameter_list.defect_list_header.extend = 0; - parameter_list.defect_list_header.fov = 1; + parameter_list.defect_list_header.status = + FMT_DEFECT_STATUS_FOV | FMT_DEFECT_STATUS_DCRT | FMT_DEFECT_STATUS_SINGLE_TRACK | (side & 1); parameter_list.defect_list_header.defect_list_length_msb = 0; parameter_list.defect_list_header.defect_list_length_lsb = 8; memcpy(¶meter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor)); diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h index 2649fc18..73e887fc 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h @@ -14,8 +14,7 @@ typedef struct { typedef struct { uint8_t operation_code; - uint8_t reserverd1 : 5; - uint8_t lun : 3; + uint8_t lun; // in top 3 bits uint8_t reserved1[5]; uint8_t allocation_length[2]; uint8_t reserved[3]; @@ -29,8 +28,7 @@ typedef enum { UNFORMATTED_MEDIA = 1, FORMATTED_MEDIA = 2, NO_MEDIA = 3 } UFI_DE typedef struct { uint8_t number_of_blocks[4]; - uint8_t descriptor_code : 2; // UFI_DESCRIPTOR_CODE - uint8_t reserved2 : 6; + uint8_t descriptor_codex; // UFI_DESCRIPTOR_CODE uint8_t block_size[3]; } ufi_format_capacity_descriptor; @@ -48,9 +46,7 @@ typedef struct { typedef struct { uint8_t operation_code; - uint8_t evpd : 1; - uint8_t reserved1 : 4; - uint8_t lun : 3; + uint8_t lun_and_evpd; uint8_t page_code; uint8_t reserved3; uint8_t allocation_length; @@ -59,8 +55,7 @@ typedef struct { typedef struct { uint8_t operation_code; - uint8_t reserverd1 : 5; - uint8_t lun : 3; + uint8_t lun; // top 3 bits uint8_t reserved2; uint8_t reserved3; uint8_t allocation_length; @@ -70,8 +65,7 @@ typedef struct { typedef struct { uint8_t error_code; uint8_t reserved1; - uint8_t sense_key : 4; - uint8_t reserved2 : 4; + uint8_t sense_key; // lower 4 bits uint8_t information[4]; uint8_t additional_length; uint8_t reserved3[4]; @@ -84,22 +78,17 @@ typedef struct { // device_type: identifies the device currently connected to the requested logical unit. // 00h Direct-access device (floppy) // 1Fh none (no FDD connected to the requested logical unit) - uint8_t device_type : 5; - uint8_t reserved1 : 3; + uint8_t device_typex; // lower 5 bits - uint8_t reserved2 : 7; // Removable Media Bit: this shall be set to one to indicate removable media. - uint8_t removable_media : 1; + uint8_t removable_mediax; // top bit // ANSI Version: must contain a zero to comply with this version of the Specification. - uint8_t ansi_version : 3; // ISO/ECMA: These fields shall be zero for the UFI device. - uint8_t ecma : 3; - uint8_t iso_version : 2; + uint8_t version; // Response Data Format: a value of 01h shall be used for UFI device - uint8_t response_data_format : 4; - uint8_t reserved3 : 4; + uint8_t response_data_formatx; // lower 4 bits // The Additional Length field shall specify the length in bytes of the parameters. If the Allocation Length of the // Command Packet is too small to transfer all of the parameters, the Additional Length shall not be adjusted to @@ -121,16 +110,8 @@ typedef struct { typedef struct { uint8_t operation_code; /*0*/ - union { /*1*/ - uint8_t byte_1; - struct { - uint8_t rel_adr : 1; - uint8_t reserved1 : 2; - uint8_t fua : 1; - uint8_t dpo : 1; - uint8_t lun : 3; - }; - }; + uint8_t byte_1; /*1*/ + /* [7:5] lun, [4] dpo, [3] fua, [0]rel_adr*/ uint8_t lba[4]; /*2, 3, 4, 5*/ uint8_t reserved2; /*6*/ uint8_t transfer_length[2]; /*7, 8*/ @@ -140,13 +121,8 @@ typedef struct { typedef struct { struct { uint8_t reserved1; - uint8_t side : 1; - uint8_t immediate : 1; - uint8_t reserved2 : 2; - uint8_t single_track : 1; - uint8_t dcrt : 1; - uint8_t extend : 1; - uint8_t fov : 1; + /* [7] FOV, [6] Extend, [5] DCRT, [4] SingleTrack, [1] Immediate, [0] Side*/ + uint8_t status; uint8_t defect_list_length_msb; uint8_t defect_list_length_lsb; } defect_list_header; @@ -154,12 +130,17 @@ typedef struct { ufi_format_capacity_descriptor format_descriptor; } ufi_format_parameter_list; +#define FMT_DEFECT_STATUS_FOV 0x80 +#define FMT_DEFECT_STATUS_EXTEND 0x40 +#define FMT_DEFECT_STATUS_DCRT 0x20 +#define FMT_DEFECT_STATUS_SINGLE_TRACK 0x10 +#define FMT_DEFECT_STATUS_IMMEDIATE 0x02 +#define FMT_DEFECT_STATUS_SIDE 0x01 + typedef struct { uint8_t operation_code; /* 0x04 */ - uint8_t defect_list_format : 3; - uint8_t cmp_list : 1; - uint8_t format_data : 1; - uint8_t lun : 3; + /* [7:5] lun, [4]format_data, [3]cmp_list, [2:0] defect_list_format*/ + uint8_t status; uint8_t track_number; uint8_t interleave[2]; uint8_t reserved1[2]; @@ -169,12 +150,8 @@ typedef struct { typedef struct { uint8_t operation_code; /*0x1D*/ - uint8_t unit_of_l : 1; - uint8_t def_of_l : 1; - uint8_t self_test : 1; - uint8_t reserved1 : 1; - uint8_t pf : 1; - uint8_t lun : 3; + /* [7:5] lun, [4] pf, [2] self test, [1] def of l [0] unit of l*/ + uint8_t status; uint8_t reserved[10]; } ufi_send_diagnostic_command; diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c index b1b12ce5..65a7d904 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c @@ -24,7 +24,7 @@ uint32_t usb_ufi_get_cap(const uint16_t dev_index) { return convert_from_msb_first(response.descriptors[0].number_of_blocks); } -uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { +usb_error usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); if (wait_for_device_ready((device_config *)dev, 20) != 0) @@ -46,7 +46,7 @@ uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { const uint8_t asc = response.asc; const uint8_t ascq = response.ascq; - const uint8_t sense_key = response.sense_key; + const uint8_t sense_key = response.sense_key & 15; if (sense_key != 0) return -1; @@ -76,7 +76,7 @@ usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer) { const uint8_t asc = response.asc; const uint8_t ascq = response.ascq; - const uint8_t sense_key = response.sense_key; + const uint8_t sense_key = response.sense_key & 15; if (sense_key != 0) return -1; diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h index 45fee9cf..4c847bee 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h @@ -5,7 +5,7 @@ #include extern uint32_t usb_ufi_get_cap(const uint16_t dev_index); -extern uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer); +extern usb_error usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer); extern usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer); #endif diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index 82a0a022..6eaf2e9e 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -87,12 +87,10 @@ l_wait_for_device_ready_00132: ld a, l pop bc ld b, a -;source-doc/ufi-drv/class_ufi.c:22: if ((result == USB_ERR_OK && sense.sense_key == 0) || timeout_counter-- == 0) +;source-doc/ufi-drv/class_ufi.c:22: if ((result == USB_ERR_OK && (sense.sense_key & 15) == 0) || timeout_counter-- == 0) or a jr NZ,l_wait_for_device_ready_00104 - ld hl,2 - add hl, sp - ld a, (hl) + ld a,(ix-16) and 0x0f jr Z,l_wait_for_device_ready_00107 l_wait_for_device_ready_00104: @@ -107,10 +105,8 @@ l_wait_for_device_ready_00104: ;source-doc/ufi-drv/class_ufi.c:27: } while (true); jr l_wait_for_device_ready_00105 l_wait_for_device_ready_00107: -;source-doc/ufi-drv/class_ufi.c:29: return result | sense.sense_key; - ld hl,2 - add hl, sp - ld a, (hl) +;source-doc/ufi-drv/class_ufi.c:29: return result | (sense.sense_key & 15); + ld a,(ix-16) and 0x0f or b ld l, a @@ -120,7 +116,7 @@ l_wait_for_device_ready_00107: ret __ufi_cmd_request_sense: DEFB +0x03 - DEFB 0x00 + DEFB +0x00 DEFB +0x00 DEFB +0x00 DEFB +0x12 @@ -133,7 +129,7 @@ __ufi_cmd_request_sense: DEFB +0x00 __ufi_cmd_read_format_capacitie: DEFB +0x23 - DEFB 0x00 + DEFB +0x00 DEFB +0x00 DEFB +0x00 DEFB +0x00 @@ -146,7 +142,7 @@ __ufi_cmd_read_format_capacitie: DEFB +0x00 __ufi_cmd_inquiry: DEFB +0x12 - DEFB 0x00 + DEFB +0x00 DEFB +0x00 DEFB +0x00 DEFB +0x24 @@ -159,7 +155,7 @@ __ufi_cmd_inquiry: DEFB +0x00 __ufi_cmd_format: DEFB +0x04 - DEFB 0x17 + DEFB +0x17 DEFB +0x00 DEFB +0x00 DEFB +0x00 @@ -172,7 +168,7 @@ __ufi_cmd_format: DEFB +0x00 __ufi_cmd_send_diagnostic: DEFB +0x1d - DEFB 0x04 + DEFB +0x04 DEFB +0x00 DEFB +0x00 DEFB +0x00 @@ -523,8 +519,6 @@ _ufi_format: ;source-doc/ufi-drv/class_ufi.c:130: const ufi_format_capacity_descriptor *const format) { ld hl,2 add hl, sp - ld e,l - ld d,h ld b,0x06 l_ufi_format_00104: xor a @@ -534,14 +528,12 @@ l_ufi_format_00104: inc hl djnz l_ufi_format_00104 ;source-doc/ufi-drv/class_ufi.c:133: ufi_format_parameter_list parameter_list; - push de - ld hl,16 + ld hl,14 add hl, sp ex de, hl ld bc,0x000c ld hl,__ufi_cmd_format ldir - pop de ;source-doc/ufi-drv/class_ufi.c:136: ufi_format_command cmd; ld a,(ix+7) ld (ix-10),a @@ -550,62 +542,24 @@ l_ufi_format_00104: ;source-doc/ufi-drv/class_ufi.c:138: // memcpy(&cmd, &_ufi_cmd_format, sizeof(cmd)); ld (ix-4),0x0c ;source-doc/ufi-drv/class_ufi.c:140: cmd.track_number = track_number; - ld c, e - ld b, d - inc bc +;source-doc/ufi-drv/class_ufi.c:141: cmd.interleave[1] = 0; ld a,(ix+6) and 0x01 - ld l, a - ld a, (bc) - and 0xfe - or l - ld (bc), a -;source-doc/ufi-drv/class_ufi.c:141: cmd.interleave[1] = 0; - ld l, e - ld h, d - inc hl - res 1, (hl) + or 0xb0 + ld (ix-23),a ;source-doc/ufi-drv/class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list); - ld c, e - ld b, d - inc bc - ld a, (bc) - and 0xf3 - ld (bc), a -;source-doc/ufi-drv/class_ufi.c:143: - ld l, e - ld h, d - inc hl - set 4, (hl) -;source-doc/ufi-drv/class_ufi.c:144: parameter_list.defect_list_header.side = side; - ld l, e - ld h, d - inc hl - set 5, (hl) -;source-doc/ufi-drv/class_ufi.c:145: parameter_list.defect_list_header.immediate = 0; - ld l, e - ld h, d - inc hl - res 6, (hl) -;source-doc/ufi-drv/class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0; - ld l, e - ld h, d - inc hl - set 7, (hl) -;source-doc/ufi-drv/class_ufi.c:147: parameter_list.defect_list_header.single_track = 1; ld (ix-22),0x00 -;source-doc/ufi-drv/class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1; +;source-doc/ufi-drv/class_ufi.c:143: ld (ix-21),0x08 -;source-doc/ufi-drv/class_ufi.c:149: parameter_list.defect_list_header.extend = 0; - inc de - inc de - inc de - inc de +;source-doc/ufi-drv/class_ufi.c:144: parameter_list.defect_list_header.status = + ld hl,6 + add hl, sp + ex de, hl ld l,(ix+8) ld h,(ix+9) ld bc,0x0008 ldir -;source-doc/ufi-drv/class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0; +;source-doc/ufi-drv/class_ufi.c:146: parameter_list.defect_list_header.defect_list_length_msb = 0; ld hl,0 add hl, sp push hl @@ -624,12 +578,12 @@ l_ufi_format_00104: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/class_ufi.c:158: // trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list)); -;source-doc/ufi-drv/class_ufi.c:159: +;source-doc/ufi-drv/class_ufi.c:153: // trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list)); +;source-doc/ufi-drv/class_ufi.c:154: ld sp,ix pop ix ret -;source-doc/ufi-drv/class_ufi.c:161: done: +;source-doc/ufi-drv/class_ufi.c:156: done: ; --------------------------------- ; Function ufi_send_diagnostics ; --------------------------------- @@ -640,14 +594,14 @@ _ufi_send_diagnostics: ld hl, -12 add hl, sp ld sp, hl -;source-doc/ufi-drv/class_ufi.c:164: +;source-doc/ufi-drv/class_ufi.c:159: ld hl,0 add hl, sp ex de, hl ld bc,0x000c ld hl,__ufi_cmd_send_diagnostic ldir -;source-doc/ufi-drv/class_ufi.c:166: ufi_send_diagnostic_command ufi_cmd_send_diagnostic; +;source-doc/ufi-drv/class_ufi.c:161: ufi_send_diagnostic_command ufi_cmd_send_diagnostic; ld hl,0x0000 push hl push hl @@ -662,11 +616,11 @@ _ufi_send_diagnostics: ld h,(ix+5) push hl call _usb_execute_cbi -;source-doc/ufi-drv/class_ufi.c:167: +;source-doc/ufi-drv/class_ufi.c:162: ld sp,ix pop ix ret -;source-doc/ufi-drv/class_ufi.c:169: +;source-doc/ufi-drv/class_ufi.c:164: ; --------------------------------- ; Function convert_from_msb_first ; --------------------------------- @@ -676,40 +630,40 @@ _convert_from_msb_first: add ix,sp push af push af -;source-doc/ufi-drv/class_ufi.c:171: } +;source-doc/ufi-drv/class_ufi.c:166: } ld hl,0 add hl, sp ex de, hl -;source-doc/ufi-drv/class_ufi.c:172: +;source-doc/ufi-drv/class_ufi.c:167: ld l,(ix+4) ld h,(ix+5) inc hl inc hl inc hl -;source-doc/ufi-drv/class_ufi.c:174: uint32_t result; +;source-doc/ufi-drv/class_ufi.c:169: uint32_t result; ld a, (hl) dec hl ld (de), a inc de -;source-doc/ufi-drv/class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result); +;source-doc/ufi-drv/class_ufi.c:170: uint8_t *p_output = ((uint8_t *)&result); ld a, (hl) dec hl ld (de), a inc de -;source-doc/ufi-drv/class_ufi.c:176: const uint8_t *p_input = buffer + 3; +;source-doc/ufi-drv/class_ufi.c:171: const uint8_t *p_input = buffer + 3; ld a, (hl) ld (de), a inc de -;source-doc/ufi-drv/class_ufi.c:177: +;source-doc/ufi-drv/class_ufi.c:172: dec hl ld a, (hl) ld (de), a -;source-doc/ufi-drv/class_ufi.c:179: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:174: *p_output++ = *p_input--; pop hl push hl ld e,(ix-2) ld d,(ix-1) -;source-doc/ufi-drv/class_ufi.c:180: *p_output++ = *p_input--; +;source-doc/ufi-drv/class_ufi.c:175: *p_output++ = *p_input--; ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index 71b36ff0..e282a318 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -76,7 +76,7 @@ l_chufi_init_00103: call _find_storage_dev ld (ix-2),l pop de -;source-doc/ufi-drv/ufi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index+1; +;source-doc/ufi-drv/ufi-init.c:17: hbios_usb_storage_devices[dev_index].drive_index = dev_index + 1; ld l,(ix-2) ld h,0x00 add hl, hl diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s index 277d864c..53179ed6 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s @@ -132,7 +132,7 @@ l_usb_ufi_get_cap_00103: ld sp, ix pop ix ret -;source-doc/ufi-drv/ufi_driver.c:27: uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { +;source-doc/ufi-drv/ufi_driver.c:27: usb_error usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function usb_ufi_read ; --------------------------------- @@ -237,13 +237,11 @@ l_usb_ufi_read_00139: ld l,0xff jr l_usb_ufi_read_00109 l_usb_ufi_read_00106: -;source-doc/ufi-drv/ufi_driver.c:49: const uint8_t sense_key = response.sense_key; - ld hl,4 - add hl, sp - ld a, (hl) -;source-doc/ufi-drv/ufi_driver.c:51: if (sense_key != 0) +;source-doc/ufi-drv/ufi_driver.c:49: const uint8_t sense_key = response.sense_key & 15; + ld a,(ix-16) and 0x0f jr Z,l_usb_ufi_read_00108 +;source-doc/ufi-drv/ufi_driver.c:51: if (sense_key != 0) ;source-doc/ufi-drv/ufi_driver.c:52: return -1; ld l,0xff jr l_usb_ufi_read_00109 @@ -360,13 +358,11 @@ l_usb_ufi_write_00139: ld l,0xff jr l_usb_ufi_write_00109 l_usb_ufi_write_00106: -;source-doc/ufi-drv/ufi_driver.c:79: const uint8_t sense_key = response.sense_key; - ld hl,4 - add hl, sp - ld a, (hl) -;source-doc/ufi-drv/ufi_driver.c:81: if (sense_key != 0) +;source-doc/ufi-drv/ufi_driver.c:79: const uint8_t sense_key = response.sense_key & 15; + ld a,(ix-16) and 0x0f jr Z,l_usb_ufi_write_00108 +;source-doc/ufi-drv/ufi_driver.c:81: if (sense_key != 0) ;source-doc/ufi-drv/ufi_driver.c:82: return -1; ld l,0xff jr l_usb_ufi_write_00109 From b0063437404d6135abecf884ac774f2ae8d65a74 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 23 Apr 2025 12:57:00 +1000 Subject: [PATCH 46/59] ch376-native: implemented ez80 delegated version of ufi driver --- Source/HBIOS/Config/RCEZ80_std.asm | 4 +-- Source/HBIOS/ch376-native/ez80-firmware.asm | 36 ++++++++++++++++++- .../source-doc/ufi-drv/class_ufi.h | 6 ++-- Source/HBIOS/ez80instr.inc | 10 ++++-- 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 65ef248f..a25e59d4 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -88,8 +88,8 @@ CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED -CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHSCSIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET FALSE +CHNATIVEEZ80 .SET TRUE EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/ez80-firmware.asm b/Source/HBIOS/ch376-native/ez80-firmware.asm index b83bc751..2553e9d1 100644 --- a/Source/HBIOS/ch376-native/ez80-firmware.asm +++ b/Source/HBIOS/ch376-native/ez80-firmware.asm @@ -69,9 +69,44 @@ _usb_scsi_read_capacity: LD L, A RET +; extern uint8_t usb_ufi_read(const uint16_t dev_index, uint8_t *const buffer) _usb_ufi_read: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + LD E, (IY+4) + LD D, (IY+5) + EZ80_EXTN_DE_TO_MB_DE + EZ80_EX_USB_UFI_READ + LD L, A + RET + +;extern usb_error usb_ufi_write(const uint16_t dev_index, uint8_t *const buffer); _usb_ufi_write: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + LD E, (IY+4) + LD D, (IY+5) + EZ80_EXTN_DE_TO_MB_DE + EZ80_EX_USB_UFI_WRITE + LD L, A + RET + +; extern uint32_t usb_ufi_get_cap(const uint16_t dev_index) _usb_ufi_get_cap: + LD IY, 0 + ADD IY, SP + + LD C, (IY+2) + EZ80_EXTN_DE_TO_MB_DE + EZ80_EX_USB_UFI_GET_CAP ; + + LD D, E ; convert E:uHL to DE:HL + EZ80_CPY_UHL_TO_EHL + RET _usb_kyb_flush: _usb_kyb_report: @@ -88,4 +123,3 @@ _usb_get_device_type: EZ80_EX_USB_GET_DEV_TYPE LD L, A RET - diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h index 73e887fc..58df1c6e 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.h @@ -78,17 +78,17 @@ typedef struct { // device_type: identifies the device currently connected to the requested logical unit. // 00h Direct-access device (floppy) // 1Fh none (no FDD connected to the requested logical unit) - uint8_t device_typex; // lower 5 bits + uint8_t device_type; // lower 5 bits // Removable Media Bit: this shall be set to one to indicate removable media. - uint8_t removable_mediax; // top bit + uint8_t removable_media; // top bit // ANSI Version: must contain a zero to comply with this version of the Specification. // ISO/ECMA: These fields shall be zero for the UFI device. uint8_t version; // Response Data Format: a value of 01h shall be used for UFI device - uint8_t response_data_formatx; // lower 4 bits + uint8_t response_data_format; // lower 4 bits // The Additional Length field shall specify the length in bytes of the parameters. If the Allocation Length of the // Command Packet is too small to transfer all of the parameters, the Additional Length shall not be adjusted to diff --git a/Source/HBIOS/ez80instr.inc b/Source/HBIOS/ez80instr.inc index 2daa3268..873b6b27 100644 --- a/Source/HBIOS/ez80instr.inc +++ b/Source/HBIOS/ez80instr.inc @@ -49,12 +49,18 @@ #DEFINE EZ80_EX_USB_INIT LD A, 6 \ LD B, 255 \ EZ80_FN #DEFINE EZ80_EX_USB_STORAGE_SEEK LD A, 6 \ LD B, 254 \ EZ80_FN - #DEFINE EZ80_EX_USB_SCSI_INIT LD A, 6 \ LD B, 253 \ EZ80_FN - #DEFINE EZ80_EX_USB_GET_DEV_TYPE LD A, 6 \ LD B, 252 \ EZ80_FN + #DEFINE EZ80_EX_USB_GET_DEV_TYPE LD A, 6 \ LD B, 253 \ EZ80_FN + #DEFINE EZ80_EX_USB_SCSI_READ LD A, 6 \ LD B, 0 \ EZ80_FN #DEFINE EZ80_EX_USB_SCSI_WRITE LD A, 6 \ LD B, 1 \ EZ80_FN #DEFINE EZ80_EX_USB_SCSI_READ_CAP LD A, 6 \ LD B, 2 \ EZ80_FN + #DEFINE EZ80_EX_USB_SCSI_INIT LD A, 6 \ LD B, 15 \ EZ80_FN + #DEFINE EZ80_EX_USB_UFI_READ LD A, 6 \ LD B, 16 \ EZ80_FN + #DEFINE EZ80_EX_USB_UFI_WRITE LD A, 6 \ LD B, 17 \ EZ80_FN + #DEFINE EZ80_EX_USB_UFI_GET_CAP LD A, 6 \ LD B, 18 \ EZ80_FN +; #DEFINE EZ80_EX_USB_UFI_INIT LD A, 6 \ LD B, 31 \ EZ80_FN + #DEFINE EZ80_THROTTLE_START(p,store) \ #DEFCONT \ PUSH AF #DEFCONT \ PUSH BC From 253b92377dec98cf066e1ca74afaebbeb1980272 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 23 Apr 2025 14:53:15 +1000 Subject: [PATCH 47/59] ch376-native: reverted usb keyboard extensions --- Source/HBIOS/Config/RCEZ80_std.asm | 6 +- Source/HBIOS/ch376-native/keyboard.s | 3 - .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 43 +-- .../ch376-native/keyboard/kyb_driver.c.s | 338 +++++------------- .../source-doc/keyboard/kyb-init.c | 1 + .../source-doc/keyboard/kyb_driver.asm | 74 ---- .../source-doc/keyboard/kyb_driver.c | 48 +-- .../source-doc/keyboard/kyb_driver.h | 8 +- Source/HBIOS/ch376kyb.asm | 17 +- 9 files changed, 119 insertions(+), 419 deletions(-) delete mode 100644 Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index a25e59d4..7bf35783 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -55,7 +55,7 @@ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ;; TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSX ;UKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] +TMSMODE .SET TMSMODE_MSXUKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] TMS80COLS .SET TRUE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -88,8 +88,8 @@ CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED -CHSCSIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET TRUE +CHNATIVEEZ80 .SET FALSE EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 345b8994..221b24c7 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -9,6 +9,3 @@ #IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/kyb_driver.c.s" #ENDIF -#IF (!CHNATIVEEZ80) -#include "ch376-native/source-doc/keyboard/kyb_driver.asm" -#ENDIF diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index 29ff5fa0..df53d3e5 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:6: uint8_t keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:6: void keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- @@ -57,59 +57,44 @@ _keyboard_init: ld ix,0 add ix,sp dec sp -;source-doc/keyboard/kyb-init.c:7: uint8_t index = 1; ;source-doc/keyboard/kyb-init.c:9: do { - ld c,0x01 - ld (ix-1),c + ld (ix-1),0x01 l_keyboard_init_00103: ;source-doc/keyboard/kyb-init.c:10: usb_device_type t = usb_get_device_type(index); - ld e, c - ld d,0x00 - push bc - push de - push de + ld l,(ix-1) + ld h,0x00 + push hl + push hl call _usb_get_device_type pop af ld a, l - pop de - pop bc + pop hl ;source-doc/keyboard/kyb-init.c:12: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00104 ;source-doc/keyboard/kyb-init.c:13: print_string("\r\nUSB: KEYBOARD @ $"); - push de + push hl ld hl,kyb_init_str_0 call _print_string - pop de + pop hl ;source-doc/keyboard/kyb-init.c:14: print_uint16(index); - ex de, hl call _print_uint16 ;source-doc/keyboard/kyb-init.c:15: print_string(" $"); ld hl,kyb_init_str_1 call _print_string ;source-doc/keyboard/kyb-init.c:17: usb_kyb_init(index); ld a,(ix-1) - push af - inc sp call _usb_kyb_init - inc sp -;source-doc/keyboard/kyb-init.c:18: return 1; - ld a,0x01 - jr l_keyboard_init_00106 l_keyboard_init_00104: -;source-doc/keyboard/kyb-init.c:20: } while (++index != MAX_NUMBER_OF_DEVICES + 1); - inc c - ld (ix-1),c - ld a, c +;source-doc/keyboard/kyb-init.c:19: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc (ix-1) + ld a,(ix-1) sub 0x07 jr NZ,l_keyboard_init_00103 -;source-doc/keyboard/kyb-init.c:22: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:21: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:23: return 0; - xor a -l_keyboard_init_00106: -;source-doc/keyboard/kyb-init.c:24: } +;source-doc/keyboard/kyb-init.c:22: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index ded935b2..170f046e 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -41,14 +41,6 @@ _write_index: DEFS 1 _read_index: DEFS 1 -_alt_write_index: - DEFS 1 -_alt_read_index: - DEFS 1 -_reports: - DEFS 64 -_queued_report: - DEFS 2 _report: DEFS 8 _previous: @@ -68,110 +60,77 @@ _previous: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb_driver.c:28: #define EI __asm__("EI") +;source-doc/keyboard/kyb_driver.c:23: #define EI __asm__("EI") ; --------------------------------- ; Function report_diff ; --------------------------------- _report_diff: -;source-doc/keyboard/kyb_driver.c:29: +;source-doc/keyboard/kyb_driver.c:24: ld de,_report+0 -;source-doc/keyboard/kyb_driver.c:30: static uint8_t report_diff() __sdcccall(1) { -;source-doc/keyboard/kyb_driver.c:33: +;source-doc/keyboard/kyb_driver.c:25: static uint8_t report_diff() __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:28: ld b,0x08 ld hl,_previous l_report_diff_00103: -;source-doc/keyboard/kyb_driver.c:34: uint8_t i = sizeof(report); +;source-doc/keyboard/kyb_driver.c:29: uint8_t i = sizeof(report); ld a, (de) inc de ld c, (hl) inc hl sub c jr Z,l_report_diff_00104 -;source-doc/keyboard/kyb_driver.c:35: do { +;source-doc/keyboard/kyb_driver.c:30: do { ld a,0x01 jr l_report_diff_00106 l_report_diff_00104: -;source-doc/keyboard/kyb_driver.c:36: if (*a++ != *b++) +;source-doc/keyboard/kyb_driver.c:31: if (*a++ != *b++) djnz l_report_diff_00103 -;source-doc/keyboard/kyb_driver.c:38: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:33: } while (--i != 0); xor a l_report_diff_00106: -;source-doc/keyboard/kyb_driver.c:39: +;source-doc/keyboard/kyb_driver.c:34: ret -;source-doc/keyboard/kyb_driver.c:41: } -; --------------------------------- -; Function report_put -; --------------------------------- -_report_put: -;source-doc/keyboard/kyb_driver.c:42: - ld a, (_alt_write_index) - inc a - and 0x07 - ld c, a -;source-doc/keyboard/kyb_driver.c:44: uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - ld a,(_alt_read_index) - sub c - ret Z -;source-doc/keyboard/kyb_driver.c:45: - ld de,_reports+0 - ld hl, (_alt_write_index) - ld h,0x00 - add hl, hl - add hl, hl - add hl, hl - add hl, de - ex de, hl - push bc - ld bc,0x0008 - ld hl,_report - ldir - pop bc -;source-doc/keyboard/kyb_driver.c:46: if (next_write_index != alt_read_index) { // Check if buffer is not full - ld hl,_alt_write_index - ld (hl), c -;source-doc/keyboard/kyb_driver.c:48: alt_write_index = next_write_index; - ret -;source-doc/keyboard/kyb_driver.c:50: } +;source-doc/keyboard/kyb_driver.c:36: } ; --------------------------------- ; Function keyboard_buf_put ; --------------------------------- _keyboard_buf_put: ld c, a -;source-doc/keyboard/kyb_driver.c:51: +;source-doc/keyboard/kyb_driver.c:37: ld b,0x00 ld hl,+(_report + 2) add hl, bc -;source-doc/keyboard/kyb_driver.c:52: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:38: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { ld a,(hl) ld c,a cp 0x80 jr NC,l_keyboard_buf_put_00111 or a -;source-doc/keyboard/kyb_driver.c:53: const uint8_t key_code = report.keyCode[indx]; +;source-doc/keyboard/kyb_driver.c:39: const uint8_t key_code = report.keyCode[indx]; jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb_driver.c:57: // if already reported, just skip it -;source-doc/keyboard/kyb_driver.c:58: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:43: // if already reported, just skip it +;source-doc/keyboard/kyb_driver.c:44: uint8_t i = 6; ld b,0x06 ld hl,+(_previous + 2) l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb_driver.c:59: uint8_t *a = previous.keyCode; +;source-doc/keyboard/kyb_driver.c:45: uint8_t *a = previous.keyCode; ld a, (hl) inc hl sub c -;source-doc/keyboard/kyb_driver.c:60: do { +;source-doc/keyboard/kyb_driver.c:46: do { ret Z -;source-doc/keyboard/kyb_driver.c:61: if (*a++ == key_code) +;source-doc/keyboard/kyb_driver.c:47: if (*a++ == key_code) djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb_driver.c:63: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:49: } while (--i != 0); ld a, (_write_index) inc a and 0x07 ld b, a -;source-doc/keyboard/kyb_driver.c:64: +;source-doc/keyboard/kyb_driver.c:50: ld a,(_read_index) sub b ret Z -;source-doc/keyboard/kyb_driver.c:65: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb_driver.c:51: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; ld de,_buffer+0 ld hl, (_write_index) ld h,0x00 @@ -186,101 +145,66 @@ l_keyboard_buf_put_00106: inc de ld a, l ld (de), a -;source-doc/keyboard/kyb_driver.c:66: if (next_write_index != read_index) { // Check if buffer is not full +;source-doc/keyboard/kyb_driver.c:52: if (next_write_index != read_index) { // Check if buffer is not full ld hl,_write_index ld (hl), b l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb_driver.c:68: write_index = next_write_index; +;source-doc/keyboard/kyb_driver.c:54: write_index = next_write_index; ret -;source-doc/keyboard/kyb_driver.c:70: } +;source-doc/keyboard/kyb_driver.c:56: } ; --------------------------------- -; Function usb_kyb_buf_size +; Function usb_kyb_status ; --------------------------------- -_usb_kyb_buf_size: -;source-doc/keyboard/kyb_driver.c:71: +_usb_kyb_status: +;source-doc/keyboard/kyb_driver.c:57: DI -;source-doc/keyboard/kyb_driver.c:76: uint8_t alt_size; - ld a,(_alt_write_index) - ld hl,_alt_read_index - sub (hl) - jr C,l_usb_kyb_buf_size_00102 -;source-doc/keyboard/kyb_driver.c:77: - ld a,(_alt_write_index) - ld hl,_alt_read_index - sub (hl) - ld d, a - jr l_usb_kyb_buf_size_00103 -l_usb_kyb_buf_size_00102: -;source-doc/keyboard/kyb_driver.c:79: alt_size = alt_write_index - alt_read_index; - ld hl, (_alt_read_index) - ld a,0x08 - sub l - ld hl, (_alt_write_index) - add a, l - ld d, a -l_usb_kyb_buf_size_00103: -;source-doc/keyboard/kyb_driver.c:81: alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; - ld a, d - or a - jr Z,l_usb_kyb_buf_size_00105 -;source-doc/keyboard/kyb_driver.c:82: - ld a, (_alt_read_index) - inc a - and 0x07 - ld (_alt_read_index),a -l_usb_kyb_buf_size_00105: -;source-doc/keyboard/kyb_driver.c:84: alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; +;source-doc/keyboard/kyb_driver.c:61: uint8_t size; ld a,(_write_index) ld hl,_read_index sub (hl) - jr C,l_usb_kyb_buf_size_00107 -;source-doc/keyboard/kyb_driver.c:85: + jr C,l_usb_kyb_status_00102 +;source-doc/keyboard/kyb_driver.c:62: ld a,(_write_index) ld hl,_read_index sub (hl) - ld e, a - jr l_usb_kyb_buf_size_00108 -l_usb_kyb_buf_size_00107: -;source-doc/keyboard/kyb_driver.c:87: size = write_index - read_index; + jr l_usb_kyb_status_00103 +l_usb_kyb_status_00102: +;source-doc/keyboard/kyb_driver.c:64: size = write_index - read_index; ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l - ld e, a -l_usb_kyb_buf_size_00108: -;source-doc/keyboard/kyb_driver.c:89: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; +l_usb_kyb_status_00103: +;source-doc/keyboard/kyb_driver.c:66: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; EI -;source-doc/keyboard/kyb_driver.c:90: - xor a - xor a - ex de, hl -;source-doc/keyboard/kyb_driver.c:91: EI; +;source-doc/keyboard/kyb_driver.c:67: +;source-doc/keyboard/kyb_driver.c:68: EI; ret -;source-doc/keyboard/kyb_driver.c:93: } +;source-doc/keyboard/kyb_driver.c:70: } ; --------------------------------- -; Function usb_kyb_buf_get_next +; Function usb_kyb_read ; --------------------------------- -_usb_kyb_buf_get_next: +_usb_kyb_read: push ix ld ix,0 add ix,sp push af push af -;source-doc/keyboard/kyb_driver.c:94: +;source-doc/keyboard/kyb_driver.c:71: ld a,(_write_index) ld hl,_read_index sub (hl) - jr NZ,l_usb_kyb_buf_get_next_00102 -;source-doc/keyboard/kyb_driver.c:95: uint32_t usb_kyb_buf_get_next() { + jr NZ,l_usb_kyb_read_00102 +;source-doc/keyboard/kyb_driver.c:72: uint32_t usb_kyb_read() { ld hl,0xff00 ld e, l ld d, l - jr l_usb_kyb_buf_get_next_00103 -l_usb_kyb_buf_get_next_00102: -;source-doc/keyboard/kyb_driver.c:97: return 0x0000FF00; // H = -1, D, E, L = 0 + jr l_usb_kyb_read_00103 +l_usb_kyb_read_00102: +;source-doc/keyboard/kyb_driver.c:74: return 0x0000FF00; // H = -1, D, E, L = 0 DI -;source-doc/keyboard/kyb_driver.c:98: +;source-doc/keyboard/kyb_driver.c:75: ld bc,_buffer+0 ld hl, (_read_index) ld h,0x00 @@ -289,23 +213,23 @@ l_usb_kyb_buf_get_next_00102: ld c, (hl) inc hl ld b, (hl) -;source-doc/keyboard/kyb_driver.c:99: DI; -;source-doc/keyboard/kyb_driver.c:100: const uint8_t modifier_key = buffer[read_index] >> 8; +;source-doc/keyboard/kyb_driver.c:76: DI; +;source-doc/keyboard/kyb_driver.c:77: const uint8_t modifier_key = buffer[read_index] >> 8; ld a, (_read_index) inc a and 0x07 ld hl,_read_index ld (hl), a -;source-doc/keyboard/kyb_driver.c:101: const uint8_t key_code = buffer[read_index] & 255; +;source-doc/keyboard/kyb_driver.c:78: const uint8_t key_code = buffer[read_index] & 255; EI -;source-doc/keyboard/kyb_driver.c:107: // L: KeyCode aka scan code +;source-doc/keyboard/kyb_driver.c:84: // L: KeyCode aka scan code push bc ld l, c ld a, b call _scancode_to_char ld e, a pop bc -;source-doc/keyboard/kyb_driver.c:110: /* D = modifier, e-> char, H = 0, L=>code */ +;source-doc/keyboard/kyb_driver.c:87: /* D = modifier, e-> char, H = 0, L=>code */ xor a ld (ix-1),b xor a @@ -321,57 +245,54 @@ l_usb_kyb_buf_get_next_00102: ld (ix-1),a pop hl push hl -l_usb_kyb_buf_get_next_00103: -;source-doc/keyboard/kyb_driver.c:111: +l_usb_kyb_read_00103: +;source-doc/keyboard/kyb_driver.c:88: ld sp, ix pop ix ret -;source-doc/keyboard/kyb_driver.c:113: } +;source-doc/keyboard/kyb_driver.c:90: } ; --------------------------------- ; Function usb_kyb_flush ; --------------------------------- _usb_kyb_flush: -;source-doc/keyboard/kyb_driver.c:114: +;source-doc/keyboard/kyb_driver.c:91: DI -;source-doc/keyboard/kyb_driver.c:115: uint8_t usb_kyb_flush() __sdcccall(1) { - xor a - ld (_alt_read_index),a - ld (_alt_write_index),a +;source-doc/keyboard/kyb_driver.c:92: uint8_t usb_kyb_flush() __sdcccall(1) { xor a ld (_read_index),a ld (_write_index),a -;source-doc/keyboard/kyb_driver.c:118: +;source-doc/keyboard/kyb_driver.c:95: ld de,_previous+0 -;source-doc/keyboard/kyb_driver.c:119: uint8_t i = sizeof(previous); -;source-doc/keyboard/kyb_driver.c:120: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb_driver.c:96: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb_driver.c:97: uint8_t *a = (uint8_t *)previous; ld b,0x08 ld hl,_report l_usb_kyb_flush_00101: -;source-doc/keyboard/kyb_driver.c:121: uint8_t *b = (uint8_t *)report; +;source-doc/keyboard/kyb_driver.c:98: uint8_t *b = (uint8_t *)report; xor a ld (de), a inc de -;source-doc/keyboard/kyb_driver.c:122: do { +;source-doc/keyboard/kyb_driver.c:99: do { ld (hl),0x00 inc hl -;source-doc/keyboard/kyb_driver.c:123: *a++ = 0; +;source-doc/keyboard/kyb_driver.c:100: *a++ = 0; djnz l_usb_kyb_flush_00101 -;source-doc/keyboard/kyb_driver.c:125: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:102: } while (--i != 0); EI -;source-doc/keyboard/kyb_driver.c:127: EI; +;source-doc/keyboard/kyb_driver.c:104: EI; xor a -;source-doc/keyboard/kyb_driver.c:128: +;source-doc/keyboard/kyb_driver.c:105: ret -;source-doc/keyboard/kyb_driver.c:130: } +;source-doc/keyboard/kyb_driver.c:107: } ; --------------------------------- ; Function usb_kyb_tick ; --------------------------------- _usb_kyb_tick: -;source-doc/keyboard/kyb_driver.c:131: +;source-doc/keyboard/kyb_driver.c:108: ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb_driver.c:132: void usb_kyb_tick(void) { +;source-doc/keyboard/kyb_driver.c:109: void usb_kyb_tick(void) { jr NZ,l_usb_kyb_tick_00112 ;././source-doc/base-drv//ch376.h:111: ld l,0x0b @@ -384,7 +305,7 @@ _usb_kyb_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:135: +;source-doc/keyboard/kyb_driver.c:112: ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -409,81 +330,63 @@ _usb_kyb_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:137: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); +;source-doc/keyboard/kyb_driver.c:114: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); ld hl,_result ld a, (hl) or a jr NZ,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:138: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb_driver.c:115: ch_configure_nak_retry_3s(); call _report_diff or a jr Z,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:139: if (result == 0) { - call _report_put -;source-doc/keyboard/kyb_driver.c:141: report_put(); +;source-doc/keyboard/kyb_driver.c:117: if (report_diff()) { ld b,0x06 l_usb_kyb_tick_00103: -;source-doc/keyboard/kyb_driver.c:142: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:118: uint8_t i = 6; ld a, b dec a push bc call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb_driver.c:143: do { +;source-doc/keyboard/kyb_driver.c:119: do { djnz l_usb_kyb_tick_00103 -;source-doc/keyboard/kyb_driver.c:144: keyboard_buf_put(i - 1); +;source-doc/keyboard/kyb_driver.c:120: keyboard_buf_put(i - 1); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_usb_kyb_tick_00112: -;source-doc/keyboard/kyb_driver.c:147: } +;source-doc/keyboard/kyb_driver.c:123: } ret -;source-doc/keyboard/kyb_driver.c:149: } +;source-doc/keyboard/kyb_driver.c:125: } ; --------------------------------- ; Function usb_kyb_init ; --------------------------------- _usb_kyb_init: - push ix - ld ix,0 - add ix,sp -;source-doc/keyboard/kyb_driver.c:151: usb_error usb_kyb_init(const uint8_t dev_index) { - ld a,(ix+4) +;source-doc/keyboard/kyb_driver.c:126: call _get_usb_device_config ex de, hl ld (_keyboard_config), hl -;source-doc/keyboard/kyb_driver.c:153: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); +;source-doc/keyboard/kyb_driver.c:128: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); ld hl,_keyboard_config + 1 ld a, (hl) dec hl or (hl) - jr NZ,l_usb_kyb_init_00102 -;source-doc/keyboard/kyb_driver.c:154: - ld l,0x0f - jr l_usb_kyb_init_00106 -l_usb_kyb_init_00102: -;source-doc/keyboard/kyb_driver.c:156: return USB_ERR_OTHER; +;source-doc/keyboard/kyb_driver.c:129: + ret Z +;source-doc/keyboard/kyb_driver.c:131: return; ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol - ld l, a - or a - jr NZ,l_usb_kyb_init_00105 -;source-doc/keyboard/kyb_driver.c:157: +;source-doc/keyboard/kyb_driver.c:132: ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle - ld l, a -;source-doc/keyboard/kyb_driver.c:159: return hid_set_idle(keyboard_config, 0x80); -;source-doc/keyboard/kyb_driver.c:160: -l_usb_kyb_init_00105: -l_usb_kyb_init_00106: -;source-doc/keyboard/kyb_driver.c:161: done: - pop ix +;source-doc/keyboard/kyb_driver.c:133: hid_set_protocol(keyboard_config, 1); ret _keyboard_config: DEFW +0x0000 @@ -507,77 +410,6 @@ _write_index: DEFB +0x00 _read_index: DEFB +0x00 -_alt_write_index: - DEFB +0x00 -_alt_read_index: - DEFB +0x00 -_reports: - DEFB +0x00 - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 -_queued_report: - DEFW +0x0000 _report: DEFB +0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c index 8c22724a..e33d6f71 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c @@ -20,5 +20,6 @@ uint8_t keyboard_init(void) __sdcccall(1) { } while (++index != MAX_NUMBER_OF_DEVICES + 1); print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); + return 0; } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm deleted file mode 100644 index 9285b572..00000000 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.asm +++ /dev/null @@ -1,74 +0,0 @@ - -; -; Inputs: -; None -; -; Outputs: -; A: Status / Codes Pending -; B: Number of buffered usb reports -; A': USB Report Modifier Key State (valid if B > 0) -; B', C', D', E', H', L': USB Report's 6 key codes (valid only if B > 0) -; -; Return a count of the number of key Codes Pending (A) in the keyboard buffer. -; If it is not possible to determine the actual number in the buffer, it is -; acceptable to return 1 to indicate there are key codes available to read and -; 0 if there are none available. -; The value returned in register A is used as both a Status (A) code and the -; return value. Negative values (bit 7 set) indicate a standard HBIOS result -; (error) code. Otherwise, the return value represents the number of key codes -; pending. -; -; USB Keyboard Extension: -; Returns the current USB HID keyboard report data. -; Register B contains the number of buffered reports available: -; B = 0: No reports available -; B > 0: At least one report available (will be consumed after reading) -; When a report is available (B > 0): -; A': Contains modifier key states -; B',C',D',E',H',L': Contains up to 6 concurrent key codes -; See USB HID Usage Tables specification for key codes - -_usb_kyb_report: - exx - ld hl, (_alt_read_index) - ld h,0x00 - add hl, hl - add hl, hl - add hl, hl - ld bc,_reports - add hl, bc - push hl ; address of potential que'd next usb report - - call _usb_kyb_buf_size - ld a, l - ld b, h - ex af, af' - ld a, b - or a - pop iy ; retrieve the next que'd usb_report address - jr z, no_queued_reports - - ld a, (iy) - ex af, af' - exx - ld b, (iy+2) - ld c, (iy+3) - ld d, (iy+4) - ld e, (iy+5) - ld h, (iy+6) - ld l, (iy+7) - exx - ret - -no_queued_reports: - ex af, af' - exx - ld bc, 0 - ld d, b - ld e, b - ld l, b - ld h, b - exx - ret - - diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c index b16735f4..68a84ae1 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -16,13 +16,8 @@ static modifier_and_code_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; static uint8_t write_index = 0; static uint8_t read_index = 0; -static uint8_t alt_write_index = 0; -static uint8_t alt_read_index = 0; -static keyboard_report_t reports[KEYBOARD_BUFFER_SIZE] = {{0}}; - -static keyboard_report_t *queued_report = NULL; -static keyboard_report_t report = {0}; -static keyboard_report_t previous = {0}; +static keyboard_report_t report = {0}; +static keyboard_report_t previous = {0}; #define DI __asm__("DI") #define EI __asm__("EI") @@ -40,15 +35,6 @@ static uint8_t report_diff() __sdcccall(1) { return false; } -static void report_put() { - uint8_t next_write_index = (alt_write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - - if (next_write_index != alt_read_index) { // Check if buffer is not full - reports[alt_write_index] = report; - alt_write_index = next_write_index; - } -} - static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { const uint8_t key_code = report.keyCode[indx]; if (key_code >= 0x80 || key_code == 0) @@ -69,19 +55,10 @@ static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { } } -uint16_t usb_kyb_buf_size() { +uint8_t usb_kyb_status() __sdcccall(1) { DI; uint8_t size; - uint8_t alt_size; - - if (alt_write_index >= alt_read_index) - alt_size = alt_write_index - alt_read_index; - else - alt_size = KEYBOARD_BUFFER_SIZE - alt_read_index + alt_write_index; - - if (alt_size != 0) - alt_read_index = (alt_read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (write_index >= read_index) size = write_index - read_index; @@ -89,10 +66,10 @@ uint16_t usb_kyb_buf_size() { size = KEYBOARD_BUFFER_SIZE - read_index + write_index; EI; - return (uint16_t)alt_size << 8 | (uint16_t)size; + return size; } -uint32_t usb_kyb_buf_get_next() { +uint32_t usb_kyb_read() { if (write_index == read_index) // Check if buffer is empty return 0x0000FF00; // H = -1, D, E, L = 0 @@ -114,7 +91,7 @@ uint32_t usb_kyb_buf_get_next() { uint8_t usb_kyb_flush() __sdcccall(1) { DI; - write_index = read_index = alt_write_index = alt_read_index = 0; + write_index = read_index = 0; uint8_t i = sizeof(previous); uint8_t *a = (uint8_t *)previous; @@ -138,7 +115,6 @@ void usb_kyb_tick(void) { ch_configure_nak_retry_3s(); if (result == 0) { if (report_diff()) { - report_put(); uint8_t i = 6; do { keyboard_buf_put(i - 1); @@ -148,16 +124,12 @@ void usb_kyb_tick(void) { } } -usb_error usb_kyb_init(const uint8_t dev_index) { - uint8_t result; +void usb_kyb_init(const uint8_t dev_index) __sdcccall(1) { keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); if (keyboard_config == NULL) - return USB_ERR_OTHER; - - CHECK(hid_set_protocol(keyboard_config, 1)); - return hid_set_idle(keyboard_config, 0x80); + return; -done: - return result; + hid_set_protocol(keyboard_config, 1); + hid_set_idle(keyboard_config, 0x80); } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h index 0e3ef51e..b4d10c14 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h @@ -4,9 +4,9 @@ #include #include -extern usb_error usb_kyb_init(const uint8_t dev_index); -extern uint8_t usb_kyb_flush() __sdcccall(1); -extern uint32_t usb_kyb_buf_get_next(); -// extern usb_kyb_report(); +extern void usb_kyb_init(const uint8_t dev_index) __sdcccall(1); +extern uint8_t usb_kyb_flush() __sdcccall(1); +extern uint8_t usb_kyb_status() __sdcccall(1); +extern uint32_t usb_kyb_read(); #endif diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 87c337b8..7d46cd77 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -91,9 +91,6 @@ VEC_CHUKB_TICK: ; ; Outputs: ; A: Status / Codes Pending -; B: Number of buffered usb reports -; A': USB Report Modifier Key State (valid if B > 0) -; B', C', D', E', H', L': USB Report's 6 key codes (valid only if B > 0) ; ; Return a count of the number of key Codes Pending (A) in the keyboard buffer. ; If it is not possible to determine the actual number in the buffer, it is @@ -104,17 +101,7 @@ VEC_CHUKB_TICK: ; (error) code. Otherwise, the return value represents the number of key codes ; pending. ; -; USB Keyboard Extension: -; Returns the current USB HID keyboard report data. -; Register B contains the number of buffered reports available: -; B = 0: No reports available -; B > 0: At least one report available (will be consumed after reading) -; When a report is available (B > 0): -; A': Contains modifier key states -; B',C',D',E',H',L': Contains up to 6 concurrent key codes -; See USB HID Usage Tables specification for key codes - -UKY_STAT .EQU _usb_kyb_report +UKY_STAT: .EQU _usb_kyb_status ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) ; @@ -164,7 +151,7 @@ UKY_FLUSH .EQU _usb_kyb_flush ; function keys and arrows, are returned as reserved codes. ; UKY_READ: - CALL _usb_kyb_buf_get_next + CALL _usb_kyb_read LD A, H OR A JR NZ, UKY_READ From b62b8639a660cfa2b426b5d22a9c41b656fd40d6 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 24 Apr 2025 12:31:58 +1000 Subject: [PATCH 48/59] ch376-native: updated keyboard driver 1. fix handling of caps-lock 2. removed support for returning scancode/bitfields for hbios call --- Source/HBIOS/ch376-native/ez80-firmware.asm | 24 +- .../keyboard/class_hid_keyboard.c.s | 176 ++++++------- .../HBIOS/ch376-native/keyboard/kyb-init.c.s | 40 ++- .../ch376-native/keyboard/kyb_driver.c.s | 248 ++++++++---------- .../source-doc/keyboard/class_hid_keyboard.c | 14 +- .../source-doc/keyboard/class_hid_keyboard.h | 3 +- .../source-doc/keyboard/kyb_driver.c | 49 ++-- .../source-doc/keyboard/kyb_driver.h | 2 +- Source/HBIOS/ch376kyb.asm | 20 +- Source/HBIOS/ez80instr.inc | 7 +- 10 files changed, 277 insertions(+), 306 deletions(-) diff --git a/Source/HBIOS/ch376-native/ez80-firmware.asm b/Source/HBIOS/ch376-native/ez80-firmware.asm index 2553e9d1..2cce1a71 100644 --- a/Source/HBIOS/ch376-native/ez80-firmware.asm +++ b/Source/HBIOS/ch376-native/ez80-firmware.asm @@ -108,12 +108,30 @@ _usb_ufi_get_cap: EZ80_CPY_UHL_TO_EHL RET -_usb_kyb_flush: -_usb_kyb_report: -_usb_kyb_buf_get_next: +; extern void usb_kyb_init(const uint8_t dev_index) __sdcccall(1); _usb_kyb_init: + LD C, A + EZ80_EX_USB_KYB_INIT RET +; extern uint8_t usb_kyb_flush() __sdcccall(1); +_usb_kyb_flush: + EZ80_EX_USB_KYB_FLUSH + RET + +; extern uint8_t usb_kyb_status() __sdcccall(1); +_usb_kyb_status: + EZ80_EX_USB_KYB_STATUS + RET + +; extern uint16_t usb_kyb_read(); +; H = 0/1 set if char, L=>code +_usb_kyb_read: + EZ80_EX_USB_KYB_READ + LD H, A + RET + + ;usb_device_type usb_get_device_type(const uint16_t dev_index) _usb_get_device_type: LD IY, 0 diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s index 0c16292f..4e690852 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s @@ -30,8 +30,6 @@ ; .area _INITIALIZED removed by z88dk -_caps_lock_engaged: - DEFS 1 _scancodes_shift_table: DEFS 128 _scancodes_table: @@ -51,153 +49,137 @@ _scancodes_table: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/class_hid_keyboard.c:337: }; +;source-doc/keyboard/class_hid_keyboard.c:334: }; ; --------------------------------- ; Function char_with_caps_lock ; --------------------------------- _char_with_caps_lock: - ld c, a -;source-doc/keyboard/class_hid_keyboard.c:338: - ld hl,_caps_lock_engaged - bit 0, (hl) - jr NZ,l_char_with_caps_lock_00102 -;source-doc/keyboard/class_hid_keyboard.c:339: char char_with_caps_lock(const char c) __sdcccall(1) { - ld a, c - jr l_char_with_caps_lock_00109 -l_char_with_caps_lock_00102: -;source-doc/keyboard/class_hid_keyboard.c:341: return c; - ld a, c - sub 0x41 - jr C,l_char_with_caps_lock_00104 - ld a,0x5a - sub c +;source-doc/keyboard/class_hid_keyboard.c:335: + bit 0, l +;source-doc/keyboard/class_hid_keyboard.c:336: static char char_with_caps_lock(const char c, const bool caps_lock_engaged) __sdcccall(1) { + jr Z,l_char_with_caps_lock_00109 +;source-doc/keyboard/class_hid_keyboard.c:338: return c; + cp 0x41 jr C,l_char_with_caps_lock_00104 -;source-doc/keyboard/class_hid_keyboard.c:342: - ld a, c + cp 0x5b + jr NC,l_char_with_caps_lock_00104 +;source-doc/keyboard/class_hid_keyboard.c:339: add a,0x20 jr l_char_with_caps_lock_00109 l_char_with_caps_lock_00104: -;source-doc/keyboard/class_hid_keyboard.c:344: return c - 'A' + 'a'; - ld a, c - sub 0x61 - jr C,l_char_with_caps_lock_00107 - ld a,0x7a - sub c - jr C,l_char_with_caps_lock_00107 -;source-doc/keyboard/class_hid_keyboard.c:345: - ld a, c +;source-doc/keyboard/class_hid_keyboard.c:341: return c - 'A' + 'a'; + cp 0x61 + ret C + cp 0x7b + ret NC +;source-doc/keyboard/class_hid_keyboard.c:342: add a,0xe0 - jr l_char_with_caps_lock_00109 -l_char_with_caps_lock_00107: -;source-doc/keyboard/class_hid_keyboard.c:347: return c - 'a' + 'A'; - ld a, c +;source-doc/keyboard/class_hid_keyboard.c:344: return c - 'a' + 'A'; l_char_with_caps_lock_00109: -;source-doc/keyboard/class_hid_keyboard.c:348: +;source-doc/keyboard/class_hid_keyboard.c:345: ret -;source-doc/keyboard/class_hid_keyboard.c:350: } +;source-doc/keyboard/class_hid_keyboard.c:347: } ; --------------------------------- ; Function scancode_to_char ; --------------------------------- _scancode_to_char: - ld c, a -;source-doc/keyboard/class_hid_keyboard.c:351: - ld a,l + push ix + ld ix,0 + add ix,sp +;source-doc/keyboard/class_hid_keyboard.c:348: + ld c,a ld e,l - sub 0x80 - jr C,l_scancode_to_char_00102 -;source-doc/keyboard/class_hid_keyboard.c:352: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { - xor a - jr l_scancode_to_char_00123 -l_scancode_to_char_00102: -;source-doc/keyboard/class_hid_keyboard.c:354: return 0; - ld a, c and 0x11 - jr Z,l_scancode_to_char_00120 -;source-doc/keyboard/class_hid_keyboard.c:355: + jr Z,l_scancode_to_char_00118 +;source-doc/keyboard/class_hid_keyboard.c:349: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code, const bool caps_lock_engaged) __sdcccall(1) { ld a, e sub 0x04 - jr C,l_scancode_to_char_00104 + jr C,l_scancode_to_char_00102 ld a,0x1d sub e - jr C,l_scancode_to_char_00104 -;source-doc/keyboard/class_hid_keyboard.c:356: if ((modifier_keys & (KEY_MOD_LCTRL | KEY_MOD_RCTRL))) { + jr C,l_scancode_to_char_00102 +;source-doc/keyboard/class_hid_keyboard.c:350: if ((modifier_keys & (KEY_MOD_LCTRL | KEY_MOD_RCTRL))) { ld a, e add a,0xfd - jr l_scancode_to_char_00123 -l_scancode_to_char_00104: -;source-doc/keyboard/class_hid_keyboard.c:358: return code - 3; + jr l_scancode_to_char_00121 +l_scancode_to_char_00102: +;source-doc/keyboard/class_hid_keyboard.c:352: return code - 3; ld a,e cp 0x1f - jr Z,l_scancode_to_char_00106 + jr Z,l_scancode_to_char_00104 sub 0x2c - jr NZ,l_scancode_to_char_00107 -l_scancode_to_char_00106: -;source-doc/keyboard/class_hid_keyboard.c:359: + jr NZ,l_scancode_to_char_00105 +l_scancode_to_char_00104: +;source-doc/keyboard/class_hid_keyboard.c:353: xor a - jr l_scancode_to_char_00123 -l_scancode_to_char_00107: -;source-doc/keyboard/class_hid_keyboard.c:361: return 0; + jr l_scancode_to_char_00121 +l_scancode_to_char_00105: +;source-doc/keyboard/class_hid_keyboard.c:355: return 0; ld a, e sub 0x2f - jr NZ,l_scancode_to_char_00110 -;source-doc/keyboard/class_hid_keyboard.c:362: + jr NZ,l_scancode_to_char_00108 +;source-doc/keyboard/class_hid_keyboard.c:356: ld a,0x1b - jr l_scancode_to_char_00123 -l_scancode_to_char_00110: -;source-doc/keyboard/class_hid_keyboard.c:364: return 27; + jr l_scancode_to_char_00121 +l_scancode_to_char_00108: +;source-doc/keyboard/class_hid_keyboard.c:358: return 27; ld a, e sub 0x31 - jr NZ,l_scancode_to_char_00112 -;source-doc/keyboard/class_hid_keyboard.c:365: + jr NZ,l_scancode_to_char_00110 +;source-doc/keyboard/class_hid_keyboard.c:359: ld a,0x1c - jr l_scancode_to_char_00123 -l_scancode_to_char_00112: -;source-doc/keyboard/class_hid_keyboard.c:367: return 28; + jr l_scancode_to_char_00121 +l_scancode_to_char_00110: +;source-doc/keyboard/class_hid_keyboard.c:361: return 28; ld a, e sub 0x30 - jr NZ,l_scancode_to_char_00114 -;source-doc/keyboard/class_hid_keyboard.c:368: + jr NZ,l_scancode_to_char_00112 +;source-doc/keyboard/class_hid_keyboard.c:362: ld a,0x1d - jr l_scancode_to_char_00123 -l_scancode_to_char_00114: -;source-doc/keyboard/class_hid_keyboard.c:370: return 29; + jr l_scancode_to_char_00121 +l_scancode_to_char_00112: +;source-doc/keyboard/class_hid_keyboard.c:364: return 29; ld a, e sub 0x23 - jr NZ,l_scancode_to_char_00116 -;source-doc/keyboard/class_hid_keyboard.c:371: + jr NZ,l_scancode_to_char_00114 +;source-doc/keyboard/class_hid_keyboard.c:365: ld a,0x1e - jr l_scancode_to_char_00123 -l_scancode_to_char_00116: -;source-doc/keyboard/class_hid_keyboard.c:373: return 30; + jr l_scancode_to_char_00121 +l_scancode_to_char_00114: +;source-doc/keyboard/class_hid_keyboard.c:367: return 30; ld a, e sub 0x2d - jr NZ,l_scancode_to_char_00120 -;source-doc/keyboard/class_hid_keyboard.c:374: + jr NZ,l_scancode_to_char_00118 +;source-doc/keyboard/class_hid_keyboard.c:368: ld a,0x1f - jr l_scancode_to_char_00123 -l_scancode_to_char_00120: -;source-doc/keyboard/class_hid_keyboard.c:377: } + jr l_scancode_to_char_00121 +l_scancode_to_char_00118: +;source-doc/keyboard/class_hid_keyboard.c:371: } ld a, c and 0x22 - jr Z,l_scancode_to_char_00122 -;source-doc/keyboard/class_hid_keyboard.c:378: + jr Z,l_scancode_to_char_00120 +;source-doc/keyboard/class_hid_keyboard.c:372: ld d,0x00 ld hl,_scancodes_shift_table add hl, de ld a, (hl) - jp _char_with_caps_lock -l_scancode_to_char_00122: -;source-doc/keyboard/class_hid_keyboard.c:380: return char_with_caps_lock(scancodes_shift_table[code]); + ld l,(ix+4) + call _char_with_caps_lock + jr l_scancode_to_char_00121 +l_scancode_to_char_00120: +;source-doc/keyboard/class_hid_keyboard.c:374: return char_with_caps_lock(scancodes_shift_table[code], caps_lock_engaged); ld d,0x00 ld hl,_scancodes_table add hl, de ld a, (hl) - jp _char_with_caps_lock -l_scancode_to_char_00123: -;source-doc/keyboard/class_hid_keyboard.c:381: - ret -_caps_lock_engaged: - DEFB +0x01 + ld l,(ix+4) + call _char_with_caps_lock +l_scancode_to_char_00121: +;source-doc/keyboard/class_hid_keyboard.c:375: + pop ix + pop hl + inc sp + jp (hl) _scancodes_shift_table: DEFB +0x00 DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index df53d3e5..af030411 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/keyboard/kyb-init.c:6: void keyboard_init(void) __sdcccall(1) { +;source-doc/keyboard/kyb-init.c:6: uint8_t keyboard_init(void) __sdcccall(1) { ; --------------------------------- ; Function keyboard_init ; --------------------------------- @@ -57,27 +57,32 @@ _keyboard_init: ld ix,0 add ix,sp dec sp +;source-doc/keyboard/kyb-init.c:7: uint8_t index = 1; ;source-doc/keyboard/kyb-init.c:9: do { - ld (ix-1),0x01 + ld c,0x01 + ld (ix-1),c l_keyboard_init_00103: ;source-doc/keyboard/kyb-init.c:10: usb_device_type t = usb_get_device_type(index); - ld l,(ix-1) - ld h,0x00 - push hl - push hl + ld e, c + ld d,0x00 + push bc + push de + push de call _usb_get_device_type pop af ld a, l - pop hl + pop de + pop bc ;source-doc/keyboard/kyb-init.c:12: if (t == USB_IS_KEYBOARD) { sub 0x04 jr NZ,l_keyboard_init_00104 ;source-doc/keyboard/kyb-init.c:13: print_string("\r\nUSB: KEYBOARD @ $"); - push hl + push de ld hl,kyb_init_str_0 call _print_string - pop hl + pop de ;source-doc/keyboard/kyb-init.c:14: print_uint16(index); + ex de, hl call _print_uint16 ;source-doc/keyboard/kyb-init.c:15: print_string(" $"); ld hl,kyb_init_str_1 @@ -85,16 +90,23 @@ l_keyboard_init_00103: ;source-doc/keyboard/kyb-init.c:17: usb_kyb_init(index); ld a,(ix-1) call _usb_kyb_init +;source-doc/keyboard/kyb-init.c:18: return 1; + ld a,0x01 + jr l_keyboard_init_00106 l_keyboard_init_00104: -;source-doc/keyboard/kyb-init.c:19: } while (++index != MAX_NUMBER_OF_DEVICES + 1); - inc (ix-1) - ld a,(ix-1) +;source-doc/keyboard/kyb-init.c:20: } while (++index != MAX_NUMBER_OF_DEVICES + 1); + inc c + ld (ix-1),c + ld a, c sub 0x07 jr NZ,l_keyboard_init_00103 -;source-doc/keyboard/kyb-init.c:21: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); +;source-doc/keyboard/kyb-init.c:22: print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); ld hl,kyb_init_str_2 call _print_string -;source-doc/keyboard/kyb-init.c:22: } +;source-doc/keyboard/kyb-init.c:24: return 0; + xor a +l_keyboard_init_00106: +;source-doc/keyboard/kyb-init.c:25: } inc sp pop ix ret diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index 170f046e..964dbaeb 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -33,10 +33,12 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk +_caps_lock_engaged: + DEFS 1 _keyboard_config: DEFS 2 _buffer: - DEFS 16 + DEFS 8 _write_index: DEFS 1 _read_index: @@ -102,197 +104,180 @@ _keyboard_buf_put: add hl, bc ;source-doc/keyboard/kyb_driver.c:38: static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { ld a,(hl) - ld c,a - cp 0x80 - jr NC,l_keyboard_buf_put_00111 + ld e,a + sub 0x80 + jr NC,l_keyboard_buf_put_00112 + ld a, e or a ;source-doc/keyboard/kyb_driver.c:39: const uint8_t key_code = report.keyCode[indx]; - jr Z,l_keyboard_buf_put_00111 -;source-doc/keyboard/kyb_driver.c:43: // if already reported, just skip it -;source-doc/keyboard/kyb_driver.c:44: uint8_t i = 6; - ld b,0x06 + jr Z,l_keyboard_buf_put_00112 +;source-doc/keyboard/kyb_driver.c:42: + ld b,0x00 ld hl,+(_previous + 2) -l_keyboard_buf_put_00106: -;source-doc/keyboard/kyb_driver.c:45: uint8_t *a = previous.keyCode; + add hl, bc ld a, (hl) - inc hl - sub c -;source-doc/keyboard/kyb_driver.c:46: do { + sub e +;source-doc/keyboard/kyb_driver.c:43: // if already reported, just skip it + jr Z,l_keyboard_buf_put_00112 +;source-doc/keyboard/kyb_driver.c:45: return; + ld a, e + sub 0x39 + jr NZ,l_keyboard_buf_put_00107 +;source-doc/keyboard/kyb_driver.c:46: + ld hl,_caps_lock_engaged + ld a, (hl) + xor 0x01 + ld (hl), a +;source-doc/keyboard/kyb_driver.c:47: if (key_code == KEY_CODE_CAPS_LOCK) { + jr l_keyboard_buf_put_00112 +l_keyboard_buf_put_00107: +;source-doc/keyboard/kyb_driver.c:50: } + ld a,(_report) + ld hl,_caps_lock_engaged + ld h, (hl) + push hl + inc sp + ld l, e + call _scancode_to_char + ld b, a +;source-doc/keyboard/kyb_driver.c:52: const unsigned char c = scancode_to_char(report.bModifierKeys, key_code, caps_lock_engaged); + or a +;source-doc/keyboard/kyb_driver.c:53: ret Z -;source-doc/keyboard/kyb_driver.c:47: if (*a++ == key_code) - djnz l_keyboard_buf_put_00106 -;source-doc/keyboard/kyb_driver.c:49: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:55: return; ld a, (_write_index) inc a and 0x07 - ld b, a -;source-doc/keyboard/kyb_driver.c:50: - ld a,(_read_index) - sub b + ld c, a +;source-doc/keyboard/kyb_driver.c:56: + ld hl,_read_index + ld a, (hl) + sub c ret Z -;source-doc/keyboard/kyb_driver.c:51: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; - ld de,_buffer+0 - ld hl, (_write_index) +;source-doc/keyboard/kyb_driver.c:57: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + ld hl,(_write_index) ld h,0x00 - add hl, hl - add hl, de - ex de, hl - ld hl,(_report) - xor a - xor a - ld a, c - ld (de), a - inc de - ld a, l - ld (de), a -;source-doc/keyboard/kyb_driver.c:52: if (next_write_index != read_index) { // Check if buffer is not full + ld de,_buffer + add hl,de + ld a,b + ld (hl),a ld hl,_write_index - ld (hl), b -l_keyboard_buf_put_00111: -;source-doc/keyboard/kyb_driver.c:54: write_index = next_write_index; +;source-doc/keyboard/kyb_driver.c:58: if (next_write_index != read_index) { // Check if buffer is not full + ld (hl), c +l_keyboard_buf_put_00112: +;source-doc/keyboard/kyb_driver.c:60: write_index = next_write_index; ret -;source-doc/keyboard/kyb_driver.c:56: } +;source-doc/keyboard/kyb_driver.c:62: } ; --------------------------------- ; Function usb_kyb_status ; --------------------------------- _usb_kyb_status: -;source-doc/keyboard/kyb_driver.c:57: +;source-doc/keyboard/kyb_driver.c:63: DI -;source-doc/keyboard/kyb_driver.c:61: uint8_t size; +;source-doc/keyboard/kyb_driver.c:67: uint8_t size; ld a,(_write_index) ld hl,_read_index sub (hl) jr C,l_usb_kyb_status_00102 -;source-doc/keyboard/kyb_driver.c:62: +;source-doc/keyboard/kyb_driver.c:68: ld a,(_write_index) ld hl,_read_index sub (hl) jr l_usb_kyb_status_00103 l_usb_kyb_status_00102: -;source-doc/keyboard/kyb_driver.c:64: size = write_index - read_index; +;source-doc/keyboard/kyb_driver.c:70: size = write_index - read_index; ld hl, (_read_index) ld a,0x08 sub l ld hl, (_write_index) add a, l l_usb_kyb_status_00103: -;source-doc/keyboard/kyb_driver.c:66: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; +;source-doc/keyboard/kyb_driver.c:72: size = KEYBOARD_BUFFER_SIZE - read_index + write_index; EI -;source-doc/keyboard/kyb_driver.c:67: -;source-doc/keyboard/kyb_driver.c:68: EI; +;source-doc/keyboard/kyb_driver.c:73: +;source-doc/keyboard/kyb_driver.c:74: EI; ret -;source-doc/keyboard/kyb_driver.c:70: } +;source-doc/keyboard/kyb_driver.c:76: } ; --------------------------------- ; Function usb_kyb_read ; --------------------------------- _usb_kyb_read: - push ix - ld ix,0 - add ix,sp - push af - push af -;source-doc/keyboard/kyb_driver.c:71: +;source-doc/keyboard/kyb_driver.c:77: ld a,(_write_index) ld hl,_read_index sub (hl) jr NZ,l_usb_kyb_read_00102 -;source-doc/keyboard/kyb_driver.c:72: uint32_t usb_kyb_read() { +;source-doc/keyboard/kyb_driver.c:78: uint16_t usb_kyb_read() { ld hl,0xff00 - ld e, l - ld d, l jr l_usb_kyb_read_00103 l_usb_kyb_read_00102: -;source-doc/keyboard/kyb_driver.c:74: return 0x0000FF00; // H = -1, D, E, L = 0 +;source-doc/keyboard/kyb_driver.c:80: return 0xFF00; // H = -1, L = 0 DI -;source-doc/keyboard/kyb_driver.c:75: - ld bc,_buffer+0 - ld hl, (_read_index) +;source-doc/keyboard/kyb_driver.c:81: + ld hl,(_read_index) ld h,0x00 - add hl, hl - add hl, bc - ld c, (hl) - inc hl - ld b, (hl) -;source-doc/keyboard/kyb_driver.c:76: DI; -;source-doc/keyboard/kyb_driver.c:77: const uint8_t modifier_key = buffer[read_index] >> 8; + ld bc,_buffer + add hl,bc + ld a,(hl) + ld c,l + ld b,h + ld hl,_read_index + ld l, a +;source-doc/keyboard/kyb_driver.c:82: DI; ld a, (_read_index) inc a and 0x07 - ld hl,_read_index - ld (hl), a -;source-doc/keyboard/kyb_driver.c:78: const uint8_t key_code = buffer[read_index] & 255; + ld (_read_index), a +;source-doc/keyboard/kyb_driver.c:83: const uint8_t c = buffer[read_index]; EI -;source-doc/keyboard/kyb_driver.c:84: // L: KeyCode aka scan code - push bc - ld l, c - ld a, b - call _scancode_to_char - ld e, a - pop bc -;source-doc/keyboard/kyb_driver.c:87: /* D = modifier, e-> char, H = 0, L=>code */ - xor a - ld (ix-1),b - xor a - ld (ix-4),a - ld (ix-3),a - ld (ix-2),a - xor a - ld d,(ix-1) - ld (ix-4),c - xor a - ld (ix-3),a - ld (ix-2),a - ld (ix-1),a - pop hl - push hl +;source-doc/keyboard/kyb_driver.c:86: + ld h,0x00 l_usb_kyb_read_00103: -;source-doc/keyboard/kyb_driver.c:88: - ld sp, ix - pop ix +;source-doc/keyboard/kyb_driver.c:87: /* H = 0, L = ascii char */ ret -;source-doc/keyboard/kyb_driver.c:90: } +;source-doc/keyboard/kyb_driver.c:89: } ; --------------------------------- ; Function usb_kyb_flush ; --------------------------------- _usb_kyb_flush: -;source-doc/keyboard/kyb_driver.c:91: +;source-doc/keyboard/kyb_driver.c:90: DI -;source-doc/keyboard/kyb_driver.c:92: uint8_t usb_kyb_flush() __sdcccall(1) { +;source-doc/keyboard/kyb_driver.c:91: uint8_t usb_kyb_flush() __sdcccall(1) { xor a ld (_read_index),a ld (_write_index),a -;source-doc/keyboard/kyb_driver.c:95: +;source-doc/keyboard/kyb_driver.c:94: ld de,_previous+0 -;source-doc/keyboard/kyb_driver.c:96: uint8_t i = sizeof(previous); -;source-doc/keyboard/kyb_driver.c:97: uint8_t *a = (uint8_t *)previous; +;source-doc/keyboard/kyb_driver.c:95: uint8_t i = sizeof(previous); +;source-doc/keyboard/kyb_driver.c:96: uint8_t *a = (uint8_t *)previous; ld b,0x08 ld hl,_report l_usb_kyb_flush_00101: -;source-doc/keyboard/kyb_driver.c:98: uint8_t *b = (uint8_t *)report; +;source-doc/keyboard/kyb_driver.c:97: uint8_t *b = (uint8_t *)report; xor a ld (de), a inc de -;source-doc/keyboard/kyb_driver.c:99: do { +;source-doc/keyboard/kyb_driver.c:98: do { ld (hl),0x00 inc hl -;source-doc/keyboard/kyb_driver.c:100: *a++ = 0; +;source-doc/keyboard/kyb_driver.c:99: *a++ = 0; djnz l_usb_kyb_flush_00101 -;source-doc/keyboard/kyb_driver.c:102: } while (--i != 0); +;source-doc/keyboard/kyb_driver.c:101: } while (--i != 0); EI -;source-doc/keyboard/kyb_driver.c:104: EI; +;source-doc/keyboard/kyb_driver.c:103: EI; xor a -;source-doc/keyboard/kyb_driver.c:105: +;source-doc/keyboard/kyb_driver.c:104: ret -;source-doc/keyboard/kyb_driver.c:107: } +;source-doc/keyboard/kyb_driver.c:106: } ; --------------------------------- ; Function usb_kyb_tick ; --------------------------------- _usb_kyb_tick: -;source-doc/keyboard/kyb_driver.c:108: +;source-doc/keyboard/kyb_driver.c:107: ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb_driver.c:109: void usb_kyb_tick(void) { +;source-doc/keyboard/kyb_driver.c:108: void usb_kyb_tick(void) { jr NZ,l_usb_kyb_tick_00112 ;././source-doc/base-drv//ch376.h:111: ld l,0x0b @@ -305,7 +290,7 @@ _usb_kyb_tick: ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:112: +;source-doc/keyboard/kyb_driver.c:111: ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -319,7 +304,6 @@ _usb_kyb_tick: inc sp ld a, l ld (_result), a -;././source-doc/base-drv//ch376.h:111: ld l,0x0b call _ch_command ;././source-doc/base-drv//ch376.h:112: #endif @@ -330,75 +314,69 @@ _usb_kyb_tick: ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:114: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); ld hl,_result ld a, (hl) or a jr NZ,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:115: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb_driver.c:114: ch_configure_nak_retry_3s(); call _report_diff or a jr Z,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:117: if (report_diff()) { +;source-doc/keyboard/kyb_driver.c:116: if (report_diff()) { ld b,0x06 l_usb_kyb_tick_00103: -;source-doc/keyboard/kyb_driver.c:118: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:117: uint8_t i = 6; ld a, b dec a push bc call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb_driver.c:119: do { +;source-doc/keyboard/kyb_driver.c:118: do { djnz l_usb_kyb_tick_00103 -;source-doc/keyboard/kyb_driver.c:120: keyboard_buf_put(i - 1); +;source-doc/keyboard/kyb_driver.c:119: keyboard_buf_put(i - 1); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_usb_kyb_tick_00112: -;source-doc/keyboard/kyb_driver.c:123: } +;source-doc/keyboard/kyb_driver.c:122: } ret -;source-doc/keyboard/kyb_driver.c:125: } +;source-doc/keyboard/kyb_driver.c:124: } ; --------------------------------- ; Function usb_kyb_init ; --------------------------------- _usb_kyb_init: -;source-doc/keyboard/kyb_driver.c:126: +;source-doc/keyboard/kyb_driver.c:125: call _get_usb_device_config ex de, hl ld (_keyboard_config), hl -;source-doc/keyboard/kyb_driver.c:128: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); +;source-doc/keyboard/kyb_driver.c:127: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); ld hl,_keyboard_config + 1 ld a, (hl) dec hl or (hl) -;source-doc/keyboard/kyb_driver.c:129: +;source-doc/keyboard/kyb_driver.c:128: ret Z -;source-doc/keyboard/kyb_driver.c:131: return; +;source-doc/keyboard/kyb_driver.c:130: return; ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb_driver.c:132: +;source-doc/keyboard/kyb_driver.c:131: ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb_driver.c:133: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb_driver.c:132: hid_set_protocol(keyboard_config, 1); ret +_caps_lock_engaged: + DEFB +0x01 _keyboard_config: DEFW +0x0000 _buffer: - DEFW +0x0000 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 + DEFB +0x00 DEFB 0x00 DEFB 0x00 DEFB 0x00 diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c index 94c1d2c3..a047f36a 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c @@ -1,9 +1,6 @@ #include "class_hid_keyboard.h" #define ESC 0x1B - -bool caps_lock_engaged = true; - /** * scan codes sourced from https://deskthority.net/wiki/Scancode * @@ -336,7 +333,7 @@ char scancodes_table[128] = { 0x00 /* MUTE */, }; -char char_with_caps_lock(const char c) __sdcccall(1) { +static char char_with_caps_lock(const char c, const bool caps_lock_engaged) __sdcccall(1) { if (!caps_lock_engaged) return c; @@ -349,10 +346,7 @@ char char_with_caps_lock(const char c) __sdcccall(1) { return c; } -char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) { - if (code >= 0x80) - return 0; - +char scancode_to_char(const uint8_t modifier_keys, const uint8_t code, const bool caps_lock_engaged) __sdcccall(1) { if ((modifier_keys & (KEY_MOD_LCTRL | KEY_MOD_RCTRL))) { if (code >= 4 && code <= 0x1d) return code - 3; @@ -377,7 +371,7 @@ char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccal } if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT)) - return char_with_caps_lock(scancodes_shift_table[code]); + return char_with_caps_lock(scancodes_shift_table[code], caps_lock_engaged); - return char_with_caps_lock(scancodes_table[code]); + return char_with_caps_lock(scancodes_table[code], caps_lock_engaged); } diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h index 1edf527f..6243c437 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.h @@ -1,6 +1,7 @@ #ifndef __CLASS_HID_KEYBOARD_H__ #define __CLASS_HID_KEYBOARD_H__ +#include #include typedef struct { @@ -21,6 +22,6 @@ typedef struct { #define KEY_CODE_CAPS_LOCK 0x39 extern char scancodes_table[128]; -extern char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1); +extern char scancode_to_char(const uint8_t modifier_keys, const uint8_t code, const bool caps_lock_engaged) __sdcccall(1); #endif diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c index 68a84ae1..217d151d 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -8,13 +8,13 @@ #define KEYBOARD_BUFFER_SIZE 8 #define KEYBOARD_BUFFER_SIZE_MASK 7 -typedef uint16_t modifier_and_code_t; -static device_config_keyboard *keyboard_config = 0; +static bool caps_lock_engaged = true; +static device_config_keyboard *keyboard_config = 0; -static modifier_and_code_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; -static uint8_t write_index = 0; -static uint8_t read_index = 0; +static uint8_t buffer[KEYBOARD_BUFFER_SIZE] = {0}; +static uint8_t write_index = 0; +static uint8_t read_index = 0; static keyboard_report_t report = {0}; static keyboard_report_t previous = {0}; @@ -41,16 +41,22 @@ static void keyboard_buf_put(const uint8_t indx) __sdcccall(1) { return; // ignore ??? // if already reported, just skip it - uint8_t i = 6; - uint8_t *a = previous.keyCode; - do { - if (*a++ == key_code) - return; - } while (--i != 0); + if (previous.keyCode[indx] == key_code) + return; + + if (key_code == KEY_CODE_CAPS_LOCK) { + caps_lock_engaged = !caps_lock_engaged; + return; + } + + const unsigned char c = scancode_to_char(report.bModifierKeys, key_code, caps_lock_engaged); + + if (c == 0) + return; uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; if (next_write_index != read_index) { // Check if buffer is not full - buffer[write_index] = (uint16_t)report.bModifierKeys << 8 | (uint16_t)key_code; + buffer[write_index] = c; write_index = next_write_index; } } @@ -69,24 +75,17 @@ uint8_t usb_kyb_status() __sdcccall(1) { return size; } -uint32_t usb_kyb_read() { +uint16_t usb_kyb_read() { if (write_index == read_index) // Check if buffer is empty - return 0x0000FF00; // H = -1, D, E, L = 0 + return 0xFF00; // H = -1, L = 0 DI; - const uint8_t modifier_key = buffer[read_index] >> 8; - const uint8_t key_code = buffer[read_index] & 255; - read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; + const uint8_t c = buffer[read_index]; + read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; EI; - // D: Modifier keys - aka Keystate - // E: ASCII Code - // H: 0 - // L: KeyCode aka scan code - - const unsigned char c = scancode_to_char(modifier_key, key_code); - /* D = modifier, e-> char, H = 0, L=>code */ - return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code; + /* H = 0, L = ascii char */ + return c; } uint8_t usb_kyb_flush() __sdcccall(1) { diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h index b4d10c14..c9a744f7 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h @@ -7,6 +7,6 @@ extern void usb_kyb_init(const uint8_t dev_index) __sdcccall(1); extern uint8_t usb_kyb_flush() __sdcccall(1); extern uint8_t usb_kyb_status() __sdcccall(1); -extern uint32_t usb_kyb_read(); +extern uint16_t usb_kyb_read(); #endif diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index 7d46cd77..ff76443b 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -123,30 +123,12 @@ UKY_FLUSH .EQU _usb_kyb_flush ; ; Outputs: ; A: Status -; C: Scancode -; D: Keystate ; E: Keycode ; ; Read the next key data from the keyboard. If a buffer is used, return the next key code in the buffer. ; If no key data is available, this function will wait indefinitely for a key press. The Status (A) is a ; standard HBIOS result code. ; -; The Scancode (C) value is the raw scan code from the keyboard for the key press. Scan codes are standard -; usb scan codes -; -; The Keystate (D) is a bitmap representing the value of all modifier keys and shift states as they -; existed at the time of the keystroke. The bitmap is defined as: -; -; Bit Key state Indication -; 7 Key pressed was from the num pad -; 6 Caps Lock was active -; 5 Num Lock was active -; 4 Scroll Lock was active -; 3 Windows key was held down -; 2 Alt key was held down -; 1 Control key was held down -; 0 Shift key was held down -; ; The Keycode (E) is generally returned as appropriate ASCII values, if possible. Special keys, like ; function keys and arrows, are returned as reserved codes. ; @@ -155,6 +137,6 @@ UKY_READ: LD A, H OR A JR NZ, UKY_READ - LD C, L + LD E, L XOR A RET diff --git a/Source/HBIOS/ez80instr.inc b/Source/HBIOS/ez80instr.inc index 873b6b27..de7e168a 100644 --- a/Source/HBIOS/ez80instr.inc +++ b/Source/HBIOS/ez80instr.inc @@ -60,7 +60,12 @@ #DEFINE EZ80_EX_USB_UFI_WRITE LD A, 6 \ LD B, 17 \ EZ80_FN #DEFINE EZ80_EX_USB_UFI_GET_CAP LD A, 6 \ LD B, 18 \ EZ80_FN ; #DEFINE EZ80_EX_USB_UFI_INIT LD A, 6 \ LD B, 31 \ EZ80_FN - + + #DEFINE EZ80_EX_USB_KYB_STATUS LD A, 6 \ LD B, 32 \ EZ80_FN + #DEFINE EZ80_EX_USB_KYB_READ LD A, 6 \ LD B, 33 \ EZ80_FN + #DEFINE EZ80_EX_USB_KYB_FLUSH LD A, 6 \ LD B, 34 \ EZ80_FN + #DEFINE EZ80_EX_USB_KYB_INIT LD A, 6 \ LD B, 47 \ EZ80_FN + #DEFINE EZ80_THROTTLE_START(p,store) \ #DEFCONT \ PUSH AF #DEFCONT \ PUSH BC From f63ef6ba049262c2354c7eee387395e96e1c248d Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 24 Apr 2025 18:57:32 +1000 Subject: [PATCH 49/59] ch376-native: enabled ez80 firmware version for the usb drivers --- Source/HBIOS/Config/RCEZ80_std.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 7bf35783..f81d7bbf 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -90,6 +90,6 @@ CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET FALSE +CHNATIVEEZ80 .SET TRUE EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] From 135641d66c53db0403f6d48fe3749a7c3edd58fd Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 24 Apr 2025 19:18:42 +1000 Subject: [PATCH 50/59] ch376-native:updated master and ez80 configs - defaults to off at master, and on for ez80 --- Source/HBIOS/Config/RCEZ80_std.asm | 4 ++-- Source/HBIOS/cfg_MASTER.asm | 7 ++++--- Source/HBIOS/cfg_RCEZ80.asm | 6 ++++++ Source/HBIOS/ch376kyb.asm | 9 +++++++++ 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index f81d7bbf..9ffd5205 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -87,9 +87,9 @@ CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER -CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET TRUE +CHNATIVEEZ80 .SET TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE +CHNATIVEFORCE .SET FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 98c64851..1d59002c 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -498,11 +498,12 @@ EZ80_WSMD_TYP .EQU EZ80WSMD_CALC ; BUS WAIT STATE CONFIG: EZ80WSMD_[CALC|CYCLES| ; ; BUS TIMING FOR ON CHIP ROM ; -EZ80_FLSH_WS .EQU 1 ; WAIT STATES FOR ON CHIP FLASH (0-7) -EZ80_FLSH_MIN_NS .EQU 60 ; MINIMUM WAIT STATES TO APPLY TO ON-CHIP FLASH, IF EZ80_WSMD_TYP = EZ80WSMD_CALC -EZ80_FWSMD_TYP .EQU EZ80WSMD_CALC ; WAIT STATE TYPE: EZ80RMMD_[CALC|WAIT] (CYCLES NOT ALLOWED) +EZ80_FLSH_WS .EQU 1 ; WAIT STATES FOR ON CHIP FLASH (0-7) +EZ80_FLSH_MIN_NS .EQU 60 ; MINIMUM WAIT STATES TO APPLY TO ON-CHIP FLASH, IF EZ80_WSMD_TYP = EZ80WSMD_CALC +EZ80_FWSMD_TYP .EQU EZ80WSMD_CALC ; WAIT STATE TYPE: EZ80RMMD_[CALC|WAIT] (CYCLES NOT ALLOWED) CHNATIVEENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) CHNATIVEFORCE .EQU FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED (REQUIRES CHNATIVEENABLE) +CHNATIVEEZ80 .EQU FALSE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index 20a512a9..3b2591e0 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -405,6 +405,12 @@ EZ80TMR_NONE .SET 0 ; DO NOT USE ON-BOARD TIMER TO GENERATE TICKS EZ80TMR_INT .SET 1 ; MARSHALL TIMER TICK INTERRUPTS FROM EZ80 TO HBIOS EZ80TMR_FIRM .SET 2 ; DELEGATE SYS TIMER HBIOS CALL TO EZ80 FIRMWARE (TIMER TICK INTS DISABLED) ; +CHNATIVEENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEFORCE .EQU FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED (REQUIRES CHNATIVEENABLE) +CHNATIVEEZ80 .EQU TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE + EZ80UARTENABLE .SET TRUE ; EZ80 UART: ENABLE EZ80 UART0 DRIVER (EZ80UART.ASM) EZ80RTCENABLE .SET TRUE ; EZ80 ON CHIP RTC EZ80TIMER .SET EZ80TMR_FIRM ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376kyb.asm b/Source/HBIOS/ch376kyb.asm index ff76443b..bf552ea7 100644 --- a/Source/HBIOS/ch376kyb.asm +++ b/Source/HBIOS/ch376kyb.asm @@ -5,6 +5,15 @@ ; ; This driver is designed to work within the TMS video driver for a CRT solution. + +#IF (!CHNATIVEENABLE) + .ECHO "*** TMSMODE: TMSMODE_MSXUKY REQUIRES CHNATIVEENABLE***\n" + !!!!! *** TMSMODE: TMSMODE_MSXUKY REQUIRES CHNATIVEENABLE*** +_usb_kyb_status: +_usb_kyb_flush: +#ENDIF + + #DEFINE DEFM .DB #DEFINE DEFB .DB #DEFINE DEFW .DW From e0d385af385ee298587db0e98ad81dd2e808f369 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Fri, 25 Apr 2025 14:55:11 +1000 Subject: [PATCH 51/59] ch376-native: boot report now indicates if firmware or RomWBW version of driver is running --- Source/HBIOS/Config/RCEZ80_std.asm | 2 +- .../ch376-native/base-drv/ch376_init.c.s | 83 +++++++++---------- .../source-doc/base-drv/ch376_init.c | 4 +- Source/HBIOS/ch376.asm | 6 ++ 4 files changed, 50 insertions(+), 45 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 9ffd5205..8a66a69e 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -90,6 +90,6 @@ CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) CHNATIVEEZ80 .SET TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE -CHNATIVEFORCE .SET FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED +CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s index 06098a7e..1c0ebe13 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -115,7 +115,7 @@ ch376_init_str_1: DEFB 0x08 DEFM "*$" DEFB 0x00 -;source-doc/base-drv/ch376_init.c:23: static void _chnative_init(bool forced) { +;source-doc/base-drv/ch376_init.c:25: static void _chnative_init(bool forced) { ; --------------------------------- ; Function _chnative_init ; --------------------------------- @@ -124,7 +124,7 @@ __chnative_init: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/ch376_init.c:26: const uint8_t loop_counter = forced ? 40 : 5; +;source-doc/base-drv/ch376_init.c:28: const uint8_t loop_counter = forced ? 40 : 5; bit 0,(ix+4) jr Z,l__chnative_init_00113 ld a,0x28 @@ -133,109 +133,109 @@ l__chnative_init_00113: ld a,0x05 l__chnative_init_00114: ld (ix-1),a -;source-doc/base-drv/ch376_init.c:28: print_string("\r\nCH376: *$"); +;source-doc/base-drv/ch376_init.c:30: print_string("\r\nCH376: *$"); ld hl,ch376_init_str_2 call _print_string -;source-doc/base-drv/ch376_init.c:30: r = wait_for_state(loop_counter, state, 1); +;source-doc/base-drv/ch376_init.c:32: r = wait_for_state(loop_counter, state, 1); ld a,0x01 push af inc sp ld l,0x00 ld a,(ix-1) call _wait_for_state -;source-doc/base-drv/ch376_init.c:31: state = r & 255; -;source-doc/base-drv/ch376_init.c:33: print_string("\bPRESENT (VER $"); +;source-doc/base-drv/ch376_init.c:33: state = r & 255; +;source-doc/base-drv/ch376_init.c:35: print_string("\bPRESENT (VER $"); push de ld hl,ch376_init_str_3 call _print_string pop de -;source-doc/base-drv/ch376_init.c:35: r = usb_init(state); +;source-doc/base-drv/ch376_init.c:37: r = usb_init(state); ld l, e call _usb_init ex de, hl -;source-doc/base-drv/ch376_init.c:36: state = r & 255; +;source-doc/base-drv/ch376_init.c:38: state = r & 255; ld c, e -;source-doc/base-drv/ch376_init.c:37: if (state != 2) { +;source-doc/base-drv/ch376_init.c:39: if (state != 2) { ld a, c sub 0x02 jr Z,l__chnative_init_00102 -;source-doc/base-drv/ch376_init.c:38: print_string("\rCH376: $"); +;source-doc/base-drv/ch376_init.c:40: print_string("\rCH376: $"); ld hl,ch376_init_str_4 call _print_string -;source-doc/base-drv/ch376_init.c:39: print_string("VERSION FAILURE\r\n$"); +;source-doc/base-drv/ch376_init.c:41: print_string("VERSION FAILURE\r\n$"); ld hl,ch376_init_str_5 call _print_string -;source-doc/base-drv/ch376_init.c:40: return; +;source-doc/base-drv/ch376_init.c:42: return; jr l__chnative_init_00111 l__chnative_init_00102: -;source-doc/base-drv/ch376_init.c:43: print_hex(r >> 8); +;source-doc/base-drv/ch376_init.c:45: print_hex(r >> 8); push bc ld l, d call _print_hex -;source-doc/base-drv/ch376_init.c:44: print_string("); $"); - ld hl,ch376_init_str_6 +;source-doc/base-drv/ch376_init.c:46: print_string(ch376_driver_version); + ld hl,_ch376_driver_version call _print_string -;source-doc/base-drv/ch376_init.c:46: print_string("USB: *$"); - ld hl,ch376_init_str_7 +;source-doc/base-drv/ch376_init.c:48: print_string("USB: *$"); + ld hl,ch376_init_str_6 call _print_string pop bc -;source-doc/base-drv/ch376_init.c:48: r = wait_for_state(loop_counter, state, 3); +;source-doc/base-drv/ch376_init.c:50: r = wait_for_state(loop_counter, state, 3); ld a,0x03 push af inc sp ld l, c ld a,(ix-1) call _wait_for_state -;source-doc/base-drv/ch376_init.c:49: state = r & 255; -;source-doc/base-drv/ch376_init.c:51: if (state == 2) { +;source-doc/base-drv/ch376_init.c:51: state = r & 255; +;source-doc/base-drv/ch376_init.c:53: if (state == 2) { ld a, e sub 0x02 jr NZ,l__chnative_init_00104 -;source-doc/base-drv/ch376_init.c:52: print_string("\bDISCONNECTED$"); - ld hl,ch376_init_str_8 +;source-doc/base-drv/ch376_init.c:54: print_string("\bDISCONNECTED$"); + ld hl,ch376_init_str_7 call _print_string -;source-doc/base-drv/ch376_init.c:53: return; +;source-doc/base-drv/ch376_init.c:55: return; jr l__chnative_init_00111 l__chnative_init_00104: -;source-doc/base-drv/ch376_init.c:56: print_string("\bCONNECTED$"); +;source-doc/base-drv/ch376_init.c:58: print_string("\bCONNECTED$"); push de - ld hl,ch376_init_str_9 + ld hl,ch376_init_str_8 call _print_string pop de -;source-doc/base-drv/ch376_init.c:59: r = usb_init(state); +;source-doc/base-drv/ch376_init.c:61: r = usb_init(state); ld l, e call _usb_init ex de, hl -;source-doc/base-drv/ch376_init.c:60: state = r & 255; +;source-doc/base-drv/ch376_init.c:62: state = r & 255; ld c, e -;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { +;source-doc/base-drv/ch376_init.c:64: for (uint8_t i = 0; i < loop_counter; i++) { ld b,0x00 l__chnative_init_00109: ld a, b sub (ix-1) jr NC,l__chnative_init_00111 -;source-doc/base-drv/ch376_init.c:63: if (r >> 8 != 0) +;source-doc/base-drv/ch376_init.c:65: if (r >> 8 != 0) ld a,0x00 or d jr NZ,l__chnative_init_00111 -;source-doc/base-drv/ch376_init.c:66: print_string(".$"); +;source-doc/base-drv/ch376_init.c:68: print_string(".$"); push bc - ld hl,ch376_init_str_10 + ld hl,ch376_init_str_9 call _print_string pop bc -;source-doc/base-drv/ch376_init.c:67: r = usb_init(state); +;source-doc/base-drv/ch376_init.c:69: r = usb_init(state); push bc ld l, c call _usb_init ex de, hl pop bc -;source-doc/base-drv/ch376_init.c:68: state = r & 255; +;source-doc/base-drv/ch376_init.c:70: state = r & 255; ld c, e -;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { +;source-doc/base-drv/ch376_init.c:64: for (uint8_t i = 0; i < loop_counter; i++) { inc b jr l__chnative_init_00109 l__chnative_init_00111: -;source-doc/base-drv/ch376_init.c:70: } +;source-doc/base-drv/ch376_init.c:72: } inc sp pop ix ret @@ -259,23 +259,20 @@ ch376_init_str_5: DEFM "$" DEFB 0x00 ch376_init_str_6: - DEFM "); $" - DEFB 0x00 -ch376_init_str_7: DEFM "USB: *$" DEFB 0x00 -ch376_init_str_8: +ch376_init_str_7: DEFB 0x08 DEFM "DISCONNECTED$" DEFB 0x00 -ch376_init_str_9: +ch376_init_str_8: DEFB 0x08 DEFM "CONNECTED$" DEFB 0x00 -ch376_init_str_10: +ch376_init_str_9: DEFM ".$" DEFB 0x00 -;source-doc/base-drv/ch376_init.c:72: void chnative_init_force(void) { _chnative_init(true); } +;source-doc/base-drv/ch376_init.c:74: void chnative_init_force(void) { _chnative_init(true); } ; --------------------------------- ; Function chnative_init_force ; --------------------------------- @@ -286,7 +283,7 @@ _chnative_init_force: call __chnative_init inc sp ret -;source-doc/base-drv/ch376_init.c:74: void chnative_init(void) { _chnative_init(false); } +;source-doc/base-drv/ch376_init.c:76: void chnative_init(void) { _chnative_init(false); } ; --------------------------------- ; Function chnative_init ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c index 2498751e..65cfc43d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c @@ -20,6 +20,8 @@ static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const return r; } +extern const char ch376_driver_version[]; + static void _chnative_init(bool forced) { uint8_t state = 0; uint16_t r; @@ -41,7 +43,7 @@ static void _chnative_init(bool forced) { } print_hex(r >> 8); - print_string("); $"); + print_string(ch376_driver_version); print_string("USB: *$"); diff --git a/Source/HBIOS/ch376.asm b/Source/HBIOS/ch376.asm index fb87df07..edde7dc0 100644 --- a/Source/HBIOS/ch376.asm +++ b/Source/HBIOS/ch376.asm @@ -23,8 +23,14 @@ _dio_add_entry: #include "./ch376-native/ez80-firmware.asm" +_ch376_driver_version: + .DB ",F); $", 0 + #ELSE +_ch376_driver_version: + .DB ",W); $", 0 + _delay: push af call DELAY From c8a551a781c26d1822c855fb18d4280e8a2d5f3e Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 27 Apr 2025 11:30:20 +1000 Subject: [PATCH 52/59] ch376-native: removed some dead code --- .../HBIOS/ch376-native/base-drv/transfers.c.s | 196 +++++------------- .../source-doc/base-drv/transfers.c | 26 --- 2 files changed, 51 insertions(+), 171 deletions(-) diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index a7e24d4e..5a11aaa5 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -48,52 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/transfers.c:22: -; --------------------------------- -; Function usb_ctrl_trnsfer_ext -; --------------------------------- -_usb_ctrl_trnsfer_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:26: const uint8_t max_packet_size) { - ld a,(ix+5) - sub 0x80 - jr NC,l_usb_ctrl_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:27: if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) - ld l,0x82 - jr l_usb_ctrl_trnsfer_ext_00106 -l_usb_ctrl_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:29: - ld a,(ix+7) - or (ix+6) - jr Z,l_usb_ctrl_trnsfer_ext_00104 - ld a,(ix+7) - sub 0x80 - jr NC,l_usb_ctrl_trnsfer_ext_00104 -;source-doc/base-drv/transfers.c:30: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - ld l,0x82 - jr l_usb_ctrl_trnsfer_ext_00106 -l_usb_ctrl_trnsfer_ext_00104: -;source-doc/base-drv/transfers.c:32: - ld h,(ix+9) - ld l,(ix+8) - push hl - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_control_transfer - pop af - pop af - pop af -l_usb_ctrl_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:33: return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); - pop ix - ret -;source-doc/base-drv/transfers.c:37: * @brief Perform a USB control transfer (in or out) +;source-doc/base-drv/transfers.c:23: * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer ; --------------------------------- ; Function usb_control_transfer ; --------------------------------- @@ -103,7 +58,7 @@ _usb_control_transfer: add ix,sp push af push af -;source-doc/base-drv/transfers.c:42: * @param device_address usb device address +;source-doc/base-drv/transfers.c:28: * @param max_packet_size Maximum packet size for endpoint ld hl,0 add hl, sp set 0, (hl) @@ -125,30 +80,30 @@ _usb_control_transfer: and 0xfc or e ld (hl), a -;source-doc/base-drv/transfers.c:44: * @return usb_error USB_ERR_OK if all good, otherwise specific error code +;source-doc/base-drv/transfers.c:30: */ ld c,(ix+4) ld b,(ix+5) ld a, (bc) and 0x80 -;source-doc/base-drv/transfers.c:46: usb_error usb_control_transfer(const setup_packet *const cmd_packet, +;source-doc/base-drv/transfers.c:32: void *const buffer, ld (ix-1),a or a jr Z,l_usb_control_transfer_00102 ld a,(ix+7) or (ix+6) jr NZ,l_usb_control_transfer_00102 -;source-doc/base-drv/transfers.c:47: void *const buffer, +;source-doc/base-drv/transfers.c:33: const uint8_t device_address, ld l,0x0f jp l_usb_control_transfer_00114 l_usb_control_transfer_00102: -;source-doc/base-drv/transfers.c:49: const uint8_t max_packet_size) { +;source-doc/base-drv/transfers.c:35: usb_error result; push bc call _critical_begin -;source-doc/base-drv/transfers.c:51: endpoint_param endpoint = {1, 0, max_packet_size}; +;source-doc/base-drv/transfers.c:37: ld l,(ix+8) call _ch_set_usb_address pop bc -;source-doc/base-drv/transfers.c:53: const uint8_t transferIn = (cmd_packet->bmRequestType & 0x80); +;source-doc/base-drv/transfers.c:39: ld e,(ix+4) ld d,(ix+5) push bc @@ -159,21 +114,21 @@ l_usb_control_transfer_00102: call _ch_write_data pop af inc sp -;source-doc/base-drv/transfers.c:54: +;source-doc/base-drv/transfers.c:40: if (transferIn && buffer == 0) call _ch_issue_token_setup -;source-doc/base-drv/transfers.c:55: if (transferIn && buffer == 0) +;source-doc/base-drv/transfers.c:41: return USB_ERR_OTHER; call _ch_short_wait_int_and_get_stat pop bc -;source-doc/base-drv/transfers.c:56: return USB_ERR_OTHER; +;source-doc/base-drv/transfers.c:42: ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:58: critical_begin(); +;source-doc/base-drv/transfers.c:44: ld hl,6 add hl, bc ld c, (hl) inc hl -;source-doc/base-drv/transfers.c:61: +;source-doc/base-drv/transfers.c:47: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ld a,(hl) ld b,a or c @@ -204,107 +159,58 @@ l_usb_control_transfer_00118: l_usb_control_transfer_00119: jr l_usb_control_transfer_00117 l_usb_control_transfer_00116: -;source-doc/base-drv/transfers.c:62: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); +;source-doc/base-drv/transfers.c:48: ch_issue_token_setup(); ld l,0x00 l_usb_control_transfer_00117: -;source-doc/base-drv/transfers.c:64: result = ch_short_wait_int_and_get_statu(); +;source-doc/base-drv/transfers.c:50: CHECK(result); ld a, l or a jr NZ,l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:66: +;source-doc/base-drv/transfers.c:52: const uint16_t length = cmd_packet->wLength; ld a,(ix-1) or a jr Z,l_usb_control_transfer_00112 -;source-doc/base-drv/transfers.c:67: const uint16_t length = cmd_packet->wLength; +;source-doc/base-drv/transfers.c:53: ld l,0x2c call _ch_command -;source-doc/base-drv/transfers.c:68: +;source-doc/base-drv/transfers.c:54: result = length != 0 ld a,0x00 ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/transfers.c:69: result = length != 0 +;source-doc/base-drv/transfers.c:55: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) call _ch_issue_token_out_ep0 -;source-doc/base-drv/transfers.c:70: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint)) +;source-doc/base-drv/transfers.c:56: : USB_ERR_OK; call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/transfers.c:72: +;source-doc/base-drv/transfers.c:58: CHECK(result) ld a,l or a jr Z,l_usb_control_transfer_00108 sub 0x02 jr NZ,l_usb_control_transfer_00113 l_usb_control_transfer_00108: -;source-doc/base-drv/transfers.c:73: CHECK(result) +;source-doc/base-drv/transfers.c:59: ld l,0x00 -;source-doc/base-drv/transfers.c:74: +;source-doc/base-drv/transfers.c:60: if (transferIn) { jr l_usb_control_transfer_00113 -;source-doc/base-drv/transfers.c:77: CH376_DATA_PORT = 0; +;source-doc/base-drv/transfers.c:63: ch_issue_token_out_ep0(); l_usb_control_transfer_00112: -;source-doc/base-drv/transfers.c:80: +;source-doc/base-drv/transfers.c:66: if (result == USB_ERR_OK || result == USB_ERR_STALL) { call _ch_issue_token_in_ep0 -;source-doc/base-drv/transfers.c:81: if (result == USB_ERR_OK || result == USB_ERR_STALL) { +;source-doc/base-drv/transfers.c:67: result = USB_ERR_OK; call _ch_long_wait_int_and_get_statu -;source-doc/base-drv/transfers.c:85: +;source-doc/base-drv/transfers.c:71: RETURN_CHECK(result); l_usb_control_transfer_00113: -;source-doc/base-drv/transfers.c:86: RETURN_CHECK(result); +;source-doc/base-drv/transfers.c:72: } push hl call _critical_end pop hl -;source-doc/base-drv/transfers.c:87: } +;source-doc/base-drv/transfers.c:73: l_usb_control_transfer_00114: -;source-doc/base-drv/transfers.c:88: +;source-doc/base-drv/transfers.c:74: ch_issue_token_in_ep0(); ld sp, ix pop ix ret -;source-doc/base-drv/transfers.c:91: -; --------------------------------- -; Function usb_dat_in_trnsfer_ext -; --------------------------------- -_usb_dat_in_trnsfer_ext: - push ix - ld ix,0 - add ix,sp -;source-doc/base-drv/transfers.c:92: RETURN_CHECK(result); - ld a,(ix+5) - or (ix+4) - jr Z,l_usb_dat_in_trnsfer_ext_00102 - ld a,(ix+5) - sub 0x80 - jr NC,l_usb_dat_in_trnsfer_ext_00102 -;source-doc/base-drv/transfers.c:93: - ld l,0x82 - jr l_usb_dat_in_trnsfer_ext_00106 -l_usb_dat_in_trnsfer_ext_00102: -;source-doc/base-drv/transfers.c:95: critical_end(); - ld a,(ix+10) - sub 0x80 - jr NC,l_usb_dat_in_trnsfer_ext_00105 -;source-doc/base-drv/transfers.c:96: return result; - ld l,0x82 - jr l_usb_dat_in_trnsfer_ext_00106 -l_usb_dat_in_trnsfer_ext_00105: -;source-doc/base-drv/transfers.c:98: - ld l,(ix+9) - ld h,(ix+10) - push hl - ld a,(ix+8) - push af - inc sp - ld l,(ix+6) - ld h,(ix+7) - push hl - ld l,(ix+4) - ld h,(ix+5) - push hl - call _usb_data_in_transfer - pop af - pop af - pop af - inc sp -l_usb_dat_in_trnsfer_ext_00106: -;source-doc/base-drv/transfers.c:99: usb_error - pop ix - ret -;source-doc/base-drv/transfers.c:104: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) +;source-doc/base-drv/transfers.c:79: done: ; --------------------------------- ; Function usb_data_in_transfer ; --------------------------------- @@ -312,12 +218,12 @@ _usb_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:105: return USB_BAD_ADDRESS; +;source-doc/base-drv/transfers.c:80: critical_end(); call _critical_begin -;source-doc/base-drv/transfers.c:107: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); +;source-doc/base-drv/transfers.c:82: } ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:109: +;source-doc/base-drv/transfers.c:84: /** ld l,(ix+9) ld h,(ix+10) push hl @@ -333,14 +239,14 @@ _usb_data_in_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:111: * @brief Perform a USB data in on the specififed endpoint +;source-doc/base-drv/transfers.c:86: * call _critical_end -;source-doc/base-drv/transfers.c:113: * @param buffer the buffer to receive the data +;source-doc/base-drv/transfers.c:88: * @param buffer_size the maximum size of data to be received ld hl, (_result) -;source-doc/base-drv/transfers.c:114: * @param buffer_size the maximum size of data to be received +;source-doc/base-drv/transfers.c:89: * @param device_address the usb address of the device pop ix ret -;source-doc/base-drv/transfers.c:119: usb_error +;source-doc/base-drv/transfers.c:94: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- @@ -348,12 +254,12 @@ _usb_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:120: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:95: critical_begin(); call _critical_begin -;source-doc/base-drv/transfers.c:122: +;source-doc/base-drv/transfers.c:97: ch_set_usb_address(device_address); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:124: +;source-doc/base-drv/transfers.c:99: result = ch_data_in_transfer(buffer, buffer_size, endpoint); ld l,(ix+9) ld h,(ix+10) push hl @@ -369,14 +275,14 @@ _usb_data_in_transfer_n: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:126: +;source-doc/base-drv/transfers.c:101: critical_end(); call _critical_end -;source-doc/base-drv/transfers.c:128: +;source-doc/base-drv/transfers.c:103: return result; ld hl, (_result) -;source-doc/base-drv/transfers.c:129: return result; +;source-doc/base-drv/transfers.c:104: } pop ix ret -;source-doc/base-drv/transfers.c:134: * +;source-doc/base-drv/transfers.c:109: * @param buffer the buffer to receive the data - must be 62 bytes ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- @@ -384,12 +290,12 @@ _usb_data_out_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:135: * @param buffer the buffer to receive the data - must be 62 bytes +;source-doc/base-drv/transfers.c:110: * @param buffer_size on exit the actual size of data received call _critical_begin -;source-doc/base-drv/transfers.c:137: * @param device_address the usb address of the device +;source-doc/base-drv/transfers.c:112: * @param endpoint the usb endpoint to receive from (toggle of endpoint is updated) ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:139: * @return usb_error USB_ERR_OK if all good, otherwise specific error code +;source-doc/base-drv/transfers.c:114: */ ld l,(ix+9) ld h,(ix+10) push hl @@ -405,10 +311,10 @@ _usb_data_out_transfer: pop af ld a, l ld (_result), a -;source-doc/base-drv/transfers.c:141: usb_error +;source-doc/base-drv/transfers.c:116: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { call _critical_end -;source-doc/base-drv/transfers.c:143: critical_begin(); +;source-doc/base-drv/transfers.c:118: ld hl, (_result) -;source-doc/base-drv/transfers.c:144: +;source-doc/base-drv/transfers.c:119: ch_set_usb_address(device_address); pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 5e35afee..a285685c 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -18,21 +18,6 @@ #include "print.h" #include -#define LOWER_SAFE_RAM_ADDRESS 0x8000 - -usb_error usb_ctrl_trnsfer_ext(const setup_packet *const cmd_packet, - void *const buffer, - const uint8_t device_address, - const uint8_t max_packet_size) { - if ((uint16_t)cmd_packet < LOWER_SAFE_RAM_ADDRESS) - return USB_BAD_ADDRESS; - - if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - return USB_BAD_ADDRESS; - - return usb_control_transfer(cmd_packet, buffer, device_address, max_packet_size); -} - /** * @brief Perform a USB control transfer (in or out) * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer @@ -96,17 +81,6 @@ done: return result; } -usb_error -usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { - if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS) - return USB_BAD_ADDRESS; - - if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS) - return USB_BAD_ADDRESS; - - return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint); -} - /** * @brief Perform a USB data in on the specififed endpoint * From 4436209213fa31037d76e793e8cd970d7996e872 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sun, 27 Apr 2025 11:50:14 +1000 Subject: [PATCH 53/59] ch376-native: fixed issue with parsing configs containing HID configs (keyboards/mice) --- Source/HBIOS/Config/RCEZ80_std.asm | 2 +- .../HBIOS/ch376-native/base-drv/enumerate.c.s | 621 +++++++++++------- .../source-doc/base-drv/enumerate.c | 57 +- .../source-doc/base-drv/protocol.h | 16 + .../source-doc/base-drv/transfers.c | 2 +- 5 files changed, 443 insertions(+), 255 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 8a66a69e..8743b2b0 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -89,7 +89,7 @@ CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE +CHNATIVEEZ80 .SET FALSE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 68f236e6..450eece3 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -48,7 +48,111 @@ _USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/enumerate.c:13: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) +;source-doc/base-drv/enumerate.c:13: static usb_error adv_to_next_desc(_working *const working, const uint8_t descriptor_type) __sdcccall(1) { +; --------------------------------- +; Function adv_to_next_desc +; --------------------------------- +_adv_to_next_desc: + push ix + ld ix,0 + add ix,sp + push af + push af + ex de, hl +;source-doc/base-drv/enumerate.c:15: const uint8_t *buffer_end = working->config.buffer + MAX_CONFIG_SIZE; + ld hl,0x00ab + add hl, de + ex (sp), hl +;source-doc/base-drv/enumerate.c:17: if (working->ptr >= buffer_end) + ld hl,0x001b + add hl, de + ld (ix-2),l + ld (ix-1),h + pop de + pop hl + ld a,(hl) + push hl + push de + inc hl + ld b,(hl) + ld c,a + sub (ix-4) + ld a, b + sbc a,(ix-3) + jr C,l_adv_to_next_desc_00102 +;source-doc/base-drv/enumerate.c:18: return USB_ERR_BUFF_TO_LARGE; + ld a,0x84 + jr l_adv_to_next_desc_00110 +l_adv_to_next_desc_00102: +;source-doc/base-drv/enumerate.c:20: d = (usb_descriptor_t *)working->ptr; + ld e, c + ld d, b +;source-doc/base-drv/enumerate.c:22: do { +l_adv_to_next_desc_00105: +;source-doc/base-drv/enumerate.c:23: working->ptr += d->bLength; + ld a, (de) + add a, c + ld c, a + ld a,0x00 + adc a, b + ld b, a + ld l,(ix-2) + ld h,(ix-1) + ld (hl), c + inc hl + ld (hl), b +;source-doc/base-drv/enumerate.c:25: if (working->ptr >= buffer_end) + ld a, c + sub (ix-4) + ld a, b + sbc a,(ix-3) + jr C,l_adv_to_next_desc_00104 +;source-doc/base-drv/enumerate.c:26: return USB_ERR_BUFF_TO_LARGE; + ld a,0x84 + jr l_adv_to_next_desc_00110 +l_adv_to_next_desc_00104: +;source-doc/base-drv/enumerate.c:17: if (working->ptr >= buffer_end) + pop de + pop hl + ld c,(hl) + push hl + push de + inc hl + ld b, (hl) +;source-doc/base-drv/enumerate.c:28: d = (usb_descriptor_t *)working->ptr; + ld e, c + ld d, b +;source-doc/base-drv/enumerate.c:29: } while (d->bDescriptorType != descriptor_type); + ld l, e + ld h, d + inc hl + ld a, (hl) + sub (ix+4) + jr NZ,l_adv_to_next_desc_00105 +;source-doc/base-drv/enumerate.c:31: if (working->ptr + d->bLength >= buffer_end) + ld a, (de) + ld l, a + ld h,0x00 + add hl, bc + ld a, l + sub (ix-4) + ld a, h + sbc a,(ix-3) + jr C,l_adv_to_next_desc_00109 +;source-doc/base-drv/enumerate.c:32: return USB_ERR_BUFF_TO_LARGE; + ld a,0x84 + jr l_adv_to_next_desc_00110 +l_adv_to_next_desc_00109: +;source-doc/base-drv/enumerate.c:34: return USB_ERR_OK; + xor a +l_adv_to_next_desc_00110: +;source-doc/base-drv/enumerate.c:35: } + ld sp, ix + pop ix + pop hl + inc sp + jp (hl) +;source-doc/base-drv/enumerate.c:37: void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) ; --------------------------------- ; Function parse_endpoint_keyboard ; --------------------------------- @@ -57,11 +161,11 @@ _parse_endpoint_keyboard: ld ix,0 add ix,sp push af -;source-doc/base-drv/enumerate.c:15: endpoint_param *const ep = &keyboard_config->endpoints[0]; +;source-doc/base-drv/enumerate.c:39: endpoint_param *const ep = &keyboard_config->endpoints[0]; inc hl inc hl inc hl -;source-doc/base-drv/enumerate.c:16: ep->number = pEndpoint->bEndpointAddress; +;source-doc/base-drv/enumerate.c:40: ep->number = pEndpoint->bEndpointAddress; ld c,l ld b,h ex (sp),hl @@ -80,12 +184,12 @@ _parse_endpoint_keyboard: and 0xf1 or c ld (hl), a -;source-doc/base-drv/enumerate.c:17: ep->toggle = 0; +;source-doc/base-drv/enumerate.c:41: ep->toggle = 0; pop hl ld c,l ld b,h res 0, (hl) -;source-doc/base-drv/enumerate.c:18: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); +;source-doc/base-drv/enumerate.c:42: ep->max_packet_sizex = calc_max_packet_sizex(pEndpoint->wMaxPacketSize); inc bc ld hl,4 add hl, de @@ -104,11 +208,11 @@ _parse_endpoint_keyboard: and 0xfc or l ld (bc), a -;source-doc/base-drv/enumerate.c:19: } +;source-doc/base-drv/enumerate.c:43: } ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:21: usb_device_type identify_class_driver(_working *const working) { +;source-doc/base-drv/enumerate.c:45: usb_device_type identify_class_driver(_working *const working) { ; --------------------------------- ; Function identify_class_driver ; --------------------------------- @@ -116,7 +220,7 @@ _identify_class_driver: push ix ld ix,0 add ix,sp -;source-doc/base-drv/enumerate.c:22: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; +;source-doc/base-drv/enumerate.c:46: const interface_descriptor *const p = (const interface_descriptor *)working->ptr; ld c,(ix+4) ld b,(ix+5) ld hl,27 @@ -124,18 +228,18 @@ _identify_class_driver: ld c, (hl) inc hl ld b, (hl) -;source-doc/base-drv/enumerate.c:23: if (p->bInterfaceClass == 2) +;source-doc/base-drv/enumerate.c:47: if (p->bInterfaceClass == 2) ld hl,5 add hl,bc ld a,(hl) ld e,a sub 0x02 jr NZ,l_identify_class_driver_00102 -;source-doc/base-drv/enumerate.c:24: return USB_IS_CDC; +;source-doc/base-drv/enumerate.c:48: return USB_IS_CDC; ld l,0x03 jr l_identify_class_driver_00118 l_identify_class_driver_00102: -;source-doc/base-drv/enumerate.c:26: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) +;source-doc/base-drv/enumerate.c:50: if (p->bInterfaceClass == 8 && (p->bInterfaceSubClass == 6 || p->bInterfaceSubClass == 5) && p->bInterfaceProtocol == 80) ld a, e sub 0x08 jr NZ,l_identify_class_driver_00199 @@ -160,11 +264,11 @@ l_identify_class_driver_00107: ld a, (hl) sub 0x50 jr NZ,l_identify_class_driver_00104 -;source-doc/base-drv/enumerate.c:27: return USB_IS_MASS_STORAGE; +;source-doc/base-drv/enumerate.c:51: return USB_IS_MASS_STORAGE; ld l,0x02 jr l_identify_class_driver_00118 l_identify_class_driver_00104: -;source-doc/base-drv/enumerate.c:29: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) +;source-doc/base-drv/enumerate.c:53: if (p->bInterfaceClass == 8 && p->bInterfaceSubClass == 4 && p->bInterfaceProtocol == 0) ld a, d or a jr Z,l_identify_class_driver_00109 @@ -178,11 +282,11 @@ l_identify_class_driver_00104: ld a, (hl) or a jr NZ,l_identify_class_driver_00109 -;source-doc/base-drv/enumerate.c:30: return USB_IS_FLOPPY; +;source-doc/base-drv/enumerate.c:54: return USB_IS_FLOPPY; ld l,0x01 jr l_identify_class_driver_00118 l_identify_class_driver_00109: -;source-doc/base-drv/enumerate.c:32: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) +;source-doc/base-drv/enumerate.c:56: if (p->bInterfaceClass == 9 && p->bInterfaceSubClass == 0 && p->bInterfaceProtocol == 0) ld a, e sub 0x09 jr NZ,l_identify_class_driver_00113 @@ -196,93 +300,107 @@ l_identify_class_driver_00109: ld a, (hl) or a jr NZ,l_identify_class_driver_00113 -;source-doc/base-drv/enumerate.c:33: return USB_IS_HUB; +;source-doc/base-drv/enumerate.c:57: return USB_IS_HUB; ld l,0x0f jr l_identify_class_driver_00118 l_identify_class_driver_00113: -;source-doc/base-drv/enumerate.c:35: if (p->bInterfaceClass == 3) +;source-doc/base-drv/enumerate.c:59: if (p->bInterfaceClass == 3) ld a, e sub 0x03 jr NZ,l_identify_class_driver_00117 -;source-doc/base-drv/enumerate.c:36: return USB_IS_KEYBOARD; +;source-doc/base-drv/enumerate.c:60: return USB_IS_KEYBOARD; ld l,0x04 jr l_identify_class_driver_00118 l_identify_class_driver_00117: -;source-doc/base-drv/enumerate.c:38: return USB_IS_UNKNOWN; +;source-doc/base-drv/enumerate.c:62: return USB_IS_UNKNOWN; ld l,0x06 l_identify_class_driver_00118: -;source-doc/base-drv/enumerate.c:39: } +;source-doc/base-drv/enumerate.c:63: } pop ix ret -;source-doc/base-drv/enumerate.c:41: usb_error op_interface_next(_working *const working) __z88dk_fastcall { +;source-doc/base-drv/enumerate.c:65: usb_error op_interface_next(_working *const working) __z88dk_fastcall { ; --------------------------------- ; Function op_interface_next ; --------------------------------- _op_interface_next: ex de, hl -;source-doc/base-drv/enumerate.c:42: if (--working->interface_count == 0) +;source-doc/base-drv/enumerate.c:68: if (--working->interface_count == 0) ld hl,0x0016 add hl, de ld a, (hl) dec a ld (hl), a -;source-doc/base-drv/enumerate.c:43: return USB_ERR_OK; +;source-doc/base-drv/enumerate.c:69: return USB_ERR_OK; or a jr NZ,l_op_interface_next_00102 ld l,a - jr l_op_interface_next_00103 + jr l_op_interface_next_00106 l_op_interface_next_00102: -;source-doc/base-drv/enumerate.c:45: return op_id_class_drv(working); +;source-doc/base-drv/enumerate.c:71: CHECK(adv_to_next_desc(working, USB_DESCR_INTERFACE)); + push de + ld a,0x04 + push af + inc sp + ex de,hl + call _adv_to_next_desc + pop de + ld l, a + or a + ret NZ +;source-doc/base-drv/enumerate.c:72: return op_id_class_drv(working); ex de, hl call _op_id_class_drv ld l, a -l_op_interface_next_00103: -;source-doc/base-drv/enumerate.c:46: } +;source-doc/base-drv/enumerate.c:74: done: +;source-doc/base-drv/enumerate.c:75: return result; +l_op_interface_next_00106: +;source-doc/base-drv/enumerate.c:76: } ret -;source-doc/base-drv/enumerate.c:48: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:78: usb_error op_endpoint_next(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_endpoint_next ; --------------------------------- _op_endpoint_next: - ex de, hl -;source-doc/base-drv/enumerate.c:49: if (working->endpoint_count != 0 && --working->endpoint_count > 0) { - ld hl,0x0017 - add hl, de - ld a, (hl) +;source-doc/base-drv/enumerate.c:81: if (working->endpoint_count != 0 && --working->endpoint_count > 0) { + ld a, l + add a,0x17 + ld c, a + ld a, h + adc a,0x00 + ld b, a + ld a, (bc) or a - jr Z,l_op_endpoint_next_00102 + jr Z,l_op_endpoint_next_00104 dec a - ld (hl), a + ld (bc), a or a - jr Z,l_op_endpoint_next_00102 -;source-doc/base-drv/enumerate.c:50: working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; - ld hl,0x001b - add hl, de - ld c, (hl) - inc hl - ld b, (hl) - dec hl - ld a, (bc) - add a, c + jr Z,l_op_endpoint_next_00104 +;source-doc/base-drv/enumerate.c:82: CHECK(adv_to_next_desc(working, USB_DESCR_ENDPOINT)); + push hl + ld a,0x05 + push af + inc sp + call _adv_to_next_desc + pop hl ld c, a - ld a,0x00 - adc a, b - ld (hl), c - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:51: return op_parse_endpoint(working); - ex de, hl + or a + jr NZ,l_op_endpoint_next_00106 +;source-doc/base-drv/enumerate.c:83: return op_parse_endpoint(working); jp _op_parse_endpoint - jr l_op_endpoint_next_00104 -l_op_endpoint_next_00102: -;source-doc/base-drv/enumerate.c:54: return op_interface_next(working); - ex de, hl + jr l_op_endpoint_next_00107 +l_op_endpoint_next_00104: +;source-doc/base-drv/enumerate.c:86: return op_interface_next(working); call _op_interface_next ld a, l -l_op_endpoint_next_00104: -;source-doc/base-drv/enumerate.c:55: } + jr l_op_endpoint_next_00107 +;source-doc/base-drv/enumerate.c:88: done: +l_op_endpoint_next_00106: +;source-doc/base-drv/enumerate.c:89: return result; + ld a, c +l_op_endpoint_next_00107: +;source-doc/base-drv/enumerate.c:90: } ret -;source-doc/base-drv/enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:92: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_parse_endpoint ; --------------------------------- @@ -291,7 +409,7 @@ _op_parse_endpoint: ld ix,0 add ix,sp push af -;source-doc/base-drv/enumerate.c:58: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; +;source-doc/base-drv/enumerate.c:93: const endpoint_descriptor *endpoint = (endpoint_descriptor *)working->ptr; ld de,0x001c ld c,l ld b,h @@ -301,13 +419,13 @@ _op_parse_endpoint: ld l, (hl) ld (ix-2),l ld (ix-1),a -;source-doc/base-drv/enumerate.c:59: device_config *const device = working->p_current_device; +;source-doc/base-drv/enumerate.c:94: device_config *const device = working->p_current_device; ld hl,29 add hl,bc ld e, (hl) inc hl ld d, (hl) -;source-doc/base-drv/enumerate.c:61: switch (working->usb_device) { +;source-doc/base-drv/enumerate.c:96: switch (working->usb_device) { ld l, c ld h, b inc hl @@ -320,9 +438,9 @@ _op_parse_endpoint: sub 0x04 jr Z,l_op_parse_endpoint_00103 jr l_op_parse_endpoint_00104 -;source-doc/base-drv/enumerate.c:63: case USB_IS_MASS_STORAGE: { +;source-doc/base-drv/enumerate.c:98: case USB_IS_MASS_STORAGE: { l_op_parse_endpoint_00102: -;source-doc/base-drv/enumerate.c:64: parse_endpoints((device_config_storage *)device, endpoint); +;source-doc/base-drv/enumerate.c:99: parse_endpoints((device_config_storage *)device, endpoint); push bc ld l,(ix-2) ld h,(ix-1) @@ -332,28 +450,28 @@ l_op_parse_endpoint_00102: pop af pop af pop bc -;source-doc/base-drv/enumerate.c:65: break; +;source-doc/base-drv/enumerate.c:100: break; jr l_op_parse_endpoint_00104 -;source-doc/base-drv/enumerate.c:68: case USB_IS_KEYBOARD: { +;source-doc/base-drv/enumerate.c:103: case USB_IS_KEYBOARD: { l_op_parse_endpoint_00103: -;source-doc/base-drv/enumerate.c:69: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); +;source-doc/base-drv/enumerate.c:104: parse_endpoint_keyboard((device_config_keyboard *)device, endpoint); ex de, hl push bc ld e,(ix-2) ld d,(ix-1) call _parse_endpoint_keyboard pop bc -;source-doc/base-drv/enumerate.c:72: } +;source-doc/base-drv/enumerate.c:107: } l_op_parse_endpoint_00104: -;source-doc/base-drv/enumerate.c:74: return op_endpoint_next(working); +;source-doc/base-drv/enumerate.c:109: return op_endpoint_next(working); ld l, c ld h, b call _op_endpoint_next -;source-doc/base-drv/enumerate.c:75: } +;source-doc/base-drv/enumerate.c:110: } ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:78: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { +;source-doc/base-drv/enumerate.c:113: configure_device(const _working *const working, const interface_descriptor *const interface, device_config *const dev_cfg) { ; --------------------------------- ; Function configure_device ; --------------------------------- @@ -363,7 +481,7 @@ _configure_device: add ix,sp push af push af -;source-doc/base-drv/enumerate.c:79: dev_cfg->interface_number = interface->bInterfaceNumber; +;source-doc/base-drv/enumerate.c:114: dev_cfg->interface_number = interface->bInterfaceNumber; ld c,(ix+8) ld b,(ix+9) ld e, c @@ -376,7 +494,7 @@ _configure_device: inc hl ld a, (hl) ld (de), a -;source-doc/base-drv/enumerate.c:80: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; +;source-doc/base-drv/enumerate.c:115: dev_cfg->max_packet_size = working->desc.bMaxPacketSize0; ld hl,0x0001 add hl, bc ex (sp), hl @@ -388,7 +506,7 @@ _configure_device: pop hl push hl ld (hl), a -;source-doc/base-drv/enumerate.c:81: dev_cfg->address = working->current_device_address; +;source-doc/base-drv/enumerate.c:116: dev_cfg->address = working->current_device_address; ld (ix-2),c ld (ix-1),b ld l, e @@ -413,7 +531,7 @@ _configure_device: or c ld (hl), a pop bc -;source-doc/base-drv/enumerate.c:82: dev_cfg->type = working->usb_device; +;source-doc/base-drv/enumerate.c:117: dev_cfg->type = working->usb_device; ld l, e ld h, d inc hl @@ -425,7 +543,7 @@ _configure_device: and 0xf0 or l ld (bc), a -;source-doc/base-drv/enumerate.c:84: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); +;source-doc/base-drv/enumerate.c:119: return usbtrn_set_configuration(dev_cfg->address, dev_cfg->max_packet_size, working->config.desc.bConfigurationvalue); ld hl,36 add hl, de ld b, (hl) @@ -445,11 +563,11 @@ _configure_device: push af inc sp call _usbtrn_set_configuration -;source-doc/base-drv/enumerate.c:85: } +;source-doc/base-drv/enumerate.c:120: } ld sp,ix pop ix ret -;source-doc/base-drv/enumerate.c:87: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:122: usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_capture_hub_driver_interface ; --------------------------------- @@ -461,7 +579,7 @@ _op_capture_hub_driver_interfac: push af dec sp ex de, hl -;source-doc/base-drv/enumerate.c:88: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; +;source-doc/base-drv/enumerate.c:123: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; ld hl,0x001c add hl,de ld a, (hl) @@ -469,7 +587,7 @@ _op_capture_hub_driver_interfac: ld l, (hl) ld (ix-2),l ld (ix-1),a -;source-doc/base-drv/enumerate.c:92: working->hub_config = &hub_config; +;source-doc/base-drv/enumerate.c:127: working->hub_config = &hub_config; ld hl,0x0019 add hl, de ld c, l @@ -481,13 +599,13 @@ _op_capture_hub_driver_interfac: inc bc ld a, h ld (bc), a -;source-doc/base-drv/enumerate.c:94: hub_config.type = USB_IS_HUB; +;source-doc/base-drv/enumerate.c:129: hub_config.type = USB_IS_HUB; ld hl,0 add hl, sp ld a, (hl) or 0x0f ld (hl), a -;source-doc/base-drv/enumerate.c:95: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); +;source-doc/base-drv/enumerate.c:130: CHECK(configure_device(working, interface, (device_config *const)&hub_config)); push de ld hl,2 add hl, sp @@ -505,18 +623,18 @@ _op_capture_hub_driver_interfac: inc l dec l jr NZ,l_op_capture_hub_driver_interfa -;source-doc/base-drv/enumerate.c:96: RETURN_CHECK(configure_usb_hub(working)); +;source-doc/base-drv/enumerate.c:131: RETURN_CHECK(configure_usb_hub(working)); ex de, hl call _configure_usb_hub ld a, l -;source-doc/base-drv/enumerate.c:97: done: +;source-doc/base-drv/enumerate.c:132: done: l_op_capture_hub_driver_interfa: -;source-doc/base-drv/enumerate.c:98: return result; -;source-doc/base-drv/enumerate.c:99: } +;source-doc/base-drv/enumerate.c:133: return result; +;source-doc/base-drv/enumerate.c:134: } ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { +;source-doc/base-drv/enumerate.c:136: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { ; --------------------------------- ; Function op_cap_drv_intf ; --------------------------------- @@ -529,89 +647,87 @@ _op_cap_drv_intf: ld hl, -14 add hl, sp ld sp, hl -;source-doc/base-drv/enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - ld (ix-2),c - ld l, c - ld (ix-1),b - ld h,b - ld de,0x001b +;source-doc/base-drv/enumerate.c:139: const interface_descriptor *const interface = (interface_descriptor *)working->ptr; + ld l,c + ld h, b + ld de,0x001c add hl, de - ld e, (hl) - inc hl - ld d, (hl) + ld a, (hl) dec hl - ld c, e - ld b, d -;source-doc/base-drv/enumerate.c:106: working->ptr += interface->bLength; - ld a, (bc) - add a, e - ld e, a - ld a,0x00 - adc a, d - ld (hl), e - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:107: working->endpoint_count = interface->bNumEndpoints; - ld a,(ix-2) - add a,0x17 - ld e, a - ld a,(ix-1) - adc a,0x00 - ld d, a - ld l, c - ld h, b + ld l, (hl) + ld (ix-2),l + ld (ix-1),a +;source-doc/base-drv/enumerate.c:141: working->endpoint_count = interface->bNumEndpoints; + ld hl,0x0017 + add hl, bc + ex de, hl + ld l,(ix-2) + ld h,(ix-1) inc hl inc hl inc hl inc hl ld a, (hl) ld (de), a -;source-doc/base-drv/enumerate.c:108: working->p_current_device = NULL; - ld a,(ix-2) - add a,0x1d - ld e, a - ld a,(ix-1) - adc a,0x00 - ld d, a - ld l, e - ld h, d +;source-doc/base-drv/enumerate.c:142: if (working->endpoint_count > 0) + or a + jr Z,l_op_cap_drv_intf_00104 +;source-doc/base-drv/enumerate.c:143: CHECK(adv_to_next_desc(working, USB_DESCR_ENDPOINT)); + push bc + ld a,0x05 + push af + inc sp + ld l, c + ld h, b + call _adv_to_next_desc + pop bc + or a + jp NZ, l_op_cap_drv_intf_00117 +l_op_cap_drv_intf_00104: +;source-doc/base-drv/enumerate.c:144: working->p_current_device = NULL; + ld hl,0x001d + add hl, bc + ld e,l + ld d,h xor a ld (hl), a inc hl ld (hl), a -;source-doc/base-drv/enumerate.c:110: switch (working->usb_device) { - ld l,(ix-2) - ld h,(ix-1) +;source-doc/base-drv/enumerate.c:146: switch (working->usb_device) { + ld l, c + ld h, b inc hl inc hl ld a, (hl) cp 0x06 - jr Z,l_op_cap_drv_intf_00104 + jr Z,l_op_cap_drv_intf_00108 sub 0x0f - jr NZ,l_op_cap_drv_intf_00107 -;source-doc/base-drv/enumerate.c:112: CHECK(op_capture_hub_driver_interface(working)) - ld l,(ix-2) - ld h,(ix-1) + jr NZ,l_op_cap_drv_intf_00111 +;source-doc/base-drv/enumerate.c:148: CHECK(op_capture_hub_driver_interface(working)) + ld l,c + ld h,b + push hl call _op_capture_hub_driver_interfac + pop bc or a - jr Z,l_op_cap_drv_intf_00112 - jr l_op_cap_drv_intf_00113 -;source-doc/base-drv/enumerate.c:116: case USB_IS_UNKNOWN: { -l_op_cap_drv_intf_00104: -;source-doc/base-drv/enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config)); + jr Z,l_op_cap_drv_intf_00116 + jr l_op_cap_drv_intf_00117 +;source-doc/base-drv/enumerate.c:152: case USB_IS_UNKNOWN: { +l_op_cap_drv_intf_00108: +;source-doc/base-drv/enumerate.c:154: memset(&unkown_dev_cfg, 0, sizeof(device_config)); push bc ld hl,2 add hl, sp ld b,0x06 -l_op_cap_drv_intf_00154: +l_op_cap_drv_intf_00165: xor a ld (hl), a inc hl ld (hl), a inc hl - djnz l_op_cap_drv_intf_00154 + djnz l_op_cap_drv_intf_00165 pop bc -;source-doc/base-drv/enumerate.c:119: working->p_current_device = &unkown_dev_cfg; +;source-doc/base-drv/enumerate.c:155: working->p_current_device = &unkown_dev_cfg; ld hl,0 add hl, sp ld a, l @@ -619,110 +735,119 @@ l_op_cap_drv_intf_00154: inc de ld a, h ld (de), a -;source-doc/base-drv/enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg)); - push hl +;source-doc/base-drv/enumerate.c:156: CHECK(configure_device(working, interface, &unkown_dev_cfg)); push bc + push hl ld l,(ix-2) ld h,(ix-1) push hl + push bc call _configure_device pop af pop af pop af ld a, l + pop bc or a - jr Z,l_op_cap_drv_intf_00112 - jr l_op_cap_drv_intf_00113 -;source-doc/base-drv/enumerate.c:124: default: { -l_op_cap_drv_intf_00107: -;source-doc/base-drv/enumerate.c:125: device_config *dev_cfg = find_first_free(); + jr Z,l_op_cap_drv_intf_00116 + jr l_op_cap_drv_intf_00117 +;source-doc/base-drv/enumerate.c:160: default: { +l_op_cap_drv_intf_00111: +;source-doc/base-drv/enumerate.c:161: device_config *dev_cfg = find_first_free(); push bc push de call _find_first_free pop de pop bc -;source-doc/base-drv/enumerate.c:126: if (dev_cfg == NULL) +;source-doc/base-drv/enumerate.c:162: if (dev_cfg == NULL) ld a, h or l - jr NZ,l_op_cap_drv_intf_00109 -;source-doc/base-drv/enumerate.c:127: return USB_ERR_OUT_OF_MEMORY; + jr NZ,l_op_cap_drv_intf_00113 +;source-doc/base-drv/enumerate.c:163: return USB_ERR_OUT_OF_MEMORY; ld l,0x83 - jr l_op_cap_drv_intf_00114 -l_op_cap_drv_intf_00109: -;source-doc/base-drv/enumerate.c:128: working->p_current_device = dev_cfg; + jr l_op_cap_drv_intf_00118 +l_op_cap_drv_intf_00113: +;source-doc/base-drv/enumerate.c:164: working->p_current_device = dev_cfg; ld a, l ld (de), a inc de ld a, h ld (de), a -;source-doc/base-drv/enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg)); - push hl +;source-doc/base-drv/enumerate.c:165: CHECK(configure_device(working, interface, dev_cfg)); push bc + push hl ld l,(ix-2) ld h,(ix-1) push hl + push bc call _configure_device pop af pop af pop af ld a, l + pop bc or a - jr NZ,l_op_cap_drv_intf_00113 -;source-doc/base-drv/enumerate.c:132: } -l_op_cap_drv_intf_00112: -;source-doc/base-drv/enumerate.c:134: result = op_parse_endpoint(working); - ld l,(ix-2) - ld h,(ix-1) + jr NZ,l_op_cap_drv_intf_00117 +;source-doc/base-drv/enumerate.c:168: } +l_op_cap_drv_intf_00116: +;source-doc/base-drv/enumerate.c:170: return op_parse_endpoint(working); + ld l, c + ld h, b call _op_parse_endpoint -;source-doc/base-drv/enumerate.c:136: done: -l_op_cap_drv_intf_00113: -;source-doc/base-drv/enumerate.c:137: return result; ld l, a -l_op_cap_drv_intf_00114: -;source-doc/base-drv/enumerate.c:138: } + jr l_op_cap_drv_intf_00118 +;source-doc/base-drv/enumerate.c:172: done: +l_op_cap_drv_intf_00117: +;source-doc/base-drv/enumerate.c:173: return result; + ld l, a +l_op_cap_drv_intf_00118: +;source-doc/base-drv/enumerate.c:174: } ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:176: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_id_class_drv ; --------------------------------- _op_id_class_drv: ex de, hl -;source-doc/base-drv/enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; +;source-doc/base-drv/enumerate.c:177: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; ld hl,27 add hl,de ld c, (hl) inc hl ld b, (hl) -;source-doc/base-drv/enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; - ld l, e - ld h, d - inc hl - inc hl +;source-doc/base-drv/enumerate.c:179: if (ptr->bDescriptorType != USB_DESCR_INTERFACE) + inc bc ld a, (bc) - cp 0x06 - jr C,l_op_id_class_drv_00103 - push hl + sub 0x04 + jr Z,l_op_id_class_drv_00102 +;source-doc/base-drv/enumerate.c:180: return USB_ERR_FAIL; + ld a,0x0e + jr l_op_id_class_drv_00103 +l_op_id_class_drv_00102: +;source-doc/base-drv/enumerate.c:182: working->usb_device = identify_class_driver(working); + ld c, e + ld b, d + inc bc + inc bc + push bc push de push de call _identify_class_driver pop af ld a, l pop de - pop hl - jr l_op_id_class_drv_00104 -l_op_id_class_drv_00103: - xor a -l_op_id_class_drv_00104: - ld (hl), a -;source-doc/base-drv/enumerate.c:145: return op_cap_drv_intf(working); + pop bc + ld (bc), a +;source-doc/base-drv/enumerate.c:184: return op_cap_drv_intf(working); ex de, hl call _op_cap_drv_intf ld a, l -;source-doc/base-drv/enumerate.c:146: } +l_op_id_class_drv_00103: +;source-doc/base-drv/enumerate.c:185: } ret -;source-doc/base-drv/enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { +;source-doc/base-drv/enumerate.c:187: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { ; --------------------------------- ; Function op_get_cfg_desc ; --------------------------------- @@ -731,29 +856,39 @@ _op_get_cfg_desc: ld ix,0 add ix,sp dec sp - ld c, l - ld b, h -;source-doc/base-drv/enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); +;source-doc/base-drv/enumerate.c:190: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + ld d,h + ld c,l + ld b,h + ld hl,10 + add hl,bc + ld a, (hl) + ld (ix-1),a +;source-doc/base-drv/enumerate.c:192: memset(working->config.buffer, 0, MAX_CONFIG_SIZE); ld hl,0x001f add hl, bc push bc ld b,0x46 -l_op_get_cfg_desc_00113: +l_op_get_cfg_desc_00122: xor a ld (hl), a inc hl ld (hl), a inc hl - djnz l_op_get_cfg_desc_00113 + djnz l_op_get_cfg_desc_00122 pop bc -;source-doc/base-drv/enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0; - ld e,c - ld d,b - ld hl,10 - add hl,bc - ld a, (hl) - ld (ix-1),a -;source-doc/base-drv/enumerate.c:154: working->config.buffer)); +;source-doc/base-drv/enumerate.c:193: working->ptr = working->config.buffer; + ld hl,0x001b + add hl, bc + ld a, c + add a,0x1f + ld e, a + ld a, b + adc a,0x00 + ld (hl), e + inc hl + ld (hl), a +;source-doc/base-drv/enumerate.c:196: working->config.buffer)); ld hl,0x001f add hl, bc ex de, hl @@ -778,25 +913,22 @@ l_op_get_cfg_desc_00113: pop af pop af pop af - pop bc ld a, l - ld (_result), a - ld hl,_result - ld a, (hl) + pop bc or a - jr NZ,l_op_get_cfg_desc_00103 -;source-doc/base-drv/enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor)); - ld hl,0x001b - add hl, bc - ld a, c - add a,0x28 - ld e, a - ld a, b - adc a,0x00 - ld (hl), e - inc hl - ld (hl), a -;source-doc/base-drv/enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces; + jr NZ,l_op_get_cfg_desc_00105 +;source-doc/base-drv/enumerate.c:198: CHECK(adv_to_next_desc(working, USB_DESCR_INTERFACE)); + push bc + ld a,0x04 + push af + inc sp + ld l, c + ld h, b + call _adv_to_next_desc + pop bc + or a + jr NZ,l_op_get_cfg_desc_00105 +;source-doc/base-drv/enumerate.c:199: working->interface_count = working->config.desc.bNumInterfaces; ld hl,0x0016 add hl, bc ex de, hl @@ -804,21 +936,18 @@ l_op_get_cfg_desc_00113: add hl,bc ld a, (hl) ld (de), a -;source-doc/base-drv/enumerate.c:159: return op_id_class_drv(working); +;source-doc/base-drv/enumerate.c:201: return op_id_class_drv(working); ld l, c ld h, b call _op_id_class_drv - jr l_op_get_cfg_desc_00104 -;source-doc/base-drv/enumerate.c:160: done: -l_op_get_cfg_desc_00103: -;source-doc/base-drv/enumerate.c:161: return result; - ld a, (_result) -l_op_get_cfg_desc_00104: -;source-doc/base-drv/enumerate.c:162: } +;source-doc/base-drv/enumerate.c:203: done: +;source-doc/base-drv/enumerate.c:204: return result; +l_op_get_cfg_desc_00105: +;source-doc/base-drv/enumerate.c:205: } inc sp pop ix ret -;source-doc/base-drv/enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) { +;source-doc/base-drv/enumerate.c:207: usb_error read_all_configs(enumeration_state *const state) { ; --------------------------------- ; Function read_all_configs ; --------------------------------- @@ -829,7 +958,7 @@ _read_all_configs: ld hl, -171 add hl, sp ld sp, hl -;source-doc/base-drv/enumerate.c:169: memset(&working, 0, sizeof(_working)); +;source-doc/base-drv/enumerate.c:212: memset(&working, 0, sizeof(_working)); ld hl,0 add hl, sp ld e,l @@ -843,7 +972,7 @@ l_read_all_configs_00150: ld (hl),0x00 inc hl djnz l_read_all_configs_00149 -;source-doc/base-drv/enumerate.c:170: working.state = state; +;source-doc/base-drv/enumerate.c:213: working.state = state; ld l, e ld h, d ld a,(ix+4) @@ -851,7 +980,7 @@ l_read_all_configs_00150: inc hl ld a,(ix+5) ld (hl), a -;source-doc/base-drv/enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc)); +;source-doc/base-drv/enumerate.c:215: CHECK(usbtrn_get_descriptor(&working.desc)); push de ld hl,5 add hl, sp @@ -862,7 +991,7 @@ l_read_all_configs_00150: pop de or a jr NZ,l_read_all_configs_00108 -;source-doc/base-drv/enumerate.c:174: state->next_device_address++; +;source-doc/base-drv/enumerate.c:217: state->next_device_address++; ld b,(ix+5) ld a,(ix+4) ld l, a @@ -872,17 +1001,17 @@ l_read_all_configs_00150: ld l, a ld h, b ld (hl), c -;source-doc/base-drv/enumerate.c:175: working.current_device_address = state->next_device_address; +;source-doc/base-drv/enumerate.c:218: working.current_device_address = state->next_device_address; ld hl,0x0018 add hl, de ld (hl), c -;source-doc/base-drv/enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address)); +;source-doc/base-drv/enumerate.c:219: CHECK(usbtrn_set_address(working.current_device_address)); push de ld l, c call _usbtrn_set_address ld a, l pop de -;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { +;source-doc/base-drv/enumerate.c:221: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { or a jr NZ,l_read_all_configs_00108 ld c,a @@ -893,11 +1022,11 @@ l_read_all_configs_00110: ld a, c sub b jr NC,l_read_all_configs_00107 -;source-doc/base-drv/enumerate.c:179: working.config_index = config_index; +;source-doc/base-drv/enumerate.c:222: working.config_index = config_index; ld hl,0x0015 add hl, de ld (hl), c -;source-doc/base-drv/enumerate.c:181: CHECK(op_get_cfg_desc(&working)); +;source-doc/base-drv/enumerate.c:224: CHECK(op_get_cfg_desc(&working)); ld l, e ld h, d push bc @@ -907,23 +1036,23 @@ l_read_all_configs_00110: pop bc or a jr NZ,l_read_all_configs_00108 -;source-doc/base-drv/enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { +;source-doc/base-drv/enumerate.c:221: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) { inc c jr l_read_all_configs_00110 l_read_all_configs_00107: -;source-doc/base-drv/enumerate.c:184: return USB_ERR_OK; +;source-doc/base-drv/enumerate.c:227: return USB_ERR_OK; ld l,0x00 jr l_read_all_configs_00112 -;source-doc/base-drv/enumerate.c:185: done: +;source-doc/base-drv/enumerate.c:228: done: l_read_all_configs_00108: -;source-doc/base-drv/enumerate.c:186: return result; +;source-doc/base-drv/enumerate.c:229: return result; ld l, a l_read_all_configs_00112: -;source-doc/base-drv/enumerate.c:187: } +;source-doc/base-drv/enumerate.c:230: } ld sp, ix pop ix ret -;source-doc/base-drv/enumerate.c:189: usb_error enumerate_all_devices(void) { +;source-doc/base-drv/enumerate.c:232: usb_error enumerate_all_devices(void) { ; --------------------------------- ; Function enumerate_all_devices ; --------------------------------- @@ -932,8 +1061,8 @@ _enumerate_all_devices: ld ix,0 add ix,sp push af -;source-doc/base-drv/enumerate.c:190: _usb_state *const work_area = get_usb_work_area(); -;source-doc/base-drv/enumerate.c:192: memset(&state, 0, sizeof(enumeration_state)); +;source-doc/base-drv/enumerate.c:233: _usb_state *const work_area = get_usb_work_area(); +;source-doc/base-drv/enumerate.c:235: memset(&state, 0, sizeof(enumeration_state)); ld hl,0 add hl, sp ld e,l @@ -942,18 +1071,18 @@ _enumerate_all_devices: ld (hl), a inc hl ld (hl), a -;source-doc/base-drv/enumerate.c:194: usb_error result = read_all_configs(&state); +;source-doc/base-drv/enumerate.c:237: usb_error result = read_all_configs(&state); push de push de call _read_all_configs pop af pop de -;source-doc/base-drv/enumerate.c:196: work_area->count_of_detected_usb_devices = state.next_device_address; +;source-doc/base-drv/enumerate.c:239: work_area->count_of_detected_usb_devices = state.next_device_address; ld bc,_x + 1 ld a, (de) ld (bc), a -;source-doc/base-drv/enumerate.c:199: return result; -;source-doc/base-drv/enumerate.c:200: } +;source-doc/base-drv/enumerate.c:242: return result; +;source-doc/base-drv/enumerate.c:243: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c index f4131d8c..69b666f6 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c @@ -10,6 +10,30 @@ usb_error op_id_class_drv(_working *const working) __sdcccall(1); usb_error op_parse_endpoint(_working *const working) __sdcccall(1); +static usb_error adv_to_next_desc(_working *const working, const uint8_t descriptor_type) __sdcccall(1) { + usb_descriptor_t *d; + const uint8_t *buffer_end = working->config.buffer + MAX_CONFIG_SIZE; + + if (working->ptr >= buffer_end) + return USB_ERR_BUFF_TO_LARGE; + + d = (usb_descriptor_t *)working->ptr; + + do { + working->ptr += d->bLength; + + if (working->ptr >= buffer_end) + return USB_ERR_BUFF_TO_LARGE; + + d = (usb_descriptor_t *)working->ptr; + } while (d->bDescriptorType != descriptor_type); + + if (working->ptr + d->bLength >= buffer_end) + return USB_ERR_BUFF_TO_LARGE; + + return USB_ERR_OK; +} + void parse_endpoint_keyboard(device_config_keyboard *const keyboard_config, const endpoint_descriptor const *pEndpoint) __sdcccall(1) { endpoint_param *const ep = &keyboard_config->endpoints[0]; @@ -39,19 +63,30 @@ usb_device_type identify_class_driver(_working *const working) { } usb_error op_interface_next(_working *const working) __z88dk_fastcall { + uint8_t result; + if (--working->interface_count == 0) return USB_ERR_OK; + CHECK(adv_to_next_desc(working, USB_DESCR_INTERFACE)); return op_id_class_drv(working); + +done: + return result; } usb_error op_endpoint_next(_working *const working) __sdcccall(1) { + usb_error result; + if (working->endpoint_count != 0 && --working->endpoint_count > 0) { - working->ptr += ((endpoint_descriptor *)working->ptr)->bLength; + CHECK(adv_to_next_desc(working, USB_DESCR_ENDPOINT)); return op_parse_endpoint(working); } return op_interface_next(working); + +done: + return result; } usb_error op_parse_endpoint(_working *const working) __sdcccall(1) { @@ -103,8 +138,9 @@ usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { _usb_state *const work_area = get_usb_work_area(); const interface_descriptor *const interface = (interface_descriptor *)working->ptr; - working->ptr += interface->bLength; - working->endpoint_count = interface->bNumEndpoints; + working->endpoint_count = interface->bNumEndpoints; + if (working->endpoint_count > 0) + CHECK(adv_to_next_desc(working, USB_DESCR_ENDPOINT)); working->p_current_device = NULL; switch (working->usb_device) { @@ -131,7 +167,7 @@ usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { } } - result = op_parse_endpoint(working); + return op_parse_endpoint(working); done: return result; @@ -140,23 +176,30 @@ done: usb_error op_id_class_drv(_working *const working) __sdcccall(1) { const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; - working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; + if (ptr->bDescriptorType != USB_DESCR_INTERFACE) + return USB_ERR_FAIL; + + working->usb_device = identify_class_driver(working); return op_cap_drv_intf(working); } usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { - memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + usb_error result; const uint8_t max_packet_size = working->desc.bMaxPacketSize0; + memset(working->config.buffer, 0, MAX_CONFIG_SIZE); + working->ptr = working->config.buffer; + CHECK(usbtrn_gfull_cfg_desc(working->config_index, working->current_device_address, max_packet_size, MAX_CONFIG_SIZE, working->config.buffer)); - working->ptr = (working->config.buffer + sizeof(config_descriptor)); + CHECK(adv_to_next_desc(working, USB_DESCR_INTERFACE)); working->interface_count = working->config.desc.bNumInterfaces; return op_id_class_drv(working); + done: return result; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h index df622b44..d0ec7091 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.h @@ -6,6 +6,22 @@ #include "transfers.h" #include +typedef struct { + uint8_t bLength; + uint8_t bDescriptorType; +} usb_descriptor_t; + +#define USB_DESCR_DEVICE 1 +#define USB_DESCR_CONFIGURATION 2 +#define USB_DESCR_STRING 3 +#define USB_DESCR_INTERFACE 4 +#define USB_DESCR_ENDPOINT 5 +#define USB_DESCR_DEV_QUALIFIER 6 +#define USB_DESCR_OTHER_SPEED 7 +#define USB_DESCR_HID 33 +#define USB_DESCR_HID_REPORT 34 +#define USB_DESCR_HID_PHYSICAL_DESC 35 + typedef struct _device_descriptor { uint8_t bLength; uint8_t bDescriptorType; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index a285685c..9705b89e 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -82,7 +82,7 @@ done: } /** - * @brief Perform a USB data in on the specififed endpoint + * @brief Perform a USB data in on the specified endpoint * * @param buffer the buffer to receive the data * @param buffer_size the maximum size of data to be received From 024074b2cf1a9ab14ee1eeeedad780801518ea83 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Mon, 5 May 2025 12:13:29 +1000 Subject: [PATCH 54/59] ch376-native: fixed issue where keyboard int handler could cause corruption of io --- Source/HBIOS/Config/RCEZ80_std.asm | 4 +- Source/HBIOS/ch376-native/base-drv/ch376.c.s | 284 ++++++++------- .../ch376-native/base-drv/dev_transfers.c.s | 331 ++++++++---------- .../HBIOS/ch376-native/base-drv/protocol.c.s | 128 +++---- .../HBIOS/ch376-native/base-drv/transfers.c.s | 56 ++- .../ch376-native/base-drv/usb-base-drv.c.s | 6 +- .../ch376-native/keyboard/kyb_driver.c.s | 51 +-- .../ch376-native/scsi-drv/class_scsi.c.s | 107 +++--- .../ch376-native/scsi-drv/scsi_driver.c.s | 295 ++++++++-------- .../ch376-native/source-doc/base-drv/ch376.c | 5 +- .../ch376-native/source-doc/base-drv/ch376.h | 2 - .../source-doc/base-drv/dev_transfers.c | 6 + .../source-doc/base-drv/protocol.c | 4 + .../source-doc/base-drv/transfers.c | 4 + .../source-doc/keyboard/kyb_driver.c | 2 + .../source-doc/scsi-drv/class_scsi.c | 2 + .../source-doc/scsi-drv/scsi_driver.c | 5 + .../ch376-native/source-doc/ufi-drv/usb_cbi.c | 2 +- Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 26 +- 19 files changed, 630 insertions(+), 690 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 8743b2b0..fe4c9450 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -89,7 +89,7 @@ CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET FALSE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE +CHNATIVEEZ80 .SET TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED -EZ80TIMER .SET EZ80TMR_INT ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] +EZ80TIMER .SET EZ80TMR_FIRM ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 35d7c3cb..710a7959 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -33,8 +33,6 @@ _USB_MODULE_LEDS .EQU 0xff8a ; .area _INITIALIZED removed by z88dk -_result: - DEFS 1 #ENDIF @@ -50,12 +48,12 @@ _result: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/base-drv/ch376.c:8: void ch_command(const uint8_t command) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:6: void ch_command(const uint8_t command) __z88dk_fastcall { ; --------------------------------- ; Function ch_command ; --------------------------------- _ch_command: -;source-doc/base-drv/ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) +;source-doc/base-drv/ch376.c:8: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) ld b,0xff l_ch_command_00102: ld a, +((_CH376_COMMAND_PORT) / 256) @@ -64,150 +62,150 @@ l_ch_command_00102: jr Z,l_ch_command_00104 djnz l_ch_command_00102 l_ch_command_00104: -;source-doc/base-drv/ch376.c:21: CH376_COMMAND_PORT = command; +;source-doc/base-drv/ch376.c:19: CH376_COMMAND_PORT = command; ld a, l ld bc,_CH376_COMMAND_PORT out (c), a -;source-doc/base-drv/ch376.c:22: } +;source-doc/base-drv/ch376.c:20: } ret -;source-doc/base-drv/ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } +;source-doc/base-drv/ch376.c:24: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); } ; --------------------------------- ; Function ch_long_wait_int_and_get_status ; --------------------------------- _ch_long_wait_int_and_get_statu: ld hl,0x1388 jp _ch_wait_int_and_get_status -;source-doc/base-drv/ch376.c:28: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } +;source-doc/base-drv/ch376.c:26: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); } ; --------------------------------- ; Function ch_short_wait_int_and_get_statu ; --------------------------------- _ch_short_wait_int_and_get_stat: ld hl,0x0064 jp _ch_wait_int_and_get_status -;source-doc/base-drv/ch376.c:30: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } +;source-doc/base-drv/ch376.c:28: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); } ; --------------------------------- ; Function ch_very_short_wait_int_and_get_ ; --------------------------------- _ch_very_short_wait_int_and_get: ld hl,0x000a jp _ch_wait_int_and_get_status -;source-doc/base-drv/ch376.c:32: usb_error ch_get_status(void) { +;source-doc/base-drv/ch376.c:30: usb_error ch_get_status(void) { ; --------------------------------- ; Function ch_get_status ; --------------------------------- _ch_get_status: -;source-doc/base-drv/ch376.c:33: ch_command(CH_CMD_GET_STATUS); +;source-doc/base-drv/ch376.c:31: ch_command(CH_CMD_GET_STATUS); ld l,0x22 call _ch_command -;source-doc/base-drv/ch376.c:34: uint8_t ch_status = CH376_DATA_PORT; +;source-doc/base-drv/ch376.c:32: uint8_t ch_status = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) +;source-doc/base-drv/ch376.c:34: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) cp 0x41 jr C,l_ch_get_status_00102 cp 0xb5 jr NC,l_ch_get_status_00102 -;source-doc/base-drv/ch376.c:37: return ch_status; +;source-doc/base-drv/ch376.c:35: return ch_status; ld l, a jr l_ch_get_status_00126 l_ch_get_status_00102: -;source-doc/base-drv/ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS) +;source-doc/base-drv/ch376.c:37: if (ch_status == CH_CMD_RET_SUCCESS) cp 0x51 jr NZ,l_ch_get_status_00105 -;source-doc/base-drv/ch376.c:40: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:38: return USB_ERR_OK; ld l,0x00 jr l_ch_get_status_00126 l_ch_get_status_00105: -;source-doc/base-drv/ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS) +;source-doc/base-drv/ch376.c:40: if (ch_status == CH_USB_INT_SUCCESS) cp 0x14 jr NZ,l_ch_get_status_00107 -;source-doc/base-drv/ch376.c:43: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:41: return USB_ERR_OK; ld l,0x00 jr l_ch_get_status_00126 l_ch_get_status_00107: -;source-doc/base-drv/ch376.c:45: if (ch_status == CH_USB_INT_CONNECT) +;source-doc/base-drv/ch376.c:43: if (ch_status == CH_USB_INT_CONNECT) cp 0x15 jr NZ,l_ch_get_status_00109 -;source-doc/base-drv/ch376.c:46: return USB_INT_CONNECT; +;source-doc/base-drv/ch376.c:44: return USB_INT_CONNECT; ld l,0x81 jr l_ch_get_status_00126 l_ch_get_status_00109: -;source-doc/base-drv/ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ) +;source-doc/base-drv/ch376.c:46: if (ch_status == CH_USB_INT_DISK_READ) cp 0x1d jr NZ,l_ch_get_status_00111 -;source-doc/base-drv/ch376.c:49: return USB_ERR_DISK_READ; +;source-doc/base-drv/ch376.c:47: return USB_ERR_DISK_READ; ld l,0x1d jr l_ch_get_status_00126 l_ch_get_status_00111: -;source-doc/base-drv/ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE) +;source-doc/base-drv/ch376.c:49: if (ch_status == CH_USB_INT_DISK_WRITE) cp 0x1e jr NZ,l_ch_get_status_00113 -;source-doc/base-drv/ch376.c:52: return USB_ERR_DISK_WRITE; +;source-doc/base-drv/ch376.c:50: return USB_ERR_DISK_WRITE; ld l,0x1e jr l_ch_get_status_00126 l_ch_get_status_00113: -;source-doc/base-drv/ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) { +;source-doc/base-drv/ch376.c:52: if (ch_status == CH_USB_INT_DISCONNECT) { cp 0x16 jr NZ,l_ch_get_status_00115 -;source-doc/base-drv/ch376.c:55: ch_cmd_set_usb_mode(5); +;source-doc/base-drv/ch376.c:53: ch_cmd_set_usb_mode(5); ld l,0x05 call _ch_cmd_set_usb_mode -;source-doc/base-drv/ch376.c:56: return USB_ERR_NO_DEVICE; +;source-doc/base-drv/ch376.c:54: return USB_ERR_NO_DEVICE; ld l,0x05 jr l_ch_get_status_00126 l_ch_get_status_00115: -;source-doc/base-drv/ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER) +;source-doc/base-drv/ch376.c:57: if (ch_status == CH_USB_INT_BUF_OVER) cp 0x17 jr NZ,l_ch_get_status_00117 -;source-doc/base-drv/ch376.c:60: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/ch376.c:58: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_get_status_00126 l_ch_get_status_00117: -;source-doc/base-drv/ch376.c:62: ch_status &= 0x2F; +;source-doc/base-drv/ch376.c:60: ch_status &= 0x2F; and 0x2f -;source-doc/base-drv/ch376.c:64: if (ch_status == 0x2A) +;source-doc/base-drv/ch376.c:62: if (ch_status == 0x2A) cp 0x2a jr NZ,l_ch_get_status_00119 -;source-doc/base-drv/ch376.c:65: return USB_ERR_NAK; +;source-doc/base-drv/ch376.c:63: return USB_ERR_NAK; ld l,0x01 jr l_ch_get_status_00126 l_ch_get_status_00119: -;source-doc/base-drv/ch376.c:67: if (ch_status == 0x2E) +;source-doc/base-drv/ch376.c:65: if (ch_status == 0x2E) cp 0x2e jr NZ,l_ch_get_status_00121 -;source-doc/base-drv/ch376.c:68: return USB_ERR_STALL; +;source-doc/base-drv/ch376.c:66: return USB_ERR_STALL; ld l,0x02 jr l_ch_get_status_00126 l_ch_get_status_00121: -;source-doc/base-drv/ch376.c:70: ch_status &= 0x23; +;source-doc/base-drv/ch376.c:68: ch_status &= 0x23; and 0x23 -;source-doc/base-drv/ch376.c:72: if (ch_status == 0x20) +;source-doc/base-drv/ch376.c:70: if (ch_status == 0x20) cp 0x20 jr NZ,l_ch_get_status_00123 -;source-doc/base-drv/ch376.c:73: return USB_ERR_TIMEOUT; +;source-doc/base-drv/ch376.c:71: return USB_ERR_TIMEOUT; ld l,0x03 jr l_ch_get_status_00126 l_ch_get_status_00123: -;source-doc/base-drv/ch376.c:75: if (ch_status == 0x23) +;source-doc/base-drv/ch376.c:73: if (ch_status == 0x23) sub 0x23 jr NZ,l_ch_get_status_00125 -;source-doc/base-drv/ch376.c:76: return USB_TOKEN_OUT_OF_SYNC; +;source-doc/base-drv/ch376.c:74: return USB_TOKEN_OUT_OF_SYNC; ld l,0x07 jr l_ch_get_status_00126 l_ch_get_status_00125: -;source-doc/base-drv/ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_; +;source-doc/base-drv/ch376.c:76: return USB_ERR_UNEXPECTED_STATUS_FROM_; ld l,0x08 l_ch_get_status_00126: -;source-doc/base-drv/ch376.c:79: } +;source-doc/base-drv/ch376.c:77: } ret -;source-doc/base-drv/ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } +;source-doc/base-drv/ch376.c:79: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); } ; --------------------------------- ; Function ch_cmd_reset_all ; --------------------------------- _ch_cmd_reset_all: ld l,0x05 jp _ch_command -;source-doc/base-drv/ch376.c:100: uint8_t ch_probe(void) { +;source-doc/base-drv/ch376.c:98: uint8_t ch_probe(void) { ; --------------------------------- ; Function ch_probe ; --------------------------------- @@ -216,66 +214,66 @@ _ch_probe: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/ch376.c:102: do { +;source-doc/base-drv/ch376.c:100: do { ld (ix-1),0x05 l_ch_probe_00103: -;source-doc/base-drv/ch376.c:85: ch_command(CH_CMD_CHECK_EXIST); +;source-doc/base-drv/ch376.c:83: ch_command(CH_CMD_CHECK_EXIST); ld l,0x06 call _ch_command -;source-doc/base-drv/ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55; +;source-doc/base-drv/ch376.c:84: CH376_DATA_PORT = (uint8_t)~0x55; ld a,0xaa ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.c:87: delay(); +;source-doc/base-drv/ch376.c:85: delay(); call _delay -;source-doc/base-drv/ch376.c:88: complement = CH376_DATA_PORT; +;source-doc/base-drv/ch376.c:86: complement = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) -;source-doc/base-drv/ch376.c:89: return complement == 0x55; +;source-doc/base-drv/ch376.c:87: return complement == 0x55; sub 0x55 jr NZ,l_ch_probe_00102 -;source-doc/base-drv/ch376.c:103: if (ch_cmd_check_exist()) -;source-doc/base-drv/ch376.c:104: return true; +;source-doc/base-drv/ch376.c:101: if (ch_cmd_check_exist()) +;source-doc/base-drv/ch376.c:102: return true; ld l,0x01 jr l_ch_probe_00107 l_ch_probe_00102: -;source-doc/base-drv/ch376.c:106: delay_medium(); +;source-doc/base-drv/ch376.c:104: delay_medium(); call _delay_medium -;source-doc/base-drv/ch376.c:107: } while (--i != 0); +;source-doc/base-drv/ch376.c:105: } while (--i != 0); dec (ix-1) jr NZ,l_ch_probe_00103 -;source-doc/base-drv/ch376.c:109: return false; +;source-doc/base-drv/ch376.c:107: return false; ld l,0x00 l_ch_probe_00107: -;source-doc/base-drv/ch376.c:110: } +;source-doc/base-drv/ch376.c:108: } inc sp pop ix ret -;source-doc/base-drv/ch376.c:112: usb_error ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:110: usb_error ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall { ; --------------------------------- ; Function ch_cmd_set_usb_mode ; --------------------------------- _ch_cmd_set_usb_mode: ld c, l -;source-doc/base-drv/ch376.c:113: uint8_t result = 0; +;source-doc/base-drv/ch376.c:111: uint8_t result = 0; ld b,0x00 -;source-doc/base-drv/ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; +;source-doc/base-drv/ch376.c:113: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE; ld a,0x15 push bc ld bc,_CH376_COMMAND_PORT out (c), a -;source-doc/base-drv/ch376.c:116: delay(); +;source-doc/base-drv/ch376.c:114: delay(); call _delay pop bc -;source-doc/base-drv/ch376.c:117: CH376_DATA_PORT = mode; +;source-doc/base-drv/ch376.c:115: CH376_DATA_PORT = mode; ld a, c push bc ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.c:118: delay(); +;source-doc/base-drv/ch376.c:116: delay(); call _delay pop bc -;source-doc/base-drv/ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { +;source-doc/base-drv/ch376.c:120: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) { ld c,0x7f l_ch_cmd_set_usb_mode_00103: ld a, b @@ -294,17 +292,17 @@ l_ch_cmd_set_usb_mode_00147: jr Z,l_ch_cmd_set_usb_mode_00105 dec c jr Z,l_ch_cmd_set_usb_mode_00105 -;source-doc/base-drv/ch376.c:123: result = CH376_DATA_PORT; +;source-doc/base-drv/ch376.c:121: result = CH376_DATA_PORT; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) ld b, a -;source-doc/base-drv/ch376.c:124: delay(); +;source-doc/base-drv/ch376.c:122: delay(); push bc call _delay pop bc jr l_ch_cmd_set_usb_mode_00103 l_ch_cmd_set_usb_mode_00105: -;source-doc/base-drv/ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; +;source-doc/base-drv/ch376.c:125: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL; ld a, e or a jr Z,l_ch_cmd_set_usb_mode_00108 @@ -313,24 +311,24 @@ l_ch_cmd_set_usb_mode_00105: l_ch_cmd_set_usb_mode_00108: ld l,0x0e l_ch_cmd_set_usb_mode_00109: -;source-doc/base-drv/ch376.c:128: } +;source-doc/base-drv/ch376.c:126: } ret -;source-doc/base-drv/ch376.c:130: uint8_t ch_cmd_get_ic_version(void) { +;source-doc/base-drv/ch376.c:128: uint8_t ch_cmd_get_ic_version(void) { ; --------------------------------- ; Function ch_cmd_get_ic_version ; --------------------------------- _ch_cmd_get_ic_version: -;source-doc/base-drv/ch376.c:131: ch_command(CH_CMD_GET_IC_VER); +;source-doc/base-drv/ch376.c:129: ch_command(CH_CMD_GET_IC_VER); ld l,0x01 call _ch_command -;source-doc/base-drv/ch376.c:132: return CH376_DATA_PORT & 0x1f; +;source-doc/base-drv/ch376.c:130: return CH376_DATA_PORT & 0x1f; ld a, +((_CH376_DATA_PORT) / 256) in a, (((_CH376_DATA_PORT) & 0xFF)) and 0x1f ld l, a -;source-doc/base-drv/ch376.c:133: } +;source-doc/base-drv/ch376.c:131: } ret -;source-doc/base-drv/ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { +;source-doc/base-drv/ch376.c:133: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { ; --------------------------------- ; Function ch_issue_token ; --------------------------------- @@ -338,14 +336,14 @@ _ch_issue_token: push ix ld ix,0 add ix,sp -;source-doc/base-drv/ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X); +;source-doc/base-drv/ch376.c:134: ch_command(CH_CMD_ISSUE_TKN_X); ld l,0x4e call _ch_command -;source-doc/base-drv/ch376.c:137: CH376_DATA_PORT = toggle_bit; +;source-doc/base-drv/ch376.c:135: CH376_DATA_PORT = toggle_bit; ld a,(ix+4) ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid; +;source-doc/base-drv/ch376.c:136: CH376_DATA_PORT = endpoint << 4 | pid; ld a,(ix+5) add a, a add a, a @@ -354,15 +352,15 @@ _ch_issue_token: or (ix+6) ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.c:139: } +;source-doc/base-drv/ch376.c:137: } pop ix ret -;source-doc/base-drv/ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:139: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_in ; --------------------------------- _ch_issue_token_in: -;source-doc/base-drv/ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); +;source-doc/base-drv/ch376.c:140: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN); ld e,l ld d,h ld a, (hl) @@ -386,14 +384,14 @@ l_ch_issue_token_in_00104: call _ch_issue_token pop af inc sp -;source-doc/base-drv/ch376.c:143: } +;source-doc/base-drv/ch376.c:141: } ret -;source-doc/base-drv/ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:143: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall { ; --------------------------------- ; Function ch_issue_token_out ; --------------------------------- _ch_issue_token_out: -;source-doc/base-drv/ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); +;source-doc/base-drv/ch376.c:144: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT); ld e,l ld d,h ld a, (hl) @@ -417,9 +415,9 @@ l_ch_issue_token_out_00104: call _ch_issue_token pop af inc sp -;source-doc/base-drv/ch376.c:147: } +;source-doc/base-drv/ch376.c:145: } ret -;source-doc/base-drv/ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } +;source-doc/base-drv/ch376.c:147: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); } ; --------------------------------- ; Function ch_issue_token_out_ep0 ; --------------------------------- @@ -435,7 +433,7 @@ _ch_issue_token_out_ep0: pop af inc sp ret -;source-doc/base-drv/ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } +;source-doc/base-drv/ch376.c:149: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } ; --------------------------------- ; Function ch_issue_token_in_ep0 ; --------------------------------- @@ -451,7 +449,7 @@ _ch_issue_token_in_ep0: pop af inc sp ret -;source-doc/base-drv/ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } +;source-doc/base-drv/ch376.c:151: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } ; --------------------------------- ; Function ch_issue_token_setup ; --------------------------------- @@ -469,7 +467,7 @@ _ch_issue_token_setup: pop af inc sp ret -;source-doc/base-drv/ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:153: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer ; --------------------------------- @@ -477,37 +475,36 @@ _ch_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/ch376.c:158: if (buffer_size == 0) +;source-doc/base-drv/ch376.c:157: if (buffer_size == 0) ld a,(ix+7) or (ix+6) jr NZ,l_ch_data_in_transfer_00102 -;source-doc/base-drv/ch376.c:159: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:158: return USB_ERR_OK; ld l,0x00 jp l_ch_data_in_transfer_00111 l_ch_data_in_transfer_00102: -;source-doc/base-drv/ch376.c:161: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/ch376.c:160: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:162: do { +;source-doc/base-drv/ch376.c:161: do { ld c,(ix+8) ld b,(ix+9) l_ch_data_in_transfer_00107: -;source-doc/base-drv/ch376.c:163: ch_issue_token_in(endpoint); +;source-doc/base-drv/ch376.c:162: ch_issue_token_in(endpoint); ld l,c ld h,b push hl call _ch_issue_token_in -;source-doc/base-drv/ch376.c:165: result = ch_long_wait_int_and_get_status(); +;source-doc/base-drv/ch376.c:164: result = ch_long_wait_int_and_get_status(); call _ch_long_wait_int_and_get_statu - pop bc ld a, l - ld (_result), a -;source-doc/base-drv/ch376.c:166: CHECK(result); - ld a,(_result) + pop bc + ld l, a +;source-doc/base-drv/ch376.c:165: CHECK(result); or a jr NZ,l_ch_data_in_transfer_00110 -;source-doc/base-drv/ch376.c:168: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:167: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l, e @@ -521,32 +518,32 @@ l_ch_data_in_transfer_00107: and 0xfe or l ld (de), a -;source-doc/base-drv/ch376.c:170: count = ch_read_data(buffer); +;source-doc/base-drv/ch376.c:169: count = ch_read_data(buffer); push bc ld l,(ix+4) ld h,(ix+5) call _ch_read_data ld e, a pop bc -;source-doc/base-drv/ch376.c:172: if (count == 0) { +;source-doc/base-drv/ch376.c:171: if (count == 0) { ld a, e -;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:172: USB_MODULE_LEDS = 0x00; or a jr NZ,l_ch_data_in_transfer_00106 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR; +;source-doc/base-drv/ch376.c:173: return USB_ERR_DATA_ERROR; ld l,0x04 jr l_ch_data_in_transfer_00111 l_ch_data_in_transfer_00106: -;source-doc/base-drv/ch376.c:177: buffer += count; +;source-doc/base-drv/ch376.c:176: buffer += count; ld a,(ix+4) add a, e ld (ix+4),a jr NC,l_ch_data_in_transfer_00148 inc (ix+5) l_ch_data_in_transfer_00148: -;source-doc/base-drv/ch376.c:178: buffer_size -= count; +;source-doc/base-drv/ch376.c:177: buffer_size -= count; ld d,0x00 ld a,(ix+6) sub e @@ -554,7 +551,7 @@ l_ch_data_in_transfer_00148: ld a,(ix+7) sbc a, d ld (ix+7),a -;source-doc/base-drv/ch376.c:179: } while (buffer_size > 0); +;source-doc/base-drv/ch376.c:178: } while (buffer_size > 0); xor a cp (ix+6) sbc a,(ix+7) @@ -562,26 +559,25 @@ l_ch_data_in_transfer_00148: xor 0x80 l_ch_data_in_transfer_00149: jp M, l_ch_data_in_transfer_00107 -;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:180: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:182: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:181: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_00111 -;source-doc/base-drv/ch376.c:184: done: +;source-doc/base-drv/ch376.c:183: done: l_ch_data_in_transfer_00110: -;source-doc/base-drv/ch376.c:185: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:184: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:186: return result; - ld hl, (_result) +;source-doc/base-drv/ch376.c:185: return result; l_ch_data_in_transfer_00111: -;source-doc/base-drv/ch376.c:187: } +;source-doc/base-drv/ch376.c:186: } pop ix ret -;source-doc/base-drv/ch376.c:190: usb_error ch_data_in_transfer_n(uint8_t *const buffer, uint8_t *const buffer_size, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:189: usb_error ch_data_in_transfer_n(uint8_t *const buffer, uint8_t *const buffer_size, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_in_transfer_n ; --------------------------------- @@ -589,20 +585,20 @@ _ch_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/ch376.c:194: USB_MODULE_LEDS = 0x01; +;source-doc/base-drv/ch376.c:193: USB_MODULE_LEDS = 0x01; ld a,0x01 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:196: ch_issue_token_in(endpoint); +;source-doc/base-drv/ch376.c:195: ch_issue_token_in(endpoint); ld l,(ix+8) ld h,(ix+9) call _ch_issue_token_in -;source-doc/base-drv/ch376.c:198: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/ch376.c:197: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a,l or a jr NZ,l_ch_data_in_transfer_n_00103 -;source-doc/base-drv/ch376.c:200: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:199: endpoint->toggle = !endpoint->toggle; ld l,(ix+8) ld h,(ix+9) ld a, (hl) @@ -614,33 +610,33 @@ _ch_data_in_transfer_n: and 0xfe or c ld (hl), a -;source-doc/base-drv/ch376.c:202: count = ch_read_data(buffer); +;source-doc/base-drv/ch376.c:201: count = ch_read_data(buffer); ld l,(ix+4) ld h,(ix+5) call _ch_read_data -;source-doc/base-drv/ch376.c:204: *buffer_size = count; +;source-doc/base-drv/ch376.c:203: *buffer_size = count; ld c,(ix+6) ld b,(ix+7) ld (bc), a -;source-doc/base-drv/ch376.c:206: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:208: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:207: return USB_ERR_OK; ld l,0x00 jr l_ch_data_in_transfer_n_00104 -;source-doc/base-drv/ch376.c:209: done: +;source-doc/base-drv/ch376.c:208: done: l_ch_data_in_transfer_n_00103: -;source-doc/base-drv/ch376.c:210: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:211: return result; +;source-doc/base-drv/ch376.c:210: return result; l_ch_data_in_transfer_n_00104: -;source-doc/base-drv/ch376.c:212: } +;source-doc/base-drv/ch376.c:211: } pop ix ret -;source-doc/base-drv/ch376.c:214: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { +;source-doc/base-drv/ch376.c:213: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { ; --------------------------------- ; Function ch_data_out_transfer ; --------------------------------- @@ -649,7 +645,7 @@ _ch_data_out_transfer: ld ix,0 add ix,sp dec sp -;source-doc/base-drv/ch376.c:217: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); +;source-doc/base-drv/ch376.c:216: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex); ld c,(ix+8) ld b,(ix+9) ld e, c @@ -657,13 +653,13 @@ _ch_data_out_transfer: inc de ld a, (de) ld (ix-1),a -;source-doc/base-drv/ch376.c:219: USB_MODULE_LEDS = 0x02; +;source-doc/base-drv/ch376.c:218: USB_MODULE_LEDS = 0x02; ld a,0x02 push bc ld bc,_USB_MODULE_LEDS out (c), a pop bc -;source-doc/base-drv/ch376.c:221: while (buffer_length > 0) { +;source-doc/base-drv/ch376.c:220: while (buffer_length > 0) { l_ch_data_out_transfer_00103: xor a cp (ix+6) @@ -672,7 +668,7 @@ l_ch_data_out_transfer_00103: xor 0x80 l_ch_data_out_transfer_00139: jp P, l_ch_data_out_transfer_00105 -;source-doc/base-drv/ch376.c:222: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; +;source-doc/base-drv/ch376.c:221: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length; ld d,(ix-1) ld e,0x00 ld a, d @@ -688,7 +684,7 @@ l_ch_data_out_transfer_00109: ld d,(ix+6) ld e,(ix+7) l_ch_data_out_transfer_00110: -;source-doc/base-drv/ch376.c:223: buffer = ch_write_data(buffer, size); +;source-doc/base-drv/ch376.c:222: buffer = ch_write_data(buffer, size); push bc push de push de @@ -703,7 +699,7 @@ l_ch_data_out_transfer_00110: pop bc ld (ix+4),l ld (ix+5),h -;source-doc/base-drv/ch376.c:224: buffer_length -= size; +;source-doc/base-drv/ch376.c:223: buffer_length -= size; ld e,0x00 ld a,(ix+6) sub d @@ -711,19 +707,19 @@ l_ch_data_out_transfer_00110: ld a,(ix+7) sbc a, e ld (ix+7),a -;source-doc/base-drv/ch376.c:225: ch_issue_token_out(endpoint); +;source-doc/base-drv/ch376.c:224: ch_issue_token_out(endpoint); ld l,c ld h,b push hl call _ch_issue_token_out -;source-doc/base-drv/ch376.c:227: CHECK(ch_long_wait_int_and_get_status()); +;source-doc/base-drv/ch376.c:226: CHECK(ch_long_wait_int_and_get_status()); call _ch_long_wait_int_and_get_statu ld a, l pop bc ld l, a or a jr NZ,l_ch_data_out_transfer_00106 -;source-doc/base-drv/ch376.c:229: endpoint->toggle = !endpoint->toggle; +;source-doc/base-drv/ch376.c:228: endpoint->toggle = !endpoint->toggle; ld e, c ld d, b ld l, e @@ -739,40 +735,38 @@ l_ch_data_out_transfer_00110: ld (de), a jr l_ch_data_out_transfer_00103 l_ch_data_out_transfer_00105: -;source-doc/base-drv/ch376.c:232: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:233: return USB_ERR_OK; +;source-doc/base-drv/ch376.c:232: return USB_ERR_OK; ld l,0x00 jr l_ch_data_out_transfer_00107 -;source-doc/base-drv/ch376.c:235: done: +;source-doc/base-drv/ch376.c:234: done: l_ch_data_out_transfer_00106: -;source-doc/base-drv/ch376.c:236: USB_MODULE_LEDS = 0x00; +;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x00; ld a,0x00 ld bc,_USB_MODULE_LEDS out (c), a -;source-doc/base-drv/ch376.c:237: return result; +;source-doc/base-drv/ch376.c:236: return result; l_ch_data_out_transfer_00107: -;source-doc/base-drv/ch376.c:238: } +;source-doc/base-drv/ch376.c:237: } inc sp pop ix ret -;source-doc/base-drv/ch376.c:240: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/ch376.c:239: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function ch_set_usb_address ; --------------------------------- _ch_set_usb_address: -;source-doc/base-drv/ch376.c:241: ch_command(CH_CMD_SET_USB_ADDR); +;source-doc/base-drv/ch376.c:240: ch_command(CH_CMD_SET_USB_ADDR); push hl ld l,0x13 call _ch_command pop hl -;source-doc/base-drv/ch376.c:242: CH376_DATA_PORT = device_address; +;source-doc/base-drv/ch376.c:241: CH376_DATA_PORT = device_address; ld a, l ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.c:243: } +;source-doc/base-drv/ch376.c:242: } ret -_result: - DEFB +0x00 diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index baa56e99..7185ae4c 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -94,30 +94,28 @@ _usbdev_blk_out_trnsfer: ld ix,0 add ix,sp push af - push af -;source-doc/base-drv/dev_transfers.c:29: */ - ld e,(ix+4) - ld d,(ix+5) - ld hl,0x0003 - add hl, de - ex (sp), hl -;source-doc/base-drv/dev_transfers.c:31: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size); - ld (ix-2),e - ld (ix-1),d - pop bc +;source-doc/base-drv/dev_transfers.c:30: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) { + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + inc de + inc de + inc de +;source-doc/base-drv/dev_transfers.c:32: } pop hl + ld l,c + ld h,b ld a,(hl) push hl - push bc rlca rlca rlca rlca and 0x0f + push bc + push de push de - ld l,(ix-4) - ld h,(ix-3) - push hl push af inc sp ld l,(ix+8) @@ -132,55 +130,51 @@ _usbdev_blk_out_trnsfer: pop af inc sp pop de + pop bc +;source-doc/base-drv/dev_transfers.c:34: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:33: - ld hl,_result - ld a, (hl) sub 0x02 jr NZ,l_usbdev_blk_out_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:34: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { - ex de, hl - inc hl - ld d, (hl) - ld l,(ix-2) - ld h,(ix-1) - ld a, (hl) +;source-doc/base-drv/dev_transfers.c:35: usb_error result; + inc bc + ld a, (bc) + ld b, a + pop hl + ld a,(hl) + push hl rlca rlca rlca rlca and 0x0f - ld b, a - pop hl - ld a,(hl) - push hl + ld c, a + ld l, e + ld h, d + ld a, (hl) rrca and 0x07 - ld e,b push de - push af + push bc inc sp + ld h, c + ld l,a + push hl call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:35: - pop hl - push hl + pop de +;source-doc/base-drv/dev_transfers.c:36: + ex de, hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:36: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; +;source-doc/base-drv/dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; ld l,0x02 - jr l_usbdev_blk_out_trnsfer_00104 +;source-doc/base-drv/dev_transfers.c:43: endpoint->toggle = 0; l_usbdev_blk_out_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:39: -;source-doc/base-drv/dev_transfers.c:42: endpoint->toggle = 0; - ld hl, (_result) -l_usbdev_blk_out_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:43: return USB_ERR_STALL; +;source-doc/base-drv/dev_transfers.c:44: return USB_ERR_STALL; ld sp, ix pop ix ret -;source-doc/base-drv/dev_transfers.c:45: +;source-doc/base-drv/dev_transfers.c:46: ; --------------------------------- ; Function usbdev_bulk_in_transfer ; --------------------------------- @@ -189,30 +183,26 @@ _usbdev_bulk_in_transfer: ld ix,0 add ix,sp push af - push af -;source-doc/base-drv/dev_transfers.c:46: RETURN_CHECK(result); - ld e,(ix+4) - ld d,(ix+5) +;source-doc/base-drv/dev_transfers.c:49: done: + ld c,(ix+4) + ld b,(ix+5) ld hl,0x0006 - add hl, de - ex (sp), hl -;source-doc/base-drv/dev_transfers.c:48: done: - ld (ix-2),e - ld (ix-1),d - pop bc - pop hl + add hl, bc +;source-doc/base-drv/dev_transfers.c:51: } + pop de + ld e,c + ld d,b + ex de,hl ld a,(hl) push hl - push bc rlca rlca rlca rlca and 0x0f + push bc + push de push de - ld l,(ix-4) - ld h,(ix-3) - push hl push af inc sp ld l,(ix+8) @@ -227,55 +217,51 @@ _usbdev_bulk_in_transfer: pop af inc sp pop de + pop bc +;source-doc/base-drv/dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:50: } - ld hl,_result - ld a, (hl) sub 0x02 jr NZ,l_usbdev_bulk_in_transfer_00102 -;source-doc/base-drv/dev_transfers.c:51: - ex de, hl - inc hl - ld d, (hl) - ld l,(ix-2) - ld h,(ix-1) - ld a, (hl) +;source-doc/base-drv/dev_transfers.c:54: usb_error result; + inc bc + ld a, (bc) + ld b, a + pop hl + ld a,(hl) + push hl rlca rlca rlca rlca and 0x0f - ld b, a - pop hl - ld a,(hl) - push hl + ld c, a + ld l, e + ld h, d + ld a, (hl) rrca and 0x07 - ld e,b push de - push af + push bc inc sp + ld h, c + ld l,a + push hl call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:52: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { - pop hl - push hl + pop de +;source-doc/base-drv/dev_transfers.c:55: + ex de, hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:53: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; +;source-doc/base-drv/dev_transfers.c:56: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; ld l,0x02 - jr l_usbdev_bulk_in_transfer_00104 +;source-doc/base-drv/dev_transfers.c:61: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); l_usbdev_bulk_in_transfer_00102: -;source-doc/base-drv/dev_transfers.c:56: -;source-doc/base-drv/dev_transfers.c:58: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size); - ld hl, (_result) -l_usbdev_bulk_in_transfer_00104: -;source-doc/base-drv/dev_transfers.c:59: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:62: endpoint->toggle = 0; ld sp, ix pop ix ret -;source-doc/base-drv/dev_transfers.c:61: } +;source-doc/base-drv/dev_transfers.c:64: } ; --------------------------------- ; Function usbdev_dat_in_trnsfer ; --------------------------------- @@ -284,43 +270,39 @@ _usbdev_dat_in_trnsfer: ld ix,0 add ix,sp push af - push af -;source-doc/base-drv/dev_transfers.c:66: } - ld e,(ix+4) - ld d,(ix+5) - ld c, e - ld b, d - inc bc - inc bc - inc bc +;source-doc/base-drv/dev_transfers.c:70: + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + inc de + inc de + inc de push de ld a,(ix+10) ld e, a add a, a add a, e pop de - add a, c - ld (ix-4),a + add a, e + ld e, a ld a,0x00 - adc a, b - ld (ix-3),a -;source-doc/base-drv/dev_transfers.c:68: usb_error usbdev_dat_in_trnsfer(device_config *const device, - ld (ix-2),e - ld (ix-1),d - pop bc + adc a, d + ld d, a +;source-doc/base-drv/dev_transfers.c:72: uint8_t *const buffer, pop hl + ld l,c + ld h,b ld a,(hl) push hl - push bc rlca rlca rlca rlca and 0x0f + push bc + push de push de - ld l,(ix-4) - ld h,(ix-3) - push hl push af inc sp ld l,(ix+8) @@ -335,55 +317,51 @@ _usbdev_dat_in_trnsfer: pop af inc sp pop de + pop bc +;source-doc/base-drv/dev_transfers.c:74: const usb_endpoint_type endpoint_type) { ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:70: const uint16_t buffer_size, - ld hl,_result - ld a, (hl) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_00102 -;source-doc/base-drv/dev_transfers.c:71: const usb_endpoint_type endpoint_type) { - ex de, hl - inc hl - ld d, (hl) - ld l,(ix-2) - ld h,(ix-1) - ld a, (hl) +;source-doc/base-drv/dev_transfers.c:75: usb_error result; + inc bc + ld a, (bc) + ld b, a + pop hl + ld a,(hl) + push hl rlca rlca rlca rlca and 0x0f - ld b, a - pop hl - ld a,(hl) - push hl + ld c, a + ld l, e + ld h, d + ld a, (hl) rrca and 0x07 - ld e,b push de - push af + push bc inc sp + ld h, c + ld l,a + push hl call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:72: - pop hl - push hl + pop de +;source-doc/base-drv/dev_transfers.c:76: + ex de, hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:73: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; +;source-doc/base-drv/dev_transfers.c:77: endpoint_param *const endpoint = &device->endpoints[endpoint_type]; ld l,0x02 - jr l_usbdev_dat_in_trnsfer_00104 +;source-doc/base-drv/dev_transfers.c:82: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); l_usbdev_dat_in_trnsfer_00102: -;source-doc/base-drv/dev_transfers.c:76: -;source-doc/base-drv/dev_transfers.c:78: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); - ld hl, (_result) -l_usbdev_dat_in_trnsfer_00104: -;source-doc/base-drv/dev_transfers.c:79: endpoint->toggle = 0; +;source-doc/base-drv/dev_transfers.c:83: endpoint->toggle = 0; ld sp, ix pop ix ret -;source-doc/base-drv/dev_transfers.c:81: } +;source-doc/base-drv/dev_transfers.c:85: } ; --------------------------------- ; Function usbdev_dat_in_trnsfer_0 ; --------------------------------- @@ -392,35 +370,33 @@ _usbdev_dat_in_trnsfer_0: ld ix,0 add ix,sp push af - push af -;source-doc/base-drv/dev_transfers.c:82: - ld e,(ix+4) - ld d,(ix+5) - ld hl,0x0003 - add hl, de - ex (sp), hl -;source-doc/base-drv/dev_transfers.c:84: done: - ld (ix-2),e - ld (ix-1),d - pop bc +;source-doc/base-drv/dev_transfers.c:88: done: + ld c,(ix+4) + ld b,(ix+5) + ld e, c + ld d, b + inc de + inc de + inc de +;source-doc/base-drv/dev_transfers.c:90: } pop hl + ld l,c + ld h,b ld a,(hl) push hl - push bc rlca rlca rlca rlca and 0x0f - ld c,(ix+8) - ld b,0x00 + ld l,(ix+8) + ld h,0x00 + push bc + push de push de - ld l,(ix-4) - ld h,(ix-3) - push hl push af inc sp - push bc + push hl ld l,(ix+6) ld h,(ix+7) push hl @@ -430,50 +406,47 @@ _usbdev_dat_in_trnsfer_0: pop af inc sp pop de + pop bc +;source-doc/base-drv/dev_transfers.c:92: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { ld a, l - ld (_result), a -;source-doc/base-drv/dev_transfers.c:86: } - ld hl,_result - ld a, (hl) sub 0x02 jr NZ,l_usbdev_dat_in_trnsfer_0_00102 -;source-doc/base-drv/dev_transfers.c:87: - ex de, hl - inc hl - ld d, (hl) - ld l,(ix-2) - ld h,(ix-1) - ld a, (hl) +;source-doc/base-drv/dev_transfers.c:93: usb_error result; + inc bc + ld a, (bc) + ld b, a + pop hl + ld a,(hl) + push hl rlca rlca rlca rlca and 0x0f - ld b, a - pop hl - ld a,(hl) - push hl + ld c, a + ld l, e + ld h, d + ld a, (hl) rrca and 0x07 - ld e,b push de - push af + push bc inc sp + ld h, c + ld l,a + push hl call _usbtrn_clear_endpoint_halt pop af inc sp -;source-doc/base-drv/dev_transfers.c:88: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { - pop hl - push hl + pop de +;source-doc/base-drv/dev_transfers.c:94: + ex de, hl res 0, (hl) -;source-doc/base-drv/dev_transfers.c:89: endpoint_param *const endpoint = &device->endpoints[0]; +;source-doc/base-drv/dev_transfers.c:95: endpoint_param *const endpoint = &device->endpoints[0]; ld l,0x02 - jr l_usbdev_dat_in_trnsfer_0_00103 +;source-doc/base-drv/dev_transfers.c:98: l_usbdev_dat_in_trnsfer_0_00102: -;source-doc/base-drv/dev_transfers.c:92: - ld hl, (_result) -l_usbdev_dat_in_trnsfer_0_00103: -;source-doc/base-drv/dev_transfers.c:93: if (result == USB_ERR_STALL) { +;source-doc/base-drv/dev_transfers.c:99: if (result == USB_ERR_STALL) { ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index c22b7e5e..165c2f6e 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -59,18 +59,18 @@ _usbtrn_get_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:27: * @return usb_error USB_ERR_OK if all good, otherwise specific error code +;source-doc/base-drv/protocol.c:28: */ ld hl,0 add hl, sp ex de, hl ld bc,0x0008 ld hl,_cmd_get_device_descriptor ldir -;source-doc/base-drv/protocol.c:28: */ +;source-doc/base-drv/protocol.c:29: usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:30: setup_packet cmd; +;source-doc/base-drv/protocol.c:31: setup_packet cmd; ld c,(ix+4) ld b,(ix+5) push bc @@ -91,15 +91,14 @@ _usbtrn_get_descriptor: pop af pop af pop af + ld a, l pop de pop bc - ld a, l - ld (_result), a -;source-doc/base-drv/protocol.c:32: cmd.wLength = 8; - ld a,(_result) + ld l, a +;source-doc/base-drv/protocol.c:33: cmd.wLength = 8; or a jr NZ,l_usbtrn_get_descriptor_00103 -;source-doc/base-drv/protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); +;source-doc/base-drv/protocol.c:35: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); push de push bc ld hl,4 @@ -110,11 +109,11 @@ _usbtrn_get_descriptor: ldir pop bc pop de -;source-doc/base-drv/protocol.c:35: +;source-doc/base-drv/protocol.c:36: ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:36: CHECK(result); +;source-doc/base-drv/protocol.c:37: CHECK(result); ld hl,7 add hl, bc ld a, (hl) @@ -131,14 +130,10 @@ _usbtrn_get_descriptor: pop af pop af pop af - ld a, l - ld (_result), a -;source-doc/base-drv/protocol.c:38: cmd = cmd_get_device_descriptor; -;source-doc/base-drv/protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); +;source-doc/base-drv/protocol.c:41: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); l_usbtrn_get_descriptor_00103: -;source-doc/base-drv/protocol.c:41: - ld hl, (_result) -;source-doc/base-drv/protocol.c:42: RETURN_CHECK(result); +;source-doc/base-drv/protocol.c:42: +;source-doc/base-drv/protocol.c:43: RETURN_CHECK(result); ld sp, ix pop ix ret @@ -150,7 +145,7 @@ _cmd_get_device_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0008 -;source-doc/base-drv/protocol.c:46: } +;source-doc/base-drv/protocol.c:47: } ; --------------------------------- ; Function usbtrn_get_descriptor2 ; --------------------------------- @@ -161,18 +156,18 @@ _usbtrn_get_descriptor2: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:48: /** +;source-doc/base-drv/protocol.c:51: * ld hl,0 add hl, sp ex de, hl ld bc,0x0008 ld hl,_cmd_get_device_descriptor ldir -;source-doc/base-drv/protocol.c:49: * @brief Issue GET_DESCRIPTOR request to retrieve the device descriptor for usb device at the specified address +;source-doc/base-drv/protocol.c:52: * @param buffer the buffer to store the device descriptor in ld (ix-2),0x08 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:51: * @param buffer the buffer to store the device descriptor in +;source-doc/base-drv/protocol.c:54: */ ld c,(ix+4) ld b,(ix+5) push bc @@ -190,15 +185,14 @@ _usbtrn_get_descriptor2: pop af pop af pop af + ld a, l pop de pop bc - ld a, l - ld (_result), a -;source-doc/base-drv/protocol.c:53: */ - ld a,(_result) + ld l, a +;source-doc/base-drv/protocol.c:56: usb_error result; or a jr NZ,l_usbtrn_get_descriptor2_00103 -;source-doc/base-drv/protocol.c:55: setup_packet cmd; +;source-doc/base-drv/protocol.c:58: setup_packet cmd; push de push bc ld hl,4 @@ -209,11 +203,11 @@ _usbtrn_get_descriptor2: ldir pop bc pop de -;source-doc/base-drv/protocol.c:56: cmd = cmd_get_device_descriptor; +;source-doc/base-drv/protocol.c:59: cmd = cmd_get_device_descriptor; ld (ix-2),0x12 xor a ld (ix-1),a -;source-doc/base-drv/protocol.c:57: cmd.wLength = 8; +;source-doc/base-drv/protocol.c:60: cmd.wLength = 8; ld hl,7 add hl, bc ld h,(hl) @@ -227,17 +221,14 @@ _usbtrn_get_descriptor2: pop af pop af pop af - ld a, l - ld (_result), a -;source-doc/base-drv/protocol.c:58: +;source-doc/base-drv/protocol.c:61: l_usbtrn_get_descriptor2_00103: -;source-doc/base-drv/protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); - ld hl, (_result) -;source-doc/base-drv/protocol.c:60: +;source-doc/base-drv/protocol.c:62: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8); +;source-doc/base-drv/protocol.c:63: ld sp, ix pop ix ret -;source-doc/base-drv/protocol.c:66: done: +;source-doc/base-drv/protocol.c:69: done: ; --------------------------------- ; Function usbtrn_set_address ; --------------------------------- @@ -250,7 +241,7 @@ _usbtrn_set_address: push af push af ld c, l -;source-doc/base-drv/protocol.c:68: } +;source-doc/base-drv/protocol.c:71: } push bc ld hl,2 add hl, sp @@ -259,9 +250,9 @@ _usbtrn_set_address: ld hl,_cmd_set_device_address ldir pop bc -;source-doc/base-drv/protocol.c:69: +;source-doc/base-drv/protocol.c:72: ld (ix-6),c -;source-doc/base-drv/protocol.c:71: +;source-doc/base-drv/protocol.c:74: xor a push af inc sp @@ -274,7 +265,7 @@ _usbtrn_set_address: add hl, sp push hl call _usb_control_transfer -;source-doc/base-drv/protocol.c:72: /** +;source-doc/base-drv/protocol.c:75: /** ld sp,ix pop ix ret @@ -286,7 +277,7 @@ _cmd_set_device_address: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { +;source-doc/base-drv/protocol.c:81: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall { ; --------------------------------- ; Function usbtrn_set_configuration ; --------------------------------- @@ -297,7 +288,7 @@ _usbtrn_set_configuration: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:80: cmd = cmd_set_device_address; +;source-doc/base-drv/protocol.c:83: cmd = cmd_set_device_address; ld hl,0 add hl, sp ld e,l @@ -307,10 +298,10 @@ _usbtrn_set_configuration: ld hl,_cmd_set_configuration ldir pop bc -;source-doc/base-drv/protocol.c:81: cmd.bValue[0] = device_address; +;source-doc/base-drv/protocol.c:84: cmd.bValue[0] = device_address; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0); +;source-doc/base-drv/protocol.c:86: return usb_control_transfer(&cmd, 0, 0, 0); ld h,(ix+5) ld l,(ix+4) push hl @@ -318,7 +309,7 @@ _usbtrn_set_configuration: push hl push bc call _usb_control_transfer -;source-doc/base-drv/protocol.c:84: } +;source-doc/base-drv/protocol.c:87: } ld sp,ix pop ix ret @@ -330,7 +321,7 @@ _cmd_set_configuration: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/protocol.c:90: * +;source-doc/base-drv/protocol.c:93: * ; --------------------------------- ; Function usbtrn_get_config_descriptor ; --------------------------------- @@ -341,7 +332,7 @@ _usbtrn_get_config_descriptor: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:96: cmd = cmd_set_configuration; +;source-doc/base-drv/protocol.c:99: cmd = cmd_set_configuration; ld hl,0 add hl, sp ld e,l @@ -351,10 +342,10 @@ _usbtrn_get_config_descriptor: ld hl,_cmd_get_config_descriptor ldir pop bc -;source-doc/base-drv/protocol.c:97: cmd.bValue[0] = configuration; +;source-doc/base-drv/protocol.c:100: cmd.bValue[0] = configuration; ld a,(ix+6) ld (ix-6),a -;source-doc/base-drv/protocol.c:98: +;source-doc/base-drv/protocol.c:101: ld hl,0x0006 add hl, bc ld e,(ix+7) @@ -362,7 +353,7 @@ _usbtrn_get_config_descriptor: ld (hl), e inc hl ld (hl), a -;source-doc/base-drv/protocol.c:100: } +;source-doc/base-drv/protocol.c:103: } ld e,(ix+4) ld d,(ix+5) ld h,(ix+9) @@ -371,7 +362,7 @@ _usbtrn_get_config_descriptor: push de push bc call _usb_control_transfer -;source-doc/base-drv/protocol.c:101: +;source-doc/base-drv/protocol.c:104: ld sp,ix pop ix ret @@ -383,7 +374,7 @@ _cmd_get_config_descriptor: DEFB +0x00 DEFB +0x00 DEFW +0x0000 -;source-doc/base-drv/protocol.c:103: +;source-doc/base-drv/protocol.c:106: ; --------------------------------- ; Function usbtrn_gfull_cfg_desc ; --------------------------------- @@ -391,7 +382,7 @@ _usbtrn_gfull_cfg_desc: push ix ld ix,0 add ix,sp -;source-doc/base-drv/protocol.c:110: * @param device_address the usb address of the device +;source-doc/base-drv/protocol.c:114: * @param max_packet_size the max packet size for control transfers (endpoint 0) ld c,(ix+8) ld b,(ix+9) push bc @@ -411,24 +402,22 @@ _usbtrn_gfull_cfg_desc: pop af pop bc ld a, l - ld (_result), a - ld a,(_result) or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 -;source-doc/base-drv/protocol.c:112: * @return usb_error USB_ERR_OK if all good, otherwise specific error code +;source-doc/base-drv/protocol.c:116: */ ld l,(ix+8) ld h,(ix+9) inc hl inc hl ld d, (hl) -;source-doc/base-drv/protocol.c:113: */ +;source-doc/base-drv/protocol.c:117: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, ld a,(ix+7) sub d jr NC,l_usbtrn_gfull_cfg_desc_00104 -;source-doc/base-drv/protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer, +;source-doc/base-drv/protocol.c:118: const uint8_t config_index, ld d,(ix+7) l_usbtrn_gfull_cfg_desc_00104: -;source-doc/base-drv/protocol.c:116: const uint8_t buffer_size, +;source-doc/base-drv/protocol.c:120: const uint8_t device_address, ld h,(ix+6) ld l,(ix+5) push hl @@ -440,22 +429,17 @@ l_usbtrn_gfull_cfg_desc_00104: pop af pop af ld a, l - ld (_result), a - ld a,(_result) -;source-doc/base-drv/protocol.c:118: const uint8_t max_packet_size) { +;source-doc/base-drv/protocol.c:122: setup_packet cmd; or a jr NZ,l_usbtrn_gfull_cfg_desc_00107 ld l,a - jr l_usbtrn_gfull_cfg_desc_00108 -;source-doc/base-drv/protocol.c:119: setup_packet cmd; +;source-doc/base-drv/protocol.c:123: cmd = cmd_get_config_descriptor; +;source-doc/base-drv/protocol.c:124: cmd.bValue[0] = config_index; l_usbtrn_gfull_cfg_desc_00107: -;source-doc/base-drv/protocol.c:120: cmd = cmd_get_config_descriptor; - ld hl, (_result) -l_usbtrn_gfull_cfg_desc_00108: -;source-doc/base-drv/protocol.c:121: cmd.bValue[0] = config_index; +;source-doc/base-drv/protocol.c:125: cmd.wLength = (uint16_t)buffer_size; pop ix ret -;source-doc/base-drv/protocol.c:125: } +;source-doc/base-drv/protocol.c:129: ; --------------------------------- ; Function usbtrn_clear_endpoint_halt ; --------------------------------- @@ -466,7 +450,7 @@ _usbtrn_clear_endpoint_halt: ld hl, -8 add hl, sp ld sp, hl -;source-doc/base-drv/protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, +;source-doc/base-drv/protocol.c:131: const uint8_t device_address, ld hl,0 add hl, sp ld e,l @@ -476,10 +460,10 @@ _usbtrn_clear_endpoint_halt: ld hl,_usb_cmd_clear_endpoint_halt ldir pop bc -;source-doc/base-drv/protocol.c:128: const uint8_t device_address, +;source-doc/base-drv/protocol.c:132: const uint8_t max_packet_size, ld a,(ix+4) ld (ix-4),a -;source-doc/base-drv/protocol.c:130: const uint8_t max_buffer_size, +;source-doc/base-drv/protocol.c:134: uint8_t *const buffer) { ld h,(ix+6) ld l,(ix+5) push hl @@ -487,7 +471,7 @@ _usbtrn_clear_endpoint_halt: push hl push bc call _usb_control_transfer -;source-doc/base-drv/protocol.c:131: uint8_t *const buffer) { +;source-doc/base-drv/protocol.c:135: usb_error result; ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index 5a11aaa5..0289e39b 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -218,12 +218,12 @@ _usb_data_in_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:80: critical_end(); +;source-doc/base-drv/transfers.c:81: return result; call _critical_begin -;source-doc/base-drv/transfers.c:82: } +;source-doc/base-drv/transfers.c:83: ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:84: /** +;source-doc/base-drv/transfers.c:85: * @brief Perform a USB data in on the specified endpoint ld l,(ix+9) ld h,(ix+10) push hl @@ -236,17 +236,15 @@ _usb_data_in_transfer: call _ch_data_in_transfer pop af pop af - pop af - ld a, l - ld (_result), a -;source-doc/base-drv/transfers.c:86: * +;source-doc/base-drv/transfers.c:87: * @param buffer the buffer to receive the data + ex (sp),hl call _critical_end -;source-doc/base-drv/transfers.c:88: * @param buffer_size the maximum size of data to be received - ld hl, (_result) + pop hl ;source-doc/base-drv/transfers.c:89: * @param device_address the usb address of the device +;source-doc/base-drv/transfers.c:90: * @param endpoint the usb endpoint to receive from (toggle of endpoint is updated) pop ix ret -;source-doc/base-drv/transfers.c:94: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:95: usb_error result; ; --------------------------------- ; Function usb_data_in_transfer_n ; --------------------------------- @@ -254,12 +252,12 @@ _usb_data_in_transfer_n: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:95: critical_begin(); +;source-doc/base-drv/transfers.c:98: ch_set_usb_address(device_address); call _critical_begin -;source-doc/base-drv/transfers.c:97: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:100: result = ch_data_in_transfer(buffer, buffer_size, endpoint); ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:99: result = ch_data_in_transfer(buffer, buffer_size, endpoint); +;source-doc/base-drv/transfers.c:102: critical_end(); ld l,(ix+9) ld h,(ix+10) push hl @@ -272,17 +270,15 @@ _usb_data_in_transfer_n: call _ch_data_in_transfer_n pop af pop af - pop af - ld a, l - ld (_result), a -;source-doc/base-drv/transfers.c:101: critical_end(); +;source-doc/base-drv/transfers.c:104: return result; + ex (sp),hl call _critical_end -;source-doc/base-drv/transfers.c:103: return result; - ld hl, (_result) -;source-doc/base-drv/transfers.c:104: } + pop hl +;source-doc/base-drv/transfers.c:106: +;source-doc/base-drv/transfers.c:107: /** pop ix ret -;source-doc/base-drv/transfers.c:109: * @param buffer the buffer to receive the data - must be 62 bytes +;source-doc/base-drv/transfers.c:112: * @param device_address the usb address of the device ; --------------------------------- ; Function usb_data_out_transfer ; --------------------------------- @@ -290,12 +286,12 @@ _usb_data_out_transfer: push ix ld ix,0 add ix,sp -;source-doc/base-drv/transfers.c:110: * @param buffer_size on exit the actual size of data received +;source-doc/base-drv/transfers.c:114: * @return usb_error USB_ERR_OK if all good, otherwise specific error code call _critical_begin -;source-doc/base-drv/transfers.c:112: * @param endpoint the usb endpoint to receive from (toggle of endpoint is updated) +;source-doc/base-drv/transfers.c:116: usb_error ld l,(ix+8) call _ch_set_usb_address -;source-doc/base-drv/transfers.c:114: */ +;source-doc/base-drv/transfers.c:118: usb_error result; ld l,(ix+9) ld h,(ix+10) push hl @@ -308,13 +304,11 @@ _usb_data_out_transfer: call _ch_data_out_transfer pop af pop af - pop af - ld a, l - ld (_result), a -;source-doc/base-drv/transfers.c:116: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { +;source-doc/base-drv/transfers.c:120: critical_begin(); + ex (sp),hl call _critical_end -;source-doc/base-drv/transfers.c:118: - ld hl, (_result) -;source-doc/base-drv/transfers.c:119: ch_set_usb_address(device_address); + pop hl +;source-doc/base-drv/transfers.c:122: ch_set_usb_address(device_address); +;source-doc/base-drv/transfers.c:123: pop ix ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index d343f3af..81697938 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -68,14 +68,14 @@ _usb_host_bus_reset: call _ch_cmd_set_usb_mode ;source-doc/base-drv/usb-base-drv.c:15: delay_20ms(); call _delay_20ms -;source-doc/base-drv/ch376.h:111: +;source-doc/base-drv/ch376.h:108: #define TRACE_USB_ERROR(result) ld l,0x0b call _ch_command -;source-doc/base-drv/ch376.h:112: #endif +;source-doc/base-drv/ch376.h:109: ld a,0x25 ld bc,_CH376_DATA_PORT out (c), a -;source-doc/base-drv/ch376.h:113: +;source-doc/base-drv/ch376.h:110: #endif ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index 964dbaeb..26988280 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -273,24 +273,24 @@ l_usb_kyb_flush_00101: ; Function usb_kyb_tick ; --------------------------------- _usb_kyb_tick: -;source-doc/keyboard/kyb_driver.c:107: +;source-doc/keyboard/kyb_driver.c:109: usb_error result; ld hl,_in_critical_usb_section ld a, (hl) or a -;source-doc/keyboard/kyb_driver.c:108: void usb_kyb_tick(void) { +;source-doc/keyboard/kyb_driver.c:110: jr NZ,l_usb_kyb_tick_00112 -;././source-doc/base-drv//ch376.h:111: +;././source-doc/base-drv//ch376.h:108: #define TRACE_USB_ERROR(result) ld l,0x0b call _ch_command -;././source-doc/base-drv//ch376.h:112: #endif +;././source-doc/base-drv//ch376.h:109: ld a,0x25 ld bc,_CH376_DATA_PORT out (c), a -;././source-doc/base-drv//ch376.h:113: +;././source-doc/base-drv//ch376.h:110: #endif ld a,0x1f ld bc,_CH376_DATA_PORT out (c), a -;source-doc/keyboard/kyb_driver.c:111: +;source-doc/keyboard/kyb_driver.c:113: ld bc,_report+0 ld hl, (_keyboard_config) ld a,0x08 @@ -302,74 +302,75 @@ _usb_kyb_tick: pop af pop af inc sp - ld a, l - ld (_result), a +;././source-doc/base-drv//ch376.h:108: #define TRACE_USB_ERROR(result) + push hl ld l,0x0b call _ch_command -;././source-doc/base-drv//ch376.h:112: #endif + pop hl +;././source-doc/base-drv//ch376.h:109: ld a,0x25 ld bc,_CH376_DATA_PORT out (c), a -;././source-doc/base-drv//ch376.h:113: +;././source-doc/base-drv//ch376.h:110: #endif ld a,0xdf ld bc,_CH376_DATA_PORT out (c), a - ld hl,_result - ld a, (hl) +;source-doc/keyboard/kyb_driver.c:115: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)&report, 8); + ld a, l or a jr NZ,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:114: ch_configure_nak_retry_3s(); +;source-doc/keyboard/kyb_driver.c:116: ch_configure_nak_retry_3s(); call _report_diff or a jr Z,l_usb_kyb_tick_00112 -;source-doc/keyboard/kyb_driver.c:116: if (report_diff()) { +;source-doc/keyboard/kyb_driver.c:118: if (report_diff()) { ld b,0x06 l_usb_kyb_tick_00103: -;source-doc/keyboard/kyb_driver.c:117: uint8_t i = 6; +;source-doc/keyboard/kyb_driver.c:119: uint8_t i = 6; ld a, b dec a push bc call _keyboard_buf_put pop bc -;source-doc/keyboard/kyb_driver.c:118: do { +;source-doc/keyboard/kyb_driver.c:120: do { djnz l_usb_kyb_tick_00103 -;source-doc/keyboard/kyb_driver.c:119: keyboard_buf_put(i - 1); +;source-doc/keyboard/kyb_driver.c:121: keyboard_buf_put(i - 1); ld de,_previous ld bc,0x0008 ld hl,_report ldir l_usb_kyb_tick_00112: -;source-doc/keyboard/kyb_driver.c:122: } - ret ;source-doc/keyboard/kyb_driver.c:124: } + ret +;source-doc/keyboard/kyb_driver.c:126: } ; --------------------------------- ; Function usb_kyb_init ; --------------------------------- _usb_kyb_init: -;source-doc/keyboard/kyb_driver.c:125: +;source-doc/keyboard/kyb_driver.c:127: call _get_usb_device_config ex de, hl ld (_keyboard_config), hl -;source-doc/keyboard/kyb_driver.c:127: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); +;source-doc/keyboard/kyb_driver.c:129: keyboard_config = (device_config_keyboard *)get_usb_device_config(dev_index); ld hl,_keyboard_config + 1 ld a, (hl) dec hl or (hl) -;source-doc/keyboard/kyb_driver.c:128: +;source-doc/keyboard/kyb_driver.c:130: ret Z -;source-doc/keyboard/kyb_driver.c:130: return; +;source-doc/keyboard/kyb_driver.c:132: return; ld a,0x01 push af inc sp ld hl, (_keyboard_config) call _hid_set_protocol -;source-doc/keyboard/kyb_driver.c:131: +;source-doc/keyboard/kyb_driver.c:133: ld a,0x80 push af inc sp ld hl, (_keyboard_config) call _hid_set_idle -;source-doc/keyboard/kyb_driver.c:132: hid_set_protocol(keyboard_config, 1); +;source-doc/keyboard/kyb_driver.c:134: hid_set_protocol(keyboard_config, 1); ret _caps_lock_engaged: DEFB +0x01 diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 3c142a8a..31d4623d 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -67,7 +67,7 @@ _do_scsi_cmd: ld hl, -8 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:18: cbw->dCBWTag[0] = next_tag++; +;source-doc/scsi-drv/class_scsi.c:20: cbw->dCBWTag[0] = next_tag++; ld c,(ix+6) ld b,(ix+7) ld hl,0x0004 @@ -85,19 +85,19 @@ _do_scsi_cmd: ld (hl), e inc hl ld (hl), d -;source-doc/scsi-drv/class_scsi.c:20: if (!send) +;source-doc/scsi-drv/class_scsi.c:22: if (!send) bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00102 -;source-doc/scsi-drv/class_scsi.c:21: cbw->bmCBWFlags = 0x80; +;source-doc/scsi-drv/class_scsi.c:23: cbw->bmCBWFlags = 0x80; ld hl,0x000c add hl, bc ld (hl),0x80 l_do_scsi_cmd_00102: -;source-doc/scsi-drv/class_scsi.c:23: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:25: critical_begin(); push bc call _critical_begin pop bc -;source-doc/scsi-drv/class_scsi.c:26: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:28: &dev->endpoints[ENDPOINT_BULK_OUT])); ld a,(ix+4) ld (ix-6),a ld e, a @@ -138,11 +138,9 @@ l_do_scsi_cmd_00102: pop de pop bc ld a, l - ld (_result), a - ld a,(_result) or a jp NZ, l_do_scsi_cmd_00120 -;source-doc/scsi-drv/class_scsi.c:28: if (cbw->dCBWDataTransferLength != 0) { +;source-doc/scsi-drv/class_scsi.c:30: if (cbw->dCBWDataTransferLength != 0) { ld hl,8 add hl, bc ld c, (hl) @@ -157,15 +155,15 @@ l_do_scsi_cmd_00102: or b or c jr Z,l_do_scsi_cmd_00113 -;source-doc/scsi-drv/class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_IN])); - ld a,(ix+8) - ld (ix-2),a - ld a,(ix+9) - ld (ix-1),a -;source-doc/scsi-drv/class_scsi.c:29: if (!send) { +;source-doc/scsi-drv/class_scsi.c:33: &dev->endpoints[ENDPOINT_BULK_IN])); + ld (ix-2),c + ld (ix-1),b + ld c,(ix+8) + ld b,(ix+9) +;source-doc/scsi-drv/class_scsi.c:31: if (!send) { bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 -;source-doc/scsi-drv/class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:33: &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix-6) add a,0x06 ld e, a @@ -183,23 +181,21 @@ l_do_scsi_cmd_00102: push de push af inc sp - push bc ld l,(ix-2) ld h,(ix-1) push hl + push bc call _usb_data_in_transfer pop af pop af pop af inc sp ld a, l - ld (_result), a - ld a,(_result) or a jr Z,l_do_scsi_cmd_00113 - jp l_do_scsi_cmd_00120 + jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00110: -;source-doc/scsi-drv/class_scsi.c:35: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:37: &dev->endpoints[ENDPOINT_BULK_OUT])); ld l,(ix-4) ld h,(ix-3) ld a, (hl) @@ -211,28 +207,26 @@ l_do_scsi_cmd_00110: push de push af inc sp - push bc ld l,(ix-2) ld h,(ix-1) push hl + push bc call _usb_data_out_transfer pop af pop af pop af inc sp ld a, l - ld (_result), a - ld a,(_result) or a jr NZ,l_do_scsi_cmd_00120 l_do_scsi_cmd_00113: -;source-doc/scsi-drv/class_scsi.c:40: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:42: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix-6) add a,0x06 - ld e, a + ld c, a ld a,(ix-5) adc a,0x00 - ld d, a + ld b, a ld l,(ix-4) ld h,(ix-3) ld a, (hl) @@ -241,9 +235,9 @@ l_do_scsi_cmd_00113: rlca rlca and 0x0f - ld b, a - push de + ld d, a push bc + push de inc sp ld hl,0x000d push hl @@ -255,11 +249,9 @@ l_do_scsi_cmd_00113: pop af inc sp ld a, l - ld (_result), a - ld a,(_result) or a jr NZ,l_do_scsi_cmd_00120 -;source-doc/scsi-drv/class_scsi.c:42: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) +;source-doc/scsi-drv/class_scsi.c:44: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) ld a, (_csw + 12) or a jr Z,l_do_scsi_cmd_00117 @@ -273,25 +265,24 @@ l_do_scsi_cmd_00113: xor a sbc hl,bc jr Z,l_do_scsi_cmd_00117 -;source-doc/scsi-drv/class_scsi.c:43: result = USB_ERR_FAIL; - ld hl,_result - ld (hl),0x0e +;source-doc/scsi-drv/class_scsi.c:45: result = USB_ERR_FAIL; + ld l,0x0e jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00117: -;source-doc/scsi-drv/class_scsi.c:45: result = USB_ERR_OK; - xor a - ld (_result),a -;source-doc/scsi-drv/class_scsi.c:47: done: +;source-doc/scsi-drv/class_scsi.c:47: result = USB_ERR_OK; + ld l,0x00 +;source-doc/scsi-drv/class_scsi.c:49: done: l_do_scsi_cmd_00120: -;source-doc/scsi-drv/class_scsi.c:48: critical_end(); +;source-doc/scsi-drv/class_scsi.c:50: critical_end(); + push hl call _critical_end -;source-doc/scsi-drv/class_scsi.c:49: return result; - ld hl, (_result) -;source-doc/scsi-drv/class_scsi.c:50: } + pop hl +;source-doc/scsi-drv/class_scsi.c:51: return result; +;source-doc/scsi-drv/class_scsi.c:52: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:52: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -302,7 +293,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:54: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -311,7 +302,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:55: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:57: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -323,11 +314,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -338,7 +329,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:61: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -349,11 +340,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:62: } +;source-doc/scsi-drv/class_scsi.c:64: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:66: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -364,7 +355,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:68: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -373,7 +364,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -381,11 +372,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -396,7 +387,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:75: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -408,7 +399,7 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:76: } +;source-doc/scsi-drv/class_scsi.c:78: } ld sp,ix pop ix ret diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s index cf87d6aa..47527495 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s @@ -63,14 +63,14 @@ _usb_scsi_init: ld hl, -18 add hl, sp ld sp, hl -;source-doc/scsi-drv/scsi_driver.c:9: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/scsi-drv/scsi_driver.c:11: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config -;source-doc/scsi-drv/scsi_driver.c:14: critical_begin(); +;source-doc/scsi-drv/scsi_driver.c:16: critical_begin(); push de call _critical_begin pop de -;source-doc/scsi-drv/scsi_driver.c:15: while ((result = scsi_test(dev)) && --counter > 0) +;source-doc/scsi-drv/scsi_driver.c:17: while ((result = scsi_test(dev)) && --counter > 0) ld c,0x03 l_usb_scsi_init_00102: push bc @@ -81,16 +81,16 @@ l_usb_scsi_init_00102: ld a, l pop de pop bc - ld (_result),a + ld l, a or a jr Z,l_usb_scsi_init_00104 dec c jr Z,l_usb_scsi_init_00104 -;source-doc/scsi-drv/scsi_driver.c:16: scsi_request_sense(dev, &response); - ld hl,0 - add hl, sp +;source-doc/scsi-drv/scsi_driver.c:18: scsi_request_sense(dev, &response); push bc push de + ld hl,4 + add hl, sp push hl push de call _scsi_request_sense @@ -100,15 +100,16 @@ l_usb_scsi_init_00102: pop bc jr l_usb_scsi_init_00102 l_usb_scsi_init_00104: -;source-doc/scsi-drv/scsi_driver.c:17: critical_end(); +;source-doc/scsi-drv/scsi_driver.c:19: critical_end(); + push hl call _critical_end -;source-doc/scsi-drv/scsi_driver.c:19: return result; - ld hl, (_result) -;source-doc/scsi-drv/scsi_driver.c:20: } + pop hl +;source-doc/scsi-drv/scsi_driver.c:21: return result; +;source-doc/scsi-drv/scsi_driver.c:22: } ld sp, ix pop ix ret -;source-doc/scsi-drv/scsi_driver.c:24: usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { +;source-doc/scsi-drv/scsi_driver.c:26: usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_result *cap_result) { ; --------------------------------- ; Function usb_scsi_read_capacity ; --------------------------------- @@ -119,10 +120,10 @@ _usb_scsi_read_capacity: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/scsi_driver.c:25: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/scsi-drv/scsi_driver.c:27: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config -;source-doc/scsi-drv/scsi_driver.c:28: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/scsi_driver.c:30: cbw_scsi.cbw = scsi_command_block_wrapper; push de ld hl,2 add hl, sp @@ -131,7 +132,7 @@ _usb_scsi_read_capacity: ld hl,_scsi_command_block_wrapper ldir pop de -;source-doc/scsi-drv/scsi_driver.c:29: cbw_scsi.read_capacity = scsi_packet_read_capacity; +;source-doc/scsi-drv/scsi_driver.c:31: cbw_scsi.read_capacity = scsi_packet_read_capacity; push de ld hl,17 add hl, sp @@ -140,17 +141,17 @@ _usb_scsi_read_capacity: ld hl,_scsi_packet_read_capacity ldir pop de -;source-doc/scsi-drv/scsi_driver.c:31: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/scsi_driver.c:33: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/scsi_driver.c:32: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); +;source-doc/scsi-drv/scsi_driver.c:34: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity); ld (ix-13),0x0c -;source-doc/scsi-drv/scsi_driver.c:33: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); +;source-doc/scsi-drv/scsi_driver.c:35: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result); ld (ix-19),0x08 xor a ld (ix-18),a ld (ix-17),a ld (ix-16),a -;source-doc/scsi-drv/scsi_driver.c:35: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); +;source-doc/scsi-drv/scsi_driver.c:37: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false); ld c,(ix+6) ld b,(ix+7) xor a @@ -166,11 +167,11 @@ _usb_scsi_read_capacity: pop af pop af inc sp -;source-doc/scsi-drv/scsi_driver.c:36: } +;source-doc/scsi-drv/scsi_driver.c:38: } ld sp, ix pop ix ret -;source-doc/scsi-drv/scsi_driver.c:56: usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { +;source-doc/scsi-drv/scsi_driver.c:58: usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function usb_scsi_read ; --------------------------------- @@ -179,12 +180,12 @@ _usb_scsi_read: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/scsi_driver.c:57: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/scsi-drv/scsi_driver.c:61: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config pop bc push de -;source-doc/scsi-drv/scsi_driver.c:59: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/scsi_driver.c:63: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -197,116 +198,111 @@ l_usb_scsi_read_00113: ld (hl),0x00 inc hl djnz l_usb_scsi_read_00112 -;source-doc/scsi-drv/scsi_driver.c:60: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/scsi_driver.c:64: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/scsi_driver.c:62: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/scsi_driver.c:66: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/scsi_driver.c:63: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/scsi_driver.c:67: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/scsi_driver.c:64: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/scsi_driver.c:68: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/scsi_driver.c:66: cbw.scsi_cmd.operation_code = 0x28; // read operation +;source-doc/scsi-drv/scsi_driver.c:70: cbw.scsi_cmd.operation_code = 0x28; // read operation ld hl,_cbw + 15 ld (hl),0x28 -;source-doc/scsi-drv/scsi_driver.c:67: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/scsi_driver.c:71: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/scsi_driver.c:68: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix-2) - ld h,(ix-1) - ld bc,0x000c - add hl,bc - ld c,l - ld b,h +;source-doc/scsi-drv/scsi_driver.c:72: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + pop hl + push hl + ld de,0x000c + add hl, de + push hl inc hl inc hl inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/scsi_driver.c:69: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/scsi_driver.c:70: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - ld l,c - ld h,b + pop hl +;source-doc/scsi-drv/scsi_driver.c:73: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + push hl inc hl inc hl - ld a,(hl) + ld a, (hl) ld ((_cbw + 18)),a - dec hl - ld e, (hl) - ld hl, +(_cbw + 19) - ld (hl), e -;source-doc/scsi-drv/scsi_driver.c:71: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld a, (bc) + pop hl +;source-doc/scsi-drv/scsi_driver.c:74: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + push hl inc hl - ld (hl), a -;source-doc/scsi-drv/scsi_driver.c:73: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); - ld e,(ix+6) - ld d,(ix+7) - push bc + ld a, (hl) + ld ((_cbw + 19)),a + pop hl +;source-doc/scsi-drv/scsi_driver.c:75: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld bc,_cbw + 20 + ld a, (hl) + ld (bc), a +;source-doc/scsi-drv/scsi_driver.c:77: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false); + ld c,(ix+6) + ld b,(ix+7) + push hl xor a push af inc sp + push bc + ld de,_cbw + push de + ld e,(ix-2) + ld d,(ix-1) push de - ld hl,_cbw - push hl - ld l,(ix-2) - ld h,(ix-1) - push hl call _do_scsi_cmd pop af pop af pop af inc sp - pop bc ld a, l - ld (_result), a -;source-doc/scsi-drv/scsi_driver.c:75: if (result == USB_ERR_OK) - ld a,(_result) + pop hl + ld (ix-1),a +;source-doc/scsi-drv/scsi_driver.c:79: if (result == USB_ERR_OK) or a jr NZ,l_usb_scsi_read_00102 -;source-doc/scsi-drv/scsi_driver.c:76: dev->current_lba++; - ld l, c - ld h, b - ld e, (hl) +;source-doc/scsi-drv/scsi_driver.c:80: dev->current_lba++; + ld c,(hl) + push hl inc hl - ld d, (hl) + ld b, (hl) inc hl - ld a,(hl) + ld e, (hl) inc hl - ld h,(hl) - ld l,a - inc e + ld d, (hl) + pop hl + inc c jr NZ,l_usb_scsi_read_00114 - inc d + inc b jr NZ,l_usb_scsi_read_00114 - inc hl + inc de l_usb_scsi_read_00114: - ld a, e - ld (bc), a - inc bc - ld a, d - ld (bc), a - inc bc - ld a, l - ld (bc), a - inc bc - ld a, h - ld (bc), a + ld (hl), c + inc hl + ld (hl), b + inc hl + ld (hl), e + inc hl + ld (hl), d l_usb_scsi_read_00102: -;source-doc/scsi-drv/scsi_driver.c:77: return result; - ld hl, (_result) -;source-doc/scsi-drv/scsi_driver.c:78: } +;source-doc/scsi-drv/scsi_driver.c:81: return result; + ld l,(ix-1) +;source-doc/scsi-drv/scsi_driver.c:82: } ld sp, ix pop ix ret -;source-doc/scsi-drv/scsi_driver.c:80: usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { +;source-doc/scsi-drv/scsi_driver.c:84: usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { ; --------------------------------- ; Function usb_scsi_write ; --------------------------------- @@ -315,12 +311,12 @@ _usb_scsi_write: ld ix,0 add ix,sp push af -;source-doc/scsi-drv/scsi_driver.c:81: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); +;source-doc/scsi-drv/scsi_driver.c:86: device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); ld a,(ix+4) call _get_usb_device_config pop bc push de -;source-doc/scsi-drv/scsi_driver.c:83: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); +;source-doc/scsi-drv/scsi_driver.c:88: memset(&cbw, 0, sizeof(cbw_scsi_read_write)); ld de,_cbw ld l, e ld h, d @@ -333,112 +329,107 @@ l_usb_scsi_write_00113: ld (hl),0x00 inc hl djnz l_usb_scsi_write_00112 -;source-doc/scsi-drv/scsi_driver.c:84: cbw.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/scsi_driver.c:89: cbw.cbw = scsi_command_block_wrapper; ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/scsi_driver.c:86: cbw.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/scsi_driver.c:91: cbw.cbw.bCBWLUN = 0; ld hl,_cbw + 13 ld (hl),0x00 -;source-doc/scsi-drv/scsi_driver.c:87: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); +;source-doc/scsi-drv/scsi_driver.c:92: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write); ld hl,_cbw + 14 ld (hl),0x0c -;source-doc/scsi-drv/scsi_driver.c:88: cbw.cbw.dCBWDataTransferLength = 512; +;source-doc/scsi-drv/scsi_driver.c:93: cbw.cbw.dCBWDataTransferLength = 512; ld hl,0x0200 ld (_cbw + 8),hl ld h, l ld (_cbw + 8 + 2),hl -;source-doc/scsi-drv/scsi_driver.c:90: cbw.scsi_cmd.operation_code = 0x2A; // write operation +;source-doc/scsi-drv/scsi_driver.c:95: cbw.scsi_cmd.operation_code = 0x2A; // write operation ld hl,_cbw + 15 ld (hl),0x2a -;source-doc/scsi-drv/scsi_driver.c:91: cbw.scsi_cmd.transfer_len[1] = 1; +;source-doc/scsi-drv/scsi_driver.c:96: cbw.scsi_cmd.transfer_len[1] = 1; ld hl,_cbw + 23 ld (hl),0x01 -;source-doc/scsi-drv/scsi_driver.c:92: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; - ld l,(ix-2) - ld h,(ix-1) - ld bc,0x000c - add hl,bc - ld c,l - ld b,h +;source-doc/scsi-drv/scsi_driver.c:97: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24; + pop hl + push hl + ld de,0x000c + add hl, de + push hl inc hl inc hl inc hl ld a, (hl) ld ((_cbw + 17)),a -;source-doc/scsi-drv/scsi_driver.c:93: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; -;source-doc/scsi-drv/scsi_driver.c:94: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; - ld l,c - ld h,b + pop hl +;source-doc/scsi-drv/scsi_driver.c:98: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16; + push hl inc hl inc hl - ld a,(hl) + ld a, (hl) ld ((_cbw + 18)),a - dec hl - ld e, (hl) - ld hl, +(_cbw + 19) - ld (hl), e -;source-doc/scsi-drv/scsi_driver.c:95: cbw.scsi_cmd.lba[3] = dev->current_lba; - ld a, (bc) + pop hl +;source-doc/scsi-drv/scsi_driver.c:99: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8; + push hl inc hl - ld (hl), a -;source-doc/scsi-drv/scsi_driver.c:97: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); - ld e,(ix+6) - ld d,(ix+7) - push bc + ld a, (hl) + ld ((_cbw + 19)),a + pop hl +;source-doc/scsi-drv/scsi_driver.c:100: cbw.scsi_cmd.lba[3] = dev->current_lba; + ld bc,_cbw + 20 + ld a, (hl) + ld (bc), a +;source-doc/scsi-drv/scsi_driver.c:102: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true); + ld c,(ix+6) + ld b,(ix+7) + push hl ld a,0x01 push af inc sp + push bc + ld de,_cbw + push de + ld e,(ix-2) + ld d,(ix-1) push de - ld hl,_cbw - push hl - ld l,(ix-2) - ld h,(ix-1) - push hl call _do_scsi_cmd pop af pop af pop af inc sp - pop bc ld a, l - ld (_result), a -;source-doc/scsi-drv/scsi_driver.c:99: if (result == USB_ERR_OK) - ld a,(_result) + pop hl + ld (ix-1),a +;source-doc/scsi-drv/scsi_driver.c:104: if (result == USB_ERR_OK) or a jr NZ,l_usb_scsi_write_00102 -;source-doc/scsi-drv/scsi_driver.c:100: dev->current_lba++; - ld l, c - ld h, b - ld e, (hl) +;source-doc/scsi-drv/scsi_driver.c:105: dev->current_lba++; + ld c,(hl) + push hl inc hl - ld d, (hl) + ld b, (hl) inc hl - ld a,(hl) + ld e, (hl) inc hl - ld h,(hl) - ld l,a - inc e + ld d, (hl) + pop hl + inc c jr NZ,l_usb_scsi_write_00114 - inc d + inc b jr NZ,l_usb_scsi_write_00114 - inc hl + inc de l_usb_scsi_write_00114: - ld a, e - ld (bc), a - inc bc - ld a, d - ld (bc), a - inc bc - ld a, l - ld (bc), a - inc bc - ld a, h - ld (bc), a + ld (hl), c + inc hl + ld (hl), b + inc hl + ld (hl), e + inc hl + ld (hl), d l_usb_scsi_write_00102: -;source-doc/scsi-drv/scsi_driver.c:101: return result; - ld hl, (_result) -;source-doc/scsi-drv/scsi_driver.c:102: } +;source-doc/scsi-drv/scsi_driver.c:106: return result; + ld l,(ix-1) +;source-doc/scsi-drv/scsi_driver.c:107: } ld sp, ix pop ix ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c index bf825ee3..6892df6d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c @@ -3,8 +3,6 @@ #include "ez80-helpers.h" #include "print.h" -usb_error result = 0; - void ch_command(const uint8_t command) __z88dk_fastcall { uint8_t counter = 255; while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) @@ -153,7 +151,8 @@ void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); } void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); } usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { - uint8_t count; + uint8_t count; + usb_error result; if (buffer_size == 0) return USB_ERR_OK; diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h index f9240966..9507c765 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -90,8 +90,6 @@ extern int printf(const char *msg, ...); #else -extern usb_error result; - #define trace_printf(...) #define CHECK(fn) \ diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c index 99e08a5a..e3be00e4 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c @@ -32,6 +32,7 @@ usb_error usbdev_control_transfer(device_config *const device, const setup_packe } usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { + usb_error result; endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; @@ -50,6 +51,8 @@ done: } usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { + usb_error result; + endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); @@ -69,6 +72,7 @@ usb_error usbdev_dat_in_trnsfer(device_config *const device, uint8_t *const buffer, const uint16_t buffer_size, const usb_endpoint_type endpoint_type) { + usb_error result; endpoint_param *const endpoint = &device->endpoints[endpoint_type]; @@ -86,6 +90,8 @@ done: } usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) { + usb_error result; + endpoint_param *const endpoint = &device->endpoints[0]; result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c index 73f96a85..c9bf9476 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c @@ -27,6 +27,7 @@ const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8}; * @return usb_error USB_ERR_OK if all good, otherwise specific error code */ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { + usb_error result; setup_packet cmd; cmd = cmd_get_device_descriptor; cmd.wLength = 8; @@ -52,6 +53,8 @@ done: * @return usb_error USB_ERR_OK if all good, otherwise specific error code */ usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { + usb_error result; + setup_packet cmd; cmd = cmd_get_device_descriptor; cmd.wLength = 8; @@ -129,6 +132,7 @@ usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, const uint8_t max_packet_size, const uint8_t max_buffer_size, uint8_t *const buffer) { + usb_error result; CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, sizeof(config_descriptor), device_address, max_packet_size)); diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c index 9705b89e..a5e1e9c1 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c @@ -92,6 +92,7 @@ done: */ usb_error usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + usb_error result; critical_begin(); ch_set_usb_address(device_address); @@ -114,6 +115,8 @@ usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t */ usb_error usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + usb_error result; + critical_begin(); ch_set_usb_address(device_address); @@ -136,6 +139,7 @@ usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_ */ usb_error usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { + usb_error result; critical_begin(); ch_set_usb_address(device_address); diff --git a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c index 217d151d..17d5a015 100644 --- a/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c @@ -106,6 +106,8 @@ uint8_t usb_kyb_flush() __sdcccall(1) { } void usb_kyb_tick(void) { + usb_error result; + if (is_in_critical_section()) return; diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index de2a26ae..5a5a0e51 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -15,6 +15,8 @@ usb_error do_scsi_cmd(device_config_storage *const dev, void *const send_receive_buffer, const bool send) { + usb_error result; + cbw->dCBWTag[0] = next_tag++; if (!send) diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c index fd24aa02..4151f853 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c @@ -6,6 +6,8 @@ #include usb_error usb_scsi_init(const uint16_t dev_index) { + usb_error result; + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); scsi_sense_result response; @@ -54,6 +56,8 @@ usb_error usb_scsi_read_capacity(const uint16_t dev_index, scsi_read_capacity_re static cbw_scsi_read_write cbw = {{{0}}}; usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { + usb_error result; + device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); memset(&cbw, 0, sizeof(cbw_scsi_read_write)); @@ -78,6 +82,7 @@ usb_error usb_scsi_read(const uint16_t dev_index, uint8_t *const buffer) { } usb_error usb_scsi_write(const uint16_t dev_index, uint8_t *const buffer) { + usb_error result; device_config_storage *const dev = (device_config_storage *)get_usb_device_config(dev_index); memset(&cbw, 0, sizeof(cbw_scsi_read_write)); diff --git a/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c index e4b76046..8c2763e5 100644 --- a/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c +++ b/Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c @@ -13,7 +13,7 @@ usb_error usb_execute_cbi(device_config *const storage_device, const uint16_t buffer_size, uint8_t *const buffer, uint8_t *const sense_codes) { - + usb_error result; const uint8_t interface_number = storage_device->interface_number; setup_packet adsc; diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s index 0db067ee..c00100d5 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -98,10 +98,8 @@ _usb_execute_cbi: pop af pop af pop af - ld a, l - ld (_result), a ;source-doc/ufi-drv/usb_cbi.c:27: if (result == USB_ERR_STALL) { - ld a,(_result) + ld a, l sub 0x02 jr NZ,l_usb_execute_cbi_00104 ;source-doc/ufi-drv/usb_cbi.c:28: if (sense_codes != NULL) @@ -126,15 +124,14 @@ _usb_execute_cbi: ld sp, hl l_usb_execute_cbi_00102: ;source-doc/ufi-drv/usb_cbi.c:31: result = USB_ERR_STALL; - ld hl,_result - ld (hl),0x02 + ld l,0x02 ;source-doc/ufi-drv/usb_cbi.c:32: goto done; - jp l_usb_execute_cbi_00116 + jr l_usb_execute_cbi_00116 l_usb_execute_cbi_00104: ;source-doc/ufi-drv/usb_cbi.c:35: if (result != USB_ERR_OK) { - ld a,(_result) + ld a, l or a - jp NZ, l_usb_execute_cbi_00116 + jr NZ,l_usb_execute_cbi_00116 ;source-doc/ufi-drv/usb_cbi.c:40: if (send) { bit 0,(ix+8) jr Z,l_usb_execute_cbi_00112 @@ -152,10 +149,8 @@ l_usb_execute_cbi_00104: pop af pop af pop af - ld a, l - ld (_result), a ;source-doc/ufi-drv/usb_cbi.c:43: if (result != USB_ERR_OK) { - ld a,(_result) + ld a, l or a jr Z,l_usb_execute_cbi_00113 ;source-doc/ufi-drv/usb_cbi.c:45: goto done; @@ -179,10 +174,8 @@ l_usb_execute_cbi_00112: pop af pop af inc sp - ld a, l - ld (_result), a ;source-doc/ufi-drv/usb_cbi.c:50: if (result != USB_ERR_OK) { - ld a,(_result) + ld a, l or a jr NZ,l_usb_execute_cbi_00116 ;source-doc/ufi-drv/usb_cbi.c:52: goto done; @@ -208,14 +201,13 @@ l_usb_execute_cbi_00113: pop af pop af inc sp - ld a, l - ld (_result), a ;source-doc/ufi-drv/usb_cbi.c:65: done: l_usb_execute_cbi_00116: ;source-doc/ufi-drv/usb_cbi.c:66: critical_end(); + push hl call _critical_end + pop hl ;source-doc/ufi-drv/usb_cbi.c:68: return result; - ld hl, (_result) ;source-doc/ufi-drv/usb_cbi.c:69: } ld sp, ix pop ix From 53d2f3f57bc1c83a768b48c119362feb8c406953 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Thu, 8 May 2025 09:27:26 +1000 Subject: [PATCH 55/59] ch376-native: fixed issue with firmware delegation version (CHNATIVEEZ80) intermittenly failing --- .vscode/settings.json | 7 + .../ch376-native/scsi-drv/class_scsi.c.s | 158 +++++++++--------- .../source-doc/scsi-drv/class_scsi.c | 7 +- Source/HBIOS/ez80cpudrv.asm | 24 ++- 4 files changed, 101 insertions(+), 95 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index f7b26e28..45145d9e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,11 @@ { + "z80-macroasm.format.enabled": true, + "z80-macroasm.format.baseIndent": 1, + "z80-macroasm.format.whitespaceAfterInstruction": "tab", + "z80-macroasm.format.uppercaseKeywords": true, + "z80-macroasm.format.spaceAfterArgument": true, + "z80-macroasm.format.hexaNumberStyle": "motorola", + "z80-macroasm.format.hexaNumberCase": true, "files.trimTrailingWhitespace": false, "files.eol": "\r\n", "files.associations": { diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 31d4623d..3976a6a0 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -37,10 +37,6 @@ _scsi_command_block_wrapper: DEFS 15 _next_tag: DEFS 2 -_csw: - DEFS 13 -_scsi_packet_request_sense: - DEFS 12 #ENDIF @@ -56,7 +52,7 @@ _scsi_packet_request_sense: ;-------------------------------------------------------- ; code ;-------------------------------------------------------- -;source-doc/scsi-drv/class_scsi.c:13: usb_error do_scsi_cmd(device_config_storage *const dev, +;source-doc/scsi-drv/class_scsi.c:11: usb_error do_scsi_cmd(device_config_storage *const dev, ; --------------------------------- ; Function do_scsi_cmd ; --------------------------------- @@ -64,15 +60,34 @@ _do_scsi_cmd: push ix ld ix,0 add ix,sp - ld hl, -8 + ld hl, -21 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:20: cbw->dCBWTag[0] = next_tag++; +;source-doc/scsi-drv/class_scsi.c:17: _scsi_command_status_wrapper csw = {{{0}}}; + ld a,0x00 + ld (ix-21),a + ld (ix-20),a + ld (ix-19),a + ld (ix-18),a + xor a + ld (ix-17),a + ld (ix-16),a + xor a + ld (ix-15),a + ld (ix-14),a + ld a,0x00 + ld (ix-13),a + ld (ix-12),a + ld (ix-11),a + ld (ix-10),a + ld (ix-9),0x00 +;source-doc/scsi-drv/class_scsi.c:19: cbw->dCBWTag[0] = next_tag++; ld c,(ix+6) ld b,(ix+7) ld hl,0x0004 add hl, bc - ex (sp), hl + ld (ix-8),l + ld (ix-7),h ld a, (_next_tag) ld e, a ld hl,_next_tag + 1 @@ -80,24 +95,24 @@ _do_scsi_cmd: ld hl, (_next_tag) inc hl ld (_next_tag), hl - pop hl - push hl + ld l,(ix-8) + ld h,(ix-7) ld (hl), e inc hl ld (hl), d -;source-doc/scsi-drv/class_scsi.c:22: if (!send) +;source-doc/scsi-drv/class_scsi.c:21: if (!send) bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00102 -;source-doc/scsi-drv/class_scsi.c:23: cbw->bmCBWFlags = 0x80; +;source-doc/scsi-drv/class_scsi.c:22: cbw->bmCBWFlags = 0x80; ld hl,0x000c add hl, bc ld (hl),0x80 l_do_scsi_cmd_00102: -;source-doc/scsi-drv/class_scsi.c:25: critical_begin(); +;source-doc/scsi-drv/class_scsi.c:24: critical_begin(); push bc call _critical_begin pop bc -;source-doc/scsi-drv/class_scsi.c:28: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_OUT])); ld a,(ix+4) ld (ix-6),a ld e, a @@ -140,7 +155,7 @@ l_do_scsi_cmd_00102: ld a, l or a jp NZ, l_do_scsi_cmd_00120 -;source-doc/scsi-drv/class_scsi.c:30: if (cbw->dCBWDataTransferLength != 0) { +;source-doc/scsi-drv/class_scsi.c:29: if (cbw->dCBWDataTransferLength != 0) { ld hl,8 add hl, bc ld c, (hl) @@ -155,15 +170,15 @@ l_do_scsi_cmd_00102: or b or c jr Z,l_do_scsi_cmd_00113 -;source-doc/scsi-drv/class_scsi.c:33: &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:32: &dev->endpoints[ENDPOINT_BULK_IN])); ld (ix-2),c ld (ix-1),b ld c,(ix+8) ld b,(ix+9) -;source-doc/scsi-drv/class_scsi.c:31: if (!send) { +;source-doc/scsi-drv/class_scsi.c:30: if (!send) { bit 0,(ix+10) jr NZ,l_do_scsi_cmd_00110 -;source-doc/scsi-drv/class_scsi.c:33: &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:32: &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix-6) add a,0x06 ld e, a @@ -195,7 +210,7 @@ l_do_scsi_cmd_00102: jr Z,l_do_scsi_cmd_00113 jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00110: -;source-doc/scsi-drv/class_scsi.c:37: &dev->endpoints[ENDPOINT_BULK_OUT])); +;source-doc/scsi-drv/class_scsi.c:36: &dev->endpoints[ENDPOINT_BULK_OUT])); ld l,(ix-4) ld h,(ix-3) ld a, (hl) @@ -220,7 +235,7 @@ l_do_scsi_cmd_00110: or a jr NZ,l_do_scsi_cmd_00120 l_do_scsi_cmd_00113: -;source-doc/scsi-drv/class_scsi.c:42: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); +;source-doc/scsi-drv/class_scsi.c:41: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); ld a,(ix-6) add a,0x06 ld c, a @@ -241,7 +256,8 @@ l_do_scsi_cmd_00113: inc sp ld hl,0x000d push hl - ld hl,_csw + ld hl,5 + add hl, sp push hl call _usb_data_in_transfer pop af @@ -251,38 +267,40 @@ l_do_scsi_cmd_00113: ld a, l or a jr NZ,l_do_scsi_cmd_00120 -;source-doc/scsi-drv/class_scsi.c:44: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) - ld a, (_csw + 12) +;source-doc/scsi-drv/class_scsi.c:43: if (csw.bCSWStatus != 0 || csw.dCSWTag[0] != cbw->dCBWTag[0]) + ld a,(ix-9) or a - jr Z,l_do_scsi_cmd_00117 - ld bc, (_csw + 4) - pop hl - ld a,(hl) - push hl + jr NZ,l_do_scsi_cmd_00116 + ld c,(ix-17) + ld b,(ix-16) + ld l,(ix-8) + ld h,(ix-7) + ld a, (hl) inc hl ld h, (hl) ld l, a xor a sbc hl,bc jr Z,l_do_scsi_cmd_00117 -;source-doc/scsi-drv/class_scsi.c:45: result = USB_ERR_FAIL; +l_do_scsi_cmd_00116: +;source-doc/scsi-drv/class_scsi.c:44: result = USB_ERR_FAIL; ld l,0x0e jr l_do_scsi_cmd_00120 l_do_scsi_cmd_00117: -;source-doc/scsi-drv/class_scsi.c:47: result = USB_ERR_OK; +;source-doc/scsi-drv/class_scsi.c:46: result = USB_ERR_OK; ld l,0x00 -;source-doc/scsi-drv/class_scsi.c:49: done: +;source-doc/scsi-drv/class_scsi.c:48: done: l_do_scsi_cmd_00120: -;source-doc/scsi-drv/class_scsi.c:50: critical_end(); +;source-doc/scsi-drv/class_scsi.c:49: critical_end(); push hl call _critical_end pop hl -;source-doc/scsi-drv/class_scsi.c:51: return result; -;source-doc/scsi-drv/class_scsi.c:52: } +;source-doc/scsi-drv/class_scsi.c:50: return result; +;source-doc/scsi-drv/class_scsi.c:51: } ld sp, ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_test(device_config_storage *const dev) { +;source-doc/scsi-drv/class_scsi.c:53: usb_error scsi_test(device_config_storage *const dev) { ; --------------------------------- ; Function scsi_test ; --------------------------------- @@ -293,7 +311,7 @@ _scsi_test: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -302,7 +320,7 @@ _scsi_test: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:57: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); +;source-doc/scsi-drv/class_scsi.c:56: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test)); ld hl,17 add hl, sp ld b,0x06 @@ -314,11 +332,11 @@ l_scsi_test_00103: inc hl djnz l_scsi_test_00103 pop bc -;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); +;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.dCBWDataTransferLength = 0; +;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = 0; ld hl,0x0008 add hl, bc xor a @@ -329,7 +347,7 @@ l_scsi_test_00103: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); +;source-doc/scsi-drv/class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); xor a push af inc sp @@ -340,11 +358,11 @@ l_scsi_test_00103: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:64: } +;source-doc/scsi-drv/class_scsi.c:63: } ld sp,ix pop ix ret -;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { +;source-doc/scsi-drv/class_scsi.c:67: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { ; --------------------------------- ; Function scsi_request_sense ; --------------------------------- @@ -355,7 +373,7 @@ _scsi_request_sense: ld hl, -27 add hl, sp ld sp, hl -;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper; +;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper; ld hl,0 add hl, sp ld e,l @@ -364,7 +382,7 @@ _scsi_request_sense: ld bc,0x000f ld hl,_scsi_command_block_wrapper ldir -;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.request_sense = scsi_packet_request_sense; +;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.request_sense = scsi_packet_request_sense; ld hl,17 add hl, sp ex de, hl @@ -372,11 +390,11 @@ _scsi_request_sense: ld hl,_scsi_packet_request_sense ldir pop bc -;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0; +;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0; ld (ix-14),0x00 -;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); +;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense); ld (ix-13),0x0c -;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); +;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result); ld hl,0x0008 add hl, bc ld (hl),0x12 @@ -387,7 +405,7 @@ _scsi_request_sense: ld (hl), a inc hl ld (hl), a -;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); +;source-doc/scsi-drv/class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false); ld e,(ix+6) ld d,(ix+7) xor a @@ -399,37 +417,10 @@ _scsi_request_sense: ld h,(ix+5) push hl call _do_scsi_cmd -;source-doc/scsi-drv/class_scsi.c:78: } +;source-doc/scsi-drv/class_scsi.c:77: } ld sp,ix pop ix ret -_scsi_command_block_wrapper: - DEFB +0x55 - DEFB +0x53 - DEFB +0x42 - DEFB +0x43 - DEFW +0x0000 - DEFW +0x0000 - DEFB +0x00,0x00, +0x00, +0x00 - DEFB +0x00 - DEFB +0x00 - DEFB +0x00 -_next_tag: - DEFW +0x0000 -_csw: - DEFB +0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB 0x00 - DEFB +0x00 _scsi_packet_request_sense: DEFB +0x03 DEFB +0x00 @@ -443,3 +434,16 @@ _scsi_packet_request_sense: DEFB +0x00 DEFB +0x00 DEFB +0x00 +_scsi_command_block_wrapper: + DEFB +0x55 + DEFB +0x53 + DEFB +0x42 + DEFB +0x43 + DEFW +0x0000 + DEFW +0x0000 + DEFB +0x00,0x00, +0x00, +0x00 + DEFB +0x00 + DEFB +0x00 + DEFB +0x00 +_next_tag: + DEFW +0x0000 diff --git a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c index 5a5a0e51..755681d3 100644 --- a/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c +++ b/Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c @@ -8,14 +8,13 @@ _scsi_command_block_wrapper scsi_command_block_wrapper = {{0x55, 0x53, 0x42, 0x4 uint16_t next_tag = 0; -_scsi_command_status_wrapper csw = {{{0}}}; - usb_error do_scsi_cmd(device_config_storage *const dev, _scsi_command_block_wrapper *const cbw, void *const send_receive_buffer, const bool send) { usb_error result; + _scsi_command_status_wrapper csw = {{{0}}}; cbw->dCBWTag[0] = next_tag++; @@ -41,7 +40,7 @@ usb_error do_scsi_cmd(device_config_storage *const dev, CHECK( usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); - if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) + if (csw.bCSWStatus != 0 || csw.dCSWTag[0] != cbw->dCBWTag[0]) result = USB_ERR_FAIL; else result = USB_ERR_OK; @@ -63,7 +62,7 @@ usb_error scsi_test(device_config_storage *const dev) { return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false); } -_scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}}; +const _scsi_packet_request_sense scsi_packet_request_sense = {0x03, 0, 0, 0, 18, 0, {0, 0, 0, 0, 0, 0}}; usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) { cbw_scsi_request_sense cbw_scsi; diff --git a/Source/HBIOS/ez80cpudrv.asm b/Source/HBIOS/ez80cpudrv.asm index 510a8eec..e4d1499c 100644 --- a/Source/HBIOS/ez80cpudrv.asm +++ b/Source/HBIOS/ez80cpudrv.asm @@ -342,24 +342,20 @@ _EZ80_CPY_UHL_TO_EHL: ; set the upper byte (u of DE) to MB. _EZ80_EXTN_DE_TO_MB_DE: - PUSH IY - .DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0 + .DB $49, $D5 ; PUSH.L DE + .DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0 .DB $49, $FD, $39 ; ADD.L IY, SP - .DB $49, $FD, $1F, $FD ; LD.L (IY-3), DE - .DB $ED, $6E ; LD A, MB - .DB $49, $FD, $77, $FF ; LD.L (IY-1), A - .DB $49, $FD, $17, $FD ; LD.L DE, (IY-3) - POP IY + .DB $ED, $6E ; LD A, MB + .DB $5B, $FD, $77, $02 ; LD.LIL (IY+2), A + .DB $49, $D1 ; POP.L DE RET ; set the upper byte (u of IY) to MB. _EZ80_EXTN_IY_TO_MB_IY: - PUSH IX - .DB $5B, $DD, $21, $00, $00, $00 ; LD.LIL IX, 0 - .DB $49, $DD, $39 ; ADD.L IX, SP - .DB $49, $DD, $3E, $FD ; LD.L (IX-3), IY + .DB $49, $FD, $E5 ; PUSH.L IY + .DB $5B, $FD, $21, $00, $00, $00 ; LD.LIL IY, 0 + .DB $49, $FD, $39 ; ADD.L IY, SP .DB $ED, $6E ; LD A, MB - .DB $49, $DD, $77, $FF ; LD.L (IX-1), A - .DB $49, $DD, $31, $FD ; LD.L IY, (IX-3) - POP IX + .DB $5B, $FD, $77, $02 ; LD.LIL (IY+2), A + .DB $49, $FD, $E1 ; POP.L IY RET From 100b2fc46ef78fe83ffd939f2c4ed6d128990519 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Sat, 21 Jun 2025 13:42:01 +1000 Subject: [PATCH 56/59] ch376-native: revert non-related changes applied to RCEZ80 config files --- Source/HBIOS/Config/RCEZ80_std.asm | 14 +++++++------- Source/HBIOS/cfg_RCEZ80.asm | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index fe4c9450..760f4c7d 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -50,23 +50,23 @@ CPUOSC .SET 20000000 ; CPU OSC FREQ IN MHZ ; FPLED_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL LEDS -FPSW_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_ENABLE .SET TRUE ; FP: ENABLES FRONT PANEL SWITCHES CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP VDAEMU_SERKBD .SET $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD ;; -TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSXUKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] -TMS80COLS .SET TRUE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] +TMS80COLS .SET FALSE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) EFENABLE .SET FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) ; -FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDENABLE .SET TRUE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] ; -IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) ; -PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) ; SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR|PIO|Z80R|EPITX|FZ80|GM|EZ512|K80W] diff --git a/Source/HBIOS/cfg_RCEZ80.asm b/Source/HBIOS/cfg_RCEZ80.asm index 3b2591e0..040fae30 100644 --- a/Source/HBIOS/cfg_RCEZ80.asm +++ b/Source/HBIOS/cfg_RCEZ80.asm @@ -125,7 +125,7 @@ PKDENABLE .SET FALSE ; ENABLES DSKY NG PKD DRIVER (8259) PKDPPIBASE .SET $60 ; BASE I/O ADDRESS OF PKD PPI PKDOSC .SET 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) H8PENABLE .SET FALSE ; ENABLES HEATH H8 FRONT PANEL -LCDENABLE .SET FALSE ; ENABLE LCD DISPLAY +LCDENABLE .SET TRUE ; ENABLE LCD DISPLAY LCDBASE .SET $DA ; BASE I/O ADDRESS OF LCD CONTROLLER GM7303ENABLE .SET FALSE ; ENABLES THE GM7303 BOARD WITH 16X2 LCD ; From 1a955efee6e979a24532c99c8a7c29418f9a44e7 Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 15 Jul 2025 10:57:36 +1000 Subject: [PATCH 57/59] ch376-native: updated cbios to allow for upto 32 device types returned from DIODEVICE HBIOS query --- Source/CBIOS/cbios.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/CBIOS/cbios.asm b/Source/CBIOS/cbios.asm index ae670c67..98cf9510 100644 --- a/Source/CBIOS/cbios.asm +++ b/Source/CBIOS/cbios.asm @@ -3381,7 +3381,7 @@ DEVUNK .DB "UNK$" RST 08 ; CALL HBIOS LD A,D ; RESULTANT DEVICE TYPE PUSH DE ; NEED TO SAVE UNIT NUMBER (IN E) - AND $0F ; ISOLATE DEVICE BITS + AND $1F ; ISOLATE DEVICE BITS ADD A,A ; MULTIPLY BY TWO FOR WORD TABLE LD HL,DEVTBL ; POINT TO START OF DEVICE NAME TABLE CALL ADDHLA ; ADD A TO HL TO POINT TO TABLE ENTRY From 7dbe9a5abb2008cfec33ab17463b96279264a41a Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 15 Jul 2025 11:08:41 +1000 Subject: [PATCH 58/59] ch376-native: updated readme notes and adjusted config for Z80 and eZ80 to not by default, enable the USB drivers --- Source/HBIOS/Config/RCEZ80_std.asm | 17 +++--- Source/HBIOS/Config/RCZ80_std.asm | 15 ++--- Source/HBIOS/ch376-native/keyboard.s | 2 +- Source/HBIOS/ch376-native/readme.md | 89 ++++++++++++++++++++++++---- Source/HBIOS/ch376-native/scsi-drv.s | 2 +- Source/HBIOS/ch376-native/ufi-drv.s | 2 +- 6 files changed, 93 insertions(+), 34 deletions(-) diff --git a/Source/HBIOS/Config/RCEZ80_std.asm b/Source/HBIOS/Config/RCEZ80_std.asm index 760f4c7d..12411306 100644 --- a/Source/HBIOS/Config/RCEZ80_std.asm +++ b/Source/HBIOS/Config/RCEZ80_std.asm @@ -71,6 +71,14 @@ PPIDEENABLE .SET TRUE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) SDENABLE .SET FALSE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR|PIO|Z80R|EPITX|FZ80|GM|EZ512|K80W] SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +; +CHENABLE .SET TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHNATIVEENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEEZ80 .SET TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE +CHNATIVEFORCE .SET FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED +; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; LPTENABLE .SET FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) @@ -83,13 +91,4 @@ AY38910ENABLE .SET FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] AY_FORCE .SET FALSE ; AY: BYPASS AUTO-DETECT, FORCED PRESENT -CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT -CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER -CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER -CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER -CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) -CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -CHNATIVEEZ80 .SET TRUE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE -CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED - EZ80TIMER .SET EZ80TMR_FIRM ; EZ80: TIMER TICK MODEL: EZ80TMR_[INT|FIRM] diff --git a/Source/HBIOS/Config/RCZ80_std.asm b/Source/HBIOS/Config/RCZ80_std.asm index dd81ef6b..f8cce67c 100644 --- a/Source/HBIOS/Config/RCZ80_std.asm +++ b/Source/HBIOS/Config/RCZ80_std.asm @@ -72,7 +72,7 @@ ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) -TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU] +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] TMS80COLS .SET FALSE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) VRCENABLE .SET FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) @@ -92,6 +92,10 @@ SDMODE .SET SDMODE_PIO ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4 SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY ; CHENABLE .SET TRUE ; CH: ENABLE CH375/376 USB SUPPORT +CHNATIVEENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .SET FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEFORCE .SET FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED ; PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) ; @@ -106,12 +110,3 @@ SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER AY38910ENABLE .SET FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER AYMODE .SET AYMODE_RCZ80 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] AY_FORCE .SET FALSE ; AY: BYPASS AUTO-DETECT, FORCED PRESENT - -CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT -CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER -CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER -CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER -CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED -CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) -CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) -USBKYBENABLE .SET TRUE ; USB KEYBOARD DRIVER diff --git a/Source/HBIOS/ch376-native/keyboard.s b/Source/HBIOS/ch376-native/keyboard.s index 221b24c7..abc73e8a 100644 --- a/Source/HBIOS/ch376-native/keyboard.s +++ b/Source/HBIOS/ch376-native/keyboard.s @@ -5,7 +5,7 @@ #IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/class_hid_keyboard.c.s" #ENDIF -#include "ch376-native/keyboard/kyb-init.c.s" #IF (!CHNATIVEEZ80) #include "ch376-native/keyboard/kyb_driver.c.s" #ENDIF +#include "ch376-native/keyboard/kyb-init.c.s" diff --git a/Source/HBIOS/ch376-native/readme.md b/Source/HBIOS/ch376-native/readme.md index 8fbb46fb..f92ffd8c 100644 --- a/Source/HBIOS/ch376-native/readme.md +++ b/Source/HBIOS/ch376-native/readme.md @@ -11,50 +11,115 @@ The build process, is a 3 stage process. The original C code and produced/translated .s files are all committed units in the repo. But it is expected, that only the c files are to be modified/updated. -The .s files are checked in, to builders to not require the C compiler tool chain (z88dk) to be installed. +The .s files are checked in, so builders do not require the C compiler tool chain (z88dk) to be installed. -The c compiling/translating process is also only support on linux, as the script to translate the .asm files +The c compiling/translating process is only supported on linux, as the script to translate the .asm files to .s files is a linux bash script. (Although the script can be easily run within Windows's Sub-system for linux) ## Compiling the C code -To compile the c code, to update the .s files: +> Requires linux with docker installed. -Within the `Source/HBIOS/ch376-native` directly: +> The C code only needs to be recompiled if and when you change any of the `.c` source files. + +To compile the `.c` code to generate updated `.s` files: + +Within the `Source/HBIOS/ch376-native` directory: ``` make ``` -The make script will search for z88dk's `zcc` compiler, if not found, will attempt to use a docker wrapper. +The make script will search for z88dk's `zcc` compiler, if not found, will attempt to use a docker wrapper. It will not work if z88dk or docker is not installed. ## USB Native Driver systems +The default builds of RomWBW do not enable the CH376 native usb drivers. These drivers take a reasonable chunk of ROM space. As such you +will need to build a new HBIOS image customised for your platform. Please familiarise yourself with the HBIOS/RomWBW build and configuration process. + The usb driver is divided into a few sub-system, which can be individually enabled within the standard HBIOS config files. -### base-drv +For activating the full native USB support, the non native CH365 drivers need to be disabled and the relevant `CHNATIVE` drivers enabled + +Example: + +``` +CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER +CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER +CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER +CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) +CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) +CHNATIVEEZ80 .SET FALSE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE +CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED +``` -The `base-drv` system contains the core code to discover, enumerate, and communicate to USB devices. +As the USB driver is a fairly large, you may need to disable other HBIOS drivers in your configuration. As such, it is +recommend to only enable drivers for your platform's hardware configuration - for example, enable only the serial driver +required for your system. -It also includes the driver code for enumerate and operating USB devices on USB hubs. +``` +DUARTENABLE .SET FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +UARTENABLE .SET FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +``` + +You may also need to disable other storage drivers: + +``` +FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +IDEENABLE .SET FALSE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +``` -### scsi-drv +### base-drv `CHNATIVEENABLE` + +The `base-drv` system contains the core code to discover, enumerate, and communicate with USB devices. + +It also includes the driver code to enumerate and operating USB devices through a USB hub. + +### scsi-drv `CHSCSIENABLE` The `scsi-drv` system can be enabled with the HBIOS config `CHSCSIENABLE` When activated, access to most USB mass storage devices (thumb drives, magnetic usb drives) is enabled. -### ufi-drv +### ufi-drv `CHUFIENABLE` The `ufi-drv` system can be enabled with the HBIOS config `CHUFIENABLE` When activated, access to 3.5" Floppy USB devices will be enabled. -### keyboard +### keyboard `TMSMODE_MSXUKY` + +The `keyboard` system can be enabled with the inferred config entry `USBKYBENABLE` + +This config item is not to be directly set, but is activated via the TMS keyboard driver + +Example configuration, combined with the TMS VDP module driver. -The `keyboard` system can be enabled with the HBIOS config `USBKYBENABLE` +``` +TMSENABLE .SET TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSMODE .SET TMSMODE_MSXUKY ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU|MSXUKY] +TMS80COLS .SET FALSE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 +TMSTIMENABLE .SET TRUE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +``` When activated, usb keyboards can be used as input devices. +### Force activation `CHNATIVEFORCE` + +The CH376 module, during a cold power on boot, can take many seconds before it will +respond to the CPU. As such, the CPU may fail to detect the presence of the module. + +A manual reset (without power cycling) generally enables detection. The config entry +`CHNATIVEFORCE` can be enabled to force the CPU to always wait for the module to come online. + + +### eZ80 support `CHNATIVEEZ80` +If you have the eZ80 CPU installed with onboard USB firmware support, you +can gain performance by delegating HBIOS to the firmware implementation. To enable +delegation, enable the config entry `CHNATIVEEZ80` diff --git a/Source/HBIOS/ch376-native/scsi-drv.s b/Source/HBIOS/ch376-native/scsi-drv.s index 3723445a..ea6f8a70 100644 --- a/Source/HBIOS/ch376-native/scsi-drv.s +++ b/Source/HBIOS/ch376-native/scsi-drv.s @@ -2,7 +2,7 @@ #IF (!CHNATIVEEZ80) #include "ch376-native/scsi-drv/class_scsi.c.s" #ENDIF -#include "ch376-native/scsi-drv/scsi-init.c.s" #IF (!CHNATIVEEZ80) #include "ch376-native/scsi-drv/scsi_driver.c.s" #ENDIF +#include "ch376-native/scsi-drv/scsi-init.c.s" diff --git a/Source/HBIOS/ch376-native/ufi-drv.s b/Source/HBIOS/ch376-native/ufi-drv.s index d37ebb30..bcc735b4 100644 --- a/Source/HBIOS/ch376-native/ufi-drv.s +++ b/Source/HBIOS/ch376-native/ufi-drv.s @@ -2,10 +2,10 @@ #IF (!CHNATIVEEZ80) #include "ch376-native/ufi-drv/class_ufi.c.s" #ENDIF -#include "ch376-native/ufi-drv/ufi-init.c.s" #IF (!CHNATIVEEZ80) #include "ch376-native/ufi-drv/ufi_driver.c.s" #ENDIF +#include "ch376-native/ufi-drv/ufi-init.c.s" #IF (!CHNATIVEEZ80) #include "ch376-native/ufi-drv/usb_cbi.c.s" #ENDIF From 2269142a046de70bfc86ff6c909e2b815e09befa Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 15 Jul 2025 11:53:45 +1000 Subject: [PATCH 59/59] ch376-native: moved port definition from C code to cfg_MASTER.asm --- Source/HBIOS/cfg_MASTER.asm | 4 ++++ Source/HBIOS/ch376-native/base-drv/ch376.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/ch376_init.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/class_hub.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/enumerate.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/protocol.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/transfers.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/usb_state.c.s | 3 --- Source/HBIOS/ch376-native/base-drv/work-area.c.s | 3 --- Source/HBIOS/ch376-native/keyboard/class_hid.c.s | 3 --- Source/HBIOS/ch376-native/keyboard/kyb-init.c.s | 3 --- Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s | 3 --- Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s | 3 --- Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s | 3 --- Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s | 3 --- Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h | 6 +++--- Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s | 3 --- Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s | 3 --- Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s | 3 --- Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s | 3 --- 25 files changed, 7 insertions(+), 72 deletions(-) diff --git a/Source/HBIOS/cfg_MASTER.asm b/Source/HBIOS/cfg_MASTER.asm index 03501fb5..c5f7478a 100644 --- a/Source/HBIOS/cfg_MASTER.asm +++ b/Source/HBIOS/cfg_MASTER.asm @@ -509,3 +509,7 @@ CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQU CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) CHNATIVEFORCE .EQU FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED (REQUIRES CHNATIVEENABLE) CHNATIVEEZ80 .EQU FALSE ; CH376: DELEGATE USB DRIVERS TO EZ80'S FIRMWARE + +_CH376_DATA_PORT .EQU $FF88 ; CH376: DATA PORT +_CH376_COMMAND_PORT .EQU $FF89 ; CH376: COMMAND PORT +_USB_MODULE_LEDS .EQU $FF8A ; CH376: LED CONTROL PORT diff --git a/Source/HBIOS/ch376-native/base-drv/ch376.c.s b/Source/HBIOS/ch376-native/base-drv/ch376.c.s index 710a7959..31fce084 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s index 1c0ebe13..bdd67453 100644 --- a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s index 056266f9..27677a28 100644 --- a/Source/HBIOS/ch376-native/base-drv/class_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/class_hub.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s index 7185ae4c..7019e002 100644 --- a/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s index 450eece3..7b99952f 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s index 061b599a..7b970bcf 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s index 0b85b094..bb73bfab 100644 --- a/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/enumerate_storage.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s index dfc56fb0..164d6677 100644 --- a/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s +++ b/Source/HBIOS/ch376-native/base-drv/hbios-driver-storage.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/protocol.c.s b/Source/HBIOS/ch376-native/base-drv/protocol.c.s index 165c2f6e..0b07a180 100644 --- a/Source/HBIOS/ch376-native/base-drv/protocol.c.s +++ b/Source/HBIOS/ch376-native/base-drv/protocol.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/transfers.c.s b/Source/HBIOS/ch376-native/base-drv/transfers.c.s index 0289e39b..f048769d 100644 --- a/Source/HBIOS/ch376-native/base-drv/transfers.c.s +++ b/Source/HBIOS/ch376-native/base-drv/transfers.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s index 81697938..06bec59b 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index 9cf0c5af..d70ea4c5 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/work-area.c.s b/Source/HBIOS/ch376-native/base-drv/work-area.c.s index e08c9fe6..ff1b7e91 100644 --- a/Source/HBIOS/ch376-native/base-drv/work-area.c.s +++ b/Source/HBIOS/ch376-native/base-drv/work-area.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s index f53b35a5..a3dbc2b3 100644 --- a/Source/HBIOS/ch376-native/keyboard/class_hid.c.s +++ b/Source/HBIOS/ch376-native/keyboard/class_hid.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s index af030411..9aba172e 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb-init.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s index 26988280..f804e4ae 100644 --- a/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s +++ b/Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s index 3976a6a0..bcf0bdae 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s index c8a696e9..3f0802de 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s index 47527495..9dc504aa 100644 --- a/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s +++ b/Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h index 9507c765..c40173a0 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h @@ -129,10 +129,10 @@ typedef struct { typedef enum _ch376_pid { CH_PID_SETUP = DEF_USB_PID_SETUP, CH_PID_IN = DEF_USB_PID_IN, CH_PID_OUT = DEF_USB_PID_OUT } ch376_pid; -__sfr __banked __at(0xFF88) CH376_DATA_PORT; -__sfr __banked __at(0xFF89) CH376_COMMAND_PORT; +extern __sfr __banked CH376_DATA_PORT; +extern __sfr __banked CH376_COMMAND_PORT; -__sfr __banked __at(0xFF8A) USB_MODULE_LEDS; +extern __sfr __banked USB_MODULE_LEDS; extern void delay_20ms(void); extern void delay_short(void); diff --git a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s index 6eaf2e9e..560fd123 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s index e282a318..01d67fbe 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s index 53179ed6..b440df7d 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;-------------------------------------------------------- diff --git a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s index c00100d5..90a034cd 100644 --- a/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s +++ b/Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s @@ -19,9 +19,6 @@ ;-------------------------------------------------------- ; special function registers ;-------------------------------------------------------- -_CH376_DATA_PORT .EQU 0xff88 -_CH376_COMMAND_PORT .EQU 0xff89 -_USB_MODULE_LEDS .EQU 0xff8a ;-------------------------------------------------------- ; ram data ;--------------------------------------------------------