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