Enterprise Forever  |  :HUN  |  Emulátorok  |  Topic: Lua scriptek fejlesztése
Author Topic: Lua scriptek fejlesztése  (Read 6302 times)« previous next »
Zozosoft
EP addict
*
Online Online

Hungary

Posts: 5611


OS:
Windows XP
Browser:
Firefox 3.5.3


View Profile WWW
New Posts
« 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 ds_icon_cry  ds_icon_redface
Logged


Enterprise Forever
« on: 2009.September.21. 10:17:19 »

 Logged

IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #1 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 ds_icon_cry  ds_icon_redface

Igen, valószínűnek tartottam, hogy azért nem próbálja ki senki, mert "biztosan bonyolult és nehéz megtanulni" Smiley 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.
Logged

Zozosoft
EP addict
*
Online Online

Hungary

Posts: 5611


OS:
Windows XP
Browser:
Firefox 3.5.3


View Profile WWW
New Posts
« Reply #2 on: 2009.September.23. 16:22:54 »

Alapvetően, hogy kell elképzelni ezt a LUA-t? Gyakorlatilag folyamatosan fut az emulátor mellett?
Logged


IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #3 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 Smiley).

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
for i = 0, 0x3FFF do
 writeMemoryRaw(0x3F4000 + i, 0x55)
end
c = 0
function breakPointCallback(t, a, v)
 if t == 0 and a == 0x30 then
   c = c + 1
   if c >= 3 then
     c = 0
     return true
   end
   return false
 end
 return true
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.
Logged

Zozosoft
EP addict
*
Online Online

Hungary

Posts: 5611


OS:
Windows XP
Browser:
Firefox 3.5.3


View Profile WWW
New Posts
« Reply #4 on: 2009.September.23. 16:58:28 »

Áhá! Lassan kezd derengeni
Logged


Ferro73
EP user
*
Offline Offline

Hungary

Posts: 317

OS:
Windows XP
Browser:
Firefox 2.0.0.9


View Profile
New Posts
« Reply #5 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.
Logged

IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #6 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.
Logged

Ferro73
EP user
*
Offline Offline

Hungary

Posts: 317

OS:
Windows XP
Browser:
Firefox 2.0.0.9


View Profile
New Posts
« Reply #7 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.
Logged

IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #8 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.
Logged

Ferro73
EP user
*
Offline Offline

Hungary

Posts: 317

OS:
Windows XP
Browser:
Firefox 2.0.0.9


View Profile
New Posts
« Reply #9 on: 2009.September.23. 19:17:44 »

A lua csak akkor fut ha benvan/megnyitvan/ a debugger ablak?
Logged

IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #10 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.
Logged

Ferro73
EP user
*
Offline Offline

Hungary

Posts: 317

OS:
Windows XP
Browser:
Firefox 2.0.0.9


View Profile
New Posts
« Reply #11 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
Logged

Zozosoft
EP addict
*
Online Online

Hungary

Posts: 5611


OS:
Windows XP
Browser:
Firefox 3.5.3


View Profile WWW
New Posts
« Reply #12 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)?
Logged


IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #13 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.
Logged

IstvanV
EP addict
*
Offline Offline

Posts: 2104

OS:
Linux (Suse)
Browser:
Konqueror 3.5.9


View Profile
New Posts
« Reply #14 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 script működéséről:

Code
for i = 0x5800, 0x5AFF do
 setBreakPoint(1, i, 3)
 setBreakPoint(2, i, 3)
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
setBreakPoint(5, 0xFE, 3)
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
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
attrReadMap = {}
attrWriteMap = {}
ioFEReadMap = {}
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
for i = 0x0000, 0xFFFF do
 attrReadMap[i] = false
 attrWriteMap[i] = false
 ioFEReadMap[i] = false
 ioFEWriteMap[i] = false
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
function breakPointCallback(t, a, v)
 if t == 1 or t == 2 then
   if a >= 0x5800 and a < 0x5B00 then
     if (getMemoryPage(1) == 0xFD or getMemoryPage(1) == 0xFE) and
        getMemoryPage(SHR(getPC(), 14)) >= 0x80 then
       if t == 1 then
         attrReadMap[getPC()] = true
       else
         attrWriteMap[getPC()] = true
       end
     end
     return false
   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
  elseif t == 5 or t == 6 then
   if AND(a, 0xFF) == 0xFE then
     if getMemoryPage(SHR(getPC(), 14)) >= 0x80 then
       if t == 5 then
         ioFEReadMap[getPC()] = true
       else
         ioFEWriteMap[getPC()] = true
       end
     end
     return false
   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
  elseif t == 0 and a == 0x0000 then
   clearBreakPoints()
   f = io.open("zxiolog.txt", "w")
   for i = 0x0000, 0xFFFF do
     if attrReadMap[i] then
       f:write(string.format("%04X: AR\n", i))
     end
     if attrWriteMap[i] then
       f:write(string.format("%04X: AW\n", i))
     end
     if ioFEReadMap[i] then
       f:write(string.format("%04X: IOR\n", i))
     end
     if ioFEWriteMap[i] then
       f:write(string.format("%04X: IOW\n", i))
     end
   end
   f:close()
   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
  end
 return true
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.
« Last Edit: 2009.September.24. 17:13:11 by IstvanV » Logged

Enterprise Forever
« Reply #14 on: 2009.September.24. 17:09:59 »

 Logged
Tags:
Enterprise Forever  |  :HUN  |  Emulátorok  |  Topic: Lua scriptek fejlesztése

Powered by SMF 1.1.2 | SMF © 2006-2007, Simple Machines LLC
Seo4Smf v0.2 © Webmaster's Talks

Template made by Mr.Prise
Page created in 0.166 seconds with 25 queries.
Google visited last this page 2012.May.07. 07:23:51
Follow ep4ever_news on Twitter