; Makros fuer den 32-Bit Zugriff

; Revision 0.20 vom 1.12.1998

; *********************************************************

; * *

; * LoadDW Adr(Word), Wert32(Low-Word), Wert32(High-Word) *

; * *

; * Legt 32-Bit-Wert in Adresse ab *

; * *

; * <Adresse> = 32-Bit-Wert *

; * *

; *********************************************************

:LoadDWm

lda#<1

sta0

lda#>1

sta0+1

lda#<2

sta0+2

lda#>2

sta0+3

/

; *********************************************************

; * *

; * MoveDW QuellAdr.(Word), ZielAdr.(Word) *

; * *

; * Kopiert 32-Bit-Wert von QuellAdr. nach ZielAdr. *

; * *

; * <Ziel> = <Quelle> *

; * *

; *********************************************************

:MoveDWm

lda0

sta1

lda0+1

sta1+1

lda0+2

sta1+2

lda0+3

sta1+3

/

; *********************************************************

; * *

; * AddDW Adresse1(Word), Adresse2(Word) *

; * *

; * Addiert 32-Bit-Inhalt von Adr.1 bis Adr.1+3 zum *

; * 32-Bit-Inhalt von Adr.2 bis Adr.2+3 *

; * *

; * <Adr.2> = <Adr.1> + <Adr.2> *

; *********************************************************

:AddDWm;Uebergabe: AddDW S-Adr.(W),D-Adr.(W) A1+A2=A2

clc

lda0

adc1

sta1

lda0+1

adc1+1

sta1+1

lda0+2

adc1+2

sta1+2

lda0+3

adc1+3

sta1+3

/

; *********************************************************

; * *

; * AddVDW Wert32(Low-Word), Wert32(High-Word, Adr.(Word) *

; * *

; * Addiert 32-Bit-Wert zum 32-Bit-Inhalt von *

; * Adr. bis Adr.+3 *

; * *

; * <Adr.> = 32-Bit-Wert + <Adr.> *

; *********************************************************

:AddVDWm

clc

lda#<0

adc2

sta2

lda#>0

adc2+1

sta2+1

lda#<1

adc2+2

sta2+2

lda#>1

adc2+3

sta2+3

/

; *********************************************************

; * *

; * SubDW Adresse1(Word), Adresse2(Word) *

; * *

; * Subtrahhiert 32-Bit-Inhalt von Adr.1 bis Adr.1+3 vom *

; * 32-Bit-Inhalt von Adr.2 bis Adr.2+3 *

; * *

; * <Adr.2> = <Adr.2> - <Adr.1> *

; *********************************************************

:SubDWm

sec

lda1

sbc0

sta1

lda1+1

sbc0+1

sta1+1

lda1+2

sbc0+2

sta1+2

lda1+3

sbc0+3

sta1+3

/

; *********************************************************

; * *

; * SubVDW Wert32(Low-Word), Wert32(High-Word), Adr.(Word)*

; * *

; * Subtrahiert 32-Bit-Wert vom 32-Bit-Inhalt von *

; * Adr. bis Adr.+3 *

; * *

; * <Adr.> = <Adr.> - 32-Bit-Wert *

; *********************************************************

:SubVDWm

sec

lda2

sbc#<0

sta2

lda2+1

sbc#>0

sta2+1

lda2+2

sbc#<1

sta2+2

lda2+3

sbc#>1

sta2+3

/

; *********************************************************

; * *

; * CmpDW Adresse1(Word), Adresse2(Word) *

; * *

; * Vergleicht 32-Bit-Inhalt von Adr.1 bis Adr.1+3 mit *

; * 32-Bit-Inhalt von Adr.2 bis Adr.2+3 *

; * *

; *********************************************************

:CmpDWm

lda0+3

cmp1+3

bne::ende

lda0+2

cmp1+2

bne::ende

lda0+1

cmp1+1

bne::ende

lda0

cmp1

::ende

/

; *********************************************************

; * *

; * CmpDWI Adr.(Word), Wert32(Low-Word), Wert32(High-Word)*

; * *

; * Vergleicht 32-Bit-Inhalt von Adr. bis Adr.+3 mit *

; * 32-Bit-Wert *

; * *

; *********************************************************

:CmpDWIm

lda0+3

cmp#>2

bne::ende

lda0+2

cmp#<2

bne::ende

lda0+1

cmp#>1

bne::ende

lda0

cmp#<1

::ende

/

; *********************************************************

; * *

; * PushDW Adr.(Word) *

; * *

; * Legt 32-Bit-Inhalt von Adr. bis Adr.+3 auf den Stack *

; * *

; *********************************************************

:PushDWm;Uebergabe: PushDW Adr.(W)

lda0+3

pha

lda0+2

pha

lda0+1

pha

lda0

pha

/

; *********************************************************

; * *

; * PopDW Adr.(Word) *

; * *

; * Holt 32-Bit-Wert vom Stack zurueck und legt den Wert *

; * in Adr. bis Adr.+3 ab *

; * *

; *********************************************************

:PopDWm

lda0

pla

lda0+1

pla

lda0+2

pla

lda0+3

pla

/

; *********************************************************

; * *

; * sbDWn Adr.(Word), BIT-Nummer *

; * *

; * Setzt BIT-Nummer in Adr. bis Adr.+3 *

; * *

; * gueltig sind BIT-Nummern von 0 bis 31 *

; * *

; *********************************************************

:sbDWnm;Uebergabe: sbDWn Adr.(W), BITNr. (B: 0-31)

lda1

cmp#15

bgt:32bit

lda0

ora#<2^1

sta0

lda0+1

ora#>2^1

sta0+1

bne:ende

::32bit lda0+2

ora#<2^(1-16)

sta0+2

lda1+3

ora#>2^(1-16)

sta1+3

::ende

/

; *********************************************************

; * *

; * cbDWn Adr.(Word), BIT-Nummer *

; * *

; * Loescht BIT-Nummer in Adr. bis Adr.+3 *

; * *

; * gueltig sind BIT-Nummern von 0 bis 31 *

; * *

; *********************************************************

:cbDWnm

lda1

cmp#15

bgt:32bit

lda0

and#<$ffff-2^1

sta0

lda0+1

and#>$ffff-2^1

sta0+1

bne:ende

::32bit lda0+2

and#<$ffff-2^(1-16)

sta0+2

lda1+3

and#>$ffff-2^(1-16)

sta1+3

::ende

/

; *********************************************************

; * *

; * rolDWn Adr.(Word), Anzahl *

; * *

; * Rotiert Inhalt von Adr. bis Adr.+3 Anzahl-mal nach *

; * links unter Beachtung des Carry-Flags f. Bit 0 *

; * *

; * sinnvoll sind Werte 1 bis 31 *

; * X-Register wird veraendert ! *

; * *

; *********************************************************

:rolDWnm

ldx#1

beq:ende

::1rol0

rol0+1

rol0+2

rol0+3

dex

bne:1

::ende

/

; *********************************************************

; * *

; * rorDWn Adr.(Word), Anzahl *

; * *

; * Rotiert Inhalt von Adr. bis Adr.+3 Anzahl-mal nach *

; * rechts unter Beachtung des Carry-Flags f. Bit 7 *

; * *

; * sinnvoll sind Werte 1 bis 31 *

; * X-Register wird veraendert ! *

; * *

; *********************************************************

:rorDWnm;Uebergabe: rorDWn Adr.(W), Anz. (B: 0-31)

ldx#1

beq:ende

::1ror0+3

ror0+2

ror0+1

ror0

dex

bne:1

::ende

/

; *********************************************************

; * *

; * aslDWn Adr.(Word), Anzahl *

; * *

; * Verschiebt Inhalt von Adr. bis Adr.+3 Anzahl-mal nach *

; * links, entspricht Multiplikation *2^n *

; * *

; * sinnvoll sind Werte 1 bis 31 *

; * X-Register wird veraendert ! *

; * *

; *********************************************************

:aslDWnm

ldx#1

beq:ende

::1asl0

rol0+1

rol0+2

rol0+3

dex; Carry wird nicht beeinflusst !

bne:1

::ende

/

; *********************************************************

; * *

; * lsrDWn Adr.(Word), Anzahl *

; * *

; * Rotiert Inhalt von Adr. bis Adr.+3 Anzahl-mal nach *

; * links, entspricht Division /2^n *

; * *

; * sinnvoll sind Werte 1 bis 31 *

; * X-Register wird veraendert ! *

; * *

; *********************************************************

:lsrDWnm;Uebergabe: lsrDWn Adr.(W), Anz. (B: 0-31)

ldx#1

beq:ende

::1lsr0+3

ror0+2

ror0+1

ror0

dex; Carry wird nicht beeinflusst !

bne:1

::ende

/

; *********************************************************

; * *

; * OraDW Adresse1(Word), Adresse2(Word) *

; * *

; * Bitweise OR Verknuepfung vom *

; * 32-Bit-Inhalt von Adr.1 bis Adr.1+3 mit *

; * 32-Bit-Inhalt von Adr.2 bis Adr.2+3 *

; * *

; * <Adr.2> = <Adr.1> OR <Adr.2> *

; *********************************************************

:OraDWm;Uebergabe: OraDW S-Adr.(W),D-Adr.(W)

lda0

ora1

sta1

lda0+1

ora1+1

sta1+1

lda0+2

ora1+2

sta1+2

lda0+3

ora1+3

sta1+3

/

; **********************************************************

; * *

; * OraVDW Wert32(Low-Word), Wert32(High-Word), Adr.(Word) *

; * *

; * Bitweise OR Verknuepfung vom *

; * 32-Bit-Wert zum 32-Bit-Inhalt mit *

; * Adr. bis Adr.+3 *

; * *

; * <Adr.> = 32-Bit-Wert OR <Adr.> *

; **********************************************************

:OraVDWm

lda#<0

ora2

sta2

lda#>0

ora2+1

sta2+1

lda#<1

ora2+2

sta2+2

lda#>1

ora2+3

sta2+3

/

; *********************************************************

; * *

; * EorDW Adresse1(Word), Adresse2(Word) *

; * *

; * Bitweise EOR Verknuepfung vom *

; * 32-Bit-Inhalt von Adr.1 bis Adr.1+3 mit *

; * 32-Bit-Inhalt von Adr.2 bis Adr.2+3 *

; * *

; * <Adr.2> = <Adr.1> EOR <Adr.2> *

; *********************************************************

:EorDWm;Uebergabe: EorDW S-Adr.(W),D-Adr.(W)

lda0

eor1

sta1

lda0+1

eor1+1

sta1+1

lda0+2

eor1+2

sta1+2

lda0+3

eor1+3

sta1+3

/

; **********************************************************

; * *

; * EorVDW Wert32(Low-Word), Wert32(High-Word), Adr.(Word) *

; * *

; * Bitweise EOR Verknuepfung vom *

; * 32-Bit-Wert zum 32-Bit-Inhalt mit *

; * Adr. bis Adr.+3 *

; * *

; * <Adr.> = 32-Bit-Wert EOR <Adr.> *

; **********************************************************

:EorVDWm

lda#<0

eor2

sta2

lda#>0

eor2+1

sta2+1

lda#<1

eor2+2

sta2+2

lda#>1

eor2+3

sta2+3

/

; *********************************************************

; * *

; * AndDW Adresse1(Word), Adresse2(Word) *

; * *

; * Bitweise AND Verknuepfung vom *

; * 32-Bit-Inhalt von Adr.1 bis Adr.1+3 mit *

; * 32-Bit-Inhalt von Adr.2 bis Adr.2+3 *

; * *

; * <Adr.2> = <Adr.1> AND <Adr.2> *

; *********************************************************

:AndDWm;Uebergabe: AndDW S-Adr.(W),D-Adr.(W)

lda0

and1

sta1

lda0+1

and1+1

sta1+1

lda0+2

and1+2

sta1+2

lda0+3

and1+3

sta1+3

/

; **********************************************************

; * *

; * AndVDW Wert32(Low-Word), Wert32(High-Word), Adr.(Word) *

; * *

; * Bitweise AND Verknuepfung vom *

; * 32-Bit-Wert zum 32-Bit-Inhalt mit *

; * Adr. bis Adr.+3 *

; * *

; * <Adr.> = 32-Bit-Wert AND <Adr.> *

; **********************************************************

:AndVDWm

lda#<0

and2

sta2

lda#>0

and2+1

sta2+1

lda#<1

and2+2

sta2+2

lda#>1

and2+3

sta2+3

/

; **********************************************************

; * *

; * DecDW Adr.(Word) *

; * *

; * Decrementieren von Adr. bis Adr.+3 *

; * *

; * <Adr.> = <Adr.> - 1 *

; **********************************************************

:DecDWm

dec0

bpl:ende

dec 0+1

bpl:ende

dec 0+2

bpl:ende

dec 0+3

::ende

/

; **********************************************************

; * *

; * IncDW Adr.(Word)