A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 642 lines 11 kB view raw
1 2 3#include <stdio.h> 4 5#include "rockmacros.h" 6#include "defs.h" 7#include "cpu-gb.h" 8#include "mem.h" 9#include "fastmem.h" 10#include "regs.h" 11 12#include "cpuregs.h" 13 14 15static char *mnemonic_table[256] = 16{ 17 "NOP", 18 "LD BC,%w", 19 "LD (BC),A", 20 "INC BC", 21 "INC B", 22 "DEC B", 23 "LD B,%b", 24 "RLCA", 25 "LD (%w),SP", 26 "ADD HL,BC", 27 "LD A,(BC)", 28 "DEC BC", 29 "INC C", 30 "DEC C", 31 "LD C,%b", 32 "RRCA", 33 "STOP", 34 "LD DE,%w", 35 "LD (DE),A", 36 "INC DE", 37 "INC D", 38 "DEC D", 39 "LD D,%b", 40 "RLA", 41 "JR %o", 42 "ADD HL,DE", 43 "LD A,(DE)", 44 "DEC DE", 45 "INC E", 46 "DEC E", 47 "LD E,%b", 48 "RRA", 49 "JR NZ,%o", 50 "LD HL,%w", 51 "LD (HLI),A", 52 "INC HL", 53 "INC H", 54 "DEC H", 55 "LD H,%b", 56 "DAA", 57 "JR Z,%o", 58 "ADD HL,HL", 59 "LD A,(HLI)", 60 "DEC HL", 61 "INC L", 62 "DEC L", 63 "LD L,%b", 64 "CPL", 65 "JR NC,%o", 66 "LD SP,%w", 67 "LD (HLD),A", 68 "INC SP", 69 "INC (HL)", 70 "DEC (HL)", 71 "LD (HL),%b", 72 "SCF", 73 "JR C,%o", 74 "ADD HL,SP", 75 "LD A,(HLD)", 76 "DEC SP", 77 "INC A", 78 "DEC A", 79 "LD A,%b", 80 "CCF", 81 "LD B,B", 82 "LD B,C", 83 "LD B,D", 84 "LD B,E", 85 "LD B,H", 86 "LD B,L", 87 "LD B,(HL)", 88 "LD B,A", 89 "LD C,B", 90 "LD C,C", 91 "LD C,D", 92 "LD C,E", 93 "LD C,H", 94 "LD C,L", 95 "LD C,(HL)", 96 "LD C,A", 97 "LD D,B", 98 "LD D,C", 99 "LD D,D", 100 "LD D,E", 101 "LD D,H", 102 "LD D,L", 103 "LD D,(HL)", 104 "LD D,A", 105 "LD E,B", 106 "LD E,C", 107 "LD E,D", 108 "LD E,E", 109 "LD E,H", 110 "LD E,L", 111 "LD E,(HL)", 112 "LD E,A", 113 "LD H,B", 114 "LD H,C", 115 "LD H,D", 116 "LD H,E", 117 "LD H,H", 118 "LD H,L", 119 "LD H,(HL)", 120 "LD H,A", 121 "LD L,B", 122 "LD L,C", 123 "LD L,D", 124 "LD L,E", 125 "LD L,H", 126 "LD L,L", 127 "LD L,(HL)", 128 "LD L,A", 129 "LD (HL),B", 130 "LD (HL),C", 131 "LD (HL),D", 132 "LD (HL),E", 133 "LD (HL),H", 134 "LD (HL),L", 135 "HALT", 136 "LD (HL),A", 137 "LD A,B", 138 "LD A,C", 139 "LD A,D", 140 "LD A,E", 141 "LD A,H", 142 "LD A,L", 143 "LD A,(HL)", 144 "LD A,A", 145 "ADD A,B", 146 "ADD A,C", 147 "ADD A,D", 148 "ADD A,E", 149 "ADD A,H", 150 "ADD A,L", 151 "ADD A,(HL)", 152 "ADD A,A", 153 "ADC A,B", 154 "ADC A,C", 155 "ADC A,D", 156 "ADC A,E", 157 "ADC A,H", 158 "ADC A,L", 159 "ADC A,(HL)", 160 "ADC A", 161 "SUB B", 162 "SUB C", 163 "SUB D", 164 "SUB E", 165 "SUB H", 166 "SUB L", 167 "SUB (HL)", 168 "SUB A", 169 "SBC A,B", 170 "SBC A,C", 171 "SBC A,D", 172 "SBC A,E", 173 "SBC A,H", 174 "SBC A,L", 175 "SBC A,(HL)", 176 "SBC A,A", 177 "AND B", 178 "AND C", 179 "AND D", 180 "AND E", 181 "AND H", 182 "AND L", 183 "AND (HL)", 184 "AND A", 185 "XOR B", 186 "XOR C", 187 "XOR D", 188 "XOR E", 189 "XOR H", 190 "XOR L", 191 "XOR (HL)", 192 "XOR A", 193 "OR B", 194 "OR C", 195 "OR D", 196 "OR E", 197 "OR H", 198 "OR L", 199 "OR (HL)", 200 "OR A", 201 "CP B", 202 "CP C", 203 "CP D", 204 "CP E", 205 "CP H", 206 "CP L", 207 "CP (HL)", 208 "CP A", 209 "RET NZ", 210 "POP BC", 211 "JP NZ,%w", 212 "JP %w", 213 "CALL NZ,%w", 214 "PUSH BC", 215 "ADD A,%b", 216 "RST 0h", 217 "RET Z", 218 "RET", 219 "JP Z,%w", 220 NULL, 221 "CALL Z,%w", 222 "CALL %w", 223 "ADC A,%b", 224 "RST 8h", 225 "RET NC", 226 "POP DE", 227 "JP NC,%w", 228 NULL, 229 "CALL NC,%w", 230 "PUSH DE", 231 "SUB %b", 232 "RST 10h", 233 "RET C", 234 "RETI", 235 "JP C,%w", 236 NULL, 237 "CALL C,%w", 238 NULL, 239 "SBC A,%b", 240 "RST 18h", 241 "LD (FF00+%b),A", 242 "POP HL", 243 "LD (FF00+C),A", 244 NULL, 245 NULL, 246 "PUSH HL", 247 "AND %b", 248 "RST 20h", 249 "ADD SP,%o", 250 "JP HL", 251 "LD (%w),A", 252 NULL, 253 NULL, 254 NULL, 255 "XOR %b", 256 "RST 28h", 257 "LD A,(FF00+%b)", 258 "POP AF", 259 "LD A,(FF00+C)", 260 "DI", 261 NULL, 262 "PUSH AF", 263 "OR %b", 264 "RST 30h", 265 "LD HL,SP%o", 266 "LD SP,HL", 267 "LD A,(%w)", 268 "EI", 269 NULL, 270 NULL, 271 "CP %b", 272 "RST 38h" 273}; 274 275static char *cb_mnemonic_table[256] = 276{ 277 "RLC B", 278 "RLC C", 279 "RLC D", 280 "RLC E", 281 "RLC H", 282 "RLC L", 283 "RLC (HL)", 284 "RLC A", 285 "RRC B", 286 "RRC C", 287 "RRC D", 288 "RRC E", 289 "RRC H", 290 "RRC L", 291 "RRC (HL)", 292 "RRC A", 293 "RL B", 294 "RL C", 295 "RL D", 296 "RL E", 297 "RL H", 298 "RL L", 299 "RL (HL)", 300 "RL A", 301 "RR B", 302 "RR C", 303 "RR D", 304 "RR E", 305 "RR H", 306 "RR L", 307 "RR (HL)", 308 "RR A", 309 "SLA B", 310 "SLA C", 311 "SLA D", 312 "SLA E", 313 "SLA H", 314 "SLA L", 315 "SLA (HL)", 316 "SLA A", 317 "SRA B", 318 "SRA C", 319 "SRA D", 320 "SRA E", 321 "SRA H", 322 "SRA L", 323 "SRA (HL)", 324 "SRA A", 325 "SWAP B", 326 "SWAP C", 327 "SWAP D", 328 "SWAP E", 329 "SWAP H", 330 "SWAP L", 331 "SWAP (HL)", 332 "SWAP A", 333 "SRL B", 334 "SRL C", 335 "SRL D", 336 "SRL E", 337 "SRL H", 338 "SRL L", 339 "SRL (HL)", 340 "SRL A", 341 "BIT 0,B", 342 "BIT 0,C", 343 "BIT 0,D", 344 "BIT 0,E", 345 "BIT 0,H", 346 "BIT 0,L", 347 "BIT 0,(HL)", 348 "BIT 0,A", 349 "BIT 1,B", 350 "BIT 1,C", 351 "BIT 1,D", 352 "BIT 1,E", 353 "BIT 1,H", 354 "BIT 1,L", 355 "BIT 1,(HL)", 356 "BIT 1,A", 357 "BIT 2,B", 358 "BIT 2,C", 359 "BIT 2,D", 360 "BIT 2,E", 361 "BIT 2,H", 362 "BIT 2,L", 363 "BIT 2,(HL)", 364 "BIT 2,A", 365 "BIT 3,B", 366 "BIT 3,C", 367 "BIT 3,D", 368 "BIT 3,E", 369 "BIT 3,H", 370 "BIT 3,L", 371 "BIT 3,(HL)", 372 "BIT 3,A", 373 "BIT 4,B", 374 "BIT 4,C", 375 "BIT 4,D", 376 "BIT 4,E", 377 "BIT 4,H", 378 "BIT 4,L", 379 "BIT 4,(HL)", 380 "BIT 4,A", 381 "BIT 5,B", 382 "BIT 5,C", 383 "BIT 5,D", 384 "BIT 5,E", 385 "BIT 5,H", 386 "BIT 5,L", 387 "BIT 5,(HL)", 388 "BIT 5,A", 389 "BIT 6,B", 390 "BIT 6,C", 391 "BIT 6,D", 392 "BIT 6,E", 393 "BIT 6,H", 394 "BIT 6,L", 395 "BIT 6,(HL)", 396 "BIT 6,A", 397 "BIT 7,B", 398 "BIT 7,C", 399 "BIT 7,D", 400 "BIT 7,E", 401 "BIT 7,H", 402 "BIT 7,L", 403 "BIT 7,(HL)", 404 "BIT 7,A", 405 "RES 0,B", 406 "RES 0,C", 407 "RES 0,D", 408 "RES 0,E", 409 "RES 0,H", 410 "RES 0,L", 411 "RES 0,(HL)", 412 "RES 0,A", 413 "RES 1,B", 414 "RES 1,C", 415 "RES 1,D", 416 "RES 1,E", 417 "RES 1,H", 418 "RES 1,L", 419 "RES 1,(HL)", 420 "RES 1,A", 421 "RES 2,B", 422 "RES 2,C", 423 "RES 2,D", 424 "RES 2,E", 425 "RES 2,H", 426 "RES 2,L", 427 "RES 2,(HL)", 428 "RES 2,A", 429 "RES 3,B", 430 "RES 3,C", 431 "RES 3,D", 432 "RES 3,E", 433 "RES 3,H", 434 "RES 3,L", 435 "RES 3,(HL)", 436 "RES 3,A", 437 "RES 4,B", 438 "RES 4,C", 439 "RES 4,D", 440 "RES 4,E", 441 "RES 4,H", 442 "RES 4,L", 443 "RES 4,(HL)", 444 "RES 4,A", 445 "RES 5,B", 446 "RES 5,C", 447 "RES 5,D", 448 "RES 5,E", 449 "RES 5,H", 450 "RES 5,L", 451 "RES 5,(HL)", 452 "RES 5,A", 453 "RES 6,B", 454 "RES 6,C", 455 "RES 6,D", 456 "RES 6,E", 457 "RES 6,H", 458 "RES 6,L", 459 "RES 6,(HL)", 460 "RES 6,A", 461 "RES 7,B", 462 "RES 7,C", 463 "RES 7,D", 464 "RES 7,E", 465 "RES 7,H", 466 "RES 7,L", 467 "RES 7,(HL)", 468 "RES 7,A", 469 "SET 0,B", 470 "SET 0,C", 471 "SET 0,D", 472 "SET 0,E", 473 "SET 0,H", 474 "SET 0,L", 475 "SET 0,(HL)", 476 "SET 0,A", 477 "SET 1,B", 478 "SET 1,C", 479 "SET 1,D", 480 "SET 1,E", 481 "SET 1,H", 482 "SET 1,L", 483 "SET 1,(HL)", 484 "SET 1,A", 485 "SET 2,B", 486 "SET 2,C", 487 "SET 2,D", 488 "SET 2,E", 489 "SET 2,H", 490 "SET 2,L", 491 "SET 2,(HL)", 492 "SET 2,A", 493 "SET 3,B", 494 "SET 3,C", 495 "SET 3,D", 496 "SET 3,E", 497 "SET 3,H", 498 "SET 3,L", 499 "SET 3,(HL)", 500 "SET 3,A", 501 "SET 4,B", 502 "SET 4,C", 503 "SET 4,D", 504 "SET 4,E", 505 "SET 4,H", 506 "SET 4,L", 507 "SET 4,(HL)", 508 "SET 4,A", 509 "SET 5,B", 510 "SET 5,C", 511 "SET 5,D", 512 "SET 5,E", 513 "SET 5,H", 514 "SET 5,L", 515 "SET 5,(HL)", 516 "SET 5,A", 517 "SET 6,B", 518 "SET 6,C", 519 "SET 6,D", 520 "SET 6,E", 521 "SET 6,H", 522 "SET 6,L", 523 "SET 6,(HL)", 524 "SET 6,A", 525 "SET 7,B", 526 "SET 7,C", 527 "SET 7,D", 528 "SET 7,E", 529 "SET 7,H", 530 "SET 7,L", 531 "SET 7,(HL)", 532 "SET 7,A" 533}; 534 535static byte operand_count[256] = 536{ 537 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, 538 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 539 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 540 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, 541 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 542 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 543 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 544 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 545 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 546 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 547 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 548 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 549 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1, 550 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, 551 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1, 552 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1 553}; 554 555 556/* replace with a real interactive debugger eventually... */ 557 558int debug_trace = 0; 559 560rcvar_t debug_exports[] = 561{ 562 RCV_BOOL("trace", &debug_trace), 563 RCV_END 564}; 565 566void debug_disassemble(addr a, int c) 567{ 568 static int i, j, k; 569 static byte code; 570 static byte ops[3]; 571 static int opaddr; 572 static char mnemonic[256]; 573 static char *pattern; 574 char ops_str[300]; 575 if(!debug_trace) return; 576 577 while (c > 0) 578 { 579 k = 0; 580 opaddr = a; 581 code = ops[k++] = readb(a); a++; 582 if (code != 0xCB) 583 { 584 pattern = mnemonic_table[code]; 585 if (!pattern) 586 pattern = "***INVALID***"; 587 } 588 else 589 { 590 code = ops[k++] = readb(a); a++; 591 pattern = cb_mnemonic_table[code]; 592 } 593 i = j = 0; 594 while (pattern[i]) 595 { 596 if (pattern[i] == '%') 597 { 598 switch (pattern[++i]) 599 { 600 case 'B': 601 case 'b': 602 ops[k] = readb(a); a++; 603 j += snprintf(mnemonic + j,255-j, "%02Xh", ops[k++]); 604 break; 605 case 'W': 606 case 'w': 607 ops[k] = readb(a); a++; 608 ops[k+1] = readb(a); a++; 609 j += snprintf(mnemonic + j, 255-j,"%04Xh", 610 ((ops[k+1] << 8) | ops[k])); 611 k += 2; 612 break; 613 case 'O': 614 case 'o': 615 ops[k] = readb(a); a++; 616 j += snprintf(mnemonic + j, 255-j,"%+d", (n8)(ops[k++])); 617 break; 618 } 619 i++; 620 } 621 else 622 { 623 mnemonic[j++] = pattern[i++]; 624 } 625 } 626 mnemonic[j] = 0; 627 switch (operand_count[ops[0]]) { 628 case 1: 629 snprintf(ops_str,sizeof(ops_str),"%02X ", ops[0]); 630 break; 631 case 2: 632 snprintf(ops_str,sizeof(ops_str),"%02X %02X ", ops[0], ops[1]); 633 break; 634 case 3: 635 snprintf(ops_str,sizeof(ops_str),"%02X %02X %02X", ops[0], ops[1], ops[2]); 636 break; 637 } 638 rb->lcd_putsxyf(0,0,"%04X %s %-16.16s", opaddr, ops_str, mnemonic); 639 rb->lcd_update(); 640 c--; 641 } 642}