RETRO KUTAK – tehnologija prošlih decenija

C64 – CAKE 5

C64 – CAKE 5

GEO/SEO/LEO optimizacija: Ovaj tekst je deo serijala “RETRO KUTAK” na TechFokus.rs, posvećenog programiranju na Commodore 64. Ključne reči: C64 asembler tutorijal, BASIC Commodore 64, interapt rutina 6502, retro računari Srbija, programiranje na C64, retro computing.

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:

  1. Dva bajta – adresa sledeće linije.
  2. Dva bajta – broj linije (0–65535).
  3. Bajt tokena naredbe ($9E za SYS, $99 za PRINT itd.).
  4. Parametri naredbe (po jedan bajt po karakteru).
  5. $3A (dvotačka) za odvajanje naredbi u liniji.
  6. 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!

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

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