Ciekawy pomysł, aż zacząłem go realizować
PrAli - jaki to ma kontroler? Może masz namiar na pdf?
Mój projekt jest skierowany dla platformy Windows XP, gdzie dostęp do portów jest domyślnie zabroniony (głównie o to chodzi), co daje możliwość przechwycenia rozkazów:
zastępując je własnym kodem, przeźroczyście dla programu który operuje na portach.
Założyłem że kontrolerem jest
HD61202U, port 888 reprezentuje dane, a port 889 linie DI, RW, E, CS1, CS2, CS3, RESET, ADC.
Jestem już w połowie, część odpowiadająca za komunikację wirtualnego kontrolera z portem LPT jest gotowa (flagi BUSY i RESET nie są obsługiwane).
Pozostało wybranie formatu w jakim wirtualny wyświetlacz ma reprezentować siebie - może to być np. automatyczne rysowanie do HDC z zadaną częstotliwością, lub jako uchwyt bitmapy DIB.
Obsługa:
Wystarczą dwie funkcje: CreateLCD i DeleteLCD. CreateLCD automatycznie przekieruje instrukcje in/out dla portów 888 i 889 na własny kod. CreateLCD posłuży też do wstępnej konfiguracji:
- numery portów (domyślnie 888, 889)
- przesłanie HDC, pozycji i rozmiaru gdzie rysować wyświetlacz, lub pobranie adresu bajtów matrycy/bitmapy.
DeleteLCD zwolni pamięć i przywróci instrukcje in/out do stanu sprzed użycia ostatniego CreateLCD.
Napisz co o tym sądzisz, może masz jakiś pomysł na graficzną reprezentację danych?
// EDIT
Aktualna wersja demo wyświetla się na desktopie. Poniższy kod jest tymczasowo wbudowany w kontroler:
int main()
{
HD61202U *lcd = CreateLCD();
// HDC i pozycja
lcd->m_drawdata.dc = GetDC(0);
lcd->m_drawdata.ptPos.x = 160;
lcd->m_drawdata.ptPos.y = 160;
// kolory
lcd->m_drawdata.bkColor = 0x0061AE48; // kolor tła
lcd->m_drawdata.crColorOn = 0x00054313; // kolor aktywnego pixela
lcd->m_drawdata.crColorOff = 0x0061AE48; // kolor nieaktywnego pixela
// rozmiary
lcd->m_drawdata.pixelSize = 2; // rozmiar pixela
lcd->m_drawdata.pixelSpace = 1; // odstęp pomiędzy pixelami
lcd->m_drawdata.margin = 1; // margines dla tła
// porty
lcd->m_lptDataPort = 888;
lcd->m_lptSignalPort = 889; // DI RW E RESET ADC CS1 CS2 CS3
// włącz lcd
outp(888, BUS_LCDCONOF | 1); outp(889, BUS_E); outp(889, 0);
// ustaw obie linie na zerowe
outp(888, BUS_ISETPAGE|0); outp(889, BUS_E); outp(889, 0);
outp(888, BUS_ISETLINE|0); outp(889, BUS_E); outp(889, 0);
// wyślij znak A podobny do spectrumowego
outp(888, 126); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
outp(888, 9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
outp(888, 9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
outp(888, 9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
outp(888, 9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
outp(888, 9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
outp(888, 126); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
Sleep(10000);
ReleaseDC(0, lcd->m_drawdata.dc);
DeleteLDC(lcd);
return 0;
}
Docelowo planuję umieścić kontroler w dll, a do funkcji CreateLCD dodać wskaźnik na strukturę z parametry inicjującymi, które w pozyższym kodzie są ustawiane poprzez lcd->x = y;
Jak widać, można ustawić rozmiar pixeli i odstęp pomiędzy nimi, kolor tla i (nie)aktywnego pixela.