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 / CPMUG006.ARK / TSAVE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  4KB  |  201 lines

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