home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol073 / page-11.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.3 KB  |  306 lines

  1. ;********************************************************
  2. ;*                            *
  3. ;*        FILE SCREEN PAGING UTILITY            *
  4. ;*                            *
  5. ;********************************************************
  6. ;
  7. ;    By:    Bill Bolton
  8. ;        Software Tools,
  9. ;        P.O. Box 80,
  10. ;        Newport Beach,
  11. ;        NSW, 2106,
  12. ;        AUSTRALIA
  13. ;
  14. ;    Date:    July 1, 1980    Version 1.0
  15. ;
  16. ;        August 17, 1980    Version 1.1, modified to require a
  17. ;                different key to abort from that
  18. ;                pressed to advance to next page,
  19. ;                for those poor folks with bouncy
  20. ;                keyboards. Released concurrently
  21. ;                with version 1.0
  22. ;
  23. ;    Version: 1.1
  24. ;
  25. TITLE    ;YOU CAN'T ASSEMBLE THIS WITH MAC, USE ASM.COM
  26. ;
  27. REVERSE    EQU    0        ;NON ZERO FOR ADM-31 REVERSE VIDEO
  28. PAGE    EQU    23        ;LINES/PAGE
  29. WIDTH    EQU    79        ;CHARACTERS/LINE
  30. WBOOT    EQU    0000H        ;REBOOT ENTRY POINT
  31. BDOS    EQU    0005H        ;CPM ENTRY POINT
  32. BUFFER    EQU    0080H        ;TRANSIENT PROGRAM BUFFER 
  33. TFCB    EQU    005CH        ;TRANSIENT PROGRAM FCB
  34. DIRECT    EQU    6        ;DIRECT CONSOLE FUNCTION
  35. STRING    EQU    9        ;STRING PRINT FUNCTION
  36. STATUS    EQU    11        ;CONSOLE STATUS FUNCTION
  37. VERSION    EQU    12        ;VERSION NUMBER FUNCTION
  38. OPEN    EQU    15        ;OPEN FUNCTION CODE
  39. READ    EQU    20        ;READ FUNCTION CODE
  40. CREAD    EQU    0FFH        ;DIRECT CONSOLE INPUT
  41. TAB    EQU    009H        ;ASCII TAB
  42. ALF    EQU    00AH        ;ASCII LINE FEED
  43. ACR    EQU    00DH        ;ASCII CARRIAGE RETURN
  44. ESC    EQU    01BH        ;ASCII ESCAPE
  45. SPACE    EQU    020H        ;ASCII SPACE
  46. DEVICE    EQU    2        ;CP/M CONSOLE
  47. ;
  48. ;
  49.     ORG    100H
  50. ;
  51. START:
  52.     LXI    SP,STAKTOP    ;SET UP THE STACK
  53.     MVI    C,VERSION    ;CP/M VERSION FUNCTION
  54.     CALL    BDOS
  55.     MOV    A,L        ;GET VERSION NUMBER
  56.     CPI    20H        ;>=VERSION 2.0?
  57.     JC    ERROR3        ;NO, EXIT    
  58.     LXI    D,TFCB        ;POINT TO FCB
  59.     CALL    FOPEN        ;OPEN FILE
  60.     JC    ERROR1        ;IF ERROR, EXIT
  61.     CALL    RESET
  62. LOOP:
  63.     CALL    FETCH$BYTE    ;GET NEXT BYTE FROM FILE
  64.     JC    ERROR2        ;EXIT IF ERROR
  65.     CPI    1AH        ;EOF?
  66.     JZ    EXIT        ;YES, EXIT
  67.     CPI    ACR        ;CR?
  68.     JZ    CRET        ;YES, UPDATE COLUMN COUNT
  69.     CPI    ALF        ;LF?
  70.     JZ    LFEED        ;YES, UPDATE LINE COUNT
  71.     CPI    TAB        ;TAB?
  72.     JZ    TABMOV        ;YES, DO IT
  73.     CPI    SPACE        ;ANOTHER CONTROL CHARACTER?
  74.     JNC    DISPLAY        ;NO, PRINT CHACTER
  75.     JMP    LOOP        ;YES, IGNORE IT
  76. ;
  77. TABMOV:
  78.     LXI    H,COL        ;POINT TO COLUMN
  79. TABLOOP:
  80.     MVI    A,SPACE        ;GET A SPACE
  81.     CALL    DBYTE        ;DISPLAY IT
  82.     MOV    A,M        ;GET CURRENT COLUMN
  83.     ANI    07H        ;MOD 8, AT TAB STOP?
  84.     JNZ    TABLOOP        ;NO, ANOTHER SPACE
  85.     JMP    LOOP
  86. ;
  87. DISPLAY:
  88.     CALL    DBYTE        ;DISPLAY THE CHARACTER
  89.     JMP    LOOP
  90. ;
  91. CRET:
  92.     XRA    A
  93.     STA    COL        ;RESET COLUMN COUNT
  94.     MVI    A,ACR        ;GET A CARRIAGE RETURN
  95.     JMP    DISPLAY
  96. ;
  97. LFEED:
  98.     LDA    LINE        ;GET LINE COUNT
  99.     CPI    PAGE        ;SCREEN FULL?
  100.     JZ    NEXTPAGE    ;YES, WAIT FOR KEYPRESS
  101.     INR    A        ;NO, BUMP LINE COUNT
  102.     STA    LINE        ;SAVE NEW LINE COUNT
  103.     MVI    A,ALF        ;GET A LINE FEED
  104.     JMP    DISPLAY
  105. ;
  106. NEXTPAGE:
  107.     CALL    KEYLOOP        ;WAIT FOR KEYPRESS
  108.     MVI    A,ALF        ;GET A LINE FEED
  109.     JMP    DISPLAY
  110. ;
  111. KEYLOOP:
  112.     CALL    KEY        ;CHECK CONSOLE
  113.     CPI    0        ;KEY PRESSED ?
  114.     JZ    KEYLOOP        ;NO, WAIT FOR KEYPRESS
  115.     STA    LAST$KEY    ;SAVE FOR LATER
  116.     CALL    RESET        ;RESET COUNTERS
  117.     RET
  118. ;
  119. KEY:                
  120.     PUSH    H        ;SAVE
  121.     PUSH    D        ;  THE
  122.     PUSH    B        ;    ENVIRONMENT
  123.     MVI    C,DIRECT    ;DIRECT CONSOLE FUNCTION6
  124.     MVI    E,CREAD        ;CONSOLE INPUT
  125.     CALL    BDOS
  126.     POP    B        ;RESTORE
  127.     POP    D        ;  THE
  128.     POP    H        ;    ENVIRONMENT
  129.     RET
  130. ;
  131. RESET:
  132.     XRA    A
  133.     STA    LINE        ;RESET LINE COUNT
  134.     STA    COL        ;RESET COLUMN COUNT
  135.     RET
  136. ;
  137. DBYTE:
  138.     PUSH    H        ;SAVE THE
  139.     PUSH    B        ;  ENVIRONMENT
  140.     PUSH    PSW        ;SAVE THE CHARACTER
  141.     MOV    E,A        ;COPY THE CHARACTER
  142.     MVI    C,DEVICE    ;GET FUNCTION
  143.     CALL    BDOS
  144.     POP    PSW        ;RESTORE THE CHARACTER
  145.     CPI    SPACE        ;IS A CR OR LF?
  146.     JC    CONT        ;YES, DONT BUMP COLUMN COUNT
  147.     LXI    H,COL        ;GET COLUMN COUNT
  148.     INR    M        ;BUMP IT
  149.     MOV    A,M        ;GET NEW COLUMN COUNT
  150.     CPI    WIDTH        ;AT THE END OF A LINE?
  151.     JNZ    CONT        ;NO
  152.     MVI    A,ACR        ;GET A CARRIAGE RETURN
  153.     CALL    DBYTE        ;SEND IT
  154.     LDA    LINE        ;GET LINE NUMBER
  155.     CPI    PAGE        ;AT END OF PAGE
  156.     JNZ    CONT2        ;NO, DO LINE FEED
  157.     CALL    KEYLOOP        ;WAIT FOR KEYPRESS
  158. CONT2:
  159.     MVI    A,ALF        ;GET A LINE FEED
  160.     CALL    DBYTE
  161.     LDA    LINE        ;GET THE LINE COUNT
  162.     INR    A        ;BUMP IT
  163.     STA    LINE        ;SAVE THE LINE COUNT
  164. CONT:
  165.     CALL    KEY
  166.     CPI    0        ;KEY PRESSED?
  167.     CNZ    CHECK$EXIT    ;YES, CHECK IF EXIT NEEDED
  168.     POP    B        ;RESTORE THE
  169.     POP    H        ;  ENVIRONMENT
  170.     RET
  171. ;
  172. CHECK$EXIT:
  173.     LXI    H,LAST$KEY    ;POINT TO LAST KEY PRESSED
  174.     CMP    M        ;SAME?
  175.     RZ            ;YES, DONT QUIT
  176. DONE:
  177.     JMP    WBOOT        ;QUIT
  178. ;
  179. EXIT:
  180.     LXI    D,MESSG4    ;POINT TO EOF MESSAGE
  181.     JMP    MESSAGE
  182. ;
  183. ERROR3:    LXI    D,MESSG3    ;POINT TO VERSION MESSAGE 
  184.     JMP    MESSAGE
  185. ;
  186. ERROR2:
  187.     LXI    D,MESSG2    ;POINT TO READ MESSAGE
  188.     JMP    MESSAGE
  189. ;
  190. ERROR1:
  191.     LXI    D,MESSG1    ;POINT TO OPEN MESSAGE
  192. MESSAGE:
  193.     MVI    C,STRING    ;DISPLAY THE MESSAGE
  194.     CALL    BDOS
  195.     JMP    WBOOT
  196. ;
  197.     DB    'FILE PAGE UTILITY, VERSION 1.1 '
  198.     DB    '(C) Bill Bolton, Software Tools, August 1980'
  199. ;
  200. ;****************************************************************
  201. ;*                                *
  202. ;*        ROUTINE TO OPEN A DISK FILE            *
  203. ;*                                *
  204. ;****************************************************************
  205. ;
  206. FOPEN:                ;DE POINTS TO A FCB
  207.     MVI    C,OPEN        ;FILE OPEN FUNCTION
  208.     CALL    BDOS
  209.     CPI    0FFH        ;OPEN FILE  ERROR?
  210.     JZ    OPENERR        ;YES, EXIT
  211.     XRA    A        ;CLEAR CARRY
  212.     RET
  213. OPENERR:
  214.     STC            ;SET CARRY
  215.     RET
  216. ;
  217. ;
  218. ;****************************************************************
  219. ;*                                *
  220. ;*         ROUTINE TO READ A BYTE                *
  221. ;*                                *
  222. ;****************************************************************
  223. ;
  224. FETCH$BYTE:
  225.     LXI    H,BUFFER+128
  226.     XCHG            ;BUFFER END ADDRESS IN DE
  227.     LHLD    POINTER        ;CURRENT POINTER IN HL
  228.     MOV    A,H        ;END OF BUFFER?
  229.     CMP    D
  230.     JNZ    NEXT$CHAR    ;NO, GET ANOTHER CHARACTER
  231.     MOV    A,L
  232.     CMP    E
  233.     JZ    NEXT$BLOCK    ;YES, READ ANOTHER BLOCK
  234. NEXT$CHAR:
  235.     MOV    A,M        ;GET CHARACTER
  236.     INX    H        ;BUMP POINTER
  237.     SHLD    POINTER        ;SAVE POINTER
  238.     ORA    A        ;RESET CARRY
  239.     RET
  240. ;
  241. NEXT$BLOCK:
  242.     MVI    C,READ        ;READ FUNCTION
  243.     LXI    D,TFCB        ;FCB ADDRESS
  244.     CALL    BDOS
  245.     CPI    0        ;ERROR?
  246.     JNZ    INERROR        ;YES, EXIT
  247.     LXI    H,BUFFER    ;RESET BUFFER POINTER
  248.     SHLD    POINTER
  249.     JMP    NEXT$CHAR    ;CONTINUE
  250. ;
  251. INERROR:
  252.     STC            ;SET CARRY
  253.     RET
  254. ;
  255. ;
  256. COL:    DB    0        ;COLUMN COUNTER
  257. LINE:    DB    0        ;LINE COUNTER
  258. LAST$KEY:
  259.     DB    0        ;LAST KEY HIT
  260. POINTER:DW    BUFFER+128    ;INPUT POINTER
  261. ;
  262. MESSG1:
  263.     DB    '**** '
  264.     if    REVERSE
  265.     DB    ESC,'G4'
  266.     endif
  267.     DB    'File Open Error'
  268.     if    REVERSE
  269.     DB    ESC,'G0'
  270.     endif
  271.     DB    ' ****'
  272.     DB    ACR,ALF,'$'
  273. ;
  274. MESSG2:
  275.     DB    '**** '
  276.     if    REVERSE
  277.     DB    ESC,'G4'
  278.     endif
  279.     DB    'File Read Error'
  280.     if    REVERSE
  281.     DB    ESC,'G0'
  282.     endif
  283.     DB    ' ****'
  284.     DB    ACR,ALF,'$'
  285. ;
  286. MESSG3:
  287.     DB    TAB,'Sorry, you need CP/M Version'
  288.     DB    ' 2.0 or later to run PAGE !'
  289.     DB    '$'
  290. ;
  291. MESSG4:
  292.     if    REVERSE
  293.     DB    ESC,'G4'
  294.     endif
  295.     DB    ' End of Input File Reached '
  296.     if    REVERSE
  297.     DB    ESC,'G0'
  298.     endif
  299.     DB    '$'
  300. ;
  301. STACK:
  302.     DS    40
  303. STAKTOP    EQU    $
  304. ;
  305.     END    START
  306.