{{ VGA-64Farben ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Autor: Ingo Kripahle,Reinhard Zielinski │ │ Copyright (c) 2013 Ingo Kriphale,Reinhard Zielinski │ │ See end of file for terms of use. │ │ Die Nutzungsbedingungen befinden sich am Ende der Datei │ └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ Informationen : hive-project.de Kontakt : zille9@googlemail.com System : Hive Name : VGA-Tile-Treiber 640x480 Pixel, 40x28 Tiles Chip : Bellatrix Typ : Treiber Version : 01 Subversion : 00 Funktion : Standard VGA-Text- und Tastatur-Treiber Dieser Bellatrix-Code kann als Stadardcode im EEPROM gespeichert werden Tilebasierten-Textbildschirm und Tastaturfunktionen. Mit dem integrierten Loader kann Bellatrix mit einem beliebigen anderen Code geladen werden. Komponenten : VGA64 Tilemap Engine // Author: Kwabena W. Agyeman PS/2 Keyboard Driver v1.0.1 Chip Gracey, ogg MIT COG's : MANAGMENT 1 COG VGA 1 COG's KEYB 1 COG ------------------- 3 COG's Logbuch : 23-10-2008-dr235 - erste funktionsfähige version erstellt - cursor eingebaut 06-11-2008-dr235 - keyb auf deutsche zeichenbelegung angepasst (ohne umlaute) 24-11-2008-dr235 - tab, setcur, pos1, setx, sety, getx, gety, setcol, sline, screeninit curon, curoff - beltest 13-03-2009-dr235 - LF als Zeichencode ausgeblendet 22-03-2009-dr235 - abfrage für statustasten eingefügt 05-09-2009-dr235 - abfrage der laufenden cogs eingefügt - deutschen tastaturtreiber mit vollständiger belegung! von ogg eingebunden 22-03-2010-dr235 - anpassung trios 01-05-2010-dr235 - scrollup/scrolldown eingebunden & getestet 03-05-2010-dr235 - settab/getcols/getrows/getresx/getresy eingefügt & getestet - hive-logo eingefügt ------------------- 26-01-2011-dr235 - übernahme und anpassung des treibers aus trios 31-01-2011-dr235 - backspace als direktes steuerzeichen ($C8) eingefügt 01-02-2011-dr235 - multiscreenfähigkeit implementiert - 88 - mgr_wscr: steuert, in welchen screen zeichen geschrieben werden - 89 - mgr_dscr: steuert welcher screen angezeigt wird 05-02-2011-dr235 - umwandlung backspace $c8 --> $08 06-03-2011-dr235 - revision der steuercodes; nur noch funktionen mit parameter werden über eine 0-sequenz aufgerufen, alle anderen steuerzeichen werden auf 1-byte-zeichen abgebildet 20-04-2011-dr235 - integration einer kompatiblen loaderroutine, damit kann der treiber jetzt direkt aus dem rom gestartet und dennoch bella-code nachgeladen werden kann 31.12.2011-dr235 - anpassung für verschiedene zeilenumbrüche in print_char eingefügt 02-04-2013-zille9 - Kompletter Umbau durch Einbindung eines anderen Grafiktreibers 02-06-2013-zille9 - Startbild ala Amiga eingebunden, fordert zum Einlegen einer SD-Card mit TRIOS auf 28-12-2013-zille9 - Fensterfunktionen für 8 Windows mit 8 verschiedenen Stilen geschaffen - Button-Funktionen auf Abfrage der Mauskoordinaten beschränkt, grafische Funktionen werden wieder von Regnatix erledigt - dadurch Code gespart, da nur noch die Koordinaten-Puffer und die Button-Nummer benötigt werden 05-01-2014-zille9 - Fensterverwaltung überarbeitet, bei Klick auf ein Fensterbutton wird die Fensternummer*10+Buttonnummer zurückgegeben - Beispiel:Schließen Symbol im Fenster 2 gibt 22 zurück (20 für Fenster 2 und 2 für Fensterbutton 2) - dadurch wird es möglich, mehrere Fenster auf Funktionen abzufragen - 234 Longs frei Notizen: }} CON _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 'signaldefinitionen bellatrixix #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 #41, RTC_GETSECONDS 'Returns the current second (0 - 59) from the real time clock. RTC_GETMINUTES 'Returns the current minute (0 - 59) from the real time clock. RTC_GETHOURS 'Returns the current hour (0 - 23) from the real time clock. ' +---------- ' | +------- system ' | | +---- version (änderungen) ' | | | +- subversion (hinzufügungen) 'CHIP_VER = $00_01_02_01 ' ' +---------- ' | +-------- ' | |+------- vektor ' | ||+------ grafik ' | |||+----- text ' | ||||+---- maus ' | |||||+--- tastatur ' | ||||||+-- vga ' | |||||||+- tv CHIP_SPEC = %00000000_00000000_00000000_00011110 KEYB_DPORT = BEL_KEYBD 'tastatur datenport KEYB_CPORT = BEL_KEYBC 'tastatur taktport mouse_dport = BEL_MOUSED mouse_cport = BEL_MOUSEC ' hbeat --------+ ' clk -------+| ' /wr ------+|| ' /hs -----+||| +------------------------- /cs ' |||| | -------- d0..d7 DB_IN = %00001000_00000000_00000000_00000000 'maske: dbus-eingabe DB_OUT = %00001000_00000000_00000000_11111111 'maske: dbus-ausgabe M1 = %00000010_00000000_00000000_00000000 M2 = %00000010_10000000_00000000_00000000 'busclk=1? & /cs=0? M3 = %00000000_00000000_00000000_00000000 M4 = %00000010_00000000_00000000_00000000 'busclk=0? _pinGroup = 1 _startUpWait = 2 buttonbuff=33 'Buttonanzahl 1-32 Textbutton oder icon Bel_Treiber_Ver=88 'Bellatrix-Treiberversion OBJ vga : "VGA64_Engine" keyb : "bel-keyb" mouse : "mouse64" VAR long keycode 'letzter tastencode long plen 'länge datenblock loader byte proghdr[16] 'puffer für objektkopf byte mouseshow 'Mouse-Pfeil anzeigen oder nicht byte strkette[40] 'stringpuffer fuer Scrolltext word tnr,XPos,YPos byte bnumber[buttonbuff],bx[buttonbuff],by[buttonbuff],bxx[buttonbuff] 'buttonvariable fuer 33 Buttons word xbound,ybound,xxbound,yybound 'x und y bereich der Mouse eingrenzen long mousetile[16] 'User-Mousetilebuffer byte hintergr byte actor[5] 'Actor-Sprite [Tilenr,col1,col2,col3,x,y] Spielerfigur byte action_x,old_action_x byte action_y,old_action_y byte sprite_x[8],sprite_y[8],sprite_old_x[8],sprite_old_y[8] 'x,y-Parameter der Sprites byte spritenr[16] 'Tilenr der Sprites+Alternativ-Sprites byte spritef1[8],spritef2[8],spritef3[8] 'farben der Sprites byte sprite_dir[8] 'Bewegungsrichtung der Sprites byte action_key[5] byte sprite_start[8] byte sprite_end[8] byte Sprite_Move byte collision byte block_tile[10] byte sp_alter byte wind[112] byte wint[17] 'Tilenummern für die Fenster CON ''------------------------------------------------- BELLATRIX PUB main | zeichen,n,i,x,y ,speed 'chip: kommandointerpreter ''funktionsgruppe : chip ''funktion : kommandointerpreter ''eingabe : - ''ausgabe : - init_subsysteme 'bus/vga/keyboard/maus initialisieren n:=0 speed:=30 repeat if mouseshow==1 'Mauspfeil anzeigen x+=mouse.delta_x if x=xxbound'639 x:=xxbound'639 y+= -mouse.delta_y if y=yybound'479 y:=yybound'479 XPos :=x YPos :=y '++++++++++++++++++++++++ Sprite-Bewegung ++++++++++++++++++++++++++++++++++++++++++++++++++ if Sprite_Move==1 repeat i from 0 to 7 if(spritenr[i]<176) and collision==0 'sprite definiert? und noch keine Kollision passiert if (sprite_x[i]==action_x) and (sprite_y[i]==action_y) 'sprite an Player-Position? collision:=1 quit n++ if n==speed Set_Sprite_XY if n>speed+1 n:=0 '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ zeichen := bus_getchar '1. zeichen empfangen if zeichen ' > 0 vga.printCharacter(zeichen) else zeichen := bus_getchar '2. zeichen kommando empfangen case zeichen 1: key_stat '1: Tastaturstatus senden 2: key_code '2: Tastaturzeichen senden 3: vga.sety(bus_getchar) 4: key_spec '4: Statustasten ($100..$1FF) abfragen 5: displaymouse '5: Mousezeiger anzeigen 6: pchar(bus_getchar) '6: zeichen ohne steuerzeichen ausgeben 7: bus_putchar(keyb.taster) keyb.clearkeys 8: vga.setx(bus_getchar) '8: x-position setzen 9: mousebound '9: mousebereich eingrenzen 10: mousex '10:abfrage absulute x-position 11: mousey '11:abfrage absulute y-position 12: mousez '12:abfrage absulute z-position (Scrollrad) 13: keyb.clearkeys 'tastaturpuffer loeschen 14: mouse_button(bus_getchar) '14:abfrage Mouse Button 15: BoxSize '15:BoxSize ' 16: vga.printCursorColor(bus_getchar) 17: vga.printCursorRate(bus_getchar) 18: PrintBoxColor 19: destroy_Button 20: scrollup 21: scrolldown 22: display3DBox 23: display3DFrame 24: display2DBox 25: Get_Button_Param 26: scrollString 27: displayString 30: mousepointer 31: vga.printat(bus_getchar,bus_getchar) 32: displayTile 33: vga.printwindow(bus_getchar) 35: loadtile 'Tiledatei in Puffer laden 36: displaypic 'komplette Tile-Datei anzeigen 37: getx 'Cursor-X-Position abfragen 38: gety 'Cursor-Y-Position abfragen 39: line(bus_getchar,bus_getchar,bus_getchar,bus_getchar,bus_getchar) 'x,y,xx,yy,farbe 40: vga.Plot(bus_getchar,bus_getchar,bus_getchar) 41: Sprite_Parameter 'Sprite-Parameter 42: Set_Sprite_XY 'Sprite bewegen 43: Actor_Parameter 'Player-Parameter 44: Set_Actor_XY 'Player bewegen 45: Set_Action_Key 'spielertasten 46: Reset_Sprite 'Sprite anhalten/loeschen 47: SpriteMove 'spritebewegung aktivieren/deaktivieren 48: speed:=bus_getchar 'spritegeschwindigkeit 49: bus_putchar(collision) 'Kollisionsflag abfragen collision:=0 50: Get_Actor_Pos 'Playerposition 51: Get_Block 'Tile lesen ' 52: Fire_Parameter ' 53: Fire 54: Displaypalette 'Farbpalette anzeigen 55: Del_Window 'Fensterparameter löschen 56: Set_Titel_Status 'Titeltext oder Statustext in einem Fenster setzen 57: backup_area 'Bildschirmbereich sichern 58: restore_area 'Bildschirmbereich wiederherstellen 59: Window 'Fensterstil erstellen 60: get_window 'Tastendruck im Fenster abfragen 61: Change_Backuptile 'Backuptile unter dem Player ändern (Itemsammeln) 62: PrintFont 'Text mit Tilefont darstellen 63: vga.put(bus_getchar,bus_getchar,bus_getchar) ' ---------------------------------------------- CHIP-MANAGMENT 96: mgr_getcogs 'freie cogs abfragen 87: mgr_load 'neuen bellatrix-code laden 98: mgr_bel 'Rückgabe Grafiktreiber 64 99: reboot 'bellatrix neu starten PUB init_subsysteme|i',x,y,tn,tmp 'chip: initialisierung des bellatrix-chips ''funktionsgruppe : chip ''funktion : - initialisierung des businterface '' : - vga & keyboard-treiber starten ''eingabe : - ''ausgabe : - repeat i from 0 to 7 'evtl. noch laufende cogs stoppen ifnot i == cogid cogstop(i) dira := db_in 'datenbus auf eingabe schalten outa[bus_hs] := 1 'handshake inaktiv keyb.start(keyb_dport, keyb_cport) 'tastaturport starten ifnot vga.TMPEngineStart(_pinGroup, @XPos, @YPos) reboot waitcnt((clkfreq * _startUpWait) + cnt) mouse.start(BEL_MOUSED, BEL_MOUSEC) mouseshow:=0 'Mousezeiger aus xbound:=1 'Mouse-Bereich Grundeinstellung xxbound:=639 ybound:=1 yybound:=479 repeat i from 0 to 7 spritenr[i]:=255 'sprites abschalten action_key[0]:=2 'action-tasten vorbelegen action_key[1]:=3 action_key[2]:=4 action_key[3]:=5 action_key[4]:=32 sp_alter:=0 collision:=0 vga.printwindow(0) vga.printBoxSize(0,0, 0, 29, 39) vga.printBoxColor(0,0,255) vga.printCharacter(12) 'cls vga.printCursorRate(0) '##### Fensterparameter ##### wind[0]:=0 wind[1]:=1 wind[2]:=0 wind[3]:=0 wind[4]:=39 wind[5]:=29 wind[6]:=0 wind[7]:=255 wind[8]:=0 PUB bus_putchar(zeichen) 'chip: ein byte an regnatix senden ''funktionsgruppe : chip ''funktion : ein byte an regnatix senden ''eingabe : byte ''ausgabe : - waitpeq(M1,M2,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(M3,M4,0) 'busclk=0? dira := db_in 'bus freigeben outa[bus_hs] := 1 'daten ungültig PUB bus_getchar : zeichen 'chip: ein byte von regnatix empfangen ''funktionsgruppe : chip ''funktion : ein byte von regnatix empfangen ''eingabe : - ''ausgabe : byte 'outa[hbeat]~~ waitpeq(M1,M2,0) 'busclk=1? & prop2=0? zeichen := ina[7..0] 'daten einlesen outa[bus_hs] := 0 'daten quittieren waitpeq(M3,M4,0) 'busclk=0? outa[bus_hs] := 1 'outa[hbeat]~ CON ''------------------------------------------------- SUBPROTOKOLL-FUNKTIONEN PUB sub_putlong(wert) 'sub: long senden ''funktionsgruppe : sub ''funktion : subprotokoll um einen long-wert an regnatix zu senden ''eingabe : 32bit wert der gesendet werden soll ''ausgabe : - ''busprotokoll : [put.byte1][put.byte2][put.byte3][put.byte4] '' : [ hsb ][ ][ ][ lsb ] bus_putchar(wert >> 24) '32bit wert senden hsb/lsb bus_putchar(wert >> 16) bus_putchar(wert >> 8) bus_putchar(wert) PUB sub_getlong:wert 'sub: long empfangen ''funktionsgruppe : sub ''funktion : subprotokoll um einen long-wert von regnatix zu empfangen ''eingabe : - ''ausgabe : 32bit-wert der empfangen wurde ''busprotokoll : [get.byte1][get.byte2][get.byte3][get.byte4] '' : [ hsb ][ ][ ][ lsb ] wert := bus_getchar << 24 '32 bit empfangen hsb/lsb wert := wert + bus_getchar << 16 wert := wert + bus_getchar << 8 wert := wert + bus_getchar PUB sub_putword(wert) 'sub: long senden ''funktionsgruppe : sub ''funktion : subprotokoll um einen long-wert an regnatix zu senden ''eingabe : 32bit wert der gesendet werden soll ''ausgabe : - ''busprotokoll : [put.byte1][put.byte2][put.byte3][put.byte4] '' : [ hsb ][ ][ ][ lsb ] bus_putchar(wert >> 8) bus_putchar(wert) PUB sub_getword:wert 'sub: long empfangen ''funktionsgruppe : sub ''funktion : subprotokoll um einen long-wert von regnatix zu empfangen ''eingabe : - ''ausgabe : 32bit-wert der empfangen wurde ''busprotokoll : [get.byte1][get.byte2][get.byte3][get.byte4] '' : [ hsb ][ ][ ][ lsb ] wert := bus_getchar << 8 wert := wert + bus_getchar CON ''------------------------------------------------- CHIP-MANAGMENT-FUNKTIONEN pub mgr_bel sub_putlong(Bel_Treiber_Ver) 'rückgabe 65 für tile-driver 64 farben stark geänderte Version PUB mgr_getcogs: cogs |i,c,cog[8] 'cmgr: abfragen wie viele cogs in benutzung sind ''funktionsgruppe : cmgr ''funktion : abfrage wie viele cogs in benutzung sind ''eingabe : - ''ausgabe : cogs - anzahl der cogs ''busprotokoll : [0][096][put.cogs] '' : cogs - anzahl der belegten cogs cogs := i := 0 repeat 'loads as many cogs as possible and stores their cog numbers c := cog[i] := cognew(@entry, 0) if c=>0 i++ while c => 0 cogs := i repeat 'unloads the cogs and updates the string i-- if i=>0 cogstop(cog[i]) while i=>0 bus_putchar(cogs) PUB mgr_load|i 'cmgr: bellatrix-loader ''funktionsgruppe : cmgr ''funktion : funktion um einen neuen code in bellatrix zu laden '' ''bekanntes problem: einige wenige bel-dateien werden geladen aber nicht korrekt gestartet ''lösung: diese datei als eeprom-image speichern ' kopf der bin-datei einlesen ------------------------------------------------------ repeat i from 0 to 15 '16 bytes --> proghdr byte[@proghdr][i] := bus_getchar plen := 0 plen := byte[@proghdr + $0B] << 8 plen := plen + byte[@proghdr + $0A] plen := plen - 8 ' objektlänge an regnatix senden bus_putchar(plen >> 8) 'hsb senden bus_putchar(plen & $FF) 'lsb senden repeat i from 0 to 7 'alle anderen cogs anhalten ifnot i == cogid cogstop(i) dira := 0 'diese cog vom bus trennen cognew(@loader, plen) cogstop(cogid) 'cog 0 anhalten DAT org 0 loader mov outa, M_0 'bus inaktiv mov dira, DINP 'bus auf eingabe schalten mov reg_a, PAR 'parameter = plen mov reg_b, #0 'adresse ab 0 ' datenblock empfangen loop call #get 'wert einlesen wrbyte in, reg_b 'wert --> hubram add reg_b, #1 'adresse + 1 djnz reg_a, #loop ' neuen code starten rdword reg_a, #$A ' Setup the stack markers. sub reg_a, #4 ' wrlong SMARK, reg_a ' sub reg_a, #4 ' wrlong SMARK, reg_a ' rdbyte reg_a, #$4 ' Switch to new clock mode. clkset reg_a ' coginit SINT ' Restart running new code. cogid reg_a cogstop reg_a 'cog hält sich selbst an get waitpeq M_1, M_2 'busclk=1? & /cs=0? mov in, ina 'daten einlesen and in, DMASK 'wert maskieren mov outa, M_3 'hs=0 waitpeq M_3, M_4 'busclk=0? mov outa, M_0 'hs=1 get_ret ret ' hbeat --------+ ' clk -------+| ' /wr ------+|| ' /hs -----+|||+------------------------- /cs ' ||||| -------- d0..d7 DINP long %00001000000000000000000000000000 'constant dinp hex \ bus input DOUT long %00001000000000000000000011111111 'constant dout hex \ bus output M_0 long %00001000000000000000000000000000 'bus inaktiv M_1 long %00000010000000000000000000000000 M_2 long %00000010100000000000000000000000 'busclk=1? & /cs=0? M_3 long %00000000000000000000000000000000 M_4 long %00000010000000000000000000000000 'busclk=0? DMASK long %00000000000000000000000011111111 'datenmaske SINT long ($0001 << 18) | ($3C01 << 4) ' Spin interpreter boot information. SMARK long $FFF9FFFF ' Stack mark used for spin code. in res 1 reg_a res 1 reg_b res 1 CON ''------------------------------------------------- KEYBOARD-FUNKTIONEN PUB key_stat 'key: tastaturstatus abfragen bus_putchar(keyb.gotkey) PUB key_code 'key: tastencode abfragen keycode := keyb.key case keycode $c8: keycode := $08 'backspace wandeln bus_putchar(keycode) PUB key_spec 'key: statustaten vom letzten tastencode abfragen bus_putchar(keycode >> 8) CON ''------------------------------------------------- SCREEN-FUNKTIONEN pub Window|win,f1,f2,f3,f4,f5,f6,f7,f8,x,y,xx,yy,modus,a,b,c,d,posi,shd win:=bus_getchar 'fensternummer f1:=bus_getchar 'farbe1 'vordergrund f2:=bus_getchar 'farbe2 'hintergrund f3:=bus_getchar 'farbe3 'titel f4:=bus_getchar 'farbe4 'frame f5:=bus_getchar 'farbe5 'titelhintergrund f6:=bus_getchar 'farbe6 'titeltext f7:=bus_getchar 'farbe7 'statusback f8:=bus_getchar 'farbe8 'statustext y:=bus_getchar 'y x:=bus_getchar 'x yy:=bus_getchar 'yy xx:=bus_getchar 'xx modus:=bus_getchar 'art des Fensters (mit oder ohne Titel,rahmen,Pfeiltasten,Statusleiste) shd :=bus_getchar 'Schatten a:=b:=c:=d:=0 if shd vga.display2DBox($56, y+1, x+1, yy+1, xx+1) 'Fensterschatten if modus==2 or modus>3 rahmen(y,x,yy,xx,modus,f1,f2,f4) a:=b:=c:=d:=1 if modus==3 or modus==4 or modus>5 titel(y,x,xx,f1,f2,f5,f4) a:=1 if modus==5 or modus==6 or modus==8 pfeile(y,yy,xx,f1,f2,f4,modus) if modus>6 status(yy,x,xx,f1,f2,f7) vga.printBoxColor(win,f1,f2) 'fenster vorder und hintergrundfarbe setzen vga.printCursorColor(f3) vga.printBoxSize(win,y+a, x+b, yy-c, xx-d) 'virtuelles Fenster erstellen posi:=win*14 wind[posi++]:=win wind[posi++]:=modus wind[posi++]:=x wind[posi++]:=y wind[posi++]:=xx wind[posi++]:=yy wind[posi++]:=f1 wind[posi++]:=f2 wind[posi++]:=f3 wind[posi++]:=f4 wind[posi++]:=f5 wind[posi++]:=f6 wind[posi++]:=f7 wind[posi++]:=f8 pub PrintFont|win,f1,f2,f3,x,y,offset,posi,len,c,of,off win:=bus_getchar 'fensternummer f1:=bus_getchar 'farbe1 'vordergrund f2:=bus_getchar 'farbe2 'hintergrund f3:=bus_getchar 'farbe3 'titel und statusfarbe,cursorfarbe y:=bus_getchar 'y x:=bus_getchar 'x offset:=bus_getchar 'offset für Zeichensätze, wo die Buchstaben vor der Nummer 32 anfangen len:=bus_getchar of:=1 off:=1 posi:=win*14 if wind[posi+1]==1 or wind[posi+1]==3 'Fenster ohne Rahmen benutzen keinen x-Offset, dh.man kann bis an den Rand schreiben of:=0 if wind[posi+1]==1 'Fenstertyp 1 benutzt auch keinen y-Offset off:=0 x:=x+wind[posi+2]+of y:=y+wind[posi+3]+off repeat len c:=bus_getchar-offset if y>wind[posi+5]-of y:=wind[posi+5]-of vga.displaytile(@tileset[c*16],f1,f2,f3, y, x) x++ if x>wind[posi+4]-of x:=wind[posi+2]+of y++ pri Set_Titel_Status|win,Tit_Stat,len,posi,x,y 'Titel-oder Statustext in einem Fenster setzen win :=bus_getchar 'fensternummer Tit_Stat:=bus_getchar 'Titel oder Statustext len :=bus_getchar 'stringlänge posi:=win*14 x:=wind[posi+2] if (wind[posi+1]==3 or wind[posi+1]==4 or wind[posi+1]>5) and Tit_Stat==1 and wind[posi] y:=wind[posi+3] 'Titeltext bus_getstr_plot(posi,len, y, x+1,1,0) elseif wind[posi+1]>6 and Tit_Stat==2 and wind[posi] y:=wind[posi+5] 'Statustext bus_getstr_plot(posi,len,y, x+1,1,2) else bus_getstr_plot(posi,len,y, x+1,0,0) 'keine Bildschirmausgabe pri bus_getstr_plot(win,len,y,x,m,b)|c repeat len c:=bus_getchar if x>4 y:=ypos>>4 repeat i from 1 to 7 b:=i*14 if wind[b] a:=wind[b+1] 'Art des Fensters case a 'Titelleiste linke und rechte obere ecke 3,4,6,7,8:if x==wind[b+2] and y==wind[b+3] 'linke obere ecke sd:=1 if x==wind[b+4] and y==wind[b+3] 'rechte obere ecke sd:=2 if a==6 or a==8 if x==wind[b+4] and y==wind[b+3]+1 'oberer pfeil sd:=3 if a==6 if x==wind[b+4] and y==wind[b+5] 'unterer pfeil sd:=4 if a==8 if x==wind[b+4] and y==wind[b+5]-1 'unterer pfeil sd:=4 if sd klick_action(x,y,sd,i) sd+=i*10 'Fensternummer*10+Button quit 5: if x==wind[b+4] and y==wind[b+3] 'oberer pfeil sd:=3 if x==wind[b+4] and y==wind[b+5] 'unterer pfeil sd:=4 if sd klick_action(x,y,sd,i) sd+=i*10 'Fensternummer*10+Button quit bus_putchar(sd) pri klick_action(x,y,sd,w)|tinr,f1,f2,f3,ff,a a:=w*14 f1:=wind[a+6] f2:=wind[a+7] ff:=wind[a+9]'f4 f3:=wind[a+10]'f5 case sd 1:tinr:=wint[8]'128 2:tinr:=wint[10]'129 3:tinr:=wint[11]'133 4:tinr:=wint[13]'131 vga.displaytile(@tileset[tinr*16],ff,f2,f1, y, x) 'rechte obere ecke repeat while mouse.button(0) 'warten, bis Maustaste losgelassen wird if sd==1 or sd==2 'Titelleistensymbole vga.displaytile(@tileset[tinr*16],f2,f1,ff, y, x) 'rechte obere ecke else 'Pfeilsymbole vga.displaytile(@tileset[tinr*16],f2,f1,ff, y, x) 'normal darstellen pri Del_Window|wnr,i,a i:=0 wnr:=bus_getchar repeat 17 'neue Tilewerte für die Fenster lesen wint[i++]:=bus_getchar if wnr==9 repeat i from 1 to 7 wind[i*10]:=0 else a:=wnr*14 vga.del_win(wnr) wind[a]:=0 pri titel(y,x,xx,f1,f2,f3,ff) vga.displaytile(@tileset[wint[8]*16],f2,f1,ff, y, x) 'linke obere ecke W_line(wint[9],x+1, y, xx-1,f2,f1,f3) vga.displaytile(@tileset[wint[10]*16],f2,f1,ff, y, xx) 'rechte obere ecke pri status(y,x,xx,f1,f2,f3) vga.displaytile(@tileset[wint[15]*16],f2,f1,f3, y, x) 'linke untere ecke W_line(wint[14],x+1, y, xx-1,f2,f1,f3) vga.displaytile(@tileset[wint[16]*16],f2,f1,f3, y, xx) 'rechte untere ecke pri W_line(tinr,x,y,xx,f1,f2,f3)|i repeat i from x to xx vga.displaytile(@tileset[tinr*16],f1,f2,f3, y, i) pri rahmen(y,x,yy,xx,modus,f1,f2,f3)|i if modus==2 or modus==5 vga.displaytile(@tileset[wint[0]*16],f2,f1,f3, y, x) 'links oben repeat i from x+1 to xx-1 vga.displaytile(@tileset[wint[1]*16],f2,f1,f3, y, i) 'oberer rand vga.displaytile(@tileset[wint[2]*16],f2,f1,f3, y, xx) 'rechts oben repeat i from y+1 to yy-1 vga.displaytile(@tileset[wint[7]*16],f2,f1,f3, i, x) 'linker rand if modus==2 or modus==4 or modus==7 vga.displaytile(@tileset[wint[3]*16],f2,f1,f3, i, xx) 'rechter rand ohne pfeile if modus==5 or modus==6 or modus==8 vga.displaytile(@tileset[wint[12]*16],f2,f1,f3, i, xx) 'rechter rand mit pfeilen repeat i from x+1 to xx-1 vga.displaytile(@tileset[wint[5]*16],f2,f1,f3, yy, i) 'unterer rand vga.displaytile(@tileset[wint[6]*16],f2,f1,f3, yy, x) 'linke untere ecke vga.displaytile(@tileset[wint[4]*16],f2,f1,f3, yy, xx) 'rechte untere ecke pri pfeile(y,yy,xx,f1,f2,f3,modus) if modus==6 or modus==8 y+=1 if modus==8 yy-=1 vga.displaytile(@tileset[wint[11]*16],f2,f1,f3, y, xx) vga.displaytile(@tileset[wint[13]*16],f2,f1,f3, yy, xx) 'unterer pfeil pub Backup_Area|x,y,xx,yy,a,b x:=bus_getchar y:=bus_getchar xx:=bus_getchar yy:=bus_getchar repeat b from y to yy repeat a from x to xx sub_putlong(vga.backup_chroma(a,b)) sub_putword(vga.backup_luma(a,b)) pub Restore_area|x,y,xx,yy,a,b x:=bus_getchar y:=bus_getchar xx:=bus_getchar yy:=bus_getchar repeat b from y to yy repeat a from x to xx vga.restore_chroma(a,b,sub_getlong) vga.restore_luma(a,b,sub_getword) pub mousebound xbound :=sub_getlong ybound:=sub_getlong xxbound :=sub_getlong yybound:=sub_getlong pub getx |x x:=vga.getx bus_putchar(x) pub gety |y y:=vga.gety bus_putchar(y) pub mousex bus_putchar(XPOS>>4) pub mousey bus_putchar(YPos>>4) pub mousez sub_putlong(mouse.abs_z) pub mouse_button(b)|i,knopf,xp,yp,c knopf:=0 xp:=XPOS>>4 yp:=YPOS>>4 c:=mouse.button(b) if mouse.button(0) 'linke mousetaste gedrueckt? repeat i from 1 to buttonbuff-1 'alle Buttonparameter durchsuchen if bnumber[i] if xp=>bx[i] and xp=< bxx[i] and yp==by[i] 'abfrage auf Buttonposition c:=i 'gefunden ! quit bus_putchar(c) 'ansonsten 255 senden pub BoxSize|win,y,x,yy,xx win:=bus_getchar y:=bus_getchar x:=bus_getchar yy:=bus_getchar xx:=bus_getchar vga.printBoxSize(win,y,x,yy,xx) pub PrintBoxColor|w,v,h,cur w:=bus_getchar v:=bus_getchar h:=hintergr:=bus_getchar cur:=bus_getchar vga.printBoxColor(w,v,h) 'fenster vorder und hintergrundfarbe setzen vga.printCursorColor(cur) 'Cursorfarbe setzen pub setpos(y,x) y:=bus_getchar x:=bus_getchar vga.printat(y,x) PUB pchar(c) 'screen: zeichen auf bildschirm ausgeben {{zeichen auf bildschirm ausgeben}} vga.printqChar(c) PUB scrollup | lines,farbe,y,x,yy,xx,rate lines:=bus_getchar farbe:=bus_getchar y :=bus_getchar x :=bus_getchar yy :=bus_getchar xx :=bus_getchar rate :=bus_getchar vga.scrollup(lines,farbe,y,x,yy,xx,rate) 'screen: scrollt den screen nach oben PUB scrolldown | lines,farbe,y,x,yy,xx,rate lines:=bus_getchar 'screen: scrollt den screen nach unten farbe:=bus_getchar y :=bus_getchar x :=bus_getchar yy :=bus_getchar xx :=bus_getchar rate :=bus_getchar vga.scrolldown(lines,farbe,y,x,yy,xx,rate) pub display3DBox|top,center,bott,y,x,yy,xx top:=bus_getchar center:=bus_getchar bott:=bus_getchar y :=bus_getchar x :=bus_getchar yy :=bus_getchar xx :=bus_getchar vga.display3DBox(top, center, bott, y,x,yy,xx) pub display3DFrame|top,center,bott,y,x,yy,xx top:=bus_getchar center:=bus_getchar bott:=bus_getchar y :=bus_getchar x :=bus_getchar yy :=bus_getchar xx :=bus_getchar vga.display3DFrame(top, center, bott, y,x,yy,xx) pub Get_Button_Param|number,y,x,xx number:=bus_getchar x :=bus_getchar y :=bus_getchar xx :=bus_getchar bx[number] :=x by[number] :=y bxx[number] :=xx bnumber[number]:=number pub destroy_Button|number number:=bus_getchar vga.display2DBox(hintergr,by[number],bx[number],by[number],bxx[number]) bnumber[number]:=0 pub display2DBox|farbe,y,x,yy,xx,shd farbe:=bus_getchar y :=bus_getchar x :=bus_getchar yy :=bus_getchar xx :=bus_getchar shd :=bus_getchar if shd vga.display2DBox($56,y+1,x+1,yy+1,xx+1) vga.display2DBox(farbe,y,x,yy,xx) pub scrollString|rate,vorder,hinter,y,x,xx,i,len',dir rate :=bus_getchar vorder:=bus_getchar hinter:=bus_getchar y :=bus_getchar x :=bus_getchar xx :=bus_getchar len :=bus_getchar repeat len byte[@strkette][i++]:=bus_getchar vga.scrollstring(@strkette,rate, vorder, hinter, y, x, xx) bytefill(@strkette,0,40) 'stringbuffer wieder loeschen pub displayString|vorder,hinter,y,x,c,len vorder:=bus_getchar hinter:=bus_getchar y :=bus_getchar x :=bus_getchar len :=bus_getchar repeat len c:=bus_getchar vga.displaycharacter(c, vorder, hinter, y, x) x++ pub displayTile|pcol,scol,tcol,y,x 'einzelnes Tile anzeigen tnr:=bus_getchar pcol:=bus_getchar scol:=bus_getchar tcol:=bus_getchar y:=bus_getchar x:=bus_getchar vga.displaytile(@tileset[tnr*16],pcol,scol,tcol, y, x) pub loadtile|anzahl,i 'Tileset in buffer laden anzahl:=sub_getlong repeat i from 0 to anzahl-1 tileset[i]:=sub_getlong pub mousepointer|i repeat i from 0 to 15 mousetile[i]:=sub_getlong vga.mouseCursorTile(@mousetile) pub displaypic|pcol,scol,tcol,y,x,ytile,xtile,xx,c 'komplettes Tileset anzeigen pcol:=bus_getchar scol:=bus_getchar tcol:=bus_getchar y:=bus_getchar x:=bus_getchar ytile:=bus_getchar xtile:=bus_getchar xx:=x c:=0 repeat ytile '9 repeat xtile '11 vga.displayTile(@tileset[c], pcol, scol, tcol, y, xx++) c+=16 y++ xx:=x pub displaymouse |on,farbe,i on:=bus_getchar farbe:=bus_getchar if on==1 vga.mouseCursorColor(farbe) vga.mouseCursorTile(vga.displayCursor) mouseshow :=1 repeat i from 0 to buttonbuff-1 'buttonanzahl zuruecksetzen bnumber[i]:=0 else vga.mouseCursorTile(0) mouseshow :=0 PUB line(x0, y0, x1, y1, frbe) | dX, dY, x, y, err, stp result := ((||(y1 - y0)) > (||(x1 - x0))) if(result) swap(@x0, @y0) swap(@x1, @y1) if(x0 > x1) swap(@x0, @x1) swap(@y0, @y1) dX := (x1 - x0) dY := (||(y1 - y0)) err := (dX >> 1) stp := ((y0 => y1) | 1) y := y0 repeat x from x0 to x1 if(result) vga.Plot(frbe,x,y) else vga.Plot(frbe,y,x) err -= dY if(err < 0) y += stp err += dX PRI swap(x, y) result := long[x] long[x] := long[y] long[y] := result con '************************************************ Spriteparameter ********************************************************** pub Actor_Parameter|i repeat 4 actor[i++]:=bus_getchar 'tilenr1 action_x:=bus_getchar action_y:=bus_getchar vga.dispBackup(action_y, action_x,9) vga.displaytile(@tileset[actor[0]*16],actor[1],actor[2],actor[3], action_y, action_x) old_action_x:=action_x old_action_y:=action_y pub Change_Backuptile|tinr,f1,f2,f3 'Backuptile unter dem Player ändern (für eingesammelte Items) tinr:=bus_getchar f1:=bus_getchar f2:=bus_getchar f3:=bus_getchar vga.Change_Backup(@tileset[tinr*16],f1,f2,f3) pub Get_Actor_Pos|a a:=bus_getchar case a 1:bus_putchar(action_x) 2:bus_putchar(action_y) pub Set_Actor_XY|k k:=bus_getchar actorxy(k) pub actorxy(k)|b case k action_key[0]:action_x-- b:=1 action_key[1]:action_x++ b:=1 action_key[2]:action_y-- b:=1 action_key[3]:action_y++ b:=1 if action_x<1 action_x:=0 if action_x>39 action_x:=39 if action_y<1 action_y:=0 if action_y>29 action_y:=29 if b==1 playermove pri playermove vga.dispRestore(old_action_y, old_action_x,9) vga.dispBackup(action_y, action_x,9)', farbe) vga.displaytile(@tileset[actor[0]*16],actor[1],actor[2],actor[3], action_y, action_x) old_action_x:=action_x old_action_y:=action_y pub Sprite_Parameter|nur nur:=bus_getchar nur-=1 spritenr[nur]:=bus_getchar spritenr[nur+8]:=bus_getchar spritef1[nur]:=bus_getchar spritef2[nur]:=bus_getchar spritef3[nur]:=bus_getchar sprite_dir[nur]:=bus_getchar 'richtung sprite_start[nur]:=bus_getchar 'startposition sprite_end[nur]:=bus_getchar 'endposition sprite_x[nur]:=bus_getchar 'x sprite_y[nur]:=bus_getchar 'y vga.dispBackup(sprite_y[nur], sprite_x[nur],nur) vga.displaytile(@tileset[spritenr[nur]*16],spritef1[nur],spritef2[nur],spritef3[nur], sprite_y[nur], sprite_x[nur]) sprite_old_y[nur]:=sprite_y[nur] sprite_old_x[nur]:=sprite_x[nur] pub SpriteMove|nur nur:=bus_getchar case nur 0:Sprite_move:=0 1:Sprite_move:=1 2:Reset_Sprite pub get_block|a,b a:=bus_getchar b:=bus_getchar block_tile[a]:=b pub Set_sprite_XY|num,vx,vy,p,b if sp_alter==0 'zweites Sprite-Tile sp_alter:=8 else sp_alter:=0 'erstes Sprite-Tile repeat num from 0 to 7 if spritenr[num]<175 'sprite belegt? case sprite_dir[num] 1:sprite_x[num]-- if sprite_x[num]sprite_end[num] 'endpos erreicht dann richtung umkehren sprite_dir[num]:=1 3:sprite_y[num]-- if sprite_y[num]sprite_end[num] 'endpos erreicht dann richtung umkehren sprite_dir[num]:=3 5:'einfacher verfolgermodus vx:=(action_x-sprite_x[num]) 'Abstand zur Spielerfigur x-Richtung vy:=(action_y-sprite_y[num]) 'Abstand zur Spielerfigur y-Richtung if vy<0 p:=((sprite_y[num]-1)*40)+sprite_x[num] b:=position(p) 'Überprüfung auf Blockade-Tile if b==0 sprite_y[num]-- if sprite_y[num]<1 sprite_y[num]:=1 if vy>0 p:=((sprite_y[num]+1)*40)+sprite_x[num] b:=position(p) if b==0 sprite_y[num]++ if sprite_y[num]>29 sprite_y[num]:=29 if vx<0 p:=(sprite_y[num]*40)+(sprite_x[num]-1) b:=position(p) if b==0 sprite_x[num]-- if sprite_x[num]<1 sprite_x[num]:=1 if vx>0 p:=(sprite_y[num]*40)+(sprite_x[num]+1) b:=position(p) if b==0 sprite_x[num]++ if sprite_x[num]>29 sprite_x[num]:=29 vga.dispRestore(sprite_old_y[num], sprite_old_x[num],num) vga.dispBackup(sprite_y[num], sprite_x[num],num) vga.displaytile(@tileset[spritenr[num+sp_alter]*16],spritef1[num],spritef2[num],spritef3[num], sprite_y[num], sprite_x[num]) sprite_old_x[num]:=sprite_x[num] sprite_old_y[num]:=sprite_y[num] pub position(tr):bl|i,block block:=read_block(tr) bl:=0 repeat i from 0 to 9 if block==block_tile[i] bl:=1 pub read_block(num):wert|i wert:=vga.getblock(num) repeat i from 0 to 175 'Tiles im Tileset mit Wert vergleichen if wert== @tileset[i*16] quit pub Reset_Sprite|i repeat i from 0 to 7 if spritenr[i]<177 vga.dispRestore(sprite_old_y[i], sprite_old_x[i],i) 'sprite reset spritenr[i]:=255 vga.dispRestore(old_action_y, old_action_x,9) 'Player reset Sprite_move:=0 'spritebewegung deaktivieren collision:=0 pub Set_Action_Key|i repeat 5 action_key[i++]:=bus_getchar pub Displaypalette|farbe,hy,hx,a hx:=bus_getchar hy:=bus_getchar a:=hx farbe:=0 repeat 4 repeat 16 vga.plot(farbe,hy,hx) hx++ farbe+=4 hx:=a hy++ DAT org ' ' Entry: dummy-assemblercode fuer cogtest ' entry jmp entry 'just loops tileset long 0[2816] DAT {{ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ TERMS OF USE: MIT License │ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │ │files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │ │modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│ │is furnished to do so, subject to the following conditions: │ │ │ │The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│ │ │ │THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │ │WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │ │COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │ │ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ }}