1 ##################################################
8 # Assemble with m68k-coff-as #
10 ##################################################
17 ##################################################
19 # Register and bitmask definitions #
21 ##################################################
23 .equ GFXDATA, 0xc00000
24 .equ GFXCNTL, 0xc00004
27 .equ VDP0_E_DISPLAY, 0x02
28 .equ VDP0_PLTT_FULL, 0x04
30 .equ VDP1_SMS_MODE, 0x80
31 .equ VDP1_E_DISPLAY, 0x40
36 .equ VDP1_RESERVED, 0x04
38 .equ VDP12_SPR_SHADOWS, 0x08
39 .equ VDP12_SCREEN_V224, 0x00
40 .equ VDP12_SCREEN_V448, 0x04
41 .equ VDP12_PROGRESSIVE, 0x00
42 .equ VDP12_INTERLACED, 0x02
43 .equ VDP12_SCREEN_H256, 0x00
44 .equ VDP12_SCREEN_H320, 0x81
46 .equ VDP16_MAP_V32, 0x00
47 .equ VDP16_MAP_V64, 0x10
48 .equ VDP16_MAP_V128, 0x30
49 .equ VDP16_MAP_H32, 0x00
50 .equ VDP16_MAP_H64, 0x01
51 .equ VDP16_MAP_H128, 0x03
55 ##################################################
59 ##################################################
62 /* Write val to VDP register reg */
63 .macro write_vdp_reg reg val
64 move.w #((\reg << 8) + 0x8000 + \val),(a3)
68 /* For immediate addresses */
69 .macro VRAM_ADDR reg adr
70 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
74 /* For indirect (variable) addresses.
76 .macro VRAM_ADDR_var reg adr
91 .macro CRAM_ADDR reg adr
92 move.l #(((0xc000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
96 /* For indirect (variable) addresses */
97 .macro CRAM_ADDR_var reg adr
112 .macro VSCROLL_ADDR reg adr
113 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + ((\adr >> 14) | 0x10)),\reg
117 .macro HSCROLL_ADDR reg adr
118 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
123 dc.w 0x0040,0x0080,0x000e,0x00e0,0x0e00,0x00ee
125 dc.l 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000
126 dc.l 0x22334455,0x22334455,0x22334455,0x22334455,0x22334455,0x22334455,0x22334455,0x22334455
202 /* Y size link attr X */
203 dc.w 10+128; dc.b 0x05; dc.b 1; dc.w 0x6002; dc.w 0
204 dc.w 30+128; dc.b 0x05; dc.b 2; dc.w 0x6006; dc.w 0
205 dc.w 60+128; dc.b 0x05; dc.b 3; dc.w 0xe002; dc.w 0
206 dc.w 80+128; dc.b 0x05; dc.b 4; dc.w 0xe006; dc.w 0
207 dc.w 120+128; dc.b 0x05; dc.b 5; dc.w 0x6002; dc.w 0
208 dc.w 140+128; dc.b 0x05; dc.b 6; dc.w 0x6006; dc.w 0
209 dc.w 170+128; dc.b 0x05; dc.b 7; dc.w 0xe002; dc.w 0
210 dc.w 190+128; dc.b 0x05; dc.b 0; dc.w 0xe006; dc.w 0
214 ##################################################
218 ##################################################
224 /* Load color data */
236 /* generate A layer map */
237 movea.l #0xe000+10*2,a6
244 0: move.l #0x00010001,(a3)
248 0: move.l #0x80018001,(a3)
254 /* generate B layer map */
255 movea.l #0xc000+64*14*2,a3
259 0: move.l #0x80008000,(a3)
262 /* upload sprite data */
265 movea.l #sprite_data,a0
267 move.l #(sprite_data_end-sprite_data)/2-1,d3
273 ##################################################
277 ##################################################
298 #################################################
300 # Initialize VDP registers #
302 #################################################
306 write_vdp_reg 0,(VDP0_E_DISPLAY + VDP0_PLTT_FULL)
307 write_vdp_reg 1,(VDP1_E_VBI + VDP1_E_DISPLAY + VDP1_E_DMA + VDP1_RESERVED)
308 write_vdp_reg 2,(0xe000 >> 10) /* Screen map a adress */
309 write_vdp_reg 3,(0xe000 >> 10) /* Window address */
310 write_vdp_reg 4,(0xc000 >> 13) /* Screen map b address */
311 write_vdp_reg 5,(0xfc00 >> 9) /* Sprite address */
313 write_vdp_reg 7,1 /* Border color */
314 write_vdp_reg 10,1 /* Lines per hblank interrupt */
315 write_vdp_reg 11,0 /* 2-cell vertical scrolling */
316 write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320 | VDP12_SPR_SHADOWS)
317 write_vdp_reg 13,(0x6000 >> 10) /* Horizontal scroll address */
319 write_vdp_reg 16,(VDP16_MAP_V32 + VDP16_MAP_H64)
321 write_vdp_reg 18,0xff
326 #################################################
328 # Load tile data from ROM #
332 # a4: pattern address #
333 # d4: number of tiles to load #
334 # Destroys a2,d0,d6-d7... #
336 #################################################
348 dbra d4,_copy_tile_data
362 #################################################
364 # Clear one of the screen maps #
368 # d0: Data to write to each map entry #
370 #################################################
377 move.w #1023,d1 /* Loop counter */
381 dbra d1,_clear_map_loop
385 #################################################
387 # Load color data from ROM #
391 # a4: color list address #
392 # d4: number of colors to load #
394 #################################################
405 dbra d4,_copy_color_data
410 #################################################
412 # Wait for next VBlank interrupt #
414 #################################################
426 #################################################
430 #################################################