mirror of
https://github.com/byteworksinc/ORCALib.git
synced 2024-11-19 08:31:26 +00:00
379f2f93ad
This affects code where multiple structs or unions are assigned by successive = operators in one expression, e.g. "s1=s2=s3". The middle struct assignment(s) would use the ~Move2 or ~LongMove2 helper functions (for <64k or >=64k moves, respectively). These functions are supposed to leave the destination pointer on the stack so it can be used as the source of a subsequent move, but they both had bugs where they could modify dest and leave that modified value on the stack, which would cause subsequent moves to use the wrong source location. In the case of ~Move2, this only happened if the size was odd. Here is a program that demonstrated the problems with both functions: #pragma memorymodel 1 #include <stdio.h> struct S1 { char s[80000]; } a,b,c; int main(void) { struct S2 { int x,y; char z; } d,e,f; c.s[66000] = 123; f.y = 5678; a = b = c; d = e = f; printf("%i %i %i\n", a.s[66000], b.s[66000], c.s[66000]); printf("%i %i %i\n", d.y, e.y, f.y); }
546 lines
6.5 KiB
Plaintext
546 lines
6.5 KiB
Plaintext
MACRO
|
|
&lab error &e
|
|
&lab ph2 &e
|
|
jsl SystemError
|
|
mend
|
|
MACRO
|
|
&LAB MOVE4 &F,&T
|
|
&LAB ~SETM
|
|
LDA 2+&F
|
|
STA 2+&T
|
|
LDA &F
|
|
STA &T
|
|
~RESTM
|
|
MEND
|
|
MACRO
|
|
&LAB PUTS &N1,&F1,&CR,&ERROUT
|
|
&LAB ~SETM
|
|
LCLC &C
|
|
&C AMID "&N1",1,1
|
|
AIF "&C"<>"#",.C
|
|
AIF L:&N1>127,.A
|
|
BRA ~&SYSCNT
|
|
AGO .B
|
|
.A
|
|
BRL ~&SYSCNT
|
|
.B
|
|
&N1 AMID "&N1",2,L:&N1-1
|
|
~L&SYSCNT DC I1"L:~S&SYSCNT"
|
|
~S&SYSCNT DC C&N1
|
|
~&SYSCNT ANOP
|
|
&N1 SETC ~L&SYSCNT-1
|
|
.C
|
|
~PUSHA &N1
|
|
AIF C:&F1,.C1
|
|
PEA 0
|
|
AGO .C2
|
|
.C1
|
|
PH2 &F1
|
|
.C2
|
|
PH2 #C:&CR
|
|
PH2 #C:&ERROUT
|
|
JSL ~PUTS
|
|
~RESTM
|
|
MEND
|
|
MACRO
|
|
&LAB ~PUSHA &N1
|
|
LCLC &C
|
|
&LAB ANOP
|
|
&C AMID &N1,1,1
|
|
AIF "&C"<>"{",.B
|
|
&C AMID &N1,L:&N1,1
|
|
AIF "&C"<>"}",.G
|
|
&N1 AMID &N1,2,L:&N1-2
|
|
SEP #$20
|
|
LONGA OFF
|
|
LDA #0
|
|
PHA
|
|
REP #$20
|
|
LONGA ON
|
|
PHK
|
|
LDA &N1
|
|
PHA
|
|
MEXIT
|
|
.B
|
|
AIF "&C"<>"[",.C
|
|
&N1 AMID &N1,2,L:&N1-2
|
|
LDA &N1+2
|
|
PHA
|
|
LDA &N1
|
|
PHA
|
|
MEXIT
|
|
.C
|
|
PEA +(&N1)|-16
|
|
PEA &N1
|
|
MEXIT
|
|
.G
|
|
MNOTE "Missing closing '}'",16
|
|
MEND
|
|
MACRO
|
|
&LAB ~SETM
|
|
&LAB ANOP
|
|
AIF C:&~LA,.B
|
|
GBLB &~LA
|
|
GBLB &~LI
|
|
.B
|
|
&~LA SETB S:LONGA
|
|
&~LI SETB S:LONGI
|
|
AIF S:LONGA.AND.S:LONGI,.A
|
|
REP #32*(.NOT.&~LA)+16*(.NOT.&~LI)
|
|
LONGA ON
|
|
LONGI ON
|
|
.A
|
|
MEND
|
|
MACRO
|
|
&LAB ~RESTM
|
|
&LAB ANOP
|
|
AIF (&~LA+&~LI)=2,.I
|
|
SEP #32*(.NOT.&~LA)+16*(.NOT.&~LI)
|
|
AIF &~LA,.H
|
|
LONGA OFF
|
|
.H
|
|
AIF &~LI,.I
|
|
LONGI OFF
|
|
.I
|
|
MEND
|
|
MACRO
|
|
&LAB ADD4 &M1,&M2,&M3
|
|
LCLB &YISTWO
|
|
LCLC &C
|
|
&LAB ~SETM
|
|
AIF C:&M3,.A
|
|
&C AMID "&M2",1,1
|
|
AIF "&C"<>"#",.A
|
|
&C AMID "&M1",1,1
|
|
AIF "&C"="{",.A
|
|
AIF "&C"="[",.A
|
|
&C AMID "&M2",2,L:&M2-1
|
|
AIF &C>=65536,.A
|
|
CLC
|
|
~LDA &M1
|
|
~OP ADC,&M2
|
|
~STA &M1
|
|
BCC ~&SYSCNT
|
|
~OP.H INC,&M1
|
|
~&SYSCNT ANOP
|
|
AGO .C
|
|
.A
|
|
AIF C:&M3,.B
|
|
LCLC &M3
|
|
&M3 SETC &M1
|
|
.B
|
|
CLC
|
|
~LDA &M1
|
|
~OP ADC,&M2
|
|
~STA &M3
|
|
~LDA.H &M1
|
|
~OP.H ADC,&M2
|
|
~STA.H &M3
|
|
.C
|
|
~RESTM
|
|
MEND
|
|
MACRO
|
|
&LAB ~OP.H &OPC,&OP
|
|
&LAB ANOP
|
|
LCLC &C
|
|
&C AMID "&OP",1,1
|
|
AIF "&C"="[",.B
|
|
AIF "&C"<>"{",.D
|
|
&C AMID "&OP",L:&OP,1
|
|
AIF "&C"="}",.A
|
|
MNOTE "Missing closing '}'",2
|
|
&OP SETC &OP}
|
|
.A
|
|
&OP AMID "&OP",2,L:&OP-2
|
|
&OP SETC (&OP)
|
|
.B
|
|
AIF &YISTWO,.C
|
|
&YISTWO SETB 1
|
|
LDY #2
|
|
&OP SETC "&OP,Y"
|
|
.C
|
|
&OPC &OP
|
|
MEXIT
|
|
.D
|
|
AIF "&C"<>"#",.E
|
|
&OP AMID "&OP",2,L:&OP-1
|
|
&OP SETC "#^&OP"
|
|
&OPC &OP
|
|
MEXIT
|
|
.E
|
|
&OPC 2+&OP
|
|
MEND
|
|
MACRO
|
|
&LAB ~LDA.H &OP
|
|
&LAB ANOP
|
|
LCLC &C
|
|
&C AMID "&OP",1,1
|
|
AIF "&C"="[",.B
|
|
AIF "&C"<>"{",.D
|
|
&C AMID "&OP",L:&OP,1
|
|
AIF "&C"="}",.A
|
|
MNOTE "Missing closing '}'",2
|
|
&OP SETC &OP}
|
|
.A
|
|
&OP AMID "&OP",2,L:&OP-2
|
|
&OP SETC (&OP)
|
|
.B
|
|
AIF &YISTWO,.C
|
|
&YISTWO SETB 1
|
|
LDY #2
|
|
&OP SETC "&OP,Y"
|
|
.C
|
|
LDA &OP
|
|
MEXIT
|
|
.D
|
|
AIF "&C"<>"#",.E
|
|
&OP AMID "&OP",2,L:&OP-1
|
|
&OP SETC "#^&OP"
|
|
LDA &OP
|
|
MEXIT
|
|
.E
|
|
LDA 2+&OP
|
|
MEND
|
|
MACRO
|
|
&LAB ~STA.H &OP
|
|
&LAB ANOP
|
|
LCLC &C
|
|
&C AMID "&OP",1,1
|
|
AIF "&C"="[",.B
|
|
AIF "&C"<>"{",.D
|
|
&C AMID "&OP",L:&OP,1
|
|
AIF "&C"="}",.A
|
|
MNOTE "Missing closing '}'",2
|
|
&OP SETC &OP}
|
|
.A
|
|
&OP AMID "&OP",2,L:&OP-2
|
|
&OP SETC (&OP)
|
|
.B
|
|
AIF &YISTWO,.C
|
|
&YISTWO SETB 1
|
|
LDY #2
|
|
&OP SETC "&OP,Y"
|
|
.C
|
|
STA &OP
|
|
MEXIT
|
|
.D
|
|
STA 2+&OP
|
|
MEND
|
|
MACRO
|
|
&LAB ~LDA &OP
|
|
LCLC &C
|
|
&C AMID "&OP",1,1
|
|
AIF "&C"<>"{",.B
|
|
&C AMID "&OP",L:&OP,1
|
|
AIF "&C"="}",.A
|
|
MNOTE "Missing closing '}'",2
|
|
&OP SETC &OP}
|
|
.A
|
|
&OP AMID "&OP",2,L:&OP-2
|
|
&OP SETC (&OP)
|
|
.B
|
|
&LAB LDA &OP
|
|
MEND
|
|
MACRO
|
|
&LAB ~STA &OP
|
|
LCLC &C
|
|
&C AMID "&OP",1,1
|
|
AIF "&C"<>"{",.B
|
|
&C AMID "&OP",L:&OP,1
|
|
AIF "&C"="}",.A
|
|
MNOTE "Missing closing '}'",2
|
|
&OP SETC &OP}
|
|
.A
|
|
&OP AMID "&OP",2,L:&OP-2
|
|
&OP SETC (&OP)
|
|
.B
|
|
&LAB STA &OP
|
|
MEND
|
|
MACRO
|
|
&LAB ~OP &OPC,&OP
|
|
LCLC &C
|
|
&C AMID "&OP",1,1
|
|
AIF "&C"<>"{",.B
|
|
&C AMID "&OP",L:&OP,1
|
|
AIF "&C"="}",.A
|
|
MNOTE "Missing closing '}'",2
|
|
&OP SETC &OP}
|
|
.A
|
|
&OP AMID "&OP",2,L:&OP-2
|
|
&OP SETC (&OP)
|
|
.B
|
|
&LAB &OPC &OP
|
|
MEND
|
|
MACRO
|
|
&LAB INC4 &A
|
|
&LAB ~SETM
|
|
INC &A
|
|
BNE ~&SYSCNT
|
|
INC 2+&A
|
|
~&SYSCNT ~RESTM
|
|
MEND
|
|
MACRO
|
|
&LAB LONG &A,&B
|
|
LCLB &I
|
|
LCLB &M
|
|
&A AMID &A,1,1
|
|
&M SETB ("&A"="M").OR.("&A"="m")
|
|
&I SETB ("&A"="I").OR.("&A"="i")
|
|
AIF C:&B=0,.A
|
|
&B AMID &B,1,1
|
|
&M SETB ("&B"="M").OR.("&B"="m").OR.&M
|
|
&I SETB ("&B"="I").OR.("&B"="i").OR.&I
|
|
.A
|
|
&LAB REP #&M*32+&I*16
|
|
AIF .NOT.&M,.B
|
|
LONGA ON
|
|
.B
|
|
AIF .NOT.&I,.C
|
|
LONGI ON
|
|
.C
|
|
MEND
|
|
MACRO
|
|
&LAB PH2 &N1
|
|
LCLC &C
|
|
&LAB ANOP
|
|
&C AMID &N1,1,1
|
|
AIF "&C"="#",.D
|
|
AIF S:LONGA=1,.A
|
|
REP #%00100000
|
|
.A
|
|
AIF "&C"<>"{",.B
|
|
&C AMID &N1,L:&N1,1
|
|
AIF "&C"<>"}",.G
|
|
&N1 AMID &N1,2,L:&N1-2
|
|
LDA (&N1)
|
|
PHA
|
|
AGO .E
|
|
.B
|
|
LDA &N1
|
|
PHA
|
|
AGO .E
|
|
.D
|
|
&N1 AMID &N1,2,L:&N1-1
|
|
PEA &N1
|
|
AGO .F
|
|
.E
|
|
AIF S:LONGA=1,.F
|
|
SEP #%00100000
|
|
.F
|
|
MEXIT
|
|
.G
|
|
MNOTE "Missing closing '}'",16
|
|
MEND
|
|
MACRO
|
|
&LAB PH4 &N1
|
|
LCLC &C
|
|
&LAB ANOP
|
|
&C AMID &N1,1,1
|
|
AIF "&C"="#",.D
|
|
AIF S:LONGA=1,.A
|
|
REP #%00100000
|
|
.A
|
|
AIF "&C"<>"{",.B
|
|
&C AMID &N1,L:&N1,1
|
|
AIF "&C"<>"}",.G
|
|
&N1 AMID &N1,2,L:&N1-2
|
|
LDY #2
|
|
LDA (&N1),Y
|
|
PHA
|
|
LDA (&N1)
|
|
PHA
|
|
AGO .E
|
|
.B
|
|
AIF "&C"<>"[",.C
|
|
LDY #2
|
|
LDA &N1,Y
|
|
PHA
|
|
LDA &N1
|
|
PHA
|
|
AGO .E
|
|
.C
|
|
LDA &N1+2
|
|
PHA
|
|
LDA &N1
|
|
PHA
|
|
AGO .E
|
|
.D
|
|
&N1 AMID &N1,2,L:&N1-1
|
|
PEA +(&N1)|-16
|
|
PEA &N1
|
|
AGO .F
|
|
.E
|
|
AIF S:LONGA=1,.F
|
|
SEP #%00100000
|
|
.F
|
|
MEXIT
|
|
.G
|
|
MNOTE "Missing closing '}'",16
|
|
MEND
|
|
MACRO
|
|
&LAB PL4 &N1
|
|
LCLC &C
|
|
&LAB ANOP
|
|
AIF S:LONGA=1,.A
|
|
REP #%00100000
|
|
.A
|
|
&C AMID &N1,1,1
|
|
AIF "&C"<>"{",.B
|
|
&C AMID &N1,L:&N1,1
|
|
AIF "&C"<>"}",.F
|
|
&N1 AMID &N1,2,L:&N1-2
|
|
PLA
|
|
STA (&N1)
|
|
LDY #2
|
|
PLA
|
|
STA (&N1),Y
|
|
AGO .D
|
|
.B
|
|
AIF "&C"<>"[",.C
|
|
PLA
|
|
STA &N1
|
|
LDY #2
|
|
PLA
|
|
STA &N1,Y
|
|
AGO .D
|
|
.C
|
|
PLA
|
|
STA &N1
|
|
PLA
|
|
STA &N1+2
|
|
.D
|
|
AIF S:LONGA=1,.E
|
|
SEP #%00100000
|
|
.E
|
|
MEXIT
|
|
.F
|
|
MNOTE "Missing closing '}'",16
|
|
MEND
|
|
MACRO
|
|
&LAB SHORT &A,&B
|
|
LCLB &I
|
|
LCLB &M
|
|
&A AMID &A,1,1
|
|
&M SETB ("&A"="M").OR.("&A"="m")
|
|
&I SETB ("&A"="I").OR.("&A"="i")
|
|
AIF C:&B=0,.A
|
|
&B AMID &B,1,1
|
|
&M SETB ("&B"="M").OR.("&B"="m").OR.&M
|
|
&I SETB ("&B"="I").OR.("&B"="i").OR.&I
|
|
.A
|
|
&LAB SEP #&M*32+&I*16
|
|
AIF .NOT.&M,.B
|
|
LONGA OFF
|
|
.B
|
|
AIF .NOT.&I,.C
|
|
LONGI OFF
|
|
.C
|
|
MEND
|
|
MACRO
|
|
&LAB _NEWHANDLE
|
|
&LAB LDX #$0902
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&lab csubroutine &parms,&work
|
|
&lab anop
|
|
aif c:&work,.a
|
|
lclc &work
|
|
&work setc 0
|
|
.a
|
|
gbla &totallen
|
|
gbla &worklen
|
|
&worklen seta &work
|
|
&totallen seta 0
|
|
aif c:&parms=0,.e
|
|
lclc &len
|
|
lclc &p
|
|
lcla &i
|
|
&i seta 1
|
|
.b
|
|
&p setc &parms(&i)
|
|
&len amid &p,2,1
|
|
aif "&len"=":",.c
|
|
&len amid &p,1,2
|
|
&p amid &p,4,l:&p-3
|
|
ago .d
|
|
.c
|
|
&len amid &p,1,1
|
|
&p amid &p,3,l:&p-2
|
|
.d
|
|
&p equ &totallen+4+&work
|
|
&totallen seta &totallen+&len
|
|
&i seta &i+1
|
|
aif &i<=c:&parms,^b
|
|
.e
|
|
tsc
|
|
aif &work=0,.f
|
|
sec
|
|
sbc #&work
|
|
tcs
|
|
.f
|
|
phd
|
|
tcd
|
|
mend
|
|
MACRO
|
|
&lab creturn &r
|
|
&lab anop
|
|
lclc &len
|
|
aif c:&r,.a
|
|
lclc &r
|
|
&r setc 0
|
|
&len setc 0
|
|
ago .h
|
|
.a
|
|
&len amid &r,2,1
|
|
aif "&len"=":",.b
|
|
&len amid &r,1,2
|
|
&r amid &r,4,l:&r-3
|
|
ago .c
|
|
.b
|
|
&len amid &r,1,1
|
|
&r amid &r,3,l:&r-2
|
|
.c
|
|
aif &len<>2,.d
|
|
ldy &r
|
|
ago .h
|
|
.d
|
|
aif &len<>4,.e
|
|
ldx &r+2
|
|
ldy &r
|
|
ago .h
|
|
.e
|
|
aif &len<>10,.g
|
|
ldy #&r
|
|
ldx #^&r
|
|
ago .h
|
|
.g
|
|
mnote 'Not a valid return length',16
|
|
mexit
|
|
.h
|
|
aif &totallen=0,.i
|
|
lda &worklen+2
|
|
sta &worklen+&totallen+2
|
|
lda &worklen+1
|
|
sta &worklen+&totallen+1
|
|
.i
|
|
pld
|
|
tsc
|
|
clc
|
|
adc #&worklen+&totallen
|
|
tcs
|
|
aif &len=0,.j
|
|
tya
|
|
.j
|
|
rtl
|
|
mend
|
|
macro
|
|
&l dec4 &a
|
|
&l ~setm
|
|
lda &a
|
|
bne ~&SYSCNT
|
|
dec 2+&a
|
|
~&SYSCNT dec &a
|
|
~restm
|
|
mend
|