LaserGenius források áthozatala PC-re

Híd a Spectrum/ZX81 és a mai világ között...
Avatar
MailMiner
LLIST Archiváló
Hozzászólások: 219
Csatlakozott: 2012.01.07. 23:12

LaserGenius források áthozatala PC-re

Hozzászólás Szerző: MailMiner » 2012.01.16. 10:51

2010.06.08. 17:45

Sziasztok!

Egy kis beszámoló a "LaserGenius-szal készített ROM források áthozatala PC platformra" című feladat megoldásáról.

A Balitól kapott fájlokból egyből látszott, hogy nem lesz egyszerű menet, a Laser Genius a memória spórolás miatt a forrást is tokenizálva tárolja... vagy írunk egy programot ami ezt tudja dekódolni (és ehhe visszafejtjük az egész fájformátumot, és a lehetséges tokenek kódjait), vagy rájövünk, hogyan lehet a Laser Geniusból kinyerni "emberi" formában az adatokat :-) Megnéztem a program leírást, kiderült, hogy LOAD ASCII van, de a párja az hiányzik :-( Mi van még? LLIST!
Gyorsan kiderül, hogy ugyan ROM rutint hív, de csak akkor amikor már a grafikus adatokat küldi ki a ZX Printerre. Némi további debugolás után rátaláltam a C34Fh címen lévő szubrutinra, ahova belépve az éppen nyomtatandó karakter kódja van az A regiszterben.
Innen már villámgyors a megoldás zx128emu-ban (ami az ep128emu része, és múltkor annyira nem keltette fel az érdeklődést, hogy még a sinclair.hu emulátor listájába se került be :-( írtam egy debugger LUA scriptet, ami az adott ponton kimenti az A értékét fájlba, magyarán LLIST-re szépen elkészül PC szöveges fájban a forráslista.
Ime a script:

Kód: Egész kijelölése

  clearBreakPoints()
  s = ""
  f = io.open("llist.txt", "w")
  setBreakPoint(4, 0xc34f, 2)
  setBreakPoint(4, 0x0000, 2)
  
  function breakPointCallback(t, a, v)
    if t == 3 then              -- allow stepping
      return true
    end
    if a == 0x0000 then
        f:flush()
        f:close()
        clearBreakPoints()
        return true
    end

    if getA() == 13  then
      s = s.."\n"
        f:write(s)
      s = ""
        else         
          s = s..string.char(getA())
        end
    return false
  end
Ekkor azt hittem a nehezén már túl vagyok, pedig még csak most jött a java :-) Hogyan is töltsük be a forrás fájlokat Laser Genius-ba? Az anyag egy SpeccyDOS diskimage-ben van, amiből ugyan ki lehet nyerni az SDE-vel TAP fáljba, de akkor se akarta betölteni, ha kijavítottam a hibás CRC-ket...
Végül írtam egy pár soros új programot Laser Genius-ban, és megnéztem mi lesz belőle kimentve. Így kiderült a turpisság: ugyan van egy 17 bájtos fejléc, de ez nem egyezik meg a Spectrum ROM által használt fejléc formával, gyakorlatilag tehát egy 17 bájtos fejléc nélküli adatblokk (FFh típusbájt). Az SDE pedig ROM típusú fejlécet próbált gyártani a diskimage-ből kimentésnél.
A minta alapján készített fejléccel már végre sikerült betölteni a kisebb és némely nagyobb forrásfájlokat. Itt egyébként áttértem az EP-s Spectrum Emu használatára, mivel ott az I/O műveletek egyszerű "pure data" fájlokkal történik, így nem kell szórakozni a CRC helyes TAP fájlok gyártásával (a TAP fájlok szétszedése is gyorsabb SCOPY-val mint ZX Blockeditorral). Mivel ez az egész az ep128emu-ban futott :-) így az előbb említett LUA script változatlanul felhasználható volt a program listák gyártására.

De pont a lényeget tartalmazó nagyobb fájlok nem akartak betöltődni, változatos módokon lefagyott tőlük a Laser Genius...
Végül a legnagyobb, még betöltődő fájlt kimentve derült ki a turpisság:
gyárilag 2K-s blokkokra szabdalva menti ki a forrást! (Ez a szabdalás gondolom a SpeccyDOS-hoz igazitásnál lett kiszedve) Feldarabolva a nagyobb forrásokat, és minden darabhoz fejlécet gyártva már villámgyorsan meg lett a maradék lista is :-)))

Ime a végleges formátuma a Laser Genius fejlécnek:
00: blokk sorszáma, 0-tól sorszámozva, utolsó blokknál +80h
01: AFh
02-03: a forrás teljes mérete
04-05: aktuális blokk mérete
maradék bájtokon a fájlnév.

Üdv:
Zozo

BetelGeuse
Speccyalista
Hozzászólások: 7
Csatlakozott: 2012.01.09. 16:42

Re: LaserGenius források áthozatala PC-re

Hozzászólás Szerző: BetelGeuse » 2017.08.21. 19:36

Ime a végleges formátuma a Laser Genius fejlécnek:
00: blokk sorszáma, 0-tól sorszámozva, utolsó blokknál +80h
01: AFh
02-03: a forrás teljes mérete
04-05: aktuális blokk mérete
maradék bájtokon a fájlnév.
Szóval, valami ilyesmi? ;)

LASERGEN
.13B

BASIC >{CODE}^{13:CR}{00}{08:c<}ELLIP<
Len: 17747
Aut: 21313
Var: 17741

Head Exam:
-1> Flg: 0
00> IDb: 0
01> Nm0: 175 {CODE}
02> Nm1: 94 ^
03> Nm2: 13 {13:CR}
04> Nm3: 0 {00}
05> Nm4: 8 {08:c<}
06> Nm5: 69 E
07> Nm6: 76 L
08> Nm7: 76 L
09> Nm8: 73 I
10> Nm9: 80 P
11> P0a: 83 S
12> P0b: 69 E
13> P1a: 65 A
14> P1b: 83 S
15> P2a: 77 M
16> P2b: 69 E
+1> Chk: 164 {GU}

Válasz küldése

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 0 vendég