|
|
1.06a MS-DOS
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-1
;************************************************************************
;* *
;* rciol: direct 8250 communications interface for C *
;* *
;* prototypes: int rioini(int,int); initialize com,irq *
;* int setbaud(int); set baud rate *
;* *n/a int rioctl(int); remote i/o control *
;* void dtr(char); set/reset dtr *
;* int outcom(int); send character *
;* int incom(void); receive character *
;* *n/a int rioifc(int); local i/o redirection *
;* *
;************************************************************************
; this source file is lacking _rioctl and _rioifc
0000 biosda segment at 40h ;bios data area
0000 biosda ends
setmod %mm
; 8259 interrupt controller register equates
= 0020 icr1 equ 20h ;interrupt command register (master)
= 0021 imr1 equ 21h ;interrupt mask register (master)
= 0008 ivb1 equ 8 ;vector base 0-7: cannot be read, assumed
= 00A0 icr2 equ 0a0h ;interrupt command register (slave)
= 00A1 imr2 equ 0a1h ;interrupt mask register (slave)
= 0070 ivb2 equ 70h ;vector base 8-f: cannot be read, assumed
; 8250 uart register equates
= 0002 iir equ 2 ;interrupt identification register
= 0001 ier equ 1 ;interrupt enable register
= 000B ierd equ 0bh ;enable: rxd, thre, msr
= 0006 msr equ 6 ;modem status register
= 0004 mcr equ 4 ;modem control register
= 000B mcrd equ 0bh ;irq enable, rts on, dtr on
= 0005 lsr equ 5 ;line status register
= 0003 lcr equ 3 ;line control register
= 0003 lcrd equ 3 ;N,8,1 mode
; buffer pointer structure
dstruc bufp,0
dss 2,bcnt ;character count
dss 2,bput ;next character to buffer
dss 2,bget ;next character from buffer
dss 1,ovfl ;overflow flag
dss 1
dss 2,bofst ;buffer offset
dss 2,bsize ;buffer size
dstruc bufp
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-2
.data
public _plst
align 2
0000 0001C200 brdd dd 115200 ;baud rate dividend
0004 00000000 iv16h dd 0 ;saved interrupt vector for int 16h
0008 00000000 iv29h dd 0 ;saved interrupt vector for int 29h
000C 00000000 ivsio dd 0 ;saved serial i/o vector
0010 0000 buart dw 0 ;uart base address
0012 0000 lsrad dw 0 ;line status register port address
0014 00 irqn db 0 ;interrupt request line
0015 00 ircr db 0 ;saved interrupt controller mask
0016 00 siovn db 0 ;serial i/o vector number
= 0001 ic29h equ 1 ;int 29h is being intercepted
= 0003 ic29d equ 3 ;int 29h is being diverted
= 0010 ic16h equ 10h ;int 16h is being intercepted
0017 00 intcp db 0 ;intercepted interrupt code
0018 00 opera db 0 ;operational (port defined, baud set)
0019 00 mode db 0 ;function enable (incl pause/abort cycles)
001A 00 state db 0 ;operational state (must follow mode)
= 0002 hold equ 2 ;stop transmission
= 0004 abort equ 4 ;aborting
= 0010 ctsck equ 10h ;check clear to send signal (mode only, fixed)
001B 00 txintp db 0 ;transmit interrupt pending
001C 00 status db 0 ;communications status
= 0001 rxlost equ 1 ;received characters lost
001D 00 align 2
= 0400 txbmx equ 1024 ;receive buffer maximum size
= 0400 rxbmx equ 1024 ;transmit buffer maximum size
001E _plst label word
dv rxbp bufp,0 ;receive buffer pointers
dv txbp bufp,0 ;transmit buffer pointers
dv rxb rxbmx,0a8h ;receive buffer
dv txb txbmx,0a8h ;transmit buffer
0836 00 tst db 0
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-3
.code
public _rioini,_outcom,_incom,_dtr,_setbaud
0000 FFFF riods: dw -1 ;remote i/o routine data segment value
; initialize communications
; clear buffers, data, program uart, enable interrupts
0002 _rioini proc
0002 55 push bp
0003 8B EC mov bp,sp
0005 56 push si
0006 57 push di
0007 8B 46 06 mov ax,pb[bp] ;com port or uart address
000A 0B C0 or ax,ax
000C A1 0010 R mov ax,buart
000F 75 07 jnz @f ;initialize
0011 0B C0 or ax,ax
0013 74 07 jz cierr ;error, not initialized
0015 E9 00C6 R jmp finis ;terminate
0018 0B C0 @@: or ax,ax
001A 74 06 jz cinit ;continue, not yet initialized
001C B8 FFFF cierr: mov ax,-1
001F E9 00F5 R jmp ciex ;return error
0022 8C D8 cinit: mov ax,ds
0024 2E: A3 0000 R mov cs:riods,ax ;save data segment
0028 E8 010F R call ibfls ;clear input buffer
002B C7 44 08 0036 R mov bofst[si],os rxb ;set receive buffer address
0030 E8 0117 R call obfls ;clear output buffer
0033 C7 44 08 0436 R mov bofst[si],os txb ;set transmit buffer address
0038 33 C0 xor ax,ax
003A A3 0019 R mov mode,ax ;clear mode and state
003D A2 001B R mov txintp,al ;clear int pending
0040 B8 ---- R mov ax,seg biosda
0043 8E C0 mov es,ax
0045 8B 5E 06 mov bx,pb[bp] ;com port or uart address
0048 8B D3 mov dx,bx
004A 4B dec bx
004B 83 FB 04 cmp bx,4
004E 73 0F jnc scport ;com port address specified
0050 83 E3 03 and bx,3 ;com 0-3 for 1-4
0053 03 DB add bx,bx ;offset (x 2)
0055 26: 8B 17 mov dx,es:[bx]
0058 0B D2 or dx,dx
005A 75 03 jnz scport ;port exists
005C E9 00E8 R jmp ciabt ;no such com port
005F 89 16 0010 R scport: mov buart,dx ;uart base address
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-4
0063 83 C2 05 add dx,lsr
0066 89 16 0012 R mov lsrad,dx ;line status register
; mov al,pb[bp+4] ;hardware flow control
; and al,1
; jz girq
; or mode,ctsck ;check cts
006A 8A 46 08 girq: mov al,pb[bp+2] ;irq line
006D 24 07 and al,7
006F 75 04 jnz irqv ;valid
0071 24 01 and al,1
0073 04 03 add al,3 ;assume 4 for 1, 3 for 2
0075 A2 0014 R irqv: mov irqn,al
0078 8A C8 mov cl,al
007A B0 01 mov al,1
007C D2 E0 shl al,cl ;mask for current irq line
; mov irqm,al
007E 8A E0 mov ah,al
0080 50 push ax ;save irq mask
0081 E4 21 in al,imr1
0083 A2 0015 R mov ircr,al ;save prior enable mask
0086 0A C4 or al,ah
0088 E6 21 out imr1,al ;inhibit interrupts
008A 8A C1 mov al,cl ;irq number
008C 04 08 add al,ivb1 ;add vector base
008E A2 0016 R mov siovn,al ;save sio vector
0091 E8 00F9 R call gvect ;get prior vector in dx:bx
0094 89 1E 000C R mov ivsio,bx
0098 89 16 000E R mov ivsio+2,dx ;save prior vector
009C 0E push cs
009D 5A pop dx
009E BB 01C7 R mov bx,os sioisr
00A1 E8 0102 R call svect ;set service routine vector in dx:bx
00A4 8B 16 0010 R mov dx,buart
00A8 ED in ax,dx ;clear%
00A9 83 C2 04 add dx,mcr
00AC B0 0B mov al,mcrd
00AE EE out dx,al ;modem control register
00AF 4A dec dx
00B0 B0 03 mov al,lcrd
00B2 EE out dx,al ;line control register
00B3 4A dec dx
00B4 4A dec dx
00B5 B0 0B mov al,ierd
00B7 EE out dx,al ;interrupt enable register
00B8 58 pop ax ;irq mask
00B9 E4 21 in al,imr1
00BB F6 D4 not ah
00BD 22 C4 and al,ah
00BF E6 21 out imr1,al ;enable interrupts
; mov mw cs:mv2,1234h
; xor ax,ax
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-5
; mov si,os inims
; call msout
00C1 33 C0 xor ax,ax ;return 0
00C3 EB 30 90 jmp ciex ;exit
; terminate serial i/o operation
00C6 8B 16 0010 R finis: mov dx,buart
00CA 83 C2 04 add dx,mcr
00CD 32 C0 xor al,al
00CF EE out dx,al ;dtr off, release irq line
00D0 A0 0016 R mov al,siovn ;serial i/o vector
00D3 8B 1E 000C R mov bx,ivsio ;prior offset
00D7 8B 16 000E R mov dx,ivsio+2 ;prior segment
00DB E8 0102 R call svect ;replace original vector
00DE A0 0015 R mov al,ircr
00E1 E6 21 out imr1,al ;replace prior interrupt controller mask
00E3 33 DB xor bx,bx
00E5 EB 04 90 jmp cterm ;return 0
00E8 BB FFFF ciabt: mov bx,-1
00EB 33 C0 cterm: xor ax,ax
00ED A3 0010 R mov buart,ax ;not initialized
00F0 A2 0018 R mov opera,al ;not operational
00F3 8B C3 mov ax,bx ;return code
00F5 5F ciex: pop di
00F6 5E pop si
00F7 5D pop bp
00F8 CB ret
00F9 _rioini endp
; get interrupt vector al in dx:bx
00F9 06 gvect: push es
00FA B4 35 mov ah,35h
00FC CD 21 int 21h ;returns vector in es:bx
00FE 06 push es
00FF 5A pop dx ;segment
0100 07 pop es
0101 C3 ret
; set interrupt vector al in dx:bx
0102 1E svect: push ds
0103 52 push dx
0104 8E DA mov ds,dx ;segment
0106 8B D3 mov dx,bx ;offset
0108 B4 25 mov ah,25h
010A CD 21 int 21h ;takes vector in ds:dx
010C 5A pop dx
010D 1F pop ds
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-6
010E C3 ret
; flush buffers
010F BE 001E R ibfls: mov si,os rxbp ;address input buffer pointers
0112 BB 0400 mov bx,rxbmx ;set maximum size
0115 EB 06 jmp s xbfls
0117 BE 002A R obfls: mov si,os txbp ;address output buffer pointers
011A BB 0400 mov bx,txbmx ;set maximum size
; si -> bufp structure, bx = maximum size
011D B9 0004 xbfls: mov cx,os bofst/2 ;pointer list length
0120 9C pushf
0121 FA cli
0122 56 push si
0123 33 C0 xor ax,ax
0125 F3/ AB rep stosw ;clear pointers
0127 5E pop si
0128 89 5C 0A mov bsize[si],bx
012B 9D popf
012C C3 ret
; get character from buffer, ds:si -> pointers, saves cx, dx
012D 8B 04 bgetc: mov ax,bcnt[si]
012F 0B C0 or ax,ax
0131 74 1B jz bgnc ;buffer empty
0133 9C pushf
0134 FA cli
0135 8B 5C 08 mov bx,bofst[si] ;buffer offset from segment
0138 8B 7C 04 mov di,bget[si] ;character offset from buffer
013B 8A 01 mov al,mb [bx+di] ;get character
013D 47 inc di ;advance pointer
013E 3B 7C 0A cmp di,bsize[si]
0141 72 02 jc bggp ;pointer not past end of buffer
0143 33 FF xor di,di ;reset to start
0145 89 7C 04 bggp: mov bget[si],di
0148 FF 0C dec bcnt[si] ;character count
014A 9D popf ;re-enable interrupts if disabled
014B 0A C0 or al,al ;character in al, clear carry
014D C3 ret
014E F9 bgnc: stc
014F C3 ret
; put character to buffer, ds:si -> pointers, al = char, saves ax, cx, dx
0150 8B 1C bputc: mov bx,bcnt[si]
0152 3B 5C 0A bputco: cmp bx,bsize[si]
0155 73 F7 jnc bgnc ;buffer full
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-7
0157 9C pushf
0158 FA cli
0159 8B 5C 08 mov bx,bofst[si] ;buffer offset from segment
015C 8B 7C 02 mov di,bput[si] ;character offset from buffer
015F 88 01 mov mb [bx+di],al ;put character
0161 47 inc di ;advance pointer
0162 3B 7C 0A cmp di,bsize[si]
0165 72 02 jc bpgp ;pointer not past end of buffer
0167 33 FF xor di,di ;reset to start
0169 89 7C 02 bpgp: mov bput[si],di
016C FF 04 inc bcnt[si] ;character count
016E 9D popf ;re-enable interrupts if disabled
016F F8 clc ;character in al, clear carry
0170 C3 ret
; sio input character
0171 _incom proc
0171 56 push si
0172 57 push di
0173 BE 001E R mov si,os rxbp ;address receive buffer pointers
0176 E8 012D R call bgetc ;get character from receive buffer
0179 8A 26 001A R mov ah,state
017D 73 05 jnc icgc ;received character in al
017F 80 CC 01 or ah,1 ;no character available
0182 32 C0 xor al,al
0184 5F icgc: pop di
0185 5E pop si
0186 CB ret
0187 _incom endp
; sio output character
0187 _outcom proc
0187 32 C0 xor al,al
0189 8A 26 001A R mov ah,state
018D F6 C4 04 test ah,abort
0190 75 34 jnz ocabt ;aborting
0192 55 push bp
0193 8B EC mov bp,sp
0195 56 push si
0196 57 push di
0197 8A 46 06 mov al,pb[bp]
019A BE 002A R mov si,os txbp ;address transmit buffer pointers
019D 8B 1C ocrep: mov bx,bcnt[si]
019F 0B DB or bx,bx
01A1 75 19 jnz ocbuf ;buffer not empty
01A3 F6 C4 02 test ah,hold
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-8
01A6 75 14 jnz ocbuf ;paused
01A8 8B 16 0012 R mov dx,lsrad ;address line status register
01AC 8A C8 mov cl,al
01AE EC in al,dx
01AF 24 20 and al,20h ;transmit hold register empty
01B1 8A C1 mov al,cl
01B3 74 07 jz ocbuf ;interrupt pending
01B5 8B 16 0010 R mov dx,buart ;uart base (r/w data port)
01B9 EE out dx,al ;transmit character
01BA EB 07 jmp s ocex ;exit
01BC E8 0152 R ocbuf: call bputco ;put character to transmit buffer
01BF 73 02 jnc ocex ;done
;check timer, exit if 2 min.
01C1 EB DA jmp ocrep ;retry
01C3 5F ocex: pop di
01C4 5E pop si
01C5 5D pop bp
01C6 CB ocabt: ret ;state in ah
01C7 _outcom endp
; sio interrupt service routine
01C7 sioisr proc
01C7 FA cli
01C8 50 push ax
01C9 53 push bx
01CA 51 push cx
01CB 52 push dx
01CC 56 push si
01CD 57 push di
01CE 1E push ds
01CF 2E: A1 0000 R mov ax,cs:riods
01D3 8E D8 mov ds,ax ;i/o data segment
01D5 8B 16 0012 R isrep: mov dx,lsrad ;line status register
01D9 ED in ax,dx ;lsr in al, msr in ah
01DA 2E: A3 0498 R mov mw cs:mv2,ax ;%
01DE 8B C8 mov cx,ax ;save line status
01E0 83 EA 05 sub dx,lsr ;address r/w data port
01E3 A8 01 test al,1 ;received data available
01E5 74 4D jz txchk ;no character received
01E7 A8 0C test al,0ch ;overrun/parity/framing error
01E9 EC in al,dx ;read data
01EA 75 48 jnz txchk ;receive error, discard data
01EC 8B 1E 0019 R mov bx,mode ;mode in bl, state in bh
01F0 F6 C7 04 test bh,abort
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-9
01F3 75 5F jnz intex ;aborting
01F5 F6 C3 04 test bl,abort
01F8 74 20 jz rcpau ;not checking for abort
01FA 3C 03 cmp al,3 ;^C
01FC 75 1C jnz rcpau ;not abort character
01FE E8 010F R call ibfls ;flush input buffer
0201 E8 0117 R call obfls ;flush output buffer
0204 C6 06 001A R 04 mov state,abort ;aborting
0209 EB 49 90 jmp intex
020C C6 06 001A R 02 rxccs: mov state,hold ;set pause flag
0211 EB 21 jmp s txchk
0213 80 26 001A R FD rxccq: and state,not hold ;clear pause flag
0218 EB 1A jmp s txchk
021A F6 C3 02 rcpau: test bl,hold
021D 74 08 jz rxpch ;not checking pause
021F 3C 13 cmp al,13h ;^s
0221 74 E9 jz rxccs ;pause
0223 3C 10 cmp al,10h ;^q
0225 74 EC jz rxccq ;resume
0227 BE 001E R rxpch: mov si,os rxbp ;address receive buffer
022A E8 0150 R call bputc ;put character in buffer
022D 73 05 jnc txchk ;done
022F 80 0E 001C R 01 or status,rxlost ;set receive characters lost flag
0234 F6 C1 20 txchk: test cl,20h ;transmit hold register empty
0237 74 1B jz intex ;not ready to transmit
0239 BE 002A R mov si,os txbp ;address transmit buffer
023C E8 012D R call bgetc
023F 72 13 jc intex ;buffer empty
0241 8B 1E 0019 R mov bx,mode ;mode in bl, state in bh
0245 F6 D5 not ch
0247 22 EB and ch,bl ;mode and not msr
0249 F6 C5 10 test ch,ctsck ;cts checking and cts off
024C 75 06 jnz intex ;hardware flow off, interrupt will resume
024E F6 C7 02 test bh,hold
0251 75 01 jnz intex ;paused
0253 EE out dx,al ;transmit character
0254 8B 16 0010 R intex: mov dx,buart
0258 83 C2 02 add dx,iir
025B EC in al,dx ;reset int?
025C EC in al,dx
; and al,1
; jnz isrex ;more?
; jmp isrep
025D 2E: FF 06 0494 R inc mw cs:mv1
0262 A1 001E R mov ax,rxbp.bcnt
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-10
0265 2E: A3 049C R mov mw cs:mv3,ax
0269 A1 002A R mov ax,txbp.bcnt
026C 2E: A3 04A0 R mov mw cs:mv4,ax
0270 B8 0320 mov ax,800
0273 BE 0285 R mov si,os intmsg
0276 E8 0350 R call msout
0279 1F isrex: pop ds
027A 5F pop di
027B 5E pop si
027C 5A pop dx
027D 59 pop cx
027E 5B pop bx
027F B0 20 mov al,20h
0281 E6 20 out icr1,al ;non-specific eoi
0283 58 pop ax
0284 CF iret
0285 49 6E 74 65 72 72 intmsg: db 'Interrupt �5, msr/lsr �4, rxbc �4, txbc �4 ',0
75 70 74 20 E4 35
2C 20 6D 73 72 2F
6C 73 72 20 E8 34
2C 20 72 78 62 63
20 E8 34 2C 20 74
78 62 63 20 E8 34
20 20 20 20 00
02B4 sioisr endp
; set baud rate
02B4 _setbaud proc
02B4 8B 16 0010 R mov dx,buart ;base port address
02B8 0B D2 or dx,dx
02BA 75 04 jnz sbinit ;initialized
02BC 33 C0 xor ax,ax
02BE 48 dec ax ;-1
02BF CB ret ;return error
02C0 55 sbinit: push bp
02C1 8B EC mov bp,sp
02C3 56 push si
02C4 8B CA mov cx,dx ;%
02C6 BE 0000 R mov si,os brdd ;address baud rate dividend
02C9 8B 54 02 mov dx,2[si]
02CC 8B 04 mov ax,[si] ;dividend in dx:ax
02CE F7 76 06 div mw pb[bp] ;divide by parameter 1
02D1 8B D1 mov dx,cx ;%
02D3 50 push ax ;actual rate divisor for uart
02D4 8B F2 mov si,dx
02D6 83 C2 03 add dx,lcr ;address line control register
02D9 EC in al,dx
02DA 0C 80 or al,80h
02DC EE out dx,al ;address baud rate divisor
02DD 87 F2 xchg si,dx
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-11
02DF 58 pop ax
02E0 EF out dx,ax ;write baud rate divisor
02E1 87 F2 xchg si,dx
02E3 EC in al,dx
02E4 24 7F and al,7fh
02E6 EE out dx,al ;address rx/tx registers, ier
02E7 87 F2 xchg si,dx
02E9 ED in ax,dx ;clear%
02EA 33 C0 xor ax,ax ;no error
02EC 5E pop si
02ED 5D pop bp
02EE CB ret
02EF _setbaud endp
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-12
; drop dtr
; n=0 (off), n=1 (on), or n>1 (off, wait n seconds for dcd off)
02EF _dtr proc
02EF 55 push bp
02F0 8B EC mov bp,sp
02F2 B8 ---- R mov ax,seg biosda
02F5 8E C0 mov es,ax
02F7 8B 16 0010 R mov dx,buart ;uart base port
02FB 0B D2 or dx,dx
02FD 74 35 jz dtrer ;not initialized
02FF 83 C2 04 add dx,4 ;address mcr
0302 EC in al,dx
0303 24 FE and al,0feh ;clear dtr bit
0305 8A 66 06 mov ah,pb[bp] ;parameter
0308 80 E4 0F and ah,0fh
030B 80 FC 02 cmp ah,2 ;0 off, 1 on
030E 73 07 jnc wtdcd ;off, wait for dcd
0310 0A C4 or al,ah
0312 EE out dx,al ;set as specified
0313 32 C0 xor al,al
0315 EB 1F jmp s dtrck
0317 EE wtdcd: out dx,al ;dtr off
0318 42 inc dx
0319 42 inc dx ;address msr
031A B9 0012 twn: mov cx,18 ;55ms/s
031D 26: 8A 1E 006C tws: mov bl,es:[6ch] ;55ms counter
0322 EC twt: in al,dx
0323 24 80 and al,80h ;dcd
0325 74 0F jz dtrck ;done
0327 26: 3A 1E 006C cmp bl,es:[6ch] ;55ms counter
032C 74 F4 jz twt ;wait 55ms
032E E2 ED loop tws ;wait 990ms
0330 FE CC dec ah
0332 75 E6 jnz twn ;wait 2-x seconds
0334 B0 FF dtrer: mov al,-1 ;timeout
0336 8A E0 dtrck: mov ah,al
0338 80 7E 06 01 cmp mb pb[bp],1
033C 74 10 jz dtrex ;dtr was set
033E 50 push ax ;dtr was reset, clear state and buffers
033F E8 010F R call ibfls
0342 E8 0117 R call obfls
0345 32 C0 xor al,al
0347 A2 001A R mov state,al
034A A2 001C R mov status,al
034D 58 pop ax
034E 5D dtrex: pop bp
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-13
034F CB ret
0350 _dtr endp
include mviow
C .386P
C
= B000 C vseg equ 0b000h ;video ram segment address
C
C ;****************************************************************************
C ;* *
C ;* Procedure msout On entry ds:si -> text, terminated with 0. *
C ;* *
C ;* Display message on standard output, convert parameters to hex ascii or *
C ;* decimal ascii for each �n, �n, �n in message where n=number of digits. *
C ;* Repeat character c for �nc, where n=(number of repetitions plus 30h). *
C ;* *
C ;****************************************************************************
C
= 00EA C litsg equ '�' ;next character is to be output directly
= 00E8 C hexsg equ '�' ;hexadecimal conversion signal
= 00E4 C decsg equ '�' ;decimal conversion signal
= 00E6 C decsgn equ '�' ;decimal conversion, leading spaces suppressed
= 00E3 C decsgc equ '�' ;decimal conversion, use commas
= 00E2 C repsg equ '�' ;repeat character signal
= 00E0 C sgchk equ '�' ;all characters below this value are literals
C
0350 C msout proc near
0350 66| 60 C pushad
0352 1E C push ds
0353 06 C push es
0354 50 C push ax
C
0355 8C C8 C mov ax,cs
0357 8E D8 C mov ds,ax
0359 8E C0 C mov es,ax
035B BF 04B4 R C mov di,os iobuf ;output buffer
035E BB 0494 R C mov bx,os msval ;parameter list
0361 FC C cld
C
0362 AC C msorc: lodsb ;read character
0363 3C E0 C cmp al,sgchk
0365 72 2A C jc short msowc ;not conversion character
C
0367 3C E8 C cmp al,hexsg
0369 74 44 C jz short mscvh ;hex conversion character
036B 32 F6 C xor dh,dh ;decimal type flag
036D 3C E4 C cmp al,decsg
036F 74 78 C jz short mscvd ;decimal conversion
0371 B6 40 C mov dh,40h ;leading space suppress, bit 6
0373 3C E6 C cmp al,decsgn
0375 74 72 C jz short mscvd ;decimal, suppress leading spaces
0377 D0 E6 C shl dh,1 ;include commas, bit 7
0379 3C E3 C cmp al,decsgc
037B 74 6C C jz short mscvd ;decimal with commas
037D 3C E2 C cmp al,repsg
037F 75 0B C jnz short msolc ;not repeat character
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-14
0381 AC C lodsb ;get number of repeats
0382 2C 30 C sub al,30h ;ascii zero based
0384 0F B6 C8 C movzx cx,al ;count
0387 AC C lodsb ;character to repeat
0388 F3/ AA C rep stosb ;expand
038A EB D6 C jmp short msorc
C
038C 3C EA C msolc: cmp al,litsg
038E 75 01 C jnz short msowc ;not literal signal
0390 AC C lodsb ;no translation on character following
C
0391 AA C msowc: stosb ;write character to buffer
0392 0A C0 C or al,al
0394 75 CC C jnz short msorc ;not at end
C
0396 BE 04B4 R C mov si,os iobuf
0399 2B FE C sub di,si ;length
039B 4F C dec di
C ; jz msox ;what?
039C 8B CF C mov cx,di
039E 5F C pop di ;dest
C ; mov ah,40h
C ; mov bx,1 ;stdout
C ; int 21h ;write line
039F B8 B000 C mov ax,vseg
03A2 8E C0 C mov es,ax ;video segment
03A4 B4 07 C mov ah,7 ;attr
03A6 AC C wrsc: lodsb
03A7 AB C stosw
03A8 E2 FC C loop wrsc ;write ms to screen
C
03AA 07 C msox: pop es
03AB 1F C pop ds
03AC 66| 61 C popad
03AE C3 C ret
C
C
C ; Binary to Hex Ascii Conversion
C
C ; ds:si->source text, es:di->output text, ds:bx->current binary parameter
C
03AF AC C mscvh: lodsb ;read character after signal
03B0 FE C8 C dec al
03B2 24 07 C and al,7 ;number of digits (0-7 for 1-8)
03B4 C0 E0 02 C shl al,2 ;times bits per digit
03B7 0F B6 C8 C movzx cx,al ;number of bits minus 4
03BA 66| 8B 07 C mov eax,[bx] ;get parameter
03BD 83 C3 04 C add bx,4 ;address next parameter
03C0 66| D3 C8 C ror eax,cl ;bits 3-0 are ms digit
03C3 C1 E9 02 C shr cx,2
03C6 41 C inc cx ;number of digits
C
03C7 8A F0 C mshxd: mov dh,al ;save 2 digits
03C9 E8 03DF R C call cvhn ;convert al{3:0}
03CC 8A C6 C mov al,dh ;restore 2 digits
03CE 66| C1 C0 04 C rol eax,4 ;pull up next digit
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-15
03D2 E2 F3 C loop mshxd
03D4 EB 8C C jmp short msorc ;continue with text
C
C ; Convert Binary in al to Hex Ascii at es:[di]+
C ; Affects: ax, di
C
03D6 FC C cvhb: cld
03D7 50 C push ax ;save low digit
03D8 C0 E8 04 C shr al,4
03DB E8 03DF R C call cvhn ;convert high digit
03DE 58 C pop ax ;convert low digit
03DF 24 0F C cvhn: and al,0fh
03E1 0C 90 C or al,90h ;90-99, 9A-9F
03E3 27 C daa ;90-99, 100-105
03E4 14 40 C adc al,40h ;D0-D9, 41-46
03E6 27 C daa ;130-139, 41-46
03E7 AA C stosb ;store ascii 0-9, A-F
03E8 C3 C ret
C
C
C ; Binary to Decimal Ascii Conversion
C
C ; ds:si->source text, es:di->output text, ds:bx->current binary parameter
C
C ; dh = 80h, include commas; dh = 40h, suppress leading spaces
C
03E9 AC C mscvd: lodsb ;read character after signal
03EA 66| 33 C9 C xor ecx,ecx ;clear for use as index
03ED 3C 77 C cmp al,'w'
03EF 74 07 C jz short msdwp ;16-bit conversion
03F1 3C 62 C cmp al,'b'
03F3 75 07 C jnz short msdlp ;32-bit conversion
C
03F5 88 4F 01 C mov 1[bx],cl ;8-bit conversion, zero high byte of low word
03F8 89 4F 02 C msdwp: mov 2[bx],cx ;zero high word for 8/16-bit
03FB AC C lodsb ;get next source character
C
03FC FE C8 C msdlp: dec al
03FE 24 0F C and al,0fh
0400 8A C8 C mov cl,al ;number of decimal digits (0-9 for 1-10)
0402 66| 8B 2F C mov ebp,[bx] ;get parameter
0405 83 C3 04 C add bx,4 ;update current parameter address
0408 53 C push bx
C
0409 2C 03 C msdsc: sub al,3
040B 73 FC C jnc short msdsc ;reduce al mod 3
040D 04 03 C add al,3 ;add remainder
040F 8A D8 C mov bl,al ;number of digits before first comma
0411 56 C push si ;save place in source text
C
0412 E3 49 C jcxz msd1 ;one digit only
0414 67| 8D 348D 0000046C C lea si,dcval[ecx*4] ;index into 10� list for number of digits
R C
C
041C FD C msdxd: std ;count downward
041D 66| AD C lodsd ;get 10� where n is current digit
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-16
041F FC C cld ;count upward
C
0420 B2 2F C mov dl,2fh ;ascii count
0422 FE C2 C msdxi: inc dl
0424 78 05 C js short msdov ;overflow
0426 66| 2B E8 C sub ebp,eax ;subtract 10� from parameter value
0429 73 F7 C jnc short msdxi
042B 66| 03 E8 C msdov: add ebp,eax ;leave remainder
C
042E 80 FA 3A C cmp dl,3ah
0431 72 06 C jc short msdno ;no overflow
0433 F9 C stc
0434 66| D1 DD C rcr ebp,1 ;make sure it propagates
0437 B2 2A C mov dl,'*' ;overflow character
C
0439 0A F2 C msdno: or dh,dl ;bits 3-0 are zero if this is a leading zero
043B F6 C6 0F C test dh,0fh ;check whether all zeros so far
043E 8A C2 C mov al,dl ;current digit
0440 75 07 C jnz short msdpc ;display non-leading-zero
0442 B0 20 C mov al,' ' ;change leading zero to space
C
0444 F6 C6 40 C test dh,40h
0447 75 12 C jnz short msdx ;skip leading spaces and commas
C
0449 AA C msdpc: stosb ;write digit to output buffer
C
044A 0A F6 C or dh,dh
044C 79 0D C jns short msdx ;no commas
C
044E FE CB C dec bl ;decrement comma counter
0450 79 09 C jns short msdx ;no action until zero
0452 3C 20 C cmp al,' '
0454 74 02 C jz short msdco ;leave leading space
0456 B0 2C C mov al,','
0458 AA C msdco: stosb ;write comma to output buffer
C
0459 B3 02 C mov bl,2 ;reload counter
045B E2 BF C msdx: loop msdxd ;next digit
045D 8B C5 C msd1: mov ax,bp ;last digit
045F 3D 000A C cmp ax,10
0462 72 02 C jc short msd1n ;no overflow
0464 B0 1A C mov al,1ah ;display *
0466 34 30 C msd1n: xor al,30h
0468 AA C stosb
C
0469 5E C pop si ;restore current index in source text
046A 5B C pop bx ;restore current parameter index
046B E9 0362 R C jmp msorc ;continue with text
C
046E 87 DB C align 4
C
= 046C C dcval equ $-4 ;10� table
C
0470 0000000A 00000064 C dd 10,100,1000,10000,100000,1000000
000003E8 00002710 C
000186A0 000F4240 C
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Page 1-17
0488 00989680 05F5E100 C dd 10000000,100000000,1000000000
3B9ACA00 C
C
0494 C msval: ;parameter list
0494 00000000 C mv1: dd 0
0498 00000000 C mv2: dd 0
049C 00000000 C mv3: dd 0
04A0 00000000 C mv4: dd 0
04A4 00000000 C mv5: dd 0
04A8 00000000 C mv6: dd 0
04AC 00000000 C mv7: dd 0
04B0 00000000 C mv8: dd 0
C
04B4 0200[ C iobuf: db 512 dup (99h) ;output buffer
99 C
] C
C
C
06B4 C msout endp
end
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Symbols-1
Macros:
N a m e Lines
.EOPG . . . . . . . . . . . . . 2
.ILIST . . . . . . . . . . . . . 1
ASYN . . . . . . . . . . . . . . 0
DA . . . . . . . . . . . . . . . 4
DBL . . . . . . . . . . . . . . 2
DSS . . . . . . . . . . . . . . 4
DSTRUC . . . . . . . . . . . . . 8
DV . . . . . . . . . . . . . . . 5
SETMOD . . . . . . . . . . . . . 0
Segments and Groups:
N a m e Size Length Align Combine Class
BIOSDA . . . . . . . . . . . . . 32 Bit 0000 AT 0040
DGROUP . . . . . . . . . . . . . GROUP
_DATA . . . . . . . . . . . . 16 Bit 0837 WORD PUBLIC 'DATA'
RCIOLX_TEXT . . . . . . . . . . 16 Bit 06B4 WORD PUBLIC 'CODE'
Symbols:
N a m e Type Value Attr
AA . . . . . . . . . . . . . . . TEXT .model large
ABORT . . . . . . . . . . . . . NUMBER 0004
BCNT . . . . . . . . . . . . . . L WORD 0000
BGET . . . . . . . . . . . . . . L WORD 0004
BGETC . . . . . . . . . . . . . L NEAR 012D RCIOLX_TEXT
BGGP . . . . . . . . . . . . . . L NEAR 0145 RCIOLX_TEXT
BGNC . . . . . . . . . . . . . . L NEAR 014E RCIOLX_TEXT
BOFST . . . . . . . . . . . . . L WORD 0008
BPGP . . . . . . . . . . . . . . L NEAR 0169 RCIOLX_TEXT
BPUT . . . . . . . . . . . . . . L WORD 0002
BPUTC . . . . . . . . . . . . . L NEAR 0150 RCIOLX_TEXT
BPUTCO . . . . . . . . . . . . . L NEAR 0152 RCIOLX_TEXT
BRDD . . . . . . . . . . . . . . L DWORD 0000 _DATA
BSIZE . . . . . . . . . . . . . L WORD 000A
BUART . . . . . . . . . . . . . L WORD 0010 _DATA
BUFP . . . . . . . . . . . . . . NUMBER 000C
CIABT . . . . . . . . . . . . . L NEAR 00E8 RCIOLX_TEXT
CIERR . . . . . . . . . . . . . L NEAR 001C RCIOLX_TEXT
CIEX . . . . . . . . . . . . . . L NEAR 00F5 RCIOLX_TEXT
CINIT . . . . . . . . . . . . . L NEAR 0022 RCIOLX_TEXT
CTERM . . . . . . . . . . . . . L NEAR 00EB RCIOLX_TEXT
CTSCK . . . . . . . . . . . . . NUMBER 0010
CVHB . . . . . . . . . . . . . . L NEAR 03D6 RCIOLX_TEXT
CVHN . . . . . . . . . . . . . . L NEAR 03DF RCIOLX_TEXT
DCVAL . . . . . . . . . . . . . NEAR 046C RCIOLX_TEXT
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Symbols-2
DECSG . . . . . . . . . . . . . NUMBER 00E4
DECSGC . . . . . . . . . . . . . NUMBER 00E3
DECSGN . . . . . . . . . . . . . NUMBER 00E6
DS1 . . . . . . . . . . . . . . TEXT label byte
DS2 . . . . . . . . . . . . . . TEXT label word
DS4 . . . . . . . . . . . . . . TEXT label dword
DS6 . . . . . . . . . . . . . . TEXT label fword
DS8 . . . . . . . . . . . . . . TEXT label qword
DSSAVE . . . . . . . . . . . . . NUMBER 0000
DTRCK . . . . . . . . . . . . . L NEAR 0336 RCIOLX_TEXT
DTRER . . . . . . . . . . . . . L NEAR 0334 RCIOLX_TEXT
DTREX . . . . . . . . . . . . . L NEAR 034E RCIOLX_TEXT
FINIS . . . . . . . . . . . . . L NEAR 00C6 RCIOLX_TEXT
GIRQ . . . . . . . . . . . . . . L NEAR 006A RCIOLX_TEXT
GVECT . . . . . . . . . . . . . L NEAR 00F9 RCIOLX_TEXT
HEXSG . . . . . . . . . . . . . NUMBER 00E8
HOLD . . . . . . . . . . . . . . NUMBER 0002
IBFLS . . . . . . . . . . . . . L NEAR 010F RCIOLX_TEXT
IC16H . . . . . . . . . . . . . NUMBER 0010
IC29D . . . . . . . . . . . . . NUMBER 0003
IC29H . . . . . . . . . . . . . NUMBER 0001
ICGC . . . . . . . . . . . . . . L NEAR 0184 RCIOLX_TEXT
ICR1 . . . . . . . . . . . . . . NUMBER 0020
ICR2 . . . . . . . . . . . . . . NUMBER 00A0
IER . . . . . . . . . . . . . . NUMBER 0001
IERD . . . . . . . . . . . . . . NUMBER 000B
IIR . . . . . . . . . . . . . . NUMBER 0002
IMR1 . . . . . . . . . . . . . . NUMBER 0021
IMR2 . . . . . . . . . . . . . . NUMBER 00A1
INTCP . . . . . . . . . . . . . L BYTE 0017 _DATA
INTEX . . . . . . . . . . . . . L NEAR 0254 RCIOLX_TEXT
INTMSG . . . . . . . . . . . . . L NEAR 0285 RCIOLX_TEXT
IOBUF . . . . . . . . . . . . . L NEAR 04B4 RCIOLX_TEXT
IRCR . . . . . . . . . . . . . . L BYTE 0015 _DATA
IRQN . . . . . . . . . . . . . . L BYTE 0014 _DATA
IRQV . . . . . . . . . . . . . . L NEAR 0075 RCIOLX_TEXT
ISREP . . . . . . . . . . . . . L NEAR 01D5 RCIOLX_TEXT
ISREX . . . . . . . . . . . . . L NEAR 0279 RCIOLX_TEXT
IV16H . . . . . . . . . . . . . L DWORD 0004 _DATA
IV29H . . . . . . . . . . . . . L DWORD 0008 _DATA
IVB1 . . . . . . . . . . . . . . NUMBER 0008
IVB2 . . . . . . . . . . . . . . NUMBER 0070
IVSIO . . . . . . . . . . . . . L DWORD 000C _DATA
LCR . . . . . . . . . . . . . . NUMBER 0003
LCRD . . . . . . . . . . . . . . NUMBER 0003
LITSG . . . . . . . . . . . . . NUMBER 00EA
LSR . . . . . . . . . . . . . . NUMBER 0005
LSRAD . . . . . . . . . . . . . L WORD 0012 _DATA
MB . . . . . . . . . . . . . . . TEXT byte ptr
MCR . . . . . . . . . . . . . . NUMBER 0004
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Symbols-3
MCRD . . . . . . . . . . . . . . NUMBER 000B
MDLC . . . . . . . . . . . . . . TEXT compact
MDLH . . . . . . . . . . . . . . TEXT huge
MDLL . . . . . . . . . . . . . . TEXT large
MDLM . . . . . . . . . . . . . . TEXT medium
MDLS . . . . . . . . . . . . . . TEXT small
ML . . . . . . . . . . . . . . . TEXT dword ptr
MM . . . . . . . . . . . . . . . TEXT l
MODE . . . . . . . . . . . . . . L BYTE 0019 _DATA
MSCVD . . . . . . . . . . . . . L NEAR 03E9 RCIOLX_TEXT
MSCVH . . . . . . . . . . . . . L NEAR 03AF RCIOLX_TEXT
MSD1 . . . . . . . . . . . . . . L NEAR 045D RCIOLX_TEXT
MSD1N . . . . . . . . . . . . . L NEAR 0466 RCIOLX_TEXT
MSDCO . . . . . . . . . . . . . L NEAR 0458 RCIOLX_TEXT
MSDLP . . . . . . . . . . . . . L NEAR 03FC RCIOLX_TEXT
MSDNO . . . . . . . . . . . . . L NEAR 0439 RCIOLX_TEXT
MSDOV . . . . . . . . . . . . . L NEAR 042B RCIOLX_TEXT
MSDPC . . . . . . . . . . . . . L NEAR 0449 RCIOLX_TEXT
MSDSC . . . . . . . . . . . . . L NEAR 0409 RCIOLX_TEXT
MSDWP . . . . . . . . . . . . . L NEAR 03F8 RCIOLX_TEXT
MSDX . . . . . . . . . . . . . . L NEAR 045B RCIOLX_TEXT
MSDXD . . . . . . . . . . . . . L NEAR 041C RCIOLX_TEXT
MSDXI . . . . . . . . . . . . . L NEAR 0422 RCIOLX_TEXT
MSHXD . . . . . . . . . . . . . L NEAR 03C7 RCIOLX_TEXT
MSOLC . . . . . . . . . . . . . L NEAR 038C RCIOLX_TEXT
MSORC . . . . . . . . . . . . . L NEAR 0362 RCIOLX_TEXT
MSOUT . . . . . . . . . . . . . N PROC 0350 RCIOLX_TEXT Length = 0364
MSOWC . . . . . . . . . . . . . L NEAR 0391 RCIOLX_TEXT
MSOX . . . . . . . . . . . . . . L NEAR 03AA RCIOLX_TEXT
MSR . . . . . . . . . . . . . . NUMBER 0006
MSVAL . . . . . . . . . . . . . L NEAR 0494 RCIOLX_TEXT
MV1 . . . . . . . . . . . . . . L NEAR 0494 RCIOLX_TEXT
MV2 . . . . . . . . . . . . . . L NEAR 0498 RCIOLX_TEXT
MV3 . . . . . . . . . . . . . . L NEAR 049C RCIOLX_TEXT
MV4 . . . . . . . . . . . . . . L NEAR 04A0 RCIOLX_TEXT
MV5 . . . . . . . . . . . . . . L NEAR 04A4 RCIOLX_TEXT
MV6 . . . . . . . . . . . . . . L NEAR 04A8 RCIOLX_TEXT
MV7 . . . . . . . . . . . . . . L NEAR 04AC RCIOLX_TEXT
MV8 . . . . . . . . . . . . . . L NEAR 04B0 RCIOLX_TEXT
MW . . . . . . . . . . . . . . . TEXT word ptr
OBFLS . . . . . . . . . . . . . L NEAR 0117 RCIOLX_TEXT
OCABT . . . . . . . . . . . . . L NEAR 01C6 RCIOLX_TEXT
OCBUF . . . . . . . . . . . . . L NEAR 01BC RCIOLX_TEXT
OCEX . . . . . . . . . . . . . . L NEAR 01C3 RCIOLX_TEXT
OCREP . . . . . . . . . . . . . L NEAR 019D RCIOLX_TEXT
OPERA . . . . . . . . . . . . . L BYTE 0018 _DATA
OS . . . . . . . . . . . . . . . TEXT offset
OVFL . . . . . . . . . . . . . . L BYTE 0006
PB . . . . . . . . . . . . . . . NUMBER 0006
RCPAU . . . . . . . . . . . . . L NEAR 021A RCIOLX_TEXT
REPSG . . . . . . . . . . . . . NUMBER 00E2
RIODS . . . . . . . . . . . . . L NEAR 0000 RCIOLX_TEXT
RXB . . . . . . . . . . . . . . L BYTE 0036 _DATA Length = 0400
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Symbols-4
RXBMX . . . . . . . . . . . . . NUMBER 0400
RXBP . . . . . . . . . . . . . . L BYTE 001E _DATA Length = 000C
RXCCQ . . . . . . . . . . . . . L NEAR 0213 RCIOLX_TEXT
RXCCS . . . . . . . . . . . . . L NEAR 020C RCIOLX_TEXT
RXLOST . . . . . . . . . . . . . NUMBER 0001
RXPCH . . . . . . . . . . . . . L NEAR 0227 RCIOLX_TEXT
S . . . . . . . . . . . . . . . TEXT short
SBINIT . . . . . . . . . . . . . L NEAR 02C0 RCIOLX_TEXT
SCPORT . . . . . . . . . . . . . L NEAR 005F RCIOLX_TEXT
SGCHK . . . . . . . . . . . . . NUMBER 00E0
SIOISR . . . . . . . . . . . . . F PROC 01C7 RCIOLX_TEXT Length = 00ED
SIOVN . . . . . . . . . . . . . L BYTE 0016 _DATA
STATE . . . . . . . . . . . . . L BYTE 001A _DATA
STATUS . . . . . . . . . . . . . L BYTE 001C _DATA
SVECT . . . . . . . . . . . . . L NEAR 0102 RCIOLX_TEXT
TST . . . . . . . . . . . . . . L BYTE 0836 _DATA
TWN . . . . . . . . . . . . . . L NEAR 031A RCIOLX_TEXT
TWS . . . . . . . . . . . . . . L NEAR 031D RCIOLX_TEXT
TWT . . . . . . . . . . . . . . L NEAR 0322 RCIOLX_TEXT
TXB . . . . . . . . . . . . . . L BYTE 0436 _DATA Length = 0400
TXBMX . . . . . . . . . . . . . NUMBER 0400
TXBP . . . . . . . . . . . . . . L BYTE 002A _DATA Length = 000C
TXCHK . . . . . . . . . . . . . L NEAR 0234 RCIOLX_TEXT
TXINTP . . . . . . . . . . . . . L BYTE 001B _DATA
VSEG . . . . . . . . . . . . . . NUMBER B000
WRSC . . . . . . . . . . . . . . L NEAR 03A6 RCIOLX_TEXT
WTDCD . . . . . . . . . . . . . L NEAR 0317 RCIOLX_TEXT
XBFLS . . . . . . . . . . . . . L NEAR 011D RCIOLX_TEXT
@0 . . . . . . . . . . . . . . . L NEAR 0018 RCIOLX_TEXT
@CODE . . . . . . . . . . . . . TEXT rciolx_TEXT
@CODESIZE . . . . . . . . . . . TEXT 1
@CPU . . . . . . . . . . . . . . TEXT 3471
@DATASIZE . . . . . . . . . . . TEXT 1
@FILENAME . . . . . . . . . . . TEXT rciolx
@VERSION . . . . . . . . . . . . TEXT 510
_dtr . . . . . . . . . . . . . . F PROC 02EF RCIOLX_TEXT Global Length = 0061
_incom . . . . . . . . . . . . . F PROC 0171 RCIOLX_TEXT Global Length = 0016
_outcom . . . . . . . . . . . . F PROC 0187 RCIOLX_TEXT Global Length = 0040
_plst . . . . . . . . . . . . . L WORD 001E _DATA Global
_rioini . . . . . . . . . . . . F PROC 0002 RCIOLX_TEXT Global Length = 00F7
_setbaud . . . . . . . . . . . . F PROC 02B4 RCIOLX_TEXT Global Length = 003B
Microsoft Macro Assembler Version 5.10 6/5/91 16:05:11
rciolx Symbols-5
970 Source Lines
1055 Total Lines
191 Symbols
46990 + 355212 Bytes symbol space free
0 Warning Errors
0 Severe Errors
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.