home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol007 / texclean.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  4.2 KB  |  242 lines

  1. ;
  2. ;TEXCLEAN.ASM ver 1.0 by Keith Petersen, W8SDZ
  3. ;
  4. ;This program cleans up CP/M files which where
  5. ;created with a text processor that sets bit 7
  6. ;of some characters.
  7. ;
  8. month    equ    5    ;last..
  9. day    equ    22    ;..modification..
  10. year    equ    80    ;..date
  11. ;
  12. ;Clean-up is done in place, i.e. the file is
  13. ;modified on top of itself.  Each sector is read
  14. ;into memory and the characters are all ani'ed with
  15. ;7FH to set bit 7 low, and then the same sector is
  16. ;written back to the disk.
  17. ;
  18. ;Command format:
  19. ;
  20. ;    TEXCLEAN FILENAME.TYPE
  21. ;
  22. ;This program is adapted from Ward Christensen's
  23. ;SCRAMBLE.ASM.
  24. ;
  25. MF    SET    0    ;SHOW MOVE NOT REQUESTED
  26. CF    SET    0    ;SHOW COMP NOT REQUESTED
  27. ;
  28. ;(FROM EQU8.LIB...)
  29. ;DEFINE SOME MACROS TO MAKE THINGS EASIER
  30. ;
  31. ;DEFINE DATA MOVE MACRO: MOVE from,to,length
  32. ;    from may be addr, or quoted string
  33. ;
  34. MOVE    MACRO    ?F,?T,?L
  35.     IF    NOT NUL ?F
  36.     IRPC    ?C,?F
  37. ?Q    SET    '&?C&?C' ;;TEST FOR QUOTE
  38.     EXITM
  39.     ENDM
  40.     IF    ?Q EQ ''''
  41.     LOCAL    ?B,?Z
  42.     CALL    ?Z
  43. ?B    DB    ?F
  44. ?Z    POP    H    ;GET FROM
  45.     LXI    B,?Z-?B    ;GET LEN
  46.     ELSE
  47.     LXI    H,?F
  48.     ENDIF
  49.     ENDIF
  50.     IF    NOT NUL ?T
  51.     LXI    D,?T
  52.     ENDIF
  53.     IF    NOT NUL ?L
  54.     LXI    B,?L
  55.     ENDIF
  56.     CALL    MOVER
  57. MF    SET    -1    ;;SHOW EXPANSION
  58.     ENDM
  59. ;
  60. ;DEFINE CP/M MACRO - CPM FNC,PARM
  61. ;
  62. CPM    MACRO    ?F,?P
  63.     PUSH    B
  64.     PUSH    D
  65.     PUSH    H
  66.     IF    NOT NUL ?F
  67.     MVI    C,?F
  68.     ENDIF
  69.     IF    NOT NUL ?P
  70.     LXI    D,?P
  71.     ENDIF
  72.     CALL    BDOS
  73.     POP    H
  74.     POP    D
  75.     POP    B
  76.     ENDM
  77. ;
  78.     ORG    100H
  79. ;
  80. ;INIT LOCAL STACK
  81. ;
  82.     LXI    H,0
  83.     DAD    SP
  84.     SHLD    STACK
  85.     LXI    SP,STACK
  86. ;
  87. ;SIGN ON
  88. ;
  89.     CALL    START
  90.     DB    'TEXCLEAN.COM as of '
  91.     DB    '0'+MONTH/10
  92.     DB    '0'+MONTH MOD 10,'/'
  93.     DB    '0'+DAY/10
  94.     DB    '0'+DAY MOD 10,'/'
  95.     DB    '0'+YEAR/10
  96.     DB    '0'+YEAR MOD 10
  97.     DB    0DH,0AH,'$'
  98. START    POP    D    ;GET ID
  99.     MVI    C,PRINT
  100.     CALL    BDOS    ;PRINT ID
  101. ;
  102. ;SEE THAT THE INPUT FILE EXISTS
  103. ;
  104.     CPM    OPEN,FCB
  105.     INR    A    ;OK?
  106.     JNZ    READFLP    ;YES, CLEAN IT
  107.     CALL    ERXIT
  108.     DB    '++NO SUCH FILE++$'
  109. ;
  110. ;READ THE FILE, RESET BIT 7 OF ALL CHARACTERS IN
  111. ;A SECTOR, RE-WRITE IT.
  112. ;
  113. READFLP    CALL    RDSECT    ;READ A SECTOR
  114.     JC    FINISH    ;EXIT LOOP IF EOF
  115.     CALL    FIXIT    ;GET RID OF ALL BIT 7'S
  116.     CALL    BACKUP    ;RE-POSITION FOR WRITE
  117.     CALL    WRSECT    ;RE-WRITE THE SECTOR
  118.     JMP    READFLP    ;LOOP UNTIL EOF
  119. ;
  120. ;ALL DONE - ON A "NORMAL" CP/M SYSTEM, WE WOULDN'T
  121. ;HAVE TO DO ANYTHING, BECAUSE WE RE-WROTE IN PLACE.
  122. ;
  123. ;HOWEVER, FOR SUCH SYSTEMS AS THE NORTHSTAR CP/M,
  124. ;WE MUST EXPLICITLY CLOSE THE FILE, BECAUSE THE WRITE
  125. ;TO THE DIRECTORY WILL CAUSE THE CLEVER LIFEBOAT-
  126. ;DESIGNED BIOS TO FLUSH IT'S MEMORY-RESIDENT DISK
  127. ;BUFFERS
  128. ;
  129. FINISH    CPM    CLOSE,FCB
  130.     INR    A    ;THIS BETTER WORK..
  131.     JNZ    EXIT
  132.     DB    '++ CLOSE ERROR - FILE LEFT IN '
  133.     DB    'UNKNOWN CONDITION ++$'
  134. ;
  135. ;SECTOR READ ROUTINE
  136. ;
  137. RDSECT    CPM    READ,FCB
  138.     ORA    A
  139.     RZ        ;ALL OK
  140. ;
  141. ;READ ERROR OR EOF
  142. ;
  143.     CPI    1    ;EOF?
  144.     STC        ;CARRY SHOWS EOF
  145.     RZ        ;RET, CARRY SET
  146.     CALL    ERXIT
  147.     DB    '++ READ ERROR - FILE MAY BE '
  148.     DB    'DESTROYED ++$'
  149. ;
  150. ;FIX THE SECTOR
  151. ;
  152. FIXIT    LXI    H,80H    ;POINT TO SECTOR
  153. FIXLP    MOV    A,M    ;GET CHARACTER
  154.     ANI    7FH    ;STRIP BIT 7
  155.     MOV    M,A    ;RESTORE IT TO MEMORY
  156.     INR    L    ;MORE IN SECTOR?
  157.     JNZ    FIXLP
  158.     RET
  159. ;
  160. ;BACKUP THE FILE POINTER FOR THE RE-WRITE
  161. ;
  162. BACKUP    LDA    FCBRNO    ;GET SECTOR #
  163.     DCR    A    ;BACK UP
  164.     STA    FCBRNO
  165.     RP        ;RETURN IF OK
  166. ;
  167. ;WE BACKED UP INTO PREVIOUS EXTENT, WILL HAVE
  168. ;TO RE-OPEN IT
  169. ;
  170.     LDA    FCBEXT    ;GET EXTENT
  171.     DCR    A    ;BACK UP 1
  172.     STA    FCBEXT
  173.     CPM    OPEN,FCB ;RE-OPEN
  174.     INR    A
  175.     JNZ    OPEN2OK
  176.     CALL    ERXIT
  177.     DB    '++ RE-OPENING EXTENT FAILED',0DH,0AH
  178.     DB    '++ FILE IS CLOBBERED $'
  179. OPEN2OK    MVI    A,7FH    ;GET HI SECTOR
  180.     STA    FCBRNO
  181.     RET
  182. ;
  183. ;WRITE BACK THE SECTOR
  184. ;
  185. WRSECT    XRA    A
  186.     STA    FCB+14    ;RESET S-2 BYTE IN FCB
  187.     CPM    WRITE,FCB
  188.     ORA    A
  189.     RZ
  190.     CALL    ERXIT
  191.     DB    '++ WRITE ERROR - FILE CLOBBERED ++$'
  192. ;
  193. ;FOLLOWING FROM 'EQU7.LIB'---->
  194. ;
  195. ;MOVE SUBROUTINES
  196. ;
  197.     IF    MF    ;MACRO EXPANSION FLAG SET?
  198. MOVER    MOV    A,M
  199.     STAX    D
  200.     INX    H
  201.     INX    D
  202.     DCX    B
  203.     MOV    A,B
  204.     ORA    C
  205.     JNZ    MOVER
  206.     RET
  207.     ENDIF
  208. ;
  209. ;EXIT WITH ERROR MESSAGE
  210. MSGEXIT    EQU    $    ;EXIT W/"INFORMATIONAL" MSG
  211. ERXIT    POP    D    ;GET MSG
  212.     MVI    C,PRINT
  213.     CALL    BDOS
  214. ;EXIT, RESTORING STACK AND RETURN
  215. EXIT    LHLD    STACK
  216.     SPHL
  217.     RET        ;TO CCP
  218. ;
  219.     DS    40H    ;STACK AREA
  220. STACK    DS    2    ;OLD STACK KEPT HERE
  221. ;
  222. ;BDOS/CBIOS EQUATES (VERSION 7)    
  223. RDCON    EQU    1
  224. WRCON    EQU    2
  225. PRINT    EQU    9
  226. CONST    EQU    11
  227. OPEN    EQU    15
  228. CLOSE    EQU    16
  229. SRCHF    EQU    17
  230. SRCHN    EQU    18
  231. ERASE    EQU    19
  232. READ    EQU    20
  233. WRITE    EQU    21
  234. MAKE    EQU    22
  235. REN    EQU    23
  236. STDMA    EQU    26
  237. BDOS    EQU    5
  238. FCB    EQU    5CH 
  239. FCB2    EQU    6CH
  240. FCBEXT    EQU    FCB+12
  241. FCBRNO    EQU    FCB+32
  242.