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