Enterprise Forever

:HUN => Emulátorok => Topic started by: Zozosoft on 2009.September.21. 10:17:19

Title: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.21. 10:17:19
Mivel semmi jelét nem láttam annak, hogy rajtam kívül bárki használná, vagy akár csak kipróbálta volna, lehet, hogy a következõ verzióban már nem lesz, illetve az UHU 2.0-s csomagban sem érdemes túl sokat erõltetni a fordítását. Kár, mert szerintem hasznos funkció lett volna
Én csodálni szoktam miket tudsz varázsolni vele! Én is szívesen varázsolnék csak még nem volt idõm elmélyülni benne :cry:  :oops:
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.23. 16:19:17
Én csodálni szoktam miket tudsz varázsolni vele! Én is szívesen varázsolnék csak még nem volt idõm elmélyülni benne :cry:  :oops:

Igen, valószínűnek tartottam, hogy azért nem próbálja ki senki, mert "biztosan bonyolult és nehéz megtanulni" :) Bár a nyelv alapvető használata (változók, műveletek, if/then/else, ciklusok, stb.) valójában egyszerű, ha valaki már ismer más magas szintű nyelveket mint pl. BASIC, Pascal, C, stb., és a meglevő rövidebb scriptek tanulmányozása is segítség lehet. A legegyszerűbb feladatokra - pl. "feltételes töréspont" - ezek alapján talán már néhány perc alatt sikerülhet működő scriptet készíteni.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.23. 16:22:54
Alapvetõen, hogy kell elképzelni ezt a LUA-t? Gyakorlatilag folyamatosan fut az emulátor mellett?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.23. 16:48:18
Alapvetõen, hogy kell elképzelni ezt a LUA-t? Gyakorlatilag folyamatosan fut az emulátor mellett?

A "Run" gomb lenyomásakor lefut az egész script (feltéve, hogy nem tartalmaz szintaktikai hibákat :)).

Azonban, ha definiál egy "breakPointCallback" nevű függvényt (amelyet - a gépelés megtakarítása céljából - külön erre a célra készített gombbal is be lehet szúrni), akkor az utána minden töréspontnál, illetve a "Step" gomb használatakor a következő Z80 utasításnál lefut. Ennek a függvénynek három paramétere van, a töréspont típusa (utasítás olvasás, I/O írás, stb.), a cím (I/O műveletnél teljes 16 bites cím), és az olvasott vagy írt érték. Egy "boolean" típusú értéket (true vagy false) kell visszaadnia, ez dönti el, hogy megjelenjen-e a debugger ablak; ha true, akkor megjelenik. "Step" módban a false visszatérési érték utasításonkénti futtatásra használható.

A breakPointCallback a "Stop" gomb megnyomásáig marad aktív. Ez a gomb egyben a script által lefoglalt memóriát is felszabadítja, és bezárja az esetleg megnyitott file-okat. A "Run" gomb először mindig elvégzi a "Stop" funkcióját is.

Ha a script globális változókat definiál, akkor azok a "Run" után, illetve a breakPointCallback hívásai között is megmaradnak. Ez felhasználható például számlálók, log file, stb. készítésére.

Lehetőség van a memória, I/O portok, és regiszterek olvasására és írására is.

Példa (nem sok értelme van, de talán segíti a fentiek megértését):

Code: Lua
  1. for i = 0, 0x3FFF do
  2.   writeMemoryRaw(0x3F4000 + i, 0x55)
  3. end
  4. c = 0
  5. function breakPointCallback(t, a, v)
  6.   if t == 0 and a == 0x30 then
  7.     c = c + 1
  8.     if c >= 3 then
  9.       c = 0
  10.       return true
  11.     end
  12.     return false
  13.   end
  14.   return true
  15. end

Itt a "for" ciklus az elején azonnal lefut a Run gomb megnyomásakor, és az FDh szegmenst feltölti 55h byte-okkal. Ezen kívül a script definiál egy "c" változót, 0 kezdőértékkel.
A breakPointCallback függvény utána minden töréspontnál lefut. Ha a típus 0 (Z80 utasítás olvasás) és a cím 30h, akkor csak minden harmadik esetben jelenik meg a debugger ablak (a "c" számláló miatt), egyébként mindig.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.23. 16:58:28
Áhá! Lassan kezd derengeni :-)
Title: Re: Lua scriptek fejlesztése
Post by: Ferro73 on 2009.September.23. 18:10:19
és ha a debugger elöjön akkor az emu a Z80 PC  regisztert és minden mást felfüggeszt ?



akkor lehet hibakeresésre is használni pl rejtett zxrom hivások keresésére.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.23. 18:35:47
és ha a debugger elöjön akkor az emu a Z80 PC  regisztert és minden mást felfüggeszt ?

Igen, amíg a debugger ablak látható vagy Lua kód fut, az emuláció leáll.
Title: Re: Lua scriptek fejlesztése
Post by: Ferro73 on 2009.September.23. 18:55:09
Az nem jó azt nem lehet megcsinálni fut a lua háttében/debug bezár lua fut/ futtatom az emuban a programot és a program meghiv egy zxrom cimet 0-3fffh között és akkor elöugrik a debug.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.23. 19:08:38
Az nem jó azt nem lehet megcsinálni fut a lua háttében/debug bezár lua fut/ futtatom az emuban a programot és a program meghiv egy zxrom cimet 0-3fffh között és akkor elöugrik a debug.

Ezt nem egészen értem. Mindenesetre ahhoz, hogy 0 és 3fffh közötti cím hívására megjelenjen a debugger ablak, elég "0000-3fffx"-et beírni a töréspontoknál.
Title: Re: Lua scriptek fejlesztése
Post by: Ferro73 on 2009.September.23. 19:17:44
A lua csak akkor fut ha benvan/megnyitvan/ a debugger ablak?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.23. 19:27:28
A lua csak akkor fut ha benvan/megnyitvan/ a debugger ablak?

A Lua script főprogramja a debugger ablak Run gombjának a megnyomásakor fut le.
Utána az emulátor a breakPointCallback fügvényt hívja meg (ha van ilyen) akkor, amikor a debugger töréspont miatt megjelenne. Ha ez a függvény false értéket ad vissza, akkor a Z80 kód futása folytatódik, és a debugger nem jelenik meg.
Title: Re: Lua scriptek fejlesztése
Post by: Ferro73 on 2009.September.23. 19:36:45
Akkor van lua /breakPointCallback fügvénnyel ellátva/ programom betöltöma debuggerbe RUN a debugger eltünik folytatodik a Z80-as  következö kódja az emu ellenörzi a breakPointCallback fügvényt hanem TRUE akkor jöhet a következö Z80-as kód és megint a breakPointCallback fügvényt hanem TRUE akkor jöhet a következö Z80-as kód és megint......

Ha jól értelmezem
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.23. 20:14:37
A breakPointCallback függvény utána minden töréspontnál lefut.
De ugye jól értem, hogy ezen példa esetén ez magától nem történik meg, hanem kézzel kell töréspontot beállítani?
És ha jól túrom a readme-t, akkor egy teljesen automata LUA-hoz kell az elejére egy setBreakPoint(bptype, addr, priority)?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.23. 20:30:48
De ugye jól értem, hogy ezen példa esetén ez magától nem történik meg, hanem kézzel kell töréspontot beállítani?

Igen.

Quote
És ha jól túrom a readme-t, akkor egy teljesen automata LUA-hoz kell az elejére egy setBreakPoint(bptype, addr, priority)?

Valóban (itt a bptype-nak 4-nek kellene lennie a Z80 utasítás olvasáshoz). A scriptben beállított vagy törölt töréspontok azonban nem jelennek meg a GUI töréspont szerkesztőben, így az visszaállítható az Apply gombra kattintással.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.24. 17:09:59
Nem tudom, hogy ez hasznos-e valakinek, de itt egy részletesebb leírás a Spectrum programok attribútum és I/O műveleteit figyelő zxiolog.lua (http://enterpriseforever.com/dlattach.html;topic=132.0;attach=3848) script működéséről:

Code: Lua
  1. for i = 0x5800, 0x5AFF do
  2.   setBreakPoint(1, i, 3)
  3.   setBreakPoint(2, i, 3)
  4. end

Ez a ciklus töréspontot állít be 5800h és 5AFFh között - azaz az attribútum területen - minden byte olvasására (bpType=1) és írására (bpType=2) is. A "prioritás" paraméter 3, azaz a legnagyobb.

A "for" ciklus használata részletesebben:
  for VÁLTOZÓ = ÉRTÉK1, ÉRTÉK2[, LÉPÉS] do
    ...
  end

Ha a lépés nincs megadva, akkor az alapértelmezése 1. A változó "local" típusú, azaz csak a ciklusban lesz elérhető, és a kezdőértéke az első paraméter. A ciklusmag addig fut, amíg a változó kisebb vagy egyenlő (ha a lépés pozitív), vagy nagyobb vagy egyenlő (ha a lépés negatív) a második paraméterrel, és minden futása után a változóhoz hozzáadja a lépésnek megadott értéket. A "break" utasítással korábban is ki lehet lépni a ciklusból.

Code: Lua
  1. setBreakPoint(5, 0xFE, 3)
  2. setBreakPoint(6, 0xFE, 3)

I/O olvasás (5) és írás (6) töréspont beállítása az FEh portra, 3-as prioritással. A billentyűzet és hang kezelését figyeli.

Code: Lua
  1. setBreakPoint(4, 0x0000, 3)

Z80 utasítás olvasás (4) töréspont a 0000h címen, a RESET gomb megnyomásához (arra fejeződik majd be a script futása).

Code: Lua
  1. attrReadMap = {}
  2. attrWriteMap = {}
  3. ioFEReadMap = {}
  4. ioFEWriteMap = {}

Ez létrehoz 4 üres táblázatot (tömböt) annak tárolására, hogy milyen címeken történtek ilyen műveletek.

Code: Lua
  1. for i = 0x0000, 0xFFFF do
  2.   attrReadMap[i] = false
  3.   attrWriteMap[i] = false
  4.   ioFEReadMap[i] = false
  5.   ioFEWriteMap[i] = false
  6. end

A fenti ciklus inicializálja a tömböket. A Lua nyelvben a táblázatok címzésére valójában bármilyen adattípus használható, akár törtek vagy szöveg is, és az egyes elemeknek a típusa is tetszőleges lehet (akár ugyanazon a táblázaton belül keverve is). Ezek a táblázatok a 0 és FFFFh közötti egész számokhoz rendelnek "boolean" értéket, amely azt jelzi, hogy az adott Z80 címről történt-e az adott művelet (pl. attribútum írás).

Code: Lua
  1. function breakPointCallback(t, a, v)
  2.   if t == 1 or t == 2 then
  3.     if a >= 0x5800 and a < 0x5B00 then
  4.       if (getMemoryPage(1) == 0xFD or getMemoryPage(1) == 0xFE) and
  5.          getMemoryPage(SHR(getPC(), 14)) >= 0x80 then
  6.         if t == 1 then
  7.           attrReadMap[getPC()] = true
  8.         else
  9.           attrWriteMap[getPC()] = true
  10.         end
  11.       end
  12.       return false
  13.     end

A töréspontok elérésekor meghívandó függvény eleje.
Itt, ha a hozzáférés típusa (t) 1 (memória olvasás) vagy 2 (memória írás), akkor:
  ha a cím (a) 5800h és 5AFFh között van, akkor:
    ha az 1. lapon az FDh vagy FEh szegmens van, és a Z80 programszámláló nem a 0-7Fh szegmenseken van (az SHR() függvény az első megadott paramétert lépteti jobbra a másodiknak megadott számú bittel, ugyanez balra az SHL() lenne; a getMemoryPage() a megadott lapon (0-3) levő szegmenst adja vissza):
      a megfelelő táblázatban megjelöli a programszámláló aktuális pozícióját;
    visszatér false értékkel, azaz nem jelenik meg a debugger ablak

Code: Lua
  1.   elseif t == 5 or t == 6 then
  2.     if AND(a, 0xFF) == 0xFE then
  3.       if getMemoryPage(SHR(getPC(), 14)) >= 0x80 then
  4.         if t == 5 then
  5.           ioFEReadMap[getPC()] = true
  6.         else
  7.           ioFEWriteMap[getPC()] = true
  8.         end
  9.       end
  10.       return false
  11.     end

Az előbbi "if" utasítás folytatása, ezúttal 5 (I/O olvasás) és 6 (I/O írás) típusú hozzáférésekhez:
  ha a cím alsó 8 bitje FEh:
    ha a Z80 programszámláló nem a 0-7Fh szegmenseken van:
      megjelöli a programszámlálónak megfelelő címet az I/O olvasás vagy írás táblázatban;
    visszatér false értékkel, azaz nem jelenik meg a debugger ablak

Code: Lua
  1.   elseif t == 0 and a == 0x0000 then
  2.     clearBreakPoints()
  3.     f = io.open("zxiolog.txt", "w")
  4.     for i = 0x0000, 0xFFFF do
  5.       if attrReadMap[i] then
  6.         f:write(string.format("%04X: AR\n", i))
  7.       end
  8.       if attrWriteMap[i] then
  9.         f:write(string.format("%04X: AW\n", i))
  10.       end
  11.       if ioFEReadMap[i] then
  12.         f:write(string.format("%04X: IOR\n", i))
  13.       end
  14.       if ioFEWriteMap[i] then
  15.         f:write(string.format("%04X: IOW\n", i))
  16.       end
  17.     end
  18.     f:close()
  19.     return true

Végül a RESET figyelése: ha Z80 utasítás olvasás (t=0) történik a 0000h címről, akkor törli a töréspontokat, hogy a script ne fusson le újra, megnyitja a "zxiolog.txt" nevű file-t írásra szöveges módban (bináris file-hoz "w" helyett "wb" kellene), majd kiírja a táblázatok tartalmát.
Az f:write() az "f" file-ba írja a paraméternek megadott szöveg típusú adatot (egy byte (N) írásához f:write(string.char(N)) kellene). A string.format() formázott szöveget hoz létre a megadott (C sprintf() függvényhez hasonló) formátum alapján. A "%04X" azt jelenti, hogy a megfelelő paramétert (i) nagybetűs hexadecimális formában (X), balról nullákkal 4 számjegyre kiegészítve kell kiírni.
Végül bezárja a file-t (f:close()), és true értékkel visszatér, tehát megjelenik a debugger ablak.

Code: Lua
  1.   end
  2.   return true
  3. end

A töréspont típusát vizsgáló "if" utasítás lezárása; ha a töréspont nem a script által figyelt típusú vagy című, akkor true a visszatérési érték, azaz a debugger ablak megjelenik.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.24. 19:30:23
Nem tudom, hogy ez hasznos-e valakinek, de itt egy részletesebb leírás a Spectrum programok attribútum és I/O mûveleteit figyelõ zxiolog.lua (http://enterpriseforever.com/dlattach.html;topic=132.0;attach=3848) script mûködésérõl:
Ezt akartam kérni, csak nem mertelek fárasztani  :oops:
Title: Re: Lua scriptek fejlesztése
Post by: Ferro73 on 2009.September.24. 19:44:14
Ez igy nagyon jó lehet esetleg lehet olyan változot betenni ami nem müvelet hanem z80-as kód ?

valami olyan  
  if  getPC = 0CDh or getPC = 0C3h then
     if (getPC+1)+((getPC+2)*256) <= 03FFFh then
        zxromcallmap[getPC(),(getPC+1)+((getPC+2)*256)] = true
         getPC = getPC +3                ;  vagy 2?
     end
   end
  return false
 remélem érthetö
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2009.September.24. 21:25:12
Nem tudom, hogy ez hasznos-e valakinek, de itt egy részletesebb leírás a Spectrum programok attribútum és I/O mûveleteit figyelõ zxiolog.lua (http://enterpriseforever.com/dlattach.html;topic=132.0;attach=3848) script mûködésérõl:

Óriási poén lenne, ha még mindig lenne Enterpress, és ez az írás is megjelenne benne.  :ds_icon_cheesygrin: "Spectrum programok átírása a XXI. században" lehetne a rovat címe.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.24. 23:08:06
valami olyan  
  if  getPC = 0CDh or getPC = 0C3h then
     if (getPC+1)+((getPC+2)*256) <= 03FFFh then
        zxromcallmap[getPC(),(getPC+1)+((getPC+2)*256)] = true
         getPC = getPC +3                ;  vagy 2?
     end
   end
  return false
 remélem érthetö

Ennek az lenne a célja, hogy azokat a címeket tárolja, ahonnan ZX ROM hívás történik ? És a JP vagy CALL utasítást utána megpróbálja átugrani, hogy a hívás ne történjen meg (bár ez nem tudom pontosan, miért kellene) ?

Z80 utasításkódra ugyan jelenleg nem lehet töréspontot beállítani, viszont ez például egy lehetséges megoldás lehet:

Code: Lua
  1. prvPC = 0
  2. ...
  3.   local curPC = getPC()
  4.   if curPC < 0x4000 and prvPC >= 0x4000 and curPC ~= 0x38 and curPC ~= 0x66 then
  5.     zxCallFromMap[prvPC] = true
  6.     zxCallToMap[curPC] = true
  7.   end
  8.   prvPC = curPC

Ezt azonban vagy "Step" módban kell futtatni (azaz minden utasításnál breakPointCallback hívás), ami lassú és külön script kell a ROM hívások figyeléséhez, vagy esetleg minden címre 4-es típusú (Z80 utasítás olvasás) töréspontot beállítani, ami még lassabb valamivel, de azért talán használható. :)
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.25. 21:53:44
Én vagyok béna, vagy tényleg nem mûködik a readme-ben található example, ami a 102-es csatorna nevét írná ki?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.25. 23:10:00
Én vagyok béna, vagy tényleg nem mûködik a readme-ben található example, ami a 102-es csatorna nevét írná ki?

Valóban nem működik :oops: A setBreakPoint() hívásnál a típust át kell írni 1-ről 4-re. Ezt a problémát az okozta, hogy a script az emulátor régebbi (2.0.5) verziójához készült, amely még nem ismerte az "x" típusú töréspontokat, ezért "r" volt helyette, ami azonban most már figyelmen kívül hagyja az utasítás olvasást.
Ezzel a javítással már nincs más hiba :?:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.September.25. 23:23:42
Így már megy :-)
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.September.27. 13:32:59
Kis kiegészítés a példához: a ".." művelet szöveg típusú adatok összefűzését végzi, a "~=" pedig "nem egyenlő" összehasonlítás (de ezeket talán egyébként is ki lehetett találni :)).
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.01. 17:49:58
Újabb script magyarázat (hátha érdekel valakit :)). Ezúttal a dtftimer.lua (http://enterpriseforever.com/szoftver/fajltoemoerites_enterpriseon-t404.0.html;msg15454#msg15454), amely az 1-es csatorna megnyitása és bezárása közötti időt méri:

Code: Lua
  1. totalTime = 0.0
  2. clearBreakPoints()
  3. timerOn = false
  4. prvState = 0
  5. for i = 0, 0xFFFF do
  6.   setBreakPoint(4, i, 3)
  7. end
  8. setBreakPoint(6, 0xA7, 3)

Inicializálás: a totalTime változó az 1-es csatorna megnyitása után összesen eltelt időt számolja majd másodpercekben. A timerOn azt jelzi, hogy az időmérés éppen fut-e, az 1-es csatorna megnyitásáig false marad. A prvState pedig az 1 kHz-es DAVE időzítő előző állapota (0 vagy 1).
Minden lehetséges címre Z80 utasítás olvasás töréspont kerül, így a breakPointCallback() függvény biztosan elég gyakran fut le ahhoz, hogy az időzítő minden állapotváltozását érzékelje.
Az A7H I/O port írását szintén figyelni kell:

Code: Lua
  1. function breakPointCallback(t, a, v)
  2.   if t == 6 then
  3.     if AND(a, 0xFF) == 0xA7 then
  4.       if AND(v, 0x60) >= 0x40 and timerOn then
  5.         timerOn = false
  6.         clearBreakPoints()
  7.         mprint("ERROR: sound generator IRQ is not supported")
  8.         return true
  9.       end
  10.     end

Ennek a portnak az írása megváltoztathatja az időzítő sebességét. A hanggenerátor megszakítást (5. és 6. bit 10B vagy 11B) azonban a script nem támogatja, tehát abban az esetben hibával leáll.

Code: Lua
  1.   elseif a == 0x0030 then
  2.     returnAddr = OR(readMemory(getSP()), SHL(readMemory(getSP() + 1), 8))
  3.     exosFunc = readMemory(returnAddr)
  4.     chanNum = getA()
  5.     if exosFunc == 1 and chanNum == 1 and not timerOn then
  6.       timerOn = true
  7.       totalTime = 0.0
  8.       return false
  9.     elseif exosFunc == 3 and chanNum == 1 and timerOn then
  10.       timerOn = false
  11.       clearBreakPoints()
  12.       mprint(string.format("%.3f seconds", totalTime))
  13.       return true
  14.     end
  15.   end

Itt történik az EXOS csatorna megnyitás és bezárás hívások figyelése. A veremből kiolvassa a visszatérési címet, majd onnan az EXOS hivás kódját. Ha ez 1, és az A regiszter (csatornaszám) is 1, és az időmérés még nem fut, akkor az elindulhat 0 időtől kezdve. Egyébként ha EXOS 3 hívás van az 1-es csatornára és fut az időmérés, akkor a töréspontok törlése után - hogy a breakPointCallback() ne hívódjon meg újra - kiírható a mért idő. A string.format-nál a %.3f azt jelenti, hogy a paramétert (totalTime) lebegőpontos számként kell kiírni fix 3 tizedesjegy pontossággal.

Code: Lua
  1.   curState = AND(readIOPort(0xB4), 1)
  2.   if curState ~= prvState then
  3.     prvState = curState
  4.     tickTime = 0.001
  5.     timerMode = AND(readIOPort(0xA7), 0x60)
  6.     if timerMode >= 0x40 then
  7.       timerOn = false
  8.       clearBreakPoints()
  9.       mprint("ERROR: sound generator IRQ is not supported")
  10.       return true
  11.     end

Ez pedig az időmérés: a B4H port 0. bitjének (az 1 kHz/50 Hz/hanggenerátor időzítő aktuális állapota) a változását érzékeli. Ha ez megtörténik, akkor elmenti az új állapotot a prvState-be, és az A7H és BFH port alapján megpróbálja kiszámítani, hogy mennyi idő telt el. A hanggenerátor megszakítás mód itt is hibát eredményez, egyébként az alapértelmezés 1 ms.

Code: Lua
  1.     if timerMode == 0x20 then
  2.       tickTime = 0.02
  3.     end
  4.     if AND(readIOPort(0xBF), 0x02) ~= 0 then
  5.       tickTime = tickTime * 1.5
  6.     end
  7.     totalTime = totalTime + tickTime
  8.   end
  9.   return false
  10. end

Ha az A7H port 5. és 6. bitje 01B, akkor a megszakítás sebessége csak 50 Hz (20 ms). A BFH port 1. bitjének beállítása (12 MHz-es rendszer órajel feltételezése) esetén az időegységet a másfélszeresére kell növelni. Ez végül hozzáadható az eltelt időhöz (totalTime), és a függvény visszatér a debugger ablak megjelenítése nélkül.

Az eredeti verzióban egyébként volt egy hiba: BFH port helyett B4H volt :oops: Kicseréltem javítottra.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.11. 17:12:41
Most amikor már kezdek ráérezni az ízére, maradjon!!!

Tehát akkor már van egy felhasználó :?: :)

Quote
(Ettõl függetlenül egy külön oldalon lehet olyan nagyobb monitor ablak :) )

Talán megoldható, bár a több oldal viszont megint nehézkesebbé teszi a debugger használatát (vagy a script szerkesztő legyen külön oldalon, de szintén nagyobb ablakkal ?). Az viszont nagyon egyszerűen elérhető, hogy a monitor ablak több sort tároljon 120 helyett, ha az esetleg kevés lenne.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.15. 22:32:11
Tehát akkor már van egy felhasználó :?: :)
Itt az elsõ próbálkozás :-)
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2009.October.15. 23:37:14
Itt az elsõ próbálkozás :-)
Ez hogyan mûködik, mit kell vele csinálni?
Betöltöttem a debugger luás részébe és runt is nyomtam, de látszólag nem csinál semmit.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.15. 23:51:52
Ez hogyan mûködik, mit kell vele csinálni?
Betöltöttem a debugger luás részébe és runt is nyomtam, de látszólag nem csinál semmit.
Csinálj lemezmûveleteket, aztán nézz be a debugger ablakba. Megállni akkor fog ha a jelenlegi ismereteink szerint ismeretlen FISH hívás történik.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.15. 23:52:45
Csinálj lemezmûveleteket, aztán nézz be a debugger ablakba. Megállni akkor fog ha a jelenlegi ismereteink szerint ismeretlen FISH hívás történik.

Továbbfejlesztési ötlet: azt is kiírhatná, hogy milyen címről történt a hívás :)
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.17. 00:00:05
Továbbfejlesztési ötlet: azt is kiírhatná, hogy milyen címrõl történt a hívás :)
:ds_icon_cheesygrin:
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.17. 00:40:56
:ds_icon_cheesygrin:

Ez már jobb :) Még egy javítási lehetőség: a címet szegmensszámmal kiírni.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.17. 15:56:53
Még egy javítási lehetõség: a címet szegmensszámmal kiírni.
Az már bonyolultabb feladat :-)

Olyan Print van, ami nem emel sort?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.17. 16:10:31
Az már bonyolultabb feladat :-)

Olyan Print van, ami nem emel sort?

Nincs :oops:, viszont az mprint()-et több paraméterrel is lehet hívni, és akkor azok között nincs soremelés, szóköz, vagy egyéb karakter. A string.format() is lehetővé teszi több paraméter használatát: például a string.format("%s: %d, %d", a, b, c) az a változót szövegként (%s), a b és c változót pedig decimális egész számként (%d) konvertálja.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.17. 20:54:01
Rövidebb megoldás táblázattal (a táblázat első elemének az indexe 1, és a nem létező elemek olvasása nil értéket ad vissza):

Code: Lua
  1.   clearBreakPoints()
  2.   setBreakPoint(4, 0x80505, 2)   -- break on reading memory at 20:0505
  3.   fishCalls = {
  4.     "Útvonal és KFCB készítése fájlnévb&#337;l",
  5.     "Aktuális katalógus megadás",
  6.     "Aktuális katalógus lekérés",
  7.     "Els&#337; bejegyzés keresése",
  8.     "Következ&#337; bejegyzés keresése",
  9.     "Fájl létrehozás",
  10.     "Katalógus létrehozás",
  11.     "Fájl vagy katalógus törlés",
  12.     "Fájl vagy katalógus átnevezés",
  13.     "Fájl vagy katalógus áthelyezés",
  14.     "Attribútum nés id&#337; változtatás",
  15.     "Fájl megnyitás",
  16.     "Fájl lezárás",
  17.     "Pufferek törlése",
  18.     "Szekvenciális olvasás",
  19.     "Szekvenciális írás",
  20.     "Szekvenciális írás 0 feltöltéssel",
  21.     "Szektorok olvasása",
  22.     "Szektorok írása",
  23.     "Rendelkezésre álló meghajtók lekérdezése",
  24.     "Allokációs információ",
  25.     "Fizika meghajtó lekérdezés",
  26.     nil,
  27.     nil,
  28.     "Mapdisk megadás",
  29.     "Assign megadás",
  30.     nil,
  31.     "Ramdisk létrehozás-törlés",
  32.     "Formázás"
  33.   }
  34.   function breakPointCallback(t, a, v)
  35.     if t == 3 then              -- allow stepping
  36.       return true
  37.     end
  38.     f = getA() 
  39.     if getPC() ~= 0xc505 then
  40.       return false
  41.     end
  42.     cim = OR(readMemory(getSP()), SHL(readMemory(getSP() + 1), 8)) - 3
  43.     if fishCalls[f] ~= nil then
  44.       mprint(string.format("%04X: %s", cim, fishCalls[f]))
  45.       return false
  46.     end
  47.     mprint(string.format("%04X: Ismeretlen FISH hívás: %d ", cim, f))
  48.     return true
  49.   end

UI: az ő karaktereket a fórum elrontotta :oops:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.17. 21:09:37
Rövidebb megoldás táblázattal
Ügyes  :smt038
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 21:37:44
Még egy javítási lehetõség: a címet szegmensszámmal kiírni.
Elvileg megoldva :-)
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.26. 21:57:41
Jónak tűnik, bár ismeretlen hívás esetén a szegmensszámot nem írja ki :) A szegmensszám lekérdezését egyébként kissé lehet egyszerűsíteni: readIOPort(0xB0 + SHR(cim, 14)) vagy getMemoryPage(SHR(cim, 14)).
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 22:05:25
A szegmensszám lekérdezését egyébként kissé lehet egyszerûsíteni: readIOPort(0xB0 + SHR(cim, 14)) vagy getMemoryPage(SHR(cim, 14)).
Sejtettem, hogy tudsz majd új trükköket mondani!

Arra mi lenne a legegyszerûbb, hogy a különbözõ EXOS és EXDOS listákban kotorászva, a szegmensszám:cím formátumú mutatókon ugráljunk? Különös tekintettel arra, hogy a cím nem szegmensen belüli, hanem valamelyik lapon érvényes.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 22:11:15
A konkrét megvalósítandó terv az lenne, hogy az EXOS ROM listából keressük ki az EXDOS-t (20H), meg tudjuk a RAM területének a címét, majd onnan a meghajtó táblázatból ki keresni a az egyes meghajtók kezelõprogramját, és azokra töréspontot berakni.
És utána egy hasonló jelentõ progival nézni mi történik.
Mivel vannak még ismeretlen akciókódok, ez eredményezi pl azt, hogy EPDOS 1.9-el vinyóról törölve data error hibát kapunk, mivel az IDE ROM az ismeretlenekre hibát ad vissza.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.26. 22:19:17
Az EXDOS programozását nem ismerem :oops: Pontosan mi az, aminek a megoldása a scriptben problémát jelent ?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 22:28:34
Pontosan mi az, aminek a megoldása a scriptben problémát jelent ?
A konkrét kérdés az, hogy ha van az EP memóriában egy 3 bájton tárolt cím, abból hogyan lehet a legegyszerûbben fizikai címet elõállítani?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.26. 22:35:55
A konkrét kérdés az, hogy ha van az EP memóriában egy 3 bájton tárolt cím, abból hogyan lehet a legegyszerûbben fizikai címet elõállítani?

Code: Lua
  1. function getAddr(addr)
  2.   local segNum = readMemory(addr)
  3.   local offsL = readMemory(addr + 1)
  4.   local offsH = readMemory(addr + 2)
  5.   return (segNum * 16384 + offsL + (AND(offsH, 0x3F) * 256))
  6. end

Ez feltételezi, hogy a szegmensszám az első byte, de ezt természetesen egyszerűen lehet módosítani. A visszatérési érték a 22 bites fizikai cím (000000H-3FFFFFH).
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 22:39:15
Köszi!!!
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 23:28:32
Az lehetséges, hogy lefagy az egész emulátor ha sikerül végtelen ciklust csinálnom a LUA-ban?  :oops:
Nem tudok a Stopra se klikkelni, csak egy homokóra van...
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.26. 23:37:23
Az lehetséges, hogy lefagy az egész emulátor ha sikerül végtelen ciklust csinálnom a LUA-ban?

Igen :oops:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.26. 23:50:23
Igen :oops:
Legközelebb gyakrabban nyomogatom a Save-t a Run elött  :oops:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.30. 20:46:21
Itt tart a dolog, hogy kiírja az egyes meghajtókhoz tartozó leíróblokk címét, ill. a kezelõ program címét.
Mit lehetne egyszerûbben?  :oops:
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2009.October.30. 21:39:54
Mit lehetne egyszerûbben?  :oops:

Eddig semmi jelentőset :)
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2009.October.30. 23:20:26
Valamit már csinál :-)
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2010.May.23. 00:03:33
CPU fogyasztást kijelző script (nem tudom, hasznos-e ez valakinek):
  [attachurl=#]
Ez egy a script elején táblázatban megadható rutin(ok összes) átlagos CPU használatát írja ki százalékban a státuszsorba. A táblázat minden eleme egy öt elemű táblázat, amelyben a belépési (ezt már számolja) és a kilépési (ezt már nem) utasítás címe található szegmens, cím formátumban, és az extra Z80 ciklusok száma (amely lehet például a már nem számolt kilépési utasítás időtartama). Beállítható a kijelzés gyakorisága és a Z80 és video órajel is.
A példa a Super Hero (http://enterpriseforever.com/konvertalas/cpc-t22.0.html;msg19349#msg19349) átirat teszt verziójában jelzi ki a betöltő emulációs és magszakítási kódjának a CPU használatát.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2010.May.23. 00:14:20
CPU fogyasztást kijelzõ script (nem tudom, hasznos-e ez valakinek):
Szerintem jól fog ez még jönni!
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2010.June.11. 18:40:27
Olyan scriptet lehetne csinálni, ami megmondja, hogy egy subrutin hány órajel ciklus alatt fut le?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2010.June.11. 19:39:48
Olyan scriptet lehetne csinálni, ami megmondja, hogy egy subrutin hány órajel ciklus alatt fut le?

[attachurl=#]

Ez ugyan nem ciklusokban, hanem ezredmásodpercekben írja ki, de remélhetőleg használható (illetve könnyen átalakítható :)). Az időmérés felbontását a getVideoPosition() függvény határozza meg, azaz EP-nél 889846 Hz, CPC-n 1 MHz (de ott egyébként is minden utasítás egész számú ciklus ezen a frekvencián), Spectrumon pedig pixel felbontású, azaz pontos értéket ad Z80 ciklusokban is. A Step gombot kell használni az elindítása után.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2010.June.11. 20:23:38
Ez ugyan nem ciklusokban, hanem ezredmásodpercekben írja ki, de remélhetõleg használható
Köszi! A feladatra így is teljesen jó! Arra vagyok kíváncsi, hogy egy bizonyos funkciót különbözõ módokon programozva, melyik a gyorsabb, és mennyi a különbség?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2010.June.11. 22:29:02
Ez a script a memória várakozások hatásait is jól kell mérje?

Mert egy érdekes anomáliával találkoztam:
      - ha 1, akkor várakozás csak M1 olvasásnál - ez az alapértelmezett mód. Az M1 olvasás a Z80 utasítások elsõ byte-ját jelenti; DDh, EDh, és FDh prefixnél a prefix utáni utasításbyte is M1 olvasásnak számít
Ez alapján azt vártam, hogy egy sok-sok LDI utasítást tartalmazó rutin jelentõsen lassul az OUT 191,4 hatására. De az össz rutinra nézve kb csak annyi különbség volt mint az LDIR-es változatnál, én bénáztam el valamit, vagy az LDIR is generál minden körben M1 ciklust?
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2010.June.11. 23:02:00
Ez a script a memória várakozások hatásait is jól kell mérje?

Természetesen igen, mert a vízszintes video pozíció változásai alapján méri az időt (ezért kell Step módban futtatni, vagy minden címre töréspontot beállítani). Legfeljebb az lehet probléma, hogy csak egy-két utasításból álló kódnál nem elég pontos.

Quote
Mert egy érdekes anomáliával találkoztam:Ez alapján azt vártam, hogy egy sok-sok LDI utasítást tartalmazó rutin jelentõsen lassul az OUT 191,4 hatására. De az össz rutinra nézve kb csak annyi különbség volt mint az LDIR-es változatnál, én bénáztam el valamit, vagy az LDIR is generál minden körben M1 ciklust?

Ha az LDI vagy LDIR által olvasott és/vagy írt terület a video memóriában van, akkor az megváltoztathatja az időzítést. LDI utasításnál például ha a DE és a HL is video memóriára mutat, de az LDI nem video memóriában van, akkor a várakozási módtól függetlenül kb. 22.5 ciklus lesz több egymást követő LDI utasítás átlagos futásideje (a várakozás nélküli változat csak többet vár a video RAM-ra).

Az LDI utasítás részletes időzítése:

4 (M1: EDh olvasása) + 4 (M1: A0h olvasása) + 3 (olvasás HL címről) + 3 (írás DE címre) + 2 (HL, DE növelése - illetve ezek talán már a memóriaműveletek közben történnek, BC csökkentése, jelzőbitek állítása)

A tényleges olvasás vagy írás (az adatbusz mintavételezése) az M1 műveleten belül 2.0 ciklusnál történik a 4-ből, a normál memóriaműveletnél 2.5 ciklusnál a 3-ból, és I/O műveletnél 3.5 ciklusnál a 4-ből. A /WAIT bemenetet a Z80 az M1 és normál memória műveletnél is 1.5 ciklusnál figyeli, I/O műveletnél pedig 2.5 ciklusnál:

[attachthumb=#]        [attachthumb=#]        [attachthumb=#]

Az LDIR időzítése azonos az LDI-vel, ha a végrehajtásával a BC értéke 0-ra csökken. Egyébként még a fent leírt 16 ciklus után van további 5 ciklus, ami gyakorlatilag relatív ugrást végez vissza az LDIR utasításra, amelyet aztán a Z80 újra beolvas a memóriából.
Title: Re: Lua scriptek fejlesztése
Post by: Lacika on 2010.June.12. 09:55:27
Az idődiagrammok honnan vannak?
Kicserélném az itt (http://ep128.hu/Sp_Konyv/Z80_sorozat_1.htm) látható rosszabb minőségű képeket.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2010.June.12. 10:05:03
Az idődiagrammok honnan vannak?
Kicserélném az itt (http://ep128.hu/Sp_Konyv/Z80_sorozat_1.htm) látható rosszabb minőségű képeket.

Ebből (http://z80.info/zip/z80cpu_um.pdf) a PDF file-ból vannak (az ep128.hu-n ennek a magyar fordítása található ?), amely megtalálható ezen (http://z80.info/) az oldalon sok más Z80 dokumentáció között.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2010.June.12. 10:50:17
Az LDIR idõzítése azonos az LDI-vel, ha a végrehajtásával a BC értéke 0-ra csökken. Egyébként még a fent leírt 16 ciklus után van további 5 ciklus, ami gyakorlatilag relatív ugrást végez vissza az LDIR utasításra, amelyet aztán a Z80 újra beolvas a memóriából.
Ez megválaszolta a következõnek szánt kérdésemet: mitõl lassul be brutálisan az LDIR, ha az utasítás kódja a videó memóriába kerül. Naivan eddig azt hittem, csak egyszer olvassa be a Z80  :oops: és így akkor megúszhatóak a várakozások.
De így akkor egyértelmûen az jön ki, hogy minden esetben gyorsabb a kiírt LDI LDI LDI... sorozat, mint az LDIR. Persze bizonyos mennyiség felett elég memória pazarló ez a módszer :-)
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2010.June.12. 12:44:14
  * subrtimer.lua (http://enterpriseforever.com/dlattach.html;topic=511.0;attach=5305) (0.99 KB - downloaded 5 times.)

Kisebb javítás: a "callTime" paramétert az eredeti verzió nem vette figyelembe.
  [attachurl=#]
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2011.May.31. 13:05:19
Egy portról olvasható értéket hogyan lehet megváltoztatni Luaban?
Nyomtató scriptet szeretnék, és ehhez vissza kéne adni a READY jelet a B5-ös port egyik bitjén.
Meg kell nézni utasításkód alapján, hogy melyik regiszterbe történt az olvasás, és aztán annak értékét módosítani? Vagy van egyszerûbb megoldás?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.02. 20:30:43
itt egy részletesebb leírás a Spectrum programok attribútum és I/O mûveleteit figyelõ zxiolog.lua (http://enterpriseforever.com/dlattach.html;topic=132.0;attach=3848) script mûködésérõl:

Én vagyok ügyetlen, vagy tényleg nem mûködik ez a script a zx128emu-val?  :oops:
A ROM-ot kijegyzeteli, de a játékot nem:
0296: IOR
03E1: IOW
0548: IOW
054C: IOR
055C: IOW
0562: IOR
05F1: IOR
0601: IOW
1F56: IOR
229B: IOW

Ennyit kapok csak.
Title: Re: Lua scriptek fejlesztése
Post by: geco on 2012.February.03. 08:45:35
Én vagyok ügyetlen, vagy tényleg nem mûködik ez a script a zx128emu-val?  :oops:
A ROM-ot kijegyzeteli, de a játékot nem:
0296: IOR
03E1: IOW
0548: IOW
054C: IOR
055C: IOW
0562: IOR
05F1: IOR
0601: IOW
1F56: IOR
229B: IOW

Ennyit kapok csak.
Nem az lehet a gond, hogy a script direct EP128emu-ra készült, és a video memória belapozott állapotát figyeli?
      if (getMemoryPage(1) == 0xFD or getMemoryPage(1) == 0xFE) and
         getMemoryPage(SHR(getPC(), 14)) >= 0x80 then
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2012.February.03. 10:00:18
Nem az lehet a gond, hogy a script direct EP128emu-ra készült, és a video memória belapozott állapotát figyeli?
      if (getMemoryPage(1) == 0xFD or getMemoryPage(1) == 0xFE) and
         getMemoryPage(SHR(getPC(), 14)) >= 0x80 then

Valóban, ez az EP-s Spectrum emulátorhoz, vagy a zx128emu egy régi verziójához készülhetett. Az ep128emu 2.0.9.1-ben található zx128emu-ban a RAM mindig a 0. szegmenstől kezdődik, a ROM pedig 80h-tól.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.04. 12:28:03
Közben találtam egy fejlettebb verziót (biztos innen van a fórumról, de nem találom hol volt szó róla  :( ) de ez se igazán akar mûködni  :oops:
A fájl dátuma 2010 május.
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2012.February.04. 13:39:18
Közben találtam egy fejlettebb verziót (biztos innen van a fórumról, de nem találom hol volt szó róla  :( ) de ez se igazán akar mûködni  :oops:

Ezzel pontosan mi a probléma, és milyen célra használtad ?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.04. 15:52:41
Ezzel pontosan mi a probléma, és milyen célra használtad ?
Most mûködik  :oops:
De nem értem mi történhetett, az volt a bajom, hogy resetnél nem mentette ki az eredményt, ill. ugyan feldobta a debugger ablakot, de nem írta ki, hogy reset az ... címen. Ezért gondoltam, hogy lehet, hogy ez is régebbi emulátorhoz készült?
Most viszont simán megy, ugyanaz a emulátor, ugyanaz a lua, ugyanaz a játék... még a windows se volt újraindítva, csak sleepben volt egy ideig. X-akta...  :oops:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.04. 21:59:41
Egy portról olvasható értéket hogyan lehet megváltoztatni Luaban?
Nyomtató scriptet szeretnék, és ehhez vissza kéne adni a READY jelet a B5-ös port egyik bitjén.
Meg kell nézni utasításkód alapján, hogy melyik regiszterbe történt az olvasás, és aztán annak értékét módosítani? Vagy van egyszerûbb megoldás?

Ezt sikerült összehoznom, némi másolgatással István korábbi scriptjeibõl  :oops:
Biztos lehetne egyszerûbben is  :oops:
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2012.February.04. 22:42:02
Ezt sikerült összehoznom, némi másolgatással István korábbi scriptjeibõl  :oops:

Működik, BASIC-ben sikerült "nyomtatni" a debugger ablakba :)
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.04. 22:42:22
Ugyanaz fájlba mentéssel.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.04. 22:46:49
Mûködik, BASIC-ben sikerült "nyomtatni" a debugger ablakba :)
Ez volt az elsõnek kitûzött cél :-)
A távlati az lenne, hogy egy EP80+ nyomtatót (http://enterprise.iko.hu/books/EP80.pdf) szimulálni úgy, hogy mondjuk BMP-kbe kerülnének a lapok.

Ennek kapcsán kérdés: van méret korlát a LUA tömbökre?
Úgy képzelném, hogy a lap méretének megfelelõ tömböt létrehozni, aminek a bitjei jelképeznék az egyes pixeleket.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.05. 10:17:03
Ugyanaz fájlba mentéssel.
Így most már ezt is sikerült meglesni :-)
Találós kérdés: mi ez?
A helyes megfejtõk között ajándék LUA scriptet sorsolunk ki  :ds_icon_cheesygrin:
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2012.February.05. 14:14:47
Találós kérdés: mi ez?
"Sajnos" a kínai karaktereket nem jeleníti meg a gépem. De ha meg is jelenítené, akkor se tudnám elolvasni.  :ds_icon_cheesygrin:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.05. 14:32:18
"Sajnos" a kínai karaktereket nem jeleníti meg a gépem. De ha meg is jelenítené, akkor se tudnám elolvasni.  :ds_icon_cheesygrin:
hexeditorban nézd  :)
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2012.February.05. 14:48:41
hexeditorban nézd  :)
Így is kínai volt. Talán a EP80-as nyomtató memóriatérképébõl lehet részlet vagy ilyesmi.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.05. 14:54:19
Így is kínai volt. Talán a EP80-as nyomtató memóriatérképébõl lehet részlet vagy ilyesmi.
Nagyon hideg, olyan mint ami most kint van  :ds_icon_cheesygrin:
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.05. 17:23:26
Na jó, akkor a megfejtés: így beszél az Eat it Up Speakeasy-n.
Ez a script visszafordítja a használati útmutatóban (http://gafz.enterpriseforever.com/PDF/SpeakEasy.pdf) található kódokra, így nagyjából már lehet érteni.

István! Az emulátor hangpufferébe lehet hangot rakni LUA-ból? Akkor meg lehetne csinálni, hogy beszéljen is.
Ha nem, akkor esetleg a következõ verzióba lehetne mondjuk wav fájl lejátszást kérni?  :oops: (Ez végülis a magnó emulálásban benne van) Így más régi kívánságokat is meg lehetne oldani, pl magnó relé kattogás, floppy fejléptetés hang.
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2012.February.05. 21:59:12
Na jó, akkor a megfejtés: így beszél az Eat it Up Speakeasy-n.
Ez a script visszafordítja a használati útmutatóban (http://gafz.enterpriseforever.com/PDF/SpeakEasy.pdf) található kódokra, így nagyjából már lehet érteni.
Nekem ez magas. Akkor mit is csinált az a lua script, amit nem tudtunk megfejteni? És ez a másik mit fordít vissza mire?  :oops:

UI.: Eddig észre se vettem a Speakeasy útmutatóját. 3 nyelven is megvan, nagyon ügyes!
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.05. 22:10:04
Nekem ez magas. Akkor mit is csinált az a lua script, amit nem tudtunk megfejteni?
Az lementi azt az adatot, ami a printerportra van kiküldve. Normál esetben, pl egy BASIC LLIST, ez szöveges adat. Viszont a Speakeasy is a nyomtató portra csatlakozik (ez lett volna a megfejtés kulcsa, ha nem nyomtató, akkor mit kötünk még oda?), és pontosan ugyanúgy lehet kiküldeni rá az adatokat, mint egy nyomtatóra. Így ugyanezzel a módszerrel azt is le lehet menteni, hogyan beszél az Eat it Up. A megkapott bájtokat megnézve a Speakeasy könyvében, megkapjuk a szöveget, fõleg, ha valaki ért a nyelvészethez, és tudja, hogy az egyes fonémákat, hogyan kell kiejteni  :ds_icon_cheesygrin:

Quote
És ez a másik mit fordít vissza mire?  :oops:
Ez elvégzi a könyvbõl kikeresést, így ilyeneket kapunk eredményként:
Code: [Select]
200ms Pause
200ms Pause
/HH1/  H
/EH/   E
/LL/   L
/OW/  AU
200ms Pause
200ms Pause
/WW/   W
/EH/   E
/LL/   L
/KK3/  C
/AA/   O
/MM/   M
100ms Pause
/TT2/  T
/UW1/  O
200ms Pause
/IY/   E
/TT1/  T
 30ms Pause
 50ms Pause
/IH/   I
/TT1/  T
100ms Pause
/AA/   O
/PP/   P
 10ms Pause
200ms Pause
/GG2/  G
/EH/   E
 30ms Pause
/TT1/  T
100ms Pause
/RR1/  R
/EH/   E
 30ms Pause
/DD1/ LD
/IY/   E
200ms Pause
/PP/   P
/LL/   L
/EY/  EI
/ER1/ IR
200ms Pause
/WW/   W
/AO/  AU
/NN1/  N
 30ms Pause
200ms Pause
200ms Pause
/HH1/  H
/IH/   I
/TT1/  T
200ms Pause
/FF/   F
/AY/   Y
/ER2/ERR
200ms Pause
/SS/   S
/TT1/  T
/AR/   A
/TT1/  T
100ms Pause
 50ms Pause
/IY/   E
/TT1/  T
 10ms Pause
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2012.February.05. 22:54:04
Ügyes! Nem jöttem volna rá, hogy itt éppen nem nyomtatóról van szó.

Quote
Ez elvégzi a könyvbõl kikeresést, így ilyeneket kapunk eredményként:
A gyakorlatban hogyan végzi? Futnia kell az Eat It Up játéknak és amikor "duma" van, akkor akciózik a script?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.05. 23:01:48
A gyakorlatban hogyan végzi? Futnia kell az Eat It Up játéknak és amikor "duma" van, akkor akciózik a script?
Így van, aztán ha benézel a debugger ablakba, ott az eredmény. (Mint a nem fájlba nyomtató printer scriptnél is)

Használata: debuggerben betölteni a scriptet, RUN, majd Continue.
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2012.February.05. 23:32:10
Használata: debuggerben betölteni a scriptet, RUN, majd Continue.
Nem próbáltam, de gondolom, a program maga lefagy, mert a Speakeasy mûködése nincs emulálva. De attól még a nyomtatóra küldött adatokat érzékelheti a script.
Volt valamelyik Enterpressben egy leírás egy olyan zeneszerkesztõ programról, ami végül nem jelent meg. Mintha abban is lett volna valami a nyomtatóporton, talán hangdigitalizáló/mikrofon? De az talán nem, mert azon meg befele jönnének az adatok, a nyomtatónál meg kifele.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2012.February.06. 00:22:59
Nem próbáltam, de gondolom, a program maga lefagy, mert a Speakeasy mûködése nincs emulálva.
Nem fagy le, mivel emulálva van, csak hangunk nincs. De amit a gép érzékel belõle (ez gyakorlatilag a Ready jelet jelenti a printerporton) az meg van. (Egyébként valódi gépen valódi nyomtatóra is lehetne speakeasy-zni, ugyanúgy krixkraxok jönnének a papírra, mint abban a text fájlban :-) ha hexdump módba van kapcsolva a nyomtató, akkor láthatóak lennének a kódbájtok.)
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2013.January.08. 13:48:32
Mivel a zx128emu-ban nincs lemezkezelés :oops: , más Spectrum emulátorban meg nincs értelmes debugger, így alkottam egy ilyet: TRDOS szektor olvasás/irás emuláció zx128emu-hoz.
A disk image-t beolvassa egy tömbbe, majd az első breakpointot a LOAD rutinra teszi, ekkor betölti az indító fájlt (ennek adatait nekünk kell kikeresni, és beírni), és elindítja.
Ezután a TR-DOS belépési pontot figyelve elvégzi a szükséges szektor műveleteket.
Az olvasási rutinban kikommentelve benne van az is, hogy fájlba kimentse az aktuális szektorcsoportot, átírás esetére :-)

Biztos szebben is meg lehet csinálni, de úgy tűnik ez is működik :oops:
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2014.November.25. 18:09:40
printer-file.lua (1.78 kB - letöltve 8634 alkalommal.)
Ez hova menti a fájlt, hol jelenik meg?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2014.November.25. 21:22:37
Ez hova menti a fájlt, hol jelenik meg?
Az emulátor könyvtárába.
Title: Re: Lua scriptek fejlesztése
Post by: szipucsu on 2014.November.26. 10:05:49
Az emulátor könyvtárába.
Nem rossz!
Azt nem lehetne megoldani, hogy abba a könyvtárba mentsen, amit a SET WORKING DIRECTORY-nak megadtunk?
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2015.April.25. 19:23:39
Apropó, honnan lehet tudni a fájlok sorrendjét. Csak azért kérdezem, mert a kazettákon tartott játékok ezt az információt is hordozzák (mármint a felvételek sorrendjét) ami a RAR fájlokból már hiányzik.
Itt van egy LUA script erre a célra. (István example-jéből módosítva.)
Be kell tölteni az ep128emu debuggerébe, majd futtatni, ezután elindítani az adott játék töltését, a debuggerben szép sorban kiírja, hogy milyen fájlokat nyitott meg a program.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2016.May.31. 22:47:38
CP/M hívások megfigyelése IS-DOS alatt.
Title: Re: Lua scriptek fejlesztése
Post by: Povi on 2016.June.03. 05:26:40
Egy olyan lua script érdekelne, ami megmondja, hogy egy adott címen hányszor van a PC 1 mp alatt...
Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2016.June.03. 18:34:06
Egy olyan lua script érdekelne, ami megmondja, hogy egy adott címen hányszor van a PC 1 mp alatt...

Code: Lua
  1. addr = 0x0030
  2.  
  3. insCnt = 0
  4. prvX, prvY = getVideoPosition()
  5. slotCnt = 0
  6.  
  7. function breakPointCallback(t, a, v)
  8.   local x, y = getVideoPosition()
  9.   local d = x - prvX
  10.   if d < 0 then
  11.     d = d + 57
  12.   end
  13.   slotCnt = slotCnt + d
  14.   prvX = x
  15.   if (t == 0 or t == 3) and a == addr then
  16.     insCnt = insCnt + 1
  17.   end
  18.   if slotCnt >= 889846 then
  19.     slotCnt = slotCnt - 889846
  20.     mprint(insCnt)
  21.     insCnt = 0
  22.     return true
  23.   end
  24.   return false
  25. end

A program futását a Step gombbal kell folytatni a Continue helyett. Az időtartamot a 889846 érték módosításával lehet változtatni.
Title: Re: Lua scriptek fejlesztése
Post by: Povi on 2016.June.04. 06:08:28
köszi, működik!

a szép kerek 889846 érték hogy jött ki?
Title: Re: Lua scriptek fejlesztése
Post by: geco on 2016.June.04. 09:24:27
Nem a Nick sebessege annyi? Most sajnos emun nem tudom megnezni
Title: Re: Lua scriptek fejlesztése
Post by: lgb on 2016.June.04. 10:55:18
köszi, működik!

a szép kerek 889846 érték hogy jött ki?

Az elvileg a Nick "slot-ok" szama egy masodperc alatt, ha jol remlik. Amin belul a Nick mindig 2 byte-ot kepes olvasni ugye. Mindhati a "slot frekvencia" 889846 Hz :) Ha jol tippelek, max felbontasban (ket szinu mod) 16 pixelt kepes ebbol megjeleniteni, igy ezt 16-al szorozva: 14237536Hz, szoval 14 egesz valamennyi MHz, ami a pixel/dot clock. Ennek a felet (ha jol tudom) hasznaljak egyes turbos megoldasoknal, ami igy kb 7.1MHz-je jon ki.
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2016.August.22. 14:40:32
István! Tudnál segíteni, hogyan lehetne lapozható ROM-ot csinálni Spectrum módban?
Odáig világos, hogy beolvasni a ROM fájlt egy nagy tömbbe, amiből aztán a lapozás és a cím alapján ki lenne keresve az aktuálisan olvasandó bájt.
Az hogyan oldható meg, hogy a CPU át legyen verve, és az adott bájtot olvassa, nem amit amúgy olvasna a memóriából?

Title: Re: Lua scriptek fejlesztése
Post by: IstvanV on 2016.August.22. 17:55:19
Az hogyan oldható meg, hogy a CPU át legyen verve, és az adott bájtot olvassa, nem amit amúgy olvasna a memóriából?

Ez nem tudom, megoldható-e emulátor módosítás nélkül. :oops: Esetleg ha csak 48K-s Spectrum módban kellene, akkor futhatna 128K-s módban és ott emulálhatná a lapozást, de az is meglehetősen korlátozott. Talán még az EP-s Spectrum emulátor script (https://enterpriseforever.com/emulatorok/re-spectrum-emulator-1018/msg16747/#msg16747) továbbfejlesztése lehetne megoldás, ott legalább szabadon használható a DAVE memória lapozása. :)
Title: Re: Lua scriptek fejlesztése
Post by: Zozosoft on 2016.August.22. 18:27:18
Ez nem tudom, megoldható-e emulátor módosítás nélkül. :oops:
És bonyolult módosítás kéne? Talán csak annyi kéne, hogy legyen olyan memória írás a LUA-ban, ami ROM-ba is tud írni. (És akkor lapozásnál be lehet írni az új tartalmat.)

Egyébként erről a cuccról lenne szó. (http://www.sinclair.hu/hardver/periferia/spectrum_diag/index.php) Felmerült, hogy ha már ott az a nagy ROM IC, megcsinálni, hogy pár játék onnan induljon. Gondoltam egyszerűbb lenne ha a ROM-ból töltőt tudnám tesztelni emulátoron :-)