Sat, 17 Nov 2012 19:18:29 +0000
add HDD support + fixes
Patch-Author: Andrew Warkentin <andreww591!gmail>
Patch-Message-ID: <50A772FC.8020009@gmail.com>
I have added floppy write support, full hard disk emulation, and proper handling of DMA page faults to FreeBee. I also fixed the floppy step commands, changed the "force interrupt" floppy command to generate a type 1 status, and changed the DMA address counter to reset to 3fff when a transfer completes (which is what Unix seems to expect - without it, the kernel says that the floppy isn't ready). The floppy, hard disk, and DMA page fault tests all pass. Initializing hard disks and floppies also works (the geometry for both is still fixed by the size of the image, though, and format commands only appear to succeed, but they don't modify the image). Unix still doesn't run, though (it hangs after reading some sectors from the floppy).
philpem@86 | 1 | #ifndef _KEYBOARD_H |
philpem@86 | 2 | #define _KEYBOARD_H |
philpem@86 | 3 | |
philpem@80 | 4 | #include "SDL.h" |
philpem@86 | 5 | |
philpem@80 | 6 | /// Keyboard buffer size in bytes |
philpem@80 | 7 | #define KEYBOARD_BUFFER_SIZE 256 |
philpem@80 | 8 | |
philpem@86 | 9 | typedef struct { |
philpem@80 | 10 | /// Key states |
philpem@80 | 11 | int keystate[0x80]; |
philpem@80 | 12 | |
philpem@80 | 13 | /// Keyboard buffer |
philpem@90 | 14 | uint8_t buffer[KEYBOARD_BUFFER_SIZE]; |
philpem@80 | 15 | |
philpem@80 | 16 | /// Read pointer |
philpem@80 | 17 | size_t readp; |
philpem@80 | 18 | |
philpem@80 | 19 | /// Write pointer |
philpem@80 | 20 | size_t writep; |
philpem@80 | 21 | |
philpem@80 | 22 | /// Number of bytes in keyboard buffer |
philpem@80 | 23 | size_t buflen; |
philpem@80 | 24 | |
philpem@80 | 25 | /// Transmit Interrupt Enable |
philpem@80 | 26 | bool txie; |
philpem@90 | 27 | |
philpem@80 | 28 | /// Receive Interrupt Enable |
philpem@80 | 29 | bool rxie; |
philpem@91 | 30 | |
philpem@91 | 31 | /// "Keyboard State Changed" flag |
philpem@91 | 32 | bool update_flag; |
philpem@86 | 33 | } KEYBOARD_STATE; |
philpem@86 | 34 | |
philpem@86 | 35 | /** |
philpem@80 | 36 | * Initialise a keyboard state block. |
philpem@86 | 37 | * |
philpem@80 | 38 | * Call this once when the keyboard is added to the emulation. |
philpem@86 | 39 | */ |
philpem@80 | 40 | void keyboard_init(KEYBOARD_STATE *ks); |
philpem@86 | 41 | |
philpem@86 | 42 | /** |
philpem@80 | 43 | * SDL_Event delegation routine. |
philpem@86 | 44 | * |
philpem@80 | 45 | * Call this when an SDL keyup or keydown event is received. |
philpem@86 | 46 | */ |
philpem@80 | 47 | void keyboard_event(KEYBOARD_STATE *ks, SDL_Event *ev); |
philpem@80 | 48 | |
philpem@80 | 49 | /** |
philpem@80 | 50 | * Keyboard scan routine. |
philpem@80 | 51 | * |
philpem@80 | 52 | * Call this periodically to scan the keyboard. 60 times/sec should be fine. |
philpem@80 | 53 | */ |
philpem@80 | 54 | void keyboard_scan(KEYBOARD_STATE *ks); |
philpem@80 | 55 | |
philpem@80 | 56 | bool keyboard_get_irq(KEYBOARD_STATE *ks); |
philpem@80 | 57 | uint8_t keyboard_read(KEYBOARD_STATE *ks, uint8_t addr); |
philpem@80 | 58 | void keyboard_write(KEYBOARD_STATE *ks, uint8_t addr, uint8_t val); |
philpem@86 | 59 | |
philpem@86 | 60 | #endif |