home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol044 / cpm2heli.s < prev    next >
Text File  |  1984-04-29  |  5KB  |  246 lines

  1.  ORG 103H
  2.  XEQ 103H
  3. SIN EQU 0C01FH    SOL INPUT
  4. SOU EQU 0C019H    SOL OUTPUT
  5. STAK EQU 0CBFFH   STACK IN SCRATCHPAD RAM
  6.  LXI SP,STAK
  7.  COPY NPTDEFS     PTDOS SYSTEM CALLS
  8.  CALL 0C0D5H      CLEAR SCREEN
  9.  CALL MSGI        ASK FOR INPUT FILENAME
  10.  LXI H,IBUFI
  11. IMF CALL SIN      PUT IT IN BUFFER FOR PSCAN
  12.  JZ IMF
  13.  MOV M,A
  14.  CPI 0DH
  15.  PUSH PSW
  16.  MOV B,A
  17.  CNZ OUTR       ECHO TO SCREEN IF NOT C/R
  18.  POP PSW
  19.  INX H
  20.  JNZ IMF
  21.  CALL MSGO     ASK FOR OUTPUT FILENAME
  22.  LXI H,IBUFO
  23. OMF CALL SIN   TO BUFFER
  24.  JZ OMF
  25.  MOV M,A
  26.  CPI 0DH
  27.  PUSH PSW
  28.  MOV B,A
  29.  CNZ OUTR
  30.  POP PSW
  31.  INX H
  32.  JNZ OMF
  33. PI MVI A,PSOP+40H  OPEN INPUT FILE
  34.  LXI H,IBUFI       NAME IS IN IBUFI
  35.  LXI D,OBUFI       OUTPUT BUFFER FOR PSCAN
  36.  CALL PSCAN
  37.  JC ERR            CARRY IS ERROR, ALWAYS
  38.  JZ ERR            HERE, SO IS ZERO
  39.  MOV A,E
  40.  CPI 0FFH          0FFH IN E IS ERROR
  41.  JZ ERR
  42.  STA IFN           GOT FILE NUMBER, STORE IT
  43. PO MVI A,PSCO+40H  DO SAME FOR OUTPUT FILE
  44.  LXI H,IBUFO       CREATE IF IT DOESN'T EXIST
  45.  LXI D,OBUFO
  46.  CALL PSCAN
  47.  JC ERR
  48.  JZ ERR
  49.  MOV A,E
  50.  CPI 0FFH
  51.  JZ ERR
  52.  STA OFN
  53.  LXI H,0
  54.  SHLD TEMP1    COUNTER FOR INPUT FILE BUFFER
  55.  LXI H,04C0H
  56.  SHLD TEMP2    COUNTER FOR OUTPUT FILE BUFFER
  57.  LXI H,OFB
  58.  SHLD TEMP5    START OF OUTPUT FILE BUFFER
  59.  LXI H,40H     LINE LENGTH COUNTER
  60.  SHLD TEMP7
  61.  LXI H,1
  62.  SHLD TEMP6    EOF FLAG
  63. START LHLD  TEMP1
  64.  XRA A         SEE IF COUNTER IS ZERO
  65.  CMP H
  66.  JNZ STAR2
  67.  CMP L
  68.  JZ  BEGIN         EMPTY?, READ IN MORE & RESET COUNTER
  69. STAR2 LHLD  TEMP4  TEMP4 IS INPUT BUFFER POINTER
  70.  MOV A,M
  71.  STA TEMP3
  72.  CPI 0AH      REMOVE LF
  73.  JZ CONT
  74.  CPI 1AH      REMOVE CTRL/Z
  75.  JZ FINISH
  76.  CPI 9        REMOVE HORIZONTAL TAB
  77.  JZ CONT
  78.  CPI 0DH      CR? RESET LINE LENGTH COUNTER
  79.  CZ CRRES
  80.  CALL WOBUF   PUT CHARACTER IN OUTPUT FILE BUFFER
  81. CONT  LHLD  TEMP4  INCREMENT INPUT FILE BUFFER POINTER
  82.  INX H
  83.  SHLD TEMP4
  84.  LHLD  TEMP1  DECREMENT INPUT BUFFER COUNTER
  85.  DCX H
  86.  SHLD TEMP1
  87.  LHLD TEMP7
  88.  DCR L     INSERT CR IF 64 CHARACTERS WITHOUT ONE
  89.  SHLD TEMP7
  90.  CZ CRINS
  91.  JMP START
  92. CRRES LXI H,40H   RESET CHARACTER COUNTER TO 64
  93.  SHLD TEMP7
  94.  RET
  95. CRINS MVI A,0DH   CR IN A
  96.  CALL WOBU2       PUT IT IN OUTPUT BUFFER
  97.  JMP CRRES    RESET CHARACTER COUNTER
  98. BEGIN LDA TEMP6  EOF?
  99.  CPI 0
  100.  JZ FINISH  IF SO,ENDFILE OF, CLOSE FILES, RETURN TO SYS
  101.  PUSH H    READ INPUT FILE INTO BUFFER
  102.  PUSH B         RESET COUNTER
  103.  PUSH D
  104.  PUSH PSW
  105.  LXI B,04C0H
  106.  LXI D,IFB
  107.  MVI L,1
  108.  LDA IFN
  109.  CALL SYS
  110.  DB DRDOP
  111.  JMP RERR    ERROR RETURN
  112. NRET PUSH B  B HAS # BYTES NOT READ
  113.  POP H       NOW H HAS IT
  114.  SHLD TEMP1  IN TEMP1 FOR THE MOMENT
  115.  LXI H,TEMP1    HL POINTS TO IT
  116.  MVI A,0C0H     DOUBLE PRECISION SUBTRACTION OF BYTES
  117.  SUB M          NOT READ FROM SIZE OF BUFFER (4C0H)
  118.  MOV C,A
  119.  INX H
  120.  MVI A,04
  121.  SBB M
  122.  MOV B,A
  123.  PUSH B
  124.  POP H
  125.  SHLD TEMP1     TEMP1 NOW HAS BYTES READ
  126.  LXI H,IFB
  127.  SHLD TEMP4
  128.  POP PSW
  129.  POP D
  130.  POP B
  131.  POP H
  132.  JMP START
  133. RERR CPI 18H  IN CASE THERE IS NO EOF MARK
  134.  JZ EFSET
  135.  JMP ERR1
  136. EFSET XRA A   RESET EOF FLAG
  137.  STA TEMP6
  138.  JMP NRET
  139. WOBUF LDA TEMP3     GET CHARACTER
  140. WOBU2 LHLD  TEMP5   H POINTS TO OUTPUT FILE BUFFER
  141.  MOV M,A            PUT IT THERE
  142.  LHLD  TEMP2        TEMP2 IS COUNTER
  143.  DCX H              BUFFER FULL?
  144.  SHLD TEMP2
  145.  XRA A
  146.  CMP H
  147.  JNZ RES
  148.  CMP L
  149.  JZ WRT             IF SO, WRITE TO DISK
  150. RES   LHLD TEMP5
  151.  INX H
  152.  SHLD TEMP5
  153.  RET                OTHERWISE GET ANOTHER CHARACTER
  154. WRT1 XRA A          RESET EOF FLAG
  155.  STA TEMP6
  156. WRT LDA OFN         DELIMITED WRITE TO DISK
  157.  LXI B,04C0H
  158.  LXI D,OFB
  159.  MVI L,1
  160.  CALL SYS
  161.  DB DWROP
  162.  JMP ERR1
  163. W2 LXI H,04C0H  RESET COUNTER
  164.  SHLD TEMP2
  165.  LXI H,OFB    RESET POINTER
  166.  SHLD TEMP5
  167.  RET
  168. FINISH MVI A,1  PUT 1 AT END FOR DELIMITED WRITE
  169.  CALL WOBU2
  170.  CALL WRT       WRITE REST OF BUFFER TO DISK
  171.  LDA OFN      MOVE FILE CURSOR BACK ONE SPACE
  172.  LXI B,1
  173.  MVI D,128
  174.  CALL SYS
  175.  DB SPAOP
  176.  JMP ERR
  177.  LDA OFN  EOF MARK TO OUTPUT FILE
  178.  CALL SYS
  179.  DB EOFOP
  180.  JMP ERR
  181. EN MVI A,255  CLOSE ALL OPEN FILES
  182.  CALL SYS
  183.  DB CAOP
  184.  JMP ERR
  185.  CALL SYS  RETURN TO PTDOS
  186.  DB RESOP
  187. MSGI LXI H,MSI
  188. MSGI1 MOV A,M
  189.  CPI 0FFH
  190.  RZ
  191.  MOV B,A
  192.  CALL OUTR
  193.  INX H
  194.  JMP MSGI1
  195. MSGO LXI H,MSO
  196.  JMP MSGI1
  197. MSI ASC 'ENTER INPUT FILE NAME - C/R'
  198.  DB 0DH
  199.  DB 0AH
  200.  DB 0FFH
  201. MSO DB 0DH
  202.  DB 0AH
  203.  ASC 'ENTER OUTPUT FILE NAME - C/R'
  204.  DB 0DH
  205.  DB 0AH
  206.  DB 0FFH
  207. OUTR PUSH H
  208.  PUSH D
  209.  PUSH B
  210.  PUSH PSW
  211.  CALL SOU
  212.  POP PSW
  213.  POP B
  214.  POP D
  215.  POP H
  216.  RET
  217. ERR1 MOV E,A
  218. ERR LXI H,EM
  219.  MOV M,E
  220.  MVI A,84H
  221.  CALL UTIL
  222.  DB UXOP
  223.  JMP EN
  224.  DB -1
  225. EM DS 1
  226.  JMP EN
  227. TEMP1 DS 2
  228. TEMP2 DS 2
  229. TEMP3 DS 1
  230. TEMP4 DS 2
  231. TEMP5 DS 2
  232. TEMP6 DS 2
  233. TEMP7 DS 2
  234. IFN DS 1
  235. OFN DS 1
  236. IBUFI DS 10
  237. IBUFO DS 10
  238. OBUFI DS 20
  239.  DB 0AEH
  240.  DW 04C0H
  241.  DB 0
  242. OBUFO DS 20
  243. IFB DS 04C0H
  244. OFB DS 04C0H
  245.  END
  246.