home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv009.ark / MIC-XFER.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  6.2 KB  |  221 lines

  1.     TITLE    'MIC-XFER - MOVE A FILE BETWEEN REGULAR CP/M AND MICROPOLIS'
  2. ;    COPYRIGHT 1978,1979 BY  BRUCE R. RATOFF.   ALL RIGHTS RESERVED
  3. ;    LAST REV 5/20/79
  4. ;
  5. BUFFER    EQU    80H        ; BUFFER FOR DATA TRANSFER (CP/M DEFAULT)
  6. MBDOS    EQU    3106H        ; BDOS ENTRY POINT IN A 17K MIC CP/M SYSTEM
  7. MCTL    EQU    0D200H        ; MICROPOLIS BOARD ADDRESS + 200H
  8. CONADR    EQU    49H        ; ADDRESS WHERE MICROPOLIS CP/M STORES MCTL
  9. MUNIT    EQU    46H        ;    "      "       "       "     "    UNIT #
  10. TRKTBL    EQU    40H        ;    "      "       "       "     "    TRK. #
  11. MRDBUF    EQU    42F4H        ; READ BUFFER IN 17K MICROPOLIS CP/M
  12. MWRBUF    EQU    41E8H        ; WRITE BUFFER IN 17K MICROPOLIS CP/M
  13. LOWSYS    EQU    0A00H        ; WHERE MOVCPM LEAVES SYSTEM IMAGE
  14. HISYS    EQU    2900H        ; START OF 17K MICROPOLIS CP/M SYSTEM IMAGE
  15. SYSLEN    EQU    1900H        ; LENGTH OF MICROPOLIS CP/M SYSTEM IMAGE
  16. MSELDK    EQU    3E1BH        ; ADDR OF DRIVE SELECT VECTOR IN 17K SYSTEM
  17. ;
  18. BDOS    EQU    5        ; BDOS ENTRY POINT IN HOST SYSTEM
  19. DFCB    EQU    5CH        ; FIRST DEFAULT FILE CONTROL BLOCK
  20. DFCB2    EQU    6CH        ; SECOND DEFAULT FILE CONTROL BLOCK
  21. LOGDSK    EQU    4        ; WHERE CCP KEEPS CURRENT LOGGED DRIVE #
  22. ;
  23.     ORG    100H
  24. START:    LXI    SP,HISYS-1    ;PUT STACK BELOW EXTRA SYSTEM IMAGE
  25.     LDA    DFCB2+1        ;LOOK AT DESTINATION SPECIFIER
  26.     CPI    'M'        ;MICROPOLIS?
  27.     JZ    MOVSYS        ;THEN LEAVE POINTERS AS LOADED
  28.     CPI    'I'        ;IBM-FORMAT?
  29.     JZ    SWPDOS        ;IF IBM, SWAP POINTERS
  30.     LXI    D,VALCMD    ;ALL ELSE IS ILLEGAL, SO SQUAWK
  31.     JMP    ABEND
  32. VALCMD:    DB    13,10,'VALID COMMAND FORMAT:'
  33.     DB    13,10,'MIC-XFER SRCE-DRVE:SRCE-FILE.TYP DEST-DRVE:DEST-SYS'
  34.     DB    13,10,'    SRCE-DRVE AND DEST-DRVE MAY BE A,B,C OR D'
  35.     DB    13,10,'    DEST-SYS  MAY BE I (IBM) OR M (MICROPOLIS)'
  36.     DB    '$'
  37. SWPDOS:    LXI    H,BDOS        ;SWAP READ AND WRITE DOS'S
  38.     SHLD    WDOS+1
  39.     LXI    H,MBDOS
  40.     SHLD    RDOS+1
  41. MOVSYS:    LXI    H,LOWSYS    ;POINT TO MOVCPM SYSTEM IMAGE
  42.     LXI    D,HISYS        ;POINT TO CORRECT EXECUTION ADDRESS
  43.     LXI    B,SYSLEN    ;HOW MUCH TO MOVE
  44.     CALL    LDIR        ;GO MOVE IT
  45.     LXI    H,MCTL        ;SET UP POINTER TO MICROPOLIS CONTROLLER
  46.     SHLD    CONADR        ;AS THE MICROPOLIS BOOT WOULD NORMALLY DO
  47.     LXI    H,0FFFFH    ;ZAP CURRENT TRACK ON ALL MICROPOLIS DRIVES
  48.     SHLD    TRKTBL        ; (THIS FORCES A RECALIBRATE WHEN ACCESSED)
  49.     SHLD    TRKTBL+2
  50.     SHLD    MRDBUF        ;ZAP CURRENT TRK/SEC IN MICROPOLIS READ BUFFER
  51.     SHLD    MWRBUF        ;AND WRITE BUFFER (FORCES A READ)
  52.     LDA    DFCB        ;PRESERVE SOURCE DRIVE #
  53.     STA    HFCB
  54.     LDA    DFCB2        ;CARRY OVER DESTINATION DRIVE
  55.     STA    MFCB
  56.     MVI    C,13        ;RESET MICROPOLIS SYSTEM
  57.     CALL    MBDOS
  58.     LXI    H,FILIST    ;SCAN 'READ' SYSTEM FOR ELIGIBLE FILES,
  59.     SHLD    FILPTR        ;DEVELOPING A LIST AT 'FILIST' AND A COUNT
  60.     MVI    A,1        ;AT 'NFILES'
  61.     STA    NFILES
  62.     LXI    D,DFCB
  63.     MVI    C,17        ;GIVE INITIAL SEARCH COMMAND
  64.     CALL    RDOS
  65.     CPI    255        ;IF NO MATCHES AT ALL, COMPLAIN AND QUIT
  66.     JZ    FNFERR
  67. TOLIST:    LHLD    FILPTR        ;HAVE A MATCH, MOVE IT INTO FILIST
  68.     XCHG
  69.     RRC            ;COMPUTE (DIR ENTRY # MOD 4) * 32
  70.     RRC            ;TO GET OFFSET INTO BUFFER
  71.     RRC
  72.     ANI    60H
  73.     MOV    C,A        ;ADD OFFSET TO BUFFER ADDRESS
  74.     MVI    B,0        ;+ 1 TO SKIP DELETE FLAG IN DIRECTORY ENTRY
  75.     LXI    H,BUFFER+1
  76.     DAD    B
  77.     LXI    B,11        ;MOVE NAME AND TYPE TO FILIST
  78.     CALL    LDIR
  79.     LXI    H,NFILES    ;BUMP COUNT OF FILES
  80.     INR    M
  81.     XCHG
  82.     SHLD    FILPTR        ;UPDATE POINTER TO FILIST
  83.     LXI    D,DFCB
  84.     MVI    C,18        ;GIVE 'CONTINUE SEARCH' COMMAND
  85.     CALL    RDOS        ;TO 'READ' SYSTEM
  86.     CPI    255        ;END OF SEARCH?
  87.     JNZ    TOLIST        ;NO, GO ADD IT TO LIST
  88.     LXI    H,FILIST    ;WE HIT THE END, RESET POINTER TO FILIST
  89.     SHLD    FILPTR        ; AND GO START COPYING
  90.     JMP    PGO
  91. ;
  92. ;THIS ROUTINE WILL TEST FOR BREAK AND PRINT A MESSAGE
  93. PEXIT:    MVI    C,11
  94.     PUSH    D
  95.     CALL    BDOS        ;CONSOLE STATUS CALL
  96.     POP    D
  97.     RAR            ;FORCE ABEND IF TRUE, ELSE JUST PRINT
  98.     JNC    PMESS
  99. ;
  100. ABEND:    MVI    A,1        ;MAKE PGO THINK IT'S FINISHED BY
  101.     STA    NFILES        ;ZAPPING FILE COUNT
  102. ;
  103. PMESS:    MVI    C,9        ;PRINT A MESSAGE
  104.     CALL    BDOS
  105. ;
  106. ;HERE TO COPY NEXT FILE
  107. PGO:    LXI    H,NFILES    ;DECREMENT FILE COUNT, SEE IF ANY LEFT
  108.     DCR    M
  109.     JZ    0        ;IF NONE LEFT, EXIT
  110.     LHLD    FILPTR        ;POINT TO NEXT NAME IN FILIST
  111.     LXI    D,HFCB+1    ;COPY IT TO FCB
  112.     LXI    B,11
  113.     CALL    LDIR
  114.     SHLD    FILPTR        ;UPDATE POINTER TO FILIST
  115.     LXI    D,COPMSG
  116.     MVI    C,9        ;ANNOUNCE WHAT WE'RE COPYING
  117.     CALL    BDOS
  118.     LXI    H,' $'
  119.     SHLD    HFCB+12        ;BY DROPPING '$' HERE, WE CAN PRINT STRAIGHT
  120.     LXI    D,HFCB+1    ; FROM FCB USING CP/M 'PRINT BUFFER' CALL
  121.     MVI    C,9
  122.     CALL    BDOS
  123.     LXI    H,0        ;CLEAN OUT '$' SO FILE CALLS WILL WORK
  124.     SHLD    HFCB+12
  125.     SHLD    HFCB+14
  126. OPENI:    LXI    D,HFCB        ;OPEN FILE ON 'READ' DOS
  127.     MVI    C,15
  128.     CALL    RDOS
  129.     INR    A
  130.     JNZ    GOTFIL
  131. FNFERR:    LXI    D,FNFMSG    ;KVETCH IF OPEN FAILS
  132.     JMP    PEXIT
  133. FNFMSG:    DB    'FILE NOT FOUND$'
  134. GOTFIL:    LXI    H,HFCB+1    ;COPY NAME TO 'WRITE' FCB
  135.     LXI    D,MFCB+1
  136.     LXI    B,11
  137.     CALL    LDIR
  138.     MVI    B,21
  139.     SUB    A        ;CLEAR REST OF 'WRITE' FCB
  140. FCBZ:    STAX    D
  141.     INX    D
  142.     DCR    B
  143.     JNZ    FCBZ
  144.     STA    HFCB+32        ;CLEAR 'NEXT SECTOR' IN READ FCB
  145.     LXI    D,MFCB        ;DELETE DESTINATION FILE
  146.     MVI    C,19
  147.     CALL    WDOS
  148.     MVI    C,22        ;CREATE DESTINATION FILE
  149.     LXI    D,MFCB
  150.     CALL    WDOS
  151.     INR    A
  152.     JNZ    CREOK
  153.     LXI    D,CNCMSG    ;KVETCH IF CREATE FAILS
  154.     JMP    PEXIT
  155. CNCMSG:    DB    'CANNOT CREATE FILE$'
  156. CREOK:    LXI    D,MFCB        ;OPEN DESTINATION FILE
  157.     MVI    C,15
  158.     CALL    WDOS
  159.     INR    A
  160.     JNZ    OOPNOK
  161.     LXI    D,COFMSG    ;HOW CAN CREATE SUCCEED AND OPEN FAIL?
  162.     JMP    PEXIT
  163. COFMSG:    DB    'CANNOT OPEN OUTPUT FILE$'
  164. OOPNOK:    LXI    D,HFCB        ;READ SECTOR FROM 'READ' DOS
  165.     MVI    C,20
  166.     CALL    RDOS
  167.     ORA    A        ;ASSUME ERROR RETURN IS EOF
  168.     JNZ    COPDON
  169.     LXI    D,MFCB        ;WRITE SECTOR TO 'WRITE' DOS
  170.     MVI    C,21
  171.     CALL    WDOS
  172.     ORA    A        ;MAKE SURE WRITE SUCCEEDS
  173.     JZ    OOPNOK        ;IF SO, GO BACK FOR MORE
  174.     LXI    D,WERMSG    ;ELSE KVETCH
  175.     MVI    C,9
  176.     CALL    BDOS
  177.     JMP    PEXIT
  178. WERMSG:    DB    'DISK WRITE ERROR$'
  179. COPDON:    MVI    C,16        ;CLOSE OUTPUT FILE
  180.     LXI    D,MFCB
  181.     CALL    WDOS
  182.     PUSH    PSW
  183.     LDA    MUNIT        ;MOMENTARILY CHANGING UNITS WILL ASSURE
  184.     XRI    1        ;THAT MICROPOLIS CP/M HAS FLUSHED ITS BUFFERS
  185.     MOV    C,A
  186.     CALL    MSELDK
  187.     LDA    MUNIT
  188.     XRI    1
  189.     MOV    C,A
  190.     CALL    MSELDK
  191.     POP    PSW
  192.     LXI    D,OKMSG        ;ANNOUNCE SUCCESSFUL COPY
  193.     INR    A        ;OR CLOSE ERROR, DEPENDING ON RETURN
  194.     JNZ    PEXIT
  195.     LXI    D,CERMSG
  196.     JMP    PEXIT        ;PRINT MESSAGE AND CONTINUE
  197. COPMSG:    DB    13,10,'COPYING $'
  198. OKMSG:    DB    'SUCCESSFUL COPY$'
  199. CERMSG:    DB    'ERROR ON CLOSE$'
  200. ;
  201. LDIR:    MOV    A,M        ;THIS BLOCK MOVE ROUTINE SIMULATES
  202.     STAX    D        ;A Z80 'LDIR' INSTRUCTION
  203.     INX    H
  204.     INX    D
  205.     DCX    B
  206.     MOV    A,B
  207.     ORA    C
  208.     JNZ    LDIR
  209.     RET
  210. ;
  211. RDOS:    JMP    BDOS        ;POINTER TO DOS FOR READS
  212. WDOS:    JMP    MBDOS        ;POINTER TO DOS FOR WRITES
  213. ;
  214. HFCB:    DS    33        ;FCB FOR READS
  215. MFCB:    DS    33        ;FCB FOR WRITES
  216. FILPTR:    DS    2        ;POINTER TO CURRENT FILE IN FILIST
  217. NFILES:    DS    1        ;COUNT OF FILES IN FILIST
  218. FILIST:    DS    254*11        ;LIST OF FILENAMES TO BE COPIED
  219. ;
  220.     END
  221.