1 #ifndef LCD_H 2 #define LCD_H 3 4 #ifdef __cplusplus 5 extern "C" { 6 #endif 7 8 #include "port.h" 9 #include "spi.h" 10 #include <stdint.h> 11 #include <stdbool.h> 12 #include <stdio.h> 13 14 #define LCD_WIDTH (320) 15 #define LCD_HEIGHT (240) 16 #define LCD_SIZE (LCD_WIDTH * LCD_HEIGHT) 17 #define LCD_BYTE_SIZE (LCD_SIZE * 2) 18 #define LCD_RAM_OFFSET (0x40000) 19 20 enum lcd_comp { 21 LCD_SYNC, 22 LCD_BACK_PORCH, 23 LCD_ACTIVE_VIDEO, 24 LCD_FRONT_PORCH, 25 LCD_LNBU 26 }; 27 28 typedef struct lcd_state { 29 uint32_t timing[4]; 30 31 uint32_t control; /* Control register */ 32 uint32_t imsc; /* Interrupt mask set/clear register */ 33 uint32_t ris; 34 35 uint32_t upbase; /* Upper panel frame base address register */ 36 uint32_t lpbase; /* Lower panel frame base address register */ 37 uint32_t upcurr; /* Upper panel current frame address register */ 38 uint32_t lpcurr; /* Lower panel current frame address register */ 39 40 /* 256x16-bit color palette registers */ 41 /* 256 palette entries organized as 128 locations of two entries per word */ 42 uint16_t palette[0x100]; 43 44 /* Cursor image RAM registers */ 45 /* 256-word wide values defining images overlaid by the hw cursor mechanism */ 46 uint32_t crsrImage[0x100]; 47 uint32_t crsrControl; /* Cursor control register */ 48 uint32_t crsrConfig; /* Cursor configuration register */ 49 uint32_t crsrPalette0; /* Cursor palette registers */ 50 uint32_t crsrPalette1; 51 uint32_t crsrXY; /* Cursor XY position register */ 52 uint32_t crsrClip; /* Cursor clip position register */ 53 uint32_t crsrImsc; /* Cursor interrupt mask set/clear register */ 54 uint32_t crsrIcr; /* Cursor interrupt clear register */ 55 uint32_t crsrRis; /* Cursor raw interrupt status register - const */ 56 57 /* Internal */ 58 bool prefill; 59 uint8_t pos, fifo[256]; 60 uint32_t curCol, curRow; 61 enum lcd_comp compare; 62 uint32_t PPL, HSW, HFP, HBP, LPP, VSW, VFP, VBP, PCD, ACB, CPL, LED, LCDBPP, BPP, PPF; 63 bool CLKSEL, IVS, IHS, IPC, IOE, LEE, BGR, BEBO, BEPO, WTRMRK; 64 uint32_t *data; /* Pointer to start of data to start extracting from */ 65 uint32_t *data_end; /* End pointer that is allowed access */ 66 67 /* Everything after here persists through reset! */ 68 int spi; 69 void (*gui_callback)(void*); 70 void *gui_callback_data; 71 } lcd_state_t; 72 73 extern lcd_state_t lcd; 74 75 void lcd_reset(void); 76 void lcd_free(void); 77 eZ80portrange_t init_lcd(void); 78 bool lcd_restore(FILE *image); 79 bool lcd_save(FILE *image); 80 void lcd_update(void); 81 void lcd_disable(void); 82 83 /* api functions */ 84 void emu_lcd_drawframe(void *output); 85 void emu_set_lcd_callback(void (*callback)(void*), void *data); 86 void emu_set_lcd_spi(int enable); 87 88 /* advanced api functions */ 89 void emu_set_lcd_ptrs(uint32_t **dat, uint32_t **dat_end, int width, int height, uint32_t addr, uint32_t control, bool mask); 90 void emu_lcd_drawmem(void *output, void *data, void *data_end, uint32_t control, int size, int spi); 91 92 #ifdef __cplusplus 93 } 94 #endif 95 96 #endif 97