Immediate mode versions of ldx, ldy, cmp, cpx, cpy.
Cat's Eye Technologies
8 years ago
0 | 0 |
assign byte screen 1024
|
1 | |
reserve byte zero
|
2 | 1 |
routine main {
|
3 | |
ldy zero
|
|
2 |
ldy #0
|
4 | 3 |
repeat bne {
|
5 | 4 |
inc screen
|
6 | 5 |
dey
|
7 | |
cpy zero
|
|
6 |
cpy #0
|
8 | 7 |
}
|
9 | 8 |
sty screen
|
10 | 9 |
}
|
55 | 55 |
emitInstr p r (CMP X (NamedLocation label)) = "cpx " ++ label
|
56 | 56 |
emitInstr p r (CMP Y (NamedLocation label)) = "cpy " ++ label
|
57 | 57 |
|
|
58 |
emitInstr p r (CMPIMM A val) = "cmp #" ++ (show val)
|
|
59 |
emitInstr p r (CMPIMM X val) = "cpx #" ++ (show val)
|
|
60 |
emitInstr p r (CMPIMM Y val) = "cpy #" ++ (show val)
|
|
61 |
|
58 | 62 |
emitInstr p r (DELTA X 1) = "inx"
|
59 | 63 |
emitInstr p r (DELTA X (-1)) = "dex"
|
60 | 64 |
emitInstr p r (DELTA Y 1) = "iny"
|
50 | 50 |
|
51 | 51 |
data Instruction = LOADIMM StorageLocation DataValue
|
52 | 52 |
| COPY StorageLocation StorageLocation
|
|
53 |
| CMPIMM StorageLocation DataValue
|
53 | 54 |
| CMP StorageLocation StorageLocation
|
54 | 55 |
| JSR RoutineName
|
55 | 56 |
| IF Branch [Instruction] [Instruction]
|
167 | 167 |
cmp = do
|
168 | 168 |
string "cmp"
|
169 | 169 |
spaces
|
170 | |
l <- locationName
|
171 | |
return (CMP A (NamedLocation l))
|
|
170 |
(try $ immediate (\v -> CMPIMM A v) <|>
|
|
171 |
absolute (\l -> CMP A (NamedLocation l)))
|
172 | 172 |
|
173 | 173 |
cpx :: Parser Instruction
|
174 | 174 |
cpx = do
|
175 | 175 |
string "cpx"
|
176 | 176 |
spaces
|
177 | |
l <- locationName
|
178 | |
return (CMP X (NamedLocation l))
|
|
177 |
(try $ immediate (\v -> CMPIMM X v) <|>
|
|
178 |
absolute (\l -> CMP X (NamedLocation l)))
|
179 | 179 |
|
180 | 180 |
cpy :: Parser Instruction
|
181 | 181 |
cpy = do
|
182 | 182 |
string "cpy"
|
183 | 183 |
spaces
|
184 | |
l <- locationName
|
185 | |
return (CMP Y (NamedLocation l))
|
|
184 |
(try $ immediate (\v -> CMPIMM Y v) <|>
|
|
185 |
absolute (\l -> CMP Y (NamedLocation l)))
|
186 | 186 |
|
187 | 187 |
immediate :: (DataValue -> Instruction) -> Parser Instruction
|
188 | 188 |
immediate f = do
|
|
206 | 206 |
ldx = do
|
207 | 207 |
string "ldx"
|
208 | 208 |
spaces
|
209 | |
l <- locationName
|
210 | |
return (COPY (NamedLocation l) X)
|
|
209 |
(try $ immediate (\v -> LOADIMM X v) <|>
|
|
210 |
absolute (\l -> COPY (NamedLocation l) X))
|
211 | 211 |
|
212 | 212 |
ldy :: Parser Instruction
|
213 | 213 |
ldy = do
|
214 | 214 |
string "ldy"
|
215 | 215 |
spaces
|
216 | |
l <- locationName
|
217 | |
return (COPY (NamedLocation l) Y)
|
|
216 |
(try $ immediate (\v -> LOADIMM Y v) <|>
|
|
217 |
absolute (\l -> COPY (NamedLocation l) Y))
|
218 | 218 |
|
219 | 219 |
sta :: Parser Instruction
|
220 | 220 |
sta = do
|