Browse Source

ch376-native: refactor clear separation of driver and usb functions

pull/592/head
Dean Netherton 9 months ago
parent
commit
ecb95cc161
  1. 4
      .vscode/settings.json
  2. 1
      Source/HBIOS/ch376-native/base-drv.s
  3. 3
      Source/HBIOS/ch376-native/base-drv/ch376_init.c.s
  4. 167
      Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s
  5. 465
      Source/HBIOS/ch376-native/base-drv/usb-init.c.s
  6. 203
      Source/HBIOS/ch376-native/base-drv/usb_init.c.s
  7. 109
      Source/HBIOS/ch376-native/base-drv/usb_state.c.s
  8. 1
      Source/HBIOS/ch376-native/keyboard.s
  9. 575
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  10. 583
      Source/HBIOS/ch376-native/keyboard/kyb_driver.c.s
  11. 1
      Source/HBIOS/ch376-native/scsi-drv.s
  12. 464
      Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s
  13. 67
      Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s
  14. 482
      Source/HBIOS/ch376-native/scsi-drv/scsi_driver.c.s
  15. 1
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h
  16. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c
  17. 71
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c
  18. 4
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h
  19. 69
      Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c
  20. 8
      Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h
  21. 13
      Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c
  22. 5
      Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h
  23. 146
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c
  24. 150
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.c
  25. 12
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h
  26. 116
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c
  27. 19
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h
  28. 17
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c
  29. 118
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c
  30. 14
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.h
  31. 95
      Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi-init.c
  32. 85
      Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c
  33. 11
      Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h
  34. 1
      Source/HBIOS/ch376-native/ufi-drv.s
  35. 403
      Source/HBIOS/ch376-native/ufi-drv/ufi-init.c.s
  36. 380
      Source/HBIOS/ch376-native/ufi-drv/ufi_driver.c.s
  37. 8
      Source/HBIOS/ch376kyb.asm
  38. 8
      Source/HBIOS/ch376scsi.asm
  39. 8
      Source/HBIOS/ch376ufi.asm

4
.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"
}
}

1
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"

3
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
;--------------------------------------------------------

167
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

465
Source/HBIOS/ch376-native/base-drv/usb-init.c.s

@ -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

203
Source/HBIOS/ch376-native/base-drv/usb_init.c.s

@ -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

109
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

1
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"

575
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

583
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

1
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"

464
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

67
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

482
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

1
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;

2
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;

71
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 <string.h>
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;

4
Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.h

@ -5,8 +5,10 @@
#include <dev_transfers.h>
#include <stdint.h>
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

69
Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c

@ -1,69 +0,0 @@
#include "usb_init.h"
#include "ch376.h"
#include "enumerate.h"
#include "work-area.h"
#include <string.h>
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;
}

8
Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h

@ -1,8 +0,0 @@
#ifndef __USB_INIT
#define __USB_INIT
#include <stdint.h>
extern uint16_t usb_init(uint8_t state) __z88dk_fastcall;
#endif

13
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;
}

5
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

146
Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c

@ -1,49 +1,20 @@
#include "class_hid.h"
#include "class_hid_keyboard.h"
#include <critical-section.h>
#include <dev_transfers.h>
#include "kyb_driver.h"
#include <print.h>
#include <stdint.h>
#include <string.h>
#include <usb_state.h>
#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;
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;
}
}
}

150
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 <critical-section.h>
#include <dev_transfers.h>
#include <stdint.h>
#include <usb_state.h>
#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;
}

12
Source/HBIOS/ch376-native/source-doc/keyboard/kyb_driver.h

@ -0,0 +1,12 @@
#ifndef __KYB_DRIVER__
#define __KYB_DRIVER__
#include <ch376.h>
#include <stdint.h>
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

116
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);
// }

19
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

17
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 <ch376.h>
#include <enumerate.h>
#include "scsi_driver.h"
#include <hbios.h>
#include <print.h>
#include <string.h>
#include <usb-base-drv.h>
#include <work-area.h>
#include <z80.h>
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
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]);
}

118
Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi_driver.c

@ -0,0 +1,118 @@
#include "scsi_driver.h"
#include "class_scsi.h"
#include <ch376.h>
#include <critical-section.h>
#include <string.h>
#include <usb_state.h>
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);
// }

14
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 <ch376.h>
#include <stdint.h>
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

95
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 <dev_transfers.h>
#include <hbios.h>
#include <print.h>
#include <string.h>
#include <usb-base-drv.h>
#include <work-area.h>
#include <usb_state.h>
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
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;
}

85
Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.c

@ -0,0 +1,85 @@
#include "ufi_driver.h"
#include "class_ufi.h"
#include <dev_transfers.h>
#include <string.h>
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;
}

11
Source/HBIOS/ch376-native/source-doc/ufi-drv/ufi_driver.h

@ -0,0 +1,11 @@
#ifndef __UFI_DRIVER__
#define __UFI_DRIVER__
#include <ch376.h>
#include <stdint.h>
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

1
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"

403
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

380
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

8
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

8
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

8
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

Loading…
Cancel
Save