Update sources, rebuild artifacts, add .gitignore

This commit is contained in:
2026-08-31 21:26:25 +03:00
parent ee64fb85a9
commit a279a0eed3
20 changed files with 5112 additions and 4070 deletions
+22
View File
@@ -0,0 +1,22 @@
# Build output (SDCC/Z80 toolchain — regenerated by build.bat)
obj/
bin/
build/
# SDCC-generated files if they ever end up outside obj/
*.rel
*.lst
*.map
*.noi
*.sym
*.lk
*.ihx
*.adb
*.cdb
*.omf
# Editor/OS cruft
.vscode/
*.swp
Thumbs.db
.DS_Store
BIN
View File
Binary file not shown.
+22 -27
View File
@@ -74,12 +74,12 @@ _hdr:
.db #0x4d ; 77 'M'
.db #0x44 ; 68 'D'
.db #0x4c ; 76 'L'
.db #0x07 ; 7
.db #0x0a ; 10
.db 0x00
.db #0x01 ; 1
.db #0x00 ; 0
.db #0x00 ; 0
.db #0x1e ; 30
.db #0x1d ; 29
.db 0x00
.db 0x00
.db 0x00
@@ -204,12 +204,7 @@ _hdr:
.db 0x00
.db 0x00
.byte #0xff, #0xff, #0xff, #0xff ; 4294967295
.ascii "XM Player"
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.ascii "XM Player v0.1"
.db 0x00
.db 0x00
.db 0x00
@@ -291,25 +286,25 @@ _hdr:
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db 0x00
.db #0x12 ; 18
.db #0x01 ; 1
.db #0x73 ; 115 's'
.db #0x74 ; 116 't'
.db #0x6f ; 111 'o'
.db #0x70 ; 112 'p'
.db #0x6f ; 111 'o'
.db #0x6e ; 110 'n'
.db #0x65 ; 101 'e'
.db #0x72 ; 114 'r'
.db #0x72 ; 114 'r'
.db #0x6f ; 111 'o'
.db #0x72 ; 114 'r'
.db #0x02 ; 2
.db #0x30 ; 48 '0'
.db #0x00 ; 0
.db #0x31 ; 49 '1'
.db #0x00 ; 0
.db #0x00 ; 0
.db 0x00
.db 0x00
.db 0x00
BIN
View File
Binary file not shown.
+3 -3
View File
@@ -1,12 +1,12 @@
:200200000000000000000000000000000000000057696C64436F6D6D616E6465724D444CDB
:2002200007000100001E000000000000000000000000000000000000000000000000000098
:200220000A000100001D000000000000000000000000000000000000000000000000000096
:20024000584D20584D5A53334D000000000000000000000000000000000000000000000007
:2002600000000000000000000000000000000000000000000000000000000000000000007E
:2002800000000000000000000000000000000000000000000000000000000000000000005E
:2002A00000FFFFFFFF584D20506C6179657200000000000000000000000000000000000010
:2002A00000FFFFFFFF584D20506C617965722076302E3100000000000000000000000000EB
:2002C00000000000000300000000000000000000000000000000000000000000000000001B
:2002E0000000000000000000000000000000000000000000000000000000000000000000FE
:200300000000000000000000000000000000000000000000000000000000000000000000DD
:2003000000000000120173746F706F6E6572726F720230003100000000000000000000009A
:200320000000000000000000000000000000000000000000000000000000000000000000BD
:2003400000000000000000000000000000000000000000000000000000000000000000009D
:2003600000000000000000000000000000000000000000000000000000000000000000007D
+339 -344
View File
@@ -74,12 +74,12 @@
0000001D 4D 74 .db #0x4d ; 77 'M'
0000001E 44 75 .db #0x44 ; 68 'D'
0000001F 4C 76 .db #0x4c ; 76 'L'
00000020 07 77 .db #0x07 ; 7
00000020 0A 77 .db #0x0a ; 10
00000021 00 78 .db 0x00
00000022 01 79 .db #0x01 ; 1
00000023 00 80 .db #0x00 ; 0
00000024 00 81 .db #0x00 ; 0
00000025 1E 82 .db #0x1e ; 30
00000025 1D 82 .db #0x1d ; 29
00000026 00 83 .db 0x00
00000027 00 84 .db 0x00
00000028 00 85 .db 0x00
@@ -204,345 +204,340 @@
0000009F 00 204 .db 0x00
000000A0 00 205 .db 0x00
000000A1 FF FF FF FF 206 .byte #0xff, #0xff, #0xff, #0xff ; 4294967295
000000A5 58 4D 20 50 6C 61 79 207 .ascii "XM Player"
65 72
000000AE 00 208 .db 0x00
000000AF 00 209 .db 0x00
000000B0 00 210 .db 0x00
000000B1 00 211 .db 0x00
000000B2 00 212 .db 0x00
000000B3 00 213 .db 0x00
000000B4 00 214 .db 0x00
000000B5 00 215 .db 0x00
000000B6 00 216 .db 0x00
000000B7 00 217 .db 0x00
000000B8 00 218 .db 0x00
000000B9 00 219 .db 0x00
000000BA 00 220 .db 0x00
000000BB 00 221 .db 0x00
000000BC 00 222 .db 0x00
000000BD 00 223 .db 0x00
000000BE 00 224 .db 0x00
000000BF 00 225 .db 0x00
000000C0 00 226 .db 0x00
000000C1 00 227 .db 0x00
000000C2 00 228 .db 0x00
000000C3 00 229 .db 0x00
000000C4 00 230 .db 0x00
000000C5 03 231 .db #0x03 ; 3
000000C6 00 232 .db 0x00
000000C7 00 233 .db 0x00
000000C8 00 234 .db 0x00
000000C9 00 235 .db 0x00
000000CA 00 236 .db 0x00
000000CB 00 237 .db 0x00
000000CC 00 238 .db 0x00
000000CD 00 239 .db 0x00
000000CE 00 240 .db 0x00
000000CF 00 241 .db 0x00
000000D0 00 242 .db 0x00
000000D1 00 243 .db 0x00
000000D2 00 244 .db 0x00
000000D3 00 245 .db 0x00
000000D4 00 246 .db 0x00
000000D5 00 247 .db 0x00
000000D6 00 248 .db 0x00
000000D7 00 249 .db 0x00
000000D8 00 250 .db 0x00
000000D9 00 251 .db 0x00
000000DA 00 252 .db 0x00
000000DB 00 253 .db 0x00
000000DC 00 254 .db 0x00
000000DD 00 255 .db 0x00
000000DE 00 256 .db 0x00
000000DF 00 257 .db 0x00
000000E0 00 258 .db 0x00
000000E1 00 259 .db 0x00
000000E2 00 260 .db 0x00
000000E3 00 261 .db 0x00
000000E4 00 262 .db 0x00
000000E5 00 263 .db 0x00
000000E6 00 264 .db 0x00
000000E7 00 265 .db 0x00
000000E8 00 266 .db 0x00
000000E9 00 267 .db 0x00
000000EA 00 268 .db 0x00
000000EB 00 269 .db 0x00
000000EC 00 270 .db 0x00
000000ED 00 271 .db 0x00
000000EE 00 272 .db 0x00
000000EF 00 273 .db 0x00
000000F0 00 274 .db 0x00
000000F1 00 275 .db 0x00
000000F2 00 276 .db 0x00
000000F3 00 277 .db 0x00
000000F4 00 278 .db 0x00
000000F5 00 279 .db 0x00
000000F6 00 280 .db 0x00
000000F7 00 281 .db 0x00
000000F8 00 282 .db 0x00
000000F9 00 283 .db 0x00
000000FA 00 284 .db 0x00
000000FB 00 285 .db 0x00
000000FC 00 286 .db 0x00
000000FD 00 287 .db 0x00
000000FE 00 288 .db 0x00
000000FF 00 289 .db 0x00
00000100 00 290 .db 0x00
00000101 00 291 .db 0x00
00000102 00 292 .db 0x00
00000103 00 293 .db 0x00
00000104 00 294 .db 0x00
00000105 00 295 .db 0x00
00000106 00 296 .db 0x00
00000107 00 297 .db 0x00
00000108 00 298 .db 0x00
00000109 00 299 .db 0x00
0000010A 00 300 .db 0x00
0000010B 00 301 .db 0x00
0000010C 00 302 .db 0x00
0000010D 00 303 .db 0x00
0000010E 00 304 .db 0x00
0000010F 00 305 .db 0x00
00000110 00 306 .db 0x00
00000111 00 307 .db 0x00
00000112 00 308 .db 0x00
00000113 00 309 .db 0x00
00000114 00 310 .db 0x00
00000115 00 311 .db 0x00
00000116 00 312 .db 0x00
00000117 00 313 .db 0x00
00000118 00 314 .db 0x00
00000119 00 315 .db 0x00
0000011A 00 316 .db 0x00
0000011B 00 317 .db 0x00
0000011C 00 318 .db 0x00
0000011D 00 319 .db 0x00
0000011E 00 320 .db 0x00
0000011F 00 321 .db 0x00
00000120 00 322 .db 0x00
00000121 00 323 .db 0x00
00000122 00 324 .db 0x00
00000123 00 325 .db 0x00
00000124 00 326 .db 0x00
00000125 00 327 .db 0x00
00000126 00 328 .db 0x00
00000127 00 329 .db 0x00
00000128 00 330 .db 0x00
00000129 00 331 .db 0x00
0000012A 00 332 .db 0x00
0000012B 00 333 .db 0x00
0000012C 00 334 .db 0x00
0000012D 00 335 .db 0x00
0000012E 00 336 .db 0x00
0000012F 00 337 .db 0x00
00000130 00 338 .db 0x00
00000131 00 339 .db 0x00
00000132 00 340 .db 0x00
00000133 00 341 .db 0x00
00000134 00 342 .db 0x00
00000135 00 343 .db 0x00
00000136 00 344 .db 0x00
00000137 00 345 .db 0x00
00000138 00 346 .db 0x00
00000139 00 347 .db 0x00
0000013A 00 348 .db 0x00
0000013B 00 349 .db 0x00
0000013C 00 350 .db 0x00
0000013D 00 351 .db 0x00
0000013E 00 352 .db 0x00
0000013F 00 353 .db 0x00
00000140 00 354 .db 0x00
00000141 00 355 .db 0x00
00000142 00 356 .db 0x00
00000143 00 357 .db 0x00
00000144 00 358 .db 0x00
00000145 00 359 .db 0x00
00000146 00 360 .db 0x00
00000147 00 361 .db 0x00
00000148 00 362 .db 0x00
00000149 00 363 .db 0x00
0000014A 00 364 .db 0x00
0000014B 00 365 .db 0x00
0000014C 00 366 .db 0x00
0000014D 00 367 .db 0x00
0000014E 00 368 .db 0x00
0000014F 00 369 .db 0x00
00000150 00 370 .db 0x00
00000151 00 371 .db 0x00
00000152 00 372 .db 0x00
00000153 00 373 .db 0x00
00000154 00 374 .db 0x00
00000155 00 375 .db 0x00
00000156 00 376 .db 0x00
00000157 00 377 .db 0x00
00000158 00 378 .db 0x00
00000159 00 379 .db 0x00
0000015A 00 380 .db 0x00
0000015B 00 381 .db 0x00
0000015C 00 382 .db 0x00
0000015D 00 383 .db 0x00
0000015E 00 384 .db 0x00
0000015F 00 385 .db 0x00
00000160 00 386 .db 0x00
00000161 00 387 .db 0x00
00000162 00 388 .db 0x00
00000163 00 389 .db 0x00
00000164 00 390 .db 0x00
00000165 00 391 .db 0x00
00000166 00 392 .db 0x00
00000167 00 393 .db 0x00
00000168 00 394 .db 0x00
00000169 00 395 .db 0x00
0000016A 00 396 .db 0x00
0000016B 00 397 .db 0x00
0000016C 00 398 .db 0x00
0000016D 00 399 .db 0x00
0000016E 00 400 .db 0x00
0000016F 00 401 .db 0x00
00000170 00 402 .db 0x00
00000171 00 403 .db 0x00
00000172 00 404 .db 0x00
00000173 00 405 .db 0x00
00000174 00 406 .db 0x00
00000175 00 407 .db 0x00
00000176 00 408 .db 0x00
00000177 00 409 .db 0x00
00000178 00 410 .db 0x00
00000179 00 411 .db 0x00
0000017A 00 412 .db 0x00
0000017B 00 413 .db 0x00
0000017C 00 414 .db 0x00
0000017D 00 415 .db 0x00
0000017E 00 416 .db 0x00
0000017F 00 417 .db 0x00
00000180 00 418 .db 0x00
00000181 00 419 .db 0x00
00000182 00 420 .db 0x00
00000183 00 421 .db 0x00
00000184 00 422 .db 0x00
00000185 00 423 .db 0x00
00000186 00 424 .db 0x00
00000187 00 425 .db 0x00
00000188 00 426 .db 0x00
00000189 00 427 .db 0x00
0000018A 00 428 .db 0x00
0000018B 00 429 .db 0x00
0000018C 00 430 .db 0x00
0000018D 00 431 .db 0x00
0000018E 00 432 .db 0x00
0000018F 00 433 .db 0x00
00000190 00 434 .db 0x00
00000191 00 435 .db 0x00
00000192 00 436 .db 0x00
00000193 00 437 .db 0x00
00000194 00 438 .db 0x00
00000195 00 439 .db 0x00
00000196 00 440 .db 0x00
00000197 00 441 .db 0x00
00000198 00 442 .db 0x00
00000199 00 443 .db 0x00
0000019A 00 444 .db 0x00
0000019B 00 445 .db 0x00
0000019C 00 446 .db 0x00
0000019D 00 447 .db 0x00
0000019E 00 448 .db 0x00
0000019F 00 449 .db 0x00
000001A0 00 450 .db 0x00
000001A1 00 451 .db 0x00
000001A2 00 452 .db 0x00
000001A3 00 453 .db 0x00
000001A4 00 454 .db 0x00
000001A5 00 455 .db 0x00
000001A6 00 456 .db 0x00
000001A7 00 457 .db 0x00
000001A8 00 458 .db 0x00
000001A9 00 459 .db 0x00
000001AA 00 460 .db 0x00
000001AB 00 461 .db 0x00
000001AC 00 462 .db 0x00
000001AD 00 463 .db 0x00
000001AE 00 464 .db 0x00
000001AF 00 465 .db 0x00
000001B0 00 466 .db 0x00
000001B1 00 467 .db 0x00
000001B2 00 468 .db 0x00
000001B3 00 469 .db 0x00
000001B4 00 470 .db 0x00
000001B5 00 471 .db 0x00
000001B6 00 472 .db 0x00
000001B7 00 473 .db 0x00
000001B8 00 474 .db 0x00
000001B9 00 475 .db 0x00
000001BA 00 476 .db 0x00
000001BB 00 477 .db 0x00
000001BC 00 478 .db 0x00
000001BD 00 479 .db 0x00
000001BE 00 480 .db 0x00
000001BF 00 481 .db 0x00
000001C0 00 482 .db 0x00
000001C1 00 483 .db 0x00
000001C2 00 484 .db 0x00
000001C3 00 485 .db 0x00
000001C4 00 486 .db 0x00
000001C5 00 487 .db 0x00
000001C6 00 488 .db 0x00
000001C7 00 489 .db 0x00
000001C8 00 490 .db 0x00
000001C9 00 491 .db 0x00
000001CA 00 492 .db 0x00
000001CB 00 493 .db 0x00
000001CC 00 494 .db 0x00
000001CD 00 495 .db 0x00
000001CE 00 496 .db 0x00
000001CF 00 497 .db 0x00
000001D0 00 498 .db 0x00
000001D1 00 499 .db 0x00
000001D2 00 500 .db 0x00
000001D3 00 501 .db 0x00
000001D4 00 502 .db 0x00
000001D5 00 503 .db 0x00
000001D6 00 504 .db 0x00
000001D7 00 505 .db 0x00
000001D8 00 506 .db 0x00
000001D9 00 507 .db 0x00
000001DA 00 508 .db 0x00
000001DB 00 509 .db 0x00
000001DC 00 510 .db 0x00
000001DD 00 511 .db 0x00
000001DE 00 512 .db 0x00
000001DF 00 513 .db 0x00
000001E0 00 514 .db 0x00
000001E1 00 515 .db 0x00
000001E2 00 516 .db 0x00
000001E3 00 517 .db 0x00
000001E4 00 518 .db 0x00
000001E5 00 519 .db 0x00
000001E6 00 520 .db 0x00
000001E7 00 521 .db 0x00
000001E8 00 522 .db 0x00
000001E9 00 523 .db 0x00
000001EA 00 524 .db 0x00
000001EB 00 525 .db 0x00
000001EC 00 526 .db 0x00
000001ED 00 527 .db 0x00
000001EE 00 528 .db 0x00
000001EF 00 529 .db 0x00
000001F0 00 530 .db 0x00
000001F1 00 531 .db 0x00
000001F2 00 532 .db 0x00
000001F3 00 533 .db 0x00
000001F4 00 534 .db 0x00
000001F5 00 535 .db 0x00
000001F6 00 536 .db 0x00
000001F7 00 537 .db 0x00
000001F8 00 538 .db 0x00
000001F9 00 539 .db 0x00
000001FA 00 540 .db 0x00
000001FB 00 541 .db 0x00
000001FC 00 542 .db 0x00
000001FD 00 543 .db 0x00
000001FE 00 544 .db 0x00
000001FF 00 545 .db 0x00
546 .area _INITIALIZER
547 .area _CABS (ABS)
000000A5 58 4D 20 50 6C 61 79 207 .ascii "XM Player v0.1"
65 72 20 76 30 2E 31
000000B3 00 208 .db 0x00
000000B4 00 209 .db 0x00
000000B5 00 210 .db 0x00
000000B6 00 211 .db 0x00
000000B7 00 212 .db 0x00
000000B8 00 213 .db 0x00
000000B9 00 214 .db 0x00
000000BA 00 215 .db 0x00
000000BB 00 216 .db 0x00
000000BC 00 217 .db 0x00
000000BD 00 218 .db 0x00
000000BE 00 219 .db 0x00
000000BF 00 220 .db 0x00
000000C0 00 221 .db 0x00
000000C1 00 222 .db 0x00
000000C2 00 223 .db 0x00
000000C3 00 224 .db 0x00
000000C4 00 225 .db 0x00
000000C5 03 226 .db #0x03 ; 3
000000C6 00 227 .db 0x00
000000C7 00 228 .db 0x00
000000C8 00 229 .db 0x00
000000C9 00 230 .db 0x00
000000CA 00 231 .db 0x00
000000CB 00 232 .db 0x00
000000CC 00 233 .db 0x00
000000CD 00 234 .db 0x00
000000CE 00 235 .db 0x00
000000CF 00 236 .db 0x00
000000D0 00 237 .db 0x00
000000D1 00 238 .db 0x00
000000D2 00 239 .db 0x00
000000D3 00 240 .db 0x00
000000D4 00 241 .db 0x00
000000D5 00 242 .db 0x00
000000D6 00 243 .db 0x00
000000D7 00 244 .db 0x00
000000D8 00 245 .db 0x00
000000D9 00 246 .db 0x00
000000DA 00 247 .db 0x00
000000DB 00 248 .db 0x00
000000DC 00 249 .db 0x00
000000DD 00 250 .db 0x00
000000DE 00 251 .db 0x00
000000DF 00 252 .db 0x00
000000E0 00 253 .db 0x00
000000E1 00 254 .db 0x00
000000E2 00 255 .db 0x00
000000E3 00 256 .db 0x00
000000E4 00 257 .db 0x00
000000E5 00 258 .db 0x00
000000E6 00 259 .db 0x00
000000E7 00 260 .db 0x00
000000E8 00 261 .db 0x00
000000E9 00 262 .db 0x00
000000EA 00 263 .db 0x00
000000EB 00 264 .db 0x00
000000EC 00 265 .db 0x00
000000ED 00 266 .db 0x00
000000EE 00 267 .db 0x00
000000EF 00 268 .db 0x00
000000F0 00 269 .db 0x00
000000F1 00 270 .db 0x00
000000F2 00 271 .db 0x00
000000F3 00 272 .db 0x00
000000F4 00 273 .db 0x00
000000F5 00 274 .db 0x00
000000F6 00 275 .db 0x00
000000F7 00 276 .db 0x00
000000F8 00 277 .db 0x00
000000F9 00 278 .db 0x00
000000FA 00 279 .db 0x00
000000FB 00 280 .db 0x00
000000FC 00 281 .db 0x00
000000FD 00 282 .db 0x00
000000FE 00 283 .db 0x00
000000FF 00 284 .db 0x00
00000100 00 285 .db 0x00
00000101 00 286 .db 0x00
00000102 00 287 .db 0x00
00000103 00 288 .db 0x00
00000104 12 289 .db #0x12 ; 18
00000105 01 290 .db #0x01 ; 1
00000106 73 291 .db #0x73 ; 115 's'
00000107 74 292 .db #0x74 ; 116 't'
00000108 6F 293 .db #0x6f ; 111 'o'
00000109 70 294 .db #0x70 ; 112 'p'
0000010A 6F 295 .db #0x6f ; 111 'o'
0000010B 6E 296 .db #0x6e ; 110 'n'
0000010C 65 297 .db #0x65 ; 101 'e'
0000010D 72 298 .db #0x72 ; 114 'r'
0000010E 72 299 .db #0x72 ; 114 'r'
0000010F 6F 300 .db #0x6f ; 111 'o'
00000110 72 301 .db #0x72 ; 114 'r'
00000111 02 302 .db #0x02 ; 2
00000112 30 303 .db #0x30 ; 48 '0'
00000113 00 304 .db #0x00 ; 0
00000114 31 305 .db #0x31 ; 49 '1'
00000115 00 306 .db #0x00 ; 0
00000116 00 307 .db #0x00 ; 0
00000117 00 308 .db 0x00
00000118 00 309 .db 0x00
00000119 00 310 .db 0x00
0000011A 00 311 .db 0x00
0000011B 00 312 .db 0x00
0000011C 00 313 .db 0x00
0000011D 00 314 .db 0x00
0000011E 00 315 .db 0x00
0000011F 00 316 .db 0x00
00000120 00 317 .db 0x00
00000121 00 318 .db 0x00
00000122 00 319 .db 0x00
00000123 00 320 .db 0x00
00000124 00 321 .db 0x00
00000125 00 322 .db 0x00
00000126 00 323 .db 0x00
00000127 00 324 .db 0x00
00000128 00 325 .db 0x00
00000129 00 326 .db 0x00
0000012A 00 327 .db 0x00
0000012B 00 328 .db 0x00
0000012C 00 329 .db 0x00
0000012D 00 330 .db 0x00
0000012E 00 331 .db 0x00
0000012F 00 332 .db 0x00
00000130 00 333 .db 0x00
00000131 00 334 .db 0x00
00000132 00 335 .db 0x00
00000133 00 336 .db 0x00
00000134 00 337 .db 0x00
00000135 00 338 .db 0x00
00000136 00 339 .db 0x00
00000137 00 340 .db 0x00
00000138 00 341 .db 0x00
00000139 00 342 .db 0x00
0000013A 00 343 .db 0x00
0000013B 00 344 .db 0x00
0000013C 00 345 .db 0x00
0000013D 00 346 .db 0x00
0000013E 00 347 .db 0x00
0000013F 00 348 .db 0x00
00000140 00 349 .db 0x00
00000141 00 350 .db 0x00
00000142 00 351 .db 0x00
00000143 00 352 .db 0x00
00000144 00 353 .db 0x00
00000145 00 354 .db 0x00
00000146 00 355 .db 0x00
00000147 00 356 .db 0x00
00000148 00 357 .db 0x00
00000149 00 358 .db 0x00
0000014A 00 359 .db 0x00
0000014B 00 360 .db 0x00
0000014C 00 361 .db 0x00
0000014D 00 362 .db 0x00
0000014E 00 363 .db 0x00
0000014F 00 364 .db 0x00
00000150 00 365 .db 0x00
00000151 00 366 .db 0x00
00000152 00 367 .db 0x00
00000153 00 368 .db 0x00
00000154 00 369 .db 0x00
00000155 00 370 .db 0x00
00000156 00 371 .db 0x00
00000157 00 372 .db 0x00
00000158 00 373 .db 0x00
00000159 00 374 .db 0x00
0000015A 00 375 .db 0x00
0000015B 00 376 .db 0x00
0000015C 00 377 .db 0x00
0000015D 00 378 .db 0x00
0000015E 00 379 .db 0x00
0000015F 00 380 .db 0x00
00000160 00 381 .db 0x00
00000161 00 382 .db 0x00
00000162 00 383 .db 0x00
00000163 00 384 .db 0x00
00000164 00 385 .db 0x00
00000165 00 386 .db 0x00
00000166 00 387 .db 0x00
00000167 00 388 .db 0x00
00000168 00 389 .db 0x00
00000169 00 390 .db 0x00
0000016A 00 391 .db 0x00
0000016B 00 392 .db 0x00
0000016C 00 393 .db 0x00
0000016D 00 394 .db 0x00
0000016E 00 395 .db 0x00
0000016F 00 396 .db 0x00
00000170 00 397 .db 0x00
00000171 00 398 .db 0x00
00000172 00 399 .db 0x00
00000173 00 400 .db 0x00
00000174 00 401 .db 0x00
00000175 00 402 .db 0x00
00000176 00 403 .db 0x00
00000177 00 404 .db 0x00
00000178 00 405 .db 0x00
00000179 00 406 .db 0x00
0000017A 00 407 .db 0x00
0000017B 00 408 .db 0x00
0000017C 00 409 .db 0x00
0000017D 00 410 .db 0x00
0000017E 00 411 .db 0x00
0000017F 00 412 .db 0x00
00000180 00 413 .db 0x00
00000181 00 414 .db 0x00
00000182 00 415 .db 0x00
00000183 00 416 .db 0x00
00000184 00 417 .db 0x00
00000185 00 418 .db 0x00
00000186 00 419 .db 0x00
00000187 00 420 .db 0x00
00000188 00 421 .db 0x00
00000189 00 422 .db 0x00
0000018A 00 423 .db 0x00
0000018B 00 424 .db 0x00
0000018C 00 425 .db 0x00
0000018D 00 426 .db 0x00
0000018E 00 427 .db 0x00
0000018F 00 428 .db 0x00
00000190 00 429 .db 0x00
00000191 00 430 .db 0x00
00000192 00 431 .db 0x00
00000193 00 432 .db 0x00
00000194 00 433 .db 0x00
00000195 00 434 .db 0x00
00000196 00 435 .db 0x00
00000197 00 436 .db 0x00
00000198 00 437 .db 0x00
00000199 00 438 .db 0x00
0000019A 00 439 .db 0x00
0000019B 00 440 .db 0x00
0000019C 00 441 .db 0x00
0000019D 00 442 .db 0x00
0000019E 00 443 .db 0x00
0000019F 00 444 .db 0x00
000001A0 00 445 .db 0x00
000001A1 00 446 .db 0x00
000001A2 00 447 .db 0x00
000001A3 00 448 .db 0x00
000001A4 00 449 .db 0x00
000001A5 00 450 .db 0x00
000001A6 00 451 .db 0x00
000001A7 00 452 .db 0x00
000001A8 00 453 .db 0x00
000001A9 00 454 .db 0x00
000001AA 00 455 .db 0x00
000001AB 00 456 .db 0x00
000001AC 00 457 .db 0x00
000001AD 00 458 .db 0x00
000001AE 00 459 .db 0x00
000001AF 00 460 .db 0x00
000001B0 00 461 .db 0x00
000001B1 00 462 .db 0x00
000001B2 00 463 .db 0x00
000001B3 00 464 .db 0x00
000001B4 00 465 .db 0x00
000001B5 00 466 .db 0x00
000001B6 00 467 .db 0x00
000001B7 00 468 .db 0x00
000001B8 00 469 .db 0x00
000001B9 00 470 .db 0x00
000001BA 00 471 .db 0x00
000001BB 00 472 .db 0x00
000001BC 00 473 .db 0x00
000001BD 00 474 .db 0x00
000001BE 00 475 .db 0x00
000001BF 00 476 .db 0x00
000001C0 00 477 .db 0x00
000001C1 00 478 .db 0x00
000001C2 00 479 .db 0x00
000001C3 00 480 .db 0x00
000001C4 00 481 .db 0x00
000001C5 00 482 .db 0x00
000001C6 00 483 .db 0x00
000001C7 00 484 .db 0x00
000001C8 00 485 .db 0x00
000001C9 00 486 .db 0x00
000001CA 00 487 .db 0x00
000001CB 00 488 .db 0x00
000001CC 00 489 .db 0x00
000001CD 00 490 .db 0x00
000001CE 00 491 .db 0x00
000001CF 00 492 .db 0x00
000001D0 00 493 .db 0x00
000001D1 00 494 .db 0x00
000001D2 00 495 .db 0x00
000001D3 00 496 .db 0x00
000001D4 00 497 .db 0x00
000001D5 00 498 .db 0x00
000001D6 00 499 .db 0x00
000001D7 00 500 .db 0x00
000001D8 00 501 .db 0x00
000001D9 00 502 .db 0x00
000001DA 00 503 .db 0x00
000001DB 00 504 .db 0x00
000001DC 00 505 .db 0x00
000001DD 00 506 .db 0x00
000001DE 00 507 .db 0x00
000001DF 00 508 .db 0x00
000001E0 00 509 .db 0x00
000001E1 00 510 .db 0x00
000001E2 00 511 .db 0x00
000001E3 00 512 .db 0x00
000001E4 00 513 .db 0x00
000001E5 00 514 .db 0x00
000001E6 00 515 .db 0x00
000001E7 00 516 .db 0x00
000001E8 00 517 .db 0x00
000001E9 00 518 .db 0x00
000001EA 00 519 .db 0x00
000001EB 00 520 .db 0x00
000001EC 00 521 .db 0x00
000001ED 00 522 .db 0x00
000001EE 00 523 .db 0x00
000001EF 00 524 .db 0x00
000001F0 00 525 .db 0x00
000001F1 00 526 .db 0x00
000001F2 00 527 .db 0x00
000001F3 00 528 .db 0x00
000001F4 00 529 .db 0x00
000001F5 00 530 .db 0x00
000001F6 00 531 .db 0x00
000001F7 00 532 .db 0x00
000001F8 00 533 .db 0x00
000001F9 00 534 .db 0x00
000001FA 00 535 .db 0x00
000001FB 00 536 .db 0x00
000001FC 00 537 .db 0x00
000001FD 00 538 .db 0x00
000001FE 00 539 .db 0x00
000001FF 00 540 .db 0x00
541 .area _INITIALIZER
542 .area _CABS (ABS)
+6 -6
View File
@@ -18,9 +18,9 @@ T 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
T 0C 00 00 00 00 00 00 00 57 69 6C 64 43 6F 6D 6D
R 00 00 00 00
T 18 00 00 00 61 6E 64 65 72 4D 44 4C 07 00 01 00
T 18 00 00 00 61 6E 64 65 72 4D 44 4C 0A 00 01 00
R 00 00 00 00
T 24 00 00 00 00 1E 00 00 00 00 00 00 00 00 00 00
T 24 00 00 00 00 1D 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
T 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
@@ -42,7 +42,7 @@ T 90 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
T 9C 00 00 00 00 00 00 00 00 FF FF FF FF 58 4D 20
R 00 00 00 00
T A8 00 00 00 50 6C 61 79 65 72 00 00 00 00 00 00
T A8 00 00 00 50 6C 61 79 65 72 20 76 30 2E 31 00
R 00 00 00 00
T B4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
@@ -56,11 +56,11 @@ T E4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
T F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
T FC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
T FC 00 00 00 00 00 00 00 00 00 00 00 12 01 73 74
R 00 00 00 00
T 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
T 08 01 00 00 6F 70 6F 6E 65 72 72 6F 72 02 30 00
R 00 00 00 00
T 14 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
T 14 01 00 00 31 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
T 20 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00
R 00 00 00 00
+879 -546
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+126 -118
View File
@@ -1,119 +1,127 @@
:20800300ED7B00B8C906000E023E0EC306604F3E13D3773E01D357AFD357DB5779D357AF39
:20802300D3573E03D377C94F3E13D3773E02D35779D357DB57DB57DB574F3E03D37779C916
:20804300DDE5DD210000DD39F5F54F3E13D3773E02D35779D357DB57DB57DB574FDB5757F8
:2080630059DB57DD77FCAFDD77FDDD77FEDD77FFDD7EFCDD77FEAFDD77FFDD77FCDD77FD31
:20808300DD6EFEDB57DD77FCAFDD77FDDD77FEDD77FFDD7EFCDD77FFAFDD77FCDD77FDDD96
:2080A30077FEDD66FF3E03D377DDF9DDE1C94F3E13D3773E02D35779D357DB57DB57FD21A5
:2080C3000200FD39FD4E00790DB72807DB571213C3CA803E03D377E133E9474D3E13D37793
:2080E3003E01D35778D357DB5779D3573E03D377C94F3E13D3773E01D35779D357DB57FD24
:20810300210200FD39FD7E00D357FD7E01D357FD7E02D357FD7E03D3573E03D377E1F1F11B
:20812300E93E13D3773E07D357DB573E03D377C97D01AF1AED797C01AF1BED79FD21020049
:20814300FD39FD7E0001AF1CED79FD7E01FD4E02FD23CB39CB1F3D01AF26ED79FD7E023D2F
:2081630001AF28ED793E13D3773E03D357DB57DB573E8201AF27ED793E27DBAF0738F93EF2
:2081830003D377CD24811160EA210000CDE181E1F1F133E93E13D3773E08D357DB573E0315
:2081A300D377C9DDE5DD210000DD394FDD5E04DD5605DD6E06DD66077BC6FF5F7ACEFF5735
:2081C3007DCEFF6F7CCEFF67B5B2B3280EE5C5D53E01CD2A80D1C1E19120DDDDE1C97BC6E5
:2081E300FF5F7ACEFF577DCEFF6F7CCEFF67B5B2B3C8E5D53E01CD2A80D1E1FE0228DFC943
:20820300E5D53E03CDF480FD210200FD39FD6E003E02CDDD803EE0CD118011204E210000D8
:20822300CDE1813E0BCD2A805F1600E133E9AFCD1180CD9781CD24813E01C90100180A202B
:20824300052F00000000009882A282A3820100FFFF20052F00000000009882A282B98201B7
:2082630000FFFF20052F00000000009882A282D9828100190A280B4F0000000000F782A2CF
:20828300820C830100160A24054F00000000001A83A28223830E204572726F722120000051
:2082A3000E0C014E6F20455350333220646574656374656421000E0C014F7574206F66208B
:2082C3006D656D6F7279202866696C6520746F6F2062696729000E0C01506C617962616356
:2082E3006B206572726F7220286261642066696C653F29000E20584D2F584D5A2F53334D2C
:2083030020506C6179657220000E0C01506C6179696E672E2E2E000E2041626F75742000EB
:208323000E0C01584D20506C617965722076312E3000DDE5DD210000DD3921ECFF39F93E76
:20834300A2CD1180111027210000CDE1813EE4CD1180111027210000CDE1813A06B83D280D
:208363000A3A06B8D6022808C378833E08C37A833E0CC37A833E05F533ED5B02B82A04B8CF
:20838300CD03822130B8733E01CD2A803208B83A08B83D2804AFC36385210C0039EB210233
:2083A300B8010400EDB0AFDD77FCDD77FDDD77FEDD77FFDD7EFBDDB6FADDB6F9DDB6F8CAA7
:2083C300D284DD7EF9D610DD7EFADE00DD7EFBDE00301121000039EB210C0039010400EDC5
:2083E300B0C3F683DD36EC00DD36ED10AFDD77EEDD77EF21050039EB21000039010400EDB5
:20840300B0DD7EF1C6FFDD7EF2CE01473E00CE005F3E00CE005748435ACB3BCB18CB19DDD8
:2084230071F779F5332100A8CD3D8B210000E5DD6EF1DD66F2E53E03CDF480DD6EFEDD6668
:20844300FFE5DD6EFCDD66FDE53E07CDF4803EE1CD1180210000E521D007E53E03CDA681AE
:20846300F1F1DD7EF7DD77F5DD36F6003A0260DD77F7DD6EF52600E5210002E5DD7EF7F5F2
:20848300332100A8CD3381DD5EF1DD56F2DD6EFCDD66FD19DD75FCDD74FDDD7EFEDD8EF318
:2084A300DD77FE3003DD34FFDD7EF8DD96F1DD77F8DD7EF9DD9EF2DD77F9DD7EFADD9EF350
:2084C300DD77FADD7EFBDD9EF4DD77FBC3B6833A06B83D203D3A30B86F3E0BCDDD802E0572
:2084E3003E02CDDD802A04B8E52A02B8E53E03CDF4803EF2CD1180111027210000CDE181D3
:208503003E01CD2A803208B83A08B83D2804AFC363853EA0CD1180114042210F00CDE181C5
:208523003E01CD2A803208B83A08B83D2804AFC363853A30B86F3E0BCDDD802E013E3ACD5B
:20854300DD803EA6CD1180111027210000CDE1813EA1CD1180111027210000CDE1813E01CD
:20856300DDF9DDE1C976CD0B8CB728F9C94F790DB7C876C37185218682CD948BCD688521AD
:208583008682CDF28BAFC30380213E82CD948BCD6885213E82CDF28BAFC30380215082CD2A
:2085A300948B3E32CD7085215082CDF28B3E02C30380216282CD948B3E32CD70852162827C
:2085C300CDF28B3E02C30380ED4B09B81E006B260009563E0B836F3EB8CE00677AB7280AF8
:2085E3007BD6203005721CC3D1853600C93E45F533210500E5210101E5111A86217482CDD9
:20860300AB8B210BB8CDFF8BD5210107E5110BB8217482CD5E8BC946696C653A00DDE5DD40
:20862300210000DD39EB014C86DD7E0407070707E60F6F2600097E1213DD7E04E60F6F26A8
:2086430000097E12DDE1E133E93031323334353637383941424344454600DDE5DD21000061
:20866300DD39F54D44E1D5C5116400DD6EFEDD66FFCD0E8BEB110A00CD598BC17BC630028F
:20868300696023E5C5110A00DD6EFEDD66FFCD0E8BEB110A00CD598BC1E17BC630770303EE
:2086A300C5110A00DD6EFEDD66FFCD598BC17BC63002DDF9DDE1C9DDE5DD210000DD39E54F
:2086C300210000E52E3CE5DD5E04DD5605DD6E06DD6607CDE6B8F1F1010000C50E64C5CD19
:2086E3005FB8F1F14BC5210000E52E3CE5DD5E04DD5605DD6E06DD6607CD5FB8F1F1C1512F
:20870300D52E0A7ACD098B7B2E0ACD528B7BD1C630E1E577C1C503C5D52E0A7ACD528B7B98
:20872300D1C1C63002E1E52323363AC1C5030303C5D52E0A7BCD098B7B2E0ACD528B7BD14A
:20874300C1C63002DD7EFEC6044FDD7EFFCE0047C52E0A7BCD528B7BC1C63002DDF9DDE192
:20876300E1F1F1E9210900E5210301E511BD87217482CD5E8B210700E521030CE511C7878E
:20878300217482CD5E8B210600E5210315E511CF87217482CD5E8B210500E5210501E51183
:2087A300D687217482CD5E8B210300E521050CE511DC87217482CD5E8BC9506174746572F2
:2087C3006E3A23002020526F773A2300202042504D3A0054696D653A00202F2000DDE5DDC6
:2087E300210000DD394B42EBDD7E07DDB606DDB605DDB6042830D5C5112200210000CD6921
:20880300B9F1F1DD4E06DD4607C5DD4E04DD4605C5CDE6B8F1F14B423E22BB3E009A300978
:20882300012200C32C88010000110000213CB8197B917A9830053E3DC340883E2D77136BA2
:20884300627DD6227CDE0038E3212200E5210601E5113CB8217482CD5E8BDDE1E1F1F1E958
:20886300DDE5DD210000DD3921F8FF39F93A30B86F3E0BCDDD803EA8CD118011D007210084
:2088830000CDE1813E28CD2A80DD77FF3A31B8D6212020DD7EFFD62020193EE4CD11801102
:2088A3001027210000CDE181217482CDF28B3E02CD0380DD7EFF3231B83E2BCD2A80DD7794
:2088C300FA3E2CCD2A80DD77FB3E02F53321010039EB3E31CDB1803E2DCD4380DD73FCDD2C
:2088E30072FDDD75FEDD74FF3A2FB8FD212CB8FDB602FDB601FDB600200C3E36CD4380ED0A
:20890300532CB8222EB8DD7EFAF5332132B8CD2086210200E521030AE51132B8217482CD20
:208923005E8BDD7EFBF5332132B8CD2086210200E5210313E51132B8217482CD5E8BD1D5BD
:208943002134B8CD5D86210300E521031BE51134B8217482CD5E8B210000E52144ACE5DD87
:208963005EFCDD56FDDD6EFEDD66FFCDE6B8F1E3D52137B8CDBA86210500E5210507E51180
:2089830037B8217482CD5E8B210000E52144ACE5ED5B2CB82A2EB8CDE6B8F1E3D52137B8BC
:2089A300CDBA86210500E521050FE51137B8217482CD5E8B2A2EB8E52A2CB8E5DD5EFCDDB9
:2089C30056FDDD6EFEDD66FFCDE087DDF9DDE1C93BCD0880CDCB853A5EB83C200DCD31823F
:2089E300B73E0120023E02325EB83A5EB83D280733C38C85C3DE8AAF322CB8322DB8322EAA
:208A0300B8322FB8CD3583B720123A08B8D699200733C39F85C3DE8A33C3B585217482CD2B
:208A2300948BCDF085CD67872131B83621CD6388FD210000FD39FD36000076FD210000FDE6
:208A430039FD3400FD7E00D60A3807FD360000CD6388CDA18BB728273EA2CD11801110279F
:208A6300210000CDE1813EE4CD1180111027210000CDE181217482CDF28B3E02CD0380CDCD
:208A8300158CB728273EA2CD1180111027210000CDE1813EE4CD1180111027210000CDE1BF
:208AA30081217482CDF28B3E04CD0380CD0B8CB728883EA2CD1180111027210000CDE1819E
:208AC3003EE4CD1180111027210000CDE181217482CDF28BAFCD0380C33D8A33C9ED730035
:208AE300B83207B8ED4309B8083206B82202B8ED5304B83A07B8B7CAD3893A07B8D603CA97
:068B03007985AFC3038079
:01BA4C00FFFA
:03800000C3E08A50
:208B09005D6F2600547BE680B220110610ED6A17933001833FED6A10F65FEBC906097D6CD0
:208B29002600CB1DED6AED523001193F1710F5CB10505FC9DDE5DD210000DD39DD46043E55
:208B490030CD0660DDE1E133E95D6FCD0B8BEBC9CD0E8BEBC9DDE5E5D5DD210000DD39DD84
:208B6900460BDD4E0ADD5608DD5E09DD6E00DD6601D9DD6E02DD6603E5DDE1D93E03CD065C
:188B890060D1E1DDE1E133333333E9DDE5E5DDE13E01CD0660DDE1C910
:20B85F00DDE5DD210000DD39010000DD7E07073838DDCB0426DDCB0516DDCB0616DDCB0711
:20B87F00167BDD96047ADD9E057DDD9E067CDD9E073012DDCB073EDDCB061EDDCB051EDD08
:20B89F00CB041E1804044818C27BDD96047ADD9E057DDD9E067CDD9E0738147BDD96045FD5
:20B8BF007ADD9E05577DDD9E066F7CDD9E0767DDCB073EDDCB061EDDCB051EDDCB041E797F
:20B8DF000DB720C5DDE1C9DDE5DD210000DD39F5F5AFDD77FCDD77FDDD77FEDD77FF06203E
:20B8FF007C07E6014FCB23CB12ED6ADDCBFC26DDCBFD16DDCBFE16DDCBFF16CB412804DD3B
:20B91F00CBFCC6DD7EFCDD9604DD7EFDDD9E05DD7EFEDD9E06DD7EFFDD9E073826DD7EFC6A
:20B93F00DD9604DD77FCDD7EFDDD9E05DD77FDDD7EFEDD9E06DD77FEDD7EFFDD9E07DD779C
:0AB95F00FFCBC3109BDDF9DDE1C949
:208BA100DDE53E1ACD0660DDE1C9DDE5E5D5DD210000DD39DD460BDD4E0ADD5608DD5E096E
:208BC100DD6E00DD6601D9DD6E02DD6603DD7E0CF5E5DDE1D93E03CD0660F108D9E5DDE1D8
:208BE100D93E04CD0660D1E1DDE1E13333333333E9DDE5E5DDE13E02CD0660DDE1C9AF4798
:1E8C01004FEDB121FFFFED42EBC9DDE53E17CD0660DDE1C9DDE53E19CD0660DDE1C9C2
:20B96900DDE5DD210000DD39F5F5F5DD73FCDD72FDDD75FEDD74FF4D44DD5E04DD56056960
:20B9890060CD1F8C4B42DD71FEDD70FFDD7E06DD77FADD7E07DD77FBE1D1D5E5C5DD6EFACB
:20B9A900DD66FBCD1F8CEBC1094D44DD71FEDD70FFDD5EFDDD6605C52E00550608293001BA
:20B9C9001910FAC109DD75FEDD74FFDD5E04DD66FD2E005506082930011910FA4D44DD5E78
:20B9E900FCDD6605C52E005506082930011910FAC1DD7505DD740609DD7505DD7406AFED65
:20BA0900423E0017DD7707DD5EFCDD66042E005506082930011910FADD75FCDD74FDDD36F0
:20BA29000400DD7EFCDD86045FDD7EFDDD8E0557DD7EFEDD8E066FDD7EFFDD8E0767DDF97B
:03BA4900DDE1C973
:178C1F004D44AF6FB00610200406087929CB111730011910F7EBC9FD
:20800300ED7B00B8C94F3E13D3773E01D357AFD357DB5779D357AFD3573E03D377C94F3EB9
:2080230013D3773E02D35779D357DB57DB57DB574F3E03D37779C9DDE5DD210000DD39F556
:20804300F54F3E13D3773E02D35779D357DB57DB57DB574FDB575759DB57DD77FCAFDD77E5
:20806300FDDD77FEDD77FFDD7EFCDD77FEAFDD77FFDD77FCDD77FDDD6EFEDB57DD77FCAF95
:20808300DD77FDDD77FEDD77FFDD7EFCDD77FFAFDD77FCDD77FDDD77FEDD66FF3E03D377CE
:2080A300DDF9DDE1C94F3E13D3773E02D35779D357DB57DB57FD210200FD39FD4E00790DDE
:2080C300B72807DB571213C3C1803E03D377E133E9474D3E13D3773E01D35778D357DB5768
:2080E30079D3573E03D377C94F3E13D3773E01D35779D357DB57FD210200FD39FD7E00D3BA
:2081030057FD7E01D357FD7E02D357FD7E03D3573E03D377E1F1F1E93E13D3773E07D357CF
:20812300DB573E03D377C97D01AF1AED797C01AF1BED79FD210200FD39FD7E0001AF1CEDD2
:2081430079FD7E01FD4E02FD23CB39CB1F3D01AF26ED79FD7E023D01AF28ED793E13D377C0
:208163003E03D357DB57DB573E8201AF27ED793E27DBAF0738F93E03D377CD1B8121640090
:20818300CDE881E1F1F133E93E13D3773E08D357DB573E03D377C9DDE5DD210000DD39213F
:2081A300FBFF39F9DD77FFDD73FDDD72FE2109607EDD77FB237EDD77FC2A09607DDD96FBDD
:2081C3004F7CDD9EFC4779DD96FD78DD9EFE300F3E01CD2180DD96FF20DF3E01C3E381AFC7
:2081E300DDF9DDE1C9DDE5DD210000DD39F5F5DD75FEDD74FF2109607EDD77FC237EDD7772
:20820300FD2A09607DDD96FC4F7CDD9EFD4779DD96FE78DD9EFF300E3E01CD2180FE022866
:20822300E03E01C32A82AFDDF9DDE1C9E5D53E03CDEB80FD210200FD39FD6E003E02CDD4CC
:20824300803EE0CD0880216400CDE8813E0BCD21805F1600E133E9AFCD0880CD8B81CD1B7F
:20826300813E01C98100190A280C7000000000008B82A582A5820100160A24054F00000036
:208283000000A682A582AF820E20584D2F584D5A2F53334D20506C617965722076302E31A6
:2082A3002000000E2041626F757420000E0C01584D20506C617965722076302E3100DDE51E
:2082C300DD210000DD3921ECFF39F93EA2CD0880216400CDE8813EE4CD0880216400CDE8A8
:2082E300813A06B83D280A3A06B8D6022808C3FE823E08C300833E0CC300833E05F533EDDC
:208303005B02B82A04B8CD2F822130B8733E01CD21803208B83A08B83D2804AFC3E8842164
:208323000C0039EB2102B8010400EDB0AFDD77FCDD77FDDD77FEDD77FFDD7EFBDDB6FADDD8
:20834300B6F9DDB6F8CA5184DD7EF9D610DD7EFADE00DD7EFBDE00301121000039EB210CED
:208363000039010400EDB0C37C83DD36EC00DD36ED10AFDD77EEDD77EF21050039EB2100AF
:208383000039010400EDB0DD7EF1C6FFDD7EF2CE01473E00CE005F3E00CE005748435ACB0D
:2083A3003BCB18CB19DD71F779F5332100A8CD0E8D210000E5DD6EF1DD66F2E53E03CDEB4C
:2083C30080DD6EFEDD66FFE5DD6EFCDD66FDE53E07CDEB803EE1CD08801164003E03CD9A30
:2083E30081DD7EF7DD77F5DD36F6003A0260DD77F7DD6EF52600E5210002E5DD7EF7F533A1
:208403002100A8CD2A81DD5EF1DD56F2DD6EFCDD66FD19DD75FCDD74FDDD7EFEDD8EF3DDF7
:2084230077FE3003DD34FFDD7EF8DD96F1DD77F8DD7EF9DD9EF2DD77F9DD7EFADD9EF3DDD0
:2084430077FADD7EFBDD9EF4DD77FBC33C833A06B83D203A3A30B86F3E0BCDD4802E053E17
:2084630002CDD4802A04B8E52A02B8E53E03CDEB803EF2CD088021FA00CDE8813E01CD21C6
:20848300803208B83A08B83D2804AFC3E8843EA0CD0880219001CDE8813E01CD2180320824
:2084A300B83A08B83D2804AFC3E8843A30B86F3E0BCDD4802E013E3ACDD4803EA6CD0880C4
:2084C300216400CDE8813EA1CD0880216400CDE8813E01CD21803208B83A08B83D2804AF3E
:2084E300C3E8843E01DDF9DDE1C976CD108EB728F9C94F790DB7C876C3F684217982CD65D7
:208503008DCDED84217982CDF78DAFC303803BFD210000FD39FD77003EA2CD08802164006E
:20852300CDE8813EE4CD0880216400CDE881216782CDF78D210000397E33C3038033C92107
:208543006782CDF78DAFC3038076CD818DB728053E02CD1185CD1A8EB728053E04CD118513
:20856300CD108EB728E3AFCD1185C34C853A8EB8F533218885CD1987CDED84216782CDF7D6
:208583008DAFC303804E6F20455350333220666F756E64003E01CD728DFE023E01C8AFC966
:2085A3003A08B8F53321C785CD1987CD9785B72803CD4C853E32CDF584216782CDF78D3E04
:2085C30002C3038046696C6520746F6F206C61726765003A08B8F53321FA85CD1987CD97A0
:2085E30085B72803CD4C853E32CDF584216782CDF78D3E02C30380506C61796261636B2095
:208603006572726F7200ED4B09B81E006B260009563E0B836F3EB8CE00677AB7280A7BD60C
:20862300203005721CC30F863600C9210500E5210201E5117A86216782CD2F8D210BB8CD94
:20864300048E3E71F533D5210207E5110BB8216782CDB08D210700E5210301E51180862193
:208663006782CD2F8D212400E5210A02E5118886216782CD2F8DC946696C653A00537461EC
:208683007475733A00506755702F5067446E3A547261636B204573633A53746F7020537000
:2086A3006163653A4C6561766500DDE5DD210000DD39F51E007B854F3E008C470A4FB728E6
:2086C3001F7BD618301A3E3283DD77FE3EB8CE00DD77FFE5DD6EFEDD66FF71E11CC3B8868A
:2086E3007BD618300C2132B81600191C3620C3E386216782DD7E04F533111800D51103094E
:20870300D51132B8CDB08DDDF9DDE1E133E93E71F533CDAD86C9DDE5DD210000DD393BEB4F
:208723000E0069260019463E4A816F3EB8CE0067793CDD77FF78B7280C79D611300770DD48
:208743004EFFC32587DD4EFF3620690C2600114AB8193628690C2600114AB8193630690C13
:208763002600114AB8193678690C2600114AB819DD7E0407070707E60FC6C05F3E00CE8747
:20878300571A77690C2600114AB819DD7E04E60FC6C05F3E00CE87571A77690C2600114A7D
:2087A300B8193629692600114AB81936003E72F533214AB8CDAD8633DDE1E133E930313219
:2087C3003334353637383941424344454600DDE5DD210000DD39EB01FD87DD7E04070707CD
:2087E30007E60F6F2600097E1213DD7E04E60F6F2600097E12DDE1E133E9303132333435CD
:208803003637383941424344454600DDE5DD210000DD39F54D44E1D5C5116400DD6EFEDD70
:2088230066FFCDD58CEB110A00CD2A8DC17BC63002696023E5C5110A00DD6EFEDD66FFCDDB
:20884300D58CEB110A00CD2A8DC1E17BC630770303C5110A00DD6EFEDD66FFCD2A8DC17B6F
:20886300C63002DDF9DDE1C9DDE5DD210000DD39E5210000E52E3CE5DD5E04DD5605DD6ECE
:2088830006DD6607CD16B9F1F1010000C50E64C5CD8FB8F1F14BC5210000E52E3CE5DD5E74
:2088A30004DD5605DD6E06DD6607CD8FB8F1F1C151D52E0A7ACDD08C7B2E0ACD238D7BD1AA
:2088C300C630E1E577C1C503C5D52E0A7ACD238D7BD1C1C63002E1E52323363AC1C5030303
:2088E30003C5D52E0A7BCDD08C7B2E0ACD238D7BD1C1C63002DD7EFEC6044FDD7EFFCE002D
:2089030047C52E0A7BCD238D7BC1C63002DDF9DDE1E1F1F1E9210900E5210401E511B78939
:20892300216782CD2F8D210700E521040CE511C189216782CD2F8D210600E5210415E51154
:20894300C989216782CD2F8D210500E5210601E511D089216782CD2F8D210300E521060CDE
:20896300E511D689216782CD2F8D116CB80E006926001936200C79D62038F4212000E521DD
:208983000804E5216782CD2F8D210804E5216782CD8B8D7AE63F57CBFBED538CB80E002AD7
:2089A3008CB85D7CC6C0576926001936070C79D62038ECC95061747465726E3A23002020F2
:2089C300526F773A2300202042504D3A0054696D653A00202F2000DDE5DD210000DD394B4D
:2089E30042EBDD7E07DDB606DDB605DDB604283069603E0529CB13CB123D20F8DD4E06DD72
:208A03004607C5DD4E04DD4605C5EBCD16B9F1F14B423E20BB3E009A3009012000C3268A71
:208A23000100001100002A8CB87CC6C067197B917A9830053E40C33E8A3E0777136B627DBC
:208A4300D6207CDE0038DFDDE1E1F1F1E9DDE5DD210000DD3921F8FF39F93A30B86F3E0B48
:208A6300CDD4803EA8CD0880213200CDE8813E28CD2180DD77FF3A31B8D621201DDD7EFF36
:208A8300D62020163EE4CD0880216400CDE881216782CDF78D3E02CD0380DD7EFF3231B815
:208AA3003E2BCD2180DD77FA3E2CCD2180DD77FB3E02F53321010039EB3E31CDA8803E2DEA
:208AC300CD3A80DD73FCDD72FDDD75FEDD74FF3A2FB8FD212CB8FDB602FDB601FDB6002075
:208AE3000C3E36CD3A80ED532CB8222EB8DD7EFAF5332162B8CDD1873E71F533210200E584
:208B030021040AE51162B8216782CDB08DDD7EFBF5332162B8CDD1873E71F533210200E542
:208B2300210413E51162B8216782CDB08DD1D52164B8CD0E883E71F533210300E521041B70
:208B4300E51164B8216782CDB08D210000E52144ACE5DD5EFCDD56FDDD6EFEDD66FFCD161B
:208B6300B9F1E3D52167B8CD6B883E71F533210500E5210607E51167B8216782CDB08D2136
:208B83000000E52144ACE5ED5B2CB82A2EB8CD16B9F1E3D52167B8CD6B883E71F533210579
:208BA30000E521060FE51167B8216782CDB08D2A2EB8E52A2CB8E5DD5EFCDD56FDDD6EFED6
:208BC300DD66FFCDDA89DDF9DDE1C93BCD0986216782CD658DCD2E8621878CCD11873A8E81
:208BE300B83C200DCD5A82B73E0120023E02328EB83A8EB83D280733C37085C3858CAF324C
:208C03002CB8322DB8322EB8322FB8CDC182B720123A08B8D699200733C3A385C3858C3377
:208C2300C3D685219F8CCD1187CD18892131B83621CD508AFD210000FD39FD36000076FDF2
:208C4300210000FD39FD3400FD7E00D60A3807FD360000CD508ACD818DB728053E02CD1138
:208C630085CD1A8EB728053E04CD1185CD108EB72804AFCD1185CD048DB728C2CD4285C3B8
:208C8300418C33C94C6F6164696E672C20706C6561736520776169742E2E2E00506C61798F
:208CA300696E6700ED7300B83207B8ED4309B8083206B82202B8ED5304B83A07B8B7CACE61
:0D8CC3008B3A07B8D603CAFE84AFC3038006
:01B99900FFAE
:03800000C3A78C87
:208CD0005D6F2600547BE680B220110610ED6A17933001833FED6A10F65FEBC906097D6C08
:208CF0002600CB1DED6AED523001193F1710F5CB10505FC9DDE53E10CD0660DDE1C9DDE53C
:208D1000DD210000DD39DD46043E30CD0660DDE1E133E95D6FCDD28CEBC9CDD58CEBC9DD42
:208D3000E5E5D5DD210000DD39DD460BDD4E0ADD5608DD5E09DD6E00DD6601D9DD6E02DDFC
:208D50006603E5DDE1D93E03CD0660D1E1DDE1E133333333E9DDE5E5DDE13E01CD0660DDF0
:118D7000E1C908DDE53E53CD066020023EFFDDE1C9D4
:20B88F00DDE5DD210000DD39010000DD7E07073838DDCB0426DDCB0516DDCB0616DDCB07E1
:20B8AF00167BDD96047ADD9E057DDD9E067CDD9E073012DDCB073EDDCB061EDDCB051EDDD8
:20B8CF00CB041E1804044818C27BDD96047ADD9E057DDD9E067CDD9E0738147BDD96045FA5
:20B8EF007ADD9E05577DDD9E066F7CDD9E0767DDCB073EDDCB061EDDCB051EDDCB041E794F
:20B90F000DB720C5DDE1C9DDE5DD210000DD39F5F5AFDD77FCDD77FDDD77FEDD77FF06200D
:20B92F007C07E6014FCB23CB12ED6ADDCBFC26DDCBFD16DDCBFE16DDCBFF16CB412804DD0A
:20B94F00CBFCC6DD7EFCDD9604DD7EFDDD9E05DD7EFEDD9E06DD7EFFDD9E073826DD7EFC3A
:20B96F00DD9604DD77FCDD7EFDDD9E05DD77FDDD7EFEDD9E06DD77FEDD7EFFDD9E07DD776C
:0AB98F00FFCBC3109BDDF9DDE1C919
:208D8100DDE53E1ACD0660DDE1C9DDE5E5DD210000DD39DD5606DD5E07DD6E00DD6601E554
:208DA100DDE13E05CD0660EBE1DDE1E13333E9DDE5E5D5DD210000DD39DD460BDD4E0ADDF4
:208DC1005608DD5E09DD6E00DD6601D9DD6E02DD6603DD7E0CF5E5DDE1D93E03CD0660F1B8
:208DE10008D9E5DDE1D93E04CD0660D1E1DDE1E13333333333E9DDE5E5DDE13E02CD06608F
:208E0100DDE1C9AF474FEDB121FFFFED42EBC9DDE53E17CD0660DDE1C9DDE53E19CD0660C8
:038E2100DDE1C9C7
:00000001FF
+2348 -2011
View File
File diff suppressed because it is too large Load Diff
+84 -78
View File
@@ -7,7 +7,7 @@ Area Addr Size Decimal Bytes (A
Value Global Global Defined In Module
----- -------------------------------- ------------------------
00000000 .__.ABS. mul
00000000 .__.ABS. wc_key_pgup
00000000 l__BSEG
00000000 l__BSS
00000000 l__CABS
@@ -23,98 +23,103 @@ Area Addr Size Decimal Bytes (A
00000001 l__INITIALIZED
00000001 l__INITIALIZER
00000003 l__HEADER0
000001ED l__HOME
00000C33 l__CODE
0000105E l__DATA
0000010A l__HOME
00000E21 l__CODE
0000108E l__DATA
00008003 s__CODE
0000A800 s__DATA
0000B85E s__INITIALIZED
0000B85F s__HOME
0000BA4C s__GSFINAL
0000BA4C s__GSINIT
0000BA4C s__INITIALIZER
0000BA4D s__BSEG
0000BA4D s__BSS
0000BA4D s__HEAP
0000B88E s__INITIALIZED
0000B88F s__HOME
0000B999 s__GSFINAL
0000B999 s__GSINIT
0000B999 s__INITIALIZER
0000B99A s__BSEG
0000B99A s__BSS
0000B99A s__HEAP
ASxxxx Linker V05.50.4-SDLD, page 2.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_CODE 00008003 00000C33 = 3123. bytes (REL,CON)
_CODE 00008003 00000E21 = 3617. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
00008003 _wc_exit main
00008008 _wc_set_freq_14mhz main
00008011 _esp_cmd main
0000802A _esp_rd_reg8 main
00008043 _esp_rd_reg32 main
000080B1 _esp_rd_regs main
000080DD _esp_wr_reg8 main
000080F4 _esp_wr_reg32 main
00008124 _esp_wr_end main
00008133 _esp_send_dma main
00008197 _esp_rd_end main
000081A6 _esp_wait_status main
000081E1 _esp_wait_busy main
00008203 _esp_create_obj main
00008231 _esp_init main
0000823E _err_no_esp main
00008250 _err_out_of_mem main
00008262 _err_playback main
00008274 _win_xm main
00008286 _win_about main
00008335 _play_xm main
00008568 _wait_esc_key main
00008570 _wait_frames main
00008579 _about main
0000858C _error_esp main
0000859F _error_oom main
000085B5 _error_playback main
000085CB _copy_file_name main
000085F0 _xm_draw_static_labels main
00008620 _put_hex2 main
0000865D _put_dec3 main
000086BA _put_time main
00008767 _xm_draw_stats_labels main
000087E0 _draw_progress_bar main
00008863 _xm_update_info main
000089D3 _main_start main
00008AE0 _main main
00008B09 __divuchar divunsigned
00008B0B __divu8 divunsigned
00008B0E __divu16 divunsigned
00008B0E __divuint divunsigned
00008B3D _wc_load512 wc_load512
00008B52 __moduchar modunsigned
00008B59 __moduint modunsigned
00008B5E _wc_prsrw wc_prsrw
00008B94 _wc_prwow wc_prwow
00008BA1 _wc_key_pgdn wc_key_pgdn
00008BAB _wc_prsrw_attr wc_prsrw_attr
00008BF2 _wc_rresb wc_rresb
00008BFF _strlen strlen
00008008 _esp_cmd main
00008021 _esp_rd_reg8 main
0000803A _esp_rd_reg32 main
000080A8 _esp_rd_regs main
000080D4 _esp_wr_reg8 main
000080EB _esp_wr_reg32 main
0000811B _esp_wr_end main
0000812A _esp_send_dma main
0000818B _esp_rd_end main
0000819A _esp_wait_status main
000081E8 _esp_wait_busy main
0000822F _esp_create_obj main
0000825A _esp_init main
00008267 _win_xm main
00008279 _win_about main
000082C1 _play_xm main
000084ED _wait_esc_key main
000084F5 _wait_frames main
000084FE _about main
00008511 _unload_and_exit main
00008542 _leave_playing_and_exit main
0000854C _wait_for_manual_exit main
00008570 _error_esp main
00008597 _stop_on_error main
000085A3 _error_oom main
000085D6 _error_playback main
00008609 _copy_file_name main
0000862E _xm_draw_static_labels main
000086AD _xm_set_status_attr main
00008711 _xm_set_status main
00008719 _xm_set_status_code main
000087D1 _put_hex2 main
0000880E _put_dec3 main
0000886B _put_time main
00008918 _xm_draw_stats_labels main
000089DA _draw_progress_bar main
00008A50 _xm_update_info main
00008BCE _main_start main
00008CA7 _main main
00008CD0 __divuchar divunsigned
00008CD2 __divu8 divunsigned
00008CD5 __divu16 divunsigned
00008CD5 __divuint divunsigned
00008D04 _wc_key_space wc_key_space
00008D0E _wc_load512 wc_load512
00008D23 __moduchar modunsigned
00008D2A __moduint modunsigned
00008D2F _wc_prsrw wc_prsrw
00008D65 _wc_prwow wc_prwow
ASxxxx Linker V05.50.4-SDLD, page 3.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_CODE 00008003 00000C33 = 3123. bytes (REL,CON)
_CODE 00008003 00000E21 = 3617. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
00008C0B _wc_key_esc wc_key_esc
00008C15 _wc_key_pgup wc_key_pgup
00008C1F __mulint mul
00008C21 __mul16 mul
00008D72 _wc_prm_pl wc_prm_pl
00008D81 _wc_key_pgdn wc_key_pgdn
00008D8B _wc_gadrw wc_gadrw
00008DB0 _wc_prsrw_attr wc_prsrw_attr
00008DF7 _wc_rresb wc_rresb
00008E04 _strlen strlen
00008E10 _wc_key_esc wc_key_esc
00008E1A _wc_key_pgup wc_key_pgup
ASxxxx Linker V05.50.4-SDLD, page 4.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_DATA 0000A800 0000105E = 4190. bytes (REL,CON)
_DATA 0000A800 0000108E = 4238. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
@@ -129,36 +134,36 @@ _DATA 0000A800 0000105E = 4190. bytes (R
0000B82C _total_samples main
0000B830 _xm_handle main
0000B831 _last_track_status main
0000B88C _bar_attr_ofs main
ASxxxx Linker V05.50.4-SDLD, page 5.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_INITIALIZED 0000B85E 00000001 = 1. bytes (REL,CON)
_INITIALIZED 0000B88E 00000001 = 1. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
0000B85E _state_esp main
0000B88E _state_esp main
ASxxxx Linker V05.50.4-SDLD, page 6.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_HOME 0000B85F 000001ED = 493. bytes (REL,CON)
_HOME 0000B88F 0000010A = 266. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
0000B85F __modulong _modulong
0000B8E6 __divulong _divulong
0000B969 __mullong _mullong
0000B88F __modulong _modulong
0000B916 __divulong _divulong
ASxxxx Linker V05.50.4-SDLD, page 7.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
_INITIALIZER 0000BA4C 00000001 = 1. bytes (REL,CON)
_INITIALIZER 0000B999 00000001 = 1. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
@@ -182,20 +187,21 @@ obj/crt0.rel [ crt0 ]
Libraries Linked [ object file ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ divunsigned.rel ]
vgm_wc_api.lib [ wc_key_space.rel ]
vgm_wc_api.lib [ wc_load512.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ modunsigned.rel ]
vgm_wc_api.lib [ wc_prsrw.rel ]
vgm_wc_api.lib [ wc_prwow.rel ]
vgm_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 [ _divulong.rel ]
vgm_wc_api.lib [ wc_key_pgdn.rel ]
vgm_wc_api.lib [ wc_gadrw.rel ]
vgm_wc_api.lib [ wc_prsrw_attr.rel ]
vgm_wc_api.lib [ wc_rresb.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ strlen.rel ]
vgm_wc_api.lib [ wc_key_esc.rel ]
vgm_wc_api.lib [ wc_key_pgup.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ _mullong.rel ]
E:\SDCC\4.6.0\bin\..\lib\z80/z80.lib [ mul.rel ]
ASxxxx Linker V05.50.4-SDLD, page 10.
+72 -68
View File
@@ -14,73 +14,77 @@ DEF s__HEADER0 0x0
DEF l__INITIALIZED 0x1
DEF l__INITIALIZER 0x1
DEF l__HEADER0 0x3
DEF l__HOME 0x1ED
DEF l__CODE 0xC33
DEF l__DATA 0x105E
DEF l__HOME 0x10A
DEF l__CODE 0xE21
DEF l__DATA 0x108E
DEF s__CODE 0x8003
DEF s__DATA 0xA800
DEF s__INITIALIZED 0xB85E
DEF s__HOME 0xB85F
DEF s__GSFINAL 0xBA4C
DEF s__GSINIT 0xBA4C
DEF s__INITIALIZER 0xBA4C
DEF s__BSEG 0xBA4D
DEF s__BSS 0xBA4D
DEF s__HEAP 0xBA4D
DEF s__INITIALIZED 0xB88E
DEF s__HOME 0xB88F
DEF s__GSFINAL 0xB999
DEF s__GSINIT 0xB999
DEF s__INITIALIZER 0xB999
DEF s__BSEG 0xB99A
DEF s__BSS 0xB99A
DEF s__HEAP 0xB99A
DEF _wc_exit 0x8003
DEF _wc_set_freq_14mhz 0x8008
DEF _esp_cmd 0x8011
DEF _esp_rd_reg8 0x802A
DEF _esp_rd_reg32 0x8043
DEF _esp_rd_regs 0x80B1
DEF _esp_wr_reg8 0x80DD
DEF _esp_wr_reg32 0x80F4
DEF _esp_wr_end 0x8124
DEF _esp_send_dma 0x8133
DEF _esp_rd_end 0x8197
DEF _esp_wait_status 0x81A6
DEF _esp_wait_busy 0x81E1
DEF _esp_create_obj 0x8203
DEF _esp_init 0x8231
DEF _err_no_esp 0x823E
DEF _err_out_of_mem 0x8250
DEF _err_playback 0x8262
DEF _win_xm 0x8274
DEF _win_about 0x8286
DEF _play_xm 0x8335
DEF _wait_esc_key 0x8568
DEF _wait_frames 0x8570
DEF _about 0x8579
DEF _error_esp 0x858C
DEF _error_oom 0x859F
DEF _error_playback 0x85B5
DEF _copy_file_name 0x85CB
DEF _xm_draw_static_labels 0x85F0
DEF _put_hex2 0x8620
DEF _put_dec3 0x865D
DEF _put_time 0x86BA
DEF _xm_draw_stats_labels 0x8767
DEF _draw_progress_bar 0x87E0
DEF _xm_update_info 0x8863
DEF _main_start 0x89D3
DEF _main 0x8AE0
DEF __divuchar 0x8B09
DEF __divu8 0x8B0B
DEF __divu16 0x8B0E
DEF __divuint 0x8B0E
DEF _wc_load512 0x8B3D
DEF __moduchar 0x8B52
DEF __moduint 0x8B59
DEF _wc_prsrw 0x8B5E
DEF _wc_prwow 0x8B94
DEF _wc_key_pgdn 0x8BA1
DEF _wc_prsrw_attr 0x8BAB
DEF _wc_rresb 0x8BF2
DEF _strlen 0x8BFF
DEF _wc_key_esc 0x8C0B
DEF _wc_key_pgup 0x8C15
DEF __mulint 0x8C1F
DEF __mul16 0x8C21
DEF _esp_cmd 0x8008
DEF _esp_rd_reg8 0x8021
DEF _esp_rd_reg32 0x803A
DEF _esp_rd_regs 0x80A8
DEF _esp_wr_reg8 0x80D4
DEF _esp_wr_reg32 0x80EB
DEF _esp_wr_end 0x811B
DEF _esp_send_dma 0x812A
DEF _esp_rd_end 0x818B
DEF _esp_wait_status 0x819A
DEF _esp_wait_busy 0x81E8
DEF _esp_create_obj 0x822F
DEF _esp_init 0x825A
DEF _win_xm 0x8267
DEF _win_about 0x8279
DEF _play_xm 0x82C1
DEF _wait_esc_key 0x84ED
DEF _wait_frames 0x84F5
DEF _about 0x84FE
DEF _unload_and_exit 0x8511
DEF _leave_playing_and_exit 0x8542
DEF _wait_for_manual_exit 0x854C
DEF _error_esp 0x8570
DEF _stop_on_error 0x8597
DEF _error_oom 0x85A3
DEF _error_playback 0x85D6
DEF _copy_file_name 0x8609
DEF _xm_draw_static_labels 0x862E
DEF _xm_set_status_attr 0x86AD
DEF _xm_set_status 0x8711
DEF _xm_set_status_code 0x8719
DEF _put_hex2 0x87D1
DEF _put_dec3 0x880E
DEF _put_time 0x886B
DEF _xm_draw_stats_labels 0x8918
DEF _draw_progress_bar 0x89DA
DEF _xm_update_info 0x8A50
DEF _main_start 0x8BCE
DEF _main 0x8CA7
DEF __divuchar 0x8CD0
DEF __divu8 0x8CD2
DEF __divu16 0x8CD5
DEF __divuint 0x8CD5
DEF _wc_key_space 0x8D04
DEF _wc_load512 0x8D0E
DEF __moduchar 0x8D23
DEF __moduint 0x8D2A
DEF _wc_prsrw 0x8D2F
DEF _wc_prwow 0x8D65
DEF _wc_prm_pl 0x8D72
DEF _wc_key_pgdn 0x8D81
DEF _wc_gadrw 0x8D8B
DEF _wc_prsrw_attr 0x8DB0
DEF _wc_rresb 0x8DF7
DEF _strlen 0x8E04
DEF _wc_key_esc 0x8E10
DEF _wc_key_pgup 0x8E1A
DEF _fs_buf 0xA800
DEF _ret_sp 0xB800
DEF _filesize 0xB802
@@ -92,8 +96,8 @@ DEF _file_name 0xB80B
DEF _total_samples 0xB82C
DEF _xm_handle 0xB830
DEF _last_track_status 0xB831
DEF _state_esp 0xB85E
DEF __modulong 0xB85F
DEF __divulong 0xB8E6
DEF __mullong 0xB969
DEF _bar_attr_ofs 0xB88C
DEF _state_esp 0xB88E
DEF __modulong 0xB88F
DEF __divulong 0xB916
LOAD obj/out.ihx
+819 -639
View File
File diff suppressed because it is too large Load Diff
+71 -59
View File
@@ -63,105 +63,117 @@ Hexadecimal [32-Bits]
Symbol Table
0 ___str_11 000007BA R
0 ___str_12 000007C4 R
0 ___str_13 000007CC R
0 ___str_14 000007D3 R
0 ___str_15 000007D9 R
0 ___str_9 00000617 R
0 ___str_12 000009B4 R
0 ___str_13 000009BE R
0 ___str_14 000009C6 R
0 ___str_15 000009CD R
0 ___str_16 000009D3 R
0 ___str_17 00000C84 R
0 ___str_18 00000C9C R
0 ___str_4 00000585 R
0 ___str_5 000005C4 R
0 ___str_6 000005F7 R
0 ___str_7 00000677 R
0 ___str_8 0000067D R
0 ___str_9 00000685 R
__divuchar ******** GX
__divuint ******** GX
__divulong ******** GX
__moduchar ******** GX
__moduint ******** GX
__modulong ******** GX
__mullong ******** GX
0 __str_0 00000295 R
0 __str_1 0000029F R
0 __str_2 000002A0 R
0 __str_3 000002B6 R
0 __str_4 000002D6 R
0 __str_5 000002F4 R
0 __str_6 00000309 R
0 __str_7 00000317 R
0 __str_8 00000320 R
0 __str_0 00000288 R
0 __str_1 000002A2 R
0 __str_2 000002A3 R
0 __str_3 000002AC R
7 __xinit__state_esp 00000000 R
0 _about 00000576 GR
1 _barbuf 0000103C R
0 _about 000004FB GR
1 _bar_attr_ofs 0000108C GR
1 _barbuf 0000106C R
1 _call_type 00001007 GR
0 _copy_file_name 000005C8 GR
1 _decbuf 00001034 R
0 _draw_progress_bar 000007DD GR
0 _err_no_esp 0000023B GR
0 _err_out_of_mem 0000024D GR
0 _err_playback 0000025F GR
0 _error_esp 00000589 GR
0 _error_oom 0000059C GR
0 _error_playback 000005B2 GR
0 _esp_cmd 0000000E GR
0 _esp_create_obj 00000200 GR
0 _esp_init 0000022E GR
0 _esp_rd_end 00000194 GR
0 _esp_rd_reg32 00000040 GR
0 _esp_rd_reg8 00000027 GR
0 _esp_rd_regs 000000AE GR
0 _esp_send_dma 00000130 GR
0 _esp_wait_busy 000001DE GR
0 _esp_wait_status 000001A3 GR
0 _esp_wr_end 00000121 GR
0 _esp_wr_reg32 000000F1 GR
0 _esp_wr_reg8 000000DA GR
0 _copy_file_name 00000606 GR
1 _decbuf 00001064 R
0 _draw_progress_bar 000009D7 GR
0 _error_esp 0000056D GR
0 _error_oom 000005A0 GR
0 _error_playback 000005D3 GR
0 _esp_cmd 00000005 GR
0 _esp_create_obj 0000022C GR
0 _esp_init 00000257 GR
0 _esp_rd_end 00000188 GR
0 _esp_rd_reg32 00000037 GR
0 _esp_rd_reg8 0000001E GR
0 _esp_rd_regs 000000A5 GR
0 _esp_send_dma 00000127 GR
0 _esp_wait_busy 000001E5 GR
0 _esp_wait_status 00000197 GR
0 _esp_wr_end 00000118 GR
0 _esp_wr_reg32 000000E8 GR
0 _esp_wr_reg8 000000D1 GR
1 _file_ext 00001006 GR
1 _file_name 0000100B GR
1 _filesize 00001002 GR
1 _fs_buf 00000000 GR
1 _hexbuf 00001032 R
1 _hexbuf 00001062 R
1 _last_esp_status 00001008 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
Hexadecimal [32-Bits]
Symbol Table
0 _main 00000ADD GR
0 _main_start 000009D0 GR
0 _main 00000CA4 GR
0 _main_start 00000BCB GR
1 _p_file_name 00001009 GR
0 _play_xm 00000332 GR
0 _put_dec3 0000065A GR
0 _put_hex2 0000061D GR
0 _put_hex2_hexch_10000_106 00000649 R
0 _put_time 000006B7 GR
0 _play_xm 000002BE GR
0 _put_dec3 0000080B GR
0 _put_hex2 000007CE GR
0 _put_hex2_hexch_10000_132 000007FA R
0 _put_time 00000868 GR
1 _ret_sp 00001000 GR
2 _state_esp 00000000 GR
1 _status_buf 00001032 R
1 _status_code_buf 0000104A R
0 _stop_on_error 00000594 GR
_strlen ******** GX
1 _timebuf 00001037 R
1 _timebuf 00001067 R
1 _total_samples 0000102C GR
0 _wait_esc_key 00000565 GR
0 _wait_frames 0000056D GR
0 _unload_and_exit 0000050E GR
0 _wait_esc_key 000004EA GR
0 _wait_for_manual_exit 00000549 GR
0 _wait_frames 000004F2 GR
0 _wc_exit 00000000 GR
_wc_gadrw ******** GX
_wc_key_esc ******** GX
_wc_key_pgdn ******** GX
_wc_key_pgup ******** GX
_wc_key_space ******** GX
_wc_load512 ******** GX
_wc_prm_pl ******** GX
_wc_prsrw ******** GX
_wc_prsrw_attr ******** GX
_wc_prwow ******** GX
_wc_rresb ******** GX
0 _wc_set_freq_14mhz 00000005 GR
0 _win_about 00000283 GR
0 _win_xm 00000271 GR
0 _xm_draw_static_labels 000005ED GR
0 _xm_draw_stats_labels 00000764 GR
0 _win_about 00000276 GR
0 _win_xm 00000264 GR
0 _xm_draw_static_labels 0000062B GR
0 _xm_draw_stats_labels 00000915 GR
1 _xm_handle 00001030 GR
0 _xm_update_info 00000860 GR
0 _xm_set_status 0000070E GR
0 _xm_set_status_attr 000006AA GR
0 _xm_set_status_code 00000716 GR
0 _xm_set_status_code_hexch_10000_129 000007BD R
0 _xm_update_info 00000A4D GR
ASxxxx Assembler V05.50.4+NoICE+SDCCmods-WIP-R14 (Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80 / R800) Page 4
Hexadecimal [32-Bits]
Area Table
0 _CODE size B06 flags 0
1 _DATA size 105E flags 0
0 _CODE size CCD flags 0
1 _DATA size 108E flags 0
2 _INITIALIZED size 1 flags 0
3 _DABS size 0 flags 8
4 _HOME size 0 flags 0
+29 -9
View File
@@ -13,7 +13,7 @@
#define SPI_ESP_CS_ON 0x13
#define SPI_ESP_CS_OFF 0x03
u32 esp_wait_busy(u32 timeout);
u8 esp_wait_busy(u16 max_frames);
void esp_cmd(u8 cmd)
{
@@ -117,7 +117,7 @@ void esp_send_dma(u16 a, u8 p, u16 l, u16 n)
SPI_CTRL = SPI_ESP_CS_OFF;
esp_wr_end();
esp_wait_busy(60000);
esp_wait_busy(100); // 2s - esp32 consuming one DMA'd chunk should be near-instant
}
void esp_rd_end()
@@ -128,18 +128,38 @@ void esp_rd_end()
SPI_CTRL = SPI_ESP_CS_OFF;
}
u32 esp_wait_status(u8 status, u32 timeout)
// Both wait against WC's own frame timer (_TMN, 0x6009 - a 16-bit counter
// incremented at 50Hz by WC's interrupt) instead of a raw SPI-poll
// iteration count. An iteration count isn't real time - it depends on the
// current Z80 clock, which xmplay doesn't control (WC's turbo setting
// could be anything when the plugin starts) - and an uncalibrated guess
// already caused one real bug (TRACK_INIT timing out early on heavier
// files, see main.c's esp_wait_ready() history/comment). Returns 1 if the
// awaited condition was seen within max_frames, 0 on timeout.
u8 esp_wait_status(u8 status, u16 max_frames)
{
while (--timeout) if (esp_rd_reg8(ESP_REG_STATUS) == status) break;
u16 start = *(u16*)_TMN;
return timeout;
while ((u16)(*(u16*)_TMN - start) < max_frames)
{
if (esp_rd_reg8(ESP_REG_STATUS) == status)
return 1;
}
return 0;
}
u32 esp_wait_busy(u32 timeout)
u8 esp_wait_busy(u16 max_frames)
{
while (--timeout) if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY) break;
u16 start = *(u16*)_TMN;
return timeout;
while ((u16)(*(u16*)_TMN - start) < max_frames)
{
if (esp_rd_reg8(ESP_REG_STATUS) != ESP_ST_BUSY)
return 1;
}
return 0;
}
int esp_create_obj(u32 size, u8 type)
@@ -147,7 +167,7 @@ int esp_create_obj(u32 size, u8 type)
esp_wr_reg32(ESP_REG_DATA_SIZE, size);
esp_wr_reg8(ESP_REG_OBJ_TYPE, type);
esp_cmd(ESP_CMD_MAKE_OBJECT);
esp_wait_busy(20000);
esp_wait_busy(100); // 2s - object allocation should be near-instant
// +++ check error
return esp_rd_reg8(ESP_REG_OBJ_HANDLE);
+258 -136
View File
@@ -61,51 +61,6 @@ enum
};
// --- Windows ------------------------------
const WC_TX_WINDOW err_no_esp =
{
/* window with header and text */ WC_WIND_HDR_TXT,
/* cursor color mask */ 0,
/* X,Y (position) */ 24, 10,
/* W,H (size) */ 32, 5,
/* paper/ink (window color) */ 0x2F,
/* -reserved- */ 0,
/* window restore buffer address */ 0,
/* separators */ 0, 0,
/* header text */ "\x0E" " Error! ",
/* footer text */ "",
/* window text */ "\x0E\x0C\x01" "No ESP32 detected!",
};
const WC_TX_WINDOW err_out_of_mem =
{
/* window with header and text */ WC_WIND_HDR_TXT,
/* cursor color mask */ 0,
/* X,Y (position) */ 255, 255,
/* W,H (size) */ 32, 5,
/* paper/ink (window color) */ 0x2F,
/* -reserved- */ 0,
/* window restore buffer address */ 0,
/* separators */ 0, 0,
/* header text */ "\x0E" " Error! ",
/* footer text */ "",
/* window text */ "\x0E\x0C\x01" "Out of memory (file too big)",
};
const WC_TX_WINDOW err_playback =
{
/* window with header and text */ WC_WIND_HDR_TXT,
/* cursor color mask */ 0,
/* X,Y (position) */ 255, 255,
/* W,H (size) */ 32, 5,
/* paper/ink (window color) */ 0x2F,
/* -reserved- */ 0,
/* window restore buffer address */ 0,
/* separators */ 0, 0,
/* header text */ "\x0E" " Error! ",
/* footer text */ "",
/* window text */ "\x0E\x0C\x01" "Playback error (bad file?)",
};
// STEP 1 of the gradual reintroduction: bigger, fixed position (not
// 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
@@ -115,14 +70,14 @@ const WC_TX_WINDOW win_xm =
/* window with header and text + shadow (0x80) */ WC_WIND_HDR_TXT | 0x80,
/* cursor color mask */ 0,
/* X,Y (position) */ 25, 10,
/* W,H (size) */ 40, 11,
/* paper/ink (window color) */ 0x4F,
/* 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)
/* -reserved- */ 0,
/* window restore buffer address */ 0,
/* separators */ 0, 0,
/* header text */ "\x0E" " XM/XMZ/S3M Player ",
/* header text */ "\x0E" " XM/XMZ/S3M Player v0.1 ",
/* footer text */ "",
/* window text */ "\x0E\x0C\x01" "Playing..."
/* window text */ "" // replaced by the dynamic "Status:" line, see xm_set_status()
};
const WC_TX_WINDOW win_about =
@@ -137,9 +92,12 @@ const WC_TX_WINDOW win_about =
/* separators */ 0, 0,
/* header text */ "\x0E" " About ",
/* footer text */ "",
/* window text */ "\x0E\x0C\x01" "XM Player v1.0"
/* window text */ "\x0E\x0C\x01" "XM Player v0.1"
};
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
bool esp_init()
{
esp_cmd(ESP_CMD_NOP);
@@ -156,9 +114,9 @@ bool esp_init()
bool play_xm()
{
esp_cmd(ESP_CMD_TRACK_STOP);
esp_wait_busy(10000);
esp_wait_busy(100); // 2s - both should be near-instant
esp_cmd(ESP_CMD_KILL_OBJECTS);
esp_wait_busy(10000);
esp_wait_busy(100);
u8 obj_type;
switch (file_ext)
@@ -186,7 +144,7 @@ bool play_xm()
esp_wr_reg32(ESP_REG_DATA_SIZE, s);
esp_wr_reg32(ESP_REG_DATA_OFFSET, offs);
esp_cmd(ESP_CMD_WRITE_OBJECT);
esp_wait_status(ESP_ST_DATA_M2S, 2000);
esp_wait_status(ESP_ST_DATA_M2S, 100); // 2s - near-instant state transition
esp_send_dma((u16)fs_buf, *(u8*)_PAGE2, 512, sec);
offs += s;
@@ -202,7 +160,7 @@ bool play_xm()
esp_wr_reg8(ESP_REG_OBJ_TYPE, OBJ_TYPE_XM);
esp_wr_reg32(ESP_REG_DATA_SIZE, filesize);
esp_cmd(ESP_CMD_UNZIP);
esp_wait_busy(10000);
esp_wait_busy(250); // 5s - decompression time scales with file size
last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
if (last_esp_status != ESP_ST_READY)
@@ -210,14 +168,12 @@ bool play_xm()
}
esp_cmd(ESP_CMD_TRACK_INIT);
// TRACK_INIT now blocks on the firmware side while it measures the song's
// total sample count, capped at XM_MEASURE_MAX_US = 5s (tracker.cpp) - so
// this needs to comfortably cover 5s of real time, not the ~150ms the old
// 10000-iteration budget worked out to at 14MHz (each esp_wait_busy()
// iteration is a raw SPI status-register read, not a real-time wait).
// Iteration count isn't hardware-calibrated, so this is padded well past
// the 5s firmware cap - bump further if TRACK_INIT still times out.
esp_wait_busy(1000000);
// 400 frames = 8s, comfortably past the firmware's 5s song-length
// 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
// count (an uncalibrated guess here previously caused ESP_ERR_INV_XM_HANDLE
// failures on heavier files that legitimately needed close to the full 5s).
esp_wait_busy(400);
last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
if (last_esp_status != ESP_ST_READY)
@@ -229,10 +185,14 @@ bool play_xm()
esp_wr_reg8(ESP_REG_OBJ_HANDLE, xm_handle);
esp_wr_reg8(ESP_REG_TRACK_MAX_LOOP_COUNT, 1);
esp_cmd(ESP_CMD_TRACK_SET_PARAMS);
esp_wait_busy(10000);
esp_wait_busy(100); // 2s - both should be near-instant
esp_cmd(ESP_CMD_TRACK_PLAY);
esp_wait_busy(10000);
esp_wait_busy(100);
last_esp_status = esp_rd_reg8(ESP_REG_STATUS);
if (last_esp_status != ESP_ST_READY)
return false;
return true;
}
@@ -269,27 +229,99 @@ void about()
wc_exit(WC_EXIT);
}
// Shared by the main playback key-poll loop and wait_for_manual_exit() -
// stops the track, kills the esp32 objects, closes the window and hands
// control back to WC with the given signal.
void unload_and_exit(WC_EXIT_SIGNAL sig)
{
esp_cmd(ESP_CMD_TRACK_STOP);
esp_wait_busy(100); // 2s - both should be near-instant
esp_cmd(ESP_CMD_KILL_OBJECTS);
esp_wait_busy(100);
wc_rresb(&win_xm);
wc_exit(sig);
}
// Space - just leave, no esp32 commands at all: the track keeps playing on
// its own after the plugin exits, only our window/UI goes away.
void leave_playing_and_exit()
{
wc_rresb(&win_xm);
wc_exit(WC_EXIT);
}
// Used after an error when stoponerror=1: keeps responding to the same
// navigation keys as normal playback, but issues no esp32 commands and
// touches nothing on screen on its own - only acts once the user actually
// presses PgDn/PgUp/Esc, so the error stays visible for as long as needed.
void wait_for_manual_exit()
{
while (1)
{
__asm
halt
__endasm;
if (wc_key_pgdn())
unload_and_exit(WC_NEXT_FILE);
if (wc_key_pgup())
unload_and_exit(WC_PREV_FILE);
if (wc_key_esc())
unload_and_exit(WC_EXIT);
}
}
// Errors used to open their own separate popup window; now they're just
// another Status value on the already-open win_xm, per user request - one
// less window type to keep track of, and errors show up in the same place
// as everything else instead of a separate modal-looking box.
void error_esp()
{
wc_prwow(&err_no_esp);
// esp_init() currently always returns true (no real detection logic yet,
// see its "+++ detect" comment), so state_esp is the only thing that can
// land here - shown anyway for when real detection is added.
xm_set_status_code("No ESP32 found", state_esp);
wait_esc_key();
wc_rresb(&err_no_esp);
wc_rresb(&win_xm);
wc_exit(WC_EXIT);
}
// wc_prm_pl(1) reads the "stoponerror" INI parameter declared in wc_h.c -
// the FIRST (and only) declared parameter, and per WC's own PRM_PL doc
// ("i:A' - номер параметра (от 1 до 8)") that's queried 1-based, not
// 0-based as a third-party reference wrongly suggested (which is why this
// never actually triggered - always asking for a nonexistent parameter 0).
// Option 2 ("1") means stop instead of moving on to the next file; option 1
// ("0", the default) keeps the old auto-advance behavior. 0xFF (param
// missing from an old/malformed header) is treated the same as the default.
u8 stop_on_error()
{
return wc_prm_pl(1) == 2;
}
void error_oom()
{
wc_prwow(&err_out_of_mem);
xm_set_status_code("File too large", last_esp_status);
if (stop_on_error())
wait_for_manual_exit();
wait_frames(50); // show the error for ~1 second (50Hz), then auto-advance
wc_rresb(&err_out_of_mem);
wc_rresb(&win_xm);
wc_exit(WC_NEXT_FILE);
}
void error_playback()
{
wc_prwow(&err_playback);
xm_set_status_code("Playback error", last_esp_status);
if (stop_on_error())
wait_for_manual_exit();
wait_frames(50); // show the error for ~1 second (50Hz), then auto-advance
wc_rresb(&err_playback);
wc_rresb(&win_xm);
wc_exit(WC_NEXT_FILE);
}
@@ -314,21 +346,106 @@ void copy_file_name()
// Coloring (PRIAT) via demyanenko-d/VGMPLAY.WMF's wc_prsrw_attr() - our own
// three hand-rolled attempts all corrupted esp32 file loading; retesting
// with their library now that build.bat pins SDCC 4.6.0 + --sdcccall 1.
#define ROW_FILE 1
#define ATTR_CAPTION 0x45 // cyan ink - "File:" caption
#define ROW_FILE 2 // row 1 left blank - a gap below the header, was too cramped right against it
// Attribute byte for wc_prsrw_attr() is (paper<<4)|ink, 0=black..7=white
// (confirmed on hardware via the old cyan "File:" caption, 0x45 = paper 4
// green/ink 5 cyan). White paper (7) throughout to match win_xm's own base
// color (0x70). Static captions ("File:", "Status:", "Pattern:", etc.) just
// use plain wc_prsrw() and inherit the window's own black ink - no override
// needed. ATTR_VALUE (blue) is for anything we actually write/update
// (filename, status text, live stats, progress bar); ATTR_ERROR (red)
// overrides that specifically for error text (see xm_set_status_code()).
#define ATTR_VALUE 0x71 // blue on white
#define ATTR_ERROR 0x72 // red on white
// Status: replaces the window's old baked-in "Playing..." text with a
// dynamic field - shows "Loading..." while play_xm() streams the file to
// the esp32 (can take a noticeable while for a big file - without this the
// window opens with just "File:" and nothing else visibly changes until
// playback starts, which reads as a hung interface), then whatever state/
// error is worth surfacing from there on (checked against ESP_REG_STATUS/
// ESP_REG_TRACK_STATUS as those checks get added).
#define ROW_STATUS 3
#define STATUS_VALUE_X 9
#define STATUS_VALUE_WIDTH 24
static char status_buf[STATUS_VALUE_WIDTH];
#define ROW_HINT 10 // one blank row after it, before the bottom border
#define HINT_TEXT "PgUp/PgDn:Track Esc:Stop Space:Leave"
void xm_draw_static_labels()
{
wc_prsrw_attr(&win_xm, "File:", ROW_FILE, 1, 5, ATTR_CAPTION);
wc_prsrw(&win_xm, file_name, ROW_FILE, 7, strlen(file_name));
wc_prsrw(&win_xm, "File:", ROW_FILE, 1, 5);
wc_prsrw_attr(&win_xm, file_name, ROW_FILE, 7, strlen(file_name), ATTR_VALUE);
wc_prsrw(&win_xm, "Status:", ROW_STATUS, 1, 7);
// Centered: 38 usable columns (1..38) minus 36-char HINT_TEXT leaves a
// 1-column margin each side, so it starts at column 2.
wc_prsrw(&win_xm, HINT_TEXT, ROW_HINT, 2, sizeof(HINT_TEXT) - 1);
}
// msg must be in #8000-#BFFF (a string literal or a global/static buffer,
// same constraint as every other wc_prsrw() text pointer here) - pads with
// spaces to STATUS_VALUE_WIDTH so a shorter message never leaves stray
// characters from a longer previous one.
void xm_set_status_attr(const char *msg, u8 attr)
{
u8 i = 0;
while (msg[i] && i < STATUS_VALUE_WIDTH)
{
status_buf[i] = msg[i];
i++;
}
while (i < STATUS_VALUE_WIDTH)
status_buf[i++] = ' ';
wc_prsrw_attr(&win_xm, status_buf, ROW_STATUS, STATUS_VALUE_X, STATUS_VALUE_WIDTH, attr);
}
void xm_set_status(const char *msg)
{
xm_set_status_attr(msg, ATTR_VALUE);
}
// Same as xm_set_status(), but appends " (0xXX)" with the raw esp status/
// error code - for on-screen diagnostics, so a failure doesn't need a
// hardware debugger to tell exactly which ESP_ST_*/ESP_ERR_* value it was.
static char status_code_buf[24];
void xm_set_status_code(const char *msg, u8 code)
{
static const char hexch[] = "0123456789ABCDEF";
u8 i = 0;
while (msg[i] && i < sizeof(status_code_buf) - 7)
{
status_code_buf[i] = msg[i];
i++;
}
status_code_buf[i++] = ' ';
status_code_buf[i++] = '(';
status_code_buf[i++] = '0';
status_code_buf[i++] = 'x';
status_code_buf[i++] = hexch[(code >> 4) & 0xF];
status_code_buf[i++] = hexch[code & 0xF];
status_code_buf[i++] = ')';
status_code_buf[i] = 0;
xm_set_status_attr(status_code_buf, ATTR_ERROR);
}
// --- Live status display (STEP 3, no coloring - plain wc_prsrw only) -----
#define ROW_STATS 3
#define ROW_TIME 5
#define ROW_BAR 6
#define BAR_X 1
#define BAR_WIDTH 34
#define ROW_STATS 4
#define ROW_TIME 6
#define ROW_BAR 8 // blank rows between each of these for spacing
// Window content is 40 wide with a 1-char border each side (38 usable
// columns, x=1..38) - BAR_X=4/BAR_WIDTH=32 gives a 3-column margin on
// both sides (4-1=3 before, 38-(4+32-1)=3 after). Adjust if the actual
// border turns out different on hardware.
#define BAR_X 4
#define BAR_WIDTH 32
void put_hex2(char *dst, u8 val)
{
@@ -356,16 +473,6 @@ void put_time(char *dst, u32 sec)
dst[4] = '0' + s % 10;
}
void xm_draw_stats_labels()
{
wc_prsrw(&win_xm, "Pattern:#", ROW_STATS, 1, 9);
wc_prsrw(&win_xm, " Row:#", ROW_STATS, 12, 7);
wc_prsrw(&win_xm, " BPM:", ROW_STATS, 21, 6);
wc_prsrw(&win_xm, "Time:", ROW_TIME, 1, 5);
wc_prsrw(&win_xm, " / ", ROW_TIME, 12, 3);
}
// wc_prsrw()'s text pointer MUST be in #8000-#BFFF (our own code/data
// window) - but this plugin runs on WC's OWN stack, which lives in a
// DIFFERENT window (#4000-#7FFF, per plugins/READ_ME.TXT: "стек... в Win 1
@@ -380,8 +487,39 @@ static char decbuf[3];
static char timebuf[5];
static char barbuf[BAR_WIDTH];
#define BAR_FILLED_CH '='
#define BAR_EMPTY_CH '-'
// Attribute plane offset for a character cell = (char_addr & 0x3FFF) | 0x0080
// (same convention VGMPLAY.WMF's own progress bar uses on this same TS-Conf
// text hardware) - both planes sit in the #C000-#FFFF window that PRWOW/
// PRSRW/GADRW etc. all leave mapped in on exit. Computed once in
// xm_draw_stats_labels() (window position is fixed for the plugin's
// lifetime) - draw_progress_bar() only ever writes attribute bytes there,
// recoloring the background to grow a solid bar instead of drawing "="/"-"
// characters.
u16 bar_attr_ofs;
#define ATTR_BAR_FILLED 0x40 // green paper, black ink - filled portion (matches VGMPLAY.WMF's WC_COLOR(WC_GREEN, WC_BLACK))
#define ATTR_BAR_EMPTY 0x07 // black paper, white ink - unfilled portion
void xm_draw_stats_labels()
{
u8 i;
wc_prsrw(&win_xm, "Pattern:#", ROW_STATS, 1, 9);
wc_prsrw(&win_xm, " Row:#", ROW_STATS, 12, 7);
wc_prsrw(&win_xm, " BPM:", ROW_STATS, 21, 6);
wc_prsrw(&win_xm, "Time:", ROW_TIME, 1, 5);
wc_prsrw(&win_xm, " / ", ROW_TIME, 12, 3);
for (i = 0; i < BAR_WIDTH; i++)
barbuf[i] = ' ';
wc_prsrw(&win_xm, barbuf, ROW_BAR, BAR_X, BAR_WIDTH);
bar_attr_ofs = (wc_gadrw(&win_xm, ROW_BAR, BAR_X) & 0x3FFF) | 0x0080;
for (i = 0; i < BAR_WIDTH; i++)
*(volatile u8*)(0xC000 + bar_attr_ofs + i) = ATTR_BAR_EMPTY;
}
void draw_progress_bar(u32 samples, u32 total)
{
@@ -397,9 +535,7 @@ void draw_progress_bar(u32 samples, u32 total)
filled = 0; // total length unknown (measurement timed out) - show empty
for (i = 0; i < BAR_WIDTH; i++)
barbuf[i] = (i < filled) ? BAR_FILLED_CH : BAR_EMPTY_CH;
wc_prsrw(&win_xm, barbuf, ROW_BAR, BAR_X, BAR_WIDTH);
*(volatile u8*)(0xC000 + bar_attr_ofs + i) = (i < filled) ? ATTR_BAR_FILLED : ATTR_BAR_EMPTY;
}
void xm_update_info()
@@ -410,7 +546,7 @@ void xm_update_info()
esp_wr_reg8(ESP_REG_OBJ_HANDLE, xm_handle);
esp_cmd(ESP_CMD_TRACK_GET_INFO);
esp_wait_busy(2000);
esp_wait_busy(50); // 1s - a plain info read should be near-instant
// TRACK_GET_INFO already writes ESP_REG_TRACK_STATUS (same register
// TRACK_GET_STATE reports), so no separate command is needed to catch the
@@ -419,7 +555,7 @@ void xm_update_info()
if (last_track_status == TRACK_OBJ_ST_PLAYING && status == TRACK_OBJ_ST_STOPPED)
{
esp_cmd(ESP_CMD_KILL_OBJECTS);
esp_wait_busy(10000);
esp_wait_busy(100);
wc_rresb(&win_xm);
wc_exit(WC_NEXT_FILE);
}
@@ -434,19 +570,19 @@ void xm_update_info()
total_samples = esp_rd_reg32(ESP_REG_TRACK_TOTAL_SAMPLES);
put_hex2(hexbuf, pattern);
wc_prsrw(&win_xm, hexbuf, ROW_STATS, 10, 2);
wc_prsrw_attr(&win_xm, hexbuf, ROW_STATS, 10, 2, ATTR_VALUE);
put_hex2(hexbuf, row);
wc_prsrw(&win_xm, hexbuf, ROW_STATS, 19, 2);
wc_prsrw_attr(&win_xm, hexbuf, ROW_STATS, 19, 2, ATTR_VALUE);
put_dec3(decbuf, bpm);
wc_prsrw(&win_xm, decbuf, ROW_STATS, 27, 3);
wc_prsrw_attr(&win_xm, decbuf, ROW_STATS, 27, 3, ATTR_VALUE);
put_time(timebuf, samples / 44100UL);
wc_prsrw(&win_xm, timebuf, ROW_TIME, 7, 5);
wc_prsrw_attr(&win_xm, timebuf, ROW_TIME, 7, 5, ATTR_VALUE);
put_time(timebuf, total_samples / 44100UL);
wc_prsrw(&win_xm, timebuf, ROW_TIME, 15, 5);
wc_prsrw_attr(&win_xm, timebuf, ROW_TIME, 15, 5, ATTR_VALUE);
draw_progress_bar(samples, total_samples);
@@ -456,14 +592,22 @@ void main_start()
{
u8 frame_ctr;
// Pin the Z80 clock for the whole plugin lifetime - our esp_wait_busy()
// timeouts are iteration counters, not real time, so leaving WC's turbo
// setting as-is would make esp32 SPI timing margins depend on whatever
// frequency happened to be active before the plugin started.
wc_set_freq_14mhz();
copy_file_name();
// Open the window before anything esp32-related runs, including the
// detection check - errors go into "Status:" on this same window (see
// error_esp() etc.) rather than a separate popup, and a big file's
// transfer in play_xm() can take a noticeable while, so nothing on
// screen during either would read as a hung interface. This used to be
// deferred until after play_xm() succeeded, because opening a window
// before esp32 activity used to corrupt the transfer - that was tied to
// 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
// (see project memory).
wc_prwow(&win_xm);
xm_draw_static_labels();
xm_set_status("Loading, please wait...");
if (state_esp == 0xFF)
state_esp = esp_init() ? 1 : 2;
@@ -484,11 +628,7 @@ void main_start()
return;
}
// Draw the status window only AFTER play_xm() has already finished the
// file transfer and issued TRACK_INIT/TRACK_PLAY - drawing a window
// beforehand previously corrupted the esp32 transfer (see project memory).
wc_prwow(&win_xm);
xm_draw_static_labels();
xm_set_status("Playing");
xm_draw_stats_labels();
last_track_status = TRACK_OBJ_ST_PLAYING;
xm_update_info();
@@ -509,34 +649,16 @@ void main_start()
}
if (wc_key_pgdn()) // PgDn - unload and go to next file
{
esp_cmd(ESP_CMD_TRACK_STOP);
esp_wait_busy(10000);
esp_cmd(ESP_CMD_KILL_OBJECTS);
esp_wait_busy(10000);
wc_rresb(&win_xm);
wc_exit(WC_NEXT_FILE);
}
unload_and_exit(WC_NEXT_FILE);
if (wc_key_pgup()) // PgUp - unload and go to previous file
{
esp_cmd(ESP_CMD_TRACK_STOP);
esp_wait_busy(10000);
esp_cmd(ESP_CMD_KILL_OBJECTS);
esp_wait_busy(10000);
wc_rresb(&win_xm);
wc_exit(WC_PREV_FILE);
}
unload_and_exit(WC_PREV_FILE);
if (wc_key_esc()) // Esc - unload and exit
{
esp_cmd(ESP_CMD_TRACK_STOP);
esp_wait_busy(10000);
esp_cmd(ESP_CMD_KILL_OBJECTS);
esp_wait_busy(10000);
wc_rresb(&win_xm);
wc_exit(WC_EXIT);
}
unload_and_exit(WC_EXIT);
if (wc_key_space()) // Space - leave the track playing, just exit
leave_playing_and_exit();
}
}
+13 -22
View File
@@ -23,9 +23,22 @@ u8 wc_load512(u16 dest, u8 blocks);
u8 wc_key_esc(void);
u8 wc_key_pgup(void);
u8 wc_key_pgdn(void);
u8 wc_key_space(void);
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);
// y/x are 1-based; returns the character cell's address (relative to the
// #C000 window GADRW/PRWOW/PRSRW etc. all leave mapped in on exit) - see
// main.c's bar_attr_ofs for how the attribute-plane byte is derived from it.
u16 wc_gadrw(void *win, u8 y, u8 x);
// param_num is 1-based (matching WC's own PRM_PL doc, "i:A' - номер
// параметра (от 1 до 8)" - NOT 0-based as a third-party reference wrongly
// suggested, see main.c's stop_on_error()); returns the 1-based selected
// option index ("от 1 до 10"), or 0xFF if the plugin header doesn't declare
// that parameter at all.
u8 wc_prm_pl(u8 param_num);
// wc_exit is ours, not theirs - it unwinds our own crt0.s's saved SP
// (_ret_sp) to return control to WC, so there's no equivalent in their
// library to borrow. Adjusted for sdcccall(1): a single u8 argument now
@@ -39,25 +52,3 @@ void wc_exit(u8 rc) __naked
ret
__endasm;
}
// _TURBOPL (0x0E) is also ours - not wrapped by vgm_wc_api.lib. Our
// esp_wait_busy()/esp_wr_end()/etc. timeouts are plain iteration counters,
// not real-time based, so they implicitly assume a specific Z80 clock; if WC
// was left in turbo mode before the plugin started, the same iteration
// budget covers less real time and could cut SPI exchanges with the esp32
// short. Pinning a known frequency for the whole plugin lifetime removes
// that as a variable - set once at startup, left as-is on exit (per user
// request, not restored to whatever WC had before). No parameters (avoids
// depending on exactly how two u8 args would be register-assigned under
// --sdcccall 1 - not worth the risk for a fixed value), and IX isn't
// preserved since _WCAPI clobbering it is already tolerated by every other
// call in this file.
void wc_set_freq_14mhz() __naked
{
__asm
ld b, #0x00 ; type: Z80 frequency
ld c, #0x02 ; %10 = 14 MHz
ld a, #_TURBOPL
jp _WCAPI
__endasm;
}
+19 -3
View File
@@ -2,11 +2,18 @@
#include <defs.h>
#include <wc_h.h>
// STOPONERROR_PARAM: index passed to wc_prm_pl() to read this back (0-based,
// so this is the 1st and only declared parameter). Its declared options are
// "0" (default, at 1-based option index 1 - keep the old auto-advance
// behavior) and "1" (option index 2 - stop instead of moving to the next
// file after an error). See main.c's error_oom()/error_playback().
#define STOPONERROR_PARAM 0
static const WC_HDR hdr =
{
/* +00 -reserved- */ "",
/* +16 Magic string */ {'W', 'i', 'l', 'd', 'C', 'o', 'm', 'm', 'a', 'n', 'd', 'e', 'r', 'M', 'D', 'L'},
/* +32 Format version */ 7,
/* +32 Format version */ 10, // WC_PLUGIN_VERSION - v1.09+ needed for the INI param list below (PRM_PL)
/* +33 -reserved- */ "",
/* +34 Number of pages */ 1,
/* +35 Page at 0x8000 */ 0,
@@ -21,6 +28,15 @@ static const WC_HDR hdr =
/* */ },
/* +160 0x00 */ "",
/* +161 Max file size */ 0xFFFFFFFF,
/* +165 Plugin name */ "XM Player",
/* +197 Starting condition */ SC_MENU // also run by extension
/* +165 Plugin name */ "XM Player v0.1",
/* +197 Starting condition */ SC_MENU, // also run by extension
/* +198 -reserved- */ "",
/* +260 INI parameters */ {
/* record length (incl. this byte): 1+1+11+1+4 = 18 */ 18,
/* default option (1-based) */ 1,
/* parameter name, no terminator, no CAPS */ 's','t','o','p','o','n','e','r','r','o','r',
/* option count */ 2,
/* "0",0, "1",0 */ '0', 0, '1', 0,
/* end of parameter list */ 0
/* */ }
};
+2 -1
View File
@@ -32,5 +32,6 @@ typedef struct
u32 file_max_size; /* +161 Max file size */
char name[32]; /* +165 Plugin name */
SCOND cond; /* +197 Starting condition */
u8 res4[314]; /* +198 -reserved- */
u8 res4[62]; /* +198 -reserved- */
u8 ini_params[252]; /* +260 INI parameter list (WC v1.09+, PRM_PL) */
} WC_HDR;