mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-24 03:28:07 +11:00
zasm: getUpcode -> spitUpcode
Giving I/O responsibility to spitUpcode gives us wiggle room for upcoming refactorings.
This commit is contained in:
parent
c4658591bd
commit
553b346b92
@ -337,7 +337,7 @@ findInGroup:
|
||||
; If it's not this, then we check if it's a numerical arg.
|
||||
; If A is a group ID, we do something else: we check that (HL) exists in the
|
||||
; groupspec (argGrpTbl). Moreover, we go and write the group's "value" (index)
|
||||
; in (HL+1). This will save us significant processing later in getUpcode.
|
||||
; in (HL+1). This will save us significant processing later in spitUpcode.
|
||||
; Set Z according to whether we match or not.
|
||||
matchArg:
|
||||
cp (hl)
|
||||
@ -407,8 +407,8 @@ matchPrimaryRow:
|
||||
; *** Special opcodes ***
|
||||
; The special upcode handling routines below all have the same signature.
|
||||
; Instruction row is at IX and we're expected to perform the same task as
|
||||
; getUpcode. The number of bytes, however, must go in C instead of A
|
||||
; No need to preserve HL, DE, BC and IX: it's handled by getUpcode already.
|
||||
; spitUpcode. The number of bytes, however, must go in C instead of A
|
||||
; No need to preserve HL, DE, BC and IX: it's handled by spitUpcode already.
|
||||
|
||||
; Handle like a regular "JP (IX+d)" except that we refuse any displacement: if
|
||||
; a displacement is specified, we error out.
|
||||
@ -625,11 +625,9 @@ handleLDrr:
|
||||
ret
|
||||
|
||||
; Compute the upcode for argspec row at (DE) and arguments in curArg{1,2} and
|
||||
; writes the resulting upcode in INS_UPCODE. A is the number if bytes written
|
||||
; to INS_UPCODE.
|
||||
; A is zero on error. The only thing that can go wrong in this routine is
|
||||
; overflow.
|
||||
getUpcode:
|
||||
; writes the resulting upcode to IO.
|
||||
; A is zero, with Z set, on success. A is non-zero, with Z unset, on error.
|
||||
spitUpcode:
|
||||
push ix
|
||||
push de
|
||||
push hl
|
||||
@ -645,7 +643,7 @@ getUpcode:
|
||||
ld h, (ix+5)
|
||||
call callHL
|
||||
; We have our result written in INS_UPCODE and C is set.
|
||||
jp .end
|
||||
jp .writeIO
|
||||
|
||||
.normalInstr:
|
||||
; we begin by writing our "base upcode", which can be one or two bytes
|
||||
@ -734,7 +732,7 @@ getUpcode:
|
||||
call checknmxy
|
||||
jr z, .withByte
|
||||
; nope, no number, alright, we're finished here
|
||||
jr .end
|
||||
jr .writeIO
|
||||
.withByte:
|
||||
inc hl
|
||||
; HL points to our number (LSB), with (HL+1) being our MSB which should
|
||||
@ -751,7 +749,7 @@ getUpcode:
|
||||
; verification falsely fail.
|
||||
inc c ; one extra byte is written
|
||||
call zasmIsFirstPass
|
||||
jr z, .end
|
||||
jr z, .writeIO
|
||||
|
||||
; We're on second pass
|
||||
push de ; Don't let go of this, that's our dest
|
||||
@ -781,7 +779,7 @@ getUpcode:
|
||||
or a ; cp 0
|
||||
jr nz, .numberTruncated ; if A is anything but zero, we're out
|
||||
; of bounds.
|
||||
jr .end
|
||||
jr .writeIO
|
||||
|
||||
.absoluteValue:
|
||||
; verify that the MSB in argument is zero
|
||||
@ -794,7 +792,7 @@ getUpcode:
|
||||
ldi
|
||||
pop bc
|
||||
inc c
|
||||
jr .end
|
||||
jr .writeIO
|
||||
|
||||
.withWord:
|
||||
inc hl ; HL now points to LSB
|
||||
@ -805,12 +803,28 @@ getUpcode:
|
||||
pop bc
|
||||
inc c ; two extra bytes are written
|
||||
inc c
|
||||
; to writeIO
|
||||
.writeIO:
|
||||
; Let's write INS_UPCODE to IO
|
||||
ld b, c ; save output byte count
|
||||
ld hl, INS_UPCODE
|
||||
.loopWrite:
|
||||
ld a, (hl)
|
||||
call ioPutB
|
||||
jr nz, .ioError
|
||||
inc hl
|
||||
djnz .loopWrite
|
||||
; Z is set by INC HL
|
||||
jr .end
|
||||
.numberTruncated:
|
||||
; problem: not zero, so value is truncated. error
|
||||
ld c, 0
|
||||
; Z already unset
|
||||
ld a, ERR_OVFL
|
||||
jr .end
|
||||
.ioError:
|
||||
; Z already unset
|
||||
ld a, SHELL_ERR_IO_ERROR
|
||||
; continue to .end
|
||||
.end:
|
||||
ld a, c
|
||||
pop bc
|
||||
pop hl
|
||||
pop de
|
||||
@ -881,26 +895,10 @@ parseInstruction:
|
||||
.match:
|
||||
; We have our matching instruction row. We're getting pretty near our
|
||||
; goal here!
|
||||
call getUpcode
|
||||
or a ; is zero?
|
||||
jr z, .overflow
|
||||
ld b, a ; save output byte count
|
||||
ld hl, INS_UPCODE
|
||||
.loopWrite:
|
||||
ld a, (hl)
|
||||
call ioPutB
|
||||
jr nz, .ioError
|
||||
inc hl
|
||||
djnz .loopWrite
|
||||
cp a ; ensure Z
|
||||
jr .end
|
||||
.ioError:
|
||||
ld a, SHELL_ERR_IO_ERROR
|
||||
jr .error
|
||||
.overflow:
|
||||
ld a, ERR_OVFL
|
||||
jr .error
|
||||
call spitUpcode
|
||||
jr .end ; Z and A set properly, even on error
|
||||
.badfmt:
|
||||
; Z already unset
|
||||
ld a, ERR_BAD_FMT
|
||||
.error:
|
||||
; A is set to error already
|
||||
|
Loading…
Reference in New Issue
Block a user