TriOS/system/regnatix/perplex.spin

496 lines
14 KiB
Plaintext

{{
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Autor: Ingo Kripahle │
│ Copyright (c) 2010 Ingo Kripahle │
│ See end of file for terms of use. │
│ Die Nutzungsbedingungen befinden sich am Ende der Datei │
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘
Informationen : hive-project.de
Kontakt : drohne235@googlemail.com
System : TriOS
Name : blexbus-tool
Chip : Regnatix
Typ : Programm
Version :
Subversion :
Logbuch :
31-10-2013-dr235 - erste version
Kommandoliste:
Notizen:
}}
OBJ
ios: "reg-ios"
num: "glob-numbers"
CON
_CLKMODE = XTAL1 + PLL16X
_XINFREQ = 5_000_000
OS_TIBLEN = 64 'gr??e des inputbuffers
VAR
'systemvariablen
byte tib[OS_TIBLEN] 'tastatur-input-buffer
byte cmdstr[OS_TIBLEN] 'kommandostring f?r interpreter
byte token1[OS_TIBLEN] 'parameterstring 1 für interpreter
byte token2[OS_TIBLEN] 'parameterstring 2 für interpreter
byte tibpos 'aktuelle position im tib
long ppos 'puffer für adresse
long pcnt 'puffer für zeilenzahl
byte device 'adresse des geöffneten devices
byte polling 'status polling
byte open 'status device
PUB main | wflag
ios.start 'ios initialisieren
polling := 1
ios.plxRun
ios.printnl
' ios.print(string("Perplex - PlexBus-Tool - DR235",$0d,$0d))
repeat
os_cmdinput 'kommandoeingabe
os_cmdint 'kommandozeileninterpreter
PUB os_cmdinput | charc 'sys: stringeingabe eine zeile
''funktionsgruppe : sys
''funktion : stringeingabe eine zeile
''eingabe : -
''ausgabe : -
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
ios.print(@prompt2)
tibpos := 0 'tibposition auf anfang setzen
repeat until (charc := ios.keywait) == $0D 'tasten einlesen bis return
if (tibpos + 1) < OS_TIBLEN 'zeile noch nicht zu lang?
case charc
ios#CHAR_BS: 'backspace
if tibpos > 0 'noch nicht anfang der zeile erreeicht?
tib[tibpos--] := 0 'ein zeichen aus puffer entfernen
ios.printbs 'backspace an terminal senden
other: 'zeicheneingabe
tib[tibpos++] := charc 'zeichen speichern
ios.printchar(charc) 'zeichen ausgeben
ios.printnl
tib[tibpos] := 0 'string abschließen
tibpos := charc := 0 'werte rücksetzen
PUB os_nxtoken1: stradr 'sys: token 1 von tib einlesen
''funktionsgruppe : sys
''funktion : nächsten token im eingabestring suchen und stringzeiger übergeben
''eingabe : -
''ausgabe : stradr - adresse auf einen string mit dem gefundenen token
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
'' : token - tokenstring
stradr := os_tokenize(@token1)
PUB os_nxtoken2: stradr 'sys: token 2 von tib einlesen
''funktionsgruppe : sys
''funktion : nächsten token im eingabestring suchen und stringzeiger übergeben
''eingabe : -
''ausgabe : stradr - adresse auf einen string mit dem gefundenen token
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
'' : token - tokenstring
stradr := os_tokenize(@token2)
PUB os_tokenize(token):stradr | i 'sys: liest nächsten token aus tib
i := 0
if tib[tibpos] <> 0 'abbruch bei leerem string
repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden
tibpos++
repeat until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende
byte[token][i] := tib[tibpos]
tibpos++
i++
else
token := 0
byte[token][i] := 0
stradr := token
PUB os_nextpos: tibpos2 'sys: setzt zeiger auf nächste position
''funktionsgruppe : sys
''funktion : tibpos auf nächstes token setzen
''eingabe : -
''ausgabe : tibpos2 - position des nächsten tokens in tib
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
if tib[tibpos] <> 0
repeat until tib[tibpos] > ios#CHAR_SPACE 'führende leerzeichen ausbenden
tibpos++
return tibpos
PUB os_cmdint 'sys: kommandointerpreter
''funktionsgruppe : sys
''funktion : kommandointerpreter; zeichenkette ab tibpos wird als kommando interpretiert
'' : tibpos wird auf position hinter token gesetzt
''eingabe : -
''ausgabe : -
''variablen : tib - eingabepuffer zur string
'' : tibpos - aktuelle position im tib
repeat 'kommandostring kopieren
cmdstr[tibpos] := tib[tibpos]
tibpos++
until (tib[tibpos] == ios#CHAR_SPACE) or (tib[tibpos] == 0) 'wiederholen bis leerzeichen oder stringende
cmdstr[tibpos] := 0 'kommandostring abschließen
os_cmdexec(@cmdstr) 'interpreter aufrufen
tibpos := 0 'tastaturpuffer zurücksetzen
tib[0] := 0
PUB os_cmdexec(stradr) 'sys: kommando im ?bergebenen string wird als kommando interpretiert
{{os_smdexec - das kommando im ?bergebenen string wird als kommando interpretiert
stradr: adresse einer stringvariable die ein kommando enth?lt}}
if strcomp(stradr,string("help")) 'help
ios.print(@help1)
elseif strcomp(stradr,string("open"))
plx_open
elseif strcomp(stradr,string("close"))
plx_close
elseif strcomp(stradr,string("put"))
plx_put
elseif strcomp(stradr,string("get"))
plx_get
elseif strcomp(stradr,string("map"))
plx_map
elseif strcomp(stradr,string("scan"))
plx_scan
elseif strcomp(stradr,string("test"))
plx_test
elseif strcomp(stradr,string("test#"))
plx_testnr
elseif strcomp(stradr,string("game"))
plx_game
elseif strcomp(stradr,string("setgame"))
plx_setgame
elseif strcomp(stradr,string("polloff"))
plx_polloff
elseif strcomp(stradr,string("pollon"))
plx_pollon
elseif strcomp(stradr,string("debug"))
plx_debug
elseif strcomp(stradr,string("status"))
plx_status
elseif strcomp(stradr,string("plexuswr"))
plx_plexuswr
elseif strcomp(stradr,string("bye"))
ios.stop
else 'kommando nicht gefunden
ios.print(stradr)
ios.print(@prompt3)
ios.printnl
PRI plx_debug|wert,i
' ios.plxOut($22,cnt)
' irgendwie funktionieren die direkten i2c-operationen noch nicht
' von administra aus funktioniert das gleiche konstrukt
' ???
ios.plxHalt
repeat
ios.plxStart
ios.plxWrite($22 << 1)
ios.plxWrite(i++)
ios.plxStop
waitcnt(cnt+clkfreq/3)
ios.printhex(i,2)
ios.printchar(" ")
PRI plx_plexuswr|regadr,regval
device := num.FromStr(os_nxtoken1,num#HEX)
regadr := num.FromStr(os_nxtoken1,num#HEX)
regval := num.FromStr(os_nxtoken1,num#HEX)
ios.plxHalt
waitcnt(cnt+clkfreq)
ios.plxStart
ios.plxWrite(device << 1)
ios.plxWrite(regadr)
ios.plxWrite(regval)
ios.plxStop
waitcnt(cnt+clkfreq)
ios.plxRun
PRI plx_status
ios.printnl
ios.print(string("Device : "))
ios.printhex(device,2)
if open
ios.print(string(" open"))
else
ios.print(string(" close"))
ios.printnl
ios.print(string("Polling : "))
if polling
ios.print(string("ON"))
else
ios.print(string("OFF"))
ios.printnl
ios.printnl
PRI plx_polloff
ios.plxHalt
ios.print(string("Poller wurde angehalten!",$0d))
polling := 0
PRI plx_pollon
ios.plxRun
ios.print(string("Poller wurde gestartet!",$0d))
polling := 1
open := 0
PRI plx_game|dev,i
i := 0
ios.curoff
ios.printcls
repeat
dev := ios.pad
ios.curhome
ios.printnl
ios.print(string("Scan : "))
ios.printdec(i++)
ios.printnl
ios.print(string("Input : ["))
ios.printbin(dev,24)
ios.printchar("]")
ios.printnl
ios.printnl
print_joystick(dev >> 16 & $FF)
ios.printnl
print_paddle(0,dev >> 8 & $FF)
print_paddle(1,dev & $FF)
until ios.key
ios.printnl
ios.curon
PRI plx_setgame|adradda,adrport
adradda := num.FromStr(os_nxtoken1,num#HEX)
adrport := num.FromStr(os_nxtoken1,num#HEX)
ios.plxsetadr(adradda,adrport)
PRI plx_test
testsepia($48,$20)
PRI plx_testnr|adradda,adrport
adradda := num.FromStr(os_nxtoken1,num#HEX)
adrport := num.FromStr(os_nxtoken1,num#HEX)
testsepia(adradda,adrport)
PRI plx_map|ack,adr,n,i
ios.plxHalt
n := 0
i := 0
ios.curoff
ios.printcls
repeat
ios.curhome
ios.printnl
ios.print(string(" 0123456789ABCDEF"))
ios.printnl
repeat adr from 0 to 127
ack := ios.plxping(adr)
if n == 0
ios.printhex(adr,2)
ios.printchar(" ")
if ack
ios.printqchar("┼")
else
ios.printqchar("•")
if n++ == 15
ios.printnl
n := 0
ios.printnl
ios.print(string("Scan : "))
ios.printdec(i++)
until ios.key
ios.printnl
ios.curon
ios.plxRun
PRI plx_scan|ack,adr
ios.plxHalt
ios.printnl
repeat adr from 0 to 127
ack := ios.plxping(adr)
ifnot ack
ios.print(string("Ping : $"))
ios.printhex(adr,2)
ios.print(string(" : "))
ios.printdec(adr)
ios.printnl
ios.printnl
ios.plxRun
PRI plx_open|ack
device := num.FromStr(os_nxtoken1,num#HEX)
ios.plxHalt
ios.plxStart
ifnot ios.plxWrite(device << 1)
ios.print(string("Device geöffnet, Polling aus!"))
polling := 0
open := 1
else
ios.print(string("Device nicht vorhanden!"))
ios.plxRun
polling := 1
open := 0
ios.printnl
PRI plx_close
ios.plxRun
ios.print(string("Device geschlossen, Polling an!"))
ios.printnl
polling := 1
open := 0
PRI plx_put|wert
if open
wert := num.FromStr(os_nxtoken1,num#HEX)
ios.plxOut(device,wert)
else
ios.print(string("Kein Device geöffnet!"))
ios.printnl
PRI plx_get
if open
ios.print(string("Get : "))
ios.printhex(ios.plxIn(device),2)
ios.printnl
else
ios.print(string("Kein Device geöffnet!"))
ios.printnl
PRI print_chan(cnr,wert)
ios.print(string("A/D "))
ios.printdec(cnr)
ios.printchar(" ")
ios.printhex(wert,2)
ios.printchar(" ")
ios.printchar("[")
repeat wert>>3
ios.printqchar("‣")
repeat (255-wert)>>3
ios.printqchar(" ")
ios.printchar("]")
ios.printnl
PRI print_port(pnr,wert)
ios.print(string("Port "))
ios.printdec(pnr)
ios.print(string(" ["))
repeat 8
if wert & 1
ios.printqchar("‣")
else
ios.printqchar(" ")
wert := wert >> 1
ios.printchar("]")
ios.printnl
PRI print_paddle(cnr,wert)
ios.print(string("Paddle "))
ios.printdec(cnr)
ios.printchar(" ")
ios.printhex(wert,2)
ios.printchar(" ")
ios.printchar("[")
repeat wert>>3
ios.printqchar("‣")
repeat (255-wert)>>3
ios.printqchar(" ")
ios.printchar("]")
ios.printnl
PRI print_joystick(wert)
ios.print(string("Joystick "))
ios.print(string(" ["))
repeat 8
if wert & 1
ios.printqchar("‣")
else
ios.printqchar(" ")
wert := wert >> 1
ios.printchar("]")
ios.printnl
PRI testsepia(adda,port)
ios.plxHalt
ios.curoff
ios.printcls
repeat
ios.curhome
ios.printnl
print_port(1,ios.plxIn(port ))
print_port(2,ios.plxIn(port+1))
print_port(3,ios.plxIn(port+2))
ios.printnl
print_chan(0,ios.plxch(adda,0))
print_chan(1,ios.plxch(adda,1))
print_chan(2,ios.plxch(adda,2))
print_chan(3,ios.plxch(adda,3))
ios.plxout(port+2,!(cnt>>23))
until ios.key
ios.printnl
ios.curon
ios.plxRun
DAT
prompt1 byte "ok ", $0d, 0
prompt2 byte "plx: ", 0
prompt3 byte "? ",0
wait1 byte "<WEITER? */q:>",0
help1 file "perplex.txt"
byte $0d,0