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:
parent
a7538473e4
commit
9b556c8883
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user