akkera 102
/
apuplay
SPC music playback tools for real snes apu
apu2.h@8:072621697467, 2017-01-19 (annotated)
- Committer:
- akkera102
- Date:
- Thu Jan 19 04:51:28 2017 +0000
- Revision:
- 8:072621697467
- Parent:
- 3:b845c0cf715a
fifth
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
akkera102 | 2:62e6e22f8be2 | 1 | #ifndef __apu2_h__ |
akkera102 | 2:62e6e22f8be2 | 2 | #define __apu2_h__ |
akkera102 | 2:62e6e22f8be2 | 3 | |
akkera102 | 2:62e6e22f8be2 | 4 | |
akkera102 | 2:62e6e22f8be2 | 5 | #include <stdio.h> |
akkera102 | 2:62e6e22f8be2 | 6 | |
akkera102 | 2:62e6e22f8be2 | 7 | // offset in a .spc file |
akkera102 | 2:62e6e22f8be2 | 8 | #define OFFSET_SPCDATA 0x100 |
akkera102 | 2:62e6e22f8be2 | 9 | #define OFFSET_DSPDATA 0x10100 |
akkera102 | 2:62e6e22f8be2 | 10 | #define OFFSET_SPCRAM 0x101c0 |
akkera102 | 2:62e6e22f8be2 | 11 | |
akkera102 | 2:62e6e22f8be2 | 12 | // Some SPC registers |
akkera102 | 2:62e6e22f8be2 | 13 | #define SPC_PORT0 0xf4 |
akkera102 | 2:62e6e22f8be2 | 14 | #define SPC_PORT1 0xf5 |
akkera102 | 2:62e6e22f8be2 | 15 | #define SPC_PORT2 0xf6 |
akkera102 | 2:62e6e22f8be2 | 16 | #define SPC_PORT3 0xf7 |
akkera102 | 2:62e6e22f8be2 | 17 | #define SPC_TIMER0 0xfa |
akkera102 | 2:62e6e22f8be2 | 18 | #define SPC_TIMER1 0xfb |
akkera102 | 2:62e6e22f8be2 | 19 | #define SPC_TIMER2 0xfc |
akkera102 | 2:62e6e22f8be2 | 20 | #define SPC_CONTROL 0xf1 |
akkera102 | 2:62e6e22f8be2 | 21 | #define SPC_REGADD 0xf2 |
akkera102 | 2:62e6e22f8be2 | 22 | |
akkera102 | 2:62e6e22f8be2 | 23 | // some Dsp registers address and bits |
akkera102 | 2:62e6e22f8be2 | 24 | #define DSP_FLG 0x6C |
akkera102 | 2:62e6e22f8be2 | 25 | #define DSP_FLG_RES 0x80 |
akkera102 | 2:62e6e22f8be2 | 26 | #define DSP_FLG_MUTE 0x40 |
akkera102 | 2:62e6e22f8be2 | 27 | #define DSP_FLG_ECEN 0x20 |
akkera102 | 2:62e6e22f8be2 | 28 | #define DSP_ESA 0x6D |
akkera102 | 2:62e6e22f8be2 | 29 | #define DSP_EDL 0x7D |
akkera102 | 2:62e6e22f8be2 | 30 | #define DSP_KON 0x4C |
akkera102 | 2:62e6e22f8be2 | 31 | |
akkera102 | 2:62e6e22f8be2 | 32 | #define BOOT_SPC_PORT0 0x19 |
akkera102 | 2:62e6e22f8be2 | 33 | #define BOOT_SPC_PORT1 0x1f |
akkera102 | 2:62e6e22f8be2 | 34 | #define BOOT_SPC_PORT2 0x25 |
akkera102 | 2:62e6e22f8be2 | 35 | #define BOOT_SPC_PORT3 0x2b |
akkera102 | 2:62e6e22f8be2 | 36 | #define BOOT_SPC_TIMER2 0x07 |
akkera102 | 2:62e6e22f8be2 | 37 | #define BOOT_SPC_TIMER1 0x0a |
akkera102 | 2:62e6e22f8be2 | 38 | #define BOOT_SPC_TIMER0 0x0d |
akkera102 | 2:62e6e22f8be2 | 39 | #define BOOT_SPC_CONTROL 0x10 |
akkera102 | 2:62e6e22f8be2 | 40 | #define BOOT_DSP_FLG 0x38 |
akkera102 | 2:62e6e22f8be2 | 41 | #define BOOT_DSP_KON 0x3e |
akkera102 | 2:62e6e22f8be2 | 42 | #define BOOT_SPC_REGADD 0x41 |
akkera102 | 2:62e6e22f8be2 | 43 | #define BOOT_A 0x47 |
akkera102 | 2:62e6e22f8be2 | 44 | #define BOOT_Y 0x49 |
akkera102 | 2:62e6e22f8be2 | 45 | #define BOOT_X 0x4b |
akkera102 | 2:62e6e22f8be2 | 46 | #define BOOT_SP 0x44 |
akkera102 | 2:62e6e22f8be2 | 47 | |
akkera102 | 2:62e6e22f8be2 | 48 | int LoadAPU_embedded(FILE *fp); |
akkera102 | 2:62e6e22f8be2 | 49 | |
akkera102 | 2:62e6e22f8be2 | 50 | |
akkera102 | 2:62e6e22f8be2 | 51 | #endif |
akkera102 | 2:62e6e22f8be2 | 52 | |
akkera102 | 2:62e6e22f8be2 | 53 | |
akkera102 | 2:62e6e22f8be2 | 54 | /* |
akkera102 | 2:62e6e22f8be2 | 55 | |
akkera102 | 2:62e6e22f8be2 | 56 | |
akkera102 | 2:62e6e22f8be2 | 57 | ; Disassembled with spcdasm |
akkera102 | 3:b845c0cf715a | 58 | ; Source filename: ../DSPcode.bin |
akkera102 | 3:b845c0cf715a | 59 | ; Origin: $0002 |
akkera102 | 3:b845c0cf715a | 60 | ; Input length: 16 |
akkera102 | 3:b845c0cf715a | 61 | p0002: MOV $f2 , A ; choose dsp register address (A) |
akkera102 | 3:b845c0cf715a | 62 | p0004: CMP A , $f4 |
akkera102 | 3:b845c0cf715a | 63 | p0006: BNE p0004 ; wait until Port0 equals A |
akkera102 | 3:b845c0cf715a | 64 | p0008: MOV $f3 , $f5 ; now we can copy the value in Port1 |
akkera102 | 3:b845c0cf715a | 65 | ; to the selected dsp address |
akkera102 | 3:b845c0cf715a | 66 | p000b: MOV $f4 , A ; say it's done by setting Port0 to the |
akkera102 | 3:b845c0cf715a | 67 | ; dsp address |
akkera102 | 3:b845c0cf715a | 68 | p000d: INC A ; increment A so we will expect the next address |
akkera102 | 3:b845c0cf715a | 69 | p000e: BPL p0002 ; while < 128, jump to p0002 |
akkera102 | 3:b845c0cf715a | 70 | |
akkera102 | 3:b845c0cf715a | 71 | ; Jumps right after init code in rom, by underflowing |
akkera102 | 3:b845c0cf715a | 72 | ; the 16 bit program counter |
akkera102 | 3:b845c0cf715a | 73 | p0010: BRA pffc9 ; 2fb7 |
akkera102 | 3:b845c0cf715a | 74 | |
akkera102 | 3:b845c0cf715a | 75 | |
akkera102 | 3:b845c0cf715a | 76 | |
akkera102 | 3:b845c0cf715a | 77 | |
akkera102 | 3:b845c0cf715a | 78 | ; Disassembled with spcdasm |
akkera102 | 2:62e6e22f8be2 | 79 | ; Source filename: ../Bootcode.bin |
akkera102 | 2:62e6e22f8be2 | 80 | ; Origin: $0000 |
akkera102 | 2:62e6e22f8be2 | 81 | ; Input length: 77 |
akkera102 | 2:62e6e22f8be2 | 82 | p0000: MOV $0 , #$0 ; $0001: ram $0000 |
akkera102 | 2:62e6e22f8be2 | 83 | p0003: MOV $1 , #$0 ; $0004: ram $0001 |
akkera102 | 2:62e6e22f8be2 | 84 | p0006: MOV $fc , #$ff ; $0007: Timer2 |
akkera102 | 2:62e6e22f8be2 | 85 | p0009: MOV $fb , #$ff ; $000a: Timer1 |
akkera102 | 2:62e6e22f8be2 | 86 | p000c: MOV $fa , #$4f ; $000d: Timer0 |
akkera102 | 2:62e6e22f8be2 | 87 | p000f: MOV $f1 , #$31 ; $0010: SPC Control reg |
akkera102 | 2:62e6e22f8be2 | 88 | p0012: MOV X , #$53 ; |
akkera102 | 2:62e6e22f8be2 | 89 | p0014: MOV $f4 , X ; |
akkera102 | 2:62e6e22f8be2 | 90 | p0016: MOV A , $f4 ; |
akkera102 | 2:62e6e22f8be2 | 91 | p0018: CMP A , #$0 ; $0019: Port0 |
akkera102 | 2:62e6e22f8be2 | 92 | p001a: BNE p0016 ; |
akkera102 | 2:62e6e22f8be2 | 93 | p001c: MOV A , $f5 ; |
akkera102 | 2:62e6e22f8be2 | 94 | p001e: CMP A , #$0 ; $001f: Port1 |
akkera102 | 2:62e6e22f8be2 | 95 | p0020: BNE p001c ; |
akkera102 | 2:62e6e22f8be2 | 96 | p0022: MOV A , $f6 ; |
akkera102 | 2:62e6e22f8be2 | 97 | p0024: CMP A , #$0 ; $0024: Port2 |
akkera102 | 2:62e6e22f8be2 | 98 | p0026: BNE p0022 ; |
akkera102 | 2:62e6e22f8be2 | 99 | p0028: MOV A , $f7 ; |
akkera102 | 2:62e6e22f8be2 | 100 | p002a: CMP A , #$0 ; $002b: Port3 |
akkera102 | 2:62e6e22f8be2 | 101 | p002c: BNE p0028 ; |
akkera102 | 2:62e6e22f8be2 | 102 | p002e: MOV A , $fd ; |
akkera102 | 2:62e6e22f8be2 | 103 | p0030: MOV A , $fe ; |
akkera102 | 2:62e6e22f8be2 | 104 | p0032: MOV A , $ff ; |
akkera102 | 2:62e6e22f8be2 | 105 | p0034: MOV $f2 , #$6c ; point to flg register |
akkera102 | 2:62e6e22f8be2 | 106 | p0037: MOV $f3 , #$0 ; $0038: DSP FLG register |
akkera102 | 2:62e6e22f8be2 | 107 | p003a: MOV $f2 , #$4c ; point to kon register |
akkera102 | 2:62e6e22f8be2 | 108 | p003d: MOV $f3 , #$0 ; $003e: DSP KON register |
akkera102 | 2:62e6e22f8be2 | 109 | p0040: MOV $f2 , #$7f ; $0041: SPC dsp reg addr. |
akkera102 | 2:62e6e22f8be2 | 110 | p0043: MOV X , #$f5 ; $0044: SPC stack pointer |
akkera102 | 2:62e6e22f8be2 | 111 | p0045: MOV SP , X ; |
akkera102 | 2:62e6e22f8be2 | 112 | p0046: MOV A , #$ff ; $0047: SPC A register |
akkera102 | 2:62e6e22f8be2 | 113 | p0048: MOV Y , #$0 ; $0049: SPC Y register |
akkera102 | 2:62e6e22f8be2 | 114 | p004a: MOV X , #$0 ; $004b: SPC X register |
akkera102 | 2:62e6e22f8be2 | 115 | p004c: RETI ; |
akkera102 | 2:62e6e22f8be2 | 116 | |
akkera102 | 2:62e6e22f8be2 | 117 | |
akkera102 | 2:62e6e22f8be2 | 118 | */ |