1 ##################################################
4 # --register-prefix-optional --bitwise-or #
6 ##################################################
11 ##################################################
13 # Register and bitmask definitions #
15 ##################################################
17 .equ GFXDATA, 0xc00000
18 .equ GFXCNTL, 0xc00004
21 .equ VDP0_E_DISPLAY, 0x02
22 .equ VDP0_PLTT_FULL, 0x04
24 .equ VDP1_SMS_MODE, 0x80
25 .equ VDP1_E_DISPLAY, 0x40
30 .equ VDP1_RESERVED, 0x04
32 .equ VDP12_SPR_SHADOWS, 0x08
33 .equ VDP12_SCREEN_V224, 0x00
34 .equ VDP12_SCREEN_V448, 0x04
35 .equ VDP12_PROGRESSIVE, 0x00
36 .equ VDP12_INTERLACED, 0x02
37 .equ VDP12_SCREEN_H256, 0x00
38 .equ VDP12_SCREEN_H320, 0x81
40 .equ VDP16_MAP_V32, 0x00
41 .equ VDP16_MAP_V64, 0x10
42 .equ VDP16_MAP_V128, 0x30
43 .equ VDP16_MAP_H32, 0x00
44 .equ VDP16_MAP_H64, 0x01
45 .equ VDP16_MAP_H128, 0x03
49 ##################################################
53 ##################################################
56 /* Write val to VDP register reg */
57 .macro write_vdp_reg reg val
58 move.w #((\reg << 8) + 0x8000 + \val),(a3)
62 /* For immediate addresses */
63 .macro VRAM_ADDR reg adr
64 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
68 .macro CRAM_ADDR reg adr
69 move.l #(((0xc000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
73 # make VDP word from address adr and store in d0
74 .macro XRAM_ADDR_var adr
84 .macro VRAM_ADDR_var adr
90 .macro CRAM_ADDR_var adr
96 .macro VSCROLL_ADDR reg adr
97 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + ((\adr >> 14) | 0x10)),\reg
101 .macro HSCROLL_ADDR reg adr
102 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
106 #################################################
110 #################################################
120 /* Y size link attr X */
121 dc.w 0; dc.b 0x05; dc.b 0; dc.w 0x6002; dc.w 0
127 ##################################################
131 ##################################################
139 /* Load color data */
142 moveq.l #(colors_end-colors)/2,d0
151 /* generate A layer map */
159 0: move.l #0x00000000,(a0)
165 /* generate B layer map */
170 0: move.l #0x00000000,(a0)
173 /* upload sprite data */
176 movea.l #sprite_data,a1
178 move.l #(sprite_data_end-sprite_data)/2-1,d3
189 ##################################################
193 ##################################################
203 #################################################
205 # Initialize VDP registers #
207 #################################################
211 write_vdp_reg 0,(VDP0_E_DISPLAY | VDP0_PLTT_FULL)
212 write_vdp_reg 1,(VDP1_E_VBI | VDP1_E_DISPLAY | VDP1_E_DMA | VDP1_RESERVED)
213 write_vdp_reg 2,(0xe000 >> 10) /* Screen map a adress */
214 write_vdp_reg 3,(0xe000 >> 10) /* Window address */
215 write_vdp_reg 4,(0xc000 >> 13) /* Screen map b address */
216 write_vdp_reg 5,(0xfc00 >> 9) /* Sprite address */
218 write_vdp_reg 7,0 /* Backdrop color */
219 write_vdp_reg 10,1 /* Lines per hblank interrupt */
220 write_vdp_reg 11,0 /* 2-cell vertical scrolling */
221 write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320)
222 write_vdp_reg 13,(0x8000 >> 10) /* Horizontal scroll address */
224 write_vdp_reg 16,(VDP16_MAP_V32 | VDP16_MAP_H64) /* layer size */
226 write_vdp_reg 18,0xff
230 # Load tile data from ROM
232 # a1: pattern address
233 # d0: number of tiles to load
239 move.l d0,(GFXCNTL).l
251 # Prepare to write to VDP RAM @a3
252 # sets a0 to VDP data port for convenience
258 move.l d0,(GFXCNTL).l
263 # Load color data from ROM
265 # a1: color list address
266 # d0: number of colors to load
272 move.l d0,(GFXCNTL).l
310 #################################################
312 # Wait for next VBlank interrupt #
314 #################################################
326 #################################################
330 #################################################
346 # vim:filetype=asmM68k