C64 – CAKE 5
C64 – CAKE 5
Dobrodošli u nove cake! Za danas smo pripremili nešto veoma interesantno. Šta kažete da pišemo BASIC ili mašinski program, kucamo tekst ili slično dok se istovremeno menjaju boje u borderu ili svira neka muzika u pozadini? To je moguće postići interapt rutinom (programskim prekidima) za proširenje mogućnosti kernala (operativnog sistema) preusmeravanjem toka programa putem interapt vektora operativnog sistema na naš program i izvršavanje istog u intervalima sa stalnim vraćanjem na sistemski tok.
Osim ove, na kraju teksta imamo još jednu malu caku.
Rad sa interaptima (prekidima)
Primer 1
*= $1000 |
sei ; setujemo I-bit registra i ne dozvoljavamo prekide |
lda #$10 ; unosimo u akumulator niži bit adrese rutine |
sta $0314 ; smeštamo niži bajt adrese prekida |
lda #$10 ; unosimo viši bajt adrese rutine |
sta $0315 ; smeštamo viši bajt adrese prekida |
cli ; omogućavamo prekide |
rts ; kraj programa |
*= $1010 ; adresa početka rutine |
inc $d020 ; menja boju bordera |
jmp $ea31 ; vraća kontrolu sistemu |
U ovom primeru treba obratiti pažnju na memorijske lokacije $0314 i $0315 koje sadrže niži i viši bajt adrese rutine. Kada se program startuje, sistemski tok skače na našu rutinu i izvršava je. Zatim se vraća na lokaciju $EA31 od koje se nastavlja normalan rad sistema. Rezultat je da možemo raditi bilo šta dok se u pozadini stalno menja boja okvira.
Primer 2
*= $1000 |
sei ; blokiramo prekide tokom menjanja vektora |
lda #<rutina ; niži bajt adrese rutine |
sta $0314 ; smeštamo niži bajt |
lda #>rutina ; viši bajt adrese rutine |
sta $0315 ; smeštamo viši bajt |
cli ; omogućavamo prekide |
rts ; kraj programa |
rutina ; početak rutine |
inc 2 ; uvećavamo memorijsku lokaciju |
lda 2 ; učitavamo vrednost |
sta $0500 ; smeštamo u ekran |
inc 2 |
lda 2 |
sta $0501 |
jmp $ea31 ; vraćamo kontrolu sistemu |
U ovom primeru velikom brzinom se smenjuju dva karaktera u ekranskoj memoriji. Kada dođe do skrolovanja ekrana, ovi karakteri kopiraju svoje trenutno stanje i stvaraju zanimljiv vizuelni efekat. Strelice #<rutina
i #>rutina
označavaju niži i viši bajt adrese rutine.
Manipulacijom interapt vektora možemo ubaciti bilo koju rutinu koja će se stalno izvršavati dok radimo druge zadatke.
Unos BASIC linije iz asemblera
BASIC programska linija (prva počinje od adrese $0801
) ima sledeću strukturu:
- Dva bajta – adresa sledeće linije.
- Dva bajta – broj linije (0–65535).
- Bajt tokena naredbe (
$9E
za SYS,$99
za PRINT itd.). - Parametri naredbe (po jedan bajt po karakteru).
$3A
(dvotačka) za odvajanje naredbi u liniji.- Bajt
0
za kraj linije.
Primer
*= $0801 ; početak BASIC programa |
.word sledeci ; pointer sledeće linije |
.word 10 ; broj linije |
.byte $9e ; token SYS |
text „4096“ ; SYS 4096 |
.byte 0 ; kraj linije |
sledeci .word 0 ; dve nule označavaju kraj programa |
*= $4096 ; adresa početka mašinskog programa |
// unos daljeg asemblerskog koda // |
Ovako automatski unosimo BASIC liniju iz asemblera — posle izvršavanja, u BASIC-u će se pojaviti linija 10 SYS 4096
spremna za pokretanje.
Program za razmišljanje
*= $1000 |
ldx #0 |
lda #10 |
sta broj |
lda #$0b |
sta adresak |
lda #$08 |
sta adresak+1 |
ldy #5 |
opet |
lda adresak |
sta $0801,x |
lda adresak+1 |
sta $0802,x |
lda broj |
sta $0803,x |
lda #0 |
sta $0804,x |
lda #$99 |
sta $0805,x |
lda #$22 |
sta $0806,x |
lda #“p“ |
sta $0807,x |
lda #“r“ |
sta $0808,x |
lda #$22 |
sta $0809,x |
lda #0 |
sta $080a,x |
txa |
adc #10 |
tax |
lda broj |
clc |
adc #10 |
sta broj |
lda adresak |
clc |
adc #10 |
sta adresak |
dey |
bne opet |
rts |
adresak .word 0 |
broj .byte 0 |
Šta mislite da ovaj program radi? (Mala pomoć: ima veze sa BASIC programskim linijama.)
To je sve za danas. Veliki pozdrav!