mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-27 18:18:05 +11:00
zasm: add support for relative labels
This commit is contained in:
parent
1e3982d3ab
commit
878bc2919f
@ -615,22 +615,57 @@ getUpcode:
|
|||||||
ld c, 1
|
ld c, 1
|
||||||
jr .computeBytesWritten
|
jr .computeBytesWritten
|
||||||
.withByte:
|
.withByte:
|
||||||
; verify that the MSB in argument is zero
|
|
||||||
inc hl
|
inc hl
|
||||||
|
; HL points to our number (LSB), with (HL+1) being our MSB which should
|
||||||
|
; normally by zero. However, if our instruction is jr or djnz, that
|
||||||
|
; number is actually a 2-bytes address that has to be relative to PC,
|
||||||
|
; so it's a special case. Let's check for this special case.
|
||||||
|
bit 7, (ix+3)
|
||||||
|
jr z, .absoluteValue ; bit not set? regular byte value,
|
||||||
|
; Our argument is a relative address ("e" type in djnz and jr). We have
|
||||||
|
; to subtract (curOutputOffset) from it.
|
||||||
|
|
||||||
|
; First, check whether we're on first pass. If we are, skip processing
|
||||||
|
; below because not having real symbol value makes relative address
|
||||||
|
; verification falsely fail.
|
||||||
|
ld c, 2 ; this is a two bytes instruction
|
||||||
|
call zasmIsFirstPass
|
||||||
|
jr z, .computeBytesWritten
|
||||||
|
|
||||||
|
; We're on second pass
|
||||||
|
push de ; Don't let go of this, that's our dest
|
||||||
|
ld de, (curOutputOffset)
|
||||||
|
call JUMP_INTOHL
|
||||||
|
dec hl ; what we write is "e-2"
|
||||||
|
dec hl
|
||||||
|
call subDEFromHL
|
||||||
|
pop de ; Still have it? good
|
||||||
|
; HL contains our number and we'll check its bounds. If It's negative,
|
||||||
|
; H is going to be 0xff and L has to be >= 0x80. If it's positive,
|
||||||
|
; H is going to be 0 and L has to be < 0x80.
|
||||||
|
ld a, l
|
||||||
|
cp 0x80
|
||||||
|
jr c, .skipHInc ; a < 0x80, H is expected to be 0
|
||||||
|
; A being >= 0x80 is only valid in cases where HL is negative and
|
||||||
|
; within bounds. This only happens is H == 0xff. Let's increase it to 0.
|
||||||
|
inc h
|
||||||
|
.skipHInc:
|
||||||
|
; Let's write our value now even though we haven't checked our bounds
|
||||||
|
; yet. This way, we don't have to store A somewhere else.
|
||||||
|
ld (de), a
|
||||||
|
ld a, h
|
||||||
|
or a ; cp 0
|
||||||
|
jr nz, .numberTruncated ; if A is anything but zero, we're out
|
||||||
|
; of bounds.
|
||||||
|
jr .computeBytesWritten
|
||||||
|
|
||||||
|
.absoluteValue:
|
||||||
|
; verify that the MSB in argument is zero
|
||||||
inc hl ; MSB is 2nd byte
|
inc hl ; MSB is 2nd byte
|
||||||
ld a, (hl)
|
ld a, (hl)
|
||||||
dec hl ; HL now points to LSB
|
dec hl ; HL now points to LSB
|
||||||
or a ; cp 0
|
or a ; cp 0
|
||||||
jr nz, .numberTruncated
|
jr nz, .numberTruncated
|
||||||
; HL points to our number
|
|
||||||
; one last thing to check. Is the 7th bit on the displacement value set?
|
|
||||||
; if yes, we have to decrease our value by 2. Uses for djnz and jr.
|
|
||||||
bit 7, (ix+3)
|
|
||||||
jr z, .skipDecrease
|
|
||||||
; Yup, it's set.
|
|
||||||
dec (hl)
|
|
||||||
dec (hl)
|
|
||||||
.skipDecrease:
|
|
||||||
ldi
|
ldi
|
||||||
ld c, 2
|
ld c, 2
|
||||||
jr .computeBytesWritten
|
jr .computeBytesWritten
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
; JUMP_UPCASE
|
; JUMP_UPCASE
|
||||||
; JUMP_UNSETZ
|
; JUMP_UNSETZ
|
||||||
; JUMP_INTODE
|
; JUMP_INTODE
|
||||||
|
; JUMP_INTOHL
|
||||||
; JUMP_FINDCHAR
|
; JUMP_FINDCHAR
|
||||||
; JUMP_BLKSEL
|
; JUMP_BLKSEL
|
||||||
; RAMSTART (where we put our variables in RAM)
|
; RAMSTART (where we put our variables in RAM)
|
||||||
|
11
apps/zasm/tests/test2.asm
Normal file
11
apps/zasm/tests/test2.asm
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
; Test relative jumps
|
||||||
|
label1:
|
||||||
|
jp label1
|
||||||
|
jp label2
|
||||||
|
jp label2
|
||||||
|
jr label2
|
||||||
|
jr nc, label1
|
||||||
|
|
||||||
|
label2:
|
||||||
|
jr label1
|
||||||
|
jr nc, label1
|
@ -22,6 +22,18 @@ cpHLDE:
|
|||||||
cp e
|
cp e
|
||||||
ret ; flags are correct
|
ret ; flags are correct
|
||||||
|
|
||||||
|
; HL - DE -> HL
|
||||||
|
subDEFromHL:
|
||||||
|
push af
|
||||||
|
ld a, l
|
||||||
|
sub e
|
||||||
|
ld l, a
|
||||||
|
ld a, h
|
||||||
|
sbc d
|
||||||
|
ld h, a
|
||||||
|
pop af
|
||||||
|
ret
|
||||||
|
|
||||||
; Returns length of string at (HL) in A.
|
; Returns length of string at (HL) in A.
|
||||||
strlen:
|
strlen:
|
||||||
push bc
|
push bc
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#define STDIN_BUFSIZE 0x8000
|
#define STDIN_BUFSIZE 0x8000
|
||||||
// When defined, we dump memory instead of dumping expected stdout
|
// When defined, we dump memory instead of dumping expected stdout
|
||||||
//#define MEMDUMP
|
//#define MEMDUMP
|
||||||
|
//#define DEBUG
|
||||||
|
|
||||||
static Z80Context cpu;
|
static Z80Context cpu;
|
||||||
static uint8_t mem[0x10000];
|
static uint8_t mem[0x10000];
|
||||||
@ -119,7 +120,9 @@ int main()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "Ended with A=%d DE=%d\n", cpu.R1.br.A, cpu.R1.wr.DE);
|
fprintf(stderr, "Ended with A=%d DE=%d\n", cpu.R1.br.A, cpu.R1.wr.DE);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@ jp addHL
|
|||||||
jp upcase
|
jp upcase
|
||||||
jp unsetZ
|
jp unsetZ
|
||||||
jp intoDE
|
jp intoDE
|
||||||
|
jp intoHL
|
||||||
jp findchar
|
jp findchar
|
||||||
jp parseHexPair
|
jp parseHexPair
|
||||||
jp blkSel
|
jp blkSel
|
||||||
|
@ -5,9 +5,10 @@ JUMP_ADDHL .equ 0x08
|
|||||||
JUMP_UPCASE .equ 0x0b
|
JUMP_UPCASE .equ 0x0b
|
||||||
JUMP_UNSETZ .equ 0x0e
|
JUMP_UNSETZ .equ 0x0e
|
||||||
JUMP_INTODE .equ 0x11
|
JUMP_INTODE .equ 0x11
|
||||||
JUMP_FINDCHAR .equ 0x14
|
JUMP_INTOHL .equ 0x14
|
||||||
JUMP_PARSEHEXPAIR .equ 0x17
|
JUMP_FINDCHAR .equ 0x17
|
||||||
JUMP_BLKSEL .equ 0x1a
|
JUMP_PARSEHEXPAIR .equ 0x1a
|
||||||
|
JUMP_BLKSEL .equ 0x1d
|
||||||
|
|
||||||
.equ USER_CODE 0x4800
|
.equ USER_CODE 0x4800
|
||||||
.equ RAMSTART 0x5800
|
.equ RAMSTART 0x5800
|
||||||
|
Loading…
Reference in New Issue
Block a user