Asembler procesora 6502     Różne procedury      Kompilacja


Aby sprawdzić działanie wszystkich poniższych procedur, były one odpowiednio implementowane
w kodzie programu, który służy do obsługi konsoli NES (Famicom). Polegało to na: umieszczeniu
kodu danej procedury za główną pętlą programu, zdefiniowaniu wszystkich zmiennych używanych
przez daną procedurę, ustawieniu dowolnych wartości argumentów wejściowych oraz wykonaniu
rozgałęzienia do danej procedury. Następnie sprawdza się, czy dane wyjściowe z procedury
zgadzają się z oczekiwanym rezultatem.

Konwersja danych:
NAZWA
OPIS
ARGUMENTY
WEJŚCIOWE
WYJŚCIE
DANYCH
UŻYWANIE
STOSU
ConBDKonwersja bajtu do systemu DEC-ASCIIZAtextbuf1x
ConBDs Konwersja bajtu do systemu DEC-ASCIIZ (szybka) Atextbuf-
Con8DKonwersja 8-bitów do systemu DEC-ASCIIZvar0textbuf-
ConWDKonwersja słowa (16-bit) do systemu DEC-ASCIIZ[var0, var1]textbuf1x
Con16DKonwersja 16-bitów do systemu DEC-ASCIIZ[var0, var1]textbuf-
Con24DKonwersja 24-bitów do systemu DEC-ASCIIZ[var0, var1, var2]textbuf-
Con32DKonwersja 32-bitów do systemu DEC-ASCIIZ[var0, var1, var2, var3] textbuf-
ConBOKonwersja bajtu do systemu OCT-ASCIIZAtextbuf1x
ConBOsKonwersja bajtu do systemu OCT-ASCIIZ (szybka)Atextbuf-
Con8OKonwersja 8-bitów do systemu OCT-ASCIIZvar0textbuf-
Con16OKonwersja 16-bitów do systemu OCT-ASCIIZ[var0, var1]textbuf-
Con24OKonwersja 24-bitów do systemu OCT-ASCIIZ[var0, var1, var2]textbuf-
Con32OKonwersja 32-bitów do systemu OCT-ASCIIZ[var0, var1, var2, var3]textbuf-
ConBHKonwersja bajtu do systemu HEX-ASCIIZAtextbuf-
ConBBKonwersja bajtu do systemu BIN-ASCIIZAtextbuf-

Operacje matematyczne:
NAZWA
OPIS
ARGUMENTY
WEJŚCIOWE
WYJŚCIE
DANYCH
UŻYWANIE
STOSU
Add168Dodawanie bajtu NN do słowa:
[16] + [8] = [16]
[var0, var1] + NN[var0, var1]-
Add1616 Dodawanie 2 słów: [16] + [16] = [16][var0, var1] + [var2, var3] [var0, var1]-
Add248Dodawanie bajtu NN do wartości
24-bitowej: [24] + [8] = [24]
[var0, var1, var2] + NN[var0, var1, var2]-
Add2416Dodawanie słowa do wartości
24-bitowej: [24] + [16] = [24]
[var0, var1, var2]
+ [var3, var4]
[var0, var1, var2]-
Add2424Dodawanie 2 wartości 24-bitowych:
[24] + [24] = [24]
[var0, var1, var2]
+ [var3, var4, var5]
[var0, var1, var2]-
Add328Dodawanie bajtu NN do wartości
32-bitowej: [32] + [8] = [32]
[var0, var1, var2, var3]
+ NN
[var0, var1, var2, var3]-
Add3216Dodawanie słowa do wartości
32-bitowej: [32] + [16] = [32]
[var0, var1, var2, var3]
+ [var4, var5]
[var0, var1, var2, var3]-
Add3224Dodawanie wartości 24-bitowej do
wartości 32-bitowej: [32] + [24] = [32]
[var0, var1, var2, var3]
+ [var4, var5, var6]
[var0, var1, var2, var3]-
Add3232Dodawanie 2 wartości 32-bitowych:
[32] + [32] = [32]
[var0, var1, var2, var3]
+ [var4, var5, var6, var7]
[var0, var1, var2, var3]-
Sub168Odejmowanie bajtu NN od słowa:
[16] - [8] = [16]
[var0, var1] - NN[var0, var1]-
Sub1616Odejmowanie 2 słów: [16] - [16] = [16][var0, var1] - [var2, var3][var0, var1]-
Sub248Odejmowanie bajtu NN od wartości
24-bitowej: [24] - [8] = [24]
[var0, var1, var2] - NN[var0, var1, var2]-
Sub2416Odejmowanie słowa od wartości
24-bitowej: [24] - [16] = [24]
[var0, var1, var2]
- [var3, var4]
[var0, var1, var2]-
Sub2424Odejmowanie 2 wartości 24-bitowych:
[24] - [24] = [24]
[var0, var1, var2]
- [var3, var4, var5]
[var0, var1, var2]-
Sub328Odejmowanie bajtu NN od wartości
32-bitowej: [32] - [8] = [32]
[var0, var1, var2, var3]
- NN
[var0, var1, var2, var3]-
Sub3216Odejmowanie słowa od wartości
32-bitowej: [32] - [16] = [32]
[var0, var1, var2, var3]
- [var4, var5]
[var0, var1, var2, var3]-
Sub3224Odejmowanie wartości 24-bitowej od
wartości 32-bitowej: [32] - [24] = [32]
[var0, var1, var2, var3]
- [var4, var5, var6]
[var0, var1, var2, var3]-
Sub3232Odejmowanie 2 wartości 32-bitowych:
[32] - [32] = [32]
[var0, var1, var2, var3]
- [var4, var5, var6, var7]
[var0, var1, var2, var3]-
Mul88Mnożenie 2 bajtów: [8] * [8] = [16]var0 * var1[var0, var1]-
Mul1616Mnożenie 2 słów: [16] * [16] = [32][var2, var3] * [var4, var5][var0, var1, var2, var3]-
Div88Dzielenie 2 bajtów: [8] / [8] = [8] + [8]var0 / var1var0 + A-
Div1616Dzielenie 2 słów: [16] / [16] = [16] + [16] [var0, var1] / [var2, var3][var0, var1] + [var4, var5] -

Inne:
NAZWA
OPIS
ARGUMENTY
WEJŚCIOWE
WYJŚCIE
DANYCH
UŻYWANIE
STOSU
LenStrLiczenie znaków w ciągu ASCIIZtextbufX-
DelZeroUsuwanie zbędnych zer z wartości ASCIIZtextbuftextbuf-
ClrZeroZamienianie zbędnych zer w wartości ASCIIZ na spacjetextbuftextbuf-
CPUtype Generowanie ciągu ASCIIZ z typem procesora (NMOS/CMOS) -textbuf-
RegPGenerowanie ciągu ASCIIZ z wartościami flag rejestru PPtextbuf2x

Objaśnienia:
A - akumulator (Accumulator)
X - rejestr indeksujący (X index)
P - rejestr stanu (Processor status)
var - zmienna 8-bitowa (RAM)
[var0, var1] - wartość 16-bitowa: var0/var1 - starszy/młodszy bajt
[var0, var1, var2, var3] - wartość 32-bitowa: var0/var3 - najstarszy/najmłodszy bajt
textbuf - pamięć dla danych wejściowych/wyjściowych (RAM)


 ConBD: lda    #$00      ;bajt do konwersji
        ldx    #$00
ConBD0: ldy    #$2F
        clc
        adc    ConBD2,X
ConBD1: iny
        sec
        sbc    ConBD2,X
        cmp    ConBD2,X
        bcs    ConBD1
        pha              ;odkładanie A na stos
        tya
        sta    textbuf,X
        pla              ;przywracanie A ze stosu
        inx
        cpx    #$03
        bne    ConBD0
        lda    #$00
        sta    textbuf,X ;wyjście danych
        rts
ConBD2: .db    $64,$0A,$01

;Maksymalna wartość liczby wyjściowej: "255" ($FF)
;Rozmiar: 40 B, linii kodu: 21
 ConBDs: lda    #$00      ;bajt do konwersji
         ldy    #$2F
         ldx    #$3A
         sec
ConBDs0: iny
         sbc    #$64
         bcs    ConBDs0
ConBDs1: dex
         adc    #$0A
         bmi    ConBDs1
         adc    #$2F
         sty    textbuf
         stx    textbuf+1
         sta    textbuf+2
         lda    #$00
         sta    textbuf+3 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "255" ($FF)
;Rozmiar: 34 B, linii kodu: 17
 Con8D: lda    #$00
        sta    var0      ;bajt do konwersji
        ldx    #$02      ;maksymalna liczba cyfr (-1 cyfra)
Con8D0: ldy    #$09      ;liczba bitów do konwersji (+1 bit)
        lda    #$00
        clc
Con8D1: rol    A
        cmp    #$0A
        bcc    Con8D2
        sbc    #$0A
Con8D2: rol    var0
        dey
        bne    Con8D1
        clc
        adc    #$30
        sta    textbuf,X
        dex
        bpl    Con8D0
        sty    textbuf+3 ;wyjście danych
        rts

;Maksymalna wartość liczby wyjściowej: "255" ($FF)
;Rozmiar: 38 B, linii kodu: 20
 ConWD: lda    #$00
        sta    var0      ;starszy bajt do konwersji
        lda    #$00
        sta    var1      ;młodszy bajt do konwersji
        lda    #$00
        ldx    #$05
ConWD0: sta    textbuf,X
        dex
        bpl    ConWD0
        ldx    #$10
ConWD1: asl    var1
        rol    var0
        txa
        pha              ;odkładanie A na stos
        ldx    #$04
ConWD2: ldy    textbuf,X
        lda    ConWD4,Y
        rol    A
        sta    textbuf,X
        dex
        bne    ConWD2
        rol    textbuf
        pla              ;przywracanie A ze stosu
        tax
        dex
        bne    ConWD1
ConWD3: lda    textbuf,X
        clc
        adc    #$30
        sta    textbuf,X ;wyjście danych
        inx
        cpx    #$05
        bne    ConWD3
        rts
ConWD4: .db    $00,$01,$02,$03,$04,$80,$81,$82,$83,$84

;Maksymalna wartość liczby wyjściowej: "65535" ($FFFF)
;Rozmiar: 78 B, linii kodu: 35
 Con16D: lda    #$00
         sta    var0      ;starszy bajt do konwersji
         lda    #$00
         sta    var1      ;młodszy bajt do konwersji
         ldx    #$04      ;maksymalna liczba cyfr (-1 cyfra)
Con16D0: ldy    #$11      ;liczba bitów do konwersji (+1 bit)
         lda    #$00
         clc
Con16D1: rol    A
         cmp    #$0A
         bcc    Con16D2
         sbc    #$0A
Con16D2: rol    var1
         rol    var0
         dey
         bne    Con16D1
         clc
         adc    #$30
         sta    textbuf,X
         dex
         bpl    Con16D0
         sty    textbuf+5 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "65535" ($FFFF)
;Rozmiar: 46 B, linii kodu: 23
 Con24D: lda    #$00
         sta    var0      ;najstarszy bajt do konwersji
         lda    #$00
         sta    var1
         lda    #$00
         sta    var2      ;najmłodszy bajt do konwersji
         ldx    #$07      ;maksymalna liczba cyfr (-1 cyfra)
Con24D0: ldy    #$19      ;liczba bitów do konwersji (+1 bit)
         lda    #$00
         clc
Con24D1: rol    A
         cmp    #$0A
         bcc    Con24D2
         sbc    #$0A
Con24D2: rol    var2
         rol    var1
         rol    var0
         dey
         bne    Con24D1
         clc
         adc    #$30
         sta    textbuf,X
         dex
         bpl    Con24D0
         sty    textbuf+8 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "16777215" ($FFFFFF)
;Rozmiar: 54 B, linii kodu: 26
 Con32D: lda    #$00
         sta    var0       ;najstarszy bajt do konwersji
         lda    #$00
         sta    var1
         lda    #$00
         sta    var2
         lda    #$00
         sta    var3       ;najmłodszy bajt do konwersji
         ldx    #$09       ;maksymalna liczba cyfr (-1 cyfra)
Con32D0: ldy    #$21       ;liczba bitów do konwersji (+1 bit)
         lda    #$00
         clc
Con32D1: rol    A
         cmp    #$0A
         bcc    Con32D2
         sbc    #$0A
Con32D2: rol    var3
         rol    var2
         rol    var1
         rol    var0
         dey
         bne    Con32D1
         clc
         adc    #$30
         sta    textbuf,X
         dex
         bpl    Con32D0
         sty    textbuf+10 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "4294967295" ($FFFFFFFF)
;Rozmiar: 62 B, linii kodu: 29
 ConBO: lda    #$00      ;bajt do konwersji
        ldx    #$00
ConBO0: ldy    #$2F
        clc
        adc    ConBO2,X
ConBO1: iny
        sec
        sbc    ConBO2,X
        cmp    ConBO2,X
        bcs    ConBO1
        pha              ;odkładanie A na stos
        tya
        sta    textbuf,X
        pla              ;przywracanie A ze stosu
        inx
        cpx    #$03
        bne    ConBO0
        lda    #$00
        sta    textbuf,X ;wyjście danych
        rts
ConBO2: .db    $40,$08,$01

;Maksymalna wartość liczby wyjściowej: "377" ($FF)
;Rozmiar: 40 B, linii kodu: 21
 ConBOs: lda    #$00      ;bajt do konwersji
         ldy    #$2F
         ldx    #$38
         sec
ConBOs0: iny
         sbc    #$40
         bcs    ConBOs0
ConBOs1: dex
         adc    #$08
         bmi    ConBOs1
         adc    #$2F
         sty    textbuf
         stx    textbuf+1
         sta    textbuf+2
         lda    #$00
         sta    textbuf+3 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "377" ($FF)
;Rozmiar: 34 B, linii kodu: 17
 Con8O: lda    #$00
        sta    var0      ;bajt do konwersji
        ldx    #$02      ;maksymalna liczba cyfr (-1 cyfra)
Con8O0: ldy    #$09      ;liczba bitów do konwersji (+1 bit)
        lda    #$00
        clc
Con8O1: rol    A
        cmp    #$08
        bcc    Con8O2
        sbc    #$08
Con8O2: rol    var0
        dey
        bne    Con8O1
        clc
        adc    #$30
        sta    textbuf,X
        dex
        bpl    Con8O0
        sty    textbuf+3 ;wyjście danych
        rts

;Maksymalna wartość liczby wyjściowej: "377" ($FF)
;Rozmiar: 38 B, linii kodu: 20
 Con16O: lda    #$00
         sta    var0      ;starszy bajt do konwersji
         lda    #$00
         sta    var1      ;młodszy bajt do konwersji
         ldx    #$05      ;maksymalna liczba cyfr (-1 cyfra)
Con16O0: ldy    #$11      ;liczba bitów do konwersji (+1 bit)
         lda    #$00
         clc
Con16O1: rol    A
         cmp    #$08
         bcc    Con16O2
         sbc    #$08
Con16O2: rol    var1
         rol    var0
         dey
         bne    Con16O1
         clc
         adc    #$30
         sta    textbuf,X
         dex
         bpl    Con16O0
         sty    textbuf+6 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "177777" ($FFFF)
;Rozmiar: 46 B, linii kodu: 23
 Con24O: lda    #$00
         sta    var0      ;najstarszy bajt do konwersji
         lda    #$00
         sta    var1
         lda    #$00
         sta    var2      ;najmłodszy bajt do konwersji
         ldx    #$07      ;maksymalna liczba cyfr (-1 cyfra)
Con24O0: ldy    #$19      ;liczba bitów do konwersji (+1 bit)
         lda    #$00
         clc
Con24O1: rol    A
         cmp    #$08
         bcc    Con24O2
         sbc    #$08
Con24O2: rol    var2
         rol    var1
         rol    var0
         dey
         bne    Con24O1
         clc
         adc    #$30
         sta    textbuf,X
         dex
         bpl    Con24O0
         sty    textbuf+8 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "77777777" ($FFFFFF)
;Rozmiar: 54 B, linii kodu: 26
 Con32O: lda    #$00
         sta    var0       ;najstarszy bajt do konwersji
         lda    #$00
         sta    var1
         lda    #$00
         sta    var2
         lda    #$00
         sta    var3       ;najmłodszy bajt do konwersji
         ldx    #$0A       ;maksymalna liczba cyfr (-1 cyfra)
Con32O0: ldy    #$21       ;liczba bitów do konwersji (+1 bit)
         lda    #$00
         clc
Con32O1: rol    A
         cmp    #$08
         bcc    Con32O2
         sbc    #$08
Con32O2: rol    var3
         rol    var2
         rol    var1
         rol    var0
         dey
         bne    Con32O1
         clc
         adc    #$30
         sta    textbuf,X
         dex
         bpl    Con32O0
         sty    textbuf+11 ;wyjście danych
         rts

;Maksymalna wartość liczby wyjściowej: "37777777777" ($FFFFFFFF)
;Rozmiar: 62 B, linii kodu: 29
 ConBH: lda    #$00      ;bajt do konwersji
        ldx    #$00
ConBH0: tay
        cpx    #$00
        bne    ConBH1
        and    #$F0
        ror    A
        ror    A
        ror    A
        ror    A
ConBH1: and    #$0F
        clc
        adc    #$30
        cmp    #$3A
        bmi    ConBH2
        clc
        adc    #$07      ;adc #$27 - małe litery (a-f)
ConBH2: sta    textbuf,X
        tya
        inx
        cpx    #$02
        bne    ConBH0
        lda    #$00
        sta    textbuf,X ;wyjście danych
        rts

;Maksymalna wartość liczby wyjściowej: "FF" ($FF)
;Procedura generuje duże lub małe litery (a-f)
;Rozmiar: 42 B, linii kodu: 25
 ConBB: lda    #$00      ;bajt do konwersji
        ldx    #$00
ConBB0: rol    A
        tay
        lda    #$30
        bcc    ConBB1
        lda    #$31
ConBB1: sta    textbuf,X
        tya
        inx
        cpx    #$08      ;liczba bitów do konwersji
        bne    ConBB0
        lda    #$00
        sta    textbuf,X ;wyjście danych
        rts

;Maksymalna wartość liczby wyjściowej: "11111111" ($FF)
;Rozmiar: 27 B, linii kodu: 15
 Add168: clc
         lda    var1    ;młodszy bajt słowa
         adc    #$01    ;bajt NN
         sta    var1    ;młodszy bajt wyniku
         bcc    Add168a
         inc    var0    ;starszy bajt słowa/wyniku
Add168a: rts            ;Z=1 i C=1 jeśli wynik >65535

;Rozmiar: 15 B, linii kodu: 7

Add168: clc lda var1 ;młodszy bajt słowa adc #$01 ;bajt NN sta var1 ;młodszy bajt wyniku lda var0 ;starszy bajt słowa adc #$00 sta var0 ;starszy bajt wyniku rts ;C=1 jeśli wynik >65535 ;Rozmiar: 18 B, linii kodu: 8
Add1616: clc
         lda    var1 ;młodszy bajt 1 słowa
         adc    var3 ;młodszy bajt 2 słowa
         sta    var1 ;młodszy bajt wyniku
         lda    var0 ;starszy bajt 1 słowa
         adc    var2 ;starszy bajt 2 słowa
         sta    var0 ;starszy bajt wyniku
         rts         ;C=1 jeśli wynik >65535

;Rozmiar: 20 B, linii kodu: 8
 Add248: clc
         lda    var2    ;najmłodszy bajt wartości
         adc    #$01    ;bajt NN
         sta    var2    ;najmłodszy bajt wyniku
         bcc    Add248a
         inc    var1
         bne    Add248a
         inc    var0    ;najstarszy bajt wartości/wyniku
Add248a: rts            ;Z=1 i C=1 jeśli wynik >16777215

;Rozmiar: 20 B, linii kodu: 9

Add248: clc lda var2 ;najmłodszy bajt wartości adc #$01 ;bajt NN sta var2 ;najmłodszy bajt wyniku lda var1 adc #$00 sta var1 lda var0 ;najstarszy bajt wartości adc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=1 jeśli wynik >16777215 ;Rozmiar: 26 B, linii kodu: 11
 Add2416: clc
          lda    var2     ;najmłodszy bajt wartości
          adc    var4     ;młodszy bajt słowa
          sta    var2     ;najmłodszy bajt wyniku
          lda    var1
          adc    var3     ;starszy bajt słowa
          sta    var1
          bcc    Add2416a
          inc    var0     ;najstarszy bajt wartości/wyniku
Add2416a: rts             ;Z=1 i C=1 jeśli wynik >16777215

;Rozmiar: 25 B, linii kodu: 10

Add2416: clc lda var2 ;najmłodszy bajt wartości adc var4 ;młodszy bajt słowa sta var2 ;najmłodszy bajt wyniku lda var1 adc var3 ;starszy bajt słowa sta var1 lda var0 ;najstarszy bajt wartości adc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=1 jeśli wynik >16777215 ;Rozmiar: 28 B, linii kodu: 11
Add2424: clc
         lda    var2 ;najmłodszy bajt 1 wartości
         adc    var5 ;najmłodszy bajt 2 wartości
         sta    var2 ;najmłodszy bajt wyniku
         lda    var1
         adc    var4
         sta    var1
         lda    var0 ;najstarszy bajt 1 wartości
         adc    var3 ;najstarszy bajt 2 wartości
         sta    var0 ;najstarszy bajt wyniku
         rts         ;C=1 jeśli wynik >16777215

;Rozmiar: 29 B, linii kodu: 11
 Add328: clc
         lda    var3    ;najmłodszy bajt wartości
         adc    #$01    ;bajt NN
         sta    var3    ;najmłodszy bajt wyniku
         bcc    Add328a
         inc    var2
         bne    Add328a
         inc    var1
         bne    Add328a
         inc    var0    ;najstarszy bajt wartości/wyniku
Add328a: rts            ;Z=1 i C=1 jeśli wynik >4294967295

;Rozmiar: 25 B, linii kodu: 11

Add328: clc lda var3 ;najmłodszy bajt wartości adc #$01 ;bajt NN sta var3 ;najmłodszy bajt wyniku lda var2 adc #$00 sta var2 lda var1 adc #$00 sta var1 lda var0 ;najstarszy bajt wartości adc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=1 jeśli wynik >4294967295 ;Rozmiar: 34 B, linii kodu: 14
 Add3216: clc
          lda    var3     ;najmłodszy bajt wartości
          adc    var5     ;młodszy bajt słowa
          sta    var3     ;najmłodszy bajt wyniku
          lda    var2
          adc    var4     ;starszy bajt słowa
          sta    var2
          bcc    Add3216a
          inc    var1
          bne    Add3216a
          inc    var0     ;najstarszy bajt wartości/wyniku
Add3216a: rts             ;Z=1 i C=1 jeśli wynik >4294967295

;Rozmiar: 30 B, linii kodu: 12

Add3216: clc lda var3 ;najmłodszy bajt wartości adc var5 ;młodszy bajt słowa sta var3 ;najmłodszy bajt wyniku lda var2 adc var4 ;starszy bajt słowa sta var2 lda var1 adc #$00 sta var1 lda var0 ;najstarszy bajt wartości adc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=1 jeśli wynik >4294967295 ;Rozmiar: 36 B, linii kodu: 14
 Add3224: clc
          lda    var3     ;najmłodszy bajt 1 wartości
          adc    var6     ;najmłodszy bajt 2 wartości
          sta    var3     ;najmłodszy bajt wyniku
          lda    var2
          adc    var5
          sta    var2
          lda    var1
          adc    var4     ;najstarszy bajt 2 wartości
          sta    var1
          bcc    Add3224a
          inc    var0     ;najstarszy bajt 1 wartości/wyniku
Add3224a: rts             ;Z=1 i C=1 jeśli wynik >4294967295

;Rozmiar: 34 B, linii kodu: 13

Add3224: clc lda var3 ;najmłodszy bajt 1 wartości adc var6 ;najmłodszy bajt 2 wartości sta var3 ;najmłodszy bajt wyniku lda var2 adc var5 sta var2 lda var1 adc var4 ;najstarszy bajt 2 wartości sta var1 lda var0 ;najstarszy bajt 1 wartości adc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=1 jeśli wynik >4294967295 ;Rozmiar: 37 B, linii kodu: 14
Add3232: clc
         lda    var3 ;najmłodszy bajt 1 wartości
         adc    var7 ;najmłodszy bajt 2 wartości
         sta    var3 ;najmłodszy bajt wyniku
         lda    var2
         adc    var6
         sta    var2
         lda    var1
         adc    var5
         sta    var1
         lda    var0 ;najstarszy bajt 1 wartości
         adc    var4 ;najstarszy bajt 2 wartości
         sta    var0 ;najstarszy bajt wyniku
         rts         ;C=1 jeśli wynik >4294967295

;Rozmiar: 38 B, linii kodu: 14
 Sub168: sec
         lda    var1    ;młodszy bajt słowa
         sbc    #$01    ;bajt NN
         sta    var1    ;młodszy bajt wyniku
         bcs    Sub168a
         dec    var0    ;starszy bajt słowa/wyniku
Sub168a: rts

;Rozmiar: 15 B, linii kodu: 7

Sub168: sec lda var1 ;młodszy bajt słowa sbc #$01 ;bajt NN sta var1 ;młodszy bajt wyniku lda var0 ;starszy bajt słowa sbc #$00 sta var0 ;starszy bajt wyniku rts ;C=0 jeśli wynik <0 ;Rozmiar: 18 B, linii kodu: 8
Sub1616: sec
         lda    var1 ;młodszy bajt 1 słowa
         sbc    var3 ;młodszy bajt 2 słowa
         sta    var1 ;młodszy bajt wyniku
         lda    var0 ;starszy bajt 1 słowa
         sbc    var2 ;starszy bajt 2 słowa
         sta    var0 ;starszy bajt wyniku
         rts         ;C=0 jeśli wynik <0

;Rozmiar: 20 B, linii kodu: 8
 Sub248: sec
         lda    var2    ;najmłodszy bajt wartości
         sbc    #$01    ;bajt NN
         sta    var2    ;najmłodszy bajt wyniku
         lda    var1
         sbc    #$00
         sta    var1
         bcs    Sub248a
         dec    var0    ;najstarszy bajt wartości/wyniku
Sub248a: rts

;Rozmiar: 23 B, linii kodu: 10

Sub248: sec lda var2 ;najmłodszy bajt wartości sbc #$01 ;bajt NN sta var2 ;najmłodszy bajt wyniku lda var1 sbc #$00 sta var1 lda var0 ;najstarszy bajt wartości sbc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=0 jeśli wynik <0 ;Rozmiar: 26 B, linii kodu: 11
 Sub2416: sec
          lda    var2     ;najmłodszy bajt wartości
          sbc    var4     ;młodszy bajt słowa
          sta    var2     ;najmłodszy bajt wyniku
          lda    var1
          sbc    var3     ;starszy bajt słowa
          sta    var1
          bcs    Sub2416a
          dec    var0     ;najstarszy bajt wartości/wyniku
Sub2416a: rts

;Rozmiar: 25 B, linii kodu: 10

Sub2416: sec lda var2 ;najmłodszy bajt wartości sbc var4 ;młodszy bajt słowa sta var2 ;najmłodszy bajt wyniku lda var1 sbc var3 ;starszy bajt słowa sta var1 lda var0 ;najstarszy bajt wartości sbc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=0 jeśli wynik <0 ;Rozmiar: 28 B, linii kodu: 11
Sub2424: sec
         lda    var2 ;najmłodszy bajt 1 wartości
         sbc    var5 ;najmłodszy bajt 2 wartości
         sta    var2 ;najmłodszy bajt wyniku
         lda    var1
         sbc    var4
         sta    var1
         lda    var0 ;najstarszy bajt 1 wartości
         sbc    var3 ;najstarszy bajt 2 wartości
         sta    var0 ;najstarszy bajt wyniku
         rts         ;C=0 jeśli wynik <0

;Rozmiar: 29 B, linii kodu: 11
 Sub328: sec
         lda    var3    ;najmłodszy bajt wartości
         sbc    #$01    ;bajt NN
         sta    var3    ;najmłodszy bajt wyniku
         lda    var2
         sbc    #$00
         sta    var2
         lda    var1
         sbc    #$00
         sta    var1
         bcs    Sub328a
         dec    var0    ;najstarszy bajt wartości/wyniku
Sub328a: rts

;Rozmiar: 31 B, linii kodu: 13

Sub328: sec lda var3 ;najmłodszy bajt wartości sbc #$01 ;bajt NN sta var3 ;najmłodszy bajt wyniku lda var2 sbc #$00 sta var2 lda var1 sbc #$00 sta var1 lda var0 ;najstarszy bajt wartości sbc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=0 jeśli wynik <0 ;Rozmiar: 34 B, linii kodu: 14
 Sub3216: sec
          lda    var3     ;najmłodszy bajt wartości
          sbc    var5     ;młodszy bajt słowa
          sta    var3     ;najmłodszy bajt wyniku
          lda    var2
          sbc    var4     ;starszy bajt słowa
          sta    var2
          lda    var1
          sbc    #$00
          sta    var1
          bcs    Sub3216a
          dec    var0     ;najstarszy bajt wartości/wyniku
Sub3216a: rts

;Rozmiar: 33 B, linii kodu: 13

Sub3216: sec lda var3 ;najmłodszy bajt wartości sbc var5 ;młodszy bajt słowa sta var3 ;najmłodszy bajt wyniku lda var2 sbc var4 ;starszy bajt słowa sta var2 lda var1 sbc #$00 sta var1 lda var0 ;najstarszy bajt wartości sbc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=0 jeśli wynik <0 ;Rozmiar: 36 B, linii kodu: 14
 Sub3224: sec
          lda    var3     ;najmłodszy bajt 1 wartości
          sbc    var6     ;najmłodszy bajt 2 wartości
          sta    var3     ;najmłodszy bajt wyniku
          lda    var2
          sbc    var5
          sta    var2
          lda    var1
          sbc    var4     ;najstarszy bajt 2 wartości
          sta    var1
          bcs    Sub3224a
          dec    var0     ;najstarszy bajt 1 wartości/wyniku
Sub3224a: rts

;Rozmiar: 34 B, linii kodu: 13

Sub3224: sec lda var3 ;najmłodszy bajt 1 wartości sbc var6 ;najmłodszy bajt 2 wartości sta var3 ;najmłodszy bajt wyniku lda var2 sbc var5 sta var2 lda var1 sbc var4 ;najstarszy bajt 2 wartości sta var1 lda var0 ;najstarszy bajt 1 wartości sbc #$00 sta var0 ;najstarszy bajt wyniku rts ;C=0 jeśli wynik <0 ;Rozmiar: 37 B, linii kodu: 14
Sub3232: sec
         lda    var3 ;najmłodszy bajt 1 wartości
         sbc    var7 ;najmłodszy bajt 2 wartości
         sta    var3 ;najmłodszy bajt wyniku
         lda    var2
         sbc    var6
         sta    var2
         lda    var1
         sbc    var5
         sta    var1
         lda    var0 ;najstarszy bajt 1 wartości
         sbc    var4 ;najstarszy bajt 2 wartości
         sta    var0 ;najstarszy bajt wyniku
         rts         ;C=0 jeśli wynik <0

;Rozmiar: 38 B, linii kodu: 14
 Mul88: lda    #$00
        clc
        ldx    #$08
Mul88a: bcc    Mul88b
        clc
        adc    var0   ;bajt 1
Mul88b: ror    A
        ror    var1   ;bajt 2, młodszy bajt wyniku
        dex
        bpl    Mul88a
        sta    var0   ;starszy bajt wyniku
        rts

;Rozmiar: 22 B, linii kodu: 12
 Mul1616: lda    #$00
          sta    var1
          clc
          ldx    #$10
Mul1616a: bcc    Mul1616b
          clc
          lda    var1
          adc    var5     ;młodszy bajt 1 słowa
          sta    var1
          lda    var0
          adc    var4     ;starszy bajt 1 słowa
Mul1616b: ror    A
          sta    var0     ;najstarszy bajt wyniku
          ror    var1
          ror    var2     ;starszy bajt 2 słowa
          ror    var3     ;młodszy bajt 2 słowa, najmłodszy bajt wyniku
          dex
          bpl    Mul1616a
          rts

;Rozmiar: 43 B, linii kodu: 19
 Div88: lda    #$00
        ldx    #$08
Div88a: asl    var0   ;bajt 1
        rol    A      ;bajt z niepodzieloną resztą
        cmp    var1   ;bajt 2
        bcc    Div88b
        inc    var0   ;bajt wyniku
        sbc    var1
Div88b: dex
        bne    Div88a
        rts

;Jeśli var1 (bajt 2) > var0 (bajt 1): wynik = $00, reszta = var0 (bajt 1).
;Po dzieleniu przez 0: wynik = $FF, reszta = var0 (bajt 1) (0/0 i 255/1 dają taki sam rezultat).

;Rozmiar: 23 B, linii kodu: 11
 Div1616: lda    #$00
          sta    var4
          sta    var5
          ldx    #$10
Div1616a: asl    var1     ;młodszy bajt 1 słowa/wyniku
          rol    var0     ;starszy bajt 1 słowa/wyniku
          rol    var5     ;młodszy bajt słowa z niepodzieloną resztą
          rol    var4     ;starszy bajt słowa z niepodzieloną resztą
          sec
          lda    var5
          sbc    var3     ;młodszy bajt 2 słowa
          tay
          lda    var4
          sbc    var2     ;starszy bajt 2 słowa
          bcc    Div1616b
          inc    var1
          sty    var5
          sta    var4
Div1616b: dex
          bne    Div1616a
          rts

;Jeśli [var2, var3] (słowo 2) > [var0, var1] (słowo 1): wynik = $0000, reszta = [var0, var1] (słowo 1).
;Po dzieleniu przez 0: wynik = $FFFF, reszta = [var0, var1] (słowo 1) (0/0 i 65535/1 dają taki sam
;rezultat).

;Rozmiar: 51 B, linii kodu: 21
 LenStr: ldx    #$FF
LenStr0: inx              ;liczba znaków (maks. 255)
         lda    textbuf,X
         bne    LenStr0
         rts

;Rozmiar: 9 B, linii kodu: 5
 DelZero: ldx    #$FF
          ldy    #$FF
DelZero0: inx
          lda    textbuf,X
          beq    DelZero3
          cmp    #$30
          beq    DelZero0
          dex
          cpx    #$FF
          beq    DelZero2
DelZero1: inx
          iny
          lda    textbuf,X
          sta    textbuf,Y
          bne    DelZero1
DelZero2: rts
DelZero3: sta    textbuf+1
          rts

;Rozmiar: 34 B, linii kodu: 18
 ClrZero: ldx    #$00
          lda    textbuf,X
ClrZero0: cmp    #$30
          beq    ClrZero1
          rts
ClrZero1: lda    #$20      ;znak spacji
          sta    textbuf,X
          inx
          lda    textbuf,X
          bne    ClrZero0
          lda    #$30
          dex
          sta    textbuf,X
          rts

;Rozmiar: 28 B, linii kodu: 14
 CPUtype: ldx    #$FF
CPUtype0: inx               ;kopiowanie ciągu ASCIIZ do wyjścia danych
          lda    CPUtype2,X
          sta    textbuf,X
          bne    CPUtype0
          sed               ;sprawdzanie typu procesora
          lda    #$99
          clc
          adc    #$01
          cld
          bne    CPUtype1   ;typ NMOS
          lda    #$43
          sta    textbuf+10 ;zmiana 11 znaku ciągu ASCIIZ
CPUtype1: rts
CPUtype2: .db    "CPU type: NMOS",0

;Rozmiar: 41 B, linii kodu: 15
 RegP: php               ;odkładanie P na stos
       ldx    #$00
       ldy    #$FF
RegP0: iny
       lda    RegP2,X
       sta    textbuf,Y
       iny
       lda    #$3A
       sta    textbuf,Y
       iny
       pla               ;załadowanie P ze stosu do A
       rol    A
       pha               ;odkładanie A na stos
       lda    #$30
       bcc    RegP1
       lda    #$31
RegP1: sta    textbuf,Y
       iny
       lda    #$20
       sta    textbuf,Y
       inx
       cpx    #$08
       bne    RegP0
       lda    #$00
       sta    textbuf,Y
       pla               ;przywracanie A ze stosu
       rts
RegP2: .db    "NV-BDIZC"

;Rozmiar: 57 B, linii kodu: 28