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