home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / tools / filemod / filemod2.asm next >
Assembly Source File  |  1989-05-15  |  36KB  |  1,797 lines

  1. ;FILEMOD2    latest bug fix 15 May 89 = FILEMOD2.ZIP
  2.  
  3. cr    EQU    0Dh
  4. lf    EQU    0Ah
  5. tab    EQU    9
  6.  
  7. CSEG    segment    byte public
  8.     assume    CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
  9.  
  10.     ORG    0100h
  11.  
  12. Start:    JMP    Begin
  13.  
  14. NoNameMsg DB    'FileMod2 Byte Editor  5/89  by J. E. Arkay',cr,lf,cr,lf
  15.     DB    'Syntax:  FILEMOD2 [d:][\path\]filename.ext',cr,lf
  16.     DB    'Hit F1 for help.',cr,lf,'$',1Ah
  17.  
  18. VideoSeg    DW    0
  19. Ten        DW    10
  20. ParamCount    DB    0,0
  21. CmdLineBuf    DB    7Eh DUP (0)
  22. CmdLineByteCount DW    0
  23.         DB    'Video Attributes:'
  24. LineNoAttr    DB    0Ch,'=LINE NOS'
  25. HexDisplAttr    DB    6,'=HEX DISPLAY'
  26. HexCrsrAttr    DB    0F0h,'=HEX EDIT CRSR'
  27. ASCIIdisplAttr    DB    7,'=ASCII DISPLAY'
  28. ActCrsrAttr    DB    70h,'=ACTIVE CRSR'
  29. PassCrsrAttr    DB    1,'=SLAVE CRSR'
  30. HelpAttr    DB    74h,'=HELP SCREEN'
  31. HelpBrdrAttr    DB    1Ch,'=HELP BORDER'
  32. ActiveScrn    DB    0,'=BOOT ACTIVE'     ;0 = ASCII, 1 = Hex field active
  33. GraphChars    DB    0,'=GRAPHIC CHARS'
  34. HexPfx        DB    '_','=HEX PFX'
  35. CrsrType    DW    0
  36. COMflag        DB    0        ;set to 1 if .COM file loaded
  37. FNameToShow    DB    80h DUP (0)
  38. ReadBuf        DB    100h DUP (0)
  39. Buf2        DB    100h DUP (0)    ; MUST follow ReadBuf
  40. Handle        DW    0
  41. LastRecLo    DB    0
  42. LastRecHi    DB    0
  43. BytesRead    DW    0
  44. CurrRecLo    DB    1
  45. CurrRecHi    DB    0
  46. UnsavedFlag    DB    0
  47. H003E6        DB    0
  48. HexPointer    DW    322        ;decimal, 161st char, 2nd on 3rd line
  49. ASCIIpntr    DW    444        ;222nd char
  50. HexCrsrLocn    DW    6
  51. H0040C        DW    0
  52. KeystrokeAX    DW    0
  53. H00410        DB    0
  54. SearchMode    DB    0
  55. SrchForStr     DB    'Search for: '
  56. InputString    DB    41 DUP (0)    ; MUST follow SrchForStr
  57. HexString    DB    41 DUP (0)
  58. BytesToSearch    DB    0,0        ;accessed as WORD in Search
  59. BytesInput    DB    0,0        ; ditto
  60. ByteNo        DB    0,0        ; ditto
  61. LastByte    DB    0,0        ; ditto
  62. RecNumBuf    DB    5,0
  63. RecNumInput    DB    0,0,0,0,0,0    ; MUST follow RecNumBuf
  64. SModeStr    DB    'Use ═ ═ keys: '            ;16 bytes
  65.         DB    'Case-Insens   Exact       Hex    '    ;33 bytes
  66.  
  67. ;these are in reverse order of VecTbl.  Must change number at ChkOurKeys
  68. ; if you add a function !
  69.     DB    'SCAN CODE TABLE:'
  70. ScanCodeTbl    DB    42h,3Ch,44h,40h,47h,4Fh,0Fh,4Bh,0Eh
  71.         DB    4Dh,48h,50h,75h,77h,84h,76h,49h,51h,43h,3Bh,1
  72.  
  73. VecTbl    DW    offset ESCpgm    ;exit pgm (not help)
  74.     DW    offset F1    ;help
  75.     DW    offset F9    ;save record
  76.     DW    offset PgDn
  77.     DW    offset PgUp
  78.     DW    offset CtrlPgDn
  79.     DW    offset CtrlPgUp
  80.     DW    offset CtrlHome
  81.     DW    offset CtrlEnd
  82.     DW    offset UpDnArrow
  83.     DW    offset UpDnArrow
  84.     DW    offset RightLeftBksp
  85.     DW    offset RightLeftBksp
  86.     DW    offset RightLeftBksp
  87.     DW    offset TabScreen ;switch active field
  88.     DW    offset EndKey
  89.     DW    offset HomeKey
  90.     DW    offset F6    ;toggle non-ASCII characters
  91.     DW    offset F10    ;new record
  92.     DW    offset F2    ;search
  93.     DW    offset DoSearch    ;F8, repeat search
  94.  
  95. OpenErrMsg    DB    ' File Open error, code is '
  96. ErrCode        DB    '00',cr,lf,'$'
  97. ;each of these is 16d bytes long:
  98. Err2        DB    'File not found $'
  99. Err3        DB    'Path not found $'
  100. Err4        DB    'Too many files $'
  101. Err5        DB    'Access denied  $'
  102.  
  103. CrLf$        DB    cr,lf,'$'
  104. ASCII$        DB    'ASCII'
  105. _HEX_$        DB    ' HEX '
  106. NoEnteredStr    DB    'No String Entered',0
  107. InvalidStr     DB    'Invalid',0
  108. UnsavedStr     DB    'Unsaved changes - Hit F9 to save, any '
  109.         DB    'other key to continue',0
  110. RecSavStr     DB    'Record saved',0
  111. RecNumStr     DB    'Record number:',0
  112. SrchFoundStr    DB    'Search string found',0
  113. SrchFailedStr     DB    'Search failed',0
  114. SrchAbortStr     DB    'Search cancelled',0
  115.         DB    10 DUP ('Stack   ')
  116.  
  117. ScreenStart DB    80 dup (' ',7)            ;byte numbers go here
  118. ;2nd line:
  119.     DB    3 dup (' ',7)
  120.     DB    '┌',7
  121.     DB    48 dup ('─',7)
  122.     DB    28 dup (' ',7)
  123. FirstLineNo DB    7 dup (' ',7),' '
  124. HexSpaces DB    7
  125.     DB    45 dup (' ',7)
  126.     DB    'R',4,'e',4,'c',4,'o',4,'r',4,'d',4,' ',4
  127.     DB    '│',7,18 dup (' ',7),'│',7
  128. ;4th line:
  129.     DB    54 dup (' ',7)
  130. CurRec    DB    6 dup (' ',7)
  131.     DB    '│',7,18 dup (' ',7),'│',7
  132. ;5th line:
  133.     DB    60 dup (' ',7)
  134.     DB    '│',7,18 dup (' ',7),'│',7
  135. ;6th line:
  136.     DB    54 dup (' ',7)
  137.     DB    'L',4,'a',4,'s',4,'t',4,' ',4,' ',4
  138.     DB    '│',7,18 dup (' ',7),'│',7
  139. ;7th line:
  140.     DB    54 dup (' ',7)
  141. LastRecLoc DB    6 dup (' ',7)
  142.     DB    '│',7,18 dup (' ',7),'│',7
  143. ;8th line:
  144.     DB    60 dup (' ',7)
  145.     DB    '│',7,18 dup (' ',7),'│',7
  146. ;9th line:
  147.     DB    54 dup (' ',7)
  148.     DB    'B',4,'y',4,'t',4,'e',4,' ',7,' ',7
  149.     DB    '│',7,18 dup (' ',7),'│',7
  150. ;10th line:
  151.     DB    55 dup (' ',7)
  152.     DB    2 dup (' ',0Ch)            ;byte no. goes here
  153.     DB    3 dup (' ',7)
  154.     DB    '│',7,18 dup (' ',7),'│',7
  155. ;11th line:
  156.     DB    60 dup (' ',7)
  157.     DB    '│',7,18 dup (' ',7),'│',7
  158. ;12th line:
  159.     DB    55 dup (' ',7)
  160.     DB    '',4
  161.     DB    4 dup (' ',4)
  162.     DB    '│',7,18 dup (' ',7),'│',7
  163. ;13th line:
  164.     DB    53 dup (' ',7)
  165.     DB    ' ',4,'H',4,'e',4,'x',4,' ',4,' ',4,' ',4
  166.     DB    '│',7,18 dup (' ',7),'│',7
  167. ;14th line:
  168.     DB    53 dup (' ',7)
  169.     DB    'V',4,'a',4,'l',4,'u',4,'e',4,'s',4,' ',4
  170.     DB    '│',7,18 dup (' ',7),'│',7
  171. ;15th line:
  172.     DB    60 dup (' ',7)
  173.     DB    '│',7,18 dup (' ',7),'│',7
  174.  
  175.     DB    60 dup (' ',7)
  176.     DB    '│',7,18 dup (' ',7),'│',7
  177.  
  178.     DB    60 dup (' ',7)
  179.     DB    '│',7,18 dup (' ',7),'│',7
  180.  
  181.     DB    60 dup (' ',7)
  182.     DB    '│',7,18 dup (' ',7),'│',7
  183. ;19th line:
  184.     DB    80 dup (' ',7)
  185.  
  186. FileNameLoc DB    62 dup (' ',7)
  187.     DB    '┌',7,14 dup ('─',7),'┐',7,' ',7,' ',7
  188. ;21st line:
  189.     DB    62 dup (' ',7)
  190.     DB    '│',7,' ',17h,'F',17h,'i',17h,'l',17h,'e',17h
  191.     DB    'M',17h,'o',17h,'d',17h,' ',17h
  192.     DB    'V',17h,'2',17h,'.',17h,'0',17h,' ',17h,'│',7,' ',7,' ',7
  193. ;22nd line:
  194.     DB    62 dup (' ',0Eh),'└',7,14 dup ('─',7),'┘',7,' ',7,' ',7
  195.  
  196.     DB    80 dup (' ',7)
  197. ;24th line:
  198.     DB    'F',70h,'1',70h,'=',5,'H',5,'e',5,'l',5,'p',5
  199.     DB    ' ',5
  200.     DB    'F',70h,'2',70h,'=',5,'S',5,'e',5,'a',5,'r',5,'c',5,'h',5
  201.     DB    ',',5
  202.     DB    'F',70h,'8',70h,'=',5,'R',5,'e',5,'p',5,'e',5,'a',5,'t',5
  203.     DB    ' ',5
  204.     DB    'F',70h,'6',70h,'=',5,'S',5,'e',5,'e',5,' ',5
  205.     DB    'C',5,'h',5,'r',5,'$',5
  206.     DB    ' ',5
  207.     DB    'T',70h,'a',70h,'b',70h,'=',5,'C',5,'h',5,'g',5,' ',5
  208.     DB    'f',5,'i',5,'e',5,'l',5,'d',5,'s',5
  209.     DB    ' ',5
  210.     DB    'F',70h,'1',70h,'0',70h,'=',5,'N',5,'e',5,'w',5,' ',5
  211.     DB    'R',5,'e',5,'c',5
  212.     DB    3 dup (' ',5)
  213.     DB    'F',70h,'9',70h,'=',5,'S',5,'a',5,'v',5,'e',5
  214.     DB    ' ',5,'R',5,'e',5,'c',5
  215. ;25th line:
  216.     DB    ' ',5,'E',70h,'s',70h,'c',70h,'=',5,'E',5,'x',5,'i',5,'t',5
  217.     DB    3 dup (' ',5)
  218.     DB    '^',70h,'H',70h,'o',70h,'m',70h,'e',70h,'=',5
  219.     DB    '1',5,'s',5,'t',5,' ',5,'B',5,'y',5,'t',5,'e',5
  220.     DB    ' ',5
  221.     DB    '^',70h,'E',70h,'n',70h,'d',70h,'=',5,'L',5,'a',5,'s',5,'t',5
  222.     DB    ' ',5,'B',5,'y',5,'t',5,'e',5,' ',5
  223.     DB    'P',70h,'g',70h,'D',70h,'n',70h,'/',5,'U',70h,'p',70h,'=',5
  224.     DB    'N',5,'e',5,'x',5,'t',5,' ',5,'R',5,'e',5,'c',5
  225.     DB    ' ',5
  226.     DB    '^',70h,'P',70h,'g',70h,'D',70h,'n',70h,'/',5,'U',70h,'p',70h
  227.     DB    '=',5,'L',5,'a',5,'s',5,'t',5,'/',5,'1',5,'s',5,'t',5
  228.     DB    ' ',5,'R',5,'e',5,'c',5
  229.  
  230. HelpBottom    DB    '──── ESC=Exit ─────────────────'    ;62 chars
  231.         DB    '──────── use PgUp PgDn   ────'
  232.  
  233. ;each line is 62 chars, including at least 1 space at each end
  234. HelpMsg    DB    ' FileMod runs in CGA or Mono mode.',0
  235.     DB    ' Records are 256d bytes.  TAB toggles the active field',0
  236.     DB    ' between Hex and ASCII.  The large cursor is active.',0
  237.     DB    ' You must hit both characters of a Hex number.',0
  238.     DB    ' If you load a .COM file, the first record is 1; otherwise,',0
  239.     DB    ' the first record is 0.',0
  240.     DB    0
  241.     DB    ' Home, End, and the cursor keys work normally.',0
  242.     DB    0
  243.     DB    ' Searching (F2 or CTRL-S):   Put no quotes around text.',0
  244.     DB    ' Max length of search string is 40 characters.  You can',0
  245.     DB    ' put Hex numbers in ASCII searches by preceding with HEX PFX  '
  246.     DB    ' char (default is _).   Example:',0
  247.     DB    '       HELLO_0D_0a  searches for HELLO,cr,lf',0
  248.     DB    ' ESC or F2 cancels string entry.',0
  249.     DB    ' In Hex mode, enter both characters and separate with space.',0
  250.     DB    0
  251. ;page 2:
  252.     DB    ' CHANGING DEFAULTS',0
  253.     DB    ' Many default settings can be changed by using FileMod on     '
  254.     DB    ' itself.  Starting in Record 0002 (following the string Video '
  255.     DB    ' Attributes) you''ll find 11 items shown as byte=NAME.',0
  256.     DB    ' Make sure you have a backup copy of FileMod.',0
  257.     DB    ' TAB over to the Hex field and put the cursor on the byte',0
  258.     DB    ' before =ASCII DISPLAY.  It is 07, for white on black.        '
  259.     DB    ' If, for example, you change it to 1E the ASCII part of the   '
  260.     DB    ' screen will be yellow on blue.',0
  261.     DB    0
  262.     DB    ' You can also change the 21 action keys.  Their scan codes    '
  263.     DB    ' follow the string SCAN CODE TABLE:.',0
  264.     DB    0
  265.     DB    ' Send complaints or money to:',0
  266.     DB    ' J. E. Arkay  PO Box 9747  Baltimore, MD  21204',0
  267.     DB    0
  268.     DB    0
  269.  
  270. MaxMove        DB    17        ;max no of lines moved = 1 page
  271. HelpLineCount    DB    0
  272.  
  273. Begin:    MOV    AX,OFFSET ScreenStart
  274.     MOV    SP,AX
  275.     MOV    SI,80h
  276.     MOV    DI,OFFSET ParamCount
  277.     MOV    CX,80h
  278.     CLD
  279.     REP    MOVSB
  280.     XOR    CX,CX
  281.     MOV    CL,ParamCount
  282.     MOV    CmdLineByteCount,CX
  283.     CALL    SetVideoSeg
  284.     CALL    GetTargetName
  285.     JC    Abort
  286.     CALL    OpenFile
  287.     JC    Abort
  288.     CALL    GetFileStats        ;does Last record no.
  289.     JC    Abort
  290.     CALL    TabScreen
  291.     CALL    CopyHexDisplAttr
  292.     CALL    ShowFNameAndDate
  293.     CALL    ShowLineNos
  294.     CALL    ShowCurrRec
  295.     CALL    MoveAndRead
  296.     CALL    SetCrsrType
  297. KeyLoop:
  298.     CALL    GetKey
  299.     JNC    KeyLoop
  300. ;Carry signals ESC is hit, exit the pgm
  301.     CALL    RestoreCrsr
  302. Abort:    MOV    BX,Handle
  303.     MOV    AH,3Eh            ;Close File
  304.     INT    21h
  305.     MOV    AX,4C00h        ;exit with Errorlevel 0
  306.     INT    21h
  307.  
  308. ; - - - - - - - - - - - - - - - - - -
  309. GetKey:    MOV    AH,1            ;Report kbd char
  310.     INT    16h
  311.     JZ    KBufClear
  312.     XOR    AH,AH            ;clears the kbd buffer
  313.     INT    16h
  314.     JMP    SHORT GetKey
  315.  
  316. KBufClear:
  317.     XOR    AH,AH            ;Wait for kbd character
  318.     INT    16h
  319. ChkOurKeys:
  320.     PUSH    AX            ;save scan codes
  321.     MOV    AH,2            ;get shift key status
  322.     INT    16h
  323.     MOV    BL,AL            ;save shift status
  324.     POP    AX
  325.     TEST    BL,00000100b        ;CTRL key depressed ?
  326.     CMP    AL,13h
  327.     JNZ    NoShifts
  328.     JMP    F2            ;CTRL-s does search, too
  329.     
  330. NoShifts:
  331.     XCHG    AL,AH
  332.     MOV    CX,21            ;21d entries
  333.     MOV    DI,OFFSET ScanCodeTbl
  334.     REPNZ    SCASB
  335.     JZ    Vector
  336.     CMP    ActiveScrn,0
  337.     JNZ    HexActive
  338.     CALL    ASCIIactive
  339.     CMP    H003E6,0
  340.     JZ    GetKey
  341.     MOV    H003E6,0
  342.     JMP    SHORT NoShifts
  343.  
  344. HexActive:
  345.     CALL    H01CF8
  346.     JMP    SHORT GetKey
  347.  
  348. Vector:    SHL    CX,1
  349.     MOV    DI,CX
  350.     JMP    WORD PTR [DI+offset VecTbl]
  351.  
  352. ASCIIactive:
  353.     CALL    ChkHexKey
  354.     JNC    NotHex
  355.     JMP    RetWithNC
  356.  
  357. NotHex:    MOV    CL,4
  358.     SHL    AL,CL
  359.     XOR    BH,BH
  360.     MOV    BL,ByteNo
  361.     MOV    SI,BX
  362.     MOV    CL,BYTE PTR [SI+offset ReadBuf]
  363.     MOV    H00410,CL
  364.     AND    BYTE PTR [SI+offset ReadBuf],00001111b
  365.     OR    BYTE PTR [SI+offset ReadBuf],AL
  366.     CALL    PaintHexAndASCII
  367.     CALL    PaintScreen
  368.     CALL    ShoCursors
  369.     PUSH    ES
  370.     MOV    ES,WORD PTR DS:VideoSeg
  371.     MOV    CX,HexCrsrLocn
  372.     MOV    SI,CX
  373.     MOV    CL,HexCrsrAttr
  374.     MOV    BYTE PTR ES:1[SI],CL
  375.     POP    ES
  376.     XOR    AH,AH
  377.     INT    16h            ;wait for Kbd char
  378.     MOV    KeystrokeAX,AX
  379.     MOV    AH,AL            ;ASCII code
  380.     CALL    ChkHexKey
  381.     JC    NotaHexHit 
  382.     XOR    BH,BH
  383.     MOV    BL,ByteNo
  384.     MOV    SI,BX
  385.     AND    AL,00001111b
  386.     AND    BYTE PTR [SI+offset ReadBuf],11110000b
  387.     OR    BYTE PTR [SI+offset ReadBuf],AL
  388.     MOV    UnsavedFlag,1
  389.     INC    ByteNo
  390.     JNZ    NotAtFF
  391.     DEC    ByteNo            ;limit INC to FF max
  392. NotAtFF:
  393.     CALL    PaintHexAndASCII
  394.     CALL    PaintScreen
  395.     CALL    ShoCursors
  396.     JMP    SHORT RetWithNC
  397. NotaHexHit:
  398.     MOV    AL,H00410
  399.     XOR    BH,BH
  400.     MOV    BL,ByteNo
  401.     MOV    SI,BX
  402.     MOV    BYTE PTR [SI+offset ReadBuf],AL
  403.     CALL    PaintHexAndASCII
  404.     CALL    PaintScreen
  405.     CALL    ShoCursors
  406.     MOV    AX,KeystrokeAX
  407.     MOV    H003E6,1
  408. RetWithNC:
  409.     CLC
  410.     RET
  411.  
  412. ChkHexKey:
  413.     MOV    AL,AH
  414.     CALL    UpCaseAndCifNotASCII
  415.     MOV    AH,AL
  416.     JC    SetCarry
  417.     CMP    AH,'9'        ;39h
  418.     JNA    Numbr
  419.     CMP    AH,'A'        ;41h
  420.     JB    SetCarry    ;above 9 and below A is not a Hex char
  421.     MOV    AL,AH
  422.     SUB    AL,7        ;for letters only
  423. Numbr:    SUB    AL,30h
  424.     JC    SetCarry
  425.     CMP    AL,0Fh
  426.     JA    SetCarry
  427.     CLC
  428.     RET
  429.  
  430. SetCarry:
  431.     STC
  432.     RET
  433.  
  434. H01CF8:    CMP    AH,' '        ;20h
  435.     JC    RET1
  436.     CMP    AH,7Eh        ;highest printable code, '~'
  437.     JA    RET1
  438.     XOR    BH,BH
  439.     MOV    BL,ByteNo
  440.     MOV    SI,BX
  441.     MOV    BYTE PTR [SI+offset ReadBuf],AH
  442.     INC    ByteNo
  443.     JNZ    NoDEC
  444.     DEC    ByteNo
  445. NoDEC:
  446.     CALL    PaintHexAndASCII
  447.     CALL    PaintScreen
  448.     CALL    ShoCursors
  449.     MOV    UnsavedFlag,1
  450. RET1:    RET
  451.  
  452. ; - - - - - - - - - - - - - - - - - -
  453. F10:    CALL    PaintScreen
  454.     CALL    ShoCursors
  455.     CMP    UnsavedFlag,0
  456.     JZ    H01D37
  457.     CALL    AskSave
  458. H01D37:
  459.     MOV    SI,OFFSET RecNumStr
  460.     CALL    ShoOnMsgLine
  461.     MOV    AH,2            ;set crsr position
  462.     MOV    DH,15h            ;row
  463.     MOV    DL,0Fh            ;column
  464.     MOV    BH,0            ;display page
  465.     INT    10h
  466.     MOV    AH,0Ah            ;buffered kbd input
  467.     MOV    DX,OFFSET RecNumBuf    ;points to input buffer (max length 1st)
  468.     INT    21h
  469.     MOV    SI,offset RecNumInput
  470.     XOR    BX,BX
  471.     MOV    CL,4
  472. RecKeyLoop:
  473.     LODSB
  474.     CMP    AL,cr
  475.     JZ    RecNoEntered
  476.     MOV    AH,AL
  477.     CALL    ChkHexKey
  478.     JC    InvalidRec
  479.     SHL    BX,CL
  480.     OR    BL,AL
  481.     JMP    SHORT RecKeyLoop
  482.  
  483. RecNoEntered:
  484.     CMP    COMflag,0
  485.     JNZ    OldWay
  486.     INC    BX
  487. OldWay:    CMP    BX,WORD PTR DS:LastRecLo
  488.     JA    UseLast
  489.     OR    BX,BX
  490.     JNZ    RecNoOK
  491.     MOV    BX,1            ;if 0 was entered
  492.     JMP    RecNoOK
  493.  
  494. UseLast:
  495.     MOV    BX,WORD PTR DS:LastRecLo
  496. RecNoOK:
  497.     MOV    WORD PTR DS:CurrRecLo,BX
  498.     CALL    MoveAndRead
  499.     RET
  500.  
  501. InvalidRec:
  502.     CALL    PaintScreen
  503.     CALL    ShoCursors
  504.     MOV    SI,OFFSET InvalidStr
  505.     CALL    ShoOnMsgLine
  506.     RET
  507.  
  508. ; - - - - - - - - - - - - - - - - - -
  509. ;exit pgm here
  510. ESCpgm:
  511.     CMP    UnsavedFlag,0
  512.     JZ    H01DCE
  513.     CALL    AskSave
  514. H01DCE:
  515.     STC
  516.     RET
  517.  
  518. ; - - - - - - - - - - - - - - - - - -
  519. MoveAndRead:
  520. ;move pointer necessary because Search may have moved the file pointer
  521.     MOV    AH,42h            ;Move file pointer
  522.     MOV    BX,Handle
  523.     MOV    DX,WORD PTR DS:CurrRecLo
  524.     DEC    DX
  525.     XOR    AL,AL            ;move to CX:DX
  526.     XOR    CX,CX
  527.     MOV    CL,DH
  528.     MOV    DH,DL
  529.     XOR    DL,DL            ;now CX:DX = DX * 256
  530.     INT    21h
  531. ;read a record
  532.     MOV    AH,3Fh            ;Read From File
  533.     MOV    CX,100h
  534.     MOV    DX,OFFSET ReadBuf
  535.     MOV    BX,Handle
  536.     INT    21h
  537.     OR    AX,AX            ;Attempt to read at EOF ?
  538.     JNZ    NotEOF
  539.     DEC    WORD PTR DS:CurrRecLo
  540.     JMP    SHORT MoveAndRead
  541.  
  542. NotEOF:    MOV    BytesRead,AX
  543.     OR    AL,AL            ;even record read ?
  544.     JZ    RecFilled
  545.     MOV    DI,AX
  546.     ADD    DI,offset ReadBuf
  547.     NEG    AX
  548.     ADD    AX,100h
  549.     MOV    CX,AX
  550.     MOV    AL,' '        ;spaces for ASCII field, PaintHexAndASCII
  551.     REP    STOSB        ; puts blanks in Hex field
  552. RecFilled:
  553.     CALL    ShowCurrRec
  554.     CALL    PaintHexAndASCII
  555.     CALL    PaintScreen
  556.     CALL    ShoCursors
  557.     MOV    AX,WORD PTR DS:CurrRecLo
  558.     CLC
  559.     RET
  560.  
  561. ; - - - - - - - - - - - - - - - - - -
  562. ;toggle displaying of graphic characters
  563. F6:    DEC    GraphChars
  564.     NEG    GraphChars
  565.     CALL    PaintHexAndASCII
  566.     CALL    PaintScreen
  567.     CALL    ShoCursors
  568.     RET
  569.  
  570. ; - - - - - - - - - - - - - - - - - -
  571. ChkSearchStr:
  572. ;copy the string to HexString
  573.     MOV    CX,WORD PTR BytesInput
  574.     MOV    DI,offset HexString
  575.     CMP    SearchMode,2        ;Hex mode ?
  576.     JNZ    NoShove
  577.     MOV    BYTE PTR [DI],' '    ;initial space so can use same routine
  578.     INC    DI
  579. NoShove:
  580.     MOV    SI,offset InputString
  581.     REP    MOVSB
  582. ;set up for checking
  583.     MOV    DI,offset HexString
  584.     MOV    CX,WORD PTR BytesInput
  585.     CMP    SearchMode,2        ;Hex mode ?
  586.     JNZ    Abcd
  587.     INC    CX
  588. Abcd:    MOV    BytesToSearch,CL
  589.  
  590. ChkSrchLoop:
  591.     MOV    AL,HexPfx        ;do nothing unless hex pfx found
  592.     CMP    SearchMode,2        ;Hex mode ?
  593.     JNZ    HexStart
  594. ;in Hex mode, char before a hex pair must be space
  595.     MOV    AL,' '
  596. HexStart:
  597.     REPNZ    SCASB
  598.     JNZ    RETwithNoC
  599. ;a Hex Prefix character or space has been found
  600. HereIsHex:
  601.     MOV    AH,BYTE PTR [DI]
  602.     CALL    ChkHexKey
  603.     JC    RETwithC        ;if invalid entry
  604.     MOV    BH,CL            ;save HexString count
  605.     MOV    CL,4
  606.     SHL    AL,CL
  607.     MOV    CL,BH            ;restore HexString count
  608.     MOV    BL,AL
  609.     MOV    AH,BYTE PTR 1[DI]    ;2nd byte of hex no.
  610.     CALL    ChkHexKey
  611.     JC    RETwithC        ;if invalid entry
  612.     OR    AL,BL
  613.     MOV    BYTE PTR -1[DI],AL    ;store binary byte where pfx/space was
  614.     SUB    BytesToSearch,2
  615.     JS    RETwithC        ;if at end of string
  616.     MOV    SI,DI
  617.     ADD    SI,2
  618.     PUSH    DI
  619.     REP    MOVSB            ;squeeze the string
  620.     POP    DI
  621.     MOV    CL,BH
  622.     SUB    CL,2
  623.     JZ    RETwithNoC
  624.     JS    RETwithC
  625.     JMP    SHORT ChkSrchLoop
  626.  
  627. RETwithC:
  628.     STC
  629.     RET
  630.  
  631. RETwithNoC:
  632.     CLC
  633.     RET
  634.  
  635. ; - - - - - - - - - - - - - - - - - -
  636. ;inverse the search mode, show search string. Returns DI > next char on msg line
  637. ShowMode:
  638.     PUSH    SI
  639.     PUSH    CX
  640.     PUSH    ES
  641.     MOV    AX,DS
  642.     MOV    ES,AX
  643.     CALL    ClearFNameAtt
  644.     MOV    DI,offset FileNameLoc
  645.     ADD    DI,33            ;point 1st attrib byte
  646.     MOV    AX,22
  647.     MUL    SearchMode
  648.     ADD    DI,AX
  649.     MOV    AL,78h
  650.     MOV    CX,11
  651. SMInvLoop:
  652.     STOSB
  653.     INC    DI
  654.     LOOP    SMInvLoop
  655.  
  656.     CALL    PaintScreen
  657.     CALL    ShoCursors
  658.     MOV    SI,OFFSET SrchForStr
  659.     CALL    ShoOnMsgLine
  660.     POP    ES
  661.     POP    CX
  662.     POP    SI
  663.     RET
  664.  
  665. ClearFNameAtt:
  666.     MOV    DI,offset FileNameLoc
  667.     INC    DI
  668.     MOV    AL,7
  669.     JMP    Paint62
  670.     
  671. ; - - - - - - - - - - - - - - - - - -
  672. F2:    CALL    PaintScreen
  673.     CALL    ShoCursors
  674.     CMP    UnsavedFlag,0
  675.     JZ    EnterSearchStr 
  676.     CALL    AskSave 
  677. EnterSearchStr: 
  678. ;show "Case-Insens  Exact   Hex  " at 20th line
  679.     MOV    DI,offset FileNameLoc
  680.     MOV    SI,offset SModeStr
  681.     MOV    CX,49
  682. SModeLoop:
  683.     MOVSB
  684.     INC    DI
  685.     LOOP    SModeLoop
  686.  
  687.     MOV    AL,' '
  688.     MOV    AH,7
  689.     MOV    CX,13
  690.     REP    STOSW
  691.     CALL    ShowMode    ;puts DI just past the 'Search String: xxxxx'
  692.     PUSH    ES
  693.     MOV    ES,VideoSeg
  694. SrchKeyLoop:
  695.     XOR    AH,AH        ;wait for a keystroke
  696.     INT    16h
  697.     OR    AL,AL        ;function or control key ?
  698.     JNZ    NoSpecial
  699.     CMP    AH,3Ch        ;F2 hit ?
  700.     JZ    SchEsc
  701.     CMP    AH,4Dh        ;right arrow ?
  702.     JNZ    NotR
  703.     CMP    SearchMode,2
  704.     JZ    SrchKeyLoop
  705.     INC    SearchMode
  706.     CALL    ShowMode
  707.     JMP    SrchKeyLoop
  708.  
  709. NotR:    CMP    AH,4Bh        ;left arrow ?
  710.     JNZ    SrchKeyLoop
  711.     CMP    SearchMode,0
  712.     JZ    SrchKeyLoop    
  713.     DEC    SearchMode
  714.     CALL    ShowMode
  715.     JMP    SrchKeyLoop
  716.  
  717. NoSpecial:
  718.     CMP    AL,1Bh        ;ESC hit ?
  719.     JNZ    NoEsc
  720. SchEsc:    POP    ES
  721.     JMP    Scape
  722.  
  723. NoEsc:    CMP    AL,cr
  724.     JZ    EndStr
  725.     CMP    AL,8        ;backspace ?
  726.     JNZ    NoBS
  727.     CMP    BytesInput,0
  728.     JZ    SrchKeyLoop
  729.     DEC    BytesInput
  730.     DEC    DI
  731.     DEC    DI
  732.     MOV    BYTE PTR ES:[DI],' '
  733.     MOV    SI,offset InputString
  734.     ADD    SI,WORD PTR DS:BytesInput
  735.     MOV    BYTE PTR [SI],0
  736.     JMP    SrchKeyLoop
  737.  
  738. NoBS:    CMP    BytesInput,39
  739.     JBE    StoIt
  740.     MOV    DL,7        ;beep
  741.     MOV    AH,2        ;display character
  742.     INT    21h
  743.     JMP    SrchKeyLoop
  744.  
  745. StoIt:    STOSB
  746.     INC    DI
  747.     MOV    SI,offset InputString
  748.     ADD    SI,WORD PTR DS:BytesInput
  749.     MOV    BYTE PTR [SI],AL
  750.     INC    BytesInput
  751.     JMP    SrchKeyLoop
  752.  
  753. ;ENTER has been hit
  754. EndStr:    INC    SI
  755.     MOV    BYTE PTR [SI],0
  756.     POP    ES
  757.     CALL    ChkSearchStr
  758.     JNC    DoSearch 
  759.     MOV    SI,OFFSET InvalidStr
  760.     JMP    PaintNend
  761.  
  762. DoSearch:                ; ~20FC in code
  763.     CMP    BytesInput,0
  764.     JNZ    StrOK
  765.     MOV    SI,offset NoEnteredStr
  766.     JMP    PaintNend
  767.  
  768. StrOK:    MOV    SI,OFFSET SrchForStr
  769.     CALL    ShoOnMsgLine
  770.     CALL    MoveAndRead            ;******
  771.     CALL    ReadRec2
  772.     CMP    WORD PTR DS:ByteNo,0FFh
  773.     JAE    NotThisRec        ;search starts 1st of next record
  774.     ADD    DI,WORD PTR DS:ByteNo
  775.     INC    DI            ;start 1 past cursor
  776.     SUB    CX,WORD PTR DS:ByteNo
  777.     DEC    CX            ;bytes left past cursor
  778. ScanNewRec:
  779.     MOV    BX,WORD PTR DS:LastRecLo
  780.     CMP    BX,WORD PTR DS:CurrRecLo
  781.     JNZ    KeepScanning
  782. ;This is the last record. Set CX = remaining bytes & stop if at EOF
  783.     ADD    CX,WORD PTR DS:LastByte
  784.     SUB    CX,0FFh            ;if Last=0, still must check 1 byte.
  785.     JBE    NotThisRec
  786. KeepScanning:
  787.     MOV    AL,HexString        ;get 1st byte
  788.     CMP    SearchMode,0        ;Case-Insensitive ?
  789.     JNZ    Quick
  790. ;look for a match on the 1st byte of the search string
  791. ;.....for Case-Insens only .........
  792.     CALL    UpCaseLetter
  793.     MOV    AH,AL
  794. SlowLoop:
  795.     MOV    AL,[DI]
  796.     INC    DI
  797.     CALL    UpCaseLetter
  798.     CMP    AL,AH
  799.     JZ    Found1st
  800.     LOOP    SlowLoop
  801.     JMP    NotThisRec
  802. ;....................................
  803. Quick:    REPNZ    SCASB            ;cmp AL - ES:[DI] and inc DI
  804.     ;will inc DI again after 1st non-match, ends w/DI->1 past match
  805.     JZ    Found1st        ;w/CX=bytes left past find
  806. NotThisRec:
  807.     INC    WORD PTR DS:CurrRecLo
  808.     MOV    BX,WORD PTR DS:LastRecLo
  809.     CMP    BX,WORD PTR DS:CurrRecLo
  810.     JC    SearchFailed
  811.     MOV    AH,1            ;report kbd char if available
  812.     INT    16h
  813.     JNZ    Cancel            ;if char, stop search
  814. ;move Buf2 up into ReadBuf
  815.     MOV    SI,offset Buf2
  816.     MOV    DI,offset ReadBuf
  817.     MOV    CX,100h
  818.     REP    MOVSB
  819.     CALL    ReadRec2    ;next 256 bytes -> Buf2, CX=100h, DI>ReadBuf
  820.     JMP    ScanNewRec
  821.  
  822. ;a match has been found on the 1st byte of the search string.
  823. Found1st:                ;scan whole string, may run into Buf2
  824. ;first, see if file ends before string length
  825.     MOV    AX,CX            ;remaining bytes past find in ReadBuf
  826.     INC    AX            ;we'll check the found byte, too
  827.     MOV    BX,WORD PTR DS:LastRecLo
  828.     SUB    BX,WORD PTR DS:CurrRecLo
  829.     CMP    BX,1
  830.     JB    InLast
  831.     JNZ    EnuffLeft
  832. ;we're in next-to-last record
  833.     ADD    AX,WORD PTR DS:LastByte
  834.     INC    AX            ;'cause if LastByte is 0, still adds 1
  835. InLast:    CMP    AX, WORD PTR DS:BytesToSearch
  836.     JB    SearchFailed
  837. EnuffLeft:
  838.     PUSH    DI            ;points 1 past find
  839.     PUSH    CX            ;remaining bytes past find in ReadBuf
  840.     DEC    DI            ;to found byte
  841.     MOV    CX,WORD PTR DS:BytesToSearch
  842.     MOV    SI,OFFSET HexString
  843.     CMP    SearchMode,0        ;Case-Insensitive ?
  844.     JNZ    QuickWhole
  845. ;.....for Case-Insens only .........
  846. SlowWholeLoop:
  847.     LODSB                ;get byte [SI] & INC SI
  848.     CALL    UpCaseLetter
  849.     MOV    AH,AL
  850.     MOV    AL,[DI]
  851.     INC    DI
  852.     CALL    UpCaseLetter
  853.     CMP    AL,AH
  854.     JNZ    ScanDone
  855.     LOOP    SlowWholeLoop
  856.     JMP    SHORT ScanDone
  857. ;....................................
  858. QuickWhole:
  859.     REPZ    CMPSB            ;cmp DS:SI - ES:DI and inc SI & DI
  860. ScanDone:
  861.     POP    CX            ;remaining bytes past 1st find in Buf
  862.     POP    DI            ;points 1 past 1st find
  863.     JZ    ShowTheFind        ;every byte matched
  864.     JMP    KeepScanning
  865.  
  866. SearchFailed:
  867.     MOV    AL,LastByte
  868.     MOV    ByteNo,AL
  869.     MOV    SI,OFFSET SrchFailedStr
  870.     JMP    PaintNend
  871.  
  872. ;search cancelled by a keystroke
  873. Cancel:    MOV    AH,0            ;Wait for char, removes from kbd buf
  874.     INT    16h            ; (does not wait)
  875. Scape:    MOV    SI,OFFSET SrchAbortStr
  876.     JMP    PaintNend
  877.  
  878. ShowTheFind:
  879.     CMP    DI,offset Buf2        ;have we scanned past end of ReadBuf ?
  880.     JB    NoRollOver    
  881.     INC    WORD PTR DS:CurrRecLo    ;if so, we're in the next record
  882. NoRollOver:
  883.     SUB    DI,offset ReadBuf
  884.     DEC    DI
  885.     MOV    WORD PTR DS:ByteNo,DI
  886.     MOV    SI,OFFSET SrchFoundStr
  887. PaintNend:
  888.     PUSH    SI
  889.     CALL    MoveAndRead
  890.     CALL    ClearFNameAtt
  891.     CALL    ShowFNameAndDate
  892.     CALL    PaintScreen
  893.     CALL    ShoCursors
  894.     POP    SI
  895.     CALL    ShoOnMsgLine
  896.     CLC
  897.     RET
  898.  
  899. ReadRec2:
  900.     MOV    AH,3Fh            ;Read From File
  901.     MOV    CX,100h            ;bytes to read
  902.     MOV    DX,OFFSET Buf2
  903.     MOV    BX,Handle
  904.     INT    21h
  905.     MOV    CX,100h
  906.     MOV    DI,offset ReadBuf
  907.     RET
  908.  
  909. ; - - - - - - - - - - - - - - - - - -
  910. AskSave:
  911.     MOV    SI,OFFSET UnsavedStr
  912.     CALL    ShoOnMsgLine
  913.     MOV    AH,0            ;Wait for Kbd char
  914.     INT    16h
  915.     CMP    AH,43h            ;scan code = F9 ?
  916.     JNZ    NoSave
  917.     CALL    F9
  918. NoSave:
  919.     MOV    UnsavedFlag,0
  920.     CALL    PaintScreen
  921.     CALL    ShoCursors
  922.     RET
  923.  
  924. ; - - - - - - - - - - - - - - - - - -
  925. PgDn:    CMP    UnsavedFlag,0
  926.     JZ    H02022
  927.     CALL    AskSave
  928. H02022:    ADD    WORD PTR DS:CurrRecLo,1        ;INC doesn't affect Carry !
  929.     JNC    H0202D
  930.     DEC    WORD PTR DS:CurrRecLo
  931. H0202D:    CALL    MoveAndRead
  932.     CLC
  933.     RET
  934.  
  935. PgUp:    CMP    UnsavedFlag,0
  936.     JZ    H0203C
  937.     CALL    AskSave
  938. H0203C:    DEC    WORD PTR DS:CurrRecLo
  939.     JNZ    H02046
  940.     INC    WORD PTR DS:CurrRecLo
  941. H02046:    CALL    MoveAndRead
  942.     CLC
  943.     RET
  944.  
  945. CtrlPgDn:
  946.     CMP    UnsavedFlag,0
  947.     JZ    H02055
  948.     CALL    AskSave
  949. H02055:    MOV    AX,WORD PTR DS:LastRecLo
  950.     MOV    WORD PTR DS:CurrRecLo,AX
  951.     CALL    MoveAndRead
  952.     CLC
  953.     RET
  954.  
  955. CtrlPgUp:
  956.     CMP    UnsavedFlag,0
  957.     JZ    H02069
  958.     CALL    AskSave
  959. H02069:    MOV    WORD PTR DS:CurrRecLo,1
  960.     MOV    ByteNo,0        ;cursor to upper left
  961.     CALL    MoveAndRead
  962.     CLC
  963.     RET
  964.  
  965. RightLeftBksp:
  966.     MOV    CL,ByteNo
  967.     CMP    AL,4Dh            ;right arrow ?
  968.     JNZ    LeftArrow        ;backspace treated like left arrow
  969. ;right arrow:
  970.     INC    CL
  971.     JNZ    GoRtLeft
  972. ;trap prevents annoying wraparound if file ends on last byte of last line
  973.     MOV    AX,WORD PTR LastRecLo
  974.     CMP    AX,WORD PTR CurrRecLo
  975.     JNZ    GoNxPg
  976. ;we're in the last record and ByteNo would wrap around to 0
  977.     CLC
  978.     RET
  979.  
  980. GoNxPg:    MOV    ByteNo,0
  981.     JMP    PgDn            ;calls ShoCursors, traps past EOF
  982.  
  983. LeftArrow:
  984.     SUB    CL,1
  985.     JNC    GoRtLeft        ;DEC does NOT AFFECT the C flag !
  986.     CMP    WORD PTR DS:CurrRecLo,1
  987.     JNZ    PrevRec
  988.     CLC
  989.     RET    
  990.  
  991. PrevRec:
  992.     MOV    ByteNo,0FFh
  993.     JMP    PgUp
  994.  
  995. GoRtLeft:
  996.     MOV    ByteNo,CL
  997.     CALL    ShoCursors
  998.     CLC
  999.     RET
  1000.  
  1001. UpDnArrow:
  1002.     CMP    AL,48h            ;up arrow ?
  1003.     JNZ    DownArrow
  1004.     SUB    ByteNo,10h
  1005.     JNC    H02121
  1006. ;we have moved up into the previous record
  1007.     CMP    WORD PTR DS:CurrRecLo,1
  1008.     JNZ    UpRec
  1009.     ADD    ByteNo,10h
  1010.     CLC
  1011.     RET
  1012.  
  1013. UpRec:    OR    ByteNo,11110000b
  1014.     JMP    PgUp
  1015.  
  1016. DownArrow:
  1017. ;trap prevents annoying jump to last byte from line above byte past end
  1018. ; and wraparound if file ends on last line
  1019.     MOV    AX,WORD PTR LastRecLo
  1020.     CMP    AX,WORD PTR CurrRecLo
  1021.     JNZ    GoDown
  1022. ;we're in the last record
  1023.     MOV    CL,ByteNo
  1024.     CMP    CL,0F0h            ;in the last line ?
  1025.     JAE    Nope
  1026.     ADD    CL,10h
  1027.     CMP    CL,LastByte
  1028.     JBE    GoDown
  1029. Nope:    CLC
  1030.     RET
  1031.  
  1032. GoDown:    ADD    ByteNo,10h
  1033.     JNC    H02121
  1034. ;we have moved down into the next record
  1035.     AND    ByteNo,00001111b
  1036.     JMP    PgDn
  1037.  
  1038. H02121:    CALL    ShoCursors
  1039.     CLC
  1040.     RET
  1041.  
  1042. EndKey:    OR    ByteNo,00001111b
  1043.     JMP    SHORT H02121
  1044.  
  1045. HomeKey:
  1046.     AND    ByteNo,11110000b
  1047.     JMP    SHORT H02121
  1048.  
  1049. CtrlHome:
  1050.     MOV    ByteNo,0
  1051.     JMP    SHORT H02121
  1052.  
  1053. CtrlEnd:
  1054.     MOV    ByteNo,0FFh
  1055.     JMP    SHORT H02121
  1056.  
  1057. ; - - - - - - - - - - - - - - - - - -
  1058. F9:    MOV    SI,OFFSET RecSavStr
  1059.     CALL    ShoOnMsgLine
  1060.     MOV    AH,42h            ;Move File Pointer
  1061.     MOV    DX,WORD PTR DS:CurrRecLo
  1062.     DEC    DX
  1063.     MOV    AL,0            ;move to CX:DX
  1064.     XOR    CX,CX
  1065.     MOV    CL,DH
  1066.     MOV    DH,DL
  1067.     XOR    DL,DL
  1068.     MOV    BX,Handle
  1069.     INT    21h
  1070.     MOV    AH,40h            ;Write to file
  1071.     MOV    CX,BytesRead        ;Bytes to write
  1072.     MOV    DX,OFFSET ReadBuf
  1073.     MOV    BX,Handle
  1074.     INT    21h
  1075.     MOV    UnsavedFlag,0
  1076.     CLC
  1077.     RET
  1078.  
  1079. PaintHexAndASCII:
  1080.     XOR    DH,DH            ;byte counter
  1081.     MOV    DL,LastByte        ;for faster compare
  1082.     MOV    SI,OFFSET ReadBuf
  1083.     MOV    HexPointer,014Ah    ;165th char, 6th on 3rd line
  1084.     MOV    ASCIIpntr,01BCh
  1085. EachLine:
  1086.     MOV    CX,16            ;do 16d times
  1087. EachByte:
  1088.     LODSB
  1089.     MOV    AH,HexDisplAttr
  1090.     PUSH    SI
  1091.     MOV    BX,WORD PTR DS:LastRecLo
  1092.     CMP    BX,WORD PTR DS:CurrRecLo
  1093.     JNZ    NotPast
  1094. ;if past LastByte, print blanks in Hex field
  1095.     CMP    DH,DL
  1096.     JBE    NotPast
  1097.     PUSH    AX
  1098.     MOV    AL,0
  1099.     CALL    PrintHex
  1100.     CALL    PrintHex
  1101.     ADD    HexPointer,2
  1102.     POP    AX
  1103.     JMP    DoASC
  1104. NotPast:
  1105.     CALL    Print2atHexP
  1106. DoASC:    MOV    AH,ASCIIdisplAttr
  1107.     CALL    Print1atAsciiP        ;already spaces if past end
  1108.     POP    SI
  1109.     INC    DH            ;bump byte counter
  1110.     LOOP    EachByte
  1111.  
  1112.     ADD    HexPointer,40h
  1113.     ADD    ASCIIpntr,80h
  1114.     OR    DH,DH            ;rolls over after last byte
  1115.     JNZ    EachLine
  1116.     RET
  1117.  
  1118. ; - - - - - - - - - - - - - - - - - -
  1119. TabScreen:
  1120.     DEC    ActiveScrn        ;0->FF        1->0
  1121.     NEG    ActiveScrn        ;FF=-1,->1    -0=0
  1122.     MOV    BH,'│'
  1123.     MOV    BL,'█'
  1124.     MOV    DH,'─'
  1125.     MOV    DL,'▀'
  1126.     CMP    ActiveScrn,0
  1127.     JNZ    HexLines
  1128.     XCHG    BH,BL    
  1129.     XCHG    DH,DL
  1130. HexLines:
  1131.     MOV    DI,326+offset ScreenStart    ;decimal
  1132.     MOV    CX,16
  1133. VertLoop:
  1134.     MOV    AL,BH
  1135.     STOSB
  1136.     ADD    DI,113
  1137.     MOV    AL,BL
  1138.     STOSB
  1139.     ADD    DI,37
  1140.     STOSB
  1141.     ADD    DI,7
  1142.     LOOP    VertLoop
  1143.  
  1144.     MOV    DI,166+offset ScreenStart
  1145.     MOV    AL,'█'
  1146.     CMP    ActiveScrn,0
  1147.     JZ    HexCorner
  1148.     MOV    AL,'┌'
  1149. HexCorner:
  1150.     STOSB
  1151.     MOV    AL,DH
  1152.     MOV    CX,48
  1153. HorLoop:
  1154.     INC    DI
  1155.     STOSB
  1156.     LOOP    HorLoop
  1157.  
  1158.     CALL    PaintScreen
  1159.     CALL    ShoCursors
  1160.     CLC
  1161.     RET
  1162.  
  1163. ; - - - - - - - - - - - - - - - - - -
  1164. Print2atHexP:
  1165.     PUSH    CX
  1166.     PUSH    AX
  1167.     MOV    CL,4
  1168.     MOV    CH,AL
  1169.     ROR    AL,CL
  1170.     AND    AL,00001111b
  1171.     ADD    AL,30h
  1172.     CMP    AL,'9'            ;39h
  1173.     JNA    H02172
  1174.     ADD    AL,7
  1175. H02172:
  1176.     CALL    PrintHex
  1177.     MOV    AL,CH
  1178.     AND    AL,00001111b
  1179.     ADD    AL,30h
  1180.     CMP    AL,'9'            ;39h
  1181.     JNA    H02181
  1182.     ADD    AL,7
  1183. H02181:    CALL    PrintHex
  1184.     ADD    HexPointer,2
  1185.     POP    AX
  1186.     POP    CX
  1187.     RET
  1188.  
  1189. PrintHex:
  1190.     MOV    SI,HexPointer
  1191.     MOV    WORD PTR [SI+offset ScreenStart],AX
  1192.     INC    SI
  1193.     INC    SI
  1194.     MOV    HexPointer,SI
  1195.     RET
  1196.  
  1197. ; - - - - - - - - - - - - - - - - - -
  1198. ALtoHexInAX:
  1199.     MOV    AH,AL            ;save AL
  1200.     AND    AL,00001111b        ;get lower nibble
  1201.     OR    AL,00110000b        ;30h
  1202.     CMP    AL,'9'            ;39h
  1203.     JNA    H02198
  1204.     ADD    AL,7
  1205. H02198:    MOV    CL,4
  1206.     SHR    AH,CL            ;get upper nibble in AH
  1207.     OR    AH,00110000b
  1208.     CMP    AH,'9'            ;39h
  1209.     JA    H021A5
  1210.     RET
  1211.  
  1212. H021A5:    ADD    AH,7
  1213.     RET
  1214.  
  1215. ; - - - - - - - - - - - - - - - - - -
  1216. Print1atAsciiP:
  1217.     CMP    GraphChars,0
  1218.     JNZ    ShowIt
  1219.     CMP    AL,' '            ;20h
  1220.     JC    H021CA
  1221.     CMP    AL,7Eh
  1222.     JA    H021CA
  1223.     JMP    ShowIt
  1224.  
  1225. H021CA:    MOV    AL,'.'            ;2Eh
  1226. ShowIt:    MOV    SI,ASCIIpntr
  1227.     MOV    WORD PTR [SI+offset ScreenStart],AX
  1228.     INC    SI
  1229.     INC    SI
  1230.     MOV    ASCIIpntr,SI
  1231.     RET
  1232.  
  1233. ; - - - - - - - - - - - - - - - - - -
  1234. ShoCursors:
  1235.     PUSH    DX
  1236.     PUSH    CX
  1237.     PUSH    BX
  1238.     PUSH    AX
  1239. ;in last record, if past end of file, put cursor at last byte
  1240.     MOV    AX,WORD PTR LastRecLo
  1241.     CMP    AX,WORD PTR CurrRecLo
  1242.     MOV    AL,ByteNo
  1243.     JNZ    NotTheLast
  1244. ;we're in the last record
  1245.     CMP    AL,LastByte
  1246.     JB    NotTheLast
  1247.     MOV    AL,LastByte
  1248.     MOV    ByteNo,AL
  1249. NotTheLast:
  1250.     MOV    DI,1550            ;56th on 10th line
  1251.     PUSH    AX
  1252.     PUSH    ES
  1253.     MOV    ES,VideoSeg
  1254.     CALL    ALtoHexInAX
  1255.     XCHG    AL,AH
  1256.     STOSB
  1257.     INC    DI
  1258.     MOV    AL,AH
  1259.     STOSB
  1260.     POP    ES
  1261.     POP    AX
  1262.     XOR    AH,AH
  1263.     MOV    BL,10h
  1264.     DIV    BL            ;AL = ByteNo/16d
  1265.     XCHG    AL,AH
  1266.     ADD    AH,2            ;AX = (ByteNo * 16d) + 512d
  1267.     MOV    DX,AX
  1268.     ADD    DL,3Eh
  1269.     MOV    BL,3
  1270.     MUL    BL
  1271.     MOV    AH,DH
  1272.     ADD    AL,5
  1273.     MOV    CH,ActCrsrAttr
  1274.     MOV    CL,PassCrsrAttr
  1275.     CMP    ActiveScrn,0
  1276.     JZ    ASCIIisActive
  1277.     XCHG    CH,CL
  1278. ASCIIisActive:
  1279.     PUSH    ES
  1280.     MOV    ES,VideoSeg
  1281.     MOV    BX,HexCrsrLocn
  1282.     MOV    SI,BX
  1283.     MOV    BL,BYTE PTR [SI+offset ScreenStart+1]
  1284.     MOV    BYTE PTR ES:1[SI],BL
  1285.     MOV    BYTE PTR ES:3[SI],BL
  1286.     MOV    BX,H0040C
  1287.     MOV    SI,BX
  1288.     MOV    BL,BYTE PTR [SI+offset ScreenStart+1]
  1289.     MOV    BYTE PTR ES:1[SI],BL
  1290.     MOV    BX,AX
  1291.     MOV    AL,AH
  1292.     MOV    AH,50h
  1293.     MUL    AH
  1294.     XOR    BH,BH
  1295.     ADD    AX,BX
  1296.     SHL    AX,1
  1297.     MOV    HexCrsrLocn,AX
  1298.     MOV    SI,AX
  1299.     MOV    BYTE PTR ES:1[SI],CH
  1300.     MOV    BYTE PTR ES:3[SI],CH
  1301.     MOV    AX,DX
  1302.     MOV    AL,AH
  1303.     MOV    AH,50h
  1304.     MUL    AH
  1305.     XOR    DH,DH
  1306.     ADD    AX,DX
  1307.     SHL    AX,1
  1308.     MOV    H0040C,AX
  1309.     MOV    SI,AX
  1310.     MOV    BYTE PTR ES:1[SI],CL
  1311.     POP    ES
  1312.     POP    AX
  1313.     POP    BX
  1314.     POP    CX
  1315.     POP    DX
  1316.     RET
  1317.  
  1318. ; - - - - - - - - - - - - - - - - - -
  1319. ShoOnMsgLine:
  1320.     PUSH    ES
  1321.     MOV    ES,WORD PTR DS:VideoSeg
  1322.     MOV    DI,3360
  1323.     MOV    AL,' '
  1324.     CALL    Paint62
  1325. ShoLoop:
  1326.     LODSB
  1327.     OR    AL,AL
  1328.     JZ    ShoDone
  1329.     STOSB
  1330.     INC    DI
  1331.     JMP    SHORT ShoLoop
  1332. ShoDone:
  1333.     POP    ES
  1334.     RET
  1335.  
  1336. Paint62:
  1337.     PUSH    DI
  1338.     PUSH    CX
  1339.     MOV    CX,62
  1340. P62Loop:
  1341.     STOSB
  1342.     INC    DI
  1343.     LOOP    P62Loop
  1344.     POP    CX
  1345.     POP    DI
  1346.     RET
  1347.  
  1348. ; - - - - - - - - - - - - - - - - - -
  1349. UpCaseAndCifNotASCII:
  1350.     CMP    AL,'a'        ;61h
  1351.     JB    H02272
  1352.     SUB    AL,20h
  1353. H02272:    CMP    AL,' '        ;20h
  1354.     JB    NotASCII
  1355.     CMP    AL,'Z'
  1356.     JA    NotASCII
  1357.     CLC
  1358.     RET
  1359.  
  1360. NotASCII:
  1361.     STC
  1362.     RET
  1363.  
  1364. ; - - - - - - - - - - - - - - - - - -
  1365. UpCaseLetter:
  1366.     CMP    AL,'a'
  1367.     JB    NoChg
  1368.     CMP    AL,'z'
  1369.     JA    NoChg
  1370.     SUB    AL,20h
  1371. NoChg:    RET
  1372.  
  1373. ; - - - - - - - - - - - - - - - - - -
  1374. PaintScreen:
  1375.     PUSH    ES
  1376.     PUSH    CX
  1377.     MOV    ES,WORD PTR DS:VideoSeg
  1378.     XOR    DI,DI
  1379.     MOV    SI,OFFSET ScreenStart
  1380.     MOV    CX,2000            ;Decimal
  1381.     REP    MOVSW
  1382.     POP    CX
  1383.     POP    ES
  1384.     RET
  1385.  
  1386. SetCrsrType:
  1387.     MOV    AH,3            ;Read Cursor Position
  1388.     INT    10h
  1389.     MOV    CrsrType,CX
  1390.     MOV    CL,2Fh            ;Ending Scan Line
  1391.     MOV    CH,CL            ;Starting Scan Line
  1392.     MOV    AH,1            ;Set Cursor Type
  1393.     INT    10h
  1394.     MOV    AH,5            ;Select Display Page
  1395.     MOV    AL,0
  1396.     INT    10h
  1397.     RET
  1398.  
  1399. RestoreCrsr:
  1400.     MOV    AH,5            ;Select Display Page
  1401.     MOV    AL,0            ;page no.
  1402.     INT    10h
  1403.     MOV    AH,1            ;Set Cursor Type
  1404.     MOV    CX,CrsrType
  1405.     INT    10h
  1406.     XOR    AL,AL            ;Is this a delay ?
  1407.     CMP    AL,0
  1408.     JNZ    H022E4
  1409.     MOV    AH,2            ;Set Cursor Position
  1410.     MOV    DX,1800h        ;row 24, col 0
  1411.     XOR    BH,BH            ;page 0
  1412.     INT    10h
  1413. H022E4:    RET
  1414.  
  1415. ShowCurrRec: 
  1416.     MOV    DI,offset CurRec
  1417.     MOV    AX,WORD PTR DS:CurrRecLo
  1418. ShowRecNo:    
  1419.     CMP    COMflag,0
  1420.     JNZ    One1st
  1421.     DEC    AX
  1422. One1st:
  1423.     PUSH    AX
  1424.     CALL    ALtoHexInAX
  1425.     MOV    BYTE PTR 4[DI],AH
  1426.     MOV    BYTE PTR 6[DI],AL
  1427.     POP    AX
  1428.     MOV    AL,AH
  1429.     CALL    ALtoHexInAX
  1430.     MOV    BYTE PTR [DI],AH
  1431.     MOV    BYTE PTR 2[DI],AL
  1432.     CLC
  1433.     RET
  1434.  
  1435. ; - - - - - - - - - - - - - - - - - -
  1436. ShowFNameAndDate:
  1437.     MOV    SI,OFFSET FNameToShow
  1438.     MOV    DI,OFFSET FileNameLoc
  1439.     MOV    AL,' '
  1440.     CALL    Paint62
  1441. FNameLoop:
  1442.     MOVSB
  1443.     INC    DI
  1444.     CMP    BYTE PTR DS:[SI],0
  1445.     JNZ    FNameLoop
  1446.  
  1447.     MOV    AH,57h            ;Date & Time of File
  1448.     XOR    AL,AL            ;Get it
  1449.     MOV    BX,Handle
  1450.     PUSH    DI
  1451.     INT    21h
  1452.     POP    DI
  1453.     ADD    DI,4
  1454.     MOV    AX,DX                ;date
  1455.     SHR    AX,1
  1456.     MOV    CL,4
  1457.     SHR    AL,CL
  1458.     CALL    AXtoDecimalAtDI 
  1459.     MOV    BYTE PTR [DI],'/'
  1460.     INC    DI
  1461.     INC    DI
  1462.     MOV    AL,DL
  1463.     AND    AL,00011111b
  1464.     CALL    AXtoDecimalAtDI
  1465.     MOV    BYTE PTR [DI],'/'
  1466.     INC    DI
  1467.     INC    DI
  1468.     MOV    AL,DH
  1469.     SHR    AL,1
  1470.     ADD    AL,50h
  1471.     JMP    AXtoDecimalAtDI
  1472.  
  1473. ; - - - - - - - - - - - - - - - - - -
  1474. ShowLineNos:
  1475. ;set up for the byte numbers:
  1476.     MOV    HexPointer,12        ;6th char on 1st line
  1477.     MOV    BL,'0'            ;the byte number to print
  1478.     MOV    AH,LineNoAttr
  1479. ShoByteNos:
  1480.     MOV    DI,HexPointer
  1481.     MOV    AL,BL
  1482.     CALL    PrintHex
  1483.     ADD    HexPointer,4
  1484.     INC    BL
  1485.     CMP    BL,':'
  1486.     JNZ    NoAdd
  1487.     ADD    BL,7
  1488. NoAdd:    CMP    BL,'F'
  1489.     JNA    ShoByteNos
  1490. ;now set up for line nos
  1491.     MOV    HexPointer,320        ;160th char, 1st on 3rd line
  1492.     XOR    BL,BL            ;the line number to print
  1493.     MOV    AH,LineNoAttr
  1494. ShoLineNos:
  1495.     MOV    DI,HexPointer
  1496.     MOV    AL,BL
  1497.     CALL    Print2atHexP
  1498.     MOV    DI,HexPointer
  1499.     MOV    BYTE PTR [DI+offset ScreenStart],'│'
  1500.     ADD    HexPointer,154        ;move up 77 more chars, to next line
  1501.     ADD    BL,10h
  1502.     JNC    ShoLineNos
  1503.     RET
  1504.  
  1505. AXtoDecimalAtDI:
  1506.     PUSH    DX
  1507.     XOR    AH,AH
  1508.     XOR    DX,DX
  1509.     MOV    BYTE PTR [DI],'0'
  1510.     XOR    CL,CL
  1511.  
  1512. H02457:    DIV    WORD PTR DS:Ten
  1513.     OR    DL,00110000b
  1514.     PUSH    DX
  1515.     XOR    DL,DL
  1516.     INC    CL
  1517.     CMP    AX,0
  1518.     JNZ    H02457
  1519.  
  1520. H02468:    POP    DX
  1521.     MOV    BYTE PTR [DI],DL
  1522.     INC    DI
  1523.     INC    DI
  1524.     DEC    CL
  1525.     JNZ    H02468
  1526.     POP    DX
  1527.     RET
  1528.  
  1529. ; - - - - - - - - - - - - - - - - - -
  1530. ;Copy attrib only for spaces between the hex nos
  1531. CopyHexDisplAttr:
  1532.     MOV    AL,HexDisplAttr
  1533.     MOV    DI,OFFSET HexSpaces
  1534.     MOV    AH,10h            ;16d times thru entire routine
  1535.  
  1536. H0247A:    MOV    CX,0Fh            ;15d times, show every 3rd char
  1537.  
  1538. H0247D:    MOV    BYTE PTR [DI],AL
  1539.     ADD    DI,6
  1540.     LOOP    H0247D
  1541.  
  1542.     ADD    DI,46h            ;move up 36d characters
  1543.     DEC    AH
  1544.     JNZ    H0247A
  1545.     RET
  1546.  
  1547. ; - - - - - - - - - - - - - - - - - -
  1548. SetVideoSeg:
  1549.     PUSH    ES
  1550.     MOV    BX,40h            ;BIOS data seg
  1551.     MOV    ES,BX
  1552.     MOV    BX,10h
  1553.     MOV    AL,BYTE PTR ES:[BX]    ;Hardware byte
  1554.     MOV    BX,0B000h
  1555.     AND    AL,00110000b
  1556.     CMP    AL,30h            ;80 X 25 mono ?
  1557.     JZ    SetIt
  1558.     MOV    BH,0B8h
  1559. SetIt:    MOV    VideoSeg,BX
  1560.     POP    ES
  1561.     RET
  1562.  
  1563. ; - - - - - - - - - - - - - - - - - -
  1564. GetTargetName:
  1565.     XOR    CH,CH
  1566.     MOV    CL,ParamCount
  1567.     CMP    CL,2
  1568.     JC    CmdLineEmpty
  1569.     DEC    CL
  1570.     MOV    SI,OFFSET CmdLineBuf
  1571.     MOV    DI,OFFSET FNameToShow
  1572. FNloop:
  1573.     LODSB
  1574.     CALL    UpCaseAndCifNotASCII
  1575.     STOSB
  1576.     LOOP    FNloop
  1577. ;check .EXT
  1578.     XCHG    DI,SI
  1579.     SUB    SI,4
  1580.     LODSB
  1581.     CMP    AL,'.'
  1582.     JNZ    NotCOM
  1583.     LODSB
  1584.     CMP    AL,'C'
  1585.     JNZ    NotCOM
  1586.     LODSB
  1587.     CMP    AL,'O'
  1588.     JNZ    NotCOM
  1589.     LODSB
  1590.     CMP    AL,'M'
  1591.     JNZ    NotCOM
  1592.     MOV    COMflag,1
  1593. NotCOM:    CLC
  1594.     RET
  1595.  
  1596. CmdLineEmpty:
  1597.     MOV    DX,OFFSET NoNameMsg
  1598.     MOV    AH,9
  1599.     INT    21h
  1600.     STC
  1601.     RET
  1602.  
  1603. ; - - - - - - - - - - - - - - - - - -
  1604. GetFileStats:
  1605.     MOV    AH,42h            ;Move File Pointer
  1606.     MOV    AL,2            ;to EOF + CX:DX
  1607.     MOV    BX,Handle
  1608.     XOR    DX,DX
  1609.     XOR    CX,CX
  1610.     INT    21h
  1611.     JC    SizeErr
  1612. ;Now size of file is in DX:AX
  1613.     SUB    AX,1        ;dec DX:AX so a 100h-byte file will not
  1614.     SBB    DL,0        ; use 2 records
  1615.     MOV    LastByte,AL    ;to stop cursor at end of file
  1616.     MOV    AL,AH
  1617.     MOV    AH,DL
  1618.     INC    AX
  1619.     MOV    WORD PTR DS:LastRecLo,AX
  1620. ;show the Last Record no.
  1621.     MOV    DI,offset LastRecLoc
  1622.     JMP    ShowRecNo
  1623.  
  1624. SizeErr:
  1625.     STC
  1626.     RET
  1627.  
  1628. OpenFile:
  1629.     MOV    WORD PTR DS:ErrCode,0
  1630.     MOV    DX,OFFSET FNameToShow
  1631.     MOV    AL,2
  1632.     MOV    AH,3Dh            ;Open File
  1633.     INT    21h
  1634.     MOV    Handle,AX
  1635.     JNC    OpenOK
  1636.     MOV    WORD PTR DS:ErrCode,AX
  1637.     CMP    AL,2
  1638.     JC    H0258E            ;jmp if 1 or 0
  1639.     CMP    AL,5
  1640.     JA    H0258E
  1641.     DEC    AL
  1642.     DEC    AL
  1643.     XOR    DX,DX
  1644.     MOV    DL,AL
  1645.     MOV    CL,4
  1646.     SHL    DX,CL
  1647.     ADD    DX,OFFSET Err2
  1648.     JMP    SHORT ShoMsg
  1649.  
  1650. H0258E:    AAM
  1651.     XCHG    AL,AH
  1652.     OR    WORD PTR DS:ErrCode,AX
  1653.     MOV    DX,OFFSET OpenErrMsg
  1654. ShoMsg:
  1655.     MOV    AH,9
  1656.     INT    21h
  1657.     MOV    AH,9
  1658.     MOV    DX,OFFSET CrLf$
  1659.     INT    21h
  1660.     STC
  1661.     RET
  1662.  
  1663. OpenOK:    CLC
  1664.     RET
  1665.  
  1666. ; - - - - - - - - - - - - - - - - - -
  1667. ;help routine
  1668. F1:    PUSH    ES
  1669.     MOV    ES,WORD PTR DS:VideoSeg
  1670.     MOV    DI,496            ;248th char , 9th on 4th line
  1671.     MOV    DH,HelpAttr
  1672.     MOV    AH,HelpBrdrAttr
  1673.     MOV    AL,'┌'
  1674.     STOSW
  1675.     MOV    AL,'─'
  1676.     MOV    CX,62
  1677.     REP    STOSW
  1678.     MOV    AL,'┐'
  1679.     STOSW
  1680.     MOV    DI,496+160
  1681.     MOV    DL,' '
  1682.     MOV    AL,'│'
  1683.     MOV    BX,17            ;no of lines inside the box
  1684.  
  1685. H025D0:    STOSW
  1686.     XCHG    AX,DX
  1687.     MOV    CX,62            ;no of spaces inside the box
  1688.     REP    STOSW
  1689.     XCHG    AX,DX
  1690.     STOSW
  1691.     ADD    DI,2*(80-64)
  1692.     DEC    BX
  1693.     JNZ    H025D0
  1694.  
  1695.     MOV    AL,'└'
  1696.     STOSW
  1697.     MOV    SI,offset HelpBottom
  1698.     MOV    CX,62            ;length of string
  1699.     MOV    AL,AH
  1700.  
  1701. H025EA:    MOVSB
  1702.     STOSB
  1703.     LOOP    H025EA
  1704.  
  1705.     MOV    AL,'┘'
  1706.     STOSW
  1707. PaintHelp:                ;displays the Help text
  1708. ;locate start of line
  1709.     PUSH    ES
  1710.     MOV    AX,DS
  1711.     MOV    ES,AX
  1712.     MOV    DI,offset HelpMsg
  1713.     XOR    AL,AL
  1714.     XOR    DL,DL
  1715. LocLoop:
  1716.     CMP    HelpLineCount,DL
  1717.     JZ    Located
  1718.     MOV    CX,62            ;chars displayed/line
  1719.     REPNZ    SCASB            ;either 62 chars or a 0 are found
  1720.     INC    DL
  1721.     JMP    SHORT LocLoop
  1722. Located:
  1723.     POP    ES
  1724.     MOV    SI,DI
  1725.     MOV    DI,496+160+2        ;9th on 5th line
  1726.     MOV    BX,17            ;do 17d lines
  1727. HelpLine:
  1728.     MOV    CX,62            ;do 62d characters
  1729. HelpCharLoop:
  1730.     LODSB
  1731.     OR    AL,AL
  1732.     JZ    PadLine
  1733.     STOSB
  1734.     INC    DI
  1735.     LOOP    HelpCharLoop
  1736. CalcNext:
  1737.     ADD    DI,2*(80-62)
  1738.     DEC    BX
  1739.     JNZ    HelpLine
  1740. ReadHelpKbd:
  1741.     XOR    AH,AH            ;Read Char from Kbd
  1742.     INT    16h
  1743.     CMP    AH,3Bh            ;scan code = F1 ?
  1744.     JZ    ExitHelp
  1745.     CMP    AH,1            ;Esc ?
  1746.     JZ    ExitHelp
  1747.     CMP    AH,4Bh
  1748.     JA    H02642
  1749.     CMP    HelpLineCount,0
  1750.     JZ    ReadHelpKbd
  1751. ;we are not at the very top line
  1752.     CMP    AH,48h            ;up arrow ?
  1753.     JNZ    H02634
  1754.     DEC    HelpLineCount
  1755.     JMP    SHORT PaintHelp
  1756.  
  1757. PadLine:
  1758.     MOV    AL,' '
  1759.     STOSB
  1760.     INC    DI
  1761.     LOOP    PadLine
  1762.     JMP    CalcNext
  1763.  
  1764. H02634:    CMP    AH,49h            ;pgup ?
  1765.     JNZ    ReadHelpKbd
  1766.     SUB    HelpLineCount,17    ;lines/page
  1767.     JNS    PaintHelp
  1768.     MOV    HelpLineCount,0        ;keep from going under 0
  1769.     JMP    PaintHelp
  1770.  
  1771. H02642:    MOV    DH,HelpLineCount
  1772.     CMP    DH,MaxMove
  1773.     JZ    ReadHelpKbd
  1774.     CMP    AH,50h            ;down arrow ?
  1775.     JNZ    H02651
  1776.     INC    HelpLineCount
  1777.     JMP    PaintHelp
  1778.  
  1779. H02651:    CMP    AH,51h            ;pgdn ?
  1780.     JNZ    ReadHelpKbd 
  1781.     ADD    HelpLineCount,17    ;lines/page
  1782.     MOV    DH,MaxMove
  1783.     CMP    DH,HelpLineCount
  1784.     JA    ToPH
  1785.     MOV    HelpLineCount,DH
  1786. ToPH:    JMP    PaintHelp
  1787.  
  1788. ExitHelp:
  1789.     POP    ES
  1790.     CALL    PaintScreen
  1791.     CALL    ShoCursors
  1792.     CLC
  1793.     RET
  1794.     
  1795. CSEG    ends
  1796.     END    Start
  1797.