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 / COPY.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  385 lines

  1. ;************************************************************
  2. ;THIS PROGRAM IS A MODIFICATION OF "COPYATOB.COM" WHICH
  3. ;HAS BEEN RE-WRITTEN TO OPERATE BOTH THROUGH CPM BDOS CALLS
  4. ;AND DIRECTLY WITH BIOS PRIMITIVES.  THE PROGRAM CAN BE
  5. ;USED TO COPY TRACKS 0 AND  1 WITH THE COMMAND "COPY SYSTEM"
  6. ;                    2  TO 76 WITH THE COMMAND "COPY DATA" AND
  7. ;                    0  TO 76 WITH THE COMMAND "COPY ALL"
  8. ;THE PROGRAM WILL OPERATE WITH A STANDARD CPM SYSTEM OF ANY 
  9. ;SIZE.  BECAUSE OF THE POTENTIAL POWER OF THIS PROGRAM
  10. ;THE INITIATING COMMAND IS TESTED FOR PRECISE SYNTAX.
  11. ;TONY GOLD (212) 722-3416.
  12. ;------------------------------------------------------------
  13. ;7/23/77
  14. ;THIS PROGRAM HAS BEEN REWRITTEN TO REMOVE THE DEPENDENCE
  15. ;ON THE LOCATION OF THE SCRATCH AREA, SO THAT IT CAN BE
  16. ;USED WITH THE DIGITAL SYSTEMS FDC3 CONTROLLER.
  17. ;
  18. ;ALSO THE PROGRAM PAUSES AFTER LOADING SO THAT THE DISKS
  19. ;CAN BE CHANGED.
  20. ;TOM KIRK (609) 921-0321.
  21. ;************************************************************
  22. ;REVISED TO KEEP COPYX FEATURES BUT RETURN SCRATCH AREA
  23. ;TO 40H.
  24. ;A.R.G  10/14/77   (VERSION 1.3)
  25. ;************************************************************
  26.     ORG    100H
  27. ;
  28. ;
  29.     JMP    VECTOR
  30.     DB    'COPY VERSION 1.3'
  31. ;************************************************************
  32. HOME:    JMP    DUMYADR
  33. SELDSK:    JMP    DUMYADR
  34. SETTRK:    JMP    DUMYADR
  35. SETSEC:    JMP    DUMYADR
  36. SETDMA:    JMP    DUMYADR
  37. READ:    JMP    DUMYADR
  38. WRITE:    JMP    DUMYADR
  39. ;************************************************************
  40. ;EQUATES
  41. EXITCPM    EQU    0
  42. LASTSEC    EQU    26
  43. BDOS    EQU    5
  44. ;************************************************************
  45. ;
  46. MESGA:    DB    0DH,0AH,'+COMPARE ERROR ON TRACK $'
  47. MESGB:    DB    '(HEX) SECTOR $'
  48. MESGC:    DB    'PERMANENT $'
  49. MESGD:    DB    '+PERMANENT SOURCE DISK ERROR EXIT $'
  50. MESGE:    DB    '+PERMANENT DESTINATION DISK ERROR EXIT $'
  51. SIGNON:    DB    13,10,'+SOURCE ON A'
  52.     DB    13,10,'+OBJECT ON B'
  53. SINOFF:    DB    13,10,'+TYPE <RET>$'
  54. CRLF:    DB    13,10,'$'
  55. ;
  56. ;
  57. PRTHEX:    PUSH    PSW    ;SAVE FOR LSN
  58.     RAR        ;SHIFT MSNIBLE TO LSN
  59.     RAR
  60.     RAR
  61.     RAR
  62.     CALL    PRTNBL    ;PRINT IT
  63.     POP    PSW    ;NOW FOR LSN
  64. PRTNBL:    ANI    0FH
  65.     ADI    30H    ;SHIFT TO ASCII VALUE
  66.     CPI    3AH    ;OVER 9?
  67.     JC    SML
  68.     ADI    7    ;SHIFT TO ALPHA
  69. SML:
  70.     MOV    E,A    ;FOR BDOS CALL
  71.     MVI    C,2    ;WRITE CONSOLE FUNCTION
  72.     CALL    BDOS
  73.     RET
  74. ;
  75. ;
  76. COPY:    MVI    C,0
  77.     CALL    SELDSK    ;SELECT DISK A
  78.     LDA    TRKSRT    ;FIRST TRACK TO MOVE
  79.     STA    TRK    ;MAKE CURRENT
  80.     MOV    C,A
  81.     CALL    SETTRK    ;AND SELECT IT ON DISK A
  82.     MVI    C,1
  83.     CALL    SELDSK    ;ALSO B
  84.     LDA    TRKSRT    ;FIRST TRACK TO MOVE
  85.     MOV    C,A
  86.     CALL    SETTRK    ;AND SELECT IT ON DISK B
  87. RDLOOP:    MVI    C,0
  88.     XRA    A
  89.     STA    CMPERR
  90.     CALL    SELDSK
  91.     LDA    TRK    ;GET TRACK
  92.     MOV    C,A
  93.     CALL    READT    ;READ ENTIRE TRACK
  94. RETRYW:
  95.     MVI    C,1
  96.     CALL    SELDSK
  97.     LDA    TRK
  98.     MOV    C,A
  99.     CALL    WRITET    ;WRITE TRACK
  100.     LDA    TRK
  101.     MOV    C,A
  102.     CALL    COMPT    ;REREAD AND COMPARE
  103.     JNZ    RETRYW    ;RETRY IF ERR
  104.     LDA    TRK
  105.     INR    A
  106.     STA    TRK
  107.     LXI    H,TRKSRT+1    ;POINT TO LAST TRACK+1 STORAGE
  108.     CMP    M    ;ARE WE DONE?
  109.     JNZ    RDLOOP    ;LOOP IF NOT
  110.     RET
  111. ;
  112. ;
  113. COMPT:    LXI    H,BUF1
  114.     CALL    RT2    ;REREAD INTO BUF1
  115.     LXI    H,BUF0
  116.     LXI    D,BUF1
  117.     LXI    B,128*LASTSEC
  118. CMPLP:    LDAX    D
  119.     CMP    M
  120.     JNZ    CERR
  121.     INX    H
  122.     INX    D
  123.     DCR    C
  124.     JNZ    CMPLP
  125.     DCR    B    ;ARE WE AT END OF BUFFER?
  126.     JNZ    CMPLP
  127.     RET
  128. CERR:    PUSH    B
  129.     LXI    D,MESGA
  130.     MVI    C,9    ;BDOS PRINT BUFFER FUNCTION CALL
  131.     CALL    BDOS
  132.     LDA    TRK
  133.     CALL    PRTHEX
  134.     LXI    D,MESGB
  135.     MVI    C,9    ;BDOS PRINT BUFFER FUNCTION CALL
  136.     CALL    BDOS
  137.     POP    H    ;PUSHED FROM B
  138.     DAD    H    ;COMPUTE SECTOR IN ERROR
  139.     LXI    D,0FF00H
  140.     DAD    D
  141.     MVI    A,27
  142.     SUB    H
  143.     CALL    PRTHEX    ;PRINT SECTOR
  144.     LDA    CMPERR
  145.     INR    A
  146.     STA    CMPERR    ;INCREMENT ERROR COUNT
  147.     CPI    10
  148.     RNZ
  149.     MVI    C,9    ;BDOS PRINT BUFFER FUNCTION CALL
  150.     LXI    D,MESGC
  151.     CALL    BDOS
  152.     XRA    A
  153.     RET
  154. ;
  155. ;
  156. READT:    LXI    H,BUF0    ;TRACK # IN C
  157. RT2:    SHLD    DMAAD
  158.     CALL    SETTRK
  159.     MVI    C,1
  160. RT3:    PUSH    B
  161.     CALL    SETSEC
  162.     CALL    READ
  163.     RAR        ;WAS A BIT 0 SET BY DISK ERROR?
  164.     CC    FAILR
  165.     LHLD    DMAAD
  166.     LXI    D,128
  167.     DAD    D
  168.     SHLD    DMAAD
  169.     POP    B
  170.     MVI    A,LASTSEC
  171.     CMP    C
  172.     RZ
  173.     INR    C
  174.     JMP    RT3
  175. ;
  176. ;
  177. WRITET:    LXI    H,BUF0    ;TRACK # IN C
  178. WT2:    SHLD    DMAAD
  179.     CALL    SETTRK
  180.     MVI    C,1
  181. WT3:    PUSH    B
  182.     CALL    SETSEC
  183.     CALL    WRITE
  184.     RAR        ;WAS A BIT 0 SET BY DISK ERROR?
  185.     CC    FAILW
  186.     LHLD    DMAAD
  187.     LXI    D,128
  188.     DAD    D
  189.     SHLD    DMAAD
  190.     POP    B
  191.     MVI    A,LASTSEC
  192.     CMP    C
  193.     RZ
  194.     INR    C
  195.     JMP    WT3
  196. CMPERR:    DB    0    ;NUMBER OF COMPARE ERRORS
  197. TRK:    DB    0
  198. STK:    DS    32
  199. STKTOP:    DB    0
  200. ;        TRACK   =  LAST SELECTED TRACK
  201. ;        SECTOR  =  LAST SELECTED SECTOR
  202. ;        DMAAD   =  LAST SELECTED DMA ADDRESS
  203. ;        DISKNO  =  LAST SELECTED DISK NUMBER
  204. ;    (NOTE THAT ALL ARE BYTE VALUES EXCEPT FOR DMAAD)
  205. ;
  206. SCRAT    EQU    40H
  207. TRACK    EQU    SCRAT        ;CURRENT TRACK ON DRIVE 0
  208. TRAK1    EQU    TRACK+1        ;CURRENT TRACK ON DRIVE 1
  209. SECTOR    EQU    SCRAT+2        ;CURRENTLY SELECTED SECTOR
  210. DMAAD    EQU    SCRAT+3        ;CURRENT DMA ADDRESS
  211. DISKNO    EQU    SCRAT+5        ;CURRENT DISK NUMBER
  212. DUMMY    EQU    DISKNO+1    ;MUST BE 0 FOR DOUBLE ADD
  213. ;
  214. ;
  215. ;
  216. ;
  217. BUF0:    DS    128*LASTSEC
  218. BUF1:    DS    128*LASTSEC
  219. ;************************************************************
  220. VECTOR:
  221. ;SET UP JUMP VECTORS FOR  ACCESS TO BIOS PRIMITIVES
  222. BASE    EQU    0    ;FIND WBOOT JMP ADDRESS AT RST0
  223. DUMYADR    EQU    0    ;WHO CARES?
  224. ;
  225.     LHLD    BASE+1    ;GET WBOOT ADDRESS
  226.     SPHL        ;SAVE IT IN SP FOR DAD
  227. ;
  228.     LXI    H,15H
  229.     DAD    SP
  230.     SHLD    HOME+1
  231. ;
  232.     LXI    H,18H
  233.     DAD    SP
  234.     SHLD    SELDSK+1
  235. ;
  236.     LXI    H,1BH
  237.     DAD    SP
  238.     SHLD    SETTRK+1
  239. ;
  240.     LXI    H,1EH
  241.     DAD    SP
  242.     SHLD    SETSEC+1
  243. ;
  244.     LXI    H,21H
  245.     DAD    SP
  246.     SHLD    SETDMA+1
  247. ;
  248.     LXI    H,24H
  249.     DAD    SP
  250.     SHLD    READ+1
  251. ;
  252.     LXI    H,27H
  253.     DAD    SP
  254.     SHLD    WRITE+1
  255. ;
  256.     LXI    SP,STKTOP
  257. ;
  258. ;************************************************************
  259. RUNTYP:    JMP    BUFMSR
  260. ;THIS ROUTINE SETS UP THE PARAMETERS FOR THE COPY ROUTINE.
  261. ;COPY CAN BE USED TO TRANSFER:    SYS    TRACKS  0- 1
  262. ;                DAT    TRACKS  2-76
  263. ;                ALL    TRACKS    0-76
  264. ;THE ROUTINE SEARCHES THE DEFAULT BUFFER AT 80H FOR THE
  265. ;RUN PARAMETER TO BE USED
  266. ;************************************************************
  267. ;ROUTINE EQUATES
  268. TBUFF    EQU    80H
  269. ;************************************************************
  270. ;DATA TABLES
  271. SYSMSG:    DB    'YSTEM$'    ;SYSTEM MESSAGE
  272. DATMSG:    DB    'ATA$'        ;DATA MESSAGE
  273. ALLMSG:    DB    'LL$'        ;ALL MESSAGE
  274. TRKSRT:    DW    0        ;STORAGE FOR FIRST AND LAST+1 TRACK NUMBERS
  275. CMDER1:    DB    '+COMMAND "COPY$'
  276. CMDER2:    DB    '" HAS SYNTAX ERROR',0DH,0AH,'$'
  277. CMDINF:    DB    '+THIS PROGRAM IS INITIATED WITH THE COMMAND',0DH,0AH
  278.     DB    '+"COPY SYSTEM", "COPY DATA" OR "COPY ALL"$'
  279. DONMSG:    DB    '+FUNCTION COMPLETE$'
  280. ;************************************************************
  281. ;FIRST WE MEASURE THE INPUT BUFFER MESSAGE
  282. ;AND DELIMIT IT WITH A $ PER BDOS CALL 9
  283. BUFMSR:    LXI    H,TBUFF
  284.     XRA    A        ;CLEAR ACC.
  285.     ADD    M        ;GET MESSAGE SIZE
  286.     JZ    NOMSG        ;NONE FOUND
  287.     INX    H        ;ADD FOR ADDR. PAST MESSAGE
  288.     MVI    B,0        ;EMPTY FOR DAD
  289.     MOV    C,A
  290.     DAD    B        ;ADD CHARACTER COUNT TO HL
  291.     MVI    M,'$'        ;END BUFFER CHARACTER
  292. ;************************************************************
  293. ;NEXT IS A TEST FOR WHICH MESSAGE IS PRESENT
  294.     LDA    TBUFF+2        ;FIRST CHARACTER ADDRESS
  295.     CPI    'S'
  296.     JZ    SYSSET
  297.     CPI    'D'
  298.     JZ    DATSET
  299.     CPI    'A'
  300.     JZ    ALLSET
  301.     JMP    BADMSG        ;FIRST CHARACTER NOT ONE OF 3 PERMITTED
  302. ;************************************************************
  303. SYSSET:
  304.     LXI    D,SYSMSG
  305.     MVI    C,6
  306.     CALL    MSGTST
  307.     MVI    L,0        ;FIRST TRACK TO TRANSFER
  308.     MVI    H,2        ;LAST TRACK PLUS ONE
  309.     JMP    PUTPAR
  310. ;************************************************************
  311. DATSET:
  312.     LXI    D,DATMSG
  313.     MVI    C,4
  314.     CALL    MSGTST
  315.     MVI    L,2        ;FIRST TRACK TO TRANSFER
  316.     MVI    H,77        ;LAST TRACK PLUS ONE
  317.     JMP    PUTPAR
  318. ;************************************************************
  319. ALLSET:
  320.     LXI    D,ALLMSG
  321.     MVI    C,3
  322.     CALL    MSGTST
  323.     MVI    L,0        ;FIRST TRACK TO TRANSFER
  324.     MVI    H,77        ;LAST TRACK PLUS ONE
  325. PUTPAR:    SHLD    TRKSRT        ;PUT PARAMETERS IN TRKSRT AND TRKSRT+1
  326. ;************************************************************
  327.     LXI    D,SIGNON
  328.     MVI    C,9
  329.     CALL    BDOS
  330. AGIN:    MVI    C,1
  331.     CALL    BDOS
  332.     CPI    3
  333.     JZ    EXITCPM
  334.     CPI    13
  335.     JNZ    AGIN
  336.     LXI    D,CRLF
  337.     MVI    C,9
  338.     CALL    BDOS
  339. ;************************************************************
  340.     CALL    COPY        ;MAIN ROUTINE
  341.     LXI    D,DONMSG    ;SAY WE'RE DONE
  342.     MVI    C,9
  343.     CALL    BDOS
  344.     JMP    EXIT        ;DONE. NOW GET OUT
  345. ;************************************************************
  346. MSGTST:    LXI    H,TBUFF+3
  347.     LDAX    D
  348.     CMP    M        ;SAME AS MESSAGE?
  349.     JNZ    BADMSG
  350.     INX    H
  351.     INX    D
  352.     DCR    C        ;REDUCE CHARACTER COUNTER
  353.     RZ            ;FINISHED OK
  354.     JMP    MSGTST+3    ;CHECK OUT NEXT CHARACTER
  355. ;************************************************************
  356. BADMSG:    LXI    D,CMDER1
  357.     MVI    C,9
  358.     CALL    BDOS
  359.     LXI    D,TBUFF+1        ;PRINT ERRONEOUS COMMAND
  360.     MVI    C,9
  361.     CALL    BDOS
  362.     LXI    D,CMDER2
  363.     MVI    C,9
  364.     CALL    BDOS
  365. NOMSG:    LXI    D,CMDINF
  366.     MVI    C,9
  367.     CALL    BDOS
  368.     JMP    EXITCPM
  369. ;************************************************************
  370. FAILR:    LXI    D,MESGD
  371.     JMP    DIE
  372. FAILW:    LXI    D,MESGE
  373.     MVI    C,9        ;BDOS PRINT BUFFER FUNCTION CALL
  374. DIE:    CALL    BDOS
  375. ;************************************************************
  376. EXIT:    LXI    D,SINOFF
  377.     MVI    C,9
  378.     CALL    BDOS
  379.     MVI    C,1
  380.     CALL    BDOS
  381.     CPI    13
  382.     JNZ    EXIT
  383.     JMP    EXITCPM
  384.     END
  385.