home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
forth
/
compiler
/
fpc
/
source
/
term.seq
< prev
next >
Wrap
Text File
|
1991-01-18
|
5KB
|
156 lines
\ Serial Terminal
ONLY FORTH ALSO DEFINITIONS DECIMAL
POSTFIX
\ UART Registers 24May88am
HEX
3F8 CONSTANT PORT ( COM1 )
\ 2F8 CONSTANT PORT ( COM2 )
0C CONSTANT SIRQ
21 CONSTANT IRQ-CTL
DECIMAL
PORT 3 + CONSTANT LCR ( line control register )
PORT 4 + CONSTANT MCR ( modem control register )
PORT 5 + CONSTANT LSR ( line status register )
PORT CONSTANT BAUDLO ( baud register low )
PORT 1 + CONSTANT BAUDHI ( baud register high )
comment:
PORT
Variable holding current UART base address.
COM1
Select port 1 as serial port.
COM2
Select port 2 as serial port.
TIMEOUT
Variable holding timeout count for serial input. A value of
one corresponds to about 3/4 second timeout. Storing a zero
here will effectively eliminate a serial timeout.
comment;
\ Initialize UART 24May88am
HEX
: !LCR ( n mask -- ) NOT LCR PC@ AND OR LCR PC! ;
: DATA-BITS ( n -- ) 5 - 3 !LCR ;
: STOP-BITS ( n -- ) 2 AND 2* 4 !LCR ;
: PARITY ( -- ) 38 !LCR ;
0 CONSTANT NO 8 CONSTANT ODD 18 CONSTANT EVEN
: +BREAK ( -- ) 40 40 !LCR ;
: -BREAK ( -- ) 00 40 !LCR ;
DECIMAL
: BAUD ( n -- )
128 128 !LCR 9600 12 ROT */
256 /MOD BAUDHI PC! BAUDLO PC! 0 128 !LCR ;
: SINIT ( -- )
8 DATA-BITS 1 STOP-BITS NO PARITY 9600 BAUD ;
comment:
!LCR Store bits in unmasked part of line control register
DATA-BITS Select number of data bits.
STOP-BITS Select number of stop nits.
NO-PARITY Select no parity
ODD-PARITY Select odd parity.
EVEN-PARITY Select even parity.
BREAK-ON Begin break, hold SOUT low.
BREAK-OFF Return SOUT to high state.
SET-DTR Set DTR and RTS high.
BAUD Set baud rate to n.
SINIT Default initialization.
comment;
\ Serial Receive 31Oct89AM
4000 CONSTANT BUF-SIZE
CREATE BUF BUF-SIZE ALLOT
HERE CONSTANT BUF-END
VARIABLE TAIL
VARIABLE HEAD
2VARIABLE OLD-INT
: +HEAD ( -- )
HEAD @ 1+ DUP BUF-END = IF DROP BUF THEN HEAD ! ;
: SKEY? ( -- f )
TAIL @ HEAD @ <> ;
: ESC ( -- )
KEY? IF KEY 27 = ABORT" OK" THEN ;
100 value timeout ( 100 = about 1 second )
: skeywait ( -- ) \ wait for character from serial port.
\ check for ESC from user once a second.
begin fudge @ timeout um* 0= and ( > 65k goes to zero )
0 do skey? if undo exit then loop
esc
again ;
: SKEY ( -- char )
\ BEGIN ESC SKEY? UNTIL
skeywait HEAD @ C@ +HEAD ;
: SEMIT ( char -- )
BEGIN LSR PC@ 32 AND UNTIL PORT PC! ;
\ Interrupt Service Routine
HEX
LABEL ISR
\ Read a character from the serial port and put it into
\ the serial buffer.
STI AX PUSH BX PUSH DX PUSH DS PUSH
CS AX MOV AX DS MOV
PORT # DX MOV DX AL IN
TAIL #) BX MOV AL 0 [BX] MOV BX INC
BUF-END # BX CMP 0= IF BUF # BX MOV THEN BX TAIL #) MOV
20 # AL MOV AL 20 # OUT ( End-of-Interrupt command )
DS POP DX POP BX POP AX POP IRET END-CODE
CODE TRAP ( -- )
\ Save old interrupt vector and install my interrupt routine.
BX PUSH DS PUSH ES PUSH
3500 SIRQ + # AX MOV 21 INT
ES OLD-INT #) MOV BX OLD-INT 2+ #) MOV
CS PUSH DS POP ISR # DX MOV
2500 SIRQ + # AX MOV 21 INT
ES POP DS POP BX POP NEXT END-CODE
CODE RELEASE ( -- )
\ Restore previous serial interrupt vector.
DS PUSH OLD-INT 2+ #) DX MOV OLD-INT #) DS MOV
2500 SIRQ + # AX MOV 21 INT DS POP NEXT END-CODE
: ENABLE ( -- )
\ Initialize pointers, enable UART interrupts and enable
\ interrupt controller.
BUF TAIL ! BUF HEAD ! 0B MCR PC! 1 PORT 1+ PC!
IRQ-CTL PC@ 0EF AND IRQ-CTL PC! ;
: DISABLE ( -- )
\ Disable serial interrupt at interrupt controller.
IRQ-CTL PC@ 10 OR IRQ-CTL PC! ;
: SERIAL-ON ( -- ) TRAP ENABLE ;
: SERIAL-OFF ( -- ) DISABLE RELEASE ;
DECIMAL
\ Dumb Terminal
: (TEMIT) ( char -- )
DUP 10 = IF DROP CR ELSE
DUP 13 = IF EMIT #OUT OFF ELSE
EMIT THEN THEN ;
DEFER TEMIT ' (TEMIT) IS TEMIT
: KILL HEAD @ TAIL ! ;
: TALK ( -- )
KILL
BEGIN KEY? IF KEY DUP 27 =
IF DROP EXIT THEN SEMIT THEN
SKEY? IF SKEY TEMIT THEN
AGAIN ;