;............................................................................;
;
;          Compare long word for zero macro
;
;    Cpzl   addr            Cpzl   addr:#off
;    Cpzl   addr:x          Cpzl   [zp]
;    Cpzl   addr:y          Cpzl   [zp]:y
;    Cpzl   addr:s          Cpzl   [zp]:off
;    Cpzl   addr:off        Cpzl   [zp]:#off
;
;............................................................................;
        MACRO
&lab    Cpzl &loc
&lab	; 
        lclc     &char
        lcla     &offset
        lclc     &rest
        lclc     &disp
&char   setc &substr(&loc,1,1)
&offset seta &pos(':',&loc)
		IF	&offset GOTO .docmpoff
		IF	(&char='[') GOTO .docmpzp
        lda      &loc
        ora      &loc+2              
        mexit
.docmpzp
        lda &loc
        ldy #2
        ora &loc,y
        mexit
.docmpoff
&rest   setc &substr(&loc,1,&offset-1)
&disp   setc &substr(&loc,&offset+1,&len(&loc)-&offset)
		IF	&char='[' GOTO .docmpoffzp
		IF	(&disp='s') or (&disp='x') or (&disp='y') GOTO .docmpoffi
        ldx &disp
&disp   setc 'x'
.docmpoffi
        lda &rest,&disp
        ora &rest+2,&disp
        mexit
.docmpoffzp
		IF	(&disp='y') GOTO .doy
        ldy &disp
.doy
        lda &rest,y
        iny
        iny
        ora &rest,y
        mexit
        MEND
*=======================================================================*

           macro
&lab       CmpByte &from,&to
&lab       cmpb  &from,&to
           mend

*=======================================================================*

           macro
&lab       CmpWord &from,&to
&lab       cmpw  &from,&to
           mend

*=======================================================================*

           macro
&lab       CmpLong &from,&to
&lab       cmpl  &from,&to
           mend

*=======================================================================*

           MACRO
&lab       Cmpl  &from,&to
&lab	; 
           lcla  &noy1
           lcla  &noy2
           lcla  &nox1
           lcla  &nox2
           lcla  &ypushed
           lcla  &yinced
           lcla  &xpushed
           lcla  &yhas2
           lcla  &const1
           lcla  &addr1
           lcla  &a1off
           lcla  &a2off
           lcla  &needbra
           lcla  &sameoff
           lclc  &cmpreg
           lclc  &fdisp
           lclc  &tdisp
           lclc  &floc
           lclc  &tloc
           lclc  &fchar
           lclc  &tchar
           lcla  &foffset
           lcla  &toffset
           lclc  &newfrom
           lclc  &newto
           lcla  &num
&newfrom	setc	&from
&newto		setc	&to
&fchar     setc &substr(&from,1,1)
&tchar     setc &substr(&to,1,1)
&foffset   seta &pos(':',&from)
&toffset   seta &pos(':',&to)
		IF	&foffset=0 GOTO .nofoff
&floc      setc &substr(&from,1,&foffset-1)
&fdisp     setc &substr(&from,&foffset+1,&len(&from)-&foffset)
.nofoff
		IF	&toffset GOTO .gettoff
		GOTO .setnox2

.gettoff
&tloc      setc &substr(&to,1,&toffset-1)
&tdisp     setc &substr(&to,&toffset+1,&len(&to)-&toffset)
		IF	(&tdisp='s') or (&tdisp='y') or (&tchar='[') GOTO .setnox2
		IF	(&tdisp='x') GOTO .setnoy2
&a2off     seta  1
		GOTO .setnoy2

.setnox2
&nox2      seta  1
		IF	(&tdisp='y') GOTO .notoff
.setnoy2
&noy2      seta  1
.notoff
		IF	not (&foffset and &toffset) GOTO .notsame
&num       seta &pos(&tdisp,&fdisp)
		IF	&num=0 GOTO .notsame
		IF	(&tchar='[') and (&fchar­'[') GOTO .notsame
		IF	(&fchar='[') and (&tchar­'[') GOTO .notsame
&sameoff   seta  1
.notsame
&cmpreg    setc  'a'
		IF	&foffset GOTO .fromoff
		IF	&fchar='[' GOTO .fromzp
		IF	&fchar='#' GOTO .fromimm
		IF	&from='ax' GOTO .fromxhigh
		IF	(&from='ay') or (&from='xy') GOTO .fromyhigh
&addr1     seta  1
           lda   &from+2
		GOTO .doto

.fromyhigh
&cmpreg    setc  'y'
		GOTO .doto

.fromxhigh
&cmpreg    setc  'x'
		GOTO .doto

.fromimm
&newfrom   setc &substr(&from,2,&len(&from)-1)
           lda   #^&newfrom
&const1    seta  1
		GOTO .doto

.fromzp
		IF	&noy2 GOTO .fromzpnophy
           phy
&ypushed   seta  1
.fromzpnophy
           ldy   #2
           lda   &from,y
&yhas2     seta  1
&nox1      seta  1
		GOTO .doto

.fromoff
		IF	&fdisp='y' GOTO .fromy
		IF	&fchar='[' GOTO .fromzpoff
&noy1      seta  1
		IF	&fdisp='x' GOTO .fromx
		IF	&fdisp='s' GOTO .froms
&a1off     seta  1
		IF	&sameoff GOTO .fromoffonly1
		IF	&a2off GOTO .nofromphx
		IF	not (&nox2) GOTO .fromoffphx
&newfrom      setc  &concat(&floc,':x')
		GOTO .nofromphx      

.fromoffonly1
&newto        setc  &concat(&tloc,':x')
&newfrom      setc  &concat(&floc,':x')
		GOTO .nofromphx

.fromoffphx
           phx
&xpushed   seta  1
.nofromphx
           ldx   &fdisp
           lda   &floc+2,x
		GOTO .doto

.fromzpoff
&nox1      seta  1
		IF	&noy2 GOTO .fromzpoffldy
           phy
&ypushed   seta  1
.fromzpoffldy
           ldy   &fdisp+2
           lda   &floc,y
		GOTO .doto

.froms
&nox1      seta  1
           lda   &floc+2,s
		GOTO .doto

.fromy
&nox1      seta  1
		IF	&fchar='[' GOTO .fromyzp
           lda   &floc+2,y
		GOTO .doto

.fromyzp
           phy
           iny
           iny
&ypushed   seta  1
&yinced    seta  1
           lda   &floc,y
		IF	&tchar='[' GOTO .doto
		IF	not (&noy2) GOTO .doto
           ply
&ypushed   seta  0
&yinced    seta  0
		GOTO .doto

.fromx
           lda   &floc+2,x
		GOTO .doto

.doto
		IF	&toffset GOTO .tooff
		IF	&tchar='[' GOTO .tozp
		IF	&tchar='#' GOTO .toimm
           cp&cmpreg  &to+2
		GOTO .dolow

.toimm
&newto     setc &substr(&to,2,&len(&to)-1)
           cp&cmpreg  #^&newto
		GOTO .dolow

.tozp
		IF	&yhas2 GOTO .tozpnoload
		IF	&ypushed GOTO .tozpload
		IF	&noy1 or &const1 or &addr1 GOTO .tozpload
		IF	(&fdisp­'y') and (&fchar='[') GOTO .tozpload
           phy
&ypushed   seta  1
.tozpload
           ldy   #2
.tozpnoload
           cp&cmpreg  &to,y
		GOTO .dolow

.tooff
		IF	&tdisp='x' GOTO .tox
		IF	&tdisp='y' GOTO .toy
		IF	&tdisp='s' GOTO .tos
		IF	&tchar='[' GOTO .tozpoff
		IF	&sameoff GOTO .noloadx
		IF	&xpushed or &a1off GOTO .loadx
		IF	not (&nox1 or &const1 or &addr1) GOTO .tooffphx
&newto        setc  &concat(&tloc,':x')
		GOTO .loadx

.tooffphx
           phx
&xpushed   seta  1
.loadx
           ldx   &tdisp
.noloadx
           cp&cmpreg  &tloc+2,x
		GOTO .dolow

.tozpoff
		IF	&sameoff GOTO .noloady
		IF	&ypushed GOTO .loady
		IF	&noy1 or &const1 or &addr1 GOTO .loady
		IF	(&fdisp­'y') and (&fchar='[') GOTO .loady
		IF	&foffset=0 GOTO .loady
           phy
&ypushed   seta  1
.loady
           ldy   &tdisp+2
.noloady
           cp&cmpreg  &tloc,y
		GOTO .dolow

.tos
           cp&cmpreg  &tloc+2,s
		GOTO .dolow

.toy
		IF	&tchar='[' GOTO .toyzp
		IF	not (&ypushed) GOTO .toydo
           ply
&ypushed   seta  0
.toydo
           cp&cmpreg &tloc+2,y
		GOTO .dolow

.toyzp
		IF	&yinced GOTO .toyzpdo
		IF	not (&ypushed) GOTO .toypush
           ply
.toypush
           phy
&ypushed   seta  1
           iny
           iny
.toyzpdo
           cp&cmpreg  &tloc,y
		GOTO .dolow

.tox
		IF	not (&xpushed) GOTO .toxdo
           plx
&xpushed   seta  0
.toxdo
           cp&cmpreg  &tloc+2,x
		GOTO .dolow

.dolow
           bne   ~b&sysindex
		IF	not (&xpushed or &ypushed) GOTO .dolow2
		IF	not (&xpushed) GOTO .checky
           plx
.checky
		IF	not (&ypushed) GOTO .dolow2
           ply
.dolow2
&newfrom   setc  &from
		IF	(&from='ax') or (&from='ay') GOTO .setalow
		IF	not (&from='xy') GOTO .dolow3
&newfrom   setc  'x'
		GOTO .dolow3

.setalow
&newfrom   setc  'a'     
.dolow3
           cmpw  &newfrom,&to
		IF	not (&xpushed or &ypushed) GOTO .finish
           bra   ~a&sysindex
.finish
~b&sysindex	; 
		IF	(&xpushed or &ypushed) GOTO .doend
           mexit
.doend
		IF	not (&xpushed) GOTO .chky
           plx
.chky
		IF	&ypushed GOTO .gety
~a&sysindex	; 
           mexit
.gety
           ply
~a&sysindex	; 
           mend

********************************************************************
*  This macro compares 2 bytes
*
* Wednesday, April 26, 1989 11:13:20 PM
********************************************************************

       	MACRO
&lab       	Cmpb  &from,&to
&lab
			short m
			Cmpw	&from,&to
			long m
		Mend

*=======================================================================*

           MACRO
&lab       Cmpw  &from,&to
&lab	; 
           lcla  &sameoff
           lcla  &nox2
           lcla  &noy2
           lclc  &cmpreg
           lclc  &fdisp
           lclc  &tdisp
           lclc  &floc
           lclc  &tloc
           lcla  &foffset
           lcla  &toffset
           lclc  &fchar
           lclc  &tchar
           lcla  &num
		   lclc	&newfrom
&newfrom	setc &from
		lcla &ppos
&ppos	seta &pos('.',&from)
		IF &ppos=0 GOTO .noeval
		eval &from
&newfrom	setc 'a'
.noeval
&fchar     setc &substr(&newfrom,1,1)
&tchar     setc &substr(&to,1,1)
&foffset   seta &pos(':',&newfrom)
&toffset   seta &pos(':',&to)
		IF	&foffset=0 GOTO .nofoff
&floc      setc &substr(&from,1,&foffset-1)
&fdisp     setc &substr(&from,&foffset+1,&len(&newfrom)-&foffset)
.nofoff
		IF	&toffset GOTO .gettoff
		GOTO .setnox2

.gettoff
&tloc      setc &substr(&to,1,&toffset-1)
&tdisp     setc &substr(&to,&toffset+1,&len(&to)-&toffset)
		IF	(&tdisp='s') or (&tdisp='y') or (&tchar='[') GOTO .setnox2
		GOTO .setnoy2

.setnox2
&nox2      seta  1
		IF	(&tdisp='y') GOTO .notoff
.setnoy2
&noy2      seta  1
.notoff
		IF	not (&foffset and &toffset) GOTO .notsame
&num       seta &pos(&tdisp,&fdisp)
		IF	&num=0 GOTO .notsame
		IF	(&tchar='[') and (&fchar­'[') GOTO .notsame
		IF	(&fchar='[') and (&tchar­'[') GOTO .notsame
&sameoff   seta  1
.notsame
&cmpreg    setc  'a'
		IF	&foffset GOTO .fromoff
		IF	(&newfrom='a') or (&newfrom='x') or (&newfrom='y') GOTO .fromreg
		IF &fchar='#' AND &pos(&substr(&newfrom,2,1),'<^>')=0 THEN
			lda		#<&substr(&newfrom,2,&len(&newfrom)-1)
		ELSE
			lda		&newfrom
		ENDIF
		GOTO .doto

.fromreg
&cmpreg    setc  &newfrom
		GOTO .doto

.fromoff
		IF	(&fdisp='x') or (&fdisp='y') or (&fdisp='s') GOTO .foffreg
		IF	&fchar='[' GOTO .fromoffzp
		IF	(&nox2) GOTO .dofromoff
		IF	not (&tdisp='x') GOTO .dofromoff
           phx
.dofromoff
           ldx   &fdisp
           lda   &concat(&floc,',x')
		IF	&nox2 GOTO .doto
		IF	not (&tdisp='x') GOTO .doto
           plx
		GOTO .doto

.fromoffzp
		IF	&noy2 GOTO .dofromoffzp
           phy
.dofromoffzp
           ldy   &fdisp
           lda   &concat(&floc,',y')
		IF	&noy2 GOTO .doto
           ply
		GOTO .doto

.foffreg
           lda   &concat(&floc,',',&fdisp)
.doto
		IF	&toffset GOTO .tooff
			IF &substr(&to,1,1)='#' THEN
				cp&cmpreg	#<&substr(&to,2,&len(&to)-1)
			ELSE
				cp&cmpreg	&to
			ENDIF
           mexit
.tooff
		IF	(&tdisp='x') or (&tdisp='y') or (&tdisp='s') GOTO .dotooff
		IF	&tchar='[' GOTO .tooffzp
		IF	&sameoff GOTO .noloadx
           ldx   &tdisp
.noloadx
           cp&cmpreg  &concat(&tloc,',x')
           mexit
.tooffzp
		IF	&sameoff GOTO .noloady
           ldy   &tdisp
.noloady
           cp&cmpreg  &concat(&tloc,',y')
           mexit
.dotooff
           cp&cmpreg  &concat(&tloc,',',&tdisp)
           mend

*=======================================================================*

           MACRO
&lab       Scmpw  &from,&to
&lab	; 
           lcla  &sameoff
           lcla  &nox2
           lcla  &noy2
           lclc  &cmpreg
           lclc  &fdisp
           lclc  &tdisp
           lclc  &floc
           lclc  &tloc
           lcla  &foffset
           lcla  &toffset
           lclc  &fchar
           lclc  &tchar
           lcla  &num
           lclc  &newfrom
           lclc  &newto

&newfrom	setc &from
&newto		setc &to
&fchar     setc &substr(&newfrom,1,1)
&tchar     setc &substr(&newto,1,1)
&foffset   seta &pos(':',&newfrom)
&toffset   seta &pos(':',&newto)
		IF	&foffset=0 GOTO .nofoff
&floc      setc &substr(&newfrom,1,&foffset-1)
&fdisp     setc &substr(&newfrom,&foffset+1,&len(&newfrom)-&foffset)
.nofoff
		IF	&toffset GOTO .gettoff
		GOTO .setnox2

.gettoff
&tloc      setc &substr(&newto,1,&toffset-1)
&tdisp     setc &substr(&newto,&toffset+1,&len(&newto)-&toffset)
		IF	(&tdisp='s') or (&tdisp='y') or (&tchar='[') GOTO .setnox2
		GOTO .setnoy2

.setnox2
&nox2      seta  1
		IF	(&tdisp='y') GOTO .notoff
.setnoy2
&noy2      seta  1
.notoff
		IF	not (&foffset and &toffset) GOTO .notsame
&num       seta &pos(&tdisp,&fdisp)
		IF	&num=0 GOTO .notsame
		IF	(&tchar='[') and (&fchar­'[') GOTO .notsame
		IF	(&fchar='[') and (&tchar­'[') GOTO .notsame
&sameoff   seta  1
.notsame
&cmpreg    setc  'a'
		IF	&foffset GOTO .fromoff
		IF	(&newfrom='a') or (&newfrom='x') or (&newfrom='y') GOTO .fromreg
           sec
           lda   &newfrom
		GOTO .doto

.fromreg
&cmpreg    setc  &newfrom
           sec
		GOTO .doto

.fromoff
		IF	(&fdisp='x') or (&fdisp='y') or (&fdisp='s') GOTO .foffreg
		IF	&fchar='[' GOTO .fromoffzp
		IF	(&nox2) GOTO .dofromoff
		IF	not (&tdisp='x') GOTO .dofromoff
           phx
.dofromoff
           ldx   &fdisp
&newfrom      setc  &concat(&floc,',x')
           sec
           lda   &newfrom
		IF	&nox2 GOTO .doto
		IF	not (&tdisp='x') GOTO .doto
           plx
		GOTO .doto

.fromoffzp
		IF	&noy2 GOTO .dofromoffzp
           phy
.dofromoffzp
           ldy   &fdisp
&newfrom      setc  &concat(&floc,',y')
           sec
           lda   &newfrom
		IF	&noy2 GOTO .doto
           ply
		GOTO .doto

.foffreg
&newfrom      setc  &concat(&floc,',',&fdisp)
           sec
           lda   &newfrom
.doto
		IF	&toffset=0 GOTO .enditall
.tooff
		IF	(&tdisp='x') or (&tdisp='y') or (&tdisp='s') GOTO .dotooff
		IF	&tchar='[' GOTO .tooffzp
		IF	&sameoff GOTO .noloadx
           ldx   &tdisp
.noloadx
&newto        setc  &concat(&tloc,',x')
		GOTO .enditall

.tooffzp
		IF	&sameoff GOTO .noloady
           ldy   &tdisp
.noloady
&newto        setc  &concat(&tloc,',y')
		GOTO .enditall

.dotooff
&newto        setc  &concat(&tloc,',',&tdisp')
.enditall
           sbc     &newto
           beq     ~done&sysindex
           clc
           bvs     ~invert&sysindex
           bmi     ~done&sysindex
           bra     ~greater&sysindex
~invert&sysindex     bpl  ~done&sysindex
~greater&sysindex    sec
~done&sysindex	; 
           MEND
