123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652 |
- // Displaying routines
- void *Port=0;
- int ycur=0;
- #ifdef FORCE_SMALL_FONT
- #define char_width 4
- #define virtual_char_width 1
- #define char_height 6
- #define physical_to_virtual(px) ((px)>>2)
- #define virtual_to_physical(vx) ((vx)<<2)
- typedef char CHAR[char_height];
- #else
- int small_font = -1;
- int char_width = 0;
- int virtual_char_width = 0;
- int char_height = 0;
- enum { FONT_MEDIUM = 0, FONT_SMALL = 1 };
- void set_font(int font) {
- small_font = font;
- char_width = font==FONT_MEDIUM ? 6 : 4;
- virtual_char_width = font==FONT_MEDIUM ? 6 : 1;
- char_height = font==FONT_MEDIUM ? 8 : 6;
- }
- int physical_to_virtual(int px) {
- if (small_font)
- return px>>2;
- return px;
- }
- int virtual_to_physical(int vx) {
- if (small_font)
- return vx<<2;
- return vx;
- }
- #endif
- #ifdef __GTC__
- void SmallDChar(int x,int y,char c) __attribute__((__regparm__(3,0)));
- void SmallDCharS(int x,int y,char c) __attribute__((__regparm__(3,0)));
- void SmallDCharX(int x,int y,char c) __attribute__((__regparm__(3,0)));
- #define xregparm(g,d,a) __attribute__((regparm(d,a)))
- #else
- void __attribute__((__regparm__(3))) SmallDChar(int x,int y,char c);
- void __attribute__((__regparm__(3))) SmallDCharS(int x,int y,char c);
- void __attribute__((__regparm__(3))) SmallDCharX(int x,int y,char c);
- #define xregparm(g,d,a) __attribute__((regparm(g)))
- #endif
- #ifdef __GTC__
- #define SECTION_FONT
- asm {
- even
- SmallDCharX:
- and.w #0xFF,d2
- add.w d2,d2
- move.w d2,a1
- add.w d2,d2
- add.w a1,d2
- lea font(pc),a1
- add.w d2,a1
- add.w d1,d1
- move.w d1,d2
- lsl.w #4,d1
- sub.w d2,d1
- moveq #0x0000000F,d2
- asr.w #1,d0
- bcs.s \X_ok_d2
- moveq #0xFFFFFFF0,d2
- \X_ok_d2:
- move.l Port,a0
- add.w d1,d0
- add.w d0,a0
- move.b (a1)+,d0
- and.b d2,d0
- eor.b d0,(a0)
- move.b (a1)+,d0
- and.b d2,d0
- eor.b d0,30(a0)
- move.b (a1)+,d0
- and.b d2,d0
- eor.b d0,60(a0)
- move.b (a1)+,d0
- and.b d2,d0
- eor.b d0,90(a0)
- move.b (a1)+,d0
- and.b d2,d0
- eor.b d0,120(a0)
- move.b (a1),d0
- and.b d2,d0
- eor.b d0,150(a0)
- rts
- even
- SmallDCharS:
- move.l Port,a0
- and.w #0xFF,d2
- add.w d2,d2
- move.w d2,a1
- add.w d2,d2
- add.w a1,d2
- lea font(pc),a1
- add.w d2,a1
- add.w d1,d1
- move.w d1,d2
- lsl.w #4,d1
- sub.w d2,d1
- moveq #0x0000000F,d2
- asr.w #1,d0
- bcs.s \S_ok_d2
- moveq #0xFFFFFFF0,d2
- \S_ok_d2:
- add.w d1,d0
- add.w d0,a0
- move.b (a1)+,d0
- not.b d0
- and.b d2,d0
- or.b d0,(a0)
- move.b (a1)+,d0
- not.b d0
- and.b d2,d0
- or.b d0,30(a0)
- move.b (a1)+,d0
- not.b d0
- and.b d2,d0
- or.b d0,60(a0)
- move.b (a1)+,d0
- not.b d0
- and.b d2,d0
- or.b d0,90(a0)
- move.b (a1)+,d0
- not.b d0
- and.b d2,d0
- or.b d0,120(a0)
- move.b (a1),d0
- not.b d0
- and.b d2,d0
- or.b d0,150(a0)
- rts
- even
- SmallDChar:
- and.w #0xFF,d2
- add.w d2,d2
- move.w d2,a1
- add.w d2,d2
- add.w a1,d2
- lea font(pc),a1
- add.w d2,a1
- add.w d1,d1
- move.w d1,d2
- lsl.w #4,d1
- sub.w d2,d1
- moveq #0x0000000F,d2
- asr.w #1,d0
- bcs.s \ok_d2
- moveq #0xFFFFFFF0,d2
- \ok_d2:
- move.l Port,a0
- add.w d1,d0
- add.w d0,a0
- move.b (a1)+,d0
- and.b d2,d0
- or.b d0,(a0)
- move.b (a1)+,d0
- and.b d2,d0
- or.b d0,30(a0)
- move.b (a1)+,d0
- and.b d2,d0
- or.b d0,60(a0)
- move.b (a1)+,d0
- and.b d2,d0
- or.b d0,90(a0)
- move.b (a1)+,d0
- and.b d2,d0
- or.b d0,120(a0)
- move.b (a1),d0
- and.b d2,d0
- or.b d0,150(a0)
- rts
- }
- #else
- #define ASM_SECTION_FONT //".section fontmanip"
- #define SECTION_FONT //__attribute__((section("fontmanip")))
- asm(ASM_SECTION_FONT "
- .even
- .globl SmallDCharX
- SmallDCharX:
- and.w #0xFF,%d2
- add.w %d2,%d2
- move.w %d2,%a1
- add.w %d2,%d2
- add.w #262,%d2 /* to be able to use PC-relative font */
- add.w %a1,%d2
- lea font-262(%pc,%d2.w),%a1 /* this offset should be 2 (0 doesn't seem to work) */
- add.w %d1,%d1
- move.w %d1,%d2
- lsl.w #4,%d1
- sub.w %d2,%d1
- moveq #0x0000000F,%d2
- asr.w #1,%d0
- bcs.s DChX_ok_d2
- moveq #0xFFFFFFF0,%d2
- DChX_ok_d2:
- move.l Port,%a0
- add.w %d1,%d0
- add.w %d0,%a0
- move.b (%a1)+,%d0
- and.b %d2,%d0
- eor.b %d0,(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- eor.b %d0,30(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- eor.b %d0,60(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- eor.b %d0,90(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- eor.b %d0,120(%a0)
- move.b (%a1),%d0
- and.b %d2,%d0
- eor.b %d0,150(%a0)
- rts
- .even
- .globl SmallDCharS
- SmallDCharS:
- move.l Port,%a0
- and.w #0xFF,%d2
- addq.w #8,%d2 /* to be able to use PC-relative font */
- add.w %d2,%d2
- move.w %d2,%a1
- add.w %d2,%d2
- add.w %a1,%d2
- lea font-48(%pc,%d2.w),%a1
- add.w %d1,%d1
- move.w %d1,%d2
- lsl.w #4,%d1
- sub.w %d2,%d1
- moveq #0x0000000F,%d2
- asr.w #1,%d0
- bcs.s DChS_ok_d2
- moveq #0xFFFFFFF0,%d2
- DChS_ok_d2:
- add.w %d1,%d0
- add.w %d0,%a0
- move.b (%a1)+,%d0
- not.b %d0
- and.b %d2,%d0
- or.b %d0,(%a0)
- move.b (%a1)+,%d0
- not.b %d0
- and.b %d2,%d0
- or.b %d0,30(%a0)
- move.b (%a1)+,%d0
- not.b %d0
- and.b %d2,%d0
- or.b %d0,60(%a0)
- move.b (%a1)+,%d0
- not.b %d0
- and.b %d2,%d0
- or.b %d0,90(%a0)
- move.b (%a1)+,%d0
- not.b %d0
- and.b %d2,%d0
- or.b %d0,120(%a0)
- move.b (%a1),%d0
- not.b %d0
- and.b %d2,%d0
- or.b %d0,150(%a0)
- rts
- .even
- .globl SmallDChar
- SmallDChar:
- and.w #0xFF,%d2
- add.w %d2,%d2
- move.w %d2,%a1
- add.w %d2,%d2
- add.w %a1,%d2
- lea font(%pc,%d2.w),%a1
- add.w %d1,%d1
- move.w %d1,%d2
- lsl.w #4,%d1
- sub.w %d2,%d1
- moveq #0x0000000F,%d2
- asr.w #1,%d0
- bcs.s DCh_ok_d2
- moveq #0xFFFFFFF0,%d2
- DCh_ok_d2:
- move.l Port,%a0
- add.w %d1,%d0
- add.w %d0,%a0
- move.b (%a1)+,%d0
- and.b %d2,%d0
- or.b %d0,(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- or.b %d0,30(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- or.b %d0,60(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- or.b %d0,90(%a0)
- move.b (%a1)+,%d0
- and.b %d2,%d0
- or.b %d0,120(%a0)
- move.b (%a1),%d0
- and.b %d2,%d0
- or.b %d0,150(%a0)
- rts
- ");
- #endif
- const unsigned short SECTION_FONT font[]={
- #include "font.h"
- };
- #define DOTS "\xA0\x01"
- #define DOTS1 '\xA0'
- #define DOTS2 '\x01'
- #define UPARR '\x13'
- #define DNARR '\x14'
- char icons[]={
- 0b11111100,
- 0b11111100,
- 0b11000100,
- 0b10110100,
- 0b10110100,
- 0b11000100,
- 0b11111100,
- 0b11111100,
- 0b11001100,
- 0b10110100,
- 0b10000100,
- 0b10110100,
- 0b10110100,
- 0b11111100,
- 0b00000000,
- 0b00000000,
- 0b00111000,
- 0b01001000,
- 0b01001000,
- 0b00111000,
- 0b00000000,
- #ifdef _89
- 0b00000000,
- 0b00100000,
- 0b01110000,
- 0b11111000,
- 0b01110000,
- 0b00100000,
- 0b00000000,
- 0b00000000,
- 0b00100000,
- 0b01110000,
- 0b11111000,
- 0b01110000,
- 0b01110000,
- 0b00000000,
- #else
- 0b00000000,
- 0b00100000,
- 0b01110000,
- 0b11111000,
- 0b01110000,
- 0b01110000,
- 0b00000000,
- 0b00000000,
- 0b00100000,
- 0b01110000,
- 0b11111000,
- 0b01110000,
- 0b00100000,
- 0b00000000,
- #endif
- 0b00000000,
- 0b00110000,
- 0b01001000,
- 0b00010000,
- 0b00100000,
- 0b01111000,
- 0b00000000,
- };
- /*void __attribute__((__regparm__(3))) SmallDChar(int x,int y,char c) {
- char *p=((CHAR *)font)[c&255],*s=Port+(x>>1)+y*30;
- int m;
- if (x&1) m=0x0F;
- else m=0xF0;
- s[30*0]|=(*p++)&m;
- s[30*1]|=(*p++)&m;
- s[30*2]|=(*p++)&m;
- s[30*3]|=(*p++)&m;
- s[30*4]|=(*p++)&m;
- s[30*5]|=(*p++)&m;
- }
- void __attribute__((__regparm__(3))) SmallDCharS(int x,int y,char c) {
- char *p=((CHAR *)font)[c&255],*s=Port+(x>>1)+y*30;
- int m;
- if (x&1) m=0x0F;
- else m=0xF0;
- s[30*0]|=(~*p++)&m;
- s[30*1]|=(~*p++)&m;
- s[30*2]|=(~*p++)&m;
- s[30*3]|=(~*p++)&m;
- s[30*4]|=(~*p++)&m;
- s[30*5]|=(~*p++)&m;
- }
- */
- void xregparm(2,2,1) SmallDStr(int x,int y,char *s) {
- while (*s)
- SmallDChar(x,y,*s++),x++;
- }
- void xregparm(3,3,1) SmallDStrS(int x,int y,char *s,int w) {
- SmallDChar(x-1,y,0);
- while (*s)
- SmallDCharS(x,y,*s++),x++,w--;
- while (--w>0)
- SmallDCharS(x,y,' '),x++;
- }
- void xregparm(3,3,1) SmallDStrC(int x,int y,char *s,int w) {
- while (*s) {
- if (--w<0) return;
- SmallDChar(x,y,*s++),x++;
- }
- while (--w>0)
- SmallDChar(x,y,' '),x++;
- }
- void xregparm(3,3,1) SmallDStrCS(int x,int y,char *s,int w) {
- SmallDChar(x-1,y,0);
- while (*s) {
- if (--w<0) return;
- SmallDCharS(x,y,*s++),x++;
- }
- while (--w>0)
- SmallDCharS(x,y,' '),x++;
- }
- #ifdef FORCE_SMALL_FONT
- #define VariableDStr SmallDStr
- #define VariableDStrS SmallDStrS
- #define VariableDStrC SmallDStrC
- #define VariableDStrCS SmallDStrCS
- #define VariableDChar SmallDChar
- #define VariableDCharS SmallDCharS
- #define DChar SmallDChar
- #define DCharS SmallDCharS
- #define DCharX SmallDCharX
- #define DStr SmallDStr
- #define DStrS SmallDStrS
- #else
- void xregparm(2,2,1) MediumDStr(int x,int y,char *s) {
- while (*s)
- MediumDChar(x,y,*s++),x++;
- }
- void xregparm(3,3,1) MediumDStrS(int x,int y,char *s,int w) {
- MediumDChar(x-1,y,0);
- while (*s)
- MediumDCharS(x,y,*s++),x++,w--;
- while (--w>0)
- MediumDCharS(x,y,' '),x++;
- }
- void xregparm(3,3,1) MediumDStrC(int x,int y,char *s,int w) {
- while (*s) {
- if (--w<0) return;
- MediumDChar(x,y,*s++),x++;
- }
- while (--w>0)
- MediumDChar(x,y,' '),x++;
- }
- void xregparm(3,3,1) MediumDStrCS(int x,int y,char *s,int w) {
- MediumDChar(x-1,y,0);
- while (*s) {
- if (--w<0) return;
- MediumDCharS(x,y,*s++),x++;
- }
- while (--w>0)
- MediumDCharS(x,y,' '),x++;
- }
- void xregparm(2,2,1) VariableDStr(int x,int y,char *s) {
- if (small_font)
- SmallDStr(x,y,s);
- MediumDStr(x,y,s);
- }
- void xregparm(3,3,1) VariableDStrS(int x,int y,char *s,int w) {
- if (small_font)
- SmallDStrS(x,y,s,w);
- MediumDStrS(x,y,s,w);
- }
- void xregparm(3,3,1) VariableDStrC(int x,int y,char *s,int w) {
- if (small_font)
- SmallDStrC(x,y,s,w);
- MediumDStrC(x,y,s,w);
- }
- void xregparm(3,3,1) VariableDStrCS(int x,int y,char *s,int w) {
- if (small_font)
- SmallDStrCS(x,y,s,w);
- MediumDStrCS(x,y,s,w);
- }
- #endif
- void ScrRectFill2(SCR_RECT *scr,int attr) {
- int y=scr->xy.y0,n=scr->xy.y1-y;
- int x0=scr->xy.x0,x1=scr->xy.x1;
- do {
- FastDrawHLine(Port,x0,x1,y,attr); y++;
- } while (n--);
- }
- void DrawFrame(int x0,int y0,int x1,int y1) {
- FastDrawHLine(Port,x0+1,x1-1,y0,A_NORMAL);
- FastDrawHLine(Port,x0+1,x1-1,y1,A_NORMAL);
- FastDrawLine(Port,x0,y0+1,x0,y1-1,A_NORMAL);
- FastDrawLine(Port,x1,y0+1,x1,y1-1,A_NORMAL);
- }
- #define B_MOVEAROUND 0
- #define B_CENTER 0x8000
- int disp_box(int x1,int x2,int height,int attr,WIN_RECT *win) {
- WIN_RECT wbox; SCR_RECT box;
- if (attr&B_ROUNDED) height+=2;
- wbox.x0=virtual_to_physical(x1)-3; wbox.x1=virtual_to_physical(x2)+1;
- if (ycur+6+height+4>=_89_92(100-8,128-8) || (attr&B_CENTER) || ycur>=_89_92((100-8)/2,(128-8)/2)) {
- wbox.y0=ycur-height-4, wbox.y1=ycur-1;
- if (wbox.y0<0 || (attr&B_CENTER))
- wbox.y0=_89_92((100-8)/2-2,(128-8)/2-2)-height/2,wbox.y1=wbox.y0+height+3;
- } else
- wbox.y0=ycur+6, wbox.y1=ycur+5+height+4;
- box.xy.x0=wbox.x0;
- box.xy.x1=wbox.x1;
- box.xy.y0=wbox.y0;
- box.xy.y1=wbox.y1;
- ScrRectFill2(&box,A_REVERSE);
- DrawClipRect(&wbox,ScrRect,A_NORMAL|attr);
- if (win) *win=wbox;
- return box.xy.y0+2;
- }
- void dialog(char *title,int width,int height,int attr,WIN_RECT *w) {
- WIN_RECT win;
- int h=height,x0=(X-width)/2,x1=x0+width,y0;
- if (title) h+=8;
- x0 = physical_to_virtual(x0);
- x1 = physical_to_virtual(x1-1)+1;
- y0 = disp_box(x0,x1,h,attr,&win);
- x0 = virtual_to_physical(x0);
- x1 = virtual_to_physical(x1);
- if (title) {
- SmallDStr((X/4)/2-strlen(title)/2,y0,title);
- FastDrawHLine(Port,x0-2,x1,y0+6,A_NORMAL);
- y0+=8;
- }
- if (w) w->x0=x0,w->x1=x1,w->y0=y0,w->y1=y0+height; /* I doubt that w->y1 will ever be used, but... */
- }
- enum {
- W_NORMAL=0,
- W_NOKEY=0x10,
- W_ALLOW_F1=0x10<<1, W_ALLOW_F2=0x10<<2, W_ALLOW_F3=0x10<<3, W_ALLOW_F4=0x10<<4, W_ALLOW_F5=0x10<<5,
- };
- int SimpleDlg(char *title,char *text,int attr,int wattr);
- #define SDLG_BUF_SIZE 128
- extern char text_find[SDLG_BUF_SIZE],text_repl[SDLG_BUF_SIZE];
- extern int search_attr;
- int SearchDlg(int rep);
- int DoSearch();
- void FindDlg() {
- /* while (!kbhit())
- dialog("Find text",100,40,B_ROUNDED,NULL), LCD_restore(Port);
- ngetchx();*/
- SearchDlg(1);
- }
- LCD_BUFFER *scr_stk[8],**scr_sptr=0;
- #define NOT_MEMORY 2
- void PushScr() {
- LCD_BUFFER *p=malloc(LCD_SIZE);
- *scr_sptr++=p;
- if (p) memcpy(p,Port,LCD_SIZE);
- }
- void PopScr() {
- LCD_BUFFER *p=*--scr_sptr;
- if (p) {
- memcpy(Port,p,LCD_SIZE);
- free(p);
- }
- }
- /*void TestDisp() {
- void *PortSave=Port;
- Port=LCD_MEM;
- while (!kbhit()) {
- int c='a';
- memset(Port,0,30*92);
- while (c<='z') {
- int y=90;
- do {
- int x=40;
- while (x--) DChar(x,y,c);
- } while ((y-=6)>=0);
- c++;
- }
- }
- Port=PortSave;
- }*/
- #ifdef _89
- long MenuBar[5*8]={
- 0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFE,
- 0x80000000,0x80000000,0x80000000,0x80000000,0x80000001,
- 0x90000000,0xB0000000,0xB0000000,0xA0000000,0xB8000001,
- 0xB0000000,0x88000000,0x88000000,0xA8000000,0xA0000001,
- 0x90000000,0x90000000,0x90000000,0xB8000000,0xB0000001,
- 0x90000000,0xA0000000,0x88000000,0x88000000,0x88000001,
- 0xB8000000,0xB8000000,0xB0000000,0x88000000,0xB0000001,
- 0x80000000,0x80000000,0x80000000,0x80000000,0x80000001,
- };
- #define NMENU 5
- #else
- long MenuBar[8*8]={
- 0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFE,0,
- 0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000001,0,
- 0x90000000,0xB0000000,0xB0000000,0xB0000000,0xB0000000,0xA0000000,0xB8000001,0,
- 0xB0000000,0x88000000,0x88000000,0x88000000,0x88000000,0xA8000000,0xA0000001,0,
- 0x90000000,0x90000000,0x90000000,0x90000000,0x90000000,0xB8000000,0xB0000001,0,
- 0x90000000,0xA0000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000001,0,
- 0xB8000000,0xB8000000,0xB0000000,0xB0000000,0xB0000000,0x88000000,0xB0000001,0,
- 0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000000,0x80000001,0,
- };
- //#error Adapt 'MenuBar' to the 92+
- #define NMENU 7
- #endif
- void PutLine(void *src,int y) {
- memcpy(Port+30*y,src,30);
- }
- char **MenuContents=0;
- void DrawMenuBar() {
- void *p=MenuBar;
- int y;
- for (y=Y-8;y<Y;y++)
- PutLine(p,y),p+=q89(20,32);
- int i,skip=0;
- char **q=MenuContents;
- for (i=0;i<5;i++)
- if (!*q) {
- for (y=Y-8;y<Y;y++) ((long *)(Port+30*y))[i]=(skip || y==Y-8)?0:0x80000000;
- skip=1; q++;
- } else {
- SmallDStrC((i<<3)+2,Y-6,*q++,8-2/* ==6... */);
- skip=0;
- }
- }
|