home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / asm_kit / vs_to_vw.asm < prev    next >
Assembly Source File  |  1984-03-04  |  10KB  |  259 lines

  1.         NAME    WSTOVW
  2.         PAGE    55,132
  3.         TITLE   'WSTOVW --- FILTER WORDSTAR TEXT FILE FOR VOLKSWRITER'
  4.  
  5. ;
  6. ; WSTOVW --- CONVERT WORDSTAR DOCUMENT FILE TO VOLKSWRITER.
  7. ;
  8. ; HIGH BIT OF ALL CHARACTERS STRIPPED.
  9. ; SOFT SPACES CONVERTED TO NORMAL.
  10. ; HARD CARRIAGE RETURNS CONVERTED TO VW PARAGRAPH MARKER FOLLOWED BY CR-LF.
  11. ; SOFT CARRIAGE RETURNS TURNED INTO NORMAL CARRIAGE RETURNS.
  12. ; TABS ARE EXPANDED.
  13. ;
  14. ; VERSION 1.0    11 DEC 83
  15. ;
  16. ; COPYRIGHT (C) 1983 BY RAY DUNCAN
  17.  
  18. CR      EQU     0DH             ;ASCII CARRIAGE RETURN
  19. LF      EQU     0AH             ;ASCII LINE FEED
  20. FF      EQU     0CH             ;ASCII FORM FEED
  21. EOF     EQU     01AH            ;END OF FILE MARKER
  22. TAB     EQU     09H             ;ASCII TAB CHARACTER
  23.  
  24. COMMAND EQU     80H             ;BUFFER FOR COMMAND TAIL
  25.  
  26. BLKSIZE EQU     1024            ;BLOCKING/DEBLOCKING SIZE
  27.  
  28.  
  29. CSEG    SEGMENT PARA PUBLIC 'CODE'
  30.  
  31.         ASSUME  CS:CSEG,DS:DATA,ES:DATA,SS:STACK
  32.  
  33.  
  34. CLEAN   PROC    FAR             ;ENTRY POINT FROM PC-DOS
  35.  
  36.         PUSH    DS              ;SAVE DS:0000 FOR FINAL
  37.         XOR     AX,AX           ;RETURN TO PC-DOS
  38.         PUSH    AX
  39.         MOV     AX,DATA         ;MAKE OUR DATA SEGMENT
  40.         MOV     ES,AX           ;ADDRESSABLE VIA ES REGISTER
  41.         CALL    INFILE          ;GET PATH AND FILE SPEC.
  42.                                 ;FOR INPUT FILE
  43.         MOV     AX,ES           ;SET DS=ES FOR REMAINDER
  44.         MOV     DS,AX           ;OF PROGRAM
  45.         JNC     CLEAN1          ;JUMP, GOT ACCEPTABLE NAME
  46.         MOV     DX,OFFSET MSG4  ;MISSING OR ILLEGAL FILESPEC,
  47.         JMP     CLEAN9          ;PRINT ERROR MESSAGE AND EXIT.
  48.  
  49. CLEAN1: CALL    OUTFILE         ;SET UP OUTPUT FILE NAME
  50.         CALL    OPEN_INPUT      ;NOW TRY TO OPEN INPUT FILE
  51.         JNC     CLEAN2          ;JUMP,OPENED INPUT OK
  52.         MOV     DX,OFFSET MSG1  ;OPEN OF INPUT FILE FAILED,
  53.         JMP     CLEAN9          ;PRINT ERROR MSG AND EXIT.
  54.  
  55. CLEAN2:
  56.         CALL    OPEN_OUTPUT     ;TRY TO OPEN OUTPUT FILE.
  57.         JNC     CLEAN25         ;JUMP,OPENED OK
  58.         MOV     DX,OFFSET MSG2  ;OPEN OF OUTPUT FILE FAILED,
  59.         JMP     CLEAN9          ;PRINT ERROR MESSAGE AND EXIT.
  60.  
  61. CLEAN25:                        ;ALL FILES OPENED SUCCESSFULLY,
  62.         CALL    SIGN_ON         ;PRINT SIGN-ON MESSAGE AND
  63.         CALL    INIT_BUFFS      ;SET UP BUFFERS.
  64.  
  65. CLEAN3:                         ;NOW FILTER THE FILE.
  66.         CALL    GET_CHAR        ;READ 1 CHARACTER FROM INPUT.
  67.  
  68.         CMP     AL,CR OR 80H    ;IS IT A "SOFT CARRIAGE RETURN"?
  69.         JNE     CLEAN31         ;NO,JUMP
  70.         MOV     AL,CR           ;YES, WRITE NORMAL CR
  71.         JMP     CLEAN35
  72. CLEAN31:
  73.         AND     AL,07FH         ;STRIP OFF THE HIGH BIT
  74.         CMP     AL,20H          ;IS IT A CONTROL CODE?
  75.         JAE     CLEAN4          ;NO, WRITE IT TO NEW FILE
  76.                                 ;IF CONTROL CODE,
  77.         CMP     AL,EOF          ;IS IT END OF FILE MARKER?
  78.         JE      CLEAN6          ;YES,JUMP TO CLOSE FILES.
  79.         CMP     AL,CR           ;IS IT HARD CARRIAGE RETURN?
  80.         JNE     CLEAN33         ;NO,JUMP
  81.         MOV     AL,014H         ;YES,WRITE PARAGRAPH MARKER AND
  82.         CALL    PUT_CHAR        ;TRAILING CR
  83.         MOV     AL,CR           ;
  84.         JMP     CLEAN35         ;WRITE IT TO FILE AND CLEAR COLUMN COUNT.
  85. CLEAN33:
  86.         CMP     AL,TAB          ;IS IT A TAB COMMAND?
  87.         JZ      CLEAN5          ;YES,JUMP TO SPECIAL PROCESSING.
  88.         CMP     AL,LF           ;IF LINE FEED WRITE IT TO FILE,
  89.         JNE     CLEAN3          ;OTHERWISE DISCARD CONTROL CODE.
  90. CLEAN35:                        ;IF IT IS CR OR LF,
  91.         MOV     COLUMN,0        ;INCIDENTALLY INITIALIZE
  92.         JMP     CLEAN45         ;COLUMN COUNT FOR TAB PROCESSOR.
  93.  
  94. CLEAN4:                         ;COUNT ALPHANUMERIC CHARS. SENT.
  95.         INC     COLUMN
  96.  
  97. CLEAN45:                        ;WRITE THIS CHARACTER TO
  98.         CALL    PUT_CHAR        ;OUTPUT FILE,
  99.         JNC     CLEAN3          ;IF CY NOT SET, WRITE WAS
  100.                                 ;OK SO GO GET NEXT CHAR.
  101. CLEAN47:
  102.         CALL    CLOSE_INPUT     ;IF CY SET, DISK IS FULL
  103.         CALL    CLOSE_OUTPUT    ;SO CLOSE FILES AND EXIT
  104.         MOV     DX,OFFSET MSG5  ;WITH ERROR MESSAGE.
  105.         JMP     CLEAN9
  106.  
  107. CLEAN5:                         ;PROCESS TAB CHARACTER
  108.         MOV     AX,COLUMN       ;LET DX:AX=COLUMN COUNT
  109.         CWD
  110.         MOV     CX,8            ;DIVIDE IT BY EIGHT...
  111.         IDIV    CX
  112.         SUB     CX,DX           ;REMAINDER IS IN DX.
  113.         ADD     COLUMN,CX       ;UPDATE COLUMN POINTER.
  114. CLEAN55:                        ;8 MINUS THE REMAINDER
  115.         PUSH    CX              ;GIVES US THE NUMBER OF
  116.         MOV     AL,20H          ;SPACES TO SEND OUT TO
  117.         CALL    PUT_CHAR        ;MOVE TO THE NEXT TAB POSITION
  118.         POP     CX              ;RESTORE SPACE COUNT
  119.         JC      CLEAN47         ;JUMP IF DISK IS FULL
  120.         LOOP    CLEAN55
  121.         JMP     CLEAN3          ;GET NEXT CHARACTER
  122.  
  123. CLEAN6:                         ;END OF FILE DETECTED,
  124.         CALL    PUT_CHAR        ;WRITE END-OF-FILE MARKER,
  125.         JC      CLEAN47         ;JUMP IF DISK WAS FULL
  126.         CALL    FLUSH_BUFFS     ;WRITE REMAINING DATA TO DISK
  127.         JC      CLEAN47         ;IF CY SET,DISK WAS FULL
  128.                                 ;OTHERWISE FILE WAS WRITTEN OK
  129.         CALL    CLOSE_INPUT     ;CLOSE INPUT AND OUTPUT
  130.         CALL    CLOSE_OUTPUT    ;FILES.
  131.         MOV     DX,OFFSET MSG3  ;ADDR OF SUCCESS MESSAGE,
  132.  
  133. CLEAN9:                         ;PRINT MESSAGE AND RETURN
  134.         MOV     AH,9            ;CONTROL TO PC-DOS
  135.         INT     21H
  136.         RET
  137.  
  138. CLEAN   ENDP
  139.  
  140.  
  141. INFILE  PROC    NEAR            ;PROCESS NAME OF INPUT FILE
  142.                                 ;DS:SI <- ADDR COMMAND LINE
  143.         MOV     SI,OFFSET COMMAND
  144.                                 ;ES:DI <- ADDR FILESPEC BUFFER
  145.         MOV     DI,OFFSET INPUT_NAME
  146.         CLD
  147.         LODSB                   ;ANY COMMAND LINE PRESENT?
  148.         OR      AL,AL           ;RETURN ERROR STATUS IF NOT.
  149.         JZ      INFILE4
  150. INFILE1:                        ;SCAN OVER LEADING BLANKS
  151.         LODSB                   ;TO FILE NAME
  152.         CMP     AL,CR           ;IF WE HIT CARRIAGE RETURN
  153.         JZ      INFILE4         ;FILENAME IS MISSING.
  154.         CMP     AL,20H          ;IS THIS A BLANK?
  155.         JZ      INFILE1         ;IF SO KEEP SCANNING.
  156.  
  157. INFILE2:                        ;FOUND FIRST CHAR OF NAME,
  158.         STOSB                   ;MOVE LAST CHAR. TO OUTPUT
  159.                                 ;FILE NAME BUFFER.
  160.         LODSB                   ;CHECK NEXT CHARACTER, FOUND
  161.         CMP     AL,CR           ;CARRIAGE RETURN YET?
  162.         JE      INFILE3         ;YES,EXIT WITH SUCCESS CODE
  163.         CMP     AL,20H          ;IS THIS A BLANK?
  164.         JNE     INFILE2         ;IF NOT KEEP MOVING CHARS.
  165.  
  166. INFILE3:                        ;EXIT WITH CARRY =0
  167.         CLC                     ;FOR SUCCESS FLAG
  168.         RET
  169.  
  170. INFILE4:                        ;EXIT WITH CARRY =1
  171.         STC                     ;FOR ERROR FLAG
  172.         RET
  173. INFILE  ENDP
  174.  
  175. OUTFILE PROC    NEAR            ;SET UP PATH AND FILE
  176.         CLD                     ;NAME FOR OUTPUT FILE.
  177.         MOV     CX,64           ;LENGTH TO MOVE
  178.         MOV     SI,OFFSET INPUT_NAME  ;SOURCE ADDR
  179.         MOV     DI,OFFSET OUTPUT_NAME ;DEST ADDR
  180.         REP MOVSB               ;TRANSFER THE STRING
  181.         MOV     DI,OFFSET OUTPUT_NAME
  182. OUTFILE1:                       ;SCAN STRING LOOKING FOR
  183.         MOV     AL,[DI]         ;"." MARKING START OF EXTENSION
  184.         OR      AL,AL           ;OR ZERO BYTE MARKING NAME END.
  185.         JZ      OUTFILE2        ;IF EITHER IS FOUND,JUMP.
  186.         CMP     AL,'.'
  187.         JE      OUTFILE2        ;BUMP STRING POINTER, LOOP
  188.         INC     DI              ;IF NEITHER '.' OR ZERO FOUND.
  189.         JMP     OUTFILE1
  190. OUTFILE2:                       ;FOUND ZERO OR '.',FORCE THE
  191.                                 ;EXTENSION OF OUTPUT FILE TO '.VW'
  192.         MOV     SI,OFFSET OUTFILE_EXT
  193.         MOV     CX,4
  194.         REP MOVSB
  195.         RET                     ;BACK TO CALLER
  196. OUTFILE ENDP
  197.  
  198. OPEN_INPUT PROC NEAR            ;OPEN INPUT FILE
  199.                                 ;DS:DX=ADDR FILENAME
  200.         MOV     DX,OFFSET INPUT_NAME
  201.         MOV     AL,0            ;AL=0 FOR READ ONLY
  202.         MOV     AH,3DH          ;FUNCTION 3DH=OPEN
  203.         INT     21H             ;HANDLE RETURNED IN AX,
  204.         MOV     INPUT_HANDLE,AX ;SAVE IT FOR LATER.
  205.         RET                     ;CY IS SET IF ERROR
  206. OPEN_INPUT ENDP
  207.  
  208. OPEN_OUTPUT PROC NEAR           ;OPEN OUTPUT FILE
  209.                                 ;DS:DX=ADDR FILENAME
  210.         MOV     DX,OFFSET OUTPUT_NAME
  211.         MOV     AL,1            ;AL=1 FOR WRITE ONLY
  212.         MOV     AH,3CH          ;FUNCTION 3CH=MAKE OR
  213.         INT     21H             ;TRUNCATE EXISTING FILE
  214.                                 ;HANDLE RETURNED IN AX
  215.         MOV     OUTPUT_HANDLE,AX;SAVE IT FOR LATER.
  216.         RET                     ;RETURN CY=TRUE IF ERROR
  217. OPEN_OUTPUT ENDP
  218.  
  219. CLOSE_INPUT PROC NEAR           ;CLOSE INPUT FILE
  220.         MOV     BX,INPUT_HANDLE ;BX=HANDLE
  221.         MOV     AH,3EH
  222.         INT     21H
  223.         RET
  224. CLOSE_INPUT ENDP
  225.  
  226. CLOSE_OUTPUT PROC NEAR          ;CLOSE OUTPUT FILE
  227.         MOV     BX,OUTPUT_HANDLE;BX=HANDLE
  228.         MOV     AH,3EH
  229.         INT     21H
  230.         RET
  231. CLOSE_OUTPUT ENDP
  232.  
  233. GET_CHAR PROC   NEAR            ;GET ONE CHARACTER FROM INPUT BUFFER
  234.         MOV     BX,INPUT_PTR
  235.         CMP     BX,BLKSIZE
  236.         JNE     GET_CHAR1
  237.         CALL    READ_BLOCK
  238.         MOV     BX,0
  239. GET_CHAR1:
  240.         MOV     AL,[INPUT_BUFFER+BX]
  241.         INC     BX
  242.         MOV     INPUT_PTR,BX
  243.         RET
  244. GET_CHAR ENDP
  245.  
  246. PUT_CHAR PROC   NEAR            ;PUT ONE CHARACTER INTO OUTPUT BUFFER
  247.         MOV     PREV_CHAR,AL    ;SAVE COPY OF MOST RECENT OUTPUT
  248.         MOV     BX,OUTPUT_PTR
  249.         MOV     [OUTPUT_BUFFER+BX],AL
  250.         INC     BX
  251.         MOV     OUTPUT_PTR,BX
  252.         CMP     BX,BLKSIZE      ;BUFFER FULL YET?
  253.         JNE     PUT_CHAR1       ;NO,JUMP
  254.         CALL    WRITE_BLOCK     ;YES,WRITE THE BLOCK
  255.         RET                     ;RETURN CY AS STATUS CODE
  256. PUT_CHAR1:
  257.         CLC                     ;RETURN CY CLEAR FOR OK STATU2
  258.         RET
  259.