Annotation of sbbs/steve/rciolx.lst, revision 1.1.1.1

1.1       root        1: 
                      2: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                      3: 
                      4: rciolx                                                      Page     1-1
                      5: 
                      6: 
                      7:                                ;************************************************************************
                      8:                                ;*                                                                      *
                      9:                                ;*         rciol: direct 8250 communications interface for C            *
                     10:                                ;*                                                                      *
                     11:                                ;*    prototypes: int   rioini(int,int);     initialize com,irq         *
                     12:                                ;*                int   setbaud(int);        set baud rate              *
                     13:                                ;*      *n/a      int   rioctl(int);         remote i/o control         *
                     14:                                ;*                void  dtr(char);           set/reset dtr              *
                     15:                                ;*                int   outcom(int);         send character             *
                     16:                                ;*                int   incom(void);         receive character          *
                     17:                                ;*      *n/a      int   rioifc(int);         local i/o redirection      *
                     18:                                ;*                                                                      *
                     19:                                ;************************************************************************
                     20:                                
                     21:                                ; this source file is lacking _rioctl and _rioifc
                     22:                                
                     23:  0000                          biosda  segment at 40h          ;bios data area
                     24:  0000                          biosda  ends
                     25:                                
                     26:                                        setmod  %mm
                     27:                                
                     28:                                ; 8259 interrupt controller register equates
                     29:                                
                     30:  = 0020                                icr1    equ     20h             ;interrupt command register (master)
                     31:  = 0021                                imr1    equ     21h             ;interrupt mask register (master)
                     32:  = 0008                                ivb1    equ     8               ;vector base 0-7: cannot be read, assumed
                     33:  = 00A0                                icr2    equ     0a0h            ;interrupt command register (slave)
                     34:  = 00A1                                imr2    equ     0a1h            ;interrupt mask register (slave)
                     35:  = 0070                                ivb2    equ     70h             ;vector base 8-f: cannot be read, assumed
                     36:                                
                     37:                                ; 8250 uart register equates
                     38:                                
                     39:  = 0002                                iir     equ     2               ;interrupt identification register
                     40:  = 0001                                ier     equ     1               ;interrupt enable register
                     41:  = 000B                                ierd    equ     0bh             ;enable: rxd, thre, msr
                     42:                                
                     43:  = 0006                                msr     equ     6               ;modem status register
                     44:  = 0004                                mcr     equ     4               ;modem control register
                     45:  = 000B                                mcrd    equ     0bh             ;irq enable, rts on, dtr on
                     46:                                
                     47:  = 0005                                lsr     equ     5               ;line status register
                     48:  = 0003                                lcr     equ     3               ;line control register
                     49:  = 0003                                lcrd    equ     3               ;N,8,1 mode
                     50:                                
                     51:                                ; buffer pointer structure
                     52:                                
                     53:                                dstruc  bufp,0
                     54:                                        dss     2,bcnt          ;character count
                     55:                                        dss     2,bput          ;next character to buffer
                     56:                                        dss     2,bget          ;next character from buffer
                     57:                                        dss     1,ovfl          ;overflow flag
                     58:                                        dss     1
                     59:                                        dss     2,bofst         ;buffer offset
                     60:                                        dss     2,bsize         ;buffer size
                     61:                                dstruc  bufp
                     62: 
                     63: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                     64: 
                     65: rciolx                                                      Page     1-2
                     66: 
                     67: 
                     68:                                        .data
                     69:                                        public  _plst
                     70:                                
                     71:                                        align 2
                     72:                                
                     73:  0000  0001C200                        brdd    dd      115200          ;baud rate dividend
                     74:                                
                     75:  0004  00000000                        iv16h   dd      0               ;saved interrupt vector for int 16h
                     76:  0008  00000000                        iv29h   dd      0               ;saved interrupt vector for int 29h
                     77:  000C  00000000                        ivsio   dd      0               ;saved serial i/o vector
                     78:                                
                     79:  0010  0000                    buart   dw      0               ;uart base address
                     80:  0012  0000                    lsrad   dw      0               ;line status register port address
                     81:  0014  00                      irqn    db      0               ;interrupt request line
                     82:  0015  00                      ircr    db      0               ;saved interrupt controller mask
                     83:  0016  00                      siovn   db      0               ;serial i/o vector number
                     84:                                
                     85:  = 0001                                ic29h   equ     1               ;int 29h is being intercepted
                     86:  = 0003                                ic29d   equ     3               ;int 29h is being diverted
                     87:  = 0010                                ic16h   equ     10h             ;int 16h is being intercepted
                     88:  0017  00                      intcp   db      0               ;intercepted interrupt code
                     89:                                
                     90:  0018  00                      opera   db      0               ;operational (port defined, baud set)
                     91:                                
                     92:  0019  00                      mode    db      0               ;function enable (incl pause/abort cycles)
                     93:  001A  00                      state   db      0               ;operational state (must follow mode)
                     94:  = 0002                                hold    equ     2               ;stop transmission
                     95:  = 0004                                abort   equ     4               ;aborting
                     96:  = 0010                                ctsck   equ     10h             ;check clear to send signal (mode only, fixed)
                     97:                                
                     98:  001B  00                      txintp  db      0               ;transmit interrupt pending
                     99:  001C  00                      status  db      0               ;communications status
                    100:  = 0001                                rxlost  equ     1               ;received characters lost
                    101:                                
                    102:  001D  00                              align   2
                    103:  = 0400                                txbmx   equ     1024            ;receive buffer maximum size
                    104:  = 0400                                rxbmx   equ     1024            ;transmit buffer maximum size
                    105:                                
                    106:  001E                          _plst   label   word
                    107:                                
                    108:                                dv      rxbp    bufp,0          ;receive buffer pointers
                    109:                                dv      txbp    bufp,0          ;transmit buffer pointers
                    110:                                
                    111:                                dv      rxb     rxbmx,0a8h      ;receive buffer
                    112:                                dv      txb     txbmx,0a8h      ;transmit buffer
                    113:                                
                    114:  0836  00                      tst     db      0
                    115: 
                    116: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    117: 
                    118: rciolx                                                      Page     1-3
                    119: 
                    120: 
                    121:                                        .code
                    122:                                        public  _rioini,_outcom,_incom,_dtr,_setbaud
                    123:                                
                    124:  0000  FFFF                    riods:  dw      -1              ;remote i/o routine data segment value
                    125:                                
                    126:                                ; initialize communications
                    127:                                
                    128:                                ; clear buffers, data, program uart, enable interrupts
                    129:                                
                    130:  0002                          _rioini proc
                    131:  0002  55                              push    bp
                    132:  0003  8B EC                           mov     bp,sp
                    133:  0005  56                              push    si
                    134:  0006  57                              push    di
                    135:                                
                    136:  0007  8B 46 06                                mov     ax,pb[bp]       ;com port or uart address
                    137:  000A  0B C0                           or      ax,ax
                    138:  000C  A1 0010 R                       mov     ax,buart
                    139:  000F  75 07                           jnz     @f              ;initialize
                    140:  0011  0B C0                           or      ax,ax
                    141:  0013  74 07                           jz      cierr           ;error, not initialized
                    142:  0015  E9 00C6 R                       jmp     finis           ;terminate
                    143:                                
                    144:  0018  0B C0                   @@:     or      ax,ax
                    145:  001A  74 06                           jz      cinit           ;continue, not yet initialized
                    146:  001C  B8 FFFF                 cierr:  mov     ax,-1
                    147:  001F  E9 00F5 R                       jmp     ciex            ;return error
                    148:                                
                    149:  0022  8C D8                   cinit:  mov     ax,ds
                    150:  0024  2E: A3 0000 R                   mov     cs:riods,ax             ;save data segment
                    151:                                
                    152:  0028  E8 010F R                       call    ibfls                   ;clear input buffer
                    153:  002B  C7 44 08 0036 R                 mov     bofst[si],os rxb        ;set receive buffer address
                    154:  0030  E8 0117 R                       call    obfls                   ;clear output buffer
                    155:  0033  C7 44 08 0436 R                 mov     bofst[si],os txb        ;set transmit buffer address
                    156:                                
                    157:  0038  33 C0                           xor     ax,ax
                    158:  003A  A3 0019 R                       mov     mode,ax         ;clear mode and state
                    159:  003D  A2 001B R                       mov     txintp,al       ;clear int pending
                    160:                                
                    161:  0040  B8 ---- R                       mov     ax,seg biosda
                    162:  0043  8E C0                           mov     es,ax
                    163:  0045  8B 5E 06                                mov     bx,pb[bp]       ;com port or uart address
                    164:  0048  8B D3                           mov     dx,bx
                    165:  004A  4B                              dec     bx
                    166:  004B  83 FB 04                                cmp     bx,4
                    167:  004E  73 0F                           jnc     scport          ;com port address specified
                    168:                                
                    169:  0050  83 E3 03                                and     bx,3            ;com 0-3 for 1-4
                    170:  0053  03 DB                           add     bx,bx           ;offset (x 2)
                    171:  0055  26: 8B 17                       mov     dx,es:[bx]
                    172:  0058  0B D2                           or      dx,dx
                    173:  005A  75 03                           jnz     scport          ;port exists
                    174:  005C  E9 00E8 R                       jmp     ciabt           ;no such com port
                    175:                                
                    176:  005F  89 16 0010 R            scport: mov     buart,dx        ;uart base address
                    177: 
                    178: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    179: 
                    180: rciolx                                                      Page     1-4
                    181: 
                    182: 
                    183:  0063  83 C2 05                                add     dx,lsr
                    184:  0066  89 16 0012 R                    mov     lsrad,dx        ;line status register
                    185:                                
                    186:                                ;       mov     al,pb[bp+4]     ;hardware flow control
                    187:                                ;       and     al,1
                    188:                                ;       jz      girq
                    189:                                ;       or      mode,ctsck      ;check cts
                    190:                                
                    191:  006A  8A 46 08                        girq:   mov     al,pb[bp+2]     ;irq line
                    192:  006D  24 07                           and     al,7
                    193:  006F  75 04                           jnz     irqv            ;valid
                    194:  0071  24 01                           and     al,1
                    195:  0073  04 03                           add     al,3            ;assume 4 for 1, 3 for 2
                    196:  0075  A2 0014 R               irqv:   mov     irqn,al
                    197:  0078  8A C8                           mov     cl,al
                    198:  007A  B0 01                           mov     al,1
                    199:  007C  D2 E0                           shl     al,cl           ;mask for current irq line
                    200:                                ;       mov     irqm,al
                    201:  007E  8A E0                           mov     ah,al
                    202:  0080  50                              push    ax              ;save irq mask
                    203:  0081  E4 21                           in      al,imr1
                    204:  0083  A2 0015 R                       mov     ircr,al         ;save prior enable mask
                    205:  0086  0A C4                           or      al,ah
                    206:  0088  E6 21                           out     imr1,al         ;inhibit interrupts
                    207:  008A  8A C1                           mov     al,cl           ;irq number
                    208:  008C  04 08                           add     al,ivb1         ;add vector base
                    209:  008E  A2 0016 R                       mov     siovn,al        ;save sio vector
                    210:  0091  E8 00F9 R                       call    gvect           ;get prior vector in dx:bx
                    211:  0094  89 1E 000C R                    mov     ivsio,bx
                    212:  0098  89 16 000E R                    mov     ivsio+2,dx      ;save prior vector
                    213:  009C  0E                              push    cs
                    214:  009D  5A                              pop     dx
                    215:  009E  BB 01C7 R                       mov     bx,os sioisr
                    216:  00A1  E8 0102 R                       call    svect           ;set service routine vector in dx:bx
                    217:                                
                    218:  00A4  8B 16 0010 R                    mov     dx,buart
                    219:  00A8  ED                              in      ax,dx           ;clear%
                    220:  00A9  83 C2 04                                add     dx,mcr
                    221:  00AC  B0 0B                           mov     al,mcrd
                    222:  00AE  EE                              out     dx,al           ;modem control register
                    223:  00AF  4A                              dec     dx
                    224:  00B0  B0 03                           mov     al,lcrd
                    225:  00B2  EE                              out     dx,al           ;line control register
                    226:  00B3  4A                              dec     dx
                    227:  00B4  4A                              dec     dx
                    228:  00B5  B0 0B                           mov     al,ierd
                    229:  00B7  EE                              out     dx,al           ;interrupt enable register
                    230:                                
                    231:  00B8  58                              pop     ax              ;irq mask
                    232:  00B9  E4 21                           in      al,imr1
                    233:  00BB  F6 D4                           not     ah
                    234:  00BD  22 C4                           and     al,ah
                    235:  00BF  E6 21                           out     imr1,al         ;enable interrupts
                    236:                                
                    237:                                ;       mov     mw cs:mv2,1234h
                    238:                                ;       xor     ax,ax
                    239: 
                    240: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    241: 
                    242: rciolx                                                      Page     1-5
                    243: 
                    244: 
                    245:                                ;       mov     si,os inims
                    246:                                ;       call    msout
                    247:                                
                    248:  00C1  33 C0                           xor     ax,ax           ;return 0
                    249:  00C3  EB 30 90                                jmp     ciex            ;exit
                    250:                                
                    251:                                ; terminate serial i/o operation
                    252:                                
                    253:  00C6  8B 16 0010 R            finis:  mov     dx,buart
                    254:  00CA  83 C2 04                                add     dx,mcr
                    255:  00CD  32 C0                           xor     al,al
                    256:  00CF  EE                              out     dx,al           ;dtr off, release irq line
                    257:                                
                    258:  00D0  A0 0016 R                       mov     al,siovn        ;serial i/o vector
                    259:  00D3  8B 1E 000C R                    mov     bx,ivsio        ;prior offset
                    260:  00D7  8B 16 000E R                    mov     dx,ivsio+2      ;prior segment
                    261:  00DB  E8 0102 R                       call    svect           ;replace original vector
                    262:                                
                    263:  00DE  A0 0015 R                       mov     al,ircr
                    264:  00E1  E6 21                           out     imr1,al         ;replace prior interrupt controller mask
                    265:  00E3  33 DB                           xor     bx,bx
                    266:  00E5  EB 04 90                                jmp     cterm           ;return 0
                    267:                                
                    268:  00E8  BB FFFF                 ciabt:  mov     bx,-1
                    269:  00EB  33 C0                   cterm:  xor     ax,ax
                    270:  00ED  A3 0010 R                       mov     buart,ax        ;not initialized
                    271:  00F0  A2 0018 R                       mov     opera,al        ;not operational
                    272:  00F3  8B C3                           mov     ax,bx           ;return code
                    273:  00F5  5F                      ciex:   pop     di
                    274:  00F6  5E                              pop     si
                    275:  00F7  5D                              pop     bp
                    276:  00F8  CB                              ret
                    277:                                
                    278:  00F9                          _rioini endp
                    279:                                
                    280:                                
                    281:                                ; get interrupt vector al in dx:bx
                    282:                                
                    283:  00F9  06                      gvect:  push    es
                    284:  00FA  B4 35                           mov     ah,35h
                    285:  00FC  CD 21                           int     21h             ;returns vector in es:bx
                    286:  00FE  06                              push    es
                    287:  00FF  5A                              pop     dx              ;segment
                    288:  0100  07                              pop     es
                    289:  0101  C3                              ret
                    290:                                
                    291:                                ; set interrupt vector al in dx:bx
                    292:                                
                    293:  0102  1E                      svect:  push    ds
                    294:  0103  52                              push    dx
                    295:  0104  8E DA                           mov     ds,dx           ;segment
                    296:  0106  8B D3                           mov     dx,bx           ;offset
                    297:  0108  B4 25                           mov     ah,25h
                    298:  010A  CD 21                           int     21h             ;takes vector in ds:dx
                    299:  010C  5A                              pop     dx
                    300:  010D  1F                              pop     ds
                    301: 
                    302: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    303: 
                    304: rciolx                                                      Page     1-6
                    305: 
                    306: 
                    307:  010E  C3                              ret
                    308:                                
                    309:                                
                    310:                                ; flush buffers
                    311:                                
                    312:  010F  BE 001E R               ibfls:  mov     si,os rxbp      ;address input buffer pointers
                    313:  0112  BB 0400                         mov     bx,rxbmx        ;set maximum size
                    314:  0115  EB 06                           jmp     s xbfls
                    315:  0117  BE 002A R               obfls:  mov     si,os txbp      ;address output buffer pointers
                    316:  011A  BB 0400                         mov     bx,txbmx        ;set maximum size
                    317:                                
                    318:                                ; si -> bufp structure, bx = maximum size
                    319:                                
                    320:  011D  B9 0004                 xbfls:  mov     cx,os bofst/2   ;pointer list length
                    321:  0120  9C                              pushf
                    322:  0121  FA                              cli
                    323:  0122  56                              push    si
                    324:  0123  33 C0                           xor     ax,ax
                    325:  0125  F3/ AB                          rep     stosw           ;clear pointers
                    326:  0127  5E                              pop     si
                    327:  0128  89 5C 0A                                mov     bsize[si],bx
                    328:  012B  9D                              popf
                    329:  012C  C3                              ret
                    330:                                
                    331:                                
                    332:                                ; get character from buffer, ds:si -> pointers, saves cx, dx
                    333:                                
                    334:  012D  8B 04                   bgetc:  mov     ax,bcnt[si]
                    335:  012F  0B C0                           or      ax,ax
                    336:  0131  74 1B                           jz      bgnc            ;buffer empty
                    337:                                
                    338:  0133  9C                              pushf
                    339:  0134  FA                              cli
                    340:  0135  8B 5C 08                                mov     bx,bofst[si]    ;buffer offset from segment
                    341:  0138  8B 7C 04                                mov     di,bget[si]     ;character offset from buffer
                    342:  013B  8A 01                           mov     al,mb [bx+di]   ;get character
                    343:  013D  47                              inc     di              ;advance pointer
                    344:  013E  3B 7C 0A                                cmp     di,bsize[si]
                    345:  0141  72 02                           jc      bggp            ;pointer not past end of buffer
                    346:  0143  33 FF                           xor     di,di           ;reset to start
                    347:  0145  89 7C 04                        bggp:   mov     bget[si],di
                    348:  0148  FF 0C                           dec     bcnt[si]        ;character count
                    349:  014A  9D                              popf                    ;re-enable interrupts if disabled
                    350:  014B  0A C0                           or      al,al           ;character in al, clear carry
                    351:  014D  C3                              ret
                    352:                                
                    353:  014E  F9                      bgnc:   stc
                    354:  014F  C3                              ret
                    355:                                
                    356:                                
                    357:                                ; put character to buffer, ds:si -> pointers, al = char, saves ax, cx, dx
                    358:                                
                    359:  0150  8B 1C                   bputc:  mov     bx,bcnt[si]
                    360:  0152  3B 5C 0A                        bputco: cmp     bx,bsize[si]
                    361:  0155  73 F7                           jnc     bgnc            ;buffer full
                    362:                                
                    363: 
                    364: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    365: 
                    366: rciolx                                                      Page     1-7
                    367: 
                    368: 
                    369:  0157  9C                              pushf
                    370:  0158  FA                              cli
                    371:  0159  8B 5C 08                                mov     bx,bofst[si]    ;buffer offset from segment
                    372:  015C  8B 7C 02                                mov     di,bput[si]     ;character offset from buffer
                    373:  015F  88 01                           mov     mb [bx+di],al   ;put character
                    374:  0161  47                              inc     di              ;advance pointer
                    375:  0162  3B 7C 0A                                cmp     di,bsize[si]
                    376:  0165  72 02                           jc      bpgp            ;pointer not past end of buffer
                    377:  0167  33 FF                           xor     di,di           ;reset to start
                    378:  0169  89 7C 02                        bpgp:   mov     bput[si],di
                    379:  016C  FF 04                           inc     bcnt[si]        ;character count
                    380:  016E  9D                              popf                    ;re-enable interrupts if disabled
                    381:  016F  F8                              clc                     ;character in al, clear carry
                    382:  0170  C3                              ret
                    383:                                
                    384:                                
                    385:                                ; sio input character
                    386:                                
                    387:  0171                          _incom  proc
                    388:  0171  56                              push    si
                    389:  0172  57                              push    di
                    390:                                
                    391:  0173  BE 001E R                       mov     si,os rxbp      ;address receive buffer pointers
                    392:  0176  E8 012D R                       call    bgetc           ;get character from receive buffer
                    393:  0179  8A 26 001A R                    mov     ah,state
                    394:  017D  73 05                           jnc     icgc            ;received character in al
                    395:  017F  80 CC 01                                or      ah,1            ;no character available
                    396:  0182  32 C0                           xor     al,al
                    397:                                
                    398:  0184  5F                      icgc:   pop     di
                    399:  0185  5E                              pop     si
                    400:  0186  CB                              ret
                    401:  0187                          _incom  endp
                    402:                                
                    403:                                
                    404:                                ; sio output character
                    405:                                
                    406:  0187                          _outcom proc
                    407:  0187  32 C0                           xor     al,al
                    408:  0189  8A 26 001A R                    mov     ah,state
                    409:  018D  F6 C4 04                                test    ah,abort
                    410:  0190  75 34                           jnz     ocabt           ;aborting
                    411:                                
                    412:  0192  55                              push    bp
                    413:  0193  8B EC                           mov     bp,sp
                    414:  0195  56                              push    si
                    415:  0196  57                              push    di
                    416:                                
                    417:  0197  8A 46 06                                mov     al,pb[bp]
                    418:  019A  BE 002A R                       mov     si,os txbp      ;address transmit buffer pointers
                    419:                                
                    420:  019D  8B 1C                   ocrep:  mov     bx,bcnt[si]
                    421:  019F  0B DB                           or      bx,bx
                    422:  01A1  75 19                           jnz     ocbuf           ;buffer not empty
                    423:                                
                    424:  01A3  F6 C4 02                                test    ah,hold
                    425: 
                    426: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    427: 
                    428: rciolx                                                      Page     1-8
                    429: 
                    430: 
                    431:  01A6  75 14                           jnz     ocbuf           ;paused
                    432:                                
                    433:  01A8  8B 16 0012 R                    mov     dx,lsrad        ;address line status register
                    434:  01AC  8A C8                           mov     cl,al
                    435:  01AE  EC                              in      al,dx
                    436:  01AF  24 20                           and     al,20h          ;transmit hold register empty
                    437:  01B1  8A C1                           mov     al,cl
                    438:  01B3  74 07                           jz      ocbuf           ;interrupt pending
                    439:                                
                    440:  01B5  8B 16 0010 R                    mov     dx,buart        ;uart base (r/w data port)
                    441:  01B9  EE                              out     dx,al           ;transmit character
                    442:  01BA  EB 07                           jmp     s ocex          ;exit
                    443:                                
                    444:  01BC  E8 0152 R               ocbuf:  call    bputco          ;put character to transmit buffer
                    445:  01BF  73 02                           jnc     ocex            ;done
                    446:                                
                    447:                                        ;check timer, exit if 2 min.
                    448:                                
                    449:  01C1  EB DA                           jmp     ocrep           ;retry
                    450:                                
                    451:  01C3  5F                      ocex:   pop     di
                    452:  01C4  5E                              pop     si
                    453:  01C5  5D                              pop     bp
                    454:  01C6  CB                      ocabt:  ret                     ;state in ah
                    455:  01C7                          _outcom endp
                    456:                                
                    457:                                
                    458:                                ; sio interrupt service routine
                    459:                                
                    460:  01C7                          sioisr  proc
                    461:  01C7  FA                              cli
                    462:  01C8  50                              push    ax
                    463:  01C9  53                              push    bx
                    464:  01CA  51                              push    cx
                    465:  01CB  52                              push    dx
                    466:  01CC  56                              push    si
                    467:  01CD  57                              push    di
                    468:  01CE  1E                              push    ds
                    469:                                
                    470:  01CF  2E: A1 0000 R                   mov     ax,cs:riods
                    471:  01D3  8E D8                           mov     ds,ax           ;i/o data segment
                    472:                                
                    473:  01D5  8B 16 0012 R            isrep:  mov     dx,lsrad        ;line status register
                    474:  01D9  ED                              in      ax,dx           ;lsr in al, msr in ah
                    475:  01DA  2E: A3 0498 R                   mov     mw cs:mv2,ax    ;%
                    476:  01DE  8B C8                           mov     cx,ax           ;save line status
                    477:  01E0  83 EA 05                                sub     dx,lsr          ;address r/w data port
                    478:  01E3  A8 01                           test    al,1            ;received data available
                    479:  01E5  74 4D                           jz      txchk           ;no character received
                    480:                                
                    481:  01E7  A8 0C                           test    al,0ch          ;overrun/parity/framing error
                    482:  01E9  EC                              in      al,dx           ;read data
                    483:  01EA  75 48                           jnz     txchk           ;receive error, discard data
                    484:                                
                    485:  01EC  8B 1E 0019 R                    mov     bx,mode         ;mode in bl, state in bh
                    486:  01F0  F6 C7 04                                test    bh,abort
                    487: 
                    488: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    489: 
                    490: rciolx                                                      Page     1-9
                    491: 
                    492: 
                    493:  01F3  75 5F                           jnz     intex           ;aborting
                    494:  01F5  F6 C3 04                                test    bl,abort
                    495:  01F8  74 20                           jz      rcpau           ;not checking for abort
                    496:  01FA  3C 03                           cmp     al,3            ;^C
                    497:  01FC  75 1C                           jnz     rcpau           ;not abort character
                    498:                                
                    499:  01FE  E8 010F R                       call    ibfls           ;flush input buffer
                    500:  0201  E8 0117 R                       call    obfls           ;flush output buffer
                    501:  0204  C6 06 001A R 04                 mov     state,abort     ;aborting
                    502:  0209  EB 49 90                                jmp     intex
                    503:                                
                    504:  020C  C6 06 001A R 02         rxccs:  mov     state,hold      ;set pause flag
                    505:  0211  EB 21                           jmp     s txchk
                    506:  0213  80 26 001A R FD         rxccq:  and     state,not hold  ;clear pause flag
                    507:  0218  EB 1A                           jmp     s txchk
                    508:                                
                    509:  021A  F6 C3 02                        rcpau:  test    bl,hold
                    510:  021D  74 08                           jz      rxpch           ;not checking pause
                    511:  021F  3C 13                           cmp     al,13h          ;^s
                    512:  0221  74 E9                           jz      rxccs           ;pause
                    513:  0223  3C 10                           cmp     al,10h          ;^q
                    514:  0225  74 EC                           jz      rxccq           ;resume
                    515:                                
                    516:  0227  BE 001E R               rxpch:  mov     si,os rxbp      ;address receive buffer
                    517:  022A  E8 0150 R                       call    bputc           ;put character in buffer
                    518:  022D  73 05                           jnc     txchk           ;done
                    519:  022F  80 0E 001C R 01                 or      status,rxlost   ;set receive characters lost flag
                    520:                                
                    521:  0234  F6 C1 20                        txchk:  test    cl,20h          ;transmit hold register empty
                    522:  0237  74 1B                           jz      intex           ;not ready to transmit
                    523:                                
                    524:  0239  BE 002A R                       mov     si,os txbp      ;address transmit buffer
                    525:  023C  E8 012D R                       call    bgetc
                    526:  023F  72 13                           jc      intex           ;buffer empty
                    527:                                
                    528:  0241  8B 1E 0019 R                    mov     bx,mode         ;mode in bl, state in bh
                    529:  0245  F6 D5                           not     ch
                    530:  0247  22 EB                           and     ch,bl           ;mode and not msr
                    531:  0249  F6 C5 10                                test    ch,ctsck        ;cts checking and cts off
                    532:  024C  75 06                           jnz     intex           ;hardware flow off, interrupt will resume
                    533:                                
                    534:  024E  F6 C7 02                                test    bh,hold
                    535:  0251  75 01                           jnz     intex           ;paused
                    536:                                
                    537:  0253  EE                              out     dx,al           ;transmit character
                    538:                                
                    539:  0254  8B 16 0010 R            intex:  mov     dx,buart
                    540:  0258  83 C2 02                                add     dx,iir
                    541:  025B  EC                              in      al,dx           ;reset int?
                    542:  025C  EC                              in      al,dx
                    543:                                ;       and     al,1
                    544:                                ;       jnz     isrex           ;more?
                    545:                                ;       jmp     isrep
                    546:                                
                    547:  025D  2E: FF 06 0494 R                        inc     mw cs:mv1
                    548:  0262  A1 001E R                       mov     ax,rxbp.bcnt
                    549: 
                    550: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    551: 
                    552: rciolx                                                      Page     1-10
                    553: 
                    554: 
                    555:  0265  2E: A3 049C R                   mov     mw cs:mv3,ax
                    556:  0269  A1 002A R                       mov     ax,txbp.bcnt
                    557:  026C  2E: A3 04A0 R                   mov     mw cs:mv4,ax
                    558:  0270  B8 0320                         mov     ax,800
                    559:  0273  BE 0285 R                       mov     si,os intmsg
                    560:  0276  E8 0350 R                       call    msout
                    561:                                
                    562:  0279  1F                      isrex:  pop     ds
                    563:  027A  5F                              pop     di
                    564:  027B  5E                              pop     si
                    565:  027C  5A                              pop     dx
                    566:  027D  59                              pop     cx
                    567:  027E  5B                              pop     bx
                    568:  027F  B0 20                           mov     al,20h
                    569:  0281  E6 20                           out     icr1,al         ;non-specific eoi
                    570:  0283  58                              pop     ax
                    571:  0284  CF                              iret
                    572:                                
                    573:  0285  49 6E 74 65 72 72       intmsg: db      'Interrupt �5, msr/lsr �4, rxbc �4, txbc �4    ',0
                    574:        75 70 74 20 E4 35       
                    575:        2C 20 6D 73 72 2F       
                    576:        6C 73 72 20 E8 34       
                    577:        2C 20 72 78 62 63       
                    578:        20 E8 34 2C 20 74       
                    579:        78 62 63 20 E8 34       
                    580:        20 20 20 20 00          
                    581:                                
                    582:  02B4                          sioisr  endp
                    583:                                
                    584:                                
                    585:                                ; set baud rate
                    586:                                
                    587:  02B4                          _setbaud proc
                    588:  02B4  8B 16 0010 R                    mov     dx,buart        ;base port address
                    589:  02B8  0B D2                           or      dx,dx
                    590:  02BA  75 04                           jnz     sbinit          ;initialized
                    591:  02BC  33 C0                           xor     ax,ax
                    592:  02BE  48                              dec     ax              ;-1
                    593:  02BF  CB                              ret                     ;return error
                    594:                                
                    595:  02C0  55                      sbinit: push    bp
                    596:  02C1  8B EC                           mov     bp,sp
                    597:  02C3  56                              push    si
                    598:  02C4  8B CA                           mov     cx,dx   ;%
                    599:  02C6  BE 0000 R                       mov     si,os brdd      ;address baud rate dividend
                    600:  02C9  8B 54 02                                mov     dx,2[si]
                    601:  02CC  8B 04                           mov     ax,[si]         ;dividend in dx:ax
                    602:  02CE  F7 76 06                                div     mw pb[bp]       ;divide by parameter 1
                    603:  02D1  8B D1                           mov     dx,cx   ;%
                    604:  02D3  50                              push    ax              ;actual rate divisor for uart
                    605:  02D4  8B F2                           mov     si,dx
                    606:  02D6  83 C2 03                                add     dx,lcr          ;address line control register
                    607:  02D9  EC                              in      al,dx
                    608:  02DA  0C 80                           or      al,80h
                    609:  02DC  EE                              out     dx,al           ;address baud rate divisor
                    610:  02DD  87 F2                           xchg    si,dx
                    611: 
                    612: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    613: 
                    614: rciolx                                                      Page     1-11
                    615: 
                    616: 
                    617:  02DF  58                              pop     ax
                    618:  02E0  EF                              out     dx,ax           ;write baud rate divisor
                    619:  02E1  87 F2                           xchg    si,dx
                    620:  02E3  EC                              in      al,dx
                    621:  02E4  24 7F                           and     al,7fh
                    622:  02E6  EE                              out     dx,al           ;address rx/tx registers, ier
                    623:  02E7  87 F2                           xchg    si,dx
                    624:  02E9  ED                              in      ax,dx           ;clear%
                    625:                                
                    626:  02EA  33 C0                           xor     ax,ax           ;no error
                    627:  02EC  5E                              pop     si
                    628:  02ED  5D                              pop     bp
                    629:  02EE  CB                              ret
                    630:  02EF                          _setbaud endp
                    631: 
                    632: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    633: 
                    634: rciolx                                                      Page     1-12
                    635: 
                    636: 
                    637:                                ; drop dtr
                    638:                                
                    639:                                ; n=0 (off), n=1 (on), or n>1 (off, wait n seconds for dcd off)
                    640:                                
                    641:  02EF                          _dtr    proc
                    642:                                
                    643:  02EF  55                              push    bp
                    644:  02F0  8B EC                           mov     bp,sp
                    645:  02F2  B8 ---- R                       mov     ax,seg biosda
                    646:  02F5  8E C0                           mov     es,ax
                    647:                                
                    648:  02F7  8B 16 0010 R                    mov     dx,buart        ;uart base port
                    649:  02FB  0B D2                           or      dx,dx
                    650:  02FD  74 35                           jz      dtrer           ;not initialized
                    651:                                
                    652:  02FF  83 C2 04                                add     dx,4            ;address mcr
                    653:  0302  EC                              in      al,dx
                    654:  0303  24 FE                           and     al,0feh         ;clear dtr bit
                    655:  0305  8A 66 06                                mov     ah,pb[bp]       ;parameter
                    656:  0308  80 E4 0F                                and     ah,0fh
                    657:  030B  80 FC 02                                cmp     ah,2            ;0 off, 1 on
                    658:  030E  73 07                           jnc     wtdcd           ;off, wait for dcd
                    659:  0310  0A C4                           or      al,ah
                    660:  0312  EE                              out     dx,al           ;set as specified
                    661:  0313  32 C0                           xor     al,al
                    662:  0315  EB 1F                           jmp     s dtrck
                    663:                                
                    664:  0317  EE                      wtdcd:  out     dx,al           ;dtr off
                    665:  0318  42                              inc     dx
                    666:  0319  42                              inc     dx              ;address msr
                    667:                                
                    668:  031A  B9 0012                 twn:    mov     cx,18           ;55ms/s
                    669:  031D  26: 8A 1E 006C          tws:    mov     bl,es:[6ch]     ;55ms counter
                    670:  0322  EC                      twt:    in      al,dx
                    671:  0323  24 80                           and     al,80h          ;dcd
                    672:  0325  74 0F                           jz      dtrck           ;done
                    673:  0327  26: 3A 1E 006C                  cmp     bl,es:[6ch]     ;55ms counter
                    674:  032C  74 F4                           jz      twt             ;wait 55ms
                    675:  032E  E2 ED                           loop    tws             ;wait 990ms
                    676:  0330  FE CC                           dec     ah
                    677:  0332  75 E6                           jnz     twn             ;wait 2-x seconds
                    678:  0334  B0 FF                   dtrer:  mov     al,-1           ;timeout
                    679:                                
                    680:  0336  8A E0                   dtrck:  mov     ah,al
                    681:  0338  80 7E 06 01                     cmp     mb pb[bp],1
                    682:  033C  74 10                           jz      dtrex           ;dtr was set
                    683:                                
                    684:  033E  50                              push    ax              ;dtr was reset, clear state and buffers
                    685:  033F  E8 010F R                       call    ibfls
                    686:  0342  E8 0117 R                       call    obfls
                    687:  0345  32 C0                           xor     al,al
                    688:  0347  A2 001A R                       mov     state,al
                    689:  034A  A2 001C R                       mov     status,al
                    690:  034D  58                              pop     ax
                    691:                                
                    692:  034E  5D                      dtrex:  pop     bp
                    693: 
                    694: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    695: 
                    696: rciolx                                                      Page     1-13
                    697: 
                    698: 
                    699:  034F  CB                              ret
                    700:  0350                          _dtr    endp
                    701:                                
                    702:                                        include mviow
                    703:                             C          .386P
                    704:                             C  
                    705:  = B000                      C vseg    equ     0b000h  ;video ram segment address
                    706:                             C  
                    707:                             C  ;****************************************************************************
                    708:                             C  ;*                                                                          *
                    709:                             C  ;*  Procedure msout     On entry ds:si -> text, terminated with 0.          *
                    710:                             C  ;*                                                                          *
                    711:                             C  ;*  Display message on standard output, convert parameters to hex ascii or  *
                    712:                             C  ;*  decimal ascii for each �n, �n, �n in message where n=number of digits.  *
                    713:                             C  ;*  Repeat character c for �nc, where n=(number of repetitions plus 30h).   *
                    714:                             C  ;*                                                                          *
                    715:                             C  ;****************************************************************************
                    716:                             C  
                    717:  = 00EA                      C litsg   equ     '�'             ;next character is to be output directly
                    718:  = 00E8                      C hexsg   equ     '�'             ;hexadecimal conversion signal
                    719:  = 00E4                      C decsg   equ     '�'             ;decimal conversion signal
                    720:  = 00E6                      C decsgn  equ     '�'             ;decimal conversion, leading spaces suppressed
                    721:  = 00E3                      C decsgc  equ     '�'             ;decimal conversion, use commas
                    722:  = 00E2                      C repsg   equ     '�'             ;repeat character signal
                    723:  = 00E0                      C sgchk   equ     '�'             ;all characters below this value are literals
                    724:                             C  
                    725:  0350                        C msout   proc    near
                    726:  0350  66| 60                C         pushad
                    727:  0352  1E                    C         push    ds
                    728:  0353  06                    C         push    es
                    729:  0354  50                    C         push    ax
                    730:                             C  
                    731:  0355  8C C8                 C         mov     ax,cs
                    732:  0357  8E D8                 C         mov     ds,ax
                    733:  0359  8E C0                 C         mov     es,ax
                    734:  035B  BF 04B4 R             C         mov     di,os iobuf     ;output buffer
                    735:  035E  BB 0494 R             C         mov     bx,os msval     ;parameter list
                    736:  0361  FC                    C         cld
                    737:                             C  
                    738:  0362  AC                    C msorc:  lodsb                   ;read character
                    739:  0363  3C E0                 C         cmp     al,sgchk
                    740:  0365  72 2A                 C         jc      short msowc     ;not conversion character
                    741:                             C  
                    742:  0367  3C E8                 C         cmp     al,hexsg
                    743:  0369  74 44                 C         jz      short mscvh     ;hex conversion character
                    744:  036B  32 F6                 C         xor     dh,dh           ;decimal type flag
                    745:  036D  3C E4                 C         cmp     al,decsg
                    746:  036F  74 78                 C         jz      short mscvd     ;decimal conversion
                    747:  0371  B6 40                 C         mov     dh,40h          ;leading space suppress, bit 6
                    748:  0373  3C E6                 C         cmp     al,decsgn
                    749:  0375  74 72                 C         jz      short mscvd     ;decimal, suppress leading spaces
                    750:  0377  D0 E6                 C         shl     dh,1            ;include commas, bit 7
                    751:  0379  3C E3                 C         cmp     al,decsgc
                    752:  037B  74 6C                 C         jz      short mscvd     ;decimal with commas
                    753:  037D  3C E2                 C         cmp     al,repsg
                    754:  037F  75 0B                 C         jnz     short msolc     ;not repeat character
                    755: 
                    756: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    757: 
                    758: rciolx                                                      Page     1-14
                    759: 
                    760: 
                    761:  0381  AC                    C         lodsb                   ;get number of repeats
                    762:  0382  2C 30                 C         sub     al,30h          ;ascii zero based
                    763:  0384  0F B6 C8              C         movzx   cx,al           ;count
                    764:  0387  AC                    C         lodsb                   ;character to repeat
                    765:  0388  F3/ AA                C         rep     stosb           ;expand
                    766:  038A  EB D6                 C         jmp     short msorc
                    767:                             C  
                    768:  038C  3C EA                 C msolc:  cmp     al,litsg
                    769:  038E  75 01                 C         jnz     short msowc     ;not literal signal
                    770:  0390  AC                    C         lodsb                   ;no translation on character following
                    771:                             C  
                    772:  0391  AA                    C msowc:  stosb                   ;write character to buffer
                    773:  0392  0A C0                 C         or      al,al
                    774:  0394  75 CC                 C         jnz     short msorc     ;not at end
                    775:                             C  
                    776:  0396  BE 04B4 R             C         mov     si,os iobuf
                    777:  0399  2B FE                 C         sub     di,si           ;length
                    778:  039B  4F                    C         dec     di
                    779:                             C                                  ;       jz      msox            ;what?
                    780:  039C  8B CF                 C         mov     cx,di
                    781:  039E  5F                    C         pop     di              ;dest
                    782:                             C                                  ;       mov     ah,40h
                    783:                             C                                  ;       mov     bx,1            ;stdout
                    784:                             C                                  ;       int     21h             ;write line
                    785:  039F  B8 B000               C         mov     ax,vseg
                    786:  03A2  8E C0                 C         mov     es,ax           ;video segment
                    787:  03A4  B4 07                 C         mov     ah,7            ;attr
                    788:  03A6  AC                    C wrsc:   lodsb
                    789:  03A7  AB                    C         stosw
                    790:  03A8  E2 FC                 C         loop    wrsc            ;write ms to screen
                    791:                             C  
                    792:  03AA  07                    C msox:   pop     es
                    793:  03AB  1F                    C         pop     ds
                    794:  03AC  66| 61                C         popad
                    795:  03AE  C3                    C         ret
                    796:                             C  
                    797:                             C  
                    798:                             C  ; Binary to Hex Ascii Conversion
                    799:                             C  
                    800:                             C  ; ds:si->source text, es:di->output text, ds:bx->current binary parameter
                    801:                             C  
                    802:  03AF  AC                    C mscvh:  lodsb                   ;read character after signal
                    803:  03B0  FE C8                 C         dec     al
                    804:  03B2  24 07                 C         and     al,7            ;number of digits (0-7 for 1-8)
                    805:  03B4  C0 E0 02              C         shl     al,2            ;times bits per digit
                    806:  03B7  0F B6 C8              C         movzx   cx,al           ;number of bits minus 4
                    807:  03BA  66| 8B 07             C         mov     eax,[bx]        ;get parameter
                    808:  03BD  83 C3 04              C         add     bx,4            ;address next parameter
                    809:  03C0  66| D3 C8             C         ror     eax,cl          ;bits 3-0 are ms digit
                    810:  03C3  C1 E9 02              C         shr     cx,2
                    811:  03C6  41                    C         inc     cx              ;number of digits
                    812:                             C  
                    813:  03C7  8A F0                 C mshxd:  mov     dh,al           ;save 2 digits
                    814:  03C9  E8 03DF R             C         call    cvhn            ;convert al{3:0}
                    815:  03CC  8A C6                 C         mov     al,dh           ;restore 2 digits
                    816:  03CE  66| C1 C0 04          C         rol     eax,4           ;pull up next digit
                    817: 
                    818: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    819: 
                    820: rciolx                                                      Page     1-15
                    821: 
                    822: 
                    823:  03D2  E2 F3                 C         loop    mshxd
                    824:  03D4  EB 8C                 C         jmp     short msorc     ;continue with text
                    825:                             C  
                    826:                             C  ; Convert Binary in al to Hex Ascii at es:[di]+
                    827:                             C  ;       Affects: ax, di
                    828:                             C  
                    829:  03D6  FC                    C cvhb:   cld
                    830:  03D7  50                    C         push    ax              ;save low digit
                    831:  03D8  C0 E8 04              C         shr     al,4
                    832:  03DB  E8 03DF R             C         call    cvhn            ;convert high digit
                    833:  03DE  58                    C         pop     ax              ;convert low digit
                    834:  03DF  24 0F                 C cvhn:   and     al,0fh
                    835:  03E1  0C 90                 C         or      al,90h          ;90-99, 9A-9F
                    836:  03E3  27                    C         daa                     ;90-99, 100-105
                    837:  03E4  14 40                 C         adc     al,40h          ;D0-D9, 41-46
                    838:  03E6  27                    C         daa                     ;130-139, 41-46
                    839:  03E7  AA                    C         stosb                   ;store ascii 0-9, A-F
                    840:  03E8  C3                    C         ret
                    841:                             C  
                    842:                             C  
                    843:                             C  ; Binary to Decimal Ascii Conversion
                    844:                             C  
                    845:                             C  ; ds:si->source text, es:di->output text, ds:bx->current binary parameter
                    846:                             C  
                    847:                             C  ; dh = 80h, include commas; dh = 40h, suppress leading spaces
                    848:                             C  
                    849:  03E9  AC                    C mscvd:  lodsb                   ;read character after signal
                    850:  03EA  66| 33 C9             C         xor     ecx,ecx         ;clear for use as index
                    851:  03ED  3C 77                 C         cmp     al,'w'
                    852:  03EF  74 07                 C         jz      short msdwp     ;16-bit conversion
                    853:  03F1  3C 62                 C         cmp     al,'b'
                    854:  03F3  75 07                 C         jnz     short msdlp     ;32-bit conversion
                    855:                             C  
                    856:  03F5  88 4F 01              C         mov     1[bx],cl        ;8-bit conversion, zero high byte of low word
                    857:  03F8  89 4F 02              C msdwp:  mov     2[bx],cx        ;zero high word for 8/16-bit
                    858:  03FB  AC                    C         lodsb                   ;get next source character
                    859:                             C  
                    860:  03FC  FE C8                 C msdlp:  dec     al
                    861:  03FE  24 0F                 C         and     al,0fh
                    862:  0400  8A C8                 C         mov     cl,al           ;number of decimal digits (0-9 for 1-10)
                    863:  0402  66| 8B 2F             C         mov     ebp,[bx]        ;get parameter
                    864:  0405  83 C3 04              C         add     bx,4            ;update current parameter address
                    865:  0408  53                    C         push    bx
                    866:                             C  
                    867:  0409  2C 03                 C msdsc:  sub     al,3
                    868:  040B  73 FC                 C         jnc     short msdsc     ;reduce al mod 3
                    869:  040D  04 03                 C         add     al,3            ;add remainder
                    870:  040F  8A D8                 C         mov     bl,al           ;number of digits before first comma
                    871:  0411  56                    C         push    si              ;save place in source text
                    872:                             C  
                    873:  0412  E3 49                 C         jcxz    msd1            ;one digit only
                    874:  0414  67| 8D 348D 0000046C  C         lea     si,dcval[ecx*4] ;index into 10� list for number of digits
                    875:        R                    C  
                    876:                             C  
                    877:  041C  FD                    C msdxd:  std                     ;count downward
                    878:  041D  66| AD                C         lodsd                   ;get 10� where n is current digit
                    879: 
                    880: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    881: 
                    882: rciolx                                                      Page     1-16
                    883: 
                    884: 
                    885:  041F  FC                    C         cld                     ;count upward
                    886:                             C  
                    887:  0420  B2 2F                 C         mov     dl,2fh          ;ascii count
                    888:  0422  FE C2                 C msdxi:  inc     dl
                    889:  0424  78 05                 C         js      short msdov     ;overflow
                    890:  0426  66| 2B E8             C         sub     ebp,eax         ;subtract 10� from parameter value
                    891:  0429  73 F7                 C         jnc     short msdxi
                    892:  042B  66| 03 E8             C msdov:  add     ebp,eax         ;leave remainder
                    893:                             C  
                    894:  042E  80 FA 3A              C         cmp     dl,3ah
                    895:  0431  72 06                 C         jc      short msdno     ;no overflow
                    896:  0433  F9                    C         stc
                    897:  0434  66| D1 DD             C         rcr     ebp,1           ;make sure it propagates
                    898:  0437  B2 2A                 C         mov     dl,'*'          ;overflow character
                    899:                             C  
                    900:  0439  0A F2                 C msdno:  or      dh,dl           ;bits 3-0 are zero if this is a leading zero
                    901:  043B  F6 C6 0F              C         test    dh,0fh          ;check whether all zeros so far
                    902:  043E  8A C2                 C         mov     al,dl           ;current digit
                    903:  0440  75 07                 C         jnz     short msdpc     ;display non-leading-zero
                    904:  0442  B0 20                 C         mov     al,' '          ;change leading zero to space
                    905:                             C  
                    906:  0444  F6 C6 40              C         test    dh,40h
                    907:  0447  75 12                 C         jnz     short msdx      ;skip leading spaces and commas
                    908:                             C  
                    909:  0449  AA                    C msdpc:  stosb                   ;write digit to output buffer
                    910:                             C  
                    911:  044A  0A F6                 C         or      dh,dh
                    912:  044C  79 0D                 C         jns     short msdx      ;no commas
                    913:                             C  
                    914:  044E  FE CB                 C         dec     bl              ;decrement comma counter
                    915:  0450  79 09                 C         jns     short msdx      ;no action until zero
                    916:  0452  3C 20                 C         cmp     al,' '
                    917:  0454  74 02                 C         jz      short msdco     ;leave leading space
                    918:  0456  B0 2C                 C         mov     al,','
                    919:  0458  AA                    C msdco:  stosb                   ;write comma to output buffer
                    920:                             C  
                    921:  0459  B3 02                 C         mov     bl,2            ;reload counter
                    922:  045B  E2 BF                 C msdx:   loop    msdxd           ;next digit
                    923:  045D  8B C5                 C msd1:   mov     ax,bp           ;last digit
                    924:  045F  3D 000A               C         cmp     ax,10
                    925:  0462  72 02                 C         jc      short msd1n     ;no overflow
                    926:  0464  B0 1A                 C         mov     al,1ah          ;display *
                    927:  0466  34 30                 C msd1n:  xor     al,30h
                    928:  0468  AA                    C         stosb
                    929:                             C  
                    930:  0469  5E                    C         pop     si              ;restore current index in source text
                    931:  046A  5B                    C         pop     bx              ;restore current parameter index
                    932:  046B  E9 0362 R             C         jmp     msorc           ;continue with text
                    933:                             C  
                    934:  046E  87 DB                 C         align   4
                    935:                             C  
                    936:  = 046C                      C dcval   equ     $-4             ;10� table
                    937:                             C  
                    938:  0470  0000000A 00000064     C         dd      10,100,1000,10000,100000,1000000
                    939:        000003E8 00002710     C 
                    940:        000186A0 000F4240     C 
                    941: 
                    942: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    943: 
                    944: rciolx                                                      Page     1-17
                    945: 
                    946: 
                    947:  0488  00989680 05F5E100     C         dd      10000000,100000000,1000000000
                    948:        3B9ACA00              C 
                    949:                             C  
                    950:  0494                        C msval:                          ;parameter list
                    951:  0494  00000000              C mv1:    dd      0
                    952:  0498  00000000              C mv2:    dd      0
                    953:  049C  00000000              C mv3:    dd      0
                    954:  04A0  00000000              C mv4:    dd      0
                    955:  04A4  00000000              C mv5:    dd      0
                    956:  04A8  00000000              C mv6:    dd      0
                    957:  04AC  00000000              C mv7:    dd      0
                    958:  04B0  00000000              C mv8:    dd      0
                    959:                             C  
                    960:  04B4  0200[                 C iobuf:  db      512 dup (99h)   ;output buffer
                    961:           99                C  
                    962:                         ]   C  
                    963:                             C  
                    964:                             C  
                    965:  06B4                        C msout   endp
                    966:                                        end
                    967: 
                    968: 
                    969: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                    970: 
                    971: rciolx                                                      Symbols-1
                    972: 
                    973: 
                    974: Macros:
                    975: 
                    976:                N a m e                 Lines
                    977: 
                    978: .EOPG  . . . . . . . . . . . . .          2
                    979: .ILIST . . . . . . . . . . . . .          1
                    980: ASYN . . . . . . . . . . . . . .          0
                    981: DA . . . . . . . . . . . . . . .          4
                    982: DBL  . . . . . . . . . . . . . .          2
                    983: DSS  . . . . . . . . . . . . . .          4
                    984: DSTRUC . . . . . . . . . . . . .          8
                    985: DV . . . . . . . . . . . . . . .          5
                    986: SETMOD . . . . . . . . . . . . .          0
                    987: 
                    988: Segments and Groups:
                    989: 
                    990:                 N a m e                Size    Length   Align  Combine Class
                    991: 
                    992: BIOSDA . . . . . . . . . . . . .       32 Bit  0000    AT      0040    
                    993: DGROUP . . . . . . . . . . . . .       GROUP
                    994:   _DATA  . . . . . . . . . . . .       16 Bit  0837    WORD    PUBLIC  'DATA'
                    995: RCIOLX_TEXT  . . . . . . . . . .       16 Bit  06B4    WORD    PUBLIC  'CODE'
                    996: 
                    997: Symbols:            
                    998: 
                    999:                 N a m e                Type     Value   Attr
                   1000: 
                   1001: AA . . . . . . . . . . . . . . .       TEXT  .model large              
                   1002: ABORT  . . . . . . . . . . . . .       NUMBER  0004    
                   1003: 
                   1004: BCNT . . . . . . . . . . . . . .       L WORD  0000    
                   1005: BGET . . . . . . . . . . . . . .       L WORD  0004    
                   1006: BGETC  . . . . . . . . . . . . .       L NEAR  012D    RCIOLX_TEXT
                   1007: BGGP . . . . . . . . . . . . . .       L NEAR  0145    RCIOLX_TEXT
                   1008: BGNC . . . . . . . . . . . . . .       L NEAR  014E    RCIOLX_TEXT
                   1009: BOFST  . . . . . . . . . . . . .       L WORD  0008    
                   1010: BPGP . . . . . . . . . . . . . .       L NEAR  0169    RCIOLX_TEXT
                   1011: BPUT . . . . . . . . . . . . . .       L WORD  0002    
                   1012: BPUTC  . . . . . . . . . . . . .       L NEAR  0150    RCIOLX_TEXT
                   1013: BPUTCO . . . . . . . . . . . . .       L NEAR  0152    RCIOLX_TEXT
                   1014: BRDD . . . . . . . . . . . . . .       L DWORD 0000    _DATA
                   1015: BSIZE  . . . . . . . . . . . . .       L WORD  000A    
                   1016: BUART  . . . . . . . . . . . . .       L WORD  0010    _DATA
                   1017: BUFP . . . . . . . . . . . . . .       NUMBER  000C    
                   1018: 
                   1019: CIABT  . . . . . . . . . . . . .       L NEAR  00E8    RCIOLX_TEXT
                   1020: CIERR  . . . . . . . . . . . . .       L NEAR  001C    RCIOLX_TEXT
                   1021: CIEX . . . . . . . . . . . . . .       L NEAR  00F5    RCIOLX_TEXT
                   1022: CINIT  . . . . . . . . . . . . .       L NEAR  0022    RCIOLX_TEXT
                   1023: CTERM  . . . . . . . . . . . . .       L NEAR  00EB    RCIOLX_TEXT
                   1024: CTSCK  . . . . . . . . . . . . .       NUMBER  0010    
                   1025: CVHB . . . . . . . . . . . . . .       L NEAR  03D6    RCIOLX_TEXT
                   1026: CVHN . . . . . . . . . . . . . .       L NEAR  03DF    RCIOLX_TEXT
                   1027: 
                   1028: DCVAL  . . . . . . . . . . . . .       NEAR    046C    RCIOLX_TEXT
                   1029: 
                   1030: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                   1031: 
                   1032: rciolx                                                      Symbols-2
                   1033: 
                   1034: 
                   1035: DECSG  . . . . . . . . . . . . .       NUMBER  00E4    
                   1036: DECSGC . . . . . . . . . . . . .       NUMBER  00E3    
                   1037: DECSGN . . . . . . . . . . . . .       NUMBER  00E6    
                   1038: DS1  . . . . . . . . . . . . . .       TEXT  label byte                
                   1039: DS2  . . . . . . . . . . . . . .       TEXT  label word                
                   1040: DS4  . . . . . . . . . . . . . .       TEXT  label dword               
                   1041: DS6  . . . . . . . . . . . . . .       TEXT  label fword               
                   1042: DS8  . . . . . . . . . . . . . .       TEXT  label qword               
                   1043: DSSAVE . . . . . . . . . . . . .       NUMBER  0000    
                   1044: DTRCK  . . . . . . . . . . . . .       L NEAR  0336    RCIOLX_TEXT
                   1045: DTRER  . . . . . . . . . . . . .       L NEAR  0334    RCIOLX_TEXT
                   1046: DTREX  . . . . . . . . . . . . .       L NEAR  034E    RCIOLX_TEXT
                   1047: 
                   1048: FINIS  . . . . . . . . . . . . .       L NEAR  00C6    RCIOLX_TEXT
                   1049: 
                   1050: GIRQ . . . . . . . . . . . . . .       L NEAR  006A    RCIOLX_TEXT
                   1051: GVECT  . . . . . . . . . . . . .       L NEAR  00F9    RCIOLX_TEXT
                   1052: 
                   1053: HEXSG  . . . . . . . . . . . . .       NUMBER  00E8    
                   1054: HOLD . . . . . . . . . . . . . .       NUMBER  0002    
                   1055: 
                   1056: IBFLS  . . . . . . . . . . . . .       L NEAR  010F    RCIOLX_TEXT
                   1057: IC16H  . . . . . . . . . . . . .       NUMBER  0010    
                   1058: IC29D  . . . . . . . . . . . . .       NUMBER  0003    
                   1059: IC29H  . . . . . . . . . . . . .       NUMBER  0001    
                   1060: ICGC . . . . . . . . . . . . . .       L NEAR  0184    RCIOLX_TEXT
                   1061: ICR1 . . . . . . . . . . . . . .       NUMBER  0020    
                   1062: ICR2 . . . . . . . . . . . . . .       NUMBER  00A0    
                   1063: IER  . . . . . . . . . . . . . .       NUMBER  0001    
                   1064: IERD . . . . . . . . . . . . . .       NUMBER  000B    
                   1065: IIR  . . . . . . . . . . . . . .       NUMBER  0002    
                   1066: IMR1 . . . . . . . . . . . . . .       NUMBER  0021    
                   1067: IMR2 . . . . . . . . . . . . . .       NUMBER  00A1    
                   1068: INTCP  . . . . . . . . . . . . .       L BYTE  0017    _DATA
                   1069: INTEX  . . . . . . . . . . . . .       L NEAR  0254    RCIOLX_TEXT
                   1070: INTMSG . . . . . . . . . . . . .       L NEAR  0285    RCIOLX_TEXT
                   1071: IOBUF  . . . . . . . . . . . . .       L NEAR  04B4    RCIOLX_TEXT
                   1072: IRCR . . . . . . . . . . . . . .       L BYTE  0015    _DATA
                   1073: IRQN . . . . . . . . . . . . . .       L BYTE  0014    _DATA
                   1074: IRQV . . . . . . . . . . . . . .       L NEAR  0075    RCIOLX_TEXT
                   1075: ISREP  . . . . . . . . . . . . .       L NEAR  01D5    RCIOLX_TEXT
                   1076: ISREX  . . . . . . . . . . . . .       L NEAR  0279    RCIOLX_TEXT
                   1077: IV16H  . . . . . . . . . . . . .       L DWORD 0004    _DATA
                   1078: IV29H  . . . . . . . . . . . . .       L DWORD 0008    _DATA
                   1079: IVB1 . . . . . . . . . . . . . .       NUMBER  0008    
                   1080: IVB2 . . . . . . . . . . . . . .       NUMBER  0070    
                   1081: IVSIO  . . . . . . . . . . . . .       L DWORD 000C    _DATA
                   1082: 
                   1083: LCR  . . . . . . . . . . . . . .       NUMBER  0003    
                   1084: LCRD . . . . . . . . . . . . . .       NUMBER  0003    
                   1085: LITSG  . . . . . . . . . . . . .       NUMBER  00EA    
                   1086: LSR  . . . . . . . . . . . . . .       NUMBER  0005    
                   1087: LSRAD  . . . . . . . . . . . . .       L WORD  0012    _DATA
                   1088: 
                   1089: MB . . . . . . . . . . . . . . .       TEXT  byte ptr          
                   1090: MCR  . . . . . . . . . . . . . .       NUMBER  0004    
                   1091: 
                   1092: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                   1093: 
                   1094: rciolx                                                      Symbols-3
                   1095: 
                   1096: 
                   1097: MCRD . . . . . . . . . . . . . .       NUMBER  000B    
                   1098: MDLC . . . . . . . . . . . . . .       TEXT  compact           
                   1099: MDLH . . . . . . . . . . . . . .       TEXT  huge              
                   1100: MDLL . . . . . . . . . . . . . .       TEXT  large             
                   1101: MDLM . . . . . . . . . . . . . .       TEXT  medium            
                   1102: MDLS . . . . . . . . . . . . . .       TEXT  small             
                   1103: ML . . . . . . . . . . . . . . .       TEXT  dword ptr         
                   1104: MM . . . . . . . . . . . . . . .       TEXT  l         
                   1105: MODE . . . . . . . . . . . . . .       L BYTE  0019    _DATA
                   1106: MSCVD  . . . . . . . . . . . . .       L NEAR  03E9    RCIOLX_TEXT
                   1107: MSCVH  . . . . . . . . . . . . .       L NEAR  03AF    RCIOLX_TEXT
                   1108: MSD1 . . . . . . . . . . . . . .       L NEAR  045D    RCIOLX_TEXT
                   1109: MSD1N  . . . . . . . . . . . . .       L NEAR  0466    RCIOLX_TEXT
                   1110: MSDCO  . . . . . . . . . . . . .       L NEAR  0458    RCIOLX_TEXT
                   1111: MSDLP  . . . . . . . . . . . . .       L NEAR  03FC    RCIOLX_TEXT
                   1112: MSDNO  . . . . . . . . . . . . .       L NEAR  0439    RCIOLX_TEXT
                   1113: MSDOV  . . . . . . . . . . . . .       L NEAR  042B    RCIOLX_TEXT
                   1114: MSDPC  . . . . . . . . . . . . .       L NEAR  0449    RCIOLX_TEXT
                   1115: MSDSC  . . . . . . . . . . . . .       L NEAR  0409    RCIOLX_TEXT
                   1116: MSDWP  . . . . . . . . . . . . .       L NEAR  03F8    RCIOLX_TEXT
                   1117: MSDX . . . . . . . . . . . . . .       L NEAR  045B    RCIOLX_TEXT
                   1118: MSDXD  . . . . . . . . . . . . .       L NEAR  041C    RCIOLX_TEXT
                   1119: MSDXI  . . . . . . . . . . . . .       L NEAR  0422    RCIOLX_TEXT
                   1120: MSHXD  . . . . . . . . . . . . .       L NEAR  03C7    RCIOLX_TEXT
                   1121: MSOLC  . . . . . . . . . . . . .       L NEAR  038C    RCIOLX_TEXT
                   1122: MSORC  . . . . . . . . . . . . .       L NEAR  0362    RCIOLX_TEXT
                   1123: MSOUT  . . . . . . . . . . . . .       N PROC  0350    RCIOLX_TEXT     Length = 0364
                   1124: MSOWC  . . . . . . . . . . . . .       L NEAR  0391    RCIOLX_TEXT
                   1125: MSOX . . . . . . . . . . . . . .       L NEAR  03AA    RCIOLX_TEXT
                   1126: MSR  . . . . . . . . . . . . . .       NUMBER  0006    
                   1127: MSVAL  . . . . . . . . . . . . .       L NEAR  0494    RCIOLX_TEXT
                   1128: MV1  . . . . . . . . . . . . . .       L NEAR  0494    RCIOLX_TEXT
                   1129: MV2  . . . . . . . . . . . . . .       L NEAR  0498    RCIOLX_TEXT
                   1130: MV3  . . . . . . . . . . . . . .       L NEAR  049C    RCIOLX_TEXT
                   1131: MV4  . . . . . . . . . . . . . .       L NEAR  04A0    RCIOLX_TEXT
                   1132: MV5  . . . . . . . . . . . . . .       L NEAR  04A4    RCIOLX_TEXT
                   1133: MV6  . . . . . . . . . . . . . .       L NEAR  04A8    RCIOLX_TEXT
                   1134: MV7  . . . . . . . . . . . . . .       L NEAR  04AC    RCIOLX_TEXT
                   1135: MV8  . . . . . . . . . . . . . .       L NEAR  04B0    RCIOLX_TEXT
                   1136: MW . . . . . . . . . . . . . . .       TEXT  word ptr          
                   1137: 
                   1138: OBFLS  . . . . . . . . . . . . .       L NEAR  0117    RCIOLX_TEXT
                   1139: OCABT  . . . . . . . . . . . . .       L NEAR  01C6    RCIOLX_TEXT
                   1140: OCBUF  . . . . . . . . . . . . .       L NEAR  01BC    RCIOLX_TEXT
                   1141: OCEX . . . . . . . . . . . . . .       L NEAR  01C3    RCIOLX_TEXT
                   1142: OCREP  . . . . . . . . . . . . .       L NEAR  019D    RCIOLX_TEXT
                   1143: OPERA  . . . . . . . . . . . . .       L BYTE  0018    _DATA
                   1144: OS . . . . . . . . . . . . . . .       TEXT  offset            
                   1145: OVFL . . . . . . . . . . . . . .       L BYTE  0006    
                   1146: 
                   1147: PB . . . . . . . . . . . . . . .       NUMBER  0006    
                   1148: 
                   1149: RCPAU  . . . . . . . . . . . . .       L NEAR  021A    RCIOLX_TEXT
                   1150: REPSG  . . . . . . . . . . . . .       NUMBER  00E2    
                   1151: RIODS  . . . . . . . . . . . . .       L NEAR  0000    RCIOLX_TEXT
                   1152: RXB  . . . . . . . . . . . . . .       L BYTE  0036    _DATA   Length = 0400
                   1153: 
                   1154: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                   1155: 
                   1156: rciolx                                                      Symbols-4
                   1157: 
                   1158: 
                   1159: RXBMX  . . . . . . . . . . . . .       NUMBER  0400    
                   1160: RXBP . . . . . . . . . . . . . .       L BYTE  001E    _DATA   Length = 000C
                   1161: RXCCQ  . . . . . . . . . . . . .       L NEAR  0213    RCIOLX_TEXT
                   1162: RXCCS  . . . . . . . . . . . . .       L NEAR  020C    RCIOLX_TEXT
                   1163: RXLOST . . . . . . . . . . . . .       NUMBER  0001    
                   1164: RXPCH  . . . . . . . . . . . . .       L NEAR  0227    RCIOLX_TEXT
                   1165: 
                   1166: S  . . . . . . . . . . . . . . .       TEXT  short             
                   1167: SBINIT . . . . . . . . . . . . .       L NEAR  02C0    RCIOLX_TEXT
                   1168: SCPORT . . . . . . . . . . . . .       L NEAR  005F    RCIOLX_TEXT
                   1169: SGCHK  . . . . . . . . . . . . .       NUMBER  00E0    
                   1170: SIOISR . . . . . . . . . . . . .       F PROC  01C7    RCIOLX_TEXT     Length = 00ED
                   1171: SIOVN  . . . . . . . . . . . . .       L BYTE  0016    _DATA
                   1172: STATE  . . . . . . . . . . . . .       L BYTE  001A    _DATA
                   1173: STATUS . . . . . . . . . . . . .       L BYTE  001C    _DATA
                   1174: SVECT  . . . . . . . . . . . . .       L NEAR  0102    RCIOLX_TEXT
                   1175: 
                   1176: TST  . . . . . . . . . . . . . .       L BYTE  0836    _DATA
                   1177: TWN  . . . . . . . . . . . . . .       L NEAR  031A    RCIOLX_TEXT
                   1178: TWS  . . . . . . . . . . . . . .       L NEAR  031D    RCIOLX_TEXT
                   1179: TWT  . . . . . . . . . . . . . .       L NEAR  0322    RCIOLX_TEXT
                   1180: TXB  . . . . . . . . . . . . . .       L BYTE  0436    _DATA   Length = 0400
                   1181: TXBMX  . . . . . . . . . . . . .       NUMBER  0400    
                   1182: TXBP . . . . . . . . . . . . . .       L BYTE  002A    _DATA   Length = 000C
                   1183: TXCHK  . . . . . . . . . . . . .       L NEAR  0234    RCIOLX_TEXT
                   1184: TXINTP . . . . . . . . . . . . .       L BYTE  001B    _DATA
                   1185: 
                   1186: VSEG . . . . . . . . . . . . . .       NUMBER  B000    
                   1187: 
                   1188: WRSC . . . . . . . . . . . . . .       L NEAR  03A6    RCIOLX_TEXT
                   1189: WTDCD  . . . . . . . . . . . . .       L NEAR  0317    RCIOLX_TEXT
                   1190: 
                   1191: XBFLS  . . . . . . . . . . . . .       L NEAR  011D    RCIOLX_TEXT
                   1192: 
                   1193: @0 . . . . . . . . . . . . . . .       L NEAR  0018    RCIOLX_TEXT
                   1194: @CODE  . . . . . . . . . . . . .       TEXT  rciolx_TEXT               
                   1195: @CODESIZE  . . . . . . . . . . .       TEXT  1         
                   1196: @CPU . . . . . . . . . . . . . .       TEXT  3471              
                   1197: @DATASIZE  . . . . . . . . . . .       TEXT  1         
                   1198: @FILENAME  . . . . . . . . . . .       TEXT  rciolx            
                   1199: @VERSION . . . . . . . . . . . .       TEXT  510               
                   1200: _dtr . . . . . . . . . . . . . .       F PROC  02EF    RCIOLX_TEXT     Global  Length = 0061
                   1201: _incom . . . . . . . . . . . . .       F PROC  0171    RCIOLX_TEXT     Global  Length = 0016
                   1202: _outcom  . . . . . . . . . . . .       F PROC  0187    RCIOLX_TEXT     Global  Length = 0040
                   1203: _plst  . . . . . . . . . . . . .       L WORD  001E    _DATA   Global
                   1204: _rioini  . . . . . . . . . . . .       F PROC  0002    RCIOLX_TEXT     Global  Length = 00F7
                   1205: _setbaud . . . . . . . . . . . .       F PROC  02B4    RCIOLX_TEXT     Global  Length = 003B
                   1206: 
                   1207: 
                   1208: Microsoft Macro Assembler  Version 5.10                    6/5/91 16:05:11
                   1209: 
                   1210: 
                   1211: rciolx                                                      Symbols-5
                   1212: 
                   1213: 
                   1214: 
                   1215: 
                   1216: 
                   1217: 
                   1218:     970 Source  Lines
                   1219:    1055 Total   Lines
                   1220:     191 Symbols
                   1221: 
                   1222:   46990 + 355212 Bytes symbol space free
                   1223: 
                   1224:       0 Warning Errors
                   1225:       0 Severe  Errors

unix.superglobalmegacorp.com

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