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

  1. ;****************************************
  2. ;
  3. ;               ISIS II TO CPM
  4. ;             FILE COPY UTILITY
  5. ;
  6. ;                VERSION 1.1
  7. ;  MODIFIED VERSION
  8. ;        ORIGINAL WOULD NOT COPY A FILE LONGER THAN 16K
  9. ;        BECAUSE OF IMPROPERLY SETTING THE LINKS
  10. ;        THIS VERSION HAS BEEN TESTED ON LARGER THAN 16K
  11. ;        FILES AND SHOULD WORK WITH ANY SIZE FILE BUT HAS
  12. ;        NOT BEEN TESTED ON FILES > 48K.
  13. ;
  14. ;****************************************
  15.  
  16.     ORG    100H
  17. ICOPY:    LXI    SP,STACK    ;SET STACK
  18.     MVI    C,1        ;SELECT DISK 1
  19.     CALL    SDSK
  20.     CALL    HOME        ;HOME DISK 1
  21.     LXI    D,DIRLNK    ;POINT TO DIR LINK BLOCK LINK
  22.     LXI    H,DBCA        ;DIR BCA
  23.     CALL    GLB        ;GET LINK BLOCK
  24. ICL0:    LXI    H,DBCA        ;DIR BCA
  25.     CALL    GDB        ;GET DIR BLOCK
  26.     JC    NOTF        ;NO MORE DIR BLOCKS, ERR
  27.     LXI    H,DBUF        ;DIR BUFFER
  28.     SHLD    DENT        ;SAVE IN POINTER
  29.     MVI    A,8        ;NUMBER OF  ENTRIES/BLOCK
  30.     STA    DCNT        ;SAVE
  31. ICL1:    LHLD    DENT        ;GET DIR ENTRY PTR
  32.     MOV    A,M        ;GET STATUS BYTE
  33.     CPI    00        ;ACTIVE?
  34.     JNZ    ILN1        ;NO, GET NEXT ENTRY
  35.     INX    H        ;POINT TO FN
  36.     LXI    D,TFCB+1    ;POINT TO ENTERED FN
  37.     MVI    B,6        ;FN SIZE
  38.     CALL    FCHK        ;TEST FN
  39.     JNZ    ILN1        ;NO, GET NEXT ENTRY
  40.     LHLD    DENT        ;GET DIR ENTRY ADDR
  41.     LXI    D,7        ;OFFSET TO EXT.
  42.     DAD    D        ;ADDR OF EXT.
  43.     LXI    D,TFCB+1+8    ;EXT
  44.     MVI    B,3        ;SIZE OF EXT.
  45.     CALL    FCHK        ;TEST EXT
  46.     JZ    ICL2        ;OK, FOUND FILE
  47. ILN1:    LHLD    DENT        ;POINTER TO ENTRY
  48.     LXI    D,16        ;SIZE OF ENTRY
  49.     DAD    D        ;POINT TO NEXT ENTRY
  50.     SHLD    DENT
  51.     LDA    DCNT        ;ENTRY COUNTER
  52.     DCR    A        ;DECREMENT
  53.     STA    DCNT
  54.     JNZ    ICL1        ;LOOP
  55.     JMP    ICL0
  56.  
  57. NOTF:    LXI    D,MSG1
  58.     MVI    C,09
  59.     CALL    CPM
  60.     JMP    EXIT
  61.  
  62. IOERR:    LXI    D,MSG2
  63.     MVI    C,09
  64.     CALL    CPM
  65.     JMP    EXIT
  66.  
  67. EXIT:    MVI    C,0
  68.     CALL    SDSK        ;SET DISK 0
  69.     JMP    BOOT
  70.  
  71. ICL2:    LHLD    DENT        ;GET DIR ENTRY ADDRESS
  72.     LXI    D,12        ;OFFSET TO COUNT
  73.     DAD    D
  74.     MOV    E,M
  75.     INX    H
  76.     MOV    D,M        ;BLOCK COUNT IN DE
  77.     XCHG
  78.     SHLD    BCNT        ;SAVE BLOCK COUNT
  79.     INX    D        ;POINT TO LINK BLOCK LINK
  80.     LXI    H,FBCA        ;FILE BCA
  81.     CALL    GLB        ;GET LINK BLOCK
  82.     MVI    C,0
  83.     CALL    SDSK        ;SET DISK A
  84.     LXI    D,TFCB        ;POINT TO FCB
  85.     MVI    C,CREATE
  86.     CALL    CPM        ;CREATE FILE
  87.     CPI    0FFH        ;ERROR?
  88.     JZ    IOERR
  89. ICL3:    LXI    H,FBCA        ;POINT TO BCA
  90.     CALL    GDB        ;GET DATA BLOCK
  91.     JC    DONE        ;FINS
  92.     LXI    D,FBUF        ;COPY FBUF TO TBUF
  93.     LXI    H,TBUF
  94.     MVI    B,128
  95.     CALL    MOVE
  96.     MVI    C,0
  97.     CALL    SDSK        ;SET DISK A
  98.     LXI    D,TFCB
  99.     MVI    C,WRITE
  100.     CALL    CPM        ;WRITE THE BLOCK ON CPM
  101.     ORA    A
  102.     JNZ    IOERR
  103.     LHLD    BCNT        ;GET BLOCK COUNT
  104.     DCX    H        ;DECREMENT
  105.     SHLD    BCNT
  106.     MOV    A,H
  107.     ORA    L        ;TEST FOR DONE
  108.     JNZ    ICL3        ;NO, LOOP
  109. DONE:    MVI    C,0
  110.     CALL    SDSK        ;SET DISK A
  111.     LXI    D,TFCB        ;FCB
  112.     MVI    C,CLOSE
  113.     CALL    CPM
  114.     JMP    BOOT        ;FINISHED
  115.  
  116. ;***************************************;
  117. ;
  118. ;           GLB - GET LINK BLOCK
  119. ;
  120. ;         DE= A(LINK TO LINK BLOCK)
  121. ;         HL= A(BLOCK CONTROL AREA)
  122. ;
  123. ;***************************************;
  124. GLB:    SHLD    BCAP        ;SAVE BCA ADDR
  125.     CALL    SEEKR        ;READ LINK BLOCK
  126.     LHLD    BCAP        ;GET BCA ADDR
  127.     LXI    D,BCBL        ;OFFSET TO LINK BUFFER
  128.     DAD    D
  129.     LXI    D,TBUF
  130.     MVI    B,128
  131.     CALL    MOVE        ;COPY TO LINK BUFFER
  132.     LHLD    BCAP        ;GET BCA ADDR
  133.     LXI    D,BCBL+4    ;OFFSET TO FIRST DATA LINK
  134.     XCHG
  135.     DAD    D        ;DE=A(FIRST DATA LINK)
  136.     XCHG
  137.     LXI    B,BCAL        ;OFFSET TO LINK PTR
  138.     DAD    B
  139.     MOV    M,E
  140.     INX    H
  141.     MOV    M,D        ;SET LINK PTR
  142.     LHLD    BCAP        ;BCA ADDR
  143.     LXI    D,BCALC        ;LINK COUNT
  144.     DAD    D
  145.     MVI    M,62        ;NO OF LINKS
  146.     RET
  147.  
  148. ;****************************************:
  149. ;
  150. ;            GDB:   GET DATA BLOCK
  151. ;
  152. ;            HL= A(BLOCK CONTROL AREA)
  153. ;
  154. ;****************************************;
  155.  
  156. GDB:    SHLD    BCAP        ;SAVE BCA ADDR
  157.     LXI    D,BCAL        ;OFFSET TO LINK BUF
  158.     DAD    D
  159.     MOV    E,M
  160.     INX    H
  161.     MOV    D,M        ;GET LINK ADDR
  162.     PUSH    D        ;SAVE LINK ADDR
  163.     LDAX    D        ;GET LINK BYTE
  164.     INX    D
  165.     MOV    C,A
  166.     LDAX    D        ;GET ANOTHER LINK BYTE
  167.     ORA    C        ;TEST FOR ZERO LINK
  168.     POP    D
  169.     JZ    GDBE        ;END, EXIT
  170.     PUSH    D        ;SAVE D AGAIN
  171.     PUSH    H
  172.     CALL    SEEKR        ;GET DATA BLOCK
  173.     POP    H
  174.     POP    D
  175.     INX    D
  176.     INX    D
  177.     MOV    M,D
  178.     DCX    H
  179.     MOV    M,E        ;UPDATE LINK PRT
  180.     LHLD    BCAP        ;GET BCA ADDR
  181.     LXI    D,BCBD        ;OFFSET TO DATA BUF
  182.     DAD    D
  183.     LXI    D,TBUF
  184.     MVI    B,128
  185.     CALL    MOVE        ;COPY DATA TO BUF
  186.     LHLD    BCAP        ;GET BCA ADDR
  187.     LXI    D,BCALC        ;LINK COUNT
  188.     DAD    D
  189.     DCR    M        ;DECREMENT
  190.     RNZ            ;OK, CONTINUE
  191.     LHLD    BCAP        ;GET BCA ADDR
  192.     LXI    D,BCBL+2    ;POINT TO LINK BUF
  193.     DAD    D
  194.     MOV    E,M        ;GET LINK
  195.     INX    H
  196.     MOV    D,M
  197.     DCX    H
  198.         MOV A,E
  199.     ORA    D        ;TEST FOR ZERO LINK
  200.     JZ    GDBE2        ;END, EXIT
  201.     XCHG            ;DE = A(NEXT LINK)
  202.     LHLD    BCAP        ;BCA ADDR
  203.     CALL    GLB        ;GET LINK BLOCK
  204.     RET
  205.  
  206. GDBE:    STC            ;INDICATE EOF
  207.     RET
  208.  
  209. GDBE2:  LXI D,FBUF      ;COPY FBUF TO TBUF
  210.         LXI H,TBUF
  211.         MVI B,128
  212.         CALL MOVE
  213.         MVI C,0
  214.         CALL SDSK       ;SET DISK A
  215.         LXI D,TFCB
  216.         MVI C,WRITE
  217.         CALL CPM
  218.         ORA A
  219.         JNZ IOERR
  220.         JMP GDBE
  221. ;
  222. ;**************************************;
  223. ;       FCHK:   FILE ID CHECK
  224. ;
  225. ;       DE = A(ISIS FILE ID)
  226. ;    HL = A(CPM FILE ID)
  227. ;    B = SIZE OF FIELD
  228. ;
  229. ;*************************************;
  230.  
  231. FCHK:    XCHG
  232. FCK1:    LDAX    D        ;GET BYTE
  233.     CPI    00        ;SEE IF END OF ID
  234.     JNZ    FCK2        ;YES, SEE IF END OK
  235.     MOV    A,M        ;GET BYTE
  236.     CPI    ' '        ;END BOTH
  237.     RZ            ;DONE
  238.     ORA    1
  239.     RET            ;DONE
  240. FCK2:    CMP    M        ;COMPARE
  241.     RNZ            ;N,G.
  242.     INX    D
  243.     INX    H
  244.     DCR    B        ;DECREMENT COUNT
  245.     JNZ    FCK1
  246.     RET
  247.  
  248. ;***************************************;
  249. ;
  250. ;         SEEKR:   SEEK DISK BLOCK
  251. ;
  252. ;         DE = A(LINK)
  253. ;
  254. ;***************************************;
  255.  
  256. SEEKR:    PUSH    D        ;SAVE DE
  257.     MVI    C,1        ;SET DISK B
  258.     CALL    SDSK
  259.     POP    D
  260.     PUSH    D
  261.     LDAX    D        ;GET SECTOR
  262.     MOV    C,A
  263.     CALL    SSEC        ;SET SECTOR
  264.     POP    D
  265.     PUSH    D
  266.     INX    D
  267.     LDAX    D        ;GET TRACK
  268.     MOV    C,A
  269.     CALL    STRK
  270.     CALL    READ        ;READ BLOCK
  271.     POP    D
  272.     RET
  273.  
  274. ;*****************************************;
  275. ;
  276. ;       MOVE:   MOVE DATA
  277. ;
  278. ;    DE = A (SOURCE)
  279. ;    HL = A(DEST)
  280. ;    B = COUNT
  281. ;
  282. ;******************************************;
  283.  
  284. MOVE:    LDAX    D        ;GET BYTE
  285.     MOV    M,A        ;STORE BYTE
  286.     INX    H
  287.     INX    D        ;BUMP PTRS
  288.     DCR    B        ;DECREMENT COUNT
  289.     JNZ    MOVE
  290.     RET
  291.  
  292. ;*******************************************;
  293. ;
  294. ;    CPM INTERFACE ROUTINES
  295. ;
  296. ;*******************************************;
  297.  
  298. SDSK:    LHLD    0001H        ;GET BIOS ADDR
  299.     MVI    L,1BH
  300.     PCHL
  301. SSEC:    LHLD    0001H
  302.     MVI    L,21H
  303.     PCHL
  304. STRK:    LHLD    0001H
  305.     MVI    L,1EH
  306.     PCHL
  307. READ:    LHLD    0001H
  308.     MVI    L,27H
  309.     PCHL
  310. HOME:    LHLD    0001H
  311.     MVI    L,18H
  312.     PCHL
  313.  
  314. ;******************************************;
  315. ;
  316. ;    BLOCK CONTROL AREA DEFINITIONS
  317. ;
  318. ;******************************************;
  319.  
  320. BCA    EQU    0
  321. BCAL    EQU    0
  322. BCALC    EQU    BCAL+2
  323. BCBL    EQU    BCALC+1
  324. BCBD    EQU    BCBL+128
  325.  
  326. ;******************************************;
  327. ;
  328. ;            DATA
  329. ;
  330. ;******************************************;
  331. MSG1:    DB    'FILE NOT FOUND',0DH,0AH,'$'
  332. MSG2:    DB    'I/O ERROR',0DH,0AH,'$'
  333.  
  334. DIRLNK:    DB    01,01
  335. DENT:    DS    2
  336. DCNT:    DS    1
  337. BCNT:    DS    2
  338. BCAP:    DS    2
  339.     DS    64
  340. STACK    EQU    $
  341.  
  342. DBCA:    DS    2
  343.     DS    1
  344.     DS    128
  345. DBUF:    DS    128
  346.  
  347. FBCA:    DS    2
  348.     DS    1
  349.     DS    128
  350. FBUF:    DS    128
  351.  
  352. TBUF    EQU    0080H
  353. TFCB    EQU    005CH
  354. CPM    EQU    0005H
  355. BOOT    EQU    0000H
  356. CREATE    EQU    22
  357. WRITE    EQU    21
  358. CLOSE    EQU    16
  359.     END
  360.