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

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