-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy path6809_STRCMP.s
91 lines (85 loc) · 2.37 KB
/
6809_STRCMP.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
; Title String Compare
; Name: STRCMP
;
; Purpose: Compare 2 strings and return C and Z flags set or cleared.
;
; Entry: TOP OF STACK
;
; High byte of return address
; Low byte of return address
; High byte of string 2 address
; Low byte of string 2 address
; High byte of string 1 address
; Low byte of string 1 address
;
; Each string consists of a length byte followed by a maximum of 255 characters.
;
; Exit:
; IF STRING 1 = string 2 THEN string 2 THEN Z=1, C=0
; IF STRING 1 > string 2 THEN string 2 THEN Z=0, C=0
; IF STRING 1 < string 2 THEN string 2 THEN Z=0, C=1
;
; Registers Used: A,B,CC,U,X
;
; Time: 45 cycles overhead plus 20 cycles per byte
; plus 21 cycles if the strings are identical
; through the Length of the shorter one.
;
; Size: Program 36 bytes
;
STRCMP:
;
; DETERMINE WHICH STRING IS SHORTER
; LENGTH OF SHORTER = NUMBER OF BYTES T0 COMPARE
LDX 4,S ; GET BASE ADDRESS OF STRING 1
LDU 2,S ; GET BASE ADDRESS OF STRING 2
LDB ,X+ ; GET LENGTH OF STRING 1
CMPB ,U+ ; COMPARE TO LENGTH OF STRING 2
BCS BEGCMP ; BRANCH IF STRING 1 IS SHORTER
LDB -1,U ; ITS LENGTH IS NUMBER OF BYTES TO COMPARE
; OTHERWISE, STRING 2 IS SHORTER
; ITS LENGTH IS NUMBER OF BYTES T0 COMPARE
;
; COMPARE STRINGS THROUGH LENGTH OF SHORTER
; EXIT AS SOON AS CORRESPONDING CHARACTERS DIFFER
;
BEGCMP:
TSTB ; CHECK IF SHORTER STRING HAS ZERO LENGTH
BEQ EXITSC ; BRANCH (EXIT) IF IT DOES
CMPLP:
LDA ,X+ ; GET CHARACTER FROM STRING 1
CMPA ,U+ ; COMPARE TO CHARACTER FROM STRING 2
BNE EXITSC ; BRANCH IF CHARACTERS ARE NOT EQUAL
; Z,C WILL BE PROPERLY SET OR CLEARED
DECB ; COUNT CHARACTERS
BNE CMPLP ; CONTINUE UNTIL ALL BYTES COMPARED
; STRINGS SAME THROUGH LENGTH OF SHORTER
; SO USE LENGTHS TO SET FLAGS
LDA [4,S] ; GET LENGTH OF STRING 1
CMPA [2,S] ; COMPARE LENGTH OF STRING 2
;
; REMOVE PARAMETERS FROM STACK AND EXIT
EXITSC: ;
LDU ,S ; SAVE RETURN ADDRESS
LEAS 6,S ; REMOVE PARAMETERS FROM STACK
JMP ,U ; EXIT T0 RETURN ADDRESS
;
; SAMPLE EXECUTION:
;
SC5A:
LDY #S1 ; BASE ADDRESS OF STRING 1
LDX #S2 ; BASE ADDRESS OF STRING 2
PSHS X,Y ; SAVE PARAMETERS IN STACK
JSR STRCMP ; COMPARE STRINGS
; COMPARING "STRING 1" AND "STRING 2"
; RESULTS IN STRING 1 LESS THAN
; STRING 2, SO
BRA SC5A ; LOOP THROUGH TEST
;
; TEST DATA
;
S1: FCB $20
FCC /STRING 1
S2: FCB $20
FCC /STRING 2
END