-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.X68
340 lines (272 loc) · 9.56 KB
/
main.X68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
*-----------------------------------------------------------
* Title : Team 68++ Disassembler
* Written by : Boyan Hristov, Phillip Ovanesyan, Ryan Russell
* Date : April 10th, 2020
* Description: This is a disassrembler written for CSS 422 B.
*-----------------------------------------------------------
org_main equ $1000
org_stack equ $F000
org org_main
start:
lea org_stack, sp * initialize stack
* ==== program code ====
intro bsr print_logo
bsr print_nl
main bsr bound_hint * for testing only, REMOVE FOR SUBMISSION
bsr user_input
* counter for lines printed out
clr.l d2
* while current address <= end address
read_loop cmpa.l a6, a0
bhi read_loop_x
cmpi.l #screen_limit, d2 * if printed too many lines
bge limit_reached
move.l a0, d1
bsr print_hex_l
bsr print_space
bsr read_opcode
addq.l #1, d2
bra read_loop
limit_reached bsr wait_continue * wait for user to press enter
clr.l d2 * reset counter
bra read_loop
read_loop_x bsr wait_again * ask user if they want to go again
tst.b d3 * check if user said yes or no
bne main
bsr print_finish
program_end simhalt * code is done
* ==== utility subroutines ====
*-----------------------------------------------------------
* //// print newline
* parameters:
* none
* return:
* none
*
rl_print_nl reg a0-a6/d0-d7
print_nl move.w sr, -(sp)
movem.l rl_print_nl, -(sp)
* ---- subroutine code:
move.b #13, d0 * print null-term string with CR, LF
lea nullterm, a1 * literally point a1 to null (0)
trap #15
* ---- exit
print_nl_x movem.l (sp)+, rl_print_nl
rtr
*-----------------------------------------------------------
* //// print space
* parameters:
* none
* return:
* none
*
rl_print_space reg a0-a6/d0-d7
print_space move.w sr, -(sp)
movem.l rl_print_space, -(sp)
* ---- subroutine code:
move.b #14, d0 * print null-term string, no CR, LF
lea space, a1
trap #15
* ---- exit
print_space_x movem.l (sp)+, rl_print_space
rtr
*-----------------------------------------------------------
* //// print long (32 bits) as hex digits
* parameters:
* d1 - contains word to print as hex
* return:
* none
*
rl_print_hex_l reg a0-a6/d0-d7
print_hex_l move.w sr, -(sp)
movem.l rl_print_hex_l, -(sp)
* ---- subroutine code:
swap d1 *flip long or else it prints in reverse
bsr print_hex_w *print first half of long
swap d1 *flip first half of register to second half
bsr print_hex_w *print rest of long
* ---- exit
print_hex_l_x movem.l (sp)+, rl_print_hex_l
rtr
*-----------------------------------------------------------
*-----------------------------------------------------------
* //// print word (16 bits) as hex digits
* parameters:
* d1 - contains word to print as hex
* return:
* none
*
rl_print_hex_w reg a0-a6/d0-d7
print_hex_w move.w sr, -(sp)
movem.l rl_print_hex_w, -(sp)
* ---- subroutine code:
rol.w #$4, d1 * rotate first 4 bits to last 4 bits
bsr print_hex_n
rol.w #$4, d1
bsr print_hex_n
rol.w #$4, d1
bsr print_hex_n
rol.w #$4, d1
bsr print_hex_n
* ---- exit
print_hex_w_x movem.l (sp)+, rl_print_hex_w
rtr
*-----------------------------------------------------------
* //// print byte (8 bits) as hex digits
* parameters:
* d1 - contains byte to print as hex
* return:
* none
*
rl_print_hex_b reg a0-a6/d0-d7
print_hex_b move.w sr, -(sp)
movem.l rl_print_hex_b, -(sp)
* ---- subroutine code:
rol.w #$4, d1 * rotate first 4 bits to last 4 bits
bsr print_hex_n
rol.w #$4, d1
bsr print_hex_n
* ---- exit
print_hex_b_x movem.l (sp)+, rl_print_hex_b
rtr
*-----------------------------------------------------------
* //// print nibble (4 bits) as hex digit
* parameters:
* d1 - contains nibble to print as hex
* return:
* none
*
rl_print_hex_n reg a0-a6/d0-d7
print_hex_n move.w sr, -(sp)
movem.l rl_print_hex_n, -(sp)
* ---- subroutine code:
andi.b #%00001111, d1 * clear first 4 bits
addi.b #$30, d1 * ASCII offset to start at char 0
cmpi.b #$39, d1 * check if above ASCII $39
ble pr_hn_skip1 * hex $0-9 can be safely printed
addi.b #$7, d1 * hex $A-F needs another ASCII offset
pr_hn_skip1 move.b #6, d0 * display char at d1.b
trap #15
* ---- exit
print_hex_n_x movem.l (sp)+, rl_print_hex_n
rtr
*-----------------------------------------------------------
* //// set font color to white
* parameters:
* none
* return:
* none
*
rl_f_white reg a0-a6/d0-d7
font_white move.w sr, -(sp)
movem.l rl_f_white, -(sp)
* ---- subroutine code:
clr.b d2 * avoid font styling
move.b #21, d0 * change font color
move.l #$00FFFFFF, d1 * white
trap #15
* ---- exit
font_white_x movem.l (sp)+, rl_f_white
rtr
*-----------------------------------------------------------
* //// set font color to red
* parameters:
* none
* return:
* none
*
rl_f_red reg a0-a6/d0-d7
font_red move.w sr, -(sp)
movem.l rl_f_red, -(sp)
* ---- subroutine code:
clr.b d2 * avoid font styling
move.b #21, d0 * change font color
move.l #$000000FF, d1 * red
trap #15
* ---- exit
font_red_x movem.l (sp)+, rl_f_red
rtr
*-----------------------------------------------------------
* //// set font color to orange
* parameters:
* none
* return:
* none
*
rl_f_orange reg a0-a6/d0-d7
font_orange move.w sr, -(sp)
movem.l rl_f_orange, -(sp)
* ---- subroutine code:
clr.b d2 * avoid font styling
move.b #21, d0 * change font color
move.l #$0000A5FF, d1 * orange
trap #15
* ---- exit
font_orange_x movem.l (sp)+, rl_f_orange
rtr
*-----------------------------------------------------------
* //// set font color to blue
* parameters:
* none
* return:
* none
*
rl_f_blue reg a0-a6/d0-d7
font_blue move.w sr, -(sp)
movem.l rl_f_blue, -(sp)
* ---- subroutine code:
clr.b d2 * avoid font styling
move.b #21, d0 * change font color
move.l #$00D1CE00, d1 * actually dark turquoise
trap #15
* ---- exit
font_blue_x movem.l (sp)+, rl_f_blue
rtr
* ==== included files ====
include "user.X68"
include "detect.X68"
include "opcodes.X68"
include "addressing.X68"
* ==== constants and variables =====
screen_limit equ 31 * lines that can fit on the screen
CR equ $0d
LF equ $0a
HT equ $09
null equ $00
nullterm dc.w 0
space dc.w ' ',0
newline dc.w CR,LF,0
indent dc.w HT,HT,0
* 80 bytes of string buffer space
* prevents other memory from being overwritten
str_buf dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
code_end
* ==== tests ====
include "test.X68"
* don't move this any higher than end start
* or else the ORGs get screwed up
* ==== end ====
end start
*~Font name~Courier New~
*~Font size~10~
*~Tab type~1~
*~Tab size~4~