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 / CPMUG006.ARK / COMPARE.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  287 lines

  1. ; * * * * * * * * * * * * * * * * * * * * * * * *
  2. ;                        *
  3. ;        COMPARE.ASM            *
  4. ;                        *
  5. ; * * * * * * * * * * * * * * * * * * * * * * * *
  6. ;
  7. ;USED TO COMPARE 2 CP/M PROGRAMS ON DISK
  8. ;
  9. ;IF SENSE SWITCH A8 (01H) UP, PRINTS FILE 1
  10. ;AS IT IS BEING READ
  11. ;
  12. ;10/01/77 ORIGINALLY WRITTEN
  13. ;
  14.     ORG    100H
  15.     CALL    START    ;PRINT ID MESSAGE
  16.     DB    'COMPARE.COM AS OF 10/01/77',0DH,0AH,'$'
  17. START    POP    D
  18.     CALL    PRINT$MESSAGE
  19. ;INIT PRIVATE STACK
  20.     LXI    H,0    ;HL=0
  21.     DAD    SP    ;HL=CP/M'S STACK
  22.     SHLD    STACK    ;SAVE IT
  23.     LXI    SP,STACK ;USE MY OWN
  24. ;
  25. ;MOVE THE SECOND FCB SO OPENING THE FIRST
  26. ;WON'T WIPE IT OUT
  27. ;
  28.     CALL    MOVE$FCB
  29. ;
  30. ;OPEN BOTH FILES, EXITING IF EITHER DOESN'T EXIST
  31. ;
  32.     CALL    OPEN$FILES
  33. ;
  34. ;READ EACH FILE 1 BYTE AT A TIME, COMPARING THEM
  35. ;
  36. COMPARE    CALL    READ1
  37.     MOV    B,A    ;SAVE CHAR READ
  38.     CALL    READ2
  39.     CMP    B    ;SAME?
  40.     JZ    COMPARE
  41. ;
  42. ;UNEQUAL COMPARE
  43. ;
  44.     LXI    D,UNEQ$MSG
  45.     CALL    PRINT$MESSAGE
  46.     LHLD    SECTOR$COUNT
  47.     CALL    PRINT$HEX$HL
  48.     LXI    D,BYTE$MSG
  49.     CALL    PRINT$MESSAGE
  50.     LDA    BUFAD1    ;GET FIRST BUFF ADDR
  51.     SUI    80H    ;SUBTRACT BIAS
  52.     CALL    XO    ;PRINT IN HEX
  53. EXIT    LHLD    STACK    ;GET CP/M'S STACK
  54.     SPHL        ;RESTORE IT
  55.     RET        ;..AND RETURN
  56. ;
  57. ERXIT    POP    D    ;GET MESSAGE
  58.     CALL    PRINT$MESSAGE
  59.     JMP    EXIT
  60. ;
  61. UNEQ$MSG:
  62.     DB    0DH,0AH,'++FILES UNEQUAL IN SECTOR $'
  63. BYTE$MSG:
  64.     DB    'AT BYTE $'
  65. ; * * * * * * * * * * * * * * * * * * * * * * * *
  66. ;                        *
  67. ;        SUBROUTINES            *
  68. ;                        *
  69. ; * * * * * * * * * * * * * * * * * * * * * * * *
  70. PRINT$MESSAGE:
  71.     MVI    C,PRINT
  72.     JMP    BDOS    ;PRINT, RETURN
  73. ;
  74. PRINT$HEX$HL:
  75.     MOV    A,H
  76.     CALL    XO
  77.     MOV    A,L
  78.     CALL    XO
  79.     MVI    A,' '
  80. ;FALL INTO 'TYPE'
  81. ;
  82. TYPE:    PUSH    B
  83.     PUSH    D
  84.     PUSH    H
  85.     MOV    E,A    ;AS REQ'D BY CP/M
  86.     MVI    C,WRCON
  87.     CALL    BDOS
  88.     POP    H
  89.     POP    D
  90.     POP    B
  91.     RET
  92. ;
  93. XO    PUSH    PSW    ;HEX OUT
  94.     RAR
  95.     RAR
  96.     RAR
  97.     RAR
  98.     CALL    NIBBL    ;LEFT NIBBL
  99.     POP    PSW
  100. NIBBL    ANI    0FH
  101.     CPI    10
  102.     JC    ISNUM
  103.     ADI    7
  104. ISNUM    ADI    '0'
  105.     JMP    TYPE
  106. ;
  107. OPEN$FILES:
  108.     LXI    D,FCB
  109.     MVI    C,OPEN
  110.     CALL    BDOS
  111.     INR    A    ;OPEN OK?
  112.     JNZ    FILE$1$OPEN
  113.     CALL    ERXIT
  114.     DB    '++CAN''T OPEN FILE 1 ',0DH,0AH,'$'
  115. FILE$1$OPEN:
  116.     LXI    D,FCB2
  117.     MVI    C,OPEN
  118.     CALL    BDOS
  119.     INR    A
  120.     RNZ
  121.     CALL    ERXIT
  122.     DB    '++CAN''T OPEN FILE 2',0DH,0AH,'$'
  123. ;
  124. READ1:
  125.     LHLD    BUFAD1    ;TIME TO READ?
  126.     DCR    H    ;AT 100H?
  127.     JNZ    NO$READ$1
  128. ;
  129. ;PHYSICALLY READ FILE 1
  130. ;
  131.     LXI    H,80H    ;BUFFER ADDR
  132.     SHLD    BUFAD1
  133.     XCHG        ;TO D,E
  134.     MVI    C,STDMA
  135.     CALL    BDOS
  136.     LXI    D,FCB
  137.     MVI    C,READ
  138.     CALL    BDOS
  139.     ORA    A    ;OK?
  140.     JNZ    EOF$FILE$1
  141.     LHLD    SECTOR$COUNT
  142.     INX    H
  143.     SHLD    SECTOR$COUNT
  144. NO$READ$1:
  145.     LHLD    BUFAD1
  146.     MOV    A,M    ;GET CHAR
  147.     INX    H    ;POINT TO NEXT
  148.     SHLD    BUFAD1
  149. ;
  150. ;REQUEST TO PRINT?
  151. ;
  152.     MOV    L,A    ;SAVE CHAR
  153.     IN    0FFH    ;READ SSW
  154.     ANI    1    ;PRINT?
  155.     MOV    A,L    ;RESTORE CHAR FOR RET
  156.     RZ        ;RET IF NO PRINT REQ
  157. ;SHOW THE CHARACTER
  158.     CPI    0DH    ;C/R?
  159.     JZ    SHOWIT
  160.     CPI    0AH    ;L/F?
  161.     JZ    SHOWIT
  162.     CPI    9    ;TAB?
  163.     JZ    SHOWIT
  164.     CPI    ' '    ;PRINTABLE?
  165.     JC    SHOWHEX    ;HEX IF NOT PRINTABLE
  166.     CPI    7FH
  167.     JC    SHOWIT
  168. ;SHOW IN HEX
  169. SHOWHEX    MVI    A,'('
  170.     CALL    TYPE
  171.     MOV    A,L    ;GET CHAR
  172.     CALL    XO
  173.     MVI    A,')'
  174. SHOWA    CALL    TYPE
  175.     MOV    A,L    ;GET CHAR
  176.     RET
  177. SHOWIT    MOV    A,L    ;GET CHAR
  178.     JMP    SHOWA
  179.     RET
  180. ;
  181. ;GOT EOF ON FILE 1 - SHOULD GET EOF ON FILE 2
  182. ;
  183. EOF$FILE$1:
  184.     MVI    A,1    ;GET FLAG
  185.     STA    EOF$FLAG
  186.     CALL    READ2    ;SHOULD NOT RETURN
  187.     CALL    ERXIT
  188.     DB    0DH,0AH,'++EOF ON FILE 1, NOT FILE 2$'
  189. ;
  190. READ2:
  191.     LHLD    BUFAD2    ;GET SECOND BUFF
  192.     MOV    A,L    ;GET ADDR
  193.     CPI    (BUF2+128) AND 0FFH ;END?
  194.     JNZ    NO$READ$2
  195. ;
  196. ;DO PHYSICAL READ ON FILE 2
  197. ;
  198.     LXI    H,BUF2
  199.     SHLD    BUFAD2
  200.     XCHG        ;TO DE
  201.     MVI    C,STDMA
  202.     PUSH    B    ;SAVE CHAR FROM FILE 1
  203.     CALL    BDOS
  204.     LXI    D,FCB2
  205.     MVI    C,READ
  206.     CALL    BDOS
  207.     POP    B
  208.     ORA    A
  209.     JNZ    EOF$FILE$2
  210. NO$READ$2:
  211.     LHLD    BUFAD2
  212.     MOV    A,M    ;GET CHAR
  213.     INX    H    ;POINT TO NEXT
  214.     SHLD    BUFAD2    ;SAVE BACK
  215.     RET
  216. ;
  217. EOF$FILE$2:
  218. ;SHOULD HAVE EOF ON 1, THUS EOF$FLAG SHOULD BE ON
  219.     LDA    EOF$FLAG
  220.     ORA    A    ;ON?
  221.     JNZ    A$OK
  222.     CALL    ERXIT
  223.     DB    0DH,0AH,'++EOF ON FILE 2 BEFORE FILE 1$'
  224. A$OK    LXI    D,MATCH$MSG
  225.     CALL    PRINT$MESSAGE
  226.     LHLD    SECTOR$COUNT
  227.     CALL    PRINT$HEX$HL
  228.     CALL    ERXIT
  229.     DB    '(HEX) SECTORS',0DH,0AH,'$'
  230. MATCH$MSG:
  231.     DB    0DH,0AH,'FILES MATCH, LENGTH IS $'
  232. ;
  233. MOVE$FCB:
  234.     LXI    H,FCB2
  235.     LXI    D,FCB+16
  236.     MVI    B,16    ;FCB LENGTH
  237. MOVEIT    LDAX    D
  238.     MOV    M,A
  239.     INX    D
  240.     INX    H
  241.     DCR    B
  242.     JNZ    MOVEIT
  243.     RET
  244. ;
  245.     DS    40    ;STACK AREA
  246. STACK    DS    2
  247. SECTOR$COUNT:
  248.     DW    0
  249. EOF$FLAG:
  250.     DB    0    ;=1 IF EOF FILE 1
  251. FCB2    DB    0,'XXXXXXXXYYY',0,0,0
  252.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  253. BUFAD1    DW    80H+128    ;INIT TO READ FIRST
  254. BUFAD2    DW    BUF2+128 ;LIKEWISE
  255. BUF2    DS    128
  256. ;
  257. ; * * * * * * * * * * * * * * * * * * * * * * * *
  258. ;                        *
  259. ;BDOS/CBIOS EQUATES (VERSION 5)            *
  260. ;                        *
  261. RDCON    EQU    1    ;            *
  262. WRCON    EQU    2    ;            *
  263. PRINT    EQU    9    ;            *
  264. OPEN    EQU    15    ;0FFH=NOT FOUND        *
  265. CLOSE    EQU    16    ;   "    "        *
  266. SRCHF    EQU    17    ;   "    "        *
  267. SRCHN    EQU    18    ;   "    "        *
  268. ERASE    EQU    19    ;NO RET CODE        *
  269. DELT    EQU    ERASE    ;            *
  270. READ    EQU    20    ;0=OK, 1=EOF        *
  271. WRITE    EQU    21    ;0=OK, 1=ERR, 2=?,    *
  272. ;            0FFH=NO DIR SPC        *
  273. MAKE    EQU    22    ;0FFH=BAD        *
  274. REN    EQU    23    ;0FFH=BAD        *
  275. STDMA    EQU    26    ;            *
  276. BDOS    EQU    5    ;            *
  277. FCB    EQU    5CH     ;            *
  278. SYSSIZ    EQU    24    ;SYSTEM SIZE        *
  279. CBIOS    EQU    SYSSIZ*1024-512    ;        *
  280. SELDSK    EQU    CBIOS+1BH    ;        *
  281. SETTRK    EQU    SELDSK+3    ;        *
  282. SETSEC    EQU    SETTRK+3    ;        *
  283. SETDMA    EQU    SETSEC+3    ;        *
  284. RDSEC    EQU    SETDMA+3    ;        *
  285. WRSEC    EQU    RDSEC+3        ;        *
  286. ; * * * * * * * * * * * * * * * * * * * * * * * *
  287.