VolksForth/sources/msdos/serial.fb.src
2017-04-24 00:25:49 +02:00

375 lines
24 KiB
Plaintext

Screen 0 not modified
0 \ Serial interface for IBM-PC using 8250 chip cas 11nov05
1
2 INCLUDE SERIAL.FB will load code for COM1,
3 2 LOADFROM SERIAL.FB for COM2
4
5 Bytes recieved will be buffered in a 128 Byte deep Queue
6 by an interrupt Routine.
7
8 The DTR Line will be used to signal that new bytes can be
9 recieved.
10 The Sender will recognize CTS, a full Handshake is implemented
11
12 Xon/Xoff Protocoll using ^S/^Q is _not_ implemented.
13
14 Sender: TX? ( -- f ) TX ( -- char )
15 Empf„nger: RX? ( -- f ) RX ( char -- )
Screen 1 not modified
0 \ Driver for IBM-PC Serial card using 8250 cas 11nov05
1 Onlyforth \needs Assembler 2 loadfrom asm.fb
2
3 cr .( COM1: )
4
5 | $C 4 * Constant SINT@ \ absolute loc. of serial interrupt
6
7 $3F8 >label Portadr
8
9 | $10 Constant I_level \ 8259 priority
10
11 2 7 +thru
12
13
14
15
Screen 2 not modified
0 \ Driver for IBM-PC Serial card using 8250 cas 11nov05
1 Onlyforth \needs Assembler 2 loadfrom asm.fb
2
3 cr .( COM2: )
4
5 | $B 4 * Constant SINT@ \ absolute loc. of serial interrupt
6
7 $2F8 >label Portadr
8
9 | 8 Constant I_level \ 8259 priority
10
11 1 6 +thru
12
13
14
15
Screen 3 not modified
0 \ Driver for IBM-PC Serial card using 8250 ks 11 mai 88
1 \ 3 .( 38.4 kbaud )
2 \ &6 .( 19.2 kbaud )
3 &12 .( 9.6 kbaud )
4 \ &24 .( 4.8 kbaud )
5 \ &96 .( 1200 baud )
6 >label baud
7
8 $20 >label I_ctrl $21 >label I_mask \ 8259 addresses
9
10 Create Queue 0 , $80 allot
11 \ 0 1 2 130 byte address
12 \ | len | out |<-- 128 byte Queue -->|
13 \ len ::= number of characters queued
14 \ out ::= relativ address of next output character
15 \ (len+out)mod(128) ::= relative address of first empty byte
Screen 4 not modified
0 \ transmit to 8250 ks 11 dez 87
1
2 Code tx? ( -- f ) D push Portadr 5 + # D mov
3 D in D D xor $1020 # A and $1020 # A cmp
4 0= ?[ D dec ]? Next end-code
5
6 Code tx ( c -- ) D- A- xchg Portadr # D mov
7 D byte out D pop Next end-code
8
9 Code -dtr D push Portadr 4 + # D mov
10 D byte in $1E # A- and D byte out D pop Next
11 end-code
12
13 Code +dtr D push Portadr 4 + # D mov
14 D byte in 1 # A- or D byte out D pop Next
15 end-code
Screen 5 not modified
0 \ receive queue and interrupt service routine ks 11 dez 87
1
2 Label S_INT D push I push A push
3 Portadr # D mov D byte in A- D+ mov
4 Queue # I mov C: seg I ) A mov A- D- mov D- inc
5 C: seg D- I ) mov A+ A- add $7F # A and A I add
6 C: seg D+ 2 I D) mov $68 # D- cmp CS not
7 ?[ Portadr 4 + # D mov
8 D byte in $1E # A- and D byte out ]? \ -DTR
9 $20 # A- mov I_ctrl #) byte out \ EOI for 8259
10 A pop I pop D pop iret
11 end-code
12
13
14
15
Screen 6 not modified
0 \ rx? rx ks 30 dez 87
1
2 Code rx? ( -- f ) D push D D xor
3 Queue #) D- mov D- D- or 0=
4 ?[ [[ D push Portadr 4 + # D mov \ +DTR
5 D byte in 9 # A- or D byte out D pop
6 swap ]? Next end-code
7
8 Code rx ( -- 8b ) I W mov Queue # I mov
9 D push D D xor cli lods A- A- or 0= not
10 ?[ A+ C- mov A- dec A+ inc $7F # A+ and
11 A -2 I D) mov D- C+ mov C I add I ) D- mov
12 ]? sti W I mov $18 # A- cmp CS not ?] Next
13 end-code
14
15
Screen 7 not modified
0 \ Serial initialization ks 25 apr 86
1
2 | Code S_init D push D: push A A xor A D: mov C: A mov
3 SINT@ # W mov S_INT # W ) mov A 2 W D) mov D: pop
4 Portadr 3 + # D mov $80 # A- mov D byte out \ DLAB = 1
5 2 # D sub baud # A mov A- A+ xchg D byte out
6 D dec A- A+ xchg D byte out \ baudrate
7 3 # D add $A07 # A mov D out \ 8bit, noP, +RTS +OUT
8 2 # D sub 1 # A- mov D byte out \ +rxINT
9 I_mask #) byte in I_level Forth not Assembler # A- and
10 I_mask #) byte out D pop Next
11 end-code
12
13
14
15
Screen 8 not modified
0 \ init bye ks 11 dez 87
1 \needs init : init ;
2
3 : init init Queue off S_init ; init
4
5 : bye 0 [ Portadr 1+ ] Literal pc! \ -rxINT
6 0 [ Portadr 4 + ] Literal pc! \ -dtr/-rts/-out2
7 I_mask pc@ I_level or I_mask pc! bye ;
8
9
10
11
12
13
14
15
Screen 9 not modified
0 \ dumb terminal via 8250 ks 11 dez 87
1
2 Variable Fkeys Fkeys on
3
4 | : ?rx ( -- ) pause rx? 0=exit rx
5 Fkeys @ 0= IF emit ?cr exit THEN
6 #LF case? IF cr exit THEN
7 #CR case? IF Row 0 at exit THEN
8 #BS case? IF del exit THEN emit ;
9
10 | : ?tx ( c -- ) BEGIN ?rx tx? UNTIL tx ;
11
12 : dumb BEGIN BEGIN ?rx key? UNTIL key
13 $1B case? IF -dtr exit THEN ?tx REPEAT ;
14
15
Screen 10 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 11 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 12 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 13 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 14 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 15 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 16 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 17 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 18 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 19 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 20 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Screen 21 not modified
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15