Fix esp32 wait-timing race, rename wc_api.lib, keyboard: Enter-to-advance

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>
This commit is contained in:
2026-09-07 12:40:36 +03:00
co-authored by Claude Sonnet 5
parent ecf52d60c8
commit 168d6a71bd
16 changed files with 4471 additions and 3841 deletions
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -2,7 +2,7 @@ REM NOTE: xmplay pins its OWN SDCC version here, independent of the rest of
REM ft812sdk (which stays on 4.0.0 for ABI reasons - see project memory on REM ft812sdk (which stays on 4.0.0 for ABI reasons - see project memory on
REM the earlier shared-lib ABI mismatch incident). 4.6.0 is needed here REM the earlier shared-lib ABI mismatch incident). 4.6.0 is needed here
REM specifically for --sdcccall 1, required to link demyanenko-d/ REM specifically for --sdcccall 1, required to link demyanenko-d/
REM VGMPLAY.WMF's wc_api library (vgm_wc_api.lib) - our own hand-rolled REM VGMPLAY.WMF's wc_api library (wc_api.lib) - our own hand-rolled
REM PRSRW+PRIAT implementations corrupted esp32 file loading in three REM PRSRW+PRIAT implementations corrupted esp32 file loading in three
REM different shapes and were abandoned in favor of their tested code. REM different shapes and were abandoned in favor of their tested code.
set SDCC=E:\SDCC\4.6.0 set SDCC=E:\SDCC\4.6.0
@@ -14,7 +14,7 @@ del /q /s obj >nul
sdasz80 -o obj/crt0.rel src/crt0.s sdasz80 -o obj/crt0.rel src/crt0.s
if errorlevel 1 pause & exit if errorlevel 1 pause & exit
sdcc -Isrc -I../lib/sdk -I../../../esp32/src/main -mz80 --sdcccall 1 --std-sdcc11 --opt-code-speed --no-std-crt0 obj/crt0.rel --code-loc 0x8003 --data-loc 0xA800 src/main.c vgm_wc_api.lib -o obj/out.hex sdcc -Isrc -I../lib/sdk -I../../../esp32/src/main -mz80 --sdcccall 1 --std-sdcc11 --opt-code-speed --no-std-crt0 obj/crt0.rel --code-loc 0x8003 --data-loc 0xA800 src/main.c wc_api.lib -o obj/out.hex
if errorlevel 1 pause & exit if errorlevel 1 pause & exit
if exist obj/out.hex hex2bin obj/out.hex >nul if exist obj/out.hex hex2bin obj/out.hex >nul
+658 -488
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+126 -117
View File
@@ -7,121 +7,130 @@
:2080C300B72807DB571213C3C1803E03D377E133E9474D3E13D3773E01D35778D357DB5768 :2080C300B72807DB571213C3C1803E03D377E133E9474D3E13D3773E01D35778D357DB5768
:2080E30079D3573E03D377C94F3E13D3773E01D35779D357DB57FD210200FD39FD7E00D3BA :2080E30079D3573E03D377C94F3E13D3773E01D35779D357DB57FD210200FD39FD7E00D3BA
:2081030057FD7E01D357FD7E02D357FD7E03D3573E03D377E1F1F1E93E13D3773E07D357CF :2081030057FD7E01D357FD7E02D357FD7E03D3573E03D377E1F1F1E93E13D3773E07D357CF
:20812300DB573E03D377C97D01AF1AED797C01AF1BED79FD210200FD39FD7E0001AF1CEDD2 :20812300DB573E03D377C9DDE5DD210000DD39F5F5DD75FEDD74FF2109607EDD77FC237E5D
:2081430079FD7E01FD4E02FD23CB39CB1F3D01AF26ED79FD7E023D01AF28ED793E13D377C0 :20814300DD77FD2A09607DDD96FC4F7CDD9EFD4779DD96FE78DD9EFF300E3E01CD2180FEFD
:208163003E03D357DB57DB573E8201AF27ED793E27DBAF0738F93E03D377CD1B8121640090 :208163000228E03E01C36C81AFDDF9DDE1C97D01AF1AED797C01AF1BED79FD210200FD3947
:20818300CDE881E1F1F133E93E13D3773E08D357DB573E03D377C9DDE5DD210000DD39213F :20818300FD7E0001AF1CED79FD7E01FD4E02FD23CB39CB1F3D01AF26ED79FD7E023D01AF75
:2081A300FBFF39F9DD77FFDD73FDDD72FE2109607EDD77FB237EDD77FC2A09607DDD96FBDD :2081A30028ED793E13D3773E03D357DB57DB573E8201AF27ED793E27DBAF0738F93E03D38C
:2081C3004F7CDD9EFC4779DD96FD78DD9EFE300F3E01CD2180DD96FF20DF3E01C3E381AFC7 :2081C30077CD1B81216400CD2A81E1F1F133E93E13D3773E08D357DB573E03D377C9DDE58D
:2081E300DDF9DDE1C9DDE5DD210000DD39F5F5DD75FEDD74FF2109607EDD77FC237EDD7772 :2081E300DD210000DD3921FBFF39F9DD77FFDD73FDDD72FE2109607EDD77FB237EDD77FCE6
:20820300FD2A09607DDD96FC4F7CDD9EFD4779DD96FE78DD9EFF300E3E01CD2180FE022866 :208203002A09607DDD96FB4F7CDD9EFC4779DD96FD78DD9EFE300F3E01CD2180DD96FF20FC
:20822300E03E01C32A82AFDDF9DDE1C9E5D53E03CDEB80FD210200FD39FD6E003E02CDD4CC :20822300DF3E01C32A82AFDDF9DDE1C9EBED4B0960C5D53E01CD2180D1C1FE02280D2A09D5
:20824300803EE0CD0880216400CDE8813E0BCD21805F1600E133E9AFCD0880CD8B81CD1B7F :2082430060BFED42AFED5238E8AFC92A0960BFED42AFED523010C5D53E01CD2180D1C1FEC1
:20826300813E01C98100190A280C7000000000008B82A582A5820100160A24054F00000036 :208263000228E83E01C9AFC9E5D53E03CDEB80FD210200FD39FD6E003E02CDD4803EE0CD29
:208283000000A682A582AF820E20584D2F584D5A2F53334D20506C617965722076302E31A6 :208283000880216400CD2F823E0BCD21805F1600E133E9AFCD0880CDD281CD1B813E01C992
:2082A3002000000E2041626F757420000E0C01584D20506C617965722076302E3100DDE51E :2082A3008100190A280C700000000000C782E182E1820100160A2407700000000000E28244
:2082C300DD210000DD3921ECFF39F93EA2CD0880216400CDE8813EE4CD0880216400CDE8A8 :2082C300E182EB820E20584D2F584D5A2F53334D20506C617965722076302E312000000EE8
:2082E300813A06B83D280A3A06B8D6022808C3FE823E08C300833E0CC300833E05F533EDDC :2082E3002041626F757420000D0E584D20506C617965722076302E310D0E627920416C65A6
:208303005B02B82A04B8CD2F822130B8733E01CD21803208B83A08B83D2804AFC3E8842164 :2083030078204B6F726F6368696E736B697900DDE5DD210000DD3921ECFF39F93EA2CD08FC
:208323000C0039EB2102B8010400EDB0AFDD77FCDD77FDDD77FEDD77FFDD7EFBDDB6FADDD8 :2083230080216400CD2F823EE4CD0880216400CD2F823A06B83D280A3A06B8D6022808C313
:20834300B6F9DDB6F8CA5184DD7EF9D610DD7EFADE00DD7EFBDE00301121000039EB210CED :208343004F833E08C351833E0CC351833E05F533ED5B02B82A04B8CD6B822130B8733E01C2
:208363000039010400EDB0C37C83DD36EC00DD36ED10AFDD77EEDD77EF21050039EB2100AF :20836300CD21803208B83A08B83D2804AFC33985210C0039EB2102B8010400EDB0AFDD7736
:208383000039010400EDB0DD7EF1C6FFDD7EF2CE01473E00CE005F3E00CE005748435ACB0D :20838300FCDD77FDDD77FEDD77FFDD7EFBDDB6FADDB6F9DDB6F8CAA284DD7EF9D610DD7E69
:2083A3003BCB18CB19DD71F779F5332100A8CD0E8D210000E5DD6EF1DD66F2E53E03CDEB4C :2083A300FADE00DD7EFBDE00301121000039EB210C0039010400EDB0C3CD83DD36EC00DD31
:2083C30080DD6EFEDD66FFE5DD6EFCDD66FDE53E07CDEB803EE1CD08801164003E03CD9A30 :2083C30036ED10AFDD77EEDD77EF21050039EB21000039010400EDB0DD7EF1C6FFDD7EF28F
:2083E30081DD7EF7DD77F5DD36F6003A0260DD77F7DD6EF52600E5210002E5DD7EF7F533A1 :2083E300CE01473E00CE005F3E00CE005748435ACB3BCB18CB19DD71F779F5332100A8CD68
:208403002100A8CD2A81DD5EF1DD56F2DD6EFCDD66FD19DD75FCDD74FDDD7EFEDD8EF3DDF7 :20840300008E210000E5DD6EF1DD66F2E53E03CDEB80DD6EFEDD66FFE5DD6EFCDD66FDE51A
:2084230077FE3003DD34FFDD7EF8DD96F1DD77F8DD7EF9DD9EF2DD77F9DD7EFADD9EF3DDD0 :208423003E07CDEB803EE1CD08801164003E03CDE181DD7EF7DD77F5DD36F6003A0260DD46
:2084430077FADD7EFBDD9EF4DD77FBC33C833A06B83D203A3A30B86F3E0BCDD4802E053E17 :2084430077F7DD6EF52600E5210002E5DD7EF7F5332100A8CD7181DD5EF1DD56F2DD6EFCBE
:2084630002CDD4802A04B8E52A02B8E53E03CDEB803EF2CD088021FA00CDE8813E01CD21C6 :20846300DD66FD19DD75FCDD74FDDD7EFEDD8EF3DD77FE3003DD34FFDD7EF8DD96F1DD77AD
:20848300803208B83A08B83D2804AFC3E8843EA0CD0880219001CDE8813E01CD2180320824 :20848300F8DD7EF9DD9EF2DD77F9DD7EFADD9EF3DD77FADD7EFBDD9EF4DD77FBC38D833AA1
:2084A300B83A08B83D2804AFC3E8843A30B86F3E0BCDD4802E013E3ACDD4803EA6CD0880C4 :2084A30006B83D203A3A30B86F3E0BCDD4802E053E02CDD4802A04B8E52A02B8E53E03CD33
:2084C300216400CDE8813EA1CD0880216400CDE8813E01CD21803208B83A08B83D2804AF3E :2084C300EB803EF2CD088021FA00CD2F823E01CD21803208B83A08B83D2804AFC339853EA0
:2084E300C3E8843E01DDF9DDE1C976CD108EB728F9C94F790DB7C876C3F684217982CD65D7 :2084E300A0CD088021F401CD2F823E01CD21803208B83A08B83D2804AFC339853A30B86F2D
:208503008DCDED84217982CDF78DAFC303803BFD210000FD39FD77003EA2CD08802164006E :208503003E0BCDD4802E013E3ACDD4803EA6CD0880216400CD2F823EA1CD0880216400CD64
:20852300CDE8813EE4CD0880216400CDE881216782CDF78D210000397E33C3038033C92107 :208523002F823E01CD21803208B83A08B83D2804AFC339853E01DDF9DDE1C976CD208FB710
:208543006782CDF78DAFC3038076CD818DB728053E02CD1185CD1A8EB728053E04CD118513 :2085430028F9C94F790DB7C876C347853A0E60D62438033E5AC93E50C9DDE5DD210000DDA3
:20856300CD108EB728E3AFCD1185C34C853A8EB8F533218885CD1987CDED84216782CDF7D6 :2085630039F5DD77FFDD75FE7DDD96FF301BDD7EFFDD5EFE934F9F475950CB7828035950D2
:208583008DAFC303804E6F20455350333220666F756E64003E01CD728DFE023E01C8AFC966 :20858300137BCB2ACB1FC38D85AFDDF9DDE1C91144B821B582011200EDB02148B86EE5CD34
:2085A3003A08B8F53321C785CD1987CD9785B72803CD4C853E32CDF584216782CDF78D3E04 :2085A3004F85E1CD5C853246B82149B86E3A0E60CD5C853247B82144B8CD578ECD3E85218E
:2085C30002C3038046696C6520746F6F206C61726765003A08B8F53321FA85CD1987CD97A0 :2085C30044B8CD078FAFC303803BFD210000FD39FD77003EA2CD0880216400CD2F823EE4E7
:2085E30085B72803CD4C853E32CDF584216782CDF78D3E02C30380506C61796261636B2095 :2085E300CD0880216400CD2F822132B8CD078F210000397E33C3038033C92132B8CD078FF7
:208603006572726F7200ED4B09B81E006B260009563E0B836F3EB8CE00677AB7280A7BD60C :20860300AFC3038076CD878EB72006CD648EB728053E02CDCC85CD2A8FB728053E04CDCCE7
:20862300203005721CC30F863600C9210500E5210201E5117A86216782CD2F8D210BB8CD94 :2086230085CD208FB728DDAFCDCC85C307863AB2B8F533214986CDDA87CD3E852132B8CD0B
:20864300048E3E71F533D5210207E5110BB8216782CDB08D210700E5210301E51180862193 :20864300078FAFC303804E6F20455350333220666F756E64003E01CD6E8EFE023E01C8AF68
:208663006782CD2F8D212400E5210A02E5118886216782CD2F8DC946696C653A00537461EC :20866300C93A08B8F533218886CDDA87CD5886B72803CD07863E32CD46852132B8CD078F52
:208683007475733A00506755702F5067446E3A547261636B204573633A53746F7020537000 :208683003E02C3038046696C6520746F6F206C61726765003A08B8F53321BB86CDDA87CDB5
:2086A3006163653A4C6561766500DDE5DD210000DD39F51E007B854F3E008C470A4FB728E6 :2086A3005886B72803CD07863E32CD46852132B8CD078F3E02C30380506C61796261636B7A
:2086C3001F7BD618301A3E3283DD77FE3EB8CE00DD77FFE5DD6EFEDD66FF71E11CC3B8868A :2086C300206572726F7200ED4B09B81E006B260009563E0B836F3EB8CE00677AB7280A7B02
:2086E3007BD618300C2132B81600191C3620C3E386216782DD7E04F533111800D51103094E :2086E300D6203005721CC3D0863600C9210500E5210201E5113B872132B8CD218E210BB854
:20870300D51132B8CDB08DDDF9DDE1E133E93E71F533CDAD86C9DDE5DD210000DD393BEB4F :20870300CD148F3E71F533D5210207E5110BB82132B8CDB68E210700E5210301E51141874B
:208723000E0069260019463E4A816F3EB8CE0067793CDD77FF78B7280C79D611300770DD48 :208723002132B8CD218E212400E5210A02E51149872132B8CD218EC946696C653A005374C1
:208743004EFFC32587DD4EFF3620690C2600114AB8193628690C2600114AB8193630690C13 :20874300617475733A00506755702F5067446E3A547261636B204573633A53746F7020534E
:208763002600114AB8193678690C2600114AB819DD7E0407070707E60FC6C05F3E00CE8747 :20876300706163653A4C6561766500DDE5DD210000DD39F51E007B854F3E008C470A4FB7DD
:20878300571A77690C2600114AB819DD7E04E60FC6C05F3E00CE87571A77690C2600114A7D :20878300281F7BD618301A3E5683DD77FE3EB8CE00DD77FFE5DD6EFEDD66FF71E11CC37942
:2087A300B8193629692600114AB81936003E72F533214AB8CDAD8633DDE1E133E930313219 :2087A300877BD618300C2156B81600191C3620C3A4872132B8DD7E04F533111800D5110328
:2087C3003334353637383941424344454600DDE5DD210000DD39EB01FD87DD7E04070707CD :2087C30009D51156B8CDB68EDDF9DDE1E133E93E71F533CD6E87C9DDE5DD210000DD393B84
:2087E30007E60F6F2600097E1213DD7E04E60F6F2600097E12DDE1E133E9303132333435CD :2087E300EB0E0069260019463E6E816F3EB8CE0067793CDD77FF78B7280C79D61130077056
:208803003637383941424344454600DDE5DD210000DD39F54D44E1D5C5116400DD6EFEDD70 :20880300DD4EFFC3E687DD4EFF3620690C2600116EB8193628690C2600116EB81936306978
:2088230066FFCDD58CEB110A00CD2A8DC17BC63002696023E5C5110A00DD6EFEDD66FFCDDB :208823000C2600116EB8193678690C2600116EB819DD7E0407070707E60FC6815F3E00CEF8
:20884300D58CEB110A00CD2A8DC1E17BC630770303C5110A00DD6EFEDD66FFCD2A8DC17B6F :2088430088571A77690C2600116EB819DD7E04E60FC6815F3E00CE88571A77690C26001198
:20886300C63002DDF9DDE1C9DDE5DD210000DD39E5210000E52E3CE5DD5E04DD5605DD6ECE :208863006EB8193629692600116EB81936003E72F533216EB8CD6E8733DDE1E133E9303112
:2088830006DD6607CD16B9F1F1010000C50E64C5CD8FB8F1F14BC5210000E52E3CE5DD5E74 :20888300323334353637383941424344454600DDE5DD210000DD39EB01BE88DD7E0407071F
:2088A30004DD5605DD6E06DD6607CD8FB8F1F1C151D52E0A7ACDD08C7B2E0ACD238D7BD1AA :2088A3000707E60F6F2600097E1213DD7E04E60F6F2600097E12DDE1E133E930313233343A
:2088C300C630E1E577C1C503C5D52E0A7ACD238D7BD1C1C63002E1E52323363AC1C5030303 :2088C300353637383941424344454600DDE5DD210000DD39F54D44E1D5C5116400DD6EFE58
:2088E30003C5D52E0A7BCDD08C7B2E0ACD238D7BD1C1C63002DD7EFEC6044FDD7EFFCE002D :2088E300DD66FFCDC78DEB110A00CD1C8EC17BC63002696023E5C5110A00DD6EFEDD66FF25
:2089030047C52E0A7BCD238D7BC1C63002DDF9DDE1E1F1F1E9210900E5210401E511B78939 :20890300CDC78DEB110A00CD1C8EC1E17BC630770303C5110A00DD6EFEDD66FFCD1C8EC183
:20892300216782CD2F8D210700E521040CE511C189216782CD2F8D210600E5210415E51154 :208923007BC63002DDF9DDE1C9DDE5DD210000DD39E5210000E52E3CE5DD5E04DD5605DD00
:20894300C989216782CD2F8D210500E5210601E511D089216782CD2F8D210300E521060CDE :208943006E06DD6607CD3AB9F1F1010000C50E64C5CDB3B8F1F14BC5210000E52E3CE5DD5B
:20896300E511D689216782CD2F8D116CB80E006926001936200C79D62038F4212000E521DD :208963005E04DD5605DD6E06DD6607CDB3B8F1F1C151D52E0A7ACDC28D7B2E0ACD158E7B52
:208983000804E5216782CD2F8D210804E5216782CD8B8D7AE63F57CBFBED538CB80E002AD7 :20898300D1C630E1E577C1C503C5D52E0A7ACD158E7BD1C1C63002E1E52323363AC1C50381
:2089A3008CB85D7CC6C0576926001936070C79D62038ECC95061747465726E3A23002020F2 :2089A3000303C5D52E0A7BCDC28D7B2E0ACD158E7BD1C1C63002DD7EFEC6044FDD7EFFCE83
:2089C300526F773A2300202042504D3A0054696D653A00202F2000DDE5DD210000DD394B4D :2089C3000047C52E0A7BCD158E7BC1C63002DDF9DDE1E1F1F1E9210900E5210401E511784E
:2089E30042EBDD7E07DDB606DDB605DDB604283069603E0529CB13CB123D20F8DD4E06DD72 :2089E3008A2132B8CD218E210700E521040CE511828A2132B8CD218E210600E5210415E571
:208A03004607C5DD4E04DD4605C5EBCD16B9F1F14B423E20BB3E009A3009012000C3268A71 :208A0300118A8A2132B8CD218E210500E5210601E511918A2132B8CD218E210300E52106AC
:208A23000100001100002A8CB87CC6C067197B917A9830053E40C33E8A3E0777136B627DBC :208A23000CE511978A2132B8CD218E1190B80E006926001936200C79D62038F4212000E557
:208A4300D6207CDE0038DFDDE1E1F1F1E9DDE5DD210000DD3921F8FF39F93A30B86F3E0B48 :208A4300210804E52132B8CD218E210804E52132B8CD918E7AE63F57CBFBED53B0B80E00FF
:208A6300CDD4803EA8CD0880213200CDE8813E28CD2180DD77FF3A31B8D621201DDD7EFF36 :208A63002AB0B85D7CC6C0576926001936070C79D62038ECC95061747465726E3A23002003
:208A8300D62020163EE4CD0880216400CDE881216782CDF78D3E02CD0380DD7EFF3231B815 :208A830020526F773A2300202042504D3A0054696D653A00202F2000DDE5DD210000DD39B7
:208AA3003E2BCD2180DD77FA3E2CCD2180DD77FB3E02F53321010039EB3E31CDA8803E2DEA :208AA3004B42EBDD7E07DDB606DDB605DDB604283069603E0529CB13CB123D20F8DD4E0643
:208AC300CD3A80DD73FCDD72FDDD75FEDD74FF3A2FB8FD212CB8FDB602FDB601FDB6002075 :208AC300DD4607C5DD4E04DD4605C5EBCD3AB9F1F14B423E20BB3E009A3009012000C3E779
:208AE3000C3E36CD3A80ED532CB8222EB8DD7EFAF5332162B8CDD1873E71F533210200E584 :208AE3008A0100001100002AB0B87CC6C067197B917A9830053E40C3FF8A3E0777136B620A
:208B030021040AE51162B8216782CDB08DDD7EFBF5332162B8CDD1873E71F533210200E542 :208B03007DD6207CDE0038DFDDE1E1F1F1E9DDE5DD210000DD3921F8FF39F93A30B86F3E15
:208B2300210413E51162B8216782CDB08DD1D52164B8CD0E883E71F533210300E521041B70 :208B23000BCDD4803EA8CD0880213200CD2F823E28CD2180DD77FF3A31B8D621201DDD7E21
:208B4300E51164B8216782CDB08D210000E52144ACE5DD5EFCDD56FDDD6EFEDD66FFCD161B :208B4300FFD62020163EE4CD0880216400CD2F822132B8CD078F3E02CD0380DD7EFF3231B2
:208B6300B9F1E3D52167B8CD6B883E71F533210500E5210607E51167B8216782CDB08D2136 :208B6300B83E2BCD2180DD77FA3E2CCD2180DD77FB3E02F53321010039EB3E31CDA8803E9E
:208B83000000E52144ACE5ED5B2CB82A2EB8CD16B9F1E3D52167B8CD6B883E71F533210579 :208B83002DCD3A80DD73FCDD72FDDD75FEDD74FF3A2FB8FD212CB8FDB602FDB601FDB600A7
:208BA30000E521060FE51167B8216782CDB08D2A2EB8E52A2CB8E5DD5EFCDD56FDDD6EFED6 :208BA300200C3E36CD3A80ED532CB8222EB8DD7EFAF5332186B8CD92883E71F533210200A2
:208BC300DD66FFCDDA89DDF9DDE1C93BCD0986216782CD658DCD2E8621878CCD11873A8E81 :208BC300E521040AE51186B82132B8CDB68EDD7EFBF5332186B8CD92883E71F53321020070
:208BE300B83C200DCD5A82B73E0120023E02328EB83A8EB83D280733C37085C3858CAF324C :208BE300E5210413E51186B82132B8CDB68ED1D52188B8CDCF883E71F533210300E52104D5
:208C03002CB8322DB8322EB8322FB8CDC182B720123A08B8D699200733C3A385C3858C3377 :208C03001BE51188B82132B8CDB68E210000E52144ACE5DD5EFCDD56FDDD6EFEDD66FFCD29
:208C2300C3D685219F8CCD1187CD18892131B83621CD508AFD210000FD39FD36000076FDF2 :208C23003AB9F1E3D5218BB8CD2C893E71F533210500E5210607E5118BB82132B8CDB68E4A
:208C4300210000FD39FD3400FD7E00D60A3807FD360000CD508ACD818DB728053E02CD1138 :208C4300210000E52144ACE5ED5B2CB82A2EB8CD3AB9F1E3D5218BB8CD2C893E71F5332192
:208C630085CD1A8EB728053E04CD1185CD108EB72804AFCD1185CD048DB728C2CD4285C3B8 :208C63000500E521060FE5118BB82132B8CDB68E2A2EB8E52A2CB8E5DD5EFCDD56FDDD6EE2
:208C8300418C33C94C6F6164696E672C20706C6561736520776169742E2E2E00506C61798F :208C8300FEDD66FFCD9B8ADDF9DDE1C9DDE5DD210000DD393BCDCA861132B821A3820112C0
:208CA300696E6700ED7300B83207B8ED4309B8083206B82202B8ED5304B83A07B8B7CACE61 :208CA30000EDB02136B86EE5CD4F85E1CD5C853234B82137B86E3A0E60CD5C853235B8CDA4
:0D8CC3008B3A07B8D603CAFE84AFC3038006 :208CC3007D8ECDFD8E2132B8CD578ECDEF8621798DCDD2873AB2B83C200DCD9682B73E01FA
:01B99900FFAE :208CE30020023E0232B2B83AB2B83D2806CD3186C3758DAF322CB8322DB8322EB8322FB80E
:03800000C3A78C87 :208D0300CD1283B720133A08B8D6992006CD6486C3758DCD9786C3758D21918DCDD287CD18
:208CD0005D6F2600547BE680B220110610ED6A17933001833FED6A10F65FEBC906097D6C08 :208D2300D9892131B83621CD118BDD36FF0076DD34FFDD7EFFD60A3807DD36FF00CD118B78
:208CF0002600CB1DED6AED523001193F1710F5CB10505FC9DDE53E10CD0660DDE1C9DDE53C :208D4300CD878EB72006CD648EB728053E02CDCC85CD2A8FB728053E04CDCC85CD208FB753
:208D1000DD210000DD39DD46043E30CD0660DDE1E133E95D6FCDD28CEBC9CDD58CEBC9DD42 :208D63002804AFCDCC85CDF68DB728C2CDFD85C3318D33DDE1C94C6F6164696E672C207002
:208D3000E5E5D5DD210000DD39DD460BDD4E0ADD5608DD5E09DD6E00DD6601D9DD6E02DDFC :208D83006C6561736520776169742E2E2E00506C6179696E6700ED7300B83207B8ED430951
:208D50006603E5DDE1D93E03CD0660D1E1DDE1E133333333E9DDE5E5DDE13E01CD0660DDF0 :1F8DA300B8083206B82202B8ED5304B83A07B8B7CA8F8C3A07B8D603CA9285AFC30380EC
:118D7000E1C908DDE53E53CD066020023EFFDDE1C9D4 :01B9BD00FF8A
:20B88F00DDE5DD210000DD39010000DD7E07073838DDCB0426DDCB0516DDCB0616DDCB07E1 :03800000C3998D94
:20B8AF00167BDD96047ADD9E057DDD9E067CDD9E073012DDCB073EDDCB061EDDCB051EDDD8 :208DC2005D6F2600547BE680B220110610ED6A17933001833FED6A10F65FEBC906097D6C15
:20B8CF00CB041E1804044818C27BDD96047ADD9E057DDD9E067CDD9E0738147BDD96045FA5 :208DE2002600CB1DED6AED523001193F1710F5CB10505FC9DDE53E10CD0660DDE1C9DDE549
:20B8EF007ADD9E05577DDD9E066F7CDD9E0767DDCB073EDDCB061EDDCB051EDDCB041E794F :208E0200DD210000DD39DD46043E30CD0660DDE1E133E95D6FCDC48DEBC9CDC78DEBC9DD69
:20B90F000DB720C5DDE1C9DDE5DD210000DD39F5F5AFDD77FCDD77FDDD77FEDD77FF06200D :208E2200E5E5D5DD210000DD39DD460BDD4E0ADD5608DD5E09DD6E00DD6601D9DD6E02DD09
:20B92F007C07E6014FCB23CB12ED6ADDCBFC26DDCBFD16DDCBFE16DDCBFF16CB412804DD0A :208E42006603E5DDE1D93E03CD0660D1E1DDE1E133333333E9DDE5E5DDE13E01CD0660DDFD
:20B94F00CBFCC6DD7EFCDD9604DD7EFDDD9E05DD7EFEDD9E06DD7EFFDD9E073826DD7EFC3A :1B8E6200E1C9DDE53E16CD0660DDE1C908DDE53E53CD066020023EFFDDE1C907
:20B96F00DD9604DD77FCDD7EFDDD9E05DD77FDDD7EFEDD9E06DD77FEDD7EFFDD9E07DD776C :20B8B300DDE5DD210000DD39010000DD7E07073838DDCB0426DDCB0516DDCB0616DDCB07BD
:0AB98F00FFCBC3109BDDF9DDE1C919 :20B8D300167BDD96047ADD9E057DDD9E067CDD9E073012DDCB073EDDCB061EDDCB051EDDB4
:208D8100DDE53E1ACD0660DDE1C9DDE5E5DD210000DD39DD5606DD5E07DD6E00DD6601E554 :20B8F300CB041E1804044818C27BDD96047ADD9E057DDD9E067CDD9E0738147BDD96045F81
:208DA100DDE13E05CD0660EBE1DDE1E13333E9DDE5E5D5DD210000DD39DD460BDD4E0ADDF4 :20B913007ADD9E05577DDD9E066F7CDD9E0767DDCB073EDDCB061EDDCB051EDDCB041E792A
:208DC1005608DD5E09DD6E00DD6601D9DD6E02DD6603DD7E0CF5E5DDE1D93E03CD0660F1B8 :07B933000DB720C5DDE1C9DD
:208DE10008D9E5DDE1D93E04CD0660D1E1DDE1E13333333333E9DDE5E5DDE13E02CD06608F :0A8E7D00DDE53E0FCD0660DDE1C922
:208E0100DDE1C9AF474FEDB121FFFFED42EBC9DDE53E17CD0660DDE1C9DDE53E19CD0660C8 :20B93A00DDE5DD210000DD39F5F5AFDD77FCDD77FDDD77FEDD77FF06207C07E6014FCB236B
:038E2100DDE1C9C7 :20B95A00CB12ED6ADDCBFC26DDCBFD16DDCBFE16DDCBFF16CB412804DDCBFCC6DD7EFCDDC5
:20B97A009604DD7EFDDD9E05DD7EFEDD9E06DD7EFFDD9E073826DD7EFCDD9604DD77FCDD2C
:20B99A007EFDDD9E05DD77FDDD7EFEDD9E06DD77FEDD7EFFDD9E07DD77FFCBC3109BDDF9D7
:03B9BA00DDE1C903
:208E8700DDE53E1ACD0660DDE1C9DDE5E5DD210000DD39DD5606DD5E07DD6E00DD6601E54D
:208EA700DDE13E05CD0660EBE1DDE1E13333E9DDE5E5D5DD210000DD39DD460BDD4E0ADDED
:208EC7005608DD5E09DD6E00DD6601D9DD6E02DD6603DD7E0CF5E5DDE1D93E03CD0660F1B1
:208EE70008D9E5DDE1D93E04CD0660D1E1DDE1E13333333333E9DDE53E2ECD0660DDE1C978
:208F0700DDE5E5DDE13E02CD0660DDE1C9AF474FEDB121FFFFED42EBC9DDE53E17CD0660BC
:0D8F2700DDE1C9DDE53E19CD0660DDE1C9E3
:00000001FF :00000001FF
+1 -1
View File
@@ -3,7 +3,7 @@
-b _CODE = 0x8003 -b _CODE = 0x8003
-b _DATA = 0xa800 -b _DATA = 0xa800
-k E:\SDCC\4.6.0\bin\..\lib\z80 -k E:\SDCC\4.6.0\bin\..\lib\z80
-l vgm_wc_api.lib -l wc_api.lib
-l z80 -l z80
obj/out.rel obj/out.rel
obj/crt0.rel obj/crt0.rel
+2490 -2318
View File
File diff suppressed because it is too large Load Diff
+93 -81
View File
@@ -24,25 +24,25 @@ Area Addr Size Decimal Bytes (A
00000001 l__INITIALIZER 00000001 l__INITIALIZER
00000003 l__HEADER0 00000003 l__HEADER0
0000010A l__HOME 0000010A l__HOME
00000E21 l__CODE 00000F31 l__CODE
0000108E l__DATA 000010B2 l__DATA
00008003 s__CODE 00008003 s__CODE
0000A800 s__DATA 0000A800 s__DATA
0000B88E s__INITIALIZED 0000B8B2 s__INITIALIZED
0000B88F s__HOME 0000B8B3 s__HOME
0000B999 s__GSFINAL 0000B9BD s__GSFINAL
0000B999 s__GSINIT 0000B9BD s__GSINIT
0000B999 s__INITIALIZER 0000B9BD s__INITIALIZER
0000B99A s__BSEG 0000B9BE s__BSEG
0000B99A s__BSS 0000B9BE s__BSS
0000B99A s__HEAP 0000B9BE s__HEAP
ASxxxx Linker V05.50.4-SDLD, page 2. ASxxxx Linker V05.50.4-SDLD, page 2.
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes) Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------ -------------------------------- ---- ---- ------- ----- ------------
_CODE 00008003 00000E21 = 3617. bytes (REL,CON) _CODE 00008003 00000F31 = 3889. bytes (REL,CON)
Value Global Global Defined In Module Value Global Global Defined In Module
----- -------------------------------- ------------------------ ----- -------------------------------- ------------------------
@@ -54,72 +54,78 @@ _CODE 00008003 00000E21 = 3617. bytes (R
000080D4 _esp_wr_reg8 main 000080D4 _esp_wr_reg8 main
000080EB _esp_wr_reg32 main 000080EB _esp_wr_reg32 main
0000811B _esp_wr_end main 0000811B _esp_wr_end main
0000812A _esp_send_dma main 0000812A _esp_wait_not_busy main
0000818B _esp_rd_end main 00008171 _esp_send_dma main
0000819A _esp_wait_status main 000081D2 _esp_rd_end main
000081E8 _esp_wait_busy main 000081E1 _esp_wait_status main
0000822F _esp_create_obj main 0000822F _esp_wait_busy main
0000825A _esp_init main 0000826B _esp_create_obj main
00008267 _win_xm main 00008296 _esp_init main
00008279 _win_about main 000082A3 _win_xm_tpl main
000082C1 _play_xm main 000082B5 _win_about_tpl main
000084ED _wait_esc_key main 00008312 _play_xm main
000084F5 _wait_frames main 0000853E _wait_esc_key main
000084FE _about main 00008546 _wait_frames main
00008511 _unload_and_exit main 0000854F _wc_screen_width main
00008542 _leave_playing_and_exit main 0000855C _wc_center main
0000854C _wait_for_manual_exit main 00008592 _about main
00008570 _error_esp main 000085CC _unload_and_exit main
00008597 _stop_on_error main 000085FD _leave_playing_and_exit main
000085A3 _error_oom main 00008607 _wait_for_manual_exit main
000085D6 _error_playback main 00008631 _error_esp main
00008609 _copy_file_name main 00008658 _stop_on_error main
0000862E _xm_draw_static_labels main 00008664 _error_oom main
000086AD _xm_set_status_attr main 00008697 _error_playback main
00008711 _xm_set_status main 000086CA _copy_file_name main
00008719 _xm_set_status_code main 000086EF _xm_draw_static_labels main
000087D1 _put_hex2 main 0000876E _xm_set_status_attr main
0000880E _put_dec3 main 000087D2 _xm_set_status main
0000886B _put_time main 000087DA _xm_set_status_code main
00008918 _xm_draw_stats_labels main 00008892 _put_hex2 main
000089DA _draw_progress_bar main 000088CF _put_dec3 main
00008A50 _xm_update_info main 0000892C _put_time main
00008BCE _main_start main 000089D9 _xm_draw_stats_labels main
00008CA7 _main main 00008A9B _draw_progress_bar main
00008CD0 __divuchar divunsigned 00008B11 _xm_update_info main
00008CD2 __divu8 divunsigned 00008C8F _main_start main
00008CD5 __divu16 divunsigned 00008D99 _main main
00008CD5 __divuint divunsigned 00008DC2 __divuchar divunsigned
00008D04 _wc_key_space wc_key_space 00008DC4 __divu8 divunsigned
00008D0E _wc_load512 wc_load512 00008DC7 __divu16 divunsigned
00008D23 __moduchar modunsigned 00008DC7 __divuint divunsigned
00008D2A __moduint modunsigned 00008DF6 _wc_key_space wc_key_space
00008D2F _wc_prsrw wc_prsrw 00008E00 _wc_load512 wc_load512
00008D65 _wc_prwow wc_prwow 00008E15 __moduchar modunsigned
ASxxxx Linker V05.50.4-SDLD, page 3. ASxxxx Linker V05.50.4-SDLD, page 3.
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes) Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------ -------------------------------- ---- ---- ------- ----- ------------
_CODE 00008003 00000E21 = 3617. bytes (REL,CON) _CODE 00008003 00000F31 = 3889. bytes (REL,CON)
Value Global Global Defined In Module Value Global Global Defined In Module
----- -------------------------------- ------------------------ ----- -------------------------------- ------------------------
00008D72 _wc_prm_pl wc_prm_pl 00008E1C __moduint modunsigned
00008D81 _wc_key_pgdn wc_key_pgdn 00008E21 _wc_prsrw wc_prsrw
00008D8B _wc_gadrw wc_gadrw 00008E57 _wc_prwow wc_prwow
00008DB0 _wc_prsrw_attr wc_prsrw_attr 00008E64 _wc_key_enter wc_key_enter
00008DF7 _wc_rresb wc_rresb 00008E6E _wc_prm_pl wc_prm_pl
00008E04 _strlen strlen 00008E7D _wc_gedpl wc_gedpl
00008E10 _wc_key_esc wc_key_esc 00008E87 _wc_key_pgdn wc_key_pgdn
00008E1A _wc_key_pgup wc_key_pgup 00008E91 _wc_gadrw wc_gadrw
00008EB6 _wc_prsrw_attr wc_prsrw_attr
00008EFD _wc_key_wait_release wc_key_wait_release
00008F07 _wc_rresb wc_rresb
00008F14 _strlen strlen
00008F20 _wc_key_esc wc_key_esc
00008F2A _wc_key_pgup wc_key_pgup
ASxxxx Linker V05.50.4-SDLD, page 4. ASxxxx Linker V05.50.4-SDLD, page 4.
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes) Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------ -------------------------------- ---- ---- ------- ----- ------------
_DATA 0000A800 0000108E = 4238. bytes (REL,CON) _DATA 0000A800 000010B2 = 4274. bytes (REL,CON)
Value Global Global Defined In Module Value Global Global Defined In Module
----- -------------------------------- ------------------------ ----- -------------------------------- ------------------------
@@ -134,36 +140,39 @@ _DATA 0000A800 0000108E = 4238. bytes (R
0000B82C _total_samples main 0000B82C _total_samples main
0000B830 _xm_handle main 0000B830 _xm_handle main
0000B831 _last_track_status main 0000B831 _last_track_status main
0000B88C _bar_attr_ofs main 0000B832 _win_xm main
0000B844 _win_about main
0000B8B0 _bar_attr_ofs main
ASxxxx Linker V05.50.4-SDLD, page 5. ASxxxx Linker V05.50.4-SDLD, page 5.
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes) Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------ -------------------------------- ---- ---- ------- ----- ------------
_INITIALIZED 0000B88E 00000001 = 1. bytes (REL,CON) _INITIALIZED 0000B8B2 00000001 = 1. bytes (REL,CON)
Value Global Global Defined In Module Value Global Global Defined In Module
----- -------------------------------- ------------------------ ----- -------------------------------- ------------------------
0000B88E _state_esp main 0000B8B2 _state_esp main
ASxxxx Linker V05.50.4-SDLD, page 6. ASxxxx Linker V05.50.4-SDLD, page 6.
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes) Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------ -------------------------------- ---- ---- ------- ----- ------------
_HOME 0000B88F 0000010A = 266. bytes (REL,CON) _HOME 0000B8B3 0000010A = 266. bytes (REL,CON)
Value Global Global Defined In Module Value Global Global Defined In Module
----- -------------------------------- ------------------------ ----- -------------------------------- ------------------------
0000B88F __modulong _modulong 0000B8B3 __modulong _modulong
0000B916 __divulong _divulong 0000B93A __divulong _divulong
ASxxxx Linker V05.50.4-SDLD, page 7. ASxxxx Linker V05.50.4-SDLD, page 7.
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes) Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------ -------------------------------- ---- ---- ------- ----- ------------
_INITIALIZER 0000B999 00000001 = 1. bytes (REL,CON) _INITIALIZER 0000B9BD 00000001 = 1. bytes (REL,CON)
Value Global Global Defined In Module Value Global Global Defined In Module
----- -------------------------------- ------------------------ ----- -------------------------------- ------------------------
@@ -187,21 +196,24 @@ obj/crt0.rel [ crt0 ]
Libraries Linked [ object file ] Libraries Linked [ object file ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ divunsigned.rel ] E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ divunsigned.rel ]
vgm_wc_api.lib [ wc_key_space.rel ] wc_api.lib [ wc_key_space.rel ]
vgm_wc_api.lib [ wc_load512.rel ] wc_api.lib [ wc_load512.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ modunsigned.rel ] E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ modunsigned.rel ]
vgm_wc_api.lib [ wc_prsrw.rel ] wc_api.lib [ wc_prsrw.rel ]
vgm_wc_api.lib [ wc_prwow.rel ] wc_api.lib [ wc_prwow.rel ]
vgm_wc_api.lib [ wc_prm_pl.rel ] wc_api.lib [ wc_key_enter.rel ]
wc_api.lib [ wc_prm_pl.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ _modulong.rel ] E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ _modulong.rel ]
wc_api.lib [ wc_gedpl.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ _divulong.rel ] E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ _divulong.rel ]
vgm_wc_api.lib [ wc_key_pgdn.rel ] wc_api.lib [ wc_key_pgdn.rel ]
vgm_wc_api.lib [ wc_gadrw.rel ] wc_api.lib [ wc_gadrw.rel ]
vgm_wc_api.lib [ wc_prsrw_attr.rel ] wc_api.lib [ wc_prsrw_attr.rel ]
vgm_wc_api.lib [ wc_rresb.rel ] wc_api.lib [ wc_key_wait_release.rel ]
wc_api.lib [ wc_rresb.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ strlen.rel ] E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ strlen.rel ]
vgm_wc_api.lib [ wc_key_esc.rel ] wc_api.lib [ wc_key_esc.rel ]
vgm_wc_api.lib [ wc_key_pgup.rel ] wc_api.lib [ wc_key_pgup.rel ]
ASxxxx Linker V05.50.4-SDLD, page 10. ASxxxx Linker V05.50.4-SDLD, page 10.
+72 -64
View File
@@ -15,18 +15,18 @@ DEF l__INITIALIZED 0x1
DEF l__INITIALIZER 0x1 DEF l__INITIALIZER 0x1
DEF l__HEADER0 0x3 DEF l__HEADER0 0x3
DEF l__HOME 0x10A DEF l__HOME 0x10A
DEF l__CODE 0xE21 DEF l__CODE 0xF31
DEF l__DATA 0x108E DEF l__DATA 0x10B2
DEF s__CODE 0x8003 DEF s__CODE 0x8003
DEF s__DATA 0xA800 DEF s__DATA 0xA800
DEF s__INITIALIZED 0xB88E DEF s__INITIALIZED 0xB8B2
DEF s__HOME 0xB88F DEF s__HOME 0xB8B3
DEF s__GSFINAL 0xB999 DEF s__GSFINAL 0xB9BD
DEF s__GSINIT 0xB999 DEF s__GSINIT 0xB9BD
DEF s__INITIALIZER 0xB999 DEF s__INITIALIZER 0xB9BD
DEF s__BSEG 0xB99A DEF s__BSEG 0xB9BE
DEF s__BSS 0xB99A DEF s__BSS 0xB9BE
DEF s__HEAP 0xB99A DEF s__HEAP 0xB9BE
DEF _wc_exit 0x8003 DEF _wc_exit 0x8003
DEF _esp_cmd 0x8008 DEF _esp_cmd 0x8008
DEF _esp_rd_reg8 0x8021 DEF _esp_rd_reg8 0x8021
@@ -35,56 +35,62 @@ DEF _esp_rd_regs 0x80A8
DEF _esp_wr_reg8 0x80D4 DEF _esp_wr_reg8 0x80D4
DEF _esp_wr_reg32 0x80EB DEF _esp_wr_reg32 0x80EB
DEF _esp_wr_end 0x811B DEF _esp_wr_end 0x811B
DEF _esp_send_dma 0x812A DEF _esp_wait_not_busy 0x812A
DEF _esp_rd_end 0x818B DEF _esp_send_dma 0x8171
DEF _esp_wait_status 0x819A DEF _esp_rd_end 0x81D2
DEF _esp_wait_busy 0x81E8 DEF _esp_wait_status 0x81E1
DEF _esp_create_obj 0x822F DEF _esp_wait_busy 0x822F
DEF _esp_init 0x825A DEF _esp_create_obj 0x826B
DEF _win_xm 0x8267 DEF _esp_init 0x8296
DEF _win_about 0x8279 DEF _win_xm_tpl 0x82A3
DEF _play_xm 0x82C1 DEF _win_about_tpl 0x82B5
DEF _wait_esc_key 0x84ED DEF _play_xm 0x8312
DEF _wait_frames 0x84F5 DEF _wait_esc_key 0x853E
DEF _about 0x84FE DEF _wait_frames 0x8546
DEF _unload_and_exit 0x8511 DEF _wc_screen_width 0x854F
DEF _leave_playing_and_exit 0x8542 DEF _wc_center 0x855C
DEF _wait_for_manual_exit 0x854C DEF _about 0x8592
DEF _error_esp 0x8570 DEF _unload_and_exit 0x85CC
DEF _stop_on_error 0x8597 DEF _leave_playing_and_exit 0x85FD
DEF _error_oom 0x85A3 DEF _wait_for_manual_exit 0x8607
DEF _error_playback 0x85D6 DEF _error_esp 0x8631
DEF _copy_file_name 0x8609 DEF _stop_on_error 0x8658
DEF _xm_draw_static_labels 0x862E DEF _error_oom 0x8664
DEF _xm_set_status_attr 0x86AD DEF _error_playback 0x8697
DEF _xm_set_status 0x8711 DEF _copy_file_name 0x86CA
DEF _xm_set_status_code 0x8719 DEF _xm_draw_static_labels 0x86EF
DEF _put_hex2 0x87D1 DEF _xm_set_status_attr 0x876E
DEF _put_dec3 0x880E DEF _xm_set_status 0x87D2
DEF _put_time 0x886B DEF _xm_set_status_code 0x87DA
DEF _xm_draw_stats_labels 0x8918 DEF _put_hex2 0x8892
DEF _draw_progress_bar 0x89DA DEF _put_dec3 0x88CF
DEF _xm_update_info 0x8A50 DEF _put_time 0x892C
DEF _main_start 0x8BCE DEF _xm_draw_stats_labels 0x89D9
DEF _main 0x8CA7 DEF _draw_progress_bar 0x8A9B
DEF __divuchar 0x8CD0 DEF _xm_update_info 0x8B11
DEF __divu8 0x8CD2 DEF _main_start 0x8C8F
DEF __divu16 0x8CD5 DEF _main 0x8D99
DEF __divuint 0x8CD5 DEF __divuchar 0x8DC2
DEF _wc_key_space 0x8D04 DEF __divu8 0x8DC4
DEF _wc_load512 0x8D0E DEF __divu16 0x8DC7
DEF __moduchar 0x8D23 DEF __divuint 0x8DC7
DEF __moduint 0x8D2A DEF _wc_key_space 0x8DF6
DEF _wc_prsrw 0x8D2F DEF _wc_load512 0x8E00
DEF _wc_prwow 0x8D65 DEF __moduchar 0x8E15
DEF _wc_prm_pl 0x8D72 DEF __moduint 0x8E1C
DEF _wc_key_pgdn 0x8D81 DEF _wc_prsrw 0x8E21
DEF _wc_gadrw 0x8D8B DEF _wc_prwow 0x8E57
DEF _wc_prsrw_attr 0x8DB0 DEF _wc_key_enter 0x8E64
DEF _wc_rresb 0x8DF7 DEF _wc_prm_pl 0x8E6E
DEF _strlen 0x8E04 DEF _wc_gedpl 0x8E7D
DEF _wc_key_esc 0x8E10 DEF _wc_key_pgdn 0x8E87
DEF _wc_key_pgup 0x8E1A DEF _wc_gadrw 0x8E91
DEF _wc_prsrw_attr 0x8EB6
DEF _wc_key_wait_release 0x8EFD
DEF _wc_rresb 0x8F07
DEF _strlen 0x8F14
DEF _wc_key_esc 0x8F20
DEF _wc_key_pgup 0x8F2A
DEF _fs_buf 0xA800 DEF _fs_buf 0xA800
DEF _ret_sp 0xB800 DEF _ret_sp 0xB800
DEF _filesize 0xB802 DEF _filesize 0xB802
@@ -96,8 +102,10 @@ DEF _file_name 0xB80B
DEF _total_samples 0xB82C DEF _total_samples 0xB82C
DEF _xm_handle 0xB830 DEF _xm_handle 0xB830
DEF _last_track_status 0xB831 DEF _last_track_status 0xB831
DEF _bar_attr_ofs 0xB88C DEF _win_xm 0xB832
DEF _state_esp 0xB88E DEF _win_about 0xB844
DEF __modulong 0xB88F DEF _bar_attr_ofs 0xB8B0
DEF __divulong 0xB916 DEF _state_esp 0xB8B2
DEF __modulong 0xB8B3
DEF __divulong 0xB93A
LOAD obj/out.ihx LOAD obj/out.ihx
+787 -691
View File
File diff suppressed because it is too large Load Diff
+68 -60
View File
@@ -63,50 +63,51 @@ Hexadecimal [32-Bits]
Symbol Table Symbol Table
0 ___str_12 000009B4 R 0 ___str_12 00000A75 R
0 ___str_13 000009BE R 0 ___str_13 00000A7F R
0 ___str_14 000009C6 R 0 ___str_14 00000A87 R
0 ___str_15 000009CD R 0 ___str_15 00000A8E R
0 ___str_16 000009D3 R 0 ___str_16 00000A94 R
0 ___str_17 00000C84 R 0 ___str_17 00000D76 R
0 ___str_18 00000C9C R 0 ___str_18 00000D8E R
0 ___str_4 00000585 R 0 ___str_4 00000646 R
0 ___str_5 000005C4 R 0 ___str_5 00000685 R
0 ___str_6 000005F7 R 0 ___str_6 000006B8 R
0 ___str_7 00000677 R 0 ___str_7 00000738 R
0 ___str_8 0000067D R 0 ___str_8 0000073E R
0 ___str_9 00000685 R 0 ___str_9 00000746 R
__divuchar ******** GX __divuchar ******** GX
__divuint ******** GX __divuint ******** GX
__divulong ******** GX __divulong ******** GX
__moduchar ******** GX __moduchar ******** GX
__moduint ******** GX __moduint ******** GX
__modulong ******** GX __modulong ******** GX
0 __str_0 00000288 R 0 __str_0 000002C4 R
0 __str_1 000002A2 R 0 __str_1 000002DE R
0 __str_2 000002A3 R 0 __str_2 000002DF R
0 __str_3 000002AC R 0 __str_3 000002E8 R
7 __xinit__state_esp 00000000 R 7 __xinit__state_esp 00000000 R
0 _about 000004FB GR 0 _about 0000058F GR
1 _bar_attr_ofs 0000108C GR 1 _bar_attr_ofs 000010B0 GR
1 _barbuf 0000106C R 1 _barbuf 00001090 R
1 _call_type 00001007 GR 1 _call_type 00001007 GR
0 _copy_file_name 00000606 GR 0 _copy_file_name 000006C7 GR
1 _decbuf 00001064 R 1 _decbuf 00001088 R
0 _draw_progress_bar 000009D7 GR 0 _draw_progress_bar 00000A98 GR
0 _error_esp 0000056D GR 0 _error_esp 0000062E GR
0 _error_oom 000005A0 GR 0 _error_oom 00000661 GR
0 _error_playback 000005D3 GR 0 _error_playback 00000694 GR
0 _esp_cmd 00000005 GR 0 _esp_cmd 00000005 GR
0 _esp_create_obj 0000022C GR 0 _esp_create_obj 00000268 GR
0 _esp_init 00000257 GR 0 _esp_init 00000293 GR
0 _esp_rd_end 00000188 GR 0 _esp_rd_end 000001CF GR
0 _esp_rd_reg32 00000037 GR 0 _esp_rd_reg32 00000037 GR
0 _esp_rd_reg8 0000001E GR 0 _esp_rd_reg8 0000001E GR
0 _esp_rd_regs 000000A5 GR 0 _esp_rd_regs 000000A5 GR
0 _esp_send_dma 00000127 GR 0 _esp_send_dma 0000016E GR
0 _esp_wait_busy 000001E5 GR 0 _esp_wait_busy 0000022C GR
0 _esp_wait_status 00000197 GR 0 _esp_wait_not_busy 00000127 GR
0 _esp_wait_status 000001DE GR
0 _esp_wr_end 00000118 GR 0 _esp_wr_end 00000118 GR
0 _esp_wr_reg32 000000E8 GR 0 _esp_wr_reg32 000000E8 GR
0 _esp_wr_reg8 000000D1 GR 0 _esp_wr_reg8 000000D1 GR
@@ -114,57 +115,64 @@ Symbol Table
1 _file_name 0000100B GR 1 _file_name 0000100B GR
1 _filesize 00001002 GR 1 _filesize 00001002 GR
1 _fs_buf 00000000 GR 1 _fs_buf 00000000 GR
1 _hexbuf 00001062 R 1 _hexbuf 00001086 R
1 _last_esp_status 00001008 GR 1 _last_esp_status 00001008 GR
1 _last_track_status 00001031 GR 1 _last_track_status 00001031 GR
0 _leave_playing_and_exit 0000053F GR
ASxxxx Assembler V05.50.4+NoICE+SDCCmods-WIP-R14 (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80 / R800) Page 3 ASxxxx Assembler V05.50.4+NoICE+SDCCmods-WIP-R14 (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80 / R800) Page 3
Hexadecimal [32-Bits] Hexadecimal [32-Bits]
Symbol Table Symbol Table
0 _main 00000CA4 GR 0 _leave_playing_and_exit 000005FA GR
0 _main_start 00000BCB GR 0 _main 00000D96 GR
0 _main_start 00000C8C GR
1 _p_file_name 00001009 GR 1 _p_file_name 00001009 GR
0 _play_xm 000002BE GR 0 _play_xm 0000030F GR
0 _put_dec3 0000080B GR 0 _put_dec3 000008CC GR
0 _put_hex2 000007CE GR 0 _put_hex2 0000088F GR
0 _put_hex2_hexch_10000_132 000007FA R 0 _put_hex2_hexch_10000_144 000008BB R
0 _put_time 00000868 GR 0 _put_time 00000929 GR
1 _ret_sp 00001000 GR 1 _ret_sp 00001000 GR
2 _state_esp 00000000 GR 2 _state_esp 00000000 GR
1 _status_buf 00001032 R 1 _status_buf 00001056 R
1 _status_code_buf 0000104A R 1 _status_code_buf 0000106E R
0 _stop_on_error 00000594 GR 0 _stop_on_error 00000655 GR
_strlen ******** GX _strlen ******** GX
1 _timebuf 00001067 R 1 _timebuf 0000108B R
1 _total_samples 0000102C GR 1 _total_samples 0000102C GR
0 _unload_and_exit 0000050E GR 0 _unload_and_exit 000005C9 GR
0 _wait_esc_key 000004EA GR 0 _wait_esc_key 0000053B GR
0 _wait_for_manual_exit 00000549 GR 0 _wait_for_manual_exit 00000604 GR
0 _wait_frames 000004F2 GR 0 _wait_frames 00000543 GR
0 _wc_center 00000559 GR
0 _wc_exit 00000000 GR 0 _wc_exit 00000000 GR
_wc_gadrw ******** GX _wc_gadrw ******** GX
_wc_gedpl ******** GX
_wc_key_enter ******** GX
_wc_key_esc ******** GX _wc_key_esc ******** GX
_wc_key_pgdn ******** GX _wc_key_pgdn ******** GX
_wc_key_pgup ******** GX _wc_key_pgup ******** GX
_wc_key_space ******** GX _wc_key_space ******** GX
_wc_key_wait_release ******** GX
_wc_load512 ******** GX _wc_load512 ******** GX
_wc_prm_pl ******** GX _wc_prm_pl ******** GX
_wc_prsrw ******** GX _wc_prsrw ******** GX
_wc_prsrw_attr ******** GX _wc_prsrw_attr ******** GX
_wc_prwow ******** GX _wc_prwow ******** GX
_wc_rresb ******** GX _wc_rresb ******** GX
0 _win_about 00000276 GR 0 _wc_screen_width 0000054C GR
0 _win_xm 00000264 GR 1 _win_about 00001044 GR
0 _xm_draw_static_labels 0000062B GR 0 _win_about_tpl 000002B2 GR
0 _xm_draw_stats_labels 00000915 GR 1 _win_xm 00001032 GR
0 _win_xm_tpl 000002A0 GR
0 _xm_draw_static_labels 000006EC GR
0 _xm_draw_stats_labels 000009D6 GR
1 _xm_handle 00001030 GR 1 _xm_handle 00001030 GR
0 _xm_set_status 0000070E GR 0 _xm_set_status 000007CF GR
0 _xm_set_status_attr 000006AA GR 0 _xm_set_status_attr 0000076B GR
0 _xm_set_status_code 00000716 GR 0 _xm_set_status_code 000007D7 GR
0 _xm_set_status_code_hexch_10000_129 000007BD R 0 _xm_set_status_code_hexch_10000_141 0000087E R
0 _xm_update_info 00000A4D GR 0 _xm_update_info 00000B0E GR
ASxxxx Assembler V05.50.4+NoICE+SDCCmods-WIP-R14 (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80 / R800) Page 4 ASxxxx Assembler V05.50.4+NoICE+SDCCmods-WIP-R14 (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80 / R800) Page 4
@@ -172,8 +180,8 @@ Hexadecimal [32-Bits]
Area Table Area Table
0 _CODE size CCD flags 0 0 _CODE size DBF flags 0
1 _DATA size 108E flags 0 1 _DATA size 10B2 flags 0
2 _INITIALIZED size 1 flags 0 2 _INITIALIZED size 1 flags 0
3 _DABS size 0 flags 8 3 _DABS size 0 flags 8
4 _HOME size 0 flags 0 4 _HOME size 0 flags 0
+51 -1
View File
@@ -99,6 +99,31 @@ void esp_wr_end()
SPI_CTRL = SPI_ESP_CS_OFF; SPI_CTRL = SPI_ESP_CS_OFF;
} }
// Plain single-phase "not busy" wait - for the one call site (esp_send_dma()
// below) where BUSY is genuinely never set for the awaited transition.
// Confirmed by reading the firmware (spi_slave.cpp's DREQ_DATA handler,
// reached via esp_wr_end() -> the low-level SPI W_END transaction, NOT
// esp_cmd()/the command() ISR dispatcher): it does the memcpy and jumps
// straight from DATA_M2S to READY, no BUSY in between. esp_wait_busy()'s
// two-phase "see BUSY first" logic is correct for actual commands (anything
// issued via esp_cmd(), which always sets BUSY before dispatching to
// xm_task/helper_task - see esp_wait_busy() below) but hangs here for its
// full timeout on every single chunk waiting for a BUSY that never appears -
// confirmed on hardware as "plays, but loading takes forever" after
// esp_wait_busy() was made two-phase project-wide.
u8 esp_wait_not_busy(u16 max_frames)
{
u16 start = *(u16*)_TMN;
while ((u16)(*(u16*)_TMN - start) < max_frames)
{
if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
return 1;
}
return 0;
}
void esp_send_dma(u16 a, u8 p, u16 l, u16 n) void esp_send_dma(u16 a, u8 p, u16 l, u16 n)
{ {
@@ -117,7 +142,7 @@ void esp_send_dma(u16 a, u8 p, u16 l, u16 n)
SPI_CTRL = SPI_ESP_CS_OFF; SPI_CTRL = SPI_ESP_CS_OFF;
esp_wr_end(); esp_wr_end();
esp_wait_busy(100); // 2s - esp32 consuming one DMA'd chunk should be near-instant esp_wait_not_busy(100); // 2s - esp32 consuming one DMA'd chunk should be near-instant
} }
void esp_rd_end() void esp_rd_end()
@@ -149,10 +174,35 @@ u8 esp_wait_status(u8 status, u16 max_frames)
return 0; return 0;
} }
// A bare "status != BUSY" poll right after issuing a command can't tell
// "already finished" apart from "hasn't started yet": esp_cmd() doesn't
// touch ESP_REG_STATUS, so until the esp32's command() ISR gets around to
// setting BUSY for THIS command, the register still holds whatever the
// PREVIOUS command left there (typically READY) - and that stale READY
// satisfies "!= BUSY" just as well as a real completion does. Confirmed on
// real hardware via firmware-side timestamps (tbfire.xm, ESP_ERR_INV_XM_HANDLE
// on TRACK_PLAY): the esp32 recorded PLAY being rejected 1ms *before*
// TRACK_INIT even started processing - proving esp_wait_busy() had already
// returned "done" on TRACK_INIT's leftover-READY-from-WRITE_OBJECT, not on
// its actual completion. Fixed by requiring a genuine BUSY sighting first,
// so a "not busy" seen afterward is guaranteed to be THIS command's own
// completion. Every esp_wait_busy() call site in this plugin waits on an
// esp32 command that's handled by a background task (xm_task/helper_task),
// never resolved synchronously inside the ISR, so BUSY is always genuinely
// observable for at least one poll - this doesn't risk a regression on a
// command that completes "too fast to see".
u8 esp_wait_busy(u16 max_frames) u8 esp_wait_busy(u16 max_frames)
{ {
u16 start = *(u16*)_TMN; u16 start = *(u16*)_TMN;
// Phase 1: wait for the esp32 to actually start processing this command.
while (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
{
if ((u16)(*(u16*)_TMN - start) >= max_frames)
return 0;
}
// Phase 2: wait for it to finish (status becomes anything other than BUSY).
while ((u16)(*(u16*)_TMN - start) < max_frames) while ((u16)(*(u16*)_TMN - start) < max_frames)
{ {
if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY) if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
+91 -12
View File
@@ -65,11 +65,24 @@ enum
// auto-center) - no wc_prsrw() calls yet, still just static wnd_txt like // auto-center) - no wc_prsrw() calls yet, still just static wnd_txt like
// before. This exact size/position was already confirmed stable on its own // before. This exact size/position was already confirmed stable on its own
// earlier (before wc_prsrw/live-info were layered on top). // earlier (before wc_prsrw/live-info were layered on top).
const WC_TX_WINDOW win_xm = // win_xm_tpl is the compile-time template (const -> lands in CODE, so its
// bytes are genuinely baked into the loaded blob - unlike a non-const
// initialized global here, which would NOT be: this project's crt0.s never
// calls GSINIT, so _INITIALIZED-area bytes are simply absent from out.bin
// and read back as hex2bin's 0xFF fill regardless of the initializer given
// (confirmed by inspecting obj/out.bin - state_esp's own "give it a real
// initializer" fix above only works because 0xFF was picked to coincide
// with that fill value, not because the initializer is actually emitted).
// win_xm (below) is the mutable, actually-used instance: memcpy'd from this
// template at the point of use (see main_start()), then y_pos is patched to
// the real HEI-based center (HEI = screen height, 25/30/36 rows, see
// wc_api.h - WC's own 255,255 "auto-center" sentinel doesn't work on this
// WC build, see win_about's history below).
const WC_TX_WINDOW win_xm_tpl =
{ {
/* window with header and text + shadow (0x80) */ WC_WIND_HDR_TXT | 0x80, /* window with header and text + shadow (0x80) */ WC_WIND_HDR_TXT | 0x80,
/* cursor color mask */ 0, /* cursor color mask */ 0,
/* X,Y (position) */ 25, 10, /* X,Y (position) */ 25, 10, // both placeholders, overwritten at runtime - see main_start()
/* W,H (size) */ 40, 12, /* W,H (size) */ 40, 12,
/* paper/ink (window color) */ 0x70, // white paper, black ink/border - matches VGMPLAY.WMF's CLR_WIN = WC_COLOR(WC_WHITE, WC_BLACK) /* paper/ink (window color) */ 0x70, // white paper, black ink/border - matches VGMPLAY.WMF's CLR_WIN = WC_COLOR(WC_WHITE, WC_BLACK)
/* -reserved- */ 0, /* -reserved- */ 0,
@@ -80,21 +93,52 @@ const WC_TX_WINDOW win_xm =
/* window text */ "" // replaced by the dynamic "Status:" line, see xm_set_status() /* window text */ "" // replaced by the dynamic "Status:" line, see xm_set_status()
}; };
const WC_TX_WINDOW win_about = // The actually-used, mutable instance - populated via memcpy from win_xm_tpl
// (see main_start()). Left without an initializer here on purpose: it would
// be silently ignored by this project's crt0.s anyway (see comment above),
// and an explicit memcpy at point of use is clearer than relying on that.
WC_TX_WINDOW win_xm;
// win_about_tpl/win_about follow the exact same const-template + memcpy'd-
// instance split as win_xm_tpl/win_xm above, for the same reason.
const WC_TX_WINDOW win_about_tpl =
{ {
/* window with header and text */ WC_WIND_HDR_TXT, /* window with header and text */ WC_WIND_HDR_TXT,
/* cursor color mask */ 0, /* cursor color mask */ 0,
/* X,Y (position) */ 22, 10, /* X,Y (position) */ 22, 10, // both placeholders, overwritten at runtime - see about(). Screen
/* W,H (size) */ 36, 5, // width is NOT always 80: WC has three text modes - 90x36, 80x25,
/* paper/ink (window color) */ 0x4F, // 80x30 (user-confirmed) - so width depends on HEI same as height
// does. (255,255 "auto-center" made the window not appear at all
// on this WC build, see project memory - not retried here.)
/* W,H (size) */ 36, 7, // +1 row for the 2nd centered line, +1 more for the blank line
// before the player name below
/* paper/ink (window color) */ 0x70, // matches win_xm_tpl's own color (white paper, black ink) - was
// 0x4F before, per explicit request to make About look the same
/* -reserved- */ 0, /* -reserved- */ 0,
/* window restore buffer address */ 0, /* window restore buffer address */ 0,
/* separators */ 0, 0, /* separators */ 0, 0,
/* header text */ "\x0E" " About ", /* header text */ "\x0E" " About ",
/* footer text */ "", /* footer text */ "",
/* window text */ "\x0E\x0C\x01" "XM Player v0.1" /* window text */ "\x0D" "\x0E" "XM Player v0.1" "\x0D" "\x0E" "by Alex Korochinskiy"
// Leading \x0D adds one blank row before the player name (purely cosmetic,
// per request) - see win_about_tpl's height above, bumped to make room.
// Root cause (read straight from WC's own firmware source - WCIF.ASM's
// TXTPR/CNTR/STSCN, not guessed): \x0E centers by scanning FORWARD through
// the text to measure the line's length (STSCN). That scan skips right
// over \x0C,YY (down-shift) without treating it as a line end - only a
// real \x0D or the string's own 0x00 terminate the scan. So with \x0C,01
// between the two lines (as this used to be), line 1's scan ran straight
// through the shift and hit line 2's OWN \x0E before reaching any real
// terminator - STSCN treats hitting a second \x0E mid-scan as a measurement
// failure and CNTR silently skips centering for it. Line 2 always worked
// because nothing follows it but the string's NUL. Using a real \x0D here
// gives line 1's scan a proper stopping point, fixing it - and \x0D moves
// to the next row exactly like \x0C,01 did (both land on Y+1 here), so this
// doesn't change vertical position at all.
}; };
WC_TX_WINDOW win_about; // mutable instance - see win_xm's comment above
void xm_set_status(const char *msg); // defined below, used by error_*() before that point void xm_set_status(const char *msg); // defined below, used by error_*() before that point
void xm_set_status_code(const char *msg, u8 code); // ditto void xm_set_status_code(const char *msg, u8 code); // ditto
@@ -168,12 +212,12 @@ bool play_xm()
} }
esp_cmd(ESP_CMD_TRACK_INIT); esp_cmd(ESP_CMD_TRACK_INIT);
// 400 frames = 8s, comfortably past the firmware's 5s song-length // 500 frames = 10s, comfortably past the firmware's 5s song-length
// measurement cap (XM_MEASURE_MAX_US in tracker.cpp) - see esp_wait_busy() // measurement cap (XM_MEASURE_MAX_US in tracker.cpp) - see esp_wait_busy()
// in esp32.c for why this needs to be real-time-based, not an iteration // in esp32.c for why this needs to be real-time-based, not an iteration
// count (an uncalibrated guess here previously caused ESP_ERR_INV_XM_HANDLE // count (an uncalibrated guess here previously caused ESP_ERR_INV_XM_HANDLE
// failures on heavier files that legitimately needed close to the full 5s). // failures on heavier files that legitimately needed close to the full 5s).
esp_wait_busy(400); esp_wait_busy(500);
last_esp_status = esp_rd_reg8(ESP_REG_STATUS); last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
if (last_esp_status != ESP_ST_READY) if (last_esp_status != ESP_ST_READY)
@@ -221,8 +265,29 @@ void wait_frames(u8 n)
} }
} }
// Screen width isn't fixed at 80 either - WC has three text modes: 90x36,
// 80x25, 80x30 (user-confirmed), so width tracks HEI the same way height
// does (there's no separate documented width system variable to read).
// Matches demyanenko-d/VGMPLAY.WMF's own centering code (src_sdcc/main.c,
// "scr_w = (scr_h >= 36) ? 90 : 80") - same three modes, same mapping.
u8 wc_screen_width()
{
return (*(u8*)_HEI >= 36) ? 90 : 80;
}
// Clamps to 0 instead of underflowing (u8 wraparound) if the window is ever
// bigger than the screen - matches VGMPLAY.WMF's own centering code, same
// guard.
u8 wc_center(u8 screen_size, u8 win_size)
{
return (screen_size > win_size) ? (screen_size - win_size) / 2 : 0;
}
void about() void about()
{ {
memcpy(&win_about, &win_about_tpl, sizeof(win_about));
win_about.x_pos = wc_center(wc_screen_width(), win_about.x_size);
win_about.y_pos = wc_center(*(u8*)_HEI, win_about.y_size);
wc_prwow(&win_about); wc_prwow(&win_about);
wait_esc_key(); wait_esc_key();
wc_rresb(&win_about); wc_rresb(&win_about);
@@ -262,7 +327,7 @@ void wait_for_manual_exit()
halt halt
__endasm; __endasm;
if (wc_key_pgdn()) if (wc_key_pgdn() || wc_key_enter())
unload_and_exit(WC_NEXT_FILE); unload_and_exit(WC_NEXT_FILE);
if (wc_key_pgup()) if (wc_key_pgup())
@@ -602,8 +667,21 @@ void main_start()
// deferred until after play_xm() succeeded, because opening a window // deferred until after play_xm() succeeded, because opening a window
// before esp32 activity used to corrupt the transfer - that was tied to // before esp32 activity used to corrupt the transfer - that was tied to
// our old hand-rolled PRSRW/PRIAT wrappers, not to window timing itself, // our old hand-rolled PRSRW/PRIAT wrappers, not to window timing itself,
// and no longer applies now that we're on the real vgm_wc_api library // and no longer applies now that we're on the real wc_api library
// (see project memory). // (see project memory).
memcpy(&win_xm, &win_xm_tpl, sizeof(win_xm));
win_xm.x_pos = wc_center(wc_screen_width(), win_xm.x_size);
win_xm.y_pos = wc_center(*(u8*)_HEI, win_xm.y_size);
// GEDPL must run before ANY other WC API call - plugins/READ_ME.TXT is
// explicit that the screen can be in an arbitrary state on entry ("!при
// запуске плагина надо вызывать GEDPL... т.к. при входе в плагин может
// быть любой экран!"), so wc_key_wait_release() (see wc_api.c's comment -
// debounces the Enter/F3 that launched this plugin, so the main loop's
// wc_key_enter() check below doesn't immediately treat it as a fresh
// keypress) goes right after it, not before.
wc_gedpl();
wc_key_wait_release();
wc_prwow(&win_xm); wc_prwow(&win_xm);
xm_draw_static_labels(); xm_draw_static_labels();
xm_set_status("Loading, please wait..."); xm_set_status("Loading, please wait...");
@@ -636,6 +714,7 @@ void main_start()
frame_ctr = 0; frame_ctr = 0;
// poll keys // poll keys
while (1) while (1)
{ {
__asm __asm
@@ -648,7 +727,7 @@ void main_start()
xm_update_info(); xm_update_info();
} }
if (wc_key_pgdn()) // PgDn - unload and go to next file if (wc_key_pgdn() || wc_key_enter()) // PgDn or Enter - unload and go to next file
unload_and_exit(WC_NEXT_FILE); unload_and_exit(WC_NEXT_FILE);
if (wc_key_pgup()) // PgUp - unload and go to previous file if (wc_key_pgup()) // PgUp - unload and go to previous file
+30 -6
View File
@@ -1,22 +1,29 @@
// This project now builds under SDCC 4.6.0 + `--sdcccall 1` (SDCC's // This project now builds under SDCC 4.6.0 + `--sdcccall 1` (SDCC's
// register calling convention) - see build.bat for why this is pinned // register calling convention) - see build.bat for why this is pinned
// PER-PROJECT, independent of the rest of ft812sdk (which stays on 4.0.0). // PER-PROJECT, independent of the rest of ft812sdk (which stays on 4.0.0).
// This lets us link directly against demyanenko-d/VGMPLAY.WMF's real, // This lets us link directly against demyanenko-d/VGMPLAY.WMF's real,
// hardware-tested wc_api library (vgm_wc_api.lib, assembled verbatim from // hardware-tested wc_api library (wc_api.lib, assembled verbatim from
// their src_sdcc/lib/wc_api/*.s with the SAME SDCC 4.6.0's sdasz80) instead // their src_sdcc/lib/wc_api/*.s with the SAME SDCC 4.6.0's sdasz80) instead
// of our own hand-rolled __naked wrappers - our attempts at PRSRW+PRIAT (in // of our own hand-rolled __naked wrappers - our attempts at PRSRW+PRIAT (in
// three different shapes: globals-based single function, two separate // three different shapes: globals-based single function, two separate
// naked functions, and a stack-based hand-port of their EXX logic) all // naked functions, and a stack-based hand-port of their EXX logic) all
// corrupted esp32 file loading in ways never fully root-caused. // corrupted esp32 file loading in ways never fully root-caused.
// //
// Keyboard handling went through a raw-PS/2-FIFO rewrite (keys.c, since
// reverted) attempting to match how VGMPLAY.WMF's own player reads keys.
// That approach caused two confirmed hardware regressions - esp32 file
// transfers failing (ESP_ERR_INV_XM, 0x90, right after upload) and, once
// wc_int_pl() was worked around, the keyboard not responding at all (WC's
// own interrupt-driven PS/2 scan competes with raw FIFO reads for the same
// hardware) - so it's back to these simple WC-#6006-API wrappers
// (wc_key_esc/pgup/pgdn/space, plus wc_key_enter for PgDn's alternate).
// Their key-check constants (wc_key_esc=0x17, wc_key_pgup=0x19, // Their key-check constants (wc_key_esc=0x17, wc_key_pgup=0x19,
// wc_key_pgdn=0x1A) were confirmed to exactly match our own _ESC/_PGU/_PGD // wc_key_pgdn=0x1A, wc_key_enter=0x16) were confirmed to exactly match our
// constants in wc_api.h before relying on them - same underlying WC #6006 // own _ESC/_PGU/_PGD/_ENKE constants in wc_api.h - same underlying WC
// API, just a different project's wrapper names. // #6006 API, just a different project's wrapper names.
// //
// Everything below is just extern declarations for symbols the linker // Everything below is just extern declarations for symbols the linker
// pulls out of vgm_wc_api.lib (added to build.bat) - no bodies here. // pulls out of wc_api.lib (added to build.bat) - no bodies here.
void wc_prwow(void *win); void wc_prwow(void *win);
void wc_rresb(void *win); void wc_rresb(void *win);
u8 wc_load512(u16 dest, u8 blocks); u8 wc_load512(u16 dest, u8 blocks);
@@ -24,6 +31,23 @@ u8 wc_key_esc(void);
u8 wc_key_pgup(void); u8 wc_key_pgup(void);
u8 wc_key_pgdn(void); u8 wc_key_pgdn(void);
u8 wc_key_space(void); u8 wc_key_space(void);
u8 wc_key_enter(void);
// Waits for all keys to be reported released from WC's own point of view -
// called once at the top of main_start(), after wc_gedpl(). Needed because
// the plugin is launched BY an Enter keypress (or F3): without this, the
// very first wc_key_enter() check in the main loop can still see that same
// launch keypress as "down" and immediately treat it as a fresh Enter,
// jumping to the next file right after loading with no real keypress -
// confirmed on hardware, reproduces the same way whether Enter is read via
// this library's wc_key_enter() or via the raw-PS/2 rewrite that preceded
// it (see the file header comment) - a real human-timing race (the user
// hasn't necessarily released Enter yet by the time the file's done
// loading), not a bug tied to either keyboard-reading mechanism
// specifically.
void wc_key_wait_release(void);
void wc_gedpl(void);
void wc_prsrw(void *win, const u8 *text, u8 y, u8 x, u16 len); void wc_prsrw(void *win, const u8 *text, u8 y, u8 x, u16 len);
void wc_prsrw_attr(void *win, const u8 *text, u8 y, u8 x, u16 len, u8 attr); void wc_prsrw_attr(void *win, const u8 *text, u8 y, u8 x, u16 len, u8 attr);
+2
View File
@@ -17,6 +17,8 @@
#define _WCAPI 0x6006 // точка доступа к функциям #define _WCAPI 0x6006 // точка доступа к функциям
#define _TMN 0x6009 // синхра. переменная-таймер, инкрементится по инту #define _TMN 0x6009 // синхра. переменная-таймер, инкрементится по инту
#define _HEI 0x600E // screen height in text rows: 25, 30 or 36 (see plugins/READ_ME.TXT)
//--------------------------------------- //---------------------------------------
// API functions // API functions
#define _MNGC_PL 0x00 // включение страницы на 0xC000 (из выделенного блока) #define _MNGC_PL 0x00 // включение страницы на 0xC000 (из выделенного блока)
View File