RETRO KUTAK – tehnologija prošlih decenija

Kako do slučajnih brojeva u asembleru

Ovaj tekst (C64 – CAKE 1) pokazuje dva praktična načina dobijanja slučajnih brojeva na Commodore 64 u asemblerskim programima:
(1) korišćenjem BASIC RND rutine na adresi $E097 (rezultat u $88–$8F, najčešće $8C),
(2) oslanjanjem na generator šuma SID čipa (čitanje iz $D41B uz podešen šum na kanalu 3).
U prvom primeru ekran se puni sporije (floating-point rutina i zauzimanje registara); u drugom, popunjavanje ekrana je trenutno, ali “troši” treći zvučni kanal.
Na kraju je dat i treći program za samostalnu analizu i eksperimente.

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.

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *