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

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