1
0
mirror of https://github.com/hsoft/collapseos.git synced 2024-11-23 19:48:06 +11:00

zasm: support "special" groups and groups in arg2

This commit is contained in:
Virgil Dupras 2019-04-17 10:34:10 -04:00
parent a7538473e4
commit 9b556c8883

View File

@ -28,9 +28,9 @@ unsetZ:
; run RLA the number of times specified in B ; run RLA the number of times specified in B
rlaX: rlaX:
; first, see if B == 0 to see if we need to bail out ; first, see if B == 0 to see if we need to bail out
dec b
ret c ; C flag means we went negative. nothing to do
inc b inc b
dec b
ret z ; Z flag means we had B = 0
.loop: rla .loop: rla
djnz .loop djnz .loop
ret ret
@ -242,13 +242,22 @@ isGroupId:
; Find argspec A in group id H. ; Find argspec A in group id H.
; Set Z according to whether we found the argspec ; Set Z according to whether we found the argspec
; If found, the value in A is the argspec value in the group (it's index). ; If found, the value in A is the argspec value in the group (its index).
findInGroup: findInGroup:
push bc push bc
push hl push hl
cp 0 ; is our arg empty? If yes, we have nothing to do cp 0 ; is our arg empty? If yes, we have nothing to do
jr z, .notfound jr z, .notfound
push af
ld a, h
cp 0xa
jr z, .specialGroupCC
cp 0xb
jr z, .specialGroupABCDEHL
pop af
; regular group
push de push de
ld de, argGrpTbl ld de, argGrpTbl
; group ids start at 1. decrease it, then multiply by two to have a ; group ids start at 1. decrease it, then multiply by two to have a
@ -259,10 +268,25 @@ findInGroup:
add a, a add a, a
call JUMP_ADDDE ; At this point, DE points to our group call JUMP_ADDDE ; At this point, DE points to our group
pop af pop af
ex hl, de ex hl, de ; And now, HL points to the group
pop de pop de
ld bc, 4 ld bc, 4
jr .find
.specialGroupCC:
ld hl, argGrpCC
jr .specialGroupEnd
.specialGroupABCDEHL:
ld hl, argGrpABCDEHL
.specialGroupEnd:
pop af ; from the push af just before the special group check
ld bc, 8
.find:
; This part is common to regular and special group. We expect HL to
; point to the group and BC to contain its length.
push bc ; save the start value loop index so we can sub
.loop: .loop:
cpi cpi
jr z, .found jr z, .found
@ -270,13 +294,17 @@ findInGroup:
jr .loop jr .loop
.found: .found:
; we found our result! Now, what we want to put in A is the index of ; we found our result! Now, what we want to put in A is the index of
; the found argspec. We have this in C (4 - C + 1). The +1 is because ; the found argspec.
; cpi always decreases BC, whether we match or not. pop hl ; we pop from the "push bc" above. L is now 4 or 8
ld a, 3 ; 4 - 1 ld a, l
sub c sub c
dec a ; cpi DECs BC even when there's a match, so C == the
; number of iterations we've made. But our index is
; zero-based (1 iteration == 0 index).
cp a ; ensure Z is set cp a ; ensure Z is set
jr .end jr .end
.notfound: .notfound:
pop bc ; from the push bc in .find
call unsetZ call unsetZ
.end: .end:
pop hl pop hl
@ -356,11 +384,22 @@ parseLine:
; First, let's see if we're dealing with a group here ; First, let's see if we're dealing with a group here
ld a, (ix+4) ; first argspec ld a, (ix+4) ; first argspec
call isGroupId call isGroupId
jr z, .firstArgIsGroup
; First arg not a group. Maybe second is?
ld a, (ix+5) ; 2nd argspec
call isGroupId
jr nz, .notgroup jr nz, .notgroup
; A is a group, good, now let's get its value ; Second arg is group
ld de, curArg2
jr .isGroup
.firstArgIsGroup:
ld de, curArg1
.isGroup:
; A is a group, good, now let's get its value. DE is pointing to
; the argument.
push hl push hl
ld h, a ld h, a
ld a, (curArg1) ld a, (de)
call findInGroup ; we don't check for match, it's supposed to call findInGroup ; we don't check for match, it's supposed to
; always match. Something is very wrong if it ; always match. Something is very wrong if it
; doesn't ; doesn't
@ -477,6 +516,7 @@ instrTBlPrimary:
.db "LD",0,0, 'A', 'c', 0, 0x0a ; LD A, (BC) .db "LD",0,0, 'A', 'c', 0, 0x0a ; LD A, (BC)
.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 "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 "POP", 0, 0x1, 0, 4, 0b11000001 ; POP qq .db "POP", 0, 0x1, 0, 4, 0b11000001 ; POP qq