megaed-sv: implement ROM load/run
[megadrive.git] / megaed-sv / asmtools.s
1 # Assemble with gas
2 #   --register-prefix-optional --bitwise-or
3
4 .macro ldarg  arg, stacksz, reg
5     move.l (4 + \arg * 4 + \stacksz)(%sp), \reg
6 .endm
7
8
9 .global read_joy_responses /* u8 *rbuf */
10 read_joy_responses:
11     ldarg       0, 0, a1
12     movem.l     d2-d7, -(sp)
13     movea.l     #0xa10003, a0
14     move.b      #0x40, (6,a0)
15     move.b      #0x40, (a0)
16
17 .macro one_test val
18     move.l      #100/12-1, d0
19 0:
20     dbra        d0, 0b
21     move.b      \val, d0
22     move.b      d0, (a0)
23     move.b      (a0), d0
24     move.b      (a0), d1
25     move.b      (a0), d2
26     move.b      (a0), d3
27     move.b      (a0), d4
28     move.b      (a0), d5
29     move.b      (a0), d6
30     move.b      (a0), d7
31     move.b      d0, (a1)+
32     move.b      d1, (a1)+
33     move.b      d2, (a1)+
34     move.b      d3, (a1)+
35     move.b      d4, (a1)+
36     move.b      d5, (a1)+
37     move.b      d6, (a1)+
38     move.b      d7, (a1)+
39 .endm
40
41         move.w          #0x2700, sr
42     one_test    #0x00
43     one_test    #0x40
44     one_test    #0x00
45     one_test    #0x40
46     one_test    #0x00
47         move.w          #0x2000, sr
48     movem.l     (sp)+, d2-d7
49     rts
50
51
52 .global run_game /* u16 mapper */
53 run_game:
54         move.w          #0x2700, sr
55     ldarg       0, 0, d7
56     move.l      #0xa10000, a7
57     moveq.l     #0x00, d1
58     move.b      #0xff, d2
59     move.b      d1, (0x0b,a7) /* CtrlB */
60     move.b      d1, (0x0d,a7) /* CtrlC */
61     move.b      d2, (0x0f,a7) /* TxDataA */
62     move.b      d1, (0x13,a7) /* S-CtrlA */
63     move.b      d2, (0x15,a7) /* TxDataB */
64     move.b      d1, (0x19,a7) /* S-CtrlB */
65     move.b      d2, (0x1b,a7) /* TxDataC */
66     move.b      d1, (0x1f,a7) /* S-CtrlC */
67
68     move.l      #0xff0000, a1
69     move.l      #0x10000/4/4-1, %d0
70 0:
71     move.l      d1, (%a1)+
72     move.l      d1, (%a1)+
73     move.l      d1, (%a1)+
74     move.l      d1, (%a1)+
75     dbra        d0, 0b
76
77     lea         (run_game_code,pc), a0
78     move.l      #0xfff000, a1
79     move.l      #(run_game_code_end - run_game_code)/2-1, d0
80 0:
81     move.w      (%a0)+, (%a1)+
82     dbra        d0, 0b
83     jmp         0xfff000
84
85 run_game_code:
86     move.w      #0x3210, (0xA13006)
87
88     move.w      d7, (0xA13010)
89     move.w      #0, (0xA13000)
90     
91     move.l      (0x00), a7
92     move.l      (0x04), a0
93     jmp         (a0)
94 run_game_code_end:
95
96
97 # vim:filetype=asmM68k:ts=4:sw=4:expandtab