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 / TLOAD.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  260 lines

  1. ;TARBELL LOAD - LOADS TAPES
  2. ;    SAVED WITH TSAVE COMMAND
  3. ;WRITTEN BY WARD CHRISTENSEN
  4. ;01/15/77 ORIGINALLY WRITTEN
  5. ;08/01/77 ADD CHECKSUM
  6. ;12/19/77 DELETE VDM DEPENDENCIES
  7. ;    PRINT NAME IN HEADER FROM TAPE IF IT DOESN'T
  8. ;    REQUESTED NAME
  9. ;
  10. ;FORMAT IS:    TLOAD FN1.FT1
  11. ;    OR:    TLOAD FN1.FT1 FN2.FT2
  12. ;
  13. ;FN1.FT1 IS THE NAME OF THE FILE TO BE CREATED ON DISK,
  14. ;FN2.FT2 IS THE NAME OF THE FILE FROM TAPE,
  15. ;    (IF DIFFERENT THAN FN1.FT1)
  16. ;
  17. ;TO VERIFY A TAPE, DO NOT TLOAD IT TO VERIFY THE
  18. ;CHECKSUM, AS YOUR FILE WILL BE LOST IF IT LOADS
  19. ;WRONG.  INSTEAD USE: TSAVE XXXX.YYY ?
  20. ;THE $ ' SAYS TO CHECK, NOT WRITE.
  21. ;
  22. FCB    EQU    5CH    ;SYSTEM FCB
  23.     ORG    100H    ;TO TPA
  24.     CALL    START    ;SKIP ID
  25. ID    DB    '(TLOAD 12/19/77)',0DH,0AH,'$'
  26. START    POP    D    ;GET ID MSG
  27.     MVI    C,PRINT
  28.     CALL    BDOS    ;PRINT ID
  29. ;INIT PRIVATE STACK
  30.     LXI    H,0    ;HL=0
  31.     DAD    SP    ;HL=CCP'S STACK
  32.     SHLD    STACK    ;SAVE CCP'S STACK POINTER
  33.     LXI    SP,STACK ;GET LOCAL STACK
  34. ;ERASE FN1.OLD IF IT EXISTS
  35.     LXI    H,FCB    ;POINT TO FCB
  36.     LXI    D,MYFCB ;AND TO MY FCB
  37.     MVI    B,9    ;MOVE LENGTH
  38.     CALL    MOVE    ;MOVE FILENAME TO MYFCB
  39.     LXI    D,MYFCB    ;POINT TO FN1.OLD FCB
  40.     MVI    C,DELT    ;DELETE FUNCTION
  41.     CALL    BDOS    ;DELETE FN1.OLD, IGNORE ERRS
  42. ;SAVE FN1.FT1 OR FN2.FT2 FOR TAPE HEADER MATCH
  43.     LXI    H,FCB+1    ;GET FN1.FT1 POINTER
  44.     LXI    D,TAPEN    ;POINT DE TO SAVE NAME AREA
  45.     MVI    B,11    ;NAME LENGTH
  46.     LDA    FCB+17    ;IS FM2.FT2 BLANK?
  47.     CPI    ' '
  48.     JZ    MOVEN    ;YES, SAVE FN1.FT1
  49. ;SECOND NAME HAS BEEN SPECIFIED
  50.     LXI    H,FCB+17 ;POINT TO FN2.FT2
  51. MOVEN    CALL    MOVE    ;SAVE THE TAPE NAME
  52. ;
  53. ;IF IT EXISTS, RENAME FN1.FT1 TO FN1.OLD
  54. ;
  55.     LXI    H,MYFCB    ;POINT TO FN1.OLD
  56.     LXI    D,FCB+16    ;POINT TO SYSFCB+16
  57.     MVI    B,16    ;INIT MOVE LENGTH
  58.     CALL    MOVE    ;SET UP FOR
  59.     LXI    D,FCB    ;RENAME
  60.     MVI    C,REN    ;FUNCTION, THEN
  61.     CALL    BDOS    ;DO THE RENAME,
  62.             ;IGNORE ERRORS.
  63. ;
  64. ;MAKE FN1.FT1 A NEW FILE
  65. ;
  66.     LXI    D,FCB    ;POINT TO FCB
  67.     MVI    C,MAKE    ;C=MAKE FUNCTION
  68.     CALL    BDOS    ;MAKE THE FILE
  69.     INR    A    ;SPACE IN DIRECTORY?
  70.     JNZ    DIROK    ;YES
  71. ;
  72. ;NO DIRECTORY SPACE - PRINT ERROR, EXIT
  73. ;
  74.     LXI    D,NODIR    ;POINT TO ERR MSG
  75. ERXIT    MVI    C,PRINT    ;GET PRINT FUNCTION
  76.     CALL    BDOS    ;PRINT ERROR MESSAVGE
  77. EXIT    LHLD    STACK    ;GET CCP'S STACK
  78.     SPHL        ;RESTORE STACK
  79.     RET        ;RETURN TO CCP
  80. ;
  81. ;MAKE WAS SUCCESSFUL - OPEN FILE
  82. ;
  83. DIROK    LXI    D,FCB    ;POINT TO FCB
  84.     MVI    C,OPEN    ;GET 'OPEN' FUNCTION
  85.     CALL    BDOS    ;OPEN THE FILE
  86.     INR    A    ;SHOULD BE OK
  87.     JNZ    RDLP    ;OPEN WAS OK
  88. ;
  89. ;OPEN FAILED - EXIT
  90. ;
  91.     LXI    D,OPNER    ;POINT TO ERR MSG
  92.     JMP    ERXIT    ;PRINT MSG, EXIT
  93. ;
  94. ;OPEN WAS OK - START READING
  95. ;
  96. RDLP    EQU    $    ;READ LOOP
  97.     MVI    A,10H    ;GET TARBELL RESET CHAR
  98.     OUT    6EH    ;RESET TARBELL
  99. ;
  100. ;READ THE TAPE HEADER
  101. ;
  102.     MVI    B,11    ;# OF CHARS TO MATCH
  103.     MVI    C,0    ;# OF BAD CHARS IN HDR
  104.     LXI    H,TAPEN     ;POINT TO NAME TO MATCH
  105.     LXI    D,SAVEN    ;SAVE NAME TO PRINT IF NOT =
  106. HEADR    CALL    TBIN    ;READ CHAR
  107.     STAX    D    ;SAVE CHAR OF NAME
  108.     CMP    M    ;MATCH?
  109.     JZ    MATCH    ;YES
  110. ;
  111. ;MISMATCH - BUMP COUNT OF UNMATCHED CHARS
  112. ;
  113.     INR    C
  114. MATCH    INX    D    ;POINT TO NEXT CHAR
  115.     INX    H    ;POINT TO NEXT CHAR
  116.     DCR    B    ;11 MATCHED?
  117.     JNZ    HEADR    ;NO
  118. ;
  119. ;HEADER MATCH?
  120. ;
  121.     XRA    A    ;GET 0
  122.     ORA    C    ;GET MISMATCH COUNT
  123.     JZ    GOLOAD    ;OK, LOAD IT
  124. ;
  125. ;BAD HEADER - PRINT MESSAGE
  126. ;
  127.     LXI    D,BADHDR
  128.     MVI    C,PRINT
  129.     CALL    BDOS
  130.     JMP    RDLP    ;TRY AGAIN
  131. ;
  132. ;GOT HEADER MATCH, START READING
  133. ;
  134. GOLOAD    LXI    H,BUFF    ;POINT TO BUFFER
  135.     CALL    TBIN    ;READ THE NUMBER OF SECTORS
  136.     STA    NSEC    ;SAVE NUMBER OF SECTORS
  137.     MOV    B,A    ;SAVE IN B
  138.     ORA    A    ;ZERO SECTORS (I.E. EOF)?
  139.     JZ    EOF    ;YES, EOF
  140.     XRA    A
  141.     STA    CKSUM    ;INIT CKSUM TO 0
  142. SECT    MVI    C,128    ;C=BYTES/SECTOR
  143. CHAR    CALL    TBIN    ;READ A CHAR
  144.     MOV    M,A    ;STORE IT
  145.     INX    H    ;INCR BUFF POINTER
  146.     DCR    C    ;MORE IN SECTOR?
  147.     JNZ    CHAR    ;YES
  148.     DCR    B    ;MORE SECTORS?
  149.     JNZ    SECT    ;YES
  150. ;VERIFY CKSUM
  151.     CALL    TBIN    ;READ CKSUM
  152.     LDA    CKSUM
  153.     ORA    A
  154.     JZ    NOCKS
  155. ;GOT CHECKSUM ERR
  156.     LXI    D,CSERM
  157.     MVI    C,PRINT
  158.     CALL    BDOS
  159. ;
  160. ;HAVE READ 1 BUFFER FULL, WRITE IT TO DISK
  161. ;
  162. NOCKS    LXI    H,BUFF    ;GET BUFF ADDR
  163.     SHLD    BUFAD    ;INIT 'WRITE FROM' ADDR
  164. WRLP    LHLD    BUFAD    ;GET CURRENT BUFF ADDR
  165.     XCHG        ;MOVE TO D,E
  166.     LXI    H,128    ;HL=BUFF LENGTH
  167.     DAD    D    ;POINT TO NEXT BUFFER
  168.     SHLD    BUFAD    ;UPDATE BUFF ADDR
  169.     MVI    C,STDMA    ;SET UP DMA
  170.     CALL    BDOS    ;..ADDR
  171.     LXI    D,FCB    ;WRITE
  172.     MVI    C,WRITE    ;..A
  173.     CALL    BDOS    ;..SECTOR
  174.     ORA    A    ;CHECK STATUS
  175.     JZ    WROK    ;WRITE WAS OK
  176. ;
  177. ;WRITE ERROR
  178. ;
  179.     ADI    '0'    ;GET ERROR NUMBER FROM STAT
  180.     STA    WRERN    ;SAVE ERROR #
  181.     LXI    D,WRERR    ;GET MESSAGE ADDR
  182.     JMP    ERXIT    ;PRINT MESSAGE, EXIT
  183. WROK    LDA    NSEC    ;ARE WE
  184.     DCR    A    ;..DONE
  185.     STA    NSEC    ;..WRITING THIS SECTOR?
  186.     JNZ    WRLP    ;NO
  187.     JMP    RDLP    ;YES, READ NEXT BUFFER
  188. ;
  189. ;EOF REACHED - CLOSE FILE
  190. ;
  191. EOF    LXI    D,FCB
  192.     MVI    C,CLOSE
  193.     CALL    BDOS
  194.     INR    A    ;CLOSE OK?
  195.     JNZ    EXIT    ;YES, RETURN
  196. ;CLOSE ERROR
  197.     LXI    D,CLSER
  198.     JMP    ERXIT
  199. OPNER    DB    'OPEN FAILED$'
  200. NODIR    DB    'NO DIR. SPACE$'
  201. WRERR    DB    'WRITE ERR '
  202. WRERN    DB    0,'$'
  203. CSERM    DB    'CKSUM',13,10,'$' 
  204. CLSER    DB    'CLOSE ERR$'
  205. BADHDR    DB    'MISMATCHED HEADER NAME: '
  206. SAVEN    DS    11    ;FILE NAME
  207.     DB    0DH,0AH,'$'    ;END OF MESSAGE
  208. ;MOVE ROUTINE, FROM HL TO DE FOR LENGTH IN B
  209. MOVE    MOV    A,M
  210.     STAX    D
  211.     INX    H
  212.     INX    D
  213.     DCR    B
  214.     JNZ    MOVE
  215.     RET
  216. ;TARBELL INPUT ROUTINE
  217. TBIN    IN    6EH
  218.     ANI    10H
  219.     JNZ    TBIN
  220.     IN    6FH
  221. ;CALC CKSUM
  222.     PUSH    H
  223.     LXI    H,CKSUM
  224.     PUSH    PSW    ;SAVE CHAR
  225.     XRA    M    ;CALC CKSUM
  226.     MOV    M,A    ;SAVE CKSUM
  227.     POP    PSW
  228.     POP    H
  229.     RET
  230.     DS    30    ;STACK SPACE
  231. STACK    DS    2    ;SAVE STACK POINTER HERE
  232. TAPEN    DS    11    ;TAPE SAVE NAME
  233. MYFCB    DS    9    ;0,FILENAME
  234.     DB    'OLD'    ;FOR DELETE, RENAME
  235.     DB    0
  236.     DS    20    ;END OF FCB
  237. CKSUM    DS    1    ;CHECKSUM 
  238. NSEC    DS    1    ;NUMBER OF SECTORS READ
  239. BUFAD    DW    BUFF    ;CURR DMA BUFF POINTER
  240. BUFF    EQU    $    ;START OF BUFFER
  241. ;
  242. ; BDOS EQUATES (VERSION 2)
  243. ;
  244. RDCON    EQU    1
  245. WRCON    EQU    2
  246. PRINT    EQU    9
  247. OPEN    EQU    15    ;0FFH=NOT FOUND
  248. CLOSE    EQU    16    ;   "    "
  249. SRCHF    EQU    17    ;   "    "
  250. SRCHN    EQU    18    ;   "    "
  251. DELT    EQU    19    ;NO RET CODE
  252. READ    EQU    20    ;0=OK, 1=EOF
  253. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?, 0FFH=NO DIR SPC
  254. MAKE    EQU    22    ;0FFH=BAD
  255. REN    EQU    23    ;0FFH=BAD
  256. STDMA    EQU    26
  257. BDOS    EQU    5
  258. REIPL    EQU    0
  259.     END    100H
  260.