1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-27 09:58:06 +11:00

zasm: make "RET cc" work

This commit is contained in:
Virgil Dupras 2019-04-17 11:06:51 -04:00
parent 279f6e0ad8
commit a7dc1e7b4a

View File

@ -1,12 +1,10 @@
#include "user.inc" #include "user.inc"
; *** Consts *** ; *** Consts ***
; Number of rows in the "single" argspec string
ARGSPEC_SINGLE_CNT .equ 7
; Number of rows in the argspec table ; Number of rows in the argspec table
ARGSPEC_TBL_CNT .equ 12 ARGSPEC_TBL_CNT .equ 27
; Number of rows in the primary instructions table ; Number of rows in the primary instructions table
INSTR_TBLP_CNT .equ 30 INSTR_TBLP_CNT .equ 33
; size in bytes of each row in the primary instructions table ; size in bytes of each row in the primary instructions table
INSTR_TBLP_ROWSIZE .equ 8 INSTR_TBLP_ROWSIZE .equ 8
@ -179,10 +177,6 @@ parseArg:
push de push de
push hl push hl
cp 1
jr z, .matchsingle ; Arg is one char? We have a "single" type.
; Not a "single" arg. Do the real thing then.
ld de, argspecTbl ld de, argspecTbl
; DE now points the the "argspec char" part of the entry, but what ; DE now points the the "argspec char" part of the entry, but what
; we're comparing in the loop is the string next to it. Let's offset ; we're comparing in the loop is the string next to it. Let's offset
@ -204,23 +198,6 @@ parseArg:
; found the matching argspec row. Our result is one byte left of DE. ; found the matching argspec row. Our result is one byte left of DE.
dec de dec de
ld a, (de) ld a, (de)
jr .end
.matchsingle:
ld a, (hl)
ld hl, argspecsSingle
ld bc, ARGSPEC_SINGLE_CNT
.loop2:
cpi
jr z, .end ; found! our result is already in A. go straight
; to end.
jp po, .loop2notfound
jr .loop2
.loop2notfound:
; something's wrong. error
ld a, 0xff
jr .end
.end: .end:
pop hl pop hl
pop de pop de
@ -360,6 +337,18 @@ matchPrimaryRow:
; of bytes written in A. ; of bytes written in A.
parseLine: parseLine:
call readLine call readLine
; Check whether we have errors. We don't do any parsing if we do.
ld a, (curArg1)
cp 0xff
jr z, .error
ret z
ld a, (curArg2)
cp 0xff
jr nz, .noerror
.error:
ld a, 0
ret
.noerror:
push de push de
ld de, instrTBlPrimary ld de, instrTBlPrimary
ld b, INSTR_TBLP_CNT ld b, INSTR_TBLP_CNT
@ -440,11 +429,15 @@ parseLine:
; 1-10 : group id (see Groups section) ; 1-10 : group id (see Groups section)
; 0xff: error ; 0xff: error
argspecsSingle:
.db "ABCDEHL"
; Format: 1 byte argspec + 4 chars string ; Format: 1 byte argspec + 4 chars string
argspecTbl: argspecTbl:
.db 'A', "A", 0, 0, 0
.db 'B', "B", 0, 0, 0
.db 'C', "C", 0, 0, 0
.db 'D', "D", 0, 0, 0
.db 'E', "E", 0, 0, 0
.db 'H', "H", 0, 0, 0
.db 'L', "L", 0, 0, 0
.db 'h', "HL", 0, 0 .db 'h', "HL", 0, 0
.db 'l', "(HL)" .db 'l', "(HL)"
.db 'd', "DE", 0, 0 .db 'd', "DE", 0, 0
@ -517,11 +510,13 @@ instrTBlPrimary:
.db "LD",0,0, 'A', 'e', 0, 0x0a ; LD A, (DE) .db "LD",0,0, 'A', 'e', 0, 0x0a ; LD A, (DE)
.db "LD",0,0, 's', 'h', 0, 0x0a ; LD SP, HL .db "LD",0,0, 's', 'h', 0, 0x0a ; LD SP, HL
.db "LD",0,0, 'l', 0xb, 0, 0b01110000 ; LD (HL), r .db "LD",0,0, 'l', 0xb, 0, 0b01110000 ; LD (HL), r
.db "LD",0,0, 0xb, 'l', 3, 0b01000110 ; LD r, (HL)
.db "NOP", 0, 0, 0, 0, 0x00 ; NOP .db "NOP", 0, 0, 0, 0, 0x00 ; NOP
.db "OR",0,0, 'l', 0, 0, 0xb6 ; OR (HL) .db "OR",0,0, 'l', 0, 0, 0xb6 ; OR (HL)
.db "OR",0,0, 0xb, 0, 0, 0b10110000 ; OR r
.db "POP", 0, 0x1, 0, 4, 0b11000001 ; POP qq .db "POP", 0, 0x1, 0, 4, 0b11000001 ; POP qq
.db "RET", 0, 0xa, 0, 3, 0b11000000 ; RET cc
.db "RET", 0, 0, 0, 0, 0xc9 ; RET .db "RET", 0, 0, 0, 0, 0xc9 ; RET
.db "RET", 0, 0xb, 0, 3, 0b11000000 ; RET cc
.db "RLA", 0, 0, 0, 0, 0x17 ; RLA .db "RLA", 0, 0, 0, 0, 0x17 ; RLA
.db "RLCA", 0, 0, 0, 0x07 ; RLCA .db "RLCA", 0, 0, 0, 0x07 ; RLCA
.db "RRA", 0, 0, 0, 0, 0x1f ; RRA .db "RRA", 0, 0, 0, 0, 0x1f ; RRA