mirror of https://git.ia64.cc/perso/cos2000v1.git
Nicolas Hordé
17 years ago
1 changed files with 993 additions and 0 deletions
@ -0,0 +1,993 @@
|
||||
model tiny,stdcall |
||||
p586N |
||||
locals |
||||
jumps |
||||
codeseg |
||||
option procalign:byte |
||||
|
||||
include "..\include\mem.h" |
||||
include "..\include\divers.h" |
||||
|
||||
org 0h |
||||
|
||||
header exe <"CE",1,0,0,offset exports,,,> |
||||
|
||||
|
||||
exporting |
||||
declare checksyntax |
||||
declare cmpitems |
||||
declare gettypeditem |
||||
declare gettyped |
||||
declare whatisitem |
||||
declare whatis |
||||
declare strtoadress |
||||
declare strisadress |
||||
declare strisname |
||||
declare strisbase |
||||
declare strtoint |
||||
declare left |
||||
declare right |
||||
declare middle |
||||
declare fill |
||||
declare replaceallchar |
||||
declare searchchar |
||||
declare invert |
||||
declare cmpstr |
||||
declare evalue |
||||
declare insert |
||||
declare delete |
||||
declare copy |
||||
declare concat |
||||
declare compressdelimiter |
||||
declare setnbitems |
||||
declare getitemsize |
||||
declare getitem |
||||
declare getpointeritem |
||||
declare getnbitems |
||||
declare getlength |
||||
declare setlength |
||||
declare uppercase |
||||
declare onecase |
||||
declare lowercase |
||||
declare invertcase |
||||
ende |
||||
|
||||
;Librairie qui prend en charge le format de STR ASCIIZ |
||||
;# nombre 8 |
||||
;? str 7 |
||||
;& nom 6 |
||||
|
||||
;High Low |
||||
;0 variable 4 hex |
||||
;1 byte 3 dec |
||||
;2 word 2 oct |
||||
;3 3 octets 1 bin |
||||
;4 dword 5 adresse |
||||
;5 5 octets 6 nom |
||||
;6 ... 7 str |
||||
; 8 nombre |
||||
|
||||
;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di |
||||
PROC checksyntax FAR |
||||
ARG @src:word,@dest:word,@delim:word |
||||
USES ax,bx,cx,dx,si,di,ds,es |
||||
LOCAL @@temp:word:256 |
||||
push ss |
||||
pop es |
||||
lea si,[@@temp] |
||||
mov di,[@dest] |
||||
call copy,[@src],si |
||||
call xch |
||||
call compressdelimiter,si,[@delim] |
||||
call getnbitems,si,[@delim] |
||||
mov bx,ax |
||||
call xch |
||||
call getnbitems,di,[@delim] |
||||
cmp bx,ax |
||||
jne @@notequalatall |
||||
xor cx,cx |
||||
@@itemer: |
||||
call xch |
||||
call whatisitem,si,cx,[@delim] |
||||
mov dx,ax |
||||
call xch |
||||
call whatisitem,di,cx,[@delim] |
||||
cmp ax,dx |
||||
jne @@prob |
||||
cmp al,6 |
||||
jb @@equal |
||||
call cmpitems |
||||
je @@equal |
||||
@@prob: |
||||
cmp dl,4 |
||||
ja @@nonumber |
||||
cmp dl,8 |
||||
je @@equal |
||||
;cmp al,4 |
||||
;jne @@notequalatall |
||||
cmp dh,ah |
||||
ja @@notequalatall |
||||
jmp @@equal |
||||
@@nonumber: |
||||
cmp al,7 |
||||
jne @@nostr |
||||
cmp ah,0 |
||||
jne @@notequalatall |
||||
jmp @@equal |
||||
@@nostr: |
||||
cmp al,6 |
||||
jne @@noname |
||||
cmp dl,6 |
||||
jne @@noname |
||||
cmp ah,0 |
||||
jne @@notequalatall |
||||
jmp @@equal |
||||
@@noname: |
||||
cmp al,8 |
||||
je @@equal |
||||
jmp @@notequalatall |
||||
@@equal: |
||||
inc cx |
||||
cmp cx,bx |
||||
jne @@itemer |
||||
cld |
||||
@@ackno: |
||||
ret |
||||
@@notequalatall: |
||||
stc |
||||
jmp @@ackno |
||||
endp checksyntax |
||||
|
||||
xch: |
||||
push es |
||||
push ds |
||||
pop es |
||||
pop ds |
||||
ret |
||||
|
||||
|
||||
;Compare les ‚l‚ments cx de deux chaine ds:si et es:di |
||||
PROC cmpitems FAR |
||||
ARG @src:word,@dest:word,@item:word,@delim:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
call getpointeritem,[@src],[@item],[@delim] |
||||
mov si,ax |
||||
call getitemsize,[@src],[@item],[@delim] |
||||
mov di,[@dest] |
||||
mov cx,ax |
||||
cld |
||||
rep cmpsb |
||||
clc |
||||
ret |
||||
endp cmpitems |
||||
|
||||
|
||||
;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name |
||||
PROC gettypeditem FAR |
||||
ARG @src:word,@item:word,@delim:word |
||||
USES bx,cx,si,di |
||||
mov si,[@src] |
||||
mov cx,[@item] |
||||
call getpointeritem,si,cx,[@delim] |
||||
mov di,ax |
||||
inc cx |
||||
call getpointeritem,si,cx,[@delim] |
||||
mov si,ax |
||||
dec si |
||||
mov cl,0 |
||||
xchg cl,[ds:si] |
||||
call gettyped,di |
||||
xchg cl,[ds:si] |
||||
clc |
||||
ret |
||||
endp gettypeditem |
||||
|
||||
|
||||
;Renvoie eax si nb et dans ds:eax si str ou name |
||||
PROC gettyped FAR |
||||
ARG @src:word |
||||
USES si |
||||
mov si,[@src] |
||||
xor eax,eax |
||||
call whatis,si |
||||
cmp al,1 |
||||
je @@bin |
||||
cmp al,2 |
||||
je @@oct |
||||
cmp al,3 |
||||
je @@dec |
||||
cmp al,4 |
||||
je @@hex |
||||
cmp al,5 |
||||
je @@pointer |
||||
mov ax,si |
||||
jmp @@endofgettypeditem |
||||
@@bin: |
||||
call strtoint,si,2 |
||||
jmp @@endofgettypeditem |
||||
@@oct: |
||||
call strtoint,si,8 |
||||
jmp @@endofgettypeditem |
||||
@@dec: |
||||
call strtoint,si,10 |
||||
jmp @@endofgettypeditem |
||||
@@hex: |
||||
call strtoint,si,16 |
||||
jmp @@endofgettypeditem |
||||
@@pointer: |
||||
call strtoadress,si |
||||
@@endofgettypeditem: |
||||
clc |
||||
ret |
||||
endp gettyped |
||||
|
||||
;Renvoie dans ax le type de la str0 point‚e par ds:%0 ‚l‚ment %1 delim %3 |
||||
PROC whatisitem FAR |
||||
ARG @src:word,@item:word,@delim:word |
||||
USES bx,cx,si,di |
||||
mov si,[@src] |
||||
mov cx,[@item] |
||||
call getpointeritem,si,cx,[@delim] |
||||
mov di,ax |
||||
inc cx |
||||
call getpointeritem,si,cx,[@delim] |
||||
mov si,ax |
||||
dec si |
||||
mov cl,0 |
||||
xchg cl,[ds:si] |
||||
call whatis,di |
||||
xchg cl,[ds:si] |
||||
clc |
||||
ret |
||||
endp whatisitem |
||||
|
||||
;Renvoie dans ax le type de la str0 point‚e par ds:%0 |
||||
;High Low |
||||
;0 variable 4 hex |
||||
;1 byte 3 dec |
||||
;2 word 2 oct |
||||
;3 3 octets 1 bin |
||||
;4 dword 5 adresse |
||||
;5 5 octets 6 name |
||||
;6 ... 7 str |
||||
PROC whatis FAR |
||||
ARG @src:word |
||||
USES bx,cx,edx,si |
||||
mov si,[@src] |
||||
xor cx,cx |
||||
mov cl,2 |
||||
call strisbase,si,cx |
||||
jnc @@finbase |
||||
mov cl,8 |
||||
call strisbase,si,cx |
||||
jnc @@finbase |
||||
mov cl,10 |
||||
call strisbase,si,cx |
||||
jnc @@finbase |
||||
mov cl,16 |
||||
call strisbase,si,cx |
||||
jc @@testadress |
||||
@@finbase: |
||||
mov bx,cx |
||||
xor ch,ch |
||||
mov al,[cs:bx+offset basenn-2] |
||||
push eax |
||||
call strtoint,si,cx |
||||
mov edx,eax |
||||
pop eax |
||||
cmp edx,0000FFFFh |
||||
ja @@bits32 |
||||
cmp dx,00FFh |
||||
ja @@bits16 |
||||
mov ah,1 |
||||
jmp @@endofwhat |
||||
@@bits16: |
||||
mov ah,2 |
||||
jmp @@endofwhat |
||||
@@bits32: |
||||
mov ah,4 |
||||
jmp @@endofwhat |
||||
@@testadress: |
||||
call strisadress,si |
||||
jc @@testname |
||||
mov ax,0005h |
||||
jmp @@endofwhat |
||||
@@testname: |
||||
call strisname |
||||
jc @@testnumber |
||||
xor ah,ah |
||||
cmp [byte ptr si],'&' |
||||
je @@okname |
||||
call getlength,si |
||||
mov ah,al |
||||
@@okname: |
||||
mov al,06h |
||||
jmp @@endofwhat |
||||
@@testnumber: |
||||
cmp [byte ptr si],'#' |
||||
jne @@testvarstr |
||||
xor ah,ah |
||||
mov al,08h |
||||
jmp @@endofwhat |
||||
@@testvarstr: |
||||
xor ah,ah |
||||
cmp [byte ptr si],'?' |
||||
je @@okvarstr |
||||
call getlength,si |
||||
mov ah,al |
||||
@@okvarstr: |
||||
mov al,07h |
||||
@@endofwhat: |
||||
clc |
||||
ret |
||||
endp whatis |
||||
|
||||
|
||||
|
||||
;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse |
||||
PROC strtoadress FAR |
||||
;push |
||||
stc |
||||
;pop |
||||
ret |
||||
endp strtoadress |
||||
|
||||
|
||||
;Renvoie en es:di le pointeur str0 ds:si |
||||
PROC strisadress FAR |
||||
;push |
||||
stc |
||||
;pop |
||||
ret |
||||
endp strisadress |
||||
|
||||
;Renvoie non carry si la str ds:%0 point‚e peut ˆtre un nom de fichier |
||||
PROC strisname FAR |
||||
ARG @src:word |
||||
USES ax,si,di |
||||
mov si,[@src] |
||||
@@isname: |
||||
mov al,[si] |
||||
inc si |
||||
cmp al,0 |
||||
je @@itsok |
||||
mov di,offset non |
||||
@@verify: |
||||
mov ah,[cs:di] |
||||
inc di |
||||
cmp ah,0FFh |
||||
je @@isname |
||||
cmp ah,al |
||||
jne @@verify |
||||
stc |
||||
jmp @@itsdead |
||||
@@itsok: |
||||
clc |
||||
@@itsdead: |
||||
ret |
||||
endp strisname |
||||
|
||||
non db '/<>|"?*:\',01,0FFh |
||||
|
||||
;Renvoie non carry si le texte point‚ par %0 est de la base %1 |
||||
PROC strisbase FAR |
||||
ARG @src:word,@base:word |
||||
USES ax,cx,si,di,es |
||||
push cs |
||||
pop es |
||||
mov si,[@src] |
||||
@@isstrbase: |
||||
mov al,[si] |
||||
cmp al,0 |
||||
je @@okbase |
||||
mov cx,[@base] |
||||
xor ch,ch |
||||
mov di,cx |
||||
cmp al,[es:di-2+offset basen] |
||||
je @@verifbase |
||||
xor ch,ch |
||||
inc cl |
||||
mov di,offset base |
||||
cld |
||||
repne scasb |
||||
cmp cx,0 |
||||
je @@nobase |
||||
inc si |
||||
jmp @@isstrbase |
||||
@@okbase: |
||||
clc |
||||
@@endbase: |
||||
ret |
||||
@@verifbase: |
||||
cmp [byte ptr si+1],0 |
||||
je @@okbase |
||||
@@nobase: |
||||
stc |
||||
jmp @@endbase |
||||
endp strisbase |
||||
|
||||
base db '0123456789ABCDEF' |
||||
basen db 'b o d h' |
||||
basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4 |
||||
|
||||
|
||||
;Converti un str %0 de base %1 en int dans eax |
||||
PROC strtoint FAR |
||||
ARG @src:word,@base:word |
||||
USES ebx,ecx,edx,si,edi,es |
||||
push cs |
||||
pop es |
||||
mov si,[@src] |
||||
@@gotos: |
||||
cmp [byte ptr si+1], 0 |
||||
je @@oklo |
||||
inc si |
||||
jmp @@gotos |
||||
@@oklo: |
||||
mov edi,1 |
||||
xor ebx,ebx |
||||
@@baseto: |
||||
cmp [@src],si |
||||
ja @@endbaseto |
||||
mov al,[si] |
||||
xor ecx,ecx |
||||
mov cl,[byte ptr @base] |
||||
inc cl |
||||
push di |
||||
mov di,offset base |
||||
cld |
||||
repne scasb |
||||
pop di |
||||
jne @@noop |
||||
sub cl,[byte ptr @base] |
||||
neg cl |
||||
mov eax,edi |
||||
mul ecx |
||||
add ebx,eax |
||||
mov eax,edi |
||||
mov cl,[byte ptr @base] |
||||
mul ecx |
||||
mov edi,eax |
||||
@@noop: |
||||
dec si |
||||
jmp @@baseto |
||||
@@endbaseto: |
||||
mov eax,ebx |
||||
clc |
||||
ret |
||||
endp strtoint |
||||
|
||||
|
||||
;Renvoie en ds:%1 la partie de %2 caractŠres a partir de la gauche de ds:%0 |
||||
PROC left FAR |
||||
ARG @src:word,@dest:word,@nb:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
mov cx,[@nb] |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
clc |
||||
ret |
||||
endp left |
||||
|
||||
;Renvoie en ds:%1 la partie de %2 caractŠres a partir de la droite de ds:%0 |
||||
PROC right FAR |
||||
ARG @src:word,@dest:word,@nb:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
call getlength,si |
||||
add si,ax |
||||
sub si,[@nb] |
||||
mov cx,[@nb] |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
clc |
||||
ret |
||||
endp right |
||||
|
||||
;Renvoie en ds:%1 la partie de %3 caractŠres a partir de la position %2 de ds:%0 |
||||
PROC middle FAR |
||||
ARG @src:word,@dest:word,@item:word,@nb:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
mov cx,[@nb] |
||||
add si,[@item] |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
clc |
||||
ret |
||||
endp middle |
||||
|
||||
;Rempli de %3 caractŠres %2 a partir de la position %1 de ds:%0 |
||||
PROC fill FAR |
||||
ARG @src:word,@item:word,@char:word,@nb:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov di,[@src] |
||||
add di,[@item] |
||||
mov ax,[@char] |
||||
mov cx,[@nb] |
||||
cld |
||||
rep stosb |
||||
clc |
||||
ret |
||||
endp fill |
||||
|
||||
;Remplace tout les caractŠres %1 de ds:%0 par des caractŠres %2 |
||||
PROC replaceallchar FAR |
||||
ARG @src:word,@char1:word,@char2:word |
||||
USES ax,cx,dx,di,es |
||||
mov di,[@src] |
||||
call getlength,di |
||||
mov cx,ax |
||||
mov ax,[@char1] |
||||
mov dx,[@char2] |
||||
push ds |
||||
pop es |
||||
@@findandchange: |
||||
repne scasb |
||||
cmp cx,0 |
||||
je @@endofchange |
||||
mov [es:di-1],dl |
||||
jmp @@findandchange |
||||
@@endofchange: |
||||
clc |
||||
ret |
||||
endp replaceallchar |
||||
|
||||
;Recherche un caractŠre dl dans la chaŒne ds:%0 |
||||
PROC searchchar FAR |
||||
ARG @src:word,@char:word |
||||
USES cx,di,es |
||||
mov di,[@src] |
||||
call getlength,di |
||||
mov cx,ax |
||||
push ds |
||||
pop es |
||||
mov ax,[@char] |
||||
repne scasb |
||||
mov ax,di |
||||
dec ax |
||||
clc |
||||
ret |
||||
endp searchchar |
||||
|
||||
;Inverse la chaine point‚e en ds:%0 |
||||
PROC invert FAR |
||||
ARG @src:word |
||||
USES ax,cx,si,di |
||||
mov si,[@src] |
||||
call getlength,si |
||||
mov di,si |
||||
add di,ax |
||||
dec di |
||||
@@revert: |
||||
mov al,[si] |
||||
xchg al,[di] |
||||
mov [si],al |
||||
inc si |
||||
dec di |
||||
cmp si,di |
||||
ja @@finishinvert |
||||
dec di |
||||
cmp si,di |
||||
ja @@finishinvert |
||||
inc di |
||||
jmp @@revert |
||||
@@finishinvert: |
||||
clc |
||||
ret |
||||
endp invert |
||||
|
||||
;Compares 2 chaines de caractŠres DS:%0 et DS:%1 zerof si non equal |
||||
PROC cmpstr FAR |
||||
ARG @src:word,@dest:word |
||||
USES cx,dx,si,di |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
call getlength,di |
||||
mov cx,ax |
||||
call getlength,si |
||||
cmp cx,ax |
||||
jne @@notequal |
||||
repe cmpsb |
||||
@@notequal: |
||||
ret |
||||
endp cmpstr |
||||
|
||||
;Compares 2 chaines de caractŠres DS:%0 et DS:%1 zerof si non equal et renvoie le nb de caractŠre egaux dans ax |
||||
PROC evalue FAR |
||||
ARG @src:word,@dest:word |
||||
USES cx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
call getlength ,di |
||||
mov cx,ax |
||||
repe cmpsb |
||||
pushf |
||||
jne @@noident |
||||
sub ax,cx |
||||
popf |
||||
clc |
||||
ret |
||||
@@noident: |
||||
sub ax,cx |
||||
dec ax |
||||
popf |
||||
clc |
||||
ret |
||||
endp evalue |
||||
|
||||
;Insert une chaine ds:%0 en ds:%1 a partir du caractŠre %2 |
||||
PROC insert FAR |
||||
ARG @src:word,@dest:word,@item:word |
||||
USES ax,cx,si,di,es |
||||
push es |
||||
pop ds |
||||
mov si,[@dest] |
||||
call getlength,si |
||||
mov cx,ax |
||||
add si,ax |
||||
mov di,si |
||||
call getlength,[@src] |
||||
add di,ax |
||||
sub cx,[@item] |
||||
inc cx |
||||
std |
||||
rep movsb |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
add di,[@item] |
||||
mov cx,ax |
||||
cld |
||||
rep movsb |
||||
clc |
||||
ret |
||||
endp insert |
||||
|
||||
|
||||
;Detruit %2 caractŠres a partir du caractŠre %1 de DS:%0 |
||||
PROC delete FAR |
||||
ARG @src:word,@item:word,@size:word |
||||
USES ax,cx,dx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
call getlength,si |
||||
mov cx,ax |
||||
sub cx,[@size] |
||||
sub cx,[@item] |
||||
inc cx |
||||
add si,[@item] |
||||
mov di,si |
||||
add si,[@size] |
||||
cld |
||||
rep movsb |
||||
clc |
||||
ret |
||||
endp delete |
||||
|
||||
;Copie une chaine de ds:si en es:di |
||||
PROC copy FAR |
||||
ARG @src:word,@dest:word |
||||
USES ax,cx,si,di |
||||
mov si,[@src] |
||||
mov di,[@dest] |
||||
call getlength,si |
||||
mov cx,ax |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
clc |
||||
ret |
||||
endp copy |
||||
|
||||
|
||||
;ConcatŠne le chaine ds:si avec ds:di |
||||
PROC concat FAR |
||||
ARG @src:word,@dest:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
mov si,[@src] |
||||
call getlength,si |
||||
mov cx,ax |
||||
mov di,[@dest] |
||||
call getlength,di |
||||
add di,ax |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
clc |
||||
ret |
||||
endp concat |
||||
|
||||
|
||||
;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:%0 -> renvoie le nb d'item |
||||
PROC compressdelimiter FAR |
||||
ARG @src:word,@delim:word |
||||
USES cx,dx,si,di,es |
||||
mov di,[@src] |
||||
call getlength,di |
||||
mov cx,ax |
||||
push ds |
||||
pop es |
||||
mov ax,[@delim] |
||||
xor dx,dx |
||||
@@compressitems: |
||||
repne scasb |
||||
inc dx |
||||
@@againcomp: |
||||
cmp [di],al |
||||
jne @@nosup |
||||
call delete,di,0,1 |
||||
jmp @@againcomp |
||||
@@nosup: |
||||
cmp cx,0 |
||||
jne @@compressitems |
||||
mov ax,dx |
||||
clc |
||||
ret |
||||
endp compressdelimiter |
||||
|
||||
;Met le nombre d'‚l‚ments de ds:%0 à %1 |
||||
PROC setnbitems FAR |
||||
ARG @src:word,@size:word,@delim:word |
||||
USES ax,cx,di,es |
||||
mov di,[@src] |
||||
cmp [@size],0 |
||||
je @@onlyzero |
||||
call getnbitems,di,[@delim] |
||||
cmp [@size],ax |
||||
je @@noadjust |
||||
jb @@subsome |
||||
push ds |
||||
pop es |
||||
sub ax,[@size] |
||||
neg ax |
||||
mov cx,ax |
||||
call getlength,di |
||||
add di,ax |
||||
mov ax,[@delim] |
||||
mov ah,'a' |
||||
rep stosw |
||||
xor al,al |
||||
stosb |
||||
jmp @@noadjust |
||||
@@subsome: |
||||
call getpointeritem,[@src],[@size],[@delim] |
||||
dec ax |
||||
mov di,ax |
||||
@@onlyzero: |
||||
mov [byte ptr di],0 |
||||
@@noadjust: |
||||
clc |
||||
ret |
||||
endp setnbitems |
||||
|
||||
;Renvoie la taille ax de l'‚l‚ment %0 |
||||
PROC getitemsize FAR |
||||
ARG @src:word,@item:word,@delim:word |
||||
USES cx,dx |
||||
mov cx,[@item] |
||||
call getpointeritem,[@src],cx,[@delim] |
||||
mov dx,ax |
||||
inc cx |
||||
call getpointeritem,[@src],cx,[@delim] |
||||
sub ax,dx |
||||
dec ax |
||||
clc |
||||
ret |
||||
endp getitemsize |
||||
|
||||
;Renvoie en ds:%1 l'‚l‚ment %2 de ds:%0 |
||||
PROC getitem FAR |
||||
ARG @src:word,@dest:word,@item:word,@delim:word |
||||
USES ax,cx,si,di,es |
||||
push ds |
||||
pop es |
||||
call getpointeritem,[@src],[@item],[@delim] |
||||
mov si,ax |
||||
call getitemsize,[@src],[@item],[@delim] |
||||
mov di,[@dest] |
||||
mov cx,ax |
||||
cld |
||||
rep movsb |
||||
mov al,0 |
||||
stosb |
||||
clc |
||||
ret |
||||
endp getitem |
||||
|
||||
;renvoi un pointeur ax sur l'‚l‚ment %1 de ds:%0 |
||||
PROC getpointeritem FAR |
||||
ARG @src:word,@item:word,@delim:word |
||||
USES cx,dx,di,es |
||||
mov di,[@src] |
||||
cmp [@item],0 |
||||
je @@finishpointer |
||||
push ds |
||||
pop es |
||||
call getlength,di |
||||
mov cx,ax |
||||
push ds |
||||
pop es |
||||
mov ax,[@delim] |
||||
xor dx,dx |
||||
@@countnbitems: |
||||
cmp [@item],dx |
||||
je @@finishpointer |
||||
cld |
||||
repne scasb |
||||
inc dx |
||||
cmp cx,0 |
||||
jne @@countnbitems |
||||
inc di |
||||
@@finishpointer: |
||||
mov ax,di |
||||
clc |
||||
ret |
||||
endp getpointeritem |
||||
|
||||
;Renvoie le nombre d'‚l‚ments ax de ds:%0 |
||||
PROC getnbitems FAR |
||||
ARG @src:word,@delim:word |
||||
USES cx,dx,di,es |
||||
mov di,[@src] |
||||
call getlength,di |
||||
mov cx,ax |
||||
push ds |
||||
pop es |
||||
mov ax,[@delim] |
||||
xor dx,dx |
||||
cld |
||||
@@countitems: |
||||
repne scasb |
||||
inc dx |
||||
cmp cx,0 |
||||
jne @@countitems |
||||
mov ax,dx |
||||
clc |
||||
ret |
||||
endp getnbitems |
||||
|
||||
;renvoie la taille en octets AX de la chaine point‚e en ds:%0 |
||||
PROC getlength FAR |
||||
ARG @src:word |
||||
USES cx,di,es |
||||
push ds |
||||
pop es |
||||
mov di,[@src] |
||||
mov al,0 |
||||
mov cx,0FFFFh |
||||
cld |
||||
repne scasb |
||||
neg cx |
||||
dec cx |
||||
dec cx |
||||
mov ax,cx |
||||
clc |
||||
ret |
||||
endp getlength |
||||
|
||||
;Met la taille en octets de la chaine point‚e ds:%0 a %1 |
||||
PROC setlength FAR |
||||
ARG @src:word,@size:word |
||||
USES si |
||||
mov si,[@src] |
||||
add si,[@size] |
||||
mov [byte ptr si],0 |
||||
clc |
||||
ret |
||||
endp setlength |
||||
|
||||
;met en majuscule la chaine ds:%0 |
||||
PROC uppercase FAR |
||||
ARG @src:word |
||||
USES si,ax |
||||
mov si,[@src] |
||||
@@uppercase: |
||||
mov al,[ds:si] |
||||
inc si |
||||
cmp al,0 |
||||
je @@enduppercase |
||||
cmp al,'a' |
||||
jb @@uppercase |
||||
cmp al,'z' |
||||
ja @@uppercase |
||||
sub [byte ptr si-1],'a'-'A' |
||||
jmp @@uppercase |
||||
@@enduppercase: |
||||
clc |
||||
ret |
||||
endp uppercase |
||||
|
||||
;met en majuscule la premiŠre lettre chaine ds:%0 |
||||
PROC onecase FAR |
||||
ARG @src:word |
||||
USES ax |
||||
mov si,[@src] |
||||
mov al,[ds:si] |
||||
cmp al,'a' |
||||
jb @@oneenduppercase |
||||
cmp al,'z' |
||||
ja @@oneenduppercase |
||||
sub [byte ptr si],'a'-'A' |
||||
@@oneenduppercase: |
||||
clc |
||||
ret |
||||
endp onecase |
||||
|
||||
;met en minuscule la chaine ds:%0 |
||||
PROC lowercase FAR |
||||
ARG @src:word |
||||
USES si,ax |
||||
mov si,[@src] |
||||
@@lowercase: |
||||
mov al,[ds:si] |
||||
inc si |
||||
cmp al,0 |
||||
je @@endlowercase |
||||
cmp al,'A' |
||||
jb @@lowercase |
||||
cmp al,'Z' |
||||
ja @@lowercase |
||||
add [byte ptr si-1],'a'-'A' |
||||
jmp @@lowercase |
||||
@@endlowercase: |
||||
clc |
||||
ret |
||||
endp lowercase |
||||
|
||||
;Inverse la casse la chaine ds:%0 |
||||
PROC invertcase FAR |
||||
ARG @src:word |
||||
USES si,ax |
||||
mov si,[@src] |
||||
@@invertcase: |
||||
mov al,[ds:si] |
||||
inc si |
||||
cmp al,0 |
||||
je @@endinvertcase |
||||
cmp al,'A' |
||||
jb @@invertcase |
||||
cmp al,'Z' |
||||
jbe @@goinvertcase |
||||
cmp al,'a' |
||||
jb @@invertcase |
||||
cmp al,'z' |
||||
ja @@invertcase |
||||
sub [byte ptr si-1],'a'-'A' |
||||
jmp @@invertcase |
||||
@@goinvertcase: |
||||
add [byte ptr si-1],'a'-'A' |
||||
jmp @@invertcase |
||||
@@endinvertcase: |
||||
clc |
||||
ret |
||||
endp invertcase |
||||
|
Loading…
Reference in new issue