|
|
1.1 root 1: #define __Dpoo 0x24
2: .align 4
3: jtab:
4: .long bad_jmp
5: .long bad_jmp
6: .long bad_jmp
7: .long bad_jmp
8: .long bad_jmp
9: .long bad_jmp
10: .long bad_jmp
11: .long bad_jmp
12: .long bad_jmp
13: .long bad_jmp
14: .long bad_jmp
15: .long bad_jmp
16: .long bad_jmp
17: .long bad_jmp
18: .long __l1c
19: jumptable:
20: cmpl $0x1c,%eax
21: jg bad_jmp2
22: shrl $1,%eax
23: jmp *jtab(,%eax,4)
24: .section .rodata
25: bad_jmp_str: .string "Error. Bad jump target: $%x at line %d.\n"
26: .text
27: bad_jmp:
28: shll $1,%eax
29: bad_jmp2:
30: pushl line_no
31: pushl %eax
32: pushl $bad_jmp_str
33: call printf
34: addl $8,%esp
35: call abort
36: #define MEM_SIZE 0x110000
37: #define PROC_STATE 64
38: #define MemBase STData+PROC_STATE
39:
40: .data
41: .comm STData,MEM_SIZE+PROC_STATE
42: .comm X,4
43: .comm N,4
44: .comm Z,4
45: .comm V,4
46: .comm C,4
47: .comm bX,4
48: .comm bN,4
49: .comm bZ,4
50: .comm bV,4
51: .comm bC,4
52: .comm rdest,4
53: .comm exceptions_pending_mask,4
54: .comm exceptions_pending_nums,32
55: .comm exception_handlers,4*32
56: .comm line_no,4
57: debugstr: .string "$%x $%x $%x $%x $%x $%x $%x $%x*$%x $%x $%x $%x $%x $%x $%x $%x:%d\n"
58: .global STRam
59: STRam: .long STData+PROC_STATE
60: .section .rodata
61: bin_filename: .string "test.s.bin"
62: open_mode: .string "r"
63:
64: dreg_fmt: .string "D%d = $%08x "
65: areg_fmt: .string "A%d = $%08x\n"
66: cr: .string "\n"
67: cc_names: .string "XNZVC"
68: hex_fmt: .string "$%02x "
69: illegal_fmt: .string "Illegal instruction at line %d.\n"
70: .text
71: .globl SetZFlag
72: SetZFlag:
73: movl 4(%esp),%eax
74: movb %al,Z
75: ret
76: .globl GetXFlag
77: GetXFlag:
78: movl X,%eax
79: ret
80: .globl GetZFlag
81: GetZFlag:
82: movl Z,%eax
83: ret
84: .globl GetCFlag
85: GetCFlag:
86: movl C,%eax
87: ret
88: .globl GetNFlag
89: GetNFlag:
90: movl N,%eax
91: ret
92: .globl GetVFlag
93: GetVFlag:
94: movl V,%eax
95: ret
96: .globl DumpRegs
97: DumpRegs:
98: pushl %ebp
99: pushl %ebx
100: pushl %ecx
101: pushl %esi
102: movl $STData,%ebx
103: xorl %eax,%eax
104: 1: pushl %eax
105: pushl (%ebx,%eax,4)
106: pushl %eax
107: pushl $dreg_fmt
108: call printf
109: addl $12,%esp
110: movl (%esp),%eax
111: pushl 8*4(%ebx,%eax,4)
112: pushl %eax
113: pushl $areg_fmt
114: call printf
115: addl $12,%esp
116: popl %eax
117: inc %eax
118: cmpl $8,%eax
119: jl 1b
120: movb X,%al
121: movl $0,%ecx
122: call print_scat
123: movb N,%al
124: movl $1,%ecx
125: call print_scat
126: movb Z,%al
127: movl $2,%ecx
128: call print_scat
129: movb V,%al
130: movl $3,%ecx
131: call print_scat
132: movb C,%al
133: movl $4,%ecx
134: call print_scat
135: pushl $cr
136: call printf
137: addl $4,%esp
138: movl $STData+PROC_STATE,%esi
139: movl $MEM_SIZE,%ebx
140: 1: movzbl (%esi),%eax
141: pushl %eax
142: pushl $hex_fmt
143: call printf
144: addl $8,%esp
145: inc %esi
146: dec %ebx
147: testl $15,%ebx
148: jz 3f
149: 2: testl %ebx,%ebx
150: jnz 1b
151: popl %esi
152: popl %ecx
153: popl %ebx
154: popl %ebp
155: ret
156: 3: pushl $cr
157: call printf
158: addl $4,%esp
159: jmp 2b
160: print_scat:
161: xorl %ebx,%ebx
162: cmpb %al,%bl
163: jz 1f
164: movb cc_names(%ecx),%al
165: pushl %eax
166: call putchar
167: addl $4,%esp
168: 1: ret
169: .globl FlagException
170: FlagException:
171: movl 4(%esp),%eax
172: btsl %eax,exceptions_pending_mask
173: incb exceptions_pending_nums(%eax)
174: ret
175: .globl MemReadByte
176: MemReadByte:
177: movl 4(%esp),%eax
178: movsbl STData+PROC_STATE(%eax),%eax
179: ret
180: .globl MemReadWord
181: MemReadWord:
182: movl 4(%esp),%eax
183: movswl STData+PROC_STATE(%eax),%eax
184: xchg %al,%ah
185: ret
186: .globl MemReadLong
187: MemReadLong:
188: movl 4(%esp),%eax
189: movl STData+PROC_STATE(%eax),%eax
190: bswap %eax
191: ret
192: .globl MemWriteByte
193: MemWriteByte:
194: movl 4(%esp),%eax
195: movl 8(%esp),%edx
196: movb %dl,STData+PROC_STATE(%eax)
197: ret
198: .globl MemWriteWord
199: MemWriteWord:
200: movl 8(%esp),%edx
201: movl 4(%esp),%eax
202: xchg %dl,%dh
203: movw %dx,STData+PROC_STATE(%eax)
204: ret
205: .globl MemWriteLong
206: MemWriteLong:
207: movl 8(%esp),%edx
208: movl 4(%esp),%eax
209: bswap %edx
210: movl %edx,STData+PROC_STATE(%eax)
211: ret
212: .globl GetReg
213: GetReg:
214: movl 4(%esp),%eax
215: movl STData(,%eax,4),%eax
216: ret
217: .globl SetReg
218: SetReg:
219: movl 4(%esp),%eax
220: movl 8(%esp),%edx
221: movl %edx,STData(,%eax,4)
222: ret
223: .globl Init680x0
224: Init680x0:
225: pushl %esi
226: pushl %ebx
227: pushl $open_mode
228: pushl $bin_filename
229: call fopen
230: movl %eax, %ebx
231: popl %eax
232: xorl %eax, %eax
233: testl %ebx, %ebx
234: popl %edx
235: je 1f
236: pushl $2
237: pushl $0
238: pushl %ebx
239: call fseek
240: pushl %ebx
241: call ftell
242: pushl $0
243: movl %eax, %esi
244: pushl $0
245: pushl %ebx
246: call fseek
247: addl $28, %esp
248: xorl %eax, %eax
249: cmpl $MEM_SIZE, %esi
250: jge 1f
251: pushl %ebx
252: pushl %esi
253: pushl $1
254: pushl $STData+PROC_STATE
255: call fread
256: pushl %ebx
257: call fclose
258: movl $1, %eax
259: addl $20, %esp
260: 1:
261: popl %ebx
262: popl %esi
263: ret
264: .globl Start680x0
265: Start680x0:
266: pushl %ebp
267: pushl %esi
268: pushl %edi
269: pushl %edx
270: pushl %ecx
271: pushl %ebx
272: movl $STData+PROC_STATE,%ebp
273:
274: __l1c:
275: movl $1, line_no
276: movl $0,%eax
277:
278: /* 0x1e */
279: movl $2, line_no
280: movw __Dpoo(%ebp),%bx
281: rorw $8,%bx
282: addw %bx,%ax
283: sets N
284: seto V
285: setc C
286: setz Z
287: setc X
288:
289: movl %eax,-64(%ebp)
290: popl %ebx
291: popl %ecx
292: popl %edx
293: popl %edi
294: popl %esi
295: popl %ebp
296: ret
297: handle_exception:
298: movl rdest,%ebx
299: testl %ebx,%ebx
300: jnz jumptable
301: movl %eax,rdest
302: movl exceptions_pending_mask,%edx
303: xorl %ecx,%ecx
304: 1:
305: btl %ecx,%edx
306: jnc 2f
307: movl $exception_handlers,%ebx
308: movb exceptions_pending_nums(%ecx),%al
309: decb %al
310: jnz 3f
311: btrl %ecx,exceptions_pending_mask
312: 3: movb %al,exceptions_pending_nums(%ecx)
313: movl (%ebx,%ecx,4),%eax
314: movb X,%bh
315: movb N,%bl
316: movb Z,%ch
317: movb V,%cl
318: movb C,%dh
319: movb %bh,bX
320: movb %bl,bN
321: movb %ch,bZ
322: movb %cl,bV
323: movb %dh,bC
324: jmp jumptable
325: 2:
326: inc %ecx
327: cmpl $32,%ecx
328: jl 1b
329: movl rdest,%eax
330: movl $0,rdest
331: jmp jumptable
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.