Thu, 10 Feb 2011 01:09:42 +0000
make it possible to eject the floppy disc (use F11!)
1 #ifndef _STATE_H
2 #define _STATE_H
4 #include <stddef.h>
5 #include <stdint.h>
6 #include <stdbool.h>
7 #include "wd279x.h"
8 #include "keyboard.h"
10 // Maximum size of the Boot PROMs. Must be a binary power of two.
11 #define ROM_SIZE 32768
13 /**
14 * State error codes
15 */
16 typedef enum {
17 STATE_E_OK = 0, ///< Operation succeeded
18 STATE_E_BAD_RAMSIZE = -1, ///< Bad RAM size specified (not a multiple of 512K, or less than 512K)
19 STATE_E_NO_MEMORY = -2, ///< Out of memory while allocating state variables
20 STATE_E_ROM_LOAD_FAIL = -3 ///< Error loading ROMs
21 } STATE_ERR;
23 /**
24 * @brief Emulator state storage
25 *
26 * This structure stores the internal state of the emulator.
27 */
28 typedef struct {
29 // Boot PROM can be up to 32Kbytes total size
30 uint8_t rom[ROM_SIZE]; ///< Boot PROM data buffer
32 //// Main system RAM
33 uint8_t *base_ram; ///< Base RAM data buffer
34 size_t base_ram_size; ///< Size of Base RAM buffer in bytes
35 uint8_t *exp_ram; ///< Expansion RAM data buffer
36 size_t exp_ram_size; ///< Size of Expansion RAM buffer in bytes
38 /// Video RAM
39 uint8_t vram[0x8000];
41 /// Map RAM
42 uint8_t map[0x800];
44 //// Registers
45 uint16_t genstat; ///< General Status Register
46 uint16_t bsr0; ///< Bus Status Register 0
47 uint16_t bsr1; ///< Bus Status Register 1
49 //// MISCELLANEOUS CONTROL REGISTER
50 bool dma_reading; ///< True if Disc DMA reads from the controller, false otherwise
51 uint8_t leds; ///< LED status, 1=on, in order red3/green2/yellow1/red0 from bit3 to bit0
53 //// GENERAL CONTROL REGISTER
54 /// GENCON.ROMLMAP -- false ORs the address with 0x800000, forcing the
55 /// 68010 to access ROM instead of RAM when booting. TRM page 2-36.
56 bool romlmap;
57 /// GENCON.PIE -- Parity Error Check Enable
58 bool pie;
60 /// DMA Address Register
61 uint32_t dma_address;
63 /// DMA count
64 uint32_t dma_count;
66 /// DMA direction
67 bool idmarw;
68 /// DMA enable
69 bool dmaen;
70 bool dmaenb;
72 /// Floppy disc controller context
73 WD2797_CTX fdc_ctx;
74 /// Current disc image file
75 FILE *fdc_disc;
77 /// Keyboard controller context
78 KEYBOARD_STATE kbd;
79 } S_state;
81 // Global emulator state. Yes, I know global variables are evil, please don't
82 // email me and lecture me about it. -philpem
83 #ifndef _STATE_C
84 extern S_state state;
85 #else
86 S_state state;
87 #endif
89 /**
90 * @brief Initialise system state
91 *
92 * @param base_ram_size Base RAM size in bytes -- must be a multiple of 512KiB, min 512KiB, max 2MiB.
93 * @param exp_ram_size Expansion RAM size in bytes -- must be a multiple of 512KiB, min 0, max 2MiB.
94 *
95 * Initialises the emulator's internal state.
96 */
97 int state_init(size_t base_ram_size, size_t exp_ram_size);
99 /**
100 * @brief Deinitialise system state
101 *
102 * Deinitialises the saved state, and frees all memory. Call this function
103 * before exiting your program to avoid memory leaks.
104 */
105 void state_done();
107 #endif