Mercurial > repos > blastem
comparison runtime.S @ 64:2b1a65f4b85d
Cleanup 68K timing code. Temporarily omment out fFPS counter as it was causing segfaults
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 19 Dec 2012 21:25:39 -0800 |
parents | 32650c77008a |
children | 7a22a0e6c004 |
comparison
equal
deleted
inserted
replaced
63:a6dd5b7a971b | 64:2b1a65f4b85d |
---|---|
29 .asciz "Program tried to access illegal 68K address %X\n" | 29 .asciz "Program tried to access illegal 68K address %X\n" |
30 | 30 |
31 .global m68k_write_word | 31 .global m68k_write_word |
32 .global try_fifo_write | 32 .global try_fifo_write |
33 m68k_write_word: | 33 m68k_write_word: |
34 call inccycles | |
34 and $0xFFFFFF, %rdi | 35 and $0xFFFFFF, %rdi |
35 cmp $0x400000, %edi | 36 cmp $0x400000, %edi |
36 jle cart_w | 37 jle cart_w |
37 cmp $0xE00000, %edi | 38 cmp $0xE00000, %edi |
38 jge workram_w | 39 jge workram_w |
39 cmp $0xC00000, %edi | 40 cmp $0xC00000, %edi |
40 jge vdp_psg_w | 41 jge vdp_psg_w |
41 jmp inccycles | 42 ret |
42 workram_w: | 43 workram_w: |
43 and $0xFFFF, %rdi | 44 and $0xFFFF, %rdi |
44 mov %cx, (%r9, %rdi) | 45 mov %cx, (%r9, %rdi) |
45 jmp inccycles | 46 ret |
46 cart_w: | 47 cart_w: |
47 mov %cx, (%r8, %rdi) | 48 mov %cx, (%r8, %rdi) |
48 jmp inccycles | 49 ret |
49 vdp_psg_w: | 50 vdp_psg_w: |
50 test $0x2700E0, %edi | 51 test $0x2700E0, %edi |
51 jnz crash | 52 jnz crash |
52 and $0x1F, %edi | 53 and $0x1F, %edi |
53 cmp $4, %edi | 54 cmp $4, %edi |
75 mov %rbx, (%rdx) | 76 mov %rbx, (%rdx) |
76 /* clear pending flag */ | 77 /* clear pending flag */ |
77 andb $0xEF, 19(%rdx) | 78 andb $0xEF, 19(%rdx) |
78 pop %rbx | 79 pop %rbx |
79 pop %rdx | 80 pop %rdx |
80 jmp inccycles | 81 ret |
81 fifo_fallback: | 82 fifo_fallback: |
82 pop %rbx | 83 pop %rbx |
83 pop %rdx | 84 pop %rdx |
84 jmp do_vdp_port_write | 85 jmp do_vdp_port_write |
85 crash: | 86 crash: |
89 mov $1, %rdi | 90 mov $1, %rdi |
90 call exit | 91 call exit |
91 | 92 |
92 .global m68k_write_byte | 93 .global m68k_write_byte |
93 m68k_write_byte: | 94 m68k_write_byte: |
95 call inccycles | |
94 and $0xFFFFFF, %rdi | 96 and $0xFFFFFF, %rdi |
95 /* deal with byte swapping */ | 97 /* deal with byte swapping */ |
96 xor $1, %edi | 98 xor $1, %edi |
97 cmp $0x400000, %edi | 99 cmp $0x400000, %edi |
98 jle cart_wb | 100 jle cart_wb |
99 cmp $0xE00000, %edi | 101 cmp $0xE00000, %edi |
100 jge workram_wb | 102 jge workram_wb |
101 jmp inccycles | 103 ret |
102 workram_wb: | 104 workram_wb: |
103 and $0xFFFF, %rdi | 105 and $0xFFFF, %rdi |
104 mov %cl, (%r9, %rdi) | 106 mov %cl, (%r9, %rdi) |
105 jmp inccycles | 107 ret |
106 cart_wb: | 108 cart_wb: |
107 mov %cl, (%r8, %rdi) | 109 mov %cl, (%r8, %rdi) |
108 jmp inccycles | 110 ret |
109 | 111 |
110 .global m68k_write_long_lowfirst | 112 .global m68k_write_long_lowfirst |
111 m68k_write_long_lowfirst: | 113 m68k_write_long_lowfirst: |
112 push %rdi | 114 push %rdi |
113 add $2, %edi | 115 add $2, %edi |
124 call m68k_write_word | 126 call m68k_write_word |
125 pop %rcx | 127 pop %rcx |
126 pop %rdi | 128 pop %rdi |
127 add $2, %rdi | 129 add $2, %rdi |
128 jmp m68k_write_word | 130 jmp m68k_write_word |
131 | |
132 inccycles: | |
133 cmp %rbp, %rax | |
134 jge do_limit | |
135 add $4, %rax | |
136 ret | |
137 do_limit: | |
138 push %rcx | |
139 push %rdi | |
140 call handle_cycle_limit | |
141 pop %rdi | |
142 pop %rcx | |
143 add $4, %rax | |
144 ret | |
129 | 145 |
130 .global m68k_read_word_scratch1 | 146 .global m68k_read_word_scratch1 |
131 m68k_read_word_scratch1: | 147 m68k_read_word_scratch1: |
148 call inccycles | |
132 and $0xFFFFFF, %rcx | 149 and $0xFFFFFF, %rcx |
133 cmp $0x400000, %ecx | 150 cmp $0x400000, %ecx |
134 jle cart | 151 jle cart |
135 cmp $0xE00000, %ecx | 152 cmp $0xE00000, %ecx |
136 jge workram | 153 jge workram |
137 cmp $0xC00000, %ecx | 154 cmp $0xC00000, %ecx |
138 jge vdp_psg | 155 jge vdp_psg |
139 xor %cx, %cx | 156 xor %cx, %cx |
140 dec %cx | 157 dec %cx |
141 jmp inccycles | 158 ret |
142 workram: | 159 workram: |
143 and $0xFFFF, %rcx | 160 and $0xFFFF, %rcx |
144 mov (%r9, %rcx), %cx | 161 mov (%r9, %rcx), %cx |
145 jmp inccycles | 162 ret |
146 vdp_psg: | 163 vdp_psg: |
147 test $0x2700E0, %ecx | 164 test $0x2700E0, %ecx |
148 jnz crash | 165 jnz crash |
149 and $0x1F, %ecx | 166 and $0x1F, %ecx |
150 jmp do_vdp_port_read | 167 jmp do_vdp_port_read |
151 cart: | 168 cart: |
152 mov (%r8, %rcx), %cx | 169 mov (%r8, %rcx), %cx |
153 inccycles: | |
154 add $4, %rax | |
155 cmp %rbp, %rax | |
156 jge do_limit | |
157 ret | |
158 do_limit: | |
159 push %rcx | |
160 call handle_cycle_limit | |
161 pop %rcx | |
162 ret | 170 ret |
163 | 171 |
164 .global m68k_read_long_scratch1 | 172 .global m68k_read_long_scratch1 |
165 m68k_read_long_scratch1: | 173 m68k_read_long_scratch1: |
166 push %rcx | 174 push %rcx |
174 or %edi, %ecx | 182 or %edi, %ecx |
175 ret | 183 ret |
176 | 184 |
177 .global m68k_read_byte_scratch1 | 185 .global m68k_read_byte_scratch1 |
178 m68k_read_byte_scratch1: | 186 m68k_read_byte_scratch1: |
187 call inccycles | |
179 and $0xFFFFFF, %rcx | 188 and $0xFFFFFF, %rcx |
180 /* deal with byte swapping */ | 189 /* deal with byte swapping */ |
181 xor $1, %ecx | 190 xor $1, %ecx |
182 cmp $0x400000, %ecx | 191 cmp $0x400000, %ecx |
183 jle cart_b | 192 jle cart_b |
184 cmp $0xE00000, %ecx | 193 cmp $0xE00000, %ecx |
185 jge workram_b | 194 jge workram_b |
186 xor %cl, %cl | 195 xor %cl, %cl |
187 dec %cl | 196 dec %cl |
188 jmp inccycles | 197 ret |
189 workram_b: | 198 workram_b: |
190 and $0xFFFF, %rcx | 199 and $0xFFFF, %rcx |
191 mov (%r9, %rcx), %cl | 200 mov (%r9, %rcx), %cl |
192 jmp inccycles | 201 ret |
193 cart_b: | 202 cart_b: |
194 mov (%r8, %rcx), %cl | 203 mov (%r8, %rcx), %cl |
195 jmp inccycles | 204 ret |
196 | 205 |
197 ret_addr_msg: | 206 ret_addr_msg: |
198 .asciz "Program modified return address on stack: found %X, expected %X\n" | 207 .asciz "Program modified return address on stack: found %X, expected %X\n" |
199 | 208 |
200 .global m68k_modified_ret_addr | 209 .global m68k_modified_ret_addr |