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 / CPMUG001.ARK / ICOPY.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  6KB  |  342 lines

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