Kako do slučajnih brojeva u asembleru
C64 – CAKE 1: Kako do slučajnih brojeva u asembleru
Audio recenzija teksta. Preslušajte…
Prošli smo sito i rešeto — standardni BASIC, Simon’s BASIC i asembler. Nadamo se da su vam prethodni tekstovi bili korisni. U ovoj mini-seriji “CAKE” radićemo male, ali praktične cake koje vam mogu značiti u programiranju na legendarnom “debeljku”.
Tema: slučajni brojevi u asemblerskim/mašinskim programima na C64.
1) Prvi način: BASIC RND rutina na $E097
Možemo pozvati podprogram koji koristi BASIC interpreter (floating-point). Rutina se nalazi na adresi $E097. Rezultat ostavlja u lokacijama $88–$8F; najčešće čitamo $8C. Primer ispod popunjava ekran slučajnim karakterima.
; *= $1000 ; program kreće od adrese $1000
*= $1000
LDA #0 ; praznimo akumulator
STA 2 ; niži bajt ekranske memorije
LDA #4
STA 3 ; viši bajt ekranske memorije
LDY #0
STY 4 ; privremeno skladište za Y (rutina RND koristi registre)
OPET
JSR $E097 ; BASIC RND rutina (generiše slučajan broj)
LDA $8C ; uzmi generisanu vrednost
LDY 4
STA (2),Y ; upiši u ekran ($0400–$07E7)
INY
STY 4 ; čuvamo Y jer RND koristi registre
BNE OPET ; iteriramo 0→255→0
INC 3
LDX 3
CPX #8 ; kraj ekrana?
BNE OPET
RTS
Napomena: Iako je brže od čistog BASIC-a, ovo i dalje nije “brzo za asembler”, jer floating-point rutina troši vreme i registre. Postoji bolja (i brža) opcija.
2) Drugi način: SID šum generator na kanalu 3
SID čip ima generator šuma koji možemo iskoristiti kao izvor slučajnosti. Kada uključimo šum na kanalu 3 i čitamo $D41B, dobijamo “random” bajtove. Primer ispod popunjava ekran praktično trenutno.
; *= $1000
*= $1000
LDA #$FF
STA $D40E ; frekvencija kanala 3 (low)
STA $D40F ; frekvencija kanala 3 (high)
LDA #$80
STA $D412 ; forma talasa = šum (bit 7)
LDA #0
STA 2 ; niži bajt ekranske memorije
LDA #4
STA 3 ; viši bajt ekranske memorije
LDY #0
OPET
LDA $D41B ; random iz SID-a (kanal 3 šum)
STA (2),Y ; upiši na ekran
INY
BNE OPET
INC 3
LDX 3
CPX #8 ; kraj ekrana?
BNE OPET
RTS
Trade-off: koristimo treći zvučni kanal. Moguće je privremeno “pozajmljivanje” kanala za generisanje brojeva i vraćanje na zvuk, ali to može izazvati “tišinu” ili neželjen šum tokom rada.
3) Program za vežbu (analiza i modifikacije)
Ispod je složeniji primer bez objašnjenja. Ideja je da ga sami raščlanite koristeći naučeno — menjajte vrednosti, brišite/dodajte linije i posmatrajte ponašanje.
*= $1000
LDA #$3B
STA $D011
LDA #$1C
STA $D018
LDA #$FF
STA $D40E
STA $D40F
LDA #$80
STA $D412
SVEOPET
LDA #0
STA 2
LDA #$20
STA 3
LDY #0
LDA #0
STA 4
LDA #0
STA $FB
LDA #4
STA $FC
OPET
LDA $D41B
LDY 4
STA (2),Y
INY
STY 4
BNE OPET
INC 3
LDX 3
CPX #$40
BNE OPET
OPET2
LDA $D41B
STA ($FB),Y
INY
BNE OPET2
INC $FC
LDX $FC
CPX #8
BNE OPET2
JMP SVEOPET
RTS
Zaključak
Za brzo generisanje slučajnih bajtova u realnom vremenu — SID šum ($D41B) je praktičan i munjevito brz. Ako vam je bitna kompatibilnost sa BASIC-om ili rad sa floating-pointom, poziv $E097 radi posao, ali je znatno sporiji. Igrajte se, testirajte, menjajte — tako se učilo i nekad, i sada!
To je sve za danas. Veliki pozdrav.

