Subversion Repositories Kolibri OS

Rev

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

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