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