; 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
/