├── LIB ├── SMS_HEADER.ASM ├── SMS_INPUT.ASM ├── SMS_PSG.ASM └── SMS_VDP.ASM ├── PSG └── SMSAudio │ ├── Font8x8.asm │ ├── FontPAL.asm │ ├── LIB │ ├── SMS_HEADER.ASM │ ├── SMS_INPUT.ASM │ ├── SMS_PSG.ASM │ └── SMS_VDP.ASM │ ├── SMSAudio.asm │ ├── SMSAudio.png │ ├── SMSAudio.sms │ └── make.bat ├── README.md └── VDP ├── HelloWorld ├── Font8x8.asm ├── FontPAL.asm ├── HelloWorld.asm ├── HelloWorld.png ├── HelloWorld.sms ├── LIB │ ├── SMS_HEADER.ASM │ └── SMS_VDP.ASM └── make.bat └── Sprite ├── BGSPRCHR.asm ├── BGSPRPAL.asm ├── LIB ├── SMS_HEADER.ASM └── SMS_VDP.ASM ├── Sprite.asm ├── Sprite.png ├── Sprite.sms └── make.bat /LIB/SMS_HEADER.ASM: -------------------------------------------------------------------------------- 1 | //============ 2 | // SMS Header 3 | //============ 4 | seek($7FF0) // Header Can Be At Offset $1FF0, $3FF0 Or $7FF0 5 | db "TMR SEGA" // ($7FF0) Required For Export Master System & Game Gear BIOS 6 | db 0, 0 // ($7FF8) Reserved Space, Can Be $20,$20 For 2 ASCII Spaces e.g "TMR SEGA__" 7 | db 0, 0 // ($7FFA) Little-Endian Word ROM Checksum For Export Master System BIOS 8 | 9 | // BCD Product Code = 15027 / Version Number = 0 ($7FFC) 10 | db $27, $50, $10 // BCD Product Code 2.5 Bytes / Version Number 0.5 Bytes 11 | // Byte 3 2 1 Byte 3 12 | // Bits 4..7 0..7 0..7 Bits 0..3 13 | // Value Product Code Value Version Number 14 | // $1 $50 $27 $0 15 | 16 | // Region Code = SMS Export / ROM Size = 128KB ($7FFF) 17 | db $4F // Region Code 0.5 Bytes / ROM Size 0.5 Bytes: 18 | // Bits 4..7 Bits 0..3 19 | // Value System / Region Value Rom Size Comment 20 | // $3 SMS Japan $A 8KB Unused 21 | // $4 SMS Export $B 16KB Unused 22 | // $5 GG Japan $C 32KB 23 | // $6 GG Export $D 48KB Unused Buggy 24 | // $7 GG International $E 64KB Rarely Used 25 | // $F 128KB 26 | // $0 256KB 27 | // $1 512KB Rarely Used 28 | // $2 1MB Unused Buggy -------------------------------------------------------------------------------- /LIB/SMS_INPUT.ASM: -------------------------------------------------------------------------------- 1 | //=========== 2 | // SMS Input 3 | //=========== 4 | // %DUBARLDU: U = Joy1Up, D = Joy1Down, L = Joy1Left, R = Joy1Right, A = Joy1A, B = Joy1B, U = Joy2Up, D = Joy2Down 5 | // Test Port A Joypad Status Register 6 | macro TESTPortA(STATUS) { // STATUS = Bitfield To Compare 7 | in a,($DC) // A = Joypad Status Register (PortA) 8 | and {STATUS} 9 | } 10 | 11 | // %000RBARL: L = Joy2Left, R = Joy2Right, A = Joy2A, B = Joy2B, R = Reset Button 12 | // Test Port B Joypad Status Register 13 | macro TESTPortB(STATUS) { // STATUS = Bitfield To Compare 14 | in a,($DD) // A = Joypad Status Register (PortB) 15 | and {STATUS} 16 | } -------------------------------------------------------------------------------- /LIB/SMS_PSG.ASM: -------------------------------------------------------------------------------- 1 | //========= 2 | // SMS PSG 3 | //========= 4 | // Write 4 Bytes Of Data To PSG 5 | macro PSGWrite(DATA) { // DATA = Bytes To Send To PSG Register 6 | ld hl,{DATA} // HL = Data Address 7 | ld b,4 // B = Data Length (4 Bytes) 8 | ld c,$7F // C = PSG Port ($7F) 9 | otir // OUT (C), (LD A, (HL)++), A = Byte Loaded From HL Address, Write Byte To PSG, Offset++, B-- 10 | } 11 | 12 | // Write Data Byte To PSG 13 | macro PSGWriteByte(DATA) { // DATA = Byte To Send To VDP Register 14 | ld a,{DATA} // A = PSG Data 15 | out ($7F),a // Write PSG Data To PSG Register 16 | } -------------------------------------------------------------------------------- /LIB/SMS_VDP.ASM: -------------------------------------------------------------------------------- 1 | //========= 2 | // SMS VDP 3 | //========= 4 | // Wait For Vertical Counter Position 5 | macro VDPWaitV(VPOS) { // VPOS = Wait Vertical Counter Position 6 | - 7 | in a,($7E) // A = Current Vertical Counter Position 8 | cp {VPOS} // IF (Current Vertical Counter Position != VPOS) 9 | jr nz,- // Wait For Vertical Counter Position 10 | } 11 | 12 | // Wait For Horizontal Counter Position 13 | macro VDPWaitH(HPOS) { // HPOS = Wait Horizontal Counter Position 14 | - 15 | in a,($7F) // A = Current Horizontal Counter Position 16 | cp {HPOS} // IF (Current Horizontal Counter Position != HPOS) 17 | jr nz,- // Wait For Horizontal Counter Position 18 | } 19 | 20 | // Write Data Byte To VDP Register 21 | macro VDPREGWrite(DATA, REG) { // DATA = Byte To Send To VDP, REG = VDP Register To Write (0..15) 22 | ld a,{DATA} // A = VDP Register Data 23 | out ($BF),a // Write VDP Register Data To VDP (1st Byte Of Command Pair) 24 | ld a,%10000000 + {REG} // A = VDP REG Write, VDP Register (%TT00RRRR TT %10 = VDP REG Write, %RRRR = VDP Register 0..15) 25 | out ($BF),a // Write VDP Data To VDP Register (2nd Byte Of Command Pair) 26 | } 27 | 28 | // Write SMS 6-Bit BGR Palette # Of Colors Offset By Address To CRAM 29 | macro SMSPALWrite(PAL, COL, OFFSET) { // PAL = Palette Address, COL = Number Of Colors (0..32), OFFSET = CRAM Address Offset (0..32) 30 | ld a,{OFFSET} // A = CRAM Address Offset (%000AAAAA = CRAM Address Offset) 31 | out ($BF),a // Write CRAM Address Offset To VDP (1st Byte Of Command Pair) 32 | ld a,%11000000 // A = CRAM Write Command (%11000000 = CRAM Write) 33 | out ($BF),a // Write CRAM Write Command To VDP (2nd Byte Of Command Pair) 34 | ld hl,{PAL} // HL = Palette Address 35 | ld b,{COL} // B = Palette Data Size In Bytes 36 | ld c,$BE 37 | otir // OUT (C), (LD A, (HL)++), A = 6-Bit Palette Color %00BBGGRR Loaded From HL Palette Address, Write Palette Color To VDP CRAM Address Offset, Offset++, B-- 38 | } 39 | 40 | // Write Tile Characters # Of Tiles Offset By Addres To VRAM 41 | macro VDPCHRWrite(TILE, NUM, OFFSET) { // TILE = Tile Address, NUM = Number Of Tiles (0..255), OFFSET = VRAM Address Offset 42 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 43 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 44 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 45 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 46 | ld hl,{TILE} // HL = Tile Address 47 | ld c,$BE 48 | ld d,{NUM} // D = Number Of Tiles 49 | - 50 | ld b,32 // B = Number Of Tile Bytes To Write (8 * 4 Bits = 32 Bytes) 51 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Byte Loaded From HL Tile Address, Write Tile Byte To VDP VRAM Address Offset, Offset++, B-- 52 | dec d // Decrement Number Of Tiles 53 | jr nz,- // Writes # Of Tiles To VRAM 54 | } 55 | 56 | // Write Tile Map # Of Tile Map Words Offset By Address To VRAM 57 | macro VDPMAPWrite(MAP, NUM, OFFSET) { // MAP = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 58 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 59 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 60 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 61 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 62 | ld hl,{MAP} // HL = Tile Map Address 63 | ld b,{NUM} // B = Number Of Tile Map Words 64 | - 65 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 66 | inc b // Increment Number Of Tile Map Words 67 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 68 | jr nz,- // Writes # Of Tile Map Words To VRAM 69 | } 70 | 71 | // Write HL Tile Map # Of Tile Map Words Offset By Address To VRAM 72 | macro VDPMAPWriteHL(NUM, OFFSET) { // HL = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 73 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 74 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 75 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 76 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd byte Of Command Pair) 77 | ld b,{NUM} // B = Number Of Tile Map Words 78 | - 79 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 80 | inc b // Increment Number Of Tile Map Words 81 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 82 | jr nz,- // Writes # Of Tile Map Words To VRAM 83 | } 84 | 85 | // Repeat Tile Map # Of Tile Map Words Offset By Address To VRAM 86 | macro VDPMAPRepeat(MAPA, MAPB, NUM, OFFSET) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255), OFFSET = VRAM Address Offset 87 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 88 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 89 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 90 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 91 | ld a,{MAPA} // A = Tile Map Byte A 92 | ld b,{MAPB} // B = Tile Map Byte B 93 | ld c,$BE 94 | ld d,{NUM} // D = Number Of Repeats 95 | - 96 | out (c),a // Write Tile Map Byte A To VDP VRAM Address Offset, VRAM Address Offset++ 97 | out (c),b // Write Tile Map Byte B To VDP VRAM Address Offset, VRAM Address Offset++ 98 | dec d // Decrement Number Of Repeats 99 | jr nz,- // Writes # Of Tile Map Words To VRAM 100 | } 101 | 102 | // Repeating Tile Map # Of Tile Map Words To VRAM 103 | macro VDPMAPRepeating(MAPA, MAPB, NUM) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255) 104 | ld a,{MAPA} // A = Tile Map Byte A 105 | ld b,{MAPB} // B = Tile Map Byte B 106 | ld d,{NUM} // D = Number Of Repeats 107 | - 108 | out (c),a // Write Tile Map Byte A into VDP VRAM Address Offset, VRAM Address Offset++ 109 | out (c),b // Write Tile Map Byte B into VDP VRAM Address Offset, VRAM Address Offset++ 110 | dec d // Decrement Number Of Repeats 111 | jr nz,- // Writes # of tile map words to VRAM 112 | } 113 | 114 | // Write Data # Of Bytes Offset By Address To VRAM 115 | macro VDPVRAMWrite(DATA, NUM, OFFSET) { // DATA = Data Address, NUM = Number Of Bytes (0..255), OFFSET = VRAM Address Offset 116 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 117 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 118 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 119 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 120 | ld hl,{DATA} // HL = Data Address 121 | ld b,{NUM} // B = Number Of Bytes 122 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 123 | } 124 | 125 | // Writing Data # Of Bytes Offset By Address To VRAM 126 | macro VDPVRAMWriting(DATA, NUM) { // DATA = Data Address, NUM = Number of Bytes (0..255) 127 | ld hl,{DATA} // HL = Data Address 128 | ld b,{NUM} // B = Number Of Bytes 129 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 130 | } -------------------------------------------------------------------------------- /PSG/SMSAudio/Font8x8.asm: -------------------------------------------------------------------------------- 1 | //=================== 2 | // ASCii SMS/GG Font 3 | //=================== 4 | // $20 - Space " " 5 | db %00000000, 0, 0, 0 6 | db %00000000, 0, 0, 0 7 | db %00000000, 0, 0, 0 8 | db %00000000, 0, 0, 0 9 | db %00000000, 0, 0, 0 10 | db %00000000, 0, 0, 0 11 | db %00000000, 0, 0, 0 12 | db %00000000, 0, 0, 0 13 | 14 | // $21 - Exclamation mark "!" 15 | db %00011000, 0, 0, 0 16 | db %00011000, 0, 0, 0 17 | db %00011000, 0, 0, 0 18 | db %00011000, 0, 0, 0 19 | db %00000000, 0, 0, 0 20 | db %00011000, 0, 0, 0 21 | db %00000000, 0, 0, 0 22 | db %00000000, 0, 0, 0 23 | 24 | // $22 - Quotation mark """ 25 | db %01100110, 0, 0, 0 26 | db %01100110, 0, 0, 0 27 | db %01000100, 0, 0, 0 28 | db %00000000, 0, 0, 0 29 | db %00000000, 0, 0, 0 30 | db %00000000, 0, 0, 0 31 | db %00000000, 0, 0, 0 32 | db %00000000, 0, 0, 0 33 | 34 | // $23 - Cross hatch "#" 35 | db %00010100, 0, 0, 0 36 | db %00010100, 0, 0, 0 37 | db %01111110, 0, 0, 0 38 | db %00101000, 0, 0, 0 39 | db %01111110, 0, 0, 0 40 | db %00101000, 0, 0, 0 41 | db %00000000, 0, 0, 0 42 | db %00000000, 0, 0, 0 43 | 44 | // $24 - Dollar sign "$" 45 | db %00111100, 0, 0, 0 46 | db %01101010, 0, 0, 0 47 | db %01111100, 0, 0, 0 48 | db %00111110, 0, 0, 0 49 | db %01010110, 0, 0, 0 50 | db %00111100, 0, 0, 0 51 | db %00010000, 0, 0, 0 52 | db %00000000, 0, 0, 0 53 | 54 | // $25 - Percent sign "%" 55 | db %00100010, 0, 0, 0 56 | db %01010100, 0, 0, 0 57 | db %00101000, 0, 0, 0 58 | db %00010100, 0, 0, 0 59 | db %00101010, 0, 0, 0 60 | db %01000100, 0, 0, 0 61 | db %00000000, 0, 0, 0 62 | db %00000000, 0, 0, 0 63 | 64 | // $26 - Ampersand "&" 65 | db %00110000, 0, 0, 0 66 | db %01001000, 0, 0, 0 67 | db %00110010, 0, 0, 0 68 | db %01001100, 0, 0, 0 69 | db %01001100, 0, 0, 0 70 | db %00110010, 0, 0, 0 71 | db %00000000, 0, 0, 0 72 | db %00000000, 0, 0, 0 73 | 74 | // $27 - Closing single quote "'" 75 | db %00011000, 0, 0, 0 76 | db %00011000, 0, 0, 0 77 | db %00010000, 0, 0, 0 78 | db %00000000, 0, 0, 0 79 | db %00000000, 0, 0, 0 80 | db %00000000, 0, 0, 0 81 | db %00000000, 0, 0, 0 82 | db %00000000, 0, 0, 0 83 | 84 | // $28 - Opening parentheses "(" 85 | db %00001100, 0, 0, 0 86 | db %00011000, 0, 0, 0 87 | db %00110000, 0, 0, 0 88 | db %00110000, 0, 0, 0 89 | db %00110000, 0, 0, 0 90 | db %00110000, 0, 0, 0 91 | db %00011000, 0, 0, 0 92 | db %00001100, 0, 0, 0 93 | 94 | // $29 - Closing parentheses ")" 95 | db %00110000, 0, 0, 0 96 | db %00011000, 0, 0, 0 97 | db %00001100, 0, 0, 0 98 | db %00001100, 0, 0, 0 99 | db %00001100, 0, 0, 0 100 | db %00001100, 0, 0, 0 101 | db %00011000, 0, 0, 0 102 | db %00110000, 0, 0, 0 103 | 104 | // $2A - Asterisk "*" 105 | db %00011000, 0, 0, 0 106 | db %01111110, 0, 0, 0 107 | db %00011000, 0, 0, 0 108 | db %00100100, 0, 0, 0 109 | db %00000000, 0, 0, 0 110 | db %00000000, 0, 0, 0 111 | db %00000000, 0, 0, 0 112 | db %00000000, 0, 0, 0 113 | 114 | // $2B - Plus "+" 115 | db %00000000, 0, 0, 0 116 | db %00011000, 0, 0, 0 117 | db %00011000, 0, 0, 0 118 | db %01111110, 0, 0, 0 119 | db %00011000, 0, 0, 0 120 | db %00011000, 0, 0, 0 121 | db %00000000, 0, 0, 0 122 | db %00000000, 0, 0, 0 123 | 124 | // $2C - Comma "," 125 | db %00000000, 0, 0, 0 126 | db %00000000, 0, 0, 0 127 | db %00000000, 0, 0, 0 128 | db %00000000, 0, 0, 0 129 | db %00011000, 0, 0, 0 130 | db %00011000, 0, 0, 0 131 | db %00010000, 0, 0, 0 132 | db %00000000, 0, 0, 0 133 | 134 | // $2D - Hyphen "-" 135 | db %00000000, 0, 0, 0 136 | db %00000000, 0, 0, 0 137 | db %00000000, 0, 0, 0 138 | db %00111100, 0, 0, 0 139 | db %00000000, 0, 0, 0 140 | db %00000000, 0, 0, 0 141 | db %00000000, 0, 0, 0 142 | db %00000000, 0, 0, 0 143 | 144 | // $2E - Period "." 145 | db %00000000, 0, 0, 0 146 | db %00000000, 0, 0, 0 147 | db %00000000, 0, 0, 0 148 | db %00000000, 0, 0, 0 149 | db %00011000, 0, 0, 0 150 | db %00011000, 0, 0, 0 151 | db %00000000, 0, 0, 0 152 | db %00000000, 0, 0, 0 153 | 154 | // $2F - Forward slash "/" 155 | db %00000010, 0, 0, 0 156 | db %00000110, 0, 0, 0 157 | db %00001100, 0, 0, 0 158 | db %00011000, 0, 0, 0 159 | db %00110000, 0, 0, 0 160 | db %01100000, 0, 0, 0 161 | db %01000000, 0, 0, 0 162 | db %00000000, 0, 0, 0 163 | 164 | ;;;;;;;;;;;;;;;;;;;;; 165 | // $30 - 0 166 | db %00111010, 0, 0, 0 167 | db %01100100, 0, 0, 0 168 | db %01001010, 0, 0, 0 169 | db %01010010, 0, 0, 0 170 | db %00100110, 0, 0, 0 171 | db %01011100, 0, 0, 0 172 | db %00000000, 0, 0, 0 173 | db %00000000, 0, 0, 0 174 | 175 | // $31 - 1 176 | db %00011000, 0, 0, 0 177 | db %00111000, 0, 0, 0 178 | db %00011000, 0, 0, 0 179 | db %00011000, 0, 0, 0 180 | db %00011000, 0, 0, 0 181 | db %00111100, 0, 0, 0 182 | db %00000000, 0, 0, 0 183 | db %00000000, 0, 0, 0 184 | 185 | // $32 - 2 186 | db %00111000, 0, 0, 0 187 | db %01001100, 0, 0, 0 188 | db %00001100, 0, 0, 0 189 | db %00011000, 0, 0, 0 190 | db %00110000, 0, 0, 0 191 | db %01111110, 0, 0, 0 192 | db %00000000, 0, 0, 0 193 | db %00000000, 0, 0, 0 194 | 195 | // $33 - 3 196 | db %00111100, 0, 0, 0 197 | db %01000110, 0, 0, 0 198 | db %00011100, 0, 0, 0 199 | db %00000110, 0, 0, 0 200 | db %01000110, 0, 0, 0 201 | db %00111100, 0, 0, 0 202 | db %00000000, 0, 0, 0 203 | db %00000000, 0, 0, 0 204 | 205 | // $34 - 4 206 | db %00001100, 0, 0, 0 207 | db %00011100, 0, 0, 0 208 | db %00101100, 0, 0, 0 209 | db %01001100, 0, 0, 0 210 | db %01111110, 0, 0, 0 211 | db %00001100, 0, 0, 0 212 | db %00000000, 0, 0, 0 213 | db %00000000, 0, 0, 0 214 | 215 | // $35 - 5 216 | db %01111110, 0, 0, 0 217 | db %01100000, 0, 0, 0 218 | db %01111100, 0, 0, 0 219 | db %00000110, 0, 0, 0 220 | db %01000110, 0, 0, 0 221 | db %00111100, 0, 0, 0 222 | db %00000000, 0, 0, 0 223 | db %00000000, 0, 0, 0 224 | 225 | // $36 - 6 226 | db %00111100, 0, 0, 0 227 | db %01100000, 0, 0, 0 228 | db %01111100, 0, 0, 0 229 | db %01100110, 0, 0, 0 230 | db %01100110, 0, 0, 0 231 | db %00111100, 0, 0, 0 232 | db %00000000, 0, 0, 0 233 | db %00000000, 0, 0, 0 234 | 235 | // $37 - 7 236 | db %01111110, 0, 0, 0 237 | db %01100110, 0, 0, 0 238 | db %00001100, 0, 0, 0 239 | db %00111110, 0, 0, 0 240 | db %00011000, 0, 0, 0 241 | db %00011000, 0, 0, 0 242 | db %00000000, 0, 0, 0 243 | db %00000000, 0, 0, 0 244 | 245 | // $38 - 8 246 | db %00111100, 0, 0, 0 247 | db %01100110, 0, 0, 0 248 | db %00111100, 0, 0, 0 249 | db %01100110, 0, 0, 0 250 | db %01100110, 0, 0, 0 251 | db %00111100, 0, 0, 0 252 | db %00000000, 0, 0, 0 253 | db %00000000, 0, 0, 0 254 | 255 | // $39 - 9 256 | db %00111100, 0, 0, 0 257 | db %01100110, 0, 0, 0 258 | db %01100110, 0, 0, 0 259 | db %00111110, 0, 0, 0 260 | db %00000110, 0, 0, 0 261 | db %00111100, 0, 0, 0 262 | db %00000000, 0, 0, 0 263 | db %00000000, 0, 0, 0 264 | 265 | ;;;;;;;;;;;;;;;;;;;;; 266 | // $3A - Colon ":" 267 | db %00000000, 0, 0, 0 268 | db %00011000, 0, 0, 0 269 | db %00011000, 0, 0, 0 270 | db %00000000, 0, 0, 0 271 | db %00011000, 0, 0, 0 272 | db %00011000, 0, 0, 0 273 | db %00000000, 0, 0, 0 274 | db %00000000, 0, 0, 0 275 | 276 | // $3B - Semicolon ";" 277 | db %00000000, 0, 0, 0 278 | db %00011000, 0, 0, 0 279 | db %00011000, 0, 0, 0 280 | db %00000000, 0, 0, 0 281 | db %00011000, 0, 0, 0 282 | db %00011000, 0, 0, 0 283 | db %00010000, 0, 0, 0 284 | db %00000000, 0, 0, 0 285 | 286 | // $3C - Less than sign "<" 287 | db %00000000, 0, 0, 0 288 | db %00000110, 0, 0, 0 289 | db %00011000, 0, 0, 0 290 | db %01100000, 0, 0, 0 291 | db %00011000, 0, 0, 0 292 | db %00000110, 0, 0, 0 293 | db %00000000, 0, 0, 0 294 | db %00000000, 0, 0, 0 295 | 296 | // $3D - Equals sign "=" 297 | db %00000000, 0, 0, 0 298 | db %00000000, 0, 0, 0 299 | db %01111110, 0, 0, 0 300 | db %00000000, 0, 0, 0 301 | db %01111110, 0, 0, 0 302 | db %00000000, 0, 0, 0 303 | db %00000000, 0, 0, 0 304 | db %00000000, 0, 0, 0 305 | 306 | // $3E - Greater than sign ">" 307 | db %00000000, 0, 0, 0 308 | db %01100000, 0, 0, 0 309 | db %00011000, 0, 0, 0 310 | db %00000110, 0, 0, 0 311 | db %00011000, 0, 0, 0 312 | db %01100000, 0, 0, 0 313 | db %00000000, 0, 0, 0 314 | db %00000000, 0, 0, 0 315 | 316 | // $3F - Question mark "?" 317 | db %00111100, 0, 0, 0 318 | db %01100110, 0, 0, 0 319 | db %01100110, 0, 0, 0 320 | db %00001100, 0, 0, 0 321 | db %00011000, 0, 0, 0 322 | db %00000000, 0, 0, 0 323 | db %00011000, 0, 0, 0 324 | db %00000000, 0, 0, 0 325 | 326 | // $40 - At sign "@" 327 | db %01111100, 0, 0, 0 328 | db %10000010, 0, 0, 0 329 | db %10111010, 0, 0, 0 330 | db %10101010, 0, 0, 0 331 | db %10111110, 0, 0, 0 332 | db %01000000, 0, 0, 0 333 | db %00111110, 0, 0, 0 334 | db %00000000, 0, 0, 0 335 | 336 | ;;;;;;;;;;;;;;;;;;;;; 337 | // $41 - A 338 | db %00011000, 0, 0, 0 339 | db %00111100, 0, 0, 0 340 | db %00100100, 0, 0, 0 341 | db %01111110, 0, 0, 0 342 | db %01100110, 0, 0, 0 343 | db %01100110, 0, 0, 0 344 | db %00000000, 0, 0, 0 345 | db %00000000, 0, 0, 0 346 | 347 | // $42 - B 348 | db %01111100, 0, 0, 0 349 | db %01100110, 0, 0, 0 350 | db %01111100, 0, 0, 0 351 | db %01100110, 0, 0, 0 352 | db %01100110, 0, 0, 0 353 | db %01111100, 0, 0, 0 354 | db %00000000, 0, 0, 0 355 | db %00000000, 0, 0, 0 356 | 357 | // $43 - C 358 | db %00111100, 0, 0, 0 359 | db %01100110, 0, 0, 0 360 | db %01100000, 0, 0, 0 361 | db %01100010, 0, 0, 0 362 | db %01111110, 0, 0, 0 363 | db %00111100, 0, 0, 0 364 | db %00000000, 0, 0, 0 365 | db %00000000, 0, 0, 0 366 | 367 | // $44 - D 368 | db %01111100, 0, 0, 0 369 | db %01100110, 0, 0, 0 370 | db %01100110, 0, 0, 0 371 | db %01100110, 0, 0, 0 372 | db %01111110, 0, 0, 0 373 | db %01111100, 0, 0, 0 374 | db %00000000, 0, 0, 0 375 | db %00000000, 0, 0, 0 376 | 377 | // $45 - E 378 | db %01111110, 0, 0, 0 379 | db %01100000, 0, 0, 0 380 | db %01111100, 0, 0, 0 381 | db %01100000, 0, 0, 0 382 | db %01111110, 0, 0, 0 383 | db %01111110, 0, 0, 0 384 | db %00000000, 0, 0, 0 385 | db %00000000, 0, 0, 0 386 | 387 | // $46 - F 388 | db %01111110, 0, 0, 0 389 | db %01100000, 0, 0, 0 390 | db %01111100, 0, 0, 0 391 | db %01100000, 0, 0, 0 392 | db %01100000, 0, 0, 0 393 | db %01100000, 0, 0, 0 394 | db %00000000, 0, 0, 0 395 | db %00000000, 0, 0, 0 396 | 397 | // $47 - G 398 | db %00111100, 0, 0, 0 399 | db %01100110, 0, 0, 0 400 | db %01100000, 0, 0, 0 401 | db %01101110, 0, 0, 0 402 | db %01100110, 0, 0, 0 403 | db %00111100, 0, 0, 0 404 | db %00000000, 0, 0, 0 405 | db %00000000, 0, 0, 0 406 | 407 | // $48 - H 408 | db %01100110, 0, 0, 0 409 | db %01100110, 0, 0, 0 410 | db %01111110, 0, 0, 0 411 | db %01100110, 0, 0, 0 412 | db %01100110, 0, 0, 0 413 | db %01100110, 0, 0, 0 414 | db %00000000, 0, 0, 0 415 | db %00000000, 0, 0, 0 416 | 417 | // $49 - I 418 | db %01111110, 0, 0, 0 419 | db %00011000, 0, 0, 0 420 | db %00011000, 0, 0, 0 421 | db %00011000, 0, 0, 0 422 | db %01111110, 0, 0, 0 423 | db %01111110, 0, 0, 0 424 | db %00000000, 0, 0, 0 425 | db %00000000, 0, 0, 0 426 | 427 | // $4A - J 428 | db %00111110, 0, 0, 0 429 | db %00001100, 0, 0, 0 430 | db %00001100, 0, 0, 0 431 | db %01001100, 0, 0, 0 432 | db %01111100, 0, 0, 0 433 | db %00111000, 0, 0, 0 434 | db %00000000, 0, 0, 0 435 | db %00000000, 0, 0, 0 436 | 437 | // $4B - K 438 | db %01100110, 0, 0, 0 439 | db %01101100, 0, 0, 0 440 | db %01111000, 0, 0, 0 441 | db %01111000, 0, 0, 0 442 | db %01101100, 0, 0, 0 443 | db %01100110, 0, 0, 0 444 | db %00000000, 0, 0, 0 445 | db %00000000, 0, 0, 0 446 | 447 | // $4C - L 448 | db %01100000, 0, 0, 0 449 | db %01100000, 0, 0, 0 450 | db %01100000, 0, 0, 0 451 | db %01100000, 0, 0, 0 452 | db %01111110, 0, 0, 0 453 | db %01111110, 0, 0, 0 454 | db %00000000, 0, 0, 0 455 | db %00000000, 0, 0, 0 456 | 457 | // $4D - M 458 | db %01000010, 0, 0, 0 459 | db %01100110, 0, 0, 0 460 | db %01111110, 0, 0, 0 461 | db %01011010, 0, 0, 0 462 | db %01011010, 0, 0, 0 463 | db %01000010, 0, 0, 0 464 | db %00000000, 0, 0, 0 465 | db %00000000, 0, 0, 0 466 | 467 | // $4E - N 468 | db %01000110, 0, 0, 0 469 | db %01100110, 0, 0, 0 470 | db %01110110, 0, 0, 0 471 | db %01111110, 0, 0, 0 472 | db %01101110, 0, 0, 0 473 | db %01100110, 0, 0, 0 474 | db %00000000, 0, 0, 0 475 | db %00000000, 0, 0, 0 476 | 477 | // $4F - O 478 | db %00111100, 0, 0, 0 479 | db %01100110, 0, 0, 0 480 | db %01100110, 0, 0, 0 481 | db %01100110, 0, 0, 0 482 | db %01111110, 0, 0, 0 483 | db %00111100, 0, 0, 0 484 | db %00000000, 0, 0, 0 485 | db %00000000, 0, 0, 0 486 | 487 | // $50 - P 488 | db %01111100, 0, 0, 0 489 | db %01100110, 0, 0, 0 490 | db %01111110, 0, 0, 0 491 | db %01111100, 0, 0, 0 492 | db %01100000, 0, 0, 0 493 | db %01100000, 0, 0, 0 494 | db %00000000, 0, 0, 0 495 | db %00000000, 0, 0, 0 496 | 497 | // $51 - Q 498 | db %00111100, 0, 0, 0 499 | db %01100110, 0, 0, 0 500 | db %01100010, 0, 0, 0 501 | db %01101010, 0, 0, 0 502 | db %01111110, 0, 0, 0 503 | db %00111100, 0, 0, 0 504 | db %00000010, 0, 0, 0 505 | db %00000000, 0, 0, 0 506 | 507 | // $52 - R 508 | db %01111100, 0, 0, 0 509 | db %01100110, 0, 0, 0 510 | db %01111110, 0, 0, 0 511 | db %01111100, 0, 0, 0 512 | db %01101100, 0, 0, 0 513 | db %01100110, 0, 0, 0 514 | db %00000000, 0, 0, 0 515 | db %00000000, 0, 0, 0 516 | 517 | // $53 - S 518 | db %00111100, 0, 0, 0 519 | db %01100010, 0, 0, 0 520 | db %01111100, 0, 0, 0 521 | db %00111110, 0, 0, 0 522 | db %01000110, 0, 0, 0 523 | db %00111100, 0, 0, 0 524 | db %00000000, 0, 0, 0 525 | db %00000000, 0, 0, 0 526 | 527 | // $54 - T 528 | db %01111110, 0, 0, 0 529 | db %00011000, 0, 0, 0 530 | db %00011000, 0, 0, 0 531 | db %00011000, 0, 0, 0 532 | db %00011000, 0, 0, 0 533 | db %00011000, 0, 0, 0 534 | db %00000000, 0, 0, 0 535 | db %00000000, 0, 0, 0 536 | 537 | // $55 - U 538 | db %01100110, 0, 0, 0 539 | db %01100110, 0, 0, 0 540 | db %01100110, 0, 0, 0 541 | db %01100110, 0, 0, 0 542 | db %01111110, 0, 0, 0 543 | db %00111100, 0, 0, 0 544 | db %00000000, 0, 0, 0 545 | db %00000000, 0, 0, 0 546 | 547 | // $56 - V 548 | db %01100110, 0, 0, 0 549 | db %01100110, 0, 0, 0 550 | db %01100110, 0, 0, 0 551 | db %00100100, 0, 0, 0 552 | db %00111100, 0, 0, 0 553 | db %00011000, 0, 0, 0 554 | db %00000000, 0, 0, 0 555 | db %00000000, 0, 0, 0 556 | 557 | // $57 - W 558 | db %01000010, 0, 0, 0 559 | db %01011010, 0, 0, 0 560 | db %01011010, 0, 0, 0 561 | db %01111110, 0, 0, 0 562 | db %01100110, 0, 0, 0 563 | db %01000010, 0, 0, 0 564 | db %00000000, 0, 0, 0 565 | db %00000000, 0, 0, 0 566 | 567 | // $58 - X 568 | db %01100110, 0, 0, 0 569 | db %00111100, 0, 0, 0 570 | db %00011000, 0, 0, 0 571 | db %00111100, 0, 0, 0 572 | db %01100110, 0, 0, 0 573 | db %01000010, 0, 0, 0 574 | db %00000000, 0, 0, 0 575 | db %00000000, 0, 0, 0 576 | 577 | // $59 - Y 578 | db %01100110, 0, 0, 0 579 | db %01100110, 0, 0, 0 580 | db %00111100, 0, 0, 0 581 | db %00011000, 0, 0, 0 582 | db %00011000, 0, 0, 0 583 | db %00011000, 0, 0, 0 584 | db %00000000, 0, 0, 0 585 | db %00000000, 0, 0, 0 586 | 587 | // $5A - Z 588 | db %01111110, 0, 0, 0 589 | db %00001100, 0, 0, 0 590 | db %00011000, 0, 0, 0 591 | db %00110000, 0, 0, 0 592 | db %01111110, 0, 0, 0 593 | db %01111110, 0, 0, 0 594 | db %00000000, 0, 0, 0 595 | db %00000000, 0, 0, 0 596 | 597 | ;;;;;;;;;;;;;;;;;;;;; 598 | // $5B - Opening square bracket "[" 599 | db %00011100, 0, 0, 0 600 | db %00011000, 0, 0, 0 601 | db %00011000, 0, 0, 0 602 | db %00011000, 0, 0, 0 603 | db %00011000, 0, 0, 0 604 | db %00011000, 0, 0, 0 605 | db %00011000, 0, 0, 0 606 | db %00011100, 0, 0, 0 607 | 608 | // $5C - Back slash "\" 609 | db %01000000, 0, 0, 0 610 | db %01100000, 0, 0, 0 611 | db %00110000, 0, 0, 0 612 | db %00011000, 0, 0, 0 613 | db %00001100, 0, 0, 0 614 | db %00000110, 0, 0, 0 615 | db %00000010, 0, 0, 0 616 | db %00000000, 0, 0, 0 617 | 618 | // $5D - Closing square bracket "]" 619 | db %00111000, 0, 0, 0 620 | db %00011000, 0, 0, 0 621 | db %00011000, 0, 0, 0 622 | db %00011000, 0, 0, 0 623 | db %00011000, 0, 0, 0 624 | db %00011000, 0, 0, 0 625 | db %00011000, 0, 0, 0 626 | db %00111000, 0, 0, 0 627 | 628 | // $5E - Caret "^" 629 | db %00011000, 0, 0, 0 630 | db %00100100, 0, 0, 0 631 | db %01000010, 0, 0, 0 632 | db %00000000, 0, 0, 0 633 | db %00000000, 0, 0, 0 634 | db %00000000, 0, 0, 0 635 | db %00000000, 0, 0, 0 636 | db %00000000, 0, 0, 0 637 | 638 | // $5F - Underscore "_" 639 | db %00000000, 0, 0, 0 640 | db %00000000, 0, 0, 0 641 | db %00000000, 0, 0, 0 642 | db %00000000, 0, 0, 0 643 | db %00000000, 0, 0, 0 644 | db %00000000, 0, 0, 0 645 | db %00000000, 0, 0, 0 646 | db %11111111, 0, 0, 0 647 | 648 | // $60 - Opening single quote "`" 649 | db %00011000, 0, 0, 0 650 | db %00011000, 0, 0, 0 651 | db %00001000, 0, 0, 0 652 | db %00000000, 0, 0, 0 653 | db %00000000, 0, 0, 0 654 | db %00000000, 0, 0, 0 655 | db %00000000, 0, 0, 0 656 | db %00000000, 0, 0, 0 657 | 658 | ;;;;;;;;;;;;;;;;;;;;; 659 | // $61 - a 660 | db %00000000, 0, 0, 0 661 | db %00000000, 0, 0, 0 662 | db %00111000, 0, 0, 0 663 | db %01100100, 0, 0, 0 664 | db %01100100, 0, 0, 0 665 | db %00111010, 0, 0, 0 666 | db %00000000, 0, 0, 0 667 | db %00000000, 0, 0, 0 668 | 669 | // $62 - b 670 | db %00110000, 0, 0, 0 671 | db %00110000, 0, 0, 0 672 | db %00111100, 0, 0, 0 673 | db %00110010, 0, 0, 0 674 | db %00110010, 0, 0, 0 675 | db %01011100, 0, 0, 0 676 | db %00000000, 0, 0, 0 677 | db %00000000, 0, 0, 0 678 | 679 | // $63 - c 680 | db %00000000, 0, 0, 0 681 | db %00000000, 0, 0, 0 682 | db %00111100, 0, 0, 0 683 | db %01100000, 0, 0, 0 684 | db %01100010, 0, 0, 0 685 | db %00111100, 0, 0, 0 686 | db %00000000, 0, 0, 0 687 | db %00000000, 0, 0, 0 688 | 689 | // $64 - d 690 | db %00001100, 0, 0, 0 691 | db %00001100, 0, 0, 0 692 | db %00111100, 0, 0, 0 693 | db %01001100, 0, 0, 0 694 | db %01001100, 0, 0, 0 695 | db %00111010, 0, 0, 0 696 | db %00000000, 0, 0, 0 697 | db %00000000, 0, 0, 0 698 | 699 | // $65 - e 700 | db %00000000, 0, 0, 0 701 | db %00000000, 0, 0, 0 702 | db %00111000, 0, 0, 0 703 | db %01101000, 0, 0, 0 704 | db %01110010, 0, 0, 0 705 | db %00111100, 0, 0, 0 706 | db %00000000, 0, 0, 0 707 | db %00000000, 0, 0, 0 708 | 709 | // $66 - f 710 | db %00000000, 0, 0, 0 711 | db %00000000, 0, 0, 0 712 | db %00011100, 0, 0, 0 713 | db %00110010, 0, 0, 0 714 | db %00110000, 0, 0, 0 715 | db %01111100, 0, 0, 0 716 | db %00110000, 0, 0, 0 717 | db %00110000, 0, 0, 0 718 | 719 | // $67 - g 720 | db %00000000, 0, 0, 0 721 | db %00000000, 0, 0, 0 722 | db %00111010, 0, 0, 0 723 | db %01100110, 0, 0, 0 724 | db %01100110, 0, 0, 0 725 | db %00111110, 0, 0, 0 726 | db %01000110, 0, 0, 0 727 | db %00111100, 0, 0, 0 728 | 729 | // $68 - h 730 | db %01100000, 0, 0, 0 731 | db %01100000, 0, 0, 0 732 | db %01111100, 0, 0, 0 733 | db %01100010, 0, 0, 0 734 | db %01100010, 0, 0, 0 735 | db %01100010, 0, 0, 0 736 | db %00000000, 0, 0, 0 737 | db %00000000, 0, 0, 0 738 | 739 | // $69 - i 740 | db %00110000, 0, 0, 0 741 | db %00000000, 0, 0, 0 742 | db %00110000, 0, 0, 0 743 | db %00110000, 0, 0, 0 744 | db %00110100, 0, 0, 0 745 | db %00011000, 0, 0, 0 746 | db %00000000, 0, 0, 0 747 | db %00000000, 0, 0, 0 748 | 749 | // $6A - j 750 | db %00000110, 0, 0, 0 751 | db %00000000, 0, 0, 0 752 | db %00000110, 0, 0, 0 753 | db %00000110, 0, 0, 0 754 | db %00000110, 0, 0, 0 755 | db %00000110, 0, 0, 0 756 | db %01000110, 0, 0, 0 757 | db %00111100, 0, 0, 0 758 | 759 | // $6B - k 760 | db %01100000, 0, 0, 0 761 | db %01100100, 0, 0, 0 762 | db %01101000, 0, 0, 0 763 | db %01111000, 0, 0, 0 764 | db %01100100, 0, 0, 0 765 | db %01100010, 0, 0, 0 766 | db %00000000, 0, 0, 0 767 | db %00000000, 0, 0, 0 768 | 769 | // $6C - l 770 | db %00110000, 0, 0, 0 771 | db %00110000, 0, 0, 0 772 | db %00110000, 0, 0, 0 773 | db %00110000, 0, 0, 0 774 | db %00110100, 0, 0, 0 775 | db %00011000, 0, 0, 0 776 | db %00000000, 0, 0, 0 777 | db %00000000, 0, 0, 0 778 | 779 | // $6D - m 780 | db %00000000, 0, 0, 0 781 | db %00000000, 0, 0, 0 782 | db %01010100, 0, 0, 0 783 | db %01101010, 0, 0, 0 784 | db %01101010, 0, 0, 0 785 | db %01100010, 0, 0, 0 786 | db %00000000, 0, 0, 0 787 | db %00000000, 0, 0, 0 788 | 789 | // $6E - n 790 | db %00000000, 0, 0, 0 791 | db %00000000, 0, 0, 0 792 | db %01011100, 0, 0, 0 793 | db %01100010, 0, 0, 0 794 | db %01100010, 0, 0, 0 795 | db %01100010, 0, 0, 0 796 | db %00000000, 0, 0, 0 797 | db %00000000, 0, 0, 0 798 | 799 | // $6F - o 800 | db %00000000, 0, 0, 0 801 | db %00000000, 0, 0, 0 802 | db %00111100, 0, 0, 0 803 | db %01100010, 0, 0, 0 804 | db %01100010, 0, 0, 0 805 | db %00111100, 0, 0, 0 806 | db %00000000, 0, 0, 0 807 | db %00000000, 0, 0, 0 808 | 809 | // $70 - p 810 | db %00000000, 0, 0, 0 811 | db %00000000, 0, 0, 0 812 | db %01011100, 0, 0, 0 813 | db %01100110, 0, 0, 0 814 | db %01100110, 0, 0, 0 815 | db %01111100, 0, 0, 0 816 | db %01100000, 0, 0, 0 817 | db %01100000, 0, 0, 0 818 | 819 | // $71 - q 820 | db %00000000, 0, 0, 0 821 | db %00000000, 0, 0, 0 822 | db %00110100, 0, 0, 0 823 | db %01001100, 0, 0, 0 824 | db %01001100, 0, 0, 0 825 | db %00111100, 0, 0, 0 826 | db %00001110, 0, 0, 0 827 | db %00001100, 0, 0, 0 828 | 829 | // $72 - r 830 | db %00000000, 0, 0, 0 831 | db %00000000, 0, 0, 0 832 | db %01011100, 0, 0, 0 833 | db %01100010, 0, 0, 0 834 | db %01100000, 0, 0, 0 835 | db %01100000, 0, 0, 0 836 | db %00000000, 0, 0, 0 837 | db %00000000, 0, 0, 0 838 | 839 | // $73 - s 840 | db %00000000, 0, 0, 0 841 | db %00111100, 0, 0, 0 842 | db %01100010, 0, 0, 0 843 | db %00011000, 0, 0, 0 844 | db %01000110, 0, 0, 0 845 | db %00111100, 0, 0, 0 846 | db %00000000, 0, 0, 0 847 | db %00000000, 0, 0, 0 848 | 849 | // $74 - t 850 | db %00110000, 0, 0, 0 851 | db %00110000, 0, 0, 0 852 | db %01111000, 0, 0, 0 853 | db %00110000, 0, 0, 0 854 | db %00110010, 0, 0, 0 855 | db %00011100, 0, 0, 0 856 | db %00000000, 0, 0, 0 857 | db %00000000, 0, 0, 0 858 | 859 | // $75 - u 860 | db %00000000, 0, 0, 0 861 | db %00000000, 0, 0, 0 862 | db %01100110, 0, 0, 0 863 | db %01100110, 0, 0, 0 864 | db %01100110, 0, 0, 0 865 | db %00111010, 0, 0, 0 866 | db %00000000, 0, 0, 0 867 | db %00000000, 0, 0, 0 868 | 869 | // $76 - v 870 | db %00000000, 0, 0, 0 871 | db %00000000, 0, 0, 0 872 | db %01100010, 0, 0, 0 873 | db %01100010, 0, 0, 0 874 | db %00110100, 0, 0, 0 875 | db %00011000, 0, 0, 0 876 | db %00000000, 0, 0, 0 877 | db %00000000, 0, 0, 0 878 | 879 | // $77 - w 880 | db %00000000, 0, 0, 0 881 | db %00000000, 0, 0, 0 882 | db %01000010, 0, 0, 0 883 | db %01011010, 0, 0, 0 884 | db %01011010, 0, 0, 0 885 | db %00101100, 0, 0, 0 886 | db %00000000, 0, 0, 0 887 | db %00000000, 0, 0, 0 888 | 889 | // $78 - x 890 | db %00000000, 0, 0, 0 891 | db %00000000, 0, 0, 0 892 | db %01100010, 0, 0, 0 893 | db %00110100, 0, 0, 0 894 | db %00011000, 0, 0, 0 895 | db %01100110, 0, 0, 0 896 | db %00000000, 0, 0, 0 897 | db %00000000, 0, 0, 0 898 | 899 | // $79 - y 900 | db %00000000, 0, 0, 0 901 | db %00000000, 0, 0, 0 902 | db %01100110, 0, 0, 0 903 | db %01100110, 0, 0, 0 904 | db %01100110, 0, 0, 0 905 | db %00111110, 0, 0, 0 906 | db %01000110, 0, 0, 0 907 | db %00111100, 0, 0, 0 908 | 909 | // $7A - z 910 | db %00000000, 0, 0, 0 911 | db %00000000, 0, 0, 0 912 | db %01111110, 0, 0, 0 913 | db %00001100, 0, 0, 0 914 | db %00110000, 0, 0, 0 915 | db %01111110, 0, 0, 0 916 | db %00000000, 0, 0, 0 917 | db %00000000, 0, 0, 0 918 | 919 | ;;;;;;;;;;;;;;;;;;;;; 920 | // $7B - Opening curly bracket "{" 921 | db %00011100, 0, 0, 0 922 | db %00110000, 0, 0, 0 923 | db %00110000, 0, 0, 0 924 | db %00011000, 0, 0, 0 925 | db %00011000, 0, 0, 0 926 | db %00110000, 0, 0, 0 927 | db %00110000, 0, 0, 0 928 | db %00011100, 0, 0, 0 929 | 930 | // $7C - Vertical line "|" 931 | db %00011000, 0, 0, 0 932 | db %00011000, 0, 0, 0 933 | db %00011000, 0, 0, 0 934 | db %00011000, 0, 0, 0 935 | db %00011000, 0, 0, 0 936 | db %00011000, 0, 0, 0 937 | db %00011000, 0, 0, 0 938 | db %00011000, 0, 0, 0 939 | 940 | // $7D - Closing curly bracket "{" 941 | db %00111000, 0, 0, 0 942 | db %00001100, 0, 0, 0 943 | db %00001100, 0, 0, 0 944 | db %00011000, 0, 0, 0 945 | db %00011000, 0, 0, 0 946 | db %00001100, 0, 0, 0 947 | db %00001100, 0, 0, 0 948 | db %00111000, 0, 0, 0 949 | 950 | // $7E - Tilde "~" 951 | db %00000000, 0, 0, 0 952 | db %00000000, 0, 0, 0 953 | db %01110000, 0, 0, 0 954 | db %01011010, 0, 0, 0 955 | db %00001110, 0, 0, 0 956 | db %00000000, 0, 0, 0 957 | db %00000000, 0, 0, 0 958 | db %00000000, 0, 0, 0 -------------------------------------------------------------------------------- /PSG/SMSAudio/FontPAL.asm: -------------------------------------------------------------------------------- 1 | // 6-Bit BGR222 2 | // BBGGRR 3 | db %00000000 // Black * Clear Color (Start Of 1st Palette) 4 | db %00111111 // White 5 | db %00000000 6 | db %00000000 7 | db %00000000 8 | db %00000000 9 | db %00000000 10 | db %00000000 11 | db %00000000 12 | db %00000000 13 | db %00000000 14 | db %00000000 15 | db %00000000 16 | db %00000000 17 | db %00000000 18 | db %00000000 19 | db %00000000 // Black * Clear Color (Start Of 2nd Palette) 20 | db %00000011 // Red 21 | db %00000000 22 | db %00000000 23 | db %00000000 24 | db %00000000 25 | db %00000000 26 | db %00000000 27 | db %00000000 28 | db %00000000 29 | db %00000000 30 | db %00000000 31 | db %00000000 32 | db %00000000 33 | db %00000000 34 | db %00000000 -------------------------------------------------------------------------------- /PSG/SMSAudio/LIB/SMS_HEADER.ASM: -------------------------------------------------------------------------------- 1 | //============ 2 | // SMS Header 3 | //============ 4 | seek($7FF0) // Header Can Be At Offset $1FF0, $3FF0 Or $7FF0 5 | db "TMR SEGA" // ($7FF0) Required For Export Master System & Game Gear BIOS 6 | db 0, 0 // ($7FF8) Reserved Space, Can Be $20,$20 For 2 ASCII Spaces e.g "TMR SEGA__" 7 | db 0, 0 // ($7FFA) Little-Endian Word ROM Checksum For Export Master System BIOS 8 | 9 | // BCD Product Code = 15027 / Version Number = 0 ($7FFC) 10 | db $27, $50, $10 // BCD Product Code 2.5 Bytes / Version Number 0.5 Bytes 11 | // Byte 3 2 1 Byte 3 12 | // Bits 4..7 0..7 0..7 Bits 0..3 13 | // Value Product Code Value Version Number 14 | // $1 $50 $27 $0 15 | 16 | // Region Code = SMS Export / ROM Size = 128KB ($7FFF) 17 | db $4F // Region Code 0.5 Bytes / ROM Size 0.5 Bytes: 18 | // Bits 4..7 Bits 0..3 19 | // Value System / Region Value Rom Size Comment 20 | // $3 SMS Japan $A 8KB Unused 21 | // $4 SMS Export $B 16KB Unused 22 | // $5 GG Japan $C 32KB 23 | // $6 GG Export $D 48KB Unused Buggy 24 | // $7 GG International $E 64KB Rarely Used 25 | // $F 128KB 26 | // $0 256KB 27 | // $1 512KB Rarely Used 28 | // $2 1MB Unused Buggy -------------------------------------------------------------------------------- /PSG/SMSAudio/LIB/SMS_INPUT.ASM: -------------------------------------------------------------------------------- 1 | //=========== 2 | // SMS Input 3 | //=========== 4 | // %DUBARLDU: U = Joy1Up, D = Joy1Down, L = Joy1Left, R = Joy1Right, A = Joy1A, B = Joy1B, U = Joy2Up, D = Joy2Down 5 | // Test Port A Joypad Status Register 6 | macro TESTPortA(STATUS) { // STATUS = Bitfield To Compare 7 | in a,($DC) // A = Joypad Status Register (PortA) 8 | and {STATUS} 9 | } 10 | 11 | // %000RBARL: L = Joy2Left, R = Joy2Right, A = Joy2A, B = Joy2B, R = Reset Button 12 | // Test Port B Joypad Status Register 13 | macro TESTPortB(STATUS) { // STATUS = Bitfield To Compare 14 | in a,($DD) // A = Joypad Status Register (PortB) 15 | and {STATUS} 16 | } -------------------------------------------------------------------------------- /PSG/SMSAudio/LIB/SMS_PSG.ASM: -------------------------------------------------------------------------------- 1 | //========= 2 | // SMS PSG 3 | //========= 4 | // Write 4 Bytes Of Data To PSG 5 | macro PSGWrite(DATA) { // DATA = Bytes To Send To PSG Register 6 | ld hl,{DATA} // HL = Data Address 7 | ld b,4 // B = Data Length (4 Bytes) 8 | ld c,$7F // C = PSG Port ($7F) 9 | otir // OUT (C), (LD A, (HL)++), A = Byte Loaded From HL Address, Write Byte To PSG, Offset++, B-- 10 | } 11 | 12 | // Write Data Byte To PSG 13 | macro PSGWriteByte(DATA) { // DATA = Byte To Send To VDP Register 14 | ld a,{DATA} // A = PSG Data 15 | out ($7F),a // Write PSG Data To PSG Register 16 | } -------------------------------------------------------------------------------- /PSG/SMSAudio/LIB/SMS_VDP.ASM: -------------------------------------------------------------------------------- 1 | //========= 2 | // SMS VDP 3 | //========= 4 | // Wait For Vertical Counter Position 5 | macro VDPWaitV(VPOS) { // VPOS = Wait Vertical Counter Position 6 | - 7 | in a,($7E) // A = Current Vertical Counter Position 8 | cp {VPOS} // IF (Current Vertical Counter Position != VPOS) 9 | jr nz,- // Wait For Vertical Counter Position 10 | } 11 | 12 | // Wait For Horizontal Counter Position 13 | macro VDPWaitH(HPOS) { // HPOS = Wait Horizontal Counter Position 14 | - 15 | in a,($7F) // A = Current Horizontal Counter Position 16 | cp {HPOS} // IF (Current Horizontal Counter Position != HPOS) 17 | jr nz,- // Wait For Horizontal Counter Position 18 | } 19 | 20 | // Write Data Byte To VDP Register 21 | macro VDPREGWrite(DATA, REG) { // DATA = Byte To Send To VDP, REG = VDP Register To Write (0..15) 22 | ld a,{DATA} // A = VDP Register Data 23 | out ($BF),a // Write VDP Register Data To VDP (1st Byte Of Command Pair) 24 | ld a,%10000000 + {REG} // A = VDP REG Write, VDP Register (%TT00RRRR TT %10 = VDP REG Write, %RRRR = VDP Register 0..15) 25 | out ($BF),a // Write VDP Data To VDP Register (2nd Byte Of Command Pair) 26 | } 27 | 28 | // Write SMS 6-Bit BGR Palette # Of Colors Offset By Address To CRAM 29 | macro SMSPALWrite(PAL, COL, OFFSET) { // PAL = Palette Address, COL = Number Of Colors (0..32), OFFSET = CRAM Address Offset (0..32) 30 | ld a,{OFFSET} // A = CRAM Address Offset (%000AAAAA = CRAM Address Offset) 31 | out ($BF),a // Write CRAM Address Offset To VDP (1st Byte Of Command Pair) 32 | ld a,%11000000 // A = CRAM Write Command (%11000000 = CRAM Write) 33 | out ($BF),a // Write CRAM Write Command To VDP (2nd Byte Of Command Pair) 34 | ld hl,{PAL} // HL = Palette Address 35 | ld b,{COL} // B = Palette Data Size In Bytes 36 | ld c,$BE 37 | otir // OUT (C), (LD A, (HL)++), A = 6-Bit Palette Color %00BBGGRR Loaded From HL Palette Address, Write Palette Color To VDP CRAM Address Offset, Offset++, B-- 38 | } 39 | 40 | // Write Tile Characters # Of Tiles Offset By Addres To VRAM 41 | macro VDPCHRWrite(TILE, NUM, OFFSET) { // TILE = Tile Address, NUM = Number Of Tiles (0..255), OFFSET = VRAM Address Offset 42 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 43 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 44 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 45 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 46 | ld hl,{TILE} // HL = Tile Address 47 | ld c,$BE 48 | ld d,{NUM} // D = Number Of Tiles 49 | - 50 | ld b,32 // B = Number Of Tile Bytes To Write (8 * 4 Bits = 32 Bytes) 51 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Byte Loaded From HL Tile Address, Write Tile Byte To VDP VRAM Address Offset, Offset++, B-- 52 | dec d // Decrement Number Of Tiles 53 | jr nz,- // Writes # Of Tiles To VRAM 54 | } 55 | 56 | // Write Tile Map # Of Tile Map Words Offset By Address To VRAM 57 | macro VDPMAPWrite(MAP, NUM, OFFSET) { // MAP = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 58 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 59 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 60 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 61 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 62 | ld hl,{MAP} // HL = Tile Map Address 63 | ld b,{NUM} // B = Number Of Tile Map Words 64 | - 65 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 66 | inc b // Increment Number Of Tile Map Words 67 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 68 | jr nz,- // Writes # Of Tile Map Words To VRAM 69 | } 70 | 71 | // Write HL Tile Map # Of Tile Map Words Offset By Address To VRAM 72 | macro VDPMAPWriteHL(NUM, OFFSET) { // HL = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 73 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 74 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 75 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 76 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd byte Of Command Pair) 77 | ld b,{NUM} // B = Number Of Tile Map Words 78 | - 79 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 80 | inc b // Increment Number Of Tile Map Words 81 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 82 | jr nz,- // Writes # Of Tile Map Words To VRAM 83 | } 84 | 85 | // Repeat Tile Map # Of Tile Map Words Offset By Address To VRAM 86 | macro VDPMAPRepeat(MAPA, MAPB, NUM, OFFSET) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255), OFFSET = VRAM Address Offset 87 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 88 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 89 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 90 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 91 | ld a,{MAPA} // A = Tile Map Byte A 92 | ld b,{MAPB} // B = Tile Map Byte B 93 | ld c,$BE 94 | ld d,{NUM} // D = Number Of Repeats 95 | - 96 | out (c),a // Write Tile Map Byte A To VDP VRAM Address Offset, VRAM Address Offset++ 97 | out (c),b // Write Tile Map Byte B To VDP VRAM Address Offset, VRAM Address Offset++ 98 | dec d // Decrement Number Of Repeats 99 | jr nz,- // Writes # Of Tile Map Words To VRAM 100 | } 101 | 102 | // Repeating Tile Map # Of Tile Map Words To VRAM 103 | macro VDPMAPRepeating(MAPA, MAPB, NUM) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255) 104 | ld a,{MAPA} // A = Tile Map Byte A 105 | ld b,{MAPB} // B = Tile Map Byte B 106 | ld d,{NUM} // D = Number Of Repeats 107 | - 108 | out (c),a // Write Tile Map Byte A into VDP VRAM Address Offset, VRAM Address Offset++ 109 | out (c),b // Write Tile Map Byte B into VDP VRAM Address Offset, VRAM Address Offset++ 110 | dec d // Decrement Number Of Repeats 111 | jr nz,- // Writes # of tile map words to VRAM 112 | } 113 | 114 | // Write Data # Of Bytes Offset By Address To VRAM 115 | macro VDPVRAMWrite(DATA, NUM, OFFSET) { // DATA = Data Address, NUM = Number Of Bytes (0..255), OFFSET = VRAM Address Offset 116 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 117 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 118 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 119 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 120 | ld hl,{DATA} // HL = Data Address 121 | ld b,{NUM} // B = Number Of Bytes 122 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 123 | } 124 | 125 | // Writing Data # Of Bytes Offset By Address To VRAM 126 | macro VDPVRAMWriting(DATA, NUM) { // DATA = Data Address, NUM = Number of Bytes (0..255) 127 | ld hl,{DATA} // HL = Data Address 128 | ld b,{NUM} // B = Number Of Bytes 129 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 130 | } -------------------------------------------------------------------------------- /PSG/SMSAudio/SMSAudio.asm: -------------------------------------------------------------------------------- 1 | // SMS PSG Audio Player demo by krom (Peter Lemon): 2 | arch sms.cpu 3 | output "SMSAudio.sms", create 4 | 5 | macro seek(variable offset) { 6 | origin offset 7 | base offset 8 | } 9 | 10 | // BANK 0..7 (128KB) 11 | seek($0000); fill $20000 // Fill Bank 0..7 With Zero Bytes 12 | include "LIB/SMS_HEADER.ASM" // Include SMS Header 13 | include "LIB/SMS_INPUT.ASM" // includes INPUT Macros 14 | include "LIB/SMS_PSG.ASM" // includes PSG Macros 15 | include "LIB/SMS_VDP.ASM" // Include VDP Macros 16 | 17 | seek($0000) 18 | di // Disable Interrupts 19 | im 1 // Set Interrupt Mode 1 20 | jp Start 21 | 22 | seek($0100); Start: 23 | ld a,0 // A = 0 24 | 25 | // Character Buffer: $C000-$C001 26 | ld ($C000),a // Character # 27 | ld ($C001),a // Character Palette 28 | 29 | ld ($C002),a // Option Selection 30 | ld ($C003),a // Tone Generator #1 Channel Disable/Enable (1 bit) 31 | ld ($C004),a // Tone Generator #2 Channel Disable/Enable (1 bit) 32 | ld ($C005),a // Tone Generator #3 Channel Disable/Enable (1 bit) 33 | ld ($C006),a // Noise Generator Channel Disable/Enable (1 bit) 34 | ld ($C007),a // Tone Generator #1 Attenuation (4 bits) 35 | ld ($C008),a // Tone Generator #2 Attenuation (4 bits) 36 | ld ($C009),a // Tone Generator #3 Attenuation (4 bits) 37 | ld ($C00A),a // Noise Generator Attenuation (4 bits) 38 | ld ($C00B),a // Tone Generator #1 Frequency (10 bits) 39 | ld ($C00C),a 40 | ld ($C00D),a // Tone Generator #2 Frequency (10 bits) 41 | ld ($C00E),a 42 | ld ($C00F),a // Tone Generator #3 Frequency (10 bits) 43 | ld ($C010),a 44 | ld ($C011),a // Noise Generator Type (1 bit) 45 | ld ($C012),a // Noise Generator Clock Source (2 bits) 46 | 47 | // Load Palette 48 | SMSPALWrite(BGPAL, 32, 0) // Load 32 Colors To CRAM, Offset By 0 Colors 49 | 50 | // Load Tile Characters 51 | VDPCHRWrite(BGCHR, 95, $400) // Loads 95 8x8 Tiles To VRAM, Offset By $400 52 | 53 | // Clear Screen To Black Using The Space Font Character 54 | ld e,27 // E = Row Count 55 | ClearBG: 56 | VDPMAPRepeat($20, 0, 32, $3800) // Load 32 Tile Map Words (Space = $20) To VRAM, Offset By $3800 57 | dec e // Decrement Row Count 58 | jr nz,ClearBG // IF (Row Count != 0) Clear BG 59 | 60 | // Draw 1st Screen 61 | VDPMAPWrite(TEXTSMSAUDIOPLAYER, 29, $3844) // Load 29 Tile Map Words To VRAM, Offset By $3844 62 | VDPMAPWrite(TEXTToneGenerator1, 18, $38C4) // Load 18 Tile Map Words To VRAM, Offset By $38C4 63 | VDPMAPWrite(TEXTChannel, 8, $3908) // Load 8 Tile Map Words To VRAM, Offset By $3908 64 | VDPMAPWrite(TEXTAttenuation, 15, $3948) // Load 15 Tile Map Words To VRAM, Offset By $3948 65 | VDPMAPWrite(TEXTFrequency, 15, $3988) // Load 15 Tile Map Words To VRAM, Offset By $3988 66 | VDPMAPWrite(TEXTToneGenerator2, 18, $3A04) // Load 18 Tile Map Words To VRAM, Offset By $3A04 67 | VDPMAPWrite(TEXTChannel, 8, $3A48) // Load 8 Tile Map Words To VRAM, Offset By $3A48 68 | VDPMAPWrite(TEXTAttenuation, 15, $3A88) // Load 15 Tile Map Words To VRAM, Offset By $3A88 69 | VDPMAPWrite(TEXTFrequency, 15, $3AC8) // Load 15 Tile Map Words To VRAM, Offset By $3AC8 70 | VDPMAPWrite(TEXTToneGenerator3, 18, $3B44) // Load 18 Tile Map Words To VRAM, Offset By $3B44 71 | VDPMAPWrite(TEXTChannel, 8, $3B88) // Load 8 Tile Map Words To VRAM, Offset By $3B88 72 | VDPMAPWrite(TEXTAttenuation, 15, $3BC8) // Load 15 Tile Map Words To VRAM, Offset By $3BC8 73 | VDPMAPWrite(TEXTFrequency, 15, $3C08) // Load 15 Tile Map Words To VRAM, Offset By $3C08 74 | VDPMAPWrite(TEXTNoiseGenerator, 16, $3C84) // Load 16 Tile Map Words To VRAM, Offset By $3C84 75 | VDPMAPWrite(TEXTChannel, 8, $3CC8) // Load 8 Tile Map Words To VRAM, Offset By $3CC8 76 | VDPMAPWrite(TEXTAttenuation, 15, $3D08) // Load 15 Tile Map Words To VRAM, Offset By $3D08 77 | VDPMAPWrite(TEXTType, 5, $3D48) // Load 5 Tile Map Words To VRAM, Offset By $3D48 78 | VDPMAPWrite(TEXTClockSource, 13, $3D88) // Load 13 Tile Map Words To VRAM, Offset By $3D88 79 | 80 | // Write VDP Register 1 (Turn Display On) 81 | VDPREGWrite(%11100000, 1) // Write VDP Register 1 Data (%1DI000S0 D = Display 0: Off 1: On, I = Interrupts 0: Off 1: On, S = Sprite Size 0: 8x8 1: 8x16) 82 | 83 | Refresh: 84 | // Slow Down Input By Waiting 8 VSyncs 85 | ld e,8 // E = VSync Count 86 | WaitLoop: 87 | VDPWaitV(0) // Wait for V Counter Position 0 88 | VDPWaitV(192) // Wait for V Counter Position 192 89 | dec e // Decrement VSync Count 90 | jr nz,WaitLoop // IF (VSync Count != 0) Wait Loop 91 | 92 | 93 | TESTPortA(%00010000) // Test Port A Joypad 1 A Button 94 | jp nz,ChannelALLOFF 95 | VDPMAPWrite(TEXTPLAYINGRed, 7, $38AC) // Load 7 Tile Map Words To VRAM, Offset By $38AC 96 | 97 | ld a,($C003) // Load Tone Generator #1 Channel To A 98 | cp 0 // Compare A To Zero 99 | jr z,Channel1OFF // IF (A == Zero) Channel 1 OFF 100 | ld a,($C007) // Load Tone Generator #1 Attenuation To A 101 | add a,$90 // Add Tone Generator #1 Attenuation Write Upper Nibble Command 102 | PSGWriteByte(a) // Set Tone Generator #1 Attenuation 103 | 104 | ld a,($C00B) // Load Tone Generator #1 Frequency LO Nibble To A 105 | and $0F // A &= $F 106 | add a,$80 // Add Tone Generator #1 Frequency LO Nibble Command 107 | PSGWriteByte(a) // Set Tone Generator #1 Frequency LO Nibble 108 | 109 | ld a,($C00C) // Load Tone Generator #1 Frequency HI Nibble Command To B 110 | ld b,a 111 | ld a,($C00B) // Load Tone Generator #1 Frequency LO Nibble To A 112 | srl a // A >>= 4 113 | srl a 114 | srl a 115 | srl a 116 | sla b // B <<= 4 117 | sla b 118 | sla b 119 | sla b 120 | add a,b // A += B 121 | PSGWriteByte(a) // Set Tone Generator #1 Frequency HI 10-Bit Nibble 122 | jr Channel1Set 123 | Channel1OFF: 124 | PSGWriteByte($9F) // Set PSG Channel 1 Attenuation To "OFF" 125 | Channel1Set: 126 | 127 | 128 | ld a,($C004) // Load Tone Generator #2 Channel To A 129 | cp 0 // Compare A To Zero 130 | jr z,Channel2OFF // IF (A == Zero) Channel 2 OFF 131 | ld a,($C008) // Load Tone Generator #2 Attenuation To A 132 | add a,$B0 // Add Tone Generator #2 Attenuation Write Upper Nibble Command 133 | PSGWriteByte(a) // Set Tone Generator #2 Attenuation 134 | 135 | ld a,($C00D) // Load Tone Generator #2 Frequency LO Nibble To A 136 | and $0F // A &= $F 137 | add a,$A0 // Add Tone Generator #2 Frequency LO Nibble Command 138 | PSGWriteByte(a) // Set Tone Generator #2 Frequency LO Nibble 139 | 140 | ld a,($C00E) // Load Tone Generator #2 Frequency HI Nibble Command To B 141 | ld b,a 142 | ld a,($C00D) // Load Tone Generator #2 Frequency LO Nibble To A 143 | srl a // A >>= 4 144 | srl a 145 | srl a 146 | srl a 147 | sla b // B <<= 4 148 | sla b 149 | sla b 150 | sla b 151 | add a,b // A += B 152 | PSGWriteByte(a) // Set Tone Generator #2 Frequency HI 10-Bit Nibble 153 | jr Channel2Set 154 | Channel2OFF: 155 | PSGWriteByte($BF) // Set Tone Generator #2 Attenuation To "OFF" 156 | Channel2Set: 157 | 158 | 159 | ld a,($C005) // Load Tone Generator #3 Channel To A 160 | cp 0 // Compare A To Zero 161 | jr z,Channel3OFF // IF (A == Zero) Channel 3 OFF 162 | ld a,($C009) // Load Tone Generator #3 Attenuation To A 163 | add a,$D0 // Add Tone Generator #3 Attenuation Write Upper Nibble Command 164 | PSGWriteByte(a) // Set Tone Generator #3 Attenuation 165 | 166 | ld a,($C00F) // Load Tone Generator #3 Frequency LO Nibble To A 167 | and $0F // A &= $F 168 | add a,$C0 // Add Tone Generator #3 Frequency LO Nibble Command 169 | PSGWriteByte(a) // Set Tone Generator #3 Frequency LO nibble 170 | 171 | ld a,($C010) // Load Tone Generator #3 Frequency HI Nibble Command To B 172 | ld b,a 173 | ld a,($C00F) // Load Tone Generator #3 Frequency LO Nibble To A 174 | srl a // A >>= 4 175 | srl a 176 | srl a 177 | srl a 178 | sla b // B <<= 4 179 | sla b 180 | sla b 181 | sla b 182 | add a,b // A += B 183 | PSGWriteByte(a) // Set Tone Generator #3 Frequency HI 10-Bit Nibble 184 | jr Channel3Set 185 | Channel3OFF: 186 | PSGWriteByte($DF) // Set Tone Generator #3 Attenuation To "OFF" 187 | Channel3Set: 188 | 189 | 190 | ld a,($C006) // Load Noise Generator Channel To A 191 | cp 0 // Compare A To Zero 192 | jr z,Channel4OFF // IF (A == Zero) Channel 4 OFF 193 | ld a,($C00A) // Load Noise Generator Attenuation To A 194 | add a,$F0 // Add Noise Generator Attenuation Write Upper Nibble Command 195 | PSGWriteByte(a) // Set Noise Generator Attenuation 196 | 197 | ld a,($C012) // Load Noise Generator Frequency LO Nibble Command To B 198 | ld b,a 199 | ld a,($C011) // Load Noise Generator Frequency HI Nibble To A 200 | sla a // a <<= 4 201 | sla a 202 | add a,b // A += B 203 | add a,$E0 // A += $E0 204 | PSGWriteByte(a) // Set Noise Generator Frequency HI 10-Bit Nibble 205 | jr Channel4Set 206 | Channel4OFF: 207 | PSGWriteByte($FF) // Set Noise Generator Attenuation To "OFF" 208 | Channel4Set: 209 | 210 | 211 | jr ChannelALLSet 212 | ChannelALLOFF: 213 | PSGWriteByte($9F) // Set Tone Generator #1 Attenuation To "OFF" 214 | PSGWriteByte($BF) // Set Tone Generator #2 Attenuation To "OFF" 215 | PSGWriteByte($DF) // Set Tone Generator #3 Attenuation To "OFF" 216 | PSGWriteByte($FF) // Set Noise Generator Attenuation To "OFF" 217 | VDPMAPWrite(TEXTSTOPPEDWhite, 7, $38AC) // Load 7 Tile Map Words To VRAM, Offset By $38AC 218 | ChannelALLSet: 219 | 220 | 221 | ld hl,$C002 // Load Option Selection Mem Address To HL 222 | TESTPortA(%00000001) // Test Port A Joypad 1 Up Button 223 | jr nz,JoyNoUp 224 | dec (hl) 225 | JoyNoUp: 226 | TESTPortA(%00000010) // Test Port A Joypad 1 Down Button 227 | jr nz,JoyNoDown 228 | inc (hl) 229 | JoyNoDown: 230 | ld a,$FF // Check Option Selection Is Not Below Zero 231 | cp (hl) 232 | jr nz,NOMax 233 | ld a,12 // Set Option Selection To 12 IF Below Zero 234 | ld ($C002),a 235 | NOMax: 236 | ld a,12 // Check Option Selection Is Not Higher Than 12 237 | cp (hl) 238 | jr nc,NOMin 239 | ld a,0 // Set Option Selection To Zero IF Above 12 240 | ld ($C002),a 241 | NOMin: 242 | 243 | //=========================== 244 | // Tone Generator #1 Channel 245 | //=========================== 246 | ld a,($C002) // Load Option Selection To A 247 | cp 0 // Compare A To Tone Generator #1 Channel Selection 248 | jr z,Channel1Red 249 | ld hl,TEXTDISABLEDWhite 250 | jr Channel1 251 | Channel1Red: 252 | ld hl,TEXTDISABLEDRed 253 | 254 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 255 | jr nz,Channel1NoLeft 256 | ld a,($C003) 257 | dec a 258 | and $01 259 | ld ($C003),a 260 | Channel1NoLeft: 261 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 262 | jr nz,Channel1 263 | ld a,($C003) 264 | inc a 265 | and $01 266 | ld ($C003),a 267 | Channel1: 268 | // Write Tone Generator #1 Channel Text To VRAM 269 | ld a,($C003) 270 | sla a 271 | sla a 272 | sla a 273 | sla a 274 | ld d,0 275 | ld e,a 276 | add hl,de 277 | VDPMAPWriteHL(8, $3924) // Load 8 Tile Map Words To VRAM, Offset By $3924 278 | 279 | //=============================== 280 | // Tone Generator #1 Attenuation 281 | //=============================== 282 | ld a,($C002) // Load Selection Number To A 283 | cp 1 // Compare A To Tone Generator #1 Attenuation Selection 284 | jr z,Attenuation1Red 285 | ld a,0 286 | ld ($C001),a 287 | jr Attenuation1 288 | Attenuation1Red: 289 | ld a,8 290 | ld ($C001),a 291 | 292 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 293 | jr nz,Attenuation1NoLeft 294 | ld a,($C007) 295 | dec a 296 | and $0F 297 | ld ($C007),a 298 | Attenuation1NoLeft: 299 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 300 | jr nz,Attenuation1 301 | ld a,($C007) 302 | inc a 303 | and $0F 304 | ld ($C007),a 305 | Attenuation1: 306 | // Write Tone Generator #1 Attenuation Byte To VRAM 307 | ld a,($C007) 308 | cp 10 309 | jr c,Attenuation1Hex 310 | add a,7 311 | Attenuation1Hex: 312 | add a,48 313 | ld ($C000),a 314 | VDPMAPWrite($C000, 1, $3966) // Load 1 Tile Map Word To VRAM Offset By $3966 315 | 316 | //============================= 317 | // Tone Generator #1 Frequency 318 | //============================= 319 | ld a,($C002) // Load Selection Number To A 320 | cp 2 // Compare A To Tone Generator #1 Frequency Selection 321 | jr z,Frequency1Red 322 | ld a,0 323 | ld ($C001),a 324 | jr Frequency1 325 | Frequency1Red: 326 | ld a,8 327 | ld ($C001),a 328 | 329 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 330 | jr nz,Frequency1NoLeft 331 | ld hl,($C00B) 332 | dec hl 333 | ld a,h 334 | and 3 335 | ld h,a 336 | ld ($C00B),hl 337 | Frequency1NoLeft: 338 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 339 | jr nz,Frequency1 340 | ld hl,($C00B) 341 | inc hl 342 | ld a,h 343 | and 3 344 | ld h,a 345 | ld ($C00B),hl 346 | Frequency1: 347 | // Write Tone Generator #1 Frequency Bytes To VRAM 348 | ld a,($C00C) 349 | and $0F 350 | cp 10 351 | jr c,Frequency1Hex 352 | add a,7 353 | Frequency1Hex: 354 | add a,48 355 | ld ($C000),a 356 | VDPMAPWrite($C000, 1, $39A6) // Load 1 Tile Map Word To VRAM, Offset By $39A6 357 | ld a,($C00B) 358 | srl a 359 | srl a 360 | srl a 361 | srl a 362 | cp 10 363 | jr c,Frequency1HexB 364 | add a,7 365 | Frequency1HexB: 366 | add a,48 367 | ld ($C000),a 368 | VDPMAPWrite($C000, 1, $39A8) // Load 1 Tile Map Word To VRAM, Offset By $39A8 369 | ld a,($C00B) 370 | and $0F 371 | cp 10 372 | jr c,Frequency1HexC 373 | add a,7 374 | Frequency1HexC: 375 | add a,48 376 | ld ($C000),a 377 | VDPMAPWrite($C000, 1, $39AA) // Load 1 Tile Map Word To VRAM, Offset By $39AA 378 | 379 | //=========================== 380 | // Tone Generator #2 Channel 381 | //=========================== 382 | ld a,($C002) // Load Option Selection To A 383 | cp 3 // Compare A To Tone Generator #2 Channel Selection 384 | jr z,Channel2Red 385 | ld hl,TEXTDISABLEDWhite 386 | jr Channel2 387 | Channel2Red: 388 | ld hl,TEXTDISABLEDRed 389 | 390 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 391 | jr nz,Channel2NoLeft 392 | ld a,($C004) 393 | dec a 394 | and $01 395 | ld ($C004),a 396 | Channel2NoLeft: 397 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 398 | jr nz,Channel2 399 | ld a,($C004) 400 | inc a 401 | and $01 402 | ld ($C004),a 403 | Channel2: 404 | // Write Tone Generator #2 Channel Text To VRAM 405 | ld a,($C004) 406 | sla a 407 | sla a 408 | sla a 409 | sla a 410 | ld d,0 411 | ld e,a 412 | add hl,de 413 | VDPMAPWriteHL(8, $3A64) // Load 8 Tile Map Words To VRAM, Offset By $3A64 414 | 415 | //=============================== 416 | // Tone Generator #2 Attenuation 417 | //=============================== 418 | ld a,($C002) // Load Selection Number To A 419 | cp 4 // Compare A To Tone Generator #2 Attenuation Selection 420 | jr z,Attenuation2Red 421 | ld a,0 422 | ld ($C001),a 423 | jr Attenuation2 424 | Attenuation2Red: 425 | ld a,8 426 | ld ($C001),a 427 | 428 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 429 | jr nz,Attenuation2NoLeft 430 | ld a,($C008) 431 | dec a 432 | and $0F 433 | ld ($C008),a 434 | Attenuation2NoLeft: 435 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 436 | jr nz,Attenuation2 437 | ld a,($C008) 438 | inc a 439 | and $0F 440 | ld ($C008),a 441 | Attenuation2: 442 | // Write Tone Generator #2 Attenuation Byte To VRAM 443 | ld a,($C008) 444 | cp 10 445 | jr c,Attenuation2Hex 446 | add a,7 447 | Attenuation2Hex: 448 | add a,48 449 | ld ($C000),a 450 | VDPMAPWrite($C000, 1, $3AA6) // Load 1 Tile Map Word To VRAM, Offset By $3AA6 451 | 452 | //============================= 453 | // Tone Generator #2 Frequency 454 | //============================= 455 | ld a,($C002) // Load Selection Number To A 456 | cp 5 // Compare A To Tone Generator #2 Frequency Selection 457 | jr z,Frequency2Red 458 | ld a,0 459 | ld ($C001),a 460 | jr Frequency2 461 | Frequency2Red: 462 | ld a,8 463 | ld ($C001),a 464 | 465 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 466 | jr nz,Frequency2NoLeft 467 | ld hl,($C00D) 468 | dec hl 469 | ld a,h 470 | and 3 471 | ld h,a 472 | ld ($C00D),hl 473 | Frequency2NoLeft: 474 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 475 | jr nz,Frequency2 476 | ld hl,($C00D) 477 | inc hl 478 | ld a,h 479 | and 3 480 | ld h,a 481 | ld ($C00D),hl 482 | Frequency2: 483 | // Write Tone Generator #2 Frequency Bytes To VRAM 484 | ld a,($C00E) 485 | and $0F 486 | cp 10 487 | jr c,Frequency2Hex 488 | add a,7 489 | Frequency2Hex: 490 | add a,48 491 | ld ($C000),a 492 | VDPMAPWrite($C000, 1, $3AE6) // Load 1 Tile Map Word To VRAM, Offset By $3AE6 493 | ld a,($C00D) 494 | srl a 495 | srl a 496 | srl a 497 | srl a 498 | cp 10 499 | jr c,Frequency2HexB 500 | add a,7 501 | Frequency2HexB: 502 | add a,48 503 | ld ($C000),a 504 | VDPMAPWrite($C000, 1, $3AE8) // Load 1 Tile Map Word To VRAM, Offset By $3AE8 505 | ld a,($C00D) 506 | and $0F 507 | cp 10 508 | jr c,Frequency2HexC 509 | add a,7 510 | Frequency2HexC: 511 | add a,48 512 | ld ($C000),a 513 | VDPMAPWrite($C000, 1, $3AEA) // Load 1 Tile Map Word To VRAM, Offset By $3AEA 514 | 515 | //=========================== 516 | // Tone Generator #3 Channel 517 | //=========================== 518 | ld a,($C002) // Load Option Selection To A 519 | cp 6 // Compare A To Tone Generator #3 Channel Selection 520 | jr z,Channel3Red 521 | ld hl,TEXTDISABLEDWhite 522 | jr Channel3 523 | Channel3Red: 524 | ld hl,TEXTDISABLEDRed 525 | 526 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 527 | jr nz,Channel3NoLeft 528 | ld a,($C005) 529 | dec a 530 | and $01 531 | ld ($C005),a 532 | Channel3NoLeft: 533 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 534 | jr nz,Channel3 535 | ld a,($C005) 536 | inc a 537 | and $01 538 | ld ($C005),a 539 | Channel3: 540 | // Write Tone Generator #3 Channel Text To VRAM 541 | ld a,($C005) 542 | sla a 543 | sla a 544 | sla a 545 | sla a 546 | ld d,0 547 | ld e,a 548 | add hl,de 549 | VDPMAPWriteHL(8, $3BA4) // Load 8 Tile Map Words To VRAM, Offset By $3BA4 550 | 551 | //=============================== 552 | // Tone Generator #3 Attenuation 553 | //=============================== 554 | ld a,($C002) // Load Selection Number To A 555 | cp 7 // Compare A To Tone Generator #3 Attenuation Selection 556 | jr z,Attenuation3Red 557 | ld a,0 558 | ld ($C001),a 559 | jr Attenuation3 560 | Attenuation3Red: 561 | ld a,8 562 | ld ($C001),a 563 | 564 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 565 | jr nz,Attenuation3NoLeft 566 | ld a,($C009) 567 | dec a 568 | and $0F 569 | ld ($C009),a 570 | Attenuation3NoLeft: 571 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 572 | jr nz,Attenuation3 573 | ld a,($C009) 574 | inc a 575 | and $0F 576 | ld ($C009),a 577 | Attenuation3: 578 | // Write Tone Generator #3 Attenuation Byte To VRAM 579 | ld a,($C009) 580 | cp 10 581 | jr c,Attenuation3Hex 582 | add a,7 583 | Attenuation3Hex: 584 | add a,48 585 | ld ($C000),a 586 | VDPMAPWrite($C000, 1, $3BE6) // Load 1 Tile Map Word To VRAM, Offset By $3BE6 587 | 588 | //============================= 589 | // Tone Generator #3 Frequency 590 | //============================= 591 | ld a,($C002) // Load Selection Number To A 592 | cp 8 // Compare A To Tone Generator #3 Frequency Selection 593 | jr z,Frequency3Red 594 | ld a,0 595 | ld ($C001),a 596 | jr Frequency3 597 | Frequency3Red: 598 | ld a,8 599 | ld ($C001),a 600 | 601 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 602 | jr nz,Frequency3NoLeft 603 | ld hl,($C00F) 604 | dec hl 605 | ld a,h 606 | and 3 607 | ld h,a 608 | ld ($C00F),hl 609 | Frequency3NoLeft: 610 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 611 | jr nz,Frequency3 612 | ld hl,($C00F) 613 | inc hl 614 | ld a,h 615 | and 3 616 | ld h,a 617 | ld ($C00F),hl 618 | Frequency3: 619 | // Write Tone Generator #3 Frequency Bytes To VRAM 620 | ld a,($C010) 621 | and $0F 622 | cp 10 623 | jr c,Frequency3Hex 624 | add a,7 625 | Frequency3Hex: 626 | add a,48 627 | ld ($C000),a 628 | VDPMAPWrite($C000, 1, $3C26) // Load 1 Tile Map Word To VRAM, Offset By $3C26 629 | ld a,($C00F) 630 | srl a 631 | srl a 632 | srl a 633 | srl a 634 | cp 10 635 | jr c,Frequency3HexB 636 | add a,7 637 | Frequency3HexB: 638 | add a,48 639 | ld ($C000),a 640 | VDPMAPWrite($C000, 1, $3C28) // Load 1 Tile Map Word To VRAM, Offset By $3C28 641 | ld a,($C00F) 642 | and $0F 643 | cp 10 644 | jr c,Frequency3HexC 645 | add a,7 646 | Frequency3HexC: 647 | add a,48 648 | ld ($C000),a 649 | VDPMAPWrite($C000, 1, $3C2A) // Load 1 Tile Map Word To VRAM, Offset By $3C2A 650 | 651 | //========================= 652 | // Noise Generator Channel 653 | //========================= 654 | ld a,($C002) // Load Option Selection To A 655 | cp 9 // Compare A To Noise Generator Channel Selection 656 | jr z,Channel4Red 657 | ld hl,TEXTDISABLEDWhite 658 | jr Channel4 659 | Channel4Red: 660 | ld hl,TEXTDISABLEDRed 661 | 662 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 663 | jr nz,Channel4NoLeft 664 | ld a,($C006) 665 | dec a 666 | and $01 667 | ld ($C006),a 668 | Channel4NoLeft: 669 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 670 | jr nz,Channel4 671 | ld a,($C006) 672 | inc a 673 | and $01 674 | ld ($C006),a 675 | Channel4: 676 | // Write Noise Generator Channel Text To VRAM 677 | ld a,($C006) 678 | sla a 679 | sla a 680 | sla a 681 | sla a 682 | ld d,0 683 | ld e,a 684 | add hl,de 685 | VDPMAPWriteHL(8, $3CE4) // Load 8 Tile Map Words To VRAM, Offset By $3CE4 686 | 687 | //============================= 688 | // Noise Generator Attenuation 689 | //============================= 690 | ld a,($C002) // Load Selection number To A 691 | cp 10 // Compare A To Noise Generator Attenuation Selection 692 | jr z,Attenuation4Red 693 | ld a,0 694 | ld ($C001),a 695 | jr Attenuation4 696 | Attenuation4Red: 697 | ld a,8 698 | ld ($C001),a 699 | 700 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 701 | jr nz,Attenuation4NoLeft 702 | ld a,($C00A) 703 | dec a 704 | and $0F 705 | ld ($C00A),a 706 | Attenuation4NoLeft: 707 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 708 | jr nz,Attenuation4 709 | ld a,($C00A) 710 | inc a 711 | and $0F 712 | ld ($C00A),a 713 | Attenuation4: 714 | // Write Noise Generator Attenuation Byte To VRAM 715 | ld a,($C00A) 716 | cp 10 717 | jr c,Attenuation4Hex 718 | add a,7 719 | Attenuation4Hex: 720 | add a,48 721 | ld ($C000),a 722 | VDPMAPWrite($C000, 1, $3D26) // Load 1 Tile Map Word To VRAM, Offset By $3D26 723 | 724 | //====================== 725 | // Noise Generator Type 726 | //====================== 727 | ld a,($C002) // Load Option Selection To A 728 | cp 11 // Compare A To Noise Generator Type Selection 729 | jr z,NoiseTypeRed 730 | ld hl,TEXTPERIODICWhite 731 | jr NoiseType 732 | NoiseTypeRed: 733 | ld hl,TEXTPERIODICRed 734 | 735 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 736 | jr nz,NoiseTypeNoLeft 737 | ld a,($C011) 738 | dec a 739 | and $01 740 | ld ($C011),a 741 | NoiseTypeNoLeft: 742 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 743 | jr nz,NoiseType 744 | ld a,($C011) 745 | inc a 746 | and $01 747 | ld ($C011),a 748 | NoiseType: 749 | // Write Noise Generator Type Text To VRAM 750 | ld a,($C011) 751 | sla a 752 | sla a 753 | sla a 754 | sla a 755 | ld d,0 756 | ld e,a 757 | add hl,de 758 | VDPMAPWriteHL(8, $3D64) // Load 8 Tile Map Words To VRAM, Offset By $3D64 759 | 760 | //============================== 761 | // Noise Generator Clock Source 762 | //============================== 763 | ld a,($C002) // Load Option Selection To A 764 | cp 12 // Compare A To Noise Generator Clock Source Selection 765 | jr z,NoiseClockSourceRed 766 | ld hl,TEXTCLOCK2White 767 | jr NoiseClockSource 768 | NoiseClockSourceRed: 769 | ld hl,TEXTCLOCK2Red 770 | 771 | TESTPortA(%00000100) // Test Port A Joypad 1 Left Button 772 | jr nz,NoiseClockSourceNoLeft 773 | ld a,($C012) 774 | dec a 775 | and $03 776 | ld ($C012),a 777 | NoiseClockSourceNoLeft: 778 | TESTPortA(%00001000) // Test Port A Joypad 1 Right Button 779 | jr nz,NoiseClockSource 780 | ld a,($C012) 781 | inc a 782 | and $03 783 | ld ($C012),a 784 | NoiseClockSource: 785 | // Write Noise Generator Clock Source Text To VRAM 786 | ld a,($C012) 787 | sla a 788 | sla a 789 | sla a 790 | sla a 791 | sla a 792 | ld d,0 793 | ld e,a 794 | add hl,de 795 | VDPMAPWriteHL(11, $3DA4) // Load 11 Tile Map Words To VRAM, Offset By $3DA4 796 | 797 | jp Refresh 798 | 799 | BGPAL: // Include BG Palette Data 800 | include "FontPAL.asm" 801 | 802 | BGCHR: // Include BG 12BPP 8x8 Tile Font Character Data 803 | include "Font8x8.asm" 804 | 805 | map ' ', $0820, 95 // Map Char Table, Normal Tiles, Palette 2 806 | TEXTSMSAUDIOPLAYER: 807 | dw "SMS AUDIO PLAYER " // Font Tiles Palette 2 808 | 809 | map ' ', $0020, 95 // Map Char Table, Normal Tiles, Palette 1 810 | dw "V1.0 By krom" // Font Tiles Palette 1 811 | 812 | TEXTToneGenerator1: 813 | dw "Tone Generator #1:" // Font Tiles Palette 1 814 | TEXTToneGenerator2: 815 | dw "Tone Generator #2:" // Font Tiles Palette 1 816 | TEXTToneGenerator3: 817 | dw "Tone Generator #3:" // Font Tiles Palette 1 818 | TEXTNoiseGenerator: 819 | dw "Noise Generator:" // Font Tiles Palette 1 820 | TEXTChannel: 821 | dw "Channel:" // Font Tiles Palette 1 822 | TEXTAttenuation: 823 | dw "Attenuation: $" // Font Tiles Palette 1 824 | TEXTFrequency: 825 | dw "Frequency: $" // Font Tiles Palette 1 826 | TEXTType: 827 | dw "Type:" // Font Tiles Palette 1 828 | TEXTClockSource: 829 | dw "Clock Source:" // Font Tiles Palette 1 830 | 831 | TEXTDISABLEDWhite: 832 | dw "DISABLED" // Font Tiles Palette 1 833 | TEXTENABLEDWhite: 834 | dw "ENABLED " // Font Tiles Palette 1 835 | 836 | map ' ', $0820, 95 // Map Char Table, Normal Tiles, Palette 2 837 | TEXTDISABLEDRed: 838 | dw "DISABLED" // Font Tiles Palette 2 839 | TEXTENABLEDRed: 840 | dw "ENABLED " // Font Tiles Palette 2 841 | 842 | map ' ', $0020, 95 // Map Char Table, Normal Tiles, Palette 1 843 | TEXTPERIODICWhite: 844 | dw "PERIODIC" // Font Tiles Palette 1 845 | TEXTWHITEWhite: 846 | dw "WHITE " // Font Tiles Palette 1 847 | 848 | map ' ', $0820, 95 // Map Char Table, Normal Tiles, Palette 2 849 | TEXTPERIODICRed: 850 | dw "PERIODIC" // Font Tiles Palette 2 851 | TEXTWHITERed: 852 | dw "WHITE " // Font Tiles Palette 2 853 | 854 | map ' ', $0020, 95 // Map Char Table, Normal Tiles, Palette 1 855 | TEXTCLOCK2White: 856 | dw "CLOCK/2 " // Font Tiles Palette 1 857 | TEXTCLOCK4White: 858 | dw "CLOCK/4 " // Font Tiles Palette 1 859 | TEXTCLOCK8White: 860 | dw "CLOCK/8 " // Font Tiles Palette 1 861 | TEXTTONEGEN3White: 862 | dw "TONE GEN #3 " // Font Tiles Palette 1 863 | 864 | map ' ', $0820, 95 // Map Char Table, Normal Tiles, Palette 2 865 | TEXTCLOCK2Red: 866 | dw "CLOCK/2 " // Font Tiles Palette 2 867 | TEXTCLOCK4Red: 868 | dw "CLOCK/4 " // Font Tiles Palette 2 869 | TEXTCLOCK8Red: 870 | dw "CLOCK/8 " // Font Tiles Palette 2 871 | TEXTTONEGEN3Red: 872 | dw "TONE GEN #3 " // Font Tiles Palette 2 873 | 874 | map ' ', $0020, 95 // Map Char Table, Normal Tiles, Palette 1 875 | TEXTSTOPPEDWhite: 876 | dw "STOPPED" // Font Tiles Palette 1 877 | 878 | map ' ', $0820, 95 // Map Char Table, Normal Tiles, Palette 2 879 | TEXTPLAYINGRed: 880 | dw "PLAYING" // Font Tiles Palette 2 -------------------------------------------------------------------------------- /PSG/SMSAudio/SMSAudio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PeterLemon/SMS/27e8dd1a58084a61a3c0cca8dd36e2360a1ad8ea/PSG/SMSAudio/SMSAudio.png -------------------------------------------------------------------------------- /PSG/SMSAudio/SMSAudio.sms: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PeterLemon/SMS/27e8dd1a58084a61a3c0cca8dd36e2360a1ad8ea/PSG/SMSAudio/SMSAudio.sms -------------------------------------------------------------------------------- /PSG/SMSAudio/make.bat: -------------------------------------------------------------------------------- 1 | bass SMSAudio.asm 2 | ucon64 -nbak -chk SMSAudio.sms -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SMS 2 | === 3 |
4 | SEGA Master System Assembly Code by krom (Peter Lemon).
5 |
6 | All code compiles out of box with the bass assembler by byuu.
7 | I use a special version of bass by ARM9 which has been updated with SMS Z80 output:
8 | https://github.com/ARM9/bass
9 | I have included binaries of all the demos.
10 |
11 | I used the SMS Power Offical Docs to help get me started: http://www.smspower.org/Development/SMSOfficalDocs
12 |
13 | Howto Compile:
14 | All the code compiles into a single binary (ROMNAME.sms) file.
15 | Using bass Run: make.bat
16 |
17 | Howto Run:
18 | I only test with a real SEGA Master System using a flash cartridge.
19 |
20 | You can also use SEGA Master System emulators like MAME SMS Driver. -------------------------------------------------------------------------------- /VDP/HelloWorld/Font8x8.asm: -------------------------------------------------------------------------------- 1 | //=================== 2 | // ASCii SMS/GG Font 3 | //=================== 4 | // $20 - Space " " 5 | db %00000000, 0, 0, 0 6 | db %00000000, 0, 0, 0 7 | db %00000000, 0, 0, 0 8 | db %00000000, 0, 0, 0 9 | db %00000000, 0, 0, 0 10 | db %00000000, 0, 0, 0 11 | db %00000000, 0, 0, 0 12 | db %00000000, 0, 0, 0 13 | 14 | // $21 - Exclamation mark "!" 15 | db %00011000, 0, 0, 0 16 | db %00011000, 0, 0, 0 17 | db %00011000, 0, 0, 0 18 | db %00011000, 0, 0, 0 19 | db %00000000, 0, 0, 0 20 | db %00011000, 0, 0, 0 21 | db %00000000, 0, 0, 0 22 | db %00000000, 0, 0, 0 23 | 24 | // $22 - Quotation mark """ 25 | db %01100110, 0, 0, 0 26 | db %01100110, 0, 0, 0 27 | db %01000100, 0, 0, 0 28 | db %00000000, 0, 0, 0 29 | db %00000000, 0, 0, 0 30 | db %00000000, 0, 0, 0 31 | db %00000000, 0, 0, 0 32 | db %00000000, 0, 0, 0 33 | 34 | // $23 - Cross hatch "#" 35 | db %00010100, 0, 0, 0 36 | db %00010100, 0, 0, 0 37 | db %01111110, 0, 0, 0 38 | db %00101000, 0, 0, 0 39 | db %01111110, 0, 0, 0 40 | db %00101000, 0, 0, 0 41 | db %00000000, 0, 0, 0 42 | db %00000000, 0, 0, 0 43 | 44 | // $24 - Dollar sign "$" 45 | db %00111100, 0, 0, 0 46 | db %01101010, 0, 0, 0 47 | db %01111100, 0, 0, 0 48 | db %00111110, 0, 0, 0 49 | db %01010110, 0, 0, 0 50 | db %00111100, 0, 0, 0 51 | db %00010000, 0, 0, 0 52 | db %00000000, 0, 0, 0 53 | 54 | // $25 - Percent sign "%" 55 | db %00100010, 0, 0, 0 56 | db %01010100, 0, 0, 0 57 | db %00101000, 0, 0, 0 58 | db %00010100, 0, 0, 0 59 | db %00101010, 0, 0, 0 60 | db %01000100, 0, 0, 0 61 | db %00000000, 0, 0, 0 62 | db %00000000, 0, 0, 0 63 | 64 | // $26 - Ampersand "&" 65 | db %00110000, 0, 0, 0 66 | db %01001000, 0, 0, 0 67 | db %00110010, 0, 0, 0 68 | db %01001100, 0, 0, 0 69 | db %01001100, 0, 0, 0 70 | db %00110010, 0, 0, 0 71 | db %00000000, 0, 0, 0 72 | db %00000000, 0, 0, 0 73 | 74 | // $27 - Closing single quote "'" 75 | db %00011000, 0, 0, 0 76 | db %00011000, 0, 0, 0 77 | db %00010000, 0, 0, 0 78 | db %00000000, 0, 0, 0 79 | db %00000000, 0, 0, 0 80 | db %00000000, 0, 0, 0 81 | db %00000000, 0, 0, 0 82 | db %00000000, 0, 0, 0 83 | 84 | // $28 - Opening parentheses "(" 85 | db %00001100, 0, 0, 0 86 | db %00011000, 0, 0, 0 87 | db %00110000, 0, 0, 0 88 | db %00110000, 0, 0, 0 89 | db %00110000, 0, 0, 0 90 | db %00110000, 0, 0, 0 91 | db %00011000, 0, 0, 0 92 | db %00001100, 0, 0, 0 93 | 94 | // $29 - Closing parentheses ")" 95 | db %00110000, 0, 0, 0 96 | db %00011000, 0, 0, 0 97 | db %00001100, 0, 0, 0 98 | db %00001100, 0, 0, 0 99 | db %00001100, 0, 0, 0 100 | db %00001100, 0, 0, 0 101 | db %00011000, 0, 0, 0 102 | db %00110000, 0, 0, 0 103 | 104 | // $2A - Asterisk "*" 105 | db %00011000, 0, 0, 0 106 | db %01111110, 0, 0, 0 107 | db %00011000, 0, 0, 0 108 | db %00100100, 0, 0, 0 109 | db %00000000, 0, 0, 0 110 | db %00000000, 0, 0, 0 111 | db %00000000, 0, 0, 0 112 | db %00000000, 0, 0, 0 113 | 114 | // $2B - Plus "+" 115 | db %00000000, 0, 0, 0 116 | db %00011000, 0, 0, 0 117 | db %00011000, 0, 0, 0 118 | db %01111110, 0, 0, 0 119 | db %00011000, 0, 0, 0 120 | db %00011000, 0, 0, 0 121 | db %00000000, 0, 0, 0 122 | db %00000000, 0, 0, 0 123 | 124 | // $2C - Comma "," 125 | db %00000000, 0, 0, 0 126 | db %00000000, 0, 0, 0 127 | db %00000000, 0, 0, 0 128 | db %00000000, 0, 0, 0 129 | db %00011000, 0, 0, 0 130 | db %00011000, 0, 0, 0 131 | db %00010000, 0, 0, 0 132 | db %00000000, 0, 0, 0 133 | 134 | // $2D - Hyphen "-" 135 | db %00000000, 0, 0, 0 136 | db %00000000, 0, 0, 0 137 | db %00000000, 0, 0, 0 138 | db %00111100, 0, 0, 0 139 | db %00000000, 0, 0, 0 140 | db %00000000, 0, 0, 0 141 | db %00000000, 0, 0, 0 142 | db %00000000, 0, 0, 0 143 | 144 | // $2E - Period "." 145 | db %00000000, 0, 0, 0 146 | db %00000000, 0, 0, 0 147 | db %00000000, 0, 0, 0 148 | db %00000000, 0, 0, 0 149 | db %00011000, 0, 0, 0 150 | db %00011000, 0, 0, 0 151 | db %00000000, 0, 0, 0 152 | db %00000000, 0, 0, 0 153 | 154 | // $2F - Forward slash "/" 155 | db %00000010, 0, 0, 0 156 | db %00000110, 0, 0, 0 157 | db %00001100, 0, 0, 0 158 | db %00011000, 0, 0, 0 159 | db %00110000, 0, 0, 0 160 | db %01100000, 0, 0, 0 161 | db %01000000, 0, 0, 0 162 | db %00000000, 0, 0, 0 163 | 164 | ;;;;;;;;;;;;;;;;;;;;; 165 | // $30 - 0 166 | db %00111010, 0, 0, 0 167 | db %01100100, 0, 0, 0 168 | db %01001010, 0, 0, 0 169 | db %01010010, 0, 0, 0 170 | db %00100110, 0, 0, 0 171 | db %01011100, 0, 0, 0 172 | db %00000000, 0, 0, 0 173 | db %00000000, 0, 0, 0 174 | 175 | // $31 - 1 176 | db %00011000, 0, 0, 0 177 | db %00111000, 0, 0, 0 178 | db %00011000, 0, 0, 0 179 | db %00011000, 0, 0, 0 180 | db %00011000, 0, 0, 0 181 | db %00111100, 0, 0, 0 182 | db %00000000, 0, 0, 0 183 | db %00000000, 0, 0, 0 184 | 185 | // $32 - 2 186 | db %00111000, 0, 0, 0 187 | db %01001100, 0, 0, 0 188 | db %00001100, 0, 0, 0 189 | db %00011000, 0, 0, 0 190 | db %00110000, 0, 0, 0 191 | db %01111110, 0, 0, 0 192 | db %00000000, 0, 0, 0 193 | db %00000000, 0, 0, 0 194 | 195 | // $33 - 3 196 | db %00111100, 0, 0, 0 197 | db %01000110, 0, 0, 0 198 | db %00011100, 0, 0, 0 199 | db %00000110, 0, 0, 0 200 | db %01000110, 0, 0, 0 201 | db %00111100, 0, 0, 0 202 | db %00000000, 0, 0, 0 203 | db %00000000, 0, 0, 0 204 | 205 | // $34 - 4 206 | db %00001100, 0, 0, 0 207 | db %00011100, 0, 0, 0 208 | db %00101100, 0, 0, 0 209 | db %01001100, 0, 0, 0 210 | db %01111110, 0, 0, 0 211 | db %00001100, 0, 0, 0 212 | db %00000000, 0, 0, 0 213 | db %00000000, 0, 0, 0 214 | 215 | // $35 - 5 216 | db %01111110, 0, 0, 0 217 | db %01100000, 0, 0, 0 218 | db %01111100, 0, 0, 0 219 | db %00000110, 0, 0, 0 220 | db %01000110, 0, 0, 0 221 | db %00111100, 0, 0, 0 222 | db %00000000, 0, 0, 0 223 | db %00000000, 0, 0, 0 224 | 225 | // $36 - 6 226 | db %00111100, 0, 0, 0 227 | db %01100000, 0, 0, 0 228 | db %01111100, 0, 0, 0 229 | db %01100110, 0, 0, 0 230 | db %01100110, 0, 0, 0 231 | db %00111100, 0, 0, 0 232 | db %00000000, 0, 0, 0 233 | db %00000000, 0, 0, 0 234 | 235 | // $37 - 7 236 | db %01111110, 0, 0, 0 237 | db %01100110, 0, 0, 0 238 | db %00001100, 0, 0, 0 239 | db %00111110, 0, 0, 0 240 | db %00011000, 0, 0, 0 241 | db %00011000, 0, 0, 0 242 | db %00000000, 0, 0, 0 243 | db %00000000, 0, 0, 0 244 | 245 | // $38 - 8 246 | db %00111100, 0, 0, 0 247 | db %01100110, 0, 0, 0 248 | db %00111100, 0, 0, 0 249 | db %01100110, 0, 0, 0 250 | db %01100110, 0, 0, 0 251 | db %00111100, 0, 0, 0 252 | db %00000000, 0, 0, 0 253 | db %00000000, 0, 0, 0 254 | 255 | // $39 - 9 256 | db %00111100, 0, 0, 0 257 | db %01100110, 0, 0, 0 258 | db %01100110, 0, 0, 0 259 | db %00111110, 0, 0, 0 260 | db %00000110, 0, 0, 0 261 | db %00111100, 0, 0, 0 262 | db %00000000, 0, 0, 0 263 | db %00000000, 0, 0, 0 264 | 265 | ;;;;;;;;;;;;;;;;;;;;; 266 | // $3A - Colon ":" 267 | db %00000000, 0, 0, 0 268 | db %00011000, 0, 0, 0 269 | db %00011000, 0, 0, 0 270 | db %00000000, 0, 0, 0 271 | db %00011000, 0, 0, 0 272 | db %00011000, 0, 0, 0 273 | db %00000000, 0, 0, 0 274 | db %00000000, 0, 0, 0 275 | 276 | // $3B - Semicolon ";" 277 | db %00000000, 0, 0, 0 278 | db %00011000, 0, 0, 0 279 | db %00011000, 0, 0, 0 280 | db %00000000, 0, 0, 0 281 | db %00011000, 0, 0, 0 282 | db %00011000, 0, 0, 0 283 | db %00010000, 0, 0, 0 284 | db %00000000, 0, 0, 0 285 | 286 | // $3C - Less than sign "<" 287 | db %00000000, 0, 0, 0 288 | db %00000110, 0, 0, 0 289 | db %00011000, 0, 0, 0 290 | db %01100000, 0, 0, 0 291 | db %00011000, 0, 0, 0 292 | db %00000110, 0, 0, 0 293 | db %00000000, 0, 0, 0 294 | db %00000000, 0, 0, 0 295 | 296 | // $3D - Equals sign "=" 297 | db %00000000, 0, 0, 0 298 | db %00000000, 0, 0, 0 299 | db %01111110, 0, 0, 0 300 | db %00000000, 0, 0, 0 301 | db %01111110, 0, 0, 0 302 | db %00000000, 0, 0, 0 303 | db %00000000, 0, 0, 0 304 | db %00000000, 0, 0, 0 305 | 306 | // $3E - Greater than sign ">" 307 | db %00000000, 0, 0, 0 308 | db %01100000, 0, 0, 0 309 | db %00011000, 0, 0, 0 310 | db %00000110, 0, 0, 0 311 | db %00011000, 0, 0, 0 312 | db %01100000, 0, 0, 0 313 | db %00000000, 0, 0, 0 314 | db %00000000, 0, 0, 0 315 | 316 | // $3F - Question mark "?" 317 | db %00111100, 0, 0, 0 318 | db %01100110, 0, 0, 0 319 | db %01100110, 0, 0, 0 320 | db %00001100, 0, 0, 0 321 | db %00011000, 0, 0, 0 322 | db %00000000, 0, 0, 0 323 | db %00011000, 0, 0, 0 324 | db %00000000, 0, 0, 0 325 | 326 | // $40 - At sign "@" 327 | db %01111100, 0, 0, 0 328 | db %10000010, 0, 0, 0 329 | db %10111010, 0, 0, 0 330 | db %10101010, 0, 0, 0 331 | db %10111110, 0, 0, 0 332 | db %01000000, 0, 0, 0 333 | db %00111110, 0, 0, 0 334 | db %00000000, 0, 0, 0 335 | 336 | ;;;;;;;;;;;;;;;;;;;;; 337 | // $41 - A 338 | db %00011000, 0, 0, 0 339 | db %00111100, 0, 0, 0 340 | db %00100100, 0, 0, 0 341 | db %01111110, 0, 0, 0 342 | db %01100110, 0, 0, 0 343 | db %01100110, 0, 0, 0 344 | db %00000000, 0, 0, 0 345 | db %00000000, 0, 0, 0 346 | 347 | // $42 - B 348 | db %01111100, 0, 0, 0 349 | db %01100110, 0, 0, 0 350 | db %01111100, 0, 0, 0 351 | db %01100110, 0, 0, 0 352 | db %01100110, 0, 0, 0 353 | db %01111100, 0, 0, 0 354 | db %00000000, 0, 0, 0 355 | db %00000000, 0, 0, 0 356 | 357 | // $43 - C 358 | db %00111100, 0, 0, 0 359 | db %01100110, 0, 0, 0 360 | db %01100000, 0, 0, 0 361 | db %01100010, 0, 0, 0 362 | db %01111110, 0, 0, 0 363 | db %00111100, 0, 0, 0 364 | db %00000000, 0, 0, 0 365 | db %00000000, 0, 0, 0 366 | 367 | // $44 - D 368 | db %01111100, 0, 0, 0 369 | db %01100110, 0, 0, 0 370 | db %01100110, 0, 0, 0 371 | db %01100110, 0, 0, 0 372 | db %01111110, 0, 0, 0 373 | db %01111100, 0, 0, 0 374 | db %00000000, 0, 0, 0 375 | db %00000000, 0, 0, 0 376 | 377 | // $45 - E 378 | db %01111110, 0, 0, 0 379 | db %01100000, 0, 0, 0 380 | db %01111100, 0, 0, 0 381 | db %01100000, 0, 0, 0 382 | db %01111110, 0, 0, 0 383 | db %01111110, 0, 0, 0 384 | db %00000000, 0, 0, 0 385 | db %00000000, 0, 0, 0 386 | 387 | // $46 - F 388 | db %01111110, 0, 0, 0 389 | db %01100000, 0, 0, 0 390 | db %01111100, 0, 0, 0 391 | db %01100000, 0, 0, 0 392 | db %01100000, 0, 0, 0 393 | db %01100000, 0, 0, 0 394 | db %00000000, 0, 0, 0 395 | db %00000000, 0, 0, 0 396 | 397 | // $47 - G 398 | db %00111100, 0, 0, 0 399 | db %01100110, 0, 0, 0 400 | db %01100000, 0, 0, 0 401 | db %01101110, 0, 0, 0 402 | db %01100110, 0, 0, 0 403 | db %00111100, 0, 0, 0 404 | db %00000000, 0, 0, 0 405 | db %00000000, 0, 0, 0 406 | 407 | // $48 - H 408 | db %01100110, 0, 0, 0 409 | db %01100110, 0, 0, 0 410 | db %01111110, 0, 0, 0 411 | db %01100110, 0, 0, 0 412 | db %01100110, 0, 0, 0 413 | db %01100110, 0, 0, 0 414 | db %00000000, 0, 0, 0 415 | db %00000000, 0, 0, 0 416 | 417 | // $49 - I 418 | db %01111110, 0, 0, 0 419 | db %00011000, 0, 0, 0 420 | db %00011000, 0, 0, 0 421 | db %00011000, 0, 0, 0 422 | db %01111110, 0, 0, 0 423 | db %01111110, 0, 0, 0 424 | db %00000000, 0, 0, 0 425 | db %00000000, 0, 0, 0 426 | 427 | // $4A - J 428 | db %00111110, 0, 0, 0 429 | db %00001100, 0, 0, 0 430 | db %00001100, 0, 0, 0 431 | db %01001100, 0, 0, 0 432 | db %01111100, 0, 0, 0 433 | db %00111000, 0, 0, 0 434 | db %00000000, 0, 0, 0 435 | db %00000000, 0, 0, 0 436 | 437 | // $4B - K 438 | db %01100110, 0, 0, 0 439 | db %01101100, 0, 0, 0 440 | db %01111000, 0, 0, 0 441 | db %01111000, 0, 0, 0 442 | db %01101100, 0, 0, 0 443 | db %01100110, 0, 0, 0 444 | db %00000000, 0, 0, 0 445 | db %00000000, 0, 0, 0 446 | 447 | // $4C - L 448 | db %01100000, 0, 0, 0 449 | db %01100000, 0, 0, 0 450 | db %01100000, 0, 0, 0 451 | db %01100000, 0, 0, 0 452 | db %01111110, 0, 0, 0 453 | db %01111110, 0, 0, 0 454 | db %00000000, 0, 0, 0 455 | db %00000000, 0, 0, 0 456 | 457 | // $4D - M 458 | db %01000010, 0, 0, 0 459 | db %01100110, 0, 0, 0 460 | db %01111110, 0, 0, 0 461 | db %01011010, 0, 0, 0 462 | db %01011010, 0, 0, 0 463 | db %01000010, 0, 0, 0 464 | db %00000000, 0, 0, 0 465 | db %00000000, 0, 0, 0 466 | 467 | // $4E - N 468 | db %01000110, 0, 0, 0 469 | db %01100110, 0, 0, 0 470 | db %01110110, 0, 0, 0 471 | db %01111110, 0, 0, 0 472 | db %01101110, 0, 0, 0 473 | db %01100110, 0, 0, 0 474 | db %00000000, 0, 0, 0 475 | db %00000000, 0, 0, 0 476 | 477 | // $4F - O 478 | db %00111100, 0, 0, 0 479 | db %01100110, 0, 0, 0 480 | db %01100110, 0, 0, 0 481 | db %01100110, 0, 0, 0 482 | db %01111110, 0, 0, 0 483 | db %00111100, 0, 0, 0 484 | db %00000000, 0, 0, 0 485 | db %00000000, 0, 0, 0 486 | 487 | // $50 - P 488 | db %01111100, 0, 0, 0 489 | db %01100110, 0, 0, 0 490 | db %01111110, 0, 0, 0 491 | db %01111100, 0, 0, 0 492 | db %01100000, 0, 0, 0 493 | db %01100000, 0, 0, 0 494 | db %00000000, 0, 0, 0 495 | db %00000000, 0, 0, 0 496 | 497 | // $51 - Q 498 | db %00111100, 0, 0, 0 499 | db %01100110, 0, 0, 0 500 | db %01100010, 0, 0, 0 501 | db %01101010, 0, 0, 0 502 | db %01111110, 0, 0, 0 503 | db %00111100, 0, 0, 0 504 | db %00000010, 0, 0, 0 505 | db %00000000, 0, 0, 0 506 | 507 | // $52 - R 508 | db %01111100, 0, 0, 0 509 | db %01100110, 0, 0, 0 510 | db %01111110, 0, 0, 0 511 | db %01111100, 0, 0, 0 512 | db %01101100, 0, 0, 0 513 | db %01100110, 0, 0, 0 514 | db %00000000, 0, 0, 0 515 | db %00000000, 0, 0, 0 516 | 517 | // $53 - S 518 | db %00111100, 0, 0, 0 519 | db %01100010, 0, 0, 0 520 | db %01111100, 0, 0, 0 521 | db %00111110, 0, 0, 0 522 | db %01000110, 0, 0, 0 523 | db %00111100, 0, 0, 0 524 | db %00000000, 0, 0, 0 525 | db %00000000, 0, 0, 0 526 | 527 | // $54 - T 528 | db %01111110, 0, 0, 0 529 | db %00011000, 0, 0, 0 530 | db %00011000, 0, 0, 0 531 | db %00011000, 0, 0, 0 532 | db %00011000, 0, 0, 0 533 | db %00011000, 0, 0, 0 534 | db %00000000, 0, 0, 0 535 | db %00000000, 0, 0, 0 536 | 537 | // $55 - U 538 | db %01100110, 0, 0, 0 539 | db %01100110, 0, 0, 0 540 | db %01100110, 0, 0, 0 541 | db %01100110, 0, 0, 0 542 | db %01111110, 0, 0, 0 543 | db %00111100, 0, 0, 0 544 | db %00000000, 0, 0, 0 545 | db %00000000, 0, 0, 0 546 | 547 | // $56 - V 548 | db %01100110, 0, 0, 0 549 | db %01100110, 0, 0, 0 550 | db %01100110, 0, 0, 0 551 | db %00100100, 0, 0, 0 552 | db %00111100, 0, 0, 0 553 | db %00011000, 0, 0, 0 554 | db %00000000, 0, 0, 0 555 | db %00000000, 0, 0, 0 556 | 557 | // $57 - W 558 | db %01000010, 0, 0, 0 559 | db %01011010, 0, 0, 0 560 | db %01011010, 0, 0, 0 561 | db %01111110, 0, 0, 0 562 | db %01100110, 0, 0, 0 563 | db %01000010, 0, 0, 0 564 | db %00000000, 0, 0, 0 565 | db %00000000, 0, 0, 0 566 | 567 | // $58 - X 568 | db %01100110, 0, 0, 0 569 | db %00111100, 0, 0, 0 570 | db %00011000, 0, 0, 0 571 | db %00111100, 0, 0, 0 572 | db %01100110, 0, 0, 0 573 | db %01000010, 0, 0, 0 574 | db %00000000, 0, 0, 0 575 | db %00000000, 0, 0, 0 576 | 577 | // $59 - Y 578 | db %01100110, 0, 0, 0 579 | db %01100110, 0, 0, 0 580 | db %00111100, 0, 0, 0 581 | db %00011000, 0, 0, 0 582 | db %00011000, 0, 0, 0 583 | db %00011000, 0, 0, 0 584 | db %00000000, 0, 0, 0 585 | db %00000000, 0, 0, 0 586 | 587 | // $5A - Z 588 | db %01111110, 0, 0, 0 589 | db %00001100, 0, 0, 0 590 | db %00011000, 0, 0, 0 591 | db %00110000, 0, 0, 0 592 | db %01111110, 0, 0, 0 593 | db %01111110, 0, 0, 0 594 | db %00000000, 0, 0, 0 595 | db %00000000, 0, 0, 0 596 | 597 | ;;;;;;;;;;;;;;;;;;;;; 598 | // $5B - Opening square bracket "[" 599 | db %00011100, 0, 0, 0 600 | db %00011000, 0, 0, 0 601 | db %00011000, 0, 0, 0 602 | db %00011000, 0, 0, 0 603 | db %00011000, 0, 0, 0 604 | db %00011000, 0, 0, 0 605 | db %00011000, 0, 0, 0 606 | db %00011100, 0, 0, 0 607 | 608 | // $5C - Back slash "\" 609 | db %01000000, 0, 0, 0 610 | db %01100000, 0, 0, 0 611 | db %00110000, 0, 0, 0 612 | db %00011000, 0, 0, 0 613 | db %00001100, 0, 0, 0 614 | db %00000110, 0, 0, 0 615 | db %00000010, 0, 0, 0 616 | db %00000000, 0, 0, 0 617 | 618 | // $5D - Closing square bracket "]" 619 | db %00111000, 0, 0, 0 620 | db %00011000, 0, 0, 0 621 | db %00011000, 0, 0, 0 622 | db %00011000, 0, 0, 0 623 | db %00011000, 0, 0, 0 624 | db %00011000, 0, 0, 0 625 | db %00011000, 0, 0, 0 626 | db %00111000, 0, 0, 0 627 | 628 | // $5E - Caret "^" 629 | db %00011000, 0, 0, 0 630 | db %00100100, 0, 0, 0 631 | db %01000010, 0, 0, 0 632 | db %00000000, 0, 0, 0 633 | db %00000000, 0, 0, 0 634 | db %00000000, 0, 0, 0 635 | db %00000000, 0, 0, 0 636 | db %00000000, 0, 0, 0 637 | 638 | // $5F - Underscore "_" 639 | db %00000000, 0, 0, 0 640 | db %00000000, 0, 0, 0 641 | db %00000000, 0, 0, 0 642 | db %00000000, 0, 0, 0 643 | db %00000000, 0, 0, 0 644 | db %00000000, 0, 0, 0 645 | db %00000000, 0, 0, 0 646 | db %11111111, 0, 0, 0 647 | 648 | // $60 - Opening single quote "`" 649 | db %00011000, 0, 0, 0 650 | db %00011000, 0, 0, 0 651 | db %00001000, 0, 0, 0 652 | db %00000000, 0, 0, 0 653 | db %00000000, 0, 0, 0 654 | db %00000000, 0, 0, 0 655 | db %00000000, 0, 0, 0 656 | db %00000000, 0, 0, 0 657 | 658 | ;;;;;;;;;;;;;;;;;;;;; 659 | // $61 - a 660 | db %00000000, 0, 0, 0 661 | db %00000000, 0, 0, 0 662 | db %00111000, 0, 0, 0 663 | db %01100100, 0, 0, 0 664 | db %01100100, 0, 0, 0 665 | db %00111010, 0, 0, 0 666 | db %00000000, 0, 0, 0 667 | db %00000000, 0, 0, 0 668 | 669 | // $62 - b 670 | db %00110000, 0, 0, 0 671 | db %00110000, 0, 0, 0 672 | db %00111100, 0, 0, 0 673 | db %00110010, 0, 0, 0 674 | db %00110010, 0, 0, 0 675 | db %01011100, 0, 0, 0 676 | db %00000000, 0, 0, 0 677 | db %00000000, 0, 0, 0 678 | 679 | // $63 - c 680 | db %00000000, 0, 0, 0 681 | db %00000000, 0, 0, 0 682 | db %00111100, 0, 0, 0 683 | db %01100000, 0, 0, 0 684 | db %01100010, 0, 0, 0 685 | db %00111100, 0, 0, 0 686 | db %00000000, 0, 0, 0 687 | db %00000000, 0, 0, 0 688 | 689 | // $64 - d 690 | db %00001100, 0, 0, 0 691 | db %00001100, 0, 0, 0 692 | db %00111100, 0, 0, 0 693 | db %01001100, 0, 0, 0 694 | db %01001100, 0, 0, 0 695 | db %00111010, 0, 0, 0 696 | db %00000000, 0, 0, 0 697 | db %00000000, 0, 0, 0 698 | 699 | // $65 - e 700 | db %00000000, 0, 0, 0 701 | db %00000000, 0, 0, 0 702 | db %00111000, 0, 0, 0 703 | db %01101000, 0, 0, 0 704 | db %01110010, 0, 0, 0 705 | db %00111100, 0, 0, 0 706 | db %00000000, 0, 0, 0 707 | db %00000000, 0, 0, 0 708 | 709 | // $66 - f 710 | db %00000000, 0, 0, 0 711 | db %00000000, 0, 0, 0 712 | db %00011100, 0, 0, 0 713 | db %00110010, 0, 0, 0 714 | db %00110000, 0, 0, 0 715 | db %01111100, 0, 0, 0 716 | db %00110000, 0, 0, 0 717 | db %00110000, 0, 0, 0 718 | 719 | // $67 - g 720 | db %00000000, 0, 0, 0 721 | db %00000000, 0, 0, 0 722 | db %00111010, 0, 0, 0 723 | db %01100110, 0, 0, 0 724 | db %01100110, 0, 0, 0 725 | db %00111110, 0, 0, 0 726 | db %01000110, 0, 0, 0 727 | db %00111100, 0, 0, 0 728 | 729 | // $68 - h 730 | db %01100000, 0, 0, 0 731 | db %01100000, 0, 0, 0 732 | db %01111100, 0, 0, 0 733 | db %01100010, 0, 0, 0 734 | db %01100010, 0, 0, 0 735 | db %01100010, 0, 0, 0 736 | db %00000000, 0, 0, 0 737 | db %00000000, 0, 0, 0 738 | 739 | // $69 - i 740 | db %00110000, 0, 0, 0 741 | db %00000000, 0, 0, 0 742 | db %00110000, 0, 0, 0 743 | db %00110000, 0, 0, 0 744 | db %00110100, 0, 0, 0 745 | db %00011000, 0, 0, 0 746 | db %00000000, 0, 0, 0 747 | db %00000000, 0, 0, 0 748 | 749 | // $6A - j 750 | db %00000110, 0, 0, 0 751 | db %00000000, 0, 0, 0 752 | db %00000110, 0, 0, 0 753 | db %00000110, 0, 0, 0 754 | db %00000110, 0, 0, 0 755 | db %00000110, 0, 0, 0 756 | db %01000110, 0, 0, 0 757 | db %00111100, 0, 0, 0 758 | 759 | // $6B - k 760 | db %01100000, 0, 0, 0 761 | db %01100100, 0, 0, 0 762 | db %01101000, 0, 0, 0 763 | db %01111000, 0, 0, 0 764 | db %01100100, 0, 0, 0 765 | db %01100010, 0, 0, 0 766 | db %00000000, 0, 0, 0 767 | db %00000000, 0, 0, 0 768 | 769 | // $6C - l 770 | db %00110000, 0, 0, 0 771 | db %00110000, 0, 0, 0 772 | db %00110000, 0, 0, 0 773 | db %00110000, 0, 0, 0 774 | db %00110100, 0, 0, 0 775 | db %00011000, 0, 0, 0 776 | db %00000000, 0, 0, 0 777 | db %00000000, 0, 0, 0 778 | 779 | // $6D - m 780 | db %00000000, 0, 0, 0 781 | db %00000000, 0, 0, 0 782 | db %01010100, 0, 0, 0 783 | db %01101010, 0, 0, 0 784 | db %01101010, 0, 0, 0 785 | db %01100010, 0, 0, 0 786 | db %00000000, 0, 0, 0 787 | db %00000000, 0, 0, 0 788 | 789 | // $6E - n 790 | db %00000000, 0, 0, 0 791 | db %00000000, 0, 0, 0 792 | db %01011100, 0, 0, 0 793 | db %01100010, 0, 0, 0 794 | db %01100010, 0, 0, 0 795 | db %01100010, 0, 0, 0 796 | db %00000000, 0, 0, 0 797 | db %00000000, 0, 0, 0 798 | 799 | // $6F - o 800 | db %00000000, 0, 0, 0 801 | db %00000000, 0, 0, 0 802 | db %00111100, 0, 0, 0 803 | db %01100010, 0, 0, 0 804 | db %01100010, 0, 0, 0 805 | db %00111100, 0, 0, 0 806 | db %00000000, 0, 0, 0 807 | db %00000000, 0, 0, 0 808 | 809 | // $70 - p 810 | db %00000000, 0, 0, 0 811 | db %00000000, 0, 0, 0 812 | db %01011100, 0, 0, 0 813 | db %01100110, 0, 0, 0 814 | db %01100110, 0, 0, 0 815 | db %01111100, 0, 0, 0 816 | db %01100000, 0, 0, 0 817 | db %01100000, 0, 0, 0 818 | 819 | // $71 - q 820 | db %00000000, 0, 0, 0 821 | db %00000000, 0, 0, 0 822 | db %00110100, 0, 0, 0 823 | db %01001100, 0, 0, 0 824 | db %01001100, 0, 0, 0 825 | db %00111100, 0, 0, 0 826 | db %00001110, 0, 0, 0 827 | db %00001100, 0, 0, 0 828 | 829 | // $72 - r 830 | db %00000000, 0, 0, 0 831 | db %00000000, 0, 0, 0 832 | db %01011100, 0, 0, 0 833 | db %01100010, 0, 0, 0 834 | db %01100000, 0, 0, 0 835 | db %01100000, 0, 0, 0 836 | db %00000000, 0, 0, 0 837 | db %00000000, 0, 0, 0 838 | 839 | // $73 - s 840 | db %00000000, 0, 0, 0 841 | db %00111100, 0, 0, 0 842 | db %01100010, 0, 0, 0 843 | db %00011000, 0, 0, 0 844 | db %01000110, 0, 0, 0 845 | db %00111100, 0, 0, 0 846 | db %00000000, 0, 0, 0 847 | db %00000000, 0, 0, 0 848 | 849 | // $74 - t 850 | db %00110000, 0, 0, 0 851 | db %00110000, 0, 0, 0 852 | db %01111000, 0, 0, 0 853 | db %00110000, 0, 0, 0 854 | db %00110010, 0, 0, 0 855 | db %00011100, 0, 0, 0 856 | db %00000000, 0, 0, 0 857 | db %00000000, 0, 0, 0 858 | 859 | // $75 - u 860 | db %00000000, 0, 0, 0 861 | db %00000000, 0, 0, 0 862 | db %01100110, 0, 0, 0 863 | db %01100110, 0, 0, 0 864 | db %01100110, 0, 0, 0 865 | db %00111010, 0, 0, 0 866 | db %00000000, 0, 0, 0 867 | db %00000000, 0, 0, 0 868 | 869 | // $76 - v 870 | db %00000000, 0, 0, 0 871 | db %00000000, 0, 0, 0 872 | db %01100010, 0, 0, 0 873 | db %01100010, 0, 0, 0 874 | db %00110100, 0, 0, 0 875 | db %00011000, 0, 0, 0 876 | db %00000000, 0, 0, 0 877 | db %00000000, 0, 0, 0 878 | 879 | // $77 - w 880 | db %00000000, 0, 0, 0 881 | db %00000000, 0, 0, 0 882 | db %01000010, 0, 0, 0 883 | db %01011010, 0, 0, 0 884 | db %01011010, 0, 0, 0 885 | db %00101100, 0, 0, 0 886 | db %00000000, 0, 0, 0 887 | db %00000000, 0, 0, 0 888 | 889 | // $78 - x 890 | db %00000000, 0, 0, 0 891 | db %00000000, 0, 0, 0 892 | db %01100010, 0, 0, 0 893 | db %00110100, 0, 0, 0 894 | db %00011000, 0, 0, 0 895 | db %01100110, 0, 0, 0 896 | db %00000000, 0, 0, 0 897 | db %00000000, 0, 0, 0 898 | 899 | // $79 - y 900 | db %00000000, 0, 0, 0 901 | db %00000000, 0, 0, 0 902 | db %01100110, 0, 0, 0 903 | db %01100110, 0, 0, 0 904 | db %01100110, 0, 0, 0 905 | db %00111110, 0, 0, 0 906 | db %01000110, 0, 0, 0 907 | db %00111100, 0, 0, 0 908 | 909 | // $7A - z 910 | db %00000000, 0, 0, 0 911 | db %00000000, 0, 0, 0 912 | db %01111110, 0, 0, 0 913 | db %00001100, 0, 0, 0 914 | db %00110000, 0, 0, 0 915 | db %01111110, 0, 0, 0 916 | db %00000000, 0, 0, 0 917 | db %00000000, 0, 0, 0 918 | 919 | ;;;;;;;;;;;;;;;;;;;;; 920 | // $7B - Opening curly bracket "{" 921 | db %00011100, 0, 0, 0 922 | db %00110000, 0, 0, 0 923 | db %00110000, 0, 0, 0 924 | db %00011000, 0, 0, 0 925 | db %00011000, 0, 0, 0 926 | db %00110000, 0, 0, 0 927 | db %00110000, 0, 0, 0 928 | db %00011100, 0, 0, 0 929 | 930 | // $7C - Vertical line "|" 931 | db %00011000, 0, 0, 0 932 | db %00011000, 0, 0, 0 933 | db %00011000, 0, 0, 0 934 | db %00011000, 0, 0, 0 935 | db %00011000, 0, 0, 0 936 | db %00011000, 0, 0, 0 937 | db %00011000, 0, 0, 0 938 | db %00011000, 0, 0, 0 939 | 940 | // $7D - Closing curly bracket "{" 941 | db %00111000, 0, 0, 0 942 | db %00001100, 0, 0, 0 943 | db %00001100, 0, 0, 0 944 | db %00011000, 0, 0, 0 945 | db %00011000, 0, 0, 0 946 | db %00001100, 0, 0, 0 947 | db %00001100, 0, 0, 0 948 | db %00111000, 0, 0, 0 949 | 950 | // $7E - Tilde "~" 951 | db %00000000, 0, 0, 0 952 | db %00000000, 0, 0, 0 953 | db %01110000, 0, 0, 0 954 | db %01011010, 0, 0, 0 955 | db %00001110, 0, 0, 0 956 | db %00000000, 0, 0, 0 957 | db %00000000, 0, 0, 0 958 | db %00000000, 0, 0, 0 -------------------------------------------------------------------------------- /VDP/HelloWorld/FontPAL.asm: -------------------------------------------------------------------------------- 1 | // 6-Bit BGR222 2 | // BBGGRR 3 | db %00000000 // Black * Clear Color (Start Of 1st Palette) 4 | db %00111111 // White 5 | db %00000000 6 | db %00000000 7 | db %00000000 8 | db %00000000 9 | db %00000000 10 | db %00000000 11 | db %00000000 12 | db %00000000 13 | db %00000000 14 | db %00000000 15 | db %00000000 16 | db %00000000 17 | db %00000000 18 | db %00000000 19 | db %00000000 // Black * Clear Color (Start Of 2nd Palette) 20 | db %00000011 // Red 21 | db %00000000 22 | db %00000000 23 | db %00000000 24 | db %00000000 25 | db %00000000 26 | db %00000000 27 | db %00000000 28 | db %00000000 29 | db %00000000 30 | db %00000000 31 | db %00000000 32 | db %00000000 33 | db %00000000 34 | db %00000000 -------------------------------------------------------------------------------- /VDP/HelloWorld/HelloWorld.asm: -------------------------------------------------------------------------------- 1 | // SMS "Hello, World!" Text Printing demo by krom (Peter Lemon): 2 | // 1. Load BG Palette Data To CRAM 3 | // 2. Load BG Tile Data To VRAM 4 | // 3. Print Text Characters To BG Map VRAM 5 | // 4. Turn Display On 6 | arch sms.cpu 7 | output "HelloWorld.sms", create 8 | 9 | macro seek(variable offset) { 10 | origin offset 11 | base offset 12 | } 13 | 14 | // BANK 0..7 (128KB) 15 | seek($0000); fill $20000 // Fill Bank 0..7 With Zero Bytes 16 | include "LIB/SMS_HEADER.ASM" // Include SMS Header 17 | include "LIB/SMS_VDP.ASM" // Include VDP Macros 18 | 19 | seek($0000) 20 | di // Disable Interrupts 21 | im 1 // Set Interrupt Mode 1 22 | jp Start 23 | 24 | seek($0100); Start: 25 | // Load Palette 26 | SMSPALWrite(BGPAL, 32, 0) // Load 32 Colors To CRAM, Offset By 0 Colors 27 | 28 | // Load Tile Characters 29 | VDPCHRWrite(BGCHR, 95, $400) // Load 95 8x8 Tiles To VRAM, Offset By $400 30 | 31 | // Load Tile Map A 32 | VDPMAPWrite(BGMAPA, 13, $3912) // Load 13 Tile Map Words To VRAM, Offset By $3912 33 | 34 | // Load Tile Map B 35 | VDPMAPWrite(BGMAPB, 13, $3992) // Load 13 Tile Map Words To VRAM, Offset By $3992 36 | 37 | // Load Tile Map C 38 | VDPMAPWrite(BGMAPC, 13, $3A12) // Load 13 Tile Map Words To VRAM, Offset By $3A12 39 | 40 | // Load Tile Map D 41 | VDPMAPWrite(BGMAPD, 13, $3A92) // Load 13 Tile Map Words To VRAM, Offset By $3A92 42 | 43 | // Write VDP Register 1 (Turn Display On) 44 | VDPREGWrite(%11100000, 1) // Write VDP Register 1 Data (%1DI000S0 D = Display 0: Off 1: On, I = Interrupts 0: Off 1: On, S = Sprite Size 0: 8x8 1: 8x16) 45 | 46 | Loop: 47 | jr Loop 48 | 49 | BGPAL: // Include BG Palette Data 50 | include "FontPAL.asm" 51 | 52 | BGCHR: // Include BG 12BPP 8x8 Tile Font Character Data 53 | include "Font8x8.asm" 54 | 55 | map ' ', $0020, 95 // Map Char Table, Normal Tiles, Palette 1 56 | BGMAPA: 57 | dw "Hello, World!" // Hello World Text (26 Bytes) 58 | 59 | map ' ', $0620, 95 // Map Char Table, Tile XY Flip, Palette 1 60 | BGMAPB: 61 | dw "Hello, World!" // Hello World Text (26 Bytes) 62 | 63 | map ' ', $0820, 95 // Map Char Table, Normal Tiles, Palette 2 64 | BGMAPC: 65 | dw "Hello, World!" // Hello World Text (26 Bytes) 66 | 67 | map ' ', $0E20, 95 // Map Char Table, Tile XY Flip, Palette 2 68 | BGMAPD: 69 | dw "Hello, World!" // Hello World Text (26 Bytes) -------------------------------------------------------------------------------- /VDP/HelloWorld/HelloWorld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PeterLemon/SMS/27e8dd1a58084a61a3c0cca8dd36e2360a1ad8ea/VDP/HelloWorld/HelloWorld.png -------------------------------------------------------------------------------- /VDP/HelloWorld/HelloWorld.sms: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PeterLemon/SMS/27e8dd1a58084a61a3c0cca8dd36e2360a1ad8ea/VDP/HelloWorld/HelloWorld.sms -------------------------------------------------------------------------------- /VDP/HelloWorld/LIB/SMS_HEADER.ASM: -------------------------------------------------------------------------------- 1 | //============ 2 | // SMS Header 3 | //============ 4 | seek($7FF0) // Header Can Be At Offset $1FF0, $3FF0 Or $7FF0 5 | db "TMR SEGA" // ($7FF0) Required For Export Master System & Game Gear BIOS 6 | db 0, 0 // ($7FF8) Reserved Space, Can Be $20,$20 For 2 ASCII Spaces e.g "TMR SEGA__" 7 | db 0, 0 // ($7FFA) Little-Endian Word ROM Checksum For Export Master System BIOS 8 | 9 | // BCD Product Code = 15027 / Version Number = 0 ($7FFC) 10 | db $27, $50, $10 // BCD Product Code 2.5 Bytes / Version Number 0.5 Bytes 11 | // Byte 3 2 1 Byte 3 12 | // Bits 4..7 0..7 0..7 Bits 0..3 13 | // Value Product Code Value Version Number 14 | // $1 $50 $27 $0 15 | 16 | // Region Code = SMS Export / ROM Size = 128KB ($7FFF) 17 | db $4F // Region Code 0.5 Bytes / ROM Size 0.5 Bytes: 18 | // Bits 4..7 Bits 0..3 19 | // Value System / Region Value Rom Size Comment 20 | // $3 SMS Japan $A 8KB Unused 21 | // $4 SMS Export $B 16KB Unused 22 | // $5 GG Japan $C 32KB 23 | // $6 GG Export $D 48KB Unused Buggy 24 | // $7 GG International $E 64KB Rarely Used 25 | // $F 128KB 26 | // $0 256KB 27 | // $1 512KB Rarely Used 28 | // $2 1MB Unused Buggy -------------------------------------------------------------------------------- /VDP/HelloWorld/LIB/SMS_VDP.ASM: -------------------------------------------------------------------------------- 1 | //========= 2 | // SMS VDP 3 | //========= 4 | // Wait For Vertical Counter Position 5 | macro VDPWaitV(VPOS) { // VPOS = Wait Vertical Counter Position 6 | - 7 | in a,($7E) // A = Current Vertical Counter Position 8 | cp {VPOS} // IF (Current Vertical Counter Position != VPOS) 9 | jr nz,- // Wait For Vertical Counter Position 10 | } 11 | 12 | // Wait For Horizontal Counter Position 13 | macro VDPWaitH(HPOS) { // HPOS = Wait Horizontal Counter Position 14 | - 15 | in a,($7F) // A = Current Horizontal Counter Position 16 | cp {HPOS} // IF (Current Horizontal Counter Position != HPOS) 17 | jr nz,- // Wait For Horizontal Counter Position 18 | } 19 | 20 | // Write Data Byte To VDP Register 21 | macro VDPREGWrite(DATA, REG) { // DATA = Byte To Send To VDP, REG = VDP Register To Write (0..15) 22 | ld a,{DATA} // A = VDP Register Data 23 | out ($BF),a // Write VDP Register Data To VDP (1st Byte Of Command Pair) 24 | ld a,%10000000 + {REG} // A = VDP REG Write, VDP Register (%TT00RRRR TT %10 = VDP REG Write, %RRRR = VDP Register 0..15) 25 | out ($BF),a // Write VDP Data To VDP Register (2nd Byte Of Command Pair) 26 | } 27 | 28 | // Write SMS 6-Bit BGR Palette # Of Colors Offset By Address To CRAM 29 | macro SMSPALWrite(PAL, COL, OFFSET) { // PAL = Palette Address, COL = Number Of Colors (0..32), OFFSET = CRAM Address Offset (0..32) 30 | ld a,{OFFSET} // A = CRAM Address Offset (%000AAAAA = CRAM Address Offset) 31 | out ($BF),a // Write CRAM Address Offset To VDP (1st Byte Of Command Pair) 32 | ld a,%11000000 // A = CRAM Write Command (%11000000 = CRAM Write) 33 | out ($BF),a // Write CRAM Write Command To VDP (2nd Byte Of Command Pair) 34 | ld hl,{PAL} // HL = Palette Address 35 | ld b,{COL} // B = Palette Data Size In Bytes 36 | ld c,$BE 37 | otir // OUT (C), (LD A, (HL)++), A = 6-Bit Palette Color %00BBGGRR Loaded From HL Palette Address, Write Palette Color To VDP CRAM Address Offset, Offset++, B-- 38 | } 39 | 40 | // Write Tile Characters # Of Tiles Offset By Addres To VRAM 41 | macro VDPCHRWrite(TILE, NUM, OFFSET) { // TILE = Tile Address, NUM = Number Of Tiles (0..255), OFFSET = VRAM Address Offset 42 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 43 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 44 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 45 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 46 | ld hl,{TILE} // HL = Tile Address 47 | ld c,$BE 48 | ld d,{NUM} // D = Number Of Tiles 49 | - 50 | ld b,32 // B = Number Of Tile Bytes To Write (8 * 4 Bits = 32 Bytes) 51 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Byte Loaded From HL Tile Address, Write Tile Byte To VDP VRAM Address Offset, Offset++, B-- 52 | dec d // Decrement Number Of Tiles 53 | jr nz,- // Writes # Of Tiles To VRAM 54 | } 55 | 56 | // Write Tile Map # Of Tile Map Words Offset By Address To VRAM 57 | macro VDPMAPWrite(MAP, NUM, OFFSET) { // MAP = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 58 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 59 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 60 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 61 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 62 | ld hl,{MAP} // HL = Tile Map Address 63 | ld b,{NUM} // B = Number Of Tile Map Words 64 | - 65 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 66 | inc b // Increment Number Of Tile Map Words 67 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 68 | jr nz,- // Writes # Of Tile Map Words To VRAM 69 | } 70 | 71 | // Write HL Tile Map # Of Tile Map Words Offset By Address To VRAM 72 | macro VDPMAPWriteHL(NUM, OFFSET) { // HL = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 73 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 74 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 75 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 76 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd byte Of Command Pair) 77 | ld b,{NUM} // B = Number Of Tile Map Words 78 | - 79 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 80 | inc b // Increment Number Of Tile Map Words 81 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 82 | jr nz,- // Writes # Of Tile Map Words To VRAM 83 | } 84 | 85 | // Repeat Tile Map # Of Tile Map Words Offset By Address To VRAM 86 | macro VDPMAPRepeat(MAPA, MAPB, NUM, OFFSET) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255), OFFSET = VRAM Address Offset 87 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 88 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 89 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 90 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 91 | ld a,{MAPA} // A = Tile Map Byte A 92 | ld b,{MAPB} // B = Tile Map Byte B 93 | ld c,$BE 94 | ld d,{NUM} // D = Number Of Repeats 95 | - 96 | out (c),a // Write Tile Map Byte A To VDP VRAM Address Offset, VRAM Address Offset++ 97 | out (c),b // Write Tile Map Byte B To VDP VRAM Address Offset, VRAM Address Offset++ 98 | dec d // Decrement Number Of Repeats 99 | jr nz,- // Writes # Of Tile Map Words To VRAM 100 | } 101 | 102 | // Repeating Tile Map # Of Tile Map Words To VRAM 103 | macro VDPMAPRepeating(MAPA, MAPB, NUM) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255) 104 | ld a,{MAPA} // A = Tile Map Byte A 105 | ld b,{MAPB} // B = Tile Map Byte B 106 | ld d,{NUM} // D = Number Of Repeats 107 | - 108 | out (c),a // Write Tile Map Byte A into VDP VRAM Address Offset, VRAM Address Offset++ 109 | out (c),b // Write Tile Map Byte B into VDP VRAM Address Offset, VRAM Address Offset++ 110 | dec d // Decrement Number Of Repeats 111 | jr nz,- // Writes # of tile map words to VRAM 112 | } 113 | 114 | // Write Data # Of Bytes Offset By Address To VRAM 115 | macro VDPVRAMWrite(DATA, NUM, OFFSET) { // DATA = Data Address, NUM = Number Of Bytes (0..255), OFFSET = VRAM Address Offset 116 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 117 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 118 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 119 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 120 | ld hl,{DATA} // HL = Data Address 121 | ld b,{NUM} // B = Number Of Bytes 122 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 123 | } 124 | 125 | // Writing Data # Of Bytes Offset By Address To VRAM 126 | macro VDPVRAMWriting(DATA, NUM) { // DATA = Data Address, NUM = Number of Bytes (0..255) 127 | ld hl,{DATA} // HL = Data Address 128 | ld b,{NUM} // B = Number Of Bytes 129 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 130 | } -------------------------------------------------------------------------------- /VDP/HelloWorld/make.bat: -------------------------------------------------------------------------------- 1 | bass HelloWorld.asm 2 | ucon64 -nbak -chk SMSAudio.sms -------------------------------------------------------------------------------- /VDP/Sprite/BGSPRCHR.asm: -------------------------------------------------------------------------------- 1 | // BG Default Tile 2 | db %11111111, 0, 0, 0 3 | db %11111111, 0, 0, 0 4 | db %11111111, 0, 0, 0 5 | db %11111111, 0, 0, 0 6 | db %11111111, 0, 0, 0 7 | db %11111111, 0, 0, 0 8 | db %11111111, 0, 0, 0 9 | db %11111111, 0, 0, 0 10 | 11 | // Bat Left 12 | db %00011111 // Line 1 13 | db %00000000 14 | db %00000000 15 | db %00000000 16 | 17 | db %01101000 // Line 2 18 | db %00011111 19 | db %00000000 20 | db %00000000 21 | 22 | db %10001000 // Line 3 23 | db %01111111 24 | db %00000000 25 | db %00000000 26 | 27 | db %10001000 // Line 4 28 | db %01111111 29 | db %00000000 30 | db %00000000 31 | 32 | db %10001000 // Line 5 33 | db %01111111 34 | db %00000000 35 | db %00000000 36 | 37 | db %10001000 // Line 6 38 | db %01111111 39 | db %00000000 40 | db %00000000 41 | 42 | db %01101000 // Line 7 43 | db %00011111 44 | db %00000000 45 | db %00000000 46 | 47 | db %00011111 // Line 8 48 | db %00000000 49 | db %00000000 50 | db %00000000 51 | 52 | 53 | // Bat Middle 54 | db %11111111 // Line 1 55 | db %00000000 56 | db %00000000 57 | db %00000000 58 | 59 | db %00011000 // Line 2 60 | db %11111111 61 | db %00000000 62 | db %00000000 63 | 64 | db %00011000 // Line 3 65 | db %11111111 66 | db %00000000 67 | db %00000000 68 | 69 | db %00011000 // Line 4 70 | db %11111111 71 | db %00000000 72 | db %00000000 73 | 74 | db %00011000 // Line 5 75 | db %11111111 76 | db %00000000 77 | db %00000000 78 | 79 | db %00011000 // Line 6 80 | db %11111111 81 | db %00000000 82 | db %00000000 83 | 84 | db %00011000 // Line 7 85 | db %11111111 86 | db %00000000 87 | db %00000000 88 | 89 | db %11111111 // Line 8 90 | db %00000000 91 | db %00000000 92 | db %00000000 93 | 94 | 95 | // Bat Right 96 | db %11111000 // Line 1 97 | db %00000000 98 | db %00000000 99 | db %00000000 100 | 101 | db %00010110 // Line 2 102 | db %11111000 103 | db %00000000 104 | db %00000000 105 | 106 | db %00010001 // Line 3 107 | db %11111110 108 | db %00000000 109 | db %00000000 110 | 111 | db %00010001 // Line 4 112 | db %11111110 113 | db %00000000 114 | db %00000000 115 | 116 | db %00010001 // Line 5 117 | db %11111110 118 | db %00000000 119 | db %00000000 120 | 121 | db %00010001 // Line 6 122 | db %11111110 123 | db %00000000 124 | db %00000000 125 | 126 | db %00010110 // Line 7 127 | db %11111000 128 | db %00000000 129 | db %00000000 130 | 131 | db %11111000 // Line 8 132 | db %00000000 133 | db %00000000 134 | db %00000000 -------------------------------------------------------------------------------- /VDP/Sprite/BGSPRPAL.asm: -------------------------------------------------------------------------------- 1 | // 6-Bit BGR222 2 | // BBGGRR 3 | db %00000000 // Black * Clear Colour (Start Of 1st Palette) 4 | db %00001111 // Yellow 5 | db %00000000 6 | db %00000000 7 | db %00000000 8 | db %00000000 9 | db %00000000 10 | db %00000000 11 | db %00000000 12 | db %00000000 13 | db %00000000 14 | db %00000000 15 | db %00000000 16 | db %00000000 17 | db %00000000 18 | db %00000000 19 | db %00000000 // Black * Clear Colour (Start Of 2nd Palette) 20 | db %00000011 // Red 21 | db %00001100 // Green 22 | db %00110000 // Blue 23 | db %00000000 24 | db %00000000 25 | db %00000000 26 | db %00000000 27 | db %00000000 28 | db %00000000 29 | db %00000000 30 | db %00000000 31 | db %00000000 32 | db %00000000 33 | db %00000000 34 | db %00000000 -------------------------------------------------------------------------------- /VDP/Sprite/LIB/SMS_HEADER.ASM: -------------------------------------------------------------------------------- 1 | //============ 2 | // SMS Header 3 | //============ 4 | seek($7FF0) // Header Can Be At Offset $1FF0, $3FF0 Or $7FF0 5 | db "TMR SEGA" // ($7FF0) Required For Export Master System & Game Gear BIOS 6 | db 0, 0 // ($7FF8) Reserved Space, Can Be $20,$20 For 2 ASCII Spaces e.g "TMR SEGA__" 7 | db 0, 0 // ($7FFA) Little-Endian Word ROM Checksum For Export Master System BIOS 8 | 9 | // BCD Product Code = 15027 / Version Number = 0 ($7FFC) 10 | db $27, $50, $10 // BCD Product Code 2.5 Bytes / Version Number 0.5 Bytes 11 | // Byte 3 2 1 Byte 3 12 | // Bits 4..7 0..7 0..7 Bits 0..3 13 | // Value Product Code Value Version Number 14 | // $1 $50 $27 $0 15 | 16 | // Region Code = SMS Export / ROM Size = 128KB ($7FFF) 17 | db $4F // Region Code 0.5 Bytes / ROM Size 0.5 Bytes: 18 | // Bits 4..7 Bits 0..3 19 | // Value System / Region Value Rom Size Comment 20 | // $3 SMS Japan $A 8KB Unused 21 | // $4 SMS Export $B 16KB Unused 22 | // $5 GG Japan $C 32KB 23 | // $6 GG Export $D 48KB Unused Buggy 24 | // $7 GG International $E 64KB Rarely Used 25 | // $F 128KB 26 | // $0 256KB 27 | // $1 512KB Rarely Used 28 | // $2 1MB Unused Buggy -------------------------------------------------------------------------------- /VDP/Sprite/LIB/SMS_VDP.ASM: -------------------------------------------------------------------------------- 1 | //========= 2 | // SMS VDP 3 | //========= 4 | // Wait For Vertical Counter Position 5 | macro VDPWaitV(VPOS) { // VPOS = Wait Vertical Counter Position 6 | - 7 | in a,($7E) // A = Current Vertical Counter Position 8 | cp {VPOS} // IF (Current Vertical Counter Position != VPOS) 9 | jr nz,- // Wait For Vertical Counter Position 10 | } 11 | 12 | // Wait For Horizontal Counter Position 13 | macro VDPWaitH(HPOS) { // HPOS = Wait Horizontal Counter Position 14 | - 15 | in a,($7F) // A = Current Horizontal Counter Position 16 | cp {HPOS} // IF (Current Horizontal Counter Position != HPOS) 17 | jr nz,- // Wait For Horizontal Counter Position 18 | } 19 | 20 | // Write Data Byte To VDP Register 21 | macro VDPREGWrite(DATA, REG) { // DATA = Byte To Send To VDP, REG = VDP Register To Write (0..15) 22 | ld a,{DATA} // A = VDP Register Data 23 | out ($BF),a // Write VDP Register Data To VDP (1st Byte Of Command Pair) 24 | ld a,%10000000 + {REG} // A = VDP REG Write, VDP Register (%TT00RRRR TT %10 = VDP REG Write, %RRRR = VDP Register 0..15) 25 | out ($BF),a // Write VDP Data To VDP Register (2nd Byte Of Command Pair) 26 | } 27 | 28 | // Write SMS 6-Bit BGR Palette # Of Colors Offset By Address To CRAM 29 | macro SMSPALWrite(PAL, COL, OFFSET) { // PAL = Palette Address, COL = Number Of Colors (0..32), OFFSET = CRAM Address Offset (0..32) 30 | ld a,{OFFSET} // A = CRAM Address Offset (%000AAAAA = CRAM Address Offset) 31 | out ($BF),a // Write CRAM Address Offset To VDP (1st Byte Of Command Pair) 32 | ld a,%11000000 // A = CRAM Write Command (%11000000 = CRAM Write) 33 | out ($BF),a // Write CRAM Write Command To VDP (2nd Byte Of Command Pair) 34 | ld hl,{PAL} // HL = Palette Address 35 | ld b,{COL} // B = Palette Data Size In Bytes 36 | ld c,$BE 37 | otir // OUT (C), (LD A, (HL)++), A = 6-Bit Palette Color %00BBGGRR Loaded From HL Palette Address, Write Palette Color To VDP CRAM Address Offset, Offset++, B-- 38 | } 39 | 40 | // Write Tile Characters # Of Tiles Offset By Addres To VRAM 41 | macro VDPCHRWrite(TILE, NUM, OFFSET) { // TILE = Tile Address, NUM = Number Of Tiles (0..255), OFFSET = VRAM Address Offset 42 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 43 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 44 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 45 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 46 | ld hl,{TILE} // HL = Tile Address 47 | ld c,$BE 48 | ld d,{NUM} // D = Number Of Tiles 49 | - 50 | ld b,32 // B = Number Of Tile Bytes To Write (8 * 4 Bits = 32 Bytes) 51 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Byte Loaded From HL Tile Address, Write Tile Byte To VDP VRAM Address Offset, Offset++, B-- 52 | dec d // Decrement Number Of Tiles 53 | jr nz,- // Writes # Of Tiles To VRAM 54 | } 55 | 56 | // Write Tile Map # Of Tile Map Words Offset By Address To VRAM 57 | macro VDPMAPWrite(MAP, NUM, OFFSET) { // MAP = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 58 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 59 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 60 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 61 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 62 | ld hl,{MAP} // HL = Tile Map Address 63 | ld b,{NUM} // B = Number Of Tile Map Words 64 | - 65 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 66 | inc b // Increment Number Of Tile Map Words 67 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 68 | jr nz,- // Writes # Of Tile Map Words To VRAM 69 | } 70 | 71 | // Write HL Tile Map # Of Tile Map Words Offset By Address To VRAM 72 | macro VDPMAPWriteHL(NUM, OFFSET) { // HL = Tile Map Address, NUM = Number Of Tile Map Words (0..255), OFFSET = VRAM Address Offset 73 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 74 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 75 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 76 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd byte Of Command Pair) 77 | ld b,{NUM} // B = Number Of Tile Map Words 78 | - 79 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 80 | inc b // Increment Number Of Tile Map Words 81 | outi // OUT (C), (LD A, (HL)++), A = 8-Bit Tile Map Byte Loaded From HL Tile Map Address, Write Tile Map Byte To VDP VRAM Address Offset, Offset++, B-- 82 | jr nz,- // Writes # Of Tile Map Words To VRAM 83 | } 84 | 85 | // Repeat Tile Map # Of Tile Map Words Offset By Address To VRAM 86 | macro VDPMAPRepeat(MAPA, MAPB, NUM, OFFSET) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255), OFFSET = VRAM Address Offset 87 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 88 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 89 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 90 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 91 | ld a,{MAPA} // A = Tile Map Byte A 92 | ld b,{MAPB} // B = Tile Map Byte B 93 | ld c,$BE 94 | ld d,{NUM} // D = Number Of Repeats 95 | - 96 | out (c),a // Write Tile Map Byte A To VDP VRAM Address Offset, VRAM Address Offset++ 97 | out (c),b // Write Tile Map Byte B To VDP VRAM Address Offset, VRAM Address Offset++ 98 | dec d // Decrement Number Of Repeats 99 | jr nz,- // Writes # Of Tile Map Words To VRAM 100 | } 101 | 102 | // Repeating Tile Map # Of Tile Map Words To VRAM 103 | macro VDPMAPRepeating(MAPA, MAPB, NUM) { // MAPA = Tile Map Byte A, MAPB = Tile Map Byte B, NUM = Number Of Repeats (0..255) 104 | ld a,{MAPA} // A = Tile Map Byte A 105 | ld b,{MAPB} // B = Tile Map Byte B 106 | ld d,{NUM} // D = Number Of Repeats 107 | - 108 | out (c),a // Write Tile Map Byte A into VDP VRAM Address Offset, VRAM Address Offset++ 109 | out (c),b // Write Tile Map Byte B into VDP VRAM Address Offset, VRAM Address Offset++ 110 | dec d // Decrement Number Of Repeats 111 | jr nz,- // Writes # of tile map words to VRAM 112 | } 113 | 114 | // Write Data # Of Bytes Offset By Address To VRAM 115 | macro VDPVRAMWrite(DATA, NUM, OFFSET) { // DATA = Data Address, NUM = Number Of Bytes (0..255), OFFSET = VRAM Address Offset 116 | ld a,{OFFSET} & $FF // A = VRAM Address Offset (%AAAAAAAA = VRAM Address Offset LO) 117 | out ($BF),a // Write VRAM Address Offset To VDP (1st Byte Of Command Pair) 118 | ld a,%01000000 + ({OFFSET} >> 8) // A = VRAM Write Address Offset (%TTAAAAAA TT %00 = VRAM Read, TT %01 = VRAM Write, %AAAAAA = VRAM Address Offset HI) 119 | out ($BF),a // Write VRAM Write Address Offset To VDP (2nd Byte Of Command Pair) 120 | ld hl,{DATA} // HL = Data Address 121 | ld b,{NUM} // B = Number Of Bytes 122 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 123 | } 124 | 125 | // Writing Data # Of Bytes Offset By Address To VRAM 126 | macro VDPVRAMWriting(DATA, NUM) { // DATA = Data Address, NUM = Number of Bytes (0..255) 127 | ld hl,{DATA} // HL = Data Address 128 | ld b,{NUM} // B = Number Of Bytes 129 | otir // OUT (C), (LD A, (HL)++), A = 8-Bit Data Byte Loaded From HL Data Address Offset, Write Data Byte To VDP VRAM Address Offset, Offset++, B-- 130 | } -------------------------------------------------------------------------------- /VDP/Sprite/Sprite.asm: -------------------------------------------------------------------------------- 1 | // SMS Sprite demo by krom (Peter Lemon): 2 | // 1. Load BG/Sprite Palette Data To CRAM 3 | // 2. Load BG/Sprite Tile Data To VRAM 4 | // 3. Set Sprite Vertical/Horizontal Position 5 | // 4. Turn Display On 6 | arch sms.cpu 7 | output "Sprite.sms", create 8 | 9 | macro seek(variable offset) { 10 | origin offset 11 | base offset 12 | } 13 | 14 | // BANK 0..7 (128KB) 15 | seek($0000); fill $20000 // Fill Bank 0..7 With Zero Bytes 16 | include "LIB/SMS_HEADER.ASM" // Include SMS Header 17 | include "LIB/SMS_VDP.ASM" // Include VDP Macros 18 | 19 | seek($0000) 20 | di // Disable Interrupts 21 | im 1 // Set Interrupt Mode 1 22 | jp Start 23 | 24 | seek($0100); Start: 25 | // Load Palette 26 | SMSPALWrite(BGSPRPAL, 32, 0) // Load 32 GG Colors To CRAM, Offset By 0 Colors 27 | 28 | // Load Tile Characters 29 | VDPCHRWrite(BGSPRCHR, 4, 0) // Load 4 8x8 Tiles To VRAM, Offset By 0 (1st Tile is BG Default) 30 | 31 | // Set Sprite Vertical Positions 32 | VDPVRAMWrite(SPRVPOS, 3, $3F00) // Write 3 Vertical Position Bytes To VRAM, Offset By $3F00 33 | 34 | // Set Sprites Horizontal Positions & Character #'s 35 | VDPVRAMWrite(SPRHPOSCHR, 6, $3F80) // Write 3 Horizontal Position Bytes & 3 Character # Bytes Interleaved To VRAM, Offset By $3F80 36 | 37 | // Write VDP Register 1 (Turn Display On) 38 | VDPREGWrite(%11100000, 1) // Write VDP Register 1 Data (%1DI000S0 D = Display 0: Off 1: On, I = Interrupts 0: Off 1: On, S = Sprite Size 0: 8x8 1: 8x16) 39 | 40 | Loop: 41 | jr Loop 42 | 43 | BGSPRPAL: // Include BG / Sprite Palette Data 44 | include "BGSPRPAL.asm" 45 | 46 | BGSPRCHR: // Include BG 12BPP 8x8 Tile Font Character Data 47 | include "BGSPRCHR.asm" 48 | 49 | SPRVPOS: // Include 3 * Sprite Vertical Positions 50 | db 92, 92, 92 51 | 52 | SPRHPOSCHR: // Include 3 * Sprite Horizontal Positions / Character #'s 53 | db 116, 1, 124, 2, 132, 3 -------------------------------------------------------------------------------- /VDP/Sprite/Sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PeterLemon/SMS/27e8dd1a58084a61a3c0cca8dd36e2360a1ad8ea/VDP/Sprite/Sprite.png -------------------------------------------------------------------------------- /VDP/Sprite/Sprite.sms: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PeterLemon/SMS/27e8dd1a58084a61a3c0cca8dd36e2360a1ad8ea/VDP/Sprite/Sprite.sms -------------------------------------------------------------------------------- /VDP/Sprite/make.bat: -------------------------------------------------------------------------------- 1 | bass Sprite.asm 2 | ucon64 -nbak -chk Sprite.sms --------------------------------------------------------------------------------