Browse Source

usb-keyboard: working (limited)

pull/592/head
Dean Netherton 1 year ago
parent
commit
601ddee38b
  1. 3
      .vscode/settings.json
  2. 9
      Source/HBIOS/ch376-native/Makefile
  3. 1
      Source/HBIOS/ch376-native/base-drv.s
  4. 355
      Source/HBIOS/ch376-native/base-drv/ch376.c.s
  5. 254
      Source/HBIOS/ch376-native/base-drv/class_hid.c.s
  6. 55
      Source/HBIOS/ch376-native/base-drv/critical-section.c.s
  7. 285
      Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s
  8. 285
      Source/HBIOS/ch376-native/base-drv/enumerate.c.s
  9. 102
      Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s
  10. 172
      Source/HBIOS/ch376-native/base-drv/protocol.c.s
  11. 202
      Source/HBIOS/ch376-native/base-drv/transfers.c.s
  12. 10
      Source/HBIOS/ch376-native/base-drv/usb-init.c.s
  13. 118
      Source/HBIOS/ch376-native/cruntime.asm
  14. 1
      Source/HBIOS/ch376-native/keyboard.s
  15. 43
      Source/HBIOS/ch376-native/keyboard/class_hid.c.s
  16. 343
      Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s
  17. 326
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  18. 323
      Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s
  19. 8
      Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s
  20. 25
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c
  21. 9
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.h
  22. 8
      Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.c
  23. 13
      Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.h
  24. 24
      Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c
  25. 3
      Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h
  26. 21
      Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c
  27. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c
  28. 17
      Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c
  29. 51
      Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c
  30. 11
      Source/HBIOS/ch376-native/source-doc/base-drv/z80.h
  31. 3
      Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh
  32. 8
      Source/HBIOS/ch376-native/source-doc/depends.d
  33. 15
      Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c
  34. 343
      Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c
  35. 79
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c
  36. 13
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c
  37. 1
      Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c
  38. 18
      Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c
  39. 21
      Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c
  40. 160
      Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s
  41. 87
      Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s
  42. 76
      Source/HBIOS/ch376kyb.asm
  43. 15
      Source/HBIOS/hbios.asm

3
.vscode/settings.json

@ -17,6 +17,7 @@
"class_scsi.h": "c", "class_scsi.h": "c",
"z80.h": "c", "z80.h": "c",
"dev_transfers.h": "c", "dev_transfers.h": "c",
"usb-base-drv.h": "c"
"usb-base-drv.h": "c",
"critical-section.h": "c"
} }
} }

9
Source/HBIOS/ch376-native/Makefile

@ -22,8 +22,13 @@ all: $(ASSDIR)base-drv.s $(ASSDIR)scsi-drv.s $(ASSDIR)ufi-drv.s $(ASSDIR)keyboar
clean: clean:
@rm -rf base-drv @rm -rf base-drv
@rm -rf scsi-drv
@rm -rf ufi-drv
rm -rf scsi-drv
rm -rf ufi-drv
rm -rf keyboard
rm ufi-drv.s
rm scsi-drv.s
rm base-drv.s
rm keyboard.s
$(ASSDIR)base-drv.s: $(ASSDIR)base-drv.s:
@echo "Creating base-drv.s" @echo "Creating base-drv.s"

1
Source/HBIOS/ch376-native/base-drv.s

@ -1,5 +1,6 @@
; Generated File -- not to be modify directly ; Generated File -- not to be modify directly
#include "ch376-native/base-drv/dev_transfers.c.s" #include "ch376-native/base-drv/dev_transfers.c.s"
#include "ch376-native/base-drv/critical-section.c.s"
#include "ch376-native/base-drv/enumerate.c.s" #include "ch376-native/base-drv/enumerate.c.s"
#include "ch376-native/base-drv/usb_state.c.s" #include "ch376-native/base-drv/usb_state.c.s"
#include "ch376-native/base-drv/class_hub.c.s" #include "ch376-native/base-drv/class_hub.c.s"

355
Source/HBIOS/ch376-native/base-drv/ch376.c.s

@ -56,256 +56,232 @@ _result:
; --------------------------------- ; ---------------------------------
_ch_command: _ch_command:
;source-doc/base-drv/./ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) ;source-doc/base-drv/./ch376.c:10: while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0)
ld h,0xff
ld c,0xff
l_ch_command_00102: l_ch_command_00102:
ld a, +((_CH376_COMMAND_PORT) / 256) ld a, +((_CH376_COMMAND_PORT) / 256)
in a, (((_CH376_COMMAND_PORT) & 0xFF)) in a, (((_CH376_COMMAND_PORT) & 0xFF))
bit 4, a bit 4, a
jr Z,l_ch_command_00104 jr Z,l_ch_command_00104
dec h
jr Z,l_ch_command_00104
;source-doc/base-drv/./ch376.c:11: delay();
push hl
call _delay
pop hl
jr l_ch_command_00102
dec c
jr NZ,l_ch_command_00102
l_ch_command_00104: l_ch_command_00104:
;source-doc/base-drv/./ch376.c:21: delay();
push hl
call _delay
pop hl
;source-doc/base-drv/./ch376.c:22: CH376_COMMAND_PORT = command;
;source-doc/base-drv/./ch376.c:21: CH376_COMMAND_PORT = command;
ld a, l ld a, l
ld bc,_CH376_COMMAND_PORT ld bc,_CH376_COMMAND_PORT
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:23: delay();
call _delay
;source-doc/base-drv/./ch376.c:24: delay();
call _delay
;source-doc/base-drv/./ch376.c:25: delay();
call _delay
;source-doc/base-drv/./ch376.c:26: delay();
;source-doc/base-drv/./ch376.c:27: }
jp _delay
;source-doc/base-drv/./ch376.c:31: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); }
;source-doc/base-drv/./ch376.c:22: }
ret
;source-doc/base-drv/./ch376.c:26: usb_error ch_long_wait_int_and_get_status(void) { return ch_wait_int_and_get_status(5000); }
; --------------------------------- ; ---------------------------------
; Function ch_long_wait_int_and_get_status ; Function ch_long_wait_int_and_get_status
; --------------------------------- ; ---------------------------------
_ch_long_wait_int_and_get_statu: _ch_long_wait_int_and_get_statu:
ld hl,0x1388 ld hl,0x1388
jp _ch_wait_int_and_get_status jp _ch_wait_int_and_get_status
;source-doc/base-drv/./ch376.c:33: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); }
;source-doc/base-drv/./ch376.c:28: usb_error ch_short_wait_int_and_get_statu(void) { return ch_wait_int_and_get_status(100); }
; --------------------------------- ; ---------------------------------
; Function ch_short_wait_int_and_get_statu ; Function ch_short_wait_int_and_get_statu
; --------------------------------- ; ---------------------------------
_ch_short_wait_int_and_get_stat: _ch_short_wait_int_and_get_stat:
ld hl,0x0064 ld hl,0x0064
jp _ch_wait_int_and_get_status jp _ch_wait_int_and_get_status
;source-doc/base-drv/./ch376.c:35: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); }
;source-doc/base-drv/./ch376.c:30: usb_error ch_very_short_wait_int_and_get_(void) { return ch_wait_int_and_get_status(10); }
; --------------------------------- ; ---------------------------------
; Function ch_very_short_wait_int_and_get_ ; Function ch_very_short_wait_int_and_get_
; --------------------------------- ; ---------------------------------
_ch_very_short_wait_int_and_get: _ch_very_short_wait_int_and_get:
ld hl,0x000a ld hl,0x000a
jp _ch_wait_int_and_get_status jp _ch_wait_int_and_get_status
;source-doc/base-drv/./ch376.c:37: usb_error ch_get_status(void) {
;source-doc/base-drv/./ch376.c:32: usb_error ch_get_status(void) {
; --------------------------------- ; ---------------------------------
; Function ch_get_status ; Function ch_get_status
; --------------------------------- ; ---------------------------------
_ch_get_status: _ch_get_status:
;source-doc/base-drv/./ch376.c:38: ch_command(CH_CMD_GET_STATUS);
;source-doc/base-drv/./ch376.c:33: ch_command(CH_CMD_GET_STATUS);
ld l,0x22 ld l,0x22
call _ch_command call _ch_command
;source-doc/base-drv/./ch376.c:39: delay();
call _delay
;source-doc/base-drv/./ch376.c:40: delay();
call _delay
;source-doc/base-drv/./ch376.c:41: delay();
call _delay
;source-doc/base-drv/./ch376.c:42: delay();
call _delay
;source-doc/base-drv/./ch376.c:43: uint8_t ch_status = CH376_DATA_PORT;
;source-doc/base-drv/./ch376.c:34: uint8_t ch_status = CH376_DATA_PORT;
ld a, +((_CH376_DATA_PORT) / 256) ld a, +((_CH376_DATA_PORT) / 256)
in a, (((_CH376_DATA_PORT) & 0xFF)) in a, (((_CH376_DATA_PORT) & 0xFF))
;source-doc/base-drv/./ch376.c:45: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX)
;source-doc/base-drv/./ch376.c:36: if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX)
ld l,a ld l,a
sub 0x41 sub 0x41
jr C,l_ch_get_status_00102 jr C,l_ch_get_status_00102
ld a,0xb4 ld a,0xb4
sub l sub l
;source-doc/base-drv/./ch376.c:46: return ch_status;
;source-doc/base-drv/./ch376.c:37: return ch_status;
jr NC,l_ch_get_status_00126 jr NC,l_ch_get_status_00126
l_ch_get_status_00102: l_ch_get_status_00102:
;source-doc/base-drv/./ch376.c:48: if (ch_status == CH_CMD_RET_SUCCESS)
;source-doc/base-drv/./ch376.c:39: if (ch_status == CH_CMD_RET_SUCCESS)
ld a, l ld a, l
;source-doc/base-drv/./ch376.c:49: return USB_ERR_OK;
;source-doc/base-drv/./ch376.c:40: return USB_ERR_OK;
sub 0x51 sub 0x51
jr NZ,l_ch_get_status_00105 jr NZ,l_ch_get_status_00105
ld l,a ld l,a
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00105: l_ch_get_status_00105:
;source-doc/base-drv/./ch376.c:51: if (ch_status == CH_USB_INT_SUCCESS)
;source-doc/base-drv/./ch376.c:42: if (ch_status == CH_USB_INT_SUCCESS)
ld a, l ld a, l
;source-doc/base-drv/./ch376.c:52: return USB_ERR_OK;
;source-doc/base-drv/./ch376.c:43: return USB_ERR_OK;
sub 0x14 sub 0x14
jr NZ,l_ch_get_status_00107 jr NZ,l_ch_get_status_00107
ld l,a ld l,a
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00107: l_ch_get_status_00107:
;source-doc/base-drv/./ch376.c:54: if (ch_status == CH_USB_INT_CONNECT)
;source-doc/base-drv/./ch376.c:45: if (ch_status == CH_USB_INT_CONNECT)
ld a, l ld a, l
sub 0x15 sub 0x15
jr NZ,l_ch_get_status_00109 jr NZ,l_ch_get_status_00109
;source-doc/base-drv/./ch376.c:55: return USB_INT_CONNECT;
;source-doc/base-drv/./ch376.c:46: return USB_INT_CONNECT;
ld l,0x81 ld l,0x81
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00109: l_ch_get_status_00109:
;source-doc/base-drv/./ch376.c:57: if (ch_status == CH_USB_INT_DISK_READ)
;source-doc/base-drv/./ch376.c:48: if (ch_status == CH_USB_INT_DISK_READ)
ld a, l ld a, l
sub 0x1d sub 0x1d
jr NZ,l_ch_get_status_00111 jr NZ,l_ch_get_status_00111
;source-doc/base-drv/./ch376.c:58: return USB_ERR_DISK_READ;
;source-doc/base-drv/./ch376.c:49: return USB_ERR_DISK_READ;
ld l,0x1d ld l,0x1d
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00111: l_ch_get_status_00111:
;source-doc/base-drv/./ch376.c:60: if (ch_status == CH_USB_INT_DISK_WRITE)
;source-doc/base-drv/./ch376.c:51: if (ch_status == CH_USB_INT_DISK_WRITE)
ld a, l ld a, l
sub 0x1e sub 0x1e
jr NZ,l_ch_get_status_00113 jr NZ,l_ch_get_status_00113
;source-doc/base-drv/./ch376.c:61: return USB_ERR_DISK_WRITE;
;source-doc/base-drv/./ch376.c:52: return USB_ERR_DISK_WRITE;
ld l,0x1e ld l,0x1e
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00113: l_ch_get_status_00113:
;source-doc/base-drv/./ch376.c:63: if (ch_status == CH_USB_INT_DISCONNECT) {
;source-doc/base-drv/./ch376.c:54: if (ch_status == CH_USB_INT_DISCONNECT) {
ld a, l ld a, l
sub 0x16 sub 0x16
jr NZ,l_ch_get_status_00115 jr NZ,l_ch_get_status_00115
;source-doc/base-drv/./ch376.c:64: ch_cmd_set_usb_mode(5);
;source-doc/base-drv/./ch376.c:55: ch_cmd_set_usb_mode(5);
ld l,0x05 ld l,0x05
call _ch_cmd_set_usb_mode call _ch_cmd_set_usb_mode
;source-doc/base-drv/./ch376.c:65: return USB_ERR_NO_DEVICE;
;source-doc/base-drv/./ch376.c:56: return USB_ERR_NO_DEVICE;
ld l,0x05 ld l,0x05
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00115: l_ch_get_status_00115:
;source-doc/base-drv/./ch376.c:68: if (ch_status == CH_USB_INT_BUF_OVER)
;source-doc/base-drv/./ch376.c:59: if (ch_status == CH_USB_INT_BUF_OVER)
ld a, l ld a, l
sub 0x17 sub 0x17
jr NZ,l_ch_get_status_00117 jr NZ,l_ch_get_status_00117
;source-doc/base-drv/./ch376.c:69: return USB_ERR_DATA_ERROR;
;source-doc/base-drv/./ch376.c:60: return USB_ERR_DATA_ERROR;
ld l,0x04 ld l,0x04
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00117: l_ch_get_status_00117:
;source-doc/base-drv/./ch376.c:71: ch_status &= 0x2F;
;source-doc/base-drv/./ch376.c:62: ch_status &= 0x2F;
ld a, l ld a, l
and 0x2f and 0x2f
;source-doc/base-drv/./ch376.c:73: if (ch_status == 0x2A)
;source-doc/base-drv/./ch376.c:64: if (ch_status == 0x2A)
cp 0x2a cp 0x2a
jr NZ,l_ch_get_status_00119 jr NZ,l_ch_get_status_00119
;source-doc/base-drv/./ch376.c:74: return USB_ERR_NAK;
;source-doc/base-drv/./ch376.c:65: return USB_ERR_NAK;
ld l,0x01 ld l,0x01
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00119: l_ch_get_status_00119:
;source-doc/base-drv/./ch376.c:76: if (ch_status == 0x2E)
;source-doc/base-drv/./ch376.c:67: if (ch_status == 0x2E)
cp 0x2e cp 0x2e
jr NZ,l_ch_get_status_00121 jr NZ,l_ch_get_status_00121
;source-doc/base-drv/./ch376.c:77: return USB_ERR_STALL;
;source-doc/base-drv/./ch376.c:68: return USB_ERR_STALL;
ld l,0x02 ld l,0x02
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00121: l_ch_get_status_00121:
;source-doc/base-drv/./ch376.c:79: ch_status &= 0x23;
;source-doc/base-drv/./ch376.c:70: ch_status &= 0x23;
and 0x23 and 0x23
;source-doc/base-drv/./ch376.c:81: if (ch_status == 0x20)
;source-doc/base-drv/./ch376.c:72: if (ch_status == 0x20)
cp 0x20 cp 0x20
jr NZ,l_ch_get_status_00123 jr NZ,l_ch_get_status_00123
;source-doc/base-drv/./ch376.c:82: return USB_ERR_TIMEOUT;
;source-doc/base-drv/./ch376.c:73: return USB_ERR_TIMEOUT;
ld l,0x03 ld l,0x03
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00123: l_ch_get_status_00123:
;source-doc/base-drv/./ch376.c:84: if (ch_status == 0x23)
;source-doc/base-drv/./ch376.c:75: if (ch_status == 0x23)
sub 0x23 sub 0x23
jr NZ,l_ch_get_status_00125 jr NZ,l_ch_get_status_00125
;source-doc/base-drv/./ch376.c:85: return USB_TOKEN_OUT_OF_SYNC;
;source-doc/base-drv/./ch376.c:76: return USB_TOKEN_OUT_OF_SYNC;
ld l,0x07 ld l,0x07
jr l_ch_get_status_00126 jr l_ch_get_status_00126
l_ch_get_status_00125: l_ch_get_status_00125:
;source-doc/base-drv/./ch376.c:87: return USB_ERR_UNEXPECTED_STATUS_FROM_;
;source-doc/base-drv/./ch376.c:78: return USB_ERR_UNEXPECTED_STATUS_FROM_;
ld l,0x08 ld l,0x08
l_ch_get_status_00126: l_ch_get_status_00126:
;source-doc/base-drv/./ch376.c:88: }
;source-doc/base-drv/./ch376.c:79: }
ret ret
;source-doc/base-drv/./ch376.c:90: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); }
;source-doc/base-drv/./ch376.c:81: void ch_cmd_reset_all(void) { ch_command(CH_CMD_RESET_ALL); }
; --------------------------------- ; ---------------------------------
; Function ch_cmd_reset_all ; Function ch_cmd_reset_all
; --------------------------------- ; ---------------------------------
_ch_cmd_reset_all: _ch_cmd_reset_all:
ld l,0x05 ld l,0x05
jp _ch_command jp _ch_command
;source-doc/base-drv/./ch376.c:109: uint8_t ch_probe(void) {
;source-doc/base-drv/./ch376.c:100: uint8_t ch_probe(void) {
; --------------------------------- ; ---------------------------------
; Function ch_probe ; Function ch_probe
; --------------------------------- ; ---------------------------------
_ch_probe: _ch_probe:
;source-doc/base-drv/./ch376.c:111: do {
;source-doc/base-drv/./ch376.c:102: do {
ld c,0x05 ld c,0x05
l_ch_probe_00103: l_ch_probe_00103:
;source-doc/base-drv/./ch376.c:94: ch_command(CH_CMD_CHECK_EXIST);
;source-doc/base-drv/./ch376.c:85: ch_command(CH_CMD_CHECK_EXIST);
push bc push bc
ld l,0x06 ld l,0x06
call _ch_command call _ch_command
pop bc pop bc
;source-doc/base-drv/./ch376.c:95: CH376_DATA_PORT = (uint8_t)~0x55;
;source-doc/base-drv/./ch376.c:86: CH376_DATA_PORT = (uint8_t)~0x55;
ld a,0xaa ld a,0xaa
push bc push bc
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
call _delay call _delay
pop bc pop bc
;source-doc/base-drv/./ch376.c:97: complement = CH376_DATA_PORT;
;source-doc/base-drv/./ch376.c:88: complement = CH376_DATA_PORT;
ld a, +((_CH376_DATA_PORT) / 256) ld a, +((_CH376_DATA_PORT) / 256)
in a, (((_CH376_DATA_PORT) & 0xFF)) in a, (((_CH376_DATA_PORT) & 0xFF))
;source-doc/base-drv/./ch376.c:98: return complement == 0x55;
;source-doc/base-drv/./ch376.c:89: return complement == 0x55;
sub 0x55 sub 0x55
jr NZ,l_ch_probe_00102 jr NZ,l_ch_probe_00102
;source-doc/base-drv/./ch376.c:112: if (ch_cmd_check_exist())
;source-doc/base-drv/./ch376.c:113: return true;
;source-doc/base-drv/./ch376.c:103: if (ch_cmd_check_exist())
;source-doc/base-drv/./ch376.c:104: return true;
ld l,0x01 ld l,0x01
jr l_ch_probe_00107 jr l_ch_probe_00107
l_ch_probe_00102: l_ch_probe_00102:
;source-doc/base-drv/./ch376.c:115: delay_medium();
;source-doc/base-drv/./ch376.c:106: delay_medium();
push bc push bc
call _delay_medium call _delay_medium
pop bc pop bc
;source-doc/base-drv/./ch376.c:116: } while (--i != 0);
;source-doc/base-drv/./ch376.c:107: } while (--i != 0);
dec c dec c
jr NZ,l_ch_probe_00103 jr NZ,l_ch_probe_00103
;source-doc/base-drv/./ch376.c:118: return false;
;source-doc/base-drv/./ch376.c:109: return false;
ld l,0x00 ld l,0x00
l_ch_probe_00107: l_ch_probe_00107:
;source-doc/base-drv/./ch376.c:119: }
;source-doc/base-drv/./ch376.c:110: }
ret ret
;source-doc/base-drv/./ch376.c:121: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall {
;source-doc/base-drv/./ch376.c:112: uint8_t ch_cmd_set_usb_mode(const uint8_t mode) __z88dk_fastcall {
; --------------------------------- ; ---------------------------------
; Function ch_cmd_set_usb_mode ; Function ch_cmd_set_usb_mode
; --------------------------------- ; ---------------------------------
_ch_cmd_set_usb_mode: _ch_cmd_set_usb_mode:
ld c, l ld c, l
;source-doc/base-drv/./ch376.c:122: uint8_t result = 0;
;source-doc/base-drv/./ch376.c:113: uint8_t result = 0;
ld b,0x00 ld b,0x00
;source-doc/base-drv/./ch376.c:124: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE;
;source-doc/base-drv/./ch376.c:115: CH376_COMMAND_PORT = CH_CMD_SET_USB_MODE;
ld a,0x15 ld a,0x15
push bc push bc
ld bc,_CH376_COMMAND_PORT ld bc,_CH376_COMMAND_PORT
out (c),a out (c),a
call _delay call _delay
pop bc pop bc
;source-doc/base-drv/./ch376.c:126: CH376_DATA_PORT = mode;
;source-doc/base-drv/./ch376.c:117: CH376_DATA_PORT = mode;
ld a, c ld a, c
push bc push bc
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
call _delay call _delay
pop bc pop bc
;source-doc/base-drv/./ch376.c:131: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) {
;source-doc/base-drv/./ch376.c:122: while (result != CH_CMD_RET_SUCCESS && result != CH_CMD_RET_ABORT && --count != 0) {
ld c,0x7f ld c,0x7f
l_ch_cmd_set_usb_mode_00103: l_ch_cmd_set_usb_mode_00103:
ld a, b ld a, b
@ -324,17 +300,17 @@ l_ch_cmd_set_usb_mode_00147:
jr Z,l_ch_cmd_set_usb_mode_00105 jr Z,l_ch_cmd_set_usb_mode_00105
dec c dec c
jr Z,l_ch_cmd_set_usb_mode_00105 jr Z,l_ch_cmd_set_usb_mode_00105
;source-doc/base-drv/./ch376.c:132: result = CH376_DATA_PORT;
;source-doc/base-drv/./ch376.c:123: result = CH376_DATA_PORT;
ld a, +((_CH376_DATA_PORT) / 256) ld a, +((_CH376_DATA_PORT) / 256)
in a, (((_CH376_DATA_PORT) & 0xFF)) in a, (((_CH376_DATA_PORT) & 0xFF))
ld b, a ld b, a
;source-doc/base-drv/./ch376.c:133: delay();
;source-doc/base-drv/./ch376.c:124: delay();
push bc push bc
call _delay call _delay
pop bc pop bc
jr l_ch_cmd_set_usb_mode_00103 jr l_ch_cmd_set_usb_mode_00103
l_ch_cmd_set_usb_mode_00105: l_ch_cmd_set_usb_mode_00105:
;source-doc/base-drv/./ch376.c:136: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL;
;source-doc/base-drv/./ch376.c:127: return (result == CH_CMD_RET_SUCCESS) ? USB_ERR_OK : USB_ERR_FAIL;
ld a, e ld a, e
or a or a
jr Z,l_ch_cmd_set_usb_mode_00108 jr Z,l_ch_cmd_set_usb_mode_00108
@ -343,24 +319,24 @@ l_ch_cmd_set_usb_mode_00105:
l_ch_cmd_set_usb_mode_00108: l_ch_cmd_set_usb_mode_00108:
ld l,0x0e ld l,0x0e
l_ch_cmd_set_usb_mode_00109: l_ch_cmd_set_usb_mode_00109:
;source-doc/base-drv/./ch376.c:137: }
;source-doc/base-drv/./ch376.c:128: }
ret ret
;source-doc/base-drv/./ch376.c:139: uint8_t ch_cmd_get_ic_version(void) {
;source-doc/base-drv/./ch376.c:130: uint8_t ch_cmd_get_ic_version(void) {
; --------------------------------- ; ---------------------------------
; Function ch_cmd_get_ic_version ; Function ch_cmd_get_ic_version
; --------------------------------- ; ---------------------------------
_ch_cmd_get_ic_version: _ch_cmd_get_ic_version:
;source-doc/base-drv/./ch376.c:140: ch_command(CH_CMD_GET_IC_VER);
;source-doc/base-drv/./ch376.c:131: ch_command(CH_CMD_GET_IC_VER);
ld l,0x01 ld l,0x01
call _ch_command call _ch_command
;source-doc/base-drv/./ch376.c:141: return CH376_DATA_PORT & 0x1f;
;source-doc/base-drv/./ch376.c:132: return CH376_DATA_PORT & 0x1f;
ld a, +((_CH376_DATA_PORT) / 256) ld a, +((_CH376_DATA_PORT) / 256)
in a, (((_CH376_DATA_PORT) & 0xFF)) in a, (((_CH376_DATA_PORT) & 0xFF))
and 0x1f and 0x1f
ld l, a ld l, a
;source-doc/base-drv/./ch376.c:142: }
;source-doc/base-drv/./ch376.c:133: }
ret ret
;source-doc/base-drv/./ch376.c:144: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) {
;source-doc/base-drv/./ch376.c:135: void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) {
; --------------------------------- ; ---------------------------------
; Function ch_issue_token ; Function ch_issue_token
; --------------------------------- ; ---------------------------------
@ -368,22 +344,14 @@ _ch_issue_token:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./ch376.c:145: ch_command(CH_CMD_ISSUE_TKN_X);
;source-doc/base-drv/./ch376.c:136: ch_command(CH_CMD_ISSUE_TKN_X);
ld l,0x4e ld l,0x4e
call _ch_command call _ch_command
;source-doc/base-drv/./ch376.c:146: delay();
call _delay
;source-doc/base-drv/./ch376.c:147: delay();
call _delay
;source-doc/base-drv/./ch376.c:148: CH376_DATA_PORT = toggle_bit;
;source-doc/base-drv/./ch376.c:137: CH376_DATA_PORT = toggle_bit;
ld a,(ix+4) ld a,(ix+4)
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:149: delay();
call _delay
;source-doc/base-drv/./ch376.c:150: delay();
call _delay
;source-doc/base-drv/./ch376.c:151: CH376_DATA_PORT = endpoint << 4 | pid;
;source-doc/base-drv/./ch376.c:138: CH376_DATA_PORT = endpoint << 4 | pid;
ld a,(ix+5) ld a,(ix+5)
add a, a add a, a
add a, a add a, a
@ -392,19 +360,16 @@ _ch_issue_token:
or (ix+6) or (ix+6)
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:152: delay();
call _delay
;source-doc/base-drv/./ch376.c:153: delay();
;source-doc/base-drv/./ch376.c:154: }
;source-doc/base-drv/./ch376.c:139: }
pop ix pop ix
jp _delay
;source-doc/base-drv/./ch376.c:156: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall {
ret
;source-doc/base-drv/./ch376.c:141: void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall {
; --------------------------------- ; ---------------------------------
; Function ch_issue_token_in ; Function ch_issue_token_in
; --------------------------------- ; ---------------------------------
_ch_issue_token_in: _ch_issue_token_in:
ex de, hl ex de, hl
;source-doc/base-drv/./ch376.c:157: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN);
;source-doc/base-drv/./ch376.c:142: ch_issue_token(endpoint->toggle ? 0x80 : 0x00, endpoint->number, CH_PID_IN);
ld l, e ld l, e
ld h, d ld h, d
ld a, (hl) ld a, (hl)
@ -430,15 +395,15 @@ l_ch_issue_token_in_00104:
call _ch_issue_token call _ch_issue_token
pop af pop af
inc sp inc sp
;source-doc/base-drv/./ch376.c:158: }
;source-doc/base-drv/./ch376.c:143: }
ret ret
;source-doc/base-drv/./ch376.c:160: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall {
;source-doc/base-drv/./ch376.c:145: void ch_issue_token_out(const endpoint_param *const endpoint) __z88dk_fastcall {
; --------------------------------- ; ---------------------------------
; Function ch_issue_token_out ; Function ch_issue_token_out
; --------------------------------- ; ---------------------------------
_ch_issue_token_out: _ch_issue_token_out:
ex de, hl ex de, hl
;source-doc/base-drv/./ch376.c:161: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT);
;source-doc/base-drv/./ch376.c:146: ch_issue_token(endpoint->toggle ? 0x40 : 0x00, endpoint->number, CH_PID_OUT);
ld l, e ld l, e
ld h, d ld h, d
ld a, (hl) ld a, (hl)
@ -464,9 +429,9 @@ l_ch_issue_token_out_00104:
call _ch_issue_token call _ch_issue_token
pop af pop af
inc sp inc sp
;source-doc/base-drv/./ch376.c:162: }
;source-doc/base-drv/./ch376.c:147: }
ret ret
;source-doc/base-drv/./ch376.c:164: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); }
;source-doc/base-drv/./ch376.c:149: void ch_issue_token_out_ep0(void) { ch_issue_token(0x40, 0, CH_PID_OUT); }
; --------------------------------- ; ---------------------------------
; Function ch_issue_token_out_ep0 ; Function ch_issue_token_out_ep0
; --------------------------------- ; ---------------------------------
@ -482,7 +447,7 @@ _ch_issue_token_out_ep0:
pop af pop af
inc sp inc sp
ret ret
;source-doc/base-drv/./ch376.c:166: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); }
;source-doc/base-drv/./ch376.c:151: void ch_issue_token_in_ep0(void) { ch_issue_token(0x80, 0, CH_PID_IN); }
; --------------------------------- ; ---------------------------------
; Function ch_issue_token_in_ep0 ; Function ch_issue_token_in_ep0
; --------------------------------- ; ---------------------------------
@ -498,7 +463,7 @@ _ch_issue_token_in_ep0:
pop af pop af
inc sp inc sp
ret ret
;source-doc/base-drv/./ch376.c:168: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); }
;source-doc/base-drv/./ch376.c:153: void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); }
; --------------------------------- ; ---------------------------------
; Function ch_issue_token_setup ; Function ch_issue_token_setup
; --------------------------------- ; ---------------------------------
@ -516,7 +481,7 @@ _ch_issue_token_setup:
pop af pop af
inc sp inc sp
ret ret
;source-doc/base-drv/./ch376.c:170: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) {
;source-doc/base-drv/./ch376.c:155: usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function ch_data_in_transfer ; Function ch_data_in_transfer
; --------------------------------- ; ---------------------------------
@ -525,38 +490,39 @@ _ch_data_in_transfer:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/base-drv/./ch376.c:174: if (buffer_size == 0)
;source-doc/base-drv/./ch376.c:158: if (buffer_size == 0)
ld a,(ix+7) ld a,(ix+7)
or (ix+6) or (ix+6)
jr NZ,l_ch_data_in_transfer_00102 jr NZ,l_ch_data_in_transfer_00102
;source-doc/base-drv/./ch376.c:175: return USB_ERR_OK;
;source-doc/base-drv/./ch376.c:159: return USB_ERR_OK;
ld l,0x00 ld l,0x00
jp l_ch_data_in_transfer_00110
jp l_ch_data_in_transfer_00111
l_ch_data_in_transfer_00102: l_ch_data_in_transfer_00102:
;source-doc/base-drv/./ch376.c:177: USB_MODULE_LEDS = 0x01;
;source-doc/base-drv/./ch376.c:161: USB_MODULE_LEDS = 0x01;
ld a,0x01 ld a,0x01
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:178: do {
;source-doc/base-drv/./ch376.c:162: do {
ld c,(ix+8) ld c,(ix+8)
ld b,(ix+9) ld b,(ix+9)
inc sp inc sp
inc sp inc sp
push bc push bc
l_ch_data_in_transfer_00107: l_ch_data_in_transfer_00107:
;source-doc/base-drv/./ch376.c:179: ch_issue_token_in(endpoint);
;source-doc/base-drv/./ch376.c:163: ch_issue_token_in(endpoint);
push bc push bc
ld l, c ld l, c
ld h, b ld h, b
call _ch_issue_token_in call _ch_issue_token_in
call _ch_long_wait_int_and_get_statu call _ch_long_wait_int_and_get_statu
ld a, l
pop bc pop bc
ld l, a
;source-doc/base-drv/./ch376.c:182: CHECK(result);
ld a, l
ld (_result), a
;source-doc/base-drv/./ch376.c:166: CHECK(result);
ld a,(_result)
or a or a
jr NZ,l_ch_data_in_transfer_00110 jr NZ,l_ch_data_in_transfer_00110
;source-doc/base-drv/./ch376.c:184: endpoint->toggle = !endpoint->toggle;
;source-doc/base-drv/./ch376.c:168: endpoint->toggle = !endpoint->toggle;
ld e, c ld e, c
ld d, b ld d, b
pop hl pop hl
@ -570,32 +536,32 @@ l_ch_data_in_transfer_00107:
and 0xfe and 0xfe
or l or l
ld (de), a ld (de), a
;source-doc/base-drv/./ch376.c:186: count = ch_read_data(buffer);
;source-doc/base-drv/./ch376.c:170: count = ch_read_data(buffer);
push bc push bc
ld l,(ix+4) ld l,(ix+4)
ld h,(ix+5) ld h,(ix+5)
call _ch_read_data call _ch_read_data
ld e, a ld e, a
pop bc pop bc
;source-doc/base-drv/./ch376.c:188: if (count == 0) {
;source-doc/base-drv/./ch376.c:172: if (count == 0) {
ld a, e ld a, e
;source-doc/base-drv/./ch376.c:189: USB_MODULE_LEDS = 0x00;
;source-doc/base-drv/./ch376.c:173: USB_MODULE_LEDS = 0x00;
or a or a
jr NZ,l_ch_data_in_transfer_00106 jr NZ,l_ch_data_in_transfer_00106
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:190: return USB_ERR_DATA_ERROR;
;source-doc/base-drv/./ch376.c:174: return USB_ERR_DATA_ERROR;
ld l,0x04 ld l,0x04
jr l_ch_data_in_transfer_00110
jr l_ch_data_in_transfer_00111
l_ch_data_in_transfer_00106: l_ch_data_in_transfer_00106:
;source-doc/base-drv/./ch376.c:193: buffer += count;
;source-doc/base-drv/./ch376.c:177: buffer += count;
ld a,(ix+4) ld a,(ix+4)
add a, e add a, e
ld (ix+4),a ld (ix+4),a
jr NC,l_ch_data_in_transfer_00147
jr NC,l_ch_data_in_transfer_00148
inc (ix+5) inc (ix+5)
l_ch_data_in_transfer_00147:
;source-doc/base-drv/./ch376.c:194: buffer_size -= count;
l_ch_data_in_transfer_00148:
;source-doc/base-drv/./ch376.c:178: buffer_size -= count;
ld d,0x00 ld d,0x00
ld a,(ix+6) ld a,(ix+6)
sub e sub e
@ -603,26 +569,32 @@ l_ch_data_in_transfer_00147:
ld a,(ix+7) ld a,(ix+7)
sbc a, d sbc a, d
ld (ix+7),a ld (ix+7),a
;source-doc/base-drv/./ch376.c:195: } while (buffer_size > 0);
;source-doc/base-drv/./ch376.c:179: } while (buffer_size > 0);
xor a xor a
cp (ix+6) cp (ix+6)
sbc a,(ix+7) sbc a,(ix+7)
jp PO, l_ch_data_in_transfer_00148
jp PO, l_ch_data_in_transfer_00149
xor 0x80 xor 0x80
l_ch_data_in_transfer_00148:
l_ch_data_in_transfer_00149:
jp M, l_ch_data_in_transfer_00107 jp M, l_ch_data_in_transfer_00107
;source-doc/base-drv/./ch376.c:197: USB_MODULE_LEDS = 0x00;
;source-doc/base-drv/./ch376.c:181: USB_MODULE_LEDS = 0x00;
ld a,0x00 ld a,0x00
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:199: return USB_ERR_OK;
;source-doc/base-drv/./ch376.c:183: return USB_ERR_OK;
ld l,0x00 ld l,0x00
jr l_ch_data_in_transfer_00111
;source-doc/base-drv/./ch376.c:184: done:
l_ch_data_in_transfer_00110: l_ch_data_in_transfer_00110:
;source-doc/base-drv/./ch376.c:200: }
;source-doc/base-drv/./ch376.c:185: return result;
ld hl,_result
ld l, (hl)
l_ch_data_in_transfer_00111:
;source-doc/base-drv/./ch376.c:186: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./ch376.c:202: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) {
;source-doc/base-drv/./ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function ch_data_in_transfer_n ; Function ch_data_in_transfer_n
; --------------------------------- ; ---------------------------------
@ -630,20 +602,21 @@ _ch_data_in_transfer_n:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./ch376.c:206: USB_MODULE_LEDS = 0x01;
;source-doc/base-drv/./ch376.c:192: USB_MODULE_LEDS = 0x01;
ld a,0x01 ld a,0x01
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:208: ch_issue_token_in(endpoint);
;source-doc/base-drv/./ch376.c:194: ch_issue_token_in(endpoint);
ld l,(ix+8) ld l,(ix+8)
ld h,(ix+9) ld h,(ix+9)
call _ch_issue_token_in call _ch_issue_token_in
;source-doc/base-drv/./ch376.c:210: CHECK(ch_long_wait_int_and_get_status());
;source-doc/base-drv/./ch376.c:196: CHECK(ch_long_wait_int_and_get_status());
call _ch_long_wait_int_and_get_statu call _ch_long_wait_int_and_get_statu
ld a, l ld a, l
ld b,a
or a or a
jr NZ,l_ch_data_in_transfer_n_00103 jr NZ,l_ch_data_in_transfer_n_00103
;source-doc/base-drv/./ch376.c:212: endpoint->toggle = !endpoint->toggle;
;source-doc/base-drv/./ch376.c:198: endpoint->toggle = !endpoint->toggle;
ld e,(ix+8) ld e,(ix+8)
ld d,(ix+9) ld d,(ix+9)
ld c, e ld c, e
@ -658,25 +631,30 @@ _ch_data_in_transfer_n:
and 0xfe and 0xfe
or e or e
ld (bc), a ld (bc), a
;source-doc/base-drv/./ch376.c:214: count = ch_read_data(buffer);
;source-doc/base-drv/./ch376.c:200: count = ch_read_data(buffer);
ld l,(ix+4) ld l,(ix+4)
ld h,(ix+5) ld h,(ix+5)
call _ch_read_data call _ch_read_data
;source-doc/base-drv/./ch376.c:216: *buffer_size = count;
;source-doc/base-drv/./ch376.c:202: *buffer_size = count;
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
ld (bc), a ld (bc), a
;source-doc/base-drv/./ch376.c:218: USB_MODULE_LEDS = 0x00;
;source-doc/base-drv/./ch376.c:204: USB_MODULE_LEDS = 0x00;
ld a,0x00 ld a,0x00
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:220: return USB_ERR_OK;
;source-doc/base-drv/./ch376.c:206: return USB_ERR_OK;
ld l,0x00 ld l,0x00
jr l_ch_data_in_transfer_n_00104
;source-doc/base-drv/./ch376.c:207: done:
l_ch_data_in_transfer_n_00103: l_ch_data_in_transfer_n_00103:
;source-doc/base-drv/./ch376.c:221: }
;source-doc/base-drv/./ch376.c:208: return result;
ld l, b
l_ch_data_in_transfer_n_00104:
;source-doc/base-drv/./ch376.c:209: }
pop ix pop ix
ret ret
;source-doc/base-drv/./ch376.c:223: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) {
;source-doc/base-drv/./ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function ch_data_out_transfer ; Function ch_data_out_transfer
; --------------------------------- ; ---------------------------------
@ -686,7 +664,7 @@ _ch_data_out_transfer:
add ix,sp add ix,sp
push af push af
dec sp dec sp
;source-doc/base-drv/./ch376.c:226: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex);
;source-doc/base-drv/./ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex);
ld c,(ix+8) ld c,(ix+8)
ld b,(ix+9) ld b,(ix+9)
ld e, c ld e, c
@ -694,44 +672,42 @@ _ch_data_out_transfer:
inc de inc de
ld a, (de) ld a, (de)
ld (ix-3),a ld (ix-3),a
;source-doc/base-drv/./ch376.c:228: USB_MODULE_LEDS = 0x02;
;source-doc/base-drv/./ch376.c:216: USB_MODULE_LEDS = 0x02;
ld a,0x02 ld a,0x02
push bc push bc
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
pop bc pop bc
;source-doc/base-drv/./ch376.c:230: while (buffer_length > 0) {
;source-doc/base-drv/./ch376.c:218: while (buffer_length > 0) {
ld (ix-2),c ld (ix-2),c
ld (ix-1),b ld (ix-1),b
l_ch_data_out_transfer_00103: l_ch_data_out_transfer_00103:
xor a xor a
cp (ix+6) cp (ix+6)
sbc a,(ix+7) sbc a,(ix+7)
jp PO, l_ch_data_out_transfer_00138
jp PO, l_ch_data_out_transfer_00139
xor 0x80 xor 0x80
l_ch_data_out_transfer_00138:
l_ch_data_out_transfer_00139:
jp P, l_ch_data_out_transfer_00105 jp P, l_ch_data_out_transfer_00105
;source-doc/base-drv/./ch376.c:231: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length;
ld e,(ix-3)
ld d,0x00
ld a, e
sub (ix+6)
;source-doc/base-drv/./ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length;
ld d,(ix-3)
ld e,0x00
ld a, d ld a, d
sub (ix+6)
ld a, e
sbc a,(ix+7) sbc a,(ix+7)
jp PO, l_ch_data_out_transfer_00139
jp PO, l_ch_data_out_transfer_00140
xor 0x80 xor 0x80
l_ch_data_out_transfer_00139:
jp P, l_ch_data_out_transfer_00108
jr l_ch_data_out_transfer_00109
l_ch_data_out_transfer_00108:
ld e,(ix+6)
ld d,(ix+7)
l_ch_data_out_transfer_00140:
jp P, l_ch_data_out_transfer_00109
jr l_ch_data_out_transfer_00110
l_ch_data_out_transfer_00109: l_ch_data_out_transfer_00109:
;source-doc/base-drv/./ch376.c:232: buffer = ch_write_data(buffer, size);
ld d,(ix+6)
l_ch_data_out_transfer_00110:
;source-doc/base-drv/./ch376.c:220: buffer = ch_write_data(buffer, size);
push bc push bc
push de push de
ld a, e
push af
push de
inc sp inc sp
ld l,(ix+4) ld l,(ix+4)
ld h,(ix+5) ld h,(ix+5)
@ -743,15 +719,15 @@ l_ch_data_out_transfer_00109:
pop bc pop bc
ld (ix+4),l ld (ix+4),l
ld (ix+5),h ld (ix+5),h
;source-doc/base-drv/./ch376.c:233: buffer_length -= size;
ld d,0x00
;source-doc/base-drv/./ch376.c:221: buffer_length -= size;
ld e,0x00
ld a,(ix+6) ld a,(ix+6)
sub e
sub d
ld (ix+6),a ld (ix+6),a
ld a,(ix+7) ld a,(ix+7)
sbc a, d
sbc a, e
ld (ix+7),a ld (ix+7),a
;source-doc/base-drv/./ch376.c:234: ch_issue_token_out(endpoint);
;source-doc/base-drv/./ch376.c:222: ch_issue_token_out(endpoint);
push bc push bc
ld l, c ld l, c
ld h, b ld h, b
@ -762,7 +738,7 @@ l_ch_data_out_transfer_00109:
ld l, a ld l, a
or a or a
jr NZ,l_ch_data_out_transfer_00106 jr NZ,l_ch_data_out_transfer_00106
;source-doc/base-drv/./ch376.c:238: endpoint->toggle = !endpoint->toggle;
;source-doc/base-drv/./ch376.c:226: endpoint->toggle = !endpoint->toggle;
ld e, c ld e, c
ld d, b ld d, b
ld l,(ix-2) ld l,(ix-2)
@ -778,33 +754,34 @@ l_ch_data_out_transfer_00109:
ld (de), a ld (de), a
jr l_ch_data_out_transfer_00103 jr l_ch_data_out_transfer_00103
l_ch_data_out_transfer_00105: l_ch_data_out_transfer_00105:
;source-doc/base-drv/./ch376.c:241: USB_MODULE_LEDS = 0x00;
;source-doc/base-drv/./ch376.c:229: USB_MODULE_LEDS = 0x00;
ld a,0x00 ld a,0x00
ld bc,_USB_MODULE_LEDS ld bc,_USB_MODULE_LEDS
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:243: return USB_ERR_OK;
;source-doc/base-drv/./ch376.c:231: return USB_ERR_OK;
ld l,0x00 ld l,0x00
;source-doc/base-drv/./ch376.c:232: done:
;source-doc/base-drv/./ch376.c:233: return result;
l_ch_data_out_transfer_00106: l_ch_data_out_transfer_00106:
;source-doc/base-drv/./ch376.c:244: }
;source-doc/base-drv/./ch376.c:234: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./ch376.c:246: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall {
;source-doc/base-drv/./ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall {
; --------------------------------- ; ---------------------------------
; Function ch_set_usb_address ; Function ch_set_usb_address
; --------------------------------- ; ---------------------------------
_ch_set_usb_address: _ch_set_usb_address:
;source-doc/base-drv/./ch376.c:247: ch_command(CH_CMD_SET_USB_ADDR);
;source-doc/base-drv/./ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR);
push hl push hl
ld l,0x13 ld l,0x13
call _ch_command call _ch_command
pop hl pop hl
;source-doc/base-drv/./ch376.c:248: CH376_DATA_PORT = device_address;
;source-doc/base-drv/./ch376.c:238: CH376_DATA_PORT = device_address;
ld a, l ld a, l
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/base-drv/./ch376.c:249: delay();
;source-doc/base-drv/./ch376.c:250: }
jp _delay
;source-doc/base-drv/./ch376.c:239: }
ret
_result: _result:
DEFB +0x00 DEFB +0x00

254
Source/HBIOS/ch376-native/base-drv/class_hid.c.s

@ -1,254 +0,0 @@
;
; Generated from source-doc/base-drv/./class_hid.c.asm -- not to be modify directly
;
;
;--------------------------------------------------------
; File Created by SDCC : free open source ISO C Compiler
; Version 4.4.0 #14648 (Linux)
;--------------------------------------------------------
; Processed by Z88DK
;--------------------------------------------------------
;--------------------------------------------------------
; Public variables in this module
;--------------------------------------------------------
;--------------------------------------------------------
; Externals used
;--------------------------------------------------------
;--------------------------------------------------------
; special function registers
;--------------------------------------------------------
_CH376_DATA_PORT .EQU 0xff88
_CH376_COMMAND_PORT .EQU 0xff89
_USB_MODULE_LEDS .EQU 0xff8a
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
#IF 0
; .area _INITIALIZED removed by z88dk
#ENDIF
;--------------------------------------------------------
; absolute external ram data
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
;--------------------------------------------------------
; Home
;--------------------------------------------------------
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/base-drv/./class_hid.c:6: usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) {
; ---------------------------------
; Function hid_set_protocol
; ---------------------------------
_hid_set_protocol:
push ix
ld ix,0
add ix,sp
push af
push af
push af
push af
ex de, hl
;source-doc/base-drv/./class_hid.c:9: cmd = cmd_hid_set;
push de
ex de, hl
ld hl,2
add hl, sp
ex de, hl
ld hl,_cmd_hid_set
ld bc,0x0008
ldir
pop de
;source-doc/base-drv/./class_hid.c:11: cmd.bRequest = HID_SET_PROTOCOL;
ld (ix-7),0x0b
;source-doc/base-drv/./class_hid.c:12: cmd.bValue[0] = protocol;
ld a,(ix+4)
ld (ix-6),a
;source-doc/base-drv/./class_hid.c:14: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
ld l, e
ld h, d
inc hl
ld c, (hl)
ex de, hl
ld a, (hl)
rlca
rlca
rlca
rlca
and 0x0f
ld h, c
push hl
inc sp
push af
inc sp
ld hl,0x0000
push hl
ld hl,4
add hl, sp
push hl
call _usb_control_transfer
pop af
pop af
pop af
ld a, l
;source-doc/base-drv/./class_hid.c:16: RETURN_CHECK(result);
;source-doc/base-drv/./class_hid.c:17: }
ld sp, ix
pop ix
pop hl
inc sp
jp (hl)
_cmd_hid_set:
DEFB +0x21
DEFB +0x0b
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFW +0x0000
;source-doc/base-drv/./class_hid.c:19: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) {
; ---------------------------------
; Function hid_set_idle
; ---------------------------------
_hid_set_idle:
push ix
ld ix,0
add ix,sp
push af
push af
push af
push af
ex de, hl
;source-doc/base-drv/./class_hid.c:22: cmd = cmd_hid_set;
push de
ex de, hl
ld hl,2
add hl, sp
ex de, hl
ld hl,_cmd_hid_set
ld bc,0x0008
ldir
pop de
;source-doc/base-drv/./class_hid.c:24: cmd.bRequest = HID_SET_IDLE;
ld (ix-7),0x0a
;source-doc/base-drv/./class_hid.c:25: cmd.bValue[0] = duration;
ld a,(ix+4)
ld (ix-6),a
;source-doc/base-drv/./class_hid.c:27: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
ld l, e
ld h, d
inc hl
ld c, (hl)
ex de, hl
ld a, (hl)
rlca
rlca
rlca
rlca
and 0x0f
ld h, c
push hl
inc sp
push af
inc sp
ld hl,0x0000
push hl
ld hl,4
add hl, sp
push hl
call _usb_control_transfer
pop af
pop af
pop af
ld a, l
;source-doc/base-drv/./class_hid.c:29: RETURN_CHECK(result);
;source-doc/base-drv/./class_hid.c:30: }
ld sp, ix
pop ix
pop hl
inc sp
jp (hl)
;source-doc/base-drv/./class_hid.c:32: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) {
; ---------------------------------
; Function hid_get_input_report
; ---------------------------------
_hid_get_input_report:
push ix
ld ix,0
add ix,sp
ld c, l
ld b, h
ld hl, -9
add hl, sp
ld sp, hl
ld l, c
ld h, b
;source-doc/base-drv/./class_hid.c:35: cmd = cmd_hid_set;
push de
push hl
ex de, hl
ld hl,4
add hl, sp
ex de, hl
ld hl,_cmd_hid_set
ld bc,0x0008
ldir
pop bc
pop de
;source-doc/base-drv/./class_hid.c:37: cmd.bmRequestType = 0xA1;
ld (ix-9),0xa1
;source-doc/base-drv/./class_hid.c:38: cmd.bValue[0] = 1;
ld (ix-7),0x01
;source-doc/base-drv/./class_hid.c:39: cmd.bValue[1] = 1;
ld (ix-6),0x01
;source-doc/base-drv/./class_hid.c:40: cmd.bRequest = HID_GET_REPORT;
ld (ix-8),0x01
;source-doc/base-drv/./class_hid.c:41: cmd.wLength = 8;
ld (ix-3),0x08
xor a
ld (ix-2),a
;source-doc/base-drv/./class_hid.c:43: result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size);
ld l, c
ld h, b
inc hl
ld a, (hl)
ld (ix-1),a
ld l, c
ld h, b
ld a, (hl)
rlca
rlca
rlca
rlca
and 0x0f
ld h,(ix-1)
push hl
inc sp
push af
inc sp
push de
ld hl,4
add hl, sp
push hl
call _usb_control_transfer
pop af
pop af
pop af
ld a, l
;source-doc/base-drv/./class_hid.c:45: RETURN_CHECK(result);
;source-doc/base-drv/./class_hid.c:46: }
ld sp, ix
pop ix
ret

55
Source/HBIOS/ch376-native/base-drv/print.c.s → Source/HBIOS/ch376-native/base-drv/critical-section.c.s

@ -1,5 +1,5 @@
; ;
; Generated from source-doc/base-drv/./print.c.asm -- not to be modify directly
; Generated from source-doc/base-drv/./critical-section.c.asm -- not to be modify directly
; ;
; ;
;-------------------------------------------------------- ;--------------------------------------------------------
@ -30,6 +30,8 @@
; .area _INITIALIZED removed by z88dk ; .area _INITIALIZED removed by z88dk
_in_critical_usb_section:
DEFS 1
#ENDIF #ENDIF
@ -45,42 +47,21 @@
;-------------------------------------------------------- ;--------------------------------------------------------
; code ; code
;-------------------------------------------------------- ;--------------------------------------------------------
;source-doc/base-drv/./print.c:3: void print_device_mounted(const char *const description, const uint8_t count) {
;source-doc/base-drv/./critical-section.c:6: void critical_begin() { in_critical_usb_section++; }
; --------------------------------- ; ---------------------------------
; Function print_device_mounted
; Function critical_begin
; --------------------------------- ; ---------------------------------
_print_device_mounted:
push ix
ld ix,0
add ix,sp
;source-doc/base-drv/./print.c:4: print_string("\r\n $");
ld hl,print_str_0
call _print_string
;source-doc/base-drv/./print.c:5: print_uint16(count);
ld e,(ix+6)
ld d,0x00
ex de, hl
call _print_uint16
;source-doc/base-drv/./print.c:6: print_string(description);
ld l,(ix+4)
ld h,(ix+5)
call _print_string
;source-doc/base-drv/./print.c:7: if (count > 1)
ld a,0x01
sub (ix+6)
jr NC,l_print_device_mounted_00103
;source-doc/base-drv/./print.c:8: print_string("S$");
ld hl,print_str_1
call _print_string
l_print_device_mounted_00103:
;source-doc/base-drv/./print.c:9: }
pop ix
_critical_begin:
ld hl,_in_critical_usb_section
inc (hl)
ret ret
print_str_0:
DEFB 0x0d
DEFB 0x0a
DEFM " $"
DEFB 0x00
print_str_1:
DEFM "S$"
DEFB 0x00
;source-doc/base-drv/./critical-section.c:8: void critical_end() { in_critical_usb_section--; }
; ---------------------------------
; Function critical_end
; ---------------------------------
_critical_end:
ld hl,_in_critical_usb_section
dec (hl)
ret
_in_critical_usb_section:
DEFB +0x00

285
Source/HBIOS/ch376-native/base-drv/dev_transfers.c.s

@ -48,7 +48,7 @@ _USB_MODULE_LEDS .EQU 0xff8a
;-------------------------------------------------------- ;--------------------------------------------------------
; code ; code
;-------------------------------------------------------- ;--------------------------------------------------------
;source-doc/base-drv/./dev_transfers.c:28: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) {
;source-doc/base-drv/./dev_transfers.c:31: usb_error usbdev_control_transfer(device_config *const device, const setup_packet *const cmd_packet, uint8_t *const buffer) {
; --------------------------------- ; ---------------------------------
; Function usbdev_control_transfer ; Function usbdev_control_transfer
; --------------------------------- ; ---------------------------------
@ -56,7 +56,7 @@ _usbdev_control_transfer:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./dev_transfers.c:29: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size);
;source-doc/base-drv/./dev_transfers.c:32: return usb_control_transfer(cmd_packet, buffer, device->address, device->max_packet_size);
ld e,(ix+4) ld e,(ix+4)
ld d,(ix+5) ld d,(ix+5)
ld l, e ld l, e
@ -84,10 +84,10 @@ _usbdev_control_transfer:
pop af pop af
pop af pop af
pop af pop af
;source-doc/base-drv/./dev_transfers.c:30: }
;source-doc/base-drv/./dev_transfers.c:33: }
pop ix pop ix
ret ret
;source-doc/base-drv/./dev_transfers.c:32: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) {
;source-doc/base-drv/./dev_transfers.c:35: usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) {
; --------------------------------- ; ---------------------------------
; Function usbdev_blk_out_trnsfer ; Function usbdev_blk_out_trnsfer
; --------------------------------- ; ---------------------------------
@ -96,22 +96,27 @@ _usbdev_blk_out_trnsfer:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/base-drv/./dev_transfers.c:36: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT];
ld c,(ix+4)
ld b,(ix+5)
ld hl,0x0003
add hl, bc
ex (sp), hl
;source-doc/base-drv/./dev_transfers.c:38: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint);
ld l, c
ld h, b
push af
;source-doc/base-drv/./dev_transfers.c:37: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT];
ld a,(ix+4)
ld (ix-4),a
ld a,(ix+5)
ld (ix-3),a
ld a,(ix-4)
add a,0x03
ld (ix-2),a
ld a,(ix-3)
adc a,0x00
ld (ix-1),a
;source-doc/base-drv/./dev_transfers.c:39: result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint);
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
rlca rlca
rlca rlca
and 0x0f and 0x0f
push bc
pop de pop de
pop hl pop hl
push hl push hl
@ -130,19 +135,19 @@ _usbdev_blk_out_trnsfer:
pop af pop af
pop af pop af
inc sp inc sp
ld d, l
pop bc
;source-doc/base-drv/./dev_transfers.c:40: if (result == USB_ERR_STALL) {
ld a, d
ld a, l
ld (_result), a
;source-doc/base-drv/./dev_transfers.c:41: if (result == USB_ERR_STALL) {
ld a,(_result)
sub 0x02 sub 0x02
jr NZ,l_usbdev_blk_out_trnsfer_00102 jr NZ,l_usbdev_blk_out_trnsfer_00102
;source-doc/base-drv/./dev_transfers.c:41: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size);
ld l, c
ld h, b
;source-doc/base-drv/./dev_transfers.c:42: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size);
pop hl
push hl
inc hl inc hl
ld d, (hl) ld d, (hl)
ld l, c
ld h, b
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
@ -150,8 +155,8 @@ _usbdev_blk_out_trnsfer:
rlca rlca
and 0x0f and 0x0f
ld b, a ld b, a
pop hl
push hl
ld l,(ix-2)
ld h,(ix-1)
ld a, (hl) ld a, (hl)
rrca rrca
and 0x07 and 0x07
@ -164,22 +169,26 @@ _usbdev_blk_out_trnsfer:
call _usbtrn_clear_endpoint_halt call _usbtrn_clear_endpoint_halt
pop af pop af
inc sp inc sp
;source-doc/base-drv/./dev_transfers.c:42: endpoint->toggle = 0;
;source-doc/base-drv/./dev_transfers.c:43: endpoint->toggle = 0;
pop de
pop hl pop hl
push hl push hl
push de
res 0, (hl) res 0, (hl)
;source-doc/base-drv/./dev_transfers.c:43: return USB_ERR_STALL;
;source-doc/base-drv/./dev_transfers.c:44: return USB_ERR_STALL;
ld l,0x02 ld l,0x02
jr l_usbdev_blk_out_trnsfer_00103
jr l_usbdev_blk_out_trnsfer_00104
l_usbdev_blk_out_trnsfer_00102: l_usbdev_blk_out_trnsfer_00102:
;source-doc/base-drv/./dev_transfers.c:46: RETURN_CHECK(result);
ld l, d
l_usbdev_blk_out_trnsfer_00103:
;source-doc/base-drv/./dev_transfers.c:47: }
;source-doc/base-drv/./dev_transfers.c:47: RETURN_CHECK(result);
;source-doc/base-drv/./dev_transfers.c:50: return result;
ld hl,_result
ld l, (hl)
l_usbdev_blk_out_trnsfer_00104:
;source-doc/base-drv/./dev_transfers.c:51: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./dev_transfers.c:49: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) {
;source-doc/base-drv/./dev_transfers.c:53: usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) {
; --------------------------------- ; ---------------------------------
; Function usbdev_bulk_in_transfer ; Function usbdev_bulk_in_transfer
; --------------------------------- ; ---------------------------------
@ -188,22 +197,27 @@ _usbdev_bulk_in_transfer:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/base-drv/./dev_transfers.c:53: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN];
ld c,(ix+4)
ld b,(ix+5)
ld hl,0x0006
add hl, bc
ex (sp), hl
;source-doc/base-drv/./dev_transfers.c:55: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint);
ld l, c
ld h, b
push af
;source-doc/base-drv/./dev_transfers.c:54: endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN];
ld a,(ix+4)
ld (ix-4),a
ld a,(ix+5)
ld (ix-3),a
ld a,(ix-4)
add a,0x06
ld (ix-2),a
ld a,(ix-3)
adc a,0x00
ld (ix-1),a
;source-doc/base-drv/./dev_transfers.c:56: result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint);
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
rlca rlca
rlca rlca
and 0x0f and 0x0f
push bc
pop de pop de
pop hl pop hl
push hl push hl
@ -222,19 +236,19 @@ _usbdev_bulk_in_transfer:
pop af pop af
pop af pop af
inc sp inc sp
ld d, l
pop bc
;source-doc/base-drv/./dev_transfers.c:57: if (result == USB_ERR_STALL) {
ld a, d
ld a, l
ld (_result), a
;source-doc/base-drv/./dev_transfers.c:58: if (result == USB_ERR_STALL) {
ld a,(_result)
sub 0x02 sub 0x02
jr NZ,l_usbdev_bulk_in_transfer_00102 jr NZ,l_usbdev_bulk_in_transfer_00102
;source-doc/base-drv/./dev_transfers.c:58: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size);
ld l, c
ld h, b
;source-doc/base-drv/./dev_transfers.c:59: usbtrn_clear_endpoint_halt(endpoint->number, dev->address, dev->max_packet_size);
pop hl
push hl
inc hl inc hl
ld d, (hl) ld d, (hl)
ld l, c
ld h, b
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
@ -242,8 +256,8 @@ _usbdev_bulk_in_transfer:
rlca rlca
and 0x0f and 0x0f
ld b, a ld b, a
pop hl
push hl
ld l,(ix-2)
ld h,(ix-1)
ld a, (hl) ld a, (hl)
rrca rrca
and 0x07 and 0x07
@ -256,22 +270,26 @@ _usbdev_bulk_in_transfer:
call _usbtrn_clear_endpoint_halt call _usbtrn_clear_endpoint_halt
pop af pop af
inc sp inc sp
;source-doc/base-drv/./dev_transfers.c:59: endpoint->toggle = 0;
;source-doc/base-drv/./dev_transfers.c:60: endpoint->toggle = 0;
pop de
pop hl pop hl
push hl push hl
push de
res 0, (hl) res 0, (hl)
;source-doc/base-drv/./dev_transfers.c:60: return USB_ERR_STALL;
;source-doc/base-drv/./dev_transfers.c:61: return USB_ERR_STALL;
ld l,0x02 ld l,0x02
jr l_usbdev_bulk_in_transfer_00103
jr l_usbdev_bulk_in_transfer_00104
l_usbdev_bulk_in_transfer_00102: l_usbdev_bulk_in_transfer_00102:
;source-doc/base-drv/./dev_transfers.c:63: RETURN_CHECK(result);
ld l, d
l_usbdev_bulk_in_transfer_00103:
;source-doc/base-drv/./dev_transfers.c:64: }
;source-doc/base-drv/./dev_transfers.c:64: RETURN_CHECK(result);
;source-doc/base-drv/./dev_transfers.c:66: return result;
ld hl,_result
ld l, (hl)
l_usbdev_bulk_in_transfer_00104:
;source-doc/base-drv/./dev_transfers.c:67: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./dev_transfers.c:66: usb_error usbdev_dat_in_trnsfer(device_config *const device,
;source-doc/base-drv/./dev_transfers.c:69: usb_error usbdev_dat_in_trnsfer(device_config *const device,
; --------------------------------- ; ---------------------------------
; Function usbdev_dat_in_trnsfer ; Function usbdev_dat_in_trnsfer
; --------------------------------- ; ---------------------------------
@ -280,35 +298,35 @@ _usbdev_dat_in_trnsfer:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/base-drv/./dev_transfers.c:73: endpoint_param *const endpoint = &device->endpoints[endpoint_type];
ld c,(ix+4)
ld b,(ix+5)
ld e, c
ld d, b
inc de
inc de
inc de
push de
push af
;source-doc/base-drv/./dev_transfers.c:74: endpoint_param *const endpoint = &device->endpoints[endpoint_type];
ld a,(ix+4)
ld (ix-4),a
ld a,(ix+5)
ld (ix-3),a
pop bc
push bc
inc bc
inc bc
inc bc
ld a,(ix+10) ld a,(ix+10)
ld e, a ld e, a
add a, a add a, a
add a, e add a, e
pop de
add a, e
add a, c
ld (ix-2),a ld (ix-2),a
ld a,0x00 ld a,0x00
adc a, d
adc a, b
ld (ix-1),a ld (ix-1),a
;source-doc/base-drv/./dev_transfers.c:75: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint);
ld l, c
ld h, b
;source-doc/base-drv/./dev_transfers.c:76: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint);
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
rlca rlca
rlca rlca
and 0x0f and 0x0f
push bc
pop de pop de
pop hl pop hl
push hl push hl
@ -327,19 +345,19 @@ _usbdev_dat_in_trnsfer:
pop af pop af
pop af pop af
inc sp inc sp
ld d, l
pop bc
;source-doc/base-drv/./dev_transfers.c:77: if (result == USB_ERR_STALL) {
ld a, d
ld a, l
ld (_result), a
;source-doc/base-drv/./dev_transfers.c:78: if (result == USB_ERR_STALL) {
ld a,(_result)
sub 0x02 sub 0x02
jr NZ,l_usbdev_dat_in_trnsfer_00102 jr NZ,l_usbdev_dat_in_trnsfer_00102
;source-doc/base-drv/./dev_transfers.c:78: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size);
ld l, c
ld h, b
;source-doc/base-drv/./dev_transfers.c:79: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size);
pop hl
push hl
inc hl inc hl
ld d, (hl) ld d, (hl)
ld l, c
ld h, b
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
@ -347,8 +365,8 @@ _usbdev_dat_in_trnsfer:
rlca rlca
and 0x0f and 0x0f
ld b, a ld b, a
pop hl
push hl
ld l,(ix-2)
ld h,(ix-1)
ld a, (hl) ld a, (hl)
rrca rrca
and 0x07 and 0x07
@ -361,22 +379,26 @@ _usbdev_dat_in_trnsfer:
call _usbtrn_clear_endpoint_halt call _usbtrn_clear_endpoint_halt
pop af pop af
inc sp inc sp
;source-doc/base-drv/./dev_transfers.c:79: endpoint->toggle = 0;
;source-doc/base-drv/./dev_transfers.c:80: endpoint->toggle = 0;
pop de
pop hl pop hl
push hl push hl
push de
res 0, (hl) res 0, (hl)
;source-doc/base-drv/./dev_transfers.c:80: return USB_ERR_STALL;
;source-doc/base-drv/./dev_transfers.c:81: return USB_ERR_STALL;
ld l,0x02 ld l,0x02
jr l_usbdev_dat_in_trnsfer_00103
jr l_usbdev_dat_in_trnsfer_00104
l_usbdev_dat_in_trnsfer_00102: l_usbdev_dat_in_trnsfer_00102:
;source-doc/base-drv/./dev_transfers.c:83: RETURN_CHECK(result);
ld l, d
l_usbdev_dat_in_trnsfer_00103:
;source-doc/base-drv/./dev_transfers.c:84: }
;source-doc/base-drv/./dev_transfers.c:84: RETURN_CHECK(result);
;source-doc/base-drv/./dev_transfers.c:86: return result;
ld hl,_result
ld l, (hl)
l_usbdev_dat_in_trnsfer_00104:
;source-doc/base-drv/./dev_transfers.c:87: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./dev_transfers.c:86: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) {
;source-doc/base-drv/./dev_transfers.c:89: usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) {
; --------------------------------- ; ---------------------------------
; Function usbdev_dat_in_trnsfer_0 ; Function usbdev_dat_in_trnsfer_0
; --------------------------------- ; ---------------------------------
@ -386,53 +408,57 @@ _usbdev_dat_in_trnsfer_0:
add ix,sp add ix,sp
push af push af
push af push af
ld c, l
ld b, h
ld (ix-2),e
ld (ix-1),d
;source-doc/base-drv/./dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0]; ;source-doc/base-drv/./dev_transfers.c:90: endpoint_param *const endpoint = &device->endpoints[0];
ld hl,0x0003
add hl, bc
ex (sp), hl
ld a,(ix+4)
ld (ix-4),a
ld a,(ix+5)
ld (ix-3),a
ld a,(ix-4)
add a,0x03
ld (ix-2),a
ld a,(ix-3)
adc a,0x00
ld (ix-1),a
;source-doc/base-drv/./dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); ;source-doc/base-drv/./dev_transfers.c:92: result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint);
ld l, c
ld h, b
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
rlca rlca
rlca rlca
and 0x0f and 0x0f
ld e,(ix+4)
ld d,0x00
push bc
ld l,(ix-4)
ld h,(ix-3)
ld c,(ix+8)
ld b,0x00
pop de
pop hl
push hl
push de
push hl push hl
push af push af
inc sp inc sp
push de
ld l,(ix-2)
ld h,(ix-1)
push bc
ld l,(ix+6)
ld h,(ix+7)
push hl push hl
call _usb_data_in_transfer call _usb_data_in_transfer
pop af pop af
pop af pop af
pop af pop af
inc sp inc sp
ld d, l
pop bc
ld a, l
ld (_result), a
;source-doc/base-drv/./dev_transfers.c:94: if (result == USB_ERR_STALL) { ;source-doc/base-drv/./dev_transfers.c:94: if (result == USB_ERR_STALL) {
ld a, d
ld a,(_result)
sub 0x02 sub 0x02
jr NZ,l_usbdev_dat_in_trnsfer_0_00102 jr NZ,l_usbdev_dat_in_trnsfer_0_00102
;source-doc/base-drv/./dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size); ;source-doc/base-drv/./dev_transfers.c:95: usbtrn_clear_endpoint_halt(endpoint->number, device->address, device->max_packet_size);
ld l, c
ld h, b
pop hl
push hl
inc hl inc hl
ld d, (hl) ld d, (hl)
ld l, c
ld h, b
pop hl
push hl
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
@ -440,8 +466,8 @@ _usbdev_dat_in_trnsfer_0:
rlca rlca
and 0x0f and 0x0f
ld b, a ld b, a
pop hl
push hl
ld l,(ix-2)
ld h,(ix-1)
ld a, (hl) ld a, (hl)
rrca rrca
and 0x07 and 0x07
@ -455,19 +481,20 @@ _usbdev_dat_in_trnsfer_0:
pop af pop af
inc sp inc sp
;source-doc/base-drv/./dev_transfers.c:96: endpoint->toggle = 0; ;source-doc/base-drv/./dev_transfers.c:96: endpoint->toggle = 0;
pop de
pop hl pop hl
push hl push hl
push de
res 0, (hl) res 0, (hl)
;source-doc/base-drv/./dev_transfers.c:97: return USB_ERR_STALL; ;source-doc/base-drv/./dev_transfers.c:97: return USB_ERR_STALL;
ld a,0x02
ld l,0x02
jr l_usbdev_dat_in_trnsfer_0_00103 jr l_usbdev_dat_in_trnsfer_0_00103
l_usbdev_dat_in_trnsfer_0_00102: l_usbdev_dat_in_trnsfer_0_00102:
;source-doc/base-drv/./dev_transfers.c:100: RETURN_CHECK(result);
ld a, d
;source-doc/base-drv/./dev_transfers.c:100: return result;
ld hl,_result
ld l, (hl)
l_usbdev_dat_in_trnsfer_0_00103: l_usbdev_dat_in_trnsfer_0_00103:
;source-doc/base-drv/./dev_transfers.c:101: } ;source-doc/base-drv/./dev_transfers.c:101: }
ld sp, ix ld sp, ix
pop ix pop ix
pop hl
inc sp
jp (hl)
ret

285
Source/HBIOS/ch376-native/base-drv/enumerate.c.s

@ -532,12 +532,14 @@ _op_capture_hub_driver_interfac:
ex de, hl ex de, hl
call _configure_usb_hub call _configure_usb_hub
ld a, l ld a, l
;source-doc/base-drv/./enumerate.c:97: done:
l_op_capture_hub_driver_interfa: l_op_capture_hub_driver_interfa:
;source-doc/base-drv/./enumerate.c:97: }
;source-doc/base-drv/./enumerate.c:98: return result;
;source-doc/base-drv/./enumerate.c:99: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./enumerate.c:99: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall {
;source-doc/base-drv/./enumerate.c:101: usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall {
; --------------------------------- ; ---------------------------------
; Function op_cap_drv_intf ; Function op_cap_drv_intf
; --------------------------------- ; ---------------------------------
@ -552,7 +554,7 @@ _op_cap_drv_intf:
ld sp, hl ld sp, hl
ld (ix-2),c ld (ix-2),c
ld (ix-1),b ld (ix-1),b
;source-doc/base-drv/./enumerate.c:102: const interface_descriptor *const interface = (interface_descriptor *)working->ptr;
;source-doc/base-drv/./enumerate.c:104: const interface_descriptor *const interface = (interface_descriptor *)working->ptr;
ld l,(ix-2) ld l,(ix-2)
ld h,(ix-1) ld h,(ix-1)
ld de,0x001b ld de,0x001b
@ -563,7 +565,7 @@ _op_cap_drv_intf:
dec hl dec hl
ld c, e ld c, e
ld b, d ld b, d
;source-doc/base-drv/./enumerate.c:104: working->ptr += interface->bLength;
;source-doc/base-drv/./enumerate.c:106: working->ptr += interface->bLength;
ld a, (bc) ld a, (bc)
add a, e add a, e
ld e, a ld e, a
@ -572,7 +574,7 @@ _op_cap_drv_intf:
ld (hl), e ld (hl), e
inc hl inc hl
ld (hl), a ld (hl), a
;source-doc/base-drv/./enumerate.c:105: working->endpoint_count = interface->bNumEndpoints;
;source-doc/base-drv/./enumerate.c:107: working->endpoint_count = interface->bNumEndpoints;
ld a,(ix-2) ld a,(ix-2)
add a,0x17 add a,0x17
ld e, a ld e, a
@ -587,7 +589,7 @@ _op_cap_drv_intf:
inc hl inc hl
ld a, (hl) ld a, (hl)
ld (de), a ld (de), a
;source-doc/base-drv/./enumerate.c:106: working->p_current_device = NULL;
;source-doc/base-drv/./enumerate.c:108: working->p_current_device = NULL;
ld a,(ix-2) ld a,(ix-2)
add a,0x1d add a,0x1d
ld (ix-4),a ld (ix-4),a
@ -600,7 +602,7 @@ _op_cap_drv_intf:
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a ld (hl), a
;source-doc/base-drv/./enumerate.c:108: switch (working->usb_device) {
;source-doc/base-drv/./enumerate.c:110: switch (working->usb_device) {
ld l,(ix-2) ld l,(ix-2)
ld h,(ix-1) ld h,(ix-1)
inc hl inc hl
@ -610,27 +612,26 @@ _op_cap_drv_intf:
jr Z,l_op_cap_drv_intf_00104 jr Z,l_op_cap_drv_intf_00104
sub 0x0f sub 0x0f
jr NZ,l_op_cap_drv_intf_00107 jr NZ,l_op_cap_drv_intf_00107
;source-doc/base-drv/./enumerate.c:110: CHECK(op_capture_hub_driver_interface(working))
;source-doc/base-drv/./enumerate.c:112: CHECK(op_capture_hub_driver_interface(working))
ld l,(ix-2) ld l,(ix-2)
ld h,(ix-1) ld h,(ix-1)
call _op_capture_hub_driver_interfac call _op_capture_hub_driver_interfac
or a or a
jr Z,l_op_cap_drv_intf_00112 jr Z,l_op_cap_drv_intf_00112
ld l, a
jr l_op_cap_drv_intf_00115
;source-doc/base-drv/./enumerate.c:114: case USB_IS_UNKNOWN: {
jr l_op_cap_drv_intf_00113
;source-doc/base-drv/./enumerate.c:116: case USB_IS_UNKNOWN: {
l_op_cap_drv_intf_00104: l_op_cap_drv_intf_00104:
;source-doc/base-drv/./enumerate.c:116: memset(&unkown_dev_cfg, 0, sizeof(device_config));
;source-doc/base-drv/./enumerate.c:118: memset(&unkown_dev_cfg, 0, sizeof(device_config));
push bc push bc
ld hl,2 ld hl,2
add hl, sp add hl, sp
ld b,0x0c ld b,0x0c
l_op_cap_drv_intf_00169:
l_op_cap_drv_intf_00154:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_op_cap_drv_intf_00169
djnz l_op_cap_drv_intf_00154
pop bc pop bc
;source-doc/base-drv/./enumerate.c:117: working->p_current_device = &unkown_dev_cfg;
;source-doc/base-drv/./enumerate.c:119: working->p_current_device = &unkown_dev_cfg;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -639,7 +640,7 @@ l_op_cap_drv_intf_00169:
ld (hl), e ld (hl), e
inc hl inc hl
ld (hl), d ld (hl), d
;source-doc/base-drv/./enumerate.c:118: CHECK(configure_device(working, interface, &unkown_dev_cfg));
;source-doc/base-drv/./enumerate.c:120: CHECK(configure_device(working, interface, &unkown_dev_cfg));
ld hl,0 ld hl,0
add hl, sp add hl, sp
push hl push hl
@ -654,29 +655,29 @@ l_op_cap_drv_intf_00169:
ld a, l ld a, l
or a or a
jr Z,l_op_cap_drv_intf_00112 jr Z,l_op_cap_drv_intf_00112
jr l_op_cap_drv_intf_00115
;source-doc/base-drv/./enumerate.c:122: default: {
jr l_op_cap_drv_intf_00113
;source-doc/base-drv/./enumerate.c:124: default: {
l_op_cap_drv_intf_00107: l_op_cap_drv_intf_00107:
;source-doc/base-drv/./enumerate.c:123: device_config *dev_cfg = find_first_free();
;source-doc/base-drv/./enumerate.c:125: device_config *dev_cfg = find_first_free();
push bc push bc
call _find_first_free call _find_first_free
ex de, hl ex de, hl
pop bc pop bc
;source-doc/base-drv/./enumerate.c:124: if (dev_cfg == NULL)
;source-doc/base-drv/./enumerate.c:126: if (dev_cfg == NULL)
ld a, d ld a, d
or e or e
jr NZ,l_op_cap_drv_intf_00109 jr NZ,l_op_cap_drv_intf_00109
;source-doc/base-drv/./enumerate.c:125: return USB_ERR_OUT_OF_MEMORY;
;source-doc/base-drv/./enumerate.c:127: return USB_ERR_OUT_OF_MEMORY;
ld l,0x83 ld l,0x83
jr l_op_cap_drv_intf_00115
jr l_op_cap_drv_intf_00114
l_op_cap_drv_intf_00109: l_op_cap_drv_intf_00109:
;source-doc/base-drv/./enumerate.c:126: working->p_current_device = dev_cfg;
;source-doc/base-drv/./enumerate.c:128: working->p_current_device = dev_cfg;
ld l,(ix-4) ld l,(ix-4)
ld h,(ix-3) ld h,(ix-3)
ld (hl), e ld (hl), e
inc hl inc hl
ld (hl), d ld (hl), d
;source-doc/base-drv/./enumerate.c:127: CHECK(configure_device(working, interface, dev_cfg));
;source-doc/base-drv/./enumerate.c:129: CHECK(configure_device(working, interface, dev_cfg));
push de push de
push bc push bc
ld l,(ix-2) ld l,(ix-2)
@ -688,32 +689,29 @@ l_op_cap_drv_intf_00109:
pop af pop af
ld a, l ld a, l
or a or a
;source-doc/base-drv/./enumerate.c:130: }
jr NZ,l_op_cap_drv_intf_00115
jr NZ,l_op_cap_drv_intf_00113
;source-doc/base-drv/./enumerate.c:132: }
l_op_cap_drv_intf_00112: l_op_cap_drv_intf_00112:
;source-doc/base-drv/./enumerate.c:132: CHECK(op_parse_endpoint(working));
;source-doc/base-drv/./enumerate.c:134: result = op_parse_endpoint(working);
ld l,(ix-2) ld l,(ix-2)
ld h,(ix-1) ld h,(ix-1)
call _op_parse_endpoint call _op_parse_endpoint
or a
jr Z,l_op_cap_drv_intf_00114
;source-doc/base-drv/./enumerate.c:136: done:
l_op_cap_drv_intf_00113:
;source-doc/base-drv/./enumerate.c:137: return result;
ld l, a ld l, a
jr l_op_cap_drv_intf_00115
l_op_cap_drv_intf_00114: l_op_cap_drv_intf_00114:
;source-doc/base-drv/./enumerate.c:134: return result;
ld l, a
l_op_cap_drv_intf_00115:
;source-doc/base-drv/./enumerate.c:135: }
;source-doc/base-drv/./enumerate.c:138: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./enumerate.c:137: usb_error op_id_class_drv(_working *const working) __sdcccall(1) {
;source-doc/base-drv/./enumerate.c:140: usb_error op_id_class_drv(_working *const working) __sdcccall(1) {
; --------------------------------- ; ---------------------------------
; Function op_id_class_drv ; Function op_id_class_drv
; --------------------------------- ; ---------------------------------
_op_id_class_drv: _op_id_class_drv:
ex de, hl ex de, hl
;source-doc/base-drv/./enumerate.c:139: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr;
;source-doc/base-drv/./enumerate.c:141: const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr;
ld l, e ld l, e
ld h, d ld h, d
ld bc,0x001c ld bc,0x001c
@ -721,16 +719,16 @@ _op_id_class_drv:
ld a, (hl) ld a, (hl)
dec hl dec hl
ld l, (hl) ld l, (hl)
;source-doc/base-drv/./enumerate.c:141: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0;
ld h, a
;source-doc/base-drv/./enumerate.c:143: working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0;
ld c, e ld c, e
ld b, d ld b, d
inc bc inc bc
inc bc inc bc
ld h, a
ld l, (hl) ld l, (hl)
ld a,0x05 ld a,0x05
sub l sub l
jr NC,l_op_id_class_drv_00105
jr NC,l_op_id_class_drv_00103
push bc push bc
push de push de
push de push de
@ -739,18 +737,15 @@ _op_id_class_drv:
ld a, l ld a, l
pop de pop de
pop bc pop bc
jr l_op_id_class_drv_00106
l_op_id_class_drv_00105:
jr l_op_id_class_drv_00104
l_op_id_class_drv_00103:
xor a xor a
l_op_id_class_drv_00106:
l_op_id_class_drv_00104:
ld (bc), a ld (bc), a
;source-doc/base-drv/./enumerate.c:143: CHECK(op_cap_drv_intf(working));
;source-doc/base-drv/./enumerate.c:145: return op_cap_drv_intf(working);
ex de, hl ex de, hl
call _op_cap_drv_intf call _op_cap_drv_intf
ld a, l ld a, l
or a
ret NZ
;source-doc/base-drv/./enumerate.c:145: return result;
;source-doc/base-drv/./enumerate.c:146: } ;source-doc/base-drv/./enumerate.c:146: }
ret ret
;source-doc/base-drv/./enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { ;source-doc/base-drv/./enumerate.c:148: usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) {
@ -762,65 +757,81 @@ _op_get_cfg_desc:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
ex de, hl
;source-doc/base-drv/./enumerate.c:151: memset(working->config.buffer, 0, MAX_CONFIG_SIZE);
ld hl,0x001f
add hl, de
ex (sp), hl
push af
ld (ix-2),l
ld (ix-1),h
;source-doc/base-drv/./enumerate.c:149: memset(working->config.buffer, 0, MAX_CONFIG_SIZE);
ld a,(ix-2)
add a,0x1f
ld (ix-4),a
ld a,(ix-1)
adc a,0x00
ld (ix-3),a
pop hl pop hl
push hl push hl
ld b,0x8c ld b,0x8c
l_op_get_cfg_desc_00121:
l_op_get_cfg_desc_00113:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_op_get_cfg_desc_00121
;source-doc/base-drv/./enumerate.c:153: const uint8_t max_packet_size = working->desc.bMaxPacketSize0;
ld c, e
ld b, d
djnz l_op_get_cfg_desc_00113
;source-doc/base-drv/./enumerate.c:151: const uint8_t max_packet_size = working->desc.bMaxPacketSize0;
pop hl
pop bc
push bc
push hl
inc bc inc bc
inc bc inc bc
inc bc inc bc
ld hl,7 ld hl,7
add hl, bc add hl, bc
ld a, (hl)
;source-doc/base-drv/./enumerate.c:156: working->config.buffer));
ld c, e
ld b, d
ld d, (hl)
;source-doc/base-drv/./enumerate.c:154: working->config.buffer));
pop hl
pop bc
push bc
push hl
ld hl,24 ld hl,24
add hl, bc add hl, bc
ld b, (hl)
ld l, e
ld h, d
ld a, (hl)
pop hl
pop bc
push bc push bc
ld bc,0x0015
push hl
ld hl,21
add hl, bc add hl, bc
pop bc
ld c, (hl)
push de
ld l,(ix-2)
ld h,(ix-1)
ld b, (hl)
pop hl
push hl
push hl push hl
ld h,0x8c ld h,0x8c
push hl push hl
inc sp inc sp
push de
inc sp
push af push af
inc sp inc sp
push bc push bc
inc sp
call _usbtrn_gfull_cfg_desc call _usbtrn_gfull_cfg_desc
pop af pop af
pop af pop af
pop af pop af
ld a, l ld a, l
pop de
ld (_result), a
ld a,(_result)
or a or a
jr NZ,l_op_get_cfg_desc_00105
;source-doc/base-drv/./enumerate.c:158: working->ptr = (working->config.buffer + sizeof(config_descriptor));
ld hl,0x001b
jr NZ,l_op_get_cfg_desc_00103
;source-doc/base-drv/./enumerate.c:156: working->ptr = (working->config.buffer + sizeof(config_descriptor));
pop de
pop hl
push hl
push de
ld de,0x001b
add hl, de add hl, de
ld a, e
ld a,(ix-2)
add a,0x1f add a,0x1f
ld c, a ld c, a
ld a, d
ld a,(ix-1)
adc a,0x00 adc a,0x00
ld b, a ld b, a
ld a, c ld a, c
@ -831,31 +842,37 @@ l_op_get_cfg_desc_00121:
ld (hl), c ld (hl), c
inc hl inc hl
ld (hl), a ld (hl), a
;source-doc/base-drv/./enumerate.c:159: working->interface_count = working->config.desc.bNumInterfaces;
ld hl,0x0016
;source-doc/base-drv/./enumerate.c:157: working->interface_count = working->config.desc.bNumInterfaces;
ld a,(ix-2)
add a,0x16
ld c, a
ld a,(ix-1)
adc a,0x00
ld b, a
pop de
push de
ld hl,4
add hl, de add hl, de
ld c, l
ld b, h
pop hl
push hl
inc hl
inc hl
inc hl
inc hl
ld a, (hl) ld a, (hl)
ld (bc), a ld (bc), a
;source-doc/base-drv/./enumerate.c:161: CHECK(op_id_class_drv(working));
ex de, hl
;source-doc/base-drv/./enumerate.c:159: return op_id_class_drv(working);
pop de
pop hl
push hl
push de
call _op_id_class_drv call _op_id_class_drv
or a
jr NZ,l_op_get_cfg_desc_00105
;source-doc/base-drv/./enumerate.c:163: return result;
l_op_get_cfg_desc_00105:
;source-doc/base-drv/./enumerate.c:164: }
jr l_op_get_cfg_desc_00104
;source-doc/base-drv/./enumerate.c:160: done:
l_op_get_cfg_desc_00103:
;source-doc/base-drv/./enumerate.c:161: return result;
ld hl,_result
ld a, (hl)
l_op_get_cfg_desc_00104:
;source-doc/base-drv/./enumerate.c:162: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./enumerate.c:166: usb_error read_all_configs(enumeration_state *const state) {
;source-doc/base-drv/./enumerate.c:164: usb_error read_all_configs(enumeration_state *const state) {
; --------------------------------- ; ---------------------------------
; Function read_all_configs ; Function read_all_configs
; --------------------------------- ; ---------------------------------
@ -866,18 +883,18 @@ _read_all_configs:
ld hl, -171 ld hl, -171
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/./enumerate.c:171: memset(&working, 0, sizeof(_working));
;source-doc/base-drv/./enumerate.c:169: memset(&working, 0, sizeof(_working));
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld l, e ld l, e
ld h, d ld h, d
ld b,0xab ld b,0xab
l_read_all_configs_00148:
l_read_all_configs_00149:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_read_all_configs_00148
;source-doc/base-drv/./enumerate.c:172: working.state = state;
djnz l_read_all_configs_00149
;source-doc/base-drv/./enumerate.c:170: working.state = state;
ld l, e ld l, e
ld h, d ld h, d
ld a,(ix+4) ld a,(ix+4)
@ -885,57 +902,53 @@ l_read_all_configs_00148:
inc hl inc hl
ld a,(ix+5) ld a,(ix+5)
ld (hl), a ld (hl), a
;source-doc/base-drv/./enumerate.c:174: CHECK(usbtrn_get_descriptor(&working.desc));
;source-doc/base-drv/./enumerate.c:172: CHECK(usbtrn_get_descriptor(&working.desc));
push de push de
ld hl,5 ld hl,5
add hl, sp add hl, sp
push hl push hl
call _usbtrn_get_descriptor call _usbtrn_get_descriptor
pop af pop af
ld c, l
ld a, l
pop de pop de
ld a, c
or a or a
jr Z,l_read_all_configs_00102
ld l, c
jr l_read_all_configs_00111
l_read_all_configs_00102:
;source-doc/base-drv/./enumerate.c:176: state->next_device_address++;
jr NZ,l_read_all_configs_00108
;source-doc/base-drv/./enumerate.c:174: state->next_device_address++;
ld a,(ix+4) ld a,(ix+4)
ld c,(ix+5)
ld b,(ix+5)
ld l, a ld l, a
ld h, c
ld b, (hl)
inc b
ld h, b
ld c, (hl)
inc c
ld l, a ld l, a
ld h, c
ld (hl), b
;source-doc/base-drv/./enumerate.c:177: working.current_device_address = state->next_device_address;
ld h, b
ld (hl), c
;source-doc/base-drv/./enumerate.c:175: working.current_device_address = state->next_device_address;
ld hl,0x0018 ld hl,0x0018
add hl, de add hl, de
ld (hl), b
;source-doc/base-drv/./enumerate.c:178: CHECK(usbtrn_set_address(working.current_device_address));
ld (hl), c
;source-doc/base-drv/./enumerate.c:176: CHECK(usbtrn_set_address(working.current_device_address));
push de push de
ld l, b
ld l, c
call _usbtrn_set_address call _usbtrn_set_address
pop de
ld a, l ld a, l
;source-doc/base-drv/./enumerate.c:180: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
pop de
;source-doc/base-drv/./enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
or a or a
jr NZ,l_read_all_configs_00111
jr NZ,l_read_all_configs_00108
ld c,a ld c,a
l_read_all_configs_00109:
l_read_all_configs_00110:
ld hl,20 ld hl,20
add hl, sp add hl, sp
ld b, (hl) ld b, (hl)
ld a, c ld a, c
sub b sub b
jr NC,l_read_all_configs_00107 jr NC,l_read_all_configs_00107
;source-doc/base-drv/./enumerate.c:181: working.config_index = config_index;
;source-doc/base-drv/./enumerate.c:179: working.config_index = config_index;
ld hl,0x0015 ld hl,0x0015
add hl, de add hl, de
ld (hl), c ld (hl), c
;source-doc/base-drv/./enumerate.c:183: CHECK(op_get_cfg_desc(&working));
;source-doc/base-drv/./enumerate.c:181: CHECK(op_get_cfg_desc(&working));
push bc push bc
push de push de
ld hl,4 ld hl,4
@ -944,17 +957,19 @@ l_read_all_configs_00109:
pop de pop de
pop bc pop bc
or a or a
jr Z,l_read_all_configs_00110
ld l, a
jr l_read_all_configs_00111
l_read_all_configs_00110:
;source-doc/base-drv/./enumerate.c:180: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
jr NZ,l_read_all_configs_00108
;source-doc/base-drv/./enumerate.c:178: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
inc c inc c
jr l_read_all_configs_00109
jr l_read_all_configs_00110
l_read_all_configs_00107: l_read_all_configs_00107:
;source-doc/base-drv/./enumerate.c:186: return USB_ERR_OK;
;source-doc/base-drv/./enumerate.c:184: return USB_ERR_OK;
ld l,0x00 ld l,0x00
l_read_all_configs_00111:
jr l_read_all_configs_00112
;source-doc/base-drv/./enumerate.c:185: done:
l_read_all_configs_00108:
;source-doc/base-drv/./enumerate.c:186: return result;
ld l, a
l_read_all_configs_00112:
;source-doc/base-drv/./enumerate.c:187: } ;source-doc/base-drv/./enumerate.c:187: }
ld sp, ix ld sp, ix
pop ix pop ix
@ -989,17 +1004,9 @@ _enumerate_all_devices:
;source-doc/base-drv/./enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address; ;source-doc/base-drv/./enumerate.c:197: work_area->count_of_detected_usb_devices = state.next_device_address;
ld a, (de) ld a, (de)
ld ((_x + 1)),a ld ((_x + 1)),a
;source-doc/base-drv/./enumerate.c:199: CHECK(result);
ld a, c
or a
jr Z,l_enumerate_all_devices_00102
ld l, c
jr l_enumerate_all_devices_00103
l_enumerate_all_devices_00102:
;source-doc/base-drv/./enumerate.c:201: return result;
;source-doc/base-drv/./enumerate.c:200: return result;
ld l, c ld l, c
l_enumerate_all_devices_00103:
;source-doc/base-drv/./enumerate.c:202: }
;source-doc/base-drv/./enumerate.c:201: }
inc sp inc sp
pop ix pop ix
ret ret

102
Source/HBIOS/ch376-native/base-drv/enumerate_hub.c.s

@ -246,14 +246,14 @@ _configure_usb_hub:
add ix,sp add ix,sp
ld c, l ld c, l
ld b, h ld b, h
ld hl, -15
ld hl, -14
add hl, sp add hl, sp
ld sp, hl ld sp, hl
ld (ix-3),c
ld (ix-2),b
ld (ix-2),c
ld (ix-1),b
;source-doc/base-drv/./enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config; ;source-doc/base-drv/./enumerate_hub.c:45: const device_config_hub *const hub_config = working->hub_config;
ld c,(ix-3)
ld b,(ix-2)
ld c,(ix-2)
ld b,(ix-1)
ld hl,25 ld hl,25
add hl, bc add hl, bc
ld c, (hl) ld c, (hl)
@ -267,83 +267,82 @@ _configure_usb_hub:
ld l, c ld l, c
ld h, b ld h, b
call _hub_get_descriptor call _hub_get_descriptor
ld e, a
pop bc pop bc
ld a, e
or a or a
jr Z,l_configure_usb_hub_00102
ld l, e
jp l_configure_usb_hub_00129
l_configure_usb_hub_00102:
jp NZ, l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts; ;source-doc/base-drv/./enumerate_hub.c:49: uint8_t i = hub_description.bNbrPorts;
ld a,(ix-13)
ld (ix-1),a
ld d,(ix-12)
;source-doc/base-drv/./enumerate_hub.c:50: do { ;source-doc/base-drv/./enumerate_hub.c:50: do {
l_configure_usb_hub_00126: l_configure_usb_hub_00126:
;source-doc/base-drv/./enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); ;source-doc/base-drv/./enumerate_hub.c:51: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x08 ld e,0x08
push de push de
push bc push bc
call _hub_clear_feature call _hub_clear_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jp NZ, l_configure_usb_hub_00129 jp NZ, l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i)); ;source-doc/base-drv/./enumerate_hub.c:53: CHECK(hub_set_feature(hub_config, FEAT_PORT_POWER, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x08 ld e,0x08
push de push de
push bc push bc
call _hub_set_feature call _hub_set_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jp NZ, l_configure_usb_hub_00129 jp NZ, l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i); ;source-doc/base-drv/./enumerate_hub.c:55: hub_clear_feature(hub_config, FEAT_PORT_RESET, i);
push bc push bc
ld d,(ix-1)
push de
ld e,0x04 ld e,0x04
push de push de
push bc push bc
call _hub_clear_feature call _hub_clear_feature
pop af pop af
pop af pop af
pop de
pop bc pop bc
;source-doc/base-drv/./enumerate_hub.c:57: CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i)); ;source-doc/base-drv/./enumerate_hub.c:57: CHECK(hub_set_feature(hub_config, FEAT_PORT_RESET, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x04 ld e,0x04
push de push de
push bc push bc
call _hub_set_feature call _hub_set_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jp NZ, l_configure_usb_hub_00129 jp NZ, l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status)); ;source-doc/base-drv/./enumerate_hub.c:59: CHECK(hub_get_status_port(hub_config, i, &port_status));
push bc push bc
ld hl,10
push de
ld hl,12
add hl, sp add hl, sp
push hl push hl
ld a,(ix-1)
push af
push de
inc sp inc sp
push bc push bc
call _hub_get_status_port call _hub_get_status_port
pop af pop af
pop af pop af
inc sp inc sp
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jp NZ, l_configure_usb_hub_00129 jp NZ, l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) { ;source-doc/base-drv/./enumerate_hub.c:61: if (port_status.wPortStatus.port_connection) {
@ -354,105 +353,122 @@ l_configure_usb_hub_00126:
jr Z,l_configure_usb_hub_00124 jr Z,l_configure_usb_hub_00124
;source-doc/base-drv/./enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i)); ;source-doc/base-drv/./enumerate_hub.c:62: CHECK(hub_clear_feature(hub_config, HUB_FEATURE_PORT_CONNECTION_CHA, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x10 ld e,0x10
push de push de
push bc push bc
call _hub_clear_feature call _hub_clear_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jr NZ,l_configure_usb_hub_00129 jr NZ,l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i)); ;source-doc/base-drv/./enumerate_hub.c:64: CHECK(hub_clear_feature(hub_config, FEAT_PORT_ENABLE_CHANGE, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x11 ld e,0x11
push de push de
push bc push bc
call _hub_clear_feature call _hub_clear_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jr NZ,l_configure_usb_hub_00129 jr NZ,l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i)); ;source-doc/base-drv/./enumerate_hub.c:66: CHECK(hub_clear_feature(hub_config, FEAT_PORT_RESET_CHANGE, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x14 ld e,0x14
push de push de
push bc push bc
call _hub_clear_feature call _hub_clear_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jr NZ,l_configure_usb_hub_00129 jr NZ,l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:67: delay_short(); ;source-doc/base-drv/./enumerate_hub.c:67: delay_short();
push bc push bc
push de
call _delay_short call _delay_short
pop de
pop bc pop bc
;source-doc/base-drv/./enumerate_hub.c:69: CHECK(hub_get_status_port(hub_config, i, &port_status)); ;source-doc/base-drv/./enumerate_hub.c:69: CHECK(hub_get_status_port(hub_config, i, &port_status));
push bc push bc
ld hl,10
push de
ld hl,12
add hl, sp add hl, sp
push hl push hl
ld a,(ix-1)
push af
push de
inc sp inc sp
push bc push bc
call _hub_get_status_port call _hub_get_status_port
pop af pop af
pop af pop af
inc sp inc sp
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jr NZ,l_configure_usb_hub_00129 jr NZ,l_configure_usb_hub_00129
;source-doc/base-drv/./enumerate_hub.c:70: delay_short(); ;source-doc/base-drv/./enumerate_hub.c:70: delay_short();
push bc push bc
push de
call _delay_short call _delay_short
pop de
pop bc pop bc
;source-doc/base-drv/./enumerate_hub.c:72: CHECK(read_all_configs(working->state)); ;source-doc/base-drv/./enumerate_hub.c:72: CHECK(read_all_configs(working->state));
ld l,(ix-3)
ld h,(ix-2)
ld e, (hl)
ld l,(ix-2)
ld h,(ix-1)
ld a, (hl)
inc hl inc hl
ld d, (hl)
ld h, (hl)
ld l, a
push bc push bc
push de push de
push hl
call _read_all_configs call _read_all_configs
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jr Z,l_configure_usb_hub_00127 jr Z,l_configure_usb_hub_00127
jr l_configure_usb_hub_00129 jr l_configure_usb_hub_00129
l_configure_usb_hub_00124: l_configure_usb_hub_00124:
;source-doc/base-drv/./enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i)); ;source-doc/base-drv/./enumerate_hub.c:75: CHECK(hub_clear_feature(hub_config, FEAT_PORT_POWER, i));
push bc push bc
ld d,(ix-1)
push de
ld e,0x08 ld e,0x08
push de push de
push bc push bc
call _hub_clear_feature call _hub_clear_feature
pop af pop af
pop af pop af
pop bc
ld a, l ld a, l
pop de
pop bc
or a or a
jr NZ,l_configure_usb_hub_00129 jr NZ,l_configure_usb_hub_00129
l_configure_usb_hub_00127: l_configure_usb_hub_00127:
;source-doc/base-drv/./enumerate_hub.c:77: } while (--i != 0); ;source-doc/base-drv/./enumerate_hub.c:77: } while (--i != 0);
dec (ix-1)
dec d
jp NZ, l_configure_usb_hub_00126 jp NZ, l_configure_usb_hub_00126
;source-doc/base-drv/./enumerate_hub.c:79: return USB_ERR_OK; ;source-doc/base-drv/./enumerate_hub.c:79: return USB_ERR_OK;
ld l,0x00 ld l,0x00
jr l_configure_usb_hub_00130
;source-doc/base-drv/./enumerate_hub.c:80: done:
l_configure_usb_hub_00129: l_configure_usb_hub_00129:
;source-doc/base-drv/./enumerate_hub.c:80: }
;source-doc/base-drv/./enumerate_hub.c:81: return result;
ld l, a
l_configure_usb_hub_00130:
;source-doc/base-drv/./enumerate_hub.c:82: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret

172
Source/HBIOS/ch376-native/base-drv/protocol.c.s

@ -59,26 +59,18 @@ _usbtrn_get_descriptor:
ld hl, -8 ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/./protocol.c:32: cmd = cmd_get_device_descriptor;
;source-doc/base-drv/./protocol.c:31: cmd = cmd_get_device_descriptor;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_cmd_get_device_descriptor ld hl,_cmd_get_device_descriptor
ld bc,0x0008 ld bc,0x0008
ldir ldir
;source-doc/base-drv/./protocol.c:33: cmd.wLength = 8;
;source-doc/base-drv/./protocol.c:32: cmd.wLength = 8;
ld (ix-2),0x08 ld (ix-2),0x08
xor a xor a
ld (ix-1),a ld (ix-1),a
;source-doc/base-drv/./protocol.c:35: debugger();
PUSH AF
PUSH BC
XOR A
LD B, 7
DEFB 0x49, 0xD7
POP BC
POP AF
;source-doc/base-drv/./protocol.c:36: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8);
;source-doc/base-drv/./protocol.c:34: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8);
ld c,(ix+4) ld c,(ix+4)
ld b,(ix+5) ld b,(ix+5)
ld e, c ld e, c
@ -99,11 +91,13 @@ _usbtrn_get_descriptor:
pop af pop af
pop af pop af
pop bc pop bc
;source-doc/base-drv/./protocol.c:38: CHECK(result);
ld a, l ld a, l
ld (_result), a
;source-doc/base-drv/./protocol.c:36: CHECK(result);
ld a,(_result)
or a or a
jr NZ,l_usbtrn_get_descriptor_00103 jr NZ,l_usbtrn_get_descriptor_00103
;source-doc/base-drv/./protocol.c:40: cmd = cmd_get_device_descriptor;
;source-doc/base-drv/./protocol.c:38: cmd = cmd_get_device_descriptor;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -112,11 +106,11 @@ _usbtrn_get_descriptor:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc pop bc
;source-doc/base-drv/./protocol.c:41: cmd.wLength = 18;
;source-doc/base-drv/./protocol.c:39: cmd.wLength = 18;
ld (ix-2),0x12 ld (ix-2),0x12
xor a xor a
ld (ix-1),a ld (ix-1),a
;source-doc/base-drv/./protocol.c:42: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0);
;source-doc/base-drv/./protocol.c:40: result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0);
ld e,(ix+4) ld e,(ix+4)
ld d,(ix+5) ld d,(ix+5)
ld hl,7 ld hl,7
@ -135,9 +129,15 @@ _usbtrn_get_descriptor:
pop af pop af
pop af pop af
pop af pop af
;source-doc/base-drv/./protocol.c:44: RETURN_CHECK(result);
ld a, l
ld (_result), a
;source-doc/base-drv/./protocol.c:42: RETURN_CHECK(result);
;source-doc/base-drv/./protocol.c:44: done:
l_usbtrn_get_descriptor_00103: l_usbtrn_get_descriptor_00103:
;source-doc/base-drv/./protocol.c:45: }
;source-doc/base-drv/./protocol.c:45: return result;
ld hl,_result
ld l, (hl)
;source-doc/base-drv/./protocol.c:46: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
@ -149,7 +149,7 @@ _cmd_get_device_descriptor:
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
DEFW +0x0008 DEFW +0x0008
;source-doc/base-drv/./protocol.c:53: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) {
;source-doc/base-drv/./protocol.c:54: usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) {
; --------------------------------- ; ---------------------------------
; Function usbtrn_get_descriptor2 ; Function usbtrn_get_descriptor2
; --------------------------------- ; ---------------------------------
@ -157,34 +157,33 @@ _usbtrn_get_descriptor2:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
ld hl, -13
ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/./protocol.c:56: cmd = cmd_get_device_descriptor; ;source-doc/base-drv/./protocol.c:56: cmd = cmd_get_device_descriptor;
ld hl,2
ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_cmd_get_device_descriptor ld hl,_cmd_get_device_descriptor
ld bc,0x0008 ld bc,0x0008
ldir ldir
;source-doc/base-drv/./protocol.c:57: cmd.wLength = 8; ;source-doc/base-drv/./protocol.c:57: cmd.wLength = 8;
ld (ix-5),0x08
ld (ix-2),0x08
xor a xor a
ld (ix-4),a
;source-doc/base-drv/./protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8);
ld a,(ix+4)
ld (ix-2),a
ld a,(ix+5)
ld (ix-1),a ld (ix-1),a
ld c,(ix-2)
ld b,(ix-1)
;source-doc/base-drv/./protocol.c:59: result = usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, 8);
ld c,(ix+4)
ld b,(ix+5)
ld e, c
ld d, b
push bc
ld a,0x08 ld a,0x08
push af push af
inc sp inc sp
ld a,(ix+6) ld a,(ix+6)
push af push af
inc sp inc sp
push bc
push de
ld hl,6 ld hl,6
add hl, sp add hl, sp
push hl push hl
@ -192,59 +191,57 @@ _usbtrn_get_descriptor2:
pop af pop af
pop af pop af
pop af pop af
ld (ix-12),l
ld (ix-3),l
pop bc
ld a, l
ld (_result), a
;source-doc/base-drv/./protocol.c:61: CHECK(result); ;source-doc/base-drv/./protocol.c:61: CHECK(result);
ld a,(ix-12)
ld a,(_result)
or a or a
jr Z,l_usbtrn_get_descriptor2_00102
ld l,(ix-3)
jr l_usbtrn_get_descriptor2_00103
l_usbtrn_get_descriptor2_00102:
jr NZ,l_usbtrn_get_descriptor2_00103
;source-doc/base-drv/./protocol.c:63: cmd = cmd_get_device_descriptor; ;source-doc/base-drv/./protocol.c:63: cmd = cmd_get_device_descriptor;
ex de, hl
ld hl,2
ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
push bc
ld hl,_cmd_get_device_descriptor ld hl,_cmd_get_device_descriptor
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc
;source-doc/base-drv/./protocol.c:64: cmd.wLength = 18; ;source-doc/base-drv/./protocol.c:64: cmd.wLength = 18;
ld (ix-5),0x12
ld (ix-2),0x12
xor a xor a
ld (ix-4),a
ld (ix-1),a
;source-doc/base-drv/./protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); ;source-doc/base-drv/./protocol.c:65: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0));
ld a,(ix+4)
ld (ix-13),a
ld a,(ix+5)
ld (ix-12),a
pop hl
push hl
ld de,0x0007
ld e,(ix+4)
ld d,(ix+5)
ld hl,7
add hl, de add hl, de
ld a, (hl) ld a, (hl)
ld (ix-3),a
push af push af
inc sp inc sp
ld a,(ix+6) ld a,(ix+6)
push af push af
inc sp inc sp
ld l,(ix-2)
ld h,(ix-1)
push hl
ld hl,6
push bc
ld hl,4
add hl, sp add hl, sp
push hl push hl
call _usb_control_transfer call _usb_control_transfer
pop af pop af
pop af pop af
pop af pop af
ld a, l
ld (_result), a
;source-doc/base-drv/./protocol.c:66: done:
l_usbtrn_get_descriptor2_00103: l_usbtrn_get_descriptor2_00103:
;source-doc/base-drv/./protocol.c:66: }
;source-doc/base-drv/./protocol.c:67: return result;
ld hl,_result
ld l, (hl)
;source-doc/base-drv/./protocol.c:68: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./protocol.c:76: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall {
;source-doc/base-drv/./protocol.c:78: usb_error usbtrn_set_address(const uint8_t device_address) __z88dk_fastcall {
; --------------------------------- ; ---------------------------------
; Function usbtrn_set_address ; Function usbtrn_set_address
; --------------------------------- ; ---------------------------------
@ -257,7 +254,7 @@ _usbtrn_set_address:
push af push af
push af push af
ld c, l ld c, l
;source-doc/base-drv/./protocol.c:78: cmd = cmd_set_device_address;
;source-doc/base-drv/./protocol.c:80: cmd = cmd_set_device_address;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -266,9 +263,9 @@ _usbtrn_set_address:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc pop bc
;source-doc/base-drv/./protocol.c:79: cmd.bValue[0] = device_address;
;source-doc/base-drv/./protocol.c:81: cmd.bValue[0] = device_address;
ld (ix-6),c ld (ix-6),c
;source-doc/base-drv/./protocol.c:81: return usb_control_transfer(&cmd, 0, 0, 0);
;source-doc/base-drv/./protocol.c:83: return usb_control_transfer(&cmd, 0, 0, 0);
xor a xor a
push af push af
inc sp inc sp
@ -281,7 +278,7 @@ _usbtrn_set_address:
add hl, sp add hl, sp
push hl push hl
call _usb_control_transfer call _usb_control_transfer
;source-doc/base-drv/./protocol.c:82: }
;source-doc/base-drv/./protocol.c:84: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
@ -293,7 +290,7 @@ _cmd_set_device_address:
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
DEFW +0x0000 DEFW +0x0000
;source-doc/base-drv/./protocol.c:92: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) {
;source-doc/base-drv/./protocol.c:94: usb_error usbtrn_set_configuration(const uint8_t device_address, const uint8_t max_packet_size, const uint8_t configuration) {
; --------------------------------- ; ---------------------------------
; Function usbtrn_set_configuration ; Function usbtrn_set_configuration
; --------------------------------- ; ---------------------------------
@ -304,7 +301,7 @@ _usbtrn_set_configuration:
ld hl, -8 ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/./protocol.c:94: cmd = cmd_set_configuration;
;source-doc/base-drv/./protocol.c:96: cmd = cmd_set_configuration;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld c, l ld c, l
@ -316,10 +313,10 @@ _usbtrn_set_configuration:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc pop bc
;source-doc/base-drv/./protocol.c:95: cmd.bValue[0] = configuration;
;source-doc/base-drv/./protocol.c:97: cmd.bValue[0] = configuration;
ld a,(ix+6) ld a,(ix+6)
ld (ix-6),a ld (ix-6),a
;source-doc/base-drv/./protocol.c:97: return usb_control_transfer(&cmd, 0, device_address, max_packet_size);
;source-doc/base-drv/./protocol.c:99: return usb_control_transfer(&cmd, 0, device_address, max_packet_size);
ld h,(ix+5) ld h,(ix+5)
ld l,(ix+4) ld l,(ix+4)
push hl push hl
@ -327,7 +324,7 @@ _usbtrn_set_configuration:
push hl push hl
push bc push bc
call _usb_control_transfer call _usb_control_transfer
;source-doc/base-drv/./protocol.c:98: }
;source-doc/base-drv/./protocol.c:100: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
@ -339,7 +336,7 @@ _cmd_set_configuration:
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
DEFW +0x0000 DEFW +0x0000
;source-doc/base-drv/./protocol.c:112: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer,
;source-doc/base-drv/./protocol.c:114: usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer,
; --------------------------------- ; ---------------------------------
; Function usbtrn_get_config_descriptor ; Function usbtrn_get_config_descriptor
; --------------------------------- ; ---------------------------------
@ -350,7 +347,7 @@ _usbtrn_get_config_descriptor:
ld hl, -8 ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/./protocol.c:118: cmd = cmd_get_config_descriptor;
;source-doc/base-drv/./protocol.c:120: cmd = cmd_get_config_descriptor;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld c, l ld c, l
@ -362,14 +359,14 @@ _usbtrn_get_config_descriptor:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc pop bc
;source-doc/base-drv/./protocol.c:119: cmd.bValue[0] = config_index;
;source-doc/base-drv/./protocol.c:121: cmd.bValue[0] = config_index;
ld a,(ix+6) ld a,(ix+6)
ld (ix-6),a ld (ix-6),a
;source-doc/base-drv/./protocol.c:120: cmd.wLength = (uint16_t)buffer_size;
;source-doc/base-drv/./protocol.c:122: cmd.wLength = (uint16_t)buffer_size;
ld e,(ix+7) ld e,(ix+7)
ld (ix-2),e ld (ix-2),e
ld (ix-1),0x00 ld (ix-1),0x00
;source-doc/base-drv/./protocol.c:122: RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size));
;source-doc/base-drv/./protocol.c:124: return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size);
ld e,(ix+4) ld e,(ix+4)
ld d,(ix+5) ld d,(ix+5)
ld h,(ix+9) ld h,(ix+9)
@ -378,7 +375,7 @@ _usbtrn_get_config_descriptor:
push de push de
push bc push bc
call _usb_control_transfer call _usb_control_transfer
;source-doc/base-drv/./protocol.c:123: }
;source-doc/base-drv/./protocol.c:125: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
@ -390,7 +387,7 @@ _cmd_get_config_descriptor:
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
DEFW +0x0000 DEFW +0x0000
;source-doc/base-drv/./protocol.c:125: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index,
;source-doc/base-drv/./protocol.c:127: usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index,
; --------------------------------- ; ---------------------------------
; Function usbtrn_gfull_cfg_desc ; Function usbtrn_gfull_cfg_desc
; --------------------------------- ; ---------------------------------
@ -398,7 +395,7 @@ _usbtrn_gfull_cfg_desc:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./protocol.c:133: max_packet_size));
;source-doc/base-drv/./protocol.c:134: max_packet_size));
ld c,(ix+8) ld c,(ix+8)
ld b,(ix+9) ld b,(ix+9)
push bc push bc
@ -418,22 +415,24 @@ _usbtrn_gfull_cfg_desc:
pop af pop af
pop bc pop bc
ld a, l ld a, l
ld (_result), a
ld a,(_result)
or a or a
jr NZ,l_usbtrn_gfull_cfg_desc_00107 jr NZ,l_usbtrn_gfull_cfg_desc_00107
;source-doc/base-drv/./protocol.c:135: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength;
;source-doc/base-drv/./protocol.c:136: uint8_t max_length = ((config_descriptor *)buffer)->wTotalLength;
ld l, c ld l, c
ld h, b ld h, b
inc hl inc hl
inc hl inc hl
ld d, (hl) ld d, (hl)
;source-doc/base-drv/./protocol.c:136: if (max_length > max_buffer_size)
;source-doc/base-drv/./protocol.c:137: if (max_length > max_buffer_size)
ld a,(ix+7) ld a,(ix+7)
sub d sub d
jr NC,l_usbtrn_gfull_cfg_desc_00104 jr NC,l_usbtrn_gfull_cfg_desc_00104
;source-doc/base-drv/./protocol.c:137: max_length = max_buffer_size;
;source-doc/base-drv/./protocol.c:138: max_length = max_buffer_size;
ld d,(ix+7) ld d,(ix+7)
l_usbtrn_gfull_cfg_desc_00104: l_usbtrn_gfull_cfg_desc_00104:
;source-doc/base-drv/./protocol.c:139: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size));
;source-doc/base-drv/./protocol.c:140: CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size));
ld h,(ix+6) ld h,(ix+6)
ld l,(ix+5) ld l,(ix+5)
push hl push hl
@ -448,15 +447,23 @@ l_usbtrn_gfull_cfg_desc_00104:
pop af pop af
pop af pop af
ld a, l ld a, l
;source-doc/base-drv/./protocol.c:141: return USB_ERR_OK;
ld (_result), a
ld a,(_result)
;source-doc/base-drv/./protocol.c:142: return USB_ERR_OK;
or a or a
jr NZ,l_usbtrn_gfull_cfg_desc_00107 jr NZ,l_usbtrn_gfull_cfg_desc_00107
ld l,a ld l,a
jr l_usbtrn_gfull_cfg_desc_00108
;source-doc/base-drv/./protocol.c:143: done:
l_usbtrn_gfull_cfg_desc_00107: l_usbtrn_gfull_cfg_desc_00107:
;source-doc/base-drv/./protocol.c:142: }
;source-doc/base-drv/./protocol.c:144: return result;
ld hl,_result
ld l, (hl)
l_usbtrn_gfull_cfg_desc_00108:
;source-doc/base-drv/./protocol.c:145: }
pop ix pop ix
ret ret
;source-doc/base-drv/./protocol.c:146: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) {
;source-doc/base-drv/./protocol.c:149: usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_t device_address, const uint8_t max_packet_size) {
; --------------------------------- ; ---------------------------------
; Function usbtrn_clear_endpoint_halt ; Function usbtrn_clear_endpoint_halt
; --------------------------------- ; ---------------------------------
@ -467,7 +474,7 @@ _usbtrn_clear_endpoint_halt:
ld hl, -8 ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/./protocol.c:148: cmd = usb_cmd_clear_endpoint_halt;
;source-doc/base-drv/./protocol.c:151: cmd = usb_cmd_clear_endpoint_halt;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld c, l ld c, l
@ -479,10 +486,10 @@ _usbtrn_clear_endpoint_halt:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc pop bc
;source-doc/base-drv/./protocol.c:149: cmd.bIndex[0] = endpoint_number;
;source-doc/base-drv/./protocol.c:152: cmd.bIndex[0] = endpoint_number;
ld a,(ix+4) ld a,(ix+4)
ld (ix-4),a ld (ix-4),a
;source-doc/base-drv/./protocol.c:151: usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size);
;source-doc/base-drv/./protocol.c:154: return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size);
ld h,(ix+6) ld h,(ix+6)
ld l,(ix+5) ld l,(ix+5)
push hl push hl
@ -490,8 +497,7 @@ _usbtrn_clear_endpoint_halt:
push hl push hl
push bc push bc
call _usb_control_transfer call _usb_control_transfer
;source-doc/base-drv/./protocol.c:153: RETURN_CHECK(result);
;source-doc/base-drv/./protocol.c:154: }
;source-doc/base-drv/./protocol.c:155: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret

202
Source/HBIOS/ch376-native/base-drv/transfers.c.s

@ -139,14 +139,15 @@ _usb_control_transfer:
jr NZ,l_usb_control_transfer_00102 jr NZ,l_usb_control_transfer_00102
;source-doc/base-drv/./transfers.c:57: return USB_ERR_OTHER; ;source-doc/base-drv/./transfers.c:57: return USB_ERR_OTHER;
ld l,0x0f ld l,0x0f
jp l_usb_control_transfer_00113
jp l_usb_control_transfer_00114
l_usb_control_transfer_00102: l_usb_control_transfer_00102:
;source-doc/base-drv/./transfers.c:59: ch_set_usb_address(device_address);
;source-doc/base-drv/./transfers.c:59: critical_begin();
push bc push bc
call _critical_begin
ld l,(ix+8) ld l,(ix+8)
call _ch_set_usb_address call _ch_set_usb_address
pop bc pop bc
;source-doc/base-drv/./transfers.c:61: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet));
;source-doc/base-drv/./transfers.c:63: ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet));
ld e,(ix+4) ld e,(ix+4)
ld d,(ix+5) ld d,(ix+5)
push bc push bc
@ -160,25 +161,25 @@ l_usb_control_transfer_00102:
call _ch_issue_token_setup call _ch_issue_token_setup
call _ch_short_wait_int_and_get_stat call _ch_short_wait_int_and_get_stat
pop bc pop bc
;source-doc/base-drv/./transfers.c:64: CHECK(result);
;source-doc/base-drv/./transfers.c:66: CHECK(result);
ld a, l ld a, l
or a or a
jr NZ,l_usb_control_transfer_00113 jr NZ,l_usb_control_transfer_00113
;source-doc/base-drv/./transfers.c:66: const uint16_t length = cmd_packet->wLength;
;source-doc/base-drv/./transfers.c:68: const uint16_t length = cmd_packet->wLength;
ld hl,6 ld hl,6
add hl, bc add hl, bc
ld c, (hl) ld c, (hl)
inc hl inc hl
ld b, (hl) ld b, (hl)
;source-doc/base-drv/./transfers.c:69: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint))
;source-doc/base-drv/./transfers.c:71: ? (transferIn ? ch_data_in_transfer(buffer, length, &endpoint) : ch_data_out_transfer(buffer, length, &endpoint))
ld a, b ld a, b
or c or c
jr Z,l_usb_control_transfer_00115
jr Z,l_usb_control_transfer_00116
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
ld a,(ix-1) ld a,(ix-1)
or a or a
jr Z,l_usb_control_transfer_00117
jr Z,l_usb_control_transfer_00118
ld hl,0 ld hl,0
add hl, sp add hl, sp
push hl push hl
@ -188,8 +189,8 @@ l_usb_control_transfer_00102:
pop af pop af
pop af pop af
pop af pop af
jr l_usb_control_transfer_00118
l_usb_control_transfer_00117:
jr l_usb_control_transfer_00119
l_usb_control_transfer_00118:
ld hl,0 ld hl,0
add hl, sp add hl, sp
push hl push hl
@ -199,59 +200,62 @@ l_usb_control_transfer_00117:
pop af pop af
pop af pop af
pop af pop af
l_usb_control_transfer_00118:
jr l_usb_control_transfer_00116
l_usb_control_transfer_00115:
;source-doc/base-drv/./transfers.c:70: : USB_ERR_OK;
ld l,0x00
l_usb_control_transfer_00119:
jr l_usb_control_transfer_00117
l_usb_control_transfer_00116: l_usb_control_transfer_00116:
;source-doc/base-drv/./transfers.c:72: CHECK(result)
;source-doc/base-drv/./transfers.c:72: : USB_ERR_OK;
ld l,0x00
l_usb_control_transfer_00117:
;source-doc/base-drv/./transfers.c:74: CHECK(result)
ld a, l ld a, l
or a or a
jr NZ,l_usb_control_transfer_00113 jr NZ,l_usb_control_transfer_00113
;source-doc/base-drv/./transfers.c:74: if (transferIn) {
;source-doc/base-drv/./transfers.c:76: if (transferIn) {
ld a,(ix-1) ld a,(ix-1)
or a or a
jr Z,l_usb_control_transfer_00112 jr Z,l_usb_control_transfer_00112
;source-doc/base-drv/./transfers.c:75: ch_command(CH_CMD_WR_HOST_DATA);
;source-doc/base-drv/./transfers.c:77: ch_command(CH_CMD_WR_HOST_DATA);
ld l,0x2c ld l,0x2c
call _ch_command call _ch_command
;source-doc/base-drv/./transfers.c:76: CH376_DATA_PORT = 0;
;source-doc/base-drv/./transfers.c:78: CH376_DATA_PORT = 0;
ld a,0x00 ld a,0x00
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/base-drv/./transfers.c:77: delay();
call _delay
;source-doc/base-drv/./transfers.c:78: ch_issue_token_out_ep0();
;source-doc/base-drv/./transfers.c:79: ch_issue_token_out_ep0();
call _ch_issue_token_out_ep0 call _ch_issue_token_out_ep0
;source-doc/base-drv/./transfers.c:79: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */
;source-doc/base-drv/./transfers.c:80: result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */
call _ch_long_wait_int_and_get_statu call _ch_long_wait_int_and_get_statu
;source-doc/base-drv/./transfers.c:81: if (result == USB_ERR_OK || result == USB_ERR_STALL)
;source-doc/base-drv/./transfers.c:82: if (result == USB_ERR_OK || result == USB_ERR_STALL) {
ld a, l ld a, l
or a or a
jr Z,l_usb_control_transfer_00108 jr Z,l_usb_control_transfer_00108
ld a, l ld a, l
sub 0x02 sub 0x02
jr NZ,l_usb_control_transfer_00109
jr NZ,l_usb_control_transfer_00113
l_usb_control_transfer_00108: l_usb_control_transfer_00108:
;source-doc/base-drv/./transfers.c:82: return USB_ERR_OK;
;source-doc/base-drv/./transfers.c:83: result = USB_ERR_OK;
ld l,0x00 ld l,0x00
;source-doc/base-drv/./transfers.c:84: goto done;
jr l_usb_control_transfer_00113 jr l_usb_control_transfer_00113
l_usb_control_transfer_00109:
;source-doc/base-drv/./transfers.c:84: RETURN_CHECK(result);
jr l_usb_control_transfer_00113
;source-doc/base-drv/./transfers.c:87: RETURN_CHECK(result);
l_usb_control_transfer_00112: l_usb_control_transfer_00112:
;source-doc/base-drv/./transfers.c:87: ch_issue_token_in_ep0();
;source-doc/base-drv/./transfers.c:90: ch_issue_token_in_ep0();
call _ch_issue_token_in_ep0 call _ch_issue_token_in_ep0
;source-doc/base-drv/./transfers.c:88: result = ch_long_wait_int_and_get_status();
;source-doc/base-drv/./transfers.c:91: result = ch_long_wait_int_and_get_status();
call _ch_long_wait_int_and_get_statu call _ch_long_wait_int_and_get_statu
;source-doc/base-drv/./transfers.c:90: RETURN_CHECK(result);
;source-doc/base-drv/./transfers.c:95: done:
l_usb_control_transfer_00113: l_usb_control_transfer_00113:
;source-doc/base-drv/./transfers.c:91: }
;source-doc/base-drv/./transfers.c:96: critical_end();
push hl
call _critical_end
pop hl
;source-doc/base-drv/./transfers.c:97: return result;
l_usb_control_transfer_00114:
;source-doc/base-drv/./transfers.c:98: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/./transfers.c:94: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
;source-doc/base-drv/./transfers.c:101: usb_dat_in_trnsfer_ext(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function usb_dat_in_trnsfer_ext ; Function usb_dat_in_trnsfer_ext
; --------------------------------- ; ---------------------------------
@ -259,26 +263,26 @@ _usb_dat_in_trnsfer_ext:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./transfers.c:95: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS)
;source-doc/base-drv/./transfers.c:102: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS)
ld a,(ix+5) ld a,(ix+5)
or (ix+4) or (ix+4)
jr Z,l_usb_dat_in_trnsfer_ext_00102 jr Z,l_usb_dat_in_trnsfer_ext_00102
ld a,(ix+5) ld a,(ix+5)
sub 0x80 sub 0x80
jr NC,l_usb_dat_in_trnsfer_ext_00102 jr NC,l_usb_dat_in_trnsfer_ext_00102
;source-doc/base-drv/./transfers.c:96: return USB_BAD_ADDRESS;
;source-doc/base-drv/./transfers.c:103: return USB_BAD_ADDRESS;
ld l,0x82 ld l,0x82
jr l_usb_dat_in_trnsfer_ext_00106 jr l_usb_dat_in_trnsfer_ext_00106
l_usb_dat_in_trnsfer_ext_00102: l_usb_dat_in_trnsfer_ext_00102:
;source-doc/base-drv/./transfers.c:98: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS)
;source-doc/base-drv/./transfers.c:105: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS)
ld a,(ix+10) ld a,(ix+10)
sub 0x80 sub 0x80
jr NC,l_usb_dat_in_trnsfer_ext_00105 jr NC,l_usb_dat_in_trnsfer_ext_00105
;source-doc/base-drv/./transfers.c:99: return USB_BAD_ADDRESS;
;source-doc/base-drv/./transfers.c:106: return USB_BAD_ADDRESS;
ld l,0x82 ld l,0x82
jr l_usb_dat_in_trnsfer_ext_00106 jr l_usb_dat_in_trnsfer_ext_00106
l_usb_dat_in_trnsfer_ext_00105: l_usb_dat_in_trnsfer_ext_00105:
;source-doc/base-drv/./transfers.c:101: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint);
;source-doc/base-drv/./transfers.c:108: return usb_data_in_transfer(buffer, buffer_size, device_address, endpoint);
ld l,(ix+9) ld l,(ix+9)
ld h,(ix+10) ld h,(ix+10)
push hl push hl
@ -297,10 +301,10 @@ l_usb_dat_in_trnsfer_ext_00105:
pop af pop af
inc sp inc sp
l_usb_dat_in_trnsfer_ext_00106: l_usb_dat_in_trnsfer_ext_00106:
;source-doc/base-drv/./transfers.c:102: }
;source-doc/base-drv/./transfers.c:109: }
pop ix pop ix
ret ret
;source-doc/base-drv/./transfers.c:105: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
;source-doc/base-drv/./transfers.c:112: usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function usb_dat_in_trns_n_ext ; Function usb_dat_in_trns_n_ext
; --------------------------------- ; ---------------------------------
@ -308,34 +312,34 @@ _usb_dat_in_trns_n_ext:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./transfers.c:106: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0)
;source-doc/base-drv/./transfers.c:113: if (buffer != 0 && ((uint16_t)buffer & 0xC000) == 0)
ld a,(ix+5) ld a,(ix+5)
or (ix+4) or (ix+4)
jr Z,l_usb_dat_in_trns_n_ext_00102 jr Z,l_usb_dat_in_trns_n_ext_00102
ld a,(ix+5) ld a,(ix+5)
and 0xc0 and 0xc0
jr NZ,l_usb_dat_in_trns_n_ext_00102 jr NZ,l_usb_dat_in_trns_n_ext_00102
;source-doc/base-drv/./transfers.c:107: return USB_BAD_ADDRESS;
;source-doc/base-drv/./transfers.c:114: return USB_BAD_ADDRESS;
ld l,0x82 ld l,0x82
jr l_usb_dat_in_trns_n_ext_00108 jr l_usb_dat_in_trns_n_ext_00108
l_usb_dat_in_trns_n_ext_00102: l_usb_dat_in_trns_n_ext_00102:
;source-doc/base-drv/./transfers.c:109: if (((uint16_t)endpoint & 0xC000) == 0)
;source-doc/base-drv/./transfers.c:116: if (((uint16_t)endpoint & 0xC000) == 0)
ld a,(ix+10) ld a,(ix+10)
and 0xc0 and 0xc0
jr NZ,l_usb_dat_in_trns_n_ext_00105 jr NZ,l_usb_dat_in_trns_n_ext_00105
;source-doc/base-drv/./transfers.c:110: return USB_BAD_ADDRESS;
;source-doc/base-drv/./transfers.c:117: return USB_BAD_ADDRESS;
ld l,0x82 ld l,0x82
jr l_usb_dat_in_trns_n_ext_00108 jr l_usb_dat_in_trns_n_ext_00108
l_usb_dat_in_trns_n_ext_00105: l_usb_dat_in_trns_n_ext_00105:
;source-doc/base-drv/./transfers.c:112: if (((uint16_t)buffer_size & 0xC000) == 0)
;source-doc/base-drv/./transfers.c:119: if (((uint16_t)buffer_size & 0xC000) == 0)
ld a,(ix+7) ld a,(ix+7)
and 0xc0 and 0xc0
jr NZ,l_usb_dat_in_trns_n_ext_00107 jr NZ,l_usb_dat_in_trns_n_ext_00107
;source-doc/base-drv/./transfers.c:113: return USB_BAD_ADDRESS;
;source-doc/base-drv/./transfers.c:120: return USB_BAD_ADDRESS;
ld l,0x82 ld l,0x82
jr l_usb_dat_in_trns_n_ext_00108 jr l_usb_dat_in_trns_n_ext_00108
l_usb_dat_in_trns_n_ext_00107: l_usb_dat_in_trns_n_ext_00107:
;source-doc/base-drv/./transfers.c:115: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint);
;source-doc/base-drv/./transfers.c:122: return usb_data_in_transfer_n(buffer, buffer_size, device_address, endpoint);
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
ld l,(ix+9) ld l,(ix+9)
@ -354,10 +358,10 @@ l_usb_dat_in_trns_n_ext_00107:
pop af pop af
inc sp inc sp
l_usb_dat_in_trns_n_ext_00108: l_usb_dat_in_trns_n_ext_00108:
;source-doc/base-drv/./transfers.c:116: }
;source-doc/base-drv/./transfers.c:123: }
pop ix pop ix
ret ret
;source-doc/base-drv/./transfers.c:128: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
;source-doc/base-drv/./transfers.c:135: usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function usb_data_in_transfer ; Function usb_data_in_transfer
; --------------------------------- ; ---------------------------------
@ -365,10 +369,12 @@ _usb_data_in_transfer:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./transfers.c:129: ch_set_usb_address(device_address);
;source-doc/base-drv/./transfers.c:136: critical_begin();
call _critical_begin
;source-doc/base-drv/./transfers.c:138: ch_set_usb_address(device_address);
ld l,(ix+8) ld l,(ix+8)
call _ch_set_usb_address call _ch_set_usb_address
;source-doc/base-drv/./transfers.c:131: return ch_data_in_transfer(buffer, buffer_size, endpoint);
;source-doc/base-drv/./transfers.c:140: result = ch_data_in_transfer(buffer, buffer_size, endpoint);
ld l,(ix+9) ld l,(ix+9)
ld h,(ix+10) ld h,(ix+10)
push hl push hl
@ -382,10 +388,17 @@ _usb_data_in_transfer:
pop af pop af
pop af pop af
pop af pop af
;source-doc/base-drv/./transfers.c:132: }
ld a, l
ld (_result), a
;source-doc/base-drv/./transfers.c:142: critical_end();
call _critical_end
;source-doc/base-drv/./transfers.c:144: return result;
ld hl,_result
ld l, (hl)
;source-doc/base-drv/./transfers.c:145: }
pop ix pop ix
ret ret
;source-doc/base-drv/./transfers.c:144: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
;source-doc/base-drv/./transfers.c:157: usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function usb_data_in_transfer_n ; Function usb_data_in_transfer_n
; --------------------------------- ; ---------------------------------
@ -393,10 +406,12 @@ _usb_data_in_transfer_n:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./transfers.c:145: ch_set_usb_address(device_address);
;source-doc/base-drv/./transfers.c:158: critical_begin();
call _critical_begin
;source-doc/base-drv/./transfers.c:160: ch_set_usb_address(device_address);
ld l,(ix+8) ld l,(ix+8)
call _ch_set_usb_address call _ch_set_usb_address
;source-doc/base-drv/./transfers.c:147: return ch_data_in_transfer_n(buffer, buffer_size, endpoint);
;source-doc/base-drv/./transfers.c:162: result = ch_data_in_transfer_n(buffer, buffer_size, endpoint);
ld l,(ix+9) ld l,(ix+9)
ld h,(ix+10) ld h,(ix+10)
push hl push hl
@ -410,59 +425,17 @@ _usb_data_in_transfer_n:
pop af pop af
pop af pop af
pop af pop af
;source-doc/base-drv/./transfers.c:148: }
pop ix
ret
;source-doc/base-drv/./transfers.c:151: usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
; ---------------------------------
; Function usb_dat_out_trns_ext
; ---------------------------------
_usb_dat_out_trns_ext:
push ix
ld ix,0
add ix,sp
;source-doc/base-drv/./transfers.c:153: if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS)
ld a,(ix+5)
or (ix+4)
jr Z,l_usb_dat_out_trns_ext_00102
ld a,(ix+5)
sub 0x80
jr NC,l_usb_dat_out_trns_ext_00102
;source-doc/base-drv/./transfers.c:154: return USB_BAD_ADDRESS;
ld l,0x82
jr l_usb_dat_out_trns_ext_00106
l_usb_dat_out_trns_ext_00102:
;source-doc/base-drv/./transfers.c:156: if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS)
ld a,(ix+10)
sub 0x80
jr NC,l_usb_dat_out_trns_ext_00105
;source-doc/base-drv/./transfers.c:157: return USB_BAD_ADDRESS;
ld l,0x82
jr l_usb_dat_out_trns_ext_00106
l_usb_dat_out_trns_ext_00105:
;source-doc/base-drv/./transfers.c:159: return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint);
ld l,(ix+9)
ld h,(ix+10)
push hl
ld a,(ix+8)
push af
inc sp
ld l,(ix+6)
ld h,(ix+7)
push hl
ld l,(ix+4)
ld h,(ix+5)
push hl
call _usb_data_out_transfer
pop af
pop af
pop af
inc sp
l_usb_dat_out_trns_ext_00106:
;source-doc/base-drv/./transfers.c:160: }
ld a, l
ld (_result), a
;source-doc/base-drv/./transfers.c:164: critical_end();
call _critical_end
;source-doc/base-drv/./transfers.c:166: return result;
ld hl,_result
ld l, (hl)
;source-doc/base-drv/./transfers.c:167: }
pop ix pop ix
ret ret
;source-doc/base-drv/./transfers.c:172: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
;source-doc/base-drv/./transfers.c:179: usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
; --------------------------------- ; ---------------------------------
; Function usb_data_out_transfer ; Function usb_data_out_transfer
; --------------------------------- ; ---------------------------------
@ -470,10 +443,12 @@ _usb_data_out_transfer:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/base-drv/./transfers.c:173: ch_set_usb_address(device_address);
;source-doc/base-drv/./transfers.c:180: critical_begin();
call _critical_begin
;source-doc/base-drv/./transfers.c:182: ch_set_usb_address(device_address);
ld l,(ix+8) ld l,(ix+8)
call _ch_set_usb_address call _ch_set_usb_address
;source-doc/base-drv/./transfers.c:175: return ch_data_out_transfer(buffer, buffer_size, endpoint);
;source-doc/base-drv/./transfers.c:184: result = ch_data_out_transfer(buffer, buffer_size, endpoint);
ld l,(ix+9) ld l,(ix+9)
ld h,(ix+10) ld h,(ix+10)
push hl push hl
@ -487,6 +462,13 @@ _usb_data_out_transfer:
pop af pop af
pop af pop af
pop af pop af
;source-doc/base-drv/./transfers.c:176: }
ld a, l
ld (_result), a
;source-doc/base-drv/./transfers.c:186: critical_end();
call _critical_end
;source-doc/base-drv/./transfers.c:188: return result;
ld hl,_result
ld l, (hl)
;source-doc/base-drv/./transfers.c:189: }
pop ix pop ix
ret ret

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

@ -68,21 +68,17 @@ _usb_host_bus_reset:
call _ch_cmd_set_usb_mode call _ch_cmd_set_usb_mode
;source-doc/base-drv/./usb-init.c:16: delay_20ms(); ;source-doc/base-drv/./usb-init.c:16: delay_20ms();
call _delay_20ms call _delay_20ms
;source-doc/base-drv/./ch376.h:160: ch_command(CH_CMD_WRITE_VAR8);
;source-doc/base-drv/./ch376.h:163: ch_command(CH_CMD_WRITE_VAR8);
ld l,0x0b ld l,0x0b
call _ch_command call _ch_command
;source-doc/base-drv/./ch376.h:161: CH376_DATA_PORT = CH_VAR_RETRY_TIMES;
;source-doc/base-drv/./ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES;
ld a,0x25 ld a,0x25
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/base-drv/./ch376.h:162: delay();
call _delay
;source-doc/base-drv/./ch376.h:163: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F);
;source-doc/base-drv/./ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F);
ld a,0xdf ld a,0xdf
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/base-drv/./ch376.h:164: delay();
call _delay
;source-doc/base-drv/./usb-init.c:20: return USB_ERR_OK; ;source-doc/base-drv/./usb-init.c:20: return USB_ERR_OK;
ld l,0x00 ld l,0x00
;source-doc/base-drv/./usb-init.c:21: } ;source-doc/base-drv/./usb-init.c:21: }

118
Source/HBIOS/ch376-native/cruntime.asm

@ -27,26 +27,6 @@ _memset_callee:
pop hl pop hl
ret ret
; _strlen_fastcall:
; ; enter: hl = char *s
; ;
; ; exit : hl = length
; ; bc = -(length + 1)
; ; a = 0
; ; z flag set if 0 length
; ; carry reset
; ;
; ; uses : af, bc, hl
; xor a
; ld c,a
; ld b,a
; cpir
; ld hl,$ffff
; sbc hl,bc
; ret
_memcpy_callee: _memcpy_callee:
@ -84,51 +64,83 @@ zero_n:
pop hl pop hl
ret ret
; _strcat_callee:
; pop hl
; pop de
; ex (sp),hl
; ; ===============================================================
; ; Stefano Bodrato
; ; aralbrec: accommodate nmos z80 bug
; ; ===============================================================
; ;
; ; void z80_push_di(void)
; ;
; ; Save the current ei/di status on the stack and disable ints.
; ;
; ; ===============================================================
; ____sdcc_cpu_push_di:
; ; enter : hl = char *s2 = src
; ; de = char *s1 = dst
; ; exit : stack = ei_di_status
; ; ; ;
; ; exit : hl = char *s1 = dst
; ; de = ptr in s1 to terminating 0
; ;
; ; uses : af, bc, de, hl
; ; uses : af
; push de ; save dst
; ex (sp),hl
; push hl
; ex de,hl
; call __str_locate_nul ; a = 0
; ex de,hl
; ld a,i
; loop: ; append s2 to s1
; cp (hl)
; ldi
; jr NZ,loop
; di
; ENDIF
; push af
; pop hl ; hl = ei_di status
; pop af ; af = ret
; ex (sp),hl ; restore hl, push ei_di_status
; push af
; pop hl ; hl = dst
; dec de
; ret ; ret
; __str_locate_nul:
; ; enter : hl = char *s
; ; ===============================================================
; ; Stefano Bodrato
; ; ===============================================================
; ; ; ;
; ; exit : hl = ptr in s to terminating 0
; ; bc = -(strlen + 1)
; ; a = 0
; ; carry reset
; ; void z80_pop_ei(void)
; ; ; ;
; ; uses : af, bc, hl
; ; Pop the ei_di_status from the stack and restore the di/ei
; ; state to what it was previously when a push was called.
; ;
; ; The "ei" in the function name has no bearing on what the
; ; function does; the name is meant to balance "z80_push_di".
; ;
; ; ===============================================================
; ____sdcc_cpu_pop_ei:
; ; enter : stack = ei_di_status, ret
; ;
; ; uses : af
; ex (sp),hl
; pop af ; af = old hl
; ex (sp),hl ; hl = ei_di_status
; push af
; ex (sp),hl ; hl restored
; ____sdcc_cpu_pop_ei_jp:
; ; enter : stack = ret, ei_di_status
; ;
; ; uses : af
; pop af ; af = ei_di_status
; jp PO, di_state
; ei_state:
; ei
; ret
; xor a
; ld c,a
; ld b,a
; cpir
; dec hl
; di_state:
; di
; ret ; ret

1
Source/HBIOS/ch376-native/keyboard.s

@ -1,3 +1,4 @@
; Generated File -- not to be modify directly ; Generated File -- not to be modify directly
#include "ch376-native/keyboard/kyb-init.c.s" #include "ch376-native/keyboard/kyb-init.c.s"
#include "ch376-native/keyboard/class_hid.c.s" #include "ch376-native/keyboard/class_hid.c.s"
#include "ch376-native/keyboard/class_hid_keyboard.c.s"

43
Source/HBIOS/ch376-native/keyboard/class_hid.c.s

@ -61,7 +61,7 @@ _hid_set_protocol:
push af push af
push af push af
ex de, hl ex de, hl
;source-doc/keyboard/./class_hid.c:9: cmd = cmd_hid_set;
;source-doc/keyboard/./class_hid.c:8: cmd = cmd_hid_set;
push de push de
ex de, hl ex de, hl
ld hl,2 ld hl,2
@ -71,12 +71,12 @@ _hid_set_protocol:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop de pop de
;source-doc/keyboard/./class_hid.c:11: cmd.bRequest = HID_SET_PROTOCOL;
;source-doc/keyboard/./class_hid.c:10: cmd.bRequest = HID_SET_PROTOCOL;
ld (ix-7),0x0b ld (ix-7),0x0b
;source-doc/keyboard/./class_hid.c:12: cmd.bValue[0] = protocol;
;source-doc/keyboard/./class_hid.c:11: cmd.bValue[0] = protocol;
ld a,(ix+4) ld a,(ix+4)
ld (ix-6),a ld (ix-6),a
;source-doc/keyboard/./class_hid.c:14: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
;source-doc/keyboard/./class_hid.c:13: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
ld l, e ld l, e
ld h, d ld h, d
inc hl inc hl
@ -103,8 +103,7 @@ _hid_set_protocol:
pop af pop af
pop af pop af
ld a, l ld a, l
;source-doc/keyboard/./class_hid.c:16: RETURN_CHECK(result);
;source-doc/keyboard/./class_hid.c:17: }
;source-doc/keyboard/./class_hid.c:14: }
ld sp, ix ld sp, ix
pop ix pop ix
pop hl pop hl
@ -118,7 +117,7 @@ _cmd_hid_set:
DEFB +0x00 DEFB +0x00
DEFB +0x00 DEFB +0x00
DEFW +0x0000 DEFW +0x0000
;source-doc/keyboard/./class_hid.c:19: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) {
;source-doc/keyboard/./class_hid.c:16: usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) {
; --------------------------------- ; ---------------------------------
; Function hid_set_idle ; Function hid_set_idle
; --------------------------------- ; ---------------------------------
@ -131,7 +130,7 @@ _hid_set_idle:
push af push af
push af push af
ex de, hl ex de, hl
;source-doc/keyboard/./class_hid.c:22: cmd = cmd_hid_set;
;source-doc/keyboard/./class_hid.c:18: cmd = cmd_hid_set;
push de push de
ex de, hl ex de, hl
ld hl,2 ld hl,2
@ -141,12 +140,12 @@ _hid_set_idle:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop de pop de
;source-doc/keyboard/./class_hid.c:24: cmd.bRequest = HID_SET_IDLE;
;source-doc/keyboard/./class_hid.c:20: cmd.bRequest = HID_SET_IDLE;
ld (ix-7),0x0a ld (ix-7),0x0a
;source-doc/keyboard/./class_hid.c:25: cmd.bValue[0] = duration;
;source-doc/keyboard/./class_hid.c:21: cmd.bValue[0] = duration;
ld a,(ix+4) ld a,(ix+4)
ld (ix-6),a ld (ix-6),a
;source-doc/keyboard/./class_hid.c:27: result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
;source-doc/keyboard/./class_hid.c:23: return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
ld l, e ld l, e
ld h, d ld h, d
inc hl inc hl
@ -173,14 +172,13 @@ _hid_set_idle:
pop af pop af
pop af pop af
ld a, l ld a, l
;source-doc/keyboard/./class_hid.c:29: RETURN_CHECK(result);
;source-doc/keyboard/./class_hid.c:30: }
;source-doc/keyboard/./class_hid.c:24: }
ld sp, ix ld sp, ix
pop ix pop ix
pop hl pop hl
inc sp inc sp
jp (hl) jp (hl)
;source-doc/keyboard/./class_hid.c:32: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) {
;source-doc/keyboard/./class_hid.c:26: usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) {
; --------------------------------- ; ---------------------------------
; Function hid_get_input_report ; Function hid_get_input_report
; --------------------------------- ; ---------------------------------
@ -195,7 +193,7 @@ _hid_get_input_report:
ld sp, hl ld sp, hl
ld l, c ld l, c
ld h, b ld h, b
;source-doc/keyboard/./class_hid.c:35: cmd = cmd_hid_set;
;source-doc/keyboard/./class_hid.c:28: cmd = cmd_hid_set;
push de push de
push hl push hl
ex de, hl ex de, hl
@ -207,19 +205,19 @@ _hid_get_input_report:
ldir ldir
pop bc pop bc
pop de pop de
;source-doc/keyboard/./class_hid.c:37: cmd.bmRequestType = 0xA1;
;source-doc/keyboard/./class_hid.c:30: cmd.bmRequestType = 0xA1;
ld (ix-9),0xa1 ld (ix-9),0xa1
;source-doc/keyboard/./class_hid.c:38: cmd.bValue[0] = 1;
;source-doc/keyboard/./class_hid.c:31: cmd.bValue[0] = 1;
ld (ix-7),0x01 ld (ix-7),0x01
;source-doc/keyboard/./class_hid.c:39: cmd.bValue[1] = 1;
;source-doc/keyboard/./class_hid.c:32: cmd.bValue[1] = 1;
ld (ix-6),0x01 ld (ix-6),0x01
;source-doc/keyboard/./class_hid.c:40: cmd.bRequest = HID_GET_REPORT;
;source-doc/keyboard/./class_hid.c:33: cmd.bRequest = HID_GET_REPORT;
ld (ix-8),0x01 ld (ix-8),0x01
;source-doc/keyboard/./class_hid.c:41: cmd.wLength = 8;
;source-doc/keyboard/./class_hid.c:34: cmd.wLength = 8;
ld (ix-3),0x08 ld (ix-3),0x08
xor a xor a
ld (ix-2),a ld (ix-2),a
;source-doc/keyboard/./class_hid.c:43: result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size);
;source-doc/keyboard/./class_hid.c:36: return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size);
ld l, c ld l, c
ld h, b ld h, b
inc hl inc hl
@ -247,8 +245,7 @@ _hid_get_input_report:
pop af pop af
pop af pop af
ld a, l ld a, l
;source-doc/keyboard/./class_hid.c:45: RETURN_CHECK(result);
;source-doc/keyboard/./class_hid.c:46: }
;source-doc/keyboard/./class_hid.c:37: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret

343
Source/HBIOS/ch376-native/keyboard/class_hid_keyboard.c.s

@ -0,0 +1,343 @@
;
; Generated from source-doc/keyboard/./class_hid_keyboard.c.asm -- not to be modify directly
;
;
;--------------------------------------------------------
; File Created by SDCC : free open source ISO C Compiler
; Version 4.4.0 #14648 (Linux)
;--------------------------------------------------------
; Processed by Z88DK
;--------------------------------------------------------
;--------------------------------------------------------
; Public variables in this module
;--------------------------------------------------------
;--------------------------------------------------------
; Externals used
;--------------------------------------------------------
;--------------------------------------------------------
; special function registers
;--------------------------------------------------------
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
;--------------------------------------------------------
; ram data
;--------------------------------------------------------
#IF 0
; .area _INITIALIZED removed by z88dk
_scancodes_shift_table:
DEFS 128
_scancodes_table:
DEFS 128
#ENDIF
;--------------------------------------------------------
; absolute external ram data
;--------------------------------------------------------
;--------------------------------------------------------
; global & static initialisations
;--------------------------------------------------------
;--------------------------------------------------------
; Home
;--------------------------------------------------------
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/keyboard/./class_hid_keyboard.c:335: char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) {
; ---------------------------------
; Function scancode_to_char
; ---------------------------------
_scancode_to_char:
ld c, a
ld e, l
;source-doc/keyboard/./class_hid_keyboard.c:336: if (code >= 0x80)
ld a, e
sub 0x80
jr C,l_scancode_to_char_00102
;source-doc/keyboard/./class_hid_keyboard.c:337: return 0;
xor a
jr l_scancode_to_char_00105
l_scancode_to_char_00102:
;source-doc/keyboard/./class_hid_keyboard.c:339: if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT))
ld a, c
and 0x22
jr Z,l_scancode_to_char_00104
;source-doc/keyboard/./class_hid_keyboard.c:340: return scancodes_shift_table[code];
ld hl,_scancodes_shift_table
ld d,0x00
add hl, de
ld a, (hl)
jr l_scancode_to_char_00105
l_scancode_to_char_00104:
;source-doc/keyboard/./class_hid_keyboard.c:342: return scancodes_table[code];
ld hl,_scancodes_table
ld d,0x00
add hl, de
ld a, (hl)
l_scancode_to_char_00105:
;source-doc/keyboard/./class_hid_keyboard.c:343: }
ret
_scancodes_shift_table:
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x41
DEFB +0x42
DEFB +0x43
DEFB +0x44
DEFB +0x45
DEFB +0x46
DEFB +0x47
DEFB +0x48
DEFB +0x49
DEFB +0x4a
DEFB +0x4b
DEFB +0x4c
DEFB +0x4d
DEFB +0x4e
DEFB +0x4f
DEFB +0x50
DEFB +0x51
DEFB +0x52
DEFB +0x53
DEFB +0x54
DEFB +0x55
DEFB +0x56
DEFB +0x57
DEFB +0x58
DEFB +0x59
DEFB +0x5a
DEFB +0x21
DEFB +0x40
DEFB +0x23
DEFB +0x24
DEFB +0x25
DEFB +0x5e
DEFB +0x26
DEFB +0x2a
DEFB +0x28
DEFB +0x29
DEFB +0x0d
DEFB +0x1b
DEFB +0x08
DEFB +0x09
DEFB +0x20
DEFB +0x5f
DEFB +0x2b
DEFB +0x7b
DEFB +0x7d
DEFB +0x7c
DEFB +0x7e
DEFB +0x3a
DEFB +0x22
DEFB +0x7e
DEFB +0x3c
DEFB +0x3e
DEFB +0x3f
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x2f
DEFB +0x2a
DEFB +0x2d
DEFB +0x2b
DEFB +0x0d
DEFB +0x31
DEFB +0x32
DEFB +0x33
DEFB +0x34
DEFB +0x35
DEFB +0x36
DEFB +0x37
DEFB +0x38
DEFB +0x39
DEFB +0x30
DEFB +0x2e
DEFB +0x5c
DEFB +0x00
DEFB +0x00
DEFB +0x3d
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
_scancodes_table:
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x61
DEFB +0x62
DEFB +0x63
DEFB +0x64
DEFB +0x65
DEFB +0x66
DEFB +0x67
DEFB +0x68
DEFB +0x69
DEFB +0x6a
DEFB +0x6b
DEFB +0x6c
DEFB +0x6d
DEFB +0x6e
DEFB +0x6f
DEFB +0x70
DEFB +0x71
DEFB +0x72
DEFB +0x73
DEFB +0x74
DEFB +0x75
DEFB +0x76
DEFB +0x77
DEFB +0x78
DEFB +0x79
DEFB +0x7a
DEFB +0x31
DEFB +0x32
DEFB +0x33
DEFB +0x34
DEFB +0x35
DEFB +0x36
DEFB +0x37
DEFB +0x38
DEFB +0x39
DEFB +0x30
DEFB +0x0d
DEFB +0x1b
DEFB +0x08
DEFB +0x09
DEFB +0x20
DEFB +0x2d
DEFB +0x3d
DEFB +0x5b
DEFB +0x5d
DEFB +0x5c
DEFB +0x23
DEFB +0x3b
DEFB +0x27
DEFB +0x60
DEFB +0x2c
DEFB +0x2e
DEFB +0x2f
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x2f
DEFB +0x2a
DEFB +0x2d
DEFB +0x2b
DEFB +0x0d
DEFB +0x31
DEFB +0x32
DEFB +0x33
DEFB +0x34
DEFB +0x35
DEFB +0x36
DEFB +0x37
DEFB +0x38
DEFB +0x39
DEFB +0x30
DEFB +0x2e
DEFB +0x5c
DEFB +0x00
DEFB +0x00
DEFB +0x3d
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00
DEFB +0x00

326
Source/HBIOS/ch376-native/keyboard/kyb-init.c.s

@ -33,6 +33,18 @@ _USB_MODULE_LEDS .EQU 0xff8a
; .area _INITIALIZED removed by z88dk ; .area _INITIALIZED removed by z88dk
_keyboard_config:
DEFS 2
_buffer:
DEFS 16
_write_index:
DEFS 1
_read_index:
DEFS 1
_active:
DEFS 1
_report:
DEFS 8
#ENDIF #ENDIF
@ -48,76 +60,81 @@ _USB_MODULE_LEDS .EQU 0xff8a
;-------------------------------------------------------- ;--------------------------------------------------------
; code ; code
;-------------------------------------------------------- ;--------------------------------------------------------
;source-doc/keyboard/./kyb-init.c:8: void keyboard_init(void) {
;source-doc/keyboard/./kyb-init.c:11: void keyboard_init(void) {
; --------------------------------- ; ---------------------------------
; Function keyboard_init ; Function keyboard_init
; --------------------------------- ; ---------------------------------
_keyboard_init: _keyboard_init:
;source-doc/keyboard/./kyb-init.c:10: uint8_t index = 1;
;source-doc/keyboard/./kyb-init.c:11: do {
ld bc,0x0101
;source-doc/keyboard/./kyb-init.c:13: uint8_t index = 1;
ld c,0x01
;source-doc/keyboard/./kyb-init.c:14: keyboard_config = NULL;
xor a
ld hl,_keyboard_config
ld (hl), a
inc hl
ld (hl), a
;source-doc/keyboard/./kyb-init.c:16: do {
ld b,0x01
l_keyboard_init_00105: l_keyboard_init_00105:
;source-doc/keyboard/./kyb-init.c:12: device_config_keyboard *const keyboard_config = (device_config_keyboard *)get_usb_device_config(index);
;source-doc/keyboard/./kyb-init.c:17: keyboard_config = (device_config_keyboard *)get_usb_device_config(index);
push bc push bc
ld a, b ld a, b
call _get_usb_device_config call _get_usb_device_config
ex de, hl
pop bc pop bc
;source-doc/keyboard/./kyb-init.c:14: if (keyboard_config == NULL)
ld a, d
or e
ld (_keyboard_config), hl
;source-doc/keyboard/./kyb-init.c:19: if (keyboard_config == NULL)
ld hl,_keyboard_config + 1
ld a, (hl)
dec hl
or (hl)
jr Z,l_keyboard_init_00107 jr Z,l_keyboard_init_00107
;source-doc/keyboard/./kyb-init.c:17: const usb_device_type t = keyboard_config->type;
ld l, e
ld h, d
;source-doc/keyboard/./kyb-init.c:22: const usb_device_type t = keyboard_config->type;
ld hl, (_keyboard_config)
ld a, (hl) ld a, (hl)
and 0x0f and 0x0f
;source-doc/keyboard/./kyb-init.c:19: if (t == USB_IS_KEYBOARD) {
;source-doc/keyboard/./kyb-init.c:24: if (t == USB_IS_KEYBOARD) {
sub 0x04 sub 0x04
jr NZ,l_keyboard_init_00106 jr NZ,l_keyboard_init_00106
;source-doc/keyboard/./kyb-init.c:20: print_string("\r\nUSB: KEYBOARD @ $");
;source-doc/keyboard/./kyb-init.c:25: print_string("\r\nUSB: KEYBOARD @ $");
push bc push bc
push de
ld hl,kyb_init_str_0 ld hl,kyb_init_str_0
call _print_string call _print_string
pop de
pop bc pop bc
;source-doc/keyboard/./kyb-init.c:21: print_uint16(index);
;source-doc/keyboard/./kyb-init.c:26: print_uint16(index);
ld h,0x00 ld h,0x00
push de
ld l, c ld l, c
call _print_uint16 call _print_uint16
;source-doc/keyboard/./kyb-init.c:27: print_string(" $");
ld hl,kyb_init_str_1 ld hl,kyb_init_str_1
call _print_string call _print_string
pop de
;source-doc/keyboard/./kyb-init.c:25: hid_set_protocol(keyboard_config, 1);
push de
;source-doc/keyboard/./kyb-init.c:29: hid_set_protocol(keyboard_config, 1);
ld a,0x01 ld a,0x01
push af push af
inc sp inc sp
ex de,hl
ld hl, (_keyboard_config)
call _hid_set_protocol call _hid_set_protocol
pop de
;source-doc/keyboard/./kyb-init.c:26: hid_set_idle(keyboard_config, 0x80);
;source-doc/keyboard/./kyb-init.c:30: hid_set_idle(keyboard_config, 0x80);
ld a,0x80 ld a,0x80
push af push af
inc sp inc sp
ex de, hl
ld hl, (_keyboard_config)
call _hid_set_idle call _hid_set_idle
;source-doc/keyboard/./kyb-init.c:27: return;
;source-doc/keyboard/./kyb-init.c:31: return;
jr l_keyboard_init_00108 jr l_keyboard_init_00108
l_keyboard_init_00106: l_keyboard_init_00106:
;source-doc/keyboard/./kyb-init.c:29: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
;source-doc/keyboard/./kyb-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
inc b inc b
ld a,b ld a,b
ld c,a ld c,a
sub 0x07 sub 0x07
jr NZ,l_keyboard_init_00105 jr NZ,l_keyboard_init_00105
l_keyboard_init_00107: l_keyboard_init_00107:
;source-doc/keyboard/./kyb-init.c:31: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
;source-doc/keyboard/./kyb-init.c:35: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
ld hl,kyb_init_str_2 ld hl,kyb_init_str_2
jp _print_string jp _print_string
l_keyboard_init_00108: l_keyboard_init_00108:
;source-doc/keyboard/./kyb-init.c:32: }
;source-doc/keyboard/./kyb-init.c:36: }
ret ret
kyb_init_str_0: kyb_init_str_0:
DEFB 0x0d DEFB 0x0d
@ -132,3 +149,256 @@ kyb_init_str_2:
DEFB 0x0a DEFB 0x0a
DEFM "USB: KEYBOARD: NOT FOUND$" DEFM "USB: KEYBOARD: NOT FOUND$"
DEFB 0x00 DEFB 0x00
;source-doc/keyboard/./kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
; ---------------------------------
; Function keyboard_buf_put
; ---------------------------------
_keyboard_buf_put:
push ix
ld ix,0
add ix,sp
;source-doc/keyboard/./kyb-init.c:49: if (key_code >= 0x80 || key_code == 0)
ld a,(ix+5)
sub 0x80
jr NC,l_keyboard_buf_put_00106
ld a,(ix+5)
or a
;source-doc/keyboard/./kyb-init.c:50: return; // ignore ???
jr Z,l_keyboard_buf_put_00106
;source-doc/keyboard/./kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
ld a,(_write_index)
inc a
and 0x07
ld b, a
;source-doc/keyboard/./kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full
ld a,(_read_index)
sub b
jr Z,l_keyboard_buf_put_00106
;source-doc/keyboard/./kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys;
ld de,_buffer+0
ld hl,_write_index
ld l, (hl)
ld h,0x00
add hl, hl
add hl, de
ld a,(ix+4)
ld (hl), a
;source-doc/keyboard/./kyb-init.c:55: buffer[write_index].key_code = key_code;
ld hl,_write_index
ld l, (hl)
ld h,0x00
add hl, hl
add hl, de
ex de, hl
inc de
ld a,(ix+5)
ld (de), a
;source-doc/keyboard/./kyb-init.c:56: write_index = next_write_index;
ld hl,_write_index
ld (hl), b
l_keyboard_buf_put_00106:
;source-doc/keyboard/./kyb-init.c:58: }
pop ix
ret
;source-doc/keyboard/./kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) {
; ---------------------------------
; Function keyboard_buf_size
; ---------------------------------
_keyboard_buf_size:
;source-doc/keyboard/./kyb-init.c:61: if (write_index >= read_index)
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr C,l_keyboard_buf_size_00102
;source-doc/keyboard/./kyb-init.c:62: return write_index - read_index;
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr l_keyboard_buf_size_00103
l_keyboard_buf_size_00102:
;source-doc/keyboard/./kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
ld hl,_read_index
ld c, (hl)
ld a,0x08
sub c
ld hl,_write_index
ld c, (hl)
add a, c
l_keyboard_buf_size_00103:
;source-doc/keyboard/./kyb-init.c:65: }
ret
;source-doc/keyboard/./kyb-init.c:67: uint32_t keyboard_buf_get_next() {
; ---------------------------------
; Function keyboard_buf_get_next
; ---------------------------------
_keyboard_buf_get_next:
push ix
ld ix,0
add ix,sp
push af
push af
;source-doc/keyboard/./kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr NZ,l_keyboard_buf_get_next_00102
;source-doc/keyboard/./kyb-init.c:69: return 255 << 8;
ld hl,0xff00
ld e, h
ld d, h
jr l_keyboard_buf_get_next_00103
l_keyboard_buf_get_next_00102:
;source-doc/keyboard/./kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys;
ld bc,_buffer+0
ld hl,_read_index
ld l, (hl)
ld h,0x00
add hl, hl
add hl, bc
ld d, (hl)
;source-doc/keyboard/./kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code;
inc hl
ld e, (hl)
;source-doc/keyboard/./kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
ld hl,_read_index
ld a, (hl)
inc a
and 0x07
ld (hl), a
;source-doc/keyboard/./kyb-init.c:74: const unsigned char c = scancode_to_char(modifier_key, key_code);
push de
ld l, e
ld a, d
call _scancode_to_char
pop de
;source-doc/keyboard/./kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
ld (ix-1),d
ld (ix-4),0x00
ld (ix-3),0x00
ld (ix-2),0x00
ld l, a
ld a,(ix-1)
ld (ix-4),e
ld (ix-3),0x00
ld (ix-2),0x00
ld (ix-1),0x00
pop de
push de
ld h, a
ex de, hl
l_keyboard_buf_get_next_00103:
;source-doc/keyboard/./kyb-init.c:77: }
ld sp, ix
pop ix
ret
;source-doc/keyboard/./kyb-init.c:79: void keyboard_buf_flush() {
; ---------------------------------
; Function keyboard_buf_flush
; ---------------------------------
_keyboard_buf_flush:
;source-doc/keyboard/./kyb-init.c:80: write_index = 0;
ld hl,_write_index
ld (hl),0x00
;source-doc/keyboard/./kyb-init.c:81: read_index = 0;
ld hl,_read_index
ld (hl),0x00
;source-doc/keyboard/./kyb-init.c:82: }
ret
;source-doc/keyboard/./kyb-init.c:88: void keyboard_tick(void) {
; ---------------------------------
; Function keyboard_tick
; ---------------------------------
_keyboard_tick:
;source-doc/keyboard/./kyb-init.c:89: if (is_in_critical_section())
ld hl,_in_critical_usb_section
ld a, (hl)
or a
;source-doc/keyboard/./kyb-init.c:90: return;
ret NZ
;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8);
ld l,0x0b
call _ch_command
;././source-doc/base-drv//ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES;
ld a,0x25
ld bc,_CH376_DATA_PORT
out (c),a
;././source-doc/base-drv//ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F);
ld a,0x1f
ld bc,_CH376_DATA_PORT
out (c),a
;source-doc/keyboard/./kyb-init.c:93: result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8);
ld bc,_report
ld hl, (_keyboard_config)
ld a,0x08
push af
inc sp
push bc
push hl
call _usbdev_dat_in_trnsfer_0
pop af
pop af
inc sp
ld a, l
ld (_result), a
;././source-doc/base-drv//ch376.h:163: ch_command(CH_CMD_WRITE_VAR8);
ld l,0x0b
call _ch_command
;././source-doc/base-drv//ch376.h:164: CH376_DATA_PORT = CH_VAR_RETRY_TIMES;
ld a,0x25
ld bc,_CH376_DATA_PORT
out (c),a
;././source-doc/base-drv//ch376.h:165: CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F);
ld a,0xdf
ld bc,_CH376_DATA_PORT
out (c),a
;source-doc/keyboard/./kyb-init.c:95: if (result == 0)
ld hl,_result
ld a, (hl)
or a
ret NZ
;source-doc/keyboard/./kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]);
ld a, (_report + 2)
ld hl,_report + 0
ld b, (hl)
push af
inc sp
push bc
inc sp
call _keyboard_buf_put
pop af
;source-doc/keyboard/./kyb-init.c:97: }
ret
_keyboard_config:
DEFW +0x0000
_buffer:
DEFB +0x00
DEFB +0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
_write_index:
DEFB +0x00
_read_index:
DEFB +0x00
_active:
DEFB +0x00
_report:
DEFB +0x00
DEFB +0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00

323
Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s

@ -62,7 +62,7 @@ _cbw:
;-------------------------------------------------------- ;--------------------------------------------------------
; code ; code
;-------------------------------------------------------- ;--------------------------------------------------------
;source-doc/scsi-drv/./class_scsi.c:11: usb_error do_scsi_cmd(device_config_storage *const dev,
;source-doc/scsi-drv/./class_scsi.c:12: usb_error do_scsi_cmd(device_config_storage *const dev,
; --------------------------------- ; ---------------------------------
; Function do_scsi_cmd ; Function do_scsi_cmd
; --------------------------------- ; ---------------------------------
@ -70,10 +70,10 @@ _do_scsi_cmd:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
ld hl, -10
ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:16: cbw->dCBWTag[0] = next_tag++;
;source-doc/scsi-drv/./class_scsi.c:17: cbw->dCBWTag[0] = next_tag++;
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
ld hl,0x0004 ld hl,0x0004
@ -91,25 +91,29 @@ _do_scsi_cmd:
ld (hl), e ld (hl), e
inc hl inc hl
ld (hl), d ld (hl), d
;source-doc/scsi-drv/./class_scsi.c:18: if (!send)
;source-doc/scsi-drv/./class_scsi.c:19: if (!send)
bit 0,(ix+10) bit 0,(ix+10)
jr NZ,l_do_scsi_cmd_00102 jr NZ,l_do_scsi_cmd_00102
;source-doc/scsi-drv/./class_scsi.c:19: cbw->bmCBWFlags = 0x80;
;source-doc/scsi-drv/./class_scsi.c:20: cbw->bmCBWFlags = 0x80;
ld hl,0x000c ld hl,0x000c
add hl, bc add hl, bc
ld (hl),0x80 ld (hl),0x80
l_do_scsi_cmd_00102: l_do_scsi_cmd_00102:
;source-doc/scsi-drv/./class_scsi.c:22: &dev->endpoints[ENDPOINT_BULK_OUT]));
;source-doc/scsi-drv/./class_scsi.c:22: critical_begin();
push bc
call _critical_begin
pop bc
;source-doc/scsi-drv/./class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT]));
ld a,(ix+4) ld a,(ix+4)
ld (ix-8),a
ld (ix-6),a
ld a,(ix+5) ld a,(ix+5)
ld (ix-7),a
ld a,(ix-8)
ld (ix-5),a
ld a,(ix-6)
add a,0x03 add a,0x03
ld (ix-6),a
ld a,(ix-7)
ld (ix-4),a
ld a,(ix-5)
adc a,0x00 adc a,0x00
ld (ix-5),a
ld (ix-3),a
pop de pop de
pop hl pop hl
push hl push hl
@ -123,8 +127,8 @@ l_do_scsi_cmd_00102:
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
push bc push bc
ld l,(ix-6)
ld h,(ix-5)
ld l,(ix-4)
ld h,(ix-3)
push hl push hl
push af push af
inc sp inc sp
@ -139,63 +143,53 @@ l_do_scsi_cmd_00102:
pop bc pop bc
ld a, l ld a, l
ld (_result), a ld (_result), a
ld hl,_result
ld a, (hl)
ld a,(_result)
or a or a
jr Z,l_do_scsi_cmd_00104
ld l, (hl)
jp l_do_scsi_cmd_00119
l_do_scsi_cmd_00104:
;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) {
jp NZ, l_do_scsi_cmd_00120
;source-doc/scsi-drv/./class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) {
ld hl,8 ld hl,8
add hl, bc add hl, bc
ld c, (hl)
inc hl
ld b, (hl)
inc hl
ld e, (hl) ld e, (hl)
inc hl inc hl
ld d, (hl) ld d, (hl)
;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix-8)
inc hl
ld c, (hl)
inc hl
ld b, (hl)
;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix-6)
add a,0x06 add a,0x06
ld (ix-4),a
ld a,(ix-7)
ld (ix-2),a
ld a,(ix-5)
adc a,0x00 adc a,0x00
ld (ix-3),a
;source-doc/scsi-drv/./class_scsi.c:24: if (cbw->dCBWDataTransferLength != 0) {
ld a, d
or e
or b
ld (ix-1),a
;source-doc/scsi-drv/./class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) {
ld a, b
or c or c
or d
or e
jr Z,l_do_scsi_cmd_00113 jr Z,l_do_scsi_cmd_00113
;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN]));
ld (ix-2),c
ld (ix-1),b
;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN]));
ld c,(ix+8) ld c,(ix+8)
ld b,(ix+9) ld b,(ix+9)
;source-doc/scsi-drv/./class_scsi.c:25: if (!send) {
;source-doc/scsi-drv/./class_scsi.c:28: if (!send) {
bit 0,(ix+10) bit 0,(ix+10)
jr NZ,l_do_scsi_cmd_00110 jr NZ,l_do_scsi_cmd_00110
;source-doc/scsi-drv/./class_scsi.c:27: &dev->endpoints[ENDPOINT_BULK_IN]));
pop de
pop hl
push hl
push de
;source-doc/scsi-drv/./class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN]));
ld l,(ix-6)
ld h,(ix-5)
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
rlca rlca
rlca rlca
and 0x0f and 0x0f
ld l,(ix-4)
ld h,(ix-3)
push hl
push af
inc sp
ld l,(ix-2) ld l,(ix-2)
ld h,(ix-1) ld h,(ix-1)
push hl push hl
push af
inc sp
push de
push bc push bc
call _usb_data_in_transfer call _usb_data_in_transfer
pop af pop af
@ -204,32 +198,26 @@ l_do_scsi_cmd_00104:
inc sp inc sp
ld a, l ld a, l
ld (_result), a ld (_result), a
ld hl,_result
ld a, (hl)
ld a,(_result)
or a or a
jr Z,l_do_scsi_cmd_00113 jr Z,l_do_scsi_cmd_00113
ld l, (hl)
jp l_do_scsi_cmd_00119
jp l_do_scsi_cmd_00120
l_do_scsi_cmd_00110: l_do_scsi_cmd_00110:
;source-doc/scsi-drv/./class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_OUT]));
pop de
pop hl
push hl
push de
;source-doc/scsi-drv/./class_scsi.c:34: &dev->endpoints[ENDPOINT_BULK_OUT]));
ld l,(ix-6)
ld h,(ix-5)
ld a, (hl) ld a, (hl)
rlca rlca
rlca rlca
rlca rlca
rlca rlca
and 0x0f and 0x0f
ld l,(ix-6)
ld h,(ix-5)
ld l,(ix-4)
ld h,(ix-3)
push hl push hl
push af push af
inc sp inc sp
ld l,(ix-2)
ld h,(ix-1)
push hl
push de
push bc push bc
call _usb_data_out_transfer call _usb_data_out_transfer
pop af pop af
@ -238,14 +226,11 @@ l_do_scsi_cmd_00110:
inc sp inc sp
ld a, l ld a, l
ld (_result), a ld (_result), a
ld hl,_result
ld a, (hl)
ld a,(_result)
or a or a
jr Z,l_do_scsi_cmd_00113
ld l, (hl)
jr l_do_scsi_cmd_00119
jr NZ,l_do_scsi_cmd_00120
l_do_scsi_cmd_00113: l_do_scsi_cmd_00113:
;source-doc/scsi-drv/./class_scsi.c:36: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/./class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
pop de pop de
pop hl pop hl
push hl push hl
@ -257,8 +242,8 @@ l_do_scsi_cmd_00113:
rlca rlca
and 0x0f and 0x0f
ld b, a ld b, a
ld l,(ix-4)
ld h,(ix-3)
ld l,(ix-2)
ld h,(ix-1)
push hl push hl
push bc push bc
inc sp inc sp
@ -273,14 +258,10 @@ l_do_scsi_cmd_00113:
inc sp inc sp
ld a, l ld a, l
ld (_result), a ld (_result), a
ld hl,_result
ld a, (hl)
ld a,(_result)
or a or a
jr Z,l_do_scsi_cmd_00115
ld l, (hl)
jr l_do_scsi_cmd_00119
l_do_scsi_cmd_00115:
;source-doc/scsi-drv/./class_scsi.c:38: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
jr NZ,l_do_scsi_cmd_00120
;source-doc/scsi-drv/./class_scsi.c:41: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
ld a, (_csw + 12) ld a, (_csw + 12)
or a or a
jr Z,l_do_scsi_cmd_00117 jr Z,l_do_scsi_cmd_00117
@ -294,18 +275,26 @@ l_do_scsi_cmd_00115:
cp a cp a
sbc hl, bc sbc hl, bc
jr Z,l_do_scsi_cmd_00117 jr Z,l_do_scsi_cmd_00117
;source-doc/scsi-drv/./class_scsi.c:39: return USB_ERR_FAIL;
ld l,0x0e
jr l_do_scsi_cmd_00119
;source-doc/scsi-drv/./class_scsi.c:42: result = USB_ERR_FAIL;
ld hl,_result
ld (hl),0x0e
jr l_do_scsi_cmd_00120
l_do_scsi_cmd_00117: l_do_scsi_cmd_00117:
;source-doc/scsi-drv/./class_scsi.c:41: return USB_ERR_OK;
ld l,0x00
l_do_scsi_cmd_00119:
;source-doc/scsi-drv/./class_scsi.c:42: }
;source-doc/scsi-drv/./class_scsi.c:44: result = USB_ERR_OK;
ld hl,_result
ld (hl),0x00
;source-doc/scsi-drv/./class_scsi.c:46: done:
l_do_scsi_cmd_00120:
;source-doc/scsi-drv/./class_scsi.c:47: critical_end();
call _critical_end
;source-doc/scsi-drv/./class_scsi.c:48: return result;
ld hl,_result
ld l, (hl)
;source-doc/scsi-drv/./class_scsi.c:49: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:46: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) {
;source-doc/scsi-drv/./class_scsi.c:53: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) {
; --------------------------------- ; ---------------------------------
; Function get_scsi_read_capacity ; Function get_scsi_read_capacity
; --------------------------------- ; ---------------------------------
@ -316,31 +305,31 @@ _get_scsi_read_capacity:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:48: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:49: cbw_scsi.read_capacity = scsi_read_capacity;
;source-doc/scsi-drv/./class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity;
ld hl,15 ld hl,15
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_read_capacity ld hl,_scsi_read_capacity
ld bc,0x000c ld bc,0x000c
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:51: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00 ld (ix-14),0x00
;source-doc/scsi-drv/./class_scsi.c:52: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity);
;source-doc/scsi-drv/./class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity);
ld (ix-13),0x0c ld (ix-13),0x0c
;source-doc/scsi-drv/./class_scsi.c:53: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result);
;source-doc/scsi-drv/./class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result);
ld (ix-19),0x08 ld (ix-19),0x08
xor a xor a
ld (ix-18),a ld (ix-18),a
ld (ix-17),a ld (ix-17),a
ld (ix-16),a ld (ix-16),a
;source-doc/scsi-drv/./class_scsi.c:55: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false);
;source-doc/scsi-drv/./class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false);
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
xor a xor a
@ -354,11 +343,11 @@ _get_scsi_read_capacity:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/./class_scsi.c:56: }
;source-doc/scsi-drv/./class_scsi.c:63: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:60: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) {
;source-doc/scsi-drv/./class_scsi.c:67: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) {
; --------------------------------- ; ---------------------------------
; Function scsi_inquiry ; Function scsi_inquiry
; --------------------------------- ; ---------------------------------
@ -369,31 +358,31 @@ _scsi_inquiry:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:62: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:63: cbw_scsi.inquiry = scsi_packet_inquiry;
;source-doc/scsi-drv/./class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry;
ld hl,15 ld hl,15
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_packet_inquiry ld hl,_scsi_packet_inquiry
ld bc,0x000c ld bc,0x000c
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:65: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00 ld (ix-14),0x00
;source-doc/scsi-drv/./class_scsi.c:66: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry);
;source-doc/scsi-drv/./class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry);
ld (ix-13),0x0c ld (ix-13),0x0c
;source-doc/scsi-drv/./class_scsi.c:67: cbw_scsi.cbw.dCBWDataTransferLength = 0x24;
;source-doc/scsi-drv/./class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24;
ld (ix-19),0x24 ld (ix-19),0x24
xor a xor a
ld (ix-18),a ld (ix-18),a
ld (ix-17),a ld (ix-17),a
ld (ix-16),a ld (ix-16),a
;source-doc/scsi-drv/./class_scsi.c:69: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false);
;source-doc/scsi-drv/./class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false);
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
xor a xor a
@ -407,11 +396,11 @@ _scsi_inquiry:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/./class_scsi.c:70: }
;source-doc/scsi-drv/./class_scsi.c:77: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:72: usb_error scsi_test(device_config_storage *const dev) {
;source-doc/scsi-drv/./class_scsi.c:79: usb_error scsi_test(device_config_storage *const dev) {
; --------------------------------- ; ---------------------------------
; Function scsi_test ; Function scsi_test
; --------------------------------- ; ---------------------------------
@ -422,14 +411,14 @@ _scsi_test:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:74: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:75: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test));
;source-doc/scsi-drv/./class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test));
ld hl,15 ld hl,15
add hl, sp add hl, sp
ld b,0x0c ld b,0x0c
@ -437,11 +426,11 @@ l_scsi_test_00103:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_scsi_test_00103 djnz l_scsi_test_00103
;source-doc/scsi-drv/./class_scsi.c:77: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00 ld (ix-14),0x00
;source-doc/scsi-drv/./class_scsi.c:78: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test);
;source-doc/scsi-drv/./class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test);
ld (ix-13),0x0c ld (ix-13),0x0c
;source-doc/scsi-drv/./class_scsi.c:79: cbw_scsi.cbw.dCBWDataTransferLength = 0;
;source-doc/scsi-drv/./class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0;
ld hl,8 ld hl,8
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -453,7 +442,7 @@ l_scsi_test_00103:
ld (de), a ld (de), a
inc de inc de
ld (de), a ld (de), a
;source-doc/scsi-drv/./class_scsi.c:81: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
;source-doc/scsi-drv/./class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
xor a xor a
push af push af
inc sp inc sp
@ -466,11 +455,11 @@ l_scsi_test_00103:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/./class_scsi.c:82: }
;source-doc/scsi-drv/./class_scsi.c:89: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:86: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
;source-doc/scsi-drv/./class_scsi.c:93: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
; --------------------------------- ; ---------------------------------
; Function scsi_request_sense ; Function scsi_request_sense
; --------------------------------- ; ---------------------------------
@ -481,31 +470,31 @@ _scsi_request_sense:
ld hl, -27 ld hl, -27
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:88: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:89: cbw_scsi.request_sense = scsi_packet_request_sense;
;source-doc/scsi-drv/./class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense;
ld hl,15 ld hl,15
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_packet_request_sense ld hl,_scsi_packet_request_sense
ld bc,0x000c ld bc,0x000c
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:91: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00 ld (ix-14),0x00
;source-doc/scsi-drv/./class_scsi.c:92: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense);
;source-doc/scsi-drv/./class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense);
ld (ix-13),0x0c ld (ix-13),0x0c
;source-doc/scsi-drv/./class_scsi.c:93: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result);
;source-doc/scsi-drv/./class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result);
ld (ix-19),0x12 ld (ix-19),0x12
xor a xor a
ld (ix-18),a ld (ix-18),a
ld (ix-17),a ld (ix-17),a
ld (ix-16),a ld (ix-16),a
;source-doc/scsi-drv/./class_scsi.c:95: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false);
;source-doc/scsi-drv/./class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false);
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
xor a xor a
@ -519,11 +508,11 @@ _scsi_request_sense:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/./class_scsi.c:96: }
;source-doc/scsi-drv/./class_scsi.c:103: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:98: usb_error scsi_sense_init(device_config_storage *const dev) {
;source-doc/scsi-drv/./class_scsi.c:105: usb_error scsi_sense_init(device_config_storage *const dev) {
; --------------------------------- ; ---------------------------------
; Function scsi_sense_init ; Function scsi_sense_init
; --------------------------------- ; ---------------------------------
@ -534,7 +523,9 @@ _scsi_sense_init:
ld hl, -18 ld hl, -18
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:102: while ((result = scsi_test(dev)) && --counter > 0)
;source-doc/scsi-drv/./class_scsi.c:109: critical_begin();
call _critical_begin
;source-doc/scsi-drv/./class_scsi.c:110: while ((result = scsi_test(dev)) && --counter > 0)
ld c,0x03 ld c,0x03
l_scsi_sense_init_00102: l_scsi_sense_init_00102:
push bc push bc
@ -550,7 +541,7 @@ l_scsi_sense_init_00102:
jr Z,l_scsi_sense_init_00104 jr Z,l_scsi_sense_init_00104
dec c dec c
jr Z,l_scsi_sense_init_00104 jr Z,l_scsi_sense_init_00104
;source-doc/scsi-drv/./class_scsi.c:103: scsi_request_sense(dev, &response);
;source-doc/scsi-drv/./class_scsi.c:111: scsi_request_sense(dev, &response);
push bc push bc
ld hl,2 ld hl,2
add hl, sp add hl, sp
@ -564,14 +555,16 @@ l_scsi_sense_init_00102:
pop bc pop bc
jr l_scsi_sense_init_00102 jr l_scsi_sense_init_00102
l_scsi_sense_init_00104: l_scsi_sense_init_00104:
;source-doc/scsi-drv/./class_scsi.c:105: return result;
;source-doc/scsi-drv/./class_scsi.c:112: critical_end();
call _critical_end
;source-doc/scsi-drv/./class_scsi.c:114: return result;
ld hl,_result ld hl,_result
ld l, (hl) ld l, (hl)
;source-doc/scsi-drv/./class_scsi.c:106: }
;source-doc/scsi-drv/./class_scsi.c:115: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:110: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) {
;source-doc/scsi-drv/./class_scsi.c:119: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) {
; --------------------------------- ; ---------------------------------
; Function scsi_read ; Function scsi_read
; --------------------------------- ; ---------------------------------
@ -580,36 +573,36 @@ _scsi_read:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/scsi-drv/./class_scsi.c:111: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
;source-doc/scsi-drv/./class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
ld hl,_cbw ld hl,_cbw
ld b,0x1b ld b,0x1b
l_scsi_read_00112: l_scsi_read_00112:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_scsi_read_00112 djnz l_scsi_read_00112
;source-doc/scsi-drv/./class_scsi.c:112: cbw.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper;
ld de,_cbw ld de,_cbw
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:114: cbw.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:123: cbw.cbw.bCBWLUN = 0;
ld hl,_cbw + 13 ld hl,_cbw + 13
ld (hl),0x00 ld (hl),0x00
;source-doc/scsi-drv/./class_scsi.c:115: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
;source-doc/scsi-drv/./class_scsi.c:124: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
ld hl,_cbw + 14 ld hl,_cbw + 14
ld (hl),0x0c ld (hl),0x0c
;source-doc/scsi-drv/./class_scsi.c:116: cbw.cbw.dCBWDataTransferLength = 512;
;source-doc/scsi-drv/./class_scsi.c:125: cbw.cbw.dCBWDataTransferLength = 512;
ld hl,0x0200 ld hl,0x0200
ld ((_cbw + 8)), hl ld ((_cbw + 8)), hl
ld h, l ld h, l
ld ((_cbw + 8)+2), hl ld ((_cbw + 8)+2), hl
;source-doc/scsi-drv/./class_scsi.c:118: cbw.scsi_cmd.operation_code = 0x28; // read operation
;source-doc/scsi-drv/./class_scsi.c:127: cbw.scsi_cmd.operation_code = 0x28; // read operation
ld hl,_cbw + 15 ld hl,_cbw + 15
ld (hl),0x28 ld (hl),0x28
;source-doc/scsi-drv/./class_scsi.c:119: cbw.scsi_cmd.transfer_len[1] = 1;
;source-doc/scsi-drv/./class_scsi.c:128: cbw.scsi_cmd.transfer_len[1] = 1;
ld hl,_cbw + 23 ld hl,_cbw + 23
ld (hl),0x01 ld (hl),0x01
;source-doc/scsi-drv/./class_scsi.c:120: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
;source-doc/scsi-drv/./class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
ld c,(ix+4) ld c,(ix+4)
ld b,(ix+5) ld b,(ix+5)
ld hl,0x000c ld hl,0x000c
@ -622,7 +615,7 @@ l_scsi_read_00112:
inc hl inc hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 17)),a ld ((_cbw + 17)),a
;source-doc/scsi-drv/./class_scsi.c:121: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
;source-doc/scsi-drv/./class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
pop hl pop hl
push hl push hl
inc hl inc hl
@ -631,19 +624,19 @@ l_scsi_read_00112:
dec hl dec hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 18)),a ld ((_cbw + 18)),a
;source-doc/scsi-drv/./class_scsi.c:122: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
;source-doc/scsi-drv/./class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
pop hl pop hl
push hl push hl
inc hl inc hl
ld d, (hl) ld d, (hl)
ld hl, +(_cbw + 19) ld hl, +(_cbw + 19)
ld (hl), d ld (hl), d
;source-doc/scsi-drv/./class_scsi.c:123: cbw.scsi_cmd.lba[3] = dev->current_lba;
;source-doc/scsi-drv/./class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba;
pop hl pop hl
push hl push hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 20)),a ld ((_cbw + 20)),a
;source-doc/scsi-drv/./class_scsi.c:125: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false);
;source-doc/scsi-drv/./class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false);
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
xor a xor a
@ -660,11 +653,11 @@ l_scsi_read_00112:
inc sp inc sp
ld a, l ld a, l
ld (_result), a ld (_result), a
;source-doc/scsi-drv/./class_scsi.c:127: if (result == USB_ERR_OK)
;source-doc/scsi-drv/./class_scsi.c:136: if (result == USB_ERR_OK)
ld a,(_result) ld a,(_result)
or a or a
jr NZ,l_scsi_read_00102 jr NZ,l_scsi_read_00102
;source-doc/scsi-drv/./class_scsi.c:128: dev->current_lba++;
;source-doc/scsi-drv/./class_scsi.c:137: dev->current_lba++;
pop hl pop hl
push hl push hl
ld c, (hl) ld c, (hl)
@ -690,14 +683,14 @@ l_scsi_read_00114:
inc hl inc hl
ld (hl), d ld (hl), d
l_scsi_read_00102: l_scsi_read_00102:
;source-doc/scsi-drv/./class_scsi.c:129: return result;
;source-doc/scsi-drv/./class_scsi.c:138: return result;
ld hl,_result ld hl,_result
ld l, (hl) ld l, (hl)
;source-doc/scsi-drv/./class_scsi.c:130: }
;source-doc/scsi-drv/./class_scsi.c:139: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:132: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) {
;source-doc/scsi-drv/./class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) {
; --------------------------------- ; ---------------------------------
; Function scsi_write ; Function scsi_write
; --------------------------------- ; ---------------------------------
@ -706,36 +699,36 @@ _scsi_write:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/scsi-drv/./class_scsi.c:133: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
;source-doc/scsi-drv/./class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
ld hl,_cbw ld hl,_cbw
ld b,0x1b ld b,0x1b
l_scsi_write_00112: l_scsi_write_00112:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_scsi_write_00112 djnz l_scsi_write_00112
;source-doc/scsi-drv/./class_scsi.c:134: cbw.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper;
ld de,_cbw ld de,_cbw
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:136: cbw.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:145: cbw.cbw.bCBWLUN = 0;
ld hl,_cbw + 13 ld hl,_cbw + 13
ld (hl),0x00 ld (hl),0x00
;source-doc/scsi-drv/./class_scsi.c:137: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
;source-doc/scsi-drv/./class_scsi.c:146: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
ld hl,_cbw + 14 ld hl,_cbw + 14
ld (hl),0x0c ld (hl),0x0c
;source-doc/scsi-drv/./class_scsi.c:138: cbw.cbw.dCBWDataTransferLength = 512;
;source-doc/scsi-drv/./class_scsi.c:147: cbw.cbw.dCBWDataTransferLength = 512;
ld hl,0x0200 ld hl,0x0200
ld ((_cbw + 8)), hl ld ((_cbw + 8)), hl
ld h, l ld h, l
ld ((_cbw + 8)+2), hl ld ((_cbw + 8)+2), hl
;source-doc/scsi-drv/./class_scsi.c:140: cbw.scsi_cmd.operation_code = 0x2A; // write operation
;source-doc/scsi-drv/./class_scsi.c:149: cbw.scsi_cmd.operation_code = 0x2A; // write operation
ld hl,_cbw + 15 ld hl,_cbw + 15
ld (hl),0x2a ld (hl),0x2a
;source-doc/scsi-drv/./class_scsi.c:141: cbw.scsi_cmd.transfer_len[1] = 1;
;source-doc/scsi-drv/./class_scsi.c:150: cbw.scsi_cmd.transfer_len[1] = 1;
ld hl,_cbw + 23 ld hl,_cbw + 23
ld (hl),0x01 ld (hl),0x01
;source-doc/scsi-drv/./class_scsi.c:142: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
;source-doc/scsi-drv/./class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
ld c,(ix+4) ld c,(ix+4)
ld b,(ix+5) ld b,(ix+5)
ld hl,0x000c ld hl,0x000c
@ -748,7 +741,7 @@ l_scsi_write_00112:
inc hl inc hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 17)),a ld ((_cbw + 17)),a
;source-doc/scsi-drv/./class_scsi.c:143: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
;source-doc/scsi-drv/./class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
pop hl pop hl
push hl push hl
inc hl inc hl
@ -757,19 +750,19 @@ l_scsi_write_00112:
dec hl dec hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 18)),a ld ((_cbw + 18)),a
;source-doc/scsi-drv/./class_scsi.c:144: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
;source-doc/scsi-drv/./class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
pop hl pop hl
push hl push hl
inc hl inc hl
ld d, (hl) ld d, (hl)
ld hl, +(_cbw + 19) ld hl, +(_cbw + 19)
ld (hl), d ld (hl), d
;source-doc/scsi-drv/./class_scsi.c:145: cbw.scsi_cmd.lba[3] = dev->current_lba;
;source-doc/scsi-drv/./class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba;
pop hl pop hl
push hl push hl
ld a, (hl) ld a, (hl)
ld ((_cbw + 20)),a ld ((_cbw + 20)),a
;source-doc/scsi-drv/./class_scsi.c:147: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true);
;source-doc/scsi-drv/./class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true);
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
ld a,0x01 ld a,0x01
@ -786,11 +779,11 @@ l_scsi_write_00112:
inc sp inc sp
ld a, l ld a, l
ld (_result), a ld (_result), a
;source-doc/scsi-drv/./class_scsi.c:149: if (result == USB_ERR_OK)
;source-doc/scsi-drv/./class_scsi.c:158: if (result == USB_ERR_OK)
ld a,(_result) ld a,(_result)
or a or a
jr NZ,l_scsi_write_00102 jr NZ,l_scsi_write_00102
;source-doc/scsi-drv/./class_scsi.c:150: dev->current_lba++;
;source-doc/scsi-drv/./class_scsi.c:159: dev->current_lba++;
pop hl pop hl
push hl push hl
ld c, (hl) ld c, (hl)
@ -816,14 +809,14 @@ l_scsi_write_00114:
inc hl inc hl
ld (hl), d ld (hl), d
l_scsi_write_00102: l_scsi_write_00102:
;source-doc/scsi-drv/./class_scsi.c:151: return result;
;source-doc/scsi-drv/./class_scsi.c:160: return result;
ld hl,_result ld hl,_result
ld l, (hl) ld l, (hl)
;source-doc/scsi-drv/./class_scsi.c:152: }
;source-doc/scsi-drv/./class_scsi.c:161: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/scsi-drv/./class_scsi.c:154: usb_error scsi_eject(device_config_storage *const dev) {
;source-doc/scsi-drv/./class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) {
; --------------------------------- ; ---------------------------------
; Function scsi_eject ; Function scsi_eject
; --------------------------------- ; ---------------------------------
@ -834,14 +827,14 @@ _scsi_eject:
ld hl, -21 ld hl, -21
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/scsi-drv/./class_scsi.c:156: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,_scsi_command_block_wrapper ld hl,_scsi_command_block_wrapper
ld bc,0x000f ld bc,0x000f
ldir ldir
;source-doc/scsi-drv/./class_scsi.c:158: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject));
;source-doc/scsi-drv/./class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject));
ld hl,15 ld hl,15
add hl, sp add hl, sp
ld b,0x06 ld b,0x06
@ -849,17 +842,17 @@ l_scsi_eject_00103:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_scsi_eject_00103 djnz l_scsi_eject_00103
;source-doc/scsi-drv/./class_scsi.c:160: cbw_scsi.eject.operation_code = 0x1B;
;source-doc/scsi-drv/./class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B;
ld (ix-6),0x1b ld (ix-6),0x1b
;source-doc/scsi-drv/./class_scsi.c:161: cbw_scsi.eject.loej = 1;
;source-doc/scsi-drv/./class_scsi.c:170: cbw_scsi.eject.loej = 1;
ld hl,19 ld hl,19
add hl, sp add hl, sp
set 1, (hl) set 1, (hl)
;source-doc/scsi-drv/./class_scsi.c:163: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/./class_scsi.c:172: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-8),0x00 ld (ix-8),0x00
;source-doc/scsi-drv/./class_scsi.c:164: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject);
;source-doc/scsi-drv/./class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject);
ld (ix-7),0x06 ld (ix-7),0x06
;source-doc/scsi-drv/./class_scsi.c:165: cbw_scsi.cbw.dCBWDataTransferLength = 0;
;source-doc/scsi-drv/./class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0;
ld hl,8 ld hl,8
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -871,7 +864,7 @@ l_scsi_eject_00103:
ld (de), a ld (de), a
inc de inc de
ld (de), a ld (de), a
;source-doc/scsi-drv/./class_scsi.c:167: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
;source-doc/scsi-drv/./class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
xor a xor a
push af push af
inc sp inc sp
@ -884,7 +877,7 @@ l_scsi_eject_00103:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _do_scsi_cmd call _do_scsi_cmd
;source-doc/scsi-drv/./class_scsi.c:168: }
;source-doc/scsi-drv/./class_scsi.c:177: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret

8
Source/HBIOS/ch376-native/scsi-drv/scsi-init.c.s

@ -88,23 +88,23 @@ l_chscsi_init_00105:
ld hl,scsi_init_str_1 ld hl,scsi_init_str_1
call _print_string call _print_string
pop de pop de
;source-doc/scsi-drv/./scsi-init.c:29: scsi_sense_init(storage_device);
;source-doc/scsi-drv/./scsi-init.c:28: scsi_sense_init(storage_device);
push de push de
push de push de
call _scsi_sense_init call _scsi_sense_init
pop af pop af
pop de pop de
;source-doc/scsi-drv/./scsi-init.c:30: dio_add_entry(ch_scsi_fntbl, storage_device);
;source-doc/scsi-drv/./scsi-init.c:29: dio_add_entry(ch_scsi_fntbl, storage_device);
ld hl,_ch_scsi_fntbl ld hl,_ch_scsi_fntbl
call _dio_add_entry call _dio_add_entry
l_chscsi_init_00106: l_chscsi_init_00106:
;source-doc/scsi-drv/./scsi-init.c:33: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
;source-doc/scsi-drv/./scsi-init.c:32: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
inc (ix-1) inc (ix-1)
ld a,(ix-1) ld a,(ix-1)
sub 0x07 sub 0x07
jr NZ,l_chscsi_init_00105 jr NZ,l_chscsi_init_00105
l_chscsi_init_00108: l_chscsi_init_00108:
;source-doc/scsi-drv/./scsi-init.c:34: }
;source-doc/scsi-drv/./scsi-init.c:33: }
inc sp inc sp
pop ix pop ix
ret ret

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

@ -8,7 +8,7 @@ usb_error result = 0;
void ch_command(const uint8_t command) __z88dk_fastcall { void ch_command(const uint8_t command) __z88dk_fastcall {
uint8_t counter = 255; uint8_t counter = 255;
while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0) while ((CH376_COMMAND_PORT & PARA_STATE_BUSY) && --counter != 0)
delay();
;
// if (counter == 0) { // if (counter == 0) {
// It appears that the Ch376 has become blocked // It appears that the Ch376 has become blocked
@ -18,12 +18,7 @@ void ch_command(const uint8_t command) __z88dk_fastcall {
// return; // return;
// } // }
delay();
CH376_COMMAND_PORT = command; CH376_COMMAND_PORT = command;
delay();
delay();
delay();
delay();
} }
extern usb_error ch_wait_int_and_get_status(const int16_t timeout) __z88dk_fastcall; extern usb_error ch_wait_int_and_get_status(const int16_t timeout) __z88dk_fastcall;
@ -36,10 +31,6 @@ usb_error ch_very_short_wait_int_and_get_status(void) { return ch_wait_int_and_g
usb_error ch_get_status(void) { usb_error ch_get_status(void) {
ch_command(CH_CMD_GET_STATUS); ch_command(CH_CMD_GET_STATUS);
delay();
delay();
delay();
delay();
uint8_t ch_status = CH376_DATA_PORT; uint8_t ch_status = CH376_DATA_PORT;
if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX) if (ch_status >= USB_FILERR_MIN && ch_status <= USB_FILERR_MAX)
@ -143,14 +134,8 @@ uint8_t ch_cmd_get_ic_version(void) {
void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) { void ch_issue_token(const uint8_t toggle_bit, const uint8_t endpoint, const ch376_pid pid) {
ch_command(CH_CMD_ISSUE_TKN_X); ch_command(CH_CMD_ISSUE_TKN_X);
delay();
delay();
CH376_DATA_PORT = toggle_bit; CH376_DATA_PORT = toggle_bit;
delay();
delay();
CH376_DATA_PORT = endpoint << 4 | pid; CH376_DATA_PORT = endpoint << 4 | pid;
delay();
delay();
} }
void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall { void ch_issue_token_in(const endpoint_param *const endpoint) __z88dk_fastcall {
@ -169,7 +154,6 @@ void ch_issue_token_setup(void) { ch_issue_token(0, 0, CH_PID_SETUP); }
usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) { usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_param *const endpoint) {
uint8_t count; uint8_t count;
usb_error result;
if (buffer_size == 0) if (buffer_size == 0)
return USB_ERR_OK; return USB_ERR_OK;
@ -197,6 +181,8 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par
USB_MODULE_LEDS = 0x00; USB_MODULE_LEDS = 0x00;
return USB_ERR_OK; return USB_ERR_OK;
done:
return result;
} }
usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) { usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) {
@ -218,6 +204,8 @@ usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size
USB_MODULE_LEDS = 0x00; USB_MODULE_LEDS = 0x00;
return USB_ERR_OK; return USB_ERR_OK;
done:
return result;
} }
usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) { usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) {
@ -241,10 +229,11 @@ usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, end
USB_MODULE_LEDS = 0x00; USB_MODULE_LEDS = 0x00;
return USB_ERR_OK; return USB_ERR_OK;
done:
return result;
} }
void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall { void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall {
ch_command(CH_CMD_SET_USB_ADDR); ch_command(CH_CMD_SET_USB_ADDR);
CH376_DATA_PORT = device_address; CH376_DATA_PORT = device_address;
delay();
} }

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

@ -96,11 +96,14 @@ extern usb_error result;
{ \ { \
result = fn; \ result = fn; \
if (result != USB_ERR_OK) \ if (result != USB_ERR_OK) \
return result; \
goto done; \
} }
#define RETURN_CHECK(fn) \ #define RETURN_CHECK(fn) \
{ return fn; }
{ \
result = fn; \
goto done; \
}
#define TRACE_USB_ERROR(result) #define TRACE_USB_ERROR(result)
@ -159,9 +162,7 @@ extern usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_leng
inline void ch_configure_nak_retry(const ch_nak_retry_type retry, const uint8_t number_of_retries) { inline void ch_configure_nak_retry(const ch_nak_retry_type retry, const uint8_t number_of_retries) {
ch_command(CH_CMD_WRITE_VAR8); ch_command(CH_CMD_WRITE_VAR8);
CH376_DATA_PORT = CH_VAR_RETRY_TIMES; CH376_DATA_PORT = CH_VAR_RETRY_TIMES;
delay();
CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F); CH376_DATA_PORT = retry << 6 | (number_of_retries & 0x1F);
delay();
} }
#define ch_configure_nak_retry_indefinite() ch_configure_nak_retry(CH_NAK_RETRY_INDEFINITE, 0x1F) #define ch_configure_nak_retry_indefinite() ch_configure_nak_retry(CH_NAK_RETRY_INDEFINITE, 0x1F)

8
Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.c

@ -0,0 +1,8 @@
#include "critical-section.h"
#include <stdint.h>
uint8_t in_critical_usb_section = 0;
void critical_begin() { in_critical_usb_section++; }
void critical_end() { in_critical_usb_section--; }

13
Source/HBIOS/ch376-native/source-doc/base-drv/critical-section.h

@ -0,0 +1,13 @@
#ifndef __CRITICAL_BLOCKS_H__
#define __CRITICAL_BLOCKS_H__
#include <stdint.h>
extern uint8_t in_critical_usb_section;
void critical_begin();
void critical_end();
#define is_in_critical_section() (in_critical_usb_section != 0)
#endif

24
Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.c

@ -16,6 +16,9 @@
#include "protocol.h" #include "protocol.h"
#include <stdlib.h> #include <stdlib.h>
#include <critical-section.h>
#include "ez80-helpers.h"
/** /**
* @brief Perform a USB control transfer (in or out) * @brief Perform a USB control transfer (in or out)
* See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer * See https://www.beyondlogic.org/usbnutshell/usb4.shtml for a description of the USB control transfer
@ -31,8 +34,6 @@ usb_error usbdev_control_transfer(device_config *const device, const setup_packe
usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) { usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const buffer, const uint16_t buffer_size) {
usb_error result;
endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT]; endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_OUT];
result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint); result = usb_data_out_transfer(buffer, buffer_size, dev->address, endpoint);
@ -44,12 +45,12 @@ usb_error usbdev_blk_out_trnsfer(device_config *const dev, const uint8_t *const
} }
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) { usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffer, uint8_t *const buffer_size) {
usb_error result;
endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN]; endpoint_param *const endpoint = &dev->endpoints[ENDPOINT_BULK_IN];
result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint); result = usb_data_in_transfer_n(buffer, buffer_size, dev->address, endpoint);
@ -61,6 +62,8 @@ usb_error usbdev_bulk_in_transfer(device_config *const dev, uint8_t *const buffe
} }
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error usbdev_dat_in_trnsfer(device_config *const device, usb_error usbdev_dat_in_trnsfer(device_config *const device,
@ -68,8 +71,6 @@ usb_error usbdev_dat_in_trnsfer(device_config *const device,
const uint16_t buffer_size, const uint16_t buffer_size,
const usb_endpoint_type endpoint_type) { const usb_endpoint_type endpoint_type) {
usb_error result;
endpoint_param *const endpoint = &device->endpoints[endpoint_type]; endpoint_param *const endpoint = &device->endpoints[endpoint_type];
result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint);
@ -81,12 +82,11 @@ usb_error usbdev_dat_in_trnsfer(device_config *const device,
} }
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) __sdcccall(1) {
usb_error result;
usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size) {
endpoint_param *const endpoint = &device->endpoints[0]; endpoint_param *const endpoint = &device->endpoints[0];
result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint); result = usb_data_in_transfer(buffer, buffer_size, device->address, endpoint);
@ -97,5 +97,5 @@ usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const bu
return USB_ERR_STALL; return USB_ERR_STALL;
} }
RETURN_CHECK(result);
return result;
} }

3
Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h

@ -62,7 +62,6 @@ extern usb_error usbdev_dat_in_trnsfer(device_config *const device,
const uint16_t buffer_size, const uint16_t buffer_size,
const usb_endpoint_type endpoint_type); const usb_endpoint_type endpoint_type);
extern usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size)
__sdcccall(1);
extern usb_error usbdev_dat_in_trnsfer_0(device_config *const device, uint8_t *const buffer, const uint8_t buffer_size);
#endif #endif

21
Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c

@ -94,6 +94,8 @@ usb_error op_capture_hub_driver_interface(_working *const working) __sdcccall(1)
hub_config.type = USB_IS_HUB; hub_config.type = USB_IS_HUB;
CHECK(configure_device(working, interface, (device_config *const)&hub_config)); CHECK(configure_device(working, interface, (device_config *const)&hub_config));
RETURN_CHECK(configure_usb_hub(working)); RETURN_CHECK(configure_usb_hub(working));
done:
return result;
} }
usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall { usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall {
@ -129,25 +131,21 @@ usb_error op_cap_drv_intf(_working *const working) __z88dk_fastcall {
} }
} }
CHECK(op_parse_endpoint(working));
result = op_parse_endpoint(working);
done:
return result; return result;
} }
usb_error op_id_class_drv(_working *const working) __sdcccall(1) { usb_error op_id_class_drv(_working *const working) __sdcccall(1) {
usb_error result;
const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr; const interface_descriptor *const ptr = (const interface_descriptor *)working->ptr;
working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0; working->usb_device = ptr->bLength > 5 ? identify_class_driver(working) : 0;
CHECK(op_cap_drv_intf(working));
return result;
return op_cap_drv_intf(working);
} }
usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) { usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) {
usb_error result;
memset(working->config.buffer, 0, MAX_CONFIG_SIZE); memset(working->config.buffer, 0, MAX_CONFIG_SIZE);
const uint8_t max_packet_size = working->desc.bMaxPacketSize0; const uint8_t max_packet_size = working->desc.bMaxPacketSize0;
@ -158,8 +156,8 @@ usb_error op_get_cfg_desc(_working *const working) __sdcccall(1) {
working->ptr = (working->config.buffer + sizeof(config_descriptor)); working->ptr = (working->config.buffer + sizeof(config_descriptor));
working->interface_count = working->config.desc.bNumInterfaces; working->interface_count = working->config.desc.bNumInterfaces;
CHECK(op_id_class_drv(working));
return op_id_class_drv(working);
done:
return result; return result;
} }
@ -184,6 +182,8 @@ usb_error read_all_configs(enumeration_state *const state) {
} }
return USB_ERR_OK; return USB_ERR_OK;
done:
return result;
} }
usb_error enumerate_all_devices(void) { usb_error enumerate_all_devices(void) {
@ -196,8 +196,7 @@ usb_error enumerate_all_devices(void) {
work_area->count_of_detected_usb_devices = state.next_device_address; work_area->count_of_detected_usb_devices = state.next_device_address;
CHECK(result);
done:
return result; return result;
} }

2
Source/HBIOS/ch376-native/source-doc/base-drv/enumerate_hub.c

@ -77,4 +77,6 @@ usb_error configure_usb_hub(_working *const working) __z88dk_fastcall {
} while (--i != 0); } while (--i != 0);
return USB_ERR_OK; return USB_ERR_OK;
done:
return result;
} }

17
Source/HBIOS/ch376-native/source-doc/base-drv/protocol.c

@ -27,12 +27,10 @@ const setup_packet cmd_get_device_descriptor = {0x80, 6, {0, 1}, {0, 0}, 8};
* @return usb_error USB_ERR_OK if all good, otherwise specific error code * @return usb_error USB_ERR_OK if all good, otherwise specific error code
*/ */
usb_error usbtrn_get_descriptor(device_descriptor *const buffer) { usb_error usbtrn_get_descriptor(device_descriptor *const buffer) {
usb_error result;
setup_packet cmd; setup_packet cmd;
cmd = cmd_get_device_descriptor; cmd = cmd_get_device_descriptor;
cmd.wLength = 8; cmd.wLength = 8;
debugger();
result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8); result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, 8);
CHECK(result); CHECK(result);
@ -42,6 +40,9 @@ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) {
result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0); result = usb_control_transfer(&cmd, (uint8_t *)buffer, 0, buffer->bMaxPacketSize0);
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
/** /**
@ -51,7 +52,6 @@ usb_error usbtrn_get_descriptor(device_descriptor *const buffer) {
* @return usb_error USB_ERR_OK if all good, otherwise specific error code * @return usb_error USB_ERR_OK if all good, otherwise specific error code
*/ */
usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) { usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t device_address) {
usb_error result;
setup_packet cmd; setup_packet cmd;
cmd = cmd_get_device_descriptor; cmd = cmd_get_device_descriptor;
cmd.wLength = 8; cmd.wLength = 8;
@ -63,6 +63,8 @@ usb_error usbtrn_get_descriptor2(device_descriptor *const buffer, const uint8_t
cmd = cmd_get_device_descriptor; cmd = cmd_get_device_descriptor;
cmd.wLength = 18; cmd.wLength = 18;
RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0)); RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, buffer->bMaxPacketSize0));
done:
return result;
} }
const setup_packet cmd_set_device_address = {0x00, 5, {0, 0}, {0, 0}, 0}; const setup_packet cmd_set_device_address = {0x00, 5, {0, 0}, {0, 0}, 0};
@ -119,7 +121,7 @@ usb_error usbtrn_get_config_descriptor(config_descriptor *const buffer,
cmd.bValue[0] = config_index; cmd.bValue[0] = config_index;
cmd.wLength = (uint16_t)buffer_size; cmd.wLength = (uint16_t)buffer_size;
RETURN_CHECK(usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size));
return usb_control_transfer(&cmd, (uint8_t *)buffer, device_address, max_packet_size);
} }
usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index, usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index,
@ -127,7 +129,6 @@ usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index,
const uint8_t max_packet_size, const uint8_t max_packet_size,
const uint8_t max_buffer_size, const uint8_t max_buffer_size,
uint8_t *const buffer) { uint8_t *const buffer) {
usb_error result;
CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, sizeof(config_descriptor), device_address, CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, sizeof(config_descriptor), device_address,
max_packet_size)); max_packet_size));
@ -139,6 +140,8 @@ usb_error usbtrn_gfull_cfg_desc(const uint8_t config_index,
CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size)); CHECK(usbtrn_get_config_descriptor((config_descriptor *)buffer, config_index, max_length, device_address, max_packet_size));
return USB_ERR_OK; return USB_ERR_OK;
done:
return result;
} }
const setup_packet usb_cmd_clear_endpoint_halt = {2, 1, {0, 0}, {255, 0}, 0}; // ;byte 4 is the endpoint to be cleared const setup_packet usb_cmd_clear_endpoint_halt = {2, 1, {0, 0}, {255, 0}, 0}; // ;byte 4 is the endpoint to be cleared
@ -148,7 +151,5 @@ usb_error usbtrn_clear_endpoint_halt(const uint8_t endpoint_number, const uint8_
cmd = usb_cmd_clear_endpoint_halt; cmd = usb_cmd_clear_endpoint_halt;
cmd.bIndex[0] = endpoint_number; cmd.bIndex[0] = endpoint_number;
usb_error result = usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size);
RETURN_CHECK(result);
return usb_control_transfer(&cmd, (uint8_t *)0, device_address, max_packet_size);
} }

51
Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c

@ -13,11 +13,11 @@
#include "transfers.h" #include "transfers.h"
#include "ch376.h" #include "ch376.h"
#include "delay.h" #include "delay.h"
#include "z80.h"
#include <stdlib.h>
#include "ez80-helpers.h" #include "ez80-helpers.h"
#include "print.h" #include "print.h"
#include "z80.h"
#include <critical-section.h>
#include <stdlib.h>
#define LOWER_SAFE_RAM_ADDRESS 0x8000 #define LOWER_SAFE_RAM_ADDRESS 0x8000
@ -56,6 +56,8 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet,
if (transferIn && buffer == 0) if (transferIn && buffer == 0)
return USB_ERR_OTHER; return USB_ERR_OTHER;
critical_begin();
ch_set_usb_address(device_address); ch_set_usb_address(device_address);
ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet)); ch_write_data((const uint8_t *)cmd_packet, sizeof(setup_packet));
@ -74,12 +76,13 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet,
if (transferIn) { if (transferIn) {
ch_command(CH_CMD_WR_HOST_DATA); ch_command(CH_CMD_WR_HOST_DATA);
CH376_DATA_PORT = 0; CH376_DATA_PORT = 0;
delay();
ch_issue_token_out_ep0(); ch_issue_token_out_ep0();
result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */ result = ch_long_wait_int_and_get_status(); /* sometimes we get STALL here - seems to be ok to ignore */
if (result == USB_ERR_OK || result == USB_ERR_STALL)
return USB_ERR_OK;
if (result == USB_ERR_OK || result == USB_ERR_STALL) {
result = USB_ERR_OK;
goto done;
}
RETURN_CHECK(result); RETURN_CHECK(result);
} }
@ -88,6 +91,10 @@ usb_error usb_control_transfer(const setup_packet *const cmd_packet,
result = ch_long_wait_int_and_get_status(); result = ch_long_wait_int_and_get_status();
RETURN_CHECK(result); RETURN_CHECK(result);
done:
critical_end();
return result;
} }
usb_error usb_error
@ -126,9 +133,15 @@ usb_dat_in_trns_n_ext(uint8_t *buffer, uint16_t *buffer_size, const uint8_t devi
*/ */
usb_error usb_error
usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
critical_begin();
ch_set_usb_address(device_address); ch_set_usb_address(device_address);
return ch_data_in_transfer(buffer, buffer_size, endpoint);
result = ch_data_in_transfer(buffer, buffer_size, endpoint);
critical_end();
return result;
} }
/** /**
@ -142,21 +155,15 @@ usb_data_in_transfer(uint8_t *buffer, const uint16_t buffer_size, const uint8_t
*/ */
usb_error usb_error
usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
ch_set_usb_address(device_address);
critical_begin();
return ch_data_in_transfer_n(buffer, buffer_size, endpoint);
}
ch_set_usb_address(device_address);
usb_error
usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
result = ch_data_in_transfer_n(buffer, buffer_size, endpoint);
if (buffer != 0 && (uint16_t)buffer < LOWER_SAFE_RAM_ADDRESS)
return USB_BAD_ADDRESS;
critical_end();
if ((uint16_t)endpoint < LOWER_SAFE_RAM_ADDRESS)
return USB_BAD_ADDRESS;
return usb_data_out_transfer(buffer, buffer_size, device_address, endpoint);
return result;
} }
/** /**
@ -170,7 +177,13 @@ usb_dat_out_trns_ext(const uint8_t *buffer, uint16_t buffer_size, const uint8_t
*/ */
usb_error usb_error
usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) { usb_data_out_transfer(const uint8_t *buffer, uint16_t buffer_size, const uint8_t device_address, endpoint_param *const endpoint) {
critical_begin();
ch_set_usb_address(device_address); ch_set_usb_address(device_address);
return ch_data_out_transfer(buffer, buffer_size, endpoint);
result = ch_data_out_transfer(buffer, buffer_size, endpoint);
critical_end();
return result;
} }

11
Source/HBIOS/ch376-native/source-doc/base-drv/z80.h

@ -3,15 +3,4 @@
#include <stdint.h> #include <stdint.h>
#define EI __asm__("EI");
#define DI __asm__("DI");
#define HALT __asm__("HALT");
typedef void (*jump_fn_t)(void) __z88dk_fastcall;
typedef struct {
uint8_t jump_op_code; // JMP or CALL
jump_fn_t address;
} z80_jump_t;
#endif #endif

3
Source/HBIOS/ch376-native/source-doc/convert-for-uz80as.sh

@ -29,7 +29,8 @@ sed -E \
-e 's/\s+or\s+a,\((ix\+[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((ix\+[0-9-]+)\)/\tor\t\(\1\)/g' \
-e 's/\s+or\s+a,\((ix\-[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((ix\-[0-9-]+)\)/\tor\t\(\1\)/g' \
-e 's/\s+or\s+a,\((iy\+[0-9-]+)\)/\tor\t\(\1\)/g' \ -e 's/\s+or\s+a,\((iy\+[0-9-]+)\)/\tor\t\(\1\)/g' \
-e 's/\s+or\s+a,\((hl)\)/\tor\t\(\1\)/g' \
-e 's/\s+or\s+a,\s*\((hl)\)/\tor\t\(\1\)/g' \
-e 's/\s+sub\s+a,\s*\((hl)\)/\tsub\t\(\1\)/g' \
-e 's/\s+cp\s+a,(0x[0-9A-Fa-f]{2})/\tcp\t\1/g' \ -e 's/\s+cp\s+a,(0x[0-9A-Fa-f]{2})/\tcp\t\1/g' \
-e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \ -e 's/\s+or\s+a,(0x[0-9A-Fa-f]{2})/\tor\t\1/g' \
-e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \ -e 's/\s+xor\s+a,(0x[0-9A-Fa-f]{2})/\txor\t\1/g' \

8
Source/HBIOS/ch376-native/source-doc/depends.d

@ -1,5 +1,6 @@
./base-drv/dev_transfers.c: base-drv/dev_transfers.c ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/protocol.h ./base-drv/dev_transfers.c: base-drv/dev_transfers.c ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/protocol.h
./base-drv/critical-section.c: base-drv/critical-section.c ././source-doc/base-drv/critical-section.h
./base-drv/enumerate.c: base-drv/enumerate.c ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/print.h ./base-drv/enumerate.c: base-drv/enumerate.c ././source-doc/base-drv/enumerate.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/enumerate_hub.h ././source-doc/base-drv/enumerate_storage.h ././source-doc/base-drv/work-area.h ././source-doc/base-drv/print.h
./base-drv/usb_state.c: base-drv/usb_state.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/work-area.h ./base-drv/usb_state.c: base-drv/usb_state.c ././source-doc/base-drv/usb_state.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/work-area.h
./base-drv/class_hub.c: base-drv/class_hub.c ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h ./base-drv/class_hub.c: base-drv/class_hub.c ././source-doc/base-drv/class_hub.h ././source-doc/base-drv/ch376.h ././source-doc/base-drv/ch376inc.h ././source-doc/base-drv/delay.h ././source-doc/base-drv/protocol.h ././source-doc/base-drv/dev_transfers.h ././source-doc/base-drv/transfers.h ././source-doc/base-drv/usb_state.h
@ -14,15 +15,16 @@
./ufi-drv/ufi-init.c: ufi-drv/ufi-init.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/ufi-init.c: ufi-drv/ufi-init.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h
./ufi-drv/usb_cbi.c: ufi-drv/usb_cbi.c ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/usb_cbi.c: ufi-drv/usb_cbi.c ././source-doc/ufi-drv/usb_cbi.h
./ufi-drv/class_ufi.c: ufi-drv/class_ufi.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h ./ufi-drv/class_ufi.c: ufi-drv/class_ufi.c ././source-doc/ufi-drv/class_ufi.h ././source-doc/base-drv//transfers.h ././source-doc/ufi-drv/usb_cbi.h
./keyboard/kyb-init.c: keyboard/kyb-init.c ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/keyboard/class_hid.h ././source-doc/keyboard/class_hid_keyboard.h
./keyboard/kyb-init.c: keyboard/kyb-init.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h ././source-doc/keyboard/class_hid_keyboard.h
./keyboard/class_hid.c: keyboard/class_hid.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h ./keyboard/class_hid.c: keyboard/class_hid.c ././source-doc/keyboard/class_hid.h ././source-doc/base-drv//transfers.h
./keyboard/class_hid_keyboard.c: keyboard/class_hid_keyboard.c ././source-doc/keyboard/class_hid_keyboard.h
./scsi-drv/scsi-init.c: scsi-drv/scsi-init.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ./scsi-drv/scsi-init.c: scsi-drv/scsi-init.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h
./scsi-drv/class_scsi.c: scsi-drv/class_scsi.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h ./scsi-drv/class_scsi.c: scsi-drv/class_scsi.c ././source-doc/scsi-drv/class_scsi.h ././source-doc/base-drv//ch376inc.h ././source-doc/base-drv//delay.h ././source-doc/base-drv//transfers.h
## ##
./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s
./base-drv.s: base-drv/./dev_transfers.c.s base-drv/./critical-section.c.s base-drv/./enumerate.c.s base-drv/./usb_state.c.s base-drv/./class_hub.c.s base-drv/./enumerate_storage.c.s base-drv/./enumerate_hub.c.s base-drv/./usb-base-drv.c.s base-drv/./transfers.c.s base-drv/./ch376.c.s base-drv/./protocol.c.s base-drv/./work-area.c.s base-drv/./usb-init.c.s
## ##
./scsi-drv.s: scsi-drv/./scsi-init.c.s scsi-drv/./class_scsi.c.s ./scsi-drv.s: scsi-drv/./scsi-init.c.s scsi-drv/./class_scsi.c.s
## ##
./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s ./ufi-drv.s: ufi-drv/./ufi-init.c.s ufi-drv/./usb_cbi.c.s ufi-drv/./class_ufi.c.s
## ##
./keyboard.s: keyboard/./kyb-init.c.s keyboard/./class_hid.c.s
./keyboard.s: keyboard/./kyb-init.c.s keyboard/./class_hid.c.s keyboard/./class_hid_keyboard.c.s

15
Source/HBIOS/ch376-native/source-doc/keyboard/class_hid.c

@ -4,33 +4,26 @@
const setup_packet cmd_hid_set = {0x21, HID_SET_PROTOCOL, {0, 0}, {0, 0}, 0}; const setup_packet cmd_hid_set = {0x21, HID_SET_PROTOCOL, {0, 0}, {0, 0}, 0};
usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) { usb_error hid_set_protocol(const device_config_keyboard *const dev, const uint8_t protocol) __sdcccall(1) {
usb_error result;
setup_packet cmd; setup_packet cmd;
cmd = cmd_hid_set; cmd = cmd_hid_set;
cmd.bRequest = HID_SET_PROTOCOL; cmd.bRequest = HID_SET_PROTOCOL;
cmd.bValue[0] = protocol; cmd.bValue[0] = protocol;
result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
RETURN_CHECK(result);
return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
} }
usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) { usb_error hid_set_idle(const device_config_keyboard *const dev, const uint8_t duration) __sdcccall(1) {
usb_error result;
setup_packet cmd; setup_packet cmd;
cmd = cmd_hid_set; cmd = cmd_hid_set;
cmd.bRequest = HID_SET_IDLE; cmd.bRequest = HID_SET_IDLE;
cmd.bValue[0] = duration; cmd.bValue[0] = duration;
result = usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
RETURN_CHECK(result);
return usb_control_transfer(&cmd, NULL, dev->address, dev->max_packet_size);
} }
usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) { usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t const *report) __sdcccall(1) {
usb_error result;
setup_packet cmd; setup_packet cmd;
cmd = cmd_hid_set; cmd = cmd_hid_set;
@ -40,7 +33,5 @@ usb_error hid_get_input_report(const device_config_keyboard *const dev, uint8_t
cmd.bRequest = HID_GET_REPORT; cmd.bRequest = HID_GET_REPORT;
cmd.wLength = 8; cmd.wLength = 8;
result = usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size);
RETURN_CHECK(result);
return usb_control_transfer(&cmd, report, dev->address, dev->max_packet_size);
} }

343
Source/HBIOS/ch376-native/source-doc/keyboard/class_hid_keyboard.c

@ -0,0 +1,343 @@
#include "class_hid_keyboard.h"
#define ESC 0x1B
/**
* scan codes sourced from https://deskthority.net/wiki/Scancode
*
*/
char scancodes_shift_table[128] = {
0x00, /*Reserved*/
0x00, /*Reserved*/
0x00, /*Reserved*/
0x00, /*Reserved*/
/* 0x04 */
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
/* 0x0C */
'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
/* 0X14 */
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
/* 0X1C */
'Y',
'Z',
'!',
'@',
'#',
'$',
'%',
'^',
/* 0x24 */
'&',
'*',
'(',
')',
'\r',
ESC,
'\b',
'\t',
/* 0x2C */
' ',
'_',
'+',
'{',
'}',
'|',
'~',
':',
/* 0x34 */
'"',
'~',
'<',
'>',
'?',
0x00 /*CAPSLOCK*/,
0x00 /* F1 */,
0x00 /* F2 */,
/* 0x3C */
0x00 /* F3 */,
0x00 /* F4 */,
0x00 /* F5 */,
0x00 /* F6 */,
0x00 /* F7 */,
0x00 /* F8 */,
0x00 /* F9 */,
0x00 /* F10 */,
/* 0x44 */
0x00 /* F11 */,
0x00 /* F12 */,
0x00 /* PRINTSCREEN */,
0x00 /* SCROLLLOCK */,
0x00 /* PAUSE */,
0x00 /* INSERT */,
0x00 /* HOME */,
0x00 /* PAGEUP */,
/* 0x4C */
0x00 /* DELETE */,
0x00 /* END */,
0x00 /* PAGEDOWN */,
0x00 /* RIGHT */,
0x00 /* LEFT */,
0x00 /* DOWN */,
0x00 /* UP */,
0x00 /* NUMLOCK */,
/* 0x54 */
'/' /* KP / */,
'*' /* KP * */,
'-' /* KP - */,
'+' /* KP + */,
'\r' /* KP ENTER */,
'1' /* KP 1 */,
'2' /* KP 2 */,
'3' /* KP 3 */,
/* 0x5C */
'4' /* KP 4 */,
'5' /* KP 5 */,
'6' /* KP 6 */,
'7' /* KP 7 */,
'8' /* KP 8 */,
'9' /* KP 9 */,
'0' /* KP 0 */,
'.' /* KP . */,
/* 0x64 */
'\\',
0x00 /* MENU */,
0x00 /* POWER */,
'=' /* KP = */,
0x00 /* F13 */,
0x00 /* F14 */,
0x00 /* F15 */,
0x00 /* F16 */,
/* 0x6C */
0x00 /* F17 */,
0x00 /* F18 */,
0x00 /* F19 */,
0x00 /* F20 */,
0x00 /* F21 */,
0x00 /* F22 */,
0x00 /* F23 */,
0x00 /* F24 */,
/* 0x74 */
0x00 /* EXECUTE */,
0x00 /* HELP */,
0x00 /* MENU */,
0x00 /* SELECT */,
0x00 /* STOP */,
0x00 /* AGAIN */,
0x00 /* UNDO */,
0x00 /* CUT */,
/* 0x7C */
0x00 /* COPY */,
0x00 /* PASTE */,
0x00 /* FIND */,
0x00 /* MUTE */,
};
char scancodes_table[128] = {
0x00, /*Reserved*/
0x00, /*Reserved*/
0x00, /*Reserved*/
0x00, /*Reserved*/
/* 0x04 */
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
/* 0x0C */
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
/* 0x14 */
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
/* 0x1C */
'y',
'z',
'1',
'2',
'3',
'4',
'5',
'6',
/* 0x24 */
'7',
'8',
'9',
'0',
'\r',
ESC,
'\b',
'\t',
/* 0x2C */
' ',
'-',
'=',
'[',
']',
'\\',
'#',
';',
/* 0x34 */
'\'',
'`',
',',
'.',
'/',
0x00 /*CAPSLOCK*/,
0x00 /* F1 */,
0x00 /* F2 */,
/* 0x3C */
0x00 /* F3 */,
0x00 /* F4 */,
0x00 /* F5 */,
0x00 /* F6 */,
0x00 /* F7 */,
0x00 /* F8 */,
0x00 /* F9 */,
0x00 /* F10 */,
/* 0x44 */
0x00 /* F11 */,
0x00 /* F12 */,
0x00 /* PRINTSCREEN */,
0x00 /* SCROLLLOCK */,
0x00 /* PAUSE */,
0x00 /* INSERT */,
0x00 /* HOME */,
0x00 /* PAGEUP */,
/* 0x4C */
0x00 /* DELETE */,
0x00 /* END */,
0x00 /* PAGEDOWN */,
0x00 /* RIGHT */,
0x00 /* LEFT */,
0x00 /* DOWN */,
0x00 /* UP */,
0x00 /* NUMLOCK */,
/* 0x54 */
'/' /* KP / */,
'*' /* KP * */,
'-' /* KP - */,
'+' /* KP + */,
'\r' /* KP ENTER */,
'1' /* KP 1 */,
'2' /* KP 2 */,
'3' /* KP 3 */,
/* 0x5C */
'4' /* KP 4 */,
'5' /* KP 5 */,
'6' /* KP 6 */,
'7' /* KP 7 */,
'8' /* KP 8 */,
'9' /* KP 9 */,
'0' /* KP 0 */,
'.' /* KP . */,
/* 0x64 */
'\\',
0x00 /* MENU */,
0x00 /* POWER */,
'=' /* KP = */,
0x00 /* F13 */,
0x00 /* F14 */,
0x00 /* F15 */,
0x00 /* F16 */,
/* 0x6C */
0x00 /* F17 */,
0x00 /* F18 */,
0x00 /* F19 */,
0x00 /* F20 */,
0x00 /* F21 */,
0x00 /* F22 */,
0x00 /* F23 */,
0x00 /* F24 */,
/* 0x74 */
0x00 /* EXECUTE */,
0x00 /* HELP */,
0x00 /* MENU */,
0x00 /* SELECT */,
0x00 /* STOP */,
0x00 /* AGAIN */,
0x00 /* UNDO */,
0x00 /* CUT */,
/* 0x7C */
0x00 /* COPY */,
0x00 /* PASTE */,
0x00 /* FIND */,
0x00 /* MUTE */,
};
char scancode_to_char(const uint8_t modifier_keys, const uint8_t code) __sdcccall(1) {
if (code >= 0x80)
return 0;
if (modifier_keys & (KEY_MOD_LSHIFT | KEY_MOD_RSHIFT))
return scancodes_shift_table[code];
return scancodes_table[code];
}

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

@ -1,15 +1,20 @@
#include "class_hid.h" #include "class_hid.h"
#include "class_hid_keyboard.h" #include "class_hid_keyboard.h"
#include <critical-section.h>
#include <dev_transfers.h> #include <dev_transfers.h>
#include <print.h> #include <print.h>
#include <stdint.h> #include <stdint.h>
#include <usb_state.h> #include <usb_state.h>
static device_config_keyboard *keyboard_config = 0;
void keyboard_init(void) { void keyboard_init(void) {
uint8_t index = 1; uint8_t index = 1;
keyboard_config = NULL;
do { do {
device_config_keyboard *const keyboard_config = (device_config_keyboard *)get_usb_device_config(index);
keyboard_config = (device_config_keyboard *)get_usb_device_config(index);
if (keyboard_config == NULL) if (keyboard_config == NULL)
break; break;
@ -21,7 +26,6 @@ void keyboard_init(void) {
print_uint16(index); print_uint16(index);
print_string(" $"); print_string(" $");
// keyboard_config->drive_index = usb_device_count++;
hid_set_protocol(keyboard_config, 1); hid_set_protocol(keyboard_config, 1);
hid_set_idle(keyboard_config, 0x80); hid_set_idle(keyboard_config, 0x80);
return; return;
@ -31,24 +35,63 @@ void keyboard_init(void) {
print_string("\r\nUSB: KEYBOARD: NOT FOUND$"); print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
} }
// void drv_timi_keyboard(void) {
// _usb_state *const p = get_usb_work_area();
// if (p->active)
// return;
#define KEYBOARD_BUFFER_SIZE 8
#define KEYBOARD_BUFFER_SIZE_MASK 7
typedef struct {
uint8_t modifier_keys;
uint8_t key_code;
} keyboard_event;
keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}};
uint8_t write_index = 0;
uint8_t read_index = 0;
void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
if (key_code >= 0x80 || key_code == 0)
return; // ignore ???
uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
if (next_write_index != read_index) { // Check if buffer is not full
buffer[write_index].modifier_keys = modifier_keys;
buffer[write_index].key_code = key_code;
write_index = next_write_index;
}
}
// p->active = true;
uint8_t keyboard_buf_size() __sdcccall(1) {
if (write_index >= read_index)
return write_index - read_index;
// device_config_keyboard *const keyboard_config = (device_config_keyboard *)find_device_config(USB_IS_KEYBOARD);
return KEYBOARD_BUFFER_SIZE - read_index + write_index;
}
// keyboard_report report;
uint32_t keyboard_buf_get_next() {
if (write_index == read_index) // Check if buffer is empty
return 255 << 8;
// ch_configure_nak_retry_disable();
// const usb_error result = usbdev_data_in_transfer_ep0((device_config *)keyboard_config, (uint8_t *)report, 8);
// ch_configure_nak_retry_3s();
// if (result == 0) {
// const char c = scancode_to_char(report.bModifierKeys, report.keyCode[0]);
// key_put_into_buf(c);
// }
const uint8_t modifier_key = buffer[read_index].modifier_keys;
const uint8_t key_code = buffer[read_index].key_code;
read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
const unsigned char c = scancode_to_char(modifier_key, key_code);
/* D = modifier, e-> char, H = 0, L=>code */
return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
}
// p->active = false;
// }
void keyboard_buf_flush() {
write_index = 0;
read_index = 0;
}
uint8_t active = 0;
keyboard_report report = {0};
void keyboard_tick(void) {
if (is_in_critical_section())
return;
ch_configure_nak_retry_disable();
result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8);
ch_configure_nak_retry_3s();
if (result == 0)
keyboard_buf_put(report.bModifierKeys, report.keyCode[0]);
}

13
Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c

@ -1,4 +1,5 @@
#include "class_scsi.h" #include "class_scsi.h"
#include <critical-section.h>
#include <string.h> #include <string.h>
#include <usb_state.h> #include <usb_state.h>
#include <z80.h> #include <z80.h>
@ -18,6 +19,8 @@ usb_error do_scsi_cmd(device_config_storage *const dev,
if (!send) if (!send)
cbw->bmCBWFlags = 0x80; cbw->bmCBWFlags = 0x80;
critical_begin();
CHECK(usb_data_out_transfer((uint8_t *)cbw, sizeof(_scsi_command_block_wrapper) + 16, dev->address, CHECK(usb_data_out_transfer((uint8_t *)cbw, sizeof(_scsi_command_block_wrapper) + 16, dev->address,
&dev->endpoints[ENDPOINT_BULK_OUT])); &dev->endpoints[ENDPOINT_BULK_OUT]));
@ -36,9 +39,13 @@ usb_error do_scsi_cmd(device_config_storage *const dev,
usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN])); usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0]) if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
return USB_ERR_FAIL;
result = USB_ERR_FAIL;
else
result = USB_ERR_OK;
return USB_ERR_OK;
done:
critical_end();
return result;
} }
_scsi_read_capacity scsi_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}}; _scsi_read_capacity scsi_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}};
@ -99,8 +106,10 @@ usb_error scsi_sense_init(device_config_storage *const dev) {
scsi_sense_result response; scsi_sense_result response;
uint8_t counter = 3; uint8_t counter = 3;
critical_begin();
while ((result = scsi_test(dev)) && --counter > 0) while ((result = scsi_test(dev)) && --counter > 0)
scsi_request_sense(dev, &response); scsi_request_sense(dev, &response);
critical_end();
return result; return result;
} }

1
Source/HBIOS/ch376-native/source-doc/scsi-drv/scsi-init.c

@ -25,7 +25,6 @@ void chscsi_init(void) {
print_uint16(index); print_uint16(index);
print_string(" $"); print_string(" $");
// storage_device->drive_index = usb_device_count++;
scsi_sense_init(storage_device); scsi_sense_init(storage_device);
dio_add_entry(ch_scsi_fntbl, storage_device); dio_add_entry(ch_scsi_fntbl, storage_device);
} }

18
Source/HBIOS/ch376-native/source-doc/ufi-drv/class_ufi.c

@ -41,8 +41,9 @@ usb_error ufi_test_unit_ready(device_config *const storage_device, ufi_request_s
result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response), result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response),
(uint8_t *)response, NULL); (uint8_t *)response, NULL);
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) { usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) {
@ -53,6 +54,8 @@ usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sen
(uint8_t *)response, NULL); (uint8_t *)response, NULL);
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) { usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) {
@ -78,6 +81,8 @@ usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_cap
TRACE_USB_ERROR(result); TRACE_USB_ERROR(result);
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) { usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) {
@ -88,6 +93,8 @@ usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response
usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_inquiry, false, sizeof(ufi_inquiry_response), (uint8_t *)response, NULL); usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_inquiry, false, sizeof(ufi_inquiry_response), (uint8_t *)response, NULL);
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error ufi_read_write_sector(device_config *const storage_device, usb_error ufi_read_write_sector(device_config *const storage_device,
@ -106,6 +113,8 @@ usb_error ufi_read_write_sector(device_config *const storage_device,
usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes); usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes);
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
/** /**
@ -149,17 +158,16 @@ usb_error ufi_format(device_config *const storage_device,
// trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list)); // trace_printf("ufi_format: %d, %02X %02X (len: %d)\r\n", result, sense_codes.bASC, sense_codes.bASCQ, sizeof(parameter_list));
RETURN_CHECK(result); RETURN_CHECK(result);
done:
return result;
} }
usb_error ufi_send_diagnostics(device_config *const storage_device) { usb_error ufi_send_diagnostics(device_config *const storage_device) {
usb_error result;
ufi_send_diagnostic_command ufi_cmd_send_diagnostic; ufi_send_diagnostic_command ufi_cmd_send_diagnostic;
ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic; ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic;
result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL);
RETURN_CHECK(result);
return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL);
} }
uint32_t convert_from_msb_first(const uint8_t *const buffer) { uint32_t convert_from_msb_first(const uint8_t *const buffer) {

21
Source/HBIOS/ch376-native/source-doc/ufi-drv/usb_cbi.c

@ -2,6 +2,7 @@
#include "dev_transfers.h" #include "dev_transfers.h"
#include "protocol.h" #include "protocol.h"
#include <ch376.h> #include <ch376.h>
#include <critical-section.h>
setup_packet cbi2_adsc = {0x21, 0, {0, 0}, {255, 0}, 12}; // ;4th byte is interface number setup_packet cbi2_adsc = {0x21, 0, {0, 0}, {255, 0}, 12}; // ;4th byte is interface number
@ -13,26 +14,27 @@ usb_error usb_execute_cbi(device_config *const storage_device,
uint8_t *const buffer, uint8_t *const buffer,
uint8_t *const sense_codes) { uint8_t *const sense_codes) {
usb_error result;
const uint8_t interface_number = storage_device->interface_number; const uint8_t interface_number = storage_device->interface_number;
setup_packet adsc; setup_packet adsc;
adsc = cbi2_adsc; adsc = cbi2_adsc;
adsc.bIndex[0] = interface_number; adsc.bIndex[0] = interface_number;
critical_begin();
result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd); result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd);
if (result == USB_ERR_STALL) { if (result == USB_ERR_STALL) {
if (sense_codes != NULL) if (sense_codes != NULL)
usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN); usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN);
return USB_ERR_STALL;
result = USB_ERR_STALL;
goto done;
} }
if (result != USB_ERR_OK) { if (result != USB_ERR_OK) {
TRACE_USB_ERROR(result); TRACE_USB_ERROR(result);
return result;
goto done;
} }
if (send) { if (send) {
@ -40,14 +42,14 @@ usb_error usb_execute_cbi(device_config *const storage_device,
if (result != USB_ERR_OK) { if (result != USB_ERR_OK) {
TRACE_USB_ERROR(result); TRACE_USB_ERROR(result);
return result;
goto done;
} }
} else { } else {
result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN); result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN);
if (result != USB_ERR_OK) { if (result != USB_ERR_OK) {
TRACE_USB_ERROR(result); TRACE_USB_ERROR(result);
return result;
goto done;
} }
} }
@ -56,9 +58,12 @@ usb_error usb_execute_cbi(device_config *const storage_device,
if (result != USB_ERR_OK) { if (result != USB_ERR_OK) {
TRACE_USB_ERROR(result); TRACE_USB_ERROR(result);
return result;
// goto done;
} }
} }
return USB_ERR_OK;
done:
critical_end();
return result;
} }

160
Source/HBIOS/ch376-native/ufi-drv/class_ufi.c.s

@ -196,10 +196,10 @@ _ufi_test_unit_ready:
ld l, e ld l, e
ld h, d ld h, d
ld b,0x0c ld b,0x0c
l_ufi_test_unit_ready_00103:
l_ufi_test_unit_ready_00104:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_ufi_test_unit_ready_00103
djnz l_ufi_test_unit_ready_00104
;source-doc/ufi-drv/./class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL); ;source-doc/ufi-drv/./class_ufi.c:37: usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_test_unit_ready, false, 0, NULL, NULL);
ld hl,0x0000 ld hl,0x0000
push hl push hl
@ -245,12 +245,12 @@ l_ufi_test_unit_ready_00103:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _usb_execute_cbi call _usb_execute_cbi
;source-doc/ufi-drv/./class_ufi.c:45: RETURN_CHECK(result);
;source-doc/ufi-drv/./class_ufi.c:46: }
;source-doc/ufi-drv/./class_ufi.c:46: return result;
;source-doc/ufi-drv/./class_ufi.c:47: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:48: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) {
;source-doc/ufi-drv/./class_ufi.c:49: usb_error ufi_request_sense(device_config *const storage_device, ufi_request_sense_response const *response) {
; --------------------------------- ; ---------------------------------
; Function ufi_request_sense ; Function ufi_request_sense
; --------------------------------- ; ---------------------------------
@ -261,7 +261,7 @@ _ufi_request_sense:
ld hl, -12 ld hl, -12
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./class_ufi.c:50: ufi_cmd_request_sense = _ufi_cmd_request_sense;
;source-doc/ufi-drv/./class_ufi.c:51: ufi_cmd_request_sense = _ufi_cmd_request_sense;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld c, l ld c, l
@ -273,7 +273,7 @@ _ufi_request_sense:
ld bc,0x000c ld bc,0x000c
ldir ldir
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:52: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response),
;source-doc/ufi-drv/./class_ufi.c:53: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_request_sense, false, sizeof(ufi_request_sense_response),
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
ld hl,0x0000 ld hl,0x0000
@ -289,12 +289,12 @@ _ufi_request_sense:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _usb_execute_cbi call _usb_execute_cbi
;source-doc/ufi-drv/./class_ufi.c:55: RETURN_CHECK(result);
;source-doc/ufi-drv/./class_ufi.c:56: }
;source-doc/ufi-drv/./class_ufi.c:58: return result;
;source-doc/ufi-drv/./class_ufi.c:59: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:58: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) {
;source-doc/ufi-drv/./class_ufi.c:61: usb_error ufi_read_frmt_caps(device_config *const storage_device, ufi_format_capacities_response const *response) {
; --------------------------------- ; ---------------------------------
; Function ufi_read_frmt_caps ; Function ufi_read_frmt_caps
; --------------------------------- ; ---------------------------------
@ -305,14 +305,14 @@ _ufi_read_frmt_caps:
ld hl, -24 ld hl, -24
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./class_ufi.c:62: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities;
;source-doc/ufi-drv/./class_ufi.c:65: ufi_cmd_read_format_capacities = _ufi_cmd_read_format_capacities;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
ld hl,__ufi_cmd_read_format_capacitie ld hl,__ufi_cmd_read_format_capacitie
ld bc,0x000c ld bc,0x000c
ldir ldir
;source-doc/ufi-drv/./class_ufi.c:63: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL);
;source-doc/ufi-drv/./class_ufi.c:66: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_read_format_capacities, false, 12, (uint8_t *)response, NULL);
ld c,(ix+6) ld c,(ix+6)
ld b,(ix+7) ld b,(ix+7)
push bc push bc
@ -337,24 +337,26 @@ _ufi_read_frmt_caps:
pop af pop af
pop af pop af
inc sp inc sp
ld e, l
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:66: CHECK(result);
ld a, l
;source-doc/ufi-drv/./class_ufi.c:69: CHECK(result);
ld a,e
ld d,a
or a or a
jr NZ,l_ufi_read_frmt_caps_00103 jr NZ,l_ufi_read_frmt_caps_00103
;source-doc/ufi-drv/./class_ufi.c:68: const uint8_t available_length = response->capacity_list_length;
;source-doc/ufi-drv/./class_ufi.c:71: const uint8_t available_length = response->capacity_list_length;
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
ld hl,3 ld hl,3
add hl, de add hl, de
ld e, (hl) ld e, (hl)
;source-doc/ufi-drv/./class_ufi.c:70: const uint8_t max_length =
;source-doc/ufi-drv/./class_ufi.c:73: const uint8_t max_length =
ld a,0x24 ld a,0x24
sub e sub e
jr NC,l_ufi_read_frmt_caps_00105
jr NC,l_ufi_read_frmt_caps_00106
ld e,0x24 ld e,0x24
l_ufi_read_frmt_caps_00105:
;source-doc/ufi-drv/./class_ufi.c:74: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd));
l_ufi_read_frmt_caps_00106:
;source-doc/ufi-drv/./class_ufi.c:77: memcpy(&cmd, &ufi_cmd_read_format_capacities, sizeof(cmd));
push de push de
push bc push bc
ex de, hl ex de, hl
@ -367,9 +369,9 @@ l_ufi_read_frmt_caps_00105:
ldir ldir
pop bc pop bc
pop de pop de
;source-doc/ufi-drv/./class_ufi.c:75: cmd.allocation_length[1] = max_length;
;source-doc/ufi-drv/./class_ufi.c:78: cmd.allocation_length[1] = max_length;
ld (ix-4),e ld (ix-4),e
;source-doc/ufi-drv/./class_ufi.c:77: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL);
;source-doc/ufi-drv/./class_ufi.c:80: result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, false, max_length, (uint8_t *)response, NULL);
ld d,0x00 ld d,0x00
ld hl,0x0000 ld hl,0x0000
push hl push hl
@ -391,13 +393,16 @@ l_ufi_read_frmt_caps_00105:
pop af pop af
pop af pop af
inc sp inc sp
;source-doc/ufi-drv/./class_ufi.c:80: RETURN_CHECK(result);
ld d, l
;source-doc/ufi-drv/./class_ufi.c:84: done:
l_ufi_read_frmt_caps_00103: l_ufi_read_frmt_caps_00103:
;source-doc/ufi-drv/./class_ufi.c:81: }
;source-doc/ufi-drv/./class_ufi.c:85: return result;
ld l, d
;source-doc/ufi-drv/./class_ufi.c:86: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:83: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) {
;source-doc/ufi-drv/./class_ufi.c:88: usb_error ufi_inquiry(device_config *const storage_device, ufi_inquiry_response const *response) {
; --------------------------------- ; ---------------------------------
; Function ufi_inquiry ; Function ufi_inquiry
; --------------------------------- ; ---------------------------------
@ -408,7 +413,7 @@ _ufi_inquiry:
ld hl, -12 ld hl, -12
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./class_ufi.c:85: ufi_cmd_inquiry = _ufi_cmd_inquiry;
;source-doc/ufi-drv/./class_ufi.c:90: ufi_cmd_inquiry = _ufi_cmd_inquiry;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld c, l ld c, l
@ -420,7 +425,7 @@ _ufi_inquiry:
ld bc,0x000c ld bc,0x000c
ldir ldir
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:87: usb_error result =
;source-doc/ufi-drv/./class_ufi.c:92: usb_error result =
ld e,(ix+6) ld e,(ix+6)
ld d,(ix+7) ld d,(ix+7)
ld hl,0x0000 ld hl,0x0000
@ -436,12 +441,12 @@ _ufi_inquiry:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _usb_execute_cbi call _usb_execute_cbi
;source-doc/ufi-drv/./class_ufi.c:90: RETURN_CHECK(result);
;source-doc/ufi-drv/./class_ufi.c:91: }
;source-doc/ufi-drv/./class_ufi.c:97: return result;
;source-doc/ufi-drv/./class_ufi.c:98: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:93: usb_error ufi_read_write_sector(device_config *const storage_device,
;source-doc/ufi-drv/./class_ufi.c:100: usb_error ufi_read_write_sector(device_config *const storage_device,
; --------------------------------- ; ---------------------------------
; Function ufi_read_write_sector ; Function ufi_read_write_sector
; --------------------------------- ; ---------------------------------
@ -452,33 +457,33 @@ _ufi_read_write_sector:
ld hl, -12 ld hl, -12
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./class_ufi.c:100: memset(&cmd, 0, sizeof(cmd));
;source-doc/ufi-drv/./class_ufi.c:107: memset(&cmd, 0, sizeof(cmd));
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld b,0x0c ld b,0x0c
l_ufi_read_write_sector_00112:
l_ufi_read_write_sector_00113:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_ufi_read_write_sector_00112
;source-doc/ufi-drv/./class_ufi.c:101: cmd.operation_code = send ? 0x2A : 0x28;
djnz l_ufi_read_write_sector_00113
;source-doc/ufi-drv/./class_ufi.c:108: cmd.operation_code = send ? 0x2A : 0x28;
bit 0,(ix+6) bit 0,(ix+6)
jr Z,l_ufi_read_write_sector_00103
jr Z,l_ufi_read_write_sector_00104
ld a,0x2a ld a,0x2a
jr l_ufi_read_write_sector_00104
l_ufi_read_write_sector_00103:
ld a,0x28
jr l_ufi_read_write_sector_00105
l_ufi_read_write_sector_00104: l_ufi_read_write_sector_00104:
ld a,0x28
l_ufi_read_write_sector_00105:
ld (ix-12),a ld (ix-12),a
;source-doc/ufi-drv/./class_ufi.c:102: cmd.lba[2] = sector_number >> 8;
;source-doc/ufi-drv/./class_ufi.c:109: cmd.lba[2] = sector_number >> 8;
ld a,(ix+8) ld a,(ix+8)
ld (ix-8),a ld (ix-8),a
;source-doc/ufi-drv/./class_ufi.c:103: cmd.lba[3] = sector_number & 0xFF;
;source-doc/ufi-drv/./class_ufi.c:110: cmd.lba[3] = sector_number & 0xFF;
ld a,(ix+7) ld a,(ix+7)
ld (ix-7),a ld (ix-7),a
;source-doc/ufi-drv/./class_ufi.c:104: cmd.transfer_length[1] = sector_count;
;source-doc/ufi-drv/./class_ufi.c:111: cmd.transfer_length[1] = sector_count;
ld a,(ix+9) ld a,(ix+9)
ld (ix-4),a ld (ix-4),a
;source-doc/ufi-drv/./class_ufi.c:106: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes);
;source-doc/ufi-drv/./class_ufi.c:113: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, send, 512 * sector_count, (uint8_t *)buffer, sense_codes);
ld a,(ix+9) ld a,(ix+9)
add a, a add a, a
ld c,0x00 ld c,0x00
@ -500,12 +505,12 @@ l_ufi_read_write_sector_00104:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _usb_execute_cbi call _usb_execute_cbi
;source-doc/ufi-drv/./class_ufi.c:108: RETURN_CHECK(result);
;source-doc/ufi-drv/./class_ufi.c:109: }
;source-doc/ufi-drv/./class_ufi.c:117: return result;
;source-doc/ufi-drv/./class_ufi.c:118: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:118: usb_error ufi_format(device_config *const storage_device,
;source-doc/ufi-drv/./class_ufi.c:127: usb_error ufi_format(device_config *const storage_device,
; --------------------------------- ; ---------------------------------
; Function ufi_format ; Function ufi_format
; --------------------------------- ; ---------------------------------
@ -516,17 +521,17 @@ _ufi_format:
ld hl, -26 ld hl, -26
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./class_ufi.c:125: memset(&parameter_list, 0, sizeof(parameter_list));
;source-doc/ufi-drv/./class_ufi.c:134: memset(&parameter_list, 0, sizeof(parameter_list));
ld hl,2 ld hl,2
add hl, sp add hl, sp
push hl push hl
ld b,0x0c ld b,0x0c
l_ufi_format_00103:
l_ufi_format_00104:
ld (hl),0x00 ld (hl),0x00
inc hl inc hl
djnz l_ufi_format_00103
djnz l_ufi_format_00104
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:128: cmd = _ufi_cmd_format;
;source-doc/ufi-drv/./class_ufi.c:137: cmd = _ufi_cmd_format;
ld hl,14 ld hl,14
add hl, sp add hl, sp
ex de, hl ex de, hl
@ -535,14 +540,14 @@ l_ufi_format_00103:
ld bc,0x000c ld bc,0x000c
ldir ldir
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:131: cmd.track_number = track_number;
;source-doc/ufi-drv/./class_ufi.c:140: cmd.track_number = track_number;
ld a,(ix+7) ld a,(ix+7)
ld (ix-10),a ld (ix-10),a
;source-doc/ufi-drv/./class_ufi.c:132: cmd.interleave[1] = 0;
;source-doc/ufi-drv/./class_ufi.c:141: cmd.interleave[1] = 0;
ld (ix-8),0x00 ld (ix-8),0x00
;source-doc/ufi-drv/./class_ufi.c:133: cmd.parameter_list_length[1] = sizeof(parameter_list);
;source-doc/ufi-drv/./class_ufi.c:142: cmd.parameter_list_length[1] = sizeof(parameter_list);
ld (ix-4),0x0c ld (ix-4),0x0c
;source-doc/ufi-drv/./class_ufi.c:135: parameter_list.defect_list_header.side = side;
;source-doc/ufi-drv/./class_ufi.c:144: parameter_list.defect_list_header.side = side;
ld e, c ld e, c
ld d, b ld d, b
inc de inc de
@ -553,36 +558,36 @@ l_ufi_format_00103:
and 0xfe and 0xfe
or l or l
ld (de), a ld (de), a
;source-doc/ufi-drv/./class_ufi.c:136: parameter_list.defect_list_header.immediate = 0;
;source-doc/ufi-drv/./class_ufi.c:145: parameter_list.defect_list_header.immediate = 0;
ld l, e ld l, e
ld h, d ld h, d
res 1, (hl) res 1, (hl)
;source-doc/ufi-drv/./class_ufi.c:137: parameter_list.defect_list_header.reserved2 = 0;
;source-doc/ufi-drv/./class_ufi.c:146: parameter_list.defect_list_header.reserved2 = 0;
ld l, e ld l, e
ld h, d ld h, d
ld a, (hl) ld a, (hl)
and 0xf3 and 0xf3
ld (hl), a ld (hl), a
;source-doc/ufi-drv/./class_ufi.c:138: parameter_list.defect_list_header.single_track = 1;
;source-doc/ufi-drv/./class_ufi.c:147: parameter_list.defect_list_header.single_track = 1;
ld l, e ld l, e
ld h, d ld h, d
set 4, (hl) set 4, (hl)
;source-doc/ufi-drv/./class_ufi.c:139: parameter_list.defect_list_header.dcrt = 1;
;source-doc/ufi-drv/./class_ufi.c:148: parameter_list.defect_list_header.dcrt = 1;
ld l, e ld l, e
ld h, d ld h, d
set 5, (hl) set 5, (hl)
;source-doc/ufi-drv/./class_ufi.c:140: parameter_list.defect_list_header.extend = 0;
;source-doc/ufi-drv/./class_ufi.c:149: parameter_list.defect_list_header.extend = 0;
ld l, e ld l, e
ld h, d ld h, d
res 6, (hl) res 6, (hl)
;source-doc/ufi-drv/./class_ufi.c:141: parameter_list.defect_list_header.fov = 1;
;source-doc/ufi-drv/./class_ufi.c:150: parameter_list.defect_list_header.fov = 1;
ex de, hl ex de, hl
set 7, (hl) set 7, (hl)
;source-doc/ufi-drv/./class_ufi.c:142: parameter_list.defect_list_header.defect_list_length_msb = 0;
;source-doc/ufi-drv/./class_ufi.c:151: parameter_list.defect_list_header.defect_list_length_msb = 0;
ld (ix-22),0x00 ld (ix-22),0x00
;source-doc/ufi-drv/./class_ufi.c:143: parameter_list.defect_list_header.defect_list_length_lsb = 8;
;source-doc/ufi-drv/./class_ufi.c:152: parameter_list.defect_list_header.defect_list_length_lsb = 8;
ld (ix-21),0x08 ld (ix-21),0x08
;source-doc/ufi-drv/./class_ufi.c:144: memcpy(&parameter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor));
;source-doc/ufi-drv/./class_ufi.c:153: memcpy(&parameter_list.format_descriptor, (void *)format, sizeof(ufi_format_capacity_descriptor));
ld e,(ix+8) ld e,(ix+8)
ld d,(ix+9) ld d,(ix+9)
push bc push bc
@ -595,7 +600,7 @@ l_ufi_format_00103:
ld bc,0x0008 ld bc,0x0008
ldir ldir
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:146: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)&parameter_list,
;source-doc/ufi-drv/./class_ufi.c:155: usb_error result = usb_execute_cbi(storage_device, (uint8_t *)&cmd, true, sizeof(parameter_list), (uint8_t *)&parameter_list,
ld hl,0 ld hl,0
add hl, sp add hl, sp
push hl push hl
@ -612,12 +617,12 @@ l_ufi_format_00103:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _usb_execute_cbi call _usb_execute_cbi
;source-doc/ufi-drv/./class_ufi.c:151: RETURN_CHECK(result);
;source-doc/ufi-drv/./class_ufi.c:152: }
;source-doc/ufi-drv/./class_ufi.c:162: return result;
;source-doc/ufi-drv/./class_ufi.c:163: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:154: usb_error ufi_send_diagnostics(device_config *const storage_device) {
;source-doc/ufi-drv/./class_ufi.c:165: usb_error ufi_send_diagnostics(device_config *const storage_device) {
; --------------------------------- ; ---------------------------------
; Function ufi_send_diagnostics ; Function ufi_send_diagnostics
; --------------------------------- ; ---------------------------------
@ -628,7 +633,7 @@ _ufi_send_diagnostics:
ld hl, -12 ld hl, -12
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./class_ufi.c:158: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic;
;source-doc/ufi-drv/./class_ufi.c:168: ufi_cmd_send_diagnostic = _ufi_cmd_send_diagnostic;
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld c, l ld c, l
@ -640,7 +645,7 @@ _ufi_send_diagnostics:
ld bc,0x000c ld bc,0x000c
ldir ldir
pop bc pop bc
;source-doc/ufi-drv/./class_ufi.c:160: result = usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL);
;source-doc/ufi-drv/./class_ufi.c:170: return usb_execute_cbi(storage_device, (uint8_t *)&ufi_cmd_send_diagnostic, true, 0, NULL, NULL);
ld hl,0x0000 ld hl,0x0000
push hl push hl
push hl push hl
@ -653,12 +658,11 @@ _ufi_send_diagnostics:
ld h,(ix+5) ld h,(ix+5)
push hl push hl
call _usb_execute_cbi call _usb_execute_cbi
;source-doc/ufi-drv/./class_ufi.c:162: RETURN_CHECK(result);
;source-doc/ufi-drv/./class_ufi.c:163: }
;source-doc/ufi-drv/./class_ufi.c:171: }
ld sp,ix ld sp,ix
pop ix pop ix
ret ret
;source-doc/ufi-drv/./class_ufi.c:165: uint32_t convert_from_msb_first(const uint8_t *const buffer) {
;source-doc/ufi-drv/./class_ufi.c:173: uint32_t convert_from_msb_first(const uint8_t *const buffer) {
; --------------------------------- ; ---------------------------------
; Function convert_from_msb_first ; Function convert_from_msb_first
; --------------------------------- ; ---------------------------------
@ -668,40 +672,40 @@ _convert_from_msb_first:
add ix,sp add ix,sp
push af push af
push af push af
;source-doc/ufi-drv/./class_ufi.c:167: uint8_t *p_output = ((uint8_t *)&result);
;source-doc/ufi-drv/./class_ufi.c:175: uint8_t *p_output = ((uint8_t *)&result);
ld hl,0 ld hl,0
add hl, sp add hl, sp
ex de, hl ex de, hl
;source-doc/ufi-drv/./class_ufi.c:168: const uint8_t *p_input = buffer + 3;
;source-doc/ufi-drv/./class_ufi.c:176: const uint8_t *p_input = buffer + 3;
ld c,(ix+4) ld c,(ix+4)
ld b,(ix+5) ld b,(ix+5)
inc bc inc bc
inc bc inc bc
inc bc inc bc
;source-doc/ufi-drv/./class_ufi.c:170: *p_output++ = *p_input--;
;source-doc/ufi-drv/./class_ufi.c:178: *p_output++ = *p_input--;
ld a, (bc) ld a, (bc)
dec bc dec bc
ld (de), a ld (de), a
inc de inc de
;source-doc/ufi-drv/./class_ufi.c:171: *p_output++ = *p_input--;
;source-doc/ufi-drv/./class_ufi.c:179: *p_output++ = *p_input--;
ld a, (bc) ld a, (bc)
dec bc dec bc
ld (de), a ld (de), a
inc de inc de
;source-doc/ufi-drv/./class_ufi.c:172: *p_output++ = *p_input--;
;source-doc/ufi-drv/./class_ufi.c:180: *p_output++ = *p_input--;
ld a, (bc) ld a, (bc)
ld (de), a ld (de), a
inc de inc de
;source-doc/ufi-drv/./class_ufi.c:173: *p_output = *p_input--;
;source-doc/ufi-drv/./class_ufi.c:181: *p_output = *p_input--;
dec bc dec bc
ld a, (bc) ld a, (bc)
ld (de), a ld (de), a
;source-doc/ufi-drv/./class_ufi.c:175: return result;
;source-doc/ufi-drv/./class_ufi.c:183: return result;
pop hl pop hl
push hl push hl
ld e,(ix-2) ld e,(ix-2)
ld d,(ix-1) ld d,(ix-1)
;source-doc/ufi-drv/./class_ufi.c:176: }
;source-doc/ufi-drv/./class_ufi.c:184: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret

87
Source/HBIOS/ch376-native/ufi-drv/usb_cbi.c.s

@ -50,7 +50,7 @@ _cbi2_adsc:
;-------------------------------------------------------- ;--------------------------------------------------------
; code ; code
;-------------------------------------------------------- ;--------------------------------------------------------
;source-doc/ufi-drv/./usb_cbi.c:9: usb_error usb_execute_cbi(device_config *const storage_device,
;source-doc/ufi-drv/./usb_cbi.c:10: usb_error usb_execute_cbi(device_config *const storage_device,
; --------------------------------- ; ---------------------------------
; Function usb_execute_cbi ; Function usb_execute_cbi
; --------------------------------- ; ---------------------------------
@ -61,7 +61,7 @@ _usb_execute_cbi:
ld hl, -8 ld hl, -8
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/ufi-drv/./usb_cbi.c:18: const uint8_t interface_number = storage_device->interface_number;
;source-doc/ufi-drv/./usb_cbi.c:17: const uint8_t interface_number = storage_device->interface_number;
ld c,(ix+4) ld c,(ix+4)
ld b,(ix+5) ld b,(ix+5)
ld l, c ld l, c
@ -69,7 +69,7 @@ _usb_execute_cbi:
inc hl inc hl
inc hl inc hl
ld e, (hl) ld e, (hl)
;source-doc/ufi-drv/./usb_cbi.c:21: adsc = cbi2_adsc;
;source-doc/ufi-drv/./usb_cbi.c:20: adsc = cbi2_adsc;
push de push de
push bc push bc
ex de, hl ex de, hl
@ -81,9 +81,13 @@ _usb_execute_cbi:
ldir ldir
pop bc pop bc
pop de pop de
;source-doc/ufi-drv/./usb_cbi.c:22: adsc.bIndex[0] = interface_number;
;source-doc/ufi-drv/./usb_cbi.c:21: adsc.bIndex[0] = interface_number;
ld (ix-4),e ld (ix-4),e
;source-doc/ufi-drv/./usb_cbi.c:24: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd);
;source-doc/ufi-drv/./usb_cbi.c:23: critical_begin();
push bc
call _critical_begin
pop bc
;source-doc/ufi-drv/./usb_cbi.c:25: result = usbdev_control_transfer(storage_device, &adsc, (uint8_t *const)cmd);
ld l,(ix+6) ld l,(ix+6)
ld h,(ix+7) ld h,(ix+7)
push hl push hl
@ -96,14 +100,16 @@ _usb_execute_cbi:
pop af pop af
pop af pop af
ld a, l ld a, l
;source-doc/ufi-drv/./usb_cbi.c:26: if (result == USB_ERR_STALL) {
cp 0x02
ld (_result), a
;source-doc/ufi-drv/./usb_cbi.c:27: if (result == USB_ERR_STALL) {
ld a,(_result)
sub 0x02
jr NZ,l_usb_execute_cbi_00104 jr NZ,l_usb_execute_cbi_00104
;source-doc/ufi-drv/./usb_cbi.c:27: if (sense_codes != NULL)
;source-doc/ufi-drv/./usb_cbi.c:28: if (sense_codes != NULL)
ld a,(ix+14) ld a,(ix+14)
or (ix+13) or (ix+13)
jr Z,l_usb_execute_cbi_00102 jr Z,l_usb_execute_cbi_00102
;source-doc/ufi-drv/./usb_cbi.c:28: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN);
;source-doc/ufi-drv/./usb_cbi.c:29: usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN);
ld a,0x02 ld a,0x02
push af push af
inc sp inc sp
@ -121,21 +127,20 @@ _usb_execute_cbi:
pop af pop af
inc sp inc sp
l_usb_execute_cbi_00102: l_usb_execute_cbi_00102:
;source-doc/ufi-drv/./usb_cbi.c:30: return USB_ERR_STALL;
ld l,0x02
jp l_usb_execute_cbi_00118
;source-doc/ufi-drv/./usb_cbi.c:31: result = USB_ERR_STALL;
ld hl,_result
ld (hl),0x02
;source-doc/ufi-drv/./usb_cbi.c:32: goto done;
jp l_usb_execute_cbi_00116
l_usb_execute_cbi_00104: l_usb_execute_cbi_00104:
;source-doc/ufi-drv/./usb_cbi.c:33: if (result != USB_ERR_OK) {
;source-doc/ufi-drv/./usb_cbi.c:35: if (result != USB_ERR_OK) {
ld a,(_result)
or a or a
jr Z,l_usb_execute_cbi_00106
;source-doc/ufi-drv/./usb_cbi.c:35: return result;
ld l, a
jr l_usb_execute_cbi_00118
l_usb_execute_cbi_00106:
;source-doc/ufi-drv/./usb_cbi.c:38: if (send) {
jp NZ, l_usb_execute_cbi_00116
;source-doc/ufi-drv/./usb_cbi.c:40: if (send) {
bit 0,(ix+8) bit 0,(ix+8)
jr Z,l_usb_execute_cbi_00112 jr Z,l_usb_execute_cbi_00112
;source-doc/ufi-drv/./usb_cbi.c:39: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size);
;source-doc/ufi-drv/./usb_cbi.c:41: result = usbdev_blk_out_trnsfer(storage_device, buffer, buffer_size);
ld l,(ix+9) ld l,(ix+9)
ld h,(ix+10) ld h,(ix+10)
push hl push hl
@ -149,14 +154,16 @@ l_usb_execute_cbi_00106:
pop af pop af
pop af pop af
pop af pop af
;source-doc/ufi-drv/./usb_cbi.c:41: if (result != USB_ERR_OK) {
ld a, l ld a, l
ld (_result), a
;source-doc/ufi-drv/./usb_cbi.c:43: if (result != USB_ERR_OK) {
ld a,(_result)
or a or a
jr Z,l_usb_execute_cbi_00113 jr Z,l_usb_execute_cbi_00113
;source-doc/ufi-drv/./usb_cbi.c:43: return result;
jr l_usb_execute_cbi_00118
;source-doc/ufi-drv/./usb_cbi.c:45: goto done;
jr l_usb_execute_cbi_00116
l_usb_execute_cbi_00112: l_usb_execute_cbi_00112:
;source-doc/ufi-drv/./usb_cbi.c:46: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN);
;source-doc/ufi-drv/./usb_cbi.c:48: result = usbdev_dat_in_trnsfer(storage_device, buffer, buffer_size, ENDPOINT_BULK_IN);
ld a,0x01 ld a,0x01
push af push af
inc sp inc sp
@ -174,17 +181,19 @@ l_usb_execute_cbi_00112:
pop af pop af
pop af pop af
inc sp inc sp
;source-doc/ufi-drv/./usb_cbi.c:48: if (result != USB_ERR_OK) {
ld a, l ld a, l
ld (_result), a
;source-doc/ufi-drv/./usb_cbi.c:50: if (result != USB_ERR_OK) {
ld a,(_result)
or a or a
;source-doc/ufi-drv/./usb_cbi.c:50: return result;
jr NZ,l_usb_execute_cbi_00118
jr NZ,l_usb_execute_cbi_00116
;source-doc/ufi-drv/./usb_cbi.c:52: goto done;
l_usb_execute_cbi_00113: l_usb_execute_cbi_00113:
;source-doc/ufi-drv/./usb_cbi.c:54: if (sense_codes != NULL) {
;source-doc/ufi-drv/./usb_cbi.c:56: if (sense_codes != NULL) {
ld a,(ix+14) ld a,(ix+14)
or (ix+13) or (ix+13)
jr Z,l_usb_execute_cbi_00117
;source-doc/ufi-drv/./usb_cbi.c:55: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN);
jr Z,l_usb_execute_cbi_00116
;source-doc/ufi-drv/./usb_cbi.c:57: result = usbdev_dat_in_trnsfer(storage_device, sense_codes, 2, ENDPOINT_INTERRUPT_IN);
ld a,0x02 ld a,0x02
push af push af
inc sp inc sp
@ -201,16 +210,16 @@ l_usb_execute_cbi_00113:
pop af pop af
pop af pop af
inc sp inc sp
;source-doc/ufi-drv/./usb_cbi.c:57: if (result != USB_ERR_OK) {
ld a, l ld a, l
or a
;source-doc/ufi-drv/./usb_cbi.c:59: return result;
jr NZ,l_usb_execute_cbi_00118
l_usb_execute_cbi_00117:
;source-doc/ufi-drv/./usb_cbi.c:63: return USB_ERR_OK;
ld l,0x00
l_usb_execute_cbi_00118:
;source-doc/ufi-drv/./usb_cbi.c:64: }
ld (_result), a
;source-doc/ufi-drv/./usb_cbi.c:65: done:
l_usb_execute_cbi_00116:
;source-doc/ufi-drv/./usb_cbi.c:66: critical_end();
call _critical_end
;source-doc/ufi-drv/./usb_cbi.c:68: return result;
ld hl,_result
ld l, (hl)
;source-doc/ufi-drv/./usb_cbi.c:69: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret

76
Source/HBIOS/ch376kyb.asm

@ -15,8 +15,67 @@
#include "./ch376-native/keyboard.s" #include "./ch376-native/keyboard.s"
; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60))
SCAN_INT_PERIOD: .EQU 3
; VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE
; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD
UKY_SCNCNT: .DB SCAN_INT_PERIOD
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
UKY_INTSTK: ; 128 bytes for keyboard interrupt stack - need ~52 bytes???
CHUKB_INIT:
; INSTALL INTERRUPT HANDLER
LD HL, (VEC_TICK+1)
LD (VEC_CHUKB_TICK+1), HL
LD HL, CHUKB_TICK
LD (VEC_TICK+1), HL
JP _keyboard_init
CHUKB_TICK:
LD A, (UKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS.
DEC A
LD (UKY_SCNCNT), A
JR NZ, VEC_CHUKB_TICK
LD A, SCAN_INT_PERIOD
LD (UKY_SCNCNT), A
; we gonna need a bigger stack
EZ80_UTIL_DEBUG
LD (UKY_INT_SP),SP ; SAVE ORIGINAL STACK FRAME
LD SP,UKY_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM
CALL _keyboard_tick
LD SP, $FFFF ; RESTORE ORIGINAL STACK FRAME
UKY_INT_SP .EQU $ - 2
;
VEC_CHUKB_TICK:
JP HB_TICK
CHUKB_INIT .EQU _keyboard_init
; ### Function 0x4C -- Keyboard Status (VDAKST) ; ### Function 0x4C -- Keyboard Status (VDAKST)
; ;
@ -36,8 +95,7 @@ CHUKB_INIT .EQU _keyboard_init
; pending. ; pending.
; ;
UKY_STAT: UKY_STAT:
XOR A
RET
JP _keyboard_buf_size
; ### Function 0x4D -- Video Keyboard Flush (VDAKFL) ; ### Function 0x4D -- Video Keyboard Flush (VDAKFL)
; ;
@ -50,6 +108,8 @@ UKY_STAT:
; Purged and all contents discarded. The Status (A) is a standard HBIOS result code. ; Purged and all contents discarded. The Status (A) is a standard HBIOS result code.
; ;
UKY_FLUSH: UKY_FLUSH:
CALL _keyboard_buf_flush
XOR A
RET RET
; ;
; ### Function 0x4E -- Video Keyboard Read (VDAKRD) ; ### Function 0x4E -- Video Keyboard Read (VDAKRD)
@ -87,4 +147,14 @@ UKY_FLUSH:
; function keys and arrows, are returned as reserved codes as described at the start of this section. ; function keys and arrows, are returned as reserved codes as described at the start of this section.
; ;
UKY_READ: UKY_READ:
HB_DI
CALL _keyboard_buf_get_next
HB_EI
LD A, H
OR A
JR NZ, UKY_READ
LD C, 0
LD D, 0
; LD E, 'A'
XOR A
RET RET

15
Source/HBIOS/hbios.asm

@ -1929,7 +1929,7 @@ ROMRESUME:
LD A,BID_IMG2 ; S100 MONITOR BANK LD A,BID_IMG2 ; S100 MONITOR BANK
LD IX,HWMON_IMGLOC ; EXECUTION RESUMES HERE LD IX,HWMON_IMGLOC ; EXECUTION RESUMES HERE
CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN
HALT ; WE SHOULD NOT COME BACK HERE!
JR $ ; HALT WE SHOULD NOT COME BACK HERE!
; ;
S100MON_SKIP: S100MON_SKIP:
; RESTORE DEFAULT RELOAD REGISTER VALUE (PROBABLY NOT NEEDED) ; RESTORE DEFAULT RELOAD REGISTER VALUE (PROBABLY NOT NEEDED)
@ -2084,7 +2084,7 @@ MBC_SINGLE:
LD A,BID_BIOS ; BIOS BANK ID LD A,BID_BIOS ; BIOS BANK ID
LD IX,HB_START1 ; EXECUTION RESUMES HERE LD IX,HB_START1 ; EXECUTION RESUMES HERE
CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN CALL HBX_BNKCALL ; CONTINUE IN RAM BANK, DO NOT RETURN
HALT ; WE SHOULD NOT COME BACK HERE!
JR $ ; HALT WE SHOULD NOT COME BACK HERE!
#ENDIF #ENDIF
; ;
; EXECUTION RESUMES HERE AFTER SWITCH TO RAM BANK ; EXECUTION RESUMES HERE AFTER SWITCH TO RAM BANK
@ -3884,7 +3884,7 @@ INITSYS4:
#ENDIF #ENDIF
LD IX,0 ; ENTER AT ADDRESS 0 LD IX,0 ; ENTER AT ADDRESS 0
CALL HBX_BNKCALL ; GO THERE CALL HBX_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK!
JR $ ; HALT WE SHOULD NEVER COME BACK!
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; TABLE OF RECOVERY MODE INITIALIZATION ENTRY POINTS ; TABLE OF RECOVERY MODE INITIALIZATION ENTRY POINTS
@ -5415,7 +5415,7 @@ SYS_RESWARM:
#ENDIF #ENDIF
LD IX,0 ; ENTER AT ADDRESS 0 LD IX,0 ; ENTER AT ADDRESS 0
CALL HBX_BNKCALL ; GO THERE CALL HBX_BNKCALL ; GO THERE
HALT ; WE SHOULD NEVER COME BACK!
JR $ ; HALT WE SHOULD NEVER COME BACK!
#ENDIF #ENDIF
; ;
; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON ; RESTART SYSTEM AS THOUGH POWER HAD JUST BEEN TURNED ON
@ -6946,7 +6946,7 @@ SYSHALT:
LD DE,STR_HALT LD DE,STR_HALT
CALL WRITESTR CALL WRITESTR
DI DI
HALT
JR $ ; HALT
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
; INTERRUPT MANAGEMENT SUPPORT ; INTERRUPT MANAGEMENT SUPPORT
@ -7056,7 +7056,6 @@ HB_BADINTCNT .DB 0
CALL NEWLINE CALL NEWLINE
;CALL CONTINUE ;CALL CONTINUE
OR $FF ; SIGNAL INTERRUPT HANDLED OR $FF ; SIGNAL INTERRUPT HANDLED
EZ80_UTIL_DEBUG
RET RET
; ;
;-------------------------------------------------------------------------------------------------- ;--------------------------------------------------------------------------------------------------
@ -7393,7 +7392,7 @@ Z280_DIAG:
; ;
;RETIL ;RETIL
DI DI
HALT
JR $ ; HALT
; ;
Z280_BADINTSTR .TEXT "BAD INT $" Z280_BADINTSTR .TEXT "BAD INT $"
Z280_SSTEPSTR .TEXT "SINGLE STEP $" Z280_SSTEPSTR .TEXT "SINGLE STEP $"
@ -7463,7 +7462,7 @@ Z280_PRIVINST4:
; ;
; GO NO FURTHER ; GO NO FURTHER
DI DI
HALT
JR $ ; HALT
; ;
Z280_PRIVINSTX: Z280_PRIVINSTX:
; RESTORE REGISTERS ; RESTORE REGISTERS

Loading…
Cancel
Save