home *** CD-ROM | disk | FTP | other *** search
/ Software Du Jour / SoftwareDuJour.iso / BUSINESS / DBASE / DBAPG.ARC / FIX-DOS.ASM < prev    next >
Assembly Source File  |  1984-08-12  |  6KB  |  278 lines

  1. ; Subroutine.: FIX.ASM
  2. ; Author.....: Bob Doolittle
  3. ; Date.......: 08/12/84
  4. ; Notice.....: Copyright 1984, Ashton-Tate, All Rights Reserved.
  5. ; Notes......: PC/MS-DOS version.
  6. ;
  7. M    EQU    Byte Ptr 0[BX]
  8. ;
  9. CSEG    SEGMENT
  10.     ASSUME    CS:CSEG,DS:CSEG
  11.  
  12.     ORG    100H
  13. ;
  14. ;BDOS equates
  15. ;
  16. BDOS    EQU    21H            ;BDOS entry point
  17. TBUF    EQU    80H            ;Default buffer
  18. FCB    EQU    5CH            ;Default FCB
  19. CFS    EQU    35            ;Compute file size
  20. CONIN    EQU    1            ;Console in
  21. CONOUT    EQU    2            ;Console out
  22. PSTR    EQU    9            ;Print string
  23. STRIN    EQU    10            ;String input function
  24. OPEN    EQU    15            ;Open file
  25. CLOSE    EQU    16            ;Close file
  26. READ    EQU    20            ;Read sequential
  27. WRITE    EQU    21            ;Write sequential
  28. MAKE    EQU    22            ;Make file
  29. DELETE    EQU    19            ;Delete file
  30. READR    EQU    33            ;Read random
  31. ;
  32. ;ASCII equates
  33. ;
  34. CR    EQU    13
  35. LF    EQU    10
  36. ;
  37. START:    MOV    Byte Ptr FLG,0        ;Initialize CRLF flag to destroy CRLF
  38.     MOV    BX,FCB+1
  39.     MOV    AL,Byte Ptr [BX]
  40.     CMP    AL,20H            ;Was input file on command line
  41.     JNZ    ST2            ;Yes
  42.     MOV    DX,(Offset MES1)    ;No, print message and abort
  43.     MOV    AH,PSTR
  44.     INT    BDOS
  45.     JMP    EXIT
  46. ;
  47. ST2:    MOV    DX,(Offset MES4)    ;Print CRLF message
  48.     MOV    AH,PSTR
  49.     INT    BDOS
  50.     MOV    AH,CONIN        ;Get response
  51.     INT    BDOS
  52.     AND    AL,5FH            ;Make upper case
  53.     CMP    AL,'Y'
  54.     JNZ    ST7
  55.     MOV    AL,1
  56.     MOV    Byte Ptr FLG,AL
  57. ST7:    MOV    AH,PSTR            ;Ask for # of bytes
  58.     MOV    DX,(Offset MES6)
  59.     INT    BDOS
  60.     MOV    DX,(Offset CBUF)    ;Get response
  61.     MOV    AH,STRIN
  62.     INT    BDOS
  63.     MOV    BX,(Offset CBUF)+2
  64.     CALL    CONV            ;Convert to binary in HL
  65.     CALL    DIV            ;Divide by 128
  66.     MOV    Word Ptr QUO,BX        ;Save quotient and remainder
  67.     CALL    CRLF
  68.     CALL    CLEAR            ;Clear FCB+32-35, FCB+15 and FCB+12
  69.     MOV    BX,FCB
  70.     MOV    DX,(Offset FCB1)
  71.     MOV    CL,9
  72. MOVE:    MOV    AL,M            ;Move file name and drive from FCB to FCB1
  73.     MOV    SI,DX
  74.     MOV    [SI],AL
  75.     INC    BX
  76.     INC    DX
  77.     DEC    CL
  78.     JNZ    MOVE
  79.     MOV    DX,FCB
  80.     MOV    AH,OPEN            ;Open file
  81.     INT    BDOS
  82.     INC    AL            ;Was open successful?
  83.     JNZ    ST3            ;Yes
  84.     MOV    DX,(Offset MES2)    ;No, print message and abort
  85.     MOV    AH,PSTR
  86.     INT    BDOS
  87.     JMP    EXIT
  88. ST3:    MOV    DX,(Offset MES5)    ;Working message
  89.     MOV    AH,PSTR
  90.     INT    BDOS
  91.     MOV    DX,FCB
  92.     MOV    AH,CFS            ;Compute file size
  93.     INT    BDOS
  94.     MOV    BX,FCB+33
  95.     MOV    AX,Word Ptr [BX]
  96.     MOV    REC,AX
  97.     DEC    Word Ptr [BX]
  98.     MOV    AH,READR
  99.     MOV    DX,FCB
  100.     INT    BDOS            ;Read last record
  101.     MOV    BX,TBUF-1
  102.     MOV    CL,0            ;Initialize counter
  103. LOP:    INC    BX            ;Scan to 1st EOF mark and keep count
  104.     INC    CL
  105.     CMP    M,1AH            ;Is it EOF?
  106.     JNZ    LOP            ;No, keep looping
  107.     PUSH    CX            ;Save count to EOF in last record
  108.     CALL    CLEAR            ;Clear again
  109.     MOV    DX,(Offset FCB1)
  110.     MOV    AH,DELETE        ;Delete any possible previous out file
  111.     INT    BDOS
  112.     MOV    DX,FCB
  113.     MOV    AH,OPEN            ;Re-open the input file
  114.     INT    BDOS
  115.     MOV    DX,(Offset FCB1)
  116.     MOV    AH,MAKE            ;Make output file
  117.     INT    BDOS
  118. ;
  119. FIRS:    MOV    DX,FCB            ;Scan off quotient records
  120.     MOV    AH,READ
  121.     INT    BDOS
  122.     OR    AL,AL
  123.     JZ    FST1            ;Read OK
  124.     MOV    DX,(Offset MES3)
  125.     MOV    AH,PSTR
  126.     INT    BDOS
  127.     POP    CX            ;Balance stack
  128.     JMP    EXIT
  129. ;
  130. FST1:    MOV    BX,Word Ptr REC        ;Bump record count down
  131.     DEC    BX
  132.     MOV    Word Ptr REC,BX
  133.     MOV    BX,Word Ptr QUO        ;Get DIV result
  134.     OR    BH,BH            ;Have we read sector with remainder ?
  135.     JZ    FST2            ;Yes
  136.     DEC    BH            ;No
  137.     MOV    Word Ptr QUO,BX
  138.     MOV    DX,(Offset FCB1)    ;Write sector
  139.     MOV    AH,WRITE
  140.     INT    BDOS
  141.     JMP    SHORT FIRS
  142. FST2:    ADD    BL,80H            ;BX now has filter start address
  143. FST3:    CALL    FILTER
  144.     INC    BX
  145.     OR    BH,BH
  146.     JZ    FST3            ;Filter to end of sector
  147.     MOV    DX,(Offset FCB1)
  148.     MOV    AH,WRITE        ;Write to output file
  149.     INT    BDOS
  150. LOOP:    MOV    DX,FCB
  151.     MOV    AH,READ            ;Read a record to default buffer
  152.     INT    BDOS
  153.     OR    AL,AL            ;Was read successful?
  154.     JZ    LO4            ;Yes
  155. ERR:    MOV    DX,(Offset MES3)
  156.     MOV    AH,PSTR            ;No, print message and abort
  157.     INT    BDOS
  158.     POP    CX            ;Balance stack
  159.     JMP    SHORT EXIT
  160. ;
  161. LO4:    DEC    Word Ptr REC        ;Decrement record count
  162.     JNZ    GOAH            ;Not at last record
  163.     POP    CX            ;Get back count
  164.     MOV    BX,TBUF
  165. ;
  166. LO1:    DEC    CL            ;Are we at EOF
  167.     JZ    LO2            ;Yes
  168.     CALL    FILTER
  169.     INC    BX
  170.     JMP    SHORT LO1            ;Loop
  171. ;
  172. LO2:    MOV    DX,(Offset FCB1)
  173.     MOV    AH,WRITE        ;Write last record
  174.     INT    BDOS
  175.     MOV    DX,(Offset FCB1)
  176.     MOV    AH,CLOSE        ;Close output file
  177.     INT    BDOS
  178. EXIT:    MOV    AH,0            ;Finished
  179.     INT    BDOS
  180. ;
  181. GOAH:    MOV    BX,TBUF
  182.     MOV    CX,80H            ;Initialize record count
  183. GO1:    CALL    FILTER            ;Scan the record
  184.     INC    BX
  185.     LOOP    GO1
  186.     MOV    DX,(Offset FCB1)
  187.     MOV    AH,WRITE        ;Write record to output file
  188.     INT    BDOS
  189.     JMP    SHORT LOOP            ;Loop to read next record
  190. ;
  191. FILTER:    AND    M,7FH            ;Strip bit 7
  192.     CMP    M,20H            ;Is it < space ?
  193.     JNAE    L_1    
  194.     RET                ;No
  195. L_1:    TEST    Byte Ptr FLG,0FFH    ;Are we killing CRLF ?
  196.     JZ    FIL1            ;Yes
  197.     MOV    AL,M
  198.     CMP    AL,CR
  199.     JNZ    L_2    
  200.     RET                ;Don't change
  201. L_2:    CMP    AL,LF
  202.     JNZ    FIL1
  203.     RET                ;Don't change
  204. FIL1:    MOV    M,20H            ;Replace anything < space by space
  205.     RET
  206. ;
  207. CONV:    MOV    DX,0            ;Convert # pointed to by HL to binary in HL
  208.     XCHG    BX,DX            ;Conversion stops when # < '0' is found
  209.     MOV    SI,DX            ;Result returned in BX
  210.     MOV    AH,0
  211. CONV1:    MOV    AL,[SI]
  212.     SUB    AL,'0'
  213.     JNS    L_4
  214.     RET
  215. L_4:    CMP    AL,10
  216.     CMC
  217.     JNB    L_5
  218.     RET
  219. L_5:    INC    SI
  220.     SHL    BX,1
  221.     MOV    CX,BX
  222.     SHL    BX,1
  223.     SHL    BX,1
  224.     ADD    BX,CX
  225.     ADD    BX,AX
  226.     JMP    SHORT CONV1
  227. ;
  228. DIV:    MOV    AX,BX            ;Divide BX by 128
  229.     MOV    CL,128
  230.     DIV    CL
  231.     MOV    BH,AL            ;Quotient in BH, remainder in BL
  232.     MOV    BL,AH
  233.     RET
  234. ;
  235. CLEAR:    XOR    AL,AL            ;Zero key fields in FCB
  236.     MOV    BX,FCB+32
  237.     MOV    M,AL
  238.     INC    BX
  239.     MOV    M,AL
  240.     INC    BX
  241.     MOV    M,AL
  242.     INC    BX
  243.     MOV    M,AL
  244.     MOV    BX,FCB+15
  245.     MOV    Byte Ptr [BX],AL
  246.     MOV    BX,FCB+12
  247.     MOV    Byte Ptr [BX],AL
  248.     RET
  249. ;
  250. CRLF:    MOV    DL,CR
  251.     MOV    AH,CONOUT
  252.     INT    BDOS
  253.     MOV    DL,LF
  254.     MOV    AH,CONOUT
  255.     INT    BDOS
  256.     RET
  257. MES1    DB    CR,LF,'    USAGE: FIX [d:]<filename.typ>'
  258.     DB    CR,LF,'where d is an optional drive designator'
  259.     DB    CR,LF,'and filename.typ is the file name and type'
  260.     DB    CR,LF,'of the file to be processed. The output'
  261.     DB    CR,LF,'file will be named filename.FIX.$'
  262. MES2    DB    CR,LF,'Cannot find file on specified drive.$'
  263. MES3    DB    CR,LF,'Read past EOF.$'
  264. MES4    DB    CR,LF,'Do you want to preserve CRLFs (Y or N) ? $'
  265. MES5    DB    CR,LF,'Working...$'
  266. MES6    DB    CR,LF,'What is the size of the header (in bytes)? $'
  267. CBUF    DB    10,0
  268.     DB    0,0,0,0,0,0,0,0,0,0,0,0
  269. REC    DW    0            ;Storage for record count
  270. QUO    DW    0            ;Storage for quotient and remainder
  271. FLG    DB    0            ;CRLF flag
  272. FCB1    DB    0,'        FIX'
  273.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  274.  
  275. CSEG    ENDS
  276.     END    START
  277.  
  278.