fix vdp_setcolor
[mdlife] / src / vdp.S
1         .text
2
3 #define ASM
4 #include "hwregs.h"
5
6         .globl vdp_init
7 vdp_init:
8         move.l #def_reg_tab, %a0
9         move.w #0, %d1
10 0:      move.w %d1, %d0
11         lsl.w #8, %d0
12         or.w #0x8000, %d0
13         move.b (%a0)+, %d0
14         move.w %d0, VDP_CTL_PORT        | VDP_CTL = 0x8000 | (reg << 8) | val
15         add.w #1, %d1
16         cmp.w def_reg_tab_size, %d1
17         bne.s 0b
18         rts
19
20         | address in d0, type in d1
21 setup_addr:
22         lsl.l #2, %d0
23         lsr.w #2, %d0
24         swap %d0
25         or.l %d1, %d0
26         move.l %d0, VDP_CTL_PORT
27         rts
28
29         .globl vdp_setcolor
30 vdp_setcolor:
31         move.l 4(%sp), %d0      | palette number
32         lsl.l #5, %d0
33         add.l 8(%sp), %d0       | add index
34         move.l #VDP_CRAM, %d1
35         bsr setup_addr
36         move.w 22(%sp), %d0     | blue
37         lsl.w #4, %d0
38         or.w 18(%sp), %d0       | green
39         lsl.w #4, %d0
40         or.w 14(%sp), %d0       | red
41         and.w #0x0eee, %d0
42         move.w %d0, VDP_DATA_PORT
43         rts
44
45         .data
46 def_reg_tab:
47         .byte VDP_M1_INIT                       | 0: mode 1
48         .byte VDP_M2_INIT + VDP_M2_DISP         | 1: mode 2
49         .byte VDP_NA_ADDR(0xc000)               | 2: scroll A nametable addr.
50         .byte 0                                 | 3: window nametable addr.
51         .byte VDP_NB_ADDR(0xd000)               | 4: scroll B nametable addr.
52         .byte VDP_SPRTAB_ADDR(0xe000)           | 5: sprite table addr.
53         .byte 0
54         .byte 0                                 | 7: bg color
55         .byte 0, 0
56         .byte 0                                 | 10: horiz. interrupt interval
57         .byte 0                                 | 11: mode 3
58         .byte VDP_M4_H40                        | 12: mode 4
59         .byte 0                                 | 13: hscroll table addr.
60         .byte 0
61         .byte 2                                 | 15: autoincrement 2 bytes
62         .byte VDP_SCR_H64                       | 16: scroll size (64x32)
63         .byte 0, 0                              | 17,18: win x/y pos
64         .byte 0, 0, 0, 0, 0                     | 19-23: DMA regs
65 def_reg_tab_end:
66         .align 2
67 def_reg_tab_size:
68         .word def_reg_tab_end - def_reg_tab
69
70         
71 | vi:ft=gas68k: