home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol068 / tsave4.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.1 KB  |  233 lines

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