home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug040.ark / VDMSAVE.ASM < prev   
Encoding:
Assembly Source File  |  1984-04-29  |  2.9 KB  |  184 lines

  1. ;VDMSAVE.ASM 10/25/79 BY WARD CHRISTENSEN
  2. ;
  3. ;Write an image of the current VDM screen to disk.
  4. ;Scans for end of lines, puts in CR/LF where appropriate.
  5. ;
  6. ;    VDMSAVE fn.ft
  7. ;
  8. ;DEPENDENCIES:
  9. ;    Written for a VDM screen using a scroll routine
  10. ;which does not do hardware scrolling.  Therefore, the first
  11. ;line written is the lowest memory address line of the VDM.
  12. ;May work for other contiguous memory mapped displays.
  13. ;
  14. ;
  15. LINES    EQU    16      ;<----CHANGE
  16. COLUMNS    EQU    64      ;<----THESE
  17. ADDRESS    EQU    0CC00H     ;<----EQUATES
  18. ;
  19.     ORG    100H
  20. ;
  21. ;INIT LOCAL STACK
  22. ;
  23.     LXI    H,0
  24.     DAD    SP
  25.     SHLD    STACK
  26.     LXI    SP,STACK
  27. ;
  28. ;START OF PROGRAM EXECUTION
  29. ;
  30.     CALL    MAKEFIL    ;MAKE THE FILE
  31. LINE    CALL    TESTL    ;TEST THE LINE
  32.     CNZ    WRLINE    ;WRITE NON-BLANK LINE
  33.     CALL    WRCRLF
  34.     CALL    NEXTL    ;MORE?
  35.     JNZ    LINE    ;YES.
  36.     CALL    WREOF    ;NO, END
  37.     CALL    ERXIT    ;ALL DONE
  38.     DB    '++DONE++$'
  39. ;
  40. ;---------------- SUBROUTINES ----------------
  41. ;
  42. ;---->    ERASE, THEN MAKE, THE FILE
  43. ;
  44. MAKEFIL    LXI    D,FCB
  45.     MVI    C,ERASE    ;<--
  46.     CALL    BDOS
  47.     LXI    D,FCB
  48.     MVI    C,MAKE    ;<--
  49.     CALL    BDOS
  50.     INR    A
  51.     RNZ
  52.     CALL    ERXIT
  53.     DB    '++MAKE FAILED++$'
  54. ;
  55. ;---->    TEST A LINE.
  56. ;    RETURNS ZERO IF LINE IS BLANK
  57. ;    DE POINTS TO LAST NON BLANK CHAR.
  58. ;
  59. TESTL    LHLD    LINEPTR
  60.     LXI    D,0
  61.     MVI    B,COLUMNS ;LINE LENGTH
  62. TESTLP    MOV    A,M    ;GET CHAR
  63.     ANI    7FH    ;DELETE CURSOR
  64.     CPI    ' '
  65.     JZ    TESTB
  66.     MOV    D,H    ;SAVE POSITION IN DE
  67.     MOV    E,L    
  68. TESTB    INX    H
  69.     DCR    B
  70.     JNZ    TESTLP
  71. ;SET ZERO BASED ON HAVING FOUND A CHAR
  72.     MOV    A,D
  73.     ORA    E
  74.     RET
  75. ;
  76. ;---->    WRITE A LINE (BUT NOT C/R L/F)
  77. ;
  78. WRLINE    INX    D    ;FACILITATE TESTING
  79.     LHLD    LINEPTR
  80. WRLP    MOV    A,M
  81.     INX    H
  82.     ANI    7FH    ;DELETE CURSOR BIT
  83.     CALL    WRBYTE
  84.     MOV    A,L
  85.     CMP    E
  86.     JNZ    WRLP
  87.     MOV    A,H
  88.     CMP    D
  89.     JNZ    WRLP
  90.     RET
  91. ;
  92. ;---->    WRITE A CR/LF TO THE FILE
  93. ;
  94. WRCRLF    MVI    A,0DH
  95.     CALL    WRBYTE
  96.     MVI    A,0AH
  97.     CALL    WRBYTE
  98.     RET
  99. ;
  100. ;---->    POINT TO NEXT LINE, RETURN ZERO
  101. ;    IF END OF SCREEN
  102. ;
  103. NEXTL    LHLD    LINEPTR
  104.     LXI    D,COLUMNS
  105.     DAD    D
  106.     SHLD    LINEPTR
  107.     LDA    NLINES
  108.     DCR    A
  109.     STA    NLINES    ;ZERO SET..
  110.     RET        ;..IF DONE
  111. ;
  112. ;---->    WRITE CTL-Z TO THE FILE, CLOSE IT
  113. ;
  114. WREOF    MVI    A,1AH
  115.     CALL    WRBYTE
  116.     LDA    BUFPTR    ;FULL SECTOR?
  117.     CPI    80H
  118.     JNZ    WREOF
  119.     LXI    D,FCB
  120.     MVI    C,CLOSE
  121.     CALL    BDOS
  122.     INR    A
  123.     RNZ
  124.     CALL    ERXIT
  125.     DB    '++CLOSE ERROR++$'
  126. ;
  127. ;---->    WRITE A BYTE TO THE FILE
  128. ;
  129. WRBYTE    PUSH    H
  130.     LHLD    BUFPTR
  131.     MOV    M,A
  132.     INR    L    ;AT 100?
  133.     JNZ    NOWRITE
  134. ;
  135. ;HAVE TO WRITE A SECTOR
  136. ;
  137.     PUSH    B
  138.     PUSH    D
  139.     LXI    D,FCB
  140.     MVI    C,WRITE
  141.     CALL    BDOS
  142.     ORA    A
  143.     JNZ    WRERR
  144.     POP    D
  145.     POP    B
  146.     LXI    H,80H
  147. NOWRITE    SHLD    BUFPTR
  148.     POP    H
  149.     RET
  150. ;
  151. WRERR    CALL    ERXIT
  152.     DB    '++WRITE ERROR++$'
  153. ;
  154. ;FOLLOWING FROM 'EQU8.LIB'---->
  155. ;
  156. ;EXIT WITH ERROR MESSAGE
  157. ;MSGEXIT    EQU    $    
  158. ;EXIT W/"INFORMATIONAL" MSG
  159. ERXIT    POP    D    ;GET MSG
  160.     MVI    C,PRINT
  161.     CALL    BDOS
  162. ;
  163. ;EXIT, RESTORING STACK AND RETURN
  164. ;
  165. EXIT    LHLD    STACK
  166.     SPHL
  167.     RET        ;TO CCP;
  168. LINEPTR    DW    ADDRESS
  169. NLINES    DB    LINES
  170. BUFPTR    DW    80H
  171. ;
  172.     DS    100    ;STACK AREA
  173. STACK    DS    2
  174. ;
  175. ;BDOS/CBIOS EQUATES (VERSION 8)    
  176. ;
  177. PRINT    EQU    9
  178. CLOSE    EQU    16
  179. ERASE    EQU    19
  180. WRITE    EQU    21
  181. MAKE    EQU    22
  182. BDOS    EQU    5
  183. FCB    EQU    5CH
  184.