-
Notifications
You must be signed in to change notification settings - Fork 85
/
Copy pathasmii4
197 lines (197 loc) · 3.75 KB
/
asmii4
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
.PAGE 'ASMII4 11/02/80'
; SIMPLE ASSEMBLER
; SYNTAX A 1111 LDA ($00,X)
; SYNTAX A 1111 DEX:
; :=TERMINATOR
;
ASSM JSR SKADR ;SKIP SP'S READ SA TO TMP2
STA TMP2
STX TMP2+1
AS010 LDX #0
STX MTCH+1 ;CLEAR LEFT MNEMONIC
AS020 JSR RDOC ;GET A CHAR
CMP #$20 ;IS IT A SPACE ?
BEQ AS010 ;YES - START AGAIN
STA MSAL,X ;NO - SAVE CHAR
INX
CPX #3 ;GOT THREE CHARS ?
BNE AS020 ;NO - LOOP
AS030 DEX ;SQUISHED ALL THREE ?
BMI AS045 ;YES
LDA MSAL,X ;NO - FIRST IN LAST OUT
SEC ;NO BORROW
SBC #$3F ;NORMALIZE
LDY #5 ;SET FOR 5 SHIFT RIGHTS
AS040 LSR A
ROR MTCH+1 ;LEFT MNEMONIC
ROR MTCH ;RIGHT MNEMONIC
DEY ;DONE 5 SHIFTS?
BNE AS040 ;NO-LOOP
BEQ AS030 ;ALWAYS
AS045 LDX #2 ;MOVE INDEX PAST MNEMONIC
AS050 JSR RDT ;GET A CHAR
CMP #$0D ;A CR?
BEQ AS100 ;YES-DONE
CMP #$3A ;A ":" ?
BEQ AS100 ;YES-DONE
CMP #$20 ;A SPACE
BEQ AS050 ;YES-SKIP IT
JSR CHRTST ;A HEX #?
BCS AS070 ;NO-BUFFER IF
JSR RDOB2 ;FIN A READ BYTE
LDY TMP0 ;SHIFT TMP0 TO TMP0+1
STY TMP0+1
STA TMP0 ;SAVE BYTE
LDA #'0 ;BUFFER ASCII 0
STA MTCH,X
INX
AS070 STA MTCH,X
INX
BNE AS050 ;BRANCH ALWAYS
AS100 STX TMP10 ;SAVE INPUT # OF CHARS
LDX #0
STX WRAP ;START TRIAL AT ZERO
AS110 LDX #0
STX TMPC ;DISA INDEX=0
LDA WRAP ;GET TRIAL BYTE
JSR DSET ;DIGEST IT
LDX FORMAT ;SAVE FORMAT FOR LATER
STX TMP10+1
TAX ;INDEX INTO MNEMONIC TABLE
LDA MNEMR,X ;GET COMPRESSED
JSR TSTX ; MNEMONIC AND TEST
LDA MNEML,X
JSR TSTX
LDX #6 ;SIX FORMAT BITS
AS210 CPX #3
BNE AS230
LDY LENGTH
BEQ AS230 ;SKIP-SINGLE BYTE INSTR
AS220 LDA FORMAT
CMP #$E8 ;A RELATIVE INSTR?
LDA #'0 ;TEST ZEROS
BCS AS250 ;NO-3 BYTE
JSR TST2 ;TEST A BYTE,2 CHARS
DEY
BNE AS220
AS230 ASL FORMAT
BCC AS240
LDA CHAR1-1,X
JSR TSTX ;TEST SYNTAX
LDA CHAR2-1,X
BEQ AS240
JSR TSTX ;TEST MORE SYNTAX
AS240 DEX
BNE AS210
BEQ AS300
AS250 JSR TST2 ;TEST A WORD,4 CHARS
JSR TST2
AS300 LDA TMP10 ;CHECK # CHARS OF BOTH
CMP TMPC
BEQ AS310 ;MATCH, SKIP
JMP TST05 ;FAIL
AS310 JSR T2T2 ;TMP0=SA,TMP2=DATA
LDY LENGTH
BEQ AS500 ;IF ONLY 1 BYTE INSTR SKIP
LDA TMP10+1 ;GET SAVED FORMAT
CMP #$9D ;A RELATIVE INSTR?
BNE AS400 ;NO-SKIP
JSR DCMP ;CALCULATE A RELATIVE
BCC AS320
TYA ;OUT OF RANGE,Y=0
BNE AERR
LDX DIFF
BMI AERR
BPL AS340
AS320 INY ;OUT OF RANGE,Y=$FF
BNE AERR
LDX DIFF
BPL AERR
AS340 DEX ;SUBTRACT 2 FOR INSTR
DEX
TXA
LDY LENGTH ;SET INDEX TO LENGTH
BNE AS420 ;BRANCH ALWAYS
AS400 LDA TMP2-1,Y ;NO-PUT BYTE OUT THERE
AS420 JSR PUTBYY ;RELOCATE TMP0 AND STORE DATA IN .A
DEY
BNE AS400
AS500 LDA WRAP ;GET GOOD OP CODE
JSR PUTBYY ;PUT OUT THERE
LDY #'A' ;PRT '.A '
AS600 STY KEYD ;PUT NEXT NUMBER IN KEYBUFFER
JSR CURUP ;CURSOR UP
JSR DISSPC ;DISASSEMBLE ONE LINE
JSR TMPADJ ;ADJUST TMP0 FOR NEXT INSTR
AS700 LDA #$20 ;SPACES
AS701
STA KEYD+1
LDA TMP0+1 ;PUT NEW HI ADR IN
JSR BUFASC ;CONVERT TO HEX
STX KEYD+2
STA KEYD+3
LDA TMP0 ;PUT NEW LO ADR IN
JSR BUFASC
STX KEYD+4
STA KEYD+5
LDA #$20
STA KEYD+6
LDA #7 ;SET CHAR COUNT IN TYPE AHEAD BUFFER
STA NDX
JMP STRT
.SKIP 3
;TEST CHAR IN A WITH CHAR IN MTCH
;
TST2 JSR TSTX ;DO TWO TESTS
TSTX STX SAVX
LDX TMPC ;GET CURRENT POSITION
CMP MTCH,X ;SAME CHAR
BEQ TST10 ;YES-SKIP
PLA ;PULL JSR OFF STACK
PLA
TST05 INC WRAP ;TRY NEXT TRIAL
BEQ AERR ;=0 TRIED ALL,SORRY
JMP AS110
AERR JMP ERROPR
TST10 INX
STX TMPC
LDX SAVX ;RESTORE X
RTS
.SKIP 3
; CHARACTER TEST
; TEST FOR CHAR BETWEEN 0-F
; IF 0<=CHAR<=F THEN CARRY=0
;
CHRTST CMP #'0
BCC CHR10
CMP #'G
RTS
CHR10 SEC
CHRTS RTS
.SKIP 3
; SKIP PRINT IF CHAR SAME AS PTCH
;
CHKPCH CMP PTCH ;SKIP THIS CHAR ?
BNE CCWRT ;ALWAYS
RTS
.SKIP 3
; PRINT CURSOR UP
;
CURUP LDA #$91 ;CURUP
CCWRT JMP WRT
.SKIP 3
; CONVERT BYTE TO HEX ASCII
; X=HI NYBBLE A=LO NYBBLE
;
BUFASC PHA ;SAVE BYTE
LSR A ;DO HI NYBBLE
LSR A
LSR A
LSR A
JSR ASCII ;MAKE HEX ASCII
TAX ;SAVE IN X
PLA ;RESTORE BYTE
AND #$0F ;DO LO NYBBLE
JMP ASCII
.SKIP 5
.END