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$"); }