1 ##################################################
4 # --register-prefix-optional --bitwise-or #
6 ##################################################
12 ##################################################
14 # Register and bitmask definitions #
16 ##################################################
18 .equ GFXDATA, 0xc00000
19 .equ GFXCNTL, 0xc00004
22 .equ VDP0_E_DISPLAY, 0x02
23 .equ VDP0_PLTT_FULL, 0x04
25 .equ VDP1_SMS_MODE, 0x80
26 .equ VDP1_E_DISPLAY, 0x40
31 .equ VDP1_RESERVED, 0x04
33 .equ VDP12_SPR_SHADOWS, 0x08
34 .equ VDP12_SCREEN_V224, 0x00
35 .equ VDP12_SCREEN_V448, 0x04
36 .equ VDP12_PROGRESSIVE, 0x00
37 .equ VDP12_INTERLACED, 0x02
38 .equ VDP12_SCREEN_H256, 0x00
39 .equ VDP12_SCREEN_H320, 0x81
41 .equ VDP16_MAP_V32, 0x00
42 .equ VDP16_MAP_V64, 0x10
43 .equ VDP16_MAP_V128, 0x30
44 .equ VDP16_MAP_H32, 0x00
45 .equ VDP16_MAP_H64, 0x01
46 .equ VDP16_MAP_H128, 0x03
50 ##################################################
54 ##################################################
57 /* Write val to VDP register reg */
58 .macro write_vdp_reg reg val
59 move.w #((\reg << 8) + 0x8000 + \val),(a3)
63 /* For immediate addresses */
64 .macro VRAM_ADDR reg adr
65 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
69 .macro CRAM_ADDR reg adr
70 move.l #(((0xc000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
74 # make VDP word from address adr and store in d0
75 .macro XRAM_ADDR_var adr
85 .macro VRAM_ADDR_var adr
91 .macro CRAM_ADDR_var adr
97 .macro VSCROLL_ADDR reg adr
98 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + ((\adr >> 14) | 0x10)),\reg
102 .macro HSCROLL_ADDR reg adr
103 move.l #(((0x4000 + (\adr & 0x3fff)) << 16) + (\adr >> 14)),\reg
107 # convert tile coords in d0, d1 to nametable addr to a0
116 #################################################
120 #################################################
130 /* Y size link attr X */
131 dc.w 0; dc.b 0x05; dc.b 0; dc.w 0x6002; dc.w 0
137 ##################################################
141 ##################################################
146 /* mask irqs durinf init */
152 move.b #0x40,(0xa10009).l
153 move.b #0x40,(0xa10003).l
158 /* Load color data */
161 moveq.l #(colors_end-colors)/2,d0
170 /* generate A layer map */
178 0: move.l #0x00000000,(a0)
184 /* generate B layer map */
189 0: move.l #0x00000000,(a0)
192 /* upload sprite data */
195 movea.l #sprite_data,a1
197 move.l #(sprite_data_end-sprite_data)/2-1,d3
203 ##################################################
207 ##################################################
210 # a6 - page[31:8],cursor_offs[7:0]
222 movem.l d0-d7/a0-a5,-(a7)
224 /* draw main stuff */
228 move.l d0,a1 /* current addr */
272 jsr get_input /* x0cbrldu x1sa00du */
295 movem.l (a7)+,d0-d7/a0-a5
299 #################################################
301 # Initialize VDP registers #
303 #################################################
307 write_vdp_reg 0,(VDP0_E_DISPLAY | VDP0_PLTT_FULL)
308 write_vdp_reg 1,(VDP1_E_VBI | VDP1_E_DISPLAY | VDP1_E_DMA | VDP1_RESERVED)
309 write_vdp_reg 2,(0xe000 >> 10) /* Screen map a adress */
310 write_vdp_reg 3,(0xe000 >> 10) /* Window address */
311 write_vdp_reg 4,(0xc000 >> 13) /* Screen map b address */
312 write_vdp_reg 5,(0xfc00 >> 9) /* Sprite address */
314 write_vdp_reg 7,0 /* Backdrop color */
315 write_vdp_reg 10,1 /* Lines per hblank interrupt */
316 write_vdp_reg 11,0 /* 2-cell vertical scrolling */
317 write_vdp_reg 12,(VDP12_SCREEN_V224 | VDP12_SCREEN_H320)
318 write_vdp_reg 13,(0x8000 >> 10) /* Horizontal scroll address */
320 write_vdp_reg 16,(VDP16_MAP_V32 | VDP16_MAP_H64) /* layer size */
322 write_vdp_reg 18,0xff
326 # read single phase from controller
330 move.b #0x40,(0xa10003)
335 move.b #0x00,(0xa10003)
340 # move.b #0x40,(0xa10003)
343 # Load tile data from ROM
345 # a1: pattern address
346 # d0: number of tiles to load
352 move.l d0,(GFXCNTL).l
364 # Prepare to write to VDP RAM @a3
365 # sets a0 to VDP data port for convenience
371 move.l d0,(GFXCNTL).l
376 # Load color data from ROM
378 # a1: color list address
379 # d0: number of colors to load
385 move.l d0,(GFXCNTL).l
433 ror.l d0,d2 /* prep value */
435 subq.l #1,d3 /* count */
450 dbra d3,_print_hex_loop
455 #################################################
457 # Wait for next VBlank interrupt #
459 #################################################
471 #################################################
475 #################################################
491 # vim:filetype=asmM68k