home *** CD-ROM | disk | FTP | other *** search
/ Share Gallery 1 / share_gal_1.zip / share_gal_1 / UT / UT009.ZIP / SOURCE.ARC / SHOW.ASM < prev    next >
Assembly Source File  |  1988-07-09  |  24KB  |  549 lines

  1.         TITLE SHOW - MSDOS FILE DISPLAY PROGRAM
  2.         PAGE 55,132
  3. ;****************************************************************************
  4. ; BIDIRECTIONAL FILE DISPLAY PROGRAM FOR MSDOS 2
  5. ;
  6. ;       BY: JON DART
  7. ;           3012 HAWTHORN ST.,
  8. ;           SAN DIEGO, CA 92104
  9. ;
  10. ; VERSION 2.2, 01-Nov-87
  11. ;
  12. ; THIS IS A MODIFIED VERSION OF THE CP/M PROGRAM 'BISHOW' ON SIG/M V. 145.
  13. ; I ADDED SOME MODS OF MY OWN TO THE CP/M VERSION, AND THEN TRANSLATED
  14. ; IT TO MSDOS, USING THE PROGRAM 'ICT.COM' FROM THE HEATH USERS' GROUP.
  15. ; (A CP/M-86 VERSION OF THE PROGRAM EXISTS, BUT I DIDN'T MAKE USE OF IT
  16. ; IN PREPARING THIS VERSION).
  17. ;
  18. ; FURTHER ENHANCEMENTS WERE ADDED TO THE MSDOS VERSION, AS FOLLOWS:
  19. ;
  20. ; 1. TAB CHARACTERS ARE EXPANDED AND LINES ARE TRUNCATED AFTER 80 COLS.
  21. ;
  22. ; 2. FOR COMPATIBILITY WITH WORD PERFECT (tm) FILES, LINE FEEDS WITHOUT
  23. ; CARRIAGE RETURNS AND CARRIAGE RETURNS W/O LINE FEEDS ARE TREATED THE
  24. ; SAME AS CR + LF. (WORDSTAR (tm) FILES ARE ALSO HANDLED CORRECTLY, SINCE
  25. ; THE HI BITS ARE STRIPPED OFF.)
  26. ;
  27. ; 3. 'B' GOES TO BEGINNING OF FILE, 'E' SKIPS TO END.
  28. ;****************************************************
  29. ; TO BUILD SHOW.EXE:
  30. ;    MASM SHOW,SHOW,NUL,NUL
  31. ;    LINK SHOW,SHOW,NUL,ASM
  32. ;
  33. ;****************************************************
  34. ; ORIGINAL COMMENTS FROM THE CP/M VERSION:
  35. ;
  36. ;A buffered, bidirectional version of SHOW.ASM.
  37. ;Ver 1.0, 23 Aug 82
  38. ;Phil Cary, 748 Kenilworth Parkway, Baton Rouge, LA  70808
  39. ;Ver 1.1, 30 Mar 83 added BDOS function 6 W.F.McGee
  40. ;Ver 1.2, 22 May 83 added hi-bit mask for WordStar files
  41. ;         and Wyse-100/200 SCRL keys-changed messages
  42. ;         also made CP/M-86 ver using XLT86 see A86 file
  43. ;         H.M. Van Tassell
  44. ;modified for H89 by Jon Dart 04/13/84 -- uses H89 up and down arrow keys.
  45. ;Also cleaned up code, made pgrm. return to CCP instead of warm-booting.
  46. ;
  47. ;BISHOW is a buffered, bidirectional version of SHOW.ASM which first
  48. ;appeared in Interface Age, November, 1981.  That program could
  49. ;only scroll forward in a file, and read sectors from disk one at a
  50. ;time as they were sent to the console.  I used SHOW frequently to take
  51. ;a quick look at a file without loading a big text editor, and to examine
  52. ;another file with the RUN command while in Wordstar.  TYPE does not work
  53. ;since it is not a file that Wordstar can load and run.
  54. ;
  55. ;It was annoying when I went past the point I was looking for in a file
  56. ;with SHOW, and could not go backwards.  Thus, this bidirectional version
  57. ;which uses random access reads. In addition, buffering was added so that
  58. ;the number of disk reads would be reduced, and moving back and forth
  59. ;in a moderate sized file would be speeded up.  There is a trade off
  60. ;between the size of the buffer and the length of time it takes to refill
  61. ;the buffer which should be set to the user's preference.
  62. ;
  63. ;Just a small contribution to the public domain software as partial
  64. ;payment for the many fine and educational programs the system has
  65. ;given me.  Phil Cary.
  66.  
  67.     DOSSEG
  68.     .MODEL    SMALL
  69.  
  70. ;*************
  71. ; BEGIN CODE *
  72. ;*************
  73.         .XLIST
  74.         INCLUDE MSDOS2.DEF
  75.         INCLUDE ASCII.DEF
  76.     INCLUDE MACROS.DEF
  77.         .LIST
  78.  
  79. MAXSEC  EQU     64                      ;BUFFER SIZE IN 128-BYTE RECORDS
  80. FULBUF  EQU     (MAXSEC*128)            ;OFFSET TO END OF BUFFER
  81. EOF     EQU     CTRL$Z                  ;END OF FILE CHAR.
  82. TRUE    EQU     1
  83. FALSE   EQU     1-TRUE
  84. IBM     EQU     TRUE                    ;TRUE IF IBM-COMPAT AT BIOS LEVEL
  85. BIOS    EQU     10H                     ;IBM INTERRUPT FOR BIOS VIDEO SERVICES
  86.  
  87. ; MEMORY ALLOCATION
  88.  
  89.     .DATA
  90. JMPTBL  DW      OFFSET _TEXT:BCMD        ;JUMP TABLE TO COMMAND ROUTINES
  91.         DW      OFFSET _TEXT:ECMD        ;(PUT HERE BECAUSE MUST BE DEFINED ON PASS 1)
  92.         DW      OFFSET _TEXT:XCMD
  93. CMDLST  DB      'BEX',0                 ;VALID COMMANDS
  94. LINMAX  DB      24                      ;NUMBER OF TO WRITE LINES ON CONSOLE
  95. LINCNT  DB      0                       ;LINE NUMBER ON WRITE OR MOVE BACK IN BUFFER
  96. COLCNT  DB      1                       ;COUNT OF COLUMNS WRITTEN TO DISPLAY
  97. AMTREAD DW      0                       ;AMOUNT READ ON LAST READ OP
  98. FILEPOS DQ      0                       ;OFFSET FROM START OF FILE
  99. INHANDLE DW     0                       ;INPUT FILE HANDLE
  100.  
  101.     .DATA?
  102. VMODE   DB      1 DUP (?)               ;VIDEO MODE (IBM ONLY)
  103. VPAGE   DB      1 DUP (?)               ;VIDEO PAGE (IBM ONLY)
  104. SCRSIZE DB      1 DUP (?)               ;PHYSICAL SCREEN WIDTH, COLUMNS
  105. BUFFER    DB    FULBUF DUP (?)
  106.  
  107.     .STACK
  108.         DB      512 DUP (?)
  109.  
  110.     .CODE
  111. EXTRN   SKIPSP:NEAR,TYPTX:NEAR,UC:NEAR,CMDSRC:NEAR
  112. EXTRN   CLRCO:NEAR,CIN:NEAR,COUT:NEAR
  113.  
  114. ENTRY:  JMP     SHORT START             ;SKIP OVER NEXT SUBROUTINE
  115.  
  116. ;       ROUTINE TO CLEAR SCREEN, HOME CURSOR:
  117. ;       (MAY HAVE TO CHANGE FOR NON-IBM MACHINES)
  118.  
  119. CLRSCR  PROC    NEAR
  120.         PUSH    BX
  121.         IF      IBM
  122.         PUSH    DS
  123.         MOV     AX,DGROUP
  124.         MOV     DS,AX
  125.         MOV     DX,0
  126.         CALL    MOVEXY                  ;MOVE TO HOME POSITION
  127.         MOV     AL,BYTE PTR DGROUP:VMODE  ;GET CURRENT VIDEO MODE
  128.         MOV     AH,0
  129.         INT     BIOS                    ;RESET MODE (CLEARS SCREEN)
  130.         POP     DS
  131.         ELSE
  132.         MOV     AL,FF                   ;USE FF (WILL WORK ON MOST TERMINALS)
  133.         CALL    COUT                    ;(OR ADD YOUR CLEAR SCREEN FN. HERE)
  134.         ENDIF
  135.         POP     BX
  136.         RET
  137. CLRSCR  ENDP
  138.  
  139. MOVEXY  PROC    NEAR                    ;MOVE TO ROW (DH) AND COLUMN (DL)
  140.         MOV     AH,2
  141.         MOV     BH,BYTE PTR DGROUP:VPAGE  ;VIDEO PAGE #
  142.         MOV     BL,0                    ;COLOR (DON'T CHANGE)
  143.         INT     BIOS                    ;MOVE CURSOR
  144.         RET
  145. MOVEXY  ENDP
  146.  
  147. START:  TEST_DOS2                       ;TEST FOR DOS 2.0
  148.         PUSH    DS                      ;SAVE DATA SEG (POINTS TO PSP)
  149.         MOV     AX,DGROUP
  150.         MOV     DS,AX                   ;SET DATA SEG.
  151.         IF      IBM
  152.         MOV     AH,15
  153.         INT     BIOS                    ;GET VIDEO MODE
  154.         MOV     BYTE PTR VPAGE,BH       ;STORE VIDEO PAGE #
  155.         MOV     BYTE PTR SCRSIZE,AH     ;STORE CHARS/LINE
  156.         MOV     BYTE PTR VMODE,AL       ;STORE DISPLAY MODE
  157.         ELSE
  158.         MOV     BYTE PTR SCRSIZE,80     ;ASSUME 80 COLUMN DISPLAY (MODIFY IF NEEDED)
  159.         ENDIF
  160.  
  161.         POP     DS                      ;RESTORE INITIAL DATA SEG.
  162.         CALL    CLRSCR                  ;CLEAR SCREEN, HOME CURSOR
  163. MEMOK:  MOV     AX,DGROUP        ;GET DATA SEG
  164.     MOV    ES,AX            ;SET EXTRA SEG TO POINT TO BUFFER
  165.         MOV     BX,(80H)             ;GET BYTE COUNT FOR COMMAND LINE
  166.         MOV     AL,[BX]                 ;GET BYTE COUNT
  167.         CMP     AL,0                    ;TEST IT
  168.         JNE     GOTFN                   ;IF GOT SOMETHING
  169.         JMP     HELP                    ;NOTHING, GIVE HELP
  170. GOTFN:  MOV     AH,0
  171.         INC     BX
  172.         PUSH    BX
  173.         ADD     BX,AX
  174.         MOV     [BX],BYTE PTR 0         ;MAKE SURE COMMAND LINE ENDS W. 0
  175.         POP     BX
  176.         CALL    SKIPSP                  ;SKIP BLANKS AND TABS
  177.         JNB     START2                  ;IF GOT SOMETHING
  178.         MOV     AX,CS
  179.         MOV     DS,AX
  180.         JMP     HELP                    ;OTHERWISE GIVE HELP
  181. START2: MOV     DX,BX
  182.         MOV     AL,READ_ACCESS
  183.         MOV     AH,DOS2_OPEN
  184.         INT     DOS                     ;TRY TO OPEN FILE
  185.         PUSHF                           ;SAVE STATUS
  186.         PUSH    AX
  187.         MOV     AX,DGROUP
  188.         MOV     DS,AX                   ;SET DATA SEG
  189.         CALL    CLRSCR                  ;CLEAR SCREEN
  190.         POP     AX
  191.         POPF                            ;RESTORE STATUS FROM FILE OPEN
  192.         JNB     OPENOK                  ;IF OK
  193.         JMP     BADOPEN                 ;NOT OK, GIVE ERROR MSG.
  194. OPENOK:
  195.         MOV     WORD PTR INHANDLE,AX    ;SAVE FILE HANDLE
  196.         CALL    FILBUF                  ;FILL THE DISK BUFFER
  197.  
  198. BEGIN:
  199.         MOV     BYTE PTR LINCNT,0       ;INIT LINE COUNT
  200.         MOV     BYTE PTR COLCNT,1       ;AND COLUMN COUNT TO 1
  201.         MOV     BYTE PTR LINMAX,24      ;SET MAX LINE COUNT
  202. WRTFWD: MOV     BX,OFFSET BUFFER        ;POINT TO START OF BUFFER
  203. WRTFWD1:MOV     AL,BYTE PTR [BX]         ;GET A CHARACTER
  204.         CMP     AL,EOF                  ;IS IT EOF?
  205.         JNE     L_2                     ;IF NOT
  206.         JMP     GETCMD                  ;EOF, GO WAIT FOR COMMAND ENTRY
  207. L_2:
  208.         PUSH    AX                      ;SAVE CHAR.
  209.         CALL    CTYPE                   ;PUT IT ON CONSOLE
  210.         POP     AX                      ;GET CHAR.
  211.         AND     AL,7FH                  ;STRIP HI BIT
  212.         CMP     AL,CR                   ;SEE IF END OF LINE
  213.         JE      SAWCR                   ;IF GOT CR, CHECK FOR LF
  214.         CMP     AL,LF                   ;CHECK FOR LF
  215.         JNE     WRTFWD2                 ;IF NOT LF
  216.         DEC     BX                      ;POINT TO PREV. CHARACTER
  217.         CMP     [BX],BYTE PTR CR         ;WAS PREVIOUS CHARACTER CR?
  218.         PUSHF                           ;SAVE FLAGS
  219.         INC     BX                      ;BUMP POINTER
  220.         POPF                            ;GET FLAGS - 'Z'=1 IF LAST CHAR. CR
  221.         JE      WRTFWD2                 ;IF CR, IGNORE IT
  222.         MOV     AL,CR                   ;GOT LF ALONE, MAP TO CR
  223.         CALL    CTYPE                   ;SHOW CR
  224.         JMP     SHORT FWDCNT            ;COUNT LF AS END OF LINE CHAR.
  225. WRTFWD2:INC     BX                      ;BUMP BUFFER POINTER
  226.         MOV     DX,OFFSET BUFFER+FULBUF  ;GET END OF BUFFER OFFSET
  227.         CMP     BX,DX                   ;COMPARE W. BUFFER PTR.
  228.         JNE     WRTFWD1                 ;IF NOT EQUAL, CONTINUE
  229.         CALL    FILBUF                  ;ELSE FILL BUFFER AGAIN
  230.         JMP     WRTFWD                  ;..AND START AT BEGINNING OF BUFFER
  231. SAWCR:  MOV     AL,BYTE PTR [BX+1]      ;SAW CR, GET NEXT CHAR.
  232.         CMP     AL,LF                   ;IS IT LF?
  233.         JE      FWDCNT                  ;YES, DON'T WORRY
  234.         MOV     AL,LF                   ;NO LF AFTER CR,
  235.         CALL    CTYPE                   ;SHOW LF ANYWAY
  236.  
  237. FWDCNT: MOV     SI,OFFSET LINCNT
  238.         MOV     AL,BYTE PTR LINMAX      ;GET MAX. LINE COUNT
  239.         CMP     BYTE PTR [SI],AL        ;COMPARE LINE COUNT WITH LIMIT
  240.         JNE     WRTFWD2                 ;IF NOT THERE, CONTINUE
  241.         MOV     BYTE PTR [SI],0         ;RE-INIT LINE COUNT
  242.  
  243. GETCMD:                                 ;WAIT FOR COMMAND
  244.         IF      IBM
  245.         PUSH    BX
  246.         MOV     DH,24
  247.         MOV     DL,0
  248.         CALL    MOVEXY                  ;MOVE TO BOTTOM OF SCREEN
  249.         POP     BX
  250.         ENDIF
  251.         CALL    CIN                     ;GET CHAR. FROM CONSOLE
  252.         CALL    UC                      ;MAKE IT UPPER CASE
  253.         CMP     AL,0                    ;IS IT NULL (FUNCTION KEY LEADIN)? -
  254.         JE      FNKEY                   ;YES.
  255.         PUSH    BX
  256.         MOV     BX,OFFSET CMDLST        ;POINT TO COMMAND LIST
  257.         CALL    CMDSRC                  ;SEARCH FOR MATCH
  258.         POP     BX
  259.         DEC     AL                      ;-1 SO INDEX STARTS AT 0
  260.         JS      BADCMD                  ;IF NO MATCH
  261.         SHL     AL,1                    ;DOUBLE INDEX
  262.         MOV     AH,0                    ;HI BYTE 0
  263.         MOV     BX,AX                   ;INDEX IN INDEX REGISTER
  264.         JMP     JMPTBL[BX]              ;JUMP TO ROUTINE
  265.  
  266. FNKEY:
  267.         CALL    CIN                     ;FUNCTION KEY PRESSED, GET NEXT CHAR.
  268.         CMP     AL,49H                  ;PAGE UP?
  269.         JE      GOBACK                  ;YES, GO BACK
  270.         CMP     AL,51H                  ;PAGE DOWN?
  271.         JE      GOFWD                   ;YES, GO FWD
  272. BADCMD: CALL    TYPTX                   ;..A WRONG CHOICE SO GIVE MESSAGE
  273.         DB      CR,LF,LF
  274.         DB      'Commands: PG DN, PG UP, B(eginning), E(nd), X(exit)'
  275.         DB      CR,BEL+80H
  276.         JMP     GETCMD                  ;TRY AGAIN FOR COMMAND
  277.  
  278. GOFWD:
  279.         CMP     BYTE PTR [BX],EOF        ;AT EOF?
  280.         JE      GETCMD                  ;YES, IGNORE 'FORWARD' COMMAND
  281.         MOV     BYTE PTR LINMAX,24      ;24 LINES 2 WRITE
  282.         CALL    CLRSCR                  ;CLEAR SCREEN
  283.         JMP     WRTFWD1                 ;SCROLL FORWARD
  284. GOBACK:
  285.         MOV     BYTE PTR LINMAX,24      ;24 LINES 2 WRITE
  286. WRTBAK:
  287.         MOV     BYTE PTR LINCNT,44      ;LINES TO MOVE BACK
  288.         CALL    CLRSCR                  ;CLEAR THE SCREEN
  289. WRTBAK1:
  290.         CMP     BX,OFFSET BUFFER        ;AT START OF BUFFER?
  291.         JE      FILBAK                  ;IF AT START OF BUFFER
  292. WRTBAK2:MOV     AL,BYTE PTR [BX]         ;GET A CHARACTER
  293.         DEC     BX                      ;DECREMENT BUFFER
  294.         AND     AL,7FH                  ;STRIP HI BIT
  295.         CMP     AL,CR                   ;SEE IF END OF LINE
  296.         JE      BAKCNT                  ;IF CR
  297.         CMP     AL,LF
  298.         JNE     WRTBAK1                 ;IF NOT LF
  299.         MOV     AL,BYTE PTR [BX]        ;GET CHAR. BEFORE LF
  300.         CMP     AL,CR                   ;IS CR?
  301.         JE      WRTBAK1                 ;YES, IGNORE LF
  302.  
  303. BAKCNT: DEC     BYTE PTR LINCNT         ;ELSE, DECR. NUMBER OF LINES TO MOVE BACK
  304.         JNZ     WRTBAK1                 ;..AND LOOP IF NOT THERE
  305.         INC     BX                      ;ELSE BUMP POINTER TO ACCOUNT FOR LF WITH CR
  306.         JMP     WRTFWD1                 ;..AND GO WRITE A SCREEN
  307.  
  308. FILBAK: MOV     DX,FULBUF         ;GET THE BUFFER SIZE
  309.         MOV     BX,WORD PTR AMTREAD    ;AND THE # OF BYTES LAST READ
  310.         ADD     BX,DX                   ;ADD THEM
  311.         MOV     DX,WORD PTR FILEPOS
  312.         MOV     CX,WORD PTR FILEPOS+2   ;LOAD FILEPOS INTO CX:DX
  313.         SUB     DX,BX                   ;SUBTRACT AMT. TO MOVE BACK
  314.         JNB     NOBORROW                ;IF NO BORROW
  315.         SUB     CX,1                    ;CX <- CX-1 (AFFECTS BORROW FLAG)
  316. NOBORROW:
  317.         JB      FILBEG                  ;IF BEYOND BEGINNING OF FILE
  318.         MOV     WORD PTR FILEPOS,DX     ;STORE LO WORD OF FILE POS
  319.         MOV     WORD PTR FILEPOS+2,CX   ;AND HI WORD OF FILE POS
  320.         MOV     BX,WORD PTR INHANDLE
  321.         MOV     AL,0                    ;POSITION FROM START
  322.         MOV     AH,LSEEK
  323.         INT     DOS                     ;MOVE FILE POINTER
  324.         CALL    FILBUF                  ;FILL THE BUFFER
  325.         MOV     BX,OFFSET BUFFER+FULBUF  ;..AND POINT TO END OF BUFFER
  326.         CALL    CLRSCR                  ;CLEAR THE SCREEN
  327.         JMP     WRTBAK2                 ;CONTINUE MOVING BACK IN FILE
  328.  
  329. ECMD:                                   ;COME HERE TO MOVE TO END OF FILE
  330.         CALL    CLRSCR                  ;CLEAR SCREEN
  331.         MOV     AH,LSEEK                ;PREPARE TO MOVE FILE POINTER
  332.         MOV     BX,WORD PTR INHANDLE    ;GET FILE HANDLE
  333.         MOV     AL,2                    ;POSITION AT END
  334.         MOV     CX,0                    ;OFFSET, MSW
  335.         MOV     DX,0                    ;OFFSET, LSW
  336.         INT     DOS                     ;MOVE FILE POINTER
  337.         SUB     AX,FULBUF               ;SUBTRACT BUFFER SIZE
  338.         JNB     NOBORR                  ;IF NO BORROW
  339.         SUB     DX,1
  340.         JNB     NOBORR                  ;IF FILE BIGGER THAN BUFFER
  341.         MOV     AX,0
  342.         MOV     DX,0                    ;FILE SMALLER THAN BUFFER
  343.         JMP     SHORT SMALL             ;FILL BUFFER STARTING FROM BEGINNING
  344. NOBORR:
  345.         MOV     CX,DX                   ;MSW OF OFFSET IN CX
  346.         MOV     DX,AX                   ;LSW OF OFFSET IN DX
  347. SMALL:
  348.         MOV     AH,LSEEK                ;GOING TO MOVE POINTER AGAIN
  349.         MOV     BX,WORD PTR INHANDLE    ;GET HANDLE
  350.         MOV     AL,0                    ;POSITION FROM START
  351.         INT     DOS                     ;MOVE FILE POINTER
  352.         MOV     WORD PTR FILEPOS,AX     ;UPDATE FILE POSITION
  353.         MOV     WORD PTR FILEPOS+2,DX   ;HI WORD TOO
  354.         CALL    FILBUF                  ;FILL BUFFER
  355.         MOV     BX,OFFSET BUFFER        ;LOAD BUFFER OFFSET
  356.         ADD     BX,WORD PTR AMTREAD     ;COMPUTE ADDR. OF LAST VALID BYTE
  357.         MOV     BYTE PTR LINMAX,24      ;24 LINES TO DISPLAY
  358.         MOV     BYTE PTR LINCNT,24      ;24 LINES TO MOVE BACK
  359.         JMP     WRTBAK1                 ;GO BACK FROM END
  360.  
  361. BCMD:                                   ;MOVE TO BEGINNING OF FILE
  362.         CALL    CLRSCR                  ;CLEAR SCREEN
  363. FILBEG: MOV     WORD PTR FILEPOS,0      ;ZERO FILE POS
  364.         MOV     WORD PTR FILEPOS+2,0
  365.         MOV     CX,0
  366.         MOV     DX,0
  367.         MOV     BX,WORD PTR INHANDLE
  368.         MOV     AL,0
  369.         MOV     AH,LSEEK
  370.         INT     DOS                     ;SEEK TO START OF FILE
  371.         CALL    FILBUF                  ;FILL BUFFER
  372.         JMP     BEGIN                   ;GO WRITE IT
  373.  
  374. FILBUF  PROC    NEAR                    ;FILL BUFFER FROM FILE
  375.         PUSH    DX                      ;SAVE REGS.
  376.         PUSH    BX
  377.         MOV     BX,WORD PTR INHANDLE    ;LOAD FILE HANDLE
  378.         MOV     DX,OFFSET BUFFER        ;LOAD OFFSET TO DISK BUFFER
  379.         MOV     CX,FULBUF               ;SIZE OF BUFFER
  380.         MOV     AH,READ
  381.         INT     DOS                     ;READ FROM DISK
  382.         JB      RDERR                   ;IF ERROR
  383.         MOV     WORD PTR AMTREAD,AX     ;SAVE AMT. READ
  384.         CMP     AX,CX                   ;IS BUFFER FULL?
  385.         JE      FULL                    ;YES, IT IS
  386.         MOV     BX,AX                   ;NO, MAKE BX POINT TO LAST BYTE+1
  387.     ADD    BX,OFFSET BUFFER
  388.         MOV     BYTE PTR [BX],EOF        ;STICK IN EOF CHAR.
  389. FULL:
  390.         ADD     WORD PTR FILEPOS,AX     ;UPDATE FILE POINTER
  391.         JNC     NOCARRY
  392.         INC     WORD PTR FILEPOS+2
  393. NOCARRY:                                ;READ OK
  394.         POP     BX
  395.         POP     DX
  396.         RET
  397. FILBUF  ENDP
  398.  
  399. RDERR:  CALL    TYPTX                   ;READ ERROR
  400.         DB      'Disk read error.',CR,LF+80h
  401.         POP     BX                      ;CLEAR STACK
  402.         POP     DX
  403.         POP     DX
  404.         JMP     EXIT0                   ;GO EXIT
  405.  
  406. BADOPEN:                                ;COME HERE WHEN CAN'T OPEN FILE
  407.         CALL    TYPTX                   ;GIVE ERROR MSG AND QUIT
  408.         DB      CR,LF,LF,'Requested file is not on this disk.',CR,LF
  409.         DB      'Please check your spelling or use DIR.',cr,lf,lf,bel+80H
  410.         JMP     EXIT1                   ;LEAVE MSG ON SCREEN ON EXIT
  411.  
  412. HELP:                                   ;COME HERE WHEN NO FILE NAME GIVEN
  413.         MOV     AX,DGROUP
  414.         MOV     DS,AX
  415.         CALL    CLRSCR
  416.         CALL    TYPTX
  417.         DB      'SHOW V. 2.2 by Jon Dart (01-Nov-87)',CR,LF,CR,LF
  418.         DB      'Correct usage of SHOW is --',cr,lf,lf
  419.         DB      '    A>SHOW filename  ',cr,lf,lf
  420.         DB      'After first page is displayed, press the PG DN key to go'
  421.         DB      CR,LF
  422.         DB      "forward, and the PG UP key to go backward.  'B' moves to"
  423.         DB      CR,LF
  424.         DB      'the beginning of the file, and E moves to the end.  Type'
  425.         DB      CR,LF
  426.         DB      'X to exit.',bel,cr,lf,lf+80h
  427.  
  428.         JMP     EXIT1
  429.  
  430. ;       OUTPUT 1 CHAR. - EXPANDS TABS, SHOWS CONTROL CHARS. IN VISIBLE FORM.
  431. ;       ENTRY:  AL = CHAR.
  432. ;
  433. CTYPE   PROC    NEAR
  434.         PUSH    CX                      ;SAVE THE REGISTERS
  435.         PUSH    DX                      ;..FROM
  436.         PUSH    BX                      ;..CLOBBER
  437.         AND     AL,7FH                  ;STRIP HI BIT
  438.         JZ      QUIT                    ;IF NULL
  439.         CMP     AL,SPACE                ;CONTROL CHAR?
  440.         JGE     NOTCTL                  ;NOPE.
  441.         CMP     AL,CR                   ;GOT CONTROL CHAR.
  442.         JE      NOTCTL                  ;IF CR, JUST PRINT IT
  443.         CMP     AL,LF
  444.         JE      NOTCTL                  ;IF LF, JUST PRINT IT
  445.         CMP     AL,TAB
  446.         JE      GOTTAB                  ;IF TAB, EXPAND
  447.         ADD     AL,'A'-1                ;ELSE CONVERT TO LETTER
  448.         PUSH    AX
  449.         MOV     AL,'^'
  450.         CALL    CTYPE1                  ;SHOW UP-ARROW
  451.         POP     AX
  452. NOTCTL: CALL    CTYPE1                  ;DISPLAY CHAR.
  453.         JMP     SHORT QUIT
  454. GOTTAB: MOV     AL,COLCNT               ;GET COLUMN COUNT
  455.         MOV     BL,AL
  456.         CALL    NEXTTAB                 ;COMPUTE NEXT TAB STOP
  457.         SUB     AL,BL                   ;GET DISTANCE TO IT
  458.         MOV     CL,AL
  459.         MOV     CH,0
  460. GOTAB:  MOV     AL,SPACE                ;PRINT SPACES TO NEXT TAB STOP
  461.         PUSH    CX
  462.         CALL    CTYPE1
  463.         POP     CX
  464.         LOOP    GOTAB
  465. QUIT:   POP     BX                      ;RESTORE
  466.         POP     DX                      ;..THE REGISTERS
  467.         POP     CX
  468.         RET
  469. CTYPE   ENDP
  470.  
  471. ;       SHOW 1 CHAR. (IN AL)
  472. ;       DOESN'T SHOW PAST 80TH COLUMN
  473. ;       ENTRY:  AL = CHAR.
  474.  
  475. CTYPE1  PROC    NEAR
  476.         IF      IBM
  477.         CMP     AL,SPACE
  478.         JGE     NOTCTRL                 ;IF NOT CONTROL CHAR. (CR OR LF)
  479. CTRL:   CALL    UPDATE                  ;CR OR LF, UPDATE LINE & COL. COUNTS
  480.         JMP     SHORT MOVE              ;JUST MOVE CURSOR
  481. NOTCTRL:
  482.         MOV     BL,BYTE PTR COLCNT
  483.         CMP     BL,BYTE PTR SCRSIZE
  484.         JG      UPDATE                  ;IF PAST LAST COL., DON'T SHOW CHAR.
  485.         PUSH    AX
  486.         MOV     AH,10                   ;BIOS FUNCTION #
  487.         MOV     BH,BYTE PTR VPAGE       ;PAGE #
  488.         MOV     CX,1                    ;# CHARS. TO WRITE
  489.         INT     BIOS                    ;WRITE USING BIOS
  490.         POP     AX
  491.         CALL    UPDATE                  ;UPDATE LINE AND COL. COUNTS
  492. MOVE:
  493.         PUSH    AX
  494.         MOV     DH,BYTE PTR LINCNT      ;LINE COUNT IN DH
  495.         MOV     DL,BYTE PTR COLCNT      ;COLUMN COUNT IN DL
  496.         DEC     DL                      ;-1 CAUSE COLUMNS START AT 1
  497.         CALL    MOVEXY                  ;MOVE CURSOR USING BIOS
  498.         POP     AX
  499.         RET
  500.         ELSE
  501.         CMP     BYTE PTR COLCNT,80      ;REACHED 80TH COL?
  502.         JG      UPDATE                  ;YES, DON'T SHOW CHAR.
  503.         CALL    COUT                    ;DISPLAY CHAR. USING DOS
  504.         ENDIF
  505. UPDATE:
  506.         CMP     AL,CR                   ;IF CHAR. = CR,
  507.         JE      ZEROCOL                 ;ZERO COL. COUNT
  508.         CMP     AL,LF                   ;DON'T COUNT LF
  509.         JE      SKIPINC                 ;AS PRINTING CHAR.
  510.         INC     BYTE PTR COLCNT         ;PRINTING CHAR., BUMP COLUMN COUNT
  511.         RET
  512. SKIPINC:
  513.         INC     BYTE PTR LINCNT         ;GOT LINE FEED, BUMP LINE COUNT
  514.         RET
  515. ZEROCOL:
  516.         MOV     BYTE PTR COLCNT,1
  517.         RET
  518. CTYPE1  ENDP
  519.  
  520. ;       NEXTTAB = COMPUTE NEXT STANDARD TAB STOP
  521. ;
  522. ;       ENTRY:  (AL) = CURSOR POSITION
  523. ;       EXIT:   (AL) = POSITION OF NEXT TAB
  524. ;       USES:   AL,FLAGS
  525. ;
  526. NEXTTAB PROC    NEAR
  527.         PUSH    CX
  528.         DEC     AL
  529.         MOV     CH,AL
  530.         AND     AL,00000111B
  531.         MOV     CL,8
  532.         SUB     CL,AL
  533.         ADD     CH,CL
  534.         MOV     AL,CH
  535.         INC     AL
  536.         POP     CX
  537.         RET
  538. NEXTTAB ENDP
  539.  
  540. XCMD:
  541. EXIT0:  CALL    CLRSCR                  ;CLEAR THE SCREEN
  542. EXIT1:  CALL    CLRCO                   ;CLEAR ANY TYPE-AHEAD
  543. EXIT2:  MOV     AH,EXIT
  544.         INT     DOS                     ;RETURN TO DOS
  545. ENDCODE EQU     $
  546.  
  547.         END     ENTRY
  548.  
  549.