Rom rutiinit

Aloittaja virgo, elokuu 25, 2013, 00:32

« edellinen - seuraava »

virgo

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     


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




Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500

virgo


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
Genetic-PET C64 BBS:
g-point.tunk.org port 1025

Genetic-point Amiga BBS:
g-point.tunk.org port 500