Tiedoston latausosoite esiin?

Aloittaja Syypori6510, elokuu 19, 2013, 18:45

« edellinen - seuraava »

Syypori6510


: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.

Slimex

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
no pain, no c64

Syypori6510

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.


virgo

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

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

Syypori6510

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.

virgo

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
;---------------------------------------


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

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

Syypori6510

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

virgo

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

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

Syypori6510

$AE-$AF osoitteessa on latauksen jälkeen viimeisen ladatun tavun sijainti. En tiedä tarkoititko niin, mutta ymmärsin kirjoittamasi, että siitä löytyisi alkuosoite.

virgo

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

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

virgo

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

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

Syypori6510

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.

virgo

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

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

Syypori6510

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.  :)

Slimex

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.).
no pain, no c64