home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / COMM / MISC / RS204.ZIP / RS203.ASM < prev    next >
Encoding:
Assembly Source File  |  1991-10-01  |  15.5 KB  |  718 lines

  1. page    58,132
  2. TITLE    RS203    6-23-86    [10-1-91]
  3.  
  4. LF    EQU    0AH
  5. CR    EQU    0DH
  6.  
  7. CSEG    SEGMENT
  8.     ASSUME DS:CSEG, SS:CSEG ,CS:CSEG ,ES:CSEG
  9.     ORG    100H
  10.  
  11. RS_100    proc    near
  12.     JMP    RS_532
  13.  
  14. ;COM1 port address table
  15. com1tbl_103    DW    03F8H    ;[BX]    ;UART base
  16.         dw    03F9H    ;[BX+2]    ;base+1 IER
  17.         dw    03F9H    ;[BX+4]    ;base+1 IER
  18.         dw    03FBH    ;[BX+6]    ;base+3, LCR
  19.         DW    03FCH    ;[BX+8]    ;base+4, MCR
  20.         dw    03FDH    ;[BX+0A];base+5, LSR
  21.         dw    03FEH    ;[BX+0C];base+6, MSR
  22. ;COM2 port address table
  23. com2tbl_111    DW    02F8H,2 DUP(02F9H),02FBH
  24.         DW    02FCH,02FDH,02FEH
  25.  
  26. bauddiv_11F    DW    0        ;baudrate divisor
  27. ier_121        db    0        ;Interrupt Enable Register status
  28. lcr_122        db    0        ;Line Control Register status
  29. mcr_123        db    0        ;Modem Control Register status
  30. lsr_124        db    0        ;Line Status Register status
  31. msr_125        db    0        ;Modem Status Register status
  32. lcr_126        db    0        ;LCR status w/8-bit OR'ed
  33.         db    0
  34.  
  35. vidpage_128    db    0        ;current video mode
  36. buff_129    db    6 dup(0)
  37. numbuff_12F    DB    '      $'
  38.  
  39. msg_136    DB    '                RS  $'
  40.     DB    'Copyright Fred E. Davis 1986$'
  41.     DB    '    Ver. 2.03$'
  42. com1$176    DB    CR,'COM1:$'
  43. com2$17D    DB    CR,'COM2:$'
  44. msg_184    DB    ' not installed!$'
  45. msg_194    DB    CR,LF,'A. Protocol:                    B. Handshake Status:'
  46.     db    CR,LF,'  1. Data Bits: $'
  47. msg_1DD    DB    '            1. DTR Out: $'
  48. msg_1F6    DB    CR,LF,'  2. Stop Bits: $'
  49. msg_209    DB    '            2. RTS Out: $'
  50. msg_222    DB    CR,LF,'  3. Parity   : $'
  51. msg_235    DB    '            3. CTS In : $'
  52. msg_24E    DB    CR,LF,'  4. Rate     : $'
  53. msg_261    DB    '            4. DSR In : $'
  54. msg_27A    DB    CR,LF,'  5. Stick    : $'
  55. msg_28D    DB    '            5. CD In  : $'
  56. msg_2A6    DB    CR,LF,'  6. Break    : $'
  57. msg_2B9    DB    '            6. RI In  : $'
  58. msg_2D2    DB    CR,LF,CR,LF
  59.     DB    'C. Line Status:                 D. Error Status:',CR,LF
  60.     DB    '  1. Receive Buffer : $'
  61. msg_31F    DB    '      1. Overrun: $'
  62. msg_332    DB    CR,LF,'  2. Transmit Buffer: $'
  63. msg_34B    DB    '      2. Parity : $'
  64. msg_35E    DB    CR,LF,'  3. Break Status   : $'
  65. msg_377    DB    '      3. Frame  : $'
  66. msg_38A    DB    CR,LF,'  4. Loop Back      : $'
  67. msg_3A3    DB    CR,LF,CR,LF
  68.     DB    'E. Interrupt Status:'
  69.     db    CR,LF,'  1. Output      : $'
  70. msg_3D1    DB    CR,LF,'  2. Data Ready  : $'
  71. msg_3E7    DB    CR,LF,'  3. Xmit Empty  : $'
  72. msg_3FD    DB    CR,LF,'  4. Line Status : $'
  73. msg_413    DB    CR,LF,'  5. Modem Status: $'
  74. crlf_429    DB    CR,LF,'$'
  75. msg_42C        DB    '1     $'
  76. msg_433        DB    '2     $'
  77. msg_43A        DB    '5     $'
  78. msg_441        DB    '6     $'
  79. msg_448        DB    '7     $'
  80. msg_44F        DB    '8     $'
  81. odd$456        DB    'odd   $'
  82. even$45D    DB    'even  $'
  83. none$464    DB    'none  $'
  84. norm$46B    DB    'normal$'
  85. set$472        DB    'set   $'
  86.  
  87. baudtbl_479    label    byte
  88.     DB    '50    $'
  89.     dw    0900H        ;DB    0,9
  90.     db    '75    $'
  91.     dw    0600H        ;DB    0,6
  92.     db    '110   $'
  93.     dw    0417H        ;DB    17H,4
  94.     db    '134.5 $'
  95.     dw    0359H        ;DB    59H,3
  96.     db    '150   $'
  97.     dw    0300H        ;DB    0,3
  98.     db    '300   $'
  99.     dw    0180H        ;DB    80H,1
  100.     db    '600   $'
  101.     dw    00C0H        ;DB    0C0H,0
  102.     db    '1200  $'
  103.     dw    0060H        ;DB    60H,0
  104.     db    '1800  $'
  105.     dw    0040H        ;DB    40H,0
  106.     db    '2000  $'
  107.     dw    003AH        ;DB    3AH,0
  108.     db    '2400  $'
  109.     dw    0030H        ;DB    30H,0
  110.     db    '3600  $'
  111.     dw    0020H        ;DB    20H,0
  112.     db    '4800  $'
  113.     dw    0018H        ;DB    18H,0
  114.     db    '7200  $'
  115.     dw    0010H        ;DB    10H,0
  116.     db    '9600  $'
  117.     dw    000CH        ;DB    0CH,0
  118.  
  119. msg_500    DB    'fast!!$'
  120. msg_507    DB    'empty $'
  121. msg_50E    DB    'full  $'
  122. msg_515    DB    'low   $'
  123. msg_51C    DB    'high  $'
  124. msg_523    DB    'enable$'
  125. msg_52A    DB    'disable$'
  126.  
  127. RS_100    endp
  128.  
  129. ;L0532      RS_100 CJ
  130. RS_532    proc    near
  131.     MOV    AH,0FH
  132.     INT    10H
  133.     MOV    vidpage_128,BH            ;save current video mode
  134.  
  135.     MOV    DX,OFFSET crlf_429        ;CR,LF,'$'
  136.     MOV    AH,9
  137.     INT    21H
  138.     MOV    SI,OFFSET msg_136        ;'copyright ...'
  139.     MOV    BL,0FH
  140.     CALL    PrStr_93B
  141.     MOV    BL,9
  142.     CALL    PrStr_93B
  143.     MOV    BL,7
  144.     CALL    PrStr_93B
  145.     MOV    DX,OFFSET crlf_429        ;CR,LF,'$'
  146.     MOV    AH,9
  147.     INT    21H
  148.     MOV    AH,9
  149.     MOV    AL,20H            ;display space
  150.     MOV    CX,4FH            ;this many of them
  151.     MOV    BH,vidpage_128        ;display page
  152.     MOV    BL,7            ;attribute
  153.     INT    10H            ;via BIOS
  154.  
  155.     MOV    DI,81H            ;PSP cmdline
  156.     MOV    AL,20H    ;' '        ;gobble leading spaces
  157.     MOV    CX,44H            ;max cmdline length
  158.     CLD
  159.     REPZ    SCASB
  160.     MOV    AL,[DI-1]        ;get last pre-space char
  161.     JCXZ    Use_COM1_585        ;zeroed out cmdline, use COM1
  162.  
  163.     CMP    AL,0DH            ;No cmd parm ...
  164.     JZ    Use_COM1_585        ;.. so use COM1
  165.     CMP    AL,31H    ;'1'        ;COM1?
  166.     JZ    Use_COM1_585        ;yep, use COM1
  167.     CMP    AL,32H    ;'2'        ;COM2?
  168.     JZ    Use_COM2_58E        ;yep
  169.  
  170. ;Use default COM1
  171. Use_COM1_585:
  172.     MOV    BX,OFFSET com1tbl_103    ;use COM1's table
  173.     MOV    DX,OFFSET com1$176    ;CR,'COM1:$'
  174.     JMP    SHORT    Skp594
  175.  
  176. ;    NOP
  177. Use_COM2_58E:
  178.     MOV    BX,OFFSET com2tbl_111    ;use COM2's table
  179.     MOV    DX,OFFSET com2$17D    ;CR,'COM2:$'
  180.  
  181. Skp594:    MOV    AH,9            ;display "COMn:"
  182.     INT    21H
  183.  
  184.     MOV    DX,[BX+6]        ;base+3, LCR Line Control Register
  185.     IN    AL,DX
  186.     OR    AL,80H            ;turn on 8-bit
  187.     MOV    lcr_126,AL        ;save it
  188.     OUT    DX,AL
  189.  
  190.     MOV    AH,AL
  191.     MOV    CX,03E8H        ;delay value
  192. Lup5A7:    LOOP    Lup5A7            ;delay a bit
  193.     IN    AL,DX
  194.     CMP    AH,AL
  195.     JNZ    Not_Installed_5CE    ;'Not installed', die
  196.  
  197.     MOV    DX,[BX]            ;UART base
  198.     IN    AL,DX            ;get baudrate divisor lsb
  199.     MOV    byte ptr bauddiv_11F,AL    ;save
  200.     INC    DX            ;bump to divisor msb
  201.     IN    AL,DX
  202.     MOV    byte ptr bauddiv_11F+1,AL    ;save it
  203.     MOV    DX,[BX+6]        ;base+3, LCR
  204.     MOV    AL,lcr_126        ;saved LCR status w/8-bit OR'ed
  205.     AND    AL,7FH            ;mask that bit off again
  206.     OUT    DX,AL            ;out the port
  207.  
  208.     MOV    AH,AL
  209.     MOV    CX,03E8H        ;delay value
  210. Lup5C7:    LOOP    Lup5C7            ;delay a bit
  211.     IN    AL,DX            ;read the port
  212.     CMP    AH,AL            ;match?
  213.     JZ    Skp5F3            ;yep, continue
  214.  
  215. Not_Installed_5CE:
  216.     MOV    BL,0CH            ;video attrib
  217.     OR    BL,80H            ;mask for non-blinking?
  218.     MOV    SI,OFFSET msg_184    ;'not installed!'
  219.     CALL    PrStr_93B
  220.     MOV    DX,OFFSET crlf_429    ;CR,LF,'$'
  221.     MOV    AH,9
  222.     INT    21H
  223.     MOV    DX,OFFSET crlf_429    ;CR,LF,'$'
  224.     MOV    AH,9
  225.     INT    21H
  226.     MOV    DX,OFFSET crlf_429    ;CR,LF,'$'
  227.     MOV    AH,9
  228.     INT    21H
  229.     MOV    AL,1            ;ERRORLEVEL 1
  230.     JMP    Term_937        ;terminate
  231.  
  232. Skp5F3:
  233.     MOV    DX,[BX+4]        ;base+1, IER Interrupt Enable Register
  234.     IN    AL,DX
  235.     MOV    ier_121,AL        ;save IER status
  236.     MOV    DX,[BX+6]        ;base+3, LCR
  237.     IN    AL,DX
  238.     MOV    lcr_122,AL        ;save LCR status
  239.     MOV    DX,[BX+8]        ;base+4, MCR Modem Control Register
  240.     IN    AL,DX
  241.     MOV    mcr_123,AL        ;save MCR status
  242.     MOV    DX,[BX+0AH]        ;base+5 LSR Line Status Register
  243.     IN    AL,DX
  244.     MOV    lsr_124,AL        ;save LSR status
  245.     MOV    DX,[BX+0CH]        ;base+6 MSR Modem Status Register
  246.     IN    AL,DX
  247.     MOV    msr_125,AL        ;save MSR status
  248.  
  249.     MOV    DX,OFFSET msg_194    ;CR,LF,'A. Protocol:
  250.                     ;B. Handshake Status:'
  251.                     ;CR,LF,'  1. Data Bits: $'
  252.     MOV    AH,9
  253.     INT    21H
  254.     MOV    AL,lcr_122
  255.     AND    AL,3            ;mask to data bits
  256.     JZ    Skp63E            ;0 = 5
  257.     DEC    AL
  258.     JZ    Skp638            ;1 = 6
  259.     DEC    AL
  260.     JZ    Skp632            ;2 = 7
  261.     MOV    DX,OFFSET msg_44F    ;'8     $' bit data
  262.     JMP    SHORT    Pr_641
  263.  
  264. ;    NOP
  265. Skp632:    MOV    DX,OFFSET msg_448    ;'7     $' bit data
  266.     JMP    SHORT    Pr_641
  267.  
  268. ;    NOP
  269. Skp638:    MOV    DX,OFFSET msg_441    ;'6     $' bit data
  270.     JMP    SHORT    Pr_641
  271.  
  272. ;    NOP
  273. Skp63E:    MOV    DX,OFFSET msg_43A    ;'5     $' bit data
  274. Pr_641:    MOV    AH,9
  275.     INT    21H
  276.  
  277.     MOV    DX,OFFSET msg_1DD    ;'            1. DTR Out: $'
  278.     MOV    AH,9
  279.     INT    21H
  280.     MOV    AL,mcr_123        ;MCR status
  281.     AND    AL,1            ;mask for DTR
  282.     JNZ    Skp659            ;1 = high
  283.      MOV    DX,OFFSET msg_515    ;'low   $'
  284.      JMP    SHORT    Pr_65C
  285.  
  286. ;    NOP
  287. Skp659:    MOV    DX,OFFSET msg_51C    ;'high  $'
  288. Pr_65C:    MOV    AH,9
  289.     INT    21H
  290.  
  291.     MOV    DX,OFFSET msg_1F6    ;CR,LF,'  2. Stop Bits: $'
  292.     MOV    AH,9
  293.     INT    21H
  294.     MOV    AL,lcr_122
  295.     AND    AL,4            ;mask for stop bits
  296.     JNZ    Skp674            ;1 = 2 stop bits
  297.      MOV    DX,OFFSET msg_42C    ;'1     $' stop bits
  298.      JMP    SHORT    Pr_677
  299.  
  300. ;    NOP
  301. Skp674:    MOV    DX,OFFSET msg_433    ;'2     $' stop bits
  302. Pr_677:    MOV    AH,9
  303.     INT    21H
  304.  
  305.     MOV    DX,OFFSET msg_209    ;'            2. RTS Out: $'
  306.     MOV    AH,9
  307.     INT    21H
  308.     MOV    AL,mcr_123        ;MCR status
  309.     AND    AL,2            ;mask for RTS
  310.     JNZ    Skp68F            ;non-0 = high
  311.      MOV    DX,OFFSET msg_515    ;'low   $' RTS
  312.      JMP    SHORT    Pr_692
  313.  
  314. ;    NOP
  315. Skp68F:    MOV    DX,OFFSET msg_51C    ;'high  $' RTS
  316. Pr_692:    MOV    AH,9
  317.     INT    21H
  318.  
  319.     MOV    DX,OFFSET msg_222    ;CR,LF,'  3. Parity   : $'
  320.     MOV    AH,9
  321.     INT    21H
  322.     MOV    AL,lcr_122
  323.     AND    AL,8            ;mask for parity bit
  324.     JZ    Pr_6BA            ;none
  325.     MOV    AL,lcr_122
  326.     AND    AL,10H            ;mask for parity bit
  327.     JNZ    Skp6B1
  328.      MOV    DX,OFFSET odd$456    ;'odd   $'
  329.      JMP    SHORT    Pr_6B4
  330.  
  331. ;    NOP
  332. Skp6B1:    MOV    DX,OFFSET even$45D    ;'even  $'
  333. Pr_6B4:    MOV    AH,9
  334.     INT    21H
  335.     JMP    SHORT    Skp6C1
  336.  
  337. Pr_6BA:    MOV    DX,OFFSET none$464    ;'none  $'
  338.     MOV    AH,9
  339.     INT    21H
  340.  
  341. Skp6C1:    MOV    DX,OFFSET msg_235    ;'            3. CTS In : $'
  342.     MOV    AH,9
  343.     INT    21H
  344.  
  345.     MOV    AL,msr_125        ;MSR status
  346.     AND    AL,10H            ;mask to CTS bit
  347.     JNZ    Skp6D5            ;non-0 = high
  348.      MOV    DX,OFFSET msg_515    ;'low   $' CTS In
  349.      JMP    SHORT    Pr_6D8
  350.  
  351. ;    NOP
  352. Skp6D5:    MOV    DX,OFFSET msg_51C    ;'high  $' CTS in
  353. Pr_6D8:    MOV    AH,9
  354.     INT    21H
  355.  
  356.     MOV    DX,OFFSET msg_24E    ;CR,LF,'  4. Rate     : $'
  357.     MOV    AH,9
  358.     INT    21H
  359.  
  360.     MOV    AX,bauddiv_11F        ;baudrate divisor
  361.     MOV    DI,7
  362.     MOV    CX,10H            ;total 16 records
  363. Lup6EC:    CMP    AX,word ptr [DI+baudtbl_479]
  364.     JZ    GotBaud_6F9
  365.     ADD    DI,9            ;next record
  366.     LOOP    Lup6EC
  367.     JCXZ    No_TableBaud_709
  368.  
  369. GotBaud_6F9:
  370.     MOV    AX,DI            ;record end
  371.     SUB    AX,7            ;back up to the string
  372.     ADD    AX,OFFSET baudtbl_479    ;table start
  373.     MOV    DX,AX
  374.     MOV    AH,9
  375.     INT    21H
  376.     JMP    SHORT    Check_DSR_763    ;skip to DSR check
  377.  
  378. ;Baudrate wasn't in our table
  379. No_TableBaud_709:
  380.     CMP    AX,2            ;divisor < 2?
  381.     JB    FastBaud_75C        ;yep, just say fast!!
  382.  
  383. ;Compute and display the raw baudrate
  384.     PUSH    BX            ;dumb
  385.     PUSH    CX
  386.     PUSH    DX
  387.     PUSH    DI
  388.  
  389.     MOV    BX,AX            ;divisor into BX
  390.     MOV    CL,4
  391.     SHL    BX,CL            ;*16
  392.     MOV    DX,1CH            ;long division
  393.     MOV    AX,2000H
  394.     DIV    BX
  395.  
  396.     MOV    DI,OFFSET buff_129    ;Asciify the result
  397.     XOR    BX,BX            ;buffer base
  398.     MOV    CX,6            ;6-byte buffer
  399. Lup728:    MOV    BYTE PTR [BX+DI],0    ;initialize buffer
  400.     INC    BX
  401.     LOOP    Lup728
  402.  
  403.     XCHG    BX,DI            ;BX -> buffer start
  404.     DEC    BX            ;back up 1
  405.     MOV    DI,0AH            ;10 constant for dividing
  406. Lup734:    XOR    DX,DX            ;clear overflow
  407.     DIV    DI            ;/10
  408.     INC    BX            ;bump buffer ptr
  409.     INC    CX            ;bump digit counter
  410.     MOV    [BX],DL            ;stuff Ascii char in buffer
  411.     OR    AX,AX            ;done?
  412.     JNZ    Lup734            ;nope
  413.  
  414.     XOR    DI,DI            ;string buffer base offset
  415. Lup742:    MOV    AL,[BX]            ;Ascii char
  416.     OR    AL,30H            ;mask to uppercase?
  417.     MOV    [DI+numbuff_12F],AL    ;stuff in blank string
  418.     DEC    BX
  419.     INC    DI
  420.     DEC    CX
  421.     JNZ    Lup742
  422.  
  423.     MOV    DX,OFFSET numbuff_12F    ;display ASCII number
  424.     MOV    AH,9
  425.     INT    21H
  426.  
  427.     POP    DI
  428.     POP    DX
  429.     POP    CX
  430.     POP    BX
  431.     JMP    SHORT    Check_DSR_763    ;skip to DSR check
  432.  
  433. FastBaud_75C:
  434.     MOV    DX,OFFSET msg_500    ;'fast!!$'
  435.     MOV    AH,9
  436.     INT    21H
  437.  
  438. Check_DSR_763:
  439.     MOV    DX,OFFSET msg_261    ;'            4. DSR In : $'
  440.     MOV    AH,9
  441.     INT    21H
  442.     MOV    AL,msr_125        ;MSR status
  443.     AND    AL,20H            ;mask to MSR bit
  444.     JNZ    Skp777            ;non-0 = high
  445.      MOV    DX,OFFSET msg_515    ;'low   $'
  446.      JMP    SHORT    Pr_77A
  447.  
  448. ;    NOP
  449. Skp777:    MOV    DX,OFFSET msg_51C    ;'high  $'
  450. Pr_77A:    MOV    AH,9
  451.     INT    21H
  452.  
  453.     MOV    DX,OFFSET msg_27A    ;'CR,LF,'  5. Stick    : $'
  454.     MOV    AH,9
  455.     INT    21H
  456.     MOV    AL,lcr_122        ;get LCR status
  457.     AND    AL,20H            ;mask to "stick" status
  458.     JNZ    Skp792            ;non-0 means "set"
  459.      MOV    DX,OFFSET norm$46B    ;'normal$'
  460.      JMP    SHORT    Pr_795
  461.  
  462. ;    NOP
  463. Skp792:    MOV    DX,OFFSET set$472    ;'set   $'
  464. Pr_795:    MOV    AH,9
  465.     INT    21H
  466.  
  467.     MOV    DX,OFFSET msg_28D    ;'            5. CD In  : $'
  468.     MOV    AH,9
  469.     INT    21H
  470.     MOV    AL,msr_125        ;MSR status
  471.     AND    AL,80H            ;mask to Carrier Detect status
  472.     JNZ    Skp7AD            ;non-0 means high
  473.      MOV    DX,OFFSET msg_515    ;'low   $'
  474.      JMP    SHORT    Pr_7B0
  475.  
  476. ;    NOP
  477. Skp7AD:    MOV    DX,OFFSET msg_51C    ;'high  $'
  478. Pr_7B0:    MOV    AH,9
  479.     INT    21H
  480.  
  481.     MOV    DX,OFFSET msg_2A6    ;CR,LF,'  6. Break    : $'
  482.     MOV    AH,9
  483.     INT    21H
  484.     MOV    AL,lcr_122        ;get LCR status
  485.     AND    AL,40H            ;mask break bit
  486.     JNZ    Skp7C8            ;non-0 = set
  487.      MOV    DX,OFFSET norm$46B    ;'normal$'
  488.      JMP    SHORT    Pr_7CB
  489.  
  490. ;    NOP
  491. Skp7C8:    MOV    DX,OFFSET set$472    ;'set   $'
  492. Pr_7CB:    MOV    AH,9
  493.     INT    21H
  494.  
  495.     MOV    DX,OFFSET msg_2B9    ;'            6. RI In  : $'
  496.     MOV    AH,9
  497.     INT    21H
  498.     MOV    AL,msr_125        ;MSR status
  499.     AND    AL,40H            ;mask Ring Indicator bit
  500.     JNZ    Skp7E3
  501.      MOV    DX,OFFSET msg_515    ;'low   $'
  502.      JMP    SHORT    Pr_7E6
  503.  
  504. ;    NOP
  505. Skp7E3:    MOV    DX,OFFSET msg_51C    ;'high  $'
  506. Pr_7E6:    MOV    AH,9
  507.     INT    21H
  508.  
  509. ;'C. Line Status:                 D. Error Status:',CR,LF
  510. ;'  1. Receive Buffer : $'
  511.     MOV    DX,OFFSET msg_2D2
  512.     MOV    AH,9
  513.     INT    21H
  514.     MOV    AL,lsr_124        ;LSR status
  515.     AND    AL,1            ;mask Receive Buffer status byte
  516.     JNZ    Skp7FE            ;non-0 = full
  517.      MOV    DX,OFFSET msg_507    ;'empty $'
  518.      JMP    SHORT    Pr_801
  519.  
  520. ;    NOP
  521. Skp7FE:    MOV    DX,OFFSET msg_50E    ;'full  $'
  522. Pr_801:    MOV    AH,9
  523.     INT    21H
  524.  
  525.     MOV    DX,OFFSET msg_31F    ;'      1. Overrun: $'
  526.     MOV    AH,9
  527.     INT    21H
  528.     MOV    AL,lsr_124        ;LSR status
  529.     AND    AL,2            ;mask Overrun error bit
  530.     JNZ    Skp819
  531.      MOV    DX,OFFSET none$464    ;'none  $'
  532.      JMP    SHORT    Pr_81C
  533.  
  534. ;    NOP
  535. Skp819:    MOV    DX,OFFSET set$472    ;'set   $'
  536. Pr_81C:    MOV    AH,9
  537.     INT    21H
  538.  
  539.     MOV    DX,OFFSET msg_332    ;CR,LF,'  2. Transmit Buffer: $'
  540.     MOV    AH,9
  541.     INT    21H
  542.     MOV    AL,lsr_124        ;LSR status
  543.     AND    AL,20H            ;mask Transmit Buffer status bit
  544.     JNZ    Skp834            ;non-0 = empty
  545.      MOV    DX,OFFSET msg_50E    ;'full  $'
  546.      JMP    SHORT    Pr_837
  547.  
  548. ;    NOP
  549. Skp834:    MOV    DX,OFFSET msg_507    ;'empty $'
  550. Pr_837:    MOV    AH,9
  551.     INT    21H
  552.  
  553.     MOV    DX,OFFSET msg_34B    ;'      2. Parity : $'
  554.     MOV    AH,9
  555.     INT    21H
  556.     MOV    AL,lsr_124        ;LSR status
  557.     AND    AL,4            ;mask Parity error bit
  558.     JNZ    L084F
  559.      MOV    DX,OFFSET none$464    ;'none  $'
  560.      JMP    SHORT    L0852
  561.  
  562. ;    NOP
  563. L084F:    MOV    DX,OFFSET set$472    ;'set   $'
  564. L0852:    MOV    AH,9
  565.     INT    21H
  566.  
  567.     MOV    DX,OFFSET msg_35E    ;'  3. Break Status   : $'
  568.     MOV    AH,9
  569.     INT    21H
  570.     MOV    AL,lsr_124        ;LSR status
  571.     AND    AL,10H            ;mask Break Status bit
  572.     JNZ    L086A
  573.      MOV    DX,OFFSET none$464    ;'none  $'
  574.      JMP    SHORT    L086D
  575.  
  576. ;    NOP
  577. L086A:    MOV    DX,OFFSET set$472    ;'set   $'
  578. L086D:    MOV    AH,9
  579.     INT    21H
  580.  
  581.     MOV    DX,OFFSET msg_377    ;'      3. Frame  : $'
  582.     MOV    AH,9
  583.     INT    21H
  584.     MOV    AL,lsr_124        ;LSR status
  585.     AND    AL,8            ;mask Frame error bit
  586.     JNZ    L0885
  587.      MOV    DX,OFFSET none$464    ;'none  $'
  588.      JMP    SHORT    L0888
  589.  
  590. ;    NOP
  591. L0885:    MOV    DX,OFFSET set$472    ;'set   $'
  592. L0888:    MOV    AH,9
  593.     INT    21H
  594.  
  595.     MOV    DX,OFFSET msg_38A    ;'  4. Loop Back      : $'
  596.     MOV    AH,9
  597.     INT    21H
  598.     MOV    AL,mcr_123        ;MCR status
  599.     AND    AL,10H            ;mask Loop Back error bit
  600.     JNZ    L08A0
  601.      MOV    DX,OFFSET norm$46B    ;'normal$'
  602.      JMP    SHORT    L08A3
  603.  
  604. ;    NOP
  605. L08A0:    MOV    DX,OFFSET set$472    ;'set   $'
  606. L08A3:    MOV    AH,9
  607.     INT    21H
  608.  
  609. ;"E. Interrupt Status:'
  610.     MOV    DX,OFFSET msg_3A3    ;CR,LF,'  1. Output      : $'
  611.     MOV    AH,9
  612.     INT    21H
  613.     MOV    AL,mcr_123        ;MCR status
  614.     AND    AL,8            ;mask Output Int Status bit
  615.     JNZ    L08BB            ;non-0 = disabled
  616.      MOV    DX,OFFSET msg_523    ;'enable$'
  617.      JMP    SHORT    L08BE
  618.  
  619. ;    NOP
  620. L08BB:    MOV    DX,OFFSET msg_52A    ;'disable$'
  621. L08BE:    MOV    AH,9
  622.     INT    21H
  623.  
  624.     MOV    DX,OFFSET msg_3D1    ;'  2. Data Ready  : $'
  625.     MOV    AH,9
  626.     INT    21H
  627.     MOV    AL,ier_121        ;Interrupt Enable Status
  628.     AND    AL,1            ;mask to Data Ready
  629.     JNZ    L08D6            ;non-0 = enabled
  630.      MOV    DX,OFFSET msg_52A    ;'disable$'
  631.      JMP    SHORT    L08D9
  632.  
  633. ;    NOP
  634. L08D6:    MOV    DX,OFFSET msg_523    ;'enable$'
  635. L08D9:    MOV    AH,9
  636.     INT    21H
  637.  
  638.     MOV    DX,OFFSET msg_3E7    ;'  3. Xmit Empty  : $'
  639.     MOV    AH,9
  640.     INT    21H
  641.     MOV    AL,ier_121        ;IER status
  642.     AND    AL,2            ;mask to Xmit buffer empty
  643.     JNZ    L08F1            ;non-0 = enabled
  644.      MOV    DX,OFFSET msg_52A    ;'disable$'
  645.      JMP    SHORT    L08F4
  646.  
  647. ;    NOP
  648. L08F1:    MOV    DX,OFFSET msg_523    ;'enable$'
  649. L08F4:    MOV    AH,9
  650.     INT    21H
  651.  
  652.     MOV    DX,OFFSET msg_3FD    ;'  4. Line Status : $'
  653.     MOV    AH,9
  654.     INT    21H
  655.     MOV    AL,ier_121        ;IER status
  656.     AND    AL,4            ;mask Line Status int status
  657.     JNZ    L090C
  658.      MOV    DX,OFFSET msg_52A    ;'disable$'
  659.      JMP    SHORT    L090F
  660.  
  661. ;    NOP
  662. L090C:    MOV    DX,OFFSET msg_523    ;'enable$'
  663. L090F:    MOV    AH,9
  664.     INT    21H
  665.  
  666.     MOV    DX,OFFSET msg_413    ;'  5. Modem Status: $'
  667.     MOV    AH,9
  668.     INT    21H
  669.     MOV    AL,ier_121        ;IER status
  670.     AND    AL,8            ;mask Modem Status int status
  671.     JNZ    L0927
  672.      MOV    DX,OFFSET msg_52A    ;'disable$'
  673.      JMP    SHORT    L092A
  674.  
  675. ;    NOP
  676. L0927:    MOV    DX,OFFSET msg_523    ;'enable$'
  677. L092A:    MOV    AH,9
  678.     INT    21H
  679.  
  680.     MOV    DX,OFFSET crlf_429    ;CR,LF,'$'
  681.     MOV    AH,9
  682.     INT    21H
  683.  
  684.     MOV    AL,0            ;ERRORLEVEL 0
  685. Term_937:
  686.     MOV    AH,4CH            ;terminate, ERRORLEVEL in AL
  687.     INT    21H
  688.  
  689. RS_532    endp
  690.  
  691. ;BL : display attribute
  692. ;DS:SI -> $-terminated string to display
  693.  
  694. PrStr_93B    proc    near
  695.     LODSB
  696.     CMP    AL,24H    ;'$'
  697.     JZ    L0957
  698.  
  699.     MOV    BH,vidpage_128    ;original display page
  700.     MOV    CX,1        ;1 copy
  701.     MOV    AH,9        ;write char & attrib
  702.     INT    10H        ;via BIOS
  703.     MOV    AH,3        ;read cursor psn
  704.     INT    10H
  705.     INC    DL        ;bump to next column
  706.     MOV    AH,2        ;set cursor psn
  707.     INT    10H
  708.     JMP    PrStr_93B    ;loop
  709.  
  710. L0957:    RET
  711.  
  712. PrStr_93B    endp
  713.  
  714.     DB    28H DUP(0)
  715.  
  716. CSEG    ENDS
  717.     END    RS_100
  718.