136 lines
5.3 KiB
Plaintext
136 lines
5.3 KiB
Plaintext
|
'******************************************************************************
|
||
|
' Author: Dave Hein
|
||
|
' Version 1.0
|
||
|
' Copyright (c) 2010, 2011
|
||
|
' See end of file for terms of use.
|
||
|
'******************************************************************************
|
||
|
{{
|
||
|
This object provides console I/O functions for SpinSim. It implements the same methods as FullDuplexSerial.
|
||
|
}}
|
||
|
con
|
||
|
SYS_COMMAND = $12340000
|
||
|
SYS_LOCKNUM = $12340002
|
||
|
SYS_PARM = $12340004
|
||
|
|
||
|
SYS_CON_PUTCH = 1
|
||
|
SYS_CON_GETCH = 2
|
||
|
|
||
|
PUB start(rxpin, txpin, mode, baudrate) : okay
|
||
|
ifnot word[SYS_LOCKNUM]
|
||
|
word[SYS_LOCKNUM] := locknew + 1
|
||
|
return 1
|
||
|
|
||
|
PUB stop
|
||
|
|
||
|
|
||
|
PUB rxflush
|
||
|
|
||
|
'' Flush receive buffer
|
||
|
|
||
|
repeat while rxcheck => 0
|
||
|
|
||
|
|
||
|
PUB rxtime(ms) : rxbyte | t
|
||
|
|
||
|
'' Wait ms milliseconds for a byte to be received
|
||
|
'' returns -1 if no byte received, $00..$FF if byte
|
||
|
|
||
|
t := cnt
|
||
|
repeat until (rxbyte := rxcheck) => 0 or (cnt - t) / (clkfreq / 1000) > ms
|
||
|
|
||
|
|
||
|
PUB rx : rxbyte
|
||
|
|
||
|
'' Receive byte (may wait for byte)
|
||
|
'' returns $00..$FF
|
||
|
|
||
|
repeat while (rxbyte := rxcheck) < 0
|
||
|
|
||
|
PUB rxcheck | locknum
|
||
|
locknum := word[SYS_LOCKNUM] - 1
|
||
|
if locknum == -1
|
||
|
return -1
|
||
|
repeat until not lockset(locknum)
|
||
|
word[SYS_COMMAND] := SYS_CON_GETCH
|
||
|
repeat while word[SYS_COMMAND]
|
||
|
result := long[SYS_PARM]
|
||
|
lockclr(locknum)
|
||
|
|
||
|
|
||
|
PUB tx(txbyte) | locknum
|
||
|
|
||
|
'' Send byte (may wait for room in buffer)
|
||
|
locknum := word[SYS_LOCKNUM] - 1
|
||
|
if locknum == -1
|
||
|
return
|
||
|
repeat until not lockset(locknum)
|
||
|
long[SYS_PARM] := txbyte
|
||
|
word[SYS_COMMAND] := SYS_CON_PUTCH
|
||
|
repeat while word[SYS_COMMAND]
|
||
|
lockclr(locknum)
|
||
|
|
||
|
|
||
|
PUB str(stringptr)
|
||
|
|
||
|
'' Send string
|
||
|
|
||
|
repeat strsize(stringptr)
|
||
|
tx(byte[stringptr++])
|
||
|
|
||
|
|
||
|
PUB dec(value) | i, x
|
||
|
|
||
|
'' Print a decimal number
|
||
|
|
||
|
x := value == NEGX 'Check for max negative
|
||
|
if value < 0
|
||
|
value := ||(value+x) 'If negative, make positive; adjust for max negative
|
||
|
tx("-") 'and output sign
|
||
|
|
||
|
i := 1_000_000_000 'Initialize divisor
|
||
|
|
||
|
repeat 10 'Loop for 10 digits
|
||
|
if value => i
|
||
|
tx(value / i + "0" + x*(i == 1)) 'If non-zero digit, output digit; adjust for max negative
|
||
|
value //= i 'and digit from value
|
||
|
result~~ 'flag non-zero found
|
||
|
elseif result or i == 1
|
||
|
tx("0") 'If zero digit (or only digit) output it
|
||
|
i /= 10 'Update divisor
|
||
|
|
||
|
PUB hex(value, digits)
|
||
|
|
||
|
'' Print a hexadecimal number
|
||
|
|
||
|
value <<= (8 - digits) << 2
|
||
|
repeat digits
|
||
|
tx(lookupz((value <-= 4) & $F : "0".."9", "A".."F"))
|
||
|
'tx(hexdigit[(value <-= 4) & $F])
|
||
|
|
||
|
PUB bin(value, digits)
|
||
|
|
||
|
'' Print a binary number
|
||
|
|
||
|
value <<= 32 - digits
|
||
|
repeat digits
|
||
|
tx((value <-= 1) & 1 + "0")
|
||
|
|
||
|
PUB out(char)
|
||
|
tx(char)
|
||
|
{{
|
||
|
+------------------------------------------------------------------------------------------------------------------------------+
|
||
|
| 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. |
|
||
|
+------------------------------------------------------------------------------------------------------------------------------+
|
||
|
}}
|