void strcpy (destination, destination_segment, source, source_segment );
|
|
|
|
void strcpy (destination, destination_segment, source, source_segment )
|
|
char *destination;
|
|
int destination_segment;
|
|
char *source;
|
|
int source_segment;
|
|
{
|
|
#asm
|
|
; copy two strings
|
|
; IN si: the first (zero terminated) string
|
|
; IN di: the second (zero terminated) string
|
|
; OUT SF and ZF (same semantics as cmp)
|
|
|
|
#define DESTINATION 4[bp];
|
|
#define DESTINATION_SEGMENT 6[bp];
|
|
#define SOURCE 8[bp];
|
|
#define SOURCE_SEGMENT 10[bp];
|
|
|
|
push bp
|
|
mov bp,sp
|
|
stringcompare:
|
|
push ax
|
|
push bx
|
|
push di
|
|
push es
|
|
push si
|
|
push ds
|
|
mov ax, DESTINATION;
|
|
mov di, ax
|
|
mov ax, DESTINATION_SEGMENT;
|
|
mov es, ax
|
|
mov ax, SOURCE;
|
|
mov si, ax
|
|
mov ax, SOURCE_SEGMENT;
|
|
mov ds, ax
|
|
mov cx, 0x050 // TODO(Jørn) Hardcded number of bytes to copy
|
|
.loop:
|
|
movsb
|
|
cmp cx, 0x0
|
|
je .end
|
|
dec cx
|
|
jmp .loop
|
|
.end:
|
|
pop ds
|
|
pop si
|
|
pop es
|
|
pop di
|
|
pop bx
|
|
pop ax
|
|
pop bp
|
|
|
|
#endasm
|
|
}
|