Annotation of qemu/roms/openbios/forth/device/terminal.fs, revision 1.1.1.1

1.1       root        1: \ tag: terminal emulation
                      2: \ 
                      3: \ this code implements IEEE 1275-1994 ANNEX B
                      4: \ 
                      5: \ Copyright (C) 2003 Stefan Reinauer
                      6: \ 
                      7: \ See the file "COPYING" for further information about
                      8: \ the copyright and warranty status of this work.
                      9: \ 
                     10: 
                     11: 0 value (escseq)
                     12: 10 buffer: (sequence)
                     13: 
                     14: : (match-number) ( x y [1|2] [1|2] -- x [z] )
                     15:   2dup = if \ 1 1 | 2 2
                     16:     drop exit
                     17:   then
                     18:   2dup > if
                     19:     2drop drop 1 exit
                     20:   then
                     21:   2drop 0
                     22:   ;
                     23: 
                     24: : (esc-number) ( maxchar -- ?? ?? num )
                     25:   >r depth >r  ( R: depth maxchar )
                     26:   0 (sequence) 2+ (escseq) 2- ( 0 seq+2 seqlen-2 )
                     27:   \ if numerical, scan until non-numerical
                     28:   0 ?do
                     29:     ( 0 seq+2 )
                     30:     dup i + c@ a
                     31:     digit if
                     32:       ( 0 ptr  n )
                     33:       rot a * + ( ptr val )
                     34:       swap 
                     35:     else
                     36:       ( 0 ptr asc )
                     37:       ascii ; = if
                     38:         0 swap
                     39:       else
                     40:         drop leave
                     41:       then
                     42:     then
                     43:     
                     44:   loop
                     45:   depth r> - r>
                     46:   0 to (escseq)
                     47:   (match-number) 
                     48:   ;
                     49:   
                     50: : (match-seq)
                     51:   (escseq) 1- (sequence) + c@  \ get last character in sequence
                     52:   \ dup draw-character
                     53:   case
                     54:     ascii A of \ CUU - cursor up
                     55:       1 (esc-number) 
                     56:       0> if 
                     57:         1 max
                     58:       else 
                     59:         1
                     60:       then
                     61:       negate line# + 
                     62:       0 max to line#
                     63:     endof
                     64:     ascii B of \ CUD - cursor down
                     65:       1 (esc-number) 
                     66:       0> if 
                     67:         1 max
                     68:        line# + 
                     69:         #lines 1- min to line#
                     70:       then
                     71:     endof
                     72:     ascii C of \ CUF - cursor forward
                     73:       1 (esc-number) 
                     74:       0> if 
                     75:         1 max
                     76:        column# + 
                     77:         #columns 1- min to column#
                     78:       then
                     79:     endof
                     80:     ascii D of \ CUB - cursor backward
                     81:       1 (esc-number) 
                     82:       0> if 
                     83:         1 max
                     84:        negate column# + 
                     85:        0 max to column#
                     86:       then
                     87:     endof
                     88:     ascii E of \ Cursor next line (CNL) 
                     89:       \ FIXME - check agains ANSI3.64
                     90:       1 (esc-number) 
                     91:       0> if 
                     92:         1 max
                     93:        line# + 
                     94:         #lines 1- min to line#
                     95:       then
                     96:       0 to column#
                     97:     endof
                     98:     ascii f of
                     99:       2 (esc-number) 
                    100:       2 = if
                    101:         #columns 1- min to column#
                    102:         #lines 1- min to line#
                    103:       then
                    104:     endof
                    105:     ascii H of
                    106:       2 (esc-number) 
                    107:       2 = if
                    108:         #columns 1- min to column#
                    109:         #lines 1- min to line#
                    110:       then
                    111:     endof
                    112:     ascii J of
                    113:       0 to (escseq)
                    114:       #columns column# - delete-characters
                    115:       #lines line# - delete-lines
                    116:     endof
                    117:     ascii K of
                    118:       0 to (escseq)
                    119:       #columns column# - delete-characters
                    120:     endof
                    121:     ascii L of
                    122:       1 (esc-number) 
                    123:       0> if
                    124:         1 max
                    125:         insert-lines
                    126:       then
                    127:     endof
                    128:     ascii M of
                    129:       1 (esc-number) 
                    130:       1 = if
                    131:         1 max
                    132:         delete-lines
                    133:       then
                    134:     endof
                    135:     ascii @ of
                    136:       1 (esc-number) 
                    137:       1 = if
                    138:         1 max
                    139:         insert-characters 
                    140:       then
                    141:     endof
                    142:     ascii P of
                    143:       1 (esc-number) 
                    144:       1 = if
                    145:        1 max
                    146:         delete-characters
                    147:       then
                    148:     endof
                    149:     ascii m of
                    150:       1 (esc-number)
                    151:       1 = if
                    152:         7 = if 
                    153:           true to inverse?
                    154:         else
                    155:           false to inverse?
                    156:         then
                    157:       then
                    158:     endof
                    159:     ascii p of \ normal text colors
                    160:       0 to (escseq)
                    161:       inverse-screen? if
                    162:         false to inverse-screen?
                    163:        inverse? 0= to inverse?
                    164:        invert-screen
                    165:       then
                    166:     endof
                    167:     ascii q of \ inverse text colors
                    168:       0 to (escseq)
                    169:       inverse-screen? not if
                    170:         true to inverse-screen?
                    171:        inverse? 0= to inverse?
                    172:        invert-screen
                    173:       then
                    174:     endof
                    175:     ascii s of
                    176:       \ Resets the display device associated with the terminal emulator.
                    177:       0 to (escseq)
                    178:       reset-screen
                    179:     endof
                    180:   endcase
                    181:   ;
                    182: 
                    183: : (term-emit) ( char -- )
                    184:   toggle-cursor
                    185:   
                    186:   (escseq) 0> if
                    187:     (escseq) 10 = if
                    188:       0 to (escseq)
                    189:       ." overflow in esc" cr
                    190:       drop
                    191:     then
                    192:     (escseq) 1 = if 
                    193:       dup ascii [ = if    \ not a [
                    194:         (sequence) 1+ c!
                    195:        2 to (escseq)
                    196:       else
                    197:         0 to (escseq)      \ break out of ESC sequence
                    198:        ." out of ESC" cr
                    199:        drop               \ don't print breakout character
                    200:       then
                    201:       toggle-cursor exit
                    202:     else
                    203:       (sequence) (escseq) + c! 
                    204:       (escseq) 1+ to (escseq)
                    205:       (match-seq)
                    206:       toggle-cursor exit
                    207:     then  
                    208:   then
                    209:   
                    210:   case
                    211:   7 of \ BEL
                    212:     blink-screen
                    213:     s" /screen" s" ring-bell" 
                    214:     execute-device-method
                    215:   endof
                    216:   8 of \ BS
                    217:     column# 0<> if
                    218:       column# 1- dup 
                    219:       to column#
                    220:       20 draw-character
                    221:       to column#
                    222:     then
                    223:   endof
                    224:   9 of \ TAB
                    225:     column# dup #columns = if 
                    226:       drop
                    227:     else
                    228:       8 + -8 and ff and to column#
                    229:     then
                    230:   endof
                    231:   a of \ LF
                    232:     line# 1+ to line# 0 to column# 
                    233:   endof
                    234:   b of \ VT
                    235:     line# 0<> if
                    236:       line# 1- to line#
                    237:     then
                    238:   endof
                    239:   c of \ FF
                    240:     0 to column# 0 to line#
                    241:     erase-screen
                    242:   endof
                    243:   d of \ CR
                    244:     0 to column#
                    245:   endof
                    246:   1b of \ ESC
                    247:     1b (sequence) c!
                    248:     1 to (escseq)
                    249:   endof
                    250:   dup draw-character
                    251:   endcase
                    252:   toggle-cursor
                    253:   ;
                    254: 
                    255: ['] (term-emit) to fb-emit

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.