home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 5 / MA_Cover_5.iso / ppc / atari / atari800-0.8.6 / cpu_asm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-10  |  4.6 KB  |  209 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <osbind.h>
  4.  
  5. static char *rcsid = "$Id: cpu_asm.c,v 1.2 1998/02/21 15:02:46 david Exp $";
  6.  
  7. #define    FALSE    0
  8. #define    TRUE    1
  9.  
  10. #include    "atari.h"
  11. #include    "cpu_asm.h"
  12.  
  13. long CEKEJ;
  14. extern UBYTE IRQ;
  15.  
  16. extern UWORD break_addr;
  17.  
  18. /*
  19.    ==========================================================
  20.    Emulated Registers and Flags are kept local to this module
  21.    ==========================================================
  22.  */
  23.  
  24. #define    GetByte(addr)        ((attrib[addr] == HARDWARE) ? Atari800_GetByte(addr) : memory[addr])
  25. #define    PutByte(addr,byte)    if (attrib[addr] == RAM) memory[addr] = byte; else if (attrib[addr] == HARDWARE) if (Atari800_PutByte(addr,byte)) break;
  26.  
  27.  
  28. #define RAM 0
  29. #define ROM 1
  30. #define HARDWARE 2
  31. int count[256];
  32.  
  33. extern void tisk(void);
  34. UBYTE memory[65536];
  35.  
  36. UBYTE attrib[65536];
  37.  
  38. /*
  39.    ===============================================================
  40.    Z flag: This actually contains the result of an operation which
  41.    would modify the Z flag. The value is tested for
  42.    equality by the BEQ and BNE instruction.
  43.    ===============================================================
  44.  */
  45.  
  46.  
  47.  
  48. UBYTE BCDtoDEC[256];
  49. UBYTE DECtoBCD[256];
  50.  
  51. void CPU_Reset(void)
  52. {
  53.     int i;
  54.  
  55.     for (i = 0; i < 256; i++) {
  56.         BCDtoDEC[i] = ((i >> 4) & 0xf) * 10 + (i & 0xf);
  57.         DECtoBCD[i] = (((i % 100) / 10) << 4) | (i % 10);
  58. #ifdef PROFILE
  59.         count[i] = 0;
  60. #endif
  61.     }
  62.  
  63.     IRQ = 0x00;
  64.  
  65.     regP = 0x20;                /* The unused bit is always 1 */
  66.     regS = 0xff;
  67.     regPC = (GetByte(0xfffd) << 8) | GetByte(0xfffc);
  68. }
  69.  
  70.  /*  it was there only for debug purposes.....
  71.     #define PHP data =  (N & 0x80); \
  72.     data |= V ? 0x40 : 0; \
  73.     data |= (regP & 0x3c); \
  74.     data |= (Z == 0) ? 0x02 : 0; \
  75.     data |= C; \
  76.     memory[0x0100 + S--] = data;
  77.  
  78.     void NMI (void)
  79.     {
  80.     UBYTE S = regS;
  81.     UBYTE data;
  82.  
  83.     memory[0x0100 + S--] = regPC >> 8;
  84.     memory[0x0100 + S--] = regPC & 0xff;
  85.     memory[0x100 + S--] = regP;
  86.     SetI;
  87.     regPC = (memory[0xfffb] << 8) | memory[0xfffa];
  88.     regS = S;
  89.     }
  90.   */
  91.  
  92. void SetRAM(int addr1, int addr2)
  93. {
  94.     int i;
  95.  
  96.     for (i = addr1; i <= addr2; i++) {
  97.         attrib[i] = RAM;
  98.     }
  99. }
  100.  
  101. void SetROM(int addr1, int addr2)
  102. {
  103.     int i;
  104.  
  105.     for (i = addr1; i <= addr2; i++) {
  106.         attrib[i] = ROM;
  107.     }
  108. }
  109.  
  110. void SetHARDWARE(int addr1, int addr2)
  111. {
  112.     int i;
  113.  
  114.     for (i = addr1; i <= addr2; i++) {
  115.         attrib[i] = HARDWARE;
  116.     }
  117. }
  118.  
  119. UBYTE GETBYTE(UWORD addr)
  120. {
  121.     UBYTE byte;
  122. /*
  123.    ============================================================
  124.    GTIA, POKEY, PIA and ANTIC do not fully decode their address
  125.    ------------------------------------------------------------
  126.    PIA (At least) is fully decoded when emulating the XL/XE
  127.    ============================================================
  128.  */
  129.     switch (addr & 0xff00) {
  130.     case 0xd000:                /* GTIA */
  131.         byte = GTIA_GetByte(addr - 0xd000);
  132.         break;
  133.     case 0xd200:                /* POKEY */
  134.         byte = POKEY_GetByte(addr - 0xd200);
  135.         break;
  136.     case 0xd300:                /* PIA */
  137.         byte = PIA_GetByte(addr - 0xd300);
  138.         break;
  139.     case 0xd400:                /* ANTIC */
  140.         byte = ANTIC_GetByte(addr - 0xd400);
  141.         break;
  142.     case 0xc000:                /* GTIA - 5200 */
  143.         byte = GTIA_GetByte(addr - 0xc000);
  144.         break;
  145.     case 0xe800:                /* POKEY - 5200 */
  146.         byte = POKEY_GetByte(addr - 0xe800);
  147.         break;
  148.     case 0xeb00:                /* POKEY - 5200 */
  149.         byte = POKEY_GetByte(addr - 0xeb00);
  150.         break;
  151.     default:
  152.         break;
  153.     }
  154.  
  155.     return byte;
  156. }
  157.  
  158. int PUTBYTE(UWORD addr, UBYTE byte)
  159. {
  160.     int abort = TRUE;            /*FALSE; */
  161. /*
  162.    ============================================================
  163.    GTIA, POKEY, PIA and ANTIC do not fully decode their address
  164.    ------------------------------------------------------------
  165.    PIA (At least) is fully decoded when emulating the XL/XE
  166.    ============================================================
  167.  */
  168.     switch (addr & 0xff00) {
  169.     case 0xd000:                /* GTIA */
  170.         abort = GTIA_PutByte(addr - 0xd000, byte);
  171.         break;
  172.     case 0xd200:                /* POKEY */
  173.         abort = POKEY_PutByte(addr - 0xd200, byte);
  174.         break;
  175.     case 0xd300:                /* PIA */
  176.         abort = PIA_PutByte(addr - 0xd300, byte);
  177.         break;
  178.     case 0xd400:                /* ANTIC */
  179.         abort = ANTIC_PutByte(addr - 0xd400, byte);
  180.         break;
  181.     case 0xd500:                /* Super Cartridges */
  182.         abort = SuperCart_PutByte(addr, byte);
  183.         break;
  184.     case 0xc000:                /* GTIA - 5200 */
  185.         abort = GTIA_PutByte(addr - 0xc000, byte);
  186.         break;
  187.     case 0xeb00:                /* POKEY - 5200 */
  188.         abort = POKEY_PutByte(addr - 0xeb00, byte);
  189.         break;
  190.     default:
  191.         break;
  192.     }
  193.  
  194.     return abort;
  195. }
  196.  
  197. void CPU_GetStatus(void)
  198. {
  199.     CPUGET();
  200. }
  201.  
  202. void tisk(void)
  203. {
  204.     void *adresa = (long *) 0x400000;
  205.     printf("OLD %d %d %d %d %d %d\n", *(UBYTE *) (adresa - 1), *(UBYTE *) (adresa - 2),
  206.            *(UBYTE *) (adresa - 3), *(UBYTE *) (adresa - 4), *(UBYTE *) (adresa - 5), *(UWORD *) (adresa - 8));
  207.     printf("NEW %d %d %d %d %d %d\n", regP, regS, regA, regX, regY, regPC);
  208. }
  209.