; Makros fuer den 32-Bit Zugriff

; Revision 20.08..1996

; (w) by Holger G. Heimes, ai25he(at)bg.bib.de

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

; *

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

; *

; * Legt 32-Bit-Wert in Adresse ab

; *

; * <Adresse> = 32-Bit-Wert

; *

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

:LoadDW m

lda #<P1

sta P0

lda #>P1

sta P0+1

lda #<P2

sta P0+2

lda #>P2

sta P0+3

/

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

; *

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

; *

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

; *

; * <Ziel> = <Quelle>

; *

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

:MoveDW m

lda P0

sta P1

lda P0+1

sta P1+1

lda P0+2

sta P1+2

lda P0+3

sta P1+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>

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

:AddDW m

lda P0

clc

adc P1

sta P1

lda P0+1

adc P1+1

sta P1+1

lda P0+2

adc P1+2

sta P1+2

lda P0+3

adc P1+3

sta P1+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.>

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

:AddVDW m

lda #<P0

clc

adc P2

sta P2

lda #>P0

adc P2+1

sta P2+1

lda #<P1

adc P2+2

sta P2+2

lda #>P1

adc P2+3

sta P2+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>

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

:SubDW m

lda P1

sec

sbc P0

sta P1

lda P1+1

bcs :1 ;kein Unterlauf

sec

sbc #1

::1 sbc P0+1

sta P1+1

lda P1+2

bcs :2 ;kein Unterlauf

sec

sbc #1

::2 sbc P0+2

sta P1+2

lda P1+3

bcs :3 ;kein Unterlauf

sec

sbc #1

::3 sbc P0+3

sta P1+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

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

:SubVDW m

ldx #0

lda P2

sec

sbc #<P0

sta P2

lda P2+1

bcs :1

sec

sbc #1

::1 sbc #>P0

sta P2+1

lda P2+2

bcs :2

sec

sbc #1

::2 sbc #<P1

sta P2+2

lda P2+3

bcs :3

sec

sbc #1

::3 sbc #>P1

sta P2+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

; *

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

:CmpDW m

lda P0+3

cmp P1+3

bne ::ende

lda P0+2

cmp P1+2

bne ::ende

lda P0+1

cmp P1+1

bne ::ende

lda P0

cmp P1

::ende

/

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

; *

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

; *

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

; * 32-Bit-Wert

; *

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

:CmpDWI m

lda P0+3

cmp #>P2

bne ::ende

lda P0+2

cmp #<P2

bne ::ende

lda P0+1

cmp #>P1

bne ::ende

lda P0

cmp #<P1

::ende

/

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

; *

; * PushDW Adr.(Word)

; *

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

; *

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

:PushDW m

lda P0+3

pha

lda P0+2

pha

lda P0+1

pha

lda P0

pha

/

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

; *

; * PopDW Adr.(Word)

; *

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

; * in Adr. bis Adr.+3 ab

; *

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

:PopDW m

lda P0

pla

lda P0+1

pla

lda P0+2

pla

lda P0+3

pla

/

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

; *

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

; *

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

; *

; * gueltig sind BIT-Nummern von 0 bis 31

; *

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

:sbDWn m

lda P1

cmp #15

bgt :32bit

lda P0

ora #<2^P2

sta P0

lda P0+1

ora #>2^P2

sta P0+1

bne :ende

::32bit lda P0+2

ora #<2^(P1-16)

sta P0+2

lda P1+3

ora #>2^(P1-16)

sta P1+3

::ende

/

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

; *

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

; *

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

; *

; * gueltig sind BIT-Nummern von 0 bis 31

; *

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

:cbDWn m

lda P1

cmp #15

bgt :32bit

lda P0

and #<$ffff-2^P2

sta P0

lda P0+1

and #>$ffff-2^P2

sta P0+1

bne :ende

::32bit ldaP0+2

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

sta P0+2

lda P1+3

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

sta P1+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 !

; *

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

:rolDWn m

ldx #P1

beq :ende

::1 rol P0

rol P0+1

rol P0+2

rol P0+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 !

; *

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

:rorDWn m

ldx #P1

beq :ende

::1 ror P0+3

ror P0+2

ror P0+1

ror P0

dex

bne :1

::ende

/