2018-11-15 00:02:04 +00:00
|
|
|
*
|
|
|
|
*``````````````````````````````*
|
2018-12-23 01:35:05 +00:00
|
|
|
* STRCMP :: STRING COMPARE *
|
2018-11-15 00:02:04 +00:00
|
|
|
*- -*
|
|
|
|
* COMPARE TWO STRINGS AND *
|
|
|
|
* DETERMINE IF THEY ARE *
|
|
|
|
* IDENTICAL; IF NOT, DETERMINE *
|
|
|
|
* WHICH IS THE SHORTEST AND *
|
|
|
|
* WHICH IS THE LONGEST. *
|
|
|
|
* *
|
|
|
|
* Z FLAG = 1 IF IDENTICAL *
|
|
|
|
* Z FLAG = 0 IF NOT *
|
|
|
|
* CARRY = 1 IF STR2 > STR1 LEN *
|
|
|
|
* CARRY = 0 IF STR1 > STR2 LEN *
|
|
|
|
*- -*
|
|
|
|
* CLOBBERS: *
|
|
|
|
* *
|
|
|
|
* FLAGS: ????---- REG: AXYM *
|
|
|
|
*- -*
|
|
|
|
* CYCLES: ??? *
|
|
|
|
* SIZE: *
|
|
|
|
*- -*
|
|
|
|
* USAGE: *
|
|
|
|
* *
|
|
|
|
* LDA #>STR1 *
|
|
|
|
* PHA *
|
|
|
|
* LDA #<STR1 *
|
|
|
|
* PHA *
|
|
|
|
* LDA #>STR2 *
|
|
|
|
* PHA *
|
|
|
|
* LDA #<STR2 *
|
|
|
|
* PHA *
|
|
|
|
* JSR STRCMP *
|
|
|
|
* *
|
|
|
|
* STR1 STR "STRING1 " *
|
|
|
|
* STR2 STR "ZTRING2" *
|
|
|
|
*- -*
|
|
|
|
* ENTRY *
|
|
|
|
* *
|
|
|
|
* TOP OF STACK *
|
|
|
|
* *
|
|
|
|
* LOW BYTE OF RETURN ADDRESS *
|
|
|
|
* HI BYTE OF RETURN ADDRESS *
|
|
|
|
* STRING 2 ADDRESS LOW BYTE *
|
|
|
|
* STRING 2 ADDRESS HI BYTE *
|
|
|
|
* STRING 1 ADDRESS LOW BYTE *
|
|
|
|
* STRING 1 ADDRESS HI BYTE *
|
|
|
|
*- -*
|
|
|
|
* EXIT *
|
|
|
|
* *
|
|
|
|
* TOP OF STACK *
|
|
|
|
* *
|
|
|
|
* LOW BYTE OF RETURN ADDRESS *
|
|
|
|
* HI BYTE OF RETURN ADDRESS *
|
|
|
|
* *
|
2018-12-23 01:35:05 +00:00
|
|
|
* .Y = LENGTH OF STRING 2 *
|
|
|
|
* .X = LENGTH OF STRING 1 *
|
|
|
|
* .A = CLOBBERED; TRASH *
|
2018-11-15 00:02:04 +00:00
|
|
|
*- -*
|
|
|
|
* ADAPTED FROM LEVANTHAL AND *
|
|
|
|
* WINTHROP'S /6502 ASSEMBLY *
|
2018-12-23 01:35:05 +00:00
|
|
|
* LANGUAGE ROUTINES/. MAY NOT *
|
|
|
|
* FALL UNDER APACHE 2.0 UNTIL *
|
|
|
|
* SUBSTANTIALLY ALTERED. *
|
2018-11-15 00:02:04 +00:00
|
|
|
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
|
|
|
|
*
|
|
|
|
STRCMP
|
|
|
|
*
|
|
|
|
** SAVE RETURN ADDRESS
|
|
|
|
*
|
|
|
|
PLA
|
|
|
|
STA RETADR
|
|
|
|
PLA
|
|
|
|
STA RETADR+1
|
|
|
|
*
|
|
|
|
** GET PARAMETERS
|
|
|
|
*
|
|
|
|
PLA
|
|
|
|
STA ADDR2
|
|
|
|
PLA
|
|
|
|
STA ADDR2+1
|
|
|
|
PLA
|
|
|
|
STA ADDR1
|
|
|
|
PLA
|
|
|
|
STA ADDR1+1
|
|
|
|
*
|
|
|
|
LDY #0
|
|
|
|
LDA (ADDR1),Y ; GET LENGTH OF STRING 1
|
|
|
|
CMP (ADDR2),Y
|
|
|
|
BCC :BEGCMP ; IF STRING 2 IS SHORTER THEN
|
|
|
|
LDA (ADDR2),Y ; USE ITS LENGTH INSTEAD
|
|
|
|
*
|
|
|
|
** COMPARE THE STRINGS THROUGH THE
|
|
|
|
** LENGTH OF THE SHORTER STRING
|
|
|
|
*
|
|
|
|
:BEGCMP
|
|
|
|
TAX ; X IS LENGTH OF SHORTER STRING
|
|
|
|
BEQ :TSTLEN ; BR IF LENGTH IS 0
|
|
|
|
LDY #1 ; POINT AT FIRST CHAR OF STRINGS
|
|
|
|
:CMPLP
|
|
|
|
LDA (ADDR1),Y
|
|
|
|
CMP (ADDR2),Y
|
|
|
|
BNE :EXIT ; BR IF CHARS NOT EQUAL
|
|
|
|
; Z,C WILL BE PROPERLY SET
|
|
|
|
; OR CLEARED
|
|
|
|
; ELSE
|
|
|
|
INY ; NEXT CHAR
|
|
|
|
DEX ; DECREMENT COUNTER
|
|
|
|
BNE :CMPLP ; CONTINUE UNTIL ALL BYTES PAIRED
|
|
|
|
*
|
|
|
|
* THE 2 STRINGS ARE EQUAL TO LENGTH OF THE SHORTER
|
|
|
|
* SO USE LENGTHS AS BASIS FOR SETTING THE FLAGS
|
|
|
|
*
|
|
|
|
:TSTLEN
|
|
|
|
LDY #0 ; COMPARE LENGTHS
|
|
|
|
LDA (ADDR1),Y
|
|
|
|
CMP (ADDR2),Y ; SET OR CLEAR THE FLAGS
|
|
|
|
*
|
|
|
|
** Z FLAG = 1 IF STRINGS IDENTICAL
|
|
|
|
** Z FLAG = 0 IF NOT IDENTICAL
|
|
|
|
** CARRY = 0 IF STR2 LENGTH > STR1 LENGTH
|
|
|
|
** CARRY = 1 IF STR1 LENGTH >= STR2 LENGTH
|
|
|
|
*
|
|
|
|
:EXIT
|
|
|
|
*
|
|
|
|
** RESTORE RETURN ADDRESS
|
|
|
|
*
|
|
|
|
LDA RETADR+1
|
|
|
|
PHA
|
|
|
|
LDA RETADR
|
|
|
|
PHA
|
|
|
|
*
|
|
|
|
LDY #0
|
|
|
|
LDA (ADDR1),Y ; GET STR1 LENGTH
|
|
|
|
TAX ; RETURN IN X
|
|
|
|
LDA (ADDR2),Y ; STR2 LENGTH
|
|
|
|
TAY ; RETURN IN Y
|
|
|
|
*
|
|
|
|
RTS
|
|
|
|
*
|