Strings 0.2.0 update

- bugfixes
- implemented required library
- commenting updates
- .min of every routine
This commit is contained in:
nathanriggs 2018-12-22 20:35:05 -05:00
parent 1b182844cc
commit 16c1731e54
72 changed files with 7873 additions and 3439 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,10 +14,6 @@
*- -*
* USAGE: *
* *
* LDA #>$300 ; DESTINATION *
* PHA *
* LDA #<$300 *
* PHA *
* LDA #>11111 ; VALUE TO *
* PHA ; CONVERT *
* LDA #<11111 *
@ -30,8 +26,6 @@
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE DESTINATION ADDRESS *
* HI BYTE DESTINATION ADDRESS *
* LO BYTE VALUE TO CONVERT *
* HI BYTE VALUE TO CONVERT *
*- -*
@ -42,18 +36,16 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = COUNTER; TRASH *
* X = COUNTER; TRASH *
* A = LOW BYTE OF RET ADDR *
* .Y = COUNTER; TRASH *
* .X = COUNTER; TRASH *
* .A = LOW BYTE OF RET ADDR *
* *
* [RETURN] = STRING VALUE *
* [RETLEN] = LENGTH OF STRING *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
NUM2STR
@ -83,9 +75,9 @@ NUM2STR
STA :VALSTR+1
*
:GETBP
PLA
LDA #<RETURN
STA ADDR1 ; ADDRESS TO STORE STRING
PLA
LDA #>RETURN+1
STA ADDR1+1
LDA #0 ; SET BUFFER TO EMPTY
LDY #0
@ -148,7 +140,7 @@ NUM2STR
:EXIT
LDA :NGFLAG
BPL :POS ; BR IF ORIG VAL POS
LDA #'-' ; ELSE
LDA #173 ; ELSE
JSR :CONCAT ; PUT A MINUS SIGN IN FRONT
*
:POS

View File

@ -0,0 +1,98 @@
*
NUM2STR
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :VALSTR
PLA
STA :VALSTR+1
STA :NGFLAG
BPL :GETBP
LDA #0
SEC
SBC :VALSTR
STA :VALSTR
LDA #0
SBC :VALSTR+1
STA :VALSTR+1
:GETBP
LDA #<RETURN
STA ADDR1
LDA #>RETURN+1
STA ADDR1+1
LDA #0
LDY #0
STA (ADDR1),Y
:CNVERT
LDA #0
STA :MOD10
STA :MOD10+1
LDX #16
CLC
:DVLOOP
ROL :VALSTR
ROL :VALSTR+1
ROL :MOD10
ROL :MOD10+1
SEC
LDA :MOD10
SBC #10
TAY
LDA :MOD10+1
SBC #0
BCC :DECCNT
STY :MOD10
STA :MOD10+1
:DECCNT
DEX
BNE :DVLOOP
ROL :VALSTR
ROL :VALSTR+1
:CONCH
LDA :MOD10
CLC
ADC #$B0
JSR :CONCAT
LDA :VALSTR
ORA :VALSTR+1
BNE :CNVERT
:EXIT
LDA :NGFLAG
BPL :POS
LDA #173
JSR :CONCAT
:POS
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS
:CONCAT
PHA
LDY #0
LDA (ADDR1),Y
TAY
BEQ :EXITMR
:MVELP
LDA (ADDR1),Y
INY
STA (ADDR1),Y
DEY
DEY
BNE :MVELP
:EXITMR
PLA
LDY #1
STA (ADDR1),Y
LDY #0
LDA (ADDR1),Y
CLC
ADC #1
STA (ADDR1),Y
RTS
:NGFLAG DS 1
:VALSTR DS 2
:MOD10 DS 2

View File

@ -36,9 +36,9 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LOW BYTE STRING ADDR *
* X = HI BYTE STRING ADDR *
* A = STRING LENGTH *
* .Y = LOW BYTE STRING ADDR *
* .X = HI BYTE STRING ADDR *
* .A = STRING LENGTH *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PRNSTR
@ -88,4 +88,3 @@ PRNSTR
*
:S1LEN DS 1
*
*

View File

@ -0,0 +1,32 @@
*
PRNSTR
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
STA :S1LEN
:LP
INY
LDA (ADDR1),Y
JSR SCOUT1
CPY :S1LEN
BNE :LP
LDY #0
LDA (ADDR1),Y
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y
LDY ADDR1
LDX ADDR1+1
RTS
:S1LEN DS 1

View File

@ -0,0 +1,235 @@
*
JMP ENDVARS
*
*``````````````````````````````*
* REQUIRED.LIB *
*- -*
* GLOBAL ROUTINES AND *
* VARIABLES EITHER USED BY THE *
* LIBRARY OR PROVIDED FOR DEMO *
* USE OR DEBUGGING PURPOSES. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
********************************
* *
* GLOBAL ROUTINES *
* *
********************************
*
*``````````````````````````````*
* __GETRET: GET RETURN *
*- -*
* COPIES THE DATA IN [RETURN] *
* TO THE SPECIFIED LOCATION. *
* LENGTH IS DETERMINED BY *
* VALUE OF RETLEN. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__GETRET
*
LDY #255
PLA
STA ADDR1
PLA
STA ADDR1+1
*
:LP
INY
LDA RETURN,Y
STA (ADDR1),Y
CPY RETLEN
BNE :LP
LDA ADDR1+1
PHA
LDA ADDR1
PHA
RTS
*
*``````````````````````````````*
* __SETPARM: SET PARAMETER *
*- -*
* COPIES DATA FROM SPECIFIED *
* ADDRESS TO THE [PARAM] *
* LOCATION FOR PASSING TO *
* A ROUTINE. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__SETPARM
*
LDY #255
PLA
STA ADDR1
PLA
STA ADDR1+1
*
:LP
INY
LDA (ADDR1),Y
STA PARAM,Y
CPY PARLEN
BNE :LP
LDA ADDR1+1
PHA
LDA ADDR1
PHA
RTS
*
*``````````````````````````````*
* __DUMP: DUMP DATA *
*- -*
* OUTPUTS DATA LOCATED AT THE *
* SPECIFIED ADDRESS IN HEX *
* FORMAT FOR SPECIFIED NUMBER *
* OF BYTES. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__DUMP
*
PLA
STA :RET
PLA
STA :RET+1
PLA
STA :LENGTH
PLA
STA ADDR3
PLA
STA ADDR3+1
*
LDA #$8D
JSR $FDF0
LDA ADDR3+1
AND #$F0
LSR
LSR
LSR
LSR
TAX
LDA :HEXTAB,X
JSR $FDF0
LDA ADDR3+1
AND #$0F
TAX
LDA :HEXTAB,X
JSR $FDF0
LDA ADDR3
AND #$F0
LSR
LSR
LSR
LSR
TAX
LDA :HEXTAB,X
JSR $FDF0
LDA ADDR3
AND #$0F
TAX
LDA :HEXTAB,X
JSR $FDF0
LDA #186 ; :
JSR $FDF0
LDA #160 ; SPC
JSR $FDF0
*
LDY #0
:LP
LDA (ADDR3),Y
AND #$F0 ; MASK RIGHT
LSR
LSR
LSR
LSR
STA :LEFT
LDA (ADDR3),Y
AND #$0F ; MASK LEFT
STA :RIGHT
LDX :LEFT
LDA :HEXTAB,X
JSR $FDF0
LDX :RIGHT
LDA :HEXTAB,X
JSR $FDF0
LDA #160
JSR $FDF0
INY
CPY :LENGTH
BNE :LP
*
*LDA #$8D
*JSR $FDF0
LDA :RET+1
PHA
LDA :RET
PHA
*
RTS
*
:RET DS 2
:RIGHT DS 1
:LEFT DS 1
:LENGTH DS 1
:HEXTAB ASC "0123456789ABCDEF"
*
*``````````````````````````````*
* __P: PRINT FOLLOWING ASC *
*- -*
* THIS IS THE XPRINT ROUTINE *
* FROM STDIO.LIB, BUT STRIPPED *
* OF COMMENTS. FOR DEBUG. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__P
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #1
:LP LDA (ADDR1),Y
BEQ :DONE
JSR $FDF0
INY
BNE :LP
:DONE CLC
TYA
ADC ADDR1
STA ADDR1
LDA ADDR1+1
ADC #0
PHA
LDA ADDR1
PHA
RTS
*
*``````````````````````````````*
* __W: WAIT FOR KEYPRESS *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
__W
JSR $FD0C
RTS
*
********************************
* *
* GLOBAL VARIABLES *
* *
********************************
*
** 256 BYTES DEDICATED TO RETURN
** VALUES OF VARIABLE LENGTH; CAN BE
** MODIFIED TO SUIT SMALLER OR LARGER
** NEEDS.
*
*
RETLEN DS 1 ; RETURN VALUE BYTE LENGTH
RETURN DS 256
*
** 256 BYTE VALUE DEDICATED TO LARGE
** OR VARIABLE LENGTH PARAMETERS. THIS
** CAN ALSO BE CHANGED TO FIT SMALLER OR
** LARGER BOUNDS.
*
PARLEN DS 1
PARAM DS 256
*
ENDVARS
*

View File

@ -0,0 +1,134 @@
********************************
* *
********************************
*
*``````````````````````````````*
* REQUIRED.MAC *
*- -*
* MACROS USED FOR CORE UTILS *
* AND LIBRARY ROUTINES. NOTE *
* THAT THE LIBRARIES DO NOT *
* USE THESE MACROS, BUT MAY *
* USE THE ROUTINES. THESE ARE *
* MERELY PROVIDED FOR THE SAKE *
* OF CONVENIENCE. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*``````````````````````````````*
* _ISLIT: DETERMINES WHETHER A *
* PARAM IS LITERAL OR *
* NOT, AND CHANGES *
* APPROPRIATELY. FOR *
* MACRO USE ONLY. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_ISLIT MAC
IF #=]1 ; IF ]1 IS A LITERAL
LDA ]1/$100 ; GET HI
PHA
LDA ]1 ; GET LO
PHA
ELSE ; ]1 IS ADDRESS
LDA ]1+1 ; SO GET HIGH VAL FROM ADDR
PHA
LDA ]1 ; THEN LO VAL
PHA
FIN
<<<
*
*``````````````````````````````*
* _ISSTR: DETERMINES WHETHER A *
* PARAM IS A STRING OR *
* NOT, AND CHANGES *
* APPROPRIATELY. FOR *
* MACRO USE ONLY. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_ISSTR MAC
IF "=]1 ; IF ]1 IS A STRING
*
** STORE STRING AT TEMP ADDRESS, THEN
** PUSH TEMP ADDRESS
*
JMP STRCONT
]STRTMP STR ]1
STRCONT
LDY #0
LDA ]STRTMP
STA PARLEN
STA PARAM
]STRLP1
INY
LDA ]STRTMP,Y
STA PARAM,Y
CPY PARLEN
BNE ]STRLP1
*
LDA #>PARAM ; GET HI
PHA
LDA #<PARAM ; GET LO
PHA
ELSE ; ]1 IS ADDRESS
LDA #>]1 ; SO GET HIBYTE OF ADDR
PHA
LDA #<]1 ; THEN LOBYTE
PHA
FIN
<<<
*
*``````````````````````````````*
* _GRET: GET RETURN VALUE *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_GRET MAC
LDA #>]1
PHA
LDA #<]1
PHA
JSR __GETRET
<<<
*
*``````````````````````````````*
* _SPAR: SET PARAMETER *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SPAR MAC
LDA #>]1
PHA
LDA #<]1
PHA
JSR __SETPARM
<<<
*
*``````````````````````````````*
* _DUMP: DUMP DATA *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_DUMP MAC
LDA #>]1
PHA
LDA #<]1
PHA
LDA ]2
PHA
JSR __DUMP
<<<
*
*``````````````````````````````*
* _PRNT: PRINT STRING *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_PRNT MAC
JSR __P
ASC ]1
HEX 00
<<<
*
*``````````````````````````````*
* _WAIT: WAIT FOR KEYPRESS *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_WAIT MAC
JSR __W
<<<
*

View File

@ -36,21 +36,18 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = HI BYTE OF NUMBER *
* X = LO BYTE OF NUMBER *
* A = LOW BYTE OF RET ADDR *
* .Y = LO BYTE OF NUMBER *
* .X = HI BYTE OF NUMBER *
* .A = LOW BYTE OF RET ADDR *
* *
* [RETURN] = NUMBER VALUE WORD *
* [RETLEN] = 2 (NUM OF BYTES) *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
STR2NUM
*
** SAVE RETURN ADDRESS
@ -89,7 +86,7 @@ STR2NUM
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #'-'
CMP #173
BNE :PLUS ; BR IF NOT -
LDA #$0FF
STA :SNGFLAG ; ELSE SIGN IS NEGATIVE
@ -170,8 +167,6 @@ STR2NUM
:EREXIT
SEC
:EXIT
; Y IS ALREADY LOW BYTE
*
** RESTORE RETURN ADDRESS
*
@ -182,6 +177,10 @@ STR2NUM
*
LDX :NACCUM+1
LDY :NACCUM
STY RETURN
STX RETURN+1
LDA #2
STA RETLEN
LDA :NINDEX
*
RTS

View File

@ -0,0 +1,105 @@
*
STR2NUM
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
TAX
LDA #1
STA :NINDEX
LDA #0
STA :NACCUM
STA :NACCUM+1
STA :SNGFLAG
TXA
BNE :INIT1
JMP :EREXIT
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #173
BNE :PLUS
LDA #$0FF
STA :SNGFLAG
INC :NINDEX
DEX
BEQ :EREXIT
JMP :CNVERT
:PLUS
CMP #'+'
BNE :CHKDIG
INC :NINDEX
DEX
BEQ :EREXIT
:CNVERT
LDY :NINDEX
LDA (ADDR1),Y
:CHKDIG
CMP #$B0 ; "0"
BMI :EREXIT
CMP #$BA
BPL :EREXIT
PHA
ASL :NACCUM
ROL :NACCUM+1
LDA :NACCUM
LDY :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1
CLC
ADC :NACCUM
STA :NACCUM
TYA
ADC :NACCUM+1
STA :NACCUM+1
PLA
SEC
SBC #$B0
CLC
ADC :NACCUM
STA :NACCUM
BCC :D2B1
INC :NACCUM+1
:D2B1
INC :NINDEX
DEX
BNE :CNVERT
LDA :SNGFLAG
BPL :OKEXIT
LDA #0
SEC
SBC :NACCUM
STA :NACCUM
LDA #0
SBC :NACCUM+1
STA :NACCUM+1
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX :NACCUM+1
LDY :NACCUM
STY RETURN
STX RETURN+1
LDA #2
STA RETLEN
LDA :NINDEX
RTS
:NACCUM DS 2
:SNGFLAG DS 1
:NINDEX DS 1

View File

@ -4,7 +4,9 @@
*- -*
* CONCATENATE TWO STRINGS INTO *
* A SINGLE STRING STORE WHERE *
* THE FIRST STRING IS LOCATED *
* THE FIRST STRING IS LOCATED. *
* ADDITIONALLY COPIES CONCAT'D *
* STRING TO [RETURN]. *
*- -*
* CLOBBERS: *
* *
@ -50,18 +52,15 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = LENGTH OF FINAL STRING *
* A = 1 OF OVERFLOW, 0 IF NO *
* .Y = CLOBBERED; TRASH *
* .X = LENGTH OF FINAL STRING *
* .A = 1 IF OVERFLOW, 0 IF NO *
* [RETURN] = CONCAT'D STRING *
* [RETLEN] = LENGTH OF NEW STR *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCAT
@ -74,6 +73,7 @@ STRCAT
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :MLEN ; MAXIMUM CONCAT LENGTH
*
@ -155,9 +155,16 @@ STRCAT
DEC :SCNT ; DECREMENT COUNTER
BNE :CATLP ; CONT UNTIL __SCNT = 0
*
*
:EXIT
*
** UPDATE STRING1 LENGTH
*
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
@ -165,11 +172,22 @@ STRCAT
LDA RETADR
PHA
*
LDA :S1LEN
** COPY TO [RETURN]
*
LDY #0
LDA (ADDR1),Y ; LENGTH OF STRING
STA RETLEN
LDA #1
:RLP
LDA (ADDR1),Y
STA RETURN,Y
CPY RETLEN
INY
BNE :RLP
LDA RETLEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A ; CARRY = 1 IF OVERFLOW, 0 IF NOT
*
LDX :S3LEN ; RETURN FINAL LENGTH
*
RTS
@ -185,4 +203,3 @@ STRCAT
:SCNT DS 1
:SOVF DS 1
*
*

View File

@ -0,0 +1,96 @@
*
STRCAT
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLEN
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
STA :S1LEN
STA :S1IND
INC :S1IND
LDA (ADDR2),Y
STA :S2LEN
LDA #1
STA :S2IND
LDA :S2LEN
CLC
ADC :S1LEN
STA :S3LEN
BCS :TOOLONG
CMP :MLEN
BEQ :LENOK
BCC :LENOK
:TOOLONG
LDA #$0FF
STA :SOVF
LDA :MLEN
SEC
SBC :S1LEN
BCC :EXIT
STA :SCNT
LDA :MLEN
STA :S1LEN
JMP :DOCAT
:LENOK
STA :S1LEN
LDA #0
STA :SOVF
LDA :S2LEN
STA :SCNT
:DOCAT
LDA :SCNT
BEQ :EXIT
:CATLP
LDY :S2IND
LDA (ADDR2),Y
LDY :S1IND
STA (ADDR1),Y
INC :S1IND
INC :S2IND
DEC :SCNT
BNE :CATLP
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y
STA RETLEN
LDA #1
:RLP
LDA (ADDR1),Y
STA RETURN,Y
CPY RETLEN
INY
BNE :RLP
LDA RETLEN
LDY #0
STA (ADDR1),Y
LDX :S3LEN
RTS
:S3LEN DS 1
:S1LEN DS 1
:S1IND DS 1
:S2LEN DS 1
:S2IND DS 1
:MLEN DS 1
:SCNT DS 1
:SOVF DS 1

View File

@ -1,6 +1,6 @@
*
*``````````````````````````````*
* STRCMP :: STRING COMPARE *
* STRCMP :: STRING COMPARE *
*- -*
* COMPARE TWO STRINGS AND *
* DETERMINE IF THEY ARE *
@ -53,27 +53,15 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LENGTH OF STRING 2 *
* X = LENGTH OF STRING 1 *
* A = CLOBBERED; TRASH *
* *
* - SEE DESCRIPTION FOR FLAG *
* CHANGES *
* .Y = LENGTH OF STRING 2 *
* .X = LENGTH OF STRING 1 *
* .A = CLOBBERED; TRASH *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. NOT *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
* *
* THAT SAID, LEVENTHAL WROTE *
* THAT THE PURPOSE OF THE BOOK *
* WAS TO COPY THE SOURCE CODE, *
* AS REINVENTING THE WHEEL IS *
* TEDIOUS, AND HE PLACED NO *
* RESTRICTIONS ON ITS USE. *
* LANGUAGE ROUTINES/. MAY NOT *
* FALL UNDER APACHE 2.0 UNTIL *
* SUBSTANTIALLY ALTERED. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCMP

View File

@ -0,0 +1,46 @@
*
STRCMP
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
CMP (ADDR2),Y
BCC :BEGCMP
LDA (ADDR2),Y
:BEGCMP
TAX
BEQ :TSTLEN
LDY #1
:CMPLP
LDA (ADDR1),Y
CMP (ADDR2),Y
BNE :EXIT
INY
DEX
BNE :CMPLP
:TSTLEN
LDY #0
LDA (ADDR1),Y
CMP (ADDR2),Y
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y
TAX
LDA (ADDR2),Y
TAY
RTS

View File

@ -3,9 +3,9 @@
* *
* -< STRINGS DEMO >- *
* *
* VERSION 00.00.01 *
* VERSION 00.02.00 *
* *
* 03/04/1980 *
* 21-DEC-2018 *
* *
********************************
* *
@ -19,237 +19,177 @@
CYC AVE
EXP ONLY
DSK STRINGS.DEMO
*
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* TOP INCLUDES (PUTS, MACROS) *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PUT DECS
USE STRINGS.MAC
USE REQUIRED.MAC
PUT REQUIRED.HOOKS
*
USE STRINGS.MAC
PUT STRINGS.HOOKS
*
OBJ $BFE0
ORG $6000
*
*``````````````````````````````*
* PROGRAM MAIN BODY *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
*
** BIG LUMPS -- HIGH LEVEL CODE
*
*
** STRCMP COMPARES TWO STRINGS, THEN
** SETS THE STATUS REGISTER AS FOLLOWS:
*
** Z=1 IF STRINGS ARE IDENTICAL
** Z=0 IF STRINGS NOT IDENTICAL
** C=1 IF STRING2 LENGTH IS >
** C=0 IF STRING1 LENGTH IS >
*
** MACRO:
*
_PRNT " ",8D8D8D8D
_PRNT "STRINGS LIBRARY DEMO",8D
_PRNT "--------------------",8D
_PRNT " ",8D
_PRNT "THE SCMP MACRO COMPARES TWO ",8D
_PRNT "STRINGS AND SETS THE FLAGS",8D
_PRNT "ACCORDINGLY. IF THE TWO ARE EQUAL,",8D
_PRNT "THEN .Z IS SET TO ZERO; IF NOT, 1.",8D8D
_PRNT "IF STRING1 LENGTH > STRING2 LENGTH,",8D
_PRNT ".C(ARRY) = 0; ELSE, .C = 1.",8D8D
_PRNT "SO, WE CAN COMPARE THE LITERAL 'A'",8D
_PRNT "TO THE VALUE STORED IN ASTR, WHICH",8D
_PRNT "HOLDS THE SAME STRING, THEN USE BNE TO",8D
_PRNT "TEST IF THEY ARE EQUAL.",8D8D
SCMP "A";ASTR
BNE PE ; IS ZERO FLAG 1? BRANCH IF SO
JMP CONT
STR1 STR "THIZ IS STRING1"
STR2 STR "THIS IS STRING 2"
PE
_PRNT "THE LITERAL A AND THE A STRING ARE",8D
_PRNT "EQUAL.",8D8D8D
CONT
LDA #>STR1
PHA
LDA #<STR1
PHA
LDA #>STR2
PHA
LDA #<STR2
PHA
JSR STRCMP
* BRK ; P = 31 = 00110001; Z=0,C=1
_WAIT
_PRNT "NOTE THAT ONLY A SINGLE PARAMETER",8D
_PRNT "MAY BE A LITERAL STRING IN SCMP;",8D
_PRNT "THIS SAME RULE APPLIES TO ALL MACROS",8D
_PRNT "THAT ACCEPT STRINGS AS PARAMETERS.",8D8D
_PRNT "YOU CAN ALSO USE SCMP TO COMPARE",8D
_PRNT "THE LENGTHS OF TWO DIFFERENT STRINGS.",8D8D
_PRNT "THE CARRY FLAG IS SET TO 0 IF THE",8D
_PRNT "FIRST STRING HAS A LENGTH > THAN THE ",8D
_PRNT "SECOND STRING'S LENGTH. THIS CAN THEN",8D
_PRNT "BE TESTED WITH BCS.",8D8D
_PRNT "SO IF WE COMPARE THE LITERAL 'AA' ",8D
_PRNT "TO THE SAME ASTR, WE WILL FIND THAT",8D
_PRNT "THE LITERAL HAS A GREATER LENGTH.",8D8D
*
SCMP "AA";ASTR
BCS LE
JMP CONT2
LE
_PRNT "THE LITERAL 'AA' IS GREATER THAN ",8D
_PRNT "ASTR, WHICH HOLDS 'A'.",8D8D8D
CONT2
_WAIT
*
** STRCAT CONCATENATES TWO STRINGS AND RETURNS
** THE CONCATENATED STRING WHERE THE FIRST
** STRING WAS STORED.
_PRNT " ",8D8D8D8D
_PRNT "THE SCAT MACRO CONCATENATES",8D
_PRNT "A SECOND GIVEN STRING TO A ",8D
_PRNT "FIRST GIVEN STRING. EITHER PARAMETER",8D
_PRNT "MAY BE A LITERAL STRING, BUT NEVER BOTH.",8D8D
_PRNT "SCAT 'WTF IS ';ASTR;#50 RETURNS: ",8D8D
SCAT "WTF IS ";ASTR;#50
SPRN RETURN
_PRNT " ",8D8D8D
_WAIT
*
** MACRO:
_PRNT "TO SHOW THE RESULT OF SCAT,",8D
_PRNT "WE USED THE SPRN MACRO, WHICH",8D
_PRNT "SIMPLY PRINTS A STRING. THIS",8D
_PRNT "WORKS DIFFERENTLY THAN THE PRINT",8D
_PRNT "ROUTINES IN STDIO OR THE _PRNT",8D
_PRNT "ROUTINE, AS IT CAN ONLY HANDLE",8D
_PRNT "A STRING ADDRESS.",8D8D
_PRNT "SPRN BSTR RETURNS: "
SPRN BSTR
_PRNT " ",8D8D8D
_WAIT
_PRNT " ",8D8D8D
_PRNT "TOSTR CONVERTS A 16-BIT INTEGER INTO",8D
_PRNT "ITS STRING EQUIVALENT. THIS CAN",8D
_PRNT "EITHER BE A LITERAL OR AN ADDRESS."
_PRNT " ",8D8D
_PRNT "TOSTR #5000 RETURNS: "
TOSTR #5000
SPRN RETURN
_PRNT " ",8D8D
_PRNT "TOSTR $300 RETURNS "
LDA #$FF
STA $300
STA $301
TOSTR $300
SPRN RETURN
_PRNT " ",8D8D
_PRNT "NOTE THAT $FFFF RETURNS -1 BECAUSE",8D
_PRNT "THE TOSTR ROUTINE ASSUMES A ",8D
_PRNT "SIGNED VALUE. "
_PRNT " ",8D8D8D
_WAIT
*
JMP CATCON
CATSTR STR "ABC"
BLANK STR " "
CATSTR2 STR "DEF"
_PRNT " ",8D8D8D
_PRNT "AND THE TONUM MACRO DOES THE",8D
_PRNT "OPPOSITE: IT RETURNS A 16-BIT ",8D
_PRNT "INTEGER VALUE CONERTED FROM ITS",8D
_PRNT "STRING EQUIVALENT. THUS:",8D8D
_PRNT "TONUM '255' RETURNS:",8D
TONUM "255"
_DUMP RETURN;RETLEN
_PRNT " ",8D8D8D
_WAIT
*
CATCON
LDA #>CATSTR
PHA
LDA #<CATSTR
PHA
LDA #>CATSTR2
PHA
LDA #<CATSTR2
PHA
LDA #7 ; MAX SIZE OF CAT
PHA
JSR STRCAT
LDX #>CATSTR
LDY #<CATSTR
* BRK ; X,Y HOLDS LOW AND HIGH BYTES OF
* THE ADDRESS TO THE CONCATENATED STRING.
* IF YOU LIST THAT ADDRESS, YOU SHOULD SEE
* THAT THE FIRST LOCATION HOLDS THE LENGTH
* OF THE NEW STRING (06), FOLLOWED BY THE
* HEXADECIMAL CODES FOR THE CHARACTERS
* ABCDEF: C1 C2 C3 C4 C5 C6
_PRNT " ",8D8D8D8D
_PRNT "SUBSTRING ROUTINES/MACROS",8D
_PRNT "-------------------------",8D8D
_PRNT "SPOS FINDS THE POSITION OF",8D
_PRNT "A SUBSTRING WITHIN ANOTHER",8D
_PRNT "STRING.",8D8D
_PRNT "SPOS 'THIS IS A STRING';ASTR RETURNS: "
SPOS "THIS IS A STRING";ASTR
STA $300
LDA #0
STA $301 ; CLEAR HI BYTE
TOSTR $300
SPRN RETURN
_PRNT " ",8D8D8D
*
_PRNT " ",8D8D8D
_PRNT "THE SCPY MACRO COPIES A ",8D
_PRNT "SUBSTRING FROM ANOTHER STRING",8D
_PRNT "AT THE SPECIFIED INDEX, HOLDING",8D
_PRNT "THE SUBSTRING IN [RETURN].",8D8D
_PRNT "SCPY 'ABCDEFGHIJK';#2;#4;#50 RETURNS: "
SCPY "ABCDEFGHIJK";#2;#4;#$FF
SPRN RETURN
_PRNT " ",8D8D8D
_WAIT
*
_PRNT " ",8D8D8D8D8D
_PRNT "THE SDEL MACRO DELETES A SUBSTRING",8D
_PRNT "FROM THE GIVEN SOURCE STRING. NOTE ",8D
_PRNT "THAT THE SOURCE STRING MUST NOT",8D
_PRNT "BE A LITERAL BECAUSE THIS ROUTINE",8D
_PRNT "ALTERS THE STRING PASSED TO IT.",8D8D
_PRNT "IF LSTR HOLDS 'THIS IS A STRING.'",8D
_PRNT "THEN SDEL LSTR;#1;#7 RETURNS: ",8D8D
SDEL LSTR;#1;#7
SPRN LSTR
_PRNT " ",8D8D8D8D
_WAIT
*
** PRNSTR PRINTS THE STRING AT THE SPECIFIED
** MEMORY ADDRESS TO COUT1.
*
** MACRO:
*
LDA #>CATSTR ; FROM PREVIOUS EXAMPLE
PHA
LDA #<CATSTR
PHA
JSR PRNSTR
* BRK ; YOU SHOULD SEE
* "ABCDEF" APPENDED TO THE LINE WHERE YOU
* TYPED "BRUN STRINGS.DEMO." USE ROUTINES FROM
* STDIO FOR PLACEMENT OF THE TEXT.
*
*
*
*
JMP NUMSTRX
NUMSTR HEX 2B67 ;11111
NUMSTRX
*
LDA #>$300 ; DESTINATION
PHA
LDA #<$300
PHA
LDA #>11111 ; VALUE TO CONVERT
PHA
LDA #<11111
PHA
JSR NUM2STR
*BRK
*
* $300 SHOULD NOW HOLD 05,B1,B1,B1,B1,B1
*
*
*
** STR2NUM DOES THE OPPOSITE OF NUM2STR: IT
** RETURNS THE NUMBER EQUIVALENT OF A STRING
** AND HOLDS THEM IN X (HIGH) AND Y (LOW)
*
LDA #>$300 ; STRING FROM PREVIOUS
PHA
LDA #<$300
PHA
JSR STR2NUM
*BRK ; X,Y HOLDS 2B67, #11111
*
*
** SUBPOS RETURNS THE POSITION OF A SUBSTRING
** WITHIN A PARENT STRING.
*
LDA #>STR ; STRING ADDRESS
PHA
LDA #<STR
PHA
LDA #>SUB ; SUBSTRING ADDRESS
PHA
LDA #<SUB
PHA
JSR SUBPOS
JMP SUBPOSX
STR STR "THIS IS A TEST"
SUB STR "IS A TEST"
SUBPOSX
*BRK ; A = 06
*
*
** SUBCOPY COPIES A SUBSTRING AT THE SPECIFIED
** POSITION TO A PARTICULAR MEMORY ADDRESS
*
LDA #>STR11 ; SOURCE STRING
PHA
LDA #<STR11
PHA
LDA #5 ; INDEX TO START COPY
PHA
LDA #5 ; LENGTH TO COPY
PHA
LDA #>STR21
PHA
LDA #<STR21
PHA
LDA #15 ; MAX LENGTH OF STRING 2
PHA
JSR SUBCOPY
JMP STRCOPYX
STR11 STR "0123456789012345"
STR21 STR "000000000000000000"
STRCOPYX
LDX #>STR21
LDY #<STR21 ; ADDRESS OF STR2
*BRK ; LOCATION FOR STR21 SHOULD NOW START WITH
* 4,5,6,7,8
*
*
** SUBDEL DELETES A SUBSTRING FROM A GIVEN STRING
** AND CHANGES THE STRING SIZE ACCORDINGLY.
** MIN POSITION IS 1, NOT 0
*
LDA #>STR11 ; STRING LOCATION
PHA
LDA #<STR11
PHA
LDA #1 ; STARTING INDEX FOR DELETE
PHA
LDA #5 ; LENGTH TO DELETE
PHA
JSR SUBDEL
LDX #>STR11
LDY #<STR11
*BRK ; FIRST 5 DIGITS ARE DELETED, REMAINING STRING
* STORED ANEW
*
*
** SUBINS INSERTS A SOURCE STRING
** INTO ANOTHER DESTINATION STRING, MOVING THE
** CONTENTS AND ADJUSTING LENGTH AS NECESSARY.
*
LDA #>INS1 ; DESTINATION
PHA
LDA #<INS1
PHA
LDA #3 ; INDEX
PHA
LDA #200 ; MAXLEN OF NEW STRING
PHA
LDA #>INS2 ; SOURCE SUBSTRING
PHA
LDA #<INS2
PHA
JSR SUBINS
LDY #<INS1
LDX #>INS1
*BRK ; MEMLOC IN XY NOW HAS INS2 INSERTED INTO INS1
* AT LOCATION 3
*
** DATA
*
INS1 STR "XXXXXXXXX"
ZZZ STR "999999999"
INS2 STR "111111111"
*
*
*
*
** LITTLE LUMPS -- MID/LOW LEVEL
*
_PRNT "THE SINS MACRO DOES THE ",8D
_PRNT "OPPOSITE OF SDEL: IT INSERTS",8D
_PRNT "A SUBSTRING INTO A PARENT STRING",8D
_PRNT "AT THE GIVEN INDEX. NOTE THAT",8D
_PRNT "WHILE THE PARENT STRING CANNOT BE ",8D
_PRNT "A LITERAL, THE SUBSTRING ITSELF CAN BE.",8D8D
_PRNT "THUS SINS LSTR;#1;#50;'THIS IS NOT'",8D
_PRNT "RETURNS: ",8D
SINS LSTR;#1;#50;"THIS IS NOT"
SPRN LSTR
_PRNT " ",8D8D8D8D
_WAIT
*
JMP REENTRY
*
@ -257,9 +197,12 @@ INS2 STR "111111111"
* BOTTOM INCLUDES *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
** BOTTOM INCLUDES
*
PUT STRINGS.LIB
PUT SUBSTRINGS.LIB
PUT REQUIRED.LIB
*
ASTR STR "A"
BSTR STR "B"
LSTR STR "THIS IS A STRING."

View File

@ -9,28 +9,14 @@
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* VERSION: 0.1.2 *
* DATE: 30-OCT-2018 *
* VERSION: 0.2.0 *
* DATE: 30-OCT-2018 *
* ASSEMBLER: MERLIN 8 PRO *
* *
* LICENSE: APACHE 2.0, WHERE *
* APPLICABLE. CODE INSPIRED *
* BY THE WORKS OF OTHERS MAY *
* FALL UNDER A DIFFERENT *
* LICENSE (NOTED IN ROUTINE). *
* OS: DOS 3.3 *
* LICENSE: APACHE 2.0 *
* *
* THIS IS A STANDARD LIBRARY *
* FOR STRING MANIPULATION. *
* STRINGS ARE MOSTLY JUST 1-D *
* ARRAYS PRECEDED BY A LENGTH *
* BYTE. THIS DIFFERS FROM THE *
* USE OF STRING IN THE PRINT *
* ROUTINES OF STDIO (THOUGH *
* NOT THE SINPUT ROUTINE) IN *
* THAT THOSE "STRINGS" ARE *
* TERMINATED WITH A #00 TO *
* INDICATE AN END, RATHER THAN *
* USING A LENGTH BYTE. *
* *
*------------------------------*
* *
@ -38,8 +24,6 @@
* *
* STRCOMP : STRING COMPARE *
* STRCAT : CONCATENATE STRING *
* ASC2STR : NUL TO INDEXED STR *
* STR2ASC : INDEXED TO NUL STR *
* PRNSTR : PRINT STRING *
* NUM2STR : NUMBER TO STRING *
* STR2NUM : STRING TO NUMBER *
@ -47,7 +31,7 @@
*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*
*
*``````````````````````````````*
* STRCMP :: STRING COMPARE *
* STRCMP :: STRING COMPARE *
*- -*
* COMPARE TWO STRINGS AND *
* DETERMINE IF THEY ARE *
@ -100,27 +84,15 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LENGTH OF STRING 2 *
* X = LENGTH OF STRING 1 *
* A = CLOBBERED; TRASH *
* *
* - SEE DESCRIPTION FOR FLAG *
* CHANGES *
* .Y = LENGTH OF STRING 2 *
* .X = LENGTH OF STRING 1 *
* .A = CLOBBERED; TRASH *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. NOT *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
* *
* THAT SAID, LEVENTHAL WROTE *
* THAT THE PURPOSE OF THE BOOK *
* WAS TO COPY THE SOURCE CODE, *
* AS REINVENTING THE WHEEL IS *
* TEDIOUS, AND HE PLACED NO *
* RESTRICTIONS ON ITS USE. *
* LANGUAGE ROUTINES/. MAY NOT *
* FALL UNDER APACHE 2.0 UNTIL *
* SUBSTANTIALLY ALTERED. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCMP
@ -202,7 +174,9 @@ STRCMP
*- -*
* CONCATENATE TWO STRINGS INTO *
* A SINGLE STRING STORE WHERE *
* THE FIRST STRING IS LOCATED *
* THE FIRST STRING IS LOCATED. *
* ADDITIONALLY COPIES CONCAT'D *
* STRING TO [RETURN]. *
*- -*
* CLOBBERS: *
* *
@ -248,18 +222,15 @@ STRCMP
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = LENGTH OF FINAL STRING *
* A = 1 OF OVERFLOW, 0 IF NO *
* .Y = CLOBBERED; TRASH *
* .X = LENGTH OF FINAL STRING *
* .A = 1 IF OVERFLOW, 0 IF NO *
* [RETURN] = CONCAT'D STRING *
* [RETLEN] = LENGTH OF NEW STR *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
STRCAT
@ -272,6 +243,7 @@ STRCAT
STA RETADR+1
*
** GET PARAMETERS
*
PLA
STA :MLEN ; MAXIMUM CONCAT LENGTH
*
@ -353,9 +325,16 @@ STRCAT
DEC :SCNT ; DECREMENT COUNTER
BNE :CATLP ; CONT UNTIL __SCNT = 0
*
*
:EXIT
*
** UPDATE STRING1 LENGTH
*
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A
*
** RESTORE RETURN ADDRESS
*
LDA RETADR+1
@ -363,11 +342,22 @@ STRCAT
LDA RETADR
PHA
*
LDA :S1LEN
** COPY TO [RETURN]
*
LDY #0
LDA (ADDR1),Y ; LENGTH OF STRING
STA RETLEN
LDA #1
:RLP
LDA (ADDR1),Y
STA RETURN,Y
CPY RETLEN
INY
BNE :RLP
LDA RETLEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A ; CARRY = 1 IF OVERFLOW, 0 IF NOT
*
LDX :S3LEN ; RETURN FINAL LENGTH
*
RTS
@ -420,9 +410,9 @@ STRCAT
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = LOW BYTE STRING ADDR *
* X = HI BYTE STRING ADDR *
* A = STRING LENGTH *
* .Y = LOW BYTE STRING ADDR *
* .X = HI BYTE STRING ADDR *
* .A = STRING LENGTH *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
PRNSTR
@ -487,10 +477,6 @@ PRNSTR
*- -*
* USAGE: *
* *
* LDA #>$300 ; DESTINATION *
* PHA *
* LDA #<$300 *
* PHA *
* LDA #>11111 ; VALUE TO *
* PHA ; CONVERT *
* LDA #<11111 *
@ -503,8 +489,6 @@ PRNSTR
* *
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* LO BYTE DESTINATION ADDRESS *
* HI BYTE DESTINATION ADDRESS *
* LO BYTE VALUE TO CONVERT *
* HI BYTE VALUE TO CONVERT *
*- -*
@ -515,18 +499,16 @@ PRNSTR
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = COUNTER; TRASH *
* X = COUNTER; TRASH *
* A = LOW BYTE OF RET ADDR *
* .Y = COUNTER; TRASH *
* .X = COUNTER; TRASH *
* .A = LOW BYTE OF RET ADDR *
* *
* [RETURN] = STRING VALUE *
* [RETLEN] = LENGTH OF STRING *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
NUM2STR
@ -556,9 +538,9 @@ NUM2STR
STA :VALSTR+1
*
:GETBP
PLA
LDA #<RETURN
STA ADDR1 ; ADDRESS TO STORE STRING
PLA
LDA #>RETURN+1
STA ADDR1+1
LDA #0 ; SET BUFFER TO EMPTY
LDY #0
@ -621,7 +603,7 @@ NUM2STR
:EXIT
LDA :NGFLAG
BPL :POS ; BR IF ORIG VAL POS
LDA #'-' ; ELSE
LDA #173 ; ELSE
JSR :CONCAT ; PUT A MINUS SIGN IN FRONT
*
:POS
@ -712,21 +694,18 @@ NUM2STR
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = HI BYTE OF NUMBER *
* X = LO BYTE OF NUMBER *
* A = LOW BYTE OF RET ADDR *
* .Y = LO BYTE OF NUMBER *
* .X = HI BYTE OF NUMBER *
* .A = LOW BYTE OF RET ADDR *
* *
* [RETURN] = NUMBER VALUE WORD *
* [RETLEN] = 2 (NUM OF BYTES) *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
*
STR2NUM
*
** SAVE RETURN ADDRESS
@ -765,7 +744,7 @@ STR2NUM
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #'-'
CMP #173
BNE :PLUS ; BR IF NOT -
LDA #$0FF
STA :SNGFLAG ; ELSE SIGN IS NEGATIVE
@ -846,8 +825,6 @@ STR2NUM
:EREXIT
SEC
:EXIT
; Y IS ALREADY LOW BYTE
*
** RESTORE RETURN ADDRESS
*
@ -858,6 +835,10 @@ STR2NUM
*
LDX :NACCUM+1
LDY :NACCUM
STY RETURN
STX RETURN+1
LDA #2
STA RETLEN
LDA :NINDEX
*
RTS

View File

@ -7,17 +7,11 @@
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* VERSION: 0.1.2 *
* DATE: 30-OCT-2018 *
* VERSION: 0.2.0 *
* DATE: 21-DEC-2018 *
* ASSEMBLER: MERLIN 8 PRO *
* *
* LICENSE: APACHE 2.0 LICENSE, *
* WHERE APPLICABLE. CODE *
* INSPIRED BY OR COPIED FROM *
* OTHERS MAY FALL UNDER A *
* DIFFERENT LICENSE. I WILL *
* DO MY BEST TO NOTIFY SUCH *
* CASES. *
* OS: DOS 3.3 *
* LICENSE: APACHE 2.0 *
* *
*------------------------------*
* *
@ -29,52 +23,46 @@
* *
* LIST OF MACROS *
* *
* _SCMP : STRING COMPARE *
* _SCAT : STRING CONCATENATE *
* _SPRN : PRINT STRING *
* _2STR : NUMBER TO STRING *
* _2NUM : STRING TO NUMBER *
* _SPOS : FIND SUBSTRING POS *
* _SCOP : SUBSTRING COPY *
* _SDEL : SUBSTRING DELETE *
* _SINS : SUBSTRING INSERT *
* SCMP : STRING COMPARE *
* SCAT : STRING CONCATENATE *
* SPRN : PRINT STRING *
* TOSTR : NUMBER TO STRING *
* TONUM: STRING TO NUMBER *
* SPOS : FIND SUBSTRING POS *
* SCOP : SUBSTRING COPY *
* SDEL : SUBSTRING DELETE *
* SINS : SUBSTRING INSERT *
* *
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*
*
*``````````````````````````````*
* _SCMP : STRING COMPARE *
* SCMP : STRING COMPARE *
*- -*
* COMPARE TWO STRINGS AND *
* DETERMINE IF IDENTICAL, OR *
* LONGER AND SHORTER. *
* *
* Z = 1 IF IDENTICAL; 0 IF NOT *
* C = 1 IF STR2 > STR1 *
* C = 0 IF STR1 > STR2 LENGTH *
* .Z=1 IF IDENTICAL; 0 IF NOT *
* .C=1 IF STR2 > STR1 *
* .C=0 IF STR1 > STR2 LENGTH *
*- -*
* PARAMETERS: *
* *
* PARAM1 = STRING 1 ADDRESS *
* PARAM2 = STRING 2 ADDRESS *
* ]1 = STRING 1 ADDRESS *
* ]2 = STRING 2 ADDRESS *
*- -*
* SAMPLE USAGE: *
* _SCMP $300;$320 *
* SCMP $300;$320 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SCMP MAC
LDA #>]1 ; STRING 1
PHA
LDA #<]1
PHA
LDA #>]2 ; STRING 2
PHA
LDA #<]2
PHA
SCMP MAC
_ISSTR ]1
_ISSTR ]2
JSR STRCMP
<<<
*
*``````````````````````````````*
* _SCAT : CONCATENATE STRINGS *
* SCAT : CONCATENATE STRINGS *
*- -*
* CONCATENATES STRING 1 AND *
* STRING 2, STORED AT THE *
@ -82,31 +70,24 @@ _SCMP MAC
*- -*
* PARAMETERS: *
* *
* PARAM1 = ADDR OF STRING 1 *
* PARAM2 = ADDR OF STRING 2 *
* PARAM3 = MAX LENGTH OF NEW *
* STRING *
* ]1 = ADDR OF STRING 1 *
* ]2 = ADDR OF STRING 2 *
* ]3 = MAX LEN OF NEW STRING *
*- -*
* SAMPLE USAGE: *
* _SCAT $300;$320;#18 *
* SCAT $300;$320;#18 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SCAT MAC
LDA #>]1 ; STRING 1
PHA
LDA #<]1
PHA
LDA #>]2 ; STRING 2 ADDR
PHA
LDA #<]2
PHA
SCAT MAC
_ISSTR ]1
_ISSTR ]2
LDA ]3 ; MAX SIZE; BYTE
PHA
JSR STRCAT
<<<
*
*``````````````````````````````*
* _SPRN : PRINT STRING *
* SPRN : PRINT STRING *
*- -*
* PRINTS THE STRING LOCATED AT *
* THE SPECIFIED ADDRESS, WHICH *
@ -114,13 +95,13 @@ _SCAT MAC
*- -*
* PARAMETERS: *
* *
* PARAM1 = STRING ADDRESS *
* ]1 = STRING ADDRESS *
*- -*
* SAMPLE USAGE: *
* _SPRN $300 *
* SPRN $300 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_PRS MAC
SPRN MAC
LDA #>]1 ; ADDRESS OF STRING
PHA
LDA #<]1
@ -129,36 +110,26 @@ _PRS MAC
<<<
*
*``````````````````````````````*
* _2STR : NUMBER TO STRING *
* TOSTR : NUMBER TO STRING *
*- -*
* CONVERTS A 16BIT NUMBER TO *
* ITS STRING EQUIVALENT. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = ADDR TO STORE STRNG *
* PARAM2 = VALUE TO CONVERT *
* ]1 = VALUE TO CONVERT *
*- -*
* SAMPLE USAGE: *
* _2STR $300; #11111 *
* TOSTR #11111 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_2STR MAC
LDA #>]1 ; DEST ADDR
PHA
LDA #<]1
PHA
LDA #>]2 ; NUMBER VAL
PHA
LDA #<]2
PHA
TOSTR MAC
_ISLIT ]1
JSR NUM2STR
<<<
*
** NOTE: HOW TO DO ADDRESS WHERE NUM IS STORED?
*
*``````````````````````````````*
* _2NUM : STRING TO NUMBER *
* TONUM : STRING TO NUMBER *
*- -*
* CONVERTS A STRING TO A 16BIT *
* NUMBER EQUIVALENT; RETURNS *
@ -166,22 +137,19 @@ _2STR MAC
*- -*
* PARAMETERS: *
* *
* PARAM1 = ADDR TO STORE VALUE *
* ]1 = ADDR TO STORE VALUE *
*- -*
* SAMPLE USAGE: *
* _2NUM $300;#11111 *
* TONUM ????????????? *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_2NUM MAC
LDA #>]1 ; STRING ADDR
PHA
LDA #<]1
PHA
TONUM MAC
_ISSTR ]1
JSR STR2NUM
<<<
*
*``````````````````````````````*
* _SPOS : FIND SUBSTRING POS *
* SPOS : FIND SUBSTRING POS *
*- -*
* POSITION OF SUBSTRING WITHIN *
* ANOTHER STRING IS RETURNED *
@ -189,27 +157,21 @@ _2NUM MAC
*- -*
* PARAMETERS: *
* *
* PARAM1 = PARENT STRING ADDR *
* PARAM2 = SUBSTRING ADDR *
* ]1 = PARENT STRING ADDR *
* ]2 = SUBSTRING ADDR *
*- -*
* SAMPLE USAGE: *
* _SPOS $300;$320 *
* SPOS $300;$320 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SPOS MAC
LDA #>]1 ; PARENT
PHA
LDA #<]1
PHA
LDA #>]2 ; SUBSTRING
PHA
LDA #<]2
PHA
SPOS MAC
_ISSTR ]1
_ISSTR ]2
JSR SUBPOS
<<<
*
*``````````````````````````````*
* _SCPY :: SUBSTRING COPY *
* SCPY :: SUBSTRING COPY *
*- -*
* COPY A SUBSTRING FROM A *
* SOURCE STRING TO ANOTHER *
@ -217,35 +179,28 @@ _SPOS MAC
*- -*
* PARAMETERS: *
* *
* PARAM1 = SOURCE STRING *
* PARAM2 = STARTING INDEX *
* PARAM3 = SUBSTRING LENGTH *
* PARAM4 = SUBSTRING ADDRESS *
* PARAM5 = MAX LENGTH *
* ]1 = SOURCE STRING *
* ]2 = STARTING INDEX *
* ]3 = SUBSTRING LENGTH *
* ]4 = MAX LENGTH *
*- -*
* SAMPLE USAGE: *
* $300;#1;#10;$320;#20 *
* SCPY $300;#1;#10;#20 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SCPY MAC
LDA #>]1 ; SOURCE STRING
PHA
LDA #<]1
PHA
SCPY MAC
_ISSTR ]1
LDA ]2 ; STARTING INDEX
PHA
LDA ]3 ; SUBSTRING LENGTH
PHA
LDA #>]4 ; SUBSTRING ADDR
LDA ]4 ; MAX LENGTH OF SUBSTR
PHA
LDA #<]4
PHA
LDA ]5 ; MAX LENGTH OF SUBSTR
JSR SUBCOPY
<<<
*
*``````````````````````````````*
* _SDEL :: DELETE SUBSTRING *
* SDEL :: DELETE SUBSTRING *
*- -*
* DELETE A SUBSTRING FROM A *
* PARENT STRING. ADJUSTS THE *
@ -253,15 +208,15 @@ _SCPY MAC
*- -*
* PARAMETERS: *
* *
* PARAM1 = PARENT STRING ADDR *
* PARAM2 = STARTING INDEX *
* PARAM3 = DELETION LENGTH *
* ]1 = PARENT STRING ADDR *
* ]2 = STARTING INDEX *
* ]3 = DELETION LENGTH *
*- -*
* SAMPLE USAGE: *
* _SDEL $300;#3;#10 *
* SDEL $300;#3;#10 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SDEL MAC
SDEL MAC
LDA #>]1 ; STRING ADDRESS
PHA
LDA #<]1
@ -274,23 +229,23 @@ _SDEL MAC
<<<
*
*``````````````````````````````*
* _SINS :: INSERT SUBSTRING *
* SINS :: INSERT SUBSTRING *
*- -*
* INSERT A SUBSTRING INTO A *
* PARENT STRING. *
*- -*
* PARAMETERS: *
* *
* PARAM1 = PARENT STRING *
* PARAM2 = INDEX *
* PARAM3 = MAX LENGTH OF NEW *
* PARAM4 = SUBSTRING *
* ]1 = PARENT STRING *
* ]2 = INDEX *
* ]3 = MAX LENGTH OF NEW *
* ]4 = SUBSTRING *
*- -*
* SAMPLE USAGE: *
* _SINS $300;#1;#254;$6000 *
* SINS $300;#1;#254;$6000 *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
_SINS MAC
SINS MAC
LDA #>]1 ; PARENT STRING
PHA
LDA #<]1
@ -299,9 +254,6 @@ _SINS MAC
PHA
LDA ]3 ; MAXIMUM LENGTH
PHA
LDA #>]4 SUBSTR TO INSERT
PHA
LDA #<]4
PHA
_ISSTR ]4
JSR SUBINS
<<<

View File

@ -0,0 +1,379 @@
JMP STRINGSX
*
STRCMP
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
CMP (ADDR2),Y
BCC :BEGCMP
LDA (ADDR2),Y
:BEGCMP
TAX
BEQ :TSTLEN
LDY #1
:CMPLP
LDA (ADDR1),Y
CMP (ADDR2),Y
BNE :EXIT
INY
DEX
BNE :CMPLP
:TSTLEN
LDY #0
LDA (ADDR1),Y
CMP (ADDR2),Y
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y
TAX
LDA (ADDR2),Y
TAY
RTS
*
STRCAT
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLEN
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
STA :S1LEN
STA :S1IND
INC :S1IND
LDA (ADDR2),Y
STA :S2LEN
LDA #1
STA :S2IND
LDA :S2LEN
CLC
ADC :S1LEN
STA :S3LEN
BCS :TOOLONG
CMP :MLEN
BEQ :LENOK
BCC :LENOK
:TOOLONG
LDA #$0FF
STA :SOVF
LDA :MLEN
SEC
SBC :S1LEN
BCC :EXIT
STA :SCNT
LDA :MLEN
STA :S1LEN
JMP :DOCAT
:LENOK
STA :S1LEN
LDA #0
STA :SOVF
LDA :S2LEN
STA :SCNT
:DOCAT
LDA :SCNT
BEQ :EXIT
:CATLP
LDY :S2IND
LDA (ADDR2),Y
LDY :S1IND
STA (ADDR1),Y
INC :S1IND
INC :S2IND
DEC :SCNT
BNE :CATLP
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
LDA :SOVF
ROR A
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y
STA RETLEN
LDA #1
:RLP
LDA (ADDR1),Y
STA RETURN,Y
CPY RETLEN
INY
BNE :RLP
LDA RETLEN
LDY #0
STA (ADDR1),Y
LDX :S3LEN
RTS
:S3LEN DS 1
:S1LEN DS 1
:S1IND DS 1
:S2LEN DS 1
:S2IND DS 1
:MLEN DS 1
:SCNT DS 1
:SOVF DS 1
*
PRNSTR
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
STA :S1LEN
:LP
INY
LDA (ADDR1),Y
JSR SCOUT1
CPY :S1LEN
BNE :LP
LDY #0
LDA (ADDR1),Y
LDA RETADR+1
PHA
LDA RETADR
PHA
LDY #0
LDA (ADDR1),Y
LDY ADDR1
LDX ADDR1+1
RTS
:S1LEN DS 1
*
NUM2STR
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :VALSTR
PLA
STA :VALSTR+1
STA :NGFLAG
BPL :GETBP
LDA #0
SEC
SBC :VALSTR
STA :VALSTR
LDA #0
SBC :VALSTR+1
STA :VALSTR+1
:GETBP
LDA #<RETURN
STA ADDR1
LDA #>RETURN+1
STA ADDR1+1
LDA #0
LDY #0
STA (ADDR1),Y
:CNVERT
LDA #0
STA :MOD10
STA :MOD10+1
LDX #16
CLC
:DVLOOP
ROL :VALSTR
ROL :VALSTR+1
ROL :MOD10
ROL :MOD10+1
SEC
LDA :MOD10
SBC #10
TAY
LDA :MOD10+1
SBC #0
BCC :DECCNT
STY :MOD10
STA :MOD10+1
:DECCNT
DEX
BNE :DVLOOP
ROL :VALSTR
ROL :VALSTR+1
:CONCH
LDA :MOD10
CLC
ADC #$B0
JSR :CONCAT
LDA :VALSTR
ORA :VALSTR+1
BNE :CNVERT
:EXIT
LDA :NGFLAG
BPL :POS
LDA #173
JSR :CONCAT
:POS
LDA RETADR+1
PHA
LDA RETADR
PHA
RTS
:CONCAT
PHA
LDY #0
LDA (ADDR1),Y
TAY
BEQ :EXITMR
:MVELP
LDA (ADDR1),Y
INY
STA (ADDR1),Y
DEY
DEY
BNE :MVELP
:EXITMR
PLA
LDY #1
STA (ADDR1),Y
LDY #0
LDA (ADDR1),Y
CLC
ADC #1
STA (ADDR1),Y
RTS
:NGFLAG DS 1
:VALSTR DS 2
:MOD10 DS 2
*
STR2NUM
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDY #0
LDA (ADDR1),Y
TAX
LDA #1
STA :NINDEX
LDA #0
STA :NACCUM
STA :NACCUM+1
STA :SNGFLAG
TXA
BNE :INIT1
JMP :EREXIT
:INIT1
LDY :NINDEX
LDA (ADDR1),Y
CMP #173
BNE :PLUS
LDA #$0FF
STA :SNGFLAG
INC :NINDEX
DEX
BEQ :EREXIT
JMP :CNVERT
:PLUS
CMP #'+'
BNE :CHKDIG
INC :NINDEX
DEX
BEQ :EREXIT
:CNVERT
LDY :NINDEX
LDA (ADDR1),Y
:CHKDIG
CMP #$B0 ; "0"
BMI :EREXIT
CMP #$BA
BPL :EREXIT
PHA
ASL :NACCUM
ROL :NACCUM+1
LDA :NACCUM
LDY :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1
ASL :NACCUM
ROL :NACCUM+1
CLC
ADC :NACCUM
STA :NACCUM
TYA
ADC :NACCUM+1
STA :NACCUM+1
PLA
SEC
SBC #$B0
CLC
ADC :NACCUM
STA :NACCUM
BCC :D2B1
INC :NACCUM+1
:D2B1
INC :NINDEX
DEX
BNE :CNVERT
LDA :SNGFLAG
BPL :OKEXIT
LDA #0
SEC
SBC :NACCUM
STA :NACCUM
LDA #0
SBC :NACCUM+1
STA :NACCUM+1
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA RETADR+1
PHA
LDA RETADR
PHA
LDX :NACCUM+1
LDY :NACCUM
STY RETURN
STX RETURN+1
LDA #2
STA RETLEN
LDA :NINDEX
RTS
:NACCUM DS 2
:SNGFLAG DS 1
:NINDEX DS 1
STRINGSX

View File

@ -3,8 +3,7 @@
* SUBCOPY :: COPY SUBSTRING *
*- -*
* COPY A SUBSTRING FROM A *
* STRING TO A DESTINATION *
* ADDRESS. *
* STRING TO [RETURN]. *
*- -*
* CLOBBERS: *
* *
@ -23,10 +22,6 @@
* PHA *
* LDA LEN ; LENGTH OF SUBSTR *
* PHA *
* LDA #>SUB ; SUBSTRING ADDR *
* PHA *
* LDA #<SUB *
* PHA *
* LDA MLEN ; MAX LENGTH *
* PHA *
* JSR SUBCOPY *
@ -38,8 +33,6 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* MAX LENGTH OF DEST STRING *
* LO BYTE OF DEST STR ADDRESS *
* HI BYTE OF DEST STRING ADDR *
* NUMBER OF BYTES TO COPY *
* STARTING INDEX TO COPY FROM *
* LO BYTE OF SRC STRING ADDR *
@ -52,9 +45,9 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* .Y = TRASH *
* .X = TRASH *
* .A = TRASH *
* *
* CARRY FLAG WILL BE 0 IF NO *
* ERRORS; ELSE, CARRY = 1 *
@ -62,11 +55,6 @@
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBCOPY
@ -83,17 +71,19 @@ SUBCOPY
PLA
STA :MLEN
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :SCNT
STA RETLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
LDA #<RETURN
STA ADDR2
LDA #>RETURN
STA ADDR2+1
*
** RESTORE RETURN ADDRESS
*
@ -208,6 +198,7 @@ SUBCOPY
LDA :S2LEN
LDY #0
STA (ADDR2),Y
STA RETLEN
RTS
*
** DATA

View File

@ -0,0 +1,100 @@
*
SUBCOPY
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLEN
PLA
STA :SCNT
STA RETLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA #<RETURN
STA ADDR2
LDA #>RETURN
STA ADDR2+1
LDA RETADR+1
PHA
LDA RETADR
PHA
LDA #0
STA :S2LEN
STA :SCERR
LDA :SCNT
BEQ :OKEXIT
LDA :MLEN
BEQ :EREXIT
LDA :SINDEX
BEQ :EREXIT
LDY #0
LDA (ADDR1),Y
STA :S1LEN
CMP :SINDEX
BCC :EREXIT
LDA :SINDEX
CLC
ADC :SCNT
BCS :RECALC
TAX
DEX
CPX :S1LEN
BCC :CNT10K
BEQ :CNT10K
:RECALC
LDA :S1LEN
SEC
SBC :SINDEX
STA :SCNT
INC :SCNT
LDA #$0FF
STA :SCERR
:CNT10K
LDA :SCNT
CMP :MLEN
BCC :CNT20K
BEQ :CNT20K
LDA :MLEN
STA :SCNT
LDA #$0FF
STA :SCERR
:CNT20K
LDX :SCNT
BEQ :EREXIT
LDA #1
STA :S2LEN
:MVLP
LDY :SINDEX
LDA (ADDR1),Y
LDY :S2LEN
STA (ADDR2),Y
INC :SINDEX
INC :S2LEN
DEX
BNE :MVLP
DEC :S2LEN
LDA :SCERR
BNE :EREXIT
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA :S2LEN
LDY #0
STA (ADDR2),Y
STA RETLEN
RTS
:S1LEN DS 1
:S2LEN DS 1
:MLEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SCERR DS 1

View File

@ -42,9 +42,9 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* .Y = TRASH *
* .X = TRASH *
* .A = TRASH *
* *
* IF NO ERRORS, CARRY = 0; *
* ELSE, CARRY = 1 *
@ -52,11 +52,6 @@
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBDEL

View File

@ -0,0 +1,83 @@
*
SUBDEL
*
PLA
TAY
PLA
TAX
PLA
STA :SCNT
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
TXA
PHA
TYA
PHA
LDY #0
STY :SCERR
LDA (ADDR1),Y
STA :S1LEN
LDA :SCNT
BEQ :OKEXIT
LDA :SINDEX
BEQ :ERREXIT
LDA :S1LEN
CMP :SINDEX
BCC :ERREXIT
LDA :SINDEX
CLC
ADC :SCNT
BCS :TRUNC
STA :SIDX
TAX
DEX
CPX :S1LEN
BCC :CNTOK
BEQ :TRUNC
LDA #$0FF
STA :SCERR
:TRUNC
LDX :SINDEX
DEX
STX :S1LEN
LDA :SCERR
BEQ :OKEXIT
BNE :ERREXIT
:CNTOK
LDA :S1LEN
SEC
SBC :SIDX
TAX
INX
BEQ :OKEXIT
:MVLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SINDEX
STA (ADDR1),Y
INC :SINDEX
INC :SIDX
DEX
BNE :MVLP
LDX :SINDEX
DEX
STX :S1LEN
:OKEXIT
CLC
BCC :EXIT
:ERREXIT
SEC
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
:S1LEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SIDX DS 1
:SCERR DS 1

View File

@ -48,9 +48,9 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* .Y = TRASH *
* .X = TRASH *
* .A = TRASH *
* *
* CARRY = 0 IF NO ERRORS; ELSE *
* CARRY = 1 *
@ -58,11 +58,6 @@
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBINS

View File

@ -0,0 +1,121 @@
*
SUBINS
*
PLA
TAY
PLA
TAX
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :MLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
TXA
PHA
TYA
PHA
LDA #0
STA :SCERR
LDY #0
LDA (ADDR1),Y
STA :S1LEN
LDA (ADDR2),Y
STA :S2LEN
BNE :IDX0
JMP :OKEXIT
:IDX0
LDA :SINDEX
BNE :CHKLEN
JMP :EREXIT
:CHKLEN
LDA :S2LEN
CLC
ADC :S1LEN
BCS :TRUNC
CMP :MLEN
BCC :IDXLEN
BEQ :IDXLEN
:TRUNC
LDA :MLEN
SEC
SBC :S1LEN
BCC :EREXIT
BEQ :EREXIT
STA :S2LEN
LDA #$0FF
STA :SCERR
:IDXLEN
LDA :S1LEN
CMP :SINDEX
BCS :LENOK
LDX :S1LEN
INX
STX :SINDEX
LDA #$0FF
STA :SCERR
LDA :S1LEN
CLC
ADC :S2LEN
STA :S1LEN
JMP :MVESUB
:LENOK
LDA :S1LEN
SEC
SBC :SINDEX
TAX
INX
LDA :S1LEN
STA :SIDX
CLC
ADC :S2LEN
STA :SBIDX
STA :S1LEN
:OPNLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SBIDX
STA (ADDR1),Y
DEC :SIDX
DEC :SBIDX
DEX
BNE :OPNLP
:MVESUB
LDA #1
STA :SIDX
LDX :S2LEN
:MVELP
LDY :SIDX
LDA (ADDR2),Y
LDY :SINDEX
STA (ADDR1),Y
INC :SIDX
INC :SINDEX
DEX
BNE :MVELP
LDA :SCERR
BNE :EREXIT
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
:S1LEN DS 1
:S2LEN DS 1
:SUBLEN DS 1
:MLEN DS 1
:SINDEX DS 1
:SIDX DS 1
:SBIDX DS 1
:SCERR DS 1

View File

@ -41,26 +41,20 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = CLOBBERED; TRASH *
* A = INDEX OF SUBSTRING IF *
* .Y = CLOBBERED; TRASH *
* .X = CLOBBERED; TRASH *
* .A = INDEX OF SUBSTRING IF *
* FOUND; OTHERWISE, 0 *
* *
* [RETURN] = INDEX OF SUBSTR; *
* 0 IF NOT FOUND *
* [RETLEN] = 1 (INDEX LENGTH) *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
* *
* THAT SAID, LEVENTHAL WROTE *
* THAT THE PURPOSE OF THE BOOK *
* WAS TO COPY THE SOURCE CODE, *
* AS REINVENTING THE WHEEL IS *
* TEDIOUS, AND HE PLACED NO *
* RESTRICTIONS ON ITS USE. *
* LANGUAGE ROUTINES/. MAY NOT *
* FALL UNDER APACHE 2.0 UNTIL *
* HEAVILY MODIFIED. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBPOS
@ -160,8 +154,10 @@ SUBPOS
*
:NOTFND
LDA #0 ; SUB NOT FOUND, A=0
STA RESULT
:EXIT
STA RETURN
LDY #1
STY RETLEN
RTS
*
** DATA

View File

@ -0,0 +1,78 @@
*
SUBPOS
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA RETADR+1
PHA
LDA RETADR
PHA
:POS
LDY #0
LDA (ADDR1),Y
BEQ :NOTFND
STA :SLEN
LDA (ADDR2),Y
BEQ :NOTFND
STA :SUBLEN
LDA :SUBLEN
CMP :SLEN
BEQ :LENOK
BCS :NOTFND
:LENOK
LDA #1
STA :SINDEX
LDA :SLEN
SEC
SBC :SUBLEN
STA :SCOUNT
INC :SCOUNT
:SLP1
LDA :SINDEX
STA :SIDX
LDA #1
STA :SUBIDX
:CMPLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SUBIDX
CMP (ADDR2),Y
BNE :SLP2
LDY :SUBIDX
CPY :SUBLEN
BEQ :FOUND
INY
STY :SUBIDX
INC :SIDX
JMP :CMPLP
:SLP2
INC :SINDEX
DEC :SCOUNT
BNE :SLP1
BEQ :NOTFND
:FOUND
LDA :SINDEX
JMP :EXIT
:NOTFND
LDA #0
:EXIT
STA RETURN
LDY #1
STY RETLEN
RTS
:SLEN DS 1
:SUBLEN DS 1
:SINDEX DS 1
:SUBIDX DS 1
:SCOUNT DS 1
:SIDX DS 1

View File

@ -9,23 +9,14 @@
* CONTACT: NATHAN.RIGGS@ *
* OUTLOOK.COM *
* *
* VERSION: 0.1.2 *
* DATE: 30-OCT-2018 *
* VERSION: 0.2.0 *
* DATE: 30-OCT-2018 *
* ASSEMBLER: MERLIN 8 PRO *
* *
* LICENSE: APACHE 2.0, WHERE *
* APPLICABLE. CODE INSPIRED *
* BY THE WORKS OF OTHERS MAY *
* FALL UNDER A DIFFERENT *
* LICENSE (NOTED IN ROUTINE). *
* OS: DOS 3.3 *
* LICENSE: APACHE 2.0 *
* *
* THIS IS A LIBRARY FOR USING *
* SUBSTRING OPERATIONS. THIS *
* IS SEPARATE FROM THE MAIN *
* STRINGS LIBRARY BY VIRTUE OF *
* DEALING WITH FULL MEMORY *
* ERRORS IN THE ASSEMBLER. *
* YEEEEE. *
* SUBSTRING OPERATIONS. *
* *
*------------------------------*
* *
@ -80,26 +71,20 @@
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = CLOBBERED; TRASH *
* X = CLOBBERED; TRASH *
* A = INDEX OF SUBSTRING IF *
* .Y = CLOBBERED; TRASH *
* .X = CLOBBERED; TRASH *
* .A = INDEX OF SUBSTRING IF *
* FOUND; OTHERWISE, 0 *
* *
* [RETURN] = INDEX OF SUBSTR; *
* 0 IF NOT FOUND *
* [RETLEN] = 1 (INDEX LENGTH) *
*- -*
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
* *
* THAT SAID, LEVENTHAL WROTE *
* THAT THE PURPOSE OF THE BOOK *
* WAS TO COPY THE SOURCE CODE, *
* AS REINVENTING THE WHEEL IS *
* TEDIOUS, AND HE PLACED NO *
* RESTRICTIONS ON ITS USE. *
* LANGUAGE ROUTINES/. MAY NOT *
* FALL UNDER APACHE 2.0 UNTIL *
* HEAVILY MODIFIED. *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBPOS
@ -199,8 +184,10 @@ SUBPOS
*
:NOTFND
LDA #0 ; SUB NOT FOUND, A=0
STA RESULT
:EXIT
STA RETURN
LDY #1
STY RETLEN
RTS
*
** DATA
@ -216,8 +203,7 @@ SUBPOS
* SUBCOPY :: COPY SUBSTRING *
*- -*
* COPY A SUBSTRING FROM A *
* STRING TO A DESTINATION *
* ADDRESS. *
* STRING TO [RETURN]. *
*- -*
* CLOBBERS: *
* *
@ -236,10 +222,6 @@ SUBPOS
* PHA *
* LDA LEN ; LENGTH OF SUBSTR *
* PHA *
* LDA #>SUB ; SUBSTRING ADDR *
* PHA *
* LDA #<SUB *
* PHA *
* LDA MLEN ; MAX LENGTH *
* PHA *
* JSR SUBCOPY *
@ -251,8 +233,6 @@ SUBPOS
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* MAX LENGTH OF DEST STRING *
* LO BYTE OF DEST STR ADDRESS *
* HI BYTE OF DEST STRING ADDR *
* NUMBER OF BYTES TO COPY *
* STARTING INDEX TO COPY FROM *
* LO BYTE OF SRC STRING ADDR *
@ -265,9 +245,9 @@ SUBPOS
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* .Y = TRASH *
* .X = TRASH *
* .A = TRASH *
* *
* CARRY FLAG WILL BE 0 IF NO *
* ERRORS; ELSE, CARRY = 1 *
@ -275,11 +255,6 @@ SUBPOS
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBCOPY
@ -296,17 +271,19 @@ SUBCOPY
PLA
STA :MLEN
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :SCNT
STA RETLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
*
LDA #<RETURN
STA ADDR2
LDA #>RETURN
STA ADDR2+1
*
** RESTORE RETURN ADDRESS
*
@ -421,6 +398,7 @@ SUBCOPY
LDA :S2LEN
LDY #0
STA (ADDR2),Y
STA RETLEN
RTS
*
** DATA
@ -475,9 +453,9 @@ SUBCOPY
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* .Y = TRASH *
* .X = TRASH *
* .A = TRASH *
* *
* IF NO ERRORS, CARRY = 0; *
* ELSE, CARRY = 1 *
@ -485,11 +463,6 @@ SUBCOPY
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBDEL
@ -677,9 +650,9 @@ SUBDEL
* LOW BYTE OF RETURN ADDRESS *
* HI BYTE OF RETURN ADDRESS *
* *
* Y = TRASH *
* X = TRASH *
* A = TRASH *
* .Y = TRASH *
* .X = TRASH *
* .A = TRASH *
* *
* CARRY = 0 IF NO ERRORS; ELSE *
* CARRY = 1 *
@ -687,11 +660,6 @@ SUBDEL
* ADAPTED FROM LEVANTHAL AND *
* WINTHROP'S /6502 ASSEMBLY *
* LANGUAGE ROUTINES/. *
* AS SUCH, THIS MAY NOT FALL *
* UNDER THE APACHE 2.0 LICENSE *
* AGREEMENT, SINCE THE BOOK *
* WAS WRITTEN BEFORE THE *
* LICENSE! *
*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*
*
SUBINS

View File

@ -0,0 +1,384 @@
JMP SUBSTRINGSX
*
SUBPOS
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA RETADR+1
PHA
LDA RETADR
PHA
:POS
LDY #0
LDA (ADDR1),Y
BEQ :NOTFND
STA :SLEN
LDA (ADDR2),Y
BEQ :NOTFND
STA :SUBLEN
LDA :SUBLEN
CMP :SLEN
BEQ :LENOK
BCS :NOTFND
:LENOK
LDA #1
STA :SINDEX
LDA :SLEN
SEC
SBC :SUBLEN
STA :SCOUNT
INC :SCOUNT
:SLP1
LDA :SINDEX
STA :SIDX
LDA #1
STA :SUBIDX
:CMPLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SUBIDX
CMP (ADDR2),Y
BNE :SLP2
LDY :SUBIDX
CPY :SUBLEN
BEQ :FOUND
INY
STY :SUBIDX
INC :SIDX
JMP :CMPLP
:SLP2
INC :SINDEX
DEC :SCOUNT
BNE :SLP1
BEQ :NOTFND
:FOUND
LDA :SINDEX
JMP :EXIT
:NOTFND
LDA #0
:EXIT
STA RETURN
LDY #1
STY RETLEN
RTS
:SLEN DS 1
:SUBLEN DS 1
:SINDEX DS 1
:SUBIDX DS 1
:SCOUNT DS 1
:SIDX DS 1
*
SUBCOPY
*
PLA
STA RETADR
PLA
STA RETADR+1
PLA
STA :MLEN
PLA
STA :SCNT
STA RETLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
LDA #<RETURN
STA ADDR2
LDA #>RETURN
STA ADDR2+1
LDA RETADR+1
PHA
LDA RETADR
PHA
LDA #0
STA :S2LEN
STA :SCERR
LDA :SCNT
BEQ :OKEXIT
LDA :MLEN
BEQ :EREXIT
LDA :SINDEX
BEQ :EREXIT
LDY #0
LDA (ADDR1),Y
STA :S1LEN
CMP :SINDEX
BCC :EREXIT
LDA :SINDEX
CLC
ADC :SCNT
BCS :RECALC
TAX
DEX
CPX :S1LEN
BCC :CNT10K
BEQ :CNT10K
:RECALC
LDA :S1LEN
SEC
SBC :SINDEX
STA :SCNT
INC :SCNT
LDA #$0FF
STA :SCERR
:CNT10K
LDA :SCNT
CMP :MLEN
BCC :CNT20K
BEQ :CNT20K
LDA :MLEN
STA :SCNT
LDA #$0FF
STA :SCERR
:CNT20K
LDX :SCNT
BEQ :EREXIT
LDA #1
STA :S2LEN
:MVLP
LDY :SINDEX
LDA (ADDR1),Y
LDY :S2LEN
STA (ADDR2),Y
INC :SINDEX
INC :S2LEN
DEX
BNE :MVLP
DEC :S2LEN
LDA :SCERR
BNE :EREXIT
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA :S2LEN
LDY #0
STA (ADDR2),Y
STA RETLEN
RTS
:S1LEN DS 1
:S2LEN DS 1
:MLEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SCERR DS 1
*
SUBDEL
*
PLA
TAY
PLA
TAX
PLA
STA :SCNT
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
TXA
PHA
TYA
PHA
LDY #0
STY :SCERR
LDA (ADDR1),Y
STA :S1LEN
LDA :SCNT
BEQ :OKEXIT
LDA :SINDEX
BEQ :ERREXIT
LDA :S1LEN
CMP :SINDEX
BCC :ERREXIT
LDA :SINDEX
CLC
ADC :SCNT
BCS :TRUNC
STA :SIDX
TAX
DEX
CPX :S1LEN
BCC :CNTOK
BEQ :TRUNC
LDA #$0FF
STA :SCERR
:TRUNC
LDX :SINDEX
DEX
STX :S1LEN
LDA :SCERR
BEQ :OKEXIT
BNE :ERREXIT
:CNTOK
LDA :S1LEN
SEC
SBC :SIDX
TAX
INX
BEQ :OKEXIT
:MVLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SINDEX
STA (ADDR1),Y
INC :SINDEX
INC :SIDX
DEX
BNE :MVLP
LDX :SINDEX
DEX
STX :S1LEN
:OKEXIT
CLC
BCC :EXIT
:ERREXIT
SEC
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
:S1LEN DS 1
:SCNT DS 1
:SINDEX DS 1
:SIDX DS 1
:SCERR DS 1
*
SUBINS
*
PLA
TAY
PLA
TAX
PLA
STA ADDR2
PLA
STA ADDR2+1
PLA
STA :MLEN
PLA
STA :SINDEX
PLA
STA ADDR1
PLA
STA ADDR1+1
TXA
PHA
TYA
PHA
LDA #0
STA :SCERR
LDY #0
LDA (ADDR1),Y
STA :S1LEN
LDA (ADDR2),Y
STA :S2LEN
BNE :IDX0
JMP :OKEXIT
:IDX0
LDA :SINDEX
BNE :CHKLEN
JMP :EREXIT
:CHKLEN
LDA :S2LEN
CLC
ADC :S1LEN
BCS :TRUNC
CMP :MLEN
BCC :IDXLEN
BEQ :IDXLEN
:TRUNC
LDA :MLEN
SEC
SBC :S1LEN
BCC :EREXIT
BEQ :EREXIT
STA :S2LEN
LDA #$0FF
STA :SCERR
:IDXLEN
LDA :S1LEN
CMP :SINDEX
BCS :LENOK
LDX :S1LEN
INX
STX :SINDEX
LDA #$0FF
STA :SCERR
LDA :S1LEN
CLC
ADC :S2LEN
STA :S1LEN
JMP :MVESUB
:LENOK
LDA :S1LEN
SEC
SBC :SINDEX
TAX
INX
LDA :S1LEN
STA :SIDX
CLC
ADC :S2LEN
STA :SBIDX
STA :S1LEN
:OPNLP
LDY :SIDX
LDA (ADDR1),Y
LDY :SBIDX
STA (ADDR1),Y
DEC :SIDX
DEC :SBIDX
DEX
BNE :OPNLP
:MVESUB
LDA #1
STA :SIDX
LDX :S2LEN
:MVELP
LDY :SIDX
LDA (ADDR2),Y
LDY :SINDEX
STA (ADDR1),Y
INC :SIDX
INC :SINDEX
DEX
BNE :MVELP
LDA :SCERR
BNE :EREXIT
:OKEXIT
CLC
BCC :EXIT
:EREXIT
SEC
:EXIT
LDA :S1LEN
LDY #0
STA (ADDR1),Y
RTS
:S1LEN DS 1
:S2LEN DS 1
:SUBLEN DS 1
:MLEN DS 1
:SINDEX DS 1
:SIDX DS 1
:SBIDX DS 1
:SCERR DS 1
SUBSTRINGSX