Annotation of generator/src/cpuz80.c, revision 1.1

1.1     ! root        1: /*****************************************************************************/
        !             2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-1998       */
        !             3: /*****************************************************************************/
        !             4: /*                                                                           */
        !             5: /* z80.c                                                                     */
        !             6: /*                                                                           */
        !             7: /*****************************************************************************/
        !             8: 
        !             9: #include <stdlib.h>
        !            10: #include <stdio.h>
        !            11: #include <string.h>
        !            12: 
        !            13: #include "generator.h"
        !            14: #include "cpuz80.h"
        !            15: #include "cpu68k.h"
        !            16: #include "memz80.h"
        !            17: #include "ui.h"
        !            18: 
        !            19: #include "z80/mz80.h"
        !            20: 
        !            21: UINT8 cpuz80_read_actual(UINT32 addr, struct MemoryReadByte *me);
        !            22: void cpuz80_write_actual(UINT32 addr, UINT8 data, struct MemoryWriteByte *me);
        !            23: UINT16 cpuz80_ioread_actual(UINT16 addr, struct z80PortRead *me);
        !            24: void cpuz80_iowrite_actual(UINT16 addr, UINT8 data, struct z80PortWrite *me);
        !            25: 
        !            26: /*** variables externed ***/
        !            27: 
        !            28: uint8 *cpuz80_ram = NULL;
        !            29: uint32 cpuz80_bank = 0;
        !            30: unsigned int cpuz80_active = 0;
        !            31: 
        !            32: /*** global variables ***/
        !            33: 
        !            34: static unsigned int cpuz80_lastsync = 0;
        !            35: static unsigned int cpuz80_resetting = 0;
        !            36: static CONTEXTMZ80 cpuz80_z80;
        !            37: 
        !            38: static struct MemoryReadByte cpuz80_read[] = {
        !            39:   { 0x0000, 0xFFFF, cpuz80_read_actual, NULL },
        !            40:   { -1, -1, NULL, NULL }
        !            41: };
        !            42: 
        !            43: static struct MemoryWriteByte cpuz80_write[] = {
        !            44:   { 0x0000, 0xFFFF, cpuz80_write_actual, NULL },
        !            45:   { -1, -1, NULL, NULL }
        !            46: };
        !            47: 
        !            48: static struct z80PortRead cpuz80_ioread[] = {
        !            49:   { 0x0000, 0x00FF, cpuz80_ioread_actual, NULL },
        !            50:   { -1, -1, NULL, NULL }
        !            51: };
        !            52: 
        !            53: static struct z80PortWrite cpuz80_iowrite[] = {
        !            54:   { 0x0000, 0x00FF, cpuz80_iowrite_actual, NULL },
        !            55:   { -1, -1, NULL, NULL }
        !            56: };
        !            57: 
        !            58: UINT8 cpuz80_read_actual(UINT32 addr, struct MemoryReadByte *me)
        !            59: {
        !            60:   (void)me;
        !            61:   return memz80_fetchbyte((uint32)addr);
        !            62: }
        !            63: 
        !            64: void cpuz80_write_actual(UINT32 addr, UINT8 data, struct MemoryWriteByte *me)
        !            65: {
        !            66:   (void)me;
        !            67:   memz80_storebyte((uint32)addr, (uint8)data);
        !            68: }
        !            69: 
        !            70: UINT16 cpuz80_ioread_actual(UINT16 addr, struct z80PortRead *me)
        !            71: {
        !            72:   (void)me;
        !            73:   return cpuz80_portread((uint16)addr);
        !            74: }
        !            75: 
        !            76: void cpuz80_iowrite_actual(UINT16 addr, UINT8 data, struct z80PortWrite *me)
        !            77: {
        !            78:   (void)me;
        !            79:   cpuz80_portwrite((uint16)addr, (uint8)data);
        !            80: }
        !            81: 
        !            82: /*** cpuz80_init - initialise this sub-unit ***/
        !            83: 
        !            84: int cpuz80_init(void)
        !            85: {
        !            86:   /* mz80init(); */
        !            87:   cpuz80_reset();
        !            88:   return 0;
        !            89: }
        !            90: 
        !            91: /*** cpuz80_reset - reset z80 sub-unit ***/
        !            92: 
        !            93: void cpuz80_reset(void)
        !            94: {
        !            95:   if (!cpuz80_ram) {
        !            96:     if ((cpuz80_ram = malloc(LEN_SRAM)) == NULL) {
        !            97:       fprintf(stderr, "Out of memory\n");
        !            98:       exit(1);
        !            99:     }
        !           100:   }
        !           101:   memset(cpuz80_ram, 0, LEN_SRAM);
        !           102:   cpuz80_resetcpu();
        !           103:   cpuz80_bank = 0;
        !           104:   cpuz80_active = 0;
        !           105:   cpuz80_lastsync = 0;
        !           106:   cpuz80_resetting = 0;
        !           107:   /* mz80GetContext(&cpuz80_z80); */
        !           108:   memset(&cpuz80_z80, 0, sizeof(cpuz80_z80));
        !           109:   cpuz80_z80.z80Base = cpuz80_ram;
        !           110:   cpuz80_z80.z80MemRead = cpuz80_read;
        !           111:   cpuz80_z80.z80MemWrite = cpuz80_write;
        !           112:   cpuz80_z80.z80IoRead = cpuz80_ioread;
        !           113:   cpuz80_z80.z80IoWrite = cpuz80_iowrite;
        !           114:   mz80SetContext(&cpuz80_z80);
        !           115:   mz80reset();
        !           116: }
        !           117: 
        !           118: /*** cpuz80_resetcpu - reset z80 cpu ***/
        !           119: 
        !           120: void cpuz80_resetcpu(void)
        !           121: {
        !           122:   mz80reset();
        !           123:   cpuz80_resetting = 1; /* suspends execution */
        !           124: }
        !           125: 
        !           126: /*** cpuz80_unresetcpu - unreset z80 cpu ***/
        !           127: 
        !           128: void cpuz80_unresetcpu(void)
        !           129: {
        !           130:   cpuz80_resetting = 0; /* un-suspends execution */
        !           131: }
        !           132: 
        !           133: /*** cpuz80_bankwrite - data is being written to latch ***/
        !           134: 
        !           135: void cpuz80_bankwrite(uint8 data)
        !           136: {
        !           137:   cpuz80_bank  = (((cpuz80_bank >> 1) | ((data & 1) <<23)) & 0xff8000);
        !           138:   /*
        !           139:   if (gen_debug)
        !           140:     printf("BANK WRITE: %d --> %08X\n", data, cpuz80_bank);
        !           141:   */
        !           142: }
        !           143: 
        !           144: /*** cpuz80_stop - stop the processor ***/
        !           145: 
        !           146: void cpuz80_stop(void)
        !           147: {
        !           148:   cpuz80_sync();
        !           149:   cpuz80_active = 0;
        !           150: }
        !           151: 
        !           152: /*** cpuz80_start - start the processor ***/
        !           153: 
        !           154: void cpuz80_start(void)
        !           155: {
        !           156:   cpuz80_sync();
        !           157:   cpuz80_active = 1;
        !           158: }
        !           159: 
        !           160: /*** cpuz80_endfield - reset counters ***/
        !           161: 
        !           162: void cpuz80_endfield(void)
        !           163: {
        !           164:   cpuz80_lastsync = 0;
        !           165: }
        !           166: 
        !           167: /*** cpuz80_sync - synchronise ***/
        !           168: 
        !           169: void cpuz80_sync(void)
        !           170: {
        !           171:   int cpu68k_wanted = cpu68k_clocks - cpuz80_lastsync;
        !           172:   int wanted = (cpu68k_wanted<0?0:cpu68k_wanted)*7/16;
        !           173:   int acheived;
        !           174: 
        !           175:   if (cpuz80_active && !cpuz80_resetting) {
        !           176:     /* ui_log(LOG_USER, "executing %d z80 clocks @ %X", wanted,
        !           177:        cpuz80_z80.z80pc); */
        !           178:     mz80exec(wanted);
        !           179:     acheived = mz80GetElapsedTicks(1);
        !           180:     /* this if/else statement below, I'm not entirely sure this is a good
        !           181:        idea, perhaps just doing cpuz80_lastsync = cpu68k_clocks; always is
        !           182:        better? hmm. */
        !           183:     if (acheived > wanted) {
        !           184:       cpuz80_lastsync = cpu68k_clocks;
        !           185:     } else {
        !           186:       cpuz80_lastsync = cpuz80_lastsync + acheived*16/7;
        !           187:     }
        !           188:   } else {
        !           189:     cpuz80_lastsync = cpu68k_clocks;
        !           190:   }
        !           191: }
        !           192: 
        !           193: /*** cpuz80_interrupt - cause an interrupt on the z80 */
        !           194: 
        !           195: void cpuz80_interrupt(void)
        !           196: {
        !           197:   if (!cpuz80_resetting)
        !           198:     mz80int(0);
        !           199: }
        !           200: 
        !           201: /*** cpuz80_portread - port read from z80 */
        !           202: 
        !           203: uint8 cpuz80_portread(uint8 port)
        !           204: {
        !           205:   LOG_VERBOSE(("[Z80] Port read to %X", port));
        !           206:   return 0;
        !           207: }
        !           208: 
        !           209: /*** cpuz80_portwrite - z80 write to port */
        !           210: 
        !           211: void cpuz80_portwrite(uint8 port, uint8 value)
        !           212: {
        !           213:   LOG_VERBOSE(("[Z80] Port write to %X of %X", port, value));
        !           214: }

unix.superglobalmegacorp.com

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