1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2024-06-06 15:29:30 +00:00

Parse more instructions.

This commit is contained in:
Cat's Eye Technologies 2014-04-01 14:33:57 +01:00
parent b15411c677
commit 4cef193da9
2 changed files with 71 additions and 3 deletions

View File

@ -70,11 +70,13 @@ An address knows if it is an address of a byte, of a word, or of a table.
### Blocks ###
Each routine is a block. It may be composed of inner blocks.
Each routine is a block. It may be composed of inner blocks, attached to
some instructions.
SixtyPical does not have instructions that map literally to the 6502 branch
instructions. Instead, each branch instruction has a corresponding
"if-then-else"-like construct with the same name as the branch.
"if-then-else"-like construct with the same name as the branch instruction.
These _test_ instructions each have two blocks, for the then and the else.
The abstract states of the machine at each of the different block exits are
merged during analysis. If any register or memory location is treated
@ -82,6 +84,23 @@ inconsistently (e.g. updated in one branch of the test, but not the other,)
that register cannot subsequently be used without a declaration to the effect
that we know what's going on. (This is all a bit fuzzy right now.)
There is also no `rts` instruction. It is included at the end of a routine,
but only when the routine is used as a subroutine.
There are also _with_ instructions, which are associated with an opcode
that has a natural symmetrical opcode (e.g. `pha`, `sei`). These instructions
take a block. The natural symmetrical opcode is inserted at the end of the
block.
TODO
----
* Parse HEX values like $40A3
* Full machine model
* Check before analyzing
* Check, analyze, generate
* Addressing modes; rename instructions to match
Tests
-----
@ -113,7 +132,13 @@ A program may reserve and assign.
| assign word screen 4000
| routine main {
| lda screen
| tax
| tay
| cmp score
| ldx score
| txa
| ldy score
| tya
| }
= True

View File

@ -15,8 +15,11 @@ Routine := "routine" RoutineName Block.
Block := "{" {Command} "}".
Command := "beq" Block "else" Block
| "lda" (LocationName | Immediate)
| "ldx" (LocationName | Immediate)
| "ldy" (LocationName | Immediate)
| "txa" | "tax" | "tya" | "tay"
| "cmp" (LocationName | Immediate)
| "nop".
-}
@ -70,7 +73,9 @@ block = do
return cs
command :: Parser Instruction
command = cmp <|> lda <|> beq <|> nop
command = cmp <|> (try lda) <|> (try ldx) <|> (try ldy) <|>
(try txa) <|> (try tax) <|> (try tya) <|> (try tay) <|>
beq <|> nop
nop :: Parser Instruction
nop = do
@ -92,6 +97,44 @@ lda = do
l <- locationName
return (LOAD A l)
ldx :: Parser Instruction
ldx = do
string "ldx"
spaces
l <- locationName
return (LOAD X l)
ldy :: Parser Instruction
ldy = do
string "ldy"
spaces
l <- locationName
return (LOAD Y l)
txa :: Parser Instruction
txa = do
string "txa"
spaces
return (COPY X A)
tax :: Parser Instruction
tax = do
string "tax"
spaces
return (COPY A X)
tya :: Parser Instruction
tya = do
string "tya"
spaces
return (COPY Y A)
tay :: Parser Instruction
tay = do
string "tay"
spaces
return (COPY A Y)
beq :: Parser Instruction
beq = do
string "beq"