From 9e47321c92d5891156634d5ade94086d4398de57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 31 Mar 2007 18:50:14 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20version=20b=C3=AAta=201.3.2fr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/MAKEFILE | 20 + lib/bmp.asm | 105 ++++++ lib/detect.asm | 762 +++++++++++++++++++++++++++++++++++++ lib/str0.asm | 993 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/video.asm | 891 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 2771 insertions(+) create mode 100644 lib/MAKEFILE create mode 100644 lib/bmp.asm create mode 100644 lib/detect.asm create mode 100644 lib/str0.asm create mode 100644 lib/video.asm diff --git a/lib/MAKEFILE b/lib/MAKEFILE new file mode 100644 index 0000000..f061400 --- /dev/null +++ b/lib/MAKEFILE @@ -0,0 +1,20 @@ +asm= lzasm /z/t +lnk= elink + +all: detect.lib video.lib str0.lib bmp.lib + +.asm.obj: + $(asm) $< + +.obj.lib: + $(lnk) $< $*.lib + +clean: + del *.obj + del *.ce + del *.bak + del *.lib + del *.com + del *.bin + del *.sys + del *.err \ No newline at end of file diff --git a/lib/bmp.asm b/lib/bmp.asm new file mode 100644 index 0000000..893346a --- /dev/null +++ b/lib/bmp.asm @@ -0,0 +1,105 @@ +model tiny,stdcall +p586N +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\divers.h" +include "..\include\bmp.h" + +org 0h + +start: +header exe <"CE",1,0,0,offset exports,offset imports,,> + +exporting +declare showbmp +declare loadbmppalet +ende + +importing +use VIDEO,showpixel +endi + +;==========SHOWBMP========= +;Affiche le BMP pointée par DS:%0 en %1, %2 +;<- DS:%0 BMP, %1 coordonnées X, %2 coordonnées Y +;-> +;========================== +PROC showbmp FAR + ARG @pointer:word, @x:word, @y:word + USES ax,bx,cx,dx,si,di + mov si,[@pointer] + cmp [word ptr (bmp_file si).bmp_filetype],"MB" + jne @@errorshowing + mov edi,[(bmp_file si).bmp_bitmapoffset] + add di,400h + add di,si + xor ebx,ebx + mov ecx,[(bmp_file si).bmp_height] + mov edx,[(bmp_file si).bmp_width] + ;and dx,11111100b + cmp edx,[(bmp_file si).bmp_width] + ;jae @@noadjust + ;add dx,4 +@@noadjust: + sub edx,[(bmp_file si).bmp_width] +@@bouclette: + push bx cx + add bx,[@x] + add cx,[@y] + call [cs:showpixel],bx,cx,[word ptr di] + pop cx bx + inc bx + inc di + cmp ebx,[(bmp_file si).bmp_width] + jb @@bouclette + xor bx,bx + ;add di,dx + dec cx + cmp cx,0 + jne @@bouclette + clc + ret +@@errorshowing: + stc + ret +ENDP showbmp + + +;==========LOADBMPPALET========= +;Charge la palette du BMP pointée par DS:%0 +;-> DS:%0 BMP +;<- +;=============================== +PROC loadbmppalet FAR + ARG @pointer:word + USES ax,bx,cx,dx,si + mov si,[@pointer] + mov bx,0400h+36h-4 + mov cx,100h + mov dx, 3c8h +@@paletteload: + mov al, cl + dec al + out dx, al + inc dx + mov al,[bx+si+2] + shr al,2 + out dx, al + mov al,[bx+si+1] + shr al,2 + out dx, al + mov al,[bx+si] + shr al,2 + out dx, al + sub bx,4 + dec dx + dec cl + jnz @@paletteload + ret +ENDP loadbmppalet + + diff --git a/lib/detect.asm b/lib/detect.asm new file mode 100644 index 0000000..b268b83 --- /dev/null +++ b/lib/detect.asm @@ -0,0 +1,762 @@ +model tiny,stdcall +p586 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\cpu.h" +include "..\include\pci.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,,,> + +exporting +declare cpuinfo +declare setinfo +declare pciinfo +declare getpciclass +declare getpcisubclass +declare getcardinfo +declare pcireadbyte +declare pcireadword +declare pcireaddword +declare detectvmware +ende + +PROC detectvmware FAR + USES eax,ebx,ecx,edx + mov eax,564D5868h + mov ebx,12345h + mov ecx,00Ah + mov edx,5658h + in ax,dx + cmp ebx,564D5868h + ret +endp detectvmware + +;renvoie un pointer dx:ax vers la classe %0 +PROC getpciclass FAR + ARG @class:word + USES di + mov di,[@class] + and di,0FFh + shl di,1 + mov ax,[cs:offset classes+di] + mov dx,cs + ret +endp getpciclass + +;renvoie un pointer dx:ax vers la sous-classe de %1 et de classe %0 +PROC getpcisubclass FAR + ARG @class:word,@subclass:word + USES di + mov di,[@class] + and di,0FFh + shl di,1 + mov di,[cs:offset classesd+di] + mov dx,[@subclass] + and dx,0FFh + cmp dx,80h + jne @@suiteac + mov ax,offset divers + jmp @@found +@@suiteac: + shl dx,1 + add di,dx + mov ax,[cs:di] +@@found: + mov dx,cs + ret +endp getpcisubclass + +divers db 'divers',0 + +classes: +dw offset class0 +dw offset class1 +dw offset class2 +dw offset class3 +dw offset class4 +dw offset class5 +dw offset class6 +dw offset class7 +dw offset class8 +dw offset class9 +dw offset class10 +dw offset class11 +dw offset class12 +dw offset class13 +dw offset class14 +dw offset class15 +dw offset class16 +dw offset class17 +class0 db 'ancien',0 +class1 db 'stockage',0 +class2 db 'reseau',0 +class3 db 'affichage',0 +class4 db 'multimedia',0 +class5 db 'memoire',0 +class6 db 'pont',0 +class7 db 'communication',0 +class8 db 'systeme',0 +class9 db 'acquisition',0 +class10 db 'dock',0 +class11 db 'processeur',0 +class12 db 'bus serie',0 +class13 db 'sans fil',0 +class14 db 'intelligent',0 +class15 db 'satellite',0 +class16 db 'cryptage',0 +class17 db 'traitement signal',0 + + +;Classes et sous classes +classesd: +dw offset class0d +dw offset class1d +dw offset class2d +dw offset class3d +dw offset class4d +dw offset class5d +dw offset class6d +dw offset class7d +dw offset class8d +dw offset class9d +dw offset class10d +dw offset class11d +dw offset class12d +dw offset class13d +dw offset class14d +dw offset class15d +dw offset class16d +dw offset class17d + +class0d: +dw offset subclass00 +dw offset subclass01 +subclass00 db 'divers',0 +subclass01 db 'vga',0 + +class1d: +dw offset subclass10 +dw offset subclass11 +dw offset subclass12 +dw offset subclass13 +dw offset subclass14 +subclass10 db 'scsi',0 +subclass11 db 'ide',0 +subclass12 db 'disquette',0 +subclass13 db 'ipi',0 +subclass14 db 'raid',0 + +class2d: +dw offset subclass20 +dw offset subclass21 +dw offset subclass22 +dw offset subclass23 +dw offset subclass24 +subclass20 db 'ethernet',0 +subclass21 db 'token ring',0 +subclass22 db 'fddi',0 +subclass23 db 'atm',0 +subclass24 db 'isdn',0 + +class3d: +dw offset subclass30 +dw offset subclass31 +dw offset subclass32 +subclass30 db 'vga',0 +subclass31 db 'xga',0 +subclass32 db '3D',0 + +class4d: +dw offset subclass40 +dw offset subclass41 +dw offset subclass42 +subclass40 db 'video',0 +subclass41 db 'audio',0 +subclass42 db 'telephonie',0 + +class5d: +dw offset subclass50 +dw offset subclass51 +subclass50 db 'ram',0 +subclass51 db 'flash',0 + +class6d: +dw offset subclass60 +dw offset subclass61 +dw offset subclass62 +dw offset subclass63 +dw offset subclass64 +dw offset subclass65 +dw offset subclass66 +dw offset subclass67 +dw offset subclass68 +subclass60 db 'hote',0 +subclass61 db 'isa',0 +subclass62 db 'eisa',0 +subclass63 db 'mca',0 +subclass64 db 'pci',0 +subclass65 db 'pcmcia',0 +subclass66 db 'nubus',0 +subclass67 db 'cardbus',0 +subclass68 db 'RACEway',0 + +class7d: +dw offset subclass70 +dw offset subclass71 +dw offset subclass72 +dw offset subclass73 +subclass70 db 'serie',0 +subclass71 db 'parallele',0 +subclass72 db 'serie multiport',0 +subclass73 db 'modem',0 + +class8d: +dw offset subclass80 +dw offset subclass81 +dw offset subclass82 +dw offset subclass83 +dw offset subclass84 +subclass80 db 'pic',0 +subclass81 db 'dma',0 +subclass82 db 'timer',0 +subclass83 db 'rtc',0 +subclass84 db 'hotplug',0 + +class9d: +dw offset subclass90 +dw offset subclass91 +dw offset subclass92 +dw offset subclass93 +dw offset subclass94 +subclass90 db 'clavier',0 +subclass91 db 'stylo',0 +subclass92 db 'souris',0 +subclass93 db 'scanner',0 +subclass94 db 'joystick',0 + +class10d: +dw offset subclass100 +subclass100 db 'station',0 + +class11d: +dw offset subclass110 +dw offset subclass111 +dw offset subclass112 +dw offset subclass113 +dw offset subclass114 +subclass110 db '386',0 +subclass111 db '486',0 +subclass112 db 'pentium',0 +subclass113 db 'alpha',0 +subclass114 db 'coprocesseur',0 + +class12d: +dw offset subclass120 +dw offset subclass121 +dw offset subclass122 +dw offset subclass123 +dw offset subclass124 +dw offset subclass125 +subclass120 db 'firewire',0 +subclass121 db 'access',0 +subclass122 db 'ssa',0 +subclass123 db 'usb',0 +subclass124 db 'fibre',0 +subclass125 db 'smbus',0 + +class13d: +dw offset subclass130 +dw offset subclass131 +dw offset subclass132 +subclass130 db 'irda',0 +subclass131 db 'ir',0 +subclass132 db 'rf',0 + +class14d: +dw offset subclass140 +subclass140 db 'IO arch',0 + +class15d: +dw offset subclass150 +dw offset subclass151 +dw offset subclass152 +dw offset subclass153 +subclass150 db 'tv',0 +subclass151 db 'audio',0 +subclass152 db 'voix',0 +subclass153 db 'donnees',0 + +class16d: +dw offset subclass160 +dw offset subclass161 +subclass160 db 'reseau',0 +subclass161 db 'jeux',0 + +class17d: +dw offset subclass170 +subclass170 db 'dpio',0 + + +;al=bus cl=deviceid ch=func es:di +PROC getcardinfo FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES eax,bx,di + mov di,[@pointer] + cmp [@function],0 + je @@amultiorfirst + call pcireadbyte,[@bus],[@device],0,offset (pcidata).typed + and al,multifunction + cmp al,0 + jne @@amultiorfirst + mov [word ptr di],0000h + jmp @@notexist +@@amultiorfirst: + xor bx,bx +@@goinfos: + call pcireadword,[@bus],[@device],[@function],bx + inc bl + inc bl + cmp bl,2 + ja @@notzarb + cmp ax,0FFFFh + je @@notexist + cmp ax,00000h + je @@notexist +@@notzarb: + mov [ds:di],ax + inc di + inc di + cmp bl,40h + jbe @@goinfos + clc + ret +@@notexist: + stc + ret +endp getcardinfo + +;lit un octet du bus %0 device %1 function %2 nø %3 et le met en AL +PROC pcireadbyte FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES bx,dx + mov al,[byte ptr @bus] + mov ah,80h + shl eax,16 + mov ah,[byte ptr @device] + shl ah,3 + or ah,[byte ptr @function] + mov bl,[byte ptr @pointer] + mov al,bl + and al,0fch + mov dx,config1addr + out dx,eax + mov dx,config1data + and bl,3 + or dl,bl + in al,dx + ret +endp pcireadbyte + +;lit 2 octet du bus %0 device %1 function %2 nø %3 et le met en AX +PROC pcireadword FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES bx,dx + mov al,[byte ptr @bus] + mov ah,80h + shl eax,16 + mov ah,[byte ptr @device] + shl ah,3 + or ah,[byte ptr @function] + mov bl,[byte ptr @pointer] + mov al,bl + and al,0fch + mov dx,config1addr + out dx,eax + mov dx,config1data + and bl,3 + or dl,bl + in ax,dx + ret +endp pcireadword + +;lit 4 octet du bus %0 device %1 function %2 nø %3 et le met en EAX +PROC pcireaddword FAR + ARG @bus:word,@device:word,@function:word,@pointer:word + USES bx,dx + mov al,[byte ptr @bus] + mov ah,80h + shl eax,16 + mov ah,[byte ptr @device] + shl ah,3 + or ah,[byte ptr @function] + mov bl,[byte ptr @pointer] + mov al,bl + and al,0fch + mov dx,config1addr + out dx,eax + mov dx,config1data + and bl,3 + or dl,bl + in eax,dx + ret +endp pcireaddword + +;Prob avec str pci +;renvoie en %0 la structure pciinf carry if error +PROC pciinfo FAR + ARG @pointer:word + USES ax,bx,cx,edx,edi + mov ax,0B101h + xor edi,edi + mov edx," PCI" + int 1Ah + jc @@errorpci + cmp dx,04350h + jne @@errorpci + cmp ah,0 + jne @@errorpci + mov di,[@pointer] + mov [(pciinf di).version_major],bh + mov [(pciinf di).version_minor],bl + mov [(pciinf di).types],al + mov [(pciinf di).maxbus],cl + clc + ret +@@errorpci: + stc + ret +endp pciinfo + + +;retourne en DS:%1 les set supporté du processeur par rapport a la struct %0 +PROC setinfo FAR + ARG @pointer:word,@set:word + USES bx,si,di + mov di,[@set] + lea si,[ds:cpu.mmx] + add si,[@pointer] + mov bx,offset @@theset +@@set: + cmp [word ptr cs:bx],0FFFFh + je @@endofset + cmp [byte ptr si],1 + jne @@nextset + push bx + mov bx,[cs:bx] +@@put: + mov al,[cs:bx] + cmp al,0 + je @@enofput + mov [di],al + inc bx + inc di + jmp @@put +@@enofput: + pop bx + @@nextset: + inc bx + inc bx + inc si + jmp @@set + @@endofset: + mov [byte ptr di],0 + ret + +@@theset dw offset @@mmx + dw offset @@mmx2 + dw offset @@sse + dw offset @@sse2 + dw offset @@sse3 + dw offset @@fpu + dw offset @@now3d + dw offset @@now3d2 + dw offset @@htt + dw offset @@apic + dw 0FFFFh + +@@mmx db "MMX ",0 +@@mmx2 db "MMX2 ",0 +@@now3d db "3dNow! ",0 +@@now3d2 db "3dNow Extended! ",0 +@@htt db "HyperThreading",0 +@@sse db "SSE ",0 +@@sse2 db "SSE2 ",0 +@@sse3 db "SSE3 ",0 +@@apic db "APIC ",0 +@@fpu db "FPU ",0 + +endp setinfo + +;retourne en DS:%0 les capacités du processeur +PROC cpuinfo FAR + ARG @pointer:word + USES eax,ebx,ecx,edx,si,di,ds,es + push ds + pop es + mov di,[@pointer] + mov al,0 + mov cx,size cpu + cld + rep stosb + mov di,[@pointer] + call nocpuid ;Test si cpuid est dispo + je @@nocpuidatall + xor eax,eax + cpuid ;Fonction 0 de CPUID + mov [dword ptr (cpu di).vendor],ebx ;Vendeur sur 13 octets + mov [dword ptr (cpu di+4).vendor],edx + mov [dword ptr (cpu di+8).vendor],ecx + mov [byte ptr (cpu di+12).vendor],0 + cmp eax,1 + jb @@nofonc1 + mov eax,1 + cpuid ;Fonction 1 de CPUID + mov ebx,eax ;infos de model + and ebx,1111b + mov [(cpu di).stepping],bl + shr eax,4 + mov ebx,eax + and ebx,1111b + mov [(cpu di).models],bl + shr eax,4 + mov ebx,eax + and ebx,1111b + mov [(cpu di).family],bl + shr eax,4 + mov ebx,eax + and ebx,11b + mov [(cpu di).types],bl + shr eax,2 + mov ebx,eax + and ebx,1111b + mov [(cpu di).emodels],bl + shr eax,4 + mov [(cpu di).efamily],al + mov ebx,edx + and ebx,1 ;infos de jeu d'instruction + setnz [(cpu di).fpu] + mov ebx,edx + and ebx,100000000000000000000000b + setnz [(cpu di).mmx] + mov ebx,edx + and ebx,10000000000000000000000000b + setnz [(cpu di).sse] + mov ebx,edx + and ebx,100000000000000000000000000b + setnz [(cpu di).sse2] + mov ebx,ecx + and ebx,1b + setnz [(cpu di).sse3] + mov ebx,edx + and ebx,10000000000000000000000000000b + setnz [(cpu di).htt] +@@nofonc1: + mov eax,80000000h ;Fonction 80000000 de CPUID + cpuid + cmp eax,80000001h + jb @@nofonc8 + mov eax,80000001h ;Fonction 80000000 de CPUID + cpuid + mov ebx,edx + and ebx,10000000000000000000000b + setnz [(cpu di).mmx2] + mov ebx,edx + and ebx,1000000000000000000000000000000b + setnz [(cpu di).now3d] + mov ebx,edx + and ebx,10000000000000000000000000000000b + setnz [(cpu di).now3d2] + mov ebx,edx + and ebx,1000000000b + setnz [(cpu di).apic] +@@nofonc8: + mov si,offset @@marks + push cs + pop ds +@@search: + mov di,[@pointer] + mov cx,12 + cld + rep cmpsb + jne @@notthegood + cmp cx,0 + jne @@notthegood + mov cl,[si] + inc si + mov di,[@pointer] + cld + rep movsb + mov al,0 + stosb + mov di,[@pointer] + cmp [es:(cpu di).family],15 + jne @@notextended + mov al,[es:(cpu di).efamily] + mov ah,[es:(cpu di).emodels] + mov di,[si+2] + jmp @@searchmodel +@@notextended: + mov al,[es:(cpu di).family] + mov ah,[es:(cpu di).models] + mov di,[si] +@@searchmodel: + cmp [di],ax + jne @@notgoodfamily + mov si,di + inc si + inc si + lea di,[es:cpu.names] + add di,[@pointer] +@@copystr: + mov al,[si] + mov [es:di],al + inc si + inc di + cmp al,0 + jne @@copystr + jmp @@endofsearch +@@notgoodfamily: + inc di +@@nextelement: + inc di + cmp [byte ptr di-1],0 + jne @@nextelement + jmp @@searchmodel +@@notthegood: + inc si + cmp [word ptr si],0FFFFh + jne @@notthegood + inc si + inc si + cmp [word ptr si],0FFFFh + je @@endofsearch + jmp @@search +@@endofsearch: + ret +@@nocpuidatall: + ret + +;tableau avec vendeur taille + chainereelle + pointeur famille + pointeur famille etendue + +@@marks db "GenuineIntel",5,"Intel" + dw @@intelfamily,@@intelfamilye + dw 0FFFFh + + db "AuthenticAMD",3,"Amd" + dw @@amdfamily,@@amdfamilye + dw 0FFFFh + + db "CyrixInstead",5,"Cyrix" + dw @@cyrixfamily,@@cyrixfamilye + dw 0FFFFh + dw 0FFFFh + + +;tableau avec famille modele et chaine 0 + +@@intelfamily: +db 4,0,"486 DX-25/33",0 +db 4,1,"486 DX-50",0 +db 4,2,"486 SX",0 +db 4,3,"486 DX/2",0 +db 4,4,"486 SL",0 +db 4,5,"486 SX/2",0 +db 4,7,"486 DX/2-WB",0 +db 4,8,"486 DX/4",0 +db 4,9,"486 DX/4-WB",0 +db 5,0,"Pentium 60/66 A-step",0 +db 5,1,"Pentium 60/66",0 +db 5,2,"Pentium 75 - 200",0 +db 5,3,"OverDrive PODP5V83",0 +db 5,4,"Pentium MMX",0 +db 5,7,"Mobile Pentium 75-200",0 +db 5,8,"Mobile Pentium MMX",0 +db 6,0,"Pentium Pro A-step",0 +db 6,1,"Pentium Pro",0 +db 6,3,"Pentium II (Klamath)",0 +db 6,5,"Pentium II (Deschutes)",0 +db 6,6,"Mobile Pentium II",0 +db 6,7,"Pentium III (Katmai)",0 +db 6,8,"Pentium III (Coppermine)",0 +db 6,9,"Mobile Pentium III",0 +db 6,10,"Pentium III (0.18 µm)",0 +db 6,11,"Pentium III (0.13 µm)",0 +db 7,0,"Itanium (IA-64)",0 +db 0FFh,0FFh,"Inconnu",0 + +@@intelfamilye: +db 0,0,"Pentium IV (0.18 µm)",0 +db 0,1,"Pentium IV (0.18 µm)",0 +db 0,2,"Pentium IV (0.13 µm)",0 +db 0,3,"Pentium IV (0.09 µm)",0 +db 1,0,"Itanium 2 (IA-64)",0 +db 0FFh,0FFh,"Inconnu",0 + +@@amdfamily: +db 4,3,"486 DX/2",0 +db 4,7,"486 DX/2-WB",0 +db 4,8,"486 DX/4",0 +db 4,9,"486 DX/4-WB",0 +db 4,14,"Am5x86-WT",0 +db 4,15,"Am5x86-WB",0 +db 5,0,"K5/SSA5",0 +db 5,1,"K5 (PR120/133)",0 +db 5,2,"K5 (PR166)",0 +db 5,3,"K5 (PR200)",0 +db 5,6,"K6 (0.30 µm)",0 +db 5,7,"K6 (0.25 µm)",0 +db 5,8,"K6-2",0 +db 5,9,"K6-3",0 +db 5,13,"K6-2+/K6-III+ (0.18 µm)",0 +db 6,0,"Athlon (25 µm)",0 +db 6,1,"Athlon (25 µm)",0 +db 6,2,"Athlon (18 µm)",0 +db 6,3,"Duron",0 +db 6,4,"Athlon (Thunderbird)",0 +db 6,6,"Athlon (Palamino)",0 +db 6,7,"Duron (Morgan)",0 +db 6,8,"Athlon (Thoroughbred)",0 +db 6,10,"Athlon (Barton)",0 +db 0FFh,0FFh,"Inconnu",0 + +@@amdfamilye: +db 0,4,"Athlon 64",0 +db 0,5,"Athlon 64 FX/Opteron",0 +db 0FFh,0FFh,"Inconnu",0 + +@@cyrixfamily: +db 4,4,"MediaGX",0 +db 5,2,"6x86/6x86L",0 +db 5,4,"MediaGX MMX Enhanced",0 +db 6,0,"MII (6x86MX)",0 +db 6,5,"VIA Cyrix M2 core",0 +db 6,6,"WinChip C5A",0 +db 6,7,"WinChip C5B/WinChip C5C",0 +db 6,8,"WinChip C5N",0 +db 6,9,"WinChip C5XL/WinChip C5P",0 +db 0FFh,0FFh,"Inconnu",0 + +@@cyrixfamilye: +db 0FFh,0FFh,"Inconnu",0 + +endp cpuinfo + +;Test si CPUID est supporté oui=not Equal +nocpuid: + pushfd + pop eax + xor eax,00200000h + push eax + popfd + pushfd + pop eax + cmp eax,ebx + ret + + diff --git a/lib/str0.asm b/lib/str0.asm new file mode 100644 index 0000000..2e6aefa --- /dev/null +++ b/lib/str0.asm @@ -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 + diff --git a/lib/video.asm b/lib/video.asm new file mode 100644 index 0000000..f1b22d6 --- /dev/null +++ b/lib/video.asm @@ -0,0 +1,891 @@ +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,offset imports,,> + +exporting +declare print +declare showdate +declare showtime +declare showname +declare showattr +declare showsize +declare showspace +declare showint +declare showsigned +declare showhex +declare showbin +declare showbcd +declare showstring +declare showstring0 +declare showintr +declare showintl +declare showchar +ende + +importing +use VIDEO,addline +use VIDEO,setcolor +use VIDEO,getxy +use VIDEO,setxy +use VIDEO,setvideomode +use VIDEO,setfont +use VIDEO,clearscreen +use VIDEO,enablescroll +use VIDEO,disablescroll +use VIDEO,showchars +use VIDEO,savestate +use VIDEO,restorestate +endi + + +;================PRINT============== +;Affiche la chaine %0 en utilisant les parametres de formatage %x....%x +;-> %0 %x +;<- +;=================================== +PROC print FAR + ARG @@pointer:word + push ax bx cx si di + xor di,di + mov si,[@@pointer] +@@strinaize0: + mov cl,[si] + cmp cl,0 + je @@no0 + cmp cl,'%' + je @@special + cmp cl,'\' + je @@special2 +@@showit: + xor ch,ch + call [cs:showchars],cx,0FFFFh + inc si + jmp @@strinaize0 +@@special: + cmp [byte ptr si+1],'%' + jne @@notshowit + inc si + jmp @@showit +@@notshowit: + mov cl,[byte ptr si+1] + cmp cl,'c' + je @@showchars + cmp cl,'u' + je @@showint + cmp cl,'v' + je @@showfixint + cmp cl,'w' + je @@showintr + cmp cl,'i' + je @@showsigned + cmp cl,'h' + je @@showhex + cmp cl,'b' + je @@showbin + cmp cl,'s' + je @@showstring + cmp cl,'0' + je @@showstring0 + cmp cl,'y' + je @@showbcd + cmp cl,'z' + je @@showsize + cmp cl,'a' + je @@showattr + cmp cl,'n' + je @@showname + cmp cl,'t' + je @@showtime + cmp cl,'d' + je @@showdate + clc + jmp @@no0 + +@@showchars: + cmp [byte ptr si+2],'M' + je @@showmultchar + call [cs:showchars],[word ptr @@pointer+di+2],0FFFFh + add si,2 + add di,2 + jmp @@strinaize0 +@@showmultchar: + mov cx,[offset @@pointer+di+2+2] + cmp cx,0 + je @@nextfunc +@@showcharsx: + call [cs:showchars],[word ptr @@pointer+di+2],0FFFFh + dec cx + jnz @@showcharsx +@@nextfunc: + add si,3 + add di,4 + jmp @@strinaize0 + +@@showint: + call showint,[dword ptr @@pointer+di+2] + add si,2 + add di,4 + jmp @@strinaize0 + +@@showfixint: + call showintl,[word ptr @@pointer+di+6],[dword ptr @@pointer+di+2] + add di,6 + add si,2 + jmp @@strinaize0 + +@@showintr: + call showintr,[word ptr @@pointer+di+6],[dword ptr @@pointer+di+2] + add di,6 + add si,2 + jmp @@strinaize0 + +@@showsigned: + call @@Chosesize + call showsigned + jmp @@strinaize0 + +@@showhex: + call @@Chosesize + call showhex + jmp @@strinaize0 + +@@showbin: + call @@Chosesize + call showbin + jmp @@strinaize0 + +@@showstring: + cmp [byte ptr si+2],'P' + je @@showstring@@pointer + call showstring,[word ptr @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 +@@showstring@@pointer: + push ds + mov ds,[offset @@pointer+di+2+2] + call showstring,[word ptr @@pointer+di+2] + add si,3 + add di,4 + pop ds + jmp @@strinaize0 + +@@showstring0: + cmp [byte ptr si+2],'P' + je @@showstring0@@pointer + call showstring0,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 +@@showstring0@@pointer: + push ds + mov ds,[offset @@pointer+di+2+2] + call showstring0,[word ptr offset @@pointer+di+2] + add si,3 + add di,4 + pop ds + jmp @@strinaize0 + +@@showbcd: + call @@Chosesize + call showbcd + jmp @@strinaize0 + +@@showsize: + call showsize,[dword ptr offset @@pointer+di+2] + add si,2 + add di,4 + jmp @@strinaize0 + +@@showattr: + call showattr,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@showname: + call showname,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@showtime: + call showtime,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@showdate: + call showdate,[word ptr offset @@pointer+di+2] + add si,2 + add di,2 + jmp @@strinaize0 + +@@Chosesize: + pop cx + push [dword ptr offset @@pointer+di+2] + add di,4 + cmp [byte ptr si+2],'B' + je @@byte + cmp [byte ptr si+2],'W' + je @@word + cmp [byte ptr si+2],'D' + je @@dword + dec si + +@@word: + push 16 + add si,3 + push cx + retn + +@@byte: + push 8 + add si,3 + push cx + retn + +@@dword: + push 32 + add si,3 + push cx + retn + +@@special2: + cmp [byte ptr si+1],'\' + jne @@notshowit2 + inc si + jmp @@showit +@@notshowit2: + mov cl,[byte ptr si+1] + cmp cl,'l' + je @@showline + cmp cl,'g' + je @@goto + cmp cl,'h' + je @@gotox + cmp cl,'c' + je @@color + cmp cl,'m' + je @@setvideomode + cmp cl,'e' + je @@clearscreen + cmp cl,'s' + je @@savestate + cmp cl,'r' + je @@restorestate + cmp cl,'i' + je @@enablescroll + cmp cl,'j' + je @@disablescroll + cmp cl,'f' + je @@setfont + clc + jmp @@no0 + +@@color: + mov al,[si+2] + sub al,'0' + shl al,4 + add al,[si+3] + sub al,'0' + xor ah,ah + call [cs:setcolor],ax + add si,4 + jmp @@strinaize0 + +@@gotox: + mov bh,[si+2] + sub bh,'0' + mov bl,bh + shl bl,3 + add bl,bh + add bl,bh + add bl,[si+3] + sub bl,'0' + xor bh,bh + call [cs:getxy] + xor ah,ah + call [cs:setxy],bx,ax + add si,4 + jmp @@strinaize0 + +@@setvideomode: + mov ah,[si+2] + sub ah,'0' + mov al,ah + shl al,3 + add al,ah + add al,ah + add al,[si+3] + sub al,'0' + xor ah,ah + call [cs:setvideomode],ax + add si,4 + jmp @@strinaize0 + +@@setfont: + mov ah,[si+2] + sub ah,'0' + mov al,ah + shl al,3 + add al,ah + add al,ah + add al,[si+3] + sub al,'0' + xor ah,ah + call [cs:setfont],ax + add si,4 + jmp @@strinaize0 + +@@showline: + call [cs:addline] + add si,2 + jmp @@strinaize0 + +@@clearscreen: + call [cs:clearscreen] + add si,2 + jmp @@strinaize0 + +@@savestate: + call [cs:savestate] + add si,2 + jmp @@strinaize0 + +@@restorestate: + call [cs:restorestate] + add si,2 + jmp @@strinaize0 + +@@enablescroll: + call [cs:enablescroll] + add si,2 + jmp @@strinaize0 + +@@disablescroll: + call [cs:disablescroll] + add si,2 + jmp @@strinaize0 + +@@goto: + mov ah,[si+2] + sub ah,'0' + mov al,ah + shl al,3 + add al,ah + add al,ah + add al,[si+3] + sub al,'0' + xor ah,ah + ; + mov bh,[si+5] + sub bh,'0' + mov bl,bh + shl bl,3 + add bl,bh + add bl,bh + add bl,[si+6] + sub bl,'0' + xor bh,bh + call [cs:setxy],ax,bx + add si,7 + jmp @@strinaize0 + +@@no0: + add di,bp + mov ax,[ss:bp] ;BP + mov bx,[ss:bp+2] ;IP + mov cx,[ss:bp+4] ;CS + mov [ss:di],ax + mov [ss:di+2],bx + mov [ss:di+4],cx + mov bp,di + pop di si cx bx ax + mov sp,bp + ret +ENDP print + + +;================SHOWDATE============== +;Affiche la date contenu en %0 +;-> %0 +;<- +;====================================== +PROC showdate FAR + ARG @dates:word + USES edx + xor edx,edx + mov dx,[@dates] + and dx,11111b + call showintl,2,edx + call [cs:showchars],'/',0FFFFh + mov dx,[@dates] + shr dx,5 + and dx,111b + call showintl,2,edx + call [cs:showchars],'/',0FFFFh + mov dx,[@dates] + shr dx,8 + and dx,11111111b + add dx,1956 + call showintl,2,edx + ret +ENDP showdate + +;================SHOWTIME============== +;Affiche l'heure contenu en %0 +;-> %0 +;<- +;====================================== +PROC showtime FAR + ARG @times:word + USES edx + xor edx,edx + mov dx,[@times] + shr dx,11 + and dx,11111b + call showintl,2,edx + call [cs:showchars],':',0FFFFh + mov dx,[@times] + shr dx,5 + and dx,111111b + call showintl,2,edx + call [cs:showchars],':',0FFFFh + mov dx,[@times] + and dx,11111b + shl dx,1 + call showintl,2,edx + ret +ENDP showtime + +;================SHOWNAME============== +;Affiche le nom pointé par ds:%0 +;-> ds:%0 +;<- +;====================================== +PROC showname FAR + ARG @thename:word + USES cx,si + mov si,[@thename] + xor cx,cx +@@showthename: + call [cs:showchars],[word ptr ds:si],0FFFFh + inc si + inc cx + cmp cx,8 + jne @@suiteaname + call [cs:showchars],' ',0FFFFh +@@suiteaname: + cmp cx,8+3 + jb @@showthename + ret +ENDP showname + +;================SHOWATTR============== +;Affiche les attributs spécifié par %0 +;-> %0 +;<- +;====================================== +PROC showattr FAR + ARG @attr:word + push 0FFFFh + test [@attr],00000001b + je @@noreadonly + push 'L' + jmp @@readonly +@@noreadonly: + push '-' +@@readonly: + call [cs:showchars] + push 0FFFFh + test [@attr],00000010b + je @@nohidden + push 'C' + jmp @@hidden +@@nohidden: + push '-' +@@hidden: + call [cs:showchars] + push 0FFFFh + test [@attr],00000100b + je @@nosystem + push 'S' + jmp @@system +@@nosystem: + push '-' +@@system: + call [cs:showchars] + push 0FFFFh + test [@attr],00100000b + je @@noarchive + push 'A' + jmp @@archive +@@noarchive: + push '-' +@@archive: + call [cs:showchars] + push 0FFFFh + test [@attr],00010000b + je @@nodirectory + push 'R' + jmp @@directory +@@nodirectory: + push '-' +@@directory: + call [cs:showchars] + ret +ENDP showattr + +;================SHOWSIZE============== +;Affiche le nom pointé par %0 +;-> %0 +;<- +;====================================== +PROC showsize FAR + ARG @thesize:dword + USES edx,ds + push cs + pop ds + mov edx,[@thesize] + cmp edx,1073741824 + ja @@giga + cmp edx,1048576*9 + ja @@mega + cmp edx,1024*9 + ja @@kilo + call showintr,4,edx + call showstring0,offset unit + jmp @@finsize +@@kilo: + shr edx,10 + call showintr,4,edx + call showstring0,offset unitkilo + jmp @@finsize +@@mega: + shr edx,20 + call showintr,4,edx + call showstring0,offset unitmega + jmp @@finsize +@@giga: + shr edx,30 + call showintr,4,edx + call showstring0,offset unitgiga +@@finsize: + ret + +unit db ' o ',0 +unitkilo db ' ko',0 +unitmega db ' mo',0 +unitgiga db ' go',0 +ENDP showsize + +;==========SHOWSPACE=========== +;met un espace aprés le curseur +;-> +;<- +;============================== +PROC showspace FAR + call [cs:showchars],' ',0FFFFh + clc + ret +ENDP showspace + + +;==========SHOWINT=========== +;Affiche un entier %0 aprés le curseur +;-> %0 +;<- +;============================ +PROC showint FAR + ARG @integer:dword + USES eax,bx,cx,edx,esi + xor cx,cx + mov eax,[@integer] + mov esi,10 + mov bx,offset showbuffer+27 +@@decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov [cs:bx],dl + dec bx + cmp ax,0 + jne @@decint + mov ax,cx +@@showinteger: + inc bx + mov cl,[cs:bx] + call [cs:showchars],cx,0FFFFh + dec ax + jnz @@showinteger + ret + +showbuffer db 50 dup (0FFh) +ENDP showint + +;==========SHOWINTL=========== +;Affiche un entier %0 aprés le curseur de taille %1 caractère centré a gauche +;-> %0 un entier % taille en caractères +;<- +;=============================== +PROC showintl FAR + ARG @sizeofint:word,@integer:dword + USES eax,bx,cx,edx,esi,di + mov di,[@sizeofint] + xor cx,cx + mov eax,[@integer] + mov esi,10 + mov bx,offset showbuffer+27 +@@decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov [cs:bx],dl + dec bx + cmp cx,di + jae @@nomuch + cmp ax,0 + jne @@decint + mov ax,di + xchg cx,di + sub cx,di +@@rego: + mov [byte ptr cs:bx],'0' + dec bx + dec cx + jnz @@rego + jmp @@finishim +@@nomuch: + mov ax,di +@@finishim: +@@showinteger: + inc bx + mov cl,[cs:bx] + call [cs:showchars],cx,0FFFFh + dec ax + jnz @@showinteger + ret +ENDP showintl + +;==========SHOWINTR=========== +;Affiche un entier %0 aprés le curseur de taille %1 caractère centré a droite +;-> %0 un entier % taille en caractères +;<- +;=============================== +PROC showintr FAR + ARG @sizeofint:word,@integer:dword + USES eax,bx,cx,edx,esi,di + mov di,[@sizeofint] + xor cx,cx + mov eax,[@integer] + mov esi,10 + mov bx,offset showbuffer+27 +@@decint: + xor edx,edx + div esi + add dl,'0' + inc cx + mov [cs:bx],dl + dec bx + cmp cx,di + jae @@nomuch + cmp ax,0 + jne @@decint + mov ax,di + xchg cx,di + sub cx,di +@@rego: + mov [byte ptr cs:bx],' ' + dec bx + dec cx + jnz @@rego + jmp @@finishim +@@nomuch: + mov ax,di +@@finishim: +@@showinteger: + inc bx + mov cl,[cs:bx] + call [cs:showchars],cx,0FFFFh + dec ax + jnz @@showinteger + ret +ENDP showintr + +;==========SHOWSIGNED=========== +;Affiche un entier %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;=============================== +PROC showsigned FAR + ARG @sizeofint:word,@integer:dword=taille + USES ebx,cx,edx + mov ebx,[@integer] + mov cx,[@sizeofint] + xor edx,edx + cmp cx,1 + ja @@signed16 + mov dl,bl + cmp dl,7Fh + jbe @@notsigned + neg dl + jmp @@showminus +@@signed16: + cmp cx,2 + ja @@signed32 + mov dx,bx + cmp dx,7FFFh + jbe @@notsigned + neg dx + jmp @@showminus +@@signed32: + mov edx,ebx + cmp edx,7FFFFFFFh + jbe @@notsigned + neg edx +@@showminus: + call [cs:showchars],'-',0FFFFh +@@notsigned: + call showint,edx + ret +ENDP showsigned + +;==========SHOWHEX=========== +;Affiche un nombre hexadécimal %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;============================ +PROC showhex FAR + ARG @sizeofint:word,@integer:dword=taille + USES ax,bx,cx,edx + mov edx,[@integer] + mov cx,[@sizeofint] + mov ax,cx + shr ax,2 + sub cx,32 + neg cx + shl edx,cl +@@Hexaize: + rol edx,4 + mov bx,dx + and bx,0fh + mov cl,[cs:bx+offset Tab] + call [cs:showchars],cx,0FFFFh + dec al + jnz @@Hexaize + ret + +Tab db '0123456789ABCDEF' +ENDP showhex + +;==========SHOWBIN=========== +;Affiche un nombre binaire %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;============================ +PROC showbin FAR + ARG @sizeofint:word,@integer:dword=taille + USES ax,cx,edx + mov edx,[@integer] + mov cx,[@sizeofint] + sub cx,32 + neg cx + shl edx,cl + mov ax,[@sizeofint] +@@binaize: + rol edx,1 + mov cl,'0' + adc cl,0 + call [cs:showchars],cx,0FFFFh + dec al + jnz @@binaize + ret +ENDP showbin + +;==========SHOWBCD=========== +;Affiche un nombre en BCD %0 de taille %1 aprés le curseur +;-> %0 un entier, %1 la taille +;<- +;============================ +PROC showbcd FAR + ARG @sizeofint:word,@integer:dword + USES ax,cx,edx + mov edx,[@integer] + mov ax,[@sizeofint] + mov cx,ax + shr ax,2 + sub cx,32 + neg cx + shl edx,cl +@@BCDaize: + rol edx,4 + mov cl,dl + and cl,0fh + add cl,'0' + call [cs:showchars],cx,0FFFFh + dec al + jnz @@BCDaize + ret +ENDP showbcd + +;==========SHOWSTRING=========== +;Affiche une chaine de caractère pointée par ds:%1 aprés le curseur +;-> ds:%1 pointeur chaine type pascal +;<- +;=============================== +PROC showstring FAR + ARG @pointer:word + USES bx,si + mov si,[@pointer] + mov bl,[si] +@@strinaize: + inc si + call [cs:showchars],[word ptr si],0FFFFh + dec bl + jnz @@strinaize + ret +ENDP showstring + +;==========showchars=========== +;Affiche un caractère %0 aprés le curseur +;-> %0 caractère +;<- +;=============================== +PROC showchar FAR + ARG @pointer:word + call [cs:showchars],[@pointer],0FFFFh + ret +ENDP showchar + +;==========SHOWSTRING0=========== +;Affiche une chaine de caractère pointée par ds:%1 aprés le curseur +;-> ds:%1 pointeur chaine type zéro terminal +;<- +;================================ +PROC showstring0 FAR + ARG @pointer:word + USES cx,si + mov si,[@pointer] +@@strinaize0: + mov cl,[si] + cmp cl,0 + je @@no0 + call [cs:showchars],cx,0FFFFh + inc si + jmp @@strinaize0 +@@no0: + ret +ENDP showstring0 +