1283 lines
60 KiB
Plaintext
1283 lines
60 KiB
Plaintext
{{ 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 = %00001001_00000000_00000000_00000000 'maske: dbus-eingabe
|
|
DB_OUT = %00001001_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=<xbound '<1
|
|
x:=xbound '1
|
|
if x=>xxbound'639
|
|
x:=xxbound'639
|
|
y+= -mouse.delta_y
|
|
if y=<ybound'1
|
|
y:=ybound'1
|
|
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 %00001001000000000000000000000000 'constant dinp hex \ bus input
|
|
DOUT long %00001001000000000000000011111111 '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<wind[win+4] and m==1
|
|
vga.displaytile(@tileset[c*16],wind[win+10+b],wind[win+11+b],wind[win+7], y, x++)
|
|
else
|
|
next
|
|
|
|
|
|
pri get_window|x,y,a,b,i,sd
|
|
sd:=0
|
|
if mouseshow and mouse.button(0) 'Mauspfeil anzeigen
|
|
x:=xpos>>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_start[num] 'startpos erreicht? dann richtung umkehren
|
|
sprite_dir[num]:=2
|
|
2: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_start[num] 'startpos erreicht? dann richtung umkehren
|
|
sprite_dir[num]:=4
|
|
4: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. │
|
|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
}}
|