Annotation of hatari/src/uae-cpu/hatari-glue.c, revision 1.1.1.8

1.1.1.6   root        1: /*
                      2:   Hatari - hatari-glue.c
                      3: 
                      4:   This file is distributed under the GNU Public License, version 2 or at
                      5:   your option any later version. Read the file gpl.txt for details.
                      6: 
                      7:   This file contains some code to glue the UAE CPU core to the rest of the
                      8:   emulator and Hatari's "illegal" opcodes.
                      9: */
1.1.1.8 ! root       10: char HatariGlue_rcsid[] = "Hatari $Id: hatari-glue.c,v 1.23 2004/04/19 08:53:49 thothy Exp $";
1.1.1.6   root       11: 
1.1       root       12: 
                     13: #include <stdio.h>
                     14: 
                     15: #include "../includes/main.h"
                     16: #include "../includes/int.h"
                     17: #include "../includes/tos.h"
1.1.1.3   root       18: #include "../includes/gemdos.h"
                     19: #include "../includes/cart.h"
1.1.1.5   root       20: #include "../includes/vdi.h"
                     21: #include "../includes/stMemory.h"
1.1       root       22: 
1.1.1.3   root       23: #include "sysdeps.h"
                     24: #include "maccess.h"
1.1.1.5   root       25: #include "memory.h"
1.1.1.3   root       26: #include "newcpu.h"
1.1.1.8 ! root       27: #include "hatari-glue.h"
1.1       root       28: 
                     29: #ifndef FALSE
                     30: #define FALSE 0
                     31: #define TRUE 1
                     32: #endif
                     33: 
                     34: 
1.1.1.8 ! root       35: int illegal_mem = TRUE;
1.1.1.4   root       36: int address_space_24 = TRUE;
1.1       root       37: int cpu_level = 0;              /* 68000 (default) */
1.1.1.4   root       38: int cpu_compatible = FALSE;
1.1       root       39: 
1.1.1.8 ! root       40: int pendingInterrupts = 0;
1.1.1.6   root       41: 
1.1       root       42: 
                     43: /* Reset custom chips */
                     44: void customreset(void)
                     45: {
1.1.1.8 ! root       46:   pendingInterrupts = 0;
1.1.1.6   root       47: }
                     48: 
                     49: 
1.1.1.8 ! root       50: /* Return interrupt number (1 - 7), -1 means no interrupt.
        !            51:  * Note that the interrupt stays pending if it can't be executed yet
        !            52:  * due to the interrupt level field in the SR. */
1.1.1.6   root       53: int intlev(void)
                     54: {
1.1.1.8 ! root       55:   /* There are only VBL and HBL autovector interrupts in the ST... */
        !            56:   assert((pendingInterrupts & ~((1<<4)|(1<<2))) == 0);
1.1.1.6   root       57: 
1.1.1.8 ! root       58:   if(pendingInterrupts & (1 << 4))          /* VBL interrupt? */
        !            59:   {
        !            60:     if(regs.intmask < 4)
        !            61:       pendingInterrupts &= ~(1 << 4);
        !            62:     return 4;
        !            63:   }
        !            64:   else if(pendingInterrupts & (1 << 2))     /* HBL interrupt? */
        !            65:   {
        !            66:     if(regs.intmask < 2)
        !            67:       pendingInterrupts &= ~(1 << 2);
        !            68:     return 2;
        !            69:   }
        !            70: 
        !            71:   return -1;
1.1       root       72: }
                     73: 
                     74: 
1.1.1.4   root       75: /* Initialize 680x0 emulation */
1.1       root       76: int Init680x0(void)
                     77: {
1.1.1.7   root       78:   /* Note: memory_init() is now done in tos.c */
1.1       root       79: 
1.1.1.4   root       80:   init_m68k();
                     81:   return TRUE;
1.1       root       82: }
                     83: 
                     84: 
                     85: /* Deinitialize 680x0 emulation */
                     86: void Exit680x0(void)
                     87: {
1.1.1.7   root       88:   memory_uninit();
1.1.1.8 ! root       89: 
        !            90:   free(table68k);
        !            91:   table68k = NULL;
1.1       root       92: }
                     93: 
                     94: 
                     95: /* Reset and start 680x0 emulation */
                     96: void Start680x0(void)
                     97: {
1.1.1.4   root       98:   m68k_reset();
                     99:   m68k_go(TRUE);
                    100: }
                    101: 
                    102: 
                    103: /* Check if the CPU type has been changed */
                    104: void check_prefs_changed_cpu(int new_level, int new_compatible)
                    105: {
                    106:   if(cpu_level!=new_level || cpu_compatible!=new_compatible)
                    107:   {
                    108:     cpu_level = new_level;
                    109:     cpu_compatible = new_compatible;
1.1.1.7   root      110:     set_special(SPCFLAG_MODE_CHANGE);
                    111:     if (table68k)
                    112:       build_cpufunctbl ();
1.1.1.4   root      113:   }
1.1       root      114: }
                    115: 
                    116: 
                    117: /* ----------------------------------------------------------------------- */
                    118: /*
1.1.1.7   root      119:   This function will be called at system init by the cartridge routine
                    120:   (after gemdos init, before booting floppies).
                    121:   
                    122:   The GEMDOS vector (#$84) is setup and we also initialize the connected
                    123:   drive mask and Line-A  variables (for an extended VDI resolution) from here.
1.1       root      124: */
1.1.1.7   root      125: unsigned long OpCode_SysInit(uae_u32 opcode)
1.1       root      126: {
1.1.1.7   root      127:   /* Initialize the connected drive mask */
                    128:   STMemory_WriteLong(0x4c2, ConnectedDriveMask);
                    129: 
                    130:   if(!bInitGemDOS)
                    131:   {
                    132:     /* Init on boot - see cartimg.c */
                    133:     GemDOS_Boot();
                    134: 
                    135:     /* We use this to get pointer to Line-A structure details
                    136:      * (to fix for extended VDI res) */
                    137:     LineABase = regs.regs[0];  /* D0 */
                    138:     FontBase = regs.regs[9];   /* A1 */
                    139:     VDI_LineA();
                    140:   }
1.1.1.4   root      141: 
1.1.1.7   root      142:   m68k_incpc(2);
1.1.1.4   root      143:   fill_prefetch_0();
                    144:   return 4;
1.1.1.3   root      145: }
                    146: 
1.1.1.5   root      147: 
1.1.1.3   root      148: /* ----------------------------------------------------------------------- */
                    149: /*
1.1.1.5   root      150:   Re-direct execution to old GEMDOS calls, used in 'cart.s'
1.1.1.3   root      151: */
                    152: unsigned long OpCode_OldGemDos(uae_u32 opcode)
                    153: {
1.1.1.7   root      154:   m68k_setpc( STMemory_ReadLong(CART_OLDGEMDOS) );
1.1.1.3   root      155:   fill_prefetch_0();
                    156:   return 4;
                    157: }
                    158: 
1.1.1.5   root      159: 
1.1.1.3   root      160: /* ----------------------------------------------------------------------- */
                    161: /*
1.1.1.7   root      162:   Intercept GEMDOS calls
1.1.1.3   root      163: 
1.1.1.7   root      164:   Used for GEMDOS HD emulation (see gemdos.c).
1.1.1.3   root      165: */
                    166: unsigned long OpCode_GemDos(uae_u32 opcode)
                    167: {
1.1.1.7   root      168:   GemDOS_OpCode();    /* handler code in gemdos.c */
1.1.1.3   root      169: 
1.1.1.5   root      170:   m68k_incpc(2);
                    171:   fill_prefetch_0();
                    172:   return 4;
1.1       root      173: }
                    174: 
1.1.1.5   root      175: 
                    176: /*-----------------------------------------------------------------------*/
                    177: /*
                    178:   This is called after completion of each VDI call
                    179: */
                    180: unsigned long OpCode_VDI(uae_u32 opcode)
                    181: {
                    182:   VDI_Complete();
                    183: 
                    184:   /* Set PC back to where originated from to continue instruction decoding */
                    185:   m68k_setpc(VDI_OldPC);
                    186: 
                    187:   fill_prefetch_0();
                    188:   return 4;
1.1       root      189: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.