Welcome, Guest. Please login or register.


Author Topic: Banana (Read 29904 times)

Offline Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Banana
« Reply #45 on: 2018.May.21. 00:03:55 »
Hát ez valóban sokkal gyorsabb, és a .COM is rövidebb lett. Sokat számít, hogy mivel fordítják. Megpróbáltam az SDCC-t feltenni Win 7 alá, de nem sikerült, valami platform baja van. Itt fel is adtam, a nehezebb fordítás meg ez elrettentett. :)
Kotasoft

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Banana
« Reply #46 on: 2018.May.21. 08:40:52 »
Ez működik, bár kevésbé optimalizált, mint a csak SDCC-vel készült változat:

zcc +enterprise -create-app -compiler sdcc Banana.c

[ Guests cannot view attachments ]

Offline Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Banana
« Reply #47 on: 2018.May.21. 09:50:40 »
Tyű, ez is marha gyors, és így is rövidebb a program, kb. az eredeti és az SDCC között van a mérete. :) Jóval tovább fordít, először azt hittem, hogy meg is fagyott. Viszont így vannak a kódban olyan részek, amiket nem értek. Pl. az assembly-ben megírt függvényekben mindig fel kell sorolni a paramétereket újra (void)-ként is? A __z88dk_callee és a __naked mit csinál? A véletlenszámot adó függvényben van egy ilyen: "00001$:\n", ez micsoda? Meg ha jól látom, a "defb" helyett ".byte" van.

Ha ennyivel gyorsabb tud lenni és lehet hosszabb a program, akkor pár dolog még belefér, és megpróbálom a függőleges visszafutáshoz szinkronizálni. Úgy egy- és kétszemélyes módban is azonos sebességű lenne a játék.

Azt is meg kell oldani, hogy ha teljesen függőlegesen halad a kukac páros oszlopban, azaz bájt határon, akkor ne gyorsuljon fel annyira. Az a képkirakó rutin gyorsabb, mint ami fél bájtnál kezdi el megjeleníteni a képet.
Kotasoft

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Banana
« Reply #48 on: 2018.May.21. 12:45:03 »
Jóval tovább fordít, először azt hittem, hogy meg is fagyott.

Meg lehet oldani azt is, hogy -compiler sdcc nélkül is használható legyen, a Z88DK_USES_SDCC makrótól függően feltételes fordítással. Talán a legáttekinthetőbb az, ha van két külön include file csak az asm-ek számára.

Quote
Viszont így vannak a kódban olyan részek, amiket nem értek. Pl. az assembly-ben megírt függvényekben mindig fel kell sorolni a paramétereket újra (void)-ként is?

Ennek csak az a célja, hogy a fordító ne írjon ki figyelmeztetéseket a látszólag nem használt paraméterek miatt.

Quote
A __z88dk_callee és a __naked mit csinál?

A __naked azt jelenti, hogy a függvény teljesen assembly nyelvű lesz, így tartalmazza a RET utasítást és a verem kezelését, tehát a fordítónak nem kell utasításokat generálni ilyen célra.

A __z88dk_callee használatakor a hívott függvény feladata a paraméterek leemelése a veremről. PC-s fordítóknál hasonló eltérést jelent az "stdcall" a 32 bites módban alapértelmezett "cdecl" helyett. Itt az az előnye, hogy egyszerűbb és gyorsabb lehet a kód, a paramétereket POP utasításokkal tudja olvasni, majd a visszatérési címet visszateszi egy PUSH utasítással. Ha a rutinnak egyébként nincs szüksége a HL regiszterre, akkor akár JP (HL) utasítással is visszatérhet.

Quote
A véletlenszámot adó függvényben van egy ilyen: "00001$:\n", ez micsoda? Meg ha jól látom, a "defb" helyett ".byte" van.

Az assembly kódban címkék is használhatók (00001$, 00002$, stb.). A z88dk beépített SDCC fordítójánál azonban csak __sdcc_local_00001 és hasonló neveken lehet ezekre hivatkozni. Az assemblerek között van néhány szintaktikai eltérés, mint például a defb helyetti .byte, az SDCC nem csak Z80 CPU-t támogat, ezért kevésbé "szabványos" a Z80 assembly.

Quote
Ha ennyivel gyorsabb tud lenni és lehet hosszabb a program, akkor pár dolog még belefér, és megpróbálom a függőleges visszafutáshoz szinkronizálni. Úgy egy- és kétszemélyes módban is azonos sebességű lenne a játék.

Még azzal is lehetne próbálkozni, hogy a tömbök ne külön szegmensen legyenek, hanem a program 48K-s legyen és akkor a tömbök egyszerű statikus változók lehetnek és közvetlenül használhatók Poke helyett.

Quote
Azt is meg kell oldani, hogy ha teljesen függőlegesen halad a kukac páros oszlopban, azaz bájt határon, akkor ne gyorsuljon fel annyira. Az a képkirakó rutin gyorsabb, mint ami fél bájtnál kezdi el megjeleníteni a képet.

Az időzítésre a megszakítások használata lenne az ideális megoldás, saját rutin írásával, vagy a RANDOM_IRQ változó (0xBFEC a rendszerszegmensen) figyelésével. Az utóbbit minden megszakítás eggyel növeli, bár az 1 Hz-es megszakítások is.

Offline Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Banana
« Reply #49 on: 2018.May.21. 12:59:32 »
Köszönöm a válaszokat!

Még azzal is lehetne próbálkozni, hogy a tömbök ne külön szegmensen legyenek, hanem a program 48K-s legyen és akkor a tömbök egyszerű statikus változók lehetnek és közvetlenül használhatók Poke helyett.

Alaposan kivesézted a programot. :) Ez a része a 16K-s határ miatt lett ilyen, hogy a fordított .COM minél kisebb legyen. A tömbök jelentősen növelték a .COM méretét, aztán nem indult el a program. Ez most ugyan megoldva, de egyelőre ezt a részt nem piszkálom.

Feltűnt, hogy az átírt assembly rutinokban fordított sorrendben töltöd fel a regisztereket a paraméterekben átadott értékekkel. Te az elején kezded, én pedig a végén. Ez miért más?

Amikor "pop"-pal veszed ki az értéket a veremből, mint pl. a "CopyMem" függvényben, nincs hozzá ugyanannyi "push". Ez nem okoz gondot? Vagy épp ezt csinálja a __z88dk_callee?
Kotasoft

Offline endi

  • EP addict
  • *
  • Posts: 7298
  • Country: hu
  • grafikus, játékfejlesztõ, programozás, scifi, tudományok, vallás
    • Honlapom
Re: Banana
« Reply #50 on: 2018.May.21. 13:09:41 »
azért kíváncsi lennék milyen jó z80 kódot tud fordítani egy ilyen c fordító.
állítólag már jópár évtizede a komplex procikra egy fordító jobb asm kódot csinál mint az ember, mivel ügye olyan bonyolultak ezek a procik, hogy az ember nem tudja kihasználni a mindenféle furcsa és kevésbé furcsa dolgait :) (na ezt jól megfogalmaztam).

de z80 esetén? itt ügye nem sokat lehet trükközni...
Vigyázat! Szektás vagyok! :)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Banana
« Reply #51 on: 2018.May.21. 13:25:26 »
Ez most ugyan megoldva, de egyelőre ezt a részt nem piszkálom.

A sok Poke cseréje valóban viszonylag nagy átalakítás lenne, de a kezdőcímek const típusúra módosítása is eredményezett kis mértékű javulást. Próbálkoztam még az időzítéssel is, most játszható 250 MHz-es CPU-n. :)

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Code: Diff
  1. @@ -39,29 +39,263 @@
  2.  unsigned char RA;
  3.  
  4.  // Pointers for the arrays, images and sprites on 0xB2 page
  5.  
  6. -unsigned int StoryPalette  = 0x8000;        // 1160 [145][8]
  7. -unsigned int MinionSprites = 0x8000 + 1160; // 2464 [2][4][308]
  8. -unsigned int BananaPic     = 0x8000 + 3624; //   67 [67]
  9. -unsigned int Bricks        = 0x8000 + 3691; //   76 [2][38]
  10. -unsigned int MenuText      = 0x8000 + 3767; //  264 [4][66]
  11. -unsigned int GameWorm      = 0x8000 + 4031; //   64 [2][32]
  12. -unsigned int MenuWorm      = 0x8000 + 4095; //  112 [2][56]
  13. -unsigned int HeartPic      = 0x8000 + 4207; //   77 [77]
  14. -unsigned int EndText       = 0x8000 + 4284; //   93 [93]
  15. -unsigned int ReadyText     = 0x8000 + 4377; //  121 [121]
  16. -unsigned int QuitText      = 0x8000 + 4498; //  122 [122]
  17. -unsigned int Digits        = 0x8000 + 4620; //  160 [10][16]
  18. -unsigned int PX            = 0x8000 + 4780; //  400 [2][MaxWorm=200]
  19. -unsigned int PY            = 0x8000 + 5180; //  400 [2][MaxWorm=200]
  20. +static const unsigned int StoryPalette  = 0x8000;        // 1160 [145][8]
  21. +static const unsigned int MinionSprites = 0x8000 + 1160; // 2464 [2][4][308]
  22. +static const unsigned int BananaPic     = 0x8000 + 3624; //   67 [67]
  23. +static const unsigned int Bricks        = 0x8000 + 3691; //   76 [2][38]
  24. +static const unsigned int MenuText      = 0x8000 + 3767; //  264 [4][66]
  25. +static const unsigned int GameWorm      = 0x8000 + 4031; //   64 [2][32]
  26. +static const unsigned int MenuWorm      = 0x8000 + 4095; //  112 [2][56]
  27. +static const unsigned int HeartPic      = 0x8000 + 4207; //   77 [77]
  28. +static const unsigned int EndText       = 0x8000 + 4284; //   93 [93]
  29. +static const unsigned int ReadyText     = 0x8000 + 4377; //  121 [121]
  30. +static const unsigned int QuitText      = 0x8000 + 4498; //  122 [122]
  31. +static const unsigned int Digits        = 0x8000 + 4620; //  160 [10][16]
  32. +static const unsigned int PX            = 0x8000 + 4780; //  400 [2][MaxWorm=200]
  33. +static const unsigned int PY            = 0x8000 + 5180; //  400 [2][MaxWorm=200]
  34.  
  35.  // Music
  36.  
  37.  unsigned char Volume = 50, VolumeInc = 1, MusicPtr;
  38.  static unsigned char Music[] = { 37, 12, 45, 12, 37, 12, 45, 12, 37, 12, 45, 6, 37, 31,
  39.                                   41, 12, 41, 12, 41, 12, 41, 12, 37, 12, 45, 6, 37, 31 };
  40.  
  41. +#ifdef Z88DK_USES_SDCC
  42. +void Set_EXOS_Var(unsigned char Variable, unsigned char Value) __naked
  43. +{
  44. +  (void) Variable;
  45. +  (void) Value;
  46. +  __asm__ (
  47. +      "ld    hl, #2\n"
  48. +      "add   hl, sp\n"
  49. +      "ld    c, (hl)\n"
  50. +      "inc   hl\n"
  51. +      "ld    d, (hl)\n"
  52. +      "ld    b, #1\n"
  53. +      "rst   0x30\n"
  54. +      ".byte 16\n"
  55. +      "ret\n"
  56. +  );
  57. +}
  58. +
  59. +unsigned char Ask_EXOS_Var(unsigned char Variable) __naked
  60. +{
  61. +  (void) Variable;
  62. +  __asm__ (
  63. +      "ld    hl, #2\n"
  64. +      "add   hl, sp\n"
  65. +      "ld    c, (hl)\n"
  66. +      "ld    b, #0\n"
  67. +      "rst   0x30\n"
  68. +      ".byte 16\n"
  69. +      "ld    l, d\n"
  70. +      "ret\n"
  71. +  );
  72. +}
  73. +
  74. +/* joystick status (1=right, 2=left, 4=down, 8=up, 16=fire) */
  75. +
  76. +unsigned char Get_Joy(unsigned char Channel, unsigned char Joy_number) __naked
  77. +{
  78. +  (void) Channel;
  79. +  (void) Joy_number;
  80. +  __asm__ (
  81. +      "ld    hl, #2\n"
  82. +      "add   hl, sp\n"
  83. +      "ld    a, (hl)\n"
  84. +      "inc   hl\n"
  85. +      "ld    c, (hl)\n"
  86. +      "ld    b, #9\n"
  87. +      "rst   0x30\n"
  88. +      ".byte 11\n"
  89. +      "ld    l, c\n"
  90. +      "ret\n"
  91. +  );
  92. +}
  93. +
  94. +#define Out(port_, value_)  { static __sfr __at (port_) tmp_; tmp_ = (value_); }
  95. +#define Peek(addr_)         *((unsigned char *) (addr_))
  96. +#define Poke(addr_, value_) *((unsigned char *) (addr_)) = (value_)
  97. +
  98. +void Open_Channel(unsigned char Channel, unsigned int FileNamePtr) __naked
  99. +{
  100. +  (void) Channel;
  101. +  (void) FileNamePtr;
  102. +  __asm__ (
  103. +      "ld    hl, #2\n"
  104. +      "add   hl, sp\n"
  105. +      "ld    a, (hl)\n"
  106. +      "inc   hl\n"
  107. +      "ld    e, (hl)\n"
  108. +      "inc   hl\n"
  109. +      "ld    d, (hl)\n"
  110. +      "rst   0x30\n"
  111. +      ".byte 1\n"
  112. +      "ret\n"
  113. +  );
  114. +}
  115. +
  116. +void Close_Channel(unsigned char Channel) __naked
  117. +{
  118. +  (void) Channel;
  119. +  __asm__ (
  120. +      "ld    hl, #2\n"
  121. +      "add   hl, sp\n"
  122. +      "ld    a, (hl)\n"
  123. +      "rst   0x30\n"
  124. +      ".byte 3\n"
  125. +      "ret\n"
  126. +  );
  127. +}
  128. +
  129. +unsigned char Channel_Status(unsigned char Channel) __naked
  130. +{
  131. +  (void) Channel;
  132. +  __asm__ (
  133. +      "ld    hl, #2\n"
  134. +      "add   hl, sp\n"
  135. +      "ld    a, (hl)\n"
  136. +      "rst   0x30\n"
  137. +      ".byte 9\n"
  138. +      "ld    l, c\n"
  139. +      "ret\n"
  140. +  );
  141. +}
  142. +
  143. +void Get_Block(unsigned char Channel, unsigned int Bytes, unsigned int BufPtr) __naked
  144. +{
  145. +  (void) Channel;
  146. +  (void) Bytes;
  147. +  (void) BufPtr;
  148. +  __asm__ (
  149. +      "ld    hl, #2\n"
  150. +      "add   hl, sp\n"
  151. +      "ld    a, (hl)\n"
  152. +      "inc   hl\n"
  153. +      "ld    c, (hl)\n"
  154. +      "inc   hl\n"
  155. +      "ld    b, (hl)\n"
  156. +      "inc   hl\n"
  157. +      "ld    e, (hl)\n"
  158. +      "inc   hl\n"
  159. +      "ld    d, (hl)\n"
  160. +      "rst   0x30\n"
  161. +      ".byte 6\n"
  162. +      "ret\n"
  163. +  );
  164. +}
  165. +
  166. +unsigned char Write_Block(unsigned char Channel, unsigned int Bytes, unsigned int BufPtr) __naked
  167. +{
  168. +  (void) Channel;
  169. +  (void) Bytes;
  170. +  (void) BufPtr;
  171. +  __asm__ (
  172. +      "ld    hl, #2\n"
  173. +      "add   hl, sp\n"
  174. +      "ld    a, (hl)\n"
  175. +      "inc   hl\n"
  176. +      "ld    c, (hl)\n"
  177. +      "inc   hl\n"
  178. +      "ld    b, (hl)\n"
  179. +      "inc   hl\n"
  180. +      "ld    e, (hl)\n"
  181. +      "inc   hl\n"
  182. +      "ld    d, (hl)\n"
  183. +      "rst   0x30\n"
  184. +      ".byte 8\n"
  185. +      "ld    l, a\n"
  186. +      "ret\n"
  187. +  );
  188. +}
  189. +
  190. +void CopyMem(unsigned int From, unsigned int To, unsigned int Count) __z88dk_callee __naked
  191. +{
  192. +  (void) From;
  193. +  (void) To;
  194. +  (void) Count;
  195. +  __asm__ (
  196. +      "pop   af\n"
  197. +      "pop   hl\n"
  198. +      "pop   de\n"
  199. +      "pop   bc\n"
  200. +      "push  af\n"
  201. +      "ldir\n"
  202. +      "ret\n"
  203. +  );
  204. +}
  205. +
  206. +void FillMem(unsigned int From, unsigned int Count, unsigned char Value) __z88dk_callee __naked
  207. +{
  208. +  (void) From;
  209. +  (void) Count;
  210. +  (void) Value;
  211. +  __asm__ (
  212. +      "pop   hl\n"
  213. +      "pop   de\n"
  214. +      "pop   bc\n"
  215. +      "dec   sp\n"
  216. +      "pop   af\n"
  217. +      "push  hl\n"
  218. +      "ld    l, e\n"
  219. +      "ld    h, d\n"
  220. +      "ld    (hl), a\n"
  221. +      "cpi\n"
  222. +      "ret   po\n"
  223. +      "ex    de, hl\n"
  224. +      "ldir\n"
  225. +      "ret\n"
  226. +  );
  227. +}
  228. +
  229. +unsigned char Rnd_0_127() __naked
  230. +{
  231. +  __asm__ (
  232. +      "00001$:\n"
  233. +      "ld    hl, #0x7fff\n"
  234. +      "ld    a, r\n"
  235. +      "xor   a, l\n"
  236. +      "add   hl, hl\n"
  237. +      "xor   a, h\n"
  238. +      "ld    l, a\n"
  239. +      "xor   a, h\n"
  240. +      "ld    h, a\n"
  241. +      "ld    (__sdcc_local_00001 + 1), hl\n"
  242. +      "and   a, #0x7f\n"
  243. +      "ld    l, a\n"
  244. +      "ret\n"
  245. +  );
  246. +}
  247. +
  248. +unsigned char Get_Segment() __naked
  249. +{
  250. +  __asm__ (
  251. +      "rst   0x30\n"
  252. +      ".byte 24\n"
  253. +      "cp    a, #1\n"
  254. +      "ld    a, c\n"
  255. +      "ld    (_SegNum), a\n"
  256. +      "ld    l, #0\n"
  257. +      "rl    l\n"
  258. +      "ret\n"
  259. +  );
  260. +}
  261. +
  262. +void Free_Segment(unsigned char Segment_Num) __naked
  263. +{
  264. +  (void) Segment_Num;
  265. +  __asm__ (
  266. +      "ld    hl, #2\n"
  267. +      "add   hl, sp\n"
  268. +      "ld    c, (hl)\n"
  269. +      "rst   0x30\n"
  270. +      ".byte 25\n"
  271. +      "ret\n"
  272. +  );
  273. +}
  274. +#else
  275.  void Set_EXOS_Var(unsigned char Variable, unsigned char Value)
  276.  {
  277.    #asm
  278.    ld      HL,2
  279. @@ -302,8 +536,30 @@
  280.    rst     30h
  281.    defb    25
  282.    #endasm
  283.  }
  284. +#endif
  285. +
  286. +static unsigned char Last_IRQ_Cnt = 0;
  287. +
  288. +void Timer_Init()
  289. +{
  290. +  Out(0xB2, 0xFF);
  291. +  Last_IRQ_Cnt = Peek(0xBFEC);
  292. +  Out(0xB2, DataSeg);
  293. +}
  294. +
  295. +void Timer_Wait(unsigned char n)
  296. +{
  297. +  volatile unsigned char  *p = (unsigned char *) 0xBFEC;
  298. +  unsigned char t;
  299. +
  300. +  Out(0xB2, 0xFF);
  301. +  while ((unsigned char) ((t = *p) - Last_IRQ_Cnt) < n)
  302. +    ;
  303. +  Last_IRQ_Cnt = t;
  304. +  Out(0xB2, DataSeg);
  305. +}
  306.  
  307.  unsigned char Get_VideoSegments()
  308.  {
  309.    unsigned char OK;
  310. @@ -451,9 +707,9 @@
  311.  
  312.  void Box16B(unsigned char Screen, unsigned char X_in_bytes, unsigned char Y,
  313.              unsigned char XSize_in_bytes, unsigned char YSize, unsigned char Colour)
  314.  {
  315. -  unsigned char i, j, Value;
  316. +  unsigned char /* i, */ j, Value;
  317.  
  318.    Get_Address(Screen, Y);
  319.    VideoOfs += (X_in_bytes + 0xC000);
  320.    Value = (Colour & 1) * 12 + (Colour & 2) * 96 + ((Colour & 4) / 4) * 3 + (Colour & 8) * 6;
  321. @@ -498,9 +754,9 @@
  322.  unsigned char GetPixel16(unsigned char Screen, unsigned char X, unsigned char Y)
  323.  {
  324.    Get_Address(Screen, Y);
  325.    VideoOfs += (X / 2 + 0xC000);
  326. -  return Peek(VideoOfs) && ((X % 2) ? 85 : 170);
  327. +  return Peek(VideoOfs) & ((X % 2) ? 85 : 170);
  328.  }
  329.  
  330.  void GetPic16B(unsigned char Screen, unsigned int X_in_bytes, unsigned int Y,
  331.                 unsigned char XSize_in_bytes, unsigned char YSize, unsigned int Address)
  332. @@ -618,9 +874,9 @@
  333.        if (Pic.PixelLines || (y == 0)) {
  334.          Get_Block(40, 8, (unsigned int) &Buf[8]);
  335.          if ((Block == 3) && (y == 0)) CopyMem((unsigned int) &Buf[8], StoryPalette + 144 * 8, 8);
  336.          if (Block < 5) {
  337. -          Buf[0] = Pic.PixelLines ? 255 : 256 - Pic.Lines;
  338. +          Buf[0] = Pic.PixelLines ? 255 : (unsigned char) (256 - Pic.Lines);
  339.            Buf[1] = Pic.VideoMode;
  340.            Buf[2] = 10;
  341.            Buf[3] = 52;
  342.            Buf[4] = VideoOfs % 256;
  343. @@ -762,17 +1018,17 @@
  344.    static unsigned char Video[] = { 6, 'V', 'I', 'D', 'E', 'O', ':' };
  345.    static unsigned char Snd[] = { 6, 'S', 'O', 'U', 'N', 'D', ':' };
  346.    static unsigned char Error[] = { 15, 'N', 'o', 't', ' ', 'e', 'n', 'o', 'u', 'g', 'h', ' ', 'R', 'A', 'M', '.' };
  347.  
  348. -  Out(0xB2, DataSeg);
  349.    Out(0xB3, 255);
  350.    SaveLPTAddr = Peek(0xFFF4) + Peek(0xFFF5) * 256 + 16384;
  351.    if (Get_VideoSegments() == 0) {
  352.      Print(0, (unsigned int) &Error[0]);
  353.      GetKey(1);
  354.      Term();
  355.      return;
  356.    }
  357. +  Out(0xB2, DataSeg);
  358.  
  359.    Set_EXOS_Var(7, 255);  // Click
  360.    Set_EXOS_Var(8, 255);  // Stop
  361.    Set_EXOS_Var(10, 1);   // Key rate
  362. @@ -934,8 +1190,9 @@
  363.      Poke(PX, 153); Poke(PY, 93);
  364.      Poke(PX + MaxWorm, 9); Poke(PY + MaxWorm, 32);
  365.      Bananas = 0; Bananas_to_eat = 10;
  366.      Track();
  367. +    Timer_Init();
  368.      do {
  369.        GetKey(0);
  370.        if ((Key == 27) || (Key == 3)) if (Quit()) GameEnd = 1;
  371.        if (Key == 'n') GameEnd = 2;
  372. @@ -1076,8 +1333,9 @@
  373.              if (PY1 > PY2) Box16(6, PX2, PY2, 6, 2, 0);
  374.            }
  375.          }
  376.        }
  377. +      Timer_Wait(2);
  378.      } while (GameEnd == 0);
  379.      if (GameEnd == 2) Level++;
  380.  
  381.      // All levels are completed

Quote
Feltűnt, hogy az átírt assembly rutinokban fordított sorrendben töltöd fel a regisztereket a paraméterekben átadott értékekkel. Te az elején kezded, én pedig a végén.

Ez is a fordítók közötti különbség.

Quote
Vagy épp ezt csinálja a __z88dk_callee?

Igen.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Banana
« Reply #52 on: 2018.May.21. 13:31:02 »
Ez még jobb kódot eredményez (szerk.: makrók helyett enum is használható):

Code: C
  1. #define StoryPalette    (0x8000)        // 1160 [145][8]
  2. #define MinionSprites   (0x8000 + 1160) // 2464 [2][4][308]
  3. #define BananaPic       (0x8000 + 3624) //   67 [67]
  4. #define Bricks          (0x8000 + 3691) //   76 [2][38]
  5. #define MenuText        (0x8000 + 3767) //  264 [4][66]
  6. #define GameWorm        (0x8000 + 4031) //   64 [2][32]
  7. #define MenuWorm        (0x8000 + 4095) //  112 [2][56]
  8. #define HeartPic        (0x8000 + 4207) //   77 [77]
  9. #define EndText         (0x8000 + 4284) //   93 [93]
  10. #define ReadyText       (0x8000 + 4377) //  121 [121]
  11. #define QuitText        (0x8000 + 4498) //  122 [122]
  12. #define Digits          (0x8000 + 4620) //  160 [10][16]
  13. #define PX              (0x8000 + 4780) //  400 [2][MaxWorm=200]
  14. #define PY              (0x8000 + 5180) //  400 [2][MaxWorm=200]
« Last Edit: 2018.May.24. 21:25:58 by IstvanV »

Offline Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Banana
« Reply #53 on: 2018.May.22. 22:40:57 »
A fórumtalira elkészült a módosított verziója a Banana játéknak. Istvántól rengeteg segítséget kaptam többek között az SDCC fordításban, időzítésben, assembly rutinokban és a sok-sok válaszában a fórumon feltett kérdéseimre. Ezer köszönet neki érte!
 
Amik változtak:

- Gyorsabb lett a játék két személyes módban, ez az optimalizált fordítás miatt van.
- Időzítés: egy és két játékos módnál is állandó a sebesség, itt átvettem István Timer rutinjait.
- A pontszám nem csordul túl, ha 255-nél több banánt esznek a kukacok, lehet zabálni.
- Eltűnt a pont a 2018 végéről. :)
- Tettem bele hangot, ha ütközik a kukac.
- Hang a játék kezdeténél: ez leginkább azért lett, hogy megszakítsa a menü zenéjét.
- Kapott a program plusz három pályát, emiatt a szintet két számjeggyel jelzi ki.
- Módosultak a kukacok kezdőpozíciói, így véletlenszerű, hogy melyikük ér előbb a falhoz, nem mindig a lila nyer.
- Lilább lett a lila kukac, ezt a kislányom kérte. Emiatt a téglák színe is megváltozott kicsit, mert épp az a szín kellett, de szerintem így is jó maradt. Úgy is mindig az van, amit a nők akarnak. :)

Viszont úgy néz ki, hogy EP32 alatt már nem megy a program, csak EP128EMU-n és igazi gépen.
 
Jó szórakozást! :)
 
------------------------
 
The amended version of Banana has been finished. I got so much help from István, e.g. how to compile with SDCC, help with the timer, in the assembly functions and his answers to my questions on the forum. Great thanks him!
 
Changes are:

- The game became faster in two players mode, it is because of the optimized compile.
- Timer: the speed is contant both in one player and two players mode. Here I took István’s Timer routines.
- The points do not overflow if the worms eat more than 255 bananas.
- The year 2018 is displayed in English form.
- There is sound if the worms go into the wall.
- Sound at the begin of the game: it interrupts the menu music.
- There are three extra levels, two digits are used to display the level number.
- The start positions of the worms are modified, it is random which worm crashes into the wall first. Not always the purple wins.
- The purple worm became more purple, it was requested by my daughter. Because of this the colour of the bricks changed a little but it still looks good.

Unfortunatelly it seems that the program no longer runs on EP32, just on EP128EMU and real machine.
 
Enjoy it! :)
« Last Edit: 2018.May.24. 21:11:24 by Tomato77 »
Kotasoft

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Banana
« Reply #54 on: 2018.May.23. 09:33:08 »
Kisebb bug: mivel a Get_Segment() függvény __naked, ezért a fordító nem generál RET utasítást, és az utána következő Free_Segment() is lefut. :oops: Még egy lehetséges hiba a GetPixel16() függvényben ez a sor:
Code: C
  1.   return Peek(VideoOfs) && ((X % 2) ? 85 : 170);
Itt a fordító figyelmeztetést is ír ki, elvileg az && helyett & kellene, bár nem lehetetlen, hogy a program mégis az elsőbbivel működik helyesen. Az eltérés valószínűleg csak annyi, hogy kevésbé pontos az ütközés vizsgálat, de valamivel gyorsabb.
« Last Edit: 2018.May.23. 09:51:30 by IstvanV »

Offline szipucsu

  • Global Moderator
  • EP addict
  • *
  • Posts: 9898
  • Country: hu
    • Támogató Támogató
    • Webnyelv.hu - Tanuljunk nyelveket!
Re: Banana
« Reply #55 on: 2018.May.23. 11:13:23 »
A fórumtalira elkészült a módosított verziója a Banana játéknak.
A főmenüben azok a lelógó-mozgó kütyük sebessége szebb lenne, ha lassabb lenne.
Egy kis probléma, egyik pályát teljesítettem, lenyomva maradt a lefele gomb, és a következő pálya egyből elindult, és lefele egyből bele is mentem a falba.
Ha a zenéhez nem is nyúlhatunk, a hangeffektek kicsit jobban kihasználhatnák az EP képességeit. De a zene is szólhatna párhuzamosan egy oktávval feljebb is egy másik csatornán is. (Netalán a harmadik csatornán egy duodecimával feljebb fele/negyed hangerővel, még teltebb lenne a hangzás.)
100 SOUND SOURCE 2,STYLE 128,PITCH 25.2,SYNC 1
110 SOUND PITCH 25,SYNC 1
120 ! Videos

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: Banana
« Reply #56 on: 2018.May.23. 16:07:32 »
hm... lehet, hogy érdemes lenne a Digger-t is C-ből megpróbálni lefordítani?
*** Speicherplatz zu klein

Offline Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Banana
« Reply #57 on: 2018.May.23. 18:48:56 »
Javított Banana:

- István által talált hibák kijavítva.
- A lila kukac mégis világosabb maradt, hogy látszódjon a szája. Itt volt egy programhiba, a lila szín helyett rózsaszínnel rajzolta a csíkokat, mert nem igazodtam ki a bitek sorrendjén 16 színben. (Ez mehetne a "Mire gondoltak az EP tervezői?" c. topikba is, hogy miért jó a 1537 0426 bitsorrend, miért nem az alsó 4 biten van az egyik képpont, a felsőn pedig a másik...)
- A banánt csak 3x próbálja meg a pályára helyezni. Ha nem sikerül, mennek tovább a kukacok aztán később megpróbálja újra. Ez főleg az utolsó pályákon jó, ahol kevés szabad hely van, és nem akasztja meg a programot, ha nem sikerül gyorsan helyet találni.
- A menüben lassabbak lettek a kukacok.
- A teljesített pályák végén várakozik egy kicsit, hogy legyen idő elengedni a gombot/joyt és a következő pályán ne zavarjon be a kezdésbe.
« Last Edit: 2018.May.24. 21:10:51 by Tomato77 »
Kotasoft

Offline Tuby128

  • EP addict
  • *
  • Posts: 1448
  • Country: hu
Re: Banana
« Reply #58 on: 2018.May.23. 19:05:58 »
Egy NICK chipet tervezni nem egyszerű dolog. Az idő is sürgetett. Nagyon az az érzésem, hogy ez valami belső huzalozás miatt alakult így, és az idő sürgető volta miatt nem sikerült már letisztázni a kapcsolást.

Offline Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Banana
« Reply #59 on: 2018.May.24. 00:46:17 »
A banánok elhelyezése nem volt jó, mert feltűnt, hogy gyakran ugyanoda teszi őket a program. A "Refresh" regisztert használja a véletlenszám előállításához, és volt benne egy olyan rész, ha a véletlenszám < 2, akkor tegyen banánt. Ha ezután közvetlenül még két véletlenszámot használt (X és Y pozíció), akkor az "R" regiszter valószínűleg közel járt az előző kis értékhez, ezért gyakran a bal felső sarokba került a banán. Most egy számlálót tölt fel a véletlenszámmal, ami ha elfogy, jön a csemege. Így némileg kevesebbet is kell várni az újabb banánra. Ez talán már a végleges. :)
« Last Edit: 2018.May.24. 21:10:31 by Tomato77 »
Kotasoft