home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / gbuk.lha / src / SYSTEM.C < prev    next >
C/C++ Source or Header  |  1997-02-07  |  6KB  |  237 lines

  1. #include    <stdlib.h>
  2. #include    <string.h>
  3. #include    <stdio.h>
  4. #include    <time.h>
  5. #include    "GB.h"
  6. #include    "system.h"
  7. #include    "method1.h"
  8. #include    "method2.h"
  9. #include    "gfxfunc.h"
  10. #include    "options.h"
  11. #include    "keycodes.h"
  12. #include    "prefs.h"
  13. #include    "picture.h"
  14.  
  15. #define    FRAME_RATE    0
  16.  
  17. void    PrintFrameRate(void);
  18. int     InitMachine_null(void);
  19. void    TrashMachine_null(void);
  20. void    RefreshScreen_null(void);
  21. void    RefreshLine_null(byte Y);
  22. void    RefreshSprites_null(void);
  23. byte    SourceColor_null(int n);
  24. void    Sound_null(byte R,byte V);
  25. byte    SIOSend_null(byte V);
  26. byte    SIOReceive_null(byte *V);
  27.  
  28. typedef    struct{
  29.     int ((*InitMachine)(void));
  30.     void ((*TrashMachine)(void));
  31.     void ((*RefreshScreen)(void));
  32.     void ((*RefreshLine)(byte));
  33.     void ((*RefreshSprites)(void));
  34.     byte ((*SourceColor)(int));
  35.     void ((*Sound)(byte R,byte V));
  36.     byte ((*SIOSend)(byte V));
  37.     byte ((*SIOReceive)(byte *V));
  38. }GFX_FUNCTIONS;
  39.  
  40. GFX_FUNCTIONS    Gfx[]={
  41.                     {InitMachine_null,TrashMachine_null,RefreshScreen_null,RefreshLine_null,
  42.                     RefreshSprites_null,SourceColor_null,Sound_null,
  43.                     SIOSend_null,SIOReceive_null},
  44.  
  45.                     {InitMachine1,TrashMachine1,RefreshScreen1,RefreshLine1,
  46.                     RefreshSprites1,SourceColor1,Sound1,
  47.                     SIOSend1,SIOReceive1},
  48.                     
  49.                     {InitMachine2,TrashMachine2,RefreshScreen2,RefreshLine2,
  50.                     RefreshSprites2,SourceColor2,Sound2,
  51.                     SIOSend2,SIOReceive2},
  52.                 };
  53.  
  54. GFX_FUNCTIONS    func;
  55. int    SetupMachine=0;
  56.  
  57.  
  58. void    SetMethod(int n)
  59. {
  60.     func=Gfx[n];
  61. }
  62. byte    SourceColor(int n)
  63. {
  64.     return func.SourceColor(n);
  65. }    
  66.  
  67. /****************************************************************/
  68. /*** Allocate resources needed by the machine-dependent code. ***/
  69. /************************************** TO BE WRITTEN BY USER ***/
  70. int InitMachine(void)
  71. {
  72.     if(SetupMachine){
  73.         return 1;
  74.     }else{
  75.         if( func.InitMachine() ){
  76.             SetupMachine=1;
  77.             return 1;
  78.         }else{
  79.             return 0;
  80.         }
  81.     }
  82. }
  83.  
  84. /****************************************************************/
  85. /*** Deallocate all resources taken by InitMachine().         ***/
  86. /************************************** TO BE WRITTEN BY USER ***/
  87. void TrashMachine(void)
  88. {
  89.     if(!SetupMachine){
  90.         return ;
  91.     }else{
  92.         SetupMachine=0;
  93.         func.TrashMachine();
  94.     }
  95. }
  96.  
  97. /****************************************************************/
  98. /*** Refresh screen.                                          ***/
  99. /************************************** TO BE WRITTEN BY USER ***/
  100. void RefreshScreen(void)
  101. {
  102. #if    FRAME_RATE
  103.     PrintFrameRate();
  104. #endif
  105.     func.RefreshScreen();
  106.     IngameUpdate();
  107.     if(GXGetLastErrorMessage()){
  108.         GXPrintf(GXGetLastErrorMessage());
  109.         GXPrintf("\n");
  110.         GXQuitCode("Code terminated due to error\n");
  111.     }
  112.     
  113.     //    Put in pause to slow game down
  114.     if(SlowDown){
  115.         long    StartTime,interval,xx;
  116.         
  117.         StartTime=GXTimer();
  118.         interval=SlowDown*GXTicksPerSecond()/50;
  119.         do{
  120.             xx=GXTimer()-StartTime;
  121.             if( (xx<0) || (xx>interval) )break;                
  122.         }while(1);
  123.     }
  124. }
  125.  
  126. //***************************************************
  127. //*                                                    *
  128. //*    Print frame rate in frames/sec                    *
  129. //*                                                    *
  130. //***************************************************
  131. void    PrintFrameRate(void)
  132. {
  133. #define NTEST 200
  134.     static     long     LastTime=0;
  135.     long            interval,jj;
  136.     float            FramesSec;
  137.     static    long     frame=0;
  138.     
  139.     frame++;
  140.     if(!(frame%NTEST)){
  141.         jj=GXTimer();
  142.         interval=jj-LastTime;
  143.         if(interval&LastTime){
  144.             FramesSec=((float)NTEST*GXTicksPerSecond())/((float)interval);
  145.             GXPrintf("Frames per sec = %f\n",FramesSec);
  146.             GXPrintf("interval = %d\n",(int)interval);
  147.         }
  148.         LastTime=jj;
  149.         GXPrintf("F:%d\n",frame);
  150.     }
  151. }
  152.  
  153. /****************************************************************/
  154. /*** Refresh line.                                            ***/
  155. /************************************** TO BE WRITTEN BY USER ***/
  156. void RefreshLine(byte Y)
  157. {
  158.     func.RefreshLine(Y);
  159. }
  160. /****************************************************************/
  161. /*** Refresh sprites.                                         ***/
  162. /************************************** TO BE WRITTEN BY USER ***/
  163. void RefreshSprites(void)
  164. {
  165.     func.RefreshSprites();
  166. }
  167.  
  168.  
  169. /****************************************************************/
  170. /*** Get joystick state: START.SELECT.B.A.D.U.L.R.            ***/
  171. /************************************** TO BE WRITTEN BY USER ***/
  172. byte Joystick(void)
  173. {
  174.     long        input;
  175.     byte        joy,bits;
  176.     int            j;
  177.     long        *data;
  178.  
  179.     input=GXReadJoystick(1);
  180.     joy=0;
  181.     if(input&PAD_UP)joy|=0x08;
  182.     if(input&PAD_DOWN)joy|=0x04;
  183.     if(input&PAD_LEFT)joy|=0x02;
  184.     if(input&PAD_RIGHT)joy|=0x01;
  185.     if(input&PAD_BUTTON1)joy|=0x10;
  186.     if(input&PAD_BUTTON2)joy|=0x20;
  187.     if(input&PAD_BUTTON3)joy|=0x40;
  188.     if(input&PAD_BUTTON4)joy|=0x80;
  189.     
  190.     //    Merge with keyboard input
  191.     data=KeyPrefs;
  192.     bits=0x01;
  193.     for(j=NKeyPrefs; j; j--){
  194.         if(GXKeyDown(*data++))
  195.             joy|=bits;
  196.         bits<<=1;
  197.     }
  198.     joy=(joy^0xff);    //flip the bits
  199.     return joy;
  200. }
  201.  
  202. /****************************************************************/
  203. /*** Write value into sound chip register (Reg #0 at FF10h).  ***/
  204. /************************************** TO BE WRITTEN BY USER ***/
  205. void Sound(byte R,byte V){
  206.     func.Sound(R,V);    
  207. }
  208.  
  209. /****************************************************************/
  210. /*** Send a byte onto the serial line. Returns 1 on success,  ***/
  211. /*** 0 otherwise.                                             ***/
  212. /************************************** TO BE WRITTEN BY USER ***/
  213. byte SIOSend(byte V)
  214. {
  215.     return func.SIOSend(V);
  216. }
  217.  
  218. /****************************************************************/
  219. /*** Receive a byte from the serial line. Returns 1 on        ***/
  220. /*** success, 0 otherwise.                                    ***/
  221. /************************************** TO BE WRITTEN BY USER ***/
  222. byte SIOReceive(byte *V)
  223. {
  224.     return func.SIOReceive(V);
  225. }
  226.  
  227. int InitMachine_null(void){return 1;}
  228. void TrashMachine_null(void){}
  229. void RefreshScreen_null(void){}
  230. void RefreshLine_null(byte Y){}
  231. void RefreshSprites_null(void){}
  232. byte SourceColor_null(int n){return n;}
  233. void Sound_null(byte R,byte V){}
  234. byte SIOSend_null(byte V){return 0;}
  235. byte SIOReceive_null(byte *V){return 0;}
  236.  
  237.