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