:pondering:
En varmaan osaa oikein googlea käyttää kun en löydä vastausta otsikon mukaiseen kysymykseen, että kuinka saa kaiveltua esille tiedoston latausosoitteen. Konekielisen (tai yleensäkin raakaa dataa) sisältävän tiedoston latausosoite lienee levyn pinnalla pari ensimmäistä tavua jonka mukaan komento load...,8,1 osaa sijoittaa roinat oikeaan osoitteeseen, mutta jos tätä osoitetta ei varsinaisesti tiedä niin mistä voi tietää minne ladattu data on löydettävissä?
Pöydältä löytyy Reijo Lundahlin kirja "1541-LEVYASEMA" joka on ollut erinomainen apu tähän asti, mutta pettää tässä kohtaa. Kirjassa sivutaan asiaa ainoastaan näin: "Ohjelman latausosoitteen selvittämiseksi voit käyttää levyaseman mukana tulleella levykkeellä olevaa ohjelmaa LOAD ADDR." Tuota levykettähän mulla ei tietenkään ole.
Tuossahan tuo koko levy on (en tiedä onko sama mutta sieltä löytyy kyseinen proggis). Muista ladata pelkällä ,8 (ei siis ,8,1)
http://www.zimmers.net/anonftp/pub/cbm/demodisks/drives/1541-demo1.d64.gz (http://www.zimmers.net/anonftp/pub/cbm/demodisks/drives/1541-demo1.d64.gz)
No siinähän se, kiitokset vaivannäöstä. Niinpä se taitaa olla, että tuo LOAD -komento ei sitä latausosoitetta mihinkään jemmaa vaikka käyttääkin sitä muistiin sijoituksessa. Se olisi ollut helpoin ratkaisu omassa tapauksessani, että tiedoston lataamisen jälkeen osoitteen voisi jostain vain noukkia.
Tämä kyseinen apuohjelma lukee (ja haluttaessa muuttaa) levyltä vain ne latausosoitteet latailematta tiedostoja sen enempiä mutta sehän onkin tämän ohjelman tarkoitus. Voisihan tuota koittaa soveltaa soveltuvilta osin.
olisiko joku näistä ?
$00C3-$00C4 195-196
Start address for a secondary address of 0 for LOAD and VERIFY from serial bus or datasette.
$0330-$0331 816-817
Execution address of LOAD, routine loading files.
http://sta.c64.org/cbm64mem.html (http://sta.c64.org/cbm64mem.html)
En tiedä mikä tuo ensimmäinen on, mutta empiirisesti tutkailtuna ei ole se mitä haetaan. Jälkimmäinen lienee itse load rutiinin osoite.
Ajatuksena mulla tässä olisi tehdä sellainen lib loader rutiini/viritys, että ohjelman osasten siirtely ja muistiin sijoittelu olisi mahdollisimman helppoa. Ideaali olisi jos pääohjelmaa ei tarvitsisi kääntää uudelleen ollenkaan vaan loaderi vaan taulukoisi pääohjelmaa varten johonkin mistä mitäkin löytyy.
Matalan tason levyasemakomennot tässä kuitenkin lienee se oikea ratkaisu. Täytyy yrittää heti kun ehtii.
jotain tälläistäkö etsit ?
;---------------------------------------
;==========
;= PRELOADER ====>=>=>
;========== / / /
SETLFS = $FFBA
SETNAME = $FFBD
LOAD = $FFD5
LOADLIST .WORD GRAF,SPRITE,CHAR2
.BYTE 4 ;INCLUDE
;FILES
GRAF .TEXT "1A "
SPRITE .TEXT "2A "
STAGE .TEXT "3A "
CHAR2 .TEXT "4A "
A1 .BYTE 0
STLOADER
LDA #0
STA A1
LOADLOOP LDA A1
ASL A
TAX
PHA
LOADER LDA #1 ;0:",8,1
LDX #8
LDY #1
JSR SETLFS
PLA
TAY
LDA LOADLIST,Y
BEQ STOUT
TAX
LDA LOADLIST+1,Y
TAY
LDA #6 ;nimien pituus
JSR SETNAME
LDA #0
TAX
TAY
JSR LOAD
INC A1
JMP LOADLOOP
STOUT RTS
;---------------------------------------
Ei huono pätkä, mutta eipä kerro tuokaan mihin data tulee ladattua, paitsi viimeisen tavun osoitteen:
"upon return from thesubroutine, the .X and .Y registers will contain the address of the
highest RAM location that was loaded." -mapping_c64.html
tuo olikin esimerkkinä kyseiselle ohjelmalle joka lataa tarvittavat pätkät muistiin ilman että itse loaderia tarvitsee kääntää uudelleen..
Load rutiini palauttaa x. .y rekistereissä ladatun ohjelman lo & hi addressin
samoin se tallentuu $AE alatavu -$AF Ylätavu
Load rutiini taas huolii lataus osoitteet x. y. rekisteriä käyttäen a. muistaakseni aktivoiva 1 tai 0 en muista kumpi
$AE-$AF osoitteessa on latauksen jälkeen viimeisen ladatun tavun sijainti. En tiedä tarkoititko niin, mutta ymmärsin kirjoittamasi, että siitä löytyisi alkuosoite.
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 (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 (http://www.com64.net/foorumi/index.php?topic=680.0)
C64 Rom purettuna Assempleriksi
http://www.ffd2.com/fridge/docs/c64-diss.html (http://www.ffd2.com/fridge/docs/c64-diss.html)
edit:
lisätty linkkejä
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:
Vaikuttaa ansiokkaalta ehdotukselta ainakin näin aloittelijan silmään. Ehkä joutaisin viikonloppuna tätä käytännössä testaamaan ellei joku ehdi ensin.
Suorasaantikäskyt levyasemalle, joiden ajattelin ensin olevan paras lähestymistapa, osoittautuivat aikamoiseksi hetteiköksi kun koitin tuossa niistä ottaa selvää. Sivumennen sanoen, enpä tätä ennen aavistanutkaan miten monipuolinen (=-mutkainen) laite tuo 1541 oikein onkaan.
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 ?
Ajelen Vicellä Merlin64:sta eli koodauskäyttössä sen lisäksi Vicen monitori. Viceä pyöritän Raspberry Piissä joka haudattu hajonneen 64:n breadbin tyyppiseen koteloon jonka näppäimistö on Keyrah adapterin kautta kiinni raspissa. Toimii yllättävän hyvin ja tuntuma on niin kohdallaan kuin se voi emulaattorin kanssa olla. :)
Jos emulaattoria pyörittelet niin lataapa Action Replayn tai Retro Replayn moduulirommi (näitä pitäs olla CSDB:ssä?) siihen VICEen ja käytät niiden Fastloadia niin näät suoraan mihin ne ohjelmat ladataan muistissa (heksana). Extranahan näissä moduuleissa on muutaki kivaa (esim. konekielimonitorit yms.).
Lainaus käyttäjältä: Slimex - elokuu 22, 2013, 22:30
Jos emulaattoria pyörittelet niin lataapa Action Replayn tai Retro Replayn moduulirommi (näitä pitäs olla CSDB:ssä?) siihen VICEen ja käytät niiden Fastloadia niin näät suoraan mihin ne ohjelmat ladataan muistissa (heksana). Extranahan näissä moduuleissa on muutaki kivaa (esim. konekielimonitorit yms.).
Tosiaan, hyvä kun muistutit, että voihan sitä tosiaan Vicessäkin moduuleita ajaa. Ei vielä ollut käynyt mielessä kun tämän Vice setupin virittelin vasta viime viikonloppuna. Virittelin, koska murheekseni havaitsin oikean 64:seni vaipuneen ikiuneen kun koitin sitä pikku tauon jälkeen herätellä. :(
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 (http://www.com64.net/foorumi/index.php?topic=656.0)
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
Lainaus käyttäjältä: virgo - elokuu 23, 2013, 04:31
en sitten malttanut jättää tätä ongelmaa ratkaisematta :(
Oho, onpas jätkä aika kone. :) Mutta ei Vice vaan mounttaa tuota disk imagea. Ja onhan se aika snadikin, 187 tavua, voiko niin pientä imagea ollakaan? Mielelläni kyllä tuota loaderiasi kokeilisin.
Lainaus käyttäjältä: virgo - elokuu 23, 2013, 01:31
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 (http://www.com64.net/foorumi/index.php?topic=656.0)
Missään nimessä en hukkaan heitä rikkinäisiä koneita, mulla on niitä nyt kaiketikin kolme. Tarkoitus olisi joskus paneutua niiden korjaamiseen.
En asu porissa vaan pk-seudulla. Syypori on vaan sanan cyborg translitteraatio härmän kielelle. ;)
Tuota Turbo Assembleria voisi kyllä kokeilla, olenhan minä siitä kuullut. Merlin oli vaan helppo ottaa käyttöön myös 64:lla kun olen aiemmin hieman harjoittanut assembly koodausta Apple II:lla jolle Merlin on alunperin tehty. Mut onhan se ominaisuuksiltaan suppee kuin suppelovahvero.
Lainaus käyttäjältä: Syypori6510 - elokuu 23, 2013, 18:50
Lainaus käyttäjältä: virgo - elokuu 23, 2013, 04:31
en sitten malttanut jättää tätä ongelmaa ratkaisematta :(
Oho, onpas jätkä aika kone. :) Mutta ei Vice vaan mounttaa tuota disk imagea. Ja onhan se aika snadikin, 187 tavua, voiko niin pientä imagea ollakaan? Mielelläni kyllä tuota loaderiasi kokeilisin.
Oho, anteeksi tyhmyyteni. Miks ihmeessä mä tuota disk imageksi luulin...
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 ;)
Lainaaainakin Linukassa toimii tiedä sitten Raspereistä tms. ikkunasoftista
Eikös siinä vattupiissäki joku linukka distro mahda olla... ja kaikki linukathan on nykyää ikkunapöydillä. Kannattaa muuten jostain hommata se Commodore OS 4 (linukkapohjane) vai mikä mahtokaa olla, komian näköne ja emulaaggorit ja gaig.
tarkoitat varmaan tätä xD
Commodore OS Vision (http://www.youtube.com/watch?v=QKpXiUD6Tc8#ws)
Lainaus käyttäjältä: Slimex - elokuu 23, 2013, 23:51
Lainaaainakin Linukassa toimii tiedä sitten Raspereistä tms. ikkunasoftista
Eikös siinä vattupiissäki joku linukka distro mahda olla... ja kaikki linukathan on nykyää ikkunapöydillä. Kannattaa muuten jostain hommata se Commodore OS 4 (linukkapohjane) vai mikä mahtokaa olla, komian näköne ja emulaaggorit ja gaig.
Itselläni tässä raspissa käyttiksenä on ns. virallinen linux distro eli raspbian, mutta en käynnistä sitä lainkaan ikkunatilaan. Vice lähtee käyntiin suoraan tekstitilasta, ja vieläpä käynnistyksessä automaattisesti jotta fiilis ;) Siinä mielessä raspi ei ole täydellinen C64 emulointialusta, että ymmärtääkseni potkua puuttuu hieman jotta voisi käyttää resid engineä hifi asetuksilla, en vaan ole itse vielä ehtinyt tutkia mihin asti nuo tehot piisaa. Vieläpä kun haluaisin emuloida hifinä kahta sidiä koska minulla on tuossa rikkoutuneessa koneessakin dualSID viritys. No, tehokkaampia raspi kakkosia odotellessa..
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 (http://www.com64.net/foorumi/index.php?action=dlattach;topic=537.0;attach=248)