- reorganized project directory structure
[z80comp2] / emu / src / emu.c
1 #include <stdlib.h>
2 #include "emu.h"
3 #include "cpu.h"
4 #include "duart.h"
5
6 #define RAM_SIZE        0x8000
7 static uint8_t ram[RAM_SIZE];
8 static uint8_t *rom;
9 static int rom_size;
10
11 int emu_init(void *romimg, int romsz)
12 {
13         rom = romimg;
14         rom_size = romsz;
15
16         emu_reset();
17         return 0;
18 }
19
20 void emu_reset(void)
21 {
22         cpu_reset();
23         duart_reset();
24 }
25
26 void emu_cleanup(void)
27 {
28 }
29
30 void emu_step(void)
31 {
32         cpu_step();
33 }
34
35 uint8_t emu_mem_read(uint16_t addr)
36 {
37         if(addr & 0x8000) {     /* RAM */
38                 return ram[addr & 0x7fff];
39         } else { /* ROM */
40                 if((int)addr < rom_size) {
41                         return rom[addr];
42                 }
43         }
44         return 0;
45 }
46
47 void emu_mem_write(uint16_t addr, uint8_t data)
48 {
49         if(addr & 0x8000) {
50                 ram[addr & 0x7fff] = data;
51         }
52 }
53
54 uint8_t emu_io_read(uint16_t addr)
55 {
56         if((addr & 0xf0) == 0) {
57                 return duart_read(addr & 0xf);
58         }
59
60         /* nothing is enabled, the bus floats, return random bits */
61         return rand();
62 }
63
64 void emu_io_write(uint16_t addr, uint8_t data)
65 {
66         if((addr & 0xf0) == 0) {
67                 duart_write(addr & 0xf, data);
68         }
69 }
70
71 void emu_serin(int port, int c)
72 {
73         duart_serin(port, c);
74 }