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 / ZSYS / SIMTEL20 / ZCPR3 / DIFF.MQC / DIFF.MAC
Text File  |  2000-06-30  |  15KB  |  725 lines

  1. ;
  2. ;  PROGRAM:  DIFF
  3. ;  AUTHOR:  Richard Conn
  4. ;  VERSION:  2.0
  5. ;  DATE:  18 MAY 84
  6. ;  PREVIOUS VERSIONS:  1.6 (16 JAN 83)
  7. ;  PREVIOUS VERSIONS:  1.5 (9 JAN 83), 1.4 (6 JAN 83), 1.3 (4 JAN 83)
  8. ;  PREVIOUS VERSIONS:  1.2 (19 DEC 82), 1.1 (8 DEC 82), 1.0 (24 JULY 82)
  9. ;  DERIVATION:  COMPARE, VERSION 1.1
  10. ;
  11. VERS    EQU    20
  12. z3env    SET    0f400h
  13.  
  14. ;
  15. ;    DIFF is designed to provide the user with a convenient method
  16. ; to compare the contents of two files.  It is invoked by one of two basic
  17. ; forms:
  18. ;
  19. ;        DIFF filename.typ
  20. ; or
  21. ;        DIFF file1.typ file2.typ
  22. ;
  23. ;    The first form compares the file named "filename.typ" on drive A:
  24. ; to the file of the same name on drive B:; the second form compares the
  25. ; file named "file1.typ" on drive A: to the file named "file2.typ" on drive
  26. ; B:.  Wild cards may NOT be used.  The listing generated by the program gives
  27. ; relative offsets (in hex and decimal) as well as the different byte values
  28. ; in hex, decimal, and ASCII.
  29. ;
  30.  
  31. ;  SIZE OF BUFFER
  32. BLIMIT    EQU    32    ; NUMBER OF 128-BYTE BLOCKS
  33. BSIZE    EQU    BLIMIT*128    ; 4K
  34.  
  35. ;  CP/M Constants
  36. CPM    equ    0    ; CP/M Warm Boot
  37. BUFF    equ    CPM+80H    ; Temporary Buffer
  38. CR    equ    0DH    ; <CR>
  39. LF    equ    0AH    ; <LF>
  40. CTRLC    EQU    'C'-'@'
  41. CTRLX    EQU    'X'-'@'
  42.  
  43. ;  SYSLIB and Z3LIB ROUTINES
  44.     EXT    Z3INIT,ZFNAME,GETCRT
  45.     EXT    PHL4HC,PHLDC,PA2HC,PADC
  46.     EXT    BDOS,INITFCB
  47.     EXT    LOGUD,RETUD
  48.     EXT    F$OPEN,F$CLOSE,F$READ
  49.     EXT    CAPS,CIN,COUT,CRLF,MOVEB,PRINT
  50.     EXT    CODEND
  51.  
  52. ;
  53. ; Environment Definition
  54. ;
  55.     if    z3env ne 0
  56. ;
  57. ; External ZCPR3 Environment Descriptor
  58. ;
  59.     jmp    start
  60.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  61.     db    1    ;External Environment Descriptor
  62. z3eadr:
  63.     dw    z3env
  64. start:
  65.     lhld    z3eadr    ;pt to ZCPR3 environment
  66. ;
  67.     else
  68. ;
  69. ; Internal ZCPR3 Environment Descriptor
  70. ;
  71.     MACLIB    Z3BASE.LIB
  72.     MACLIB    SYSENV.LIB
  73. z3eadr:
  74.     jmp    start
  75.     SYSENV
  76. start:
  77.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  78.     endif
  79.  
  80. ;
  81. ; Start of Program -- Initialize ZCPR3 Environment
  82. ;
  83.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  84. ;
  85. ;  SET BUFFER LOCATIONS
  86. ;
  87.     CALL    CODEND    ; ALLOCATE BUFFER SPACE
  88.     SHLD    INLINE    ; SET PTR TO INPUT LINE
  89.     LXI    D,100H    ; BUFFER SIZE
  90.     DAD    D
  91.     SHLD    BUFF1    ; SOURCE 1 BUFFER
  92.     LXI    D,BSIZE    ; SIZE OF BUFFER
  93.     INR    D    ; ADD 1
  94.     DAD    D
  95.     SHLD    BUFF2    ; SOURCE 2 BUFFER
  96. ;
  97. ;  SET OPERATIONS FLAGS
  98. ;
  99.     XRA    A    ; A=0
  100.     STA    MULT    ; SET NO MULTIPLE RUN
  101.     STA    COMP    ; SET NO COMPARE ONLY
  102.     CALL    GETCRT    ; GET CRT CHARACTERISTICS
  103.     INX    H    ; PT TO TEXT LINE COUNT
  104.     INX    H
  105.     MOV    A,M    ; GET COUNT
  106.     STA    LSET    ; SET COUNTER
  107. ;
  108. ;  EXTRACT COMMAND LINE INFORMATION
  109. ;
  110.     LHLD    INLINE    ; PT TO INPUT LINE BUFFER
  111.     XCHG        ; ... IN DE
  112.     LXI    H,BUFF+1    ; PROCESS OPTIONS IN BUFFER
  113.     MVI    B,80H    ; ARBITRARY 80H BYTES
  114.     CALL    MOVEB
  115.     XCHG        ; PT TO FIRST CHAR WITH HL
  116.     CALL    SBLANK    ; SKIP SPACES
  117.     ORA    A    ; EOL?
  118.     JZ    PRHELP    ; PRINT HELP IF SO
  119.     CPI    '/'    ; ASKING FOR HELP?
  120.     JZ    PRHELP
  121.     LXI    D,FCBS    ; PT TO SOURCE FCB
  122.     MVI    A,0    ; DIR BEFORE DU
  123.     CALL    ZFNAME    ; EXTRACT NAME AND DIRECTORY DATA
  124.     MOV    A,M    ; GET NEXT CHAR
  125.     CPI    ','
  126.     JZ    START2
  127.     PUSH    H    ; SAVE PTR
  128.     LXI    H,FCBS+1    ; NO 2ND NAME, SO SET IT TO SAME AS FIRST
  129.     LXI    D,FCBD+1
  130.     MVI    B,11    ; 11 BYTES
  131.     CALL    MOVEB
  132.     CALL    RETUD    ; GET CURRENT USER/DISK
  133.     MOV    A,B    ; GET DISK
  134.     INR    A    ; A=1
  135.     STA    FCBD    ; SET DISK
  136.     MOV    A,C    ; GET USER
  137.     STA    FCBD+13    ; PT TO S1 FOR USER
  138.     POP    H    ; GET PTR
  139.     JMP    START3
  140. START2:
  141.     INX    H    ; PT TO NEXT CHAR AFTER COMMA
  142.     LXI    D,FCBD    ; SET DEST FCB
  143.     MVI    A,0    ; DIR BEFORE DU
  144.     CALL    ZFNAME    ; PROCESS NAME
  145.     LDA    FCBD+1    ; CHECK FOR NO NAME
  146.     CPI    ' '    ; SPACE MEANS NO NAME
  147.     JNZ    START3
  148.     PUSH    H    ; SAVE PTR
  149.     PUSH    B    ; SAVE USER/DISK
  150.     LXI    H,FCBS+1    ; SET NAMES THE SAME
  151.     LXI    D,FCBD+1    ; COPY SOURCE TO DEST
  152.     MVI    B,11    ; 11 BYTES
  153.     CALL    MOVEB
  154.     POP    B    ; RESTORE BC
  155.     POP    H    ; RESTORE PTR
  156. START3:
  157.     CALL    SBLANK    ; SKIP SPACES
  158.     CALL    OPTS    ; PROCESS OPTIONS
  159. START4:
  160.     LXI    H,FCBS    ; SET UP SOURCE FCB
  161.     CALL    QCHECK    ; NO AMBIGUOUS ENTRIES PERMITTED
  162.     LXI    H,FCBD    ; SET UP DESTINATION FCB
  163.     CALL    QCHECK    ; NO AMBIGUOUS ENTRIES PERMITTED
  164.     CALL    RETUD    ; GET CURRENT DU IN BC
  165.     LXI    H,FCBS    ; PT TO SOURCE DISK
  166.     MOV    A,M    ; GET SOURCE DISK
  167.     ORA    A    ; CURRENT?
  168.     JNZ    START5
  169.     MOV    A,B    ; SET CURRENT DISK
  170.     INR    A    ; ADJUST FOR A=1
  171. START5:
  172.     STA    SDISK
  173.     MVI    M,0    ; CLEAR SOURCE DISK
  174.     LDA    FCBS+13    ; GET USER
  175.     STA    SUSER
  176.     LXI    H,FCBD    ; GET DESTINATION DISK
  177.     MOV    A,M    ; GET DEST DISK
  178.     ORA    A    ; CURRENT?
  179.     JNZ    START6
  180.     MOV    A,B    ; SET CURRENT DISK
  181.     INR    A    ; ADJUST FOR A=1
  182. START6:
  183.     STA    DDISK
  184.     MVI    M,0    ; CLEAR DEST DISK
  185.     LDA    FCBD+13    ; GET USER
  186.     STA    DUSER
  187. MLOOP:
  188.     CALL    BANNER    ; PRINT BANNER
  189.     CALL    PRS1    ; PRINT SOURCE FILE NAMES
  190.     CALL    PRS2
  191.     LDA    MULT    ; MULTIPLE RUNS
  192.     ORA    A
  193.     JZ    MLOOP1
  194.     CALL    PRINT
  195.     DB    CR,LF,' Type ^C to Abort or RETURN to Proceed - ',0
  196.     CALL    CIN    ; GET RESPONSE
  197.     CALL    CAPS    ; CAPITALIZE
  198.     CPI    CTRLC    ; ABORT?
  199.     RZ
  200.     MVI    C,13    ; RESET DISKS
  201.     CALL    BDOS
  202. MLOOP1:
  203.     CALL    LOGS    ; LOG IN SOURCE
  204.     LXI    D,FCBS    ; TRY TO OPEN SOURCE 1
  205.     CALL    INITFCB    ; INIT FCB
  206.     CALL    F$OPEN    ; Z IF NO ERROR
  207.     JNZ    FERR
  208.     CALL    LOGD    ; LOG IN DEST DISK/USER
  209.     LXI    D,FCBD    ; TRY TO OPEN SOURCE 2
  210.     CALL    INITFCB    ; INIT FCB
  211.     CALL    F$OPEN
  212.     JNZ    FERR
  213.     XRA    A    ; A=0
  214.     STA    FIRST    ; SET FLAG FOR FIRST ERROR
  215.     LXI    H,0    ; INIT OFFSET
  216.     SHLD    OFFSET
  217.     CALL    VERIFY    ; PERFORM VERIFICATION
  218.     LDA    FIRST    ; ANY ERRORS?
  219.     ORA    A    ; 0=NO ERRORS
  220.     JNZ    MLOOP2
  221.     CALL    PRINT
  222.     DB    CR,LF,' Files are Identical',0
  223. MLOOP2:
  224.     LDA    MULT    ; CHECK FOR MULTIPLE RUNS
  225.     ORA    A    ; 0=NO
  226.     RZ
  227.     CALL    CRLF    ; NEW LINES
  228.     CALL    CRLF
  229.     JMP    MLOOP
  230. FERR:
  231.     CALL    PRINT
  232.     DB    CR,LF,' File Not Found -- ',0
  233.     CALL    PRFN
  234.     JMP    MLOOP2
  235.  
  236. ;
  237. ;  PROCESS OPTIONS
  238. ;
  239. OPTS:
  240.     MOV    A,M    ; GET NEXT OPTION CHAR
  241.     INX    H    ; PT TO NEXT
  242.     ORA    A    ; END OF LINE?
  243.     RZ
  244.     CPI    ' '    ; SKIP SPACES
  245.     JZ    OPTS
  246.     LXI    D,OTAB    ; PT TO OPTION TABLE
  247.     MOV    B,A    ; OPTION CHAR IN B
  248. OPTS1:
  249.     LDAX    D    ; GET TABLE CHAR
  250.     ORA    A    ; OPTION NOT FOUND?
  251.     JZ    OPTSE    ; PROCESS ERROR
  252.     CMP    B    ; MATCH?
  253.     JZ    OPTS2
  254.     INX    D    ; SKIP TO NEXT
  255.     INX    D
  256.     INX    D
  257.     JMP    OPTS1
  258. OPTS2:
  259.     XCHG        ; USE HL
  260.     INX    H    ; GET ADDRESS
  261.     MOV    A,M    ; GET LOW
  262.     INX    H
  263.     MOV    H,M    ; GET HIGH
  264.     MOV    L,A    ; PUT LOW
  265.     XCHG        ; DE PTS TO OPTION ADDRESS, HL TO NEXT BYTE
  266.     LXI    B,OPTS    ; SET UP RETURN ADDRESS
  267.     PUSH    B
  268.     PUSH    D    ; SET UP OPTION ADDRESS
  269.     RET        ; "RUN" OPTION
  270. OPTSE:
  271.     CALL    PRHELP    ; PRINT HELP MESSAGE
  272.     POP    PSW    ; CLEAR RETURN ADDRESS
  273.     RET        ; RETURN TO OPSYS
  274. ;
  275. ;  OPTION TABLE
  276. ;
  277. OTAB:
  278.     DB    'C'    ; COMPARE ONLY
  279.     DW    SCOMPF
  280.     DB    'M'    ; MULTIPLE RUN
  281.     DW    SMULTF
  282.     DB    0    ; END OF TABLE
  283. ;
  284. ;  SET COMPARE FLAG
  285. ;
  286. SCOMPF:
  287.     MVI    A,0FFH    ; SET FLAG
  288.     STA    COMP
  289.     RET
  290. ;
  291. ;  SET MULTIPLE RUN FLAG
  292. ;
  293. SMULTF:
  294.     MVI    A,0FFH    ; SET FLAG
  295.     STA    MULT
  296.     RET
  297. ;
  298. ;  SKIP TO NON-BLANK CHAR
  299. ;
  300. SBLANK:
  301.     MOV    A,M    ; GET CHAR
  302.     INX    H    ; PT TO NEXT
  303.     CPI    ' '    ; BLANK?
  304.     JZ    SBLANK
  305.     DCX    H    ; PT TO NON-BLANK
  306.     RET
  307.  
  308. ;
  309. ;  PRINT HELP MESSAGE
  310. ;
  311. PRHELP:
  312.     CALL    BANNER    ; PRINT BANNER
  313.     CALL    PRINT
  314.     DB    CR,LF,'Syntax:'
  315.     DB    CR,LF,'  DIFF ufn1,ufn2 o...  -or-  DIFF ufn o...'
  316.     db    cr,lf,'Options:'
  317.     db    cr,lf,'  C  Compare Files Only (Stop at First Difference)'
  318.     db    cr,lf,'  M  Multiple Runs (Keep on prompting for disks)'
  319.     DB    CR,LF,'Examples:'
  320.     DB    CR,LF,'  Command                  Files Compared'
  321.     DB    CR,LF,'  DIFF T.COM,A1:        $$:T.COM, A1:T.COM'
  322.     DB    CR,LF,'  DIFF A:T.COM          A$:T.COM, $$:T.COM'
  323.     DB    CR,LF,'  DIFF A:T.COM,ROOT:    A$:T.COM, ROOT:T.COM'
  324.     DB    CR,LF,'  DIFF A:T.COM,B:S.COM  A$:T.COM, B$:S.COM'
  325.     DB    0
  326.     RET
  327.  
  328. ;
  329. ;  CHECK FOR ANY QUESTION MARKS FROM HL+1 TO HL+11
  330. ;  AFFECT ONLY AF REGISTERS IF OK
  331. ;
  332. QCHECK:
  333.     PUSH    H    ; SAVE HL
  334.     PUSH    B    ; SAVE BC
  335.     INX    H    ; PT TO FIRST CHAR
  336.     MVI    B,11    ; 11 BYTES
  337.     MVI    C,'?'    ; SCAN FOR '?'
  338. QC:
  339.     MOV    A,M    ; GET BYTE
  340.     CMP    C    ; '?'?
  341.     JZ    QC1
  342.     INX    H    ; PT TO NEXT
  343.     DCR    B    ; COUNT DOWN
  344.     JNZ    QC
  345.     POP    B    ; RESTORE
  346.     POP    H
  347.     RET
  348. QC1:
  349.     POP    B    ; RESTORE AND ABORT
  350.     POP    H
  351.     POP    D    ; CLEAR RETURN ADDRESS
  352.     XCHG        ; FCB PTR IN DE
  353.     CALL    CRLF
  354.     CALL    PRFN    ; PRINT FILE NAME
  355.     CALL    PRINT
  356.     DB    ' AFN not Allowed',CR,LF,0
  357.     RET
  358.  
  359. ;
  360. ;  PRINT BANNER
  361. ;
  362. BANNER:
  363.     CALL    PRINT
  364.     DB    'DIFF  Version '
  365.     DB    VERS/10+'0','.',(VERS MOD 10)+'0'
  366.     DB    0
  367.     RET
  368.  
  369. ;
  370. ;  PRINT NAMES OF SOURCE FILES
  371. ;    PRS1 -- SOURCE FILE 1
  372. ;    PRS2 -- SOURCE FILE 2
  373. ;
  374. PRS1:
  375.     CALL    PRINT
  376.     DB    CR,LF,'Source 1 -- ',0
  377.     LXI    H,SDISK    ; PT TO FIRST BYTE
  378.     CALL    PRUD
  379.     LXI    D,FCBS    ; SOURCE FCB
  380.     JMP    PRFN    ; PRINT FILE NAME
  381. PRS2:
  382.     CALL    PRINT
  383.     DB    CR,LF,'Source 2 -- ',0
  384.     LXI    H,DDISK    ; PT TO FIRST BYTE
  385.     CALL    PRUD
  386.     LXI    D,FCBD    ; DESTINATION FCB
  387.     JMP    PRFN    ; PRINT FILE NAME
  388.  
  389. ;
  390. ;  MAIN VERIFY ROUTINE
  391. ;
  392. VERIFY:
  393.     LHLD    BUFF1    ; PT TO BUFFER 1
  394.     PUSH    H    ; SAVE PTR
  395.     CALL    LOGS    ; LOG IN SOURCE 1
  396.     LXI    D,FCBS    ; SOURCE 1 FCB
  397.     CALL    LOAD    ; READ IN BLOCK
  398.     LDA    BCNT    ; GET OLD BLOCK COUNT
  399.     STA    BCNT1    ; SAVE IT
  400.     LHLD    BUFF2    ; PT TO BUFFER 2
  401.     PUSH    H    ; SAVE PTR
  402.     CALL    LOGD    ; LOG IN SOURCE 2
  403.     LXI    D,FCBD    ; SOURCE 2 FCB
  404.     CALL    LOAD    ; READ IN BLOCK
  405.     POP    D    ; DE PTS TO BUFF 2
  406.     POP    H    ; HL PTS TO BUFF 1
  407.     LDA    BCNT    ; CHECK FOR NO BLOCK READ
  408.     MOV    B,A
  409.     LDA    BCNT1
  410.     ORA    B
  411.     RZ        ; DONE IF NONE READ
  412. ;
  413. ;  VERIFY LOADED BUFFERS BY COMPARING THEM AND PRINTING DIFFERENCES
  414. ;
  415. VERBLOCK:
  416.     MVI    B,128    ; SCAN ONE BLOCK
  417. VERBL:
  418.     LDAX    D    ; GET BYTE
  419.     CMP    M    ; COMPARE
  420.     CNZ    NOMATCH    ; PRINT DIFFERENCE
  421.     PUSH    H    ; INC OFFSET
  422.     LHLD    OFFSET
  423.     INX    H
  424.     SHLD    OFFSET
  425.     POP    H
  426.     INX    H    ; PT TO NEXT
  427.     INX    D
  428.     DCR    B    ; COUNT DOWN
  429.     JNZ    VERBL
  430.     LDA    BCNT    ; COUNT DOWN
  431.     DCR    A
  432.     STA    BCNT
  433.     LDA    BCNT1
  434.     DCR    A
  435.     STA    BCNT1
  436.     JZ    VEREQ
  437.     LDA    BCNT    ; CHECK FIRST BUFFER COUNT
  438.     ORA    A
  439.     JNZ    VERBLOCK    ; CONTINUE COMPARE IF NOT EMPTY
  440. VEREQ:
  441.     LDA    BCNT    ; CHECK FOR BOTH DONE
  442.     MOV    B,A
  443.     LDA    BCNT1
  444.     ORA    B    ; IF ZERO, BOTH DONE AT SAME TIME AND CONTINUE
  445.     JZ    VERIFY
  446.     LDA    BCNT1    ; CHECK FOR ONE DONE BEFORE THE OTHER
  447.     ORA    A    ; 2ND DONE?
  448.     MVI    C,'2'    ; GET LETTER
  449.     JZ    DONE1
  450.     MVI    C,'1'    ; GET LETTER
  451. ;  ONE FILE IS SHORTER THAN THE OTHER -- SAY SO
  452. DONE1:
  453.     CALL    PRINT
  454.     DB    CR,LF,' Source ',0
  455.     MOV    A,C
  456.     CALL    COUT    ; PRINT LETTER
  457.     CALL    PRINT
  458.     DB    ' has terminated prematurely',0
  459.     JMP    DABORT
  460. ;  MATCH ERROR
  461. NOMATCH:
  462.     LDA    COMP    ; GET COMPARE FLAG
  463.     ORA    A    ; NZ=SIMPLE COMPARE
  464.     JNZ    CABORT
  465.     PUSH    H    ; SAVE REGS
  466.     PUSH    D
  467.     PUSH    B
  468.     LDA    FIRST    ; FIRST TIME THRU?
  469.     ORA    A    ; 0=YES
  470.     JZ    NMAT0
  471.     LDA    LCNT    ; CHECK FOR NEW SCREEN
  472.     ORA    A    ; ZERO IF DONE
  473.     JNZ    NMAT1
  474.     CALL    PRINT
  475.     DB    CR,LF,' DIFF Pause -- Strike RETURN to Continue, '
  476.     DB    '^C to Abort, or ^X to Advance - ',0
  477.     CALL    CIN    ; GET RESPONSE
  478.     CALL    CAPS
  479.     CPI    CTRLC    ; ABORT?
  480.     JZ    NMAT00
  481.     CPI    CTRLX    ; ADVANCE?
  482.     JNZ    NMAT0
  483.     POP    B    ; CLEAR REGS
  484.     POP    D
  485.     POP    H
  486.     POP    D    ; CLEAR STACK
  487.     CALL    PRINT
  488.     DB    CR,LF,' DIFF Advancing',0
  489.     RET        ; RETURN TO VERIFY CALLER
  490. NMAT00:
  491.     POP    B    ; CLEAR REGS
  492.     POP    D
  493.     POP    H
  494.     POP    D    ; CLEAR STACK
  495.     POP    D
  496. DABORT:
  497.     CALL    PRINT
  498.     DB    CR,LF,' DIFF Aborting',0
  499.     RET        ; RETURN TO OPSYS
  500. CABORT:
  501.     POP    D    ; CLEAR STACK
  502.     MVI    A,1    ; SET ERROR FLAG
  503.     STA    FIRST
  504.     CALL    PRINT
  505.     DB    CR,LF,' Files are Different',0
  506.     RET        ; RETURN TO VERIFY CALLER
  507. NMAT0:
  508.     MVI    A,0FFH    ; CLEAR FIRST TIME FLAG
  509.     STA    FIRST
  510.     CALL    HEADER    ; PRINT HEADING AND RETURN NEW LINE COUNT
  511. NMAT1:
  512.     DCR    A    ; COUNT DOWN 1 LINE
  513.     STA    LCNT    ; NEW LINE COUNT
  514.     CALL    CRLF
  515.     PUSH    H    ; SAVE HL
  516.     LHLD    OFFSET    ; PRINT OFFSET VALUE
  517.     CALL    PHL4HC    ; PRINT AS HEX
  518.     CALL    SPACER    ; PRINT SPACES
  519.     CALL    PHLDC    ; PRINT AS DEC
  520.     POP    H    ; RESTORE HL
  521.     CALL    SPACER
  522.     CALL    SPACER
  523.     MVI    A,' '
  524.     CALL    COUT
  525.     MOV    A,M    ; GET SOURCE 1 VALUE
  526.     CALL    PRVAL    ; PRINT AS HEX, DEC, ASCII
  527.     CALL    SPACER    ; 10 SPACES
  528.     CALL    SPACER
  529.     CALL    SPACER
  530.     CALL    SPACER
  531.     CALL    SPACER
  532.     LDAX    D    ; GET SOURCE 2 VALUE
  533.     CALL    PRVAL    ; PRINT AS HEX, DEC, ASCII
  534.     POP    B    ; RESTORE REGS
  535.     POP    D
  536.     POP    H
  537.     RET
  538.  
  539. ;  PRINT HEADER AND RETURN NEW LINE COUNT IN A
  540. HEADER:
  541.     PUSH    D    ; SAVE REGS
  542.     PUSH    H
  543.     CALL    PRINT
  544.     DB    CR,LF,' Rel Offset   ',0
  545.     LXI    H,SDISK    ; PRINT DISK/USER
  546.     CALL    PRUD
  547.     LXI    D,FCBS
  548.     CALL    PRFN    ; PRINT FILE NAME
  549.     CALL    SPACER    ; 5 SPACES
  550.     CALL    SPACER
  551.     CALL    SPACE1
  552.     LXI    H,DDISK    ; PRINT DISK/USER
  553.     CALL    PRUD
  554.     LXI    D,FCBD
  555.     CALL    PRFN    ; PRINT FILE NAME
  556.     CALL    PRINT
  557.     DB    CR,LF,' Hex    Dec       Hex  Dec Asc           Hex  Dec Asc',0
  558.     LDA    LSET    ; SET LINE COUNT
  559.     SUI    1    ; ADJUST FOR HEADING AND FOOTER
  560.     STA    LCNT
  561.     POP    H
  562.     POP    D    ; RESTORE REGS
  563.     RET
  564.  
  565. ;  PRINT A AS HEX, DEC, AND ASCII
  566. PRVAL:
  567.     CALL    SPACER    ; 3 SPACES
  568.     CALL    SPACE1
  569.     CALL    PA2HC    ; PRINT AS HEX
  570.     CALL    SPACER
  571.     CALL    PADC    ; PRINT AS DEC
  572.     CALL    SPACER
  573.     ANI    7FH    ; MASK OUT MSB
  574.     CPI    7FH    ; DOT FOR <DEL>
  575.     JZ    PRDOT
  576.     CPI    ' '    ; PRINT DOT IF LESS THAN <SP>
  577.     JNC    COUT
  578. PRDOT:
  579.     MVI    A,'.'    ; PRINT DOT
  580.     JMP    COUT
  581. ;  PRINT 2 SPACES
  582. SPACER:
  583.     PUSH    PSW    ; SAVE A
  584.     MVI    A,' '    ; <SP>
  585.     CALL    COUT
  586.     POP    PSW
  587. SPACE1:
  588.     PUSH    PSW
  589.     MVI    A,' '
  590.     CALL    COUT
  591.     POP    PSW
  592.     RET
  593.  
  594. ;
  595. ;  LOAD BUFFER FROM FILE WHOSE FCB IS PTED TO BY DE
  596. ;    ON OUTPUT, BCNT=NUMBER OF BLOCKS LOADED (UP TO BLIMIT)
  597. ;
  598. LOAD:
  599.     XRA    A    ; A=0
  600.     STA    BCNT    ; SET BLOCK COUNT
  601.  
  602. ;  MAIN LOAD LOOP
  603. LOAD1:
  604.     CALL    F$READ    ; READ A BLOCK
  605.     ORA    A    ; END OF FILE?
  606.     RNZ        ; RETURN IF DONE
  607.     PUSH    D    ; SAVE FCB PTR
  608.     LXI    D,BUFF    ; PT TO BUFFER
  609.     MVI    B,128    ; COPY 128 BYTES
  610. LOAD2:
  611.     LDAX    D    ; GET BYTE READ
  612.     MOV    M,A    ; PUT BYTE
  613.     INX    H    ; PT TO NEXT
  614.     INX    D
  615.     DCR    B    ; COUNT DOWN
  616.     JNZ    LOAD2
  617.     POP    D    ; GET FCB PTR
  618.     LDA    BCNT    ; GET BLOCK COUNT
  619.     INR    A    ; INCREMENT IT
  620.     STA    BCNT    ; SET IT
  621.     CPI    BLIMIT    ; LAST BLOCK READ?
  622.     JNZ    LOAD1
  623.     RET
  624.  
  625. ;
  626. ;  LOG IN SOURCE (LOGS) AND DESTINATION (LOGD) DRIVES/USERS
  627. ;
  628. LOGS:
  629.     LDA    SDISK    ; GET DISK
  630.     DCR    A    ; A=0
  631.     MOV    B,A
  632.     LDA    SUSER    ; GET USER
  633.     MOV    C,A
  634.     CALL    LOGUD    ; LOG IN
  635.     RET
  636. LOGD:
  637.     LDA    DDISK    ; GET DISK
  638.     DCR    A    ; A=0
  639.     MOV    B,A
  640.     LDA    DUSER    ; GET USER
  641.     MOV    C,A
  642.     CALL    LOGUD    ; LOG IN
  643.     RET
  644.  
  645. ;
  646. ;  PRINT DISK/USER PTED TO BY HL (2 BYTES)
  647. ;
  648. PRUD:
  649.     MOV    A,M    ; GET DISK
  650.     ADI    'A'-1    ; CONVERT TO LETTER
  651.     CALL    COUT
  652.     INX    H    ; PT TO USER
  653.     MOV    A,M    ; GET USER
  654.     CALL    PADC    ; PRINT AS DEC
  655.     CALL    PRINT
  656.     DB    ': ',0
  657.     RET
  658.  
  659. ;
  660. ;  PRINT FILE NAME WHOSE FCB IS PTED TO BY DE
  661. ;
  662. PRFN:
  663.     PUSH    H    ; SAVE REGS
  664.     PUSH    D
  665.     PUSH    B
  666.     XCHG        ; FN PTED TO BY HL
  667.     INX    H    ; PT TO FIRST CHAR
  668.     MVI    B,8    ; 8 CHARS
  669.     CALL    PRFN1
  670.     MVI    A,'.'
  671.     CALL    COUT
  672.     MVI    B,3    ; 3 CHARS FOR FILE TYPE
  673.     CALL    PRFN1
  674.     POP    B    ; RESTORE REGS
  675.     POP    D
  676.     POP    H
  677.     RET
  678. PRFN1:
  679.     MOV    A,M    ; GET CHAR
  680.     INX    H    ; PT TO NEXT
  681.     CALL    COUT    ; PRINT
  682.     DCR    B    ; COUNT DOWN
  683.     JNZ    PRFN1
  684.     RET
  685.  
  686. ;
  687. ;  BUFFERS
  688. ;
  689. BUFF1:
  690.     DS    2    ; PTR TO BUFFER 1
  691. BUFF2:
  692.     DS    2    ; PTR TO BUFFER 2
  693. OFFSET:
  694.     DS    2    ; RELATIVE OFFSET
  695. FIRST:
  696.     DS    1    ; ERROR INDIC
  697. LSET:
  698.     DS    1    ; NUMBER OF TEXT LINES ON SCREEN
  699. LCNT:
  700.     DS    1    ; LINE COUNT
  701. COMP:
  702.     DS    1    ; COMPARE FLAG (0=NO SIMPLE COMPARE)
  703. MULT:
  704.     DS    1    ; MULTIPLE RUN FLAG (0=NO MULT RUNS)
  705. SDISK:
  706.     DS    1    ; SOURCE DISK (MUST BE FOLLOWED BY SUSER)
  707. SUSER:
  708.     DS    1    ; SOURCE USER
  709. FCBS:
  710.     DS    36    ; SOURCE FCB
  711. DDISK:
  712.     DS    1    ; DEST DISK (MUST BE FOLLOWED BY DUSER)
  713. DUSER:
  714.     DS    1    ; DEST USER
  715. FCBD:
  716.     DS    36    ; DESTINATION FCB
  717. BCNT:
  718.     DS    1    ; BUFFER COUNT
  719. BCNT1:
  720.     DS    1    ; SECOND BUFFER COUNT
  721. INLINE:
  722.     DS    2    ; PTR TO INPUT LINE BUFFER
  723.  
  724.     END
  725.