Welcome, Guest. Please login or register.


Author Topic: Lua scriptek fejlesztése (Read 73978 times)

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Lua scriptek fejlesztése
« Reply #15 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 script mûködésérõl:
Ezt akartam kérni, csak nem mertelek fárasztani  :oops:

Offline Ferro73

  • EP lover
  • *
  • Posts: 967
  • Country: hu
Re: Lua scriptek fejlesztése
« Reply #16 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ö

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Lua scriptek fejlesztése
« Reply #17 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 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.
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Lua scriptek fejlesztése
« Reply #18 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ó. :)
« Last Edit: 2009.September.24. 23:24:02 by IstvanV, Reason: NMI és megszakítás figyelmen kívül hagyása »

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Lua scriptek fejlesztése
« Reply #19 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?

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Lua scriptek fejlesztése
« Reply #20 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 :?:

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Lua scriptek fejlesztése
« Reply #21 on: 2009.September.25. 23:23:42 »
Így már megy :-)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Lua scriptek fejlesztése
« Reply #22 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 :)).

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Lua scriptek fejlesztése
« Reply #23 on: 2009.October.01. 17:49:58 »
Újabb script magyarázat (hátha érdekel valakit :)). Ezúttal a dtftimer.lua, 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.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Lua scriptek fejlesztése
« Reply #24 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.

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Lua scriptek fejlesztése
« Reply #25 on: 2009.October.15. 22:32:11 »
Tehát akkor már van egy felhasználó :?: :)
Itt az elsõ próbálkozás :-)

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Lua scriptek fejlesztése
« Reply #26 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.
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Lua scriptek fejlesztése
« Reply #27 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.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Lua scriptek fejlesztése
« Reply #28 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 :)

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14722
  • Country: hu
    • http://enterprise.iko.hu/
Re: Lua scriptek fejlesztése
« Reply #29 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: