''LCARS tryout in XGA * 'Trying to emulate look of this page: http://www.lcarscom.net/databank.htm 'Copyright 2008 Raymond Allen {{ --------------------------------------------------------------------------------------------------------- Hive-Computer-Projekt Name : StarTracker Chip : Bellatrix-Code (soundplayer) Version : 0.1 Dateien : stint.spin Beschreibung : Grafiktreiber für StarTracker Eigenschaften : Logbuch : Kommandoliste: 0 1 Tastaturstatus abfragen 0 2 Tastaturzeichen holen 0 3 n Screensteuerzeichen 0 3 0 CLS 0 3 1 Home 0 3 2 Backspace 0 3 3 TAB 0 3 4 n SETCUR Cursorzeichen auf n setzen 0 3 5 POS1 0 3 6 x SETX 0 3 7 y SETY 0 3 8 (x) GETX 0 3 9 (y) GETY 0 3 10 c SETCOL 0 3 11 n SLINE 0 3 13 SCREENINIT 0 3 14 CURON 0 3 15 CUROFF 0 99 Reboot und neuen Treiber laden 0 100 testfunktion 1..255 Zeichenausgabe --------------------------------------------------------------------------------------------------------- }} CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 'number of custom 16x16 characters nuchars = (6*3+1*7+47+23*2+20*5) '!!!!! you must have the correct # here for alignment later 'signaldefinitionen regnatix #0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus #8, BEL_VGABASE 'vga-signale (8pin) #16, BEL_KEYBC,BEL_KEYBD 'keyboard-signale #18, BEL_MOUSEC,BEL_MOUSED 'maus-signale #20, BEL_VIDBASE 'video-signale(3pin) #23, BEL_SELECT 'belatrix-auswahlsignal #24, HBEAT 'front-led BUSCLK 'bustakt BUS_WR '/wr - schreibsignal BUS_HS ' '/hs - quittungssignal COLS = 64 ROWS = 48 TILES = cols * rows TAB1 = 16 TAB2 = 32 TAB3 = 48 SPACETILE = $8000 + $20 << 6 VGA_BASPORT = 8 'vga startport VGA_RESX = COLS * 16 'vga anzahl pixel x VGA_RESY = ROWS * 16 'vga anzahl pixel y KEYB_DPORT = BEL_KEYBD 'tastatur datenport KEYB_CPORT = BEL_KEYBC 'tastatur taktport MOUSE_DPORT = BEL_MOUSED MOUSE_CPORT = BEL_MOUSEC CURSORCHAR = $0E 'cursorzeichen DB_WAIT = %00000001_00000000_00000000_00000000 'dira-wert f?r wait-status am bus DB_IN = %00001001_00000000_00000000_00000000 'dira-wert f?r datenbuseingabe DB_OUT = %00001001_00000000_00000000_11111111 'dira-wert f?r datenbusausgabe CNT_HBEAT = 5_000_0000 'blinkgeschw. front-led VAR 'variables for display long col, row, color, flag long array[tiles/2] long stackhb[9] 'stack f?r hbeat-cog byte cursor 'cursorzeichen byte curstat 'cursorstatus 1 = ein byte sline 'startzeile des scrollfensters byte eline 'endzeile des scrollfensters 'for custom characters word user_charbase 'for drawing buttons word ptr byte boxcolor byte sBuffer[32] 'stingpuffer OBJ vga : "stvga" keyb : "stkeyb" PUB main | zeichen {{interpreter f?r hostdialog}} init_subsysteme 'bus/vga/keyboard/maus initialisieren repeat zeichen := bus_getchar '1. zeichen empfangen if zeichen > 0 print_char(zeichen) else zeichen := bus_getchar '2. zeichen kommando empfange case zeichen 1: bus_putchar(keyb.gotkey) '1: Tastaturstatus senden 2: bus_putchar(keyb.key) '2: Tastaturzeichen senden 3: zeichen := bus_getchar '3: Sonderzeichen von $100 bis $1FF ausgeben print_char(zeichen + $100) 10: cmd_bitmap1 11: cmd_fillbox 12: cmd_drawtxt 99: reboot '99: bellatrix neu starten 100: gfx1 PUB gfx1 PUB cmd_bitmap1 | nBitmap,pBitmap,xPos,yPos,xSize,ySize,clr 'Bitmap1Bit(@endcap_med_left,1,1,1,2,1) 'Bitmap1Bit(pBitmap, xPos, yPos, xSize, ySize, clr) nBitmap := bus_getchar xPos := bus_getchar yPos := bus_getchar xSize := bus_getchar ySize := bus_getchar clr := bus_getchar case nBitmap 0: pBitmap := @title 1: pBitmap := @footer 2: pBitmap := @button1 3: pBitmap := @button2 4: pBitmap := @button3 5: pBitmap := @button4 6: pBitmap := @button5 7: pBitmap := @button6 8: pBitmap := @button7 9: pBitmap := @button8 10: pBitmap := @button9 11: pBitmap := @corner_topleft 12: pBitmap := @corner_topright 13: pBitmap := @corner_bottomLeft 14: pBitmap := @endcap_med_left 15: pBitmap := @endcap_med_right 16: pBitmap := @endcap_small_left 17: pBitmap := @endcap_small_right Bitmap1Bit(pBitmap, xPos, yPos, xSize, ySize, clr) PUB cmd_fillbox | left,top,width,height,clr,bBottomBreak,bRightBreak,bTrimRight 'FillBlock(3,1,35,2,3,false,false,false) 'FillBlock(left,top,width,height,clr,bBottomBreak,bRightBreak,bTrimRight) left := bus_getchar top := bus_getchar width := bus_getchar height := bus_getchar clr := bus_getchar bBottomBreak := bus_getchar bRightBreak := bus_getchar bTrimRight := bus_getchar FillBlock(left,top,width,height,clr,bBottomBreak,bRightBreak,bTrimRight) PUB cmd_drawtxt | nButton,pButton,nLen,c,i 'DrawText(@button,@string,bInvert) nButton := bus_getchar nLen := bus_getchar repeat i from 0 to nLen - 1 c := bus_getchar sBuffer[i] := c sBuffer[i+1] := 0 case nButton 0: pButton := @title 1: pButton := @footer 2: pButton := @button1 3: pButton := @button2 4: pButton := @button3 5: pButton := @button4 6: pButton := @button5 7: pButton := @button6 8: pButton := @button7 9: pButton := @button8 10: pButton := @button9 DrawText(pButton, @sBuffer,false) PUB init_subsysteme {{initialisierung des belatrix-chips}} cognew(led_hbeat, @stackhb) 'heartbeat aktivieren bus_init 'bussignale initialisieren '64 byte align the user characters user_charbase := @uchar & $FFC0 'destination 'user_charbase_offset := user_charbase-@uchar longmove(user_charbase,@uchar,16*nuchars) keyb.start(keyb_dport, keyb_cport) 'tastaturport starten vga.start(vga_basport, @array, @vgacolors, 0,0,0) 'vga-treiber starten print_char($100) 'bildschirm l?schen cursor := CURSORCHAR 'cursorzeichen setzen curstat := 1 'cursor anschalten sline := 2 eline := rows PUB bus_init {{initialisierung des bussystems}} dira := db_in 'datenbus auf eingabe schalten outa[bus_hs] := 1 'handshake inaktiv PUB bus_putchar(zeichen) {{ein byte ?ber bus ausgeben}} waitpeq(%00000010_00000000_00000000_00000000,%00000010_10000000_00000000_00000000,0) 'busclk=1? & prop2=0? dira := db_out 'datenbus auf ausgabe stellen outa[7..0] := zeichen 'daten ausgeben outa[bus_hs] := 0 'daten g?ltig waitpeq(%00000000_00000000_00000000_00000000,%00000010_00000000_00000000_00000000,0) 'busclk=0? 'waitcnt(1_000 + cnt) 'zeit f?r master outa[bus_hs] := 1 'daten ung?ltig dira := db_in 'bus freigeben PUB bus_getchar : zeichen {{ein byte ?ber bus empfangen}} waitpeq(%00000010_00000000_00000000_00000000,%00000010_10000000_00000000_00000000,0) 'busclk=1? & prop2=0? zeichen := ina[7..0] 'daten einlesen outa[bus_hs] := 0 'daten quittieren outa[bus_hs] := 1 waitpeq(%00000000_00000000_00000000_00000000,%00000010_00000000_00000000_00000000,0) 'busclk=0? PUB led_hbeat {{led_hbeat - herzschlag f?r front-led}} dira := db_in repeat !outa[hbeat] waitcnt(cnt_hbeat + cnt) PUB print_str(strptr) {{zeichenkette auf bildschirm ausgeben}} repeat while byte[strptr] print_char(byte[strptr++]) PUB print_char(c) | code,n {{zeichen auf bildschirm ausgeben}} '' Print a character '' '' $0D = new line '' $20..$FF = character '' $100 = clear screen '' $101 = home '' $108 = backspace ''$110..$11F = select color case c $00..$0C: pchar(c) if curstat == 1 schar(cursor) $0D: 'return? if curstat == 1 schar($20) newline if curstat == 1 schar(cursor) $0E..$FF: 'character? pchar(c) if curstat == 1 schar(cursor) $100: 'clear screen? if curstat == 1 schar($20) n := sline * cols * 2 wordfill(@array + n, spacetile, tiles - n) row := sline col := 0 if curstat == 1 schar(cursor) $101: 'home? row := sline col := 0 $102: 'backspace? if col if curstat == 1 schar($20) col-- if curstat == 1 schar(cursor) $103: 'tab if col < TAB1 if curstat == 1 schar($20) col := TAB1 if curstat == 1 schar(cursor) return if col < TAB2 if curstat == 1 schar($20) col := TAB2 if curstat == 1 schar(cursor) return if col < TAB3 if curstat == 1 schar($20) col := TAB3 if curstat == 1 schar(cursor) return $104: 'setcur code := bus_getchar cursor := code if curstat == 1 schar(code) $105: 'pos1 if curstat == 1 schar($20) col := 0 if curstat == 1 schar(cursor) $106: 'setx if curstat == 1 schar($20) col := bus_getchar if curstat == 1 schar(cursor) $107: 'sety if curstat == 1 schar($20) row := bus_getchar * 2 + sline '2 tiles pro zeichen! if curstat == 1 schar(cursor) $108: 'getx bus_putchar(col) $109: 'gety bus_putchar(row / 2) $110: 'setcolor color := bus_getchar $111: 'sline sline := bus_getchar * 2 $112: 'eline eline := bus_getchar * 2 $113: 'screeninit wordfill(@array, spacetile, tiles) row := 0 col := 0 sline := 0 $114: 'curon curstat := 1 schar(cursor) $115: 'curoff if curstat == 1 schar($20) curstat := 0 $116: 'scrollup scrollup $130..$13F: 'select color? color := c & $F PRI schar(c)| i,k 'schreibt zeichen an aktuelle position ohne cursorposition zu ver?ndern k := color << 1 + c & 1 i := $8000 + (c & $FE) << 6 + k array.word[row * cols + col] := i 'oberes tile setzen array.word[(row + 1) * cols + col] := i | $40 'unteres tile setzen PRI pchar(c) 'schreibt zeichen an aktuelle position z?hlt position weiter schar(c) if ++col == cols newline PUB newline | i col := 0 if (row += 2) == rows row -= 2 'scroll lines repeat i from sline to rows-3 wordmove(@array.word[i*cols], @array.word[(i+2)*cols], cols) 'wordmove(dest,src,cnt) 'clear new line wordfill(@array.word[(rows-2)*cols], spacetile, cols<<1) PUB scrollup | i 'scrollt den screen nach oben 'scroll lines repeat i from sline to rows-3 wordmove(@array.word[i*cols], @array.word[(i+2)*cols], cols) 'wordmove(dest,src,cnt) 'clear new line wordfill(@array.word[(rows-2)*cols], spacetile, cols<<1) PRI DrawText(pBmp,str,bInvert)|x1,x2,i,j,b,k,c,s 'draw prop font into bitmap k:=0 'current column repeat s from 0 to strsize(str)-1 c:=byte[str][s] if (c=>32) and (c=<(95+2)) 'note: char 96=dot, 97=degree x1:=word[@FontTable][c-32] x2:=word[@FontTable][c-32+1] repeat i from x1 to x2-1 DrawFontColumn(i,j,pBmp,k,b) 'repeat j from 0 to 31 ' b:=getFontPixel(i,j) ' setFontPixel(pBmp,k,j,b) k++ PRI DrawFontColumn(x,y,pdest,k,b)|dtile,stile,doffset,soffset,psrc,d,pixel,j stile:=x/16 soffset:=(x//16)*2 psrc:=@font+4*16*stile+user_charbase-@uchar dtile:=k/16 doffset:=(k//16)*2 pdest+=4*16*dtile+user_charbase-@uchar repeat j from 0 to 31 y:=j if y=>16 y-=16 if j==16 soffset++ doffset++ pixel:=long[psrc][y//16] pixel>>=soffset pixel&=$1 'draw if pixel long[pdest][y//16]|=|16 offset++ y-=16 p:=@font+4*16*tile d:=long[p+user_charbase-@uchar][y//16] d>>=offset return (d&$1)>0 PRI setFontPixel(p,x,y,b)|tile,offset,d 'set (b=true) or clear (b=false) pixel in bmp @p at coordinates (x,y) tile:=x/16 offset:=(x//16)*2 if y=>16 offset++ y-=16 p+=4*16*tile+user_charbase-@uchar 'd:=long[p][y//16] if b long[p][y//16]|=|>6 + c & $FE PRI uPrintBottom(c,ncol,nrow)|i,k 'print bottom part of a character k := color << 1 + c & 1 i := user_charbase + (c & $FE) << 6 + k array.word[nrow * cols + ncol] := i+$40'user_charbase + (c<<6) + color+$40'(color << 1 + c & 1) << 10 + user_charbase>>6 + c & $FE +1 PRI Bitmap2Bit(pBitmap, xPos, yPos, xSize, ySize, clr)|c,i,j,BmpAddress row:=yPos col:=xPos c:=0 BmpAddress:=pBitmap+user_charbase-@uchar repeat j from 0 to (ySize-1) repeat i from 0 to (xSize-1) array.word[row * cols + col] := BmpAddress + (c<<6) + clr 'Print2Bit(c,clr,pBitmap) c++ col++ row++ col:=xPos PRI Bitmap1Bit(pBitmap, xPos, yPos, xSize, ySize, clr)|c,i,j,BmpAddress row:=yPos col:=xPos c:=0 BmpAddress:=pBitmap+user_charbase-@uchar repeat j from 0 to (ySize-1) step 2 repeat i from 0 to (xSize-1) array.word[row * cols + col] := (clr<<1+1) + BmpAddress +c<<6 if ySize<>1 array.word[(row+1) * cols + col] := (clr<<1) + BmpAddress +c<<6 c++ col++ row+=2 col:=xPos PRI Bitmap1BitTile(pBitmap,x,y,clr,bLower)|BmpAddress 'print just the upper or lower tile of a 2-tile bitmap BmpAddress:=pBitmap+user_charbase-@uchar clr:=clr<<1+1 if bLower clr-=1 array.word[y * cols + x] := clr + BmpAddress DAT vgacolors long '0..1: text color 0: long $90009000 'orange on black long $90900000 '2..3: text color 1: long $5c005c00 'blue on black long $5c5c0000 '4..5: text color 2: long $94009400 'light red on black long $94940000 '6..7: text color 3: long $98009800 'purple on black long $98980000 '8..9: text color 4: long $f800f800 'yellow on black long $f8f80000 '10..11: text color 5: long $84008400 'dark red on black long $84840000 '12: graphics 2: 'card edge colors long $100000FC ''green,black,black,white '13: graphics 3: 'red face card colors long $F0C000FC ' yellow,red,black,white '14: graphics 4: 'black face card colors long $F000C0FC ''yellow,black,red,white '15: graphics 5: button colors long $FC54A8A8 'lt grey, dk.gray, gray, gray FontTable word word 8, 16,21,32,60,72,92,107,114,121,129,138,150,156,164,170,184,195,203,214,225,239,250,261,273,284,295,300,306,316,333,343,354,378,392 'to B word 403,414,425,435,445,456,467,472,483,496,506,523,537,548,559,570,582,593,605,616,630,649,663,676,686,695,706,720,733,743,751 'note last two chars are dot and degree padding LONG 7[16] 'alignment padding for the following user defined characters uchar long corner_topleft long file "corner_topleft.dat" '6x2 corner_topright long file "corner_topright.dat" '6x2 corner_bottomLeft long file "corner_bottomLeft.dat" '6x2 hv_break long file "hv_break.dat" '1x2 hv_break2 long file "hv_break2.dat" '1x2 endcap_med_left long file "endcap_med_left.dat" '1x2 endcap_med_right long file "endcap_med_right.dat" '1x2 endcap_small_left long file "endcap_small_left.dat" '1x2 endcap_small_right long file "endcap_small_right.dat" '1x2 filled_space long file "filled_space.dat" '1x2 font long file "font_29p5.dat" '47x2 title long 0[16*23] 'space for title 23x2 footer long 0[16*23] 'space for footer 23x2 button1 long 0[16*20] 'space for button text 10x2 button2 long 0[16*20] 'space for button text button3 long 0[16*20] 'space for button text button4 long 0[16*20] 'space for button text button5 long 0[16*20] 'space for button text button6 long 0[16*20] 'space for button text 10x2 button7 long 0[16*20] 'space for button text button8 long 0[16*20] 'space for button text button9 long 0[16*20] 'space for button text