home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol096 / page.a86 < prev    next >
Text File  |  1984-04-29  |  7KB  |  320 lines

  1. ;********************************************************
  2. ;*                            *
  3. ;*        FILE SCREEN PAGING UTILITY            *
  4. ;*                            *
  5. ;********************************************************
  6. ;
  7. ;    Copyright (C) 1980,1982
  8. ;
  9. ;    By:        Bill Bolton
  10. ;            Software Tools,
  11. ;            P.O. Box 80,
  12. ;            Newport Beach,
  13. ;            NSW, 2106,
  14. ;            AUSTRALIA
  15. ;
  16. ;    CP/M-86 History (most recent version at top)
  17. ;
  18. ;    Version 1.0    Converted from CP/M-80 version
  19. ;            1.0 on 1/Mar/82
  20. ;
  21.     TITLE    'PAGE Utility for CP/M-86'
  22.     PAGEWIDTH    132
  23.     EJECT
  24.  
  25. ;************************************************
  26. ;*                        *
  27. ;*           MISCELLANEOUS EQUATES        *
  28. ;*                        *
  29. ;************************************************
  30.  
  31. REVERSE    EQU    0FFH            ;NON ZERO FOR ADM-31 REVERSE VIDEO
  32. PAGEL    EQU    23            ;LINES/PAGE
  33. WIDTH    EQU    79            ;CHARACTERS/LINE
  34. BUFFER    EQU    0080H            ;TRANSIENT PROGRAM BUFFER 
  35. TFCB    EQU    005CH            ;TRANSIENT PROGRAM FCB
  36. DIRECT    EQU    6            ;DIRECT CONSOLE FUNCTION
  37. STRING    EQU    9            ;STRING PRINT FUNCTION
  38. STATUS    EQU    11            ;CONSOLE STATUS FUNCTION
  39. VERSION    EQU    12            ;VERSION NUMBER FUNCTION
  40. OPEN    EQU    15            ;OPEN FUNCTION CODE
  41. READ    EQU    20            ;READ FUNCTION CODE
  42. CREAD    EQU    0FFH            ;DIRECT CONSOLE INPUT
  43. TAB    EQU    009H            ;ASCII TAB
  44. ALF    EQU    00AH            ;ASCII LINE FEED
  45. ACR    EQU    00DH            ;ASCII CARRIAGE RETURN
  46. ESC    EQU    01BH            ;ASCII ESCAPE
  47. SPACE    EQU    020H            ;ASCII SPACE
  48. DEVICE    EQU    2            ;CP/M CONSOLE
  49. M    EQU    Byte Ptr 0[BX]        ;Handy equate for ASM86
  50.  
  51.     EJECT
  52.     CSEG
  53.  
  54. START:
  55.     MOV    CL,VERSION        ;CP/M VERSION FUNCTION
  56.     INT    224
  57.     MOV    AL,BL            ;GET VERSION NUMBER
  58.     CMP    AL,20H            ;>=VERSION 2.0?
  59.     JNB    L_1    
  60.     JMP    ERROR3            ;NO, EXIT    
  61. L_1:
  62.     MOV    DX,TFCB            ;POINT TO FCB
  63.     CALL    FOPEN            ;OPEN FILE
  64.     JNB    L_2    
  65.     JMP    ERROR1            ;IF ERROR, EXIT
  66. L_2:
  67.     CALL    RESET
  68. LOOP:
  69.     CALL    FETCH@BYTE        ;GET NEXT BYTE FROM FILE
  70.     JNB    L_3    
  71.     JMP    ERROR2            ;EXIT IF ERROR
  72. L_3:
  73.     CMP    AL,1AH            ;EOF?
  74.     JNZ    L_4    
  75.     JMP    EXIT            ;YES, EXIT
  76. L_4:
  77.     CMP    AL,ACR            ;CR?
  78.     JZ    CRET            ;YES, UPDATE COLUMN COUNT
  79.     CMP    AL,ALF            ;LF?
  80.     JZ    LFEED            ;YES, UPDATE LINE COUNT
  81.     CMP    AL,TAB            ;TAB?
  82.     JZ    TABMOV            ;YES, DO IT
  83.     CMP    AL,SPACE        ;ANOTHER CONTROL CHARACTER?
  84.     JNB    DISPLAY            ;NO, PRINT CHACTER
  85.     JMPS    LOOP            ;YES, IGNORE IT
  86. ;
  87. TABMOV:
  88.     MOV    BX,(Offset COL)        ;POINT TO COLUMN
  89. TABLOOP:
  90.     MOV    AL,SPACE        ;GET A SPACE
  91.     CALL    DBYTE            ;DISPLAY IT
  92.     MOV    AL,M            ;GET CURRENT COLUMN
  93.     AND    AL,07H            ;MOD 8, AT TAB STOP?
  94.     JNZ    TABLOOP            ;NO, ANOTHER SPACE
  95.     JMPS    LOOP
  96. ;
  97. DISPLAY:
  98.     CALL    DBYTE            ;DISPLAY THE CHARACTER
  99.     JMPS    LOOP
  100. ;
  101. CRET:
  102.     XOR    AL,AL
  103.     MOV    Byte Ptr COL,AL        ;RESET COLUMN COUNT
  104.     MOV    AL,ACR            ;GET A CARRIAGE RETURN
  105.     JMPS    DISPLAY
  106. ;
  107. LFEED:
  108.     MOV    AL,Byte Ptr LINE    ;GET LINE COUNT
  109.     CMP    AL,PAGEL        ;SCREEN FULL?
  110.     JZ    NEXTPAGE        ;YES, WAIT FOR KEYPRESS
  111.     INC    AL            ;NO, BUMP LINE COUNT
  112.     MOV    Byte Ptr LINE,AL    ;SAVE NEW LINE COUNT
  113.     MOV    AL,ALF            ;GET A LINE FEED
  114.     JMPS    DISPLAY
  115. ;
  116. NEXTPAGE:
  117.     CALL    KEYLOOP            ;WAIT FOR KEYPRESS
  118.     MOV    AL,ALF            ;GET A LINE FEED
  119.     JMPS    DISPLAY
  120. ;
  121. KEYLOOP:
  122.     CALL    KEY            ;CHECK CONSOLE
  123.     CMP    AL,0            ;KEY PRESSED ?
  124.     JZ    KEYLOOP            ;NO, WAIT FOR KEYPRESS
  125.     CALL    RESET            ;RESET COUNTERS
  126.     RET
  127. ;
  128. KEY:
  129.     PUSH    BX            ;SAVE
  130.     PUSH    DX            ;  THE
  131.     PUSH    CX            ;    ENVIRONMENT
  132.     MOV    CL,DIRECT        ;DIRECT CONSOLE FUNCTIONG
  133.     MOV    DL,CREAD        ;CONSOLE INPUT
  134.     INT    224
  135.     POP    CX            ;RESTORE
  136.     POP    DX            ;  THE
  137.     POP    BX            ;    ENVIRONMENT
  138.     RET
  139. ;
  140. RESET:
  141.     XOR    AL,AL
  142.     MOV    Byte Ptr LINE,AL    ;RESET LINE COUNT
  143.     MOV    Byte Ptr COL,AL        ;RESET COLUMN COUNT
  144.     RET
  145. ;
  146. DBYTE:
  147.     PUSH    BX            ;SAVE THE
  148.     PUSH    CX            ;  ENVIRONMENT
  149.     PUSH    AX            ;  AND THE CHARACTER
  150.     MOV    DL,AL            ;COPY THE CHARACTER
  151.     MOV    CL,DEVICE        ;GET FUNCTION
  152.     INT    224
  153.     POP    AX            ;RESTORE THE CHARACTER
  154.     CMP    AL,SPACE        ;IS A CR OR LF?
  155.     JB    CONT            ;YES, DONT BUMP COLUMN COUNT
  156.     MOV    BX,(Offset COL)        ;GET COLUMN COUNT
  157.     INC    M            ;BUMP IT
  158.     MOV    AL,M            ;GET NEW COLUMN COUNT
  159.     CMP    AL,WIDTH        ;AT THE END OF A LINE?
  160.     JNZ    CONT            ;NO
  161.     MOV    AL,ACR            ;GET A CARRIAGE RETURN
  162.     CALL    DBYTE            ;SEND IT
  163.     MOV    AL,Byte Ptr LINE    ;GET LINE NUMBER
  164.     CMP    AL,PAGEL        ;AT END OF PAGE
  165.     JNZ    CONT2            ;NO, DO LINE FEED
  166.     CALL    KEYLOOP            ;WAIT FOR KEYPRESS
  167. CONT2:
  168.     MOV    AL,ALF            ;GET A LINE FEED
  169.     CALL    DBYTE
  170. ;    MOV    AL,Byte Ptr LINE    ;GET THE LINE COUNT
  171. ;    INC    AL            ;BUMP IT
  172. ;    MOV    Byte Ptr LINE,AL    ;SAVE THE LINE COUNT
  173.     INC    Byte Ptr LINE
  174. CONT:
  175.     MOV    CL,STATUS        ;CONSOLE STATUS FUNCTION
  176.     INT    224
  177.     CMP    AL,0            ;KEY PRESSED?
  178.     JNZ    DONE            ;YES, EXIT
  179.     POP    CX            ;RESTORE THE
  180.     POP    BX            ;  ENVIRONMENT
  181.     RET
  182. ;
  183. DONE:
  184.     MOV    CL,0            ;QUIT
  185.     MOV    DL,0
  186.     INT    224
  187. ;
  188. EXIT:
  189.     MOV    DX,(Offset MESSG4)    ;POINT TO EOF MESSAGE
  190.     JMPS    MESSAGE
  191. ;
  192. ERROR3:
  193.     MOV    DX,(Offset MESSG3)    ;POINT TO VERSION MESSAGE 
  194.     JMPS    MESSAGE
  195. ;
  196. ERROR2:
  197.     MOV    DX,(Offset MESSG2)    ;POINT TO READ MESSAGE
  198.     JMPS    MESSAGE
  199. ;
  200. ERROR1:
  201.     MOV    DX,(Offset MESSG1)    ;POINT TO OPEN MESSAGE
  202. MESSAGE:
  203.     MOV    CL,STRING        ;DISPLAY THE MESSAGE
  204.     INT    224
  205.     MOV    CL,0
  206.     MOV    DL,0
  207.     INT    224
  208. ;
  209. ;****************************************************************
  210. ;*                                *
  211. ;*        ROUTINE TO OPEN A DISK FILE            *
  212. ;*                                *
  213. ;****************************************************************
  214. ;
  215. FOPEN:                    ;DE POINTS TO A FCB
  216.     MOV    CL,OPEN            ;FILE OPEN FUNCTION
  217.     INT    224
  218.     CMP    AL,0FFH            ;OPEN FILE  ERROR?
  219.     JZ    OPENERR            ;YES, EXIT
  220.     XOR    AL,AL            ;CLEAR CARRY
  221.     RET
  222. OPENERR:
  223.     STC                ;SET CARRY
  224.     RET
  225. ;
  226. ;
  227. ;****************************************************************
  228. ;*                                *
  229. ;*         ROUTINE TO READ A BYTE                *
  230. ;*                                *
  231. ;****************************************************************
  232. ;
  233. FETCH@BYTE:
  234.     MOV    BX,BUFFER+128
  235.     XCHG    BX,DX            ;BUFFER END ADDRESS IN DX
  236.     MOV    BX,Word Ptr POINTER    ;CURRENT POINTER IN BX
  237.     CMP    DX,BX            ;END OF BUFFER?
  238.     JZ    NEXT@BLOCK        ;YES, READ ANOTHER BLOCK
  239. NEXT@CHAR:
  240.     MOV    AL,M            ;GET CHARACTER
  241.     INC    BX            ;BUMP POINTER
  242.     MOV    Word Ptr POINTER,BX    ;SAVE POINTER
  243.     OR    AL,AL            ;RESET CARRY
  244.     RET
  245. ;
  246. NEXT@BLOCK:
  247.     MOV    CL,READ            ;READ FUNCTION
  248.     MOV    DX,TFCB            ;FCB ADDRESS
  249.     INT    224
  250.     CMP    AL,0            ;ERROR?
  251.     JNZ    INERROR            ;YES, EXIT
  252.     MOV    BX,BUFFER        ;RESET BUFFER POINTER
  253.     MOV    Word Ptr POINTER,BX
  254.     JMPS    NEXT@CHAR        ;CONTINUE
  255. ;
  256. INERROR:
  257.     STC                ;SET CARRY
  258.     RET
  259.  
  260.     EJECT
  261.  
  262. ;************************************************
  263. ;*                        *
  264. ;*           D  A  T  A            *
  265. ;*                        *
  266. ;************************************************
  267.  
  268. L_7    EQU    $
  269.     DSEG
  270.     ORG    Offset L_7
  271.  
  272.     DB    'PAGE.CMD - File PAGE Utility, CP/M-86 Version 1.0, '
  273.     DB    '(C) Copyright March 1982, '
  274.     DB    'By Bill Bolton, Software Tools, Sydney, Australia'
  275.  
  276. COL    DB    0            ;COLUMN COUNTER
  277. LINE    DB    0            ;LINE COUNTER
  278. POINTER    DW    BUFFER+128        ;INPUT POINTER
  279.  
  280. MESSG1:
  281.     IF    REVERSE
  282.     DB    ESC,'G4'
  283.     ENDIF
  284.     DB    '**** '
  285.     DB    'File Open Error'
  286.     DB    ' ****'
  287.     IF    REVERSE
  288.     DB    ESC,'G0'
  289.     ENDIF
  290.     DB    ACR,ALF,'$'
  291.  
  292. MESSG2:
  293.     IF    REVERSE
  294.     DB    ESC,'G4'
  295.     ENDIF
  296.     DB    '**** '
  297.     DB    'File Read Error'
  298.     DB    ' ****'
  299.     IF    REVERSE
  300.     DB    ESC,'G0'
  301.     ENDIF
  302.     DB    ACR,ALF,'$'
  303.  
  304. MESSG3:
  305.     DB    TAB,'Sorry, you need CP/M-86 Version'
  306.     DB    ' 1.0 or later to run PAGE !'
  307.     DB    '$'
  308.  
  309. MESSG4:
  310.     IF    REVERSE
  311.     DB    ESC,'G4'
  312.     ENDIF
  313.     DB    ' End of Input File Reached '
  314.     IF    REVERSE
  315.     DB    ESC,'G0'
  316.     ENDIF
  317.     DB    '$'
  318.  
  319.     END
  320.