Annotation of previous/src/sysReg.c, revision 1.1.1.1

1.1       root        1: /* NeXT system registers emulation */
                      2: 
                      3: #include <stdlib.h>
                      4: #include "main.h"
                      5: #include "ioMem.h"
                      6: #include "ioMemTables.h"
                      7: #include "video.h"
                      8: #include "configuration.h"
                      9: #include "sysdeps.h"
                     10: #include "m68000.h"
                     11: #include "sysReg.h"
                     12: #include "statusbar.h"
                     13: 
                     14: 
                     15: #define IO_SEG_MASK    0x1FFFF
                     16: 
                     17: static Uint32 scr1=0x00000000;
                     18: static Uint32 turboscr1=0x00000000;
                     19: 
                     20: static Uint8 scr2_0=0x00;
                     21: static Uint8 scr2_1=0x00;
                     22: static Uint8 scr2_2=0x80;
                     23: static Uint8 scr2_3=0x00;
                     24: 
                     25: static Uint32 intStat=0x00000000;
                     26: static Uint32 intMask=0x00000000;
                     27: 
                     28: 
                     29: /* RTC NVRAM */
                     30: 
                     31: // file mon/nvram.h
                     32: // struct nvram_info {
                     33: // #define     NI_RESET        9
                     34: //     u_int   ni_reset : 4,
                     35: // #define     SCC_ALT_CONS    0x08000000
                     36: //             ni_alt_cons : 1,
                     37: // #define     ALLOW_EJECT     0x04000000
                     38: //             ni_allow_eject : 1,
                     39: //             ni_vol_r : 6,
                     40: //             ni_brightness : 6,
                     41: // #define     HW_PWD  0x6
                     42: //             ni_hw_pwd : 4,
                     43: //             ni_vol_l : 6,
                     44: //             ni_spkren : 1,
                     45: //             ni_lowpass : 1,
                     46: // #define     BOOT_ANY        0x00000002
                     47: //             ni_boot_any : 1,
                     48: // #define     ANY_CMD         0x00000001
                     49: //             ni_any_cmd : 1;
                     50: // #define     NVRAM_HW_PASSWD 6
                     51: //     u_char ni_ep[NVRAM_HW_PASSWD];
                     52: // #define     ni_enetaddr     ni_ep
                     53: // #define     ni_hw_passwd    ni_ep
                     54: //     u_short ni_simm;                /* 4 SIMMs, 4 bits per SIMM */
                     55: //     char ni_adobe[2];
                     56: //     u_char ni_pot[3];
                     57: //     u_char  ni_new_clock_chip : 1,
                     58: //             ni_auto_poweron : 1,
                     59: //             ni_use_console_slot : 1,        /* Console slot was set by user. */
                     60: //             ni_console_slot : 2,            /* Preferred console dev slot>>1 */
                     61: //             ni_use_parity_mem : 1,  /* Use parity RAM if available? */
                     62: //             : 2;
                     63: // #define     NVRAM_BOOTCMD   12
                     64: //     char ni_bootcmd[NVRAM_BOOTCMD];
                     65: //     u_short ni_cksum;
                     66: // };
                     67: 
                     68: // #define     N_brightness    0
                     69: // #define     N_volume_l      1
                     70: // #define     N_volume_r      2
                     71: 
                     72: /* nominal values during self test */
                     73: // #define     BRIGHT_NOM      20
                     74: // #define     VOL_NOM         0
                     75: 
                     76: /* bits in ni_pot[0] */
                     77: #define POT_ON              0x01
                     78: #define EXTENDED_POT        0x02
                     79: #define LOOP_POT            0x04
                     80: #define VERBOSE_POT         0x08
                     81: #define TEST_DRAM_POT       0x10
                     82: #define BOOT_POT            0x20
                     83: #define TEST_MONITOR_POT    0x40
                     84: 
                     85: /* bits in byte 17 */
                     86: #define NEW_CLOCK_CHIP      0x80
                     87: #define AUTO_POWERON        0x40
                     88: #define USE_CONSOLE_SLOT    0x20
                     89: #define CONSOLE_SLOT        0x18
                     90: #define USE_PARITY_MEM      0x40
                     91: 
                     92: /* bits in ni_simm (rtc ram byte 10 and 11) *
                     93:  * -------- -----xxx bit 0 - 2: 1st simm: bit 1+2 define size, bit 3 defines page mode
                     94:  * -------- --xxx--- bit 3 - 5: 2nd simm: bit 1+2 define size, bit 3 defines page mode
                     95:  * -------x xx------ bit 6 - 8: 3rd simm: bit 1+2 define size, bit 3 defines page mode
                     96:  * ----xxx- -------- bit 9 -11: 4th simm: bit 1+2 define size, bit 3 defines page mode
                     97:  * xxxx---- -------- bit 12-15: defines parity, 1 bit for each simm (ignored on 68030)
                     98:  */
                     99: /* for 68030 and monochrome non-turbo systems */
                    100: #define SIMM_EMPTY          0x0
                    101: #define SIMM_16MB           0x1 /* Group of four 4 Mbyte SIMMs */
                    102: #define SIMM_4MB            0x2 /* Group of four 1 Mbyte SIMMs */
                    103: #define SIMM_1MB            0x3 /* Group of four 256 KByte SIMMs */
                    104: #define SIMM_PAGE_MODE      0x4 /* SIMM type is page mode, else nibble mode */
                    105: /* for all 68040 systems */
                    106: #define SIMM_PARITY         0x8 /* SIMMs support parity */
                    107: /* for non-turbo color systems */
                    108: #define SIMM_8MB_C          0x1 /* Pair of 4 Mbyte SIMMs */
                    109: #define SIMM_2MB_C          0x2 /* Pair of 1 Mbyte SIMMs */
                    110: #define SIMM_EMPTY2         0x3 /* reserved */
                    111: /* for turbo systems */
                    112: #define SIMM_32MB_T         0x1 /* Pair of 16 or 32 MByte SIMMs (front or back) */
                    113: #define SIMM_8MB_T          0x2 /* Pair of 4 or 8 MByte SIMMs (front or back) */
                    114: #define SIMM_2MB_T          0x3 /* Pair of 1 or 2 MByte SIMMs (front or back) */
                    115: 
                    116: 
                    117: /* RTC RAM */
                    118: Uint8 rtc_ram[32]={
                    119:     0x94,0x0f,0x40,0x00, // byte 0 - 3
                    120:     0x00,0x00,0x00,0x00,0x00,0x00, // byte 4 - 9: hardware password, ethernet address (?)
                    121:     0x00,0x00, // byte 10, 11: simm type and size (4 simms, 4 bits per simm), see bits in ni_simm above
                    122:     0x00,0x00, // byte 12, 13: adobe (?)
                    123:     0x4b,0x00,0x00, // byte 14: POT, byte 15: oldest ..., byte 16: most recent selftest error code
                    124:     0x00, // byte 17: bit7:clock chip; 6:auto poweron; 5:enable console slot; 3,4:console slot; 2:parity mem
                    125:     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // byte 18 - 29: boot command
                    126:     0x0F,0x13 // byte 30, 31: checksum
                    127: };
                    128: Uint8 read_rtc_ram(Uint8 position) {
                    129:     return rtc_ram[position];
                    130: }
                    131: 
                    132: Uint8 rtc_ram_default[32]={
                    133:     0x94,0x0f,0x40,0x00,0x00,0x00,0x00,0x00,
                    134:     0x00,0x00,0x00,0x00,0x00,0x00,0x4b,0x00,
                    135:     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                    136:     0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x13
                    137: };
                    138: 
                    139: /*
                    140: Uint8 rtc_ram[32]={ // values from nextcomputers.org forums
                    141:     0x94,0x0f,0x40,0x03,0x00,0x00,0x00,0x00,
                    142:     0x00,0x00,0xfb,0x6d,0x00,0x00,0x4b,0x00,
                    143:     0x41,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
                    144:     0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x7e
                    145: };
                    146: */
                    147: 
                    148: /*
                    149: old value (boot to network diagnostics)
                    150: Uint8 rtc_ram[32]={
                    151: 0x94,0x0f,0x40,0x00,0x00,0x00,0x00,0x00,
                    152: 0x00,0x00,0xfb,0x6d,0x00,0x00,0x7B,0x00,
                    153: 0x00,0x00,0x65,0x6e,0x00,0x00,0x00,0x00,
                    154: 0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x13
                    155: };
                    156: */
                    157: 
                    158: void nvram_init(void) {
                    159:     /* Reset RTC RAM to default values */
                    160:     memcpy(rtc_ram, rtc_ram_default, sizeof(rtc_ram_default));
                    161: 
                    162:     /* Build boot command */
                    163:     switch (ConfigureParams.Boot.nBootDevice) {
                    164:         case BOOT_ROM:
                    165:             rtc_ram[18] = 0x00;
                    166:             rtc_ram[19] = 0x00;
                    167:             break;
                    168:         case BOOT_SCSI:
                    169:             rtc_ram[18] = 's';
                    170:             rtc_ram[19] = 'd';
                    171:             break;
                    172:         case BOOT_ETHERNET:
                    173:             rtc_ram[18] = 'e';
                    174:             rtc_ram[19] = 'n';
                    175:             break;
                    176:         case BOOT_MO:
                    177:             rtc_ram[18] = 'o';
                    178:             rtc_ram[19] = 'd';
                    179:             break;
                    180:         case BOOT_FLOPPY:
                    181:             rtc_ram[18] = 'f';
                    182:             rtc_ram[19] = 'd';
                    183:             break;
                    184:             
                    185:         default: break;
                    186:     }
                    187:     
                    188:     /* Copy ethernet address from ROM to RTC RAM */
                    189:     int i;
                    190:     for (i = 0; i<6; i++) {
                    191:         rtc_ram[i+4]=NEXTRom[i+8];
                    192:     }
                    193:     
                    194:     /* Build SIMM bytes (for now only valid on monochrome systems) */
                    195:     Uint16 SIMMconfig = 0x0000;
                    196:     Uint8 simm[4];
                    197:     Uint8 parity = 0xF0;
                    198:     if (ConfigureParams.System.bTurbo) {
                    199:         for (i = 0; i<4; i++) {
                    200:             switch (MemBank_Size[i]>>20) {
                    201:                 case 0: simm[i] = SIMM_EMPTY; parity &= ~(0x10<<i); break;
                    202:                 case 2: simm[i] = SIMM_2MB_T; break;
                    203:                 case 8: simm[i] = SIMM_8MB_T; break;
                    204:                 case 32: simm[i] = SIMM_32MB_T; break;
                    205:                 default: simm[i] = SIMM_EMPTY; break;
                    206:             }
                    207:         }
                    208: 
                    209:     } else if (ConfigureParams.System.bColor) {
                    210:         for (i = 0; i<4; i++) {
                    211:             switch (MemBank_Size[i]>>20) {
                    212:                 case 0: simm[i] = SIMM_EMPTY; parity &= ~(0x10<<i); break;
                    213:                 case 2: simm[i] = SIMM_2MB_C; break;
                    214:                 case 8: simm[i] = SIMM_8MB_C; break;
                    215:                 default: simm[i] = SIMM_EMPTY; break;
                    216:             }
                    217:         }
                    218: 
                    219:     } else {
                    220:         for (i = 0; i<4; i++) {
                    221:             switch (MemBank_Size[i]>>20) {
                    222:                 case 0: simm[i] = SIMM_EMPTY; parity &= ~(0x10<<i); break;
                    223:                 case 1: simm[i] = SIMM_1MB | SIMM_PAGE_MODE; break;
                    224:                 case 4: simm[i] = SIMM_4MB | SIMM_PAGE_MODE; break;
                    225:                 case 16: simm[i] = SIMM_16MB | SIMM_PAGE_MODE; break;
                    226:                 default: simm[i] = SIMM_EMPTY | SIMM_PAGE_MODE; break;
                    227:             }
                    228:         }
                    229:     }
                    230:     
                    231:     SIMMconfig = ((parity&0xF0)<<8) | (simm[3]<<9) | (simm[2]<<6) | (simm[1]<<3) | simm[0];
                    232:     rtc_ram[10] = (SIMMconfig>>8)&0xFF;
                    233:     rtc_ram[11] = SIMMconfig&0xFF;
                    234:     
                    235:     /* Build POT byte[0] */
                    236:     rtc_ram[14] = 0x00;
                    237:     if (ConfigureParams.Boot.bEnableDRAMTest)
                    238:         rtc_ram[14] |= TEST_DRAM_POT;
                    239:     if (ConfigureParams.Boot.bEnablePot)
                    240:         rtc_ram[14] |= POT_ON;
                    241:     if (ConfigureParams.Boot.bEnableSoundTest)
                    242:         rtc_ram[14] |= TEST_MONITOR_POT;
                    243:     if (ConfigureParams.Boot.bEnableSCSITest)
                    244:         rtc_ram[14] |= EXTENDED_POT;
                    245:     if (ConfigureParams.Boot.bLoopPot)
                    246:         rtc_ram[14] |= LOOP_POT;
                    247:     if (ConfigureParams.Boot.bVerbose)
                    248:         rtc_ram[14] |= VERBOSE_POT;
                    249:     if (ConfigureParams.Boot.bExtendedPot)
                    250:         rtc_ram[14] |= BOOT_POT;
                    251:     
                    252:     /* Set clock chip bit */
                    253:     switch (ConfigureParams.System.nRTC) {
                    254:         case MCS1850: rtc_ram[17] |= NEW_CLOCK_CHIP; break;
                    255:         case MC68HC68T1: rtc_ram[17] &= ~NEW_CLOCK_CHIP; break;
                    256:         default: break;
                    257:     }
                    258:         
                    259:     /* Re-calculate checksum */
                    260:     rtc_checksum(1);
                    261: }
                    262: 
                    263: void rtc_checksum(int force) {
                    264:        int sum,i;
                    265:        sum=0;
                    266:        for (i=0;i<30;i+=2) {
                    267:                sum+=(rtc_ram[i]<<8)|(rtc_ram[i+1]);
                    268:                if (sum>=0x10000) { 
                    269:                        sum-=0x10000;
                    270:                        sum+=1;
                    271:                }
                    272:        }
                    273: 
                    274:        sum=0xFFFF-sum; 
                    275: 
                    276:        if (force) {
                    277:                rtc_ram[30]=(sum&0xFF00)>>8;
                    278:                rtc_ram[31]=(sum&0xFF);
                    279:                Log_Printf(LOG_WARN,"Forcing RTC checksum to %x %x",rtc_ram[30],rtc_ram[31]);
                    280:        } else {
                    281:                Log_Printf(LOG_WARN,"Check RTC checksum to %x %x %x %x",
                    282:                rtc_ram[30],(sum&0xFF00)>>8,
                    283:                rtc_ram[31],(sum&0xFF));
                    284:        }
                    285: }
                    286: 
                    287: static char rtc_ram_info[1024];
                    288: char * get_rtc_ram_info(void) {
                    289:     char buf[256];
                    290:     int sum;
                    291:     int i;
                    292:     int ni_vol_l,ni_vol_r,ni_brightness;
                    293:     int ni_hw_pwd,ni_spkren,ni_lowpass;
                    294:     sprintf(buf,"Rtc info:\n");
                    295:     strcpy(rtc_ram_info,buf);
                    296:     
                    297:     // struct nvram_info {
                    298:     // #define NI_RESET        9
                    299:     //         u_int   ni_reset : 4,
                    300:     
                    301:     sprintf(buf,"RTC RESET:x%1X ",rtc_ram[0]>>4);
                    302:     strcat(rtc_ram_info,buf);  
                    303:     
                    304:     // #define SCC_ALT_CONS    0x08000000
                    305:     //                 ni_alt_cons : 1,
                    306:     if (rtc_ram[0]&0x08) strcat(rtc_ram_info,"ALT_CONS ");
                    307:     // #define ALLOW_EJECT     0x04000000
                    308:     //                 ni_allow_eject : 1,
                    309:     if (rtc_ram[0]&0x04) strcat(rtc_ram_info,"ALLOW_EJECT ");
                    310:     //                 ni_vol_r : 6,
                    311:     //                 ni_brightness : 6,
                    312:     // #define HW_PWD  0x6
                    313:     //                 ni_hw_pwd : 4,
                    314:     //                 ni_vol_l : 6,
                    315:     //                 ni_spkren : 1,
                    316:     //                 ni_lowpass : 1,
                    317:     // #define BOOT_ANY        0x00000002
                    318:     //                 ni_boot_any : 1,
                    319:     // #define ANY_CMD         0x00000001      
                    320:     //                 ni_any_cmd : 1;
                    321:     
                    322:     ni_vol_r=(((rtc_ram[0]&0x3)<<4)|((rtc_ram[1]&0xF0)>>4));
                    323:     ni_brightness=(((rtc_ram[1]&0xF)<<2)|((rtc_ram[2]&0xC0)>>6));
                    324:     ni_vol_l=((rtc_ram[2]&0x3F)<<2);
                    325:     ni_hw_pwd=(rtc_ram[3]&0xF0)>>4;
                    326:     sprintf(buf,"VOL_R:x%1X BRIGHT:x%1X HWPWD:x%1X VOL_L:x%1X",ni_vol_r,ni_brightness,ni_vol_l,ni_hw_pwd);
                    327:     strcat(rtc_ram_info,buf);  
                    328:     
                    329:     if (rtc_ram[3]&0x08) strcat(rtc_ram_info,"SPK_ENABLE ");
                    330:     if (rtc_ram[3]&0x04) strcat(rtc_ram_info,"LOW_PASS ");
                    331:     if (rtc_ram[3]&0x02) strcat(rtc_ram_info,"BOOT_ANY ");
                    332:     if (rtc_ram[3]&0x01) strcat(rtc_ram_info,"ANY_CMD ");
                    333:     
                    334:     
                    335:     
                    336:     // #define NVRAM_HW_PASSWD 6
                    337:     //         u_char ni_ep[NVRAM_HW_PASSWD];
                    338:     
                    339:     sprintf(buf,"NVRAM_HW_PASSWD:%2X %2X %2X %2X %2X %2X ",rtc_ram[4],rtc_ram[5],rtc_ram[6],rtc_ram[7],rtc_ram[8],rtc_ram[9]);
                    340:     strcat(rtc_ram_info,buf);  
                    341:     // #define ni_enetaddr     ni_ep
                    342:     // #define ni_hw_passwd    ni_ep
                    343:     //         u_short ni_simm;                /* 4 SIMMs, 4 bits per SIMM */
                    344:     sprintf(buf,"SIMM:%1X %1X %1X %1X ",rtc_ram[10]>>4,rtc_ram[10]&0x0F,rtc_ram[11]>>4,rtc_ram[11]&0x0F);
                    345:     strcat(rtc_ram_info,buf);
                    346:     
                    347:     
                    348:     //         char ni_adobe[2];
                    349:     sprintf(buf,"ADOBE:%2X %2X ",rtc_ram[12],rtc_ram[13]);
                    350:     strcat(rtc_ram_info,buf);
                    351:     
                    352:     //         u_char ni_pot[3];
                    353:     sprintf(buf,"POT:%2X %2X %2X ",rtc_ram[14],rtc_ram[15],rtc_ram[16]);
                    354:     strcat(rtc_ram_info,buf);
                    355:     
                    356:     //         u_char  ni_new_clock_chip : 1,
                    357:     //                 ni_auto_poweron : 1,
                    358:     //                 ni_use_console_slot : 1,        /* Console slot was set by user. */
                    359:     //                 ni_console_slot : 2,            /* Preferred console dev slot>>1 */
                    360:     //                 ni_use_parity_mem : 1,  /* Use parity RAM if available? */
                    361:     //                 : 2;
                    362:     if (rtc_ram[17]&0x80) strcat(rtc_ram_info,"NEW_CLOCK_CHIP ");
                    363:     if (rtc_ram[17]&0x40) strcat(rtc_ram_info,"AUTO_POWERON ");
                    364:     if (rtc_ram[17]&0x20) strcat(rtc_ram_info,"CONSOLE_SLOT ");
                    365:     
                    366:     sprintf(buf,"console_slot:%X ",(rtc_ram[17]&0x18)>>3);
                    367:     strcat(rtc_ram_info,buf);
                    368:     
                    369:     if (rtc_ram[17]&0x04) strcat(rtc_ram_info,"USE_PARITY ");
                    370:     
                    371:     
                    372:     strcat(rtc_ram_info,"boot_command:");
                    373:     for (i=0;i<12;i++) {
                    374:         if ((rtc_ram[18+i]>=0x20) && (rtc_ram[18+i]<=0x7F)) {
                    375:             sprintf(buf,"%c",rtc_ram[18+i]);
                    376:             strcat(rtc_ram_info,buf);
                    377:         }
                    378:     }
                    379:     
                    380:     strcat(rtc_ram_info," ");
                    381:     sprintf(buf,"CKSUM:%2X %2X ",rtc_ram[30],rtc_ram[31]);
                    382:     strcat(rtc_ram_info,buf);
                    383:     
                    384:     
                    385:     sum=0;
                    386:     for (i=0;i<30;i+=2) {
                    387:         sum+=(rtc_ram[i]<<8)|(rtc_ram[i+1]);
                    388:         if (sum>=0x10000) { sum-=0x10000;
                    389:             sum+=1;
                    390:         }
                    391:     }
                    392:     
                    393:     sum=0xFFFF-sum;
                    394:     
                    395:     sprintf(buf,"CALC_CKSUM:%04X ",sum&0xFFFF);
                    396:     strcat(rtc_ram_info,buf);
                    397:     
                    398:     // #define NVRAM_BOOTCMD   12
                    399:     //         char ni_bootcmd[NVRAM_BOOTCMD];
                    400:     //         u_short ni_cksum;
                    401:     // };
                    402:     
                    403:     return rtc_ram_info;
                    404: }
                    405: 
                    406: 
                    407: void SID_Read(void) {
                    408:        Log_Printf(LOG_WARN,"SID read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    409:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=0x00; // slot ID 0
                    410: }
                    411: 
                    412: /* System Control Register 1
                    413:  *
                    414:  * These values are valid for all non-Turbo systems:
                    415:  * -------- -------- -------- ------xx  bits 0:1   --> cpu speed
                    416:  * -------- -------- -------- ----xx--  bits 2:3   --> reserved
                    417:  * -------- -------- -------- --xx----  bits 4:5   --> main memory speed
                    418:  * -------- -------- -------- xx------  bits 6:7   --> video memory speed
                    419:  * -------- -------- ----xxxx --------  bits 8:11  --> board revision
                    420:  * -------- -------- xxxx---- --------  bits 12:15 --> cpu type
                    421:  * -------- xxxxxxxx -------- --------  bits 16:23 --> dma revision
                    422:  * ----xxxx -------- -------- --------  bits 24:27 --> reserved
                    423:  * xxxx---- -------- -------- --------  bits 28:31 --> slot id
                    424:  *
                    425:  * cpu speed:       0 = 40MHz, 1 = 20MHz, 2 = 25MHz, 3 = 33MHz
                    426:  * main mem speed:  0 = 120ns, 1 = 100ns, 2 = 80ns, 3 = 60ns
                    427:  * video mem speed: 0 = 120ns, 1 = 100ns, 2 = 80ns, 3 = 60ns
                    428:  * board revision:  for 030 Cube:
                    429:  *                  0 = DCD input inverted
                    430:  *                  1 = DCD polarity fixed
                    431:  *                  2 = must disable DSP mem before reset
                    432:  * cpu type:        0 = NeXT Computer (68030)
                    433:  *                  1 = NeXTstation monochrome
                    434:  *                  2 = NeXTcube
                    435:  *                  3 = NeXTstation color
                    436:  *                  4 = all Turbo systems
                    437:  * dma revision:    1 on all systems ?
                    438:  * slot id:         f on Turbo systems (cube too?), 0 on other systems
                    439:  *
                    440:  *
                    441:  * These bits are always 0 on all Turbo systems:
                    442:  * ----xxxx xxxxxxxx ----xxxx xxxxxxxx
                    443:  */
                    444: 
                    445: /* for Slab 040:
                    446:  * 0000 0000 0000 0001 0001 0000 0101 0010
                    447:  * 00 01 10 52
                    448:  *
                    449:  * for Cube 030:
                    450:  * 0000 0000 0000 0001 0000 0001 0101 0010
                    451:  * 00 01 01 52
                    452:  */
                    453: #define SCR1_NEXT_COMPUTER  0x00010152
                    454: #define SCR1_SLAB_MONO      0x00011052
                    455: #define SCR1_SLAB_COLOR     0x00013052
                    456: #define SCR1_CUBE           0x00012052
                    457: #define SCR1_TURBO          0xF0004000
                    458: 
                    459: #define SCR1_CONST_MASK     0xFFFFFF00
                    460: 
                    461: void SCR_Reset(void) {
                    462:     scr2_0=0x00;
                    463:     scr2_1=0x00;
                    464:     scr2_2=0x80;
                    465:     scr2_3=0x00;
                    466:     
                    467:     intStat=0x00000000;
                    468:     intMask=0x00000000;
                    469: 
                    470:     if (ConfigureParams.System.bTurbo) {
                    471:         scr1 = SCR1_TURBO;
                    472:         TurboSCR1_Reset();
                    473:         return;
                    474:     } else {
                    475:         switch (ConfigureParams.System.nMachineType) {
                    476:             case NEXT_CUBE030:
                    477:                 scr1 = SCR1_NEXT_COMPUTER & SCR1_CONST_MASK;
                    478:                 break;
                    479:             case NEXT_CUBE040:
                    480:                 scr1 = SCR1_CUBE & SCR1_CONST_MASK;
                    481:                 break;
                    482:             case NEXT_STATION:
                    483:                 if (ConfigureParams.System.bColor)
                    484:                     scr1 = SCR1_SLAB_COLOR & SCR1_CONST_MASK;
                    485:                 else
                    486:                     scr1 = SCR1_SLAB_MONO & SCR1_CONST_MASK;
                    487:                 break;
                    488:             default:
                    489:                 break;
                    490:         }
                    491:     }
                    492:     
                    493:     Uint8 cpu_speed = ((ConfigureParams.System.nCpuFreq/8)-1)%4;
                    494:     Uint8 memory_speed;
                    495:     switch (ConfigureParams.Memory.nMemorySpeed) {
                    496:         case MEMORY_120NS: memory_speed = 0x00; break;
                    497:         case MEMORY_100NS: memory_speed = 0x50; break;
                    498:         case MEMORY_80NS: memory_speed = 0xA0; break;
                    499:         case MEMORY_60NS: memory_speed = 0xF0; break;
                    500:         default: Log_Printf(LOG_WARN, "SCR1 error: unknown memory speed\n"); break;
                    501:     }
                    502:     scr1 |= ((memory_speed&0xF0)|(cpu_speed&0x03));
                    503: }
                    504: 
                    505: void SCR1_Read0(void)
                    506: {
                    507:        Log_Printf(LOG_WARN,"SCR1 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    508:     IoMem[IoAccessCurrentAddress&IO_SEG_MASK] = (scr1&0xFF000000)>>24;
                    509: }
                    510: void SCR1_Read1(void)
                    511: {
                    512:        Log_Printf(LOG_WARN,"SCR1 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    513:     IoMem[IoAccessCurrentAddress&IO_SEG_MASK] = (scr1&0x00FF0000)>>16;
                    514: }
                    515: void SCR1_Read2(void)
                    516: {
                    517:        Log_Printf(LOG_WARN,"SCR1 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    518:     IoMem[IoAccessCurrentAddress&IO_SEG_MASK] = (scr1&0x0000FF00)>>8;
                    519: }
                    520: void SCR1_Read3(void)
                    521: {
                    522:        Log_Printf(LOG_WARN,"SCR1 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    523:     IoMem[IoAccessCurrentAddress&IO_SEG_MASK] = scr1&0x000000FF;
                    524: }
                    525: 
                    526: 
                    527: /* Additional System Control Register for Turbo systems:
                    528:  * -------- -------- -------- -----?xx  bits 0:2   --> cpu speed
                    529:  * -------- -------- -------- --xx----  bits 4:5   --> main memory speed
                    530:  * -------- -------- -------- xx------  bits 6:7   --> video memory speed
                    531:  * -------- -------- xxxx---- --------  bits 8:11  --> cpu type
                    532:  * xxxxxxxx xxxxxxxx ----xxxx ----?---  all other bits: 1
                    533:  *
                    534:  * cpu speed:       7 = 33MHz?
                    535:  * main mem speed:  0 = 120ns?, 1 = 100ns?, 2 = 70ns, 3 = 60ns
                    536:  * video mem speed: 3 on all Turbo systems (60ns)?
                    537:  * cpu type:        4 = NeXTstation turbo monochrome
                    538:  *                  5 = NeXTstation turbo color
                    539:  */
                    540: 
                    541: #define TURBOSCR_FMASK   0xFFFF0F08
                    542: 
                    543: void TurboSCR1_Reset(void) {
                    544:     Uint8 memory_speed;
                    545:     Uint8 cpu_speed = 0x07; // 33 MHz
                    546:     switch (ConfigureParams.Memory.nMemorySpeed) {
                    547:         case MEMORY_120NS: memory_speed = 0xC0; break;
                    548:         case MEMORY_100NS: memory_speed = 0xD0; break;
                    549:         case MEMORY_80NS: memory_speed = 0xE0; break;
                    550:         case MEMORY_60NS: memory_speed = 0xF0; break;
                    551:         default: Log_Printf(LOG_WARN, "Turbo SCR1 error: unknown memory speed\n"); break;
                    552:     }
                    553:     turboscr1 = ((memory_speed&0xF0)|(cpu_speed&0x07));
                    554:     if (ConfigureParams.System.bColor) {
                    555:         turboscr1 |= 0x5000;
                    556:     } else {
                    557:         turboscr1 |= 0x4000;
                    558:     }
                    559:     turboscr1 |= TURBOSCR_FMASK;
                    560: }
                    561: 
                    562: void TurboSCR1_Read0(void) {
                    563:     Log_Printf(LOG_WARN,"Turbo SCR1 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    564:     IoMem_WriteWord(IoAccessCurrentAddress&0x1FFFF, (turboscr1&0xFFFF0000)>>16);
                    565: }
                    566: void TurboSCR1_Read2(void) {
                    567:     Log_Printf(LOG_WARN,"Turbo SCR1 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    568:     IoMem_WriteWord(IoAccessCurrentAddress&0x1FFFF, turboscr1&0x0000FFFF);
                    569: }
                    570: 
                    571: 
                    572: 
                    573: /* System Control Register 2 
                    574:  
                    575:  s_dsp_reset : 1,
                    576:  s_dsp_block_end : 1,
                    577:  s_dsp_unpacked : 1,
                    578:  s_dsp_mode_B : 1,
                    579:  s_dsp_mode_A : 1,
                    580:  s_remote_int : 1,
                    581:  s_local_int : 2,
                    582:  s_dram_256K : 4,
                    583:  s_dram_1M : 4,
                    584:  s_timer_on_ipl7 : 1,
                    585:  s_rom_wait_states : 3,
                    586:  s_rom_1M : 1,
                    587:  s_rtdata : 1,
                    588:  s_rtclk : 1,
                    589:  s_rtce : 1,
                    590:  s_rom_overlay : 1,
                    591:  s_dsp_int_en : 1,
                    592:  s_dsp_mem_en : 1,
                    593:  s_reserved : 4,
                    594:  s_led : 1;
                    595:  
                    596:  */
                    597: 
                    598: #define SCR2_SOFTINT2          0x02
                    599: #define SCR2_SOFTINT1          0x01
                    600: 
                    601: #define SCR2_TIMERIPL7         0x80
                    602: #define SCR2_RTDATA            0x04
                    603: #define SCR2_RTCLK             0x02
                    604: #define SCR2_RTCE              0x01
                    605: 
                    606: #define SCR2_LED               0x01
                    607: #define SCR2_ROM               0x80
                    608: 
                    609: 
                    610: void SCR2_Write0(void)
                    611: {      
                    612:        Uint8 old_scr2_0=scr2_0;
                    613:     // Log_Printf(LOG_WARN,"SCR2 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & IO_SEG_MASK],m68k_getpc());
                    614:        scr2_0=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                    615: 
                    616:        if ((old_scr2_0&SCR2_SOFTINT1)!=(scr2_0&SCR2_SOFTINT1)) {
                    617:                Log_Printf(LOG_WARN,"SCR2 SCR2_SOFTINT1 change at $%08x val=%x PC=$%08x\n",
                    618:                            IoAccessCurrentAddress,scr2_0&SCR2_SOFTINT1,m68k_getpc());
                    619:                if (scr2_0&SCR2_SOFTINT1) 
                    620:                        set_interrupt(INT_SOFT1,SET_INT);
                    621:                else
                    622:                        set_interrupt(INT_SOFT1,RELEASE_INT);
                    623:        }
                    624: 
                    625:        if ((old_scr2_0&SCR2_SOFTINT2)!=(scr2_0&SCR2_SOFTINT2)) {
                    626:                Log_Printf(LOG_WARN,"SCR2 SCR2_SOFTINT2 change at $%08x val=%x PC=$%08x\n",
                    627:                            IoAccessCurrentAddress,scr2_0&SCR2_SOFTINT2,m68k_getpc());
                    628:                if (scr2_0&SCR2_SOFTINT2) 
                    629:                        set_interrupt(INT_SOFT2,SET_INT);
                    630:                else
                    631:                        set_interrupt(INT_SOFT2,RELEASE_INT);
                    632:        }
                    633: }
                    634: 
                    635: void SCR2_Read0(void)
                    636: {
                    637:     // Log_Printf(LOG_WARN,"SCR2 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    638:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=scr2_0;
                    639: }
                    640: 
                    641: void SCR2_Write1(void)
                    642: {      
                    643:     // Log_Printf(LOG_WARN,"SCR2 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & IO_SEG_MASK],m68k_getpc());
                    644:        scr2_1=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                    645: }
                    646: 
                    647: void SCR2_Read1(void)
                    648: {
                    649:     // Log_Printf(LOG_WARN,"SCR2 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    650:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=scr2_1;
                    651: }
                    652: 
                    653: void SCR2_Write2(void)
                    654: {      
                    655:        static int phase=0;
                    656:        static bool burst=false;
                    657:        static Uint8 rtc_command=0;
                    658:        static Uint8 rtc_value=0;
                    659:        static Uint8 rtc_return=0;
                    660:        static Uint8 rtc_status=0x00;
                    661:        static Uint8 rtc_ccr=0x00;      
                    662:        static Uint8 rtc_icr=0x00;      
                    663: 
                    664:        static int day_in_week=0x02;
                    665:        static int day=0x31;
                    666:        static int month=0x12;
                    667:        static int year=0x98;
                    668:        static int century=0x19;
                    669: 
                    670:     
                    671:        Uint8 old_scr2_2=scr2_2;
                    672: 
                    673:        scr2_2=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                    674: 
                    675:        if ((old_scr2_2&SCR2_TIMERIPL7)!=(scr2_2&SCR2_TIMERIPL7)) {
                    676:                Log_Printf(LOG_WARN,"SCR2 TIMER IPL7 change at $%08x val=%x PC=$%08x\n",
                    677:                            IoAccessCurrentAddress,scr2_2&SCR2_TIMERIPL7,m68k_getpc());
                    678:        }
                    679: 
                    680:     // treat only if CE is set to 1
                    681:        if (scr2_2&SCR2_RTCE) {
                    682:         if (phase==-1) {phase=0;}
                    683: 
                    684:         // if we are in going down clock... do something
                    685:         if (((old_scr2_2&SCR2_RTCLK)!=(scr2_2&SCR2_RTCLK)) && ((scr2_2&SCR2_RTCLK)==0) ) {
                    686:             if (phase<8)
                    687:                 rtc_command=(rtc_command<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    688: 
                    689:            // now reading or writing register (one bit at a time)
                    690:             if ((phase>=8) && (phase<16)) {
                    691:                 rtc_value=(rtc_value<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    692:                 
                    693:                 // if we read RAM register, output RT_DATA bit
                    694:                 if (rtc_command<=0x1F) {
                    695:                     scr2_2=scr2_2&(~SCR2_RTDATA);
                    696:                     if (rtc_ram[rtc_command]&(0x80>>(phase-8)))
                    697:                         scr2_2|=SCR2_RTDATA;
                    698:                     rtc_return=(rtc_return<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    699:                 }
                    700:                 // read the status 0x30
                    701:                 if (rtc_command==0x30) {
                    702:                     scr2_2=scr2_2&(~SCR2_RTDATA);
                    703:                     // for now status = 0x98 (new rtc + FTU)
                    704:                     if (rtc_status&(0x80>>(phase-8)))
                    705:                         scr2_2|=SCR2_RTDATA;
                    706:                     rtc_return=(rtc_return<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    707:                 }
                    708:                 // read the status 0x31
                    709:                 if (rtc_command==0x31) {
                    710:                     scr2_2=scr2_2&(~SCR2_RTDATA);
                    711:                     if (rtc_ccr&(0x80>>(phase-8)))
                    712:                         scr2_2|=SCR2_RTDATA;
                    713:                     rtc_return=(rtc_return<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    714:                 }
                    715:                 // read the status 0x32
                    716:                 if (rtc_command==0x32) {
                    717:                     scr2_2=scr2_2&(~SCR2_RTDATA);
                    718:                     if (rtc_icr&(0x80>>(phase-8)))
                    719:                         scr2_2|=SCR2_RTDATA;
                    720:                     rtc_return=(rtc_return<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    721:                 }
                    722:                 if ((rtc_command>=0x20) && (rtc_command<=0x2F)) {
                    723:                    unsigned char v;
                    724:                    static time_t t;
                    725:                     static struct tm * ts;
                    726: 
                    727:                     scr2_2=scr2_2&(~SCR2_RTDATA);
                    728:                     // get time at once to avoid problems (in burst mode only).
                    729:                    if (!burst) {
                    730:                            t=time(NULL);
                    731:                            ts=localtime(&t);
                    732:                        burst=true;
                    733:                    }
                    734:                    v=0;
                    735:                    switch (rtc_command) {
                    736:                        case 0x20 : // seconds
                    737:                                v=(((ts->tm_sec)/10)<<4)|(ts->tm_sec%10);
                    738:                                break;
                    739:                        case 0x21 : //min
                    740:                                v=(((ts->tm_min)/10)<<4)|(ts->tm_min%10);
                    741:                                break;
                    742:                        case 0x22 : // hour
                    743:                                v=(((ts->tm_hour)/10)<<4)|(ts->tm_hour%10);
                    744:                                break;
                    745:                        case 0x23 : 
                    746:                                v=day_in_week;
                    747:                                break;
                    748:                        case 0x24 : 
                    749:                                v=day;
                    750:                                break;
                    751:                        case 0x25 : 
                    752:                                v=month;
                    753:                                break;
                    754:                        case 0x26 : 
                    755:                                v=year;
                    756:                                break;
                    757:                        case 0x27 : 
                    758:                                v=century;
                    759:                                break;
                    760:                    }
                    761:                     if (v&(0x80>>(phase-8)))
                    762:                         scr2_2|=SCR2_RTDATA;
                    763:                     rtc_return=(rtc_return<<1)|((scr2_2&SCR2_RTDATA)?1:0);
                    764:                 }
                    765:                 
                    766:             } // of read/write phase
                    767:             
                    768:             phase++;
                    769:             if (phase==16) {
                    770:                 Log_Printf(LOG_WARN,"SCR2 RTC command complete %x %x %x at PC=$%08x\n",
                    771:                            rtc_command,rtc_value,rtc_return,m68k_getpc());
                    772:                 if ((rtc_command>=0x80) && (rtc_command<=0x9F))
                    773:                     rtc_ram[rtc_command-0x80]=rtc_value;
                    774:                 
                    775:                 // write to x31 register
                    776:                 if (rtc_command==0xB1) {
                    777:                    rtc_ccr=rtc_value;
                    778: 
                    779: 
                    780:                     // clear FTU
                    781:                     if (rtc_value & 0x04) {
                    782:                         rtc_status=rtc_status&(~0x18);
                    783:                         intStat=intStat&(~0x04);
                    784:                     }
                    785: 
                    786: 
                    787:                 }
                    788:                 // write to x32 register
                    789:                 if (rtc_command==0xB2) {
                    790:                    rtc_icr=rtc_value;
                    791:                }
                    792: 
                    793:                 if (rtc_command==0xA3) {
                    794:                    day_in_week=rtc_value;
                    795:                }
                    796:                 if (rtc_command==0xA4) {
                    797:                    day=rtc_value;
                    798:                }                
                    799:                if (rtc_command==0xA5) {
                    800:                    month=rtc_value;
                    801:                }                
                    802:                if (rtc_command==0xA6) {
                    803:                    year=rtc_value;
                    804:                }
                    805:                if (rtc_command==0xA7) {
                    806:                    century=rtc_value;
                    807:                }
                    808: 
                    809:                // burst mode
                    810:                phase=8;
                    811:                rtc_command++;
                    812:             } // of phase==16
                    813:         } // of going down clock
                    814:        } // of scr2_2&SCR2_RTCE
                    815:                else {
                    816:         // else end or abort
                    817:                phase=-1;
                    818:                rtc_command=0;
                    819:                rtc_value=0;
                    820:                burst=false;
                    821:        }       
                    822:     
                    823: }
                    824: 
                    825: void SCR2_Read2(void)
                    826: {
                    827:     // Log_Printf(LOG_WARN,"SCR2 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    828:     // IoMem[IoAccessCurrentAddress & 0x1FFFF]=scr2_2 & (SCR2_RTDATA|SCR2_RTCLK|SCR2_RTCE)); // + data
                    829:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=scr2_2;
                    830: }
                    831: 
                    832: int SCR_ROM_overlay=0;
                    833: 
                    834: void SCR2_Write3(void)
                    835: {      
                    836:        Uint8 old_scr2_3=scr2_3;
                    837:     // Log_Printf(LOG_WARN,"SCR2 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & IO_SEG_MASK],m68k_getpc());
                    838:        scr2_3=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                    839:        if ((old_scr2_3&SCR2_ROM)!=(scr2_3&SCR2_ROM)) {
                    840:                Log_Printf(LOG_WARN,"SCR2 ROM change at $%08x val=%x PC=$%08x\n",
                    841:                    IoAccessCurrentAddress,scr2_3&SCR2_ROM,m68k_getpc());
                    842:                   SCR_ROM_overlay=scr2_3&SCR2_ROM;
                    843:                }
                    844:        if ((old_scr2_3&SCR2_LED)!=(scr2_3&SCR2_LED)) {
                    845:                Log_Printf(LOG_WARN,"SCR2 LED change at $%08x val=%x PC=$%08x\n",
                    846:                    IoAccessCurrentAddress,scr2_3&SCR2_LED,m68k_getpc());
                    847:         Statusbar_SetSCR2Led(scr2_3&SCR2_LED);
                    848:     }
                    849: }
                    850: 
                    851: 
                    852: void SCR2_Read3(void)
                    853: {
                    854:     // Log_Printf(LOG_WARN,"SCR2 read at $%08x PC=$%08x\n", IoAccessCurrentAddress,m68k_getpc());
                    855:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=scr2_3;
                    856: }
                    857: 
                    858: 
                    859: 
                    860: /* Interrupt Status Register */
                    861: 
                    862: void IntRegStatRead(void) {
                    863:     IoMem_WriteLong(IoAccessCurrentAddress & IO_SEG_MASK, intStat);
                    864: }
                    865: 
                    866: void IntRegStatWrite(void) {
                    867:     intStat = IoMem_ReadLong(IoAccessCurrentAddress & IO_SEG_MASK);
                    868: }
                    869: 
                    870: void set_interrupt(Uint32 interrupt_val, Uint8 int_set_release) {
                    871:     
                    872:     Uint8 interrupt_level;
                    873:     
                    874:     if(int_set_release == SET_INT) {
                    875:         intStat = intStat | interrupt_val;
                    876:     } else {
                    877:         intStat = intStat & ~interrupt_val; 
                    878:     }
                    879:     
                    880:     switch (interrupt_val) {
                    881:         case INT_SOFT1: interrupt_level = 1;
                    882:             break;
                    883:         case INT_SOFT2: interrupt_level = 2;
                    884:             break;
                    885:         case INT_POWER:
                    886:         case INT_KEYMOUSE:
                    887:         case INT_MONITOR:
                    888:         case INT_VIDEO:
                    889:         case INT_DSP_L3:
                    890:         case INT_PHONE:
                    891:         case INT_SOUND_OVRUN:
                    892:         case INT_EN_RX:
                    893:         case INT_EN_TX:
                    894:         case INT_PRINTER:
                    895:         case INT_SCSI:
                    896:         case INT_DISK: interrupt_level = 3;
                    897:             break;
                    898:         case INT_DSP_L4: interrupt_level = 4;
                    899:             break;
                    900:         case INT_BUS:
                    901:         case INT_REMOTE:
                    902:         case INT_SCC: interrupt_level = 5;
                    903:             break;
                    904:         case INT_R2M_DMA:
                    905:         case INT_M2R_DMA:
                    906:         case INT_DSP_DMA:
                    907:         case INT_SCC_DMA:
                    908:         case INT_SND_IN_DMA:
                    909:         case INT_SND_OUT_DMA:
                    910:         case INT_PRINTER_DMA:
                    911:         case INT_DISK_DMA:
                    912:         case INT_SCSI_DMA:
                    913:         case INT_EN_RX_DMA:
                    914:         case INT_EN_TX_DMA:
                    915:                        interrupt_level = 6;
                    916:                break;
                    917:         case INT_TIMER:
                    918:                if (scr2_2&SCR2_TIMERIPL7)
                    919:                 interrupt_level = 7;
                    920:                else
                    921:                 interrupt_level = 6;
                    922:             break;
                    923:         case INT_PFAIL:
                    924:         case INT_NMI: interrupt_level = 7;
                    925:             break;            
                    926:         default: interrupt_level = 0;
                    927:             break;
                    928:     }
                    929:  
                    930:     if ((interrupt_val & intMask)==0) {
                    931:        Log_Printf(LOG_WARN,"[INT] interrupt is masked %04x mask %04x %s at %d",interrupt_val,intMask,__FILE__,__LINE__);
                    932:        return;
                    933:     }
                    934:    
                    935:     if(int_set_release == SET_INT) {
                    936:         Log_Printf(LOG_DEBUG,"Interrupt Level: %i", interrupt_level);
                    937:         M68000_Exception(((24+interrupt_level)*4), M68000_EXC_SRC_AUTOVEC);
                    938:     } else {
                    939: //        M68000_Exception(((24+0)*4), M68000_EXC_SRC_AUTOVEC); // release interrupt - does this work???
                    940:     }
                    941: }
                    942: 
                    943: /* Interrupt Mask Register */
                    944: 
                    945: void IntRegMaskRead(void) {
                    946:        IoMem_WriteLong(IoAccessCurrentAddress & IO_SEG_MASK,intMask);
                    947: }
                    948: 
                    949: void IntRegMaskWrite(void) {
                    950:        intMask = IoMem_ReadLong(IoAccessCurrentAddress & IO_SEG_MASK);
                    951:         Log_Printf(LOG_WARN,"Interrupt mask: %08x", intMask);
                    952: }
                    953: 
                    954: /*
                    955:  * Hardclock internal interrupt
                    956:  *
                    957:  */
                    958: 
                    959: #define HARDCLOCK_ENABLE 0x80
                    960: #define HARDCLOCK_LATCH  0x40
                    961: 
                    962: Uint8 hardclock_csr=0;
                    963: Uint8 hardclock1=0;
                    964: Uint8 hardclock0=0;
                    965: int pseudo_counter=0;
                    966: int latch_hardclock=0;
                    967: 
                    968: void Hardclock_InterruptHandler ( void )
                    969: {
                    970:        CycInt_AcknowledgeInterrupt();
                    971:        if ((hardclock_csr&HARDCLOCK_ENABLE) && (latch_hardclock>0)) {
                    972:                // Log_Printf(LOG_WARN,"[INT] throwing hardclock");
                    973:                set_interrupt(INT_TIMER,SET_INT);
                    974:                CycInt_AddRelativeInterrupt(latch_hardclock*33, INT_CPU_CYCLE, INTERRUPT_HARDCLOCK);
                    975:                pseudo_counter=latch_hardclock;
                    976:        }
                    977: }
                    978: 
                    979: 
                    980: void HardclockRead0(void){
                    981:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=(pseudo_counter>>8);
                    982: ;
                    983: //     if (pseudo_counter>0) pseudo_counter--;
                    984: 
                    985:        Log_Printf(LOG_WARN,"[hardclock] read at $%08x val=%02x PC=$%08x", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & 0x1FFFF],m68k_getpc());
                    986: }
                    987: void HardclockRead1(void){
                    988:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=pseudo_counter&0xff;
                    989:        if (pseudo_counter>0) pseudo_counter--;
                    990:        Log_Printf(LOG_WARN,"[hardclock] read at $%08x val=%02x PC=$%08x", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & 0x1FFFF],m68k_getpc());
                    991: }
                    992: 
                    993: void HardclockWrite0(void){
                    994:        Log_Printf(LOG_WARN,"[hardclock] write at $%08x val=%02x PC=$%08x", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & 0x1FFFF],m68k_getpc());
                    995:        hardclock0=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                    996: }
                    997: void HardclockWrite1(void){
                    998:        Log_Printf(LOG_WARN,"[hardclock] write at $%08x val=%02x PC=$%08x",IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & 0x1FFFF],m68k_getpc());
                    999:        hardclock1=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                   1000: }
                   1001: 
                   1002: void HardclockWriteCSR(void) {
                   1003:        Log_Printf(LOG_WARN,"[hardclock] write at $%08x val=%02x PC=$%08x", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & 0x1FFFF],m68k_getpc());
                   1004:        hardclock_csr=IoMem[IoAccessCurrentAddress & 0x1FFFF];
                   1005:        if ((hardclock_csr&HARDCLOCK_LATCH)) {
                   1006:                latch_hardclock=(hardclock0<<8)|hardclock1;
                   1007:                pseudo_counter=latch_hardclock;
                   1008:        }
                   1009:        if ((hardclock_csr&HARDCLOCK_ENABLE) && (latch_hardclock>0)) {
                   1010:                //CycInt_AddRelativeInterrupt(latch_hardclock*33, INT_CPU_CYCLE, INTERRUPT_HARDCLOCK);
                   1011:         set_interrupt(INT_TIMER, SET_INT);
                   1012:        }
                   1013: }
                   1014: void HardclockReadCSR(void) {
                   1015:        IoMem[IoAccessCurrentAddress & 0x1FFFF]=hardclock_csr;
                   1016:        // Log_Printf(LOG_WARN,"[hardclock] read at $%08x val=%02x PC=$%08x", IoAccessCurrentAddress,IoMem[IoAccessCurrentAddress & 0x1FFFF],m68k_getpc());
                   1017:        set_interrupt(INT_TIMER,RELEASE_INT);
                   1018: }
                   1019: 
                   1020: 

unix.superglobalmegacorp.com

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