.title insert .ident /831203/ ; ;Inserts one string into another ; ;Register usage ; R0 length of first part of source and insert ; R1 length of last part of source ; R2 string to insert ; R3 source string ; R4 start position ; R5 maximum string length ; insert:: mov sp,r0 mov (r0),r1 mov r5,(r0)+ mov (r0),r5 ;maximum string length mov r4,(r0)+ mov (r0),r4 ;start position dec r4 ;convert to length of first part bge 1$ clr r4 ;minimum value of zero 1$: mov r3,(r0)+ mov (r0),r3 ;string to be modified mov r2,(r0)+ mov (r0),r2 ;string to be inserted mov r1,(r0) ; mov #-1,r1 ;find length of source 2$: inc r1 tstb (r3)+ bne 2$ cmp r1,r5 bgt 10$ ;string longer than allowable length sub r4,r1 ;length of last part bge 3$ add r1,r4 ;use maximal value if start point too big clr r1 3$: sub r1,r3 ;back up to insertion point plus one ; mov r2,-(sp) mov #-1,r0 ;length of insert 4$: inc r0 tstb (r2)+ bne 4$ mov (sp)+,r2 add r4,r0 ;length of first part and insert ; cmp r0,r5 ;adjust insert length ble 5$ mov r5,r0 ;truncate insert ; 5$: add r0,r2 ;find index of insert sub r4,r2 sub r0,r5 ;adjust length of last part cmp r1,r5 ble 6$ mov r5,r1 ;use largest allowable ; 6$: add r1,r3 ;index to insertion point plus one mov r3,r5 ;indexof new position for last part add r0,r5 sub r4,r5 dec r3 ;index of end of last part clrb -(r5) ;mark end of string tst r1 ;move last part beq 8$ 7$: movb -(r3),-(r5) sob r1,7$ ; 8$: sub r4,r0 ;length of insert beq 10$ 9$: movb -(r2),-(r5) ;move insert sob r0,9$ ; 10$: mov (sp)+,r5 mov (sp)+,r4 mov (sp)+,r3 mov (sp)+,r2 rts pc .end