silloin kauvan sitten kun aloitin ohjelmoinnin C64lla
ja pitkään sen jälkeenkin yksi asia oli mystiikkaa ja on edelleen
commodoren "käyttiksen" omat rutiinit niitä on paljon noin 16kiloa
osotteissa
1. $A000-BFFF ja
2. $E000-FFFF
1. sijaitsee koneen Basic kielen kriittiset osat
2. sisältää erinäisen läjän alirutiineita jotka hoitavat kriittisemmät
tehtävät kuten resetin toimenpiteet ja muistien alustamisen
muutaman mainitakseni
harvemin tarvitaan konekieltä ohjelmoitaessa 1. rommia
mutta jos aikoo lisätä Basic käskyjä koneeseen
sen on kohtalaisen helppoa
koskaan en ole tutustunut aiheeseen mutta tiedän että se on helppoa
siksi siitä en hirveästi ala höpisemään koska se menee kuitenkin metsää joku muu
joka tietää enemmän C64 Basic hommeleistä voi paneutua tähän aiheeseen
koska kone kielessä yleensä tuo muisti on turhaa ja hyvin vähän käytettyä se yleensä poistetaan ensimmäisenä
että päästään käsiksi muistiin sen alla
ja käytetään suoraan kutsuja ylempään rommin
tarkoitus olisi tässä ketjussa keskittyäkin pelkästään ylemmän Rommin kutsuihin
ja miten niitä hyötykäytetään ja vähennetään siten tarvittavaa koodin vääntöä
kun osa rutiineista on siellä jo valmiiksi.
viimeisin puristus itselläni oli tuo BH stage editori joka on ensimmäinen ever ohjelma joka toimii täysin ilman keskeytyksiä
ja hyödyntää suurelta osin käyttiksen omia rutiineita mikä oli minulle täysin uusi kokemus
ohjelmien tekijöille ehkä tärkeimmät rutiinit ovat Load & Save
tutustutaan ensin Load rutiiniin ja miten sitä käytetään kone kielessä
se on itse asiassa melko helppoa kun sen vain haltsaa
Tässä lainaus Commodore Reference guidesta
B-15. Function Name: LOAD
Purpose: Load RAM from device
Call address: $FFD5 (hex) 65493 (decimal)
Communication registers: A, X, Y
Preparatory routines: SETLFS, SETNAM
Error returns: 0,4,5,8,9, READST
Stack requirements: None
Registers affected: A, X, Y
Description: This routine LOADs data bytes from any input device di-
rectly into the memory of the Commodore 64. It can also be used for a
verify operation, comparing data from a device with the data already in
memory, while leaving the data stored in RAM unchanged.
The accumulator (.A) must be set to 0 for a LOAD operation, or 1 for a
verify, If the input device is OPENed with a secondary address (SA) of 0
the header information from the device is ignored. In this case, the X
and Y registers must contain the starting address for the load. If the
device is addressed with a secondary address of 1, then the data is
loaded into memory starting at the location specified by the header. This
routine returns the address of the highest RAM location loaded.
Before this routine can be called, the KERNAL SETLFS, and SETNAM
routines must be called.
+-----------------------------------------------------------------------+
| NOTE: You can NOT LOAD from the keyboard (0), RS-232 (2), or the |
| screen (3). |
+-----------------------------------------------------------------------+
How to Use:
0) Call the SETLFS, and SETNAM routines. If a relocated load is de-
sired, use the SETLFS routine to send a secondary address of 0.
1) Set the A register to 0 for load, 1 for verify.
2) If a relocated load is desired, the X and Y registers must be set
to the start address for the load.
3) Call the routine using the JSR instruction.
286 BASIC TO MACHINE LANGUAGE
EXAMPLE:
;LOAD A FILE FROM TAPE
LDA #DEVICE1 ;SET DEVICE NUMBER
LDX #FILENO ;SET LOGICAL FILE NUMBER
LDY CMD1 ;SET SECONDARY ADDRESS
JSR SETLFS
LDA #NAME1-NAME ;LOAD A WITH NUMBER OF
;CHARACTERS IN FILE NAME
LDX #<NAME ;LOAD X AND Y WITH ADDRESS OF
LDY #>NAME ;FILE NAME
JSR SETNAM
LDA #0 ;SET FLAG FOR A LOAD
LDX #$FF ;ALTERNATE START
LDY #$FF
JSR LOAD
STX VARTAB ;END OF LOAD
STY VARTA B+1
JMP START
NAME .BYT 'FILE NAME'
NAME1 .BYT 9
(http://xn--tss%20lainaus%20commodore%20reference%20guidesta
kuten yllä ohjeistetaan pitää kutsua kahta alirutiinia ennen itse load rutiiniin menoa
SETLFS ja SETNAM
SETLFS ohjelma määrittelee laitteen minkä kanssa keskustellaan
Basic kielellä tarkoitetaan Load lauseen lopussa sijaitsevia numeroita
esim. ",8,1"
usein näkee porukan oikaisevan tämän ja sijoittavan tarvittavat arvot suoraan
oikeisiin nollasivun osoitteisiin
lda #8
sta $B8 ; Current Logical File Number
lda #1
sta $B9 ;Current Secondary Address
käytts kutsulla rimpsu on hieman lyhyempi kirjoittaa
LDA #8
LDX #1
LDY #0
JSR SETLFS
Seuraava kutsuttava rutiini on SETNAM
jolla määritellään File nimi joka levyltä haetaan
LDA #6 ;nimen pituus
LDX #<NAME ;missä osoitteessa nimi sijaitsee alatavu
LDY #>NAME ; --""-- Ylätavu
JSR SETNAM
vasta näiden rutiini toimenpiteiden jälkeen voimme kutsua load rutiinia
LDA #0 ; 0=Load 1=Verify
TAX
TAY
JSR LOAD
tämä on normaali load rutiini joka sijoittaa ladatun ohjelman ensimmäisten 2 tavun osoittamaan paikkaan
nämä kaksi tavua tallennetaan levylle Save yhteydessä
mutta jos haluamme sijoittaa ohjelman mielivaltaisesti muualle pitää muistaa kaksi asiaa
ensimmäinen
LDA #8
LDX #0
LDY #0
JSR SETLFS
"esimerkki",8 <-- vastaa Basic komentoa
secindary address pitää olla nolla
muuten ohjelma luetaan edellä kuvatulla tavalla
sitten haemme ohjelman nimen kuten aikaisemminkin
tämän jälkeen kutsumme Load rutiinia seuraavasti
lataus-osoite = $1000
LDA #0
LDX #<lataus-osoite
LDY #>lataus-osoite
JMP LOAD
nyt hieman tietoa mitä sitten tapahtuu kun Load komento on annettu
itse LOAD kutsu on Rom piirillä osoitteessa $FFD5
tuolla alueella sijaitsee niin sanottu JUMP TABLE hyppytaulukko
jossan on peräkkäin JMP $xxxx komentoja osa on muodossa JMP ($xxxx)
seuratkaamme nyt mitä tapahtuu osoitteessa $FFD5
FFD5 JMP $F49E hyppäämme siis seuraavaksi tähän ositteeseen
F49E STX $C3 ; load rutiinia kutsuttaessa annetut X. Y. rekisterit tallennetaan nollasivulle
F4A0 STY $C4
F4A2 JMP ($0330) kutsumme varsinaista Load rutiinia
JMP ($xxxx) käsky on siitä hauska että se hakee hypättävän osoitteen itselleen annetusta paikasta
kyseisellä tavalla on helppoa muutella hyppy osoitteita ilman koodiin kajoamista
tähän käskyyn liittyy myös yksi 6502 sarjan prosessorien bugeista
joka sattaa joissain tapauksissa aiheuttaa paljonkin harmaita hiuksia koodareille ellei tätä tiedä
jos muitipakka seuraavanlainen sisältö
033F FF FE
ja hyppy olisi sinne seuraava
JMP ($033F) oletus olisi että prosessori tekisi seuraavanlaisen hypyn JMP $FEFF
mutta koska logiikassa on Bugi tapahtuu seuraavaa
0330 00 00 00 00
........
033F FF FE FF FF
prosessori muodostaa hyppy osoitteen viimeisen ositteen ja ensimmäisen kesken seuraavasti
JMP $FF00 seurauksena on luultavasti ohjelman kaatuminen ja erittäin ärsyttävä ohjelma bugin metsästys
mitä siis tapahtuu kun load Rutini kutsuu osoitetta JMP ($0330)
0330 A5 F4
Prosessori hakee hyppy osoitteen 0330 muistipaikasta ja muodostaa seuraavanlaisen hypyn
JMP $F4A5 josta löytyy varsinainen load ohjelma
tämän toimintaa on syvällisemmin selvitetty lataus osoite keskustelussa
http://www.com64.net/foorumi/index.php?topic=707.0 (http://www.com64.net/foorumi/index.php?topic=707.0)
jos haluamme käyttää Load rutiinia kuten Basic sitä käyttää
voimme kutsua LOAD ohjelmaa suoraan JMP ($0330) komennolla
tällöin x. y. rekistereiden arvoilla ei silloin ole mitään merkitystä
ainoastaan SETLFS aliohjelmalle annetun secondary address
arvolla on merkitystä sijoitetaanko ohjelma samaan osoitteeseen mistä se on levylle
tallennettukin vai ladataanko se def osoitteeseen $0801
$C3-C4 rekistereissä sijaitsee tämä def latauspaikka
joita siis muutetaan jos käytämme hyppytaulukon antamaa kutsua LOAD rutiiniin