feat: ajout d'une librairie de gestion de chaines de caractères à zéro terminal.

This commit is contained in:
Nicolas Hordé 2001-05-14 22:48:10 +02:00
parent 6b08464f51
commit 564853e762
7 changed files with 672 additions and 134 deletions

View File

@ -53,6 +53,8 @@ lines:
mov ah,13
mov si,offset spaces
int 47h
mov ah,5
int 47h
mov al,16
mov cl,7
mov ah,21
@ -91,10 +93,12 @@ doaline2:
inc edi
dec al
jnz doaline2
dec bh
je outes
mov ah,6
int 47h
dec bh
jnz lines
jmp lines
outes:
mov ah,21
mov cl,112
int 47h
@ -284,7 +288,7 @@ calc1:
shl ax,2
shl dx,1
add ax,dx
add ax,25
add ax,27
mov bx,YY
mov dx,yy
shl bx,5
@ -310,7 +314,7 @@ calc2:
mov dx,xx
shl dx,1
add si,dx
add si,127
add si,129
mov byte ptr es:[si],112
mov bx,xxyy2
mov byte ptr es:[bx],07

257
m2.asm Executable file
View File

@ -0,0 +1,257 @@
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
drv db 'MOUSE',0
Tsr:
cli
cmp ax,1234h
jne nomore
mov ax,4321h
jmp itsok
nomore:
push bx ax
mov ah,4
mov bh,0
int 50h
mov bl,al
pop ax
cmp byte ptr cs:isact,1
je nottest
mov cs:isact,1
and bl,10000b
cmp bl,16
jae react
mov bl,ah
xor bh,bh
shl bx,1
mov bx,cs:[bx].tables
mov cs:current,bx
pop bx
call cs:current
itsok:
jnc noerror
push bp
mov bp,sp
or byte ptr [bp+6],1b
pop bp
mov ax,cs
shl eax,16
mov ax,cs:current
jmp endofint
noerror:
push bp
mov bp,sp
and byte ptr [bp+6],0FEh
pop bp
endofint:
mov cs:isact,0
sti
iret
nottest:
pop bx
jmp endofint
current dw 0
tables dw cmdmouse
dw cmdmouse2
dw detectmouse
dw getmouse
isact db 0
;Envoie une commande AL … la souris via controleur clavier
cmdmouse:
push ax
videbuff1:
in al, 64h
and al, 10b
jne videbuff1
mov al, 00d4h
out 64h, al
videbuff2:
in al, 64h
and al, 10b
jne videbuff2
pop ax
out 60h, al
in al, 60h
ret
;Envoie une commande2 AL … la souris via controleur clavier carry=nomouse
cmdmouse2:
push ax
videbuff21:
in al, 64h
and al, 10b
jne videbuff21
mov al, 0060h
out 64h, al
videbuff22:
in al, 64h
and al, 10b
jne videbuff22
pop ax
out 60h, al
in al, 60h
ret
Detectmouse:
push ax cx
mov al, 0a8h ;AUX enable
out 64h, al
mov al, 0f3h ;Set sample
call cmdmouse
mov al, 100 ;Set sample
call cmdmouse
mov al, 0e8h ;Set resolution
call cmdmouse
mov al, 01 ;Set resolution
call cmdmouse
mov al, 0e7h ;Set scale 2:1
call cmdmouse
mov al, 0f4h ;Enable device
call cmdmouse
mov al, 47h ;Interruption ON
call cmdmouse2
mov cx, 1024
testmouse:
in al, 60h ;Lecture du port de donnes
cmp al, 250 ;Test si il y a une souris
je okmouse
dec cx
jnz testmouse
stc
jmp endoftest
okmouse:
clc
endoftest:
pop cx ax
ret
;envoie en bx,cx les coordonnes et en dl les boutons
getmouse:
mov bl,cs:vx
xor bh,bh
mov cl,cs:vy
xor ch,ch
mov dl,cs:button
;sub dl,8
;and dl,0Fh
clc
ret
Button db 0
rx dw 0
ry dw 0
VX db 0
VY db 0
X dw 0
Y dw 0
count db 0
error db 0
xy dw 0
old dw 0
;Gestionnaire de souris PS/2
react:
push ax bx cx dx di ds es
push cs
pop ds
in al, 60h
cmp error, 1
je gest1
cmp count, 1
je gest1
cmp count, 2
je gest2
cmp count, 3
je gest3
gest1:
mov count, 2
mov Button, al
and al, 00001000b
cmp al, 8
je gest1end
mov error, 1
jmp gest1end2
gest1end:
mov error, 0
gest1end2:
mov count, 2
jmp endgest
gest2:
mov count, 3
mov VX, al
jmp endgest
gest3:
mov count, 1
mov VY, al
jmp endgest
endgest:
mov bl,VY
xor bh,bh
mov al,button
shr al,5
and al,1
cmp al,0
je addy
add y,bx
jmp hadsuby
addy:
sub y,bx
hadsuby:
mov bl,VX
xor bh,bh
mov al,button
shr al,8
and al,1
cmp al,0
je addx
sub x,bx
jmp hadsubx
addx:
add x,bx
hadsubx:
push cs
pop es
mov di,offset infos
mov ah,34
int 47h
mov ax,x
mov bx,0FFFFh
xor ch,ch
mov cl,[di+1]
mul cx
div bx
mov rx,ax
mov ax,y
mov cl,[di]
mul cx
div bx
mov ry,ax
mul byte ptr [di+1]
add ax,rx
shl ax,1
mov di,ax
mov ax,0B800h
mov es,ax
mov bx,xy
mov ax,old
mov word ptr es:[bx],ax
mov xy,di
mov ax,es:[di]
mov old,ax
mov word ptr es:[di],0FF70h
mov al, 20h
out 0a0h, al
out 20h, al
pop es ds di dx cx bx ax
mov cs:isact,0
pop bx
iret
infos db 10 dup (0)
end start

10
mm.asm
View File

@ -27,20 +27,20 @@ mov ah,6
int 47h
mov si,bx
mov di,cx
mov ah,11
mov ah,9
mov cx,8
int 47H
mov ah,5
int 47H
mov dx,si
mov ah,10
mov cx,16
mov ah,9
mov cx,8
int 47H
mov ah,5
int 47h
mov dx,di
mov ah,10
mov cx,16
mov ah,9
mov cx,8
int 47H
jmp popr
db 0CBh

View File

@ -193,28 +193,10 @@ gest3:
endgest:
mov bl,VY
xor bh,bh
mov al,button
shr al,5
and al,1
cmp al,0
je addy
add y,bx
jmp hadsuby
addy:
sub y,bx
hadsuby:
mov bl,VX
xor bh,bh
mov al,button
shr al,8
and al,1
cmp al,0
je addx
sub x,bx
jmp hadsubx
addx:
add x,bx
hadsubx:
push cs
pop es
mov di,offset infos

View File

@ -17,9 +17,10 @@ mov si,offset msg
int 47h
replay:
mov ah,6
int 47h
mov ah,6
int 47h
noret:
mov ah,6
int 47h
mov ah,13
mov si,offset prompt
int 47h
@ -27,22 +28,24 @@ mov di,offset buffer
waitchar:
mov ax,0
int 16h
mov dl,al
mov [di],al
cmp al,0Dh
je entere
cmp di,offset buffer+256
je waitchar
mov [di],al
inc di
mov dl,al
mov ah,7
int 47h
jmp waitchar
entere:
mov ah,6
int 47h
mov ah,6
int 47h
mov byte ptr [di],0
mov si,offset buffer
call uppercasestr0
cmp si,di
je noret
mov ah,6
int 47h
call uppercase0
mov bx,offset commands
tre:
mov di,[bx]
@ -60,11 +63,11 @@ error:
push cs
pop es
mov dl,'.'
call searchcharstr0
call searchchar0
je noaddext
mov di,offset buffer
mov si,offset extcom
call concatstr0
call concat0
noaddext:
mov si,offset buffer
push cs
@ -113,96 +116,6 @@ mov si,offset Error_Syntax
int 47h
jmp replay
;met en majuscule la string ds:si
uppercasestr0:
push si ax
uppercaser:
mov al,ds:[si]
inc si
cmp al,0
je enduppercase
cmp al,'a'
jb uppercaser
cmp al,'z'
ja uppercaser
sub byte ptr [si-1],'a'-'A'
jmp uppercaser
enduppercase:
clc
pop ax si
ret
;Cherche dl dans la str ds:si -> di
SearchCharStr0:
push ax cx si di es
mov di,si
push ds
pop es
mov cx,0FFh
mov al,0
cld
repne scasb
neg cx
dec cx
xor ch,ch
mov di,si
mov al,dl
repne scasb
pop es di si cx ax
ret
;concatŠne la chaine str ds:si avec es:di
concatstr0:
push ax cx dx si di
push es di
mov di,si
push ds
pop es
mov al,0
mov cx,255
cld
repne scasb
neg cx
dec cx
xor ch,ch
mov dx,cx
pop di es
mov cx,0FFh
repne scasb
dec di
mov cx,dx
rep movsb
pop di si dx cx ax
ret
;compare la chaine es:di avec ds:si
cmpstr0:
push cx dx si di
push di
mov al,0
mov cx,255
cld
repne scasb
neg cx
mov dx,cx
pop di
push es di
mov di,si
push ds
pop es
mov cx,255
repne scasb
neg cx
cmp dx,cx
pop di es
jne notequal
dec cx
xor ch,ch
rep cmpsb
notequal:
pop di si dx cx
ret
Code_Exit:
pop ax
db 0CBh
@ -214,20 +127,139 @@ int 47h
ret
Version_Text db 'Cos 2000 version 1.1.1B by Nico',0
Code_Cls:
mov ah,2
int 47h
ret
Code_Reboot:
push 0FFFFh
push 00000h
db 0CBH
Code_Command:
mov bx,offset commands
showalls:
mov si,[bx]
add bx,4
cmp si,0
je endoff
mov ah,13
int 47h
mov ah,6
int 47h
jmp showalls
endoff:
ret
extcom db '.EXE',0
commands dw Str_Exit ,Code_Exit
commands dw Str_Exit ,Code_Exit
dw Str_Version,Code_Version
dw Str_Cls ,Code_Cls
dw Str_Reboot ,Code_Reboot
dw Str_Command,Code_Command
dw 0
Str_Exit db 'EXIT',0
Str_Version db 'VERSION',0
Error_Syntax db 'The command doesn''t exit !',0
Str_Cls db 'CLS',0
Str_Reboot db 'REBOOT',0
Str_Command db 'COMMAND',0
Error_Syntax db 'Command or executable doesn''t exist !',0
prompt db 'COS>',0
msg db 'Cos command interpretor V1.0',0
buffer db 255 dup (0)
;Recherche un caractŠre dl dans la chaŒne ds:si
SearchChar0:
push ax cx di es
call GetLength0
push ds
pop es
mov di,si
mov al,dl
repne scasb
pop es di cx ax
ret
;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal
cmpstr0:
push cx dx si di
call GetLength0
mov dx,cx
push ds si
push es
pop ds
mov si,di
call GetLength0
pop si ds
cmp cx,dx
jne NotEqual
repe cmpsb
NotEqual:
pop di si dx cx
ret
;met en majuscule la chaine ds:si
UpperCase0:
push si ax
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
pop ax si
ret
;ConcatŠne le chaine ds:si avec es:di
Concat0:
push ax cx dx si di
call GetLength0
mov dx,cx
xchg si,di
push ds
push es
pop ds
call GetLength0
pop ds
xchg si,di
add di,cx
mov cx,dx
cld
rep movsb
mov al,0
stosb
pop di si dx cx ax
ret
;renvoie la taille en octets CX de la chaine pointe en ds:si
GetLength0:
push ax di es
push ds
pop es
mov di,si
mov al,0
mov cx,0FFFFh
cld
repne scasb
neg cx
dec cx
dec cx
pop es di ax
ret
vga db 0
end start

253
str0.asm Executable file
View File

@ -0,0 +1,253 @@
;Librairie qui prend en charge le format de STR ASCIIZ
.model tiny
.486
smart
.code
org 0100h
start:
mov di,offset set
mov si,offset set
mov bx,7
mov cx,5
call delete0
ret
set db 'Essai de string',0
set2 db 'epais',0
tre db 30 dup (0)
;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si
Left0:
push ax cx si di
cld
rep movsb
mov al,0
stosb
pop di si cx ax
ret
;Renvoie en es:di la partie de cx caractŠres a partir de la droite de ds:si
Right0:
push ax cx dx si di
mov dx,cx
call getlength0
add si,cx
sub si,dx
mov cx,dx
cld
rep movsb
mov al,0
stosb
pop di si dx cx ax
ret
;Renvoie en es:di la partie de cx caractŠres a partir de la position bx de ds:si
middle0:
push ax cx si di
add si,bx
cld
rep movsb
mov al,0
stosb
pop di si cx ax
ret
;Rempli de cx caractŠres dl a partir de la position bx de ds:si
Fill0:
push ax bx cx si di es
push ds
pop es
add si,bx
mov al,dl
mov di,si
cld
rep stosb
pop es di si cx bx ax
ret
;Recherche un caractŠre dl dans la chaŒne ds:si
SearchChar0:
push ax cx di es
call GetLength0
push ds
pop es
mov di,si
mov al,dl
repne scasb
pop es di cx ax
ret
;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal
cmpstr0:
push cx dx si di
call GetLength0
mov dx,cx
push ds si
push es
pop ds
mov si,di
call GetLength0
pop si ds
cmp cx,dx
jne NotEqual
repe cmpsb
NotEqual:
pop di si dx cx
ret
;Detruit CX caractŠres a partir du caractŠre BX de DS:SI
delete0:
push cx dx si di es
push ds
pop es
mov dx,cx
call getlength0
sub cx,dx
neg cx
mov di,si
add si,bx
cld
rep movsb
pop es di si dx cx
ret
;Copie une chaine de ds:si en es:di
Copy:
push ax cx si di
call GetLength0
cld
rep movsb
mov al,0
stosb
pop di si cx ax
ret
;ConcatŠne le chaine ds:si avec es:di
Concat0:
push ax cx dx si di
call GetLength0
mov dx,cx
xchg si,di
push ds
push es
pop ds
call GetLength0
pop ds
xchg si,di
add di,cx
mov cx,dx
cld
rep movsb
mov al,0
stosb
pop di si dx cx ax
ret
;renvoie la taille en octets CX de la chaine pointe en ds:si
GetLength0:
push ax di es
push ds
pop es
mov di,si
mov al,0
mov cx,0FFFFh
cld
repne scasb
neg cx
dec cx
dec cx
pop es di ax
ret
;Met la taille en octets de la chaine pointe ds:si a CX
SetLength0:
push bx
mov bx,cx
mov byte ptr [si+bx],0
pop bx
ret
;met en majuscule la chaine ds:si
UpperCase0:
push si ax
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
pop ax si
ret
;met en majuscule la premiŠre lettre chaine ds:si
OneCase0:
push ax
OneUpperCase:
mov al,ds:[si]
cmp al,'a'
jb OneEndUpperCase
cmp al,'z'
ja OneEndUpperCase
sub byte ptr [si],'a'-'A'
OneEndUpperCase:
clc
pop ax
ret
;met en minuscule la chaine ds:si
LowerCase0:
push si ax
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
pop ax si
ret
;Inverse la casse la chaine ds:si
InvertCase0:
push si ax
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
pop ax si
ret
end start

View File

@ -280,12 +280,12 @@ mode6 DB 63H, 00H, 03H,01H,0FH,00H,0EH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
db 00,00
db 00,00
;320*400 256 couleurs chain4
mode7 DB 63H, 00H, 03H,01H,0FH,00H,06H
mode7 DB 63H, 00H, 03H,01H,0FH,00H,0EH
DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H
DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH
DB 9CH,8EH,8FH,28H,40H,96H,0B9H,0A3H,0FFH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
@ -311,6 +311,15 @@ mode9 DB 63H, 00H, 03H,01H,0FH,00H,0EH
;====================================================
;320*400 256 couleurs chain4
mode7s DB 63H, 00H, 03H,01H,0FH,00H,06H
DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,40H,00H,00H,00H,00H,00H,00H
DB 9CH,8EH,8FH,28H,00H,96H,0B9H,0E3H,0FFH
DB 00H,00H,00H,00H,00H,40H,05H,0FH,0FFH
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H,0AH,0BH,0CH,0DH,0EH,0FH
DB 41H,00H,0FH,00H,00H
db 00,00
;
;=============CLEAR=========
@ -891,6 +900,7 @@ Showsigned:
push ax ebx edx es
xor ebx,ebx
mov bl,cl
dec bl
bt edx,ebx
jnc pos
neg edx