home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / xbase / library / clipper / rettig / source / bitstrip.asm < prev    next >
Assembly Source File  |  1990-10-21  |  6KB  |  287 lines

  1. ; Utility: BITSTRIP
  2. ;
  3. ; by Ralph Davis
  4. ;
  5. ; Placed in the public domain by Tom Rettig Associates, 10/22/1990.
  6. ;
  7.  
  8. ;***********************************************
  9. CODESEG SEGMENT BYTE PUBLIC 
  10.         ASSUME  CS:CODESEG,DS:CODESEG,ES:CODESEG
  11. ;
  12. ;----------------------------------------------
  13. STRIP PROC FAR
  14. ORG   100H
  15. START:       JMP  ENTER
  16. KEY_BUFF     DB   80,?
  17. ASCIIZ       DB   80 DUP (?)
  18. FILE_BUFF    DB   20000 DUP (?)
  19. BYTES_READ   DW   ?
  20. BAD_DOS      DB   'INCORRECT DOS VERSION - MUST BE 2.0 OR GREATER'
  21.              DB   0DH,0AH,'$'
  22. ERRMSG1      DB   'FILE NOT FOUND',0DH,0AH,'$'
  23. ERRMSG2      DB   'ACCESS DENIED',0DH,0AH,'$'
  24. ERRMSG3      DB   'READ ACCESS TO REQUESTED FILE NOT PERMITTED'
  25.              DB   0DH,0AH,'$'
  26. ERRMSG4      DB   'INVALID FILE HANDLE',0DH,0AH,'$'
  27. ERRMSG5      DB   'PATH NOT FOUND',0DH,0AH,'$'
  28. ERRMSG6      DB   'TOO MANY FILES ARE OPEN',0DH,0AH,'$'
  29. ERRMSG7      DB   'WRITE TO SPECIFIED FILE NOT PERMITTED'
  30.              DB   0DH,0AH,'$'
  31. FILEMSG      DB   'PLEASE ENTER DRIVE, PATH, AND FILENAME:  ','$'
  32. ;
  33. ENTER:  
  34.    PUSH   AX
  35.    PUSH   BX
  36.    PUSH   CX
  37.    PUSH   DX
  38.    PUSH   SI
  39.    PUSH   DI
  40.    MOV    AX,CS
  41.    MOV    DS,AX
  42.    MOV    ES,AX
  43.    CLC
  44.    CALL   CHECK_DOS
  45.    JNC    DOS_OK
  46.    MOV    DX,OFFSET BAD_DOS
  47.    CALL   PRINTMESS
  48.    JMP    EXIT
  49. DOS_OK:
  50.    MOV    SI,80H
  51.    MOV    DI,OFFSET ASCIIZ
  52.    XOR    CX,CX
  53.    MOV    CL,[SI]
  54.    CMP    CL,0
  55.    JNZ    YES_FILE
  56.    MOV    DX,OFFSET FILEMSG
  57.    CALL   PRINTMESS
  58.    MOV    DX,OFFSET KEY_BUFF
  59.    MOV    AH,0AH
  60.    INT    21H
  61.    CALL   CRLF
  62.    INC    DX
  63.    MOV    BX,DX
  64.    ADD    DL,BYTE PTR [BX]
  65.    ADC    DX,0
  66.    INC    DX
  67.    MOV    BX,DX
  68.    MOV    BYTE PTR [BX],0
  69.    JMP    PROCESS_FILE
  70. YES_FILE:
  71.    DEC    CL
  72.    ADD    SI,2
  73.    CLD
  74.    REP   MOVSB
  75.    MOV   BYTE PTR [DI],0
  76. PROCESS_FILE:
  77.    CLC
  78.    MOV   AL,2
  79.    CALL  OPEN_FILE
  80.    MOV   BX,AX
  81.     JC   EXIT
  82. READIT: 
  83.    CLC
  84.    CALL  READ_FILE
  85.    JC    EXIT
  86.    CLC
  87.    CALL  STRIP_BITS
  88.    CLC
  89.    MOV   AL,1        ; Seek to beginning of block read
  90.    MOV   DX,BYTES_READ
  91.    NEG   DX          ; Make negative for negative offset
  92.    XOR   CX,CX
  93.    DEC   CX
  94.    CALL  FILESEEK
  95.    JC    EXIT
  96.    CLC
  97.    CALL  WRITE_FILE
  98.    JC    EXIT
  99.    CMP   BYTES_READ,20000
  100.    JNE   EXIT             ; No more left to read
  101.    JMP   READIT
  102. EXIT:
  103.    CALL  CLOSE_FILE
  104.    POP   DI
  105.    POP   SI
  106.    POP   DX
  107.    POP   CX
  108.    POP   BX
  109.    POP   AX
  110.    INT   20H
  111. STRIP    ENDP
  112. ;-------------------------------------------
  113. CHECK_DOS PROC NEAR
  114.    PUSH  AX
  115.    MOV   AH,30H
  116.    INT   21H
  117.    CMP   AL,2
  118.    POP   AX
  119.    RET
  120. CHECK_DOS ENDP
  121. ;--------------------------------------------
  122. OPEN_FILE PROC   NEAR
  123.    PUSH  DX
  124.    MOV   AH,3DH
  125.    MOV   DX,OFFSET ASCIIZ
  126.    INT   21H
  127.    JNC   LEAVE
  128.    CMP   AL,2
  129.    JNZ   CHECK_PATH
  130.    MOV   DX,OFFSET ERRMSG1
  131.    CALL  PRINTMESS
  132.    STC
  133.    JMP   LEAVE
  134. CHECK_PATH:
  135.    CMP   AL,3
  136.    JNZ   CHECK_FILES
  137.    MOV   DX,OFFSET ERRMSG5
  138.    CALL  PRINTMESS
  139.    STC
  140.    JMP   LEAVE
  141. CHECK_FILES:
  142.    CMP   AL,4
  143.    JNZ   ACCESS_ERR
  144.    MOV   DX,OFFSET ERRMSG6
  145.    CALL  PRINTMESS
  146.    STC
  147.    JMP   LEAVE
  148. ACCESS_ERR:
  149.    CMP   AL,5
  150.    JNZ   BAD_CODE
  151.    MOV   DX,OFFSET ERRMSG2
  152.    CALL  PRINTMESS
  153.    STC
  154.    JMP   LEAVE
  155. BAD_CODE:
  156.    MOV   DX,OFFSET ERRMSG3
  157.    CALL  PRINTMESS
  158.    STC
  159. LEAVE: 
  160.    POP   DX
  161.    RET
  162. OPEN_FILE ENDP
  163. ;-----------------------------------------
  164. READ_FILE PROC   NEAR
  165.    PUSH  AX
  166.    PUSH  CX
  167.    PUSH  DX
  168.    MOV   CX,SIZE FILE_BUFF
  169.    MOV   DX,OFFSET FILE_BUFF
  170.    MOV   AH,3FH
  171.    INT   21H
  172.    JNC   GOOD_READ
  173.    CMP   AL,5
  174.    JNZ   BAD_HANDLE
  175.    MOV   DX,OFFSET ERRMSG3
  176.    CALL  PRINTMESS
  177.    STC
  178.    JMP   LEAVE_READ
  179. BAD_HANDLE:
  180.    MOV   DX,OFFSET ERRMSG4
  181.    CALL  PRINTMESS
  182.    STC
  183.    JMP   LEAVE_READ
  184. GOOD_READ:
  185.    MOV   BYTES_READ,AX
  186. LEAVE_READ:
  187.    POP   DX
  188.    POP   CX
  189.    POP   AX
  190.    RET
  191. READ_FILE ENDP
  192. ;-------------------------------------------
  193. CLOSE_FILE PROC   NEAR
  194.    PUSH  AX
  195.    PUSH  DX
  196.    MOV   AH,3EH
  197.    INT   21H
  198.    JNC   LEAVE_CLOSE
  199.    MOV   DX,OFFSET ERRMSG4
  200.    CALL  PRINTMESS
  201.    STC
  202. LEAVE_CLOSE:
  203.    POP   DX
  204.    POP   AX
  205.    RET
  206. CLOSE_FILE ENDP
  207. ;-------------------------------------------
  208. STRIP_BITS PROC NEAR
  209.    PUSH   CX
  210.    PUSH   BX
  211.    MOV    BX,OFFSET FILE_BUFF
  212.    MOV    CX,BYTES_READ
  213. STRIPPER:
  214.    AND    BYTE PTR [BX],7FH
  215.    INC    BX
  216.    LOOP   STRIPPER
  217.    POP    BX
  218.    POP    CX
  219.    RET
  220. STRIP_BITS ENDP
  221. ;-------------------------------------------
  222. WRITE_FILE PROC   NEAR
  223.    PUSH   AX
  224.    PUSH   CX
  225.    PUSH   DX
  226.    MOV    AH,40H
  227.    MOV    DX,OFFSET FILE_BUFF
  228.    MOV    CX,BYTES_READ
  229.    INT    21H
  230.    JNC    LEAVE_WRITE
  231.    CMP    AL,5
  232.    JNZ    HANDLE_BAD
  233.    MOV    DX,OFFSET ERRMSG7
  234.    CALL   PRINTMESS
  235.    STC
  236.    JMP    LEAVE_WRITE
  237. HANDLE_BAD:
  238.    MOV    DX,OFFSET ERRMSG4
  239.    CALL   PRINTMESS
  240.    STC
  241. LEAVE_WRITE:
  242.    POP    DX
  243.    POP    CX
  244.    POP    AX
  245.    RET
  246. WRITE_FILE ENDP
  247. ;-------------------------------------------
  248. FILESEEK PROC NEAR
  249.  
  250. ; Expects file handle in BX, seek mode in AL
  251. ;    0 -- from beginning of file
  252. ;    1 -- from current offset
  253. ;    2 -- from end-of-file
  254. ; CX:DX offset to move file pointer
  255.  
  256. ; Returns new offset in DX:AX
  257.    MOV    AH,42H
  258.    INT    21H
  259.    RET
  260. FILESEEK ENDP
  261. ;------------------------------------------------------
  262. PRINTMESS PROC NEAR
  263.    PUSH   AX
  264.    MOV    AH,9
  265.    INT    21H
  266.    POP    AX
  267.    RET
  268. PRINTMESS ENDP
  269. ;------------------------------------------
  270. CRLF PROC NEAR
  271.    PUSH   AX
  272.    PUSH   DX
  273.    MOV    DL,0DH
  274.    MOV    AH,2
  275.    INT    21H
  276.    MOV    DL,0AH
  277.    MOV    AH,2
  278.    INT    21H
  279.    POP    DX
  280.    POP    AX
  281.    RET
  282. CRLF ENDP
  283. ;------------------------------------------
  284. CODESEG ENDS
  285. ;********************************************
  286.    END START
  287.