From d1722923fd4d089c102d916d313a68016b73faaa Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Tue, 22 Apr 2025 19:55:50 +1000 Subject: [PATCH] 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 $