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