Makro rozkazy
REQ, RNE, RPL, RMI, RCC, RCS, RVC, RVS
SEQ, SNE, SPL, SMI, SCC, SCS, SVC, SVS
JEQ, JNE, JPL, JMI, JCC, JCS, JVC, JVS
Zadaniem makro rozkazów jest skrócenie czasu pisania programu i samego listingu. Makro rozkazy zastępują grupy często powtarzających się mnemoników.
REQ, RNE, RPL, RMI, RCC, RCS, RVC, RVS
W/w makro rozkazy swoimi nazwami nawiązują do odpowiednich mnemoników 6502, odpowiednio BEQ
, BNE
, BPL
, BMI
, BCC
, BCS
, BVC
, BVS
. Posiadają dodatkową właściwość jaką jest skok do poprzednio asemblowanej instrukcji, np.:
lda:cmp:req 20 -> lda 20
-> wait cmp 20
-> beq wait
ldx #0 -> ldx #0
mva:rne $500,x $600,x+ -> loop lda $500,x
-> sta $600,x
-> inx
-> bne loop
SEQ, SNE, SPL, SMI, SCC, SCS, SVC, SVS
W/w makro rozkazy swoimi nazwami nawiązują do odpowiednich mnemoników 6502, odpowiednio BEQ
, BNE
, BPL
, BMI
, BCC
, BCS
, BVC
, BVS
. Posiadają dodatkową właściwość jaką jest skok do następnej asemblowanej instrukcji, np.:
lda #40 -> lda #40
add:sta $80 -> clc
scc:inc $81 -> adc $80
-> sta $80
-> bcc skip
-> inc $81
-> skip
JEQ, JNE, JPL, JMI, JCC, JCS, JVC, JVS
W/w makro rozkazy swoimi nazwami nawiązują do odpowiednich mnemoników 6502, odpowiednio BEQ
, BNE
, BPL
, BMI
, BCC
, BCS
, BVC
, BVS
. Posiadają dodatkową właściwość jaką jest skok warunkowy pod wskazany adres, z ich pomocą możemy skakać nie tylko w zakresie -128..+127 bajtów ale w całym zakresie 64kB np.:
jne dest -> beq *+4
-> jmp dest
Jeśli skok jest krótki (zakres -128..+127) wówczas MADS użyje krótkiego skoku, odpowiednio BEQ
, BNE
, BPL
, BMI
, BCC
, BCS
, BVC
, BVS
.
ADD, SUB
W/w makro rozkazy realizują odpowiednio zwiększenie/zmniejszenie bajtu pamięci bez zapisywania wyniku (wynik w akumulatorze CPU).
ADD -> CLC SUB -> SEC
-> ADC ... -> SBC ...
ADB, SBB
W/w makro rozkazy realizują odpowiednio zwiększenie/zmniejszenie bajtu pamięci z zapisaniem wyniku.
ADB SRC #$40 -> LDA SRC ADB A B C -> LDA A
-> CLC -> CLC
-> ADC #$40 -> ADC B
-> STA SRC -> STA C
SBB SRC #$80 -> LDA SRC SBB A B C -> LDA A
-> SEC -> SEC
-> SBC #$80 -> SBC B
-> STA SRC -> STA C
ADW, SBW
W/w makro rozkazy realizują odpowiednio zwiększenie/zmniejszenie słowa pamięci z zapisaniem wyniku.
ADW SRC #$40 -> CLC ADW A B C -> CLC
-> LDA SRC -> LDA A
-> ADC #$40 -> ADC B
-> STA SRC -> STA C
-> SCC -> LDA A+1
-> INC SRC+1 -> ADC B+1
-> STA C+1
ADW SRC #$40 SRC -> CLC
-> LDA SRC
-> ADC #$40
-> STA SRC
-> LDA SRC+1
-> ADC #$00
-> STA SRC+1
SBW SRC #$4080 -> SEC SBW A B C -> SEC
-> LDA SRC -> LDA A
-> SBC <$4080 -> SBC B
-> STA SRC -> STA C
-> LDA SRC+1 -> LDA A+1
-> SBC >$4080 -> SBC B+1
-> STA SRC+1 -> STA C+1
PHR, PLR
W/w makro rozkazy swoimi nazwami nawiązują do odpowiednich mnemoników 6502, odpowiednio PHA
, PLA
, realizują odkładanie na stosie i zdejmowanie ze stosu rejestrów A
, X
, Y
.
PHR -> PHA PLR -> PLA
-> TXA -> TAY
-> PHA -> PLA
-> TYA -> TAX
-> PHA -> PLA
INW, INL, IND, DEW, DEL, DED
Makro rozkazy INW
, INL
, IND
realizują zwiększenie odpowiednio słowa pamięci (.WORD
), długiego słowa pamięci (.LONG
), podwójnego słowa pamięci (.DWORD
).
Makro rozkazy DEW
, DEL
, DED
realizują zmniejszenie odpowiednio słowa pamięci (.WORD
), długiego słowa pamięci (.LONG
), podwójnego słowa pamięci (.DWORD
) i wykorzystują w tym celu akumulator CPU (zawartość akumulatora ulega zmianie po wykonaniu makro rozkazów DEW
, DEL
, DED
).
inw dest -> inc dest -> inc dest
-> bne skip -> sne
-> inc dest+1 -> inc dest+1
-> skip ->
dew dest -> lda dest -> lda dest
-> bne skip -> sne
-> dec dest+1 -> dec dest+1
-> skip dec dest -> dec dest
MVA, MVX, MVY
Makro rozkazy MVA
, MVX
, MVY
służą do przenoszenia bajtów (.BYTE
) pamięci przy pomocy rejestrów CPU odpowiednio A
, X
, Y
. Użycie opcji OPT R+
pozwala na potencjalne skrócenie kodu wynikowego dla następujących po sobie makro rozkazów MVA
, MVX
, MVY
.
lda src -> mva src dst
sta dst ->
ldy $10,x -> mvy $10,x $a0,x
sty $a0,x ->
ldx #$10 -> mvx #$10 dst
stx dst ->
MWA, MWX, MWY
Makro rozkazy MWA
, MWX
, MWY
służą do przenoszenia słów (.WORD
) pamięci przy pomocy rejestrów CPU odpowiednio A
, X
, Y
. Użycie opcji OPT R+
pozwala na potencjalne skrócenie kodu wynikowego dla następujących po sobie makro rozkazów MWA
, MWX
, MWY
.
ldx <adr -> mwx #adr dst
stx dst ->
ldx >adr ->
stx dst+1 ->
mwa #0 $80 -> lda #0 mwy #$3040 $80 -> ldy <$3040
-> sta $80 -> sty $80
-> sta $81 -> ldy >$3040
-> sty $81
mwa ($80),y $a000,x -> lda ($80),y
-> sta $a000,x
-> iny
-> lda ($80),y
-> sta $a001,x
CPB, CPW, CPL, CPD
Makro rozkazy CPB
, CPW
, CPL
, CPD
realizują porównanie wartości odpowiednich typów, odpowiednio .BYTE
, .WORD
, .LONG
, .DWORD
.
cpw temp #$4080
bcc skip
cpd v0 v1
beq skip