762 lines
66 KiB
Plaintext
762 lines
66 KiB
Plaintext
{{ ---------------------------------------------------------------------------------------------------------
|
||
|
||
Hive-Computer-Projekt
|
||
|
||
Name : IOS
|
||
Chip : Regnatix-Code (IO-Kernroutinen)
|
||
Version : 0.1
|
||
Dateien : ios.spin
|
||
|
||
Beschreibung : Anwendungsbibliothek
|
||
|
||
Eigenschaften :
|
||
system : systemübergreifende routinen
|
||
loader : routinen um bin-dateien zu laden
|
||
sd-card : FAT16 Dateisystem auf SD-Card
|
||
scr : Screeninterface
|
||
hss : Hydra-Soundsystem
|
||
sfx : Sound-FX
|
||
eram : Zugriff auf externen RAM
|
||
key : Keyboardroutinen
|
||
screen : Bildschirmsteuerung
|
||
bus : Kommunikation zu Administra und Bellatrix
|
||
|
||
Logbuch :
|
||
|
||
13.03.2009 - string für parameterübergabe zwischen programmen im eram eingerichtet
|
||
19.11.2008 - erste version aus dem ispin-projekt extrahiert
|
||
|
||
Kommandoliste:
|
||
|
||
--------------------------------------------------------------------------------------------------------- }}
|
||
|
||
CON
|
||
|
||
_CLKMODE = XTAL1 + PLL16X
|
||
_XINFREQ = 5_000_000
|
||
|
||
'signaldefinition regnatix
|
||
#0, D0,D1,D2,D3,D4,D5,D6,D7 'datenbus
|
||
#8, A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 'adressbus
|
||
#19, REG_RAM1,REG_RAM2 'selektionssignale rambank 1 und 2
|
||
#21, REG_PROP1,REG_PROP2 'selektionssignale für administra und bellatrix
|
||
#23, REG_AL 'strobesignal für adresslatch
|
||
#24, HBEAT 'front-led
|
||
BUSCLK 'bustakt
|
||
BUS_WR '/wr - schreibsignal
|
||
BUS_HS ' '/hs - quittungssignal
|
||
|
||
'zeichencodes
|
||
CHAR_RETURN = $0D 'eingabezeichen
|
||
CHAR_NL = $0D 'newline
|
||
CHAR_SPACE = $20 'leerzeichen
|
||
CHAR_BS = $C8 'tastaturcode backspace
|
||
CHAR_TER_BS = $102 'terminalcode backspace
|
||
|
||
KEY_CTRL = $02
|
||
KEY_ALT = $04
|
||
KEY_OS = $08
|
||
|
||
'systemvariablen
|
||
LOADERPTR = $0FFFFB '1 Byte 'eram-adresse mit pointer auf loader-register
|
||
MAGIC = $0FFFFA '1 Byte 'Warmstartflag
|
||
SIFLAG = $0FFFF9 '1 byte 'screeninit-flag
|
||
BELDRIVE = $0FFFED '12 Byte 'Dateiname aktueller Grafiktreiber
|
||
PARAM = $0FFFAD '64 Byte 'Parameterstring
|
||
SYSVAR = $0FFFAC 'Adresse des obersten freien Bytes
|
||
|
||
|
||
CNT_HBEAT = 5_000_0000 'blinkgeschw. front-led
|
||
DB_IN = %00000111_11111111_11111111_00000000 'maske: dbus-eingabe
|
||
DB_OUT = %00000111_11111111_11111111_11111111 'maske: dbus-ausgabe
|
||
|
||
OS_TIBLEN = 64 'größe des inputbuffers
|
||
ERAM = 1024 * 512 * 2 'größe eram
|
||
HRAM = 1024 * 32 'größe hram
|
||
|
||
RMON_ZEILEN = 16 'speichermonitor - angezeigte zeilen
|
||
RMON_BYTES = 8 'speichermonitor - zeichen pro byte
|
||
|
||
'sdcard-funktionen
|
||
#0, OPT
|
||
SD_MOUNT
|
||
SD_DIROPEN
|
||
SD_NEXTFILE
|
||
SD_OPEN
|
||
SD_CLOSE
|
||
SD_GETC
|
||
SD_PUTC
|
||
SD_READ
|
||
SD_WRITE
|
||
SD_EOF
|
||
SD_SEEK
|
||
SD_FATTRIB
|
||
SD_FTIME
|
||
SD_FSIZE
|
||
|
||
'screeninterface
|
||
#50, SCR_OPEN 'containerdatei öffnen
|
||
SCR_FILL 'screenpuffer mit zeichen füllen
|
||
SCR_READ 'screen in den puffer laden
|
||
SCR_WRITE 'screen auf disk schreiben
|
||
SCR_GETNR 'nummer des aktuellen screens abfragen
|
||
SCR_SETPOS 'zeiger auf position im puffer setzen
|
||
SCR_GETPOS 'aktuelle position im puffer abfragen
|
||
SCR_GETC 'zeichen wird aus dem puffer gelesen
|
||
SCR_PUTC 'zeichen wird in den puffer geschrieben
|
||
SCR_FLUSH 'aktuellen puffer auf disk schreiben
|
||
SCR_ERR 'fehlerstatus abfragen
|
||
SCR_MAXSCR 'anzahl screens des containers abfragen
|
||
|
||
'hss-funktionen
|
||
#100, CHSS_LOAD
|
||
CHSS_PLAY
|
||
CHSS_STOP
|
||
CHSS_PAUSE
|
||
CHSS_PEEK
|
||
CHSS_INTREG
|
||
CHSS_VOL
|
||
CSFX_FIRE
|
||
CSFX_SETSLOT
|
||
|
||
'interface zum hss-player
|
||
#0, iEndFlag 'Repeat oder Ende wurde erreicht
|
||
iRowFlag 'Flag das Songzeile fertig ist
|
||
iEngineC 'Patternzähler
|
||
iBeatC 'Beatzähler
|
||
iRepeat 'zähler für loops
|
||
#5, iChannel
|
||
#5, iChannel1
|
||
#10, iChannel2
|
||
#15, iChannel3
|
||
#20, iChannel4
|
||
#0, iNote
|
||
iOktave
|
||
iVolume
|
||
iEffekt
|
||
iInstrument
|
||
|
||
VAR
|
||
long lflagadr 'adresse des loaderflag
|
||
byte dname[16] 'puffer für dateiname
|
||
byte parapos 'position im parameterstring
|
||
|
||
PUB start: wflag | n 'system: initialisiert system
|
||
{{start - initialisiert das grundsystem
|
||
wflag == 1 --> warmstart}}
|
||
bus_init 'bus initialisieren
|
||
lflagadr := rd_long(LOADERPTR) 'adresse der loader-register setzen
|
||
n := ram_read(MAGIC)
|
||
if n <> 235
|
||
ram_write(235,MAGIC) 'warmstartflag
|
||
return 0
|
||
elseif n == 235
|
||
return 1
|
||
|
||
PUB startram 'system: initialisierung des systems bei ram-upload
|
||
{{startram - wenn man zu testzwecken das programm direkt in den ram überträgt und startet, bekommen alle Props
|
||
ein reset, wodurch bellatrix auf einen treiber wartet. für testzwecke erledigt diese routine den upload des
|
||
standard-vga-treibers. wird aus dem programm später eine bin-datei generiert, welche über den loader gestartet wird
|
||
sollte diese routine auskommentiert werden.}}
|
||
|
||
waitcnt(cnt + 50_000_000) 'warte auf administra
|
||
sdmount 'sd-karte mounten
|
||
bload(string("vga.bin")) 'vga-treiber zu bellatrix übertragen
|
||
waitcnt(cnt + 50_000_000) 'warte bis treiber initialisiert ist
|
||
|
||
PUB paraset(stradr) | i,c 'system: parameterbereich beschreiben
|
||
{{paraset(stradr) - system: ein 0-term-string wird von stradr in den parameterbereich kopiert}}
|
||
|
||
paradel
|
||
repeat i from 0 to 63 ' puffer ist mx. 64 zeichen lang
|
||
c := byte[stradr+i]
|
||
ram_write(c,PARAM+i)
|
||
if c == 0 'bei stringende vorzeitig beenden
|
||
return
|
||
|
||
PUB parastart 'system: setzt den zeiger auf parameteranfangsposition
|
||
{{parastart - setzt den zeiger auf parameteranfangsposition}}
|
||
parapos := 0
|
||
|
||
PUB paradel | i 'system: parameterbereich löschen
|
||
{{paradel - system: parameterbereich löschen}}
|
||
|
||
repeat i from 0 to 63
|
||
ram_write(0,PARAM+i)
|
||
|
||
PUB paranext(stradr): err | i,c 'system: überträgt den nächsten parameter in stringdatei
|
||
{{paranext(stradr) - system: überträgt den nächsten parameter in stringdatei
|
||
rückgabewert 0 --> kein weiterer parameter
|
||
>0 --> parameter gültig}}
|
||
|
||
if ram_read(PARAM+parapos) <> 0 'stringende?
|
||
repeat until ram_read(PARAM+parapos) > CHAR_SPACE 'führende leerzeichen ausblenden
|
||
parapos++
|
||
|
||
i := 0
|
||
repeat 'nächsten string kopieren
|
||
c := ram_read(PARAM + parapos)
|
||
byte[stradr + i] := c
|
||
parapos++
|
||
i++
|
||
byte[stradr + i] := 0 'string abschließen
|
||
until (c == CHAR_SPACE) or (c == 0)
|
||
return 1
|
||
else
|
||
return 0
|
||
|
||
PUB bload(stradr) | n,rc,ii,plen 'system: bellatrix mit grafiktreiber initialisieren
|
||
{{bload(stradr) - bellatrix mit grafiktreiber initialisieren
|
||
stradr - adresse eines 0-term-strings mit dem dateinamen des bellatrixtreibers
|
||
}}
|
||
|
||
' kopf der bin-datei einlesen ------------------------------------------------------
|
||
rc := sdopen("r",stradr) 'datei öffnen
|
||
repeat ii from 0 to 15 '16 bytes header --> bellatrix
|
||
n := sdgetc
|
||
bus_putchar2(n)
|
||
sdclose 'bin-datei schießen
|
||
|
||
' objektgröße empfangen
|
||
plen := bus_getchar2 << 8 'hsb empfangen
|
||
plen := plen + bus_getchar2 'lsb empfangen
|
||
|
||
' bin-datei einlesen ------------------------------------------------------
|
||
sdopen("r",stradr) 'bin-datei öffnen
|
||
repeat ii from 0 to plen-1 'datei --> bellatrix
|
||
n := sdgetc
|
||
bus_putchar2(n)
|
||
sdclose
|
||
|
||
PUB breset 'system: bellatrix neu starten
|
||
{{breset - bellatrix neu starten}}
|
||
bus_putchar2($0) 'kommandosequenz einleiten
|
||
bus_putchar2(99) 'code 99 = reboot
|
||
|
||
PUB stop 'loader: beendet anwendung und startet os
|
||
{{stop - beendet anwendung und startet os}}
|
||
sdmount
|
||
ldbin(@sysbin)
|
||
|
||
PUB ldsys 'loader: startet sys.bin
|
||
{{ldsys - loader: startet sys.bin}}
|
||
ldbin(@sysbin)
|
||
|
||
PUB ldbin(stradr) | len,i,stradr1,stradr2 'loader: startet bin-datei über loader
|
||
{{ldbin - loader: startet bin-datei über loader}}
|
||
|
||
len := strsize(stradr)
|
||
stradr2 := lflagadr + 1
|
||
repeat i from 0 to len - 1 'string in loadervariable kopieren
|
||
byte[stradr2][i] := byte[stradr][i]
|
||
byte[stradr2][++i] := 0 'string abschließen
|
||
byte[lflagadr][0] := 1 'loader starten
|
||
|
||
|
||
PUB sdmount | err 'sd-card: mounten
|
||
{{sdmount - sd-card: mounten}}
|
||
bus_putchar1(SD_MOUNT)
|
||
err := bus_getchar1
|
||
if err > 0
|
||
print(string("Status : "))
|
||
printdec(err)
|
||
print(string(" = "))
|
||
case err
|
||
1: print(@sderr1)
|
||
2: print(@sderr2)
|
||
3: print(@sderr3)
|
||
4: print(@sderr4)
|
||
5: print(@sderr5)
|
||
6: print(@sderr6)
|
||
printchar(char_nl)
|
||
|
||
PUB sdclose:err 'sd-card: datei schließen
|
||
{{sdclose - sd-card: datei schließen}}
|
||
bus_putchar1(SD_CLOSE)
|
||
err := bus_getchar1
|
||
|
||
PUB sdopen(modus,stradr):err | len,i 'sd-card: datei öffnen
|
||
{{sdopen(modus,stradr) - sd-card: datei öffnen}}
|
||
bus_putchar1(SD_OPEN)
|
||
bus_putchar1(modus)
|
||
len := strsize(stradr)
|
||
bus_putchar1(len)
|
||
repeat i from 0 to len - 1
|
||
bus_putchar1(byte[stradr++])
|
||
err := bus_getchar1
|
||
|
||
PUB sdgetc: char 'sd-card: zeichen aus datei lesen
|
||
{{sdgetc: char - sd-card: zeichen aus datei lesen}}
|
||
bus_putchar1(SD_GETC)
|
||
char := bus_getchar1
|
||
|
||
PUB sdputc(char) 'sd-card: zeichen in datei schreiben
|
||
{{sdputc(char) - sd-card: zeichen in datei schreiben}}
|
||
bus_putchar1(SD_PUTC)
|
||
bus_putchar1(char)
|
||
|
||
PUB sddir 'sd-card: verzeichnis wird geöffnet
|
||
{{sddir - sd-card: directory wird geöffnet}}
|
||
bus_putchar1(SD_DIROPEN)
|
||
|
||
PUB sdnext: stradr | flag,len,i 'sd-card: nächster dateiname aus verzeichnis
|
||
{{sdnext - sd-card: nächster dateiname aus verzeichnis
|
||
stradr: zeiger auf dateiname oder 0}}
|
||
|
||
bus_putchar1(SD_NEXTFILE) 'kommando: nächsten eintrag holen
|
||
flag := bus_getchar1 'flag empfangen
|
||
len := bus_getchar1 'längenbyte empfangen
|
||
if flag == 0 'ist eintrag gültig?
|
||
repeat i from 0 to len - 1 '20 zeichen dateinamen empfangen
|
||
dname[i] := bus_getchar1
|
||
dname[i] := 0
|
||
return @dname
|
||
return 0
|
||
|
||
PUB sdeof: fl_eof 'sd-card: eof-flag abfragen
|
||
{{sdeof: fl_eof - sd-card: eof-flag abfragen}}
|
||
bus_putchar1(SD_EOF)
|
||
fl_eof := bus_getchar1
|
||
return fl_eof
|
||
|
||
PUB sdseek(wert) 'sd-card: zeiger auf byteposition setzen
|
||
{{sdseek(wert) - sd-card: zeiger auf byteposition setzen}}
|
||
bus_putchar1(SD_SEEK)
|
||
bus_putchar1(wert >> 24) '32bit wert senden hsb/lsb
|
||
bus_putchar1(wert >> 16)
|
||
bus_putchar1(wert >> 8)
|
||
bus_putchar1(wert)
|
||
|
||
|
||
PUB sdfattrib: attrib | wert 'sd-card: dateiattribute abfragen
|
||
{{sdfattrib: attrib - sd-card: dateiattribute nach next abfragen}}
|
||
bus_putchar1(SD_FATTRIB)
|
||
wert := bus_getchar1 ' 1 byte attribute
|
||
return
|
||
|
||
PUB sdftime: ftime | wert 'sd-card: zeitstempel abfragen
|
||
{{sdftime: ftime - sd-card: zeitstempel abfragen}}
|
||
bus_putchar1(SD_FTIME)
|
||
wert := bus_getchar1 << 24 '32 bit empfangen hsb/lsb
|
||
wert := wert + bus_getchar1 << 16
|
||
wert := wert + bus_getchar1 << 8
|
||
wert := wert + bus_getchar1
|
||
return wert
|
||
|
||
PUB sdfsize: fsize | wert 'sd-card: dateigröße abfragen
|
||
{{sdfsize: fsize - sd-card: dateigröße abfragen}}
|
||
bus_putchar1(SD_FSIZE)
|
||
wert := bus_getchar1 << 24 '32 bit empfangen hsb/lsb
|
||
wert := wert + bus_getchar1 << 16
|
||
wert := wert + bus_getchar1 << 8
|
||
wert := wert + bus_getchar1
|
||
return wert
|
||
|
||
PUB si_open(stradr): err | len,i 'scr: containerdatei öffnen
|
||
bus_putchar1(SCR_OPEN)
|
||
len := strsize(stradr) 'längenbyte senden
|
||
bus_putchar1(len)
|
||
repeat i from 0 to len - 1 'string senden
|
||
bus_putchar1(byte[stradr++])
|
||
err := bus_getchar1 'fehlernummer empfangen
|
||
|
||
PUB si_fill(char) 'scr: screenpuffer mit zeichen füllen
|
||
bus_putchar1(SCR_FILL)
|
||
bus_putchar1(char)
|
||
|
||
PUB si_read(snr) 'scr: screen in den puffer laden
|
||
bus_putchar1(SCR_READ)
|
||
bus_putchar1(snr >> 8) '16 bit screennummer senden hsb/lsb
|
||
bus_putchar1(snr)
|
||
|
||
PUB si_write(snr) 'scr: screen auf disk schreiben
|
||
bus_putchar1(SCR_WRITE)
|
||
bus_putchar1(snr >> 8) '16 bit screennummer senden hsb/lsb
|
||
bus_putchar1(snr)
|
||
|
||
PUB si_getnr: snr 'scr: nummer des aktuellen screens abfragen
|
||
bus_putchar1(SCR_GETNR)
|
||
snr := bus_getchar1 << 8 '16 bit screennummer empfangen hsb/lsb
|
||
snr += bus_getchar1
|
||
|
||
PUB si_setpos(pos) 'scr: zeiger auf position im puffer setzen
|
||
bus_putchar1(SCR_SETPOS)
|
||
bus_putchar1(pos >> 8) '16 bit pufferposition senden hsb/lsb
|
||
bus_putchar1(pos)
|
||
|
||
PUB si_getpos: pos 'scr: aktuelle position im puffer abfragen
|
||
bus_putchar1(SCR_GETPOS)
|
||
pos := bus_getchar1 << 8 '16 bit position empfangen hsb/lsb
|
||
pos += bus_getchar1
|
||
|
||
PUB si_getc: char 'scr: zeichen wird aus dem puffer gelesen
|
||
bus_putchar1(SCR_GETC)
|
||
char := bus_getchar1
|
||
|
||
PUB si_putc(char) 'scr: zeichen wird in den puffer geschrieben
|
||
bus_putchar1(SCR_PUTC)
|
||
bus_putchar1(char)
|
||
|
||
PUB si_flush 'scr: aktuellen puffer auf disk schreiben
|
||
bus_putchar1(SCR_FLUSH)
|
||
|
||
|
||
PUB si_err: err 'scr: fehlerstatus abfragen
|
||
bus_putchar1(SCR_ERR)
|
||
err := bus_getchar1
|
||
|
||
PUB si_maxscr: snr 'scr: anzahl der screens des containers abfragen
|
||
bus_putchar1(SCR_MAXSCR)
|
||
snr := bus_getchar1 << 8 '16 bit screennummer empfangen hsb/lsb
|
||
snr += bus_getchar1
|
||
|
||
PUB hss_playfile(stradr) | status 'hss: spielt übergebene hss-datei von sd-card
|
||
status := hss_load(stradr)
|
||
if status > 0
|
||
print(string("Status : "))
|
||
printdec(status)
|
||
printnl
|
||
hss_play
|
||
|
||
PUB hss_stop 'hss: stopt aktuellen song
|
||
bus_putchar1(CHSS_STOP)
|
||
|
||
PUB hss_pause 'hss: pausiert aktuellen song
|
||
bus_putchar1(CHSS_PAUSE)
|
||
|
||
PUB hss_load(stradr): status | len,i 'hss: lädt hss-datei von sd-card in songpuffer
|
||
bus_putchar1(CHSS_LOAD)
|
||
len := strsize(stradr)
|
||
bus_putchar1(len)
|
||
repeat i from 0 to len - 1
|
||
bus_putchar1(byte[stradr++])
|
||
status := bus_getchar1
|
||
|
||
PUB hss_play 'hss: spielt song im puffer ab
|
||
bus_putchar1(CHSS_PLAY)
|
||
|
||
PUB hss_vol(vol) 'hss: volume einstellen 0..15
|
||
bus_putchar1(CHSS_VOL)
|
||
bus_putchar1(vol)
|
||
|
||
PUB hss_peek(n): wert 'hss: registerwert auslesen
|
||
bus_putchar1(CHSS_PEEK) 'kommando peek senden
|
||
bus_putchar1(n) 'kommando peek senden
|
||
wert := bus_getchar1 '32-bit-wert lesen
|
||
wert := (wert<<8) + bus_getchar1
|
||
wert := (wert<<8) + bus_getchar1
|
||
wert := (wert<<8) + bus_getchar1
|
||
|
||
PUB hss_intreg(n): wert 'hss: interfaceregister auslesen
|
||
bus_putchar1(CHSS_INTREG) 'kommando peek senden
|
||
bus_putchar1(n) 'kommando peek senden
|
||
wert := bus_getchar1 '16-bit-wert lesen
|
||
wert := (wert<<8) + bus_getchar1
|
||
|
||
PUB sfx_setslot(adr,slot) | i,n 'sfx: sendet sfx-daten in sfx-slot
|
||
bus_putchar1(CSFX_SETSLOT)
|
||
bus_putchar1(slot) 'slotnummer senden
|
||
repeat i from 0 to 31 '32 byte sfx-daten senden
|
||
n := ram_read(adr + i)
|
||
bus_putchar1(n)
|
||
|
||
PUB sfx_fire(slot,chan) 'sfx: triggert einen bestimmten soundeffekt
|
||
bus_putchar1(CSFX_FIRE)
|
||
bus_putchar1(slot) 'slotnummer senden
|
||
bus_putchar1(chan) 'channel senden
|
||
|
||
PUB ram_read(adresse):wert 'eram: liest ein byte vom eram
|
||
{{ram_read(adresse):wert - eram: ein byte aus externem ram lesen}}
|
||
'rambank 1 000000 - 07FFFF
|
||
'rambank 2 080000 - 08FFFF
|
||
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
|
||
outa[23] := 1 'obere adresse in adresslatch übernehmen
|
||
outa[23] := 0
|
||
outa[18..8] := adresse 'niederwertige adresse setzen
|
||
if adresse < $080000 'rambank 1?
|
||
outa[reg_ram1] := 0 'ram1 selektieren (wert wird geschrieben)
|
||
wert := ina[7..0] 'speicherzelle einlesen
|
||
outa[reg_ram1] := 1 'ram1 deselektieren
|
||
else
|
||
outa[reg_ram2] := 0 'ram2 selektieren (wert wird geschrieben)
|
||
wert := ina[7..0] 'speicherzelle einlesen
|
||
outa[reg_ram2] := 1 'ram2 deselektieren
|
||
|
||
PUB ram_write(wert,adresse) 'eram: schreibt ein byte in eram
|
||
{{ram_write(wert,adresse) - eram: ein byte in externen ram schreiben}}
|
||
'rambank 1 000000 - 07FFFF
|
||
'rambank 2 080000 - 08FFFF
|
||
outa[bus_wr] := 0 'schreiben aktivieren
|
||
dira := db_out 'datenbus --> ausgang
|
||
outa[7..0] := wert 'wert --> datenbus
|
||
outa[15..8] := adresse >> 11 'höherwertige adresse setzen
|
||
outa[23] := 1 'obere adresse in adresslatch übernehmen
|
||
outa[23] := 0
|
||
outa[18..8] := adresse 'niederwertige adresse setzen
|
||
if adresse < $080000 'rambank 1?
|
||
outa[reg_ram1] := 0 'ram1 selektieren (wert wird geschrieben)
|
||
outa[reg_ram1] := 1 'ram1 deselektieren
|
||
else
|
||
outa[reg_ram2] := 0 'ram2 selektieren (wert wird geschrieben)
|
||
outa[reg_ram2] := 1 'ram2 deselektieren
|
||
dira := db_in 'datenbus --> eingang
|
||
outa[bus_wr] := 1 'schreiben deaktivieren
|
||
|
||
PUB rd_long(eadr): wert 'eram: liest long ab eadr
|
||
{{rd_long - eram: liest long ab eadr}}
|
||
wert := ram_read(eadr)
|
||
wert += ram_read(eadr + 1) << 8
|
||
wert += ram_read(eadr + 2) << 16
|
||
wert += ram_read(eadr + 3) << 24
|
||
|
||
PUB rd_word(eadr): wert 'eram: liest word ab eadr
|
||
{{rd_long(eadr):wert - eram: liest word ab eadr}}
|
||
wert := ram_read(eadr)
|
||
wert += ram_read(eadr + 1) << 8
|
||
|
||
PUB wr_long(wert,eadr) | n 'eram: schreibt long ab eadr
|
||
{{wr_long(wert,eadr) - eram: schreibt long ab eadr}}
|
||
n := wert & $FF
|
||
ram_write(n,eadr)
|
||
n := (wert >> 8) & $FF
|
||
ram_write(n,eadr + 1)
|
||
n := (wert >> 16) & $FF
|
||
ram_write(n,eadr + 2)
|
||
n := (wert >> 24) & $FF
|
||
ram_write(n,eadr + 3)
|
||
|
||
PUB wr_word(wert,eadr) | n 'eram: schreibt word ab eadr
|
||
{{wr_word(wert,eadr) - eram: schreibt word ab eadr}}
|
||
n := wert & $FF
|
||
ram_write(n,eadr)
|
||
n := (wert >> 8) & $FF
|
||
ram_write(n,eadr + 1)
|
||
|
||
PUB key:wert 'key: holt tastaturcode
|
||
{{key:wert - key: übergibt tastaturwert}}
|
||
bus_putchar2($0) 'kommandosequenz einleiten
|
||
bus_putchar2($2) 'code 2 = tastenwert holen
|
||
wert := bus_getchar2 'tastenwert empfangen
|
||
|
||
PUB keyspec:wert 'key: statustasten zum letzten tastencode
|
||
bus_putchar2($0) 'kommandosequenz einleiten
|
||
bus_putchar2($4) 'code 2 = tastenwert holen
|
||
wert := bus_getchar2 'wert empfangen
|
||
|
||
|
||
PUB keystat:status 'key: übergibt tastaturstatus
|
||
{{keystat:status - key: übergibt tastaturstatus}}
|
||
bus_putchar2($0) 'kommandosequenz einleiten
|
||
bus_putchar2($1) 'code 1 = tastaturstatus
|
||
status := bus_getchar2 'statuswert empfangen
|
||
|
||
PUB keywait:n 'key: wartet bis taste gedrückt wird
|
||
{{keywait: n - key: wartet bis eine taste gedrückt wurde}}
|
||
repeat
|
||
until keystat > 0
|
||
return key
|
||
|
||
PUB input(stradr,anz) | curpos,i,n 'key: stringeingabe
|
||
{{input(stradr,anz) - key: stringeingabe}}
|
||
|
||
curpos := curgetx 'cursorposition merken
|
||
i := 0
|
||
repeat
|
||
n := keywait 'auf taste warten
|
||
if n == $0d
|
||
quit
|
||
if (n == CHAR_BS)&(i>0) 'backspace
|
||
printctrl(CHAR_TER_BS)
|
||
i--
|
||
byte[stradr][i] := 0
|
||
elseif i < anz 'normales zeichen
|
||
printchar(n)
|
||
byte[stradr][i] := n
|
||
i++
|
||
byte[stradr][i] := 0
|
||
|
||
PUB print(stringptr) 'screen: bildschirmausgabe einer zeichenkette (0-terminiert)
|
||
{{print(stringptr) - screen: bildschirmausgabe einer zeichenkette (0-terminiert)}}
|
||
repeat strsize(stringptr)
|
||
bus_putchar2(byte[stringptr++])
|
||
|
||
PUB printcstr(eadr) | i,len 'screen: bildschirmausgabe einer zeichenkette im eram! (mit längenbyte)
|
||
{{printcstr(eadr) - screen: bildschirmausgabe einer zeichenkette im eram (mit längenbyte)}}
|
||
len := ram_read(eadr)
|
||
repeat i from 1 to len
|
||
eadr++
|
||
bus_putchar2(ram_read(eadr))
|
||
|
||
|
||
PUB printdec(value) | i 'screen: dezimalen zahlenwert auf bildschirm ausgeben
|
||
{{printdec(value) - screen: dezimale bildschirmausgabe zahlenwertes}}
|
||
if value < 0 'negativer zahlenwert
|
||
-value
|
||
printchar("-")
|
||
i := 1_000_000_000
|
||
repeat 10 'zahl zerlegen
|
||
if value => i
|
||
printchar(value / i + "0")
|
||
value //= i
|
||
result~~
|
||
elseif result or i == 1
|
||
bus_putchar2("0")
|
||
i /= 10 'nächste stelle
|
||
|
||
PUB printhex(value, digits) 'screen: hexadezimalen zahlenwert auf bildschirm ausgeben
|
||
{{hex(value,digits) - screen: hexadezimale bildschirmausgabe eines zahlenwertes}}
|
||
value <<= (8 - digits) << 2
|
||
repeat digits
|
||
printchar(lookupz((value <-= 4) & $F : "0".."9", "A".."F"))
|
||
|
||
PUB printchar(c) 'screen: einzelnes zeichen auf bildschirm ausgeben
|
||
{{printchar(c) - screen: bildschirmausgabe eines zeichens}}
|
||
bus_putchar2(c)
|
||
|
||
PUB printctrl(c) 'screen: steuerzeichen ($100 bis $1FF) auf bildschirm ausgeben
|
||
{{printctrl(c) - screen: steuerzeichen von $100 bis $1FF wird an terminal gesendet}}
|
||
bus_putchar2($0) 'kommandosequenz einleiten
|
||
bus_putchar2($3) 'code 3 = sonderzeichen senden
|
||
bus_putchar2(c & $0FF) 'unteres byte senden '
|
||
|
||
PUB printnl 'screen: $0D - CR ausgeben
|
||
{{printnl - screen: $0D - CR ausgeben}}
|
||
bus_putchar2(CHAR_NL)
|
||
|
||
PUB printcls 'screen: screen löschen
|
||
{{printcls - screen: screen löschen}}
|
||
printctrl($00)
|
||
|
||
PUB curhome 'screen: cursorposition auf erste position setzen
|
||
{{curhome - screen: cursorposition auf erste position setzen}}
|
||
printctrl($01)
|
||
|
||
PUB printtab 'screen: zur nächsten tabulatorposition
|
||
{{printtab - screen: zur nächsten tabulatorposition}}
|
||
printctrl($03)
|
||
|
||
PUB curchar(char) 'screen: setzt cursorzeichen
|
||
{{curchar - screen: setzt cursorzeichen}}
|
||
printctrl($04)
|
||
bus_putchar2(char)
|
||
|
||
PUB curpos1 'screen: setzt cursor auf spalte 1 in zeile
|
||
{{curpos1 - screen: setzt cursor auf spalte 1 in zeile}}
|
||
printctrl($05)
|
||
|
||
PUB cursetx(x) 'screen: setzt cursorposition auf x
|
||
{{cursetx - screen: setzt cursorposition auf x}}
|
||
printctrl($06)
|
||
bus_putchar2(x)
|
||
|
||
PUB cursety(y) 'screen: setzt cursorposition auf y
|
||
{{cursety - screen: setzt cursorposition auf y}}
|
||
printctrl($07)
|
||
bus_putchar2(y)
|
||
|
||
PUB curgetx: x 'screen: abfrage x-position cursor
|
||
{{curgetx: x - 'screen: abfrage x-position cursor}}
|
||
printctrl($08)
|
||
return bus_getchar2
|
||
|
||
PUB curgety: y 'screen: abfrage y-position cursor
|
||
{{curgetx: y - 'screen: abfrage y-position cursor}}
|
||
printctrl($09)
|
||
return bus_getchar2
|
||
|
||
PUB setcolor(color) 'screen: farbe setzen
|
||
{{setcolor(color) - screen: setzt farbwert}}
|
||
printctrl($10)
|
||
bus_putchar2(color)
|
||
|
||
PUB curon 'screen: schaltet cursor an
|
||
{{curon - screen: schaltet cursor an}}
|
||
printctrl($14)
|
||
|
||
PUB curoff 'screen: schaltet cursor aus
|
||
{{curon - screen: schaltet cursor aus}}
|
||
printctrl($15)
|
||
|
||
PUB sline(n) 'screen: startzeile scrollbereich setzen
|
||
{{sline(n) - startzeile scrollbereich setzen}}
|
||
printctrl($11)
|
||
bus_putchar2(n)
|
||
|
||
PUB scrollup 'screen: scrollt screen eine zeile hoch
|
||
{{scrollup - screen: scrollt screen eine zeile hoch}}
|
||
printctrl($16)
|
||
|
||
PUB scrolldown 'screen: scrollt screen eine zeile runter
|
||
{{scrolldown - screen: scrollt screen eine zeile runter}}
|
||
printctrl($17)
|
||
|
||
PUB screeninit(stradr,n) 'screen: löschen, kopfzeile ausgeben und setzen
|
||
{{screeninit(stradr,n) - screen löschen, kopfzeile ausgeben und setzen}}
|
||
curoff
|
||
printctrl($13)
|
||
print(stradr)
|
||
printnl
|
||
sline(n)
|
||
curon
|
||
curhome
|
||
ram_write(0,SIFLAG)
|
||
|
||
PUB bus_init 'bus: initialisiert bussystem
|
||
{{bus_init - bus: initialisierung aller bussignale }}
|
||
dira := db_in ' datenbus auf eingabe schalten
|
||
outa[18..8] := 0 ' adresse a0..a10 auf 0 setzen
|
||
outa[23] := 1 ' obere adresse in adresslatch übernehmen
|
||
outa[23] := 0
|
||
outa[reg_ram1] := 1 ' ram1 inaktiv
|
||
outa[reg_ram2] := 1 ' ram2 inaktiv
|
||
outa[reg_prop1] := 1 ' prop1 inaktiv
|
||
outa[reg_prop2] := 1 ' prop2 inaktiv
|
||
outa[busclk] := 0 ' busclk startwert
|
||
outa[bus_wr] := 1 ' schreiben inaktiv
|
||
outa[reg_al] := 0 ' strobe aus
|
||
|
||
PUB bus_putchar1(c) 'bus: byte an prop2 (administra) senden
|
||
{{bus_putchar1(c) - bus: byte senden an prop1 (administra)}}
|
||
outa := %00001000_01011000_00000000_00000000 'prop2=0, wr=0
|
||
dira := db_out 'datenbus auf ausgabe stellen
|
||
outa[7..0] := c 'daten --> dbus
|
||
outa[busclk] := 1 'busclk=1
|
||
waitpeq(%00000000_00000000_00000000_00000000,%00001000_00000000_00000000_00000000,0) 'hs=0?
|
||
dira := db_in 'bus freigeben
|
||
outa := %00001100_01111000_00000000_00000000 'wr=1, prop2=1, busclk=0
|
||
|
||
PUB bus_getchar1:wert 'bus: byte vom prop2 (administra) empfangen
|
||
{{bus_getchar1:wert - bus: byte empfangen von prop1 (administra)}}
|
||
outa := %00000110_01011000_00000000_00000000 'prop2=0, wr=1, busclk=1
|
||
waitpeq(%00000000_00000000_00000000_00000000,%00001000_00000000_00000000_00000000,0) 'hs=0?
|
||
wert := ina[7..0] 'daten einlesen
|
||
outa := %00000100_01111000_00000000_00000000 'prop2=1, busclk=0
|
||
|
||
PUB bus_putchar2(c) 'bus: byte an prop2 (bellatrix) senden
|
||
{{bus_putchar2(c) - bus: byte senden an prop2 (bellatrix)}}
|
||
outa := %00001000_00111000_00000000_00000000 'prop2=0, wr=0
|
||
dira := db_out 'datenbus auf ausgabe stellen
|
||
outa[7..0] := c 'daten --> dbus
|
||
outa[busclk] := 1 'busclk=1
|
||
waitpeq(%00000000_00000000_00000000_00000000,%00001000_00000000_00000000_00000000,0) 'hs=0?
|
||
dira := db_in 'bus freigeben
|
||
outa := %00001100_01111000_00000000_00000000 'wr=1, prop2=1, busclk=0
|
||
|
||
PUB bus_getchar2:wert 'bus: byte vom prop2 (bellatrix) empfangen
|
||
{{bus_getchar2:wert - bus: byte empfangen von prop2 (bellatrix)}}
|
||
outa := %00000110_00111000_00000000_00000000 'prop2=0, wr=1, busclk=1
|
||
waitpeq(%00000000_00000000_00000000_00000000,%00001000_00000000_00000000_00000000,0) 'hs=0?
|
||
wert := ina[7..0] 'daten einlesen
|
||
outa := %00000100_01111000_00000000_00000000 'prop2=1, busclk=0
|
||
|
||
DAT
|
||
|
||
sderr0 byte " OK ",0
|
||
sderr1 byte " Kein FAT1-Volume! ",0
|
||
sderr2 byte " Falsche Sektorgröße! ",0
|
||
sderr3 byte " Falsche Clustergröße! ",0
|
||
sderr4 byte " Nicht zwei FAT´s! ",0
|
||
sderr5 byte " Falsche FAT-Signatur! ",0
|
||
sderr6 byte " Zu viele Cluster! ",0
|
||
sysbin byte "sys.bin",0
|
||
|