Wed, 02 Mar 2011 07:16:32 +0000
Add 60Hz timer tick patch from Andrew Warkentin <andreww591 gmail com>
... I have also attached a patch that adds the 60Hz timer interrupt (I'm not sure if it's totally correct, though, since the cursor blinks rather slowly).
Received-From: Andrew Warkentin <andreww591 gmail com>
Signed-Off-By: Philip Pemberton <philpem@philpem.me.uk>
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 bool timer_enabled;
54 bool timer_asserted;
56 //// GENERAL CONTROL REGISTER
57 /// GENCON.ROMLMAP -- false ORs the address with 0x800000, forcing the
58 /// 68010 to access ROM instead of RAM when booting. TRM page 2-36.
59 bool romlmap;
60 /// GENCON.PIE -- Parity Error Check Enable
61 bool pie;
63 /// DMA Address Register
64 uint32_t dma_address;
66 /// DMA count
67 uint32_t dma_count;
69 /// DMA direction
70 bool idmarw;
71 /// DMA enable
72 bool dmaen;
73 bool dmaenb;
75 /// Floppy disc controller context
76 WD2797_CTX fdc_ctx;
77 /// Current disc image file
78 FILE *fdc_disc;
80 /// Keyboard controller context
81 KEYBOARD_STATE kbd;
82 } S_state;
84 // Global emulator state. Yes, I know global variables are evil, please don't
85 // email me and lecture me about it. -philpem
86 #ifndef _STATE_C
87 extern S_state state;
88 #else
89 S_state state;
90 #endif
92 /**
93 * @brief Initialise system state
94 *
95 * @param base_ram_size Base RAM size in bytes -- must be a multiple of 512KiB, min 512KiB, max 2MiB.
96 * @param exp_ram_size Expansion RAM size in bytes -- must be a multiple of 512KiB, min 0, max 2MiB.
97 *
98 * Initialises the emulator's internal state.
99 */
100 int state_init(size_t base_ram_size, size_t exp_ram_size);
102 /**
103 * @brief Deinitialise system state
104 *
105 * Deinitialises the saved state, and frees all memory. Call this function
106 * before exiting your program to avoid memory leaks.
107 */
108 void state_done();
110 #endif