├── 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
--------------------------------------------------------------------------------