Annotation of generator/main/cpuz80-mz80.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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