esp32.c: two-phase esp_wait_busy() so a stale non-BUSY status right after esp_cmd() isn't mistaken for completion (fixed a real TRACK_PLAY/0x88 race on heavier XM files); added single-phase esp_wait_not_busy() for esp_send_dma()'s per-chunk wait, which never actually sets BUSY and was timing out on every chunk under the two-phase version. vgm_wc_api.lib renamed to wc_api.lib (build.bat updated to match). Keyboard: tried replacing wc_key_esc/pgup/pgdn/space with a raw PS/2-FIFO reader (matching how VGMPLAY.WMF's own player reads keys) so Enter could also advance to the next file. Reverted after two confirmed hardware regressions (esp32 transfers failing with ESP_ERR_INV_XM, and the keyboard going unresponsive once WC's own PS/2 scanning was disabled to stop it competing with the raw reads) - VGMPLAY's approach relies on a full custom interrupt handler xmplay has no equivalent need for. Back to the simple wc_key_*() wrappers, plus wc_key_enter() so Enter now advances too, and wc_key_wait_release() (called after wc_gedpl()) to debounce the Enter/F3 that launched the plugin itself. Also: About window now centers dynamically for all three WC text modes (90x36/80x25/80x30) instead of a fixed position, and matches the main window's color scheme. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2522 lines
50 KiB
NASM
2522 lines
50 KiB
NASM
;--------------------------------------------------------
|
|
; File Created by SDCC : free open source ISO C Compiler
|
|
; Version 4.6.0 #16555 (MINGW64)
|
|
;--------------------------------------------------------
|
|
.module main
|
|
|
|
.optsdcc -mz80 sdcccall(1)
|
|
;--------------------------------------------------------
|
|
; Public variables in this module
|
|
;--------------------------------------------------------
|
|
.globl _main
|
|
.globl _main_start
|
|
.globl _xm_update_info
|
|
.globl _draw_progress_bar
|
|
.globl _xm_draw_stats_labels
|
|
.globl _put_time
|
|
.globl _put_dec3
|
|
.globl _put_hex2
|
|
.globl _xm_set_status_attr
|
|
.globl _xm_draw_static_labels
|
|
.globl _copy_file_name
|
|
.globl _error_playback
|
|
.globl _error_oom
|
|
.globl _stop_on_error
|
|
.globl _error_esp
|
|
.globl _wait_for_manual_exit
|
|
.globl _leave_playing_and_exit
|
|
.globl _unload_and_exit
|
|
.globl _about
|
|
.globl _wc_center
|
|
.globl _wc_screen_width
|
|
.globl _wait_frames
|
|
.globl _wait_esc_key
|
|
.globl _play_xm
|
|
.globl _esp_init
|
|
.globl _esp_create_obj
|
|
.globl _esp_wait_status
|
|
.globl _esp_rd_end
|
|
.globl _esp_send_dma
|
|
.globl _esp_wait_not_busy
|
|
.globl _esp_wr_end
|
|
.globl _esp_wr_reg32
|
|
.globl _esp_wr_reg8
|
|
.globl _esp_rd_regs
|
|
.globl _esp_rd_reg32
|
|
.globl _esp_rd_reg8
|
|
.globl _esp_cmd
|
|
.globl _wc_exit
|
|
.globl _wc_prm_pl
|
|
.globl _wc_gadrw
|
|
.globl _wc_prsrw_attr
|
|
.globl _wc_prsrw
|
|
.globl _wc_gedpl
|
|
.globl _wc_key_wait_release
|
|
.globl _wc_key_enter
|
|
.globl _wc_key_space
|
|
.globl _wc_key_pgdn
|
|
.globl _wc_key_pgup
|
|
.globl _wc_key_esc
|
|
.globl _wc_load512
|
|
.globl _wc_rresb
|
|
.globl _wc_prwow
|
|
.globl _strlen
|
|
.globl _state_esp
|
|
.globl _bar_attr_ofs
|
|
.globl _win_about
|
|
.globl _win_xm
|
|
.globl _last_track_status
|
|
.globl _xm_handle
|
|
.globl _total_samples
|
|
.globl _file_name
|
|
.globl _p_file_name
|
|
.globl _last_esp_status
|
|
.globl _call_type
|
|
.globl _file_ext
|
|
.globl _filesize
|
|
.globl _ret_sp
|
|
.globl _fs_buf
|
|
.globl _win_about_tpl
|
|
.globl _win_xm_tpl
|
|
.globl _esp_wait_busy
|
|
.globl _xm_set_status
|
|
.globl _xm_set_status_code
|
|
;--------------------------------------------------------
|
|
; special function registers
|
|
;--------------------------------------------------------
|
|
_SPI_DATA = 0x0057
|
|
_SPI_CTRL = 0x0077
|
|
_BORDER = 0x00fe
|
|
_TS_VCONFIG = 0x00af
|
|
_TS_STATUS = 0x00af
|
|
_TS_VPAGE = 0x01af
|
|
_TS_GXOFFSL = 0x02af
|
|
_TS_GXOFFSH = 0x03af
|
|
_TS_GYOFFSL = 0x04af
|
|
_TS_GYOFFSH = 0x05af
|
|
_TS_TSCONFIG = 0x06af
|
|
_TS_PALSEL = 0x07af
|
|
_TS_BORDER = 0x0faf
|
|
_TS_PAGE0 = 0x10af
|
|
_TS_PAGE1 = 0x11af
|
|
_TS_PAGE2 = 0x12af
|
|
_TS_PAGE3 = 0x13af
|
|
_TS_FMADDR = 0x15af
|
|
_TS_TMPAGE = 0x16af
|
|
_TS_T0GPAGE = 0x17af
|
|
_TS_T1GPAGE = 0x18af
|
|
_TS_SGPAGE = 0x19af
|
|
_TS_DMASADDRL = 0x1aaf
|
|
_TS_DMASADDRH = 0x1baf
|
|
_TS_DMASADDRX = 0x1caf
|
|
_TS_DMADADDRL = 0x1daf
|
|
_TS_DMADADDRH = 0x1eaf
|
|
_TS_DMADADDRX = 0x1faf
|
|
_TS_SYSCONFIG = 0x20af
|
|
_TS_MEMCONFIG = 0x21af
|
|
_TS_HSINT = 0x22af
|
|
_TS_VSINTL = 0x23af
|
|
_TS_VSINTH = 0x24af
|
|
_TS_DMAWPD = 0x25af
|
|
_TS_DMALEN = 0x26af
|
|
_TS_DMACTR = 0x27af
|
|
_TS_DMASTATUS = 0x27af
|
|
_TS_DMANUM = 0x28af
|
|
_TS_FDDVIRT = 0x29af
|
|
_TS_INTMASK = 0x2aaf
|
|
_TS_CACHECONF = 0x2baf
|
|
_TS_DMANUMH = 0x2caf
|
|
_TS_DMAWPA = 0x2daf
|
|
_TS_T0XOFFSL = 0x40af
|
|
_TS_T0XOFFSH = 0x41af
|
|
_TS_T0YOFFSL = 0x42af
|
|
_TS_T0YOFFSH = 0x43af
|
|
_TS_T1XOFFSL = 0x44af
|
|
_TS_T1XOFFSH = 0x45af
|
|
_TS_T1YOFFSL = 0x46af
|
|
_TS_T1YOFFSH = 0x47af
|
|
;--------------------------------------------------------
|
|
; ram data
|
|
;--------------------------------------------------------
|
|
.area _DATA
|
|
_fs_buf::
|
|
.ds 4096
|
|
_ret_sp::
|
|
.ds 2
|
|
_filesize::
|
|
.ds 4
|
|
_file_ext::
|
|
.ds 1
|
|
_call_type::
|
|
.ds 1
|
|
_last_esp_status::
|
|
.ds 1
|
|
_p_file_name::
|
|
.ds 2
|
|
_file_name::
|
|
.ds 33
|
|
_total_samples::
|
|
.ds 4
|
|
_xm_handle::
|
|
.ds 1
|
|
_last_track_status::
|
|
.ds 1
|
|
_win_xm::
|
|
.ds 18
|
|
_win_about::
|
|
.ds 18
|
|
_status_buf:
|
|
.ds 24
|
|
_status_code_buf:
|
|
.ds 24
|
|
_hexbuf:
|
|
.ds 2
|
|
_decbuf:
|
|
.ds 3
|
|
_timebuf:
|
|
.ds 5
|
|
_barbuf:
|
|
.ds 32
|
|
_bar_attr_ofs::
|
|
.ds 2
|
|
;--------------------------------------------------------
|
|
; ram data
|
|
;--------------------------------------------------------
|
|
.area _INITIALIZED
|
|
_state_esp::
|
|
.ds 1
|
|
;--------------------------------------------------------
|
|
; absolute ram data
|
|
;--------------------------------------------------------
|
|
.area _DABS (ABS)
|
|
.area _DABS (ABS)
|
|
;--------------------------------------------------------
|
|
; global & static initialisations
|
|
;--------------------------------------------------------
|
|
.area _HOME
|
|
.area _GSINIT
|
|
.area _GSFINAL
|
|
.area _GSINIT
|
|
;--------------------------------------------------------
|
|
; Home
|
|
;--------------------------------------------------------
|
|
.area _HOME
|
|
.area _HOME
|
|
;--------------------------------------------------------
|
|
; code
|
|
;--------------------------------------------------------
|
|
.area _CODE
|
|
;src/wc_api.c:71: void wc_exit(u8 rc) __naked
|
|
; ---------------------------------
|
|
; Function wc_exit
|
|
; ---------------------------------
|
|
_wc_exit::
|
|
;src/wc_api.c:77: __endasm;
|
|
ld sp, (_ret_sp)
|
|
ret
|
|
;src/wc_api.c:78: }
|
|
;src/esp32.c:18: void esp_cmd(u8 cmd)
|
|
; ---------------------------------
|
|
; Function esp_cmd
|
|
; ---------------------------------
|
|
_esp_cmd::
|
|
ld c, a
|
|
;src/esp32.c:20: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:21: SPI_DATA = ESP_SPI_CMD_WR_REGS;
|
|
ld a, #0x01
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:22: SPI_DATA = ESP_REG_COMMAND;
|
|
xor a, a
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:23: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:24: SPI_DATA = cmd; // Command
|
|
ld a, c
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:25: SPI_DATA = ESP_ST_IDLE; // Reset status
|
|
xor a, a
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:26: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:27: }
|
|
ret
|
|
;src/esp32.c:29: u8 esp_rd_reg8(u8 reg)
|
|
; ---------------------------------
|
|
; Function esp_rd_reg8
|
|
; ---------------------------------
|
|
_esp_rd_reg8::
|
|
ld c, a
|
|
;src/esp32.c:31: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:32: SPI_DATA = ESP_SPI_CMD_RD_REGS;
|
|
ld a, #0x02
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:33: SPI_DATA = reg;
|
|
ld a, c
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:34: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:35: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:36: u8 rc = SPI_DATA;
|
|
in a, (_SPI_DATA)
|
|
ld c, a
|
|
;src/esp32.c:37: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:39: return rc;
|
|
ld a, c
|
|
;src/esp32.c:40: }
|
|
ret
|
|
;src/esp32.c:42: u32 esp_rd_reg32(u8 reg)
|
|
; ---------------------------------
|
|
; Function esp_rd_reg32
|
|
; ---------------------------------
|
|
_esp_rd_reg32::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
push af
|
|
push af
|
|
ld c, a
|
|
;src/esp32.c:44: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:45: SPI_DATA = ESP_SPI_CMD_RD_REGS;
|
|
ld a, #0x02
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:46: SPI_DATA = reg;
|
|
ld a, c
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:47: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:48: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:49: u32 rc = SPI_DATA;
|
|
in a, (_SPI_DATA)
|
|
ld c, a
|
|
;src/esp32.c:50: rc |= (u32)SPI_DATA << 8;
|
|
in a, (_SPI_DATA)
|
|
ld d, a
|
|
ld e, c
|
|
;src/esp32.c:51: rc |= (u32)SPI_DATA << 16;
|
|
in a, (_SPI_DATA)
|
|
ld -4 (ix), a
|
|
xor a, a
|
|
ld -3 (ix), a
|
|
ld -2 (ix), a
|
|
ld -1 (ix), a
|
|
ld a, -4 (ix)
|
|
ld -2 (ix), a
|
|
xor a, a
|
|
ld -1 (ix), a
|
|
ld -4 (ix), a
|
|
ld -3 (ix), a
|
|
ld l, -2 (ix)
|
|
;src/esp32.c:52: rc |= (u32)SPI_DATA << 24;
|
|
in a, (_SPI_DATA)
|
|
ld -4 (ix), a
|
|
xor a, a
|
|
ld -3 (ix), a
|
|
ld -2 (ix), a
|
|
ld -1 (ix), a
|
|
ld a, -4 (ix)
|
|
ld -1 (ix), a
|
|
xor a, a
|
|
ld -4 (ix), a
|
|
ld -3 (ix), a
|
|
ld -2 (ix), a
|
|
ld h, -1 (ix)
|
|
;src/esp32.c:53: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:55: return rc;
|
|
;src/esp32.c:56: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/esp32.c:58: void esp_rd_regs(u8 reg, void *data, u8 size)
|
|
; ---------------------------------
|
|
; Function esp_rd_regs
|
|
; ---------------------------------
|
|
_esp_rd_regs::
|
|
ld c, a
|
|
;src/esp32.c:60: u8 *d = (u8*)data;
|
|
;src/esp32.c:62: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:63: SPI_DATA = ESP_SPI_CMD_RD_REGS;
|
|
ld a, #0x02
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:64: SPI_DATA = reg;
|
|
ld a, c
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:65: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:66: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:67: while (size--) *d++ = SPI_DATA;
|
|
ld iy, #2
|
|
add iy, sp
|
|
ld c, 0 (iy)
|
|
00101$:
|
|
ld a, c
|
|
dec c
|
|
or a, a
|
|
jr z, 00103$
|
|
in a, (_SPI_DATA)
|
|
ld (de), a
|
|
inc de
|
|
jp 00101$
|
|
00103$:
|
|
;src/esp32.c:68: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:69: }
|
|
pop hl
|
|
inc sp
|
|
jp (hl)
|
|
;src/esp32.c:71: void esp_wr_reg8(u8 reg, u8 data)
|
|
; ---------------------------------
|
|
; Function esp_wr_reg8
|
|
; ---------------------------------
|
|
_esp_wr_reg8::
|
|
ld b, a
|
|
ld c, l
|
|
;src/esp32.c:73: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:74: SPI_DATA = ESP_SPI_CMD_WR_REGS;
|
|
ld a, #0x01
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:75: SPI_DATA = reg;
|
|
ld a, b
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:76: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:77: SPI_DATA = data;
|
|
ld a, c
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:78: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:79: }
|
|
ret
|
|
;src/esp32.c:81: void esp_wr_reg32(u8 reg, u32 data)
|
|
; ---------------------------------
|
|
; Function esp_wr_reg32
|
|
; ---------------------------------
|
|
_esp_wr_reg32::
|
|
ld c, a
|
|
;src/esp32.c:83: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:84: SPI_DATA = ESP_SPI_CMD_WR_REGS;
|
|
ld a, #0x01
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:85: SPI_DATA = reg;
|
|
ld a, c
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:86: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:87: SPI_DATA = (u8)data;
|
|
ld iy, #2
|
|
add iy, sp
|
|
ld a, 0 (iy)
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:88: SPI_DATA = (u8)(data >> 8);
|
|
ld a, 1 (iy)
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:89: SPI_DATA = (u8)(data >> 16);
|
|
ld a, 2 (iy)
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:90: SPI_DATA = (u8)(data >> 24);
|
|
ld a, 3 (iy)
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:91: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:92: }
|
|
pop hl
|
|
pop af
|
|
pop af
|
|
jp (hl)
|
|
;src/esp32.c:94: void esp_wr_end()
|
|
; ---------------------------------
|
|
; Function esp_wr_end
|
|
; ---------------------------------
|
|
_esp_wr_end::
|
|
;src/esp32.c:96: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:97: SPI_DATA = ESP_SPI_CMD_W_END;
|
|
ld a, #0x07
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:98: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:99: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:100: }
|
|
ret
|
|
;src/esp32.c:114: u8 esp_wait_not_busy(u16 max_frames)
|
|
; ---------------------------------
|
|
; Function esp_wait_not_busy
|
|
; ---------------------------------
|
|
_esp_wait_not_busy::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
push af
|
|
push af
|
|
ld -2 (ix), l
|
|
ld -1 (ix), h
|
|
;src/esp32.c:116: u16 start = *(u16*)_TMN;
|
|
ld hl, #0x6009
|
|
ld a, (hl)
|
|
ld -4 (ix), a
|
|
inc hl
|
|
ld a, (hl)
|
|
ld -3 (ix), a
|
|
;src/esp32.c:118: while ((u16)(*(u16*)_TMN - start) < max_frames)
|
|
00103$:
|
|
ld hl, (#0x6009)
|
|
ld a, l
|
|
sub a, -4 (ix)
|
|
ld c, a
|
|
ld a, h
|
|
sbc a, -3 (ix)
|
|
ld b, a
|
|
ld a, c
|
|
sub a, -2 (ix)
|
|
ld a, b
|
|
sbc a, -1 (ix)
|
|
jr nc, 00105$
|
|
;src/esp32.c:120: if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
cp a, #0x02
|
|
jr z, 00103$
|
|
;src/esp32.c:121: return 1;
|
|
ld a, #0x01
|
|
jp 00106$
|
|
00105$:
|
|
;src/esp32.c:124: return 0;
|
|
xor a, a
|
|
00106$:
|
|
;src/esp32.c:125: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/esp32.c:127: void esp_send_dma(u16 a, u8 p, u16 l, u16 n)
|
|
; ---------------------------------
|
|
; Function esp_send_dma
|
|
; ---------------------------------
|
|
_esp_send_dma::
|
|
ld a, l
|
|
;src/esp32.c:130: TS_DMASADDRL = (u8)a;
|
|
ld bc, #_TS_DMASADDRL
|
|
out (c), a
|
|
;src/esp32.c:131: TS_DMASADDRH = (u8)((u16)a >> 8);
|
|
ld a, h
|
|
ld bc, #_TS_DMASADDRH
|
|
out (c), a
|
|
;src/esp32.c:132: TS_DMASADDRX = p;
|
|
ld iy, #2
|
|
add iy, sp
|
|
ld a, 0 (iy)
|
|
ld bc, #_TS_DMASADDRX
|
|
out (c), a
|
|
;src/esp32.c:133: TS_DMALEN = (u8)((l >> 1) - 1);
|
|
ld a, 1 (iy)
|
|
ld c, 2 (iy)
|
|
inc iy
|
|
srl c
|
|
rr a
|
|
dec a
|
|
ld bc, #_TS_DMALEN
|
|
out (c), a
|
|
;src/esp32.c:134: TS_DMANUM = (u8)(n - 1);
|
|
ld a, 2 (iy)
|
|
dec a
|
|
ld bc, #_TS_DMANUM
|
|
out (c), a
|
|
;src/esp32.c:136: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:137: SPI_DATA = ESP_SPI_CMD_WR_DATA;
|
|
ld a, #0x03
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:138: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:139: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:140: TS_DMACTR = TS_DMA_RAM_SPI;
|
|
ld a, #0x82
|
|
ld bc, #_TS_DMACTR
|
|
out (c), a
|
|
;src/esp32.c:141: while (TS_DMASTATUS & 0x80);
|
|
00101$:
|
|
ld a, #>(_TS_DMASTATUS)
|
|
in a, (#<(_TS_DMASTATUS))
|
|
rlca
|
|
jr c, 00101$
|
|
;src/esp32.c:142: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:144: esp_wr_end();
|
|
call _esp_wr_end
|
|
;src/esp32.c:145: esp_wait_not_busy(100); // 2s - esp32 consuming one DMA'd chunk should be near-instant
|
|
ld hl, #0x0064
|
|
call _esp_wait_not_busy
|
|
;src/esp32.c:146: }
|
|
pop hl
|
|
pop af
|
|
pop af
|
|
inc sp
|
|
jp (hl)
|
|
;src/esp32.c:148: void esp_rd_end()
|
|
; ---------------------------------
|
|
; Function esp_rd_end
|
|
; ---------------------------------
|
|
_esp_rd_end::
|
|
;src/esp32.c:150: SPI_CTRL = SPI_ESP_CS_ON;
|
|
ld a, #0x13
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:151: SPI_DATA = ESP_SPI_CMD_R_END;
|
|
ld a, #0x08
|
|
out (_SPI_DATA), a
|
|
;src/esp32.c:152: SPI_DATA; // dummy
|
|
in a, (_SPI_DATA)
|
|
;src/esp32.c:153: SPI_CTRL = SPI_ESP_CS_OFF;
|
|
ld a, #0x03
|
|
out (_SPI_CTRL), a
|
|
;src/esp32.c:154: }
|
|
ret
|
|
;src/esp32.c:164: u8 esp_wait_status(u8 status, u16 max_frames)
|
|
; ---------------------------------
|
|
; Function esp_wait_status
|
|
; ---------------------------------
|
|
_esp_wait_status::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
ld hl, #-5
|
|
add hl, sp
|
|
ld sp, hl
|
|
ld -1 (ix), a
|
|
ld -3 (ix), e
|
|
ld -2 (ix), d
|
|
;src/esp32.c:166: u16 start = *(u16*)_TMN;
|
|
ld hl, #0x6009
|
|
ld a, (hl)
|
|
ld -5 (ix), a
|
|
inc hl
|
|
ld a, (hl)
|
|
ld -4 (ix), a
|
|
;src/esp32.c:168: while ((u16)(*(u16*)_TMN - start) < max_frames)
|
|
00103$:
|
|
ld hl, (#0x6009)
|
|
ld a, l
|
|
sub a, -5 (ix)
|
|
ld c, a
|
|
ld a, h
|
|
sbc a, -4 (ix)
|
|
ld b, a
|
|
ld a, c
|
|
sub a, -3 (ix)
|
|
ld a, b
|
|
sbc a, -2 (ix)
|
|
jr nc, 00105$
|
|
;src/esp32.c:170: if (esp_rd_reg8(ESP_REG_STATUS) == status)
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
sub a, -1 (ix)
|
|
jr nz, 00103$
|
|
;src/esp32.c:171: return 1;
|
|
ld a, #0x01
|
|
jp 00106$
|
|
00105$:
|
|
;src/esp32.c:174: return 0;
|
|
xor a, a
|
|
00106$:
|
|
;src/esp32.c:175: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/esp32.c:194: u8 esp_wait_busy(u16 max_frames)
|
|
; ---------------------------------
|
|
; Function esp_wait_busy
|
|
; ---------------------------------
|
|
_esp_wait_busy::
|
|
ex de, hl
|
|
;src/esp32.c:196: u16 start = *(u16*)_TMN;
|
|
ld bc, (#0x6009)
|
|
;src/esp32.c:199: while (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
|
|
00103$:
|
|
push bc
|
|
push de
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
pop de
|
|
pop bc
|
|
cp a, #0x02
|
|
jr z, 00108$
|
|
;src/esp32.c:201: if ((u16)(*(u16*)_TMN - start) >= max_frames)
|
|
ld hl, (#0x6009)
|
|
cp a, a
|
|
sbc hl, bc
|
|
xor a, a
|
|
sbc hl, de
|
|
jr c, 00103$
|
|
;src/esp32.c:202: return 0;
|
|
xor a, a
|
|
ret
|
|
;src/esp32.c:206: while ((u16)(*(u16*)_TMN - start) < max_frames)
|
|
00108$:
|
|
ld hl, (#0x6009)
|
|
cp a, a
|
|
sbc hl, bc
|
|
xor a, a
|
|
sbc hl, de
|
|
jr nc, 00110$
|
|
;src/esp32.c:208: if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
|
|
push bc
|
|
push de
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
pop de
|
|
pop bc
|
|
cp a, #0x02
|
|
jr z, 00108$
|
|
;src/esp32.c:209: return 1;
|
|
ld a, #0x01
|
|
ret
|
|
00110$:
|
|
;src/esp32.c:212: return 0;
|
|
xor a, a
|
|
;src/esp32.c:213: }
|
|
ret
|
|
;src/esp32.c:215: int esp_create_obj(u32 size, u8 type)
|
|
; ---------------------------------
|
|
; Function esp_create_obj
|
|
; ---------------------------------
|
|
_esp_create_obj::
|
|
;src/esp32.c:217: esp_wr_reg32(ESP_REG_DATA_SIZE, size);
|
|
push hl
|
|
push de
|
|
ld a, #0x03
|
|
call _esp_wr_reg32
|
|
;src/esp32.c:218: esp_wr_reg8(ESP_REG_OBJ_TYPE, type);
|
|
ld iy, #2
|
|
add iy, sp
|
|
ld l, 0 (iy)
|
|
ld a, #0x02
|
|
call _esp_wr_reg8
|
|
;src/esp32.c:219: esp_cmd(ESP_CMD_MAKE_OBJECT);
|
|
ld a, #0xe0
|
|
call _esp_cmd
|
|
;src/esp32.c:220: esp_wait_busy(100); // 2s - object allocation should be near-instant
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/esp32.c:223: return esp_rd_reg8(ESP_REG_OBJ_HANDLE);
|
|
ld a, #0x0b
|
|
call _esp_rd_reg8
|
|
ld e, a
|
|
ld d, #0x00
|
|
;src/esp32.c:224: }
|
|
pop hl
|
|
inc sp
|
|
jp (hl)
|
|
;src/main.c:145: bool esp_init()
|
|
; ---------------------------------
|
|
; Function esp_init
|
|
; ---------------------------------
|
|
_esp_init::
|
|
;src/main.c:147: esp_cmd(ESP_CMD_NOP);
|
|
xor a, a
|
|
call _esp_cmd
|
|
;src/main.c:148: esp_rd_end();
|
|
call _esp_rd_end
|
|
;src/main.c:149: esp_wr_end();
|
|
call _esp_wr_end
|
|
;src/main.c:153: return true;
|
|
ld a, #0x01
|
|
;src/main.c:154: }
|
|
ret
|
|
_win_xm_tpl:
|
|
.db #0x81 ; 129
|
|
.db #0x00 ; 0
|
|
.db #0x19 ; 25
|
|
.db #0x0a ; 10
|
|
.db #0x28 ; 40
|
|
.db #0x0c ; 12
|
|
.db #0x70 ; 112 'p'
|
|
.db #0x00 ; 0
|
|
.dw #0x0000
|
|
.db #0x00 ; 0
|
|
.db #0x00 ; 0
|
|
.dw __str_0
|
|
.dw __str_1
|
|
.dw __str_1
|
|
_win_about_tpl:
|
|
.db #0x01 ; 1
|
|
.db #0x00 ; 0
|
|
.db #0x16 ; 22
|
|
.db #0x0a ; 10
|
|
.db #0x24 ; 36
|
|
.db #0x07 ; 7
|
|
.db #0x70 ; 112 'p'
|
|
.db #0x00 ; 0
|
|
.dw #0x0000
|
|
.db #0x00 ; 0
|
|
.db #0x00 ; 0
|
|
.dw __str_2
|
|
.dw __str_1
|
|
.dw __str_3
|
|
__str_0:
|
|
.db 0x0e
|
|
.ascii " XM/XMZ/S3M Player v0.1 "
|
|
.db 0x00
|
|
__str_1:
|
|
.db 0x00
|
|
__str_2:
|
|
.db 0x0e
|
|
.ascii " About "
|
|
.db 0x00
|
|
__str_3:
|
|
.db 0x0d
|
|
.db 0x0e
|
|
.ascii "XM Player v0.1"
|
|
.db 0x0d
|
|
.db 0x0e
|
|
.ascii "by Alex Korochinskiy"
|
|
.db 0x00
|
|
;src/main.c:158: bool play_xm()
|
|
; ---------------------------------
|
|
; Function play_xm
|
|
; ---------------------------------
|
|
_play_xm::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
ld hl, #-20
|
|
add hl, sp
|
|
ld sp, hl
|
|
;src/main.c:160: esp_cmd(ESP_CMD_TRACK_STOP);
|
|
ld a, #0xa2
|
|
call _esp_cmd
|
|
;src/main.c:161: esp_wait_busy(100); // 2s - both should be near-instant
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:162: esp_cmd(ESP_CMD_KILL_OBJECTS);
|
|
ld a, #0xe4
|
|
call _esp_cmd
|
|
;src/main.c:163: esp_wait_busy(100);
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:166: switch (file_ext)
|
|
ld a, (_file_ext)
|
|
dec a
|
|
jr z, 00101$
|
|
ld a, (_file_ext)
|
|
sub a, #0x02
|
|
jr z, 00102$
|
|
jp 00103$
|
|
;src/main.c:168: case EXT_XMZ: obj_type = OBJ_TYPE_ZIP; break;
|
|
00101$:
|
|
ld a, #0x08
|
|
jp 00104$
|
|
;src/main.c:169: case EXT_S3M: obj_type = OBJ_TYPE_S3M; break;
|
|
00102$:
|
|
ld a, #0x0c
|
|
jp 00104$
|
|
;src/main.c:170: default: obj_type = OBJ_TYPE_XM; break;
|
|
00103$:
|
|
ld a, #0x05
|
|
;src/main.c:171: }
|
|
00104$:
|
|
;src/main.c:173: xm_handle = esp_create_obj(filesize, obj_type);
|
|
push af
|
|
inc sp
|
|
ld de, (_filesize)
|
|
ld hl, (_filesize + 2)
|
|
call _esp_create_obj
|
|
ld hl, #_xm_handle
|
|
ld (hl), e
|
|
;src/main.c:174: last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
ld (#_last_esp_status), a
|
|
;src/main.c:175: if (last_esp_status != ESP_ST_READY)
|
|
ld a, (_last_esp_status)
|
|
dec a
|
|
jr z, 00106$
|
|
;src/main.c:176: return false;
|
|
xor a, a
|
|
jp 00118$
|
|
00106$:
|
|
;src/main.c:178: u32 sz = filesize;
|
|
ld hl, #12
|
|
add hl, sp
|
|
ex de, hl
|
|
ld hl, #_filesize
|
|
ld bc, #4
|
|
ldir
|
|
;src/main.c:179: u32 offs = 0;
|
|
xor a, a
|
|
ld -4 (ix), a
|
|
ld -3 (ix), a
|
|
ld -2 (ix), a
|
|
ld -1 (ix), a
|
|
;src/main.c:181: while (sz)
|
|
00107$:
|
|
ld a, -5 (ix)
|
|
or a, -6 (ix)
|
|
or a, -7 (ix)
|
|
or a, -8 (ix)
|
|
jp z, 00109$
|
|
;src/main.c:183: u32 s = min(sz, FS_BUF_SIZE);
|
|
ld a, -7 (ix)
|
|
sub a, #0x10
|
|
ld a, -6 (ix)
|
|
sbc a, #0x00
|
|
ld a, -5 (ix)
|
|
sbc a, #0x00
|
|
jr nc, 00120$
|
|
ld hl, #0
|
|
add hl, sp
|
|
ex de, hl
|
|
ld hl, #12
|
|
add hl, sp
|
|
ld bc, #4
|
|
ldir
|
|
jp 00121$
|
|
00120$:
|
|
ld -20 (ix), #0x00
|
|
ld -19 (ix), #0x10
|
|
xor a, a
|
|
ld -18 (ix), a
|
|
ld -17 (ix), a
|
|
00121$:
|
|
ld hl, #5
|
|
add hl, sp
|
|
ex de, hl
|
|
ld hl, #0
|
|
add hl, sp
|
|
ld bc, #4
|
|
ldir
|
|
;src/main.c:184: u8 sec = (s + 511) >> 9;
|
|
ld a, -15 (ix)
|
|
add a, #0xff
|
|
ld a, -14 (ix)
|
|
adc a, #0x01
|
|
ld b, a
|
|
ld a, #0x00
|
|
adc a, #0x00
|
|
ld e, a
|
|
ld a, #0x00
|
|
adc a, #0x00
|
|
ld d, a
|
|
ld c, b
|
|
ld b, e
|
|
ld e, d
|
|
srl e
|
|
rr b
|
|
rr c
|
|
;src/main.c:186: wc_load512((u16)fs_buf, sec);
|
|
ld -9 (ix), c
|
|
ld a, c
|
|
push af
|
|
inc sp
|
|
ld hl, #_fs_buf
|
|
call _wc_load512
|
|
;src/main.c:188: esp_wr_reg32(ESP_REG_DATA_SIZE, s);
|
|
ld hl, #0x0
|
|
push hl
|
|
ld l, -15 (ix)
|
|
ld h, -14 (ix)
|
|
push hl
|
|
ld a, #0x03
|
|
call _esp_wr_reg32
|
|
;src/main.c:189: esp_wr_reg32(ESP_REG_DATA_OFFSET, offs);
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
push hl
|
|
ld l, -4 (ix)
|
|
ld h, -3 (ix)
|
|
push hl
|
|
ld a, #0x07
|
|
call _esp_wr_reg32
|
|
;src/main.c:190: esp_cmd(ESP_CMD_WRITE_OBJECT);
|
|
ld a, #0xe1
|
|
call _esp_cmd
|
|
;src/main.c:191: esp_wait_status(ESP_ST_DATA_M2S, 100); // 2s - near-instant state transition
|
|
ld de, #0x0064
|
|
ld a, #0x03
|
|
call _esp_wait_status
|
|
;src/main.c:192: esp_send_dma((u16)fs_buf, *(u8*)_PAGE2, 512, sec);
|
|
ld a, -9 (ix)
|
|
ld -11 (ix), a
|
|
ld -10 (ix), #0x00
|
|
ld a, (#0x6002)
|
|
ld -9 (ix), a
|
|
ld l, -11 (ix)
|
|
ld h, #0x00
|
|
push hl
|
|
ld hl, #0x0200
|
|
push hl
|
|
ld a, -9 (ix)
|
|
push af
|
|
inc sp
|
|
ld hl, #_fs_buf
|
|
call _esp_send_dma
|
|
;src/main.c:194: offs += s;
|
|
ld e, -15 (ix)
|
|
ld d, -14 (ix)
|
|
ld l, -4 (ix)
|
|
ld h, -3 (ix)
|
|
add hl, de
|
|
ld -4 (ix), l
|
|
ld -3 (ix), h
|
|
ld a, -2 (ix)
|
|
adc a, -13 (ix)
|
|
ld -2 (ix), a
|
|
jr nc, 00207$
|
|
inc -1 (ix)
|
|
00207$:
|
|
;src/main.c:195: sz -= s;
|
|
ld a, -8 (ix)
|
|
sub a, -15 (ix)
|
|
ld -8 (ix), a
|
|
ld a, -7 (ix)
|
|
sbc a, -14 (ix)
|
|
ld -7 (ix), a
|
|
ld a, -6 (ix)
|
|
sbc a, -13 (ix)
|
|
ld -6 (ix), a
|
|
ld a, -5 (ix)
|
|
sbc a, -12 (ix)
|
|
ld -5 (ix), a
|
|
jp 00107$
|
|
00109$:
|
|
;src/main.c:198: if (file_ext == EXT_XMZ)
|
|
ld a, (_file_ext)
|
|
dec a
|
|
jr nz, 00113$
|
|
;src/main.c:203: esp_wr_reg8(ESP_REG_OBJ_HANDLE, xm_handle);
|
|
ld a, (_xm_handle)
|
|
ld l, a
|
|
ld a, #0x0b
|
|
call _esp_wr_reg8
|
|
;src/main.c:204: esp_wr_reg8(ESP_REG_OBJ_TYPE, OBJ_TYPE_XM);
|
|
ld l, #0x05
|
|
ld a, #0x02
|
|
call _esp_wr_reg8
|
|
;src/main.c:205: esp_wr_reg32(ESP_REG_DATA_SIZE, filesize);
|
|
ld hl, (_filesize + 2)
|
|
push hl
|
|
ld hl, (_filesize)
|
|
push hl
|
|
ld a, #0x03
|
|
call _esp_wr_reg32
|
|
;src/main.c:206: esp_cmd(ESP_CMD_UNZIP);
|
|
ld a, #0xf2
|
|
call _esp_cmd
|
|
;src/main.c:207: esp_wait_busy(250); // 5s - decompression time scales with file size
|
|
ld hl, #0x00fa
|
|
call _esp_wait_busy
|
|
;src/main.c:209: last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
ld (#_last_esp_status), a
|
|
;src/main.c:210: if (last_esp_status != ESP_ST_READY)
|
|
ld a, (_last_esp_status)
|
|
dec a
|
|
jr z, 00113$
|
|
;src/main.c:211: return false;
|
|
xor a, a
|
|
jp 00118$
|
|
00113$:
|
|
;src/main.c:214: esp_cmd(ESP_CMD_TRACK_INIT);
|
|
ld a, #0xa0
|
|
call _esp_cmd
|
|
;src/main.c:220: esp_wait_busy(500);
|
|
ld hl, #0x01f4
|
|
call _esp_wait_busy
|
|
;src/main.c:222: last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
ld (#_last_esp_status), a
|
|
;src/main.c:223: if (last_esp_status != ESP_ST_READY)
|
|
ld a, (_last_esp_status)
|
|
dec a
|
|
jr z, 00115$
|
|
;src/main.c:224: return false;
|
|
xor a, a
|
|
jp 00118$
|
|
00115$:
|
|
;src/main.c:229: esp_wr_reg8(ESP_REG_OBJ_HANDLE, xm_handle);
|
|
ld a, (_xm_handle)
|
|
ld l, a
|
|
ld a, #0x0b
|
|
call _esp_wr_reg8
|
|
;src/main.c:230: esp_wr_reg8(ESP_REG_TRACK_MAX_LOOP_COUNT, 1);
|
|
ld l, #0x01
|
|
ld a, #0x3a
|
|
call _esp_wr_reg8
|
|
;src/main.c:231: esp_cmd(ESP_CMD_TRACK_SET_PARAMS);
|
|
ld a, #0xa6
|
|
call _esp_cmd
|
|
;src/main.c:232: esp_wait_busy(100); // 2s - both should be near-instant
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:234: esp_cmd(ESP_CMD_TRACK_PLAY);
|
|
ld a, #0xa1
|
|
call _esp_cmd
|
|
;src/main.c:235: esp_wait_busy(100);
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:237: last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
|
|
ld a, #0x01
|
|
call _esp_rd_reg8
|
|
ld (#_last_esp_status), a
|
|
;src/main.c:238: if (last_esp_status != ESP_ST_READY)
|
|
ld a, (_last_esp_status)
|
|
dec a
|
|
jr z, 00117$
|
|
;src/main.c:239: return false;
|
|
xor a, a
|
|
jp 00118$
|
|
00117$:
|
|
;src/main.c:241: return true;
|
|
ld a, #0x01
|
|
00118$:
|
|
;src/main.c:242: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/main.c:245: void wait_esc_key()
|
|
; ---------------------------------
|
|
; Function wait_esc_key
|
|
; ---------------------------------
|
|
_wait_esc_key::
|
|
;src/main.c:247: while (1)
|
|
00104$:
|
|
;src/main.c:251: __endasm;
|
|
halt
|
|
;src/main.c:253: if (wc_key_esc())
|
|
call _wc_key_esc
|
|
or a, a
|
|
jr z, 00104$
|
|
;src/main.c:254: break;
|
|
;src/main.c:256: }
|
|
ret
|
|
;src/main.c:258: void wait_frames(u8 n)
|
|
; ---------------------------------
|
|
; Function wait_frames
|
|
; ---------------------------------
|
|
_wait_frames::
|
|
ld c, a
|
|
;src/main.c:260: while (n--)
|
|
00101$:
|
|
ld a, c
|
|
dec c
|
|
or a, a
|
|
ret z
|
|
;src/main.c:264: __endasm;
|
|
halt
|
|
;src/main.c:266: }
|
|
jp 00101$
|
|
;src/main.c:273: u8 wc_screen_width()
|
|
; ---------------------------------
|
|
; Function wc_screen_width
|
|
; ---------------------------------
|
|
_wc_screen_width::
|
|
;src/main.c:275: return (*(u8*)_HEI >= 36) ? 90 : 80;
|
|
ld a, (#0x600e)
|
|
sub a, #0x24
|
|
jr c, 00103$
|
|
ld a, #0x5a
|
|
ret
|
|
00103$:
|
|
ld a, #0x50
|
|
;src/main.c:276: }
|
|
ret
|
|
;src/main.c:281: u8 wc_center(u8 screen_size, u8 win_size)
|
|
; ---------------------------------
|
|
; Function wc_center
|
|
; ---------------------------------
|
|
_wc_center::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
push af
|
|
ld -1 (ix), a
|
|
;src/main.c:283: return (screen_size > win_size) ? (screen_size - win_size) / 2 : 0;
|
|
ld -2 (ix), l
|
|
ld a, l
|
|
sub a, -1 (ix)
|
|
jr nc, 00103$
|
|
ld a, -1 (ix)
|
|
ld e, -2 (ix)
|
|
sub a, e
|
|
ld c, a
|
|
sbc a, a
|
|
ld b, a
|
|
ld e, c
|
|
ld d, b
|
|
bit 7, b
|
|
jr z, 00105$
|
|
ld e, c
|
|
ld d, b
|
|
inc de
|
|
00105$:
|
|
ld a, e
|
|
sra d
|
|
rr a
|
|
jp 00104$
|
|
00103$:
|
|
xor a, a
|
|
00104$:
|
|
;src/main.c:284: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/main.c:286: void about()
|
|
; ---------------------------------
|
|
; Function about
|
|
; ---------------------------------
|
|
_about::
|
|
;src/main.c:288: memcpy(&win_about, &win_about_tpl, sizeof(win_about));
|
|
ld de, #_win_about
|
|
ld hl, #_win_about_tpl
|
|
ld bc, #0x0012
|
|
ldir
|
|
;src/main.c:289: win_about.x_pos = wc_center(wc_screen_width(), win_about.x_size);
|
|
ld hl, #_win_about + 4
|
|
ld l, (hl)
|
|
push hl
|
|
call _wc_screen_width
|
|
pop hl
|
|
call _wc_center
|
|
ld (#(_win_about + 2)), a
|
|
;src/main.c:290: win_about.y_pos = wc_center(*(u8*)_HEI, win_about.y_size);
|
|
ld hl, #_win_about + 5
|
|
ld l, (hl)
|
|
ld a, (#0x600e)
|
|
call _wc_center
|
|
ld (#(_win_about + 3)), a
|
|
;src/main.c:291: wc_prwow(&win_about);
|
|
ld hl, #_win_about
|
|
call _wc_prwow
|
|
;src/main.c:292: wait_esc_key();
|
|
call _wait_esc_key
|
|
;src/main.c:293: wc_rresb(&win_about);
|
|
ld hl, #_win_about
|
|
call _wc_rresb
|
|
;src/main.c:294: wc_exit(WC_EXIT);
|
|
xor a, a
|
|
;src/main.c:295: }
|
|
jp _wc_exit
|
|
;src/main.c:300: void unload_and_exit(WC_EXIT_SIGNAL sig)
|
|
; ---------------------------------
|
|
; Function unload_and_exit
|
|
; ---------------------------------
|
|
_unload_and_exit::
|
|
dec sp
|
|
ld iy, #0
|
|
add iy, sp
|
|
ld 0 (iy), a
|
|
;src/main.c:302: esp_cmd(ESP_CMD_TRACK_STOP);
|
|
ld a, #0xa2
|
|
call _esp_cmd
|
|
;src/main.c:303: esp_wait_busy(100); // 2s - both should be near-instant
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:304: esp_cmd(ESP_CMD_KILL_OBJECTS);
|
|
ld a, #0xe4
|
|
call _esp_cmd
|
|
;src/main.c:305: esp_wait_busy(100);
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:306: wc_rresb(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_rresb
|
|
;src/main.c:307: wc_exit(sig);
|
|
ld hl, #0
|
|
add hl, sp
|
|
ld a, (hl)
|
|
inc sp
|
|
jp _wc_exit
|
|
;src/main.c:308: }
|
|
inc sp
|
|
ret
|
|
;src/main.c:312: void leave_playing_and_exit()
|
|
; ---------------------------------
|
|
; Function leave_playing_and_exit
|
|
; ---------------------------------
|
|
_leave_playing_and_exit::
|
|
;src/main.c:314: wc_rresb(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_rresb
|
|
;src/main.c:315: wc_exit(WC_EXIT);
|
|
xor a, a
|
|
;src/main.c:316: }
|
|
jp _wc_exit
|
|
;src/main.c:322: void wait_for_manual_exit()
|
|
; ---------------------------------
|
|
; Function wait_for_manual_exit
|
|
; ---------------------------------
|
|
_wait_for_manual_exit::
|
|
;src/main.c:324: while (1)
|
|
00109$:
|
|
;src/main.c:328: __endasm;
|
|
halt
|
|
;src/main.c:330: if (wc_key_pgdn() || wc_key_enter())
|
|
call _wc_key_pgdn
|
|
or a, a
|
|
jr nz, 00101$
|
|
call _wc_key_enter
|
|
or a, a
|
|
jr z, 00102$
|
|
00101$:
|
|
;src/main.c:331: unload_and_exit(WC_NEXT_FILE);
|
|
ld a, #0x02
|
|
call _unload_and_exit
|
|
00102$:
|
|
;src/main.c:333: if (wc_key_pgup())
|
|
call _wc_key_pgup
|
|
or a, a
|
|
jr z, 00105$
|
|
;src/main.c:334: unload_and_exit(WC_PREV_FILE);
|
|
ld a, #0x04
|
|
call _unload_and_exit
|
|
00105$:
|
|
;src/main.c:336: if (wc_key_esc())
|
|
call _wc_key_esc
|
|
or a, a
|
|
jr z, 00109$
|
|
;src/main.c:337: unload_and_exit(WC_EXIT);
|
|
xor a, a
|
|
call _unload_and_exit
|
|
;src/main.c:339: }
|
|
jp 00109$
|
|
;src/main.c:345: void error_esp()
|
|
; ---------------------------------
|
|
; Function error_esp
|
|
; ---------------------------------
|
|
_error_esp::
|
|
;src/main.c:350: xm_set_status_code("No ESP32 found", state_esp);
|
|
ld a, (_state_esp)
|
|
push af
|
|
inc sp
|
|
ld hl, #___str_4
|
|
call _xm_set_status_code
|
|
;src/main.c:351: wait_esc_key();
|
|
call _wait_esc_key
|
|
;src/main.c:352: wc_rresb(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_rresb
|
|
;src/main.c:353: wc_exit(WC_EXIT);
|
|
xor a, a
|
|
;src/main.c:354: }
|
|
jp _wc_exit
|
|
___str_4:
|
|
.ascii "No ESP32 found"
|
|
.db 0x00
|
|
;src/main.c:364: u8 stop_on_error()
|
|
; ---------------------------------
|
|
; Function stop_on_error
|
|
; ---------------------------------
|
|
_stop_on_error::
|
|
;src/main.c:366: return wc_prm_pl(1) == 2;
|
|
ld a, #0x01
|
|
call _wc_prm_pl
|
|
cp a, #0x02
|
|
ld a, #0x01
|
|
ret z
|
|
xor a, a
|
|
;src/main.c:367: }
|
|
ret
|
|
;src/main.c:369: void error_oom()
|
|
; ---------------------------------
|
|
; Function error_oom
|
|
; ---------------------------------
|
|
_error_oom::
|
|
;src/main.c:371: xm_set_status_code("File too large", last_esp_status);
|
|
ld a, (_last_esp_status)
|
|
push af
|
|
inc sp
|
|
ld hl, #___str_5
|
|
call _xm_set_status_code
|
|
;src/main.c:373: if (stop_on_error())
|
|
call _stop_on_error
|
|
or a, a
|
|
jr z, 00102$
|
|
;src/main.c:374: wait_for_manual_exit();
|
|
call _wait_for_manual_exit
|
|
00102$:
|
|
;src/main.c:376: wait_frames(50); // show the error for ~1 second (50Hz), then auto-advance
|
|
ld a, #0x32
|
|
call _wait_frames
|
|
;src/main.c:377: wc_rresb(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_rresb
|
|
;src/main.c:378: wc_exit(WC_NEXT_FILE);
|
|
ld a, #0x02
|
|
;src/main.c:379: }
|
|
jp _wc_exit
|
|
___str_5:
|
|
.ascii "File too large"
|
|
.db 0x00
|
|
;src/main.c:381: void error_playback()
|
|
; ---------------------------------
|
|
; Function error_playback
|
|
; ---------------------------------
|
|
_error_playback::
|
|
;src/main.c:383: xm_set_status_code("Playback error", last_esp_status);
|
|
ld a, (_last_esp_status)
|
|
push af
|
|
inc sp
|
|
ld hl, #___str_6
|
|
call _xm_set_status_code
|
|
;src/main.c:385: if (stop_on_error())
|
|
call _stop_on_error
|
|
or a, a
|
|
jr z, 00102$
|
|
;src/main.c:386: wait_for_manual_exit();
|
|
call _wait_for_manual_exit
|
|
00102$:
|
|
;src/main.c:388: wait_frames(50); // show the error for ~1 second (50Hz), then auto-advance
|
|
ld a, #0x32
|
|
call _wait_frames
|
|
;src/main.c:389: wc_rresb(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_rresb
|
|
;src/main.c:390: wc_exit(WC_NEXT_FILE);
|
|
ld a, #0x02
|
|
;src/main.c:391: }
|
|
jp _wc_exit
|
|
___str_6:
|
|
.ascii "Playback error"
|
|
.db 0x00
|
|
;src/main.c:398: void copy_file_name()
|
|
; ---------------------------------
|
|
; Function copy_file_name
|
|
; ---------------------------------
|
|
_copy_file_name::
|
|
;src/main.c:400: u8 *src = (u8*)p_file_name;
|
|
ld bc, (_p_file_name)
|
|
;src/main.c:403: while (src[i] && i < sizeof(file_name) - 1)
|
|
ld e, #0x00
|
|
00102$:
|
|
ld l, e
|
|
ld h, #0x00
|
|
add hl, bc
|
|
ld d, (hl)
|
|
;src/main.c:405: file_name[i] = src[i];
|
|
ld a, #<(_file_name)
|
|
add a, e
|
|
ld l, a
|
|
ld a, #>(_file_name)
|
|
adc a, #0x00
|
|
ld h, a
|
|
;src/main.c:403: while (src[i] && i < sizeof(file_name) - 1)
|
|
ld a, d
|
|
or a, a
|
|
jr z, 00104$
|
|
ld a, e
|
|
sub a, #0x20
|
|
jr nc, 00104$
|
|
;src/main.c:405: file_name[i] = src[i];
|
|
ld (hl), d
|
|
;src/main.c:406: i++;
|
|
inc e
|
|
jp 00102$
|
|
00104$:
|
|
;src/main.c:408: file_name[i] = 0;
|
|
ld (hl), #0x00
|
|
;src/main.c:409: }
|
|
ret
|
|
;src/main.c:442: void xm_draw_static_labels()
|
|
; ---------------------------------
|
|
; Function xm_draw_static_labels
|
|
; ---------------------------------
|
|
_xm_draw_static_labels::
|
|
;src/main.c:444: wc_prsrw(&win_xm, "File:", ROW_FILE, 1, 5);
|
|
ld hl, #0x0005
|
|
push hl
|
|
ld hl, #0x102
|
|
push hl
|
|
ld de, #___str_7
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:445: wc_prsrw_attr(&win_xm, file_name, ROW_FILE, 7, strlen(file_name), ATTR_VALUE);
|
|
ld hl, #_file_name
|
|
call _strlen
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
push de
|
|
ld hl, #0x702
|
|
push hl
|
|
ld de, #_file_name
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw_attr
|
|
;src/main.c:446: wc_prsrw(&win_xm, "Status:", ROW_STATUS, 1, 7);
|
|
ld hl, #0x0007
|
|
push hl
|
|
ld hl, #0x103
|
|
push hl
|
|
ld de, #___str_8
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:449: wc_prsrw(&win_xm, HINT_TEXT, ROW_HINT, 2, sizeof(HINT_TEXT) - 1);
|
|
ld hl, #0x0024
|
|
push hl
|
|
ld hl, #0x20a
|
|
push hl
|
|
ld de, #___str_9
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:450: }
|
|
ret
|
|
___str_7:
|
|
.ascii "File:"
|
|
.db 0x00
|
|
___str_8:
|
|
.ascii "Status:"
|
|
.db 0x00
|
|
___str_9:
|
|
.ascii "PgUp/PgDn:Track Esc:Stop Space:Leave"
|
|
.db 0x00
|
|
;src/main.c:456: void xm_set_status_attr(const char *msg, u8 attr)
|
|
; ---------------------------------
|
|
; Function xm_set_status_attr
|
|
; ---------------------------------
|
|
_xm_set_status_attr::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
push af
|
|
;src/main.c:460: while (msg[i] && i < STATUS_VALUE_WIDTH)
|
|
ld e, #0x00
|
|
00102$:
|
|
ld a, e
|
|
add a, l
|
|
ld c, a
|
|
ld a, #0x00
|
|
adc a, h
|
|
ld b, a
|
|
ld a, (bc)
|
|
ld c, a
|
|
or a, a
|
|
jr z, 00119$
|
|
ld a, e
|
|
sub a, #0x18
|
|
jr nc, 00119$
|
|
;src/main.c:462: status_buf[i] = msg[i];
|
|
ld a, #<(_status_buf)
|
|
add a, e
|
|
ld -2 (ix), a
|
|
ld a, #>(_status_buf)
|
|
adc a, #0x00
|
|
ld -1 (ix), a
|
|
push hl
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
ld (hl), c
|
|
pop hl
|
|
;src/main.c:463: i++;
|
|
inc e
|
|
jp 00102$
|
|
;src/main.c:465: while (i < STATUS_VALUE_WIDTH)
|
|
00119$:
|
|
00105$:
|
|
ld a, e
|
|
sub a, #0x18
|
|
jr nc, 00107$
|
|
;src/main.c:466: status_buf[i++] = ' ';
|
|
ld hl, #_status_buf
|
|
ld d, #0x00
|
|
add hl, de
|
|
inc e
|
|
ld (hl), #0x20
|
|
jp 00105$
|
|
00107$:
|
|
;src/main.c:468: wc_prsrw_attr(&win_xm, status_buf, ROW_STATUS, STATUS_VALUE_X, STATUS_VALUE_WIDTH, attr);
|
|
ld hl, #_win_xm
|
|
ld a, 4 (ix)
|
|
push af
|
|
inc sp
|
|
ld de, #0x0018
|
|
push de
|
|
ld de, #0x903
|
|
push de
|
|
ld de, #_status_buf
|
|
call _wc_prsrw_attr
|
|
;src/main.c:469: }
|
|
ld sp, ix
|
|
pop ix
|
|
pop hl
|
|
inc sp
|
|
jp (hl)
|
|
;src/main.c:471: void xm_set_status(const char *msg)
|
|
; ---------------------------------
|
|
; Function xm_set_status
|
|
; ---------------------------------
|
|
_xm_set_status::
|
|
;src/main.c:473: xm_set_status_attr(msg, ATTR_VALUE);
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
call _xm_set_status_attr
|
|
;src/main.c:474: }
|
|
ret
|
|
;src/main.c:481: void xm_set_status_code(const char *msg, u8 code)
|
|
; ---------------------------------
|
|
; Function xm_set_status_code
|
|
; ---------------------------------
|
|
_xm_set_status_code::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
dec sp
|
|
ex de, hl
|
|
;src/main.c:486: while (msg[i] && i < sizeof(status_code_buf) - 7)
|
|
ld c, #0x00
|
|
00102$:
|
|
ld l, c
|
|
ld h, #0x00
|
|
add hl, de
|
|
ld b, (hl)
|
|
;src/main.c:488: status_code_buf[i] = msg[i];
|
|
ld a, #<(_status_code_buf)
|
|
add a, c
|
|
ld l, a
|
|
ld a, #>(_status_code_buf)
|
|
adc a, #0x00
|
|
ld h, a
|
|
;src/main.c:489: i++;
|
|
ld a, c
|
|
inc a
|
|
ld -1 (ix), a
|
|
;src/main.c:486: while (msg[i] && i < sizeof(status_code_buf) - 7)
|
|
ld a, b
|
|
or a, a
|
|
jr z, 00104$
|
|
ld a, c
|
|
sub a, #0x11
|
|
jr nc, 00104$
|
|
;src/main.c:488: status_code_buf[i] = msg[i];
|
|
ld (hl), b
|
|
;src/main.c:489: i++;
|
|
ld c, -1 (ix)
|
|
jp 00102$
|
|
00104$:
|
|
;src/main.c:492: status_code_buf[i++] = ' ';
|
|
ld c, -1 (ix)
|
|
ld (hl), #0x20
|
|
;src/main.c:493: status_code_buf[i++] = '(';
|
|
ld l, c
|
|
inc c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld (hl), #0x28
|
|
;src/main.c:494: status_code_buf[i++] = '0';
|
|
ld l, c
|
|
inc c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld (hl), #0x30
|
|
;src/main.c:495: status_code_buf[i++] = 'x';
|
|
ld l, c
|
|
inc c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld (hl), #0x78
|
|
;src/main.c:496: status_code_buf[i++] = hexch[(code >> 4) & 0xF];
|
|
ld l, c
|
|
inc c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld a, 4 (ix)
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
and a, #0xf
|
|
add a, #<(_xm_set_status_code_hexch_10000_141)
|
|
ld e, a
|
|
ld a, #0x00
|
|
adc a, #>(_xm_set_status_code_hexch_10000_141)
|
|
ld d, a
|
|
ld a, (de)
|
|
ld (hl), a
|
|
;src/main.c:497: status_code_buf[i++] = hexch[code & 0xF];
|
|
ld l, c
|
|
inc c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld a, 4 (ix)
|
|
and a, #0x0f
|
|
add a, #<(_xm_set_status_code_hexch_10000_141)
|
|
ld e, a
|
|
ld a, #0x00
|
|
adc a, #>(_xm_set_status_code_hexch_10000_141)
|
|
ld d, a
|
|
ld a, (de)
|
|
ld (hl), a
|
|
;src/main.c:498: status_code_buf[i++] = ')';
|
|
ld l, c
|
|
inc c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld (hl), #0x29
|
|
;src/main.c:499: status_code_buf[i] = 0;
|
|
ld l, c
|
|
ld h, #0x00
|
|
ld de, #_status_code_buf
|
|
add hl, de
|
|
ld (hl), #0x00
|
|
;src/main.c:501: xm_set_status_attr(status_code_buf, ATTR_ERROR);
|
|
ld a, #0x72
|
|
push af
|
|
inc sp
|
|
ld hl, #_status_code_buf
|
|
call _xm_set_status_attr
|
|
;src/main.c:502: }
|
|
inc sp
|
|
pop ix
|
|
pop hl
|
|
inc sp
|
|
jp (hl)
|
|
_xm_set_status_code_hexch_10000_141:
|
|
.ascii "0123456789ABCDEF"
|
|
.db 0x00
|
|
;src/main.c:515: void put_hex2(char *dst, u8 val)
|
|
; ---------------------------------
|
|
; Function put_hex2
|
|
; ---------------------------------
|
|
_put_hex2::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
ex de, hl
|
|
;src/main.c:518: dst[0] = hexch[(val >> 4) & 0xF];
|
|
ld bc, #_put_hex2_hexch_10000_144+0
|
|
ld a, 4 (ix)
|
|
rlca
|
|
rlca
|
|
rlca
|
|
rlca
|
|
and a, #0xf
|
|
ld l, a
|
|
ld h, #0x00
|
|
add hl, bc
|
|
ld a, (hl)
|
|
ld (de), a
|
|
;src/main.c:519: dst[1] = hexch[val & 0xF];
|
|
inc de
|
|
ld a, 4 (ix)
|
|
and a, #0x0f
|
|
ld l, a
|
|
ld h, #0x00
|
|
add hl, bc
|
|
ld a, (hl)
|
|
ld (de), a
|
|
;src/main.c:520: }
|
|
pop ix
|
|
pop hl
|
|
inc sp
|
|
jp (hl)
|
|
_put_hex2_hexch_10000_144:
|
|
.ascii "0123456789ABCDEF"
|
|
.db 0x00
|
|
;src/main.c:522: void put_dec3(char *dst, u16 val)
|
|
; ---------------------------------
|
|
; Function put_dec3
|
|
; ---------------------------------
|
|
_put_dec3::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
push af
|
|
ld c, l
|
|
ld b, h
|
|
;src/main.c:524: dst[0] = '0' + (val / 100) % 10;
|
|
pop hl
|
|
push de
|
|
push bc
|
|
ld de, #0x0064
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
call __divuint
|
|
ex de, hl
|
|
ld de, #0x000a
|
|
call __moduint
|
|
pop bc
|
|
ld a, e
|
|
add a, #0x30
|
|
ld (bc), a
|
|
;src/main.c:525: dst[1] = '0' + (val / 10) % 10;
|
|
ld l, c
|
|
ld h, b
|
|
inc hl
|
|
push hl
|
|
push bc
|
|
ld de, #0x000a
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
call __divuint
|
|
ex de, hl
|
|
ld de, #0x000a
|
|
call __moduint
|
|
pop bc
|
|
pop hl
|
|
ld a, e
|
|
add a, #0x30
|
|
ld (hl), a
|
|
;src/main.c:526: dst[2] = '0' + val % 10;
|
|
inc bc
|
|
inc bc
|
|
push bc
|
|
ld de, #0x000a
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
call __moduint
|
|
pop bc
|
|
ld a, e
|
|
add a, #0x30
|
|
ld (bc), a
|
|
;src/main.c:527: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/main.c:529: void put_time(char *dst, u32 sec)
|
|
; ---------------------------------
|
|
; Function put_time
|
|
; ---------------------------------
|
|
_put_time::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
push hl
|
|
;src/main.c:531: u8 m = (sec / 60) % 100;
|
|
ld hl, #0x0000
|
|
push hl
|
|
ld l, #0x3c
|
|
push hl
|
|
ld e, 4 (ix)
|
|
ld d, 5 (ix)
|
|
ld l, 6 (ix)
|
|
ld h, 7 (ix)
|
|
call __divulong
|
|
pop af
|
|
pop af
|
|
ld bc, #0x0000
|
|
push bc
|
|
ld c, #0x64
|
|
push bc
|
|
call __modulong
|
|
pop af
|
|
pop af
|
|
ld c, e
|
|
;src/main.c:532: u8 s = sec % 60;
|
|
push bc
|
|
ld hl, #0x0000
|
|
push hl
|
|
ld l, #0x3c
|
|
push hl
|
|
ld e, 4 (ix)
|
|
ld d, 5 (ix)
|
|
ld l, 6 (ix)
|
|
ld h, 7 (ix)
|
|
call __modulong
|
|
pop af
|
|
pop af
|
|
pop bc
|
|
;src/main.c:534: dst[0] = '0' + (m / 10) % 10;
|
|
ld d, c
|
|
push de
|
|
ld l, #0x0a
|
|
ld a, d
|
|
call __divuchar
|
|
ld a, e
|
|
ld l, #0x0a
|
|
call __moduchar
|
|
ld a, e
|
|
pop de
|
|
add a, #0x30
|
|
pop hl
|
|
push hl
|
|
ld (hl), a
|
|
;src/main.c:535: dst[1] = '0' + m % 10;
|
|
pop bc
|
|
push bc
|
|
inc bc
|
|
push bc
|
|
push de
|
|
ld l, #0x0a
|
|
ld a, d
|
|
call __moduchar
|
|
ld a, e
|
|
pop de
|
|
pop bc
|
|
add a, #0x30
|
|
ld (bc), a
|
|
;src/main.c:536: dst[2] = ':';
|
|
pop hl
|
|
push hl
|
|
inc hl
|
|
inc hl
|
|
ld (hl), #0x3a
|
|
;src/main.c:537: dst[3] = '0' + (s / 10) % 10;
|
|
pop bc
|
|
push bc
|
|
inc bc
|
|
inc bc
|
|
inc bc
|
|
push bc
|
|
push de
|
|
ld l, #0x0a
|
|
ld a, e
|
|
call __divuchar
|
|
ld a, e
|
|
ld l, #0x0a
|
|
call __moduchar
|
|
ld a, e
|
|
pop de
|
|
pop bc
|
|
add a, #0x30
|
|
ld (bc), a
|
|
;src/main.c:538: dst[4] = '0' + s % 10;
|
|
ld a, -2 (ix)
|
|
add a, #0x04
|
|
ld c, a
|
|
ld a, -1 (ix)
|
|
adc a, #0x00
|
|
ld b, a
|
|
push bc
|
|
ld l, #0x0a
|
|
ld a, e
|
|
call __moduchar
|
|
ld a, e
|
|
pop bc
|
|
add a, #0x30
|
|
ld (bc), a
|
|
;src/main.c:539: }
|
|
ld sp, ix
|
|
pop ix
|
|
pop hl
|
|
pop af
|
|
pop af
|
|
jp (hl)
|
|
;src/main.c:568: void xm_draw_stats_labels()
|
|
; ---------------------------------
|
|
; Function xm_draw_stats_labels
|
|
; ---------------------------------
|
|
_xm_draw_stats_labels::
|
|
;src/main.c:572: wc_prsrw(&win_xm, "Pattern:#", ROW_STATS, 1, 9);
|
|
ld hl, #0x0009
|
|
push hl
|
|
ld hl, #0x104
|
|
push hl
|
|
ld de, #___str_12
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:573: wc_prsrw(&win_xm, " Row:#", ROW_STATS, 12, 7);
|
|
ld hl, #0x0007
|
|
push hl
|
|
ld hl, #0xc04
|
|
push hl
|
|
ld de, #___str_13
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:574: wc_prsrw(&win_xm, " BPM:", ROW_STATS, 21, 6);
|
|
ld hl, #0x0006
|
|
push hl
|
|
ld hl, #0x1504
|
|
push hl
|
|
ld de, #___str_14
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:576: wc_prsrw(&win_xm, "Time:", ROW_TIME, 1, 5);
|
|
ld hl, #0x0005
|
|
push hl
|
|
ld hl, #0x106
|
|
push hl
|
|
ld de, #___str_15
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:577: wc_prsrw(&win_xm, " / ", ROW_TIME, 12, 3);
|
|
ld hl, #0x0003
|
|
push hl
|
|
ld hl, #0xc06
|
|
push hl
|
|
ld de, #___str_16
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:579: for (i = 0; i < BAR_WIDTH; i++)
|
|
ld de, #_barbuf+0
|
|
ld c, #0x00
|
|
00103$:
|
|
;src/main.c:580: barbuf[i] = ' ';
|
|
ld l, c
|
|
ld h, #0x00
|
|
add hl, de
|
|
ld (hl), #0x20
|
|
;src/main.c:579: for (i = 0; i < BAR_WIDTH; i++)
|
|
inc c
|
|
ld a, c
|
|
sub a, #0x20
|
|
jr c, 00103$
|
|
;src/main.c:581: wc_prsrw(&win_xm, barbuf, ROW_BAR, BAR_X, BAR_WIDTH);
|
|
;src/main.c:572: wc_prsrw(&win_xm, "Pattern:#", ROW_STATS, 1, 9);
|
|
;src/main.c:581: wc_prsrw(&win_xm, barbuf, ROW_BAR, BAR_X, BAR_WIDTH);
|
|
ld hl, #0x0020
|
|
push hl
|
|
ld hl, #0x408
|
|
push hl
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw
|
|
;src/main.c:583: bar_attr_ofs = (wc_gadrw(&win_xm, ROW_BAR, BAR_X) & 0x3FFF) | 0x0080;
|
|
ld hl, #0x408
|
|
push hl
|
|
ld hl, #_win_xm
|
|
call _wc_gadrw
|
|
ld a, d
|
|
and a, #0x3f
|
|
ld d, a
|
|
set 7, e
|
|
ld (_bar_attr_ofs), de
|
|
;src/main.c:585: for (i = 0; i < BAR_WIDTH; i++)
|
|
ld c, #0x00
|
|
00105$:
|
|
;src/main.c:586: *(volatile u8*)(0xC000 + bar_attr_ofs + i) = ATTR_BAR_EMPTY;
|
|
ld hl, (_bar_attr_ofs)
|
|
ld e, l
|
|
ld a, h
|
|
add a, #0xc0
|
|
ld d, a
|
|
ld l, c
|
|
ld h, #0x00
|
|
add hl, de
|
|
ld (hl), #0x07
|
|
;src/main.c:585: for (i = 0; i < BAR_WIDTH; i++)
|
|
inc c
|
|
ld a, c
|
|
sub a, #0x20
|
|
jr c, 00105$
|
|
;src/main.c:587: }
|
|
ret
|
|
___str_12:
|
|
.ascii "Pattern:#"
|
|
.db 0x00
|
|
___str_13:
|
|
.ascii " Row:#"
|
|
.db 0x00
|
|
___str_14:
|
|
.ascii " BPM:"
|
|
.db 0x00
|
|
___str_15:
|
|
.ascii "Time:"
|
|
.db 0x00
|
|
___str_16:
|
|
.ascii " / "
|
|
.db 0x00
|
|
;src/main.c:589: void draw_progress_bar(u32 samples, u32 total)
|
|
; ---------------------------------
|
|
; Function draw_progress_bar
|
|
; ---------------------------------
|
|
_draw_progress_bar::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
ld c, e
|
|
ld b, d
|
|
ex de, hl
|
|
;src/main.c:593: if (total)
|
|
ld a, 7 (ix)
|
|
or a, 6 (ix)
|
|
or a, 5 (ix)
|
|
or a, 4 (ix)
|
|
jr z, 00104$
|
|
;src/main.c:595: filled = (u16)(((u32)samples * BAR_WIDTH) / total);
|
|
ld l, c
|
|
ld h, b
|
|
ld a, #0x05
|
|
00146$:
|
|
add hl, hl
|
|
rl e
|
|
rl d
|
|
dec a
|
|
jr nz, 00146$
|
|
ld c, 6 (ix)
|
|
ld b, 7 (ix)
|
|
push bc
|
|
ld c, 4 (ix)
|
|
ld b, 5 (ix)
|
|
push bc
|
|
ex de, hl
|
|
call __divulong
|
|
pop af
|
|
pop af
|
|
;src/main.c:596: if (filled > BAR_WIDTH)
|
|
ld c,e
|
|
ld b,d
|
|
ld a, #0x20
|
|
cp a, e
|
|
ld a, #0x00
|
|
sbc a, d
|
|
jr nc, 00120$
|
|
;src/main.c:597: filled = BAR_WIDTH;
|
|
ld bc, #0x0020
|
|
jp 00120$
|
|
00104$:
|
|
;src/main.c:600: filled = 0; // total length unknown (measurement timed out) - show empty
|
|
ld bc, #0x0000
|
|
;src/main.c:602: for (i = 0; i < BAR_WIDTH; i++)
|
|
00120$:
|
|
ld de, #0x0000
|
|
00107$:
|
|
;src/main.c:603: *(volatile u8*)(0xC000 + bar_attr_ofs + i) = (i < filled) ? ATTR_BAR_FILLED : ATTR_BAR_EMPTY;
|
|
ld hl, (_bar_attr_ofs)
|
|
ld a, h
|
|
add a, #0xc0
|
|
ld h, a
|
|
add hl, de
|
|
ld a, e
|
|
sub a, c
|
|
ld a, d
|
|
sbc a, b
|
|
jr nc, 00111$
|
|
ld a, #0x40
|
|
jp 00112$
|
|
00111$:
|
|
ld a, #0x07
|
|
00112$:
|
|
ld (hl), a
|
|
;src/main.c:602: for (i = 0; i < BAR_WIDTH; i++)
|
|
inc de
|
|
ld l, e
|
|
ld h, d
|
|
ld a, l
|
|
sub a, #0x20
|
|
ld a, h
|
|
sbc a, #0x00
|
|
jr c, 00107$
|
|
;src/main.c:604: }
|
|
pop ix
|
|
pop hl
|
|
pop af
|
|
pop af
|
|
jp (hl)
|
|
;src/main.c:606: void xm_update_info()
|
|
; ---------------------------------
|
|
; Function xm_update_info
|
|
; ---------------------------------
|
|
_xm_update_info::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
ld hl, #-8
|
|
add hl, sp
|
|
ld sp, hl
|
|
;src/main.c:612: esp_wr_reg8(ESP_REG_OBJ_HANDLE, xm_handle);
|
|
ld a, (_xm_handle)
|
|
ld l, a
|
|
ld a, #0x0b
|
|
call _esp_wr_reg8
|
|
;src/main.c:613: esp_cmd(ESP_CMD_TRACK_GET_INFO);
|
|
ld a, #0xa8
|
|
call _esp_cmd
|
|
;src/main.c:614: esp_wait_busy(50); // 1s - a plain info read should be near-instant
|
|
ld hl, #0x0032
|
|
call _esp_wait_busy
|
|
;src/main.c:619: status = esp_rd_reg8(ESP_REG_TRACK_STATUS);
|
|
ld a, #0x28
|
|
call _esp_rd_reg8
|
|
ld -1 (ix), a
|
|
;src/main.c:620: if (last_track_status == TRACK_OBJ_ST_PLAYING && status == TRACK_OBJ_ST_STOPPED)
|
|
ld a, (_last_track_status)
|
|
sub a, #0x21
|
|
jr nz, 00102$
|
|
ld a, -1 (ix)
|
|
sub a, #0x20
|
|
jr nz, 00102$
|
|
;src/main.c:622: esp_cmd(ESP_CMD_KILL_OBJECTS);
|
|
ld a, #0xe4
|
|
call _esp_cmd
|
|
;src/main.c:623: esp_wait_busy(100);
|
|
ld hl, #0x0064
|
|
call _esp_wait_busy
|
|
;src/main.c:624: wc_rresb(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_rresb
|
|
;src/main.c:625: wc_exit(WC_NEXT_FILE);
|
|
ld a, #0x02
|
|
call _wc_exit
|
|
00102$:
|
|
;src/main.c:627: last_track_status = status;
|
|
ld a, -1 (ix)
|
|
ld (#_last_track_status), a
|
|
;src/main.c:629: pattern = esp_rd_reg8(ESP_REG_TRACK_PATTERN);
|
|
ld a, #0x2b
|
|
call _esp_rd_reg8
|
|
ld -6 (ix), a
|
|
;src/main.c:630: row = esp_rd_reg8(ESP_REG_TRACK_ROW);
|
|
ld a, #0x2c
|
|
call _esp_rd_reg8
|
|
ld -5 (ix), a
|
|
;src/main.c:631: esp_rd_regs(ESP_REG_TRACK_BPM, &bpm, 2);
|
|
ld a, #0x02
|
|
push af
|
|
inc sp
|
|
ld hl, #1
|
|
add hl, sp
|
|
ex de, hl
|
|
ld a, #0x31
|
|
call _esp_rd_regs
|
|
;src/main.c:632: samples = esp_rd_reg32(ESP_REG_TRACK_SAMPLES);
|
|
ld a, #0x2d
|
|
call _esp_rd_reg32
|
|
ld -4 (ix), e
|
|
ld -3 (ix), d
|
|
ld -2 (ix), l
|
|
ld -1 (ix), h
|
|
;src/main.c:634: if (!total_samples)
|
|
ld a, (_total_samples+3)
|
|
ld iy, #_total_samples
|
|
or a, 2 (iy)
|
|
or a, 1 (iy)
|
|
or a, 0 (iy)
|
|
jr nz, 00105$
|
|
;src/main.c:635: total_samples = esp_rd_reg32(ESP_REG_TRACK_TOTAL_SAMPLES);
|
|
ld a, #0x36
|
|
call _esp_rd_reg32
|
|
ld (_total_samples), de
|
|
ld (_total_samples + 2), hl
|
|
00105$:
|
|
;src/main.c:637: put_hex2(hexbuf, pattern);
|
|
ld a, -6 (ix)
|
|
push af
|
|
inc sp
|
|
ld hl, #_hexbuf
|
|
call _put_hex2
|
|
;src/main.c:638: wc_prsrw_attr(&win_xm, hexbuf, ROW_STATS, 10, 2, ATTR_VALUE);
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
ld hl, #0x0002
|
|
push hl
|
|
ld hl, #0xa04
|
|
push hl
|
|
ld de, #_hexbuf
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw_attr
|
|
;src/main.c:640: put_hex2(hexbuf, row);
|
|
ld a, -5 (ix)
|
|
push af
|
|
inc sp
|
|
ld hl, #_hexbuf
|
|
call _put_hex2
|
|
;src/main.c:641: wc_prsrw_attr(&win_xm, hexbuf, ROW_STATS, 19, 2, ATTR_VALUE);
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
ld hl, #0x0002
|
|
push hl
|
|
ld hl, #0x1304
|
|
push hl
|
|
ld de, #_hexbuf
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw_attr
|
|
;src/main.c:643: put_dec3(decbuf, bpm);
|
|
pop de
|
|
push de
|
|
ld hl, #_decbuf
|
|
call _put_dec3
|
|
;src/main.c:644: wc_prsrw_attr(&win_xm, decbuf, ROW_STATS, 27, 3, ATTR_VALUE);
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
ld hl, #0x0003
|
|
push hl
|
|
ld hl, #0x1b04
|
|
push hl
|
|
ld de, #_decbuf
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw_attr
|
|
;src/main.c:646: put_time(timebuf, samples / 44100UL);
|
|
ld hl, #0x0000
|
|
push hl
|
|
ld hl, #0xac44
|
|
push hl
|
|
ld e, -4 (ix)
|
|
ld d, -3 (ix)
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
call __divulong
|
|
pop af
|
|
ex (sp),hl
|
|
push de
|
|
ld hl, #_timebuf
|
|
call _put_time
|
|
;src/main.c:647: wc_prsrw_attr(&win_xm, timebuf, ROW_TIME, 7, 5, ATTR_VALUE);
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
ld hl, #0x0005
|
|
push hl
|
|
ld hl, #0x706
|
|
push hl
|
|
ld de, #_timebuf
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw_attr
|
|
;src/main.c:649: put_time(timebuf, total_samples / 44100UL);
|
|
ld hl, #0x0000
|
|
push hl
|
|
ld hl, #0xac44
|
|
push hl
|
|
ld de, (_total_samples)
|
|
ld hl, (_total_samples + 2)
|
|
call __divulong
|
|
pop af
|
|
ex (sp),hl
|
|
push de
|
|
ld hl, #_timebuf
|
|
call _put_time
|
|
;src/main.c:650: wc_prsrw_attr(&win_xm, timebuf, ROW_TIME, 15, 5, ATTR_VALUE);
|
|
ld a, #0x71
|
|
push af
|
|
inc sp
|
|
ld hl, #0x0005
|
|
push hl
|
|
ld hl, #0xf06
|
|
push hl
|
|
ld de, #_timebuf
|
|
ld hl, #_win_xm
|
|
call _wc_prsrw_attr
|
|
;src/main.c:652: draw_progress_bar(samples, total_samples);
|
|
ld hl, (_total_samples + 2)
|
|
push hl
|
|
ld hl, (_total_samples)
|
|
push hl
|
|
ld e, -4 (ix)
|
|
ld d, -3 (ix)
|
|
ld l, -2 (ix)
|
|
ld h, -1 (ix)
|
|
call _draw_progress_bar
|
|
;src/main.c:654: }
|
|
ld sp, ix
|
|
pop ix
|
|
ret
|
|
;src/main.c:656: void main_start()
|
|
; ---------------------------------
|
|
; Function main_start
|
|
; ---------------------------------
|
|
_main_start::
|
|
push ix
|
|
ld ix, #0
|
|
add ix, sp
|
|
dec sp
|
|
;src/main.c:660: copy_file_name();
|
|
call _copy_file_name
|
|
;src/main.c:672: memcpy(&win_xm, &win_xm_tpl, sizeof(win_xm));
|
|
ld de, #_win_xm
|
|
ld hl, #_win_xm_tpl
|
|
ld bc, #0x0012
|
|
ldir
|
|
;src/main.c:673: win_xm.x_pos = wc_center(wc_screen_width(), win_xm.x_size);
|
|
ld hl, #_win_xm + 4
|
|
ld l, (hl)
|
|
push hl
|
|
call _wc_screen_width
|
|
pop hl
|
|
call _wc_center
|
|
ld (#(_win_xm + 2)), a
|
|
;src/main.c:674: win_xm.y_pos = wc_center(*(u8*)_HEI, win_xm.y_size);
|
|
ld hl, #_win_xm + 5
|
|
ld l, (hl)
|
|
ld a, (#0x600e)
|
|
call _wc_center
|
|
ld (#(_win_xm + 3)), a
|
|
;src/main.c:683: wc_gedpl();
|
|
call _wc_gedpl
|
|
;src/main.c:684: wc_key_wait_release();
|
|
call _wc_key_wait_release
|
|
;src/main.c:685: wc_prwow(&win_xm);
|
|
ld hl, #_win_xm
|
|
call _wc_prwow
|
|
;src/main.c:686: xm_draw_static_labels();
|
|
call _xm_draw_static_labels
|
|
;src/main.c:687: xm_set_status("Loading, please wait...");
|
|
ld hl, #___str_17
|
|
call _xm_set_status
|
|
;src/main.c:689: if (state_esp == 0xFF)
|
|
ld a, (_state_esp)
|
|
inc a
|
|
jr nz, 00102$
|
|
;src/main.c:690: state_esp = esp_init() ? 1 : 2;
|
|
call _esp_init
|
|
or a, a
|
|
ld a, #0x01
|
|
jr nz, 00127$
|
|
ld a, #0x02
|
|
00127$:
|
|
ld (#_state_esp), a
|
|
00102$:
|
|
;src/main.c:692: if (state_esp != 1)
|
|
ld a, (_state_esp)
|
|
dec a
|
|
jr z, 00104$
|
|
;src/main.c:694: error_esp();
|
|
call _error_esp
|
|
;src/main.c:695: return;
|
|
jp 00124$
|
|
00104$:
|
|
;src/main.c:698: total_samples = 0;
|
|
xor a, a
|
|
ld (_total_samples+0), a
|
|
ld (_total_samples+1), a
|
|
ld (_total_samples+2), a
|
|
ld (_total_samples+3), a
|
|
;src/main.c:700: if (!play_xm())
|
|
call _play_xm
|
|
or a, a
|
|
jr nz, 00109$
|
|
;src/main.c:702: if (last_esp_status == ESP_ERR_OUT_OF_MEMORY)
|
|
ld a, (_last_esp_status)
|
|
sub a, #0x99
|
|
jr nz, 00106$
|
|
;src/main.c:703: error_oom();
|
|
call _error_oom
|
|
jp 00124$
|
|
00106$:
|
|
;src/main.c:705: error_playback();
|
|
call _error_playback
|
|
;src/main.c:706: return;
|
|
jp 00124$
|
|
00109$:
|
|
;src/main.c:709: xm_set_status("Playing");
|
|
ld hl, #___str_18
|
|
call _xm_set_status
|
|
;src/main.c:710: xm_draw_stats_labels();
|
|
call _xm_draw_stats_labels
|
|
;src/main.c:711: last_track_status = TRACK_OBJ_ST_PLAYING;
|
|
ld hl, #_last_track_status
|
|
ld (hl), #0x21
|
|
;src/main.c:712: xm_update_info();
|
|
call _xm_update_info
|
|
;src/main.c:714: frame_ctr = 0;
|
|
ld -1 (ix), #0x00
|
|
;src/main.c:718: while (1)
|
|
00122$:
|
|
;src/main.c:722: __endasm;
|
|
halt
|
|
;src/main.c:724: if (++frame_ctr >= 10) // ~5 updates/sec at 50Hz
|
|
inc -1 (ix)
|
|
ld a, -1 (ix)
|
|
sub a, #0x0a
|
|
jr c, 00111$
|
|
;src/main.c:726: frame_ctr = 0;
|
|
ld -1 (ix), #0x00
|
|
;src/main.c:727: xm_update_info();
|
|
call _xm_update_info
|
|
00111$:
|
|
;src/main.c:730: if (wc_key_pgdn() || wc_key_enter()) // PgDn or Enter - unload and go to next file
|
|
call _wc_key_pgdn
|
|
or a, a
|
|
jr nz, 00112$
|
|
call _wc_key_enter
|
|
or a, a
|
|
jr z, 00113$
|
|
00112$:
|
|
;src/main.c:731: unload_and_exit(WC_NEXT_FILE);
|
|
ld a, #0x02
|
|
call _unload_and_exit
|
|
00113$:
|
|
;src/main.c:733: if (wc_key_pgup()) // PgUp - unload and go to previous file
|
|
call _wc_key_pgup
|
|
or a, a
|
|
jr z, 00116$
|
|
;src/main.c:734: unload_and_exit(WC_PREV_FILE);
|
|
ld a, #0x04
|
|
call _unload_and_exit
|
|
00116$:
|
|
;src/main.c:736: if (wc_key_esc()) // Esc - unload and exit
|
|
call _wc_key_esc
|
|
or a, a
|
|
jr z, 00118$
|
|
;src/main.c:737: unload_and_exit(WC_EXIT);
|
|
xor a, a
|
|
call _unload_and_exit
|
|
00118$:
|
|
;src/main.c:739: if (wc_key_space()) // Space - leave the track playing, just exit
|
|
call _wc_key_space
|
|
or a, a
|
|
jr z, 00122$
|
|
;src/main.c:740: leave_playing_and_exit();
|
|
call _leave_playing_and_exit
|
|
jp 00122$
|
|
00124$:
|
|
;src/main.c:742: }
|
|
inc sp
|
|
pop ix
|
|
ret
|
|
___str_17:
|
|
.ascii "Loading, please wait..."
|
|
.db 0x00
|
|
___str_18:
|
|
.ascii "Playing"
|
|
.db 0x00
|
|
;src/main.c:745: void main()
|
|
; ---------------------------------
|
|
; Function main
|
|
; ---------------------------------
|
|
_main::
|
|
;src/main.c:755: __endasm;
|
|
ld (_ret_sp), sp
|
|
ld (_call_type), a
|
|
ld (_p_file_name), bc
|
|
ex af, af
|
|
ld (_file_ext), a
|
|
ld (_filesize), hl
|
|
ld (_filesize + 2), de
|
|
;src/main.c:757: switch (call_type)
|
|
ld a, (_call_type+0)
|
|
or a, a
|
|
jp z, _main_start
|
|
ld a, (_call_type)
|
|
sub a, #0x03
|
|
jp z, _about
|
|
;src/main.c:759: case WC_CALL_EXT:
|
|
;src/main.c:760: main_start();
|
|
;src/main.c:761: break;
|
|
;src/main.c:763: case WC_CALL_MENU:
|
|
;src/main.c:764: about();
|
|
;src/main.c:765: break;
|
|
;src/main.c:767: default:
|
|
;src/main.c:768: wc_exit(WC_EXIT);
|
|
xor a, a
|
|
;src/main.c:769: }
|
|
;src/main.c:770: }
|
|
jp _wc_exit
|
|
.area _CODE
|
|
.area _INITIALIZER
|
|
__xinit__state_esp:
|
|
.db #0xff ; 255
|
|
.area _CABS (ABS)
|