home *** CD-ROM | disk | FTP | other *** search
- \ 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 ;
-
-
-