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 / CPMUG019.ARK / TSAVE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  10KB  |  299 lines

  1. ;         TSAVE - SAVE CP/M DISK FILE ONTO CASSETTE TAPE
  2. ;
  3. ;         L.E. HUGHES     8080SDC     77/06/12
  4.  
  5.           ORG    100H
  6.  BDOS     EQU    0005H          ;BDOS ENTRY POINT
  7.  OPENF    EQU    15             ;"OPEN FILE" FUNCTION CODE
  8.  READF    EQU    20             ;"READ FILE" FUNCTION CODE
  9.  TYPEF    EQU    2              ;"TYPE CONSOLE" FUNCTION CODE
  10.  
  11.  FCB      EQU    5CH            ;FILE CONTROL BLOCK ADDRESS
  12.  DBUF     EQU    80H            ;DISK BUFFER ADDRESS
  13.  
  14.  CASC     EQU    6EH            ;CASSETTE TAPE CONTROL/STATUS PORT
  15.  CASD     EQU    6FH            ;CASSETTE TAPE DATA PORT
  16.  
  17.  CR       EQU    0DH            ;ASCII CARRIAGE RETURN
  18.  LF       EQU    0AH            ;ASCII LINE FEED
  19.  SOH      EQU    01H            ;ASCII START OF HEADER
  20.  STX      EQU    02H            ;ASCII START OF TEXT
  21.  ETX      EQU    03H            ;ASCII END OF TEXT
  22.  
  23. ;         FILE CONTROL BLOCK DEFINITIONS
  24.  
  25.  FCBDN    EQU    FCB+0          ;DISK NAME
  26.  FCBFN    EQU    FCB+1          ;FILE NAME
  27.  FCBFT    EQU    FCB+9          ;FILE TYPE
  28.  FCBRL    EQU    FCB+12         ;CURRENT REEL NUMBER
  29.  FCBRC    EQU    FCB+15         ;CURRENT RECORD COUNT (0 TO 128)
  30.  FCBCR    EQU    FCB+32         ;CURRENT NEXT-RECORD
  31.  
  32.  FNAME    EQU    FCBFN
  33.  
  34. ;         MAIN PROGRAM
  35.  
  36.  TSAVE:   LXI    H,0
  37.           DAD    SP
  38.           SHLD   OLDSP
  39.           LXI    SP,STACK+64
  40.           LXI    D,FCB          ;OPEN DISK FILE
  41.           MVI    C,OPENF
  42.           CALL   BDOS
  43.           CPI    255            ;JUMP IF OK
  44.           JNZ    TSAV1
  45.           LXI    H,MSG1         ;ELSE PRINT 'FILE NOT FOUND'
  46.           CALL   WAS
  47.           RET                   ;AND RETURN TO CP/M
  48.  TSAV1:   XRA    A              ;SET 'NEXT-RECORD' PTR TO 0
  49.           STA    FCBCR
  50.           STA    PRN            ;INITIALIZE PRN TO 0
  51.  TSAV2:   LXI    H,TBUF         ;POINT TO TBUF
  52.           LXI    D,0            ;SET TBUF SIZE TO 0
  53.  TSAV5:   CALL   DISKR          ;READ NEXT SECTOR ON DISK INTO DBUF
  54.           CPI    1              ;JUMP IF END-OF-FILE ON DISK
  55.           JZ     TSAV4
  56.           PUSH   D
  57.           LXI    D,DBUF         ;COPY DBUF TO TBUF
  58.           MVI    C,128          ;DBUF LENGTH
  59.  TSAV3:   LDAX   D              ;FETCH NEXT BYTE FROM DBUF
  60.           INX    D
  61.           MOV    M,A            ;STORE IT IN TBUF
  62.           INX    H
  63.           DCR    C
  64.           JNZ    TSAV3          ;COPY ENTIRE DBUF
  65.           POP    D
  66.           MOV    A,E            ;ADD 128 TO TBUF SIZE
  67.           ADI    128
  68.           MOV    E,A
  69.           JNC    $+4
  70.           INR    D
  71.           MOV    A,D            ;LOOP UNTIL 8 SECTORS READ
  72.           CPI    4
  73.           JNZ    TSAV5
  74.           MVI    A,0            ;WRITE TBUF TO TAPE UNIT 0
  75.           LXI    H,TBUF
  76.           CALL   CTWR
  77.           JMP    TSAV2          ;LOOP THRU ENTIRE DISK FILE
  78.  TSAV4:   MVI    A,0            ;WRITE SHORT PR TO TAPE (EOF)
  79.           LXI    H,TBUF
  80.           CALL   CTWR
  81.           LXI    H,MSG2         ;PRINT 'DONE' AND RETURN TO CP/M
  82.           CALL   WAS
  83.           LHLD   OLDSP
  84.           SPHL
  85.           RET
  86.  
  87. ;         DISKR - READ NEXT DISK SECTOR
  88.  
  89.  DISKR:   PUSH   H
  90.           PUSH   D
  91.           PUSH   B
  92.           LXI    D,FCB
  93.           MVI    C,READF
  94.           CALL   BDOS
  95.           POP    B
  96.           POP    D
  97.           POP    H
  98.           RET
  99.  
  100. ;         WAS - WRITE ASCII STRING (TO CONSOLE)
  101. ;
  102. ;         ENTRY CONDITIONS
  103. ;            HL - POINTS TO STRING TO WRITE
  104.  
  105.  WAS:     MOV    A,M            ;FETCH NEXT CHAR
  106.           INX    H
  107.           ORA    A              ;RETURN IF END-OF-STRING
  108.           RZ
  109.           CALL   WAC            ;ELSE PRINT CHAR AND LOOP
  110.           JMP    WAS
  111.  
  112. ;         WAC - WRITE ASCII CHARACTER (TO CONSOLE)
  113.  
  114.  WAC:     PUSH   H
  115.           PUSH   D
  116.           PUSH   B
  117.           MVI    C,TYPEF
  118.           MOV    E,A
  119.           CALL   BDOS
  120.           POP    B
  121.           POP    D
  122.           POP    H
  123.           RET
  124.  
  125. ;         CTWR - WRITE PHYSICAL RECORD TO CASSETTE TAPE
  126. ;
  127. ;         FOR TARBELL INTERFACE WITH LASALLE RELAY BOARD
  128. ;
  129. ;         PHYSICAL RECORD FORMAT
  130. ;
  131. ;            BYTE   SIZE   FIELD CONTENTS
  132. ;            00     01     SOH (ASCII START-OF-HEADER)
  133. ;            01     08     FILENAME, LEFT JUSTIFIED, BLANK FILLED
  134. ;            09     03     FILETYPE, LEFT JUSTIFIED, BLANK FILLED
  135. ;            12     01     PHYSICAL RECORD NUMBER, 1 BYTE INTEGER
  136. ;            13     02     PHYSICAL RECORD SIZE, BYTES, 2 BYTE INTEGER
  137. ;            15     01     STX (ASCII START-OF-TEXT)
  138. ;            16     XX     DATA BYTES
  139. ;            16+XX  01     ETX (ASCII END-OF-TEXT)
  140. ;            17+XX  02     CYCLIC REDUNDANCY CHECK, 2 BYTE INTEGER
  141. ;
  142. ;         ENTRY CONDITIONS
  143. ;            HL - POINTS TO BLOCK TO BE WRITTEN TO TAPE
  144. ;            DE - NUMBER OF BYTES TO WRITE (PHYSICAL RECORD SIZE)
  145. ;            A - CASSETTE UNIT NUMBER (CURRENTLY 0 OR 1)
  146. ;            PRN - PHYSICAL RECORD NUMBER. SHOULD BE INITIALIZED BY
  147. ;                  USER TO ZERO. INCREMENTED BY 1 BY CTWR.
  148. ;            FNAME - 11 BYTE BUFFER CONTAINING FILENAME/FILETYPE
  149.  
  150.  CTWR:    PUSH   PSW
  151.           PUSH   H              ;SAVE BUFFER POINTER
  152.           PUSH   D              ;SAVE PHYS REC SIZE
  153.           ADD    A              ;SHIFT UNIT NUMBER INTO POSITION
  154.           CALL   CTON           ;TURN ON MOTOR
  155.           MVI    A,3CH          ;WRITE START BYTE
  156.           CALL   CTOUT
  157.           MVI    A,0E6H         ;WRITE SYNC BYTE
  158.           CALL   CTOUT
  159.           MVI    A,SOH          ;WRITE SOH
  160.           CALL   CTOUT
  161.           LXI    H,0            ;CLEAR CRC
  162.           SHLD   CRC
  163.           LXI    H,FNAME        ;WRITE FILENAME/FILETYPE
  164.           LXI    D,11
  165.           CALL   CTWS
  166.           LDA    PRN            ;WRITE PHYSICAL RECORD NUMBER
  167.           CALL   CTOUT
  168.           INR    A              ;INCREMENT PRN
  169.           STA    PRN
  170.           POP    D              ;RESTORE PHYS REC SIZE
  171.           MOV    A,D            ;WRITE PHYS REC SIZE
  172.           CALL   CTOUT
  173.           MOV    A,E
  174.           CALL   CTOUT
  175.           MVI    A,STX          ;WRITE STX
  176.           CALL   CTOUT
  177.           POP    H              ;RESTORE BUFFER POINTER
  178.           PUSH   D              ;SAVE PHYS REC SIZE
  179.           CALL   CTWS           ;WRITE DATA BYTES
  180.           MVI    A,ETX          ;WRITE ETX
  181.           CALL   CTOUT
  182.           LHLD   CRC            ;WRITE CRC
  183.           MOV    A,H
  184.           CALL   CTOUT
  185.           MOV    A,L
  186.           CALL   CTOUT
  187.           XRA    A              ;SEND A NULL
  188.           CALL   CTOUT
  189.           POP    D              ;RESTORE PHYS REC SIZE
  190.           POP    PSW
  191.           JMP    CTOFF          ;IDLE MOTOR AND RETURN
  192.  
  193. ;         CTWS - WRITE STRING TO CASSETTE TAPE
  194. ;
  195. ;         ENTRY CONDITIONS
  196. ;            HL - FWA OF STRING
  197. ;            DE - SIZE OF STRING
  198.  
  199.  CTWS:    MOV    A,D            ;RETURN IF COUNT = 0
  200.           ORA    E
  201.           RZ
  202.           MOV    A,M            ;WRITE NEXT BYTE
  203.           INX    H
  204.           CALL   CTOUT
  205.           DCX    D              ;DECREMENT COUNT
  206.           JMP    CTWS           ;AND LOOP
  207.  
  208. ;         CTOUT - WRITE BYTE TO CASSETTE TAPE
  209. ;
  210. ;         ENTRY CONDITIONS
  211. ;            A - 8 BIT BYTE TO WRITE
  212. ;            B - RUNNING CHECKSUM (INIT BY USER TO ZERO)
  213.  
  214.  CTOUT:   PUSH   PSW
  215.           IN     CASC           ;AWAIT TBE (INVERTED)
  216.           ANI    20H
  217.           JNZ    $-4
  218.           POP    PSW
  219.           OUT    CASD           ;WRITE BYTE
  220.           CMA                   ;DISPLAY ON LIGHTS, THEN FALL THRU TO CTCRC
  221.           OUT    0FFH
  222.           CMA
  223.  
  224. ;         CTCRC - UPDATE CRC
  225. ;
  226. ;         ENTRY CONDITIONS
  227. ;            A - NEW DATA BYTE
  228. ;            CRC - 2 BYTE BUFFER CONTAINING CRC
  229. ;            CRCP - 2 BYTE CRC POLYNOMIAL CONSTANT
  230.  
  231.  CTCRC:   PUSH   PSW            ;SAVE REGS
  232.           PUSH   B
  233.           PUSH   D
  234.           PUSH   H
  235.           MOV    B,A            ;SAVE DATA BYTE
  236.           MVI    C,8            ;LOOP COUNT
  237.  CTCR1:   ANI    80H            ;MASK OFF MSB OF DATA BYTE
  238.           LHLD   CRC            ;FETCH CRC INTO HL
  239.           XRA    H              ;XOR MSB OF DATA BYTE INTO CRC
  240.           MOV    H,A
  241.           DAD    H              ;LEFT SHIFT CRC 1 BIT
  242.           JNC    CTCR2          ;JUMP IF NO CARRY
  243.           MOV    A,H            ;HL = HL XOR CRCP
  244.           XRI    CRCP SHR 8
  245.           MOV    H,A
  246.           MOV    A,L
  247.           XRI    CRCP AND 0FFH
  248.           MOV    L,A
  249.  CTCR2:   SHLD   CRC            ;REPLACE CRC
  250.           DCR    C              ;DECREMENT LOOP COUNT
  251.           JZ     CTCR3          ;EXIT WHEN ENTIRE BYTE PROCESSED
  252.           MOV    A,B            ;SHIFT DATA BYTE LEFT 1 BIT
  253.           ADD    A
  254.           MOV    B,A
  255.           JMP    CTCR1          ;LOOP
  256.  CTCR3:   POP    H              ;RESTORE REGS AND RETURN
  257.           POP    D
  258.           POP    B
  259.           POP    PSW
  260.           RET
  261.  
  262. ;         CTON - TURN ON CASSETTE TAPE MOTOR
  263. ;
  264. ;         ENTRY CONDITIONS
  265. ;            A - UNIT NO. (SHL 1) AND OPTIONAL HUNT MODE BIT
  266.  
  267.  CTON:    ORI    1              ;TURN ON MOTOR CONTROL BIT
  268.           OUT    CASC
  269.           IN     CASC           ;WAIT UNTIL NON-BUSY
  270.           ANI    1
  271.           JZ     $-4
  272.           RET
  273.  
  274. ;         CTOFF - IDLE CASSETTE TAPE MOTOR
  275.  
  276.  CTOFF:   PUSH   PSW            ;SAVE A AND FLAGS
  277.           XRA    A              ;CLEAR INTERFACE
  278.           OUT    CASC
  279.           IN     CASC           ;WAIT UNTIL NON-BUSY
  280.           ANI    1
  281.           JZ     $-4
  282.           POP    PSW
  283.           RET
  284.  
  285. ;         DATA AREA
  286.  
  287.  MSG1:    DB     'FILE NOT FOUND',CR,LF,0
  288.  MSG2:    DB     'DONE',CR,LF,0
  289.  
  290.  PRN:     DS     1
  291.  TBUF:    DS     1024
  292.  CRC:     DS     2              ;CYCLIC REDUNDANCY CHECK
  293.  CRCP:    EQU    8005H          ;CRC POLYNOMIAL (CRC-16)
  294.  
  295.  OLDSP:   DS     2
  296.  STACK:   DS     64
  297.  
  298.           END    TSAVE
  299.