home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG015.ARK / TSAVE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  228 lines

  1. ;TSAVE V.4 - TARBELL SAVE 
  2. ;BY WARD CHRISTENSEN
  3. ;WORKS FOR ANY CP/M FILE
  4. ;01/15/77 ORIGINALLY WRITTEN
  5. ;08/01/77 ADD CHECKSUM
  6. ;09/19/77 ADD DELAY BEFORE WRITING TO
  7. ;      ALLOW TIME FOR MULTIPLE TLOADS
  8. ;      VIA 'SUBMIT' COMMAND
  9. ;
  10. ;WRITES 11 CHAR FILENAME,
  11. ;    1 BYTE # SECTORS,
  12. ;    DATA, (TYPICALLY 4K BLOCKS)
  13. ;    CHECKSUM
  14. ;
  15. ;IF 'TSAVE FN.FT ?' IS TYPED, CHECKS THE TAPE
  16. ;    BY READING IT BACK
  17. NSEC    EQU    32    ;NUMBER OF SECTORS/BLOCK
  18. SECDLY    EQU    4    ;# SECONDS DELAY 
  19.             ;BEFORE EACH WRITE
  20.     ORG    100H    ;TO TPA
  21.     CALL    START    ;SKIP ID
  22. ID    DB    '(TSAVE 09/19/77)',0DH,0AH,'$'
  23. START    POP    D    ;GET ID MSG ADDR
  24.     MVI    C,PRINT
  25.     CALL    BDOS    ;PRINT ID
  26. ;INIT PRIVATE STACK
  27.     LXI    H,0
  28.     DAD    SP
  29.     SHLD    STACK
  30.     LXI    SP,STACK    
  31. ;SAVE THE '?' FROM 'TSAVE FN.FT ?'
  32.     LDA    FCB+17    ;LOAD THE '?'
  33.     STA    CHECK    ;SAVE
  34. ;OPEN FILE
  35.     LXI    D,FCB
  36.     MVI    C,OPEN
  37.     CALL    BDOS
  38.     INR    A    ;OPEN OK?
  39.     JZ    OPNER
  40. ;WRITE 'AUDIO HEADER' ONTO THE TAPE
  41.     LDA    CHECK    ;CHECKING?
  42.     CPI    '?'
  43.     JZ    READB    ;SKIP HDR IF CHECKING
  44.     MVI    B,0    ;>1 SECONDS WORTH
  45. AUDIOH    MVI    A,11H    ;GET DISTINCTIVE PATTERN
  46.     CALL    TOUT    ;OUTPUT IT
  47.     DCR    B
  48.     JNZ    AUDIOH
  49. ;
  50. ;READ FILE, WRITE TARBELL 
  51. ;    IN NSEC SECTOR (4K) BLOCKS
  52. READB    MVI    E,'*'    ;PRINT '*' EVERY BLOCK WRITTEN
  53.     MVI    C,WRCON 
  54. ;PRINT '?' IF CHECKING, OTHERWISE '*'
  55.     LDA    CHECK
  56.     CPI    '?'    ;CHECKING?
  57.     JNZ    PRAST    ;NO, PRINT ASTERISK
  58.     MOV    E,A    ;MOVE SO '?' PRINTS
  59. PRAST    CALL    BDOS    ;PRINT '?' OR '*'
  60. RDLP    LHLD    BUFAD    ;GET BUFFER ADDR
  61.     XCHG        ;MOVE TO D,E
  62. ;SET NEW BUFFER ADDR
  63.     LXI    H,128    ;GET BUFFER LENGTH
  64.     DAD    D    ;POINT TO NEXT
  65.     SHLD    BUFAD
  66.     MVI    C,STDMA    ;SET
  67.     CALL    BDOS    ;..DMA ADDR
  68.     LHLD    BUFAD
  69.     LXI    D,FCB
  70.     MVI    C,READ
  71.     CALL    BDOS
  72.     ORA    A    ;READ OK?
  73.     JNZ    RDER    ;NO, CHECK EOF
  74. ;INCR BUFF COUNT, IF NSEC, WRITE
  75.     LDA    BUFFN
  76.     INR    A
  77.     STA    BUFFN
  78.     CPI    NSEC
  79.     JC    RDLP    ;LOOP IF MORE TO DO
  80. ;HAVE READ NSEC SECTORS, WRITE THEM
  81. EOFWR    LDA    CHECK    ;WAS TSAVE ? REQUESTED?
  82.     CPI    '?'
  83.     JNZ    NCK1    ;NO - INIT FOR OUTPUT
  84. 8INIT TARBELL FOR INPUT
  85.     MVI    A,10H    ;GET INPUT RESET CHAR
  86.     OUT    6EH    ;RESET TARBELL
  87.     JMP    SENDF    ;SKIP OUTPUT INIT
  88. ;CHECK NOT REQUESTED - INIT TARBELL OUTPUT
  89. NCK1    MVI    A,3CH    ;START BYTE
  90.     CALL    TOUT
  91.     MVI    A,0E6H    ;GET TARBELL SYNCH CHAR
  92.     CALL    TOUT    ;OUTPUT IT
  93. SENDF    LXI    H,FCB+1    ;SET UP AND
  94.     MVI    B,8+3    ;..OUTPUT
  95. FCBLP    MOV    A,M    ;GET FCB CHAR
  96.     CALL    TOUT    ;WRITE IT
  97.     INX    H    ;POINT TO NEXT
  98.     DCR    B    ;MORE?
  99.     JNZ    FCBLP
  100. ;WRITE THE SECTOR COUNT
  101.     LDA    BUFFN    ;GET SECTOR COUNT
  102.     CALL    TOUT    ;WRITE IT
  103. ;IF BUFFN IS 0, THEN THAT WAS EOF
  104.     LDA    BUFFN
  105.     ORA    A    ;DONE?
  106.     JZ    DONE    ;YES
  107. ;WRITE THE SECTORS
  108.     LXI    H,BUFF    ;POINT TO START
  109.     SHLD    BUFAD    ;INIT BUFF ADDR
  110.     LDA    BUFFN    ;GET NUMBER OF BUFFERS
  111.     MOV    B,A    ;SAVE IN B
  112.     XRA    A    ;GET A ZERO
  113.     STA    CKSUM    ;INIT CKSUM
  114. WRSEC    MVI    C,128    ;INIT C TO SECTOR LENGTH
  115. WRCHR    MOV    A,M    ;GET CHAR
  116.     CALL    TOUT    ;WRITE IT
  117.     INX    H    ;POINT TO NEXT
  118.     DCR    C    ;MORE IN SECTOR?
  119.     JNZ    WRCHR
  120.     DCR    B    ;DECR # OF SECTORS
  121.     JNZ    WRSEC    ;MORE SECTORS TO WRITE
  122.     LDA    CKSUM    0SEND CKSUM
  123.     CALL    TOUT
  124.     XRA    A    ;GET A ZERO
  125.     STA    BUFFN    ;INIT BUFF NUMBER
  126. ;SEND DELAY BYTES
  127.     CALL    DELAY
  128. ;IF EOF, SEND EOF REC (HDR, 0 DATA)
  129.     LDA    EOFLG    ;GET FLAG
  130.     ORA    A    ;EOF?
  131.     JNZ    EOFWR    ;YES
  132.     JMP    READB    ;GO READ MORE
  133. ;READ ERROR - CHECK FOR EOF
  134. RDER    DCR    A    ;WAS IT 1?
  135.     JNZ    RDERR    ;NO, GENUINE READ ERROR
  136. ;EOF REACHED
  137.     INR    A    ;GET NON-ZERO VALUE
  138.     STA    EOFLG    ;SET EOF FLAG
  139.     JMP    EOFWR    ;GO WRITE LAST PART
  140. ;ALL DONE - WRITE 2 X DELAYS
  141. DONE    CALL    DELAY
  142.     CALL    DELAY
  143.     JMP    EXIT
  144. OPNER    LXI    D,MSG2
  145.     JMP    ERXIT
  146. RDERR    LXI    D,MSG5    ;READ ERROR 
  147.     JMP    ERXIT
  148. ERXIT    MVI    C,PRINT
  149.     CALL    BDOS    ;PRINT MESSAGE
  150. EXIT    LHLD    STACK    ;GET ORIGINAL STACK
  151.     SPHL        ;RESTORE IT
  152.     RET        ;--EXIT--
  153. ;TARBELL WRITE
  154. TOUT    PUSH    PSW
  155. ;CALC CKSUM
  156.     PUSH    H
  157.     LXI    H,CKSUM
  158.     XRA    M    ;CALC CKSUM
  159.     MOV    M,A    ;SAVE IT BACK
  160.     POP    H
  161. ;IF CHECKING, THEN READ AND MATCH
  162.     LDA    CHECK
  163.     CPI    '?'
  164.     JZ    RDCK    ;READ, CHECK
  165. TWAIT    IN    6EH
  166.     ANI    20H
  167.     JNZ    TWAIT
  168.     POP    PSW
  169.     OUT    6FH
  170.     RET
  171. RDCK    POP    PSW    ;GET CHAR
  172.     PUSH    B    ;SAVE BC
  173.     MOV    B,A    ;PUT CHAR IN B
  174. RDWT    IN    6EH    ;READ TARBELL STAT
  175.     ANI    10H
  176.     JNZ    RDWT
  177.     IN    6FH
  178.     CMP    B
  179.     JZ    CKOK    ;CHAR MATCHED
  180. ;CHAR DIDN'T MATCH -
  181.      LXI    D,CKERR    ;GET ERR MSG
  182.     JMP    ERXIT    ;PRINT ERROR, EXIT
  183. CKOK    POP    B    ;RESTORE BC
  184.     RET
  185. ;TIME DELAY ROUTINE - WAITS 'SECDLY' SECONDS
  186. DELAY    LDA    CHECK    ;DON'T DELAY
  187.     CPI    '?'    ;..IF CHECKING
  188.     RZ        ;RET - CHECKING
  189.     LXI    B,187*SECDLY ;GET SECONDS
  190. DELAY2    MVI    A,3CH    ;TARBELL START CHAR
  191.     CALL    TOUT
  192.     DCX    B    ;DONE?
  193.     MOV    A,B
  194.     ORA    C    ;BC=0?
  195.     JNZ    DELAY2
  196.     RET
  197.     DS    30    ;STACK AREA
  198. STACK    DS    2    ;STACK POINTER
  199. MSG2    DB    'CANNOT OPEN$'
  200. MSG5    DB    'READ ERR$'
  201. CKERR    DB    'COMPARE UNEQUAL$'
  202. BLKNO    DB    0    ;BLOCKS READ, TO BE WRITTEN
  203. BUFFN    DB    0    ;BUFFER NUMBER
  204. CHECK    DS    1    ;IF TSAVE ? TYPED
  205. CKSUM    DS    1    ;CHECKSUM
  206. EOFLG    DB    0    ;EOF FLAG, 0=NO
  207. BUFAD    DW    BUFF    ;CURRENT READ ADDR
  208. BUFF    EQU    $    ;BUFFER FROM HERE ON
  209. ;
  210. ; BDOS EQUATES (VERSION 2)
  211. ;
  212. RDCON    EQU    1
  213. WRCON    EQU    2
  214. PRINT    EQU    9
  215. OPEN    EQU    15    ;0FFH=NOT FOUND
  216. CLOSE    EQU    16    ;   "    "
  217. SRCHF    EQU    17    ;   "    "
  218. SRCHN    EQU    18    ;   "    "
  219. ERASE    EQU    19    ;NO RET CODE
  220. READ    EQU    20    ;0=OK, 1=EOF
  221. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  222. MAKE    EQU    22    ;0FFH=BAD
  223. REN    EQU    23    ;0FFH=BAD
  224. STDMA    EQU    26
  225. BDOS    EQU    5
  226. REIPL    EQU    0
  227. FCB    EQU    5CH    ;SYSTEM FCB
  228.