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:
parent
279f6e0ad8
commit
a7dc1e7b4a
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user