Menu

Näytä viestit

Tämä jakso sallii sinun katsoa tämän jäsenen kaikkia viestejä. Huomaa, että näet vain niiden alueiden viestit, joihin sinulla on nyt pääsy.

Näytä viestit Menu

Viestit - virgo

#841
Bitin Nypläys / 6502 konekieli Indirect
elokuu 25, 2013, 03:51
tuossa jo sivusin aihetta mutta avataampa tälle oma alueensa

keskitytään ensin Indirect osoitus muotoon

selkein aluksi
muistipaikka
$1000    00 20 80 80

A. 2000 4C 00 10  JMP $1000
B. 2000 6C 00 10 JMP ($1000)

kaksi melkein saman näköistä hyppykäskyä (Basic Goto)
eroa näissä käskyissä on suoritus ajassa sekä toiminnassa

A hyppää muistipaikkaan $1000 ja törmää siellä ensimmäiseen Tavuun joka on nolla konekielessä käsky BRK eli tapahtuu ohjemallinen keskeytys yleensä kaataa koneen
B. lukee ensin Tavut $1000 muisti paikasta ja saatujen tavujen kanssa muodostaa hypyn $2000 osoitteeseen huomaa kone kielen osoite muoto Alempi tavu ylempitavu

tämä sama osoite muoto näkyy deassemblerin tulostamassa koodissa missä tapauksessa A. ensimmäinen tavu on itse konekieli komento 4C = JMP
seuraavat tavut 00 ja 10 ovat hyppy osoite $1000

B. 6C = JMP ( ja 00 10 = $1000)

ongelma tulee tapauksessa B. jos
2000 6C FF 10  JMP ($10FF) hyppy on tämän näköinen
6510 tai 6502 eivät osaa suorittaa tätä komentoa oikein
koska prosessori noukkii hypyn ylemmän tavun väärästä paikkaa tässä tapauksessa osoiteesta $1000 ja alemman $10FF
osa kääntäjistä osaa tulkita tämän virheeksi ja varoittavat tästä mutta ohjelmoijan on silti hyvä tietää että on mahdollista että näin saattaa käydä

sama ongelma koskee melkein kaikkia kyseistä Indirect osoitusta käyttävistä käskyistä
A. LDA ($FF),y
B. LDA ($FF,X)
näillä komennoilla saattaisi olla sama ongema mutta tähän liittyy toinekin juttu osoiteesta 0$100-01FF on prosessorin Stak pino alue joka
taatusti sekoittaa ylemmän tavun osoituksen samoin pinon lukeminen tuntuu sekoittavan koneen
samon miten X. ja Y. rekisterin käyttö tässä yhteydessä poikkeaan toisistaan

LDA ($F0.x) / LDA ($F0),y    kohdistaisi käskyn hakemaan dataa soitteesta $1000

nollasivu
00F0   00 10 00 20 00 30 00 40
muisti
1000    10 11 12 13 14 15 16 17 18
2000     20 21 22 23 24 25 26 27 28
3000     30 31 32 33 34 35 36 37 38
4000      40 41 42 43 44 45 46 47 48
5000       50 51 52 53 54 55 56 57 58
Y. toiminta

Y = nolla LDA käsky hakee osoitteesta $F0 = $1000 Akkuun tallentuu luku $10
Y= yksi --""-- $11 ($1000+1)
Y=seitsemän --""-- $17 ($1000+7)
eli $F0 nollasivulla annettuun osoitteeseen $1000 +Y

X. toiminta
(tätä muotoa käytetään yleensä parillisilla numeroilla)
X= nolla LDA käsky hakee osoitteesta $F0 00 10 =$1000 Akkuun tallentuu Arvo $10
X= yksi käsky hakee osoitteesta $F1  10 00 =$0010 --""-- tallentuu nollasivun arvo osoitteesta $10
X= kaksi --""-- $F2  00 20 =$2000 akkuun tallentuu $20
X= neljä --""-- $F4  00 30 =$3000 --""-- $30
X= viisi --""-- $F5    30 00 =$0030 Akkuun latautuu niollasivun $30 arvo

kuten esimerkistä huomaamme X. rekisteri lisää luettavan paikan kohtaa $F0+X
varmin konsti käyttää tätä on kertoa X annettava luku aina x2 ettei exytä parittomille osoitteille
esim.
LDA #1
ASL
TAX
LDA ($F0,x)

saman lainalaisuudet koskevat muistakin tämän osoitus muodon hallitsevat käskyt
niitä ovat
ORA =OR whit A
EOR = EXOR whit A
AND = AND whit A
SBC = minus whit A
ADC = Plus whit A
CMP = Vertailu whit A


#842
Bitin Nypläys / Vs: Rom rutiinit
elokuu 25, 2013, 01:00

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
#843
Bitin Nypläys / Rom rutiinit
elokuu 25, 2013, 00:32
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




#844
Bitin Nypläys / Vs: 2013 ohjelmointi kisa
elokuu 24, 2013, 22:51
heh muutettu kisan otsikko pyydetyyn muotoon xD
eli loppu vuosi aikaa
#845
kenttä suunnittelioita ei ole ilmaantunut ???
#846
tuossa sinulle sitten heti testattava ohjelma xD
tublasidi musiikilla Ala Slimex  :worship:

http://www.com64.net/foorumi/index.php?action=dlattach;topic=537.0;attach=248
#847
tarkoitat varmaan tätä xD

Commodore OS Vision
#848
C64 ohjelmille kannattaa antaa oletus softaksi tuo vice x64 niin lähtevät klikkaamalla käyntiin

ainakin Linukassa toimii tiedä sitten Raspereistä tms. ikkunasoftista

ohjelma on todellakin pieni kooltaan olisi varmaan aikanaan mennyt hienosti yhdensivun MB data listauksena
enkä olisi lainkaan yllättynyt vaikka tuollainen softa siellä olisi jo ollutkin ;)
#849
sattuipa tänään että ilmeisesti palvelin oli alhaalla noin tunnin eikä sivulle siis päässyt tuona aikana lainkaan :-/
#850
ensimmäinen fet testi !
nyt jäähdytys ripaa fetille ja rasitus koe paljon kestää ja paljonko tuottaa ;)
#851
en sitten malttanut jättää tätä ongelmaa ratkaisematta :(
no en olisi kuitenkaan saanut unta miettiessäni tätä asiaa
joten tekaisin sitten valmiin rutiinin ja vielä auto käynnistyksellä
...tai siis auto linkkauksella jos tarkkoja ollaan
olkaa hyvät ja kiitoksia haasteesta  :old:

ohjelma on poikkeuksellisesti Turbo Assembler yhteensopiva

ohjelma lähtee toimimaan heti latauksensa jälkeen
kunhan muistaa lisätä sen ,8,1 ykkösen
seuraavan latauksen yhteydessä kerrotaan lataus osoitteet
vaikka lataisit vain hakemiston
ohjelma sijaitsee kasettipuskurin alueella joka pyyhkiintyy resetin aikana
siksi se on mainio paikka kopiointi suojauksille

ohjelman käynnistymisen kikka on siinä että
lataus osoite on $0330 osoitteesta alas päin tämä on Load käskyn vectori
josta normaalisti siirrytään varsinaiseen lataus rutiiniin joka ylempänä on ollut esilläkin
samoin uusi rutiini on suurelta osin alkuperäisen kopio muutamalla lisä ominaisuudella
load vectorin alla on vielä Save ohjelman oma vectori joka luonnollisesti edelleen osoittaa
alkuperäiseen rutiiniin
koska ohjelman alku osoite alkaa Load wectorin kohdalta pystymme saman tien muuttamaan
vectorin osoitetta haluamaamme paikkaan tällä kertaa omaan load rutiiniimme "start"

tämän jälkeen alkaa oma ohjelmamme joka melkein täyttää koko vapaan tilan
jos ohjelmaan vielä lisäileen paljon ominaisuuksia se pukkaa latauksessa
$0400 osoiteesta eteenpäin näyttö muistiin mikä ei ole hyvä asia ;)

ja sitten ohjelman sorsa koodi itse ohjelma on linkki fileenä

;----------------------
; UUSI Load rutiini  --
; tallentaa ladattava--
; ohjelman sijainnin --
; $FE-FF tavuihin    --
; ---------------------

    *=$0330 ; LOAD vectori MUUTETAAN LATAUKSEN AIKANA

; Set new Load address
.WORD  start ;LOAD ADDRESS
.WORD  $F5ED ;SAVE

start           jsr F4A5 ; käydään ensin lataamassa haluttu ohjelma
                jmp show ; tulostamme osoitteet ja poistumme
               
F4A5         STA $93
F4A7         LDA #$00
F4A9          STA $90
F4AB          LDA $BA
F4AD          BNE F4B2
F4AF          JMP $F713

F4B2          CMP #$03
F4B4          BEQ F4AF
F4B6          BCC F533
F4B8          LDY $B7
F4BA          BNE F4BF
F4BC          JMP $F710

F4BF          LDX $B9
F4C1          JSR $F5AF ; Loading message
F4C4          LDA #$60
F4C6    STA $B9
F4C8    JSR $F3D5 ; open io
F4CB    LDA $BA
F4CD    JSR $ED09 ; send talk
F4D0    LDA $B9
F4D2    JSR $EDC7 ;send secondary address
F4D5    JSR $EE13 ;input low address
F4D8    STA $AE
                STA $FE   ;tallennetaan oma low pointteri
F4DA    LDA $90
F4DC    LSR
F4DD    LSR
F4DE    BCS F530
F4E0    JSR $EE13 ;input Hi address
F4E3    STA $AF
                STA $FF   ;tallennetaan oma hi pointteri
F4E5    TXA
F4E6    BNE F4F0
F4E8            LDA $C3
STA $AE
STA $FE
LDA $C4
STA $AF
STA $FF
JMP $F4F0

F4F0    JMP $F4F0
F530 JMP $F530
F533 JMP $F533
;-----------------------
hex            .text "0123456789abcdef"
print
               pha
               lsr
               lsr
               lsr
               lsr
               tax
               lda hex,x
               jsr $ffd2
               pla
               and #$0f
               tax
               lda hex,x
               jsr $ffd2
               rts
;-------------------------
show           lda #" "
               jsr $ffd2
               lda #"$"
               jsr $ffd2
               lda $ff
               jsr print
               lda $fe
               jsr print
               lda #"-"
               jsr $ffd2
               lda #"$"
               jsr $ffd2
               lda $af
               jsr print
               lda $ae
               jsr print
               rts                                     
#852
Slimex
action reblayssa on tosiaankin ehkä paras konekieli monitori ewer
itse myös käyttelen tuota moduli imagea helpottamaan vicellä koodausta
sen omalla monitorilla ei oikeasti tee muuta kuin tarkistaa
mitä muistissa tapahtuu

(Action reblay ei muuten näytä lataus osoitteita jos ei emulaatori ole realdrive moodissa ?)

varsinkin kun ei ole aitoa nyt käsillä.
uusi poweri edelleen vasta suunnittelu pöydällä

SyyPori6510
jos se on toimivana komeroon laitettu ei siinä pitäisi kovin isoja vikoja olla
ilmoittelet vaikka mulle jos haluut sen korjattavaksi käyn poris noin 3viikon välein
oletus et asut siellä xD

toki hajonneet emot huolitaan myös varaosa varastoon jos olet hukkaamassa sitä

suosittelen alkuun C64 ohjelmointi ympäristöksi pieneen kokeiluun Turbo Assembleria
http://www.com64.net/foorumi/index.php?topic=656.0

#853
jep
1541 on todellakin monimutkainen laite siksi olenkin koittanut pysyä sen sielun elämästä erillään xD

ainoa ero taitaa olla se ettei sillä ole käyttö muistia kuin kaksi kiloa
muuten se on ihan oma tietokoneensa ja osaa tehdä itsenäisesti hommiaan

yksi esimerkki siitä on Verify komento jonka se suorittaa täysin ilman isäntäkoneen apua
kunhan ei yritä sulkea komento kanavaa

muutama kopiointi ohjelma käyttää tätä kikkaa ja levyasemat suorittavat kopioinnin keskenään

suorasaanti kikalla homma toimii mutta siitä aiheutuu hurjasti ylimääräistä koodia
joudut avaamaan tiedosto kanavan ilmoittamaan tiedosto nimen lukea kaksi tavua sulkea kanava plus tarkistamaan tapahtuvat virheet
ja tämän jälkeen kutsua load rutiinia

millaisia ohjelmointi työkaluja (ohjelmia) käytät ?
#854
palataapa alkuu taas
eli aluksi ehdottamani $C3 ja C4 tallentuu ohjelman lataus osoite jos se on kerrottu load rutiinille
muuten käytetään vakioarvoa ($0801)
yllä kuvatulla tavalla $FFD5 osoitteesta löytyy hypyn seuraavanlainen tallennus pätkä

LOAD
$FFD5 JMP  ($F49E)


; load ram from a device

F49E   86 C3      STX $C3
F4A0   84 C4      STY $C4
F4A2   6C 30 03   JMP ($0330)   ; normally $F4A5

; standard load ram entry

F4A5   85 93      STA $93
F4A7   A9 00      LDA #$00
F4A9   85 90      STA $90
F4AB   A5 BA      LDA $BA
F4AD   D0 03      BNE $F4B2
F4AF   4C 13 F7   JMP $F713

F4B2   C9 03      CMP #$03
F4B4   F0 F9      BEQ $F4AF
F4B6   90 7B      BCC $F533
F4B8   A4 B7      LDY $B7
F4BA   D0 03      BNE $F4BF
F4BC   4C 10 F7   JMP $F710

F4BF   A6 B9      LDX $B9
F4C1   20 AF F5   JSR $F5AF ; Loading message
F4C4   A9 60      LDA #$60
F4C6   85 B9      STA $B9
F4C8   20 D5 F3   JSR $F3D5 ; open io
F4CB   A5 BA      LDA $BA
F4CD   20 09 ED   JSR $ED09 ; send talk
F4D0   A5 B9      LDA $B9
F4D2   20 C7 ED   JSR $EDC7 ;send secondary address
F4D5   20 13 EE   JSR $EE13 ;input serial haetaan ensimmäinen tavu
F4D8   85 AE      STA $AE ;ohjelman ensimmäinen tavu (lataus osoitteen alempi tavu)
F4DA   A5 90      LDA $90 ;luetaan ST rekisteri
F4DC   4A         LSR
F4DD   4A         LSR
F4DE   B0 50      BCS $F530 ;virhekanavan tarkistus hyppy jos virhe tapahtunut
F4E0   20 13 EE   JSR $EE13  ;haetaan seuraava tavu
F4E3   85 AF      STA $AF  ;tallenetaan ylätävu
F4E5   8A         TXA ;rivillä F4BF luetaan secondary address X rekisteriin
F4E6   D0 08      BNE $F4F0 ;jos <> kuin nolla jatketaan latausta $AE-AF saaduilla arvoilla (load"*",8,1
F4E8   A5 C3      LDA $C3 ;jos X =0 kätetään vakio arvoja $0801 tai annettuja X. Y. arvoja (load "*",8)
F4EA   85 AE      STA $AE
F4EC   A5 C4      LDA $C4
F4EE   85 AF      STA $AF
F4F0   20 D2 F5   JSR $F5D2


eli ohjelma ei ilmeiseti tallenna missään vaiheessa alku osoitetta !! :(

mutta jos teemme oman rutiinin missä tämä tallennus onnistuu $FE-FF osoitteisiin niin ongelma selvitetty
malli rutiini on sijoitettu näyttö muistin yläpuolella sijaitsevaan kasetti puskuriin joka on levy toimintojen ajan käyttämätön


; oma Load aloitus rutiini

    *=$033c ; Kasetti Bufferi

; Set new Load address

SET       
        LDA #<F4A5
        STA $0330
        LDA #>F4A5
        STA $0331
        RTS

F4A5   85 93      STA $93
F4A7   A9 00      LDA #$00
F4A9   85 90      STA $90
F4AB   A5 BA      LDA $BA
F4AD   D0 03      BNE F4B2
F4AF   4C 13 F7   JMP $F713

F4B2   C9 03      CMP #$03
F4B4   F0 F9      BEQ F4AF
F4B6   90 7B      BCC F533
F4B8   A4 B7      LDY $B7
F4BA   D0 03      BNE F4BF
F4BC   4C 10 F7   JMP $F710

F4BF   A6 B9      LDX $B9
F4C1   20 AF F5   JSR $F5AF ; Loading message
F4C4   A9 60      LDA #$60
F4C6   85 B9      STA $B9
F4C8   20 D5 F3   JSR $F3D5 ; open io
F4CB   A5 BA      LDA $BA
F4CD   20 09 ED   JSR $ED09 ; send talk
F4D0   A5 B9      LDA $B9
F4D2   20 C7 ED   JSR $EDC7 ;send secondary address
F4D5   20 13 EE   JSR $EE13 ;input low address
F4D8   85 AE      STA $AE
                              STA $FE   ;tallennetaan oma low pointteri
F4DA   A5 90      LDA $90
F4DC   4A         LSR
F4DD   4A         LSR
F4DE   B0 50      BCS F530
F4E0   20 13 EE   JSR $EE13 ;input Hi address
F4E3   85 AF      STA $AF
                           STA $FF   ;tallennetaan oma hi pointteri
F4E5   8A         TXA
F4E6   D0 08      BNE F4F0
              JMP $F4E8
F4F0              JMP $F4F0


Tämä on täysin teoreettista pohdintaa eikä koodia ole testattu mutta idea tästä varmasti selviää  :old:
#855
omien pikaisten testien perusteella se ilmoittaa ladatun ohjelman loppu osoitteen +1
eli jos on tarkoitus ladata jokin toinen ohjelma pätkä heti edellisen perään niin
$AE-$AF löytyy osoite millä tuo onnistuu
eli jos ohjelma latautuu esim. $1000-1FFF

$AE-$AF osoitteista löytyy seuraava luku $2000

sama luku löytyy heti load rutiinin jälkeen X jaY rekisteristä


ladatessa load rutiinia kutsuttaessa
ohjelman omaan osoitteeseen load "",8,1

   LDA #0
   TAX
   TAY
   JMP LOAD

mutta jos annamme X ja Y lle muun arvon kuin 0 lataamme ohjelman minne itse haluamme

  LDA #0
  LDX #<OHJELMA
  LDY #>OHJELMA
  JMP LOAD

lisää load ja Save rutiineista mainiolta coodari sivustolta
http://codebase64.org/doku.php?id=base:dos_examples

Ps. suosittelen lataamaan foorumilta linkittämäni ohjelmointi raamatun
C64 Refrence Guiden
http://www.com64.net/foorumi/index.php?topic=680.0
C64 Rom purettuna Assempleriksi
http://www.ffd2.com/fridge/docs/c64-diss.html

edit:
lisätty linkkejä