Subversion Repositories Kolibri OS

Rev

Rev 1814 | Rev 2829 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #ifndef AUTOBUILD
  3. // autobuild does not create lang.h, but defines LANG_{RUS,ENG} directly
  4. #include "lang.h"
  5. #endif
  6.  
  7. #include "system/kolibri.h"
  8. #include "system/stdlib.h"
  9. #include "system/string.h"
  10. #include "z80/z80.h"
  11. #include "48.h"
  12.  
  13. #include "system/msgbox.c"
  14.  
  15. ///=============================
  16.  
  17. #define TYPE_NO         0
  18. #define TYPE_SNA        1
  19. #define TYPE_Z80        2
  20.  
  21. #define SCREEN_LEN      3*3*256*192*3
  22.  
  23. char WND_CAPTION[] = {"e80 v0.5.1"};
  24.  
  25. extern char KOL_PARAM[256];
  26. extern char KOL_PATH[256];
  27.  
  28. char szBackup[256];
  29. char szScreen[256];
  30.  
  31. int fila[5][5];
  32. int main_tecla, hay_tecla;
  33. int SSCS = 0;
  34.  
  35. int debug=0, scanl=0;
  36. int frame_counter;
  37. int target_cycle;
  38. Z80Regs spectrumZ80;
  39.  
  40. char *screen;
  41. unsigned screen_w, screen_h;
  42. #define  screen_a_w   512
  43. #define  screen_a_h   384
  44. int flash = 0;
  45. unsigned time = 0;
  46.  
  47. ///=============================
  48.  
  49. #include "keyboard.c"
  50.  
  51. ///=============================
  52.  
  53. int get_ext(char *filename)
  54. {
  55.  
  56. return TYPE_SNA;
  57. }
  58.  
  59. ///=============================
  60.  
  61. void memory_print(Z80Regs *regs, char *filename)
  62. {
  63. kol_struct70 file;
  64.  
  65. file.p00 = 2;
  66. file.p04 = 0;
  67. file.p08 = 0;
  68. file.p12 = 64*1024;
  69. file.p16 = (unsigned)(regs->RAM);
  70. file.p20 = 0;
  71. file.p21 = filename;
  72.  
  73. kol_file_70(&file);
  74. }
  75.  
  76.  
  77. ///=============================
  78.  
  79. void all_print(Z80Regs *regs, char *filename)
  80. {
  81. kol_struct70 file;
  82.  
  83. file.p00 = 2;
  84. file.p04 = 0;
  85. file.p08 = 0;
  86. file.p12 = sizeof (Z80Regs);
  87. file.p16 = (unsigned)regs;
  88. file.p20 = 0;
  89. file.p21 = filename;
  90.  
  91. kol_file_70(&file);
  92. }
  93.  
  94. ///=============================
  95.  
  96. void screen_print(Z80Regs *regs)
  97. {
  98.  
  99. kol_struct70 file;
  100.  
  101. char palette[]=
  102.         {
  103.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  104.         0xB0, 0x00, 0x00, 0xB0, 0x00, 0x00,
  105.         0x00, 0x00, 0xB0, 0x00, 0x00, 0xB0,
  106.         0xB0, 0x00, 0xB0, 0xB0, 0x00, 0xB0,
  107.         0x00, 0xB0, 0x00, 0x00, 0xB0, 0x00,
  108.         0xB0, 0xB0, 0x00, 0xB0, 0xB0, 0x00,
  109.         0x00, 0xB0, 0xB0, 0x00, 0xB0, 0xB0,
  110.         0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
  111.  
  112.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  113.         0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
  114.         0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
  115.         0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
  116.         0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
  117.         0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
  118.         0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
  119.         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
  120.         };
  121.  
  122. char *scr;
  123. char *atr;
  124.  
  125. char a, c, s;
  126. int i, j, k, l, m;
  127. unsigned bri;
  128. char *color;
  129. char *addr;
  130. int n = 0;
  131. int z = 0;
  132. int x, y;
  133.  
  134. scr = malloc(6144);
  135. atr = malloc(768);
  136.  
  137. memcpy(scr, regs->RAM + 0x4000 , 6144);
  138. memcpy(atr, regs->RAM + 0x5800 , 768);
  139.  
  140. for (j = 0; j < 3 ; j++)
  141. for (i = 0; i < 8; i++)
  142. for (k = 0; k < 8; k++)
  143. for (l = 0; l < 32; l++)
  144.         {
  145.         c = scr[j*2048 + k*256 + i*32 + l];
  146.         for (m = 0; m < 8; m++)
  147.                 {
  148.                 s = (c & 128) >> 7;
  149.                 a = atr[j*256 + i*32 + l];
  150.  
  151.                 if ( (a & 64) == 64 )
  152.                         bri = 8;
  153.                 else
  154.                         bri = 0;
  155.  
  156.                 if ( 0 == s )
  157.                         {
  158.                         if (!(flash && (128 == (a&128))))
  159.                                 color = &palette[6*(bri+((a>>3)&7))];
  160.                         else
  161.                                 color = &palette[6*(bri+(a&7))];
  162.  
  163.                                 addr = screen + 2*screen_a_w*3*z + 2*3*n;
  164.  
  165.                                 for (y = 0; y < 2; y++)
  166.                                         memcpy( addr + y*screen_a_w*3,
  167.                                                 color, 6);
  168.                         }
  169.                 else
  170.                         {
  171.                         if (!(flash && (128 == (a&128))))
  172.                                 color = &palette[6*(bri+(a&7))];
  173.                         else
  174.                                 color = &palette[6*(bri+((a>>3)&7))];
  175.                                
  176.                                 addr = screen + 2*screen_a_w*3*z + 2*3*n;
  177.  
  178.                                 for (y = 0; y < 2; y++)
  179.                                         memcpy( addr + y*screen_a_w*3,
  180.                                                 color, 6);
  181.                         }
  182.  
  183.                 n++;
  184.                 if (256 == n)
  185.                         {
  186.                         n = 0;
  187.                         z++;
  188.                         }
  189.  
  190.                 c <<= 1;
  191.                 }
  192.         }
  193.  
  194. if ( 33 < (kol_time_tick() - time))
  195. {
  196. if (0 == flash)
  197.         flash = 1;
  198. else
  199.         flash = 0;
  200. time = kol_time_tick();
  201. }
  202.  
  203. free(scr);
  204. free(atr);
  205.  
  206. }
  207.  
  208. ///=============================
  209.  
  210. void memory_load_z80(Z80Regs *regs, char *filename)
  211. {
  212. char header[30];
  213. kol_struct70 file;
  214.  
  215. file.p00 = 0;
  216. file.p04 = 0;
  217. file.p08 = 0;
  218. file.p12 = 30;
  219. file.p16 = (unsigned) header;
  220. file.p20 = 0;
  221. file.p21 = filename;
  222. }
  223.  
  224. ///=============================
  225.  
  226. void memory_load_sna(Z80Regs *regs, char *filename)
  227. {
  228. char buffer[27];
  229. kol_struct70 file;
  230.  
  231. file.p00 = 0;
  232. file.p04 = 0;
  233. file.p08 = 0;
  234. file.p12 = 27;
  235. file.p16 = (unsigned) buffer;
  236. file.p20 = 0;
  237. file.p21 = filename;
  238.  
  239. kol_file_70(&file);
  240.  
  241. regs->I = buffer[ 0];
  242. regs->HLs.B.l = buffer[ 1];
  243. regs->HLs.B.h = buffer[ 2];
  244. regs->DEs.B.l = buffer[ 3];
  245. regs->DEs.B.h = buffer[ 4];
  246. regs->BCs.B.l = buffer[ 5];
  247. regs->BCs.B.h = buffer[ 6];
  248. regs->AFs.B.l = buffer[ 7];
  249. regs->AFs.B.h = buffer[ 8];
  250. regs->HL.B.l  = buffer[ 9];
  251. regs->HL.B.h  = buffer[10];
  252. regs->DE.B.l  = buffer[11];
  253. regs->DE.B.h  = buffer[12];
  254. regs->BC.B.l  = buffer[13];
  255. regs->BC.B.h  = buffer[14];
  256. regs->IY.B.l = buffer[15];
  257. regs->IY.B.h = buffer[16];
  258. regs->IX.B.l = buffer[17];
  259. regs->IX.B.h = buffer[18];
  260. regs->IFF1 = regs->IFF2 = (buffer[19]&0x04) >>2;
  261. regs->R.W  = buffer[20];
  262. regs->AF.B.l = buffer[21];
  263. regs->AF.B.h = buffer[22];
  264. regs->SP.B.l =buffer[23];
  265. regs->SP.B.h =buffer[24];
  266. regs->IM = buffer[25];
  267. regs->BorderColor = buffer[26];
  268.  
  269. file.p00 = 0;
  270. file.p04 = 27;
  271. file.p08 = 0;
  272. file.p12 = 0x4000*3;
  273. file.p16 = (unsigned) regs->RAM+16384;
  274. file.p20 = 0;
  275. file.p21 = filename;
  276.  
  277. kol_file_70(&file);
  278.  
  279. regs->PC.B.l = Z80MemRead(regs->SP.W, regs);
  280. regs->SP.W++;
  281. regs->PC.B.h = Z80MemRead(regs->SP.W, regs);
  282. regs->SP.W++;
  283.  
  284. }
  285.  
  286.  
  287. ///=============================
  288.  
  289. void memory_save_sna(Z80Regs *regs, char *filename)
  290. {
  291. char buffer[27];
  292. unsigned char sptmpl, sptmph;
  293. kol_struct70 file;
  294.  
  295. buffer[ 0] = regs->I;
  296. buffer[ 1] = regs->HLs.B.l;
  297. buffer[ 2] = regs->HLs.B.h;
  298. buffer[ 3] = regs->DEs.B.l;
  299. buffer[ 4] = regs->DEs.B.h;
  300. buffer[ 5] = regs->BCs.B.l;
  301. buffer[ 6] = regs->BCs.B.h;
  302. buffer[ 7] = regs->AFs.B.l;
  303. buffer[ 8] = regs->AFs.B.h;
  304. buffer[ 9] = regs->HL.B.l;
  305. buffer[10] = regs->HL.B.h;
  306. buffer[11] = regs->DE.B.l;
  307. buffer[12] = regs->DE.B.h;
  308. buffer[13] = regs->BC.B.l;
  309. buffer[14] = regs->BC.B.h;
  310. buffer[15] = regs->IY.B.l;
  311. buffer[16] = regs->IY.B.h;
  312. buffer[17] = regs->IX.B.l;
  313. buffer[18] = regs->IX.B.h;
  314. buffer[19] = regs->IFF1 << 2;
  315. buffer[20] = regs->R.W & 0xFF;
  316. buffer[21] = regs->AF.B.l;
  317. buffer[22] = regs->AF.B.h;
  318.  
  319. sptmpl = Z80MemRead( regs->SP.W-1, regs );
  320. sptmph = Z80MemRead( regs->SP.W-2, regs );
  321.  
  322. Z80MemWrite( --(regs->SP.W), regs->PC.B.h, regs);
  323. Z80MemWrite( --(regs->SP.W), regs->PC.B.l, regs);
  324.  
  325. buffer[23] = regs->SP.B.l;
  326. buffer[24] = regs->SP.B.h;
  327. buffer[25] = regs->IM;
  328. buffer[26] = regs->BorderColor;
  329.  
  330. file.p00 = 2;
  331. file.p04 = 0;
  332. file.p08 = 0;
  333. file.p12 = 27;
  334. file.p16 = (unsigned) buffer;
  335. file.p20 = 0;
  336. file.p21 = filename;
  337.  
  338. kol_file_70(&file);
  339.  
  340. file.p00 = 3;
  341. file.p04 = 27;
  342. file.p08 = 0;
  343. file.p12 = 0x4000*3;
  344. file.p16 = (unsigned) regs->RAM+16384;
  345. file.p20 = 0;
  346. file.p21 = filename;
  347.  
  348. kol_file_70(&file);
  349.  
  350. regs->SP.W += 2;
  351. Z80MemWrite( regs->SP.W-1, sptmpl, regs );
  352. Z80MemWrite( regs->SP.W-2, sptmph, regs );
  353.  
  354. }
  355.  
  356.  
  357. ///=============================
  358.  
  359. void memory_save_scr(Z80Regs *regs, char *filename)
  360. {
  361. kol_struct70 file;
  362.  
  363.  
  364. file.p00 = 2;
  365. file.p04 = 0x4000;
  366. file.p08 = 0;
  367. file.p12 = 6912;
  368. file.p16 = (unsigned) regs->RAM+16384;
  369. file.p20 = 0;
  370. file.p21 = filename;
  371.  
  372. kol_file_70(&file);
  373.  
  374. }
  375.  
  376.  
  377. ///=============================
  378.  
  379. void wnd_draw()
  380. {
  381. kol_paint_start();
  382. kol_wnd_define( (screen_w-540)/2, (screen_h-440)/2, 540, 440, 0x34b0b0b0);
  383. kol_wnd_caption(WND_CAPTION);
  384. screen_print(&spectrumZ80);
  385. kol_paint_image((540 - screen_a_w)/2-5,
  386.                 (440 - screen_a_h-kol_skin_height())/2,
  387.                 screen_a_w, screen_a_h, screen);
  388. kol_paint_end();
  389. }
  390.  
  391. ///=============================
  392.  
  393. void kol_main()
  394. {
  395.  
  396. unsigned event;
  397. unsigned key;
  398.  
  399. for (event = strlen(KOL_PATH); event > 0; --event)
  400.         if ( '/' == KOL_PATH[event] )
  401.                 {
  402.                 KOL_PATH[event+1]=0;
  403.                 break;
  404.                 }
  405.  
  406. strcpy(szBackup, KOL_PATH);
  407. strcpy(szScreen, KOL_PATH);
  408. strcat(szBackup, "backup.sna");
  409. strcat(szScreen, "screen.scr");
  410.  
  411. kol_screen_get_size(&screen_w, &screen_h);
  412.  
  413. screen = malloc(SCREEN_LEN);
  414. spectrumZ80.RAM = (char*) malloc(64*1024);
  415. memcpy(spectrumZ80.RAM, BIOS48, 16*1024);
  416.  
  417. Z80Reset( &spectrumZ80, 69888 );
  418. Z80FlagTables();
  419.  
  420. fila[1][1] = fila[1][2] = fila[2][2] = fila[3][2] = fila[4][2] =
  421.  fila[4][1] = fila[3][1] = fila[2][1] = 0xFF;
  422.  
  423. debug = 0;
  424.  
  425. if (KOL_PARAM != NULL)
  426.         {
  427.         int type = get_ext(KOL_PARAM);
  428.        
  429.         if (TYPE_SNA == type)
  430.                 memory_load_sna(&spectrumZ80, KOL_PARAM);
  431.         }
  432.  
  433. hay_tecla = main_tecla = 0;
  434. //keyboard_process(0);
  435.  
  436. kol_key_mode_set(1);
  437.  
  438. for (;;)
  439.         {
  440.  
  441. //      event = kol_event_check();
  442.         event = kol_event_wait_time(1);
  443.  
  444.         switch (event)
  445.                 {
  446.  
  447.                 case 1:
  448.                         wnd_draw();
  449.                         break;
  450.  
  451.                 case 2:
  452.                         key = (kol_key_get()>>8)&0xff;
  453.                        
  454.                         switch (key)
  455.                                 {
  456.                                 case 60: // F2
  457.                                         if ( IDOK == MessageBox("Save snapshot?",
  458.                                                                         WND_CAPTION, MB_OKCANCEL) )
  459.                                                 memory_save_sna(&spectrumZ80,
  460.                                                                         szBackup);
  461.                                         break;
  462.  
  463.                                 case 61: // F3
  464.                                         if ( IDOK == MessageBox("Load snapshot?",
  465.                                                                         WND_CAPTION, MB_OKCANCEL) )
  466.                                                 memory_load_sna(&spectrumZ80,
  467.                                                                         szBackup);
  468.                                         break;
  469.  
  470.                                 case 62: // F4
  471.                                         if ( IDOK == MessageBox("Save screenshot?",
  472.                                                                         WND_CAPTION, MB_OKCANCEL) )
  473.                                                 memory_save_scr(&spectrumZ80,
  474.                                                                         szScreen);
  475.                                         break;
  476.  
  477.                                 case 88: // F12 Reset
  478.                                         if ( IDOK == MessageBox("Reset?",
  479.                                                                         WND_CAPTION, MB_OKCANCEL) )
  480.                                                 {
  481.                                                 Z80Reset( &spectrumZ80, 69888 );
  482.                                                 Z80FlagTables();
  483.                                                 fila[1][1] = fila[1][2] =
  484.                                                 fila[2][2] = fila[3][2] =
  485.                                                 fila[4][2] = fila[4][1] =
  486.                                                 fila[3][1] = fila[2][1] = 0xFF;
  487.                                                 }
  488.                                         break;
  489.  
  490.                                 default:
  491.                                         keyboard_process(key);
  492.                                 };
  493.  
  494.                         break;
  495.  
  496.                 case 3:
  497.                         if ( 1 == (kol_btn_get() & 0xff00)>>8 )
  498.                                 {
  499.                                 free(screen);
  500.                                 free(spectrumZ80.RAM);
  501.                                 kol_exit();
  502.                                 }
  503.                         break;
  504.  
  505.                 default:
  506.                         if (0 == debug)
  507.                                 {
  508.  
  509.                                 Z80Run( &spectrumZ80, 224*64 );
  510.                                 for( scanl=0; scanl<192; scanl++ )
  511.                                         Z80Run( &spectrumZ80, 224 );
  512.  
  513.                                 Z80Run( &spectrumZ80, 224*56 );
  514.  
  515.                                 if( target_cycle < 2 || frame_counter == 0 )
  516.                                         {
  517.                                         screen_print(&spectrumZ80);
  518.                                         kol_screen_wait_rr();
  519.                                         kol_paint_image((540 - screen_a_w)/2-5,
  520.                                                         (440 - screen_a_h-kol_skin_height())/2,
  521.                                                         screen_a_w, screen_a_h, screen);
  522.                                         }
  523.  
  524.                                 while( target_cycle == 0 )
  525.                                         {
  526.                                         target_cycle--;
  527.                                         frame_counter++;
  528.                                         }
  529.                                 }
  530.                         break;
  531.  
  532.                 };
  533.  
  534.         }
  535.  
  536. }
  537.  
  538. ///=============================
  539.  
  540.