zasm: still inching toward directives
This commit is contained in:
parent
1ffe05dd09
commit
a7693ffd86
27
apps/zasm/directive.asm
Normal file
27
apps/zasm/directive.asm
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
; *** CONSTS ***
|
||||||
|
|
||||||
|
D_DB .equ 0x00
|
||||||
|
D_BAD .equ 0xff
|
||||||
|
|
||||||
|
; *** CODE ***
|
||||||
|
|
||||||
|
; 4 bytes per row, fill with zero
|
||||||
|
directiveNames:
|
||||||
|
.db ".DB", 0
|
||||||
|
|
||||||
|
; Reads string in (HL) and returns the corresponding ID (D_*) in A. Sets Z if
|
||||||
|
; there's a match.
|
||||||
|
getDirectiveID:
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
ld b, 1
|
||||||
|
ld c, 4
|
||||||
|
ld de, directiveNames
|
||||||
|
call findStringInList
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
ret
|
||||||
|
|
||||||
|
parseDirective:
|
||||||
|
xor a
|
||||||
|
ret
|
@ -769,15 +769,12 @@ processArg:
|
|||||||
call JUMP_UNSETZ
|
call JUMP_UNSETZ
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Parse tokens in (tokInstr), (tokArg1) and (tokArg2) and write resulting
|
; Parse instruction specified in A (I_* const) with args in (tokArg1) and
|
||||||
; opcode(s) in (curUpcode). Returns the number of bytes written in A.
|
; (tokArg2) and write resulting opcode(s) in (curUpcode). Returns the number of
|
||||||
parseTokens:
|
; bytes written in A.
|
||||||
|
parseInstruction:
|
||||||
push hl
|
push hl
|
||||||
push de
|
push de
|
||||||
ld a, (tokInstr) ; TOK_*
|
|
||||||
cp TOK_INSTR
|
|
||||||
jr nz, .error ; Not an instruction, error
|
|
||||||
ld a, (tokInstr+1) ; I_*
|
|
||||||
ld hl, tokArg1
|
ld hl, tokArg1
|
||||||
ld de, curArg1
|
ld de, curArg1
|
||||||
call processArg
|
call processArg
|
||||||
|
@ -19,6 +19,11 @@ main:
|
|||||||
.stop:
|
.stop:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
#include "util.asm"
|
||||||
|
#include "tok.asm"
|
||||||
|
#include "instr.asm"
|
||||||
|
#include "directive.asm"
|
||||||
|
|
||||||
; Parse line in (HL), write the resulting opcode(s) in (DE) and returns the
|
; Parse line in (HL), write the resulting opcode(s) in (DE) and returns the
|
||||||
; number of written bytes in A. Advances HL where tokenization stopped and DE
|
; number of written bytes in A. Advances HL where tokenization stopped and DE
|
||||||
; to where we should write the next upcode.
|
; to where we should write the next upcode.
|
||||||
@ -26,15 +31,24 @@ parseLine:
|
|||||||
push bc
|
push bc
|
||||||
|
|
||||||
call gotoNextNotBlankLine
|
call gotoNextNotBlankLine
|
||||||
|
jr nz, .error
|
||||||
push de
|
push de
|
||||||
ld de, tokInstr
|
ld de, tokInstr
|
||||||
call tokenize
|
call tokenize
|
||||||
|
ld a, (tokInstr) ; TOK_*
|
||||||
|
cp TOK_BAD
|
||||||
|
jr z, .error
|
||||||
ld de, tokArg1
|
ld de, tokArg1
|
||||||
call tokenizeInstrArg
|
call tokenizeInstrArg
|
||||||
ld de, tokArg2
|
ld de, tokArg2
|
||||||
call tokenizeInstrArg
|
call tokenizeInstrArg
|
||||||
pop de
|
pop de
|
||||||
call parseTokens
|
cp TOK_INSTR
|
||||||
|
jr z, .instr
|
||||||
|
jr .error ; directive not supported yet
|
||||||
|
.instr:
|
||||||
|
ld a, (tokInstr+1) ; I_*
|
||||||
|
call parseInstruction
|
||||||
or a ; is zero?
|
or a ; is zero?
|
||||||
jr z, .error
|
jr z, .error
|
||||||
ld b, 0
|
ld b, 0
|
||||||
@ -51,11 +65,6 @@ parseLine:
|
|||||||
pop bc
|
pop bc
|
||||||
ret
|
ret
|
||||||
|
|
||||||
#include "util.asm"
|
|
||||||
#include "tok.asm"
|
|
||||||
#include "instr.asm"
|
|
||||||
#include "directive.asm"
|
|
||||||
|
|
||||||
; *** Variables ***
|
; *** Variables ***
|
||||||
|
|
||||||
tokInstr:
|
tokInstr:
|
||||||
|
@ -48,11 +48,13 @@ tokenize:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
tokenizeInstrArg:
|
tokenizeInstrArg:
|
||||||
|
push af
|
||||||
xor a
|
xor a
|
||||||
ld (de), a
|
ld (de), a
|
||||||
call toWord
|
call toWord
|
||||||
ld a, 8
|
ld a, 8
|
||||||
call readWord
|
call readWord
|
||||||
|
pop af
|
||||||
ret
|
ret
|
||||||
|
|
||||||
; Sets Z is A is ';', CR, LF, or null.
|
; Sets Z is A is ';', CR, LF, or null.
|
||||||
|
Loading…
Reference in New Issue
Block a user