diff --git a/src/link/link.vars.s b/src/link/link.vars.s index 9d94712..6dabdbc 100644 --- a/src/link/link.vars.s +++ b/src/link/link.vars.s @@ -252,6 +252,9 @@ linksymnum ds 2 linknextlbl ds 4 +linkpos ds 4 ; pos / len +linklen ds 2 + opmask ds 2 ;EVAL variables number ds 2 bracevalid ds 2 diff --git a/src/link/linker.1.s b/src/link/linker.1.s index 242d7bc..95e561e 100644 --- a/src/link/linker.1.s +++ b/src/link/linker.1.s @@ -1092,8 +1092,93 @@ zipop lda passnum clc rts ;return error from newsegment -posop ;I don't know what these do -lenop clc ;or how Merlin uses them so....????? + +* read label from operand into labstr. +getlabel + stz labstr + sep $20 + ldy #0 + ldx #0 +]flush lda (lineptr),y + and #$7f + cmp #' ' + blt :done + bne :first + iny + bra ]flush +:first cmp #';' + beq :done + cmp #'*' + beq :done + cmp #':'+1 + blt :bad + cmp #']' + beq :bad + sta labstr+1 + inx +]lup iny + lda (lineptr),y + and #$7f + cmp #' '+1 + blt :done + cpx #lab_size + bcs ]lup + sta labstr+1,x + inx + bra ]lup +:done txa + sta labstr + rep $30 + clc + rts +:bad rep $30 + sec + lda #badlable.$80 + rts + +* len label +* set label = length of last lnk +lenop bit passnum + bpl :equ +:rts clc + rts +:equ jsr getlabel + bcc :ok + rts +:ok lda labstr + and #$ff + beq :rts + + lda linklen + sta labval + stz labval+2 + lda #linkentrybit.linkabsbit + jmp insertlable + +* pos label +* set label = current linker offset. +* resets offset to 0 if no label. +posop bit passnum + bpl :equ + clc + rts +:equ jsr getlabel + bcc :ok + rts +:ok lda labstr + and #$ff + beq :zero + + lda linkpos + sta labval + lda linkpos+2 + sta labval+2 + lda #linkentrybit.linkabsbit + jmp insertlable + +:zero stz linkpos + stz linkpos+2 + clc rts extop bit passnum @@ -1484,6 +1569,15 @@ impop sec lda #$00 adc reloffset+2 sta reloffset+2 + lda :aux + sta linklen + clc + adc linkpos + sta linkpos + lda #$00 + adc linkpos+2 + sta linkpos+2 + :l psl :handle _HUnlock lda #$00 @@ -1676,6 +1770,15 @@ lnkop sec lda #$00 adc reloffset+2 sta reloffset+2 + lda :aux + sta linklen + clc + adc linkpos + sta linkpos + lda #$00 + adc linkpos+2 + sta linkpos+2 + bit :errvalid bpl :l lda :rel+2 @@ -3579,6 +3682,9 @@ savop lda #$00 stz :ct stz rellength stz rellength+2 + stz linklen + stz linkpos + stz linkpos+2 psl #:str _QADrawString diff --git a/testdata/3013-len-pos-1.S b/testdata/3013-len-pos-1.S new file mode 100644 index 0000000..4a17d88 --- /dev/null +++ b/testdata/3013-len-pos-1.S @@ -0,0 +1,15 @@ + + rel + + ext my_pos_0 + ext my_len_1,my_pos_1 + ext my_len_2,my_pos_2 + + lda #my_len_1 + lda #my_len_2 + ldx #my_pos_1 + ldx #my_pos_2 + ldy #my_pos_0 + rtl + + sav 3013-len-pos-1.L \ No newline at end of file diff --git a/testdata/3013-len-pos-2.S b/testdata/3013-len-pos-2.S new file mode 100644 index 0000000..244a30c --- /dev/null +++ b/testdata/3013-len-pos-2.S @@ -0,0 +1,5 @@ + rel + +* make sure ds adjusts len/pos appropriately. + ds \ + sav 3013-len-pos-2.L diff --git a/testdata/3013-len-pos-link.S b/testdata/3013-len-pos-link.S new file mode 100644 index 0000000..4394c2c --- /dev/null +++ b/testdata/3013-len-pos-link.S @@ -0,0 +1,24 @@ + + ovr all + + asm 3013-len-pos-1.S + asm 3013-len-pos-2.S + + lnk 3013-len-pos-1.L + + len my_len_1 + pos my_pos_1 + + lnk 3013-len-pos-2.L + + len my_len_2 + pos my_pos_2 + + pos + pos my_pos_0 + + + + sav 3013-len-pos + + ent \ No newline at end of file