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