; Pour afficher directement a l'ecran en mode 16 bits (protege ou non?) ; ; Auteur: Benoit Papillault ; Creation: Lundi 23 Juin 1997 ; Derniere modification: Mardi 24 Juin 1997 include model.inc include print16.inc MEM_VIDEO equ 0b800h LARGEUR_ECRAN equ 80 HAUTEUR_ECRAN equ 25 ATTRIBUTS equ 02h _TEXT segment public 'CODE' use16 assume cs:_TEXT ; on declare ces variables dans le segment de code, afin de ne pas se soucier ; de la validite de CS _x16 dw 0 _y16 dw 20 ; pour imprimer juste un seul caractere mis dans le registre al ; mets a jour les variables _x16 et _y16 print_car16 proc PROC_MODEL push bp mov bp,sp push ax push bx push cx push ds ; on sauve al dans cl mov cl,al mov ax,video mov ds,ax assume ds:video cmp cl,10 ; retour chariot je retour_chariot mov ax,_y16 mov bl,LARGEUR_ECRAN mul bl ; ax = al * bl add ax,_x16 add ax,ax ; chaque caractere occupe deux octets en memoire video mov bx,ax mov ecran[bx][0],cl mov ecran[bx][1],ATTRIBUTS inc _x16 cmp _x16,LARGEUR_ECRAN jl print_car16_end retour_chariot: mov _x16,0 inc _y16 cmp _y16,HAUTEUR_ECRAN jl print_car16_end mov _y16,0 print_car16_end: pop ds pop cx pop bx pop ax pop bp ret print_car16 endp ; pour imprimer une chaine de caractere a partir de la position courante ; a declarer en C avec void print_st16(const char *s) public _print_st16 _print_st16 proc PROC_MODEL ; code d'entree d'une fonction C push bp mov bp,sp ; sauvegarde des registres utilises push ds push ax push si LDS_ si,[bp+cPtrSize+2] ; on examine les caracteres un par un boucle_st16: mov al,ds:si inc si cmp al,0 je fin_st16 call print_car16 jmp short boucle_st16 fin_st16: ; restauration des registres utilises pop si pop ax pop ds ; code de sortie d'une fonction C pop bp ret _print_st16 endp ; imprime un octet (al) public _print_al16 _print_al16 proc PROC_MODEL push bp mov bp,sp push ax push cx mov cl,al ; on sauvegarde ; on affiche les bits de poids forts en premier shr al,4 cmp al,10 jl print_al16_ok add al,7 print_al16_ok: add al,'0' call print_car16 mov al,cl and al,0fh cmp al,10 jl print_al16_ok2 add al,7 print_al16_ok2: add al,'0' call print_car16 pop cx pop ax pop bp ret _print_al16 endp public _print_ax16 _print_ax16 proc PROC_MODEL push bp mov bp,sp xchg ah,al call _print_al16 xchg ah,al call _print_al16 pop bp ret _print_ax16 endp .386 ; pour que eax soit reconnu public _print_eax16 _print_eax16 proc PROC_MODEL push bp mov bp,sp ror eax,16 call _print_ax16 ror eax,16 call _print_ax16 pop bp ret _print_eax16 endp public _test_asm16 _test_asm16 proc PROC_MODEL push bp mov bp,sp mov eax,0c1c2c3c4h call _print_al16 call _print_ax16 call _print_eax16 pop bp ret _test_asm16 endp _TEXT ends video segment at MEM_VIDEO org 0 ecran label byte video ends end