From 8d0fd221346ea090ebc1ae0e955bb95e6f4e12c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Hord=C3=A9?= Date: Sat, 31 Mar 2007 18:50:36 +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 --- noyau/8237.asm | 266 ++++++++ noyau/8259a.asm | 415 ++++++++++++ noyau/MAKEFILE | 38 ++ noyau/boot.asm | 216 +++++++ noyau/clavier.asm | 261 ++++++++ noyau/disque.asm | 1099 +++++++++++++++++++++++++++++++ noyau/font/2_hebrew.fnt | Bin 0 -> 4096 bytes noyau/font/8x11snsf.fnt | Bin 0 -> 4096 bytes noyau/font/ad&d.fnt | Bin 0 -> 8192 bytes noyau/font/antique.fnt | Bin 0 -> 8192 bytes noyau/font/applicat.fnt | Bin 0 -> 3584 bytes noyau/font/backward.fnt | Bin 0 -> 4096 bytes noyau/font/bigserif.fnt | Bin 0 -> 4096 bytes noyau/font/blcksnsf.fnt | Bin 0 -> 4096 bytes noyau/font/block.fnt | Bin 0 -> 4096 bytes noyau/font/bold.fnt | Bin 0 -> 4096 bytes noyau/font/breeze.fnt | Bin 0 -> 4096 bytes noyau/font/broadway.fnt | Bin 0 -> 4096 bytes noyau/font/comp.fnt | Bin 0 -> 4096 bytes noyau/font/computer.fnt | Bin 0 -> 8192 bytes noyau/font/courier.fnt | Bin 0 -> 4096 bytes noyau/font/cyrillic.fnt | Bin 0 -> 4096 bytes noyau/font/dblmtx14.fnt | Bin 0 -> 3584 bytes noyau/font/dblmtx16.fnt | Bin 0 -> 4096 bytes noyau/font/finnish.fnt | Bin 0 -> 4096 bytes noyau/font/font1!!!.dat | Bin 0 -> 4096 bytes noyau/font/font2!!!.dat | Bin 0 -> 4096 bytes noyau/font/font3!!!.dat | Bin 0 -> 4096 bytes noyau/font/font4!!!.dat | Bin 0 -> 4096 bytes noyau/font/frankfrt.fnt | Bin 0 -> 8192 bytes noyau/font/fresno.fnt | Bin 0 -> 8192 bytes noyau/font/future.fnt | Bin 0 -> 4096 bytes noyau/font/greek.fnt | Bin 0 -> 4096 bytes noyau/font/hebrew.fnt | Bin 0 -> 4096 bytes noyau/font/hollow.fnt | Bin 0 -> 4096 bytes noyau/font/hylas.fnt | Bin 0 -> 4096 bytes noyau/font/inverted.fnt | Bin 0 -> 4096 bytes noyau/font/italic.fnt | Bin 0 -> 8192 bytes noyau/font/italics.fnt | Bin 0 -> 4096 bytes noyau/font/itt.fnt | Bin 0 -> 4096 bytes noyau/font/lcd.fnt | Bin 0 -> 8192 bytes noyau/font/mechanix.fnt | Bin 0 -> 4096 bytes noyau/font/medieval.fnt | Bin 0 -> 8192 bytes noyau/font/modern-1.fnt | Bin 0 -> 4096 bytes noyau/font/norway.fnt | Bin 0 -> 4096 bytes noyau/font/norway2.fnt | Bin 0 -> 4096 bytes noyau/font/old8x8.fnt | Bin 0 -> 2048 bytes noyau/font/oldeng.fnt | Bin 0 -> 8192 bytes noyau/font/roman.fnt | Bin 0 -> 4096 bytes noyau/font/sanserif.fnt | Bin 0 -> 4096 bytes noyau/font/script.fnt | Bin 0 -> 8192 bytes noyau/font/standard.fnt | Bin 0 -> 8192 bytes noyau/font/stretch.fnt | Bin 0 -> 4096 bytes noyau/font/thai.fnt | Bin 0 -> 4096 bytes noyau/font/thin.fnt | Bin 0 -> 4096 bytes noyau/heure.asm | 81 +++ noyau/horloge.asm | 32 + noyau/manette.asm | 298 +++++++++ noyau/mcb.asm | 749 ++++++++++++++++++++++ noyau/port.asm | 699 ++++++++++++++++++++ noyau/souris.asm | 327 ++++++++++ noyau/systeme.asm | 297 +++++++++ noyau/systeme.ini | 9 + noyau/video.asm | 1352 +++++++++++++++++++++++++++++++++++++++ 64 files changed, 6139 insertions(+) create mode 100644 noyau/8237.asm create mode 100644 noyau/8259a.asm create mode 100644 noyau/MAKEFILE create mode 100644 noyau/boot.asm create mode 100644 noyau/clavier.asm create mode 100644 noyau/disque.asm create mode 100644 noyau/font/2_hebrew.fnt create mode 100644 noyau/font/8x11snsf.fnt create mode 100644 noyau/font/ad&d.fnt create mode 100644 noyau/font/antique.fnt create mode 100644 noyau/font/applicat.fnt create mode 100644 noyau/font/backward.fnt create mode 100644 noyau/font/bigserif.fnt create mode 100644 noyau/font/blcksnsf.fnt create mode 100644 noyau/font/block.fnt create mode 100644 noyau/font/bold.fnt create mode 100644 noyau/font/breeze.fnt create mode 100644 noyau/font/broadway.fnt create mode 100644 noyau/font/comp.fnt create mode 100644 noyau/font/computer.fnt create mode 100644 noyau/font/courier.fnt create mode 100644 noyau/font/cyrillic.fnt create mode 100644 noyau/font/dblmtx14.fnt create mode 100644 noyau/font/dblmtx16.fnt create mode 100644 noyau/font/finnish.fnt create mode 100644 noyau/font/font1!!!.dat create mode 100644 noyau/font/font2!!!.dat create mode 100644 noyau/font/font3!!!.dat create mode 100644 noyau/font/font4!!!.dat create mode 100644 noyau/font/frankfrt.fnt create mode 100644 noyau/font/fresno.fnt create mode 100644 noyau/font/future.fnt create mode 100644 noyau/font/greek.fnt create mode 100644 noyau/font/hebrew.fnt create mode 100644 noyau/font/hollow.fnt create mode 100644 noyau/font/hylas.fnt create mode 100644 noyau/font/inverted.fnt create mode 100644 noyau/font/italic.fnt create mode 100644 noyau/font/italics.fnt create mode 100644 noyau/font/itt.fnt create mode 100644 noyau/font/lcd.fnt create mode 100644 noyau/font/mechanix.fnt create mode 100644 noyau/font/medieval.fnt create mode 100644 noyau/font/modern-1.fnt create mode 100644 noyau/font/norway.fnt create mode 100644 noyau/font/norway2.fnt create mode 100644 noyau/font/old8x8.fnt create mode 100644 noyau/font/oldeng.fnt create mode 100644 noyau/font/roman.fnt create mode 100644 noyau/font/sanserif.fnt create mode 100644 noyau/font/script.fnt create mode 100644 noyau/font/standard.fnt create mode 100644 noyau/font/stretch.fnt create mode 100644 noyau/font/thai.fnt create mode 100644 noyau/font/thin.fnt create mode 100644 noyau/heure.asm create mode 100644 noyau/horloge.asm create mode 100644 noyau/manette.asm create mode 100644 noyau/mcb.asm create mode 100644 noyau/port.asm create mode 100644 noyau/souris.asm create mode 100644 noyau/systeme.asm create mode 100644 noyau/systeme.ini create mode 100644 noyau/video.asm diff --git a/noyau/8237.asm b/noyau/8237.asm new file mode 100644 index 0000000..c03dcb1 --- /dev/null +++ b/noyau/8237.asm @@ -0,0 +1,266 @@ +;**************************************************************** +; * +; Periph‚rique : DMA * +; Plages Entr‚es-Sorties : 0000-000F * +; 00C0-00DF * +; 0080-0090 * +; (0094-009F) * +; Plages M‚moires : AUCUNES * +; * +DmaRead equ 044h ;I/O to memory, no autoinit, increment, single mode +DmaWrite equ 048h ;Memory to I/O, no autoinit, increment, single mode + +;Lecture des bits du registre d'‚tat (08, D0 ) +STATUS_REQ3 = 80h ;Bit actif: le canal DMA concern‚ +STATUS_REQ2 = 40h ;re‡oit une requˆte DMA +STATUS_REQ1 = 20h ;Request +STATUS_REQ0 = 10h +STATUS_TC3 = 08h ;Bit actif: Un transfert DMA a ‚t‚ +STATUS_TC2 = 04h ;ex‚cut‚ depuis la derniŠre lecture +STATUS_TC1 = 02h ;du registre d'‚tat. +STATUS_TC0 = 01h ;Terminal Count + +;Ecriture des bits du registre de commande (08, D0) +COMMAND_DACKLEVEL = 80h ;Bit 7 actif: ligne DMA Acknowledge HIGH active +COMMAND_DREQLEVEL = 40h ;Bit 6 actif: ligne REQ Acknowledge LOW active +COMMAND_EXTWRITE = 20h ;Bit 5 actif: EXTENDED Write,sinon LATE Write +COMMAND_FIXEDPRI = 10h ;Bit 4 actif: priorit‚ constante +COMMAND_COMPRESS = 08h ;Bit 3 actif: compression +COMMAND_INACTIVE = 04h ;Bit 2 actif: contr“leur d‚sactiv‚ +COMMAND_ADH0 = 02h ;Bit 1 actif: Adress Hold pour canal 0/4 d‚sactiv‚ +COMMAND_MEM2MEM = 01h ;Bit 0 actif: m‚moire/m‚moire, sinon m‚moire/p‚riph‚rie + +;Ecriture des bits du registre de requˆte ( 09, D2 ) +REQUEST_RESERVED = 0F8h ;R‚glage des bits r‚serv‚s =0 +REQUEST_SET = 04h ;D‚finir requˆte DMA +REQUEST_CLR = 00h ;Supprimer requˆte DMA +REQUEST_MSK = 03h ;Indiquer le canal dans les deux bits du bas + +;Ecriture des bits du registre de masquage de canal ( 0A, D4 ) +CHANNEL_RESERVED = 0F8h ;R‚glage des bits r‚serv‚s =0 +CHANNEL_SET = 04h ;Masquer/verrouiller canal DMA +CHANNEL_CLR = 00h ;Lib‚rer canal DMA +CHANNEL_MSK = 03h ;Indiquer le canal dans les deux bits du bas + +;Ecriture des bits du registre de mode (0B,D6) +MODE_DEMAND = 00h ;Transf‚rer … la demande +MODE_SINGLE = 40h ;Transf‚rer valeurs uniques +MODE_BLOCK = 80h ;Transf‚rer en bloc +MODE_CASCADE = 0C0h ;Transf‚rer en cascade +MODE_DECREMENT = 20h ;D‚cr‚menter +MODE_AUTOINIT = 10h ;Autoinitialisation vers la fin +MODE_VERIFY = 00h ;V‚rifier +MODE_WRITE = 04h ;Ecrire dans la m‚moire +MODE_READ = 08h ;Lire depuis la m‚moire +MODE_INVALID = 0Ch ;Incorrect +MODE_CHANNELMSK = 03h ;Indiquer le canal dans les deux bits du bas + +;Ports du DMA esclave + +DmaStatusS dw 08h ;R SLAVE Registre d'‚tat +DmaCommandS dw 08h ;W SLAVE Registre de commande +DmaRequestS dw 09h ;W SLAVE Ex‚cuter requˆte DMA +DmachMaskS dw 0ah ;W SLAVE Masquer canaux +DmaModeS dw 0bh ;W SLAVE Mode de transfert +DmaFlipFlopS dw 0ch ;W SLAVE Flipflop adr/compteur +DmaTempS dw 0dh ;R SLAVE Reset du contr“leur +DmaClearS dw 0dh ;R SLAVE Registre temporaire +DmaMaskClrS dw 0eh ;R SLAVE Lib‚rer canaux +DmaMaskS dw 0fh ;R SLAVE Masquer canaux + +;Ports du DMA esclave + +DmaStatusM dw 0D0h ;R MASTER Registre d'‚tat +DmaCommandM dw 0D0h ;W MASTER Registre de commande +DmaRequestM dw 0D2h ;W MASTER Ex‚cuter requˆte DMA +DmaMaskM dw 0D4h ;W MASTER Masquer canaux +DmaModeM dw 0D6h ;W MASTER Mode de transfert +DmaFlipFlopM dw 0D8h ;W MASTER Flipflop adr/compteur +DmaTempM dw 0DAh ;R MASTER Reset du contr“leur +DmaClearM dw 0DAh ;R MASTER Registre temporaire +DmaMaskClrM dw 0DCh ;R MASTER Lib‚rer canaux +DmaMaskM2 dw 0DEh ;R MASTER Masquer canaux + +DmaAdress db 00h ;DMA address register 0 + db 002h ;DMA address register 1 + db 004h ;DMA address register 2 + db 006h ;DMA address register 3 + db 0c0h ;DMA address register 4 + db 0c4h ;DMA address register 5 + db 0c8h ;DMA address register 6 + db 0cch ;DMA address register 7 + +DmaCount db 001h ;DMA count registers 0 + db 003h ;DMA count registers 1 + db 005h ;DMA count registers 2 + db 007h ;DMA count registers 3 + db 0c2h ;DMA count registers 4 + db 0c6h ;DMA count registers 5 + db 0cah ;DMA count registers 6 + db 0ceh ;DMA count registers 7 + +DmaPage db 087h ;DMA page registers 0 + db 083h ;DMA page registers 1 + db 081h ;DMA page registers 2 + db 082h ;DMA page registers 3 + db 08fh ;DMA page registers 4 + db 08bh ;DMA page registers 5 + db 089h ;DMA page registers 6 + db 08ah ;DMA page registers 7 + +;verouille le canal AL +DisableDma: + push ax dx + cmp al, 4 + jae MasterDisableDma + mov dx, DmaMaskS + or al, 00000100b + out dx, al + jmp EndDisableDma +MasterDisableDma: + mov dx, DmaMaskS + and al, 00000011b + or al, 00000100b + out dx, al +EndDisableDma: + pop dx ax + ret + +;déverouille le canal AL +EnableDma: + push ax dx + cmp al, 4 + jae MasterDisableDma + mov dx, DmaMaskS + out dx, al + jmp EndEnableDma +MasterEnableDma: + mov dx, DmaMaskS + and al, 00000011b + out dx, al +EndEnableDma: + pop dx ax + ret + +;Efface le FlipFlop canal AL +ClrDmaFlipFlop: + push ax dx + cmp al, 4 + jae MasterClrFlipFlopDma + mov dx,DmaFlipFlopS + xor ax, ax + out dx, al + jmp EndClrFlipFlopDma +MasterClrFlipFlopDma: + mov dx,DmaFlipFlopM + xor ax, ax + out dx, al +EndClrFlipFlopDma: + pop dx ax + ret + +;Met le mode du canal al à ah +SetDmaMode: + push ax dx + cmp al, 4 + jae MasterSetDmaMode + mov dx,DmaModeS + or al, ah + out dx, al + jmp EndSetDmaMode +MasterSetDmaMode: + mov dx,DmaModeM + and al, 00000011b + or al, ah + out dx, al +EndSetDmaMode: + pop dx ax + ret + + +;Met le page du canal al a ah +SetDmaPage: + push ax bx dx si + cmp al, 4 + jae MasterSetDmaPage + mov si, offset DmaPage + xor dh, dh + xor bh, bh + mov bl, al + mov dl, cs:[si+bx] + xchg al, ah + out dx, al + jmp EndSetDmaPage +MasterSetDmaPage: +EndSetDmaPage: + pop si dx bx ax + ret + +;Met l'adresse du canal al a DS:BX +SetDmaAdress: + push ax bx cx dx si + push ax + mov ax, ds + and ax, 0000111111111111b + shl ax,4 + add bx, ax + mov ax, ds + and ax, 1111000000000000b + shr ax, 4 + mov cx,ax + pop ax + push ax + add ax,cx + call SetDmaPage + pop ax + call ClrDmaFlipFlop + mov si, offset DmaAdress + xor dh, dh + push bx + xor bh, bh + mov bl, al + mov dl, byte ptr cs:[si+bx] + pop bx + cmp al, 4 + jae MasterSetDmaAddress + mov al, bh + out dx, al + mov al, bl + out dx, al + jmp EndSetDmaAddress +MasterSetDmaAddress: + mov al, bh + out dx, al + call ClrDmaFlipFlop + mov al, bl + out dx, al +EndSetDmaAddress: + pop si dx cx bx ax + ret + +;Spécifie au controleur DMA le nombre d'octets à transférer dans CX +SetDmaCount: + push ax bx dx si + call ClrDmaFlipFlop + mov si, offset DmaCount + xor dh, dh + xor bh, bh + mov bl, al + mov dl, byte ptr cs:[si+bx] + cmp al, 4 + jae MasterSetDmaCount + mov al, ch + out dx, al + mov al, cl + out dx, al + jmp EndSetDmaCount +MasterSetDmaCount: + mov al, ch + out dx, al + call ClrDmaFlipFlop + mov al, cl + out dx, al +EndSetDmaCount: + pop si dx bx ax + ret + diff --git a/noyau/8259a.asm b/noyau/8259a.asm new file mode 100644 index 0000000..2349253 --- /dev/null +++ b/noyau/8259a.asm @@ -0,0 +1,415 @@ +;Adresses de port du contr“leur IRQ + MASTERPIC = 020h ;Adresse de base du PIC maŒtre + SLAVEPIC = 0A0h ;Adresse de base du PIC esclave + IRQMASK = 001h ;Offset sur port de masquage + +;Commandes IRQ OCW2 + DISABLEROTATION = 000h ;Desactiver la rotation de priorités en mode EOI automatique + EOI = 020h ;End of Interrupt non sp‚cifi‚ + COMMANDEOI = 060h ;Commande EOI particulière + ENABLEROTATION = 080h ;Activer la rotation de priorités en mode EOI automatique + ROTATIONNOSPEC = 0A0h ;Rotation des priorités en mode EOI automatique + SETPRIORITY = 0C0h ;Definir la priorité + ROTATIONSPEC = 0E0h ;Rotation des priorités en mode EOI spécifié + +;Position des vecteurs d'interruptions + MASTERFIRSTVECTOR = 008h ;Vecteurs logiciels des interruptions + SLAVEFIRSTVECTOR = 070h ;‚lectroniques + +;OCW3 codes registres + IRR = 002h ;Interrupt Request Register + ISR = 003h ;In Service Register +;OCW3 et modes + OCW3 = 008h ;OCW3 + POLLING = 004h ;Polling bit + + +ISR = 0Bh ; Pas d'op‚ration, pas de Poll, lire ISR OCW3 +IRR = 0Ah ; Pas d'op‚ration, pas de Poll, lire IRR + +;Autorise une interruption ‚lectronique +;Entr‚e : %1 - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC +PROC enableirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC+IRQMASK + cmp al,7 + jbe @@master + mov dx,SLAVEPIC+IRQMASK +@@master: + mov cl,al + and cl,7 + mov al,1 + shl al,cl + not al + mov ah,al + in al,dx + and al,ah + out dx,al + ret +endp enableirq + +;Desactive une interruption ‚lectronique +;Entr‚e : %0 - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC +PROC disableirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC+IRQMASK + cmp al,7 + jbe @@master + mov dx,SLAVEPIC+IRQMASK +@@master: + mov cl,al + and cl,7 + mov al,1 + shl al,cl + not al + mov ah,al + in al,dx + or al,ah + out dx,al + ret +endp disableirq + + +;Signale "End Of Interrupt" de l'interruption %0 +PROC seteoi FAR + ARG @irq:word + USES ax,dx + mov ax,[@irq] + cmp al,7 + jbe @@master + mov al,EOI + out SLAVEPIC,al +@@master: + mov al,EOI + out MASTERPIC,al + ret +endp seteoi + + +;Lit les masques d'un contr“leur IRQ dans ax, 0 master ou slave 1 ds %1 +PROC readimr FAR + ARG @controleur:word + USES bx,dx + mov bx,[@controleur] + mov dx,MASTERPIC+ IRQMASK + cmp bl,0 + jne @@master + mov dx,SLAVEPIC+ IRQMASK +@@master: + xor ah,ah + in al,dx + pop dx + ret +endp readimr + +;Lit le registre d'‚tat d'un contr“leur IRQ dans ax, 0 master ou slave 1 ds %1 +PROC readisr FAR + ARG @controleur:word + USES bx,dx + mov bx,[@controleur] + mov dx,MASTERPIC + cmp bh,0 + jne @@master + mov dx,SLAVEPIC +@@master: + mov al,ISR + out dx,al + xor ah,ah + in al,dx + ret +endp readisr + + +;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh +PROC readirr FAR + ARG @controleur:word + USES bx,dx + mov bx,[@controleur] + mov dx,MASTERPIC + cmp bh,0 + jne @@master + mov dx,SLAVEPIC +@@master: + mov al,IRR + out dx,al + xor ah,ah + in al,dx + ret +endp readirr + +;carry si enable et pas carry si pas enable +PROC isenableirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC+IRQMASK + cmp al,7 + jbe @@master + mov dx,SLAVEPIC+IRQMASK +@@master: + mov cl,al + and cx,7 + in al,dx + neg al + bt ax,cx + ret +endp isenableirq + + +;carry si enable et pas carry si pas enable +PROC isinserviceirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC + cmp al,7 + jbe @@master + mov dx,SLAVEPIC +@@master: + mov cl,al + mov al,ISR + out dx,al + and cx,7 + in al,dx + neg al + bt ax,cx + ret +endp isinserviceirq + + +;carry si enable et pas carry si pas enable +PROC isrequestirq FAR + ARG @irq:word + USES ax,cx,dx + mov ax,[@irq] + mov dx,MASTERPIC + cmp al,7 + jbe @@master + mov dx,SLAVEPIC +@@master: + mov cl,al + mov al,IRR + out dx,al + and cx,7 + in al,dx + neg al + bt ax,cx + ret +endp isrequestirq + + +PROC installirqhandler FAR + USES eax,bx,cx,edx,si,di,ds,es + push fs + call mbcreate,offset interruptionbloc,256*size ints + mov es,ax + mov ax,0x0000 + mov ds,ax + xor si,si +@@searchdummypointer: + mov fs,[(vector si).data.seg] + mov bx,[(vector si).data.off] + cmp [byte ptr fs:bx],0xCF ;iret + je @@founded + add si,size vector + cmp si,256*4 + jb @@searchdummypointer + xor edx,edx + jmp @@suite +@@founded: + mov edx,[(vector si).content] +@@suite: + xor cx,cx + xor si,si + xor di,di + cli +@@copy: + mov [es:(ints di).number],cl + mov [es:(ints di).locked],0 + mov [es:(ints di).vector1.content],0 + mov [es:(ints di).vector3.content],0 + mov [es:(ints di).vector4.content],0 + mov [es:(ints di).vector5.content],0 + mov [es:(ints di).vector6.content],0 + mov [es:(ints di).vector7.content],0 + mov [es:(ints di).vector8.content],0 + mov [es:(ints di).launchedlow],0 + mov [es:(ints di).launchedhigh],0 + mov [es:(ints di).calledlow],0 + mov [es:(ints di).calledhigh],0 + mov eax,[(vector si).content] + cmp eax,edx + je @@notarealvector + mov [es:(ints di).vector1.content],eax + mov [es:(ints di).activated],1 + jmp @@copynext +@@notarealvector: + mov [es:(ints di).vector1.content],0 + mov [es:(ints di).activated],0 +@@copynext: + mov bx,cx + shl bx,3 + sub bx,cx + add bx,offset coupling + mov [(vector si).data.seg],cs + mov [(vector si).data.off],bx + add si,size vector + add di,size ints + inc cl + cmp cl,0 + jne @@copy +@@end: + pop fs + sti + ret +endp installirqhandler + + +interruptionbloc db '/interrupts',0 + + +PROC savecontext FAR +ARG @pointer:word +USES eax,si,ds +pushfd +push eax +push ebx +push ecx +push edx +push esi +push edi +push ds +push es +push fs +push gs +push ss +mov si,[@pointer] +mov ds,[ss:bp+4] +mov eax,ebp +mov ax,[word ptr ss:bp] +push eax +push [word ptr ss:bp+4] +xor eax,eax +mov ax,[word ptr ss:bp+2] +push eax +mov ax,bp +add ax,4 +push eax +pop [(regs si).sesp] +pop [(regs si).seip] +pop [(regs si).scs] +pop [(regs si).sebp] +pop [(regs si).sss] +pop [(regs si).sgs] +pop [(regs si).sfs] +pop [(regs si).ses] +pop [(regs si).sds] +pop [(regs si).sedi] +pop [(regs si).sesi] +pop [(regs si).sedx] +pop [(regs si).secx] +pop [(regs si).sebx] +pop [(regs si).seax] +pop [(regs si).seflags] +ret +endp savecontext + +PROC restorecontextg FAR +ARG @pointer:word +mov si,[@pointer] +pushd [cs:(regs si).sesi] +pushd [cs:(regs si).seflags] +mov eax,[cs:(regs si).seax] +mov ebx,[cs:(regs si).sebx] +mov ecx,[cs:(regs si).secx] +mov edx,[cs:(regs si).sedx] +mov edi,[cs:(regs si).sedi] +mov ebp,[cs:(regs si).sebp] +mov es,[cs:(regs si).ses] +mov fs,[cs:(regs si).sfs] +mov gs,[cs:(regs si).sgs] +mov ds,[cs:(regs si).sds] +popfd +pop esi +pop [cs:dummy] +db 0xCA,0x02,0x00 ;retf 2 +endp restorecontextg + + + +coupling: +counter = 0 +REPEAT 256 +push counter+256 +push offset irqhandlers +ret +counter = counter + 1 +ENDM + +interrupt dw 0 +dummy dw 0 +calling_reg regs <> +function_reg regs <> + +irqhandlers: +cli +pop [cs:interrupt] +call savecontext,offset calling_reg +call irqhandler,[cs:interrupt] +call restorecontextg,offset calling_reg +sti +iret + +PROC irqhandler NEAR +ARG @int:word +push cs +pop ds +call mbfindsb,offset interruptionbloc,cs +jc @@end +mov es,ax +mov ax,[@int] +sub ax,256 +mov cx,size ints +mul cx +mov si,ax +add [es:(ints si).calledlow],1 +adc [es:(ints si).calledhigh],0 +cmp [es:(ints si).activated],1 +jne @@end +add [es:(ints si).launchedlow],1 +adc [es:(ints si).launchedhigh],0 +lea si,[es:(ints si).vector1] +mov cl,8 +@@launchall: +cmp [es:(vector si).content],0 +je @@end +push [word ptr cs:calling_reg.seflags] +push cs +push offset @@back +push [es:(vector si).data.seg] +push [es:(vector si).data.off] +call savecontext,offset function_reg +call restorecontextg,offset calling_reg +db 0xCB +@@back: +cli +call savecontext,offset calling_reg +call restorecontextg,offset function_reg +@@next: +add si,size vector +dec cl +jnz @@launchall +@@end: +ret +endp irqhandler + + + + + + + diff --git a/noyau/MAKEFILE b/noyau/MAKEFILE new file mode 100644 index 0000000..d14bef5 --- /dev/null +++ b/noyau/MAKEFILE @@ -0,0 +1,38 @@ +asm= lzasm /z/t +lnk= elink + +all: systeme.sys boot.bin + +systeme.sys: video.obj disque.obj systeme.obj + $(lnk) systeme.obj systeme.sys + +systeme.obj: ..\lib\detect.lib ..\lib\video.lib video.sys disque.sys + $(asm) systeme.asm + +disque.sys: + $(lnk) disque.obj disque.sys + +video.sys: + $(lnk) video.obj video.sys + +boot.bin: boot.obj + $(lnk) boot.obj boot.bin /bs + +video.obj: + $(asm) video.asm + +disque.obj: + $(asm) disque.asm + +boot.obj: + $(asm) boot.asm + +clean: + del *.obj + del *.exe + del *.bak + del *.lib + del *.com + del *.bin + del *.sys + del *.err \ No newline at end of file diff --git a/noyau/boot.asm b/noyau/boot.asm new file mode 100644 index 0000000..05812e0 --- /dev/null +++ b/noyau/boot.asm @@ -0,0 +1,216 @@ +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\fat.h" +include "..\include\divers.h" + +org 7C00h + +jmp boot + +bootsec bootinfo <"COS2000A",512,1,1,2,224,2880,0F0h,9,18,2,0,0,0,0,0,29h,01020304h,"COS2000 ","FAT12 "> + +errorloading db " [Erreur]",0dh,0ah,0 +okloading db "Recherche noyau ",0Dh,0ah," -" +sys db "SYSTEME SYS",0 +syst db " [ Ok ]",0dh,0ah,"Chargement ",0 +dot db ".",0 + + + +errorboot: + mov si,offset errorloading + call showstr + mov ah,0 + int 16h + int 19h + +boot: + mov [bootsec.bootdrive],dl + cli + mov ax,09000h + mov ss,ax + mov sp,0FFFFh + sti +boot2: + push cs + push cs + pop es + pop ds + xor ax,ax + mov dl,[bootsec.bootdrive] + int 13h + jc errorboot + mov si,offset okloading + call showstr + mov cx,[bootsec.reservedsectors] + add cx,[bootsec.hiddensectorsh] + adc cx,[bootsec.hiddensectorsl] + push cx + mov bx,[bootsec.sectorsperfat] + mov di,offset bufferfat +readfat: + call readsector + jc errorboot + inc cx + add di,[bootsec.sectorsize] + dec bx + jnz readfat + pop cx + xor ax,ax + mov al,[bootsec.fatsperdrive] + mov bx,[bootsec.sectorsperfat] + mul bx + add cx,ax + mov ax,32 + mul [bootsec.directorysize] + div [bootsec.sectorsize] + add ax,cx + sub ax,2 + mov [word ptr bootsec.reservedfornt],ax + xor dx,dx +checkroot: + mov di,offset buffer + call readsector + jc errorboot + xor bx,bx +findnext: + cmp [byte ptr di],0 + je errorboot + cmp [byte ptr di],0E5h + je no + cmp [byte ptr di],041h + je no + mov si,offset dot + call showstr + push di cx + mov si,offset sys + mov cx,11 + rep cmpsb + pop cx di + je oksystem +no: + add di,32 + add bx,32 + inc dx + cmp dx,[bootsec.directorysize] + ja errorboot + cmp bx,[bootsec.sectorsize] + jb findnext + inc cx + jmp checkroot +oksystem: + mov si,offset syst + call showstr + mov cx,[di+26] + mov ax,8000h + mov es,ax + push es + mov di,0000h + push 0010h + mov si,offset dot + xor ax,ax +fatagain: + cmp cx,0FF0h + jae finishload + push cx + add cx,[word ptr bootsec.reservedfornt] + call readsector + pop cx + jc errorboot + inc ax + call showstr + add di,[bootsec.sectorsize] + call getfat + jnc fatagain +finishload: + retf + +;=============READSECTOR (Fonction 01H)=============== +;Lit le secteur CX et le met en es:di +;-> AH=1 +;<- Flag Carry si erreur +;===================================================== +readsector: + push ax bx cx dx si + mov ax,cx + xor dx,dx + div [bootsec.sectorspertrack] + inc dl + mov bl,dl + xor dx,dx + div [bootsec.headsperdrive] + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl, bl + mov bx,di + mov si, 4 + mov al, 1 +tryagain: + mov ah, 2 + mov dl,[bootsec.bootdrive] + int 13h + jnc done + dec si + jnz tryagain +done: + pop si dx cx bx ax + ret + + +getfat: + push ax bx dx di + mov di,offset bufferfat + mov ax,cx + mov bx,ax + and bx,0000000000000001b + shr ax,1 + mov cx,3 + mul cx + add di,ax + cmp bx,0h + jnz evenfat +oddfat: + mov dx,[di] + and dx,0FFFh + mov cx,dx + jmp endfat +evenfat: + mov dx,[di+1] + and dx,0FFF0h + shr dx,4 + mov cx,dx +endfat: + pop di dx bx ax + ret + + +showstr: + push ax bx si +again: + lodsb + or al,al + jz fin + mov ah,0Eh + mov bx,07h + int 10h + jmp again +fin: + pop si bx ax + ret + + +db 055h,0AAh + +endof: + +buffer equ offset endof+2048 +bufferfat equ offset endof+4096 + diff --git a/noyau/clavier.asm b/noyau/clavier.asm new file mode 100644 index 0000000..9fd3cdd --- /dev/null +++ b/noyau/clavier.asm @@ -0,0 +1,261 @@ +.model tiny +.486 +smart +.code + +org 0h + +include ..\include\mem.h + +start: + +jmp tsr +offsets dd 0 +db 'KEYBOARD' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + cmp cs:isstate,1 + je endofforce + mov cs:isstate,1 + mov cs:eaxr,eax + in al,60h + cmp al,68 + je F10 + cmp al,87 + je F11 + cmp al,88 + je F12 +endof: + mov cs:isstate,0 + mov eax,cs:eaxr +endofforce: + sti + iret + isstate db 0 + infos db 40 dup (0) + feax dd 0 + +F10: + push cs + pop ds + mov si,offset com + mov ah,5 + int 49h + pop ax + pop ax + pop ax + push gs + push gs + push gs + pop ds + pop es + pop fs + push gs + push size exe + sti + mov cs:[isstate],0 + retf + +com db 'COMMANDE.CE',0 + +F11: + push ax di es + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov al,cs:[di+7] + inc al + cmp al,9 + jbe notabove + mov al,0 +notabove: + mov ah,0 + int 47h + pop es di ax + jmp endof + + +f12: +pushad +pushf +push ds +mov cs:[eaxr],eax +mov cs:[ebxr],ebx +mov cs:[ecxr],ecx +mov cs:[edxr],edx +mov cs:[esir],esi +mov cs:[edir],edi +mov cs:[espr],esp +mov cs:[ebpr],ebp +mov cs:[csr],cs +mov cs:[dsr],ds +mov cs:[esr],es +mov cs:[fsr],fs +mov cs:[gsr],gs +mov cs:[ssr],ss +push cs +pop ds +mov si,offset sep +call Showstr +mov si,offset reg +mov di,offset regdata +mov bx,7 +showregs: +cmp byte ptr cs:[si+6],":" +jne endshowregs +call Showstr +cmp byte ptr cs:[si+4]," " +je segsss +mov edx,cs:[di] +mov cx,32 +call Showhex +add di,4 +jmp showmax +segsss: +mov dx,cs:[di] +mov cx,16 +call Showhex +add di,2 +showmax: +add si,9 +mov bp,dx +push si +mov si,offset beginds +call showstr +mov si,bp +mov cx,8 +mov al,0 +letshow: +mov dl,ds:[si] +inc si +call showhex +inc al +cmp al,10 +jb letshow +mov si,offset ende +call showstr +mov si,offset begines +call showstr +mov si,bp +mov cx,8 +mov al,0 +letshow2: +mov dl,es:[si] +inc si +call showhex +inc al +cmp al,10 +jb letshow2 +mov si,offset ende +call showstr +pop si +jmp showregs +endshowregs: +mov si,offset sep +call Showstr +xor ax,ax +int 16h +pop ds +popf +popad +jmp endof +begines db ' es[',0 +beginds db ' ds[',0 +ende db '] ',0 + + +;==============================Affiche le nombre nb hexa en EDX de taille CX et couleur BL============== +ShowHex: + push ax bx cx edx si di + mov di,cx + sub cx,32 + neg cx + shl edx,cl + shr di,2 + mov ah,09h + and bx,1111b +Hexaize: + rol edx,4 + mov si,dx + and si,1111b + mov al,[si+offset tab] + push cx + mov cx,1 + cmp al,32 + jb control2 + mov ah,09h + int 10h +control2: + mov ah,0Eh + int 10h + pop cx + dec di + jnz Hexaize + pop di si edx cx bx ax + ret +Tab db '0123456789ABCDEF' + +;==============================Affiche une chaine DS:SI de couleur BL============== +showstr: + push ax bx cx si + mov cx,1 +again: + lodsb + or al,al + jz fin + and bx,0111b + cmp al,32 + jb control + mov ah,09h + int 10h +control: + mov ah,0Eh + int 10h + jmp again + fin: + pop si cx bx ax + ret + + +;================================================ +;Routine de débogage +;================================================ +regdata: +eaxr dd 0 +ebxr dd 0 +ecxr dd 0 +edxr dd 0 +esir dd 0 +edir dd 0 +espr dd 0 +ebpr dd 0 +csr dw 0 +dsr dw 0 +esr dw 0 +fsr dw 0 +gsr dw 0 +ssr dw 0 + +reg db 0Dh,0Ah,"eax : ",0 + db 0Dh,0Ah,"ebx : ",0 + db 0Dh,0Ah,"ecx : ",0 + db 0Dh,0Ah,"edx : ",0 + db 0Dh,0Ah,"esi : ",0 + db 0Dh,0Ah,"edi : ",0 + db 0Dh,0Ah,"esp : ",0 + db 0Dh,0Ah,"ebp : ",0 + db 0Dh,0Ah,"cs : ",0 + db 0Dh,0Ah,"ds : ",0 + db 0Dh,0Ah,"es : ",0 + db 0Dh,0Ah,"fs : ",0 + db 0Dh,0Ah,"gs : ",0 + db 0Dh,0Ah,"ss : ",0 + +sep db 0Ah,0Dh,'********************',0Ah,0Dh,0 + +end start diff --git a/noyau/disque.asm b/noyau/disque.asm new file mode 100644 index 0000000..0c91749 --- /dev/null +++ b/noyau/disque.asm @@ -0,0 +1,1099 @@ +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\fat.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,offset imports,,> + + +exporting +declare readsector +declare writesector +declare verifysector +declare initdrive +declare loadfile +declare compressrle +declare decompressrle +declare findfirstfile +declare findnextfile +declare getfreespace +declare searchfile +declare getname +declare getserial +declare changedir +declare readcluster +declare writecluster +declare getdir +declare projfile +declare execfile +ende + +importing +use SYSTEME,biosprinth +use SYSTEME,mbfindsb +use SYSTEME,mbfree +use SYSTEME,mbcreate +use SYSTEME,mbresident +use SYSTEME,mbfind +use SYSTEME,mbchown +use SYSTEME,mbloadfuncs +use SYSTEME,mbloadsection +endi + + +;DPT disquette +mydpt dpt <> + +;Secteur de boot +myboot bootinfo <> + +;Parametres +support db 0 +nbbuffer db 0 + +;Données Calculée +clustersize dw 0 +tracksperhead dw 0 +drivesize dd 0 +adressboot dw 0 +adressfat dw 0 +adressparent dw 0 +adressdirectory dw 0 +adressdata dw 0 +addingvalue dw 0 +currentdir dw 0 ;En cluster +currentdirstr db 128 dup (0) + + +PROC getfat near + uses ax,bx,dx,si,ds,es + push cs + pop ds + + push cs + pop es + call [cs:mbfindsb],offset datafat,cs + mov es,ax + mov ax,cx + mov bx,ax + and bx,0000000000000001b + shr ax,1 + mov cx,3 + mul cx + ;mov si,offset fatter + xor si,si + add si,ax + cmp bx,0h + jnz evenfat +oddfat: + mov ax,[es:si] + and ax,0FFFh + mov cx,ax + jmp endfat +evenfat: + mov ax,[es:si+1] + and ax,0FFF0h + shr ax,4 + mov cx,ax +endfat: + cmp ax,0FF0h + jbe nocarry + stc + ret +nocarry: + clc + ret +endp getfat + +;============loadfile=============== +;Charge le fichier ds:%0 en ds:%1 ->ax taille +;-> AH=4 +;<- Flag Carry si erreur +;===================================================== +PROC loadfile FAR + ARG @name:word,@pointer:word + LOCAL @@temp:word:48 + USES cx,si,di,ds,es + push ss + pop es + lea di,[@@temp] + push ds di + mov si,[@name] + mov cx,48/4 + cld + rep movsd + push ss + pop ds + pop di es + call searchfile,di + jne errorload + jc errorload + mov cx,[(find di).result.filegroup] + mov eax,[(find di).result.filesize] + push es + pop ds + call loadway,cx,eax,[@pointer] + jc errorload + clc + ret +errorload: + stc + xor eax,eax + ret +endp loadfile + +;============execfile (Fonction 18)=============== +;Execute le fichier ds:si +;-> AH=18 +;<- Flag Carry si erreur +;===================================================== +PROC execfile FAR + ARG @file:word + pushad + push ds es fs gs + mov di,[@file] + call uppercase,di + call projfile,di + jc @@reallyerrornoblock + call [cs:mbfind],di + jc @@reallyerror + call [cs:mbchown],ax,[word ptr ss:bp+4] + jc @@reallyerror + push ax + pop ds + cmp [ds:0x0],'EC' + jne @@reallyerror + push ax + push cs + push offset @@arrive + push ds + push [word ptr (exe).starting] + push ds + push ds + push ds + pop es + pop fs + pop gs + push 7202h + xor eax,eax + xor ebx,ebx + xor ecx,ecx + xor edx,edx + xor esi,esi + xor edi,edi + xor ebp,ebp + popf + sti + db 0CBh +@@arrive: + ;cli + ;pop ax + ;call [cs:mbfree],ax + call [cs:mbfree] + pop gs fs es ds + popad + clc + ret +@@reallyerror: + call [cs:mbfree],ax +@@reallyerrornoblock: + pop gs fs es ds + popad + stc + ret +endp execfile + +;============projfile (Fonction 17)=============== +;Charge le fichier ds:%0 sur un bloc mémoire -> eax taille +;-> eax taille fichier +;<- Flag Carry si erreur +;===================================================== +PROC projfile FAR +ARG @pointer:word +LOCAL @@temp:word:64 +USES cx,si,di,ds,es + push ss + pop es + lea di,[@@temp] + push di + mov si,[@pointer] + mov cx,64/4 + cld + rep movsd + push ss + pop ds + pop di + call uppercase,di + call [cs:mbfind],di + jnc @@notace + call searchfile,di + jne @@errorload + jc @@errorload + mov eax,[es:(find di).result.filesize] + call [cs:mbcreate],di,ax + jc @@errorload + call [cs:mbchown],ax,[word ptr ss:bp+4] + jc @@errorload + mov ds,ax + mov cx,[es:(find di).result.filegroup] + mov eax,[es:(find di).result.filesize] + call loadway,cx,eax,0 + jc @@errorload + cmp [ds:0x0],'EC' + jne @@notace + call [cs:mbloadfuncs],ds + jc @@errorload + call [cs:mbloadsection],ds + jc @@errorload + @@notace: + clc + ret +@@errorload: + xor eax,eax + stc + ret +endp projfile + + +;=============SearchFile=============== +;Renvois dans ds:%0 et non equal si pas existant +;-> +;<- Flag Carry si erreur +;====================================== +PROC searchfile FAR +ARG @pointer:word + USES bx,cx,si,di,ds,es + mov si,[@pointer] + lea bx,[es:(find si).result] + call uppercase,si + call findfirstfile,si + jc @@errorsearch + jmp @@founded +@@nextsearch: + call findnextfile,si + jc @@errorsearch +@@founded: + cmp [byte ptr bx],0 + je @@notgood + cmp [byte ptr bx+entries.fileattr],0Fh + je @@nextsearch + call cmpnames,si,bx + jc @@nextsearch +@@okfound: + clc + ret +@@notgood: + cmp si,0FF5h + ret +@@errorsearch: + stc + ret +endp searchfile + +;Transforme la chaine ds:%0 en maj +PROC uppercase FAR + ARG @strs:word + USES si,ax + mov si,[@strs] +@@uppercaser: + mov al,[si] + cmp al,0 + je @@enduppercase + cmp al,'a' + jb @@nonmaj + cmp al,'z' + ja @@nonmaj + sub al,'a'-'A' + mov [si],al +@@nonmaj: + inc si + jmp @@uppercaser +@@enduppercase: + clc + ret +endp uppercase + +;Compare le nom ds:%0 '.' avec ds:%1 +PROC cmpnames FAR + ARG @off1:word,@off2:word + USES ax,cx,si,di,es + mov si,[@off1] + mov di,[@off2] + cmp [byte ptr si],"." + jne @@notaredir + cmp [word ptr si],".." + jne @@onlyonedir + cmp [word ptr di],".." + je @@itok + jmp @@notequal +@@onlyonedir: + cmp [word ptr di]," ." + je @@itok +@@notaredir: + push ds + pop es + mov cx,8 + repe cmpsb + jne @@nequal + inc si + jmp @@equal +@@nequal: + cmp [byte ptr es:di-1],' ' + jne @@notequal +@@equal: + cmp [byte ptr si-1],'.' + jne @@trynoext + mov al,' ' + rep scasb + mov cx,3 + rep cmpsb + jne @@nequal2 + inc si + jmp @@equal2 +@@nequal2: + cmp [byte ptr es:di-1],' ' + jne @@notequal +@@equal2: + cmp [byte ptr si-1],0 + jne @@notequal +@@itok: + clc + ret +@@notequal: + stc + ret +@@trynoext: + cmp [byte ptr si-1],0 + jne @@notequal + jmp @@itok +endp cmpnames + +;charge le fichier de de groupe %0 et de taille %1 +PROC loadway NEAR + ARG @sector:word,@size:dword,@offset:word + USES eax,bx,cx,dx,si,di,ds,es + push ds + pop es + mov eax,[@size] + cmp eax,0 + je @@zeroload + rol eax,16 + mov dx,ax + ror eax,16 + div [cs:clustersize] + mov bx,ax + mov cx,[@sector] + mov di,[@offset] + cmp bx,1 + jb @@adjustlast +@@loadfat: + call readcluster,cx,di + jc @@noway + add di,[cs:clustersize] + call getfat + dec bx + jnz @@loadfat +@@adjustlast: + cmp dx,0 + je @@zeroload + push cs + pop ds + mov si,offset bufferread + call readcluster,cx,si + jc @@noway + mov cx,dx + cld + rep movsb +@@zeroload: + clc + ret +@@noway: + stc + ret +endp loadway + +;=============INITDRIVE=============== +;Initialise le lecteur pour une utilisation ultérieure +;-> +;<- Flag Carry si erreur +;===================================== +PROC initdrive FAR + USES eax,bx,cx,edx,si,di,ds,es + push cs + pop ds + push cs + pop es + mov di,3 +@@againtry: + xor ax,ax + mov dl,[support] + xor dh,dh + int 13h + mov bx,offset bufferread + mov ax,0201h + mov cx,0001h + mov dl,[support] + xor dh,dh + int 13h + jnc @@oknoagaintry + dec di + jnz @@againtry +@@oknoagaintry: + mov si,offset bufferread+3 + mov di,offset myboot + mov cx,size myboot + cld + rep movsb + mov ax,[myboot.sectorsize] + mov bl,[myboot.sectorspercluster] + xor bh,bh + mul bx + mov [clustersize],ax + mov bx,[myboot.hiddensectorsl] + adc bx,[myboot.hiddensectorsh] + mov [adressboot],bx + add bx,[myboot.reservedsectors] + mov [adressfat],bx + xor ax,ax + mov al,[myboot.fatsperdrive] + mul [myboot.sectorsperfat] + add bx,ax + mov [adressparent],bx + mov [adressdirectory],bx + mov ax,32 + mul [myboot.directorysize] + div [myboot.sectorsize] + add bx,ax + mov [adressdata],bx + sub bx,2 + mov [addingvalue],bx + mov ax,[myboot.sectorsperdrive] + div [myboot.sectorspertrack] + xor dx,dx + div [myboot.headsperdrive] + mov [tracksperhead],ax + xor eax,eax + mov ax,[myboot.sectorsperdrive] + sub ax,[adressdata] + mul [myboot.sectorsize] + shl edx,16 + add edx,eax + mov [drivesize],edx + mov [currentdir],0 + mov [adressdirectory],0 + mov [currentdirstr],0 + xor eax,eax + mov ax,[myboot.sectorsperfat] + mul [myboot.sectorsize] + call [cs:mbfindsb],offset datafat,cs + jnc @@hadafatbloc + call [cs:mbcreate],offset datafat,ax + jc @@errorinit + call [cs:mbresident],ax + jc @@errorinit + call [cs:mbchown],ax,cs + jc @@errorinit +@@hadafatbloc: + mov dx,[myboot.sectorsperfat] + mov cx,[adressfat] + xor di,di + ;mov di,offset fatter + mov ds,ax +@@seefat: + call readsector,cx,di + jc @@errorinit + add di,[cs:myboot.sectorsize] + inc cx + dec dx + jnz @@seefat + clc + ret +@@errorinit: + stc + ret +endp initdrive + +datafat db '/fat',0 + +;=============FindFirstFile============== +;Renvois dans DS:%1 un bloc d'info +;-> +;<- Flag Carry si erreur +;======================================== +PROC findfirstfile FAR + ARG @pointer:word + USES cx,si + mov si,[@pointer] + mov cx,[cs:currentdir] + mov [(find si).adressdirectory],cx + xor cx,cx + mov [(find si).entryplace],cx + mov [(find si).firstsearch],1 + call findnextfile,[@pointer] + ret +endp findfirstfile + +;=============FindnextFile============== +;Renvois dans DS:%0 un bloc d'info +;-> +;<- Flag Carry si erreur +;======================================= +PROC findnextfile FAR + ARG @pointer:word + USES ax,bx,cx,di,si,ds,es + push cs + push ds + pop es + pop ds + mov si,[@pointer] + mov cx,[es:(find si).adressdirectory] + mov bx,[es:(find si).entryplace] +@@findnextfileagain: + cmp [es:(find si).firstsearch],1 + je @@first + add bx,size entries + cmp bx,[cs:clustersize] + jb @@nopop +@@first: + mov di,offset bufferentry + mov bx,0 + cmp [cs:currentdir],0 + jne @@notrootdir + cmp [es:(find si).firstsearch],1 + je @@noaddfirst1 + inc cx +@@noaddfirst1: + add cx,[cs:adressparent] + mov al,[cs:myboot.sectorspercluster] +@@readroot: + call readsector,cx,di + jc @@notwell + add di,[cs:myboot.sectorsize] + dec al + jnz @@readroot + sub cx,[cs:adressparent] + jmp @@nopop +@@notrootdir: + cmp [es:(find si).firstsearch],1 + je @@noaddfirst2 + call getfat +@@noaddfirst2: + jc @@notwell + call readcluster,cx,di + jc @@notwell +@@nopop: + mov [es:(find si).firstsearch],0 + mov di,offset bufferentry + add di,bx + cmp [byte ptr di],0 + je @@notwell + mov [es:(find si).entryplace],bx + mov [es:(find si).adressdirectory],cx + cmp [byte ptr di],0E5h + je @@findnextfileagain + cmp [byte ptr di+entries.fileattr],28h + je @@findnextfileagain + cmp [byte ptr di+entries.fileattr],0Fh + je @@findnextfileagain + mov si,di + mov di,[@pointer] + lea di,[es:(find di).result] + mov cx,size entries + cld + rep movsb + clc + ret +@@notwell: + stc + ret +endp findnextfile + +;=============GetFreeSpace=============== +;Renvoie en EDX l'espace disque libre du volume +;-> +;<- Flag Carry si erreur +;======================================== +PROC getfreespace FAR + USES eax,bx + xor eax,eax + call getsector + mul [cs:myboot.sectorsize] + shl edx,16 + add edx,eax + pop eax + ret +endp getfreespace + +;ax=défectueux bx=libre +getsector: + push cx dx + mov dx,[cs:myboot.sectorsperdrive] + sub dx,[cs:addingvalue] + xor ax,ax + xor bx,bx + mov cx,0 +goget: + push cx + call getfat + cmp cx,0FF7h + jne notdefect + inc bx +notdefect: + cmp cx,0 + jne notfree + inc ax +notfree: + pop cx + inc cx + dec dx + jnz goget + pop dx cx + ret +errorfree: + stc + pop dx cx + ret + + +;=============READCLUSTER=============== +;Lit le secteur %0 et le met en ds:%1 +;-> +;<- Flag Carry si erreur +;======================================= +PROC readcluster FAR + ARG @sector:word,@pointer:word + USES ax,bx,dx,si + mov al,[cs:myboot.sectorspercluster] + xor ah,ah + mov bx,ax + mul [@sector] + add ax,[cs:addingvalue] + mov si,[@pointer] +@@readsectors: + call readsector,ax,si + jc @@errorreadincluster + add si,[cs:myboot.sectorsize] + inc ax + dec bx + jnz @@readsectors + clc + ret +@@errorreadincluster: + stc + ret +endp readcluster + +;=============WRITECLUSTER=============== +;Ecrit le cluster %0 et le met en ds:%1 +;-> +;<- Flag Carry si erreur +;===================================================== +PROC writecluster FAR + ARG @sector:word,@pointer:word + USES ax,bx,dx,si + mov al,[cs:myboot.sectorspercluster] + xor ah,ah + mov bx,ax + mul [@sector] + add ax,[cs:addingvalue] + mov si,[@pointer] +@@writesectors: + call writesector,ax,si + jc @@errorwriteincluster + add si,[cs:myboot.sectorsize] + inc ax + dec bx + jnz @@writesectors + clc + ret +@@errorwriteincluster: + stc + ret +endp writecluster + +;=============READSECTOR=============== +;Lit le secteur %0 et le met en ds:%1 +;-> +;<- Flag Carry si erreur +;====================================== +PROC readsector FAR + ARG @sector:word,@pointer:word + USES ax,bx,cx,dx,si,es + push ds + pop es + mov ax,[@sector] + xor dx,dx + div [cs:myboot.sectorspertrack] + inc dl + mov bl,dl + xor dx,dx + div [cs:myboot.headsperdrive] + mov dh,[cs:support] + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl,bl + mov bx,[@pointer] + mov si,5 +@@tryagain: + mov ax,0201h + int 13h + jnc @@done + dec si + jnz @@tryagain +@@done: + ret +endp readsector + +;=============WRITESECTOR============ +;Ecrit le secteur %0 pointé par ds:%0 +;-> +;<- Flag Carry si erreur +;==================================== +PROC writesector FAR + ARG @sector:word,@pointer:word + USES ax,bx,cx,dx,si,es + push ds + pop es + mov ax,[@sector] + xor dx,dx + div [cs:myboot.sectorspertrack] + inc dl + mov bl,dl + xor dx,dx + div [cs:myboot.headsperdrive] + mov dh,[cs:support] + xchg dl,dh + mov cx,ax + xchg cl,ch + shl cl,6 + or cl, bl + mov bx,[@pointer] + mov si,5 +@@tryagain: + mov ax,0301h + int 13h + jnc @@done + dec si + jnz @@tryagain +@@done: + ret +endp writesector + +;=============Getname============== +;Renvoie le nom en DS:%0 +;-> AH=11 +;<- Flag Carry si erreur +;================================== +PROC getname FAR + ARG @pointer:word + USES ax,cx,si,di,ds,es + push ds + pop es + push cs + pop ds + mov di,[@pointer] + mov si,offset myboot.drivename + mov cx,11 + rep movsb + mov al,' ' + mov di,[@pointer] + mov cx,11 + repne scasb + mov [byte ptr es:di],0 + ret +endp getname +;=============Getserial============== +;Renvoie le numéro de serie en EAX +;-> +;<- Flag Carry si erreur +;==================================== +PROC getserial FAR + mov eax,[cs:myboot.serialnumber] + ret +endp getserial + +;=============VERIFYSECTOR============== +;Vérifie le secteur %0 +;-> +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;======================================= +PROC verifysector FAR + ARG @sector:word + USES ecx,si,di,ds,es + push cs + pop es + push cs + pop ds + mov si,offset bufferread + call readsector,cx,si + call inverse + call writesector,cx,si + jc @@errorverify + + mov si,offset bufferwrite + call readsector,cx,si + call inverse + jc @@errorverify + + mov si,offset bufferread + call inverse + call writesector,cx,si + jc @@errorverify + + xor ecx,ecx + mov cx,[cs:myboot.sectorsize] + shr cx,2 + mov si,offset bufferread + mov di,offset bufferwrite + cld + rep cmpsd +@@errorverify: + ret + +endp verifysector + +inverse: + push si cx + xor cx,cx +invert: + not [dword ptr si] + add si,4 + add cx,4 + cmp cx,[cs:myboot.sectorsize] + jb invert + pop cx si + ret + +;=============DecompressRle (Fonction 05H)============== +;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚ +;-> AH=5 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +PROC decompressrle FAR + ARG @seg1:word,@off1:word,@seg2:word,@off2:word,@size:word + USES ecx,dx,si,di,ds,es + mov ds,[@seg1] + mov es,[@seg2] + mov si,[@off1] + mov di,[@off2] + mov dx,[@size] +@@decompression: + mov eax,[ds:si] + cmp al,'/' + jne @@nocomp + cmp si,07FFFh-6 + jae @@thenen + mov ecx,eax + ror ecx,16 + cmp cl,'*' + jne @@nocomp + cmp [byte ptr ds:si+4],'/' + jne @@nocomp + mov al,ch + mov cl,ah + xor ah,ah + xor ch,ch + cld + rep stosb + add si,5 + sub dx,5 + jnz @@decompression + jmp @@thenen +@@nocomp: + mov [es:di],al + inc si + inc di + dec dx + jnz @@decompression +@@thenen: + xor eax,eax + mov ax,di + sub ax,[@off2] + clc + ret +endp decompressrle + +;=============CompressRle (Fonction 06H)============== +;compress ds:si en es:di taille cx d‚compress‚ BP compress‚ +;-> AH=6 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +PROC compressrle FAR + ARG @seg1:word,@off1:word,@seg2:word,@off2:word,@size:word + USES ax,bx,cx,dx,si,di,ds,es + mov es,[@seg1] + mov ds,[@seg2] + mov di,[@off1] + mov si,[@off2] + mov dx,[@size] +@@againcomp: + mov bx,di + mov al,[es:di] + mov cx,dx + cmp ch,0 + je @@poo + mov cl,0ffh + ;mov cx,bp + ;sub cx,di + ;mov ah,cl +@@poo: + mov ah,cl + inc di + xor ch,ch + repe scasb + sub cl,ah + neg cl + cmp cl,6 + jbe @@nocomp2 + mov [dword ptr si],' * /' + mov [byte ptr si+4],'/' + mov [si+1],cl + mov [si+3],al + add si,5 + dec di + xor ch,ch + sub dx,cx + jnz @@againcomp + jmp @@fini +@@nocomp2: + mov [si],al + inc si + inc bx + mov di,bx + dec dx + jnz @@againcomp +@@fini: + mov ax,si + sub ax,[@off2] + clc + ret +endp compressrle + +;=============Changedir (Fonction 13)============== +;Change le repertoire courant a DS:SI +;-> AH=13 +;<- Flag Carry si erreur, Flag Equal si secteurs égaux +;===================================================== +PROC changedir FAR +ARG @pointer:word +LOCAL @@temp:word:64 +USES cx,si,di,ds,es + push ss + pop es + lea di,[@@temp] + push di + mov si,[@pointer] + mov cx,64/4 + cld + rep movsd + push ss + pop ds + pop di + call searchfile,di + jne @@noch + jc @@noch + ;cmp [si],005Ch ;'/',0 (root dir) + mov cx,[es:(find di).result.filegroup] + mov [cs:currentdir],cx + mov [cs:adressdirectory],cx + cmp [dword ptr es:(find di).result.filename],' .' + je @@theend + cmp [dword ptr es:(find di).result.filename],' ..' + jne @@notback + push cs + push cs + pop ds + pop es + mov di,offset currentdirstr + mov cx,128 + mov al,0 + cld + repne scasb + mov al,'/' + std + repne scasb + inc di + mov [byte ptr es:di],0 + jmp @@theend +@@notback: + push cs + push cs + pop ds + pop es + mov di,offset currentdirstr + mov cx,128 + mov al,0 + cld + repne scasb + dec di + mov al,'/' + cld + stosb + mov dx,di + push ss + pop es + lea di,[@@temp] + mov si,di + mov cx,128 + mov al,0 + cld + repne scasb + sub cx,128 + neg cx + push ss + pop ds + push cs + pop es + mov di,dx + cld + rep movsb +@@theend: + clc + ret +@@noch: + stc + ret +endp changedir + +;=============getdir============== +;Recupere le repertoire courant a DS:%0 +;-> +;<- Flag Carry si erreur +;================================= +PROC getdir FAR + ARG @pointer:word + USES ax,cx,si,di,ds,es + push cs + pop es + mov di,offset currentdirstr + mov cx,128 + mov al,0 + cld + repne scasb + sub cx,128 + neg cx + push ds + pop es + push cs + pop ds + mov si,offset currentdirstr + mov di,[@pointer] + cld + rep movsb + clc + ret +endp getdir + +bufferread db 512 dup (0) +bufferwrite db 512 dup (0) +bufferentry db 512 dup (0) +;fatter db 9*512 dup (0) diff --git a/noyau/font/2_hebrew.fnt b/noyau/font/2_hebrew.fnt new file mode 100644 index 0000000000000000000000000000000000000000..9e668d696026510a7bcba441cbc5eed24cd490e2 GIT binary patch literal 4096 zcmZu!&uiR96dqef_Cd8>C`H9$Hw~fCo5+H))T%Z~OCgsY3cd9pM@8;o*){dSff&h~ zLusLel3T8UUiv?z*eoQyG`$)&rFIQ5l#+x7oE*Zc-33SWr}xsv4hG8jGj|CBc$5TnZ8!`f+@Edg}Wz%l){hs-nhVL&axlMRYob zey8QV=AG z2~VjcNl;H;t*G8GIWdya`Ji^^8!Ay$M)D)Mo|j}BY2tj8C7#Z4BXd2!ld)A0MZx+Y z&({^k+@vf~56=fH41I0wdoGbzk1&s`IInF`oeH0tL2qD$7Kc}o#W4nR4t$5{{vHdH zY;$;XJ2SK81+hoeGjeH==?W*AWRD>7y&kR{4a(#ij;Q@1%gf%pB#yraeEvGm<`nac0IX({7#KDU4!Fy{4o*?T&C|H{F^!5=>> zqt&3bO!>9Ao*2(Jw?Jf1E$rK8JD**BFX(O^sTBeFC;$BQr<9Y2+fTON>ITb;di;oY z1?k=XVQ>G4`%;V9^H`4FL|*=v%%*wp zHl&dX5nzk9w`)08Kd8o22W!}hL#y3h!RRjyJSBBY|Irv^#cL=dOyz)h zJz{~=b^}@Q$=$HVT?*H&aYgc?#so9t5B|q+XW^6W^(UL!I3}P zKl!sU`Li*}yBM9mU-&p0Y>al-z*(k7%j=8Mk)vmf#wf~8n1mf&4q&AOlRcUDxZ`ITrAHSC6_3TnKduJj{r$1I z?*!4s@CJIocES0M^BCtNPDq7c=lSmSe3<7i6kc9K?dV41AIb$n1+eFfaF@i~FbLb@ zBizUz%WI&nL=*rh+rC*2H@Utd?)MYxG!or@zbkfCF7jJ0-q4Is^5_h;R76>?{q!iy z`+hhWyIz}A6z**P)^^kml>X=rV;rnS{fKX8k_Qy^S^DP3_MZ@+|78CO@%xVbXKhU? z5kkm^@4r${#;-IP?zNbKb1P2#Jcvc599@#P?ZXq0wAM^VU zZi>l7TMOa1fG>)4pZ(MQdpAu(?x!?7MJyL3#vuO{12aOa-7FD=qwBNjVR)x2wZY44 z)KL|g{ox;~?h2Q*Yby2Ni0F~^nJoLEPDMY-ra?7ck+u7~AMjSO)wHP9B)r literal 0 HcmV?d00001 diff --git a/noyau/font/8x11snsf.fnt b/noyau/font/8x11snsf.fnt new file mode 100644 index 0000000000000000000000000000000000000000..d409f71815947427970bb8a95874a8c6fa339b6b GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/antique.fnt b/noyau/font/antique.fnt new file mode 100644 index 0000000000000000000000000000000000000000..fe1aa6896d786bdcc378815467f637e2b0c878ba GIT binary patch literal 8192 zcma)BU1-}@6u$XEHN$hfhXsv_B#aQo7(=AN6+<{76tjoWy>z3LJqX3znN}DRN-Bns zn+{50Wsjp7dmWTM?WqrA1rviP%!DzD2_!3F8TLaV3+qS%3)arPk`>9hN7+d%U)}GV zbI(2Z+;fjCLe3+1?T59sXX|S&!szNdfCMq(zNE-q4JcqY|cfA(y>iOG*$c=H{dQcMBim<$sT4^HMU z&8wc2zg34#I0ikNzJ!jwPwZ)@DFN+@dpm+#q zT7C-SK|(jdj*T!ZasM^$Cb&;;lo?8^tCW_t)4q61)@-mI2r)u0Q7J2{riIkAsHC#Hyp^XSb}xkMP?t5;rP7zZJnC8^$$xWOrGUu zT9i=#fF4-e)aB({N0X8D9R=$QRn7`>S7;-67I7|Pm;zZg!>N#a;LGvuGZfvwdg;5T zKRx~a?uIiU7~V>`-1zuRu~hm?jGs`GI@C1ji5M@IHX1-19Yp_0l{pyV?^rC~GmWxS zHVm_ujvEJJT&Ek2P0#cGw8eNA#&($jT`{f)(T^4w5iW1lL>juLS*|!RNksnvWPe83 z{JM12bw4Yi{_mPAD>rUjy;|ysMkhqS3X@Nn{|WQG4F+KTsZiKWC=6_M06Jo5h6C?l>-!pGkUF%~M-!E&Lwj^F3CiL1Y z=t?GEGY}1K2@Y6OyuWfRb=25JoIc@PhVp=4gxUj9u0)8FS$9bcM7=CS+(WVxEKY%X zUXPs+kwBu+GtHpBI!Sa#H!S}<@WIZ1CeI0p4;VinzquAEjWv4Itk@O9q{s}~?Q7Q@ z=UTgsRN#&$vHDZ;oS4#B)AKer+no+Fe@#orA^50e*|ud-+Sd8={N-k zh%XN!?{HbTAoB}kas7P#QuZ&apIH5d)yM7)7MwuH{^sVnsQ-1@-Dc$C@|L4%j)nOT zQd2-ZNs29N)a;KhMhW4gvy1TOg*ZMk5-E)}j(=3u;w2#Q{wGbK*G&KGm{6?A>c6!8 z1MxdkoI(9ZHbM2jO#fy~X{SqEGwetsU7^w2(JePJjFA(+8QY|v!W zot=dQhn~-nf>;jlo6V$Hbmw@zMgxm);DQvu5sLbCFE=) zB-D%I+;3pNaNN^Q)PJGhCr??Etq@0YW5nx+d}nI7zJ3f3HK6+Y<74u?e^Q>r@X&vk zvGw8om(}@bCZfi?nl67tQ2V($pB$YtKB_;INA+{PN4S3O7azATvl+HppEEvcU*I44y!btDf1&Zm-U`J@JV6q%4B`g^G>Ee|BXJtU zL&byL$@?8%fIH|ToZ~?Om~#FGB_LiO^h+>AMOXsj@9;bep3hQ#zvYHlYMet)HNNnMkW&pag^p5UKxQ zD7V!*v05k&6A%8ARz-LG{RKgDNci(J`V)2d^EQU(E?(>>7x<0_4I6!EYfJp=Dq{mF zmt9a=-68NVCe5-mF%s`h)6V%)Mjsj(mPT6@Egx4HYk&RA^T&@LJ$mpU))#9o{BftK c=vD8lks-k=*y-tM8D2lTF1(?S3H|Tpf5(`nBLDyZ literal 0 HcmV?d00001 diff --git a/noyau/font/applicat.fnt b/noyau/font/applicat.fnt new file mode 100644 index 0000000000000000000000000000000000000000..b77b2dda30feb412adc9167b57722a839411e6c6 GIT binary patch literal 3584 zcmZ8jL2KMb6rMyNauD_&1=%_f@&iN+im1hIYeIiPe}Ehr`Lb-57+ljV+BlR_dgviH zLr;ZV`U6TY0bzl9Xh?cm3`#>FCBB4UC^$X@so#5VMw;!@t~B4gH{ZNB^X5rPtxA6M z^yui>@lnp*SDe;sgSL2NjBX@(azm*F;cLS%4Tsl6m8Ql-o_??h{JzVNV?iy+Sy`TO zgAC$qdpnD%MP23bvuDR8wWw#DB*~Z>kT}b-*w2088E=k*Aef!MVVzRB<2d3oI`ZT8 z_-UzOTbA`%U6xF!+Vbtc^~*mrg6#}6w}*<1XZ0HNn1nb3-&2?|%eDxSv_3>w{9D@( z{`_kDRu^Gb)^(k+nIFSP5<%R|b@WPk?!xt0L$}pca-7z2I$cq;MWGQ$;=G0fjNwHM zMvb}wT1OKq(WPm6(^iM!0#_(qeqNvE*Xvw37xjVX2h;i|Ru02(xHZ+WgKuE5z>EaT zL*jcbiKkZrwk6U2(0F0@Q#*>d=ZXWqAkkTeEF%ertn-GkM-b|b`wmi!wlf%g* zJ7aW-xiPz*;Rq)fhpH@DSEl<9@9(AQTSl~IB(l0314fE3h!#@6%v}eztea$d28;`a zt{Ki9@u-7e&ZW!JU z=J4*&=(bRZrXgn`I41{yvMV@U5iOJW>ADKEt}8nT%ROwMwq&!;62!l?$hz9h@CuaL z5?#E7vVTCYDTZlsF1FeiIag}BwQ2b|N~1L$-!-3#wSRrh%s>`&o-j+Fmi_G&k<-D(feulryfCkk)U2eD^U}jjTxOXC_OkkXy6h(28#qJy( z&!6K5IUpr+Ma`?Gs7Rv*(L^13bFCxG9wBusq^`PN6E&uSVeGsrz(U>-OV3FxJtCGK z;q_zfEmGP-YNT_QYiU)1wW^w`B0rT;(f(1*X|iOVWDVfOa_97kC}Y}khn6cbNEm7zfazsiW#7r#WJ$T_RCEN2}Cz-35>C=MBhO&T=OyxsZqUr?Jqg<%O#) z#lqZqT(hFPa3uwlw$X@v0H>Zw9=2z`e?vO8xAGD*=KS5IHL#SHR%%N#uCpRLZK-{^ zWBkVRPB1p)c#Z>G_fgrix9a1{IBm(JTVu%f*346 zyNGn(cx7BGNM`5Hu6{9AS6;6RKCvw^zDU>kimb1Q9%MPD9`^6C_};zjeRl8L_eMWM zHNy8b3C=A(;`w9(;jGZvoU=+LPdxRwKP;$HBszicp}>$$scI}u)j$slrXgV#DsPY3 z5>?o5y6;Gk*!;iW{pHDzcR!ce)kacW7RiQ2QZ%|+&?vf$Ncq&bh}@{?lxRn8hnfN6 z)76dQVWh|5yRosqBZ(Y~@f}ZMEfTP`NI)xVgbKHNa`Mk(2j&8ef4E)}{S G)A$cc_!?^f literal 0 HcmV?d00001 diff --git a/noyau/font/backward.fnt b/noyau/font/backward.fnt new file mode 100644 index 0000000000000000000000000000000000000000..2c971a7a2ce2cfcb71b6e1b53d5aa4587ffcae7d GIT binary patch literal 4096 zcmZWszl+>P6dvp#H)4H|MsSA>!KDjT8$rYdOh}bBz0$~yz*{X>2;E(Cr0^e*`vcOX zN*M?Sk%g(mxeE)sn5%9ZV;=;TEfy)?n|bqQw0?Vg()Zq*_iNrfX_Y#r=IZyWt9Lh7 z4GWrKJq*k3;IOKCP@SE)g(q1Z!X(eP+ijBMEKl-g7#fekhDyTHfoQvgeIm=u%U7>T zUQXQQ&AWFuODBK0`}4QFES-Wf_X!-Z#Y1<9<9PD)3FBV(TI>7m>&KRnB5{~K?6eI#iXvy7@QZRNUl@V;camjwE$%6ly3YLec}07N z&B+mriwCv)VWd)3ePzCeo2IqCj_URwU8gR_Yh9#Cr+HOYRoP}ymK%$)H_^ymnt&C@ ziCdkd1ySlVEb}2R{Tftfz}GYA4vg4yxRE@A6c}B$upP^Gt6JahKHO^Atu)J1q66#K z+APqn!ocl$+lqcMKd;KZC>~h9$8I!%Jd1%*Mb{0zvF8)0NfyZI{?N8X?xHu5OZc3L zPuFCF@)b^BDRdS$7kClLC}Wnxeu1r$-2&e2c8kcxcS7w;M~3wq^m~o3vv}TJBg5G7y(Dt>Z$I?Ad!G-b2dXlboBUwI#Ygqm|L*GI&MFu=a&-P6k8!wVKZo_r zC|+7ladAqKVU6ut&AmUQH>!u-QZKg+;4zwUv`y4LhhPHqCFZF+ zPjfh%;OqS1mZr4~2qOcWu>DQ2ah7FIxN~pLBaU;?+KxqIhVj!N4)+s_)u=z9A7UEh zA&o^%cs*icp9m*>GVv^I99rt?u{isBcW$#prZP=Z5c;TbU97p z#j;5E#Im@%|8LJK#vZ-H@B*b))wEg(QVOV=GXC|O@T1fpKZhTs{{9qxDB6$&Ket@Q z&lACTRU&$0FA~JX2p{XeDMa7ux&OTW;z<6cxNw$PQ?Q8(_MM!s5+7${N=Y)t^k@hP z?L;K^3vb@2B#Irqd^NXjmn}23nYq)ds_#E!=dLqC7V5V8G-D;)U0`Pqk z@y|U)@87d1iZd6FnPwQd4)^#;Wd1Azm8Nc&7J)l@eU=%9dwQi7JYTKs=FlQ{ev(r= zU15^AXfL`jVMh9gvYCfY;;w^UO+4sn%|qfi*deqpzPkL*`l=8nFcY E532`_hX4Qo literal 0 HcmV?d00001 diff --git a/noyau/font/bigserif.fnt b/noyau/font/bigserif.fnt new file mode 100644 index 0000000000000000000000000000000000000000..55a358cf56bad8feec68b03d9f22b02ffdd8a1e6 GIT binary patch literal 4096 zcmZu!&1&3M6ux1K?8Ve>cel*o$s!LRI-m?#$RYFu?oZw6-|&=@?GV)7JzfNuH# z-37)7CV@h{HK+{%L%r$3U`VnkR=@LeucS$jJ(9kA&OLwk+;b&kHmNxM_4M@h*=eDS zqN$svx^5gcQ3*=M+iv3aIO#$g$Jf`_*2c=WanUqIi!lrltK5d@x`KWp8I1GCk8_<) zqt)5#*JqXE?{0nlU7Y7m!0@w$0o8agJqW{aaq~fOnUz_V9bW&vk^yV$_&Tn={G)WS zESHP)k+99Z!PcalYz^)yhX2;u!h1YrGSjK@%et;lMj*jS7LKDVi^f5gs07`RGDTjW zCR8v?I6fY`_KX<@WiV7O-E3HfPMU|)G0WXLZ&;qi~(-+NAmErI$sroSCy{7qON})+VH5ZcUT`U&&j*>`rQfRFuebWAM^rQ zxSyt>l@M_ch%hb^wl3l(E@~e!oNLIz4YKx|`))`J$w9um8TSUHJ6*jLZc$ZlF6!H> zs*?4vvtuYH5?oY+K@g{_RV7LZ4-))TKG@ld@^u4`cUfVx0^POzJ(ybERUpyVRAirt z zN}R)&hWx2m{tlZbE9i2k^Uo>5)w#yQd}1rV$)2Q7mrv6tndHmiG`;D}zd+W1Va%2~ z_F~BmuF?T^xf+7?dc9=%t1O=%FOKJVcE$LHt0(pL&`E06ss2}2xAnyv9#Q+s?fPGk z66c@r|F|fEEzFSkVNUH)xuf2x;8|Z&pQ*>Xrh~T=$CgSU$T}#v0lr5{XnT%BK+)q zE0<(xs_kuu)+foaJ|fRTNme@kIQl*em*lapXJbwvUIe_Nt$tZgF7;U(zcE2z*oagB z%cBJ5xyZ99iTeWw9{k==Nw@yK=K^hULO5wL@lgX(0T>qlbVmcfe~u)0t}#hA+i~-^ zVVX{ek@P!Oitu{*kVS6oRTULLi*a1^)`{FZ7&r@P+4;~;OO~g-YZr7;d-RB9bnQ)8 zgcqWJ|ERSiPgE0`Xv4tX^a*y)bT1f4LQt3J?|Hs2!YDq3>zC7DvWc?zxqD;>BvjQsl!?XP3(uIJK@jG^w)&gz~eiO2v@_WY!LcBuI^@qC`Nr;#zU`Fv)U;tOB7dP5%{kCoVN z9T9``aG*H-fCB*U7gaEv(2(Hi;l)HnSYO<}VHz`v=FzC54k(%{{`QCNpD{oF*8MZ) zuNU1vYEE79__K^E{%k#tgg(m6J8{>;oAMt6FE4WLs`KwQ_#cBir&%REX1}1{@%8Tg z6TdB|l6Z=n4S9Ou0(t(#VU_dpGR`k(t^CA#dG+t1+>PP;!|Sx2i+N-1Nwp-5wd^1^rY!>>thNN80ZJ6MEmnad@9)@b!e<2x3H+(mBr~Wrmh! z!}dTi=3ow*d3ov%Nf@SXVE>3;Q4|*FkocO@*KOmvv+IA1Ggx%}cn{`q{P^!bs442& zbw6VU0pM+su2laR-xo`KUuZw2@Pw3aN<_r}GJqAKYWF1qbMyk{dl;VSh0Eie5p`4{ zzd!7ybXTaPUDL=-Euu%Zhcfp==Zd@2oF27!mvi^eJl1$FDc7!>Vb0<*Oy7R)O-`74 HLmvDGMHv`$ literal 0 HcmV?d00001 diff --git a/noyau/font/blcksnsf.fnt b/noyau/font/blcksnsf.fnt new file mode 100644 index 0000000000000000000000000000000000000000..1e4e53e7adb20bf7b6e73ebdb0ed60c3a9720e72 GIT binary patch literal 4096 zcmZ8kL2DaV5FT4X*?_Q@ki)iF93eyyrI1Hl#6q_#+vwnw9D3;`-Wt!Z{EzjdAn2@vfMi6pV-S`8*3;LxUS+6&z#%8Dz%5)dq|KyfE|(3s4j%GxT4u zCQLUr(vV>>J9zu{V8;CNmE|9gj*dpgAWYLV^m6vtU+pWkeRgd4aWYPltq)U!5AKI2 zC*l1AgD1!5^Yi10fv~s~&7-A7#$K3vUT!1C<J3`EJ+(-%7tV=tfr*#3(WnlNTQYh;av=+DN| zN-rHZn9t+9R!gkE6_qE6z+(zP?01wz6`oMPVb{leDQEVN4T3#k3q;w-`eC<~Uo!zY zO29w}Q-orFS5~*4Y^fFI{a!*RhA~D@U&c`q$FayKOEKWo9`8Jk>C5&S$Bc3Q7G}s8 zPg71O%1B7%7xiDRVL8QmNje-2QyU*fgJRc9cE{t#BK~CO#Zz3+xX1k_i5O>TnxO;6 zB_GvlMxpbU^OfHa^YQLLV$7j*FZdGoe91o^?^=IJ(xZ|KzUQMbF8f9FUx>#=Dcc`w zwEGPX7eYKf&8FquV0g&R?11k-c=)Wg97VOh*dMHIlI+;}0#-1N?f%u!I@$V0_~<_z z3*J{51uS{A@7IjS(!a>xg8<8E<8MNlP;+$QL8;YV*jr_PWG(FhQfdI^@i5R92uwR{ z_rK(KuuIv3^6A?KfTyd~_@g*%WNfX<{Cvhxc7UxzgMq*G7uV$6S{89*lWS4nb`+4VmhyUV2PLS zTZj=_`^l(&P7332k}n*7_~&nX&(Yp(!)b4yjD7hqi|qrom`o;?!`GFCg$0S%{@ncT z*4ukQ>>|8VUfa9yEGx#p-gZ^pF6Zix4PvhUeHy@2%7K_hH z9pf{%RA}5qIi*WiW4fMKaj`&2USx^XsdGvOc0M74Y5FDp)H&C-bR|mx0Yk%hEKj3L z@wzt!O{o+D)36}rMMu%-CSAD0kQesET(ZBZCuk#zuTK}7-|bdkH~{FkZddq^l?7TJz9R0_7vVFzANL`^C=4(Q$fqwc)K!OG{pR@EsiSr5_2ivuJlLo=z?h< zwDP6xLWd-pFIY6DE277B;C)09gF$-n~1_K4`bY!C+)gVZO1kro~t+X1{g2 z1A`!cs65AQt@9(w8Sm}wZ8Hzh9t?gk?ns^4Y!LZQw7$L`IX=(uIz@+{M`1df&C(9P zAU0jcZ@1gl8mA5S_w7F^3!mTm;?9?A)?2HkS}pbm;YKOUfi(`h&DHsz-TP^c)y8XrsLN!k1qylBxaMYbwQMWYW4bG-HT?>`V13d a3$Nq2A)|5-p|GaD^!2lU58mvVd&K``yZxyE literal 0 HcmV?d00001 diff --git a/noyau/font/block.fnt b/noyau/font/block.fnt new file mode 100644 index 0000000000000000000000000000000000000000..0ba23fe38445f9415fe031295a529af5cacec144 GIT binary patch literal 4096 zcmZWsPix~w6raUl=itWlHYFl1W$zU=Xbo27W!taNYf(C&T#Rj4r~?jC^D*`V^wRIJ z5b&k9UIT7RPW5G32NqU=ELMMS=Dm^ReTg;x&HMjm^k%HoG37VE-`u=?bCWY8ueMdS z*;Rs7RDhD;L=;bgqzQE#?{+(_W9I8Pud2Mpn1+aEZbh`)z&??ijI&p-GFGSA&6~Gx z-)w|G=zZ~3oMj@Q>~{?ZY;ii8hGDpTxMy6L!WeV8`|s9GXuXYh@z%?~OqbWi^)h|w z*y>rQH!Oy|&NIe{Uu&KFh)0&xXvF+tyWOtOKn^D+3?gHqplcGApaCUg7$>gB5i-8U>wj9?@l z)b5*>NE8*3{n*)lKQR|+()qz8eTnhHbo+W_SSyI4U^36LiNjc%lsRtbYfOcq7H!?{ z67}m0v$%@0S_jps@Tn*08z#bfhBs0@K?01PbznP8Z+~N)?{@nVJ68605XS+LtX{s~ z?+5w4Y)+MzWv}R!rN|Ek-!7^Fi0xJT-Qxf{!iWC-p@A!y8w``{$J+l6F?j#vuYdv3 zcai(>Ig>hFn+?j>WqTN)>a|r$Jj$5)iNW&pm0vC3#bPl}6Xx6e%CeLlh1lPJdcWTv zgpc^{8~IRfM4n%k)dTb;0@y1bs)vUM(I?!nkJNV+J(!Q}=ZGm0GA1yIo;@dN(S`&%A!_(8#flM6n8~N|84dGKdjrF&=!M)g{(1?!kuhI`Cyqdpy zk-tNM**;RG<@fnk<^JEd>vAu9I<~J%7>YgguW@i%_p7+?$nj6mjM(sJ16kDmy=$Fz)pfT=XFBL7JK>ejwN5HG+-l9|j|&=0gHjF?mBql+}X7@c=JZbh?9;dJ%=ni_Fpid0TBD66=e zcs_(%m>PMLA0Y82MigZ3SxYvNf zvFS5LV^qZ`Ou~^bh?-B%^1Hufe+{E7D^QP1S3k-hEz?Ln6bv=7i?`-ee9d|izllko z%uPG4AjVL5bb)aGnC<=HYOuMz-T3=X5PcV3p(VVQ{j|wqoR2smo&KjRyZ$9xWZ4IY zPtQ<0y3y!6yF;h|&GjKXCbnB1MYx$C;a2?EUvqaQA_qX`^}1MGa(z`in}D}!H8cpE_$(Sz>)AjXA3OVeR}peQw+fyQ2*xEGm{rDX2aQyh+e=w78x1z07rwjNYPjA_N5T@yMnugp@DLqHbR|PV% z|84>+Lc85>5xAr4v+rT}PFHG=PtT~MI`Z#_zH{9bCh4uI+`t~uBkM!i_CpCpM$&0f gjR&@N?`ARQb4Rt7ZU&v@U6}s)*iud`wWd7yA0{v(DF6Tf literal 0 HcmV?d00001 diff --git a/noyau/font/bold.fnt b/noyau/font/bold.fnt new file mode 100644 index 0000000000000000000000000000000000000000..1ccfa5938636d23294d91ae8d9296207e88d439a GIT binary patch literal 4096 zcmeHJJ#W)c6m{ANS5S75AZ%GjYAVu$S&b{`tTUHjN9Hnm0JNN6|d)@Z&vo}$cWTOXZdKdwZm1mPI%K|^i zGJXP2vNTPzByfm8r%%%KBuytlSDpqA{|8ymAI>-OB}1Z%AMXH12f;r(x_^BCsH+dv z0A0T9(TD|g_76w*`aGf9%g@UpK(MDiI=UM;^?p9opA35b6RCF?>?M3pC*R+{sgEA@ z>dW?r`~7-hj*ubVWUw>b>)kKeBf9>i>E3W>FbMVu`?b^Q!(_w?gN|quc#z-5xIq++ z$JFY2{-keH*R}Wax%c=%&JXOx#f3RLJ9DSx&%gh8k&N^5+vm4;L@zHdFU#`F=Z`O+ zk|TUBh9XAMNpXH%0oUh+><_*j#=s#2HF@tA4xjgp10z_AN6VY<{lM1V5QlrZBk3+W)L;Q}AG1EMN&(4dOhCu?`h_398)U&^y{oF!lr|r335YCx~aNy`m0VGRMXYp<7}i}rYiGsBJm(Q6vi)sDr&_8#E-!wAo*18zg}0B zosmmFq#m6wYhUwG>wT%?hE?0Ije{g`8~S_Rf3v~E`}%6cW6B0b_9=S( zK}WnRuYY7r(m?fNgkCbxU(kLb(O7=5_Vk5Gj9clxvoX?xX8tsr+8PUBWj9hgnjy4?YN zpLm97Twj?#`Eq%6g&hrJSwifON$kCitxgy_zzxuOjf>N=tg5m+E$|Kld|lcnXkHv7 r305XKD00f>Z~spI5Rh!K?ZCDJ+YW3yuG>B|GMZu7mQ?) literal 0 HcmV?d00001 diff --git a/noyau/font/breeze.fnt b/noyau/font/breeze.fnt new file mode 100644 index 0000000000000000000000000000000000000000..96ecb0dd6649cf3e1cc5995323fbdb4b84b33519 GIT binary patch literal 4096 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 TP-nPj2frSblzl;^Ar1ZqV0h(s literal 0 HcmV?d00001 diff --git a/noyau/font/comp.fnt b/noyau/font/comp.fnt new file mode 100644 index 0000000000000000000000000000000000000000..686266519ad427529fa01fdbb36c8ec8897bcdee GIT binary patch literal 4096 zcmZu!&ube;6rQR@=&)?m+q4l*3H}4NRdM#P*ujL5L-4KlMTk9#qBxKkx@;UDbSgRI z=1Xq9Wd$%8FTW^sdMlt3eJ*!?swq!?X-_q?01iTGTZh6xj;HOh=Kn)`g*WNAPdR zaHC{^xrgwe_$%x1G+E)yA? z9>?L}_;?U{$Ej5?S8ADs&R2*LT&9cUF0?ecO@sw1Ny&f~yZ+v|8dX72{CqyOtp z-UfwXn5HSEfSF5EK;k-;%1r=*f(n_tSX{kYR#;!p%wKpq>&2PBlSziBr;SEFpD(!I zYA^2RZ$V2o2*Z|`(&$sQ9U|YbhlCM742Pn2a+02$2%r(|k#;#Y+?M=ubDdNvRAi|E zLVoi(<9sxFL?j)Q@S>lOn$2cDKNb1%SI^({eW(8`QI7n@A11>u$@9^EUiJ@v5QA7h zy?whTAB{%jf#nz|cbC7zQg74K!7$|Z8KW#y_zT5>_WX`(C*o(rp~Bx%e(?L#r+@5A zc`EJq^HU<0FP}d*SQPTfc#Q73e&myhQFn4$jZi4#3*foLgZ%;)BA<{Hs`eDFn(wFT3sZoX}@_ax)H9Bm6aBz^D^)LC2u=-a0_FF={K=whjTo?}N$u?vs zI9gwA1?*9Vf^NQZi3?k$H@?b}Bx4-MS+CdI-4(199{AzV;bt?td2?rHr!4PfD|x3K z*$3SDhreC;Yc!0B@ejPqay;4XHf;iR+-ezC9QXVEY^6`@g*GhdKlZrCkN*PI;)#FC z-^8!Uv+LKdTb9eO!8k^}?s+lw(}u_P?a%5n?Q;E5ii+F#F=BnC9-I7R{*{7$w5rGI z_j=MF#Jhd}Nc%J_fsJwnmJn~oePw~r`{FO1u%j<*e z%b4`bcv{`hOgg;5Q7R}eukBY#6^GvxuU?y{11b-0-CDlDdE*7?E6x|w#q)3Tb(r&Y znDop2BzYNAJy712`JSr0vOguNwx3|0vmRE1%(v=n1VI`E$<~1+<@q68?jO&;tA}tUe=IJ{50yavfvWqh@r~CJCuem_SSh?X zJDuft;ua)SX->p~#vHF;i-Yg)+`02bG5_%Qhkq}DCHVdO_aDAADmb}>A(dwhaP213 zr0bAUK*`kN8(&v{Pk*ZZ?!T`7$nXEqMU{7RxRsVuqBbq zxD`|tJ}DQ#$P4wU;^3Oow{8ljZ`D3IeVb2RzEO1#Yblu1Dk|YNHe9-{K325Ds$OPq z)$E-=&PPi;i|f;+qO_46FWQJeKVcDxywB47k}bB^3MY23SwnR zY>DM~8V80LX9>=iI&kL&GI z!#$m-9riDqEtO|ZhI0MbiQsItAJHy}zol?62wh~kDQ#Ys<%}=kIP7`TLDcb##O}Rf Rhd^{zkko}85ecY_{{fp=oSpyx literal 0 HcmV?d00001 diff --git a/noyau/font/computer.fnt b/noyau/font/computer.fnt new file mode 100644 index 0000000000000000000000000000000000000000..a763ae7c0f3b02de3cf22f4fac9beb5edcb640f8 GIT binary patch literal 8192 zcmeHML2DaF6duK9C5kGmhmtK3c0x_aahrg$rHf>O=%J?`+)Gc24ci<<&?(VjS$SnO zRvSnY3L*Ldg^*ra3?VrL>-M*RKl~?k6tNwsI+1lCp z=6mzz&CJ`k8pg(nY5ihZ51N)qG&J2E*KKuO3TN3WNG_8g_$-mhMZvPBb-P_z)(F0= znXYTnIM6_aOt4)p-4@u-1#hJ3=g#Rw_ng&gK6ubeX;&JZjZROeT&Yy{*7kat!n>3tF*QtVZx>byuII@kAz*%T;Lw zu=#Qsdi&9e1){2|oJhdtRaLZQw;N>}WA%F7sn_kU+wG$Kv~%<3btilGuA`v%`QKOd zq^#(VuUo*pg;IE`#mqv>Z$o@&tviuW1~==wPb-oLxP4iQWU$~Ovyg6(dA z;QZ=3xTZ?;L1`wF@xRa>26zHn1K#BDb*&R`}|$EZo1&3qE&TaGcNoTE7EA;2biJb3yHM zU%cpax?NH~#Hacd2u>ggR?R`51`tZT$N4 zGMClWRkZ)-H-7kj*|Mx=vx(w-ewSemR{q5IuLIK>&pv0JpSN(FujF3X0(#n->K9QBxyPz zzu*7w_rJG+-tYf|U2#wvxBoK=aR?}JCwjCQJLdhp13V5 zR6Qs<`oe|Eh2nxvq(JTV{Jdezx7+OjWvF1-lB7WbZyQ6^gB#o4+G_9a6606ZXq>TK zy;Q1HN+o@FpmL}n{L9@-_}6~rz}s;I4v?50f^P^ed=caGxU_yTe|&<7`O)-;YakD) zA27^sy*Fg)2O43XN%~)t%^fZ#%`X|MYLqDdZ3f~<(vai*o1lLjWlZ$WzwqaG2%kU` zpx$qak~;%}=U1!+@`mewgIUMe9=JYg|G@e^nLA1Pk8OeKcU=D#u0IdEE0=>WJiq0n zO40x)UPAdtB+a)^LvdaSO9)0l#0S95)2HDltP07W&hi-Gwx~qLu${FvYJG!N2mw3* zkoq-UN=nrF1r}`a_Aa%);KeB#hY-L60JZ-?zaQdA`$Pz66Z>1(Cn5mJ_d)=%|AFO) z0F3`pVfZuJ=9@dipHckp%fp{h+>Z@|3xW571}NT>Nj&SxzJJY*^8I@!5+A33Un2Df zdV?$4zcYrvFA>i+#(cdbF8l`eqx~LKlK%7kK6B7?xa8wRY#g+8{dV%8#xDf=Dco;H z>JR#-_@aJBo}qBxe`l%r5%p)4{HWbS_jx6n|CW*V3q3A-JEnh9zt1Q23%ze?{lYIU zZJ%!!sXyqS@~`hFH*$R0Ea~51{(L?7C1QSkLVisDq!pBneh{Q!gbF_eq|fl|68r#D zqMwgm21w+8FjU?@WT3-?4&A}K0|*&oA-@nfp8tU!NC6=OB=SG6|NUpr_Cq}m7a;|V z%%32CnU2a|AO(aBkjVd_D|2(RU)m&b7`XR0Y}McnPQUo+0u>|pPuKi(gc?6Tec-1n z1fDu}EC?=e9dzm!0%&`CyF7{o_rNmQVQK&~cIheq!$mEXR2&J{MrjxA4jF#Hj!hhq zCO0pr`1?I$S0Ddz`}VC{jm7~bT$=mmaxSA?w3jDh$Pw)9?5qsO&!!0{^kLTjE&m6W CCR(om literal 0 HcmV?d00001 diff --git a/noyau/font/courier.fnt b/noyau/font/courier.fnt new file mode 100644 index 0000000000000000000000000000000000000000..dacd3a7415f6858c687c4cb8ba871b8307d8ba12 GIT binary patch literal 4096 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 O{p-VMu(C8_1@IrMAFJB{ literal 0 HcmV?d00001 diff --git a/noyau/font/dblmtx14.fnt b/noyau/font/dblmtx14.fnt new file mode 100644 index 0000000000000000000000000000000000000000..6a3a99b34ff3813af06fd7e441858460407701d6 GIT binary patch literal 3584 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 z leGt*%%>>7syT4bd#B)cv)@cUui@Uh^z27|<(@>Sg{{nOump=di literal 0 HcmV?d00001 diff --git a/noyau/font/frankfrt.fnt b/noyau/font/frankfrt.fnt new file mode 100644 index 0000000000000000000000000000000000000000..6123f78a8dcb79289dd962730c66deff2b64dc51 GIT binary patch literal 8192 zcma)BUuYx886R0ZLf#5#p88h$aG*v+EyVFd9>jsta5TYs2wYtPK0}PQ-;7qW zq?_M5pKNJne)IjlnQvyk`J`p+Fe$J9d42u%t@SeKSoWK~Uu*dYXW0sgZKyz>sfHZ} z>z37OwRGJA`npy2{W8W$jVN@W?Q?0>X#8B{oh9LM=dYr87%pzBSmWi=uHd|}0_cq@f@xjKtPM^ly5 zXfy(F^1rU@W$0mc{@wHU+Ku|pA4^CWOmjBBcW3e;&B!WaW0DSjG9HhQk;IeI<+;1E zwzjrY-Ptp=Z=~X}2N`JX zzB`3+)i7+kf(hvG*#2QCj|QAN|uLbcm-_|r(Aqxf-U#ux^Ix@tU5^FNwI zJKSD%$c0b*_%Xw{Cp?`O?*^S3j-FJ8ZxC z!onNlXTj7$U0|${a&-*D-9Ir<^emq z*Daa8aKWAHRR;_DikY3uWM)c(&Hc4xhB8>N{yg?gWJo6P4VlbXP@lyobz3+X>pz^y ze0?l(Lhiv}{Hqz1KTzyUYT6je4|r@PT#IS)8zw%NvS@rTKUNG<4&f(9Zu`w<^Vxon z4wje6eXGX?+xlyCh2i^+vH8+WCUYZeKGLt#SB^}kUH4j60T(o5%X1kshwdLDdU(b- zl979#v6z-RZ2l*=DFC4T$5?gwI^j5dsxDQQmX@CEo6%5lmaosbdBjkdotvJXJ|0Co zfEh~6h>wrUces{FBv#0P{CZ$w>vrCTMio>G{Ok}%K@N-7m;K*`pgcM_FoQ_as zN#qpmVzJ@t$o0v7NBr8ltVi1|F0L&Wif&tmGS+BZzU+CI8;yn> z_v(sbQ3$Pja=c#O+G=cXgZbxj;W!;mw^UkNE0x@BIlu5PcQ5d7{a%~C9f#lqiRA(M zp3tQ?Fu#s2<`?V77YMA6<-S)Xc@O=7QT}1Dg)RB~#qi3||8)6MaBDW{3P$=RFPHO5 z$bXw%X)B71p=)1`GA69^H*h~5;8AIczV}ztwD|>AmRV=4M)CzG`9hBGkn6+F5AENy zoreBnTSWaO=iid^=jn9WHodjvIJK^69y#$-1b7e+LVyfEc7E_R+~>u22VcYZzpoFzhVj1ZO%wsX*X<|8 z_jHKUcT+CA;+@`x^@Dml6hDlASAqOp-tMQ=e)|ypT?O22^xINLATIny#D5F2}a{h*)TYY7TneuM|zAb;0B(iiP1J%#YVf3s+PMEk6nA0GEWJ#U8V z-)C_Ag2!k4HxwZQyi^g5vzR~7hx|hSKIRvG@$vXNqsl`5u6^X+U_O4p^T7EF+M$2D z>lg6IKSI_wP{KFM0S+C15zB44lIDazIFT;31Jls53 z|5zm89!vqfIwgQ1_irZ!#Q8xt1p^d83P_KU07bo&%jHV=e(Yp`ApfJOa{H8l4oQ~Kz$G%pPcLl7y9fO4GLZ8&Ye3e z!&tXYT4nkk-K{?O`Rd1v{^XJ?m2z^Vzcq|q^b4^biH<0-%|-YF$*({7*E{dry!ra; l{RR)p^Z&VS8`g6D7tx615iC7g)9LYZxlB*!4|KkI>Hqk1I$8h# literal 0 HcmV?d00001 diff --git a/noyau/font/fresno.fnt b/noyau/font/fresno.fnt new file mode 100644 index 0000000000000000000000000000000000000000..842ab5c4c674498eb95327685d2eafdf48cefd66 GIT binary patch literal 8192 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 W*S4C0&GN!ee!J}$$0VI52mS%6y{^pw literal 0 HcmV?d00001 diff --git a/noyau/font/greek.fnt b/noyau/font/greek.fnt new file mode 100644 index 0000000000000000000000000000000000000000..510a2887dd310fbfcf1e466f65cd8f305793397d GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/hollow.fnt b/noyau/font/hollow.fnt new file mode 100644 index 0000000000000000000000000000000000000000..0a496784c63015cd7f5af17d16202119de135a5e GIT binary patch literal 4096 zcmZWsU1$_n6uz?VCZyYhLRzL~niTP2DWMFmj)9C5Yb%t}2aTyMrM07jlUCME#DcAE zXN-N)w?6t(HnZ8Sq^5{8KKYZnL`z>v`xF`r(NY(Rh#iUH#Ul4w@97WAmBr!7s5L@q*hMl^dgqmfwS}jep1g}|s6!|fR zW>C=t8=>^Lg7n1dG-3--28l9tS75i3ZFfHv0mTv+)IVAn@!TM++NIPcV@GT zw=0BmU7KEe=ls82U0vOTqg&U`T)Q3fusW+h%-2EqbblG0>+0(5EfhW-B7GkjqyF-SFS)qqtW14-#SV?j&9}tpP}kCbh1MB)+q5GA29njW}t=h(BBNVw+>gU zjt&8x=kcsVzPRvw97caAVm;jt!_m>v!NEZ>9>C%3>>rTg&#Aw^!UOLDx%KFtJA_-c z>EFlRMvvTIw0NGD%f9_`OD_U?vhrLw-wDM?DE{w(9yPV^6z$jl z-g%^6KTQpg-%D3p=zmvhT>A0q_gueyy@17o>*wn8 zbJ8DUk7)bFnEIFd9rPd4_^w`(OJE0$=h*gawgUrT>$PuTc~n;jz|DT+V4?Ta*$Ux} z`E5^W$-dYl`4**P?xe!C>FFzDAE@%ws?W{WzxhyAw4Z7R2Dcqu{95YYsr~kuxhbD7 z$r3Sjs<&`ZeUH1L)J?+0>kU;ttk$YV5QjR#-*8zvmQP$0ZXi*A@sQ&jD)#3xd`Eg7 zgRiTq*I0;cH*my!GB9RV&Q?4qr!W@sB(Ix#3PZP+=Xh2=2eS!+{*wODUlOCgBu0J+ zhs(|3ERn`g@KU_%^5MFC8(=sze1V}fvY=?#Mo}e%m52NMrMq(e229TjARprtu80@D ziacA4fg>oQ3iEhljPWJ&iF^{HJ(`bXctTtk!@~mv?@!RmKO7C33kywk-qFpi#urc$ zPWW7(H9ZTykMM=$_?hQb4to=x_k`o_KFA%OXtX6-A((*Vd?6k}TI3gTa(swW@x%Hm z^CJ;<0LVRYI+z$2`DIqAWGB8yY^YQkVig_>-62r;oT>3qTL34TgbE8XnT){BitCj$ zquk8p2e66b;`pxvLWTU{8AdtiGfSp8olzSgvn1FT-b(%$dv7-RW9-k9$sgZsm>n(( zuch#srZ60pP*&+~s*u)GxLtoWr}Vj=ybJsFHhwj?EGO6vpvC$Fn$j2X?ch(w=()ofN%c2kr1_^z`6s=IJ#DjB`hr*b zr1vz|r}(1SANOM_eQDo5zEppvsp2I)7+)&>#CS#fNSl2mF^{J$U)ulXOXUy$3yMYc zDw-I3oD#-*Qo@*0RHpDUTrQQ$;(QL!c750N9p_cjf&ZRhH-Zqt8=n6`1P)v%X|RC< z#j}wT$dJNV9qh!hf4EF16v6vYA>qF{P1Y|_on`%_YVAUIvL5$CckuZU=PPpJFE2}L z#xgm8Pkd)V_}2}`sW^@y>M0J7i{Kdq&i{A=%m}V_wM3vhJV2`&2Jd*NR=B$lD=HVY zKeQ!YUBM;pnutF{k5D7yk22Lm8H#+OO-f?iL%Dlcvc!0nFxRr0fz9NS;rzUoGPX%l HO$z)6Mjr`X literal 0 HcmV?d00001 diff --git a/noyau/font/hylas.fnt b/noyau/font/hylas.fnt new file mode 100644 index 0000000000000000000000000000000000000000..fdfd94081e3f1f55ab4a25c2d3d84a21aca53c62 GIT binary patch literal 4096 zcmZWs&x_ku5T4k<(ZSugkiaV|ViSDWqo_eKSs}Z^gc3?AA-R+ul&ENXFpeRIl*CB8 zW(hg;5SAXATMq4I>7THHB`&46UKiX#PW7dfKp@E>tUB}Fo2MsdY)krPzBe;(-VZ$k ztV_1{%iiAer+b+;WW};57OR3W_&G}GI^584LmP@9Sglq<1llfwtSGV)qZ%nfTMLra z0{xRHWspWus+*H`@$~ugrwg{9KljlmL7FlFs4+T)-%@H}t&>ZQhck|#;Bv-;;) zDTG)Ct6*vP!+1K&XVZA7%y6cDuAR5f)z4^*`3oU3lW|W9^m^K!FPF=Qn8=pZ`b8EGdKSIecW9DbW;mo$Xo#8ikqLQD<_?-^(1GGh! z9l^D$wX=P;v3}BqMTr%%7@jMgik}edCK^SlXiu^NASG zq6oi{RgWP`*&j06cIrP8Oa>Yc*tM5i;eoD5*2l(}Xgxdp9{-uA)-yVNu ze{rqb*RnB+0P%^cThK`Lq3#KO2)j z8z07ka(&4LaH0%ufEgFZlp%KTUJ2 z$Bx1(Up!H$Y5}0*5FulgZ;2^CyPjmXF}0`WgSsk6l2CedfKc(Y+4#q!!Q%LMVa_|Q z|Ec#q9(eBY{8*%cDDb2AoA+rtyOZ8c)7Q%1#wON|PBh{~&JZeqJ)VU7WY+a1Z1<0F zCI9USOw^Hx0w7B6JT*2MSQN4G3JYfQC`eR?8&ZHAW{#d*Fcw~P7ZXMbmfWPnCAAAp2 z#Nc;It?@fyu&?Bey6K<*rxm=;f7390#pA1Pf4XLW(>P_%nrX1i3;nZQ-%WlhZy`%b zHjRrlK29eRV{bFoJi}Ldntmjj-xh|i^Sh$%0P=pt8&u*AysG^z82^%2z}vORRrLCMX)1EOhfswJsFQDd_D(U?pcy#aomwc+&OVIqDVxSoI4{md4gLS zF5ukQVK7GN8%(=H=y@?KwkJ&z4Kv&!@!y=_Jwor!y#LAFI>Cs%A78?7`1&#b|Ikgg zTykrGdIRC>EI!u$T`!JjaqQ{+l)9%x+W`|-U!}kiq1kJu2!_LVpl9|le8zW7)8LIw z+EJC5^&w8w?ussH6%^{GBjO&3UoCP!WWaZ7Q;`y%m$mzM9O(X>P_214!#2|sFaG0Q LrEw^wqB7urD#Twb literal 0 HcmV?d00001 diff --git a/noyau/font/inverted.fnt b/noyau/font/inverted.fnt new file mode 100644 index 0000000000000000000000000000000000000000..1ff13cd8e82c5746abde789bffc905a2ce385311 GIT binary patch literal 4096 zcmZu!Pix#p6rUiFeNZ>_ref7wNYHEF*>?{Wq5p<>tIgAHCJeCc=a2k52W zAz;``ZoL}RLQdIB4}n19Ly7u(Gw;38I-SjW=lz}ceW@|T2qG(>dY6`a}^yc>U z>sy#GjuuxmO;ddH)!tLq5B0IdG5q%Zd77q+Y~kR$ciXeNuKT)I{-M|wLoD{4ROjn{ zeO{d~{YkJl@8^5L6X7qq7-y*cS!Oc3n0|nDJq&}>U)Eug*L9wxb?F!oE9SI6Fm_iT zl<(+wbf8o!3i~ip2=Pn%)KiV=tE!ri&9i1~o_R#ymu2GfWA>AzL<&8_?hXgX$dLN$ zsNW-oZkOkMZod|cqO$%mD67-DjGT>i7Dr)ys!ETWW_g_Cd7>EFRLGG-L@~B$8jFXJ zrWJV)n_?^)FOATQK0K-4dX~{|;mib}?Ma2hLd|bk*B95TGf9_OM6`-T?CEREuJp1F zg2NzC_-PpSO@25F`52;i$cO|O`fI?c_z!#Oc&$gG+b_!(VGt|`$FOt2djW?*@h~El zT91U^pi`w;fwMH?VLH+jAwjCYtd^_Q%ELIirvjFS?ojL{zM}FlJB4?r*&*v&=e8U2 zHN$=O{6+ENc_#i}rRfg*ZC0 zcCkE$lQl`~X_|2u2&48kh2>$G^jQ&x$IU4U@VAZVFRZs|D)GU*nk7emeigQUQNb+F zKb%p~vP&c=;*vtYmf=KriS*_;^qfV?x~kN9;J}aa55t+K_ftB>cb)#g@h+OMgupQ~ z;|KB0j&ra7knB%Tqn3rUKQp297xG`^*&}`{;&fsZ592$pAL_Gg>0z56Nv?r)lw75w zn;+Q+j_g?J2Kk>IP5ql4AYmBk(k~Q`W;(8>$%Gj${oWoV1|=ylx}Ta~VN7?-(?*&J zY%?5pj<3WUTbkH95G)O#gHRL7Z$@h@MN4xOc}-;NUVW|W=?%bjNr{6Ifd;$M216-~_@L<6-VaT)YJOQa&A)^=zo$~67svq@5a&zWck}m1!y*1Co$Xhc z`%CLf$E{-MIx5?CGE>&(sBMp&f$)#6G;zn6$=zu=f*|naKaaxAGL74&ep?YW2d@%(6u{V0zWX)!wzE%UP@RW z?cW?vX1DpQ#yG);_<=Ew{xNhC!q4I=|1tC$Nbs}rJ2jtKfR!5Pw+E?xLg3%IGlL7t z7m$9{O~_ zW_q@Lp7;X||L-mCn1kk@y`mVtM9eT@^}R;_*DG=0p=#`gL4<+3tGW+Bgn{Twt7<)Y ze?u3oQpMql`{yttH91u5;84_VlPGm=lF*D&rIr_Fk}7f)tI!$@0d)`HBAy p?dPG@s=RjNMFA#7`;U#GJcxm#khk|<=;2M3-pd1^w96Cy?mwa3dAtAs literal 0 HcmV?d00001 diff --git a/noyau/font/italic.fnt b/noyau/font/italic.fnt new file mode 100644 index 0000000000000000000000000000000000000000..2ebc0962b433fb96fa6b1461581ad8dcbe49380e GIT binary patch literal 8192 zcmb7J&ube;6dp%mZOT?o4}~=nQV%BdxQfC?skf_;=GbF;>1l1jCQ#Kj1QJ1)-MR%6 z=s%GB0fmrLPre0A1WTbJM-fmOLJ#&W7y^!=M%!;zs~;=Px29vW+L>>@H*em|d-HZz zh>J?F_xs-7i>G@5=@`U=IPMQ|2;*?hiU#yg!JlL@9xc}MWD z6}DQfd&ftI>JEl6u#fElm4D0K^+SKxy``p$rNVMGtS%Rp2oC!jh7nK;i#yNnydU*HTCMh(8cADArKV+B!**NQOVg?~({&2_kxy5^Y-zgbMM}O9#ZsxfvEA!E zRO47XqIue1(+&8SOIJwO3YsQ6spX@!ZpU_yqC(e=7(?(55|JwK9?G4c?al{SDnR+e zpR?VkwQ8-t^V5SU@~2IiJFQsJF$IITkEqs`U>!FaW?0h-@Is}aQTc`CRm%%?y)va_ z?hyUlActQxfVa5*%|t)gHzRdgsn%*OCxxR@9gZnIb`d9xmaqo!YE??*IZkxJ9W=v8m_LH zh;J|H`RA0@>h-$UJ|p@!*Np4-^(~L>uMzILCxoAjzY}?15gY*wCn%pEcE5}vCR_jI zf{YKn9>Z_0l`Pw8dq-q^1XpZMKEKTe;h@{y-`^+v+Rd-SoqJsWVyTAwAZj-VKUqI4 z5woA%|E(Y1`g&0yg0{`hUKedYQ>jl*_@14!{^8~~h_5gA+5W5~>+8B~e|%v!8s%b9yQDU+sNnFCTTso1ch(4T zp;@INV#h+ig$7%5==mxdNWCri|C2Rrw7)%>PWGly5JkB}ECN7&-Lkp=C*&OY80{z?92^{Ehn=l$ zBYt|`Y)kgu$@3p{m3*H^fYg5UgcjQy^&GZbzebs^|7Bgr1B7XnvpUb#FuC0Qk?a2u z)a?!qhRpwgx2$rb9nFrIy_fMP$jJag5BaIeyQG+9Y@S`j4>rHVx#ba%9dlA^fR7x< zd^c&y-fV1V>x;FOvV{|Tv3=A6=Zm5t&JSXM;ntSxV+Gg&e-0=Qm;9uV0|w)dO5EL3 z={WSZ?sx9H^nmR5@80$OyZwG&#TLSkG|k2d%{E{Zy?WI@IwJFLH1cscr`K+GI&JFU ziG8JciG8E@Lp&Yl;DD0lA$&jK;^M34KjL!v$@<9!BI{#&FAq^@0vCLb<69OIAQSZh zYJb}Z2C@X4-}V~~zs>B|8wW5s2SEE8Cqst3<$eQAXfh05U5 z?S7C#KB(~%m_E;cuz#;QSE>EPD~SGA%73Mn--LHL4lc)P9IYMQhY{5e(3dnj)sL(% z_}D_2!8w&5T)T$&rcPiasba|(5O=#of*%bJc>*8=LVyeage~xjP17~{03rljynn>@ zmqEm4*Nn|Fb*Uzxh7jJ|f~&@jCc{A}DqiJuu1$Ezh-PLnGx^Zc|v%*8K~f2vXWW4YsB<@m!3_@^36 z9z-ga;)&g$zjEAZBeh>@_v*B3_AbRqY@GCs(|*RJCA}HTXL#C;${&x<_(^-!s4_gY z-wn1tN&5}6Ij?u7-Zb<19|hGvkrRuL7mQEkr+g|uk^7O$PwWzN{ZhTC{PFnAzNww! z-1%7+weNWSQaS3Mob^o!@)dJZ<^`n9RKJmZ@Pali^Zc~=BLAZMPkt4eE%Wlz`lQP| zell0)artFrw#?(H;Q8ik{Y`Q_@h3n(LITM0ONbh!fIL4Kr(i@xngZe}kchy`t47`f z+9(4g`5*L?<0AvjPI{(>X9pA-W07AZxH|uX9HfBA07?Eg8vpd|+tZm5v$seAbMq(U zFO|If1t}mhK$8DqsG!$7Z}%vUiI4uXT1{$r_b=ZbvlxLF(8=c!Hh;Vw!`BsE5FFoc z#?FV|$)M@Y7<&Es_3k`2u7efu_uJ_8@QwUemqweu8J!_4DmDYk+Xcm^_)_7LcDZ-I zab?<+x%=&}Kc78&^5pU3OzWg_>z_wX+1`$REi5TM!LF~b8~FSj1o%Qfq5O}V{{ZK+ BWG?^! literal 0 HcmV?d00001 diff --git a/noyau/font/italics.fnt b/noyau/font/italics.fnt new file mode 100644 index 0000000000000000000000000000000000000000..ddb95d82758246cef1e88c622c94e777fdf43922 GIT binary patch literal 4096 zcmZWsKX2Pc6hBu1?SYk%je-a%Lp}gi28>d%RFHP;+MUV)=b@}@z(5lqf>($LVpKXfHh9zX%s~#AKo!8WhtdRx_ZAdgdo_ZSLx2l zKh94U<>DlNY}jJ2vp+0{`<*?;us;ZbrL#EJL&P!j%iV7GqK{#4CZjNsG6_AIu>`#k zGDc1x2h?CJVfpxMt|x@=m7dRBdIeD#S!qqq^W17Dd|y@SzGmphK^SJ4Tb@kGvan8H zEoi>{!61b(QDop~G`iao>G!8elH3%9rh49R6y;gxe6w&KMAGvkwc%Oaem|Vdx7*(h zhHtEy`JNvjU%B(h_d1?OMCJ<-r&YRjNcetGVMVX2ArnJMghYVC#K2+JiOu=7#yeok7QQ@}2#|M3ufjU_PoZUpDyN09e-gr&=HE zb^1m!Yw(Aok(_os|2gyFFTR{O%E92A`4C0)qJXG8VEPyPEx_?fWW^Nd_n^XM3;6i> z`0dL2f2Z4*vfONJ{-(WNoW)96jfcGm_4dZ?zpUTGj!?xl>!0?52kC>S%Ers!JpaIa zJ^y&4zGsXA!w#+2L-eUeBJ2Nthw5RwwfIr5pQK5l-t&AED}q_CH#;qN>-G8hxz+#Z zhw}KS*5B=q&<{4nnEBd2xMc04_{(4aUHDxip!tb%>wzDIUY*bKx1U?~l0VSz>SH#W zt=H@AbDM9%yWP#!R`hHZr$M@P_JXg{hX3X4N7U<^a~scr_BYRMJnlu~aoFv8->^Re zY#s`s;Uk+PW_)&L+tFe^i5pzL6wqEZpZfyR6aaxRv zO+BCLXW8fgr9wZo`QJxyPEa3qJxVr?1lJ(O!00*AJJvUu*NV;80Uc28z!=1{JfFn_ zuajvu0tNe(niyg9KFViqPcuxW`fz**w=gxLCO<@AniyJBm8;bEOoB;YQ$OizV$#>d z#77CZ`UuiCrh}x(m(sW^rS^x+(e5**bEb@=EQ(z~knaBS^6fL@zZhcgmx#xa!Ny)> z$V3atld!MG#@-r}ea(0hzlmu+O-IYu0g;l-qYH#tkJ)ZL98BxgYVGbjVe(z{9N9lz zvb}3`j|zW*!C#bGJXOa^eKfe+N9^cE6I`AUg#ysb58*MfO?ouH=^yc1_M^VAzc93Z zAbI)%4VU99(xS+OwGATU0-blEWz7SIV*5D%G_k}9(-0A52VKC7{GC)q5Y5+~KO~C5 z@zLKy7Sa0B`i3b)KPeKvooO9FNnx~!yFWGmg!tvp=ARJ%JZt{p?$sI&UmG&x>%d`L zm1um@&x98h;--af%YX8mypgj{o_}+T|H-?tnpx6eZ5Q-gKEIuP#_m9el6Z`(Tkx`z95-klI zxO99mEilFoQ*+1~_w&gdXO_OjlE@Mr62Io$eVeyl>GS#|a-OPNTE_K)`2 z%R+E=*|tTIrkZ)3!lI9LdwHP6UW4{Ax}l5oz9xD9_U(J~U|c47UDtWixhMABn>TOX z83UucxpCuYKA#_T1}e?6EY;e2+_|;At#xuVWj;y2`th$98#gx@>w`3VnWYC3fl|+} z+Nq@lS=|Pb z?+UANC=bhWRH0rXI0f!RmFHUnM?|NCI7t%5-gqlRR(f0$*$PGrTp=g2n3hR zQ~$?RWyixvW;huSyRA3>qkzQCUscbSe=g^>*i$eh5?}T5tZB$8k5^SMo-~V}Eynpq zV)y3?fYwanGkmki?r?v@d*c;VSr&sqRWMJrXvB`!_fKPGacm2g*rsXDGHaj3X3l*~ z4#hv$tIX#f)ec0~OO>?v!GO)x%xs@9J{dbdqLXKx$4Eg6Cq!05MB?er(S)iypNNxhjpxbn8xVpCp0%WCGPuI z7S=LV8FJ2bRn)%wBCBFPHa>y;8f${_@f5 z+A1#;NESPwldOM9MDH@Y*Z6=??pd%le?^8M(CAiTw-!3W#BvRjci zsvjbq)z&Z{Zdrr^8$!c){-ys>>Yp?JqtxZU{zqJQ1JDrs^r>qZf6^AmoqXsT8^q@x zUbp`cTKmpU{&WA&Yy5}svv_7pi%necFFdz4K8}A^c*fn;AWEgKd--X-E0|5Jz4RB} zw7brp6h#sXN)Cd6J!5#b{i%<=C!R z=g__m!mKqPvB!#-pBF7F=;aFe*%OQIV(2X1-1?#`7W}v8f&P6d_b+ttFWHh)oS5FF oOuvt0Y-y9(n##SRnMzphC*tsXZz-sIlIv(DeoR|*($iV+KZx+4a{vGU literal 0 HcmV?d00001 diff --git a/noyau/font/lcd.fnt b/noyau/font/lcd.fnt new file mode 100644 index 0000000000000000000000000000000000000000..aefe346c8451d297965419ccd9558d39638ce118 GIT binary patch literal 8192 zcma)B&ube;6duW9vo5NvhO}&n&@V)2b6OHm1YK5ANFY82(n}9PwL$ek1fOCZmQ~zB z3G`NaNdACA$f^H8z(gPlH9iW1(-3;FZov?63=P`8H@mB>2?u;keEdSP#YJ`>rLCXw@=;x ze6Ts#+}!+Oa=fP&u&g6z;v7N#R%hEAc-x(pT3w`8E|dnP3o9vrQ~WK<@?nI?Gi zPRFAkzsf5ZZ2Ly@?C|m@*+Sh|TT=)G#au48MlDxVPS2a|e!qXRcXC$9eqPFD&NIyX z0}C|7X$a?4We*|LG~*LlV_;-~Hg{Y0z((v+t<&iYH2Sq}(5+$IEEHUKfC*^xxdpua zFmZ^OvI!IH-zqgNMYTF05jxaTrhDhko%-tPstXK=?|=Pm>x-|~e^%=Yx7BL7t#;d0 zLj$RF z#>|&nkLIKk7jC=V7Ic94v1exZkx)vUx~Wu3&OxFtc`9+1Np>dA$#k1#P=1lz8hwdt z{Fmd?@w4s{eL04N&vU07c^G|?l$dF%vLExv*(v8uMe2&pQ0Ah4&{$PYF~DhTsUk0N zh~K@N!}~|b*id}hK>vOezxx2^`4PNF0nYlo{&f1<^~KzDv;aS2Irb6Y1j+eF<6E}= z<#Hq3{(&GJ&ib;QsP)Ny*n;7%N@CjG*y?X} zHo8+4D#Unv@1Ez~8;{3o+#4B&V;IKBQ{$u2!NK_W7>vKs(BncJcYD2lzt`&?tNCSo zIlLggqqkG~b*#Y&lG6k9J*i6{V0@u2=9lxw69neR>Au{f_7Xk7@V^UxA)^O0(mfx> z-?987Za&uUd5wnGL-E^>+te^rGZ5QXqe4jQ{1K?MllaPtO5*Gf+jg&0^Hr!2Lu&7s z|D75?q0sC053S!T?iCn6aX{4nGXH^^ze&5xb?IZG#;LcT^(crBm3Z24BLCC{2rJPN zq7i`nK)8SH8a=}5EBU#zSmzuN42M9%8%_82(E27FN&%bzfHsv-T_bCt^-Ef`#mC2J zeF>QYG&rRIP5@~C6MvNApnoz2jKThv{>cmg^}`eZ_CIMwDL|$F*{%7%MVW7(&;Kpr zfA7ryE#gsbn0*2KEEZ7WXBNckVLOe!(M^7;#h3A)8jwHcjlUQDm)FxJ`lklCw+RvP zLR`j;{8!rj*a_no#l7@Vbp9;DL2jJM29eykhh#B7!XpOAAKORzvcF`N5FW+v2AUt) zf5UFhMxr`t+Is!>0{SoM0`Y!{eaIi_Lw?Eo9`nn%1lYgGFUTL;NAZoq6==s-ufzDp z^B3``zclk3DKwYZhyI1}v6ijhW%~=RKYlBeZ0Z4unaCo3vd|WBelwD6i+Du5*gb#! zN*3TAECIa{6@Z%iZ&(82`XDaB07X;+;&*tXUZc_I;rnA)0fPFEhRXJ-0-Yap;);Gd zP=h&^>I;dh>p$Y55|AoDQ2&MYPhY=2O<0^ir4mqEKT-Ws)YUIk0#XGC>OV5&@9%%; z?L(Xf9{$gJHM^p>U;K6q(6J;o;-Q{IMJ6lZT++3 c7Mus8pH@`QUuw0QMX#TIpWe_Xl>YbWe`m<@>Hq)$ literal 0 HcmV?d00001 diff --git a/noyau/font/mechanix.fnt b/noyau/font/mechanix.fnt new file mode 100644 index 0000000000000000000000000000000000000000..3207764c9c7b69fee4d66b6caced5d215caeedda GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/norway.fnt b/noyau/font/norway.fnt new file mode 100644 index 0000000000000000000000000000000000000000..103b729308b242360d4f2953e8da6e6f40df50da GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/noyau/font/old8x8.fnt b/noyau/font/old8x8.fnt new file mode 100644 index 0000000000000000000000000000000000000000..6d72f9c51ae7f8057770f299f5afe26fe72a2162 GIT binary patch literal 2048 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 IV2qZojZQq-DGul<3EX{uNzIpG>o0+#` z#^xpNe&6jr?ssES#Q7-C(@Cx|a}p5GTGRsrN&UAzac6H_r2ThM^lMg0wlx zBnA5@s?!bc+zDwo_NM*EkNc_CFE3oYJVb&PTY~qOd{urzBgjY$6jj$72vt_sM``S9X$aKLLP(rXSzly%{@YUhV=(A70i&j)eXY?i#-ri_QL0lhq zt(_h3DQw$U)=8t9s<0t`Tj&|W6XzUyi6us{o4fJI%oqa9;af5SNf9eoOc!k=gWZ* zh_D5|rfF*Uxw7YvNgt!GpvUI~TsBA#4aRQbH<;!tCsW8DV-T4R4#=2KIRmm6r(@8pUhgUK&$BE$hnS{>AEw>?{r&C}J-=x>L^1k29Uh$>4O5*j zg$ILiar~p6$p;+%G>7km^sY+3sUOR*8#vFNJs|z$*Q1wb&oaXw4^U?Qy6N9PA9g{A z-y8n*WB=Pny&>T^MP=9c$F-S)h4H*zEXy9L2Y;uehxrd8UOCY7&->;5aw^j?9O`@m z-rBl#%jEm8-~a9T*Sn^Eq)+ZP#Py9{kL&{-$g_HxAK(fPdz4QXiklR@KlcZ?_*~a3 zw@RY)i%^Wn@O+~T3bFXnye8stmeF}-W8ZJ@Km~m>V@26uVAg+$^ZUoJM>HR3UXb{k z9`P;5wj+pGuOD>pWmz z8j(F{-az<)whuUhaLxH7{Z89|t4Bb5+3|g@)*m`whftx6ma%WLj+OnQ*(>%rOz)

hHe6}4hv2qhk5O_8Bk%JtN5GuTkf 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 literal 0 HcmV?d00001 diff --git a/noyau/font/standard.fnt b/noyau/font/standard.fnt new file mode 100644 index 0000000000000000000000000000000000000000..00e69f4c967f26eab291941eaa0c2ce18928021f GIT binary patch literal 8192 zcma)BPix#p6d&6`2}NDIhk{C$^~Ho9MFJa9#5#n0g!Iyru#1|5D0_1DAhdA{A&@VS ze1Jm8sb3(lctI4p__!GCE~bawO9_U6W2lk(-bnKPd%xL^lU?on=J(#4H#6@&NlLA1 z$>DE@hacV^CSYKapXPagk|SI-yVP3sJAkk5)LSOl@%_nU;y6CwJARVq3C4*=A{@ZZ zxlQ_HKR0=hA3lB@0`<)5zy0vxZ6EPBZ-4oXABISP(wIXNkd>?52fME8wlB^B-reu+ z@9+OK8TaG?j&tfy{8K3ZQP7UNaXWY<)79F>?d|UN?Ts~nlm8vZNuY<-llMg4VhcD-qBZVChPMy*!cq*iN)%X8lDbUGKki>tc*^>*#nvVXF zn!++w_YgwOFh6BmUCRb+?snX+i==B>5CmNVe<#et9gN?p*ITVF7C?uuRmaB<3oZ~k zJU%%<0SD2}HrU1@q9}{>e@T<$#OYBlwyc+F3^b^t)OOq;eJSyk@}kH)I2#NG2O>^q zClG-DY;d@mq8r3U0@ zq`z2WS$@n^1D~;k^xGYoPv@HtH+Fx8qvh4^qg`ep`HDOboX?bixxB(MpX|43^{|07 zU^E(?^??7jc!Ol@AX)x3MSz(8hu1Rhhex!6y(5$WuOcRgVRR+)vvBWO=UK29g8fzE zL2x1Swf<3>hTq9J&rDAb%#VYgZobTK=;%Q42kehAO|8?RNseXy1x0^qaDM5>jIt*; znV*g?v(Yie_1@`KU8Y`Sj1{t}J6 zEy+5i7#|LY*~bXsQS5m!ZE_jsy{Y#ASpO`2$%pR<#XrADFRlyt>P7Fo?bU16x~$(X z(vNM6d_J8rPv{j2DA!z>6hb<74D+ix4+7rZ6a)l~MOU0s06_b%PBV*0JjmZHAx} zJMf>3Ht-Oy^BJ2ThI*{@Q5<2sJ_SF9A)xXfO3`NrA&wtpP|Ohkt>2dGUh@%Y)+N(* zpI$!0{?N0>Hy{)OH~@h2Pa3H9@l5Ba2r-FeqZBpZ`V{1+8ZB*`H;@=Txp2_QnLowG zT$bUqMOYo2$^Fw_oxzcLs?iLM`90g)3u5;0^;F{Qm5%=gocX$e^GW)PmiG^5_yzn8-Nwn)3U)<(KyPkWX8PW&q*?v6B1uDZqpJnD9oEV?f^T0}aOfPaFyX z8~^}Y(IYm?w$S|tvFL~o$LM@09RdtEg#caPkD>lD#6et#07HJKEzGAF@>k{eG6YEc zub#~REspvA{ruk|{@3&QzeSuA*K7m$RW(M$uN;Usi*{LlHy8Qk@63p=l7DGI`IX%2 zThyPe;9pvxc2KI63vul?vR~9Y?S%d-{k}aNI)7E-AU58N&C791HB2QR;iUv9ztWHR zx_{f*MtJGJhiH9t|3i28W+u|bu50FhR?vPeE?1vd=!f!4K9sNJe#Y{(Uvg|;X&01V z=|}!8-IW{X*K9)nR_j;Fk-rSNq(dcqs=*%xF0gd$&)h`WG{X!)mRe+%W zBR$Dra2*XGP7^Qw&6qTMS-!qNF`|6@3?EVR(=i%@@Y>zGRdAv2S-pH+K_@3C;Qm)X zdQb49P##=3QD@C-elRImU1MQ^N literal 0 HcmV?d00001 diff --git a/noyau/font/stretch.fnt b/noyau/font/stretch.fnt new file mode 100644 index 0000000000000000000000000000000000000000..e619be7269693aa172dde764009d412256c5e569 GIT binary patch literal 4096 zcmZWs&1xJ+5H2xcq{C+I+&XB{>fi@xvM^rIFl$U+A@^|_MwekNFvJ3{d#uOs1LTqi z$jz`YUhV+gGmuXk>{JuMu^<;BG-Md1IA%g5svLiHZA%mv4eT_^l9bH zX|#R&?%mtg^AGmF{5r2HuK?y=-~`U&Vz!V{p55Iz+^9w=b-MX`Z3l$t@=e~c{*&@- z)vV6SCzgi2WPjRB_me$`F@7P0=7?uTU^a7n({cOh>)|Dsylfu5d5qXfQJ z<*HO6Uj~y?jxRX#mxf%Vb}HH`5_W>&i;)y zH%~0)7I&}ZeCF8ONPL3ctm)}Vxm)EUE1o~VX2ibZ8|P7ogD>J?yw^$7hUfLB#O+rf zBAr5&QGF(;-A4Lo-)^INI+{tT<#}ZP8uc4|sO*sSf6M#`Cb)tl#wm(hiuNA>-xY&B!tgLZA;j%?ezW!Sjd8hW_@5iBS$=2`h9ezs04GbnbvINKihIP- z>{(epn;oS|VR-EA*z>FE#A;)^ghDmE2w15CX<<|o-?fYEDSl~q1UZHbb< z*gyG;G5L!z@pD?Vt8jdH1{fcQ0anT`*OdT;W0vnQy=t17EaZ$60?U&_ef`Hvm#t}5 zRSo9j)M6ViR+P;aZlA*V0=Dr6O!39}BtFJuPv(onCPXO;j}8!aK1cI>_-<;c0sAeV zWZ%ehYzQy3iUrf`*!U20M<*I_ZEA!P5bqb^Inge^gyZ!Q9>kCJ zwX{bf3ILIM@v3=#>hcSDT^HbELxp)=&tc_arHgr=NnW2}8tm!j#{I!|k+|FPMpdDAP!7=L*>cI#tEXVcJ99VHvR#8_fz}>`157_qiADc{Mn8= z{8=#0tbDW=Hz~k&fOqvjrmS!E{9k9k-Qho`TkqLvGB$Ccf6u!s$7kafCY8iF-0$e) zk&A@+smD%__3b#7ABoeS3f6b=J+@Z>bA2oqgZUP6$bZ^7()I9Z$DZ|#pFZdty-z{k zgtg0O8OQJKjULADq#w+eWgM^3!}WPZbB)&P#uq#G?9axtlP~eV{o?%5S5Oe1)eQmM z4Fur9K=3$Wg$>Qk$+E7OuHWN8K_@Y$459FzJB=o58ddl3mqm&5#H-^ z?fg&h17n5X7_Ohv@~k+XPRsV69l#x->g5u`>C6X-p8?luK3F^+A5urP!q11ew%rw7 z(o@jei<=R9WOyl?e&|E-SF#yMzzgr?`CLob}h?aJ`aowBZDCZ{{fi< ByCwht literal 0 HcmV?d00001 diff --git a/noyau/font/thai.fnt b/noyau/font/thai.fnt new file mode 100644 index 0000000000000000000000000000000000000000..b275bd82eea5f95448d383bdf13d384bd3e94b39 GIT binary patch literal 4096 zcmeH}Pis>_5Wt7^5kh#>5^{LNQYAhlM39h_P;3bD2qnZ@2*s16?}eun5$VMeLIa@( z37&H7!Na5U5JaW;0ZQnp^yDcN4}Jvk)Pq=O_D|k!{RBd$ZMMIi+1Z($-A(~k%iEpK zc6l{%s|F-th~Fq1oFHL4Pzwf~KxiSkQh{osHrJEA&PB&Ic%`ypFnX;rs(b_T zr~4;=I+H)0Nx$x(h~?l^P3{yOLmvdVLl6vtfNw|P=xjSh7?g{(VtF9)#n0CpclKxB z-%7q)3Bv)N#|yzC-XKut0qD4fIA?BlJIO`50Jy%vSBk}$oZCyD+e`k(UU^pbH~31i z9Iq8idpW3Cee6$j9v3<3w%0Nw^1Pux9G;v+k>^Q$)Jo@a{>fxhaw3&rUM`(VNbV0= zwvbJwteE{Md|1BEnOTi5FY_dOg4xkCzTJGkU(FH9hs$%hUhw&GV@XU@ecC_rQ@e*< zno*qgCvD>1!IhQGrrgfgk9Fc`D~k(I2vAxR@_+g1hX2n`g<9l0j`Mvr#{4xF=jFG2 zX&+8@O1l5v!OvtJ<+s##kGihwKB_#BjG=S$ea?)T3^0wR!|`}L;lTrACZm4pd4}F# z09nuJRNrrRa;)OT$i2s&=lzj-ir2F2Oj5GSFUJ_4!FuLe&2XMCG746mYnjzQH}A*U zS-t&yo%*Dw#To3S$%f;k^bMN5CGJh<#&AC4u`xZ$;1ZZb$OT7egxQ4Gwy)3?g`Y1N);zo!GR%&kQ4Bf+#x>4L>=WwJd$Qh4hPx+$J zPNzi%LTjx*Y3DUPC7~fOzngz!OcV@zz($~M2%2HK_wvi!zSd|oiul|9Y&H`P=={KO zU3DUUguXQfR%p9AlWUzRHoe5;U{@$Q6G^%~RupfROmuqccC rT=f4%|JN^s>=*O?zUcpEzhCr!vwtu8Km9#k^#4WwSO1^=PyPQdYL{SR literal 0 HcmV?d00001 diff --git a/noyau/font/thin.fnt b/noyau/font/thin.fnt new file mode 100644 index 0000000000000000000000000000000000000000..22061e548ada1c0181fb8df51233160688ae1951 GIT binary patch literal 4096 zcmZWszi-<{6h29YEEKAvc)G$uEEGb~k*xqlfEh|*ytGq>bZ5$fUIfQLh7^cOib_)0 zoosJfT4XR#Y~Nz zQJOxRrm+xlHqWxzX=bqMCSYE(W*XL-UJ+{7Jv}|u+7({AahAn71~*8wuo>Fv4C14) z(~W#TlIG~0O`koR&J2HP`P0wbC^7;?*BUyIi2Y9Aah#nuuLLJy5{BW{>3_%U(0cBk zx^t@^1UsW-v=a=NR;9}Fda}M;DG7%BwbrrCxI?Bo9pRJte13lojIkFw&2AWWo7K=0 z1)iW}f^0k~C}Zft@Nik|PpNt}sn&(XlXeovsL34!fr*Z|9c59Q2s+f7P0zF4V=A84 z%%?9G(p7^^sYZivyIlwc9^dyf`LRCU-`^jtuCAW3Ufn)8{GrzP;+wsniQn1X-Mtwc z{POVIuLx`1Xwiins=75mYw0R^0=-m5Thak58i%)f=e=8p5*`z4oWoDr+fy;{x%K83 zrog3Ad8yWD4aQ^QT>rtNy@SWkQ=eB{!@0>7XpDqUOJx_-V_u!EkGNbi`f~M?)zAG& z1}T$11Law{WO>k!pT0;_qtBo@^p9rZ1La#DFK=AS+oOn5H~Ht73dw_MHEK)TKhQXO zTY&*lG-7Zo)!Up*uzxeZ(BJgv=;+t+b&q)6h6FOmH%$qj`PZ-eBRrfD#{6K2V>2G) z$%M!8kI(SH^~&)$Z~t3f59+DVUr(yvX!Jhylb&MZ zLE;nk{dQaCkNGLo+&6l^O-1MYCSaRiQcU7AT(5ACn0m%^x8NZrUX8~*#ibJAnCk^c z<}ox2KRQyuVBK)T0zHDplgUry!P?ULeeu*PTpye=z7p8A8!)OHTrU(sjk588*VD>n zzFp0FM;`UC#>;qz+4wR)s#a6I8XC7(a9>qvOuPb6k4xb9mlF)d(xM)muMf$PC;Q_i zR+aRGaSfaKL5GY_b_C9kZbDKk_2+Z!bu37!I333&en8Sh;da!xykdEp<3c?U!z5dN zGJ*V_Y+8(DahgzX>Vu+;RsgSW+B;g%Uu}unW7o7N%7zGw0XX=z2E?nKX`UE+YWRRk z_*$teo!dchyK|*l;etnzf~RW~ZLpwP*UAf%z&y>Mv2v@PT&@;!V)a&vf>Si}K58jE}w@^HhDy2Es6_=4-&QAx+~oQ^Gs z+TK`;PyV^b<5%n5C`zCnTZ}nhc%zWzsUVOC&|uCt$CzKSp2!z5w#VlE3Kt{{F+F^N z;QoZR@!{2Ac6>au?>o)z*Updd!gDv4d}ooXGx*4IJBy;x_tBjwddvLE8q^NoX!OYr zdawY+`9$19TI!3qI6lM+`EP8iZGI)faDc+Q_mewYQeWi`hn_OIfuJ`W_S6WaVvwlT zjvXI)6L_OBJf4$Er6M?Z6-GntY|pCob#yWAZ2i415{l>MZbob!k5d2MD}L}%Tr`V6uvhR0ZE=_F9iOCAcswuQi~4s}t7n}#O8fH*{JZM8 zi7ZNsDKCg`csbkrIB!j*L{4yaK@ZCb&GPF8i_YrVkIN5D^y}K{CBLhDR*KG7o&G|9 zeP@w>uWWqMW$OKf_Es;v)syahuBWuJJRZmCTD@scI=O|wmo4`v2jio5=1>@~ zxcV2`+jyMMg?j0a=F8R({{`h{I#l9P>dk^Fb!ow1AZ)fFU2JR*hugB>gTo8sFpPts zMI`)tg1Zrn5FQdU81f_`Y-w-h8+_A&1tho$nI?R zKiaKB=+W%QSD-t1{Mi405GJ0_O>3npRe*2f;8@}}ogf$mfg}4V4v$TE1&Q;Q9WW!f zdhHT{?%)~d*gXuc;Tco6cx4TDR5p8m=o8*uAtc@f8K0y_*dyU9M*E=w=8SC?EXS9q ecCUx7jOPSvZFVzgvvcAEe|=bJ?2#?FEchQI4AK1n literal 0 HcmV?d00001 diff --git a/noyau/heure.asm b/noyau/heure.asm new file mode 100644 index 0000000..918ab3f --- /dev/null +++ b/noyau/heure.asm @@ -0,0 +1,81 @@ +.model tiny +.486 +smart +.code + +org 0h + +start: + +jmp tsr +offsets dd 0 +db 'HOURS' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + pusha + push ds es + push cs + push cs + pop ds + pop es + mov ah,22h + mov di,offset infos + int 47h + mov bl,[infos+1] + xor bh,bh + sub bl,8 + mov di,bx + shl di,1 + mov dx,71h + xor eax,eax + mov cx,0B800h + mov es,cx + mov cl,4 + mov bp,8 +show: + dec dx + mov al,cl + out dx,al + inc dx + in al,dx + call showbcd + cmp cl,0 + je finic + mov byte ptr es:[di],':' + add di,2 + sub cl,2 + jmp show +finic: + pop es ds + popa + sti + iret + + +;==============================Affiche le nombre nb hexa en EDX============== +Showbcd: + push ax bx cx edx + mov edx,eax + mov cx,bp + sub cx,32 + neg cx + shl edx,cl + mov ax,bp + shr ax,2 +bcdaize: + rol edx,4 + mov bx,dx + and bx,0fh + add bl,'0' + mov es:[di],bl + add di,2 + dec al + jnz bcdaize + pop edx cx bx ax + ret +infos db 40 dup (0) + +end start diff --git a/noyau/horloge.asm b/noyau/horloge.asm new file mode 100644 index 0000000..41c7f0d --- /dev/null +++ b/noyau/horloge.asm @@ -0,0 +1,32 @@ +.model tiny +.486 +smart +.code + +org 0h + +start: + +jmp tsr +offsets dd 0 +db 'TIMER' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + push ax bx es + mov bx,cs:compteur + inc bx + and bx,11b + mov cs:compteur,bx + mov bx,cs:[offset fig+bx] + mov ax,0B800h + mov es,ax + mov es:[0],bl + pop es bx ax + sti + iret +compteur dw 0 +fig db 'Ä\³/' +end start diff --git a/noyau/manette.asm b/noyau/manette.asm new file mode 100644 index 0000000..d291dc2 --- /dev/null +++ b/noyau/manette.asm @@ -0,0 +1,298 @@ +.model tiny +.486 +smart +.code +org 0h +start: +jmp tsr +drv db 'JOYSTICK',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +jmp 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 0;detectjoystick + ;dw getjoystick + ;dw getjoystickscreen + ;dw configjoystick +isact db 0 + +;envoie en bx,cx les coordonn‚es et en dl les boutons +getjoystick: +push ax cx +mov bx,cs:rx +mov cx,cs:ry +mov al,cs:button +not al +mov cl,4 +shr al,cl +mov dl,al +pop cx ax +ret + +;envoie en di les coordonn‚es ecran et en dl les boutons +getjoystickscreen: +push ax cx +mov di,cs:xy +mov al,cs:button +not al +mov cl,4 +shr al,cl +mov dl,al +pop cx ax +ret +db 'button' +Button db 0 +db 'rx' +rx dw 0 +db 'ry' +ry dw 0 +db 'vx' +VX db 0 +db 'vy' +VY db 0 +db 'x' +X dw 7FFFh +db 'y' +Y dw 7FFFh +speed db 6 +spherex db 0 +spherey db 0 +db 'count' +count db 0 +db 'error' +error db 0 +xy dw 0 +old db 0 + +calibrate db 0 +db 'ticks' +ticks dw 0 +db 'state' +state db 0 +db 'connard' +connard db 1 +connard2 db 1 +;Gestionnaire de joystick +react: + push ax bx cx dx si di bp ds es + push cs + pop ds + mov dx,201h + cmp error, 1 + je gest1 + cmp count,1 + je gest1 + cmp count,2 + je gest2 +gest1: + mov error,0 + mov count,2 + call getticks + mov ticks,ax + out dx,al + in al,dx + and al,00000011b + mov state,al + jmp endgest +gest2: +not connard + call getticks + sub ax,ticks + cmp ax,1FF0h + jb nofinish + mov error,1 + jmp endgest +nofinish: + mov bx,ax + in al,dx + and al,00000011b + cmp state,al + je endgest + xchg state,al + xor al,state + mov cl,4 + or bx,bx + js noadj + shr bx,cl +noadj: + test al,1 + je isy + mov VX,bl + jmp wasx +isy: + test al,2 + je endgest + mov VY,bl +wasx: +mov connard2,0fh + mov count,1 +endgest: + in al,dx + not al + mov cl,4 + shr al,cl + mov button,al + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov cl,speed + movsx bx,VY + shl bx,cl + cmp spherey,0 + jne nolimity + xor ah,ah + mov al,[di] + cmp byte ptr [di+7],4 + jbe text4 + shl ax,3 +text4: + dec ax + cmp bx,0 + jg decy + cmp ry,ax + jae noaddy + jmp nolimity +decy: + cmp ry,0 + je noaddy +nolimity: + sub y,bx +noaddy: + movsx bx,VX + shl bx,cl + cmp spherex,0 + jne nolimitx + xor ah,ah + mov al,[di+1] + cmp byte ptr [di+7],4 + jbe text5 + shl ax,3 +text5: + dec ax + cmp bx,0 + jl decx + cmp rx,ax + jae noaddx + jmp nolimitx +decx: + cmp rx,0 + je noaddx +nolimitx: + add x,bx +noaddx: + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text1 + shl cx,3 +text1: + mul cx + div bx + mov rx,ax + mov ax,y + xor ch,ch + mov cl,[di] + cmp byte ptr [di+7],4 + jbe text2 + shl cx,3 +text2: + mul cx + div bx + mov ry,ax + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text3 + shl cx,3 +text3: + mul cx + add ax,rx + cmp byte ptr [di+7],4 + mov di,ax + jbe textpoint + mov ax,0A000h + mov es,ax + jmp graphpoint +textpoint: + mov ax,0B800h + mov es,ax + shl di,1 + inc di +graphpoint: + mov bx,xy + cmp byte ptr es:[bx],070h + jne waschanged + mov al,old + mov byte ptr es:[bx],al +waschanged: + mov xy,di + mov al,es:[di] + mov old,al + mov byte ptr es:[di],070h + mov al, 20h + out 0a0h, al + out 20h, al +errormouse: + pop es ds bp di si dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 40 dup (0) + + +getticks: +mov al,0 +out 43h,al +jmp wait1 +wait1: +in al,40h +mov ah,al +jmp wait2 +wait2: +in al,40h +xchg ah,al +ret + +end start diff --git a/noyau/mcb.asm b/noyau/mcb.asm new file mode 100644 index 0000000..7facccc --- /dev/null +++ b/noyau/mcb.asm @@ -0,0 +1,749 @@ + +;Affiche le nombre hexa dans %0[dword] +PROC biosprinth FAR + ARG @num:dword + USES ax,bx,cx,edx,si,di + mov edx,[@num] + mov ah,09h + mov di,8 +@@hexaize: + rol edx,4 + mov si,dx + and si,1111b + mov al,[cs:si+offset @@tab] + mov cx,1 + cmp al,32 + jb @@control + mov bx,7 + mov ah,09h + int 10h +@@control: + mov ah,0Eh + int 10h + dec di + jnz @@hexaize + ret +@@tab db '0123456789ABCDEF' +endp biosprinth + +;Affiche le texte ASCIIZ pointé par %0 +PROC biosprint FAR + ARG @pointer:word + USES ax,bx,cx,si + mov si,[@pointer] + mov cx,1 + mov bx,7 +@@again: + lodsb + or al,al + jz @@fin + cmp al,32 + jb @@control + mov ah,09h + int 10h +@@control: + mov ah,0Eh + int 10h + jmp @@again +@@fin: + ret +endp biosprint + +PROC enablea20 FAR + USES ax + mov al,0d1h + out 64h,al + call a20wait + mov al,0dfh + out 60h,al + call a20wait + ;mov al,0ffh + ;out 64h,al + ;call a20wait + ret +endp enablea20 + +PROC disablea20 FAR + USES ax + mov al,0d1h + out 64h,al + call a20wait + mov al,0DDh + out 60h,al + call a20wait + ;mov al,0ffh + ;out 64h,al + ;call a20wait + ret +endp disablea20 + +a20wait: + in al,64h + jmp @@suite +@@suite: + and al,2 + jnz a20wait + ret +;par le system control port A +;in al,92h +;or al,2 +;out 92h,al + +;par le system control port A +;in al,92h +;and al,not 2 +;out 92h,al + +PROC flatmode FAR + USES eax,bx,ds + push cs + pop ds + ; first, calculate the linear address of GDT + xor eax,eax + mov ax,ds + shl eax,4 + add [dword ptr offset @@gdt+2],eax ; store as GDT linear base addr + ; now load the GDT into the GDTR + lgdt [fword ptr offset @@gdt] ; load GDT base + mov bx,1 * size descriptor ; point to first descriptor + cli ; turn off interrupts + mov eax,cr0 ; prepare to enter protected mode + or al,1 ; flip the PE bit + mov cr0,eax ; we're now in protected mode + jmp @@suite +@@suite: + mov fs,bx ; load the FS segment register + and al,0FEh ; clear the PE bit again + mov cr0,eax ; back to real mode + jmp @@suite2 +@@suite2: + sti ; resume handling interrupts + ret ; + +@@gdt descriptor ; the GDT itself + descriptor <0ffffh, 0, 0, 091h, 0cfh, 0> ; 4G data segment +@@gdtend: +endp flatmode + +;Attend l'appuie sur une touche +PROC bioswaitkey FAR + USES ax + xor ax,ax + int 16h + ret +endp bioswaitkey + +firstmb dw 0 + + +;Charge les sections du block %0 +PROC mbloadsection FAR + ARG @blocks:word + USES ax,bx,cx,si,di,ds,es + LOCAL @@toresov:word:60 + mov ax,[@blocks] + mov es,ax + mov ds,ax + cmp [word ptr 0],"EC" + jne @@notace + lea si,[@@toresov] + mov [word ptr ss:si],0FFFFh + mov bx,[ds:exe.sections] + cmp bx,0 + je @@finishloading +@@loading: + cmp [dword ptr bx],0 + je @@finishloading + mov ax,bx + add ax,4 +pushad +call biosprint,ax +popad + call mbcreate,ax,[word ptr bx+2] + jc @@error + inc si + inc si + mov [ss:si],ax + push si + mov si,[bx] + xor di,di + mov es,ax + mov cx,[bx+2] + cld + rep movsb + pop si + add bx,4 +@@gonext: + inc bx + cmp [byte ptr bx],0 + jne @@gonext + inc bx + jmp @@loading +@@finishloading: + cmp [word ptr ss:si],0FFFFh + je @@finishdepands + call mbloadfuncs,[word ptr ss:si] + jc @@depandserror + dec si + dec si + jmp @@finishloading +@@finishdepands: + ret +@@notace: + stc + ret +@@error: + stc + ret +@@depandserror: + stc + ret +endp mbloadsection + + +;Initialise les blocs de mémoire en prenant memorystart pour segment de base +PROC mbinit FAR + USES ax,cx,si,di,ds,es + cmp [cs:firstmb],0 + jne @@alreadyok + push cs + pop ds + mov [cs:firstmb],memorystart + mov ax,memorystart-2 + mov es,ax + mov si,offset afree + xor di,di + mov cx,size mb + rep movsb + clc + ret +@@alreadyok: + stc + ret +endp mbinit + +afree mb <"HN",0,0,0,0A000h-memorystart,"Libre"> + db 0 + +;Creér un bloc de nom %0 de taille %1 (octets) -> n°segment dans AX +PROC mbcreate FAR + ARG @blocks:word,@size:word + USES bx,cx,dx,si,di,ds,es + push gs + mov ax,[ss:bp+4] + mov dx,ax + dec dx + dec dx + mov gs,dx + cmp [word ptr gs:0x0],'NH' + je @@oktoset + mov ax,memorystart +@@oktoset: + mov gs,ax + mov cx,[@size] + shr cx,4 + inc cx + mov bx,[cs:firstmb] + dec bx + dec bx + mov dl,true +@@searchfree: + cmp dl,false + je @@notenougtmem + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + cmp [es:mb.isnotlast],true + sete dl + cmp [es:mb.reference],free + jne @@notsogood + mov ax,[es:mb.sizes] + cmp cx,ax + ja @@notsogood + mov [word ptr es:mb.check],"NH" + mov [es:mb.isnotlast],true + mov [es:mb.reference],gs + mov [es:mb.isresident],false + lea di,[es:mb.names] + push cx + mov cx,24/4 + mov si,[@blocks] + cld + rep movsd + pop cx + inc bx + inc bx + sub ax,cx + cmp ax,0 + je @@nofree + dec ax + dec ax + mov [es:mb.sizes],cx + add cx,bx + mov es,cx + mov si,offset afree + xor di,di + mov cx,size mb + push cs + pop ds + cld + rep movsb + mov [es:mb.isnotlast],dl + mov [es:mb.sizes],ax +@@nofree: + mov ax,bx + pop gs + clc + ret +@@notsogood: + inc bx + inc bx + add bx,[es:mb.sizes] + jmp @@searchfree +@@memoryerror: + pop gs + stc + ret +@@notenougtmem: + pop gs + stc + ret +endp mbcreate + +;Libère le bloc de mémoire %0 et ses sous blocs +PROC mbfree FAR + ARG @blocks:word + USES ax,bx,cx,si,di,ds,es + mov bx,[@blocks] + mov ax,bx + dec bx + dec bx + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + cmp [es:mb.reference],free + je @@wasfree + cmp [es:mb.isresident],true + je @@wasresident + mov [es:mb.reference],free + push cs + pop ds + mov si,offset @@isfree + lea di,[es:mb.names] + mov cx,6 + cld + rep movsb + mov bx,[cs:firstmb] + dec bx + dec bx +@@searchtofree: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@nottofree + cmp ax,[es:mb.reference] + jne @@nottofree + mov [es:mb.isresident],false + mov [es:mb.reference],free + mov si,offset @@isfree + lea di,[es:mb.names] + mov cx,6 + cld + rep movsb +@@nottofree: + cmp [es:mb.isnotlast],true + je @@searchtofree + call mbclean + ret +@@memoryerror: + stc + ret +@@wasfree: + stc + ret +@@wasresident: + stc + ret + +@@isfree db "libre",0 +endp mbfree + +;Mise a nivo de la mémoire (jonction de blocs libre) +PROC mbclean FAR + USES ax,bx,dx,es,gs + mov bx,[cs:firstmb] + dec bx + dec bx + xor ax,ax + xor dx,dx +@@searchfree: + mov gs,bx + cmp [word ptr gs:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[gs:mb.sizes] + cmp [word ptr gs:mb.sizes],0 + je @@notenougtmem + cmp [gs:mb.reference],free + jne @@notfree + cmp ax,0 + je @@notmeetfree + add dx,[gs:mb.sizes] + mov [word ptr gs:mb.check],0 + mov [dword ptr gs:mb.names],0 + inc dx + inc dx + jmp @@nottrigered +@@notmeetfree: + xor dx,dx + mov ax,gs + jmp @@nottrigered +@@notfree: + cmp ax,0 + je @@nottrigered + mov es,ax + add [es:mb.sizes],dx + xor ax,ax +@@nottrigered: + cmp [gs:mb.isnotlast],true + je @@searchfree + cmp ax,0 + je @@reallyfinish + mov es,ax + add [es:mb.sizes],dx + mov [es:mb.isnotlast],false +@@reallyfinish: + clc + ret +@@notenougtmem: + stc + ret +@@memoryerror: + stc + ret +endp mbclean + +;Rend le segment %0 résident +PROC mbresident FAR + ARG @blocks:word + USES bx,es + mov bx,[@blocks] + dec bx + dec bx + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + mov [es:mb.isresident],true + ret +@@memoryerror: + stc + ret +endp mbresident + +;Rend le segment %0 non résident +PROC mbnonresident FAR + ARG @blocks:word + USES bx,es + mov bx,[@blocks] + dec bx + dec bx + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + mov [es:mb.isresident],false + ret +@@memoryerror: + stc + ret +endp mbnonresident + + +;Change le proprietaire de %0 a %1 +PROC mbchown FAR + ARG @blocks:word,@owner:word + USES bx,dx,es + mov bx,[@blocks] + dec bx + dec bx + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + cmp [es:mb.reference],free + je @@wasfree + mov dx,[@owner] + mov [es:mb.reference],dx + ret +@@memoryerror: + stc + ret +@@wasfree: + stc + ret +endp mbchown + +;Alloue un bloc /data de CX caractere pour le process appelant -> ax +PROC mballoc FAR + ARG @size:word + USES si,ds + push cs + pop ds + call mbcreate,offset @@data,[@size] + call mbchown,ax,[word ptr ss:bp+4] + ret + +@@data db '/data',0 +endp mballoc + +;Renvoie en AX le MB n° %0 carry quand terminé +PROC mbget FAR + ARG @num:word + USES bx,dx,es + mov bx,[cs:firstmb] + dec bx + dec bx + xor dx,dx +@@searchfree: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@memoryerror + cmp dx,[@num] + je @@foundmcb + ja @@notfound + inc dx + cmp [es:mb.isnotlast],true + je @@searchfree +@@memoryerror: + stc + ret +@@foundmcb: + mov ax,es + inc ax + inc ax + clc + ret +@@notfound: + stc + ret +endp mbget + +;Renvoie en AX le MCB qui correspond a ds:%0 +PROC mbfind FAR + ARG @blocks:word + USES bx,si,di,es + mov bx,[cs:firstmb] + dec bx + dec bx + mov si,[@blocks] +@@search: + mov es,bx + lea di,[es:mb.names] + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@memoryerror + push si di +@@cmpnames: + mov al,[es:di] + cmp al,[ds:si] + jne @@ok + cmp al,0 + je @@ok + inc si + inc di + jmp @@cmpnames +@@ok: + pop di si + je @@foundmcb + cmp [es:mb.isnotlast],true + je @@search +@@notfound: + stc + ret +@@memoryerror: + stc + ret +@@foundmcb: + mov ax,es + inc ax + inc ax + clc + ret +endp mbfind + + +;Renvoie en AX le sous mcb qui correspond a %0 et qui appartien a %1 +PROC mbfindsb FAR + ARG @blocks:word,@owner:word + USES bx,dx,si,di,es + mov bx,[cs:firstmb] + dec bx + dec bx + mov si,[@blocks] + lea di,[es:mb.names] + mov dx,[@owner] +@@search: + mov es,bx + cmp [word ptr es:mb.check],"NH" + jne @@memoryerror + inc bx + inc bx + add bx,[es:mb.sizes] + cmp [es:mb.sizes],0 + je @@memoryerror + push si di +@@cmpnames: + mov al,[es:di] + cmp al,[ds:si] + jne @@ok + cmp al,0 + je @@ok + inc si + inc di + jmp @@cmpnames +@@ok: + pop di si + jne @@notfoundmcb + cmp [es:mb.reference],dx + je @@foundmcb +@@notfoundmcb: + cmp [es:mb.isnotlast],true + je @@search +@@notfound: + stc + ret +@@foundmcb: + mov ax,es + inc ax + inc ax + clc + ret +@@memoryerror: + stc + ret +endp mbfindsb + +;Resouds les dépendances du bloc de mémoire %0 +PROC mbloadfuncs FAR + ARG @blocks:word + USES ax,bx,cx,dx,si,ds + mov ds,[@blocks] + cmp [word ptr 0],"EC" + jne @@notace + mov si,[ds:exe.imports] + cmp si,0 + je @@endofloading +@@loadfuncs: + cmp [word ptr si],0 + je @@endofloading + call mbsearchfunc,si + jnc @@toendoftext + mov bx,si +;pushad +;call biosprint,si +;popad +@@findend: + inc bx + cmp [byte ptr bx], ':' + jne @@findend + mov [byte ptr bx],0 + call [cs:projfile],si + jc @@erroronload + mov [byte ptr bx],':' +;pushad +;call biosprint,si +;popad + call mbsearchfunc,si + jc @@libnotexist +@@toendoftext: + mov cl,[si] + cmp cl,0 + je @@oktonext + inc si + jmp @@toendoftext +@@oktonext: + inc si + mov [si],ax + mov [si+2],dx + add si,4 + jmp @@loadfuncs +@@endofloading: + clc + ret +@@notace: + stc + ret +@@libnotexist: + stc + ret +@@erroronload: + stc + ret +endp mbloadfuncs + + +;Recherche une fonction pointé par DS:%0 en mémoire et renvoie son adresse en DX:AX +PROC mbsearchfunc FAR + ARG @func:word + USES bx,si,di,es + mov bx,[@func] + mov si,bx +@@findend: + inc bx + cmp [byte ptr bx], ':' + jne @@findend + mov [byte ptr bx],0 + call mbfind,si + mov [byte ptr bx],':' + jc @@notfoundattallthesb + mov es,ax + cmp [word ptr es:exe.checks],"EC" + jne @@notfoundattallthesb + mov di,[es:exe.exports] + inc bx + inc bx +@@functions: + cmp [word ptr es:di],0 + je @@notfoundattallthesb + mov si,bx +@@cmpnamesfunc: + mov al,[es:di] + cmp al,[ds:si] + jne @@notfoundthesb + cmp al,0 + je @@seemsok + inc si + inc di + jmp @@cmpnamesfunc +@@notfoundthesb: + mov al,[es:di] + cmp al,0 + je @@oktonext + inc di + jmp @@notfoundthesb +@@oktonext: + inc di + inc di + inc di + jmp @@functions +@@seemsok: + mov dx,es + mov ax,[es:di+1] + clc + ret +@@notfoundattallthesb: + stc + ret +endp mbsearchfunc diff --git a/noyau/port.asm b/noyau/port.asm new file mode 100644 index 0000000..c4a588d --- /dev/null +++ b/noyau/port.asm @@ -0,0 +1,699 @@ +.model tiny +.486 +smart +.code +org 0h +start: +jmp tsr +drv db 'LPT ',0 +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx ax +mov ah,4 +mov bh,1 +int 50h +mov bl,al +pop ax +cmp byte ptr cs:isact,1 +je nottest +mov cs:isact,1 +cmp bl,80h +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 getlptin + dw getlptout + dw getlptinout + dw setlptin + dw setlptout + dw setlptinout + dw getlpt + dw getfirstlpt + dw setemettor + dw setreceptor + dw settimeout + dw gettimeout + dw receivelpt + dw sendlpt + dw receivelptblock + dw sendlptblock + dw receivecommand + dw sendcommand + +react: +push ds es +mov cs:isact,1 +pushad +push cs +pop ds +push cs +pop es +cmp byte ptr never,1 +je oknever +mov bl,[drv+3] +sub bl,'0' +xor bh,bh +call getlpt +dec bl +shl bl,1 +mov al,7 +sub al,bl +mov ah,40 +mov di,offset video +int 47h +push ax +mov ah,01h +int 50h +mov ah,21 +mov cl,4 +int 47h +sti +mov al,0111b +call setlptout +call setreceptor +call initlpt +jc errorie +mov cx,0 +mov ah,20 +mov bx,1012h +mov si,offset initok +int 47h +cmp byte ptr always,1 +je yes +mov ah,20 +mov bx,1010h +mov si,offset mdd +int 47h +mov ah,13 +mov si,offset drv +int 47h +mov ah,6 +int 47h +mov ah,20 +mov bx,1011h +mov si,offset msg +int 47h +waitkey: +mov ax,0 +int 16h +cmp al,'n' +je no +cmp al,'N' +je no +cmp al,'Y' +je yes +cmp al,'y' +je yes +cmp al,'e' +je nev +cmp al,'E' +je nev +cmp al,'a' +je alw +cmp al,'A' +je alw +jmp waitkey +yes: +call receivecommand +jc errortimeout +no: +mov al,0111b +call setlptout +cli +mov ah,41 +mov si,offset video +int 47h +pop ax +mov ah,00h +int 50h +mov ah,09h +int 50h +oknever: +popad +pop es ds +mov cs:isact,0 +pop bx +jmp endofint +errorie: +mov si,offset inits +jmp show +errortimeout: +mov si,offset timeouts +show: +mov ah,20 +mov bx,1012h +int 47h +mov ax,0 +int 16h +jmp no +nev: +mov byte ptr never,1 +jmp no +alw: +mov byte ptr always,1 +jmp yes +initok db 'Initialisation is realised !',0 +inits db 'Error on initialisation',0 +timeouts db 'Connection lost or timeout complete !!',0 +mdd db 'Connection demand on ',0 +msg db 'Accept connection ? (Y)es (N)o n(E)ver (A)lways',0 +isact db 0 +always db 0 +never db 0 + +;envois une commande al +sendcommand: +push ax bx cx di +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmde +call cs:[bx] +pop di cx bx ax +ret +cmde dw nothing + dw getram + +;recupŠre la ram en ds:si de cx distant caractŠres en es:di local +getram: +push ax bx cx ds +mov bx,offset command +mov cs:[bx+2],ds +mov cs:[bx],si +mov cs:[bx+4],cx +push cs +pop ds +mov si,bx +mov cx,6 +call sendlptblock +jc endofget +call receivelptblock +endofget: +pop ds cx bx ax +ret + +;Re‡ois une commande et l'execute +Receivecommand: +push ax bx cx di ds es +push cs +pop es +push cs +pop ds +mov di,offset command +call receivelptblock +jc endofno +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmd +call cs:[bx] +clc +endofno: +pop es ds di cx bx ax +ret + +command db 25 dup (0) +cmd dw nothings + dw sendram + dw receiveram + dw sendreg + dw receivereg + dw sendport + dw receiveport + dw letexecute +nothings: +ret + +letexecute: +push ds es fs gs +pushad +push cs +push offset suite +mov ax,es:[di+2] +mov ds,ax +mov es,ax +mov fs,ax +mov gs,ax +push ax +mov ax,es:[di] +push ax +DB 0CBh +suite: +popad +pop gs fs es ds +ret + +Sendram: +push ax cx si ds +mov si,es:[di] +mov ax,es:[di+2] +mov ds,ax +mov cx,es:[di+4] +call sendlptblock +pop ds si cx ax +ret + +receiveram: +sendreg: +receivereg: + +sendport: +push ax cx dx si +mov dx,es:[di] +in ax,dx +mov cx,2 +mov si,offset tempblock +mov ds:[si],ax +call sendlptblock +pop si dx cx ax +ret + +receiveport: +push ax dx +mov dx,es:[di] +mov ax,es:[di+2] +out dx,ax +pop dx ax +ret + +tempblock db 25 dup (0) + +;---------Segment Adress----------- +Bios equ 040h +;---------Offset Adress------------ +Lptadr equ 008h +Timer equ 06Ch +;---------Constant----------------- +onesec equ 18 +tensec equ 182 +Ack equ 00 +Nack equ 0FFh +maxtry equ 10 + +Initlpt: +push ax ecx +call StartTimer +cmp cs:emettor,0 +je receptinit +mov al,10000b +call SetLptOut +waitinit1: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz waitinit1 +jmp endinit +receptinit: +call EndTimer +cmp cx,cs:timeout +ja errorinit +call getlptIn +cmp al,00000b +jnz receptinit +mov al,10000b +call SetLptOut +endinit: +clc +pop ecx ax +ret +errorinit: +stc +pop ecx ax +ret + + +;-Envoie DL (dh) JNE si problŠme JNC error timeout +Sendlpt: +push ax bx ecx +call StartTimer +mov dh,dl +mov al,dl +and al,0Fh +call SetLptOut +waitSend: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jnc waitsend +and al,0Fh +mov bl,al +call StartTimer ;///// +mov al,dh +shr al,4 +or al,10000b +call SetLptOut +waitSend2: +call EndTimer +cmp cx,cs:timeout +ja errorsend +call getlptIn +bt ax,4 +jc waitsend2 +and al,0Fh +shl al,4 +add bl,al +cmp dl,bl +pop ecx bx ax +clc +ret +errorsend: +pop ecx bx ax +stc +ret + + +;-Re‡ois DL (dh) +Receivelpt: +push ax bx ecx +call StartTimer +waitreceive: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jnc waitreceive +and al,0Fh +mov dl,al +call SetLptOut +call StartTimer ;///// +waitreceive2: +call EndTimer +cmp cx,cs:timeout +ja errorreceive +call getlptIn +bt ax,4 +jc waitreceive2 +and al,0Fh +mov dh,al +shl dh,4 +add dl,dh +or al,10000b +call SetlptOut +clc +pop ecx bx ax +ret +errorreceive: +stc +pop ecx bx ax +ret + +;-AX +SetTimeout: +mov cs:Timeout,dx +ret + +timeout dw tensec + +getTimeout: +mov dx,cs:Timeout +ret + +SetEmettor: +mov cs:Emettor,1 +ret + +Emettor db 0 + +SetReceptor: +mov cs:Emettor,0 +ret + +;->bx Nøport->Adresse dx +GetLpt: +push ax bx ds +mov ax,bios +mov ds,ax +dec bx +shl bx,1 +mov dx,ds:[Lptadr+bx] +mov cs:lpt,dx +pop ds bx ax +ret +lpt dw 0 + +;->bx Nøport->Adresse dx +GetFirstLpt: +push ax ds +mov ax,bios +mov ds,ax +xor bx,bx +findlpt: +mov dx,ds:[Lptadr+bx] +cmp dx,0 +jne oklpt +add bx,2 +cmp bx,4 +jbe findlpt +oklpt: +mov cs:lpt,dx +pop ds ax +ret + +;-> +StartTimer: +push ax ecx ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +mov cs:times,ecx +pop ds ecx ax +ret +times dd 0 + +;->Ecx time elapsed +EndTimer: +push ax ds +mov ax,Bios +mov ds,ax +mov ecx,ds:[timer] +sub ecx,cs:times +pop ds ax +ret + +;-> +GetLptOut: +push dx +mov dx,cs:lpt +in al,dx +pop dx +ret + +GetLptIn: +push dx +mov dx,cs:lpt +inc dx +in al,dx +shr al,3 +pop dx +ret + +GetLptInOut: +push dx +mov dx,cs:lpt +add dx,2 +in al,dx +and al,11111b +pop dx +ret + +SetLptOut: +push dx +mov dx,cs:lpt +out dx,al +pop dx +ret + +SetLptIn: +push dx +mov dx,cs:lpt +inc dx +out dx,al +pop dx +ret + +SetLptInOut: +push dx +mov dx,cs:lpt +add dx,2 +out dx,al +pop dx +ret + +;R‚alise un checksum 8 bits sur donn‚es DS:SI, nb CX r‚sultat dans dl +Checksum8: +push cx si +check: +add dl,[si] +inc si +dec cx +jnz check +pop si cx +ret + +;DS:SI pointeur sur donn‚es, CX nombres de donn‚es, AL token +SendLptBlock: +push ax bx cx edx si edi bp +mov dx,cx +shl edx,16 +mov dh,al +call checksum8 +mov edi,edx +xor dh,dh +mov bp,dx +mov ah,maxtry +retry: +mov bl,4 +xor al,al +header: +mov dx,di +call sendlpt +setne al +jc outt +rol edi,8 +dec bl +jnz header +cmp al,0 +jne notgood +mov dl,ACK +jmp allsend +notgood: +mov dl,NACK +allsend: +call sendlpt +setne al +jc outt +cmp al,0 +je okheader +dec ah +jnz retry +jmp outt +okheader: +cmp cx,0 +je endoftrans +mov di,maxtry +retry2: +mov bx,cx +xor ax,ax +body: +mov dl,[si+bx-1] +add ah,dl +call sendlpt +setne al +jc outt +dec bx +jnz body +cmp al,0 +jne notgood2 +mov dl,ACK +jmp allisend +notgood2: +mov dl,NACK +allisend: +call sendlpt +setne al +jc outt +cmp al,0 +je endoftrans +dec di +jnz retry2 +outt: +stc +endoftrans: +mov al,ah +xor ah,ah +cmp bp,ax +pop bp edi si edx cx bx ax +ret + +;Receptionne en es:di les donn‚es au nombres de CX token AL (AH) (ECX) +receiveLptBlock: +push bx dx si bp +mov ah,maxtry +retrye: +mov bl,4 +headere: +call receivelpt +jc outte +mov cl,dl +rol ecx,8 +dec bl +jnz headere +call receivelpt +jc outte +cmp dl,ACK +je okheadere +dec ah +jnz retrye +jmp outte +okheadere: +mov al,ch +xor ch,ch +mov bp,cx +rol ecx,16 +cmp cx,0 +je endoftranse +mov si,maxtry +retrye2: +mov bx,cx +xor ah,ah +bodye: +call receivelpt +jc outte +mov es:[di+bx-1],dl +add ah,dl +dec bx +jnz bodye +call receivelpt +jc outte +cmp dl,ACK +je endoftranse +dec si +jnz retrye2 +outte: +stc +endoftranse: +mov bl,ah +xor bh,bh +cmp bp,bx +pop bp si dx bx +ret +video db 0 +end start diff --git a/noyau/souris.asm b/noyau/souris.asm new file mode 100644 index 0000000..ab8b210 --- /dev/null +++ b/noyau/souris.asm @@ -0,0 +1,327 @@ +.model tiny +.486 +smart +.code +org 0h +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 + dw getmousescreen + dw configmouse + +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 donn‚es + 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 coordonn‚es et en dl les boutons +getmouse: +mov bx,cs:rx +mov cx,cs:ry +mov dl,cs:button +sub dl,8 +and dl,0Fh +clc +ret + +;envoie en di les coordonn‚es ecran et en dl les boutons +getmousescreen: +mov di,cs:xy +mov dl,cs:button +sub dl,8 +and dl,0Fh +clc +ret + + +;configure la rapidit‚ dans cl et dans ah,al sphŠre x et y +Configmouse: +mov cs:speed,cl +mov cs:spherex,ah +mov cs:spherey,al +ret + +Button db 0 +rx dw 0 +ry dw 0 +VX db 0 +VY db 0 +X dw 7FFFh +Y dw 7FFFh +speed db 6 +spherex db 0 +spherey db 0 +count db 0 +error db 0 +xy dw 0 +old db 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: + cmp error,1 + je errormouse + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov cl,speed + movsx bx,VY + shl bx,cl + cmp spherey,0 + jne nolimity + xor ah,ah + mov al,[di] + cmp byte ptr [di+7],4 + jbe text4 + shl ax,3 +text4: + dec ax + cmp bx,0 + jg decy + cmp ry,ax + jae noaddy + jmp nolimity +decy: + cmp ry,0 + je noaddy +nolimity: + sub y,bx +noaddy: + movsx bx,VX + shl bx,cl + cmp spherex,0 + jne nolimitx + xor ah,ah + mov al,[di+1] + cmp byte ptr [di+7],4 + jbe text5 + shl ax,3 +text5: + dec ax + cmp bx,0 + jl decx + cmp rx,ax + jae noaddx + jmp nolimitx +decx: + cmp rx,0 + je noaddx +nolimitx: + add x,bx +noaddx: + mov ax,x + mov bx,0FFFFh + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text1 + shl cx,3 +text1: + mul cx + div bx + mov rx,ax + mov ax,y + xor ch,ch + mov cl,[di] + cmp byte ptr [di+7],4 + jbe text2 + shl cx,3 +text2: + mul cx + div bx + mov ry,ax + xor ch,ch + mov cl,[di+1] + cmp byte ptr [di+7],4 + jbe text3 + shl cx,3 +text3: + mul cx + add ax,rx + cmp byte ptr [di+7],4 + mov di,ax + jbe textpoint + mov ax,0A000h + mov es,ax + jmp graphpoint +textpoint: + mov ax,0B800h + mov es,ax + shl di,1 + inc di +graphpoint: + mov bx,xy + cmp byte ptr es:[bx],070h + jne waschanged + mov al,old + mov byte ptr es:[bx],al +waschanged: + mov xy,di + mov al,es:[di] + mov old,al + mov byte ptr es:[di],070h + mov al, 20h + out 0a0h, al + out 20h, al +errormouse: + pop es ds di dx cx bx ax + mov cs:isact,0 + pop bx + iret + infos db 40 dup (0) + +end start diff --git a/noyau/systeme.asm b/noyau/systeme.asm new file mode 100644 index 0000000..f40ce49 --- /dev/null +++ b/noyau/systeme.asm @@ -0,0 +1,297 @@ +model tiny,stdcall +p586N +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\divers.h" +include "..\include\cpu.h" +include "..\include\pci.h" +include "..\include\fat.h" + +memorystart equ 0052h ;premier bloc de la mémoire + +org 0h + +mb0: +header exe <"CE",1,0,0,offset exports,offset imports,offset section,offset start> + +start: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + call biosprint,offset return + call biosprint,offset msg_memory + call biosprint,offset return + call biosprint,offset msg_memory_init + call mbinit + jc error + call biosprint,offset msg_ok + call biosprint,offset msg_memory_section + mov ax,cs + call mbloadsection,ax + jc error + call biosprint,offset msg_ok + call biosprint,offset msg_memory_jumps + jmp [dword ptr cs:pointer] +pointer: + dw suite + dw memorystart +suite: + push cs + push cs + push cs + push cs + pop ds + pop es + pop fs + pop gs + call biosprint,offset msg_ok + call biosprint,offset msg_video_init + call [cs:setvideomode],2 + jc error + call [cs:clearscreen] + call [cs:print],offset msg_memory + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_memory_init + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_memory_section + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_memory_jumps + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_video_init + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_handler + ;call installirqhandler + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_cpu_detect + call [cs:cpuinfo],offset thecpu + call [cs:setinfo],offset thecpu,offset temp + call [cs:print],offset msg_ok2 + push offset temp + xor eax,eax + mov al,[thecpu.family] + push eax + mov al,[thecpu.models] + push eax + mov al,[thecpu.stepping] + push eax + push offset thecpu.names + push offset thecpu.vendor + call [cs:print],offset msg_cpu_detect_inf + call [cs:print],offset msg_pci + call [cs:pciinfo],offset thepci + jc nopci + call [cs:print],offset msg_ok2 + xor eax,eax + mov al,[thepci.maxbus] + push eax + mov al,[thepci.version_minor] + push eax + mov al,[thepci.version_major] + push eax + call [cs:print],offset msg_pci_info + call [cs:print],offset msg_pci_enum + xor bx,bx + xor cx,cx + xor si,si +searchpci: + call [cs:getcardinfo],bx,cx,si,offset temp + jc stopthis + mov al,[(pcidata offset temp).subclass] + push ax + mov al,[(pcidata offset temp).class] + push ax + call [cs:getpcisubclass] + push dx + push ax + mov al,[(pcidata offset temp).class] + xor ah,ah + push ax + call [cs:getpciclass] + push dx + push ax + push 4 + push esi + push 4 + push ecx + push 4 + push ebx + mov ax,[(pcidata offset temp).device] + push eax + mov ax,[(pcidata offset temp).vendor] + push eax + call [cs:print],offset msg_pci_card + inc si + cmp si,7 + jbe searchpci +stopthis: + xor si,si + inc cx + cmp cx,31 + jbe searchpci + xor cx,cx + inc bx + cmp bx,16 + jbe searchpci + jmp next +nopci: + call [cs:print],offset msg_echec2 +next: + call [cs:detectvmware] + jne novirtual + call [cs:print],offset msg_vmware +novirtual: + call [cs:print],offset msg_flat + call enablea20 + call flatmode + xor ax,ax + mov fs,ax + mov esi,0100000h + mov [dword ptr fs:esi],"OKIN" + call [cs:print],offset msg_ok2 + call [cs:print],offset msg_disk_init + call [cs:initdrive] + jc error2 + call [cs:print],offset msg_ok2 + call [cs:execfile],offset shell + +error2: + call [cs:print],offset msg_error2 + call bioswaitkey + jmp far 0FFFFh:0000h + +error: + call biosprint,offset msg_error + call bioswaitkey + jmp far 0FFFFh:0000h + +shell find <"COMMANDE.CE",0,0,0,1,> +thepci pciinf <> +thecpu cpu <> +temp db 256 dup (0) +return db 0dh,0ah,0 +msg_memory db "Initialisation de la memoire",0 +msg_memory_init db " -Creation du bloc primordial",0 +msg_memory_section db " -Developpement des sections",0 +msg_memory_jumps db "Redirection du systeme",0 +msg_video_init db "Initialisation du pilote VIDEO",0 +msg_handler db "Initialisation du gestionnaire d'interruption",0 +msg_cpu_detect db "Dectection du processeur",0 +msg_cpu_detect_inf db " -Fondeur : %0\l -Modele : %0\l -Revision : %u\l -Version : %u\l -Famille : %u\l -Technologies: %0\l",0 +msg_pci db "Detection des systemes PCI",0 +msg_pci_info db " -Version : %yB.%yB\l -Numero bus max: %u\l",0 +msg_pci_enum db " -Enumeration des peripheriques PCI:\l" + db " |Vendeur|Modele|Bus |Dev.|Func|Classe.Sous-classe\l",0 +msg_pci_card db " | %hW | %hW |%w|%w|%w|%0P.%0P\l",0 +msg_vmware db "\c04 VMWare a ete detecte !!!\c07\l",0 +msg_flat db "Initialisation du Flat Real Mode\l",0 +msg_disk_init db "Initialisation du pilote DISQUE\l",0 + + +msg_error db " [Erreur]",0dh,0ah,"",0 +msg_ok db " [ Ok ]",0dh,0ah,0 +msg_error2 db "\h70 [\c04Erreur\c07]\g00,49",0 +msg_ok2 db "\h70 [\c02 Ok \c07]\l",0 +msg_echec2 db "\h70 [\c0CPasser\c07]\l",0 + + +exporting +declare biosprinth +declare biosprint +declare mbinit +declare mbcreate +declare mbfree +declare mbclean +declare mbresident +declare mbnonresident +declare mbchown +declare mballoc +declare mbfind +declare mbfindsb +declare mbget +declare mbloadfuncs +declare mbsearchfunc +declare bioswaitkey +declare mbloadsection +declare enableirq +declare enableirq +declare readimr +declare readirr +declare readisr +declare seteoi +declare enablea20 +declare disablea20 +declare flatmode +declare installirqhandler +declare irqhandler +declare isenableirq +declare isrequestirq +declare isinserviceirq +declare savecontext +declare restorecontextg +ende + + +importing +use VIDEO,setvideomode +use VIDEO,clearscreen +use VIDEO.LIB,print +use DETECT.LIB,cpuinfo +use DETECT.LIB,setinfo +use DETECT.LIB,pciinfo +use DETECT.LIB,getcardinfo +use DETECT.LIB,getpcisubclass +use DETECT.LIB,getpciclass +use DETECT.LIB,detectvmware +use DISQUE,initdrive +use DISQUE,projfile +use DISQUE,execfile +endi + +include "mcb.asm" +include "8259a.asm" + +section: +dw offset mb0 +dw offset mb1-offset mb0 +db "SYSTEME",0 + +dw offset mb1 +dw offset mb2-offset mb1 +db "VIDEO",0 + +dw offset mb2 +dw offset mb3-offset mb2 +db "VIDEO.LIB",0 + +dw offset mb3 +dw offset mb4-offset mb3 +db "DETECT.LIB",0 + +dw offset mb4 +dw offset mb5-offset mb4 +db "DISQUE",0 + +dd 0 + +mb1: +includebin "video.sys" +mb2: +includebin "..\lib\video.lib" +mb3: +includebin "..\lib\detect.lib" +mb4: +includebin "disque.sys" +mb5: + + + + diff --git a/noyau/systeme.ini b/noyau/systeme.ini new file mode 100644 index 0000000..fe574b7 --- /dev/null +++ b/noyau/systeme.ini @@ -0,0 +1,9 @@ +mcb.sys(49) +video.sys(47) +horloge.sys(8) +8259a.sys(50) +disque.sys(48) +souris.sys(74) +heure.sys(8) +clavier.sys(9) +port.sys(D) \ No newline at end of file diff --git a/noyau/video.asm b/noyau/video.asm new file mode 100644 index 0000000..e8b6f68 --- /dev/null +++ b/noyau/video.asm @@ -0,0 +1,1352 @@ +model tiny,stdcall +p486 +locals +jumps +codeseg +option procalign:byte + +include "..\include\mem.h" +include "..\include\graphic.h" + +org 0h + +header exe <"CE",1,0,0,offset exports,offset imports,,> + +exporting +declare setvideomode +declare getvideomode +declare clearscreen +declare setfont +declare loadfont +declare getfont +declare addline +declare showchars +declare showpixel +declare getpixel +declare setstyle +declare getstyle +declare enablecursor +declare disablecursor +declare setcolor +declare getcolor +declare scrolldown +declare getxy +declare setxy +declare savescreen +declare restorescreen +declare page2to1 +declare page1to2 +declare xchgpages +declare waithretrace +declare waitretrace +declare getvideoinfos +declare savedac +declare restoredac +declare savestate +declare restorestate +declare enablescroll +declare disablescroll +declare getchars +declare savescreen +declare savescreento +declare saveparamto +declare restoreparamfrom +declare restorescreen +declare restorescreenfrom +declare page2to1 +declare page1to2 +declare xchgpages +declare savestate +declare restorestate +declare savestate +declare restoredacfrom +declare restoredac +declare savedacto +ende + +importing +use SYSTEME,mbcreate +use SYSTEME,mbfindsb +use SYSTEME,mbfree +use SYSTEME,mbchown +endi + +;================================Table des modes videos (64 BYTES) ============================================ +;40*25 16 couleurs +mode0 DB 67H,00H, 03H,08H,03H,00H,02H + DB 2DH,27H,28H,90H,2BH,0A0H,0BFH,01FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,8EH,8FH,14H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + DB 40,25 + +;80*25 16 couleurs +mode1 DB 67H,00H, 03H,00H,03H,00H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,4FH,0DH,0EH,00H,00H,00H,00H + DB 9CH,0EH,8FH,28H,1FH,96H,0B9H,0A3h,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,38H,39H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,08H,00H + DB 80,25 + +;80*50 16 couleurs +mode2 DB 63H, 00H, 03H,01H,03H,01H,02H + DB 5FH,4FH,50H,82H,55H,81H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9CH,8EH,8FH,28H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + DB 80,50 + +;100*50 16 couleurs +mode3 DB 067H,00H,03H,01H,03H,01H,02H + DB 70H,63H,64H,85H,68H,84H,0BFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,9Ch,08EH,8FH,32H,1FH,96H,0B9H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + DB 100,50 + +;100*60 16 couleurs +mode4 DB 0A7H,00H,03H,01H,03H,01H,02H + DB 70H,63H,64H,85H,68H,84H,0FFH,1FH,00H,47H,06H,07H,00H,00H,00H + DB 00H,0E7H,8EH,0DFH,32H,1FH,0DFH,0E5H,0A3H,0FFH + DB 00H,00H,00H,00H,00H,10H,0EH,00H,0FFH + DB 00H,01H,02H,03H,04H,05H,14H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH + DB 0CH,00H,0FH,00H,00H + DB 100,60 + +;320*200 256 couleurs +mode5 DB 63H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BFH,1FH,00H,41H,00H,00H,00H,00H,00H,00H + DB 9CH,0EH,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 40,25 + +;320*400 256 couleurs +mode6 DB 063H, 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 40,50 + +;320*480 256 couleurs +mode7 DB 0E3H, 00H, 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,54H,80H,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H + DB 0EAH,0ACH,0DFH,28H,00H,0E7H,06H,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 40,60 + +;360*480 256 couleurs +mode8 DB 0E7H, 00H, 03H,01H,0FH,00H,06H + DB 6BH,59H,5AH,8EH,5EH,8AH,0DH,3EH,00H,40H,00H,00H,00H,00H,00H,00H + DB 0EAH,0ACH,0DFH,2DH,00H,0E7H,06H,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 45,60 + +;400*600 256 couleurs +mode9 DB 0E7H, 00H, 03H,01H,0FH,00H,06H + DB 74h,63h,64h,97h,68h,95h,86h,0F0h,00h,60h,00h,00h,00h,00h,00h,00h + DB 5Bh,8Dh,57h,32h,00h,60h,80h,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 50,75 + +;640*480 16 couleurs +mode10 DB 0E3H + DB 00H + DB 03H,01H,0FH,00H,06H + DB 5FH,4FH,50H,82H,53H,9FH,0BH,3EH,00H,40H,00H,00H,00H,00H,00H,00H,0E9H,8BH,0DFH,28H,00H,0E7H,04H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH,01H,00H,0FH,00H,00H + DB 80,60 + +;800*600 16 couleurs +mode11 DB 0E7H + DB 00H + DB 03H,01H,0FH,00H,06H + DB 70H,63H,64H,92H,65H,82H,70H,0F0H,00H,60H,00H,00H,00H,00H,00H,00H,5BH,8CH,57H,32H,00H,58H,70H,0E3H,0FFH + DB 00H,00H,00H,00H,00H,00H,05H,0FH,0FFH + DB 00H,01H,02H,03H,04H,05H,06H,07H,10H,11H,3AH,3BH,3CH,3DH,3EH,3FH,01H,00H,0FH,00H,00H + DB 100,75 + +;============================================DATABLOCK========================================================= +datablock vgainf <0,0,0,0,0,7,0FFh,0,0,0,0,0,0,0,0,0,0,0,1> + +;=======================================Equivalence pour la clarté du code======================================== +sequencer equ 03C4h +misc equ 03C2h +ccrt equ 03D4h +attribs equ 03C0h +graphics equ 03CEh +statut equ 03DAh + +maxmode equ 11 +planesize equ 65000 +;============================================Fonctions de l'int VIDEO=========================================== + + +;=============ENABLESCROLLING========= +;Autorise le défilement +;-> +;<- +;===================================== +PROC enablescroll FAR + mov [cs:datablock.scrolling],1 + ret +endp enablescroll + +;=============DISABLESCROLLING========= +;Désactive le d‚filement +;-> +;<- +;====================================== +PROC disablescroll FAR + mov [cs:datablock.scrolling],0 + ret +endp disablescroll + +;=============ENABLECURSOR============= +;Autorise le d‚filement +;-> +;<- +;====================================== +PROC enablecursor FAR + USES ax,dx + mov [cs:datablock.cursor],1 + mov dx,ccrt + mov al,0Ah + out dx,al + inc dx + in al,dx + and al,11011111b + mov ah,al + dec dx + mov al,0Ah + out dx,ax + mov al,[cs:datablock.x] + xor ah,ah + mov dl,[cs:datablock.y] + xor dh,dh + call setxy,ax,dx + ret +endp enablecursor + +;=============DISABLECURSOR============= +;D‚sactive le d‚filement +;-> +;<- +;======================================= +PROC disablecursor FAR + USES ax,dx + mov [cs:datablock.cursor],0 + mov dx,ccrt + mov al,0Ah + out dx,al + inc dx + in al,dx + or al,00100000b + mov ah,al + dec dx + mov al,0Ah + out dx,ax + ret +endp disablecursor + +;==========SETSTYLE========= +;Change le style du texte a %0 +;-> %0 style +;<- +;============================ +PROC setstyle FAR + ARG @style:word + USES cx + mov ax,[@style] + mov [cs:datablock.style],al + ret +endp setstyle + +;==========GETSTYLE========= +;Récupère le style du texte dans AX +;-> +;<- AX style +;=========================== +PROC getstyle FAR + mov al,[cs:datablock.style] + xor ah,ah + ret +endp getstyle + +;=============SetVideoMode========= +;Fixe le mode vidéo courant a %0 +;-> %0 mode d'écran +;<- Carry if error +;================================== +PROC setvideomode FAR + ARG @mode:word + USES ax,cx,dx,di + mov ax,[@mode] + xor ah,ah + cmp al,maxmode + ja @@errorsetvideomode + cmp [cs:datablock.mode],5h + jb @@nographic + cmp al,5h + jae @@nographic + call initfont +@@nographic: + cmp [cs:datablock.mode],0FFh + jne @@noinit + call initfont +@@noinit: + mov [cs:datablock.mode],al + xor ah,ah + mov di,ax + shl di,6 + add di,offset mode0 + mov dx,misc + mov al,[cs:di] + out dx,al + inc di + mov dx,statut + mov al,[cs:di] + out dx,al + inc di + mov dx,sequencer + xor ax,ax +@@initsequencer: + mov ah,[cs:di] + out dx,ax + inc al + inc di + cmp al,4 + jbe @@initsequencer + mov ax,0E11h + mov dx,ccrt + out dx,ax + xor ax,ax +@@initcrt: + mov ah,[cs:di] + out dx,ax + inc al + inc di + cmp al,24 + jbe @@initcrt + mov dx,graphics + xor ax,ax +@@initgraphic: + mov ah,[cs:di] + out dx,ax + inc al + inc di + cmp al,8 + jbe @@initgraphic + mov dx,statut + in al,dx + mov dx,attribs + xor ax,ax +@@initattribs: + mov ah,[cs:di] + push ax + in ax,dx + pop ax + out dx,al + xchg ah,al + out dx,al + xchg ah,al + inc al + inc di + cmp al,20 + jbe @@initattribs + mov al,20h + out dx,al + mov al,[cs:di] + mov [cs:datablock.columns],al + mov ah,[cs:di+1] + mov [cs:datablock.lines],ah + mul ah + mov cl,[cs:di-5] + and cl,01000000b + cmp cl,0 + je @@colors16 + mov [cs:datablock.color],8 + mov cl,4 + jmp @@colors256 +@@colors16: + mov [cs:datablock.color],4 + mov cl,3 +@@colors256: + cmp [cs:datablock.mode],5 + setae [cs:datablock.graphic] + jb @@istext + shl ax,cl + mov [cs:datablock.segments],0A000h + jmp @@wasgraph +@@istext: + mov [cs:datablock.segments],0B800h + shl ax,1 +@@wasgraph: + mov [cs:datablock.pagesize],ax + mov ax,planesize + xor dx,dx + div [cs:datablock.pagesize] + mov [cs:datablock.nbpage],al + mov al,[cs:di-36] + xor ah,ah + shl ax,2 + mov cl,[cs:datablock.graphic] + shr ax,cl + mov [cs:datablock.linesize],ax + mov ax,[cs:di-43] + mov [cs:datablock.adress],ax + mov [cs:datablock.base],ax + mov [cs:datablock.cursor],1 + mov [cs:datablock.style],0 + ret +@@errorsetvideomode: + ret +endp setvideomode + + +initfont: + push ds + call clearscreen + push cs + pop ds + call loadfont,offset font8x8,8,1 + call loadfont,offset font8x16,16,0 + pop ds + ret + +;=============GetVideoMode========= +;Renvoie le mode vidéo courant dans AX +;-> +;<- AX +;================================== +PROC getvideomode FAR + mov al,[cs:datablock.mode] + xor ah,ah + ret +endp getvideomode + +;=============CLEARSCREEN========= +;Efface l'ecran graphique ou texte +;-> +;<- +;================================= +PROC clearscreen FAR + USES eax,cx,dx,di,es + mov cx,planesize + mov di,[cs:datablock.adress] + shr cx,2 + cmp [cs:datablock.graphic],1 + jne @@erasetext + mov ax,0A000h + mov es,ax +@@erasegraph: + mov ax,0F02h + mov dx,sequencer + out dx,ax + mov ax,0205h + mov dx,graphics + out dx,ax + mov ax,0003h + out dx,ax + mov ax,0FF08h + out dx,ax + mov eax,00000000h + cld + rep stosd + mov ax,0005h + cmp [cs:datablock.color],4 + je @@not256 + mov ax,4005h +@@not256: + mov dx,graphics + out dx,ax + mov ax,0003h + out dx,ax + jmp @@endoferase +@@erasetext: + mov ax,0B800h + mov es,ax + mov eax,07200720h + cld + rep stosd +@@endoferase: + call setxy,0,0 + ret +endp clearscreen + + +;=============SetFont========= +;Active la font %0 parmi les 8 +;-> %0 n° font +;<- Carry if error +;============================= +PROC setfont FAR + ARG @font:word + USES ax,cx,dx + mov cx,[@font] + xor ch,ch + cmp cl,7 + ja @@errorsetfont + mov [cs:datablock.font],cl + mov ah,cl + and cl,11b + and ah,0100b + shl ah,2 + add ah,cl + mov dx,sequencer + mov al,3 + out dx,ax + ret +@@errorsetfont: + ret +endp setfont + +;=============GetFont========= +;Récupère le n° de la font active AX +;-> +;<- CL n° font, Carry if error +;============================= +PROC getfont FAR + mov al,[cs:datablock.font] + xor ah,ah +endp getfont + +;!!!!!!!!!!!!!!!!!!!! a remettre les anciens params de timing depuis origine +;=============LoadFont======== +;Charge une police pointée par %0 dans la carte vidéo sous n°font %1, taille police dans %2 +;-> %0 n°font, %1 pointeur vers Font, %2 taille police +;<- Carry if error +;============================= +PROC loadfont FAR + ARG @pointer:word,@size:word,@font:word + USES ax,bx,cx,dx,si,di,es + mov si,[@pointer] + mov cx,[@size] + mov bx,[@font] + cmp bl,7 + ja @@errorloadfont + xor di,di + cli + mov dx,sequencer +@@doseq: + mov ax,[cs:di+offset reg1] + out dx,ax + inc di + inc di + cmp di,6 + jbe @@doseq + mov dx,graphics +@@doseq2: + mov ax,[cs:di+offset reg1] + out dx,ax + inc di + inc di + cmp di,6+6 + jbe @@doseq2 + sti + mov ax,0A000h + mov es,ax + mov dx,256 + mov al,0 + xor bh,bh + cmp bl,4 + jb @@isless + sub bl,4 + shl bl,1 + inc bl + jmp @@okmake +@@isless: + shl bl,1 +@@okmake: + mov di,bx + shl di,13 + mov bh,cl + mov bl,cl + sub bl,32 + neg bl + xor cx,cx + cld +@@popz: + mov cl,bh + rep movsb + mov cl,bl + rep stosb + dec dx + jnz @@popz + xor di,di + mov dx,sequencer +@@doseqs: + mov ax,[cs:di+offset reg2] + out dx,ax + inc di + inc di + cmp di,6 + jbe @@doseqs + mov dx,graphics +@@doseqs2: + mov ax,[cs:di+offset reg2] + out dx,ax + inc di + inc di + cmp di,6+6 + jbe @@doseqs2 + ret +@@errorloadfont: + stc + ret + +reg2 dw 0100h, 0302h, 0304h, 0300h + dw 0004h, 1005h, 0E06h +reg1 dw 0100h, 0402h, 0704h, 0300h + dw 0204h, 0005h, 0406h +endp loadfont + +;==========SHOWLINE=============== +;remet le curseur text a la ligne avec un retour chariot +;-> +;<- +;================================= +PROC addline FAR + USES bx,cx + mov bl,[cs:datablock.y] + xor bh,bh + mov cl,[cs:datablock.lines] + sub cl,2 + cmp bl,cl + jne @@scro + dec bl + mov cx,1 + cmp [cs:datablock.graphic],0 + je @@okscro + mov cx,8 +@@okscro: + call scrolldown,cx +@@scro: + inc bl + call setxy,0,bx + ret +endp addline + +;==========SETCOLOR========= +;Change les attributs du texte a CL +;-> %0 couleur +;<- +;=========================== +PROC setcolor FAR + ARG @color:word + USES cx + mov cx,[@color] + mov [cs:datablock.colors],cl + ret +endp setcolor + +;==========GETCOLOR========= +;Récupère les attributs du texte dans AX +;-> +;<- AX couleur +;=========================== +PROC getcolor FAR + mov al,[cs:datablock.colors] + xor ah,ah + ret +endp getcolor + +;==========SCROLLDOWN========= +;defile de %0 lines vers le bas +;-> %0 lines à défiler vers le bas +;<- +;============================= +PROC scrolldown FAR + ARG @line:word + USES ax,cx,dx,si,di,ds,es + cmp [cs:datablock.scrolling],0 + je @@graphp + mov ax,[@line] + mul [cs:datablock.linesize] + mov si,ax + mov cx,[cs:datablock.pagesize] + sub cx,si + mov di,[cs:datablock.adress] + cld + cmp [cs:datablock.graphic],1 + jne @@textp + mov ax,0A000h + mov es,ax + mov ds,ax + mov ax,0F02h + mov dx,sequencer + out dx,ax + mov ax,0105h + mov dx,graphics + out dx,ax + cld + rep movsb + mov ax,0005h + cmp [cs:datablock.color],4 + je @@not256ok + mov ax,4005h +@@not256ok: + mov dx,graphics + out dx,ax + mov ax,0003h + out dx,ax + jmp @@graphp + +@@textp: + mov ax,0B800h + mov es,ax + mov ds,ax + rep movsb +@@graphp: + ret +endp scrolldown + +;==========GETXY========= +;Met les coordonnées du curseur dans ah,al au format point +;-> +;<- ah coordonnées x, al coordonnées y +;======================== +PROC getxy FAR + USES bx + mov ah,[cs:datablock.x] + mov al,[cs:datablock.y] + ret +endp getxy + +;==========SETXY========= +;Change les coordonnées du curseur a X:%0,Y:%1 +;-> %0 coordonnées x, %1 coordonnées y +;<- +;======================== +PROC setxy FAR + ARG @x:word,@y:word + USES ax,bx,dx,di + mov ax,[@y] + mov bx,[@x] + mov [cs:datablock.x],bl + mov [cs:datablock.y],al + mov di,[cs:datablock.adress] + add di,bx + mul [cs:datablock.columns] + add di,ax + shl di,1 + mov [cs:datablock.xy],di + call setcursor + ret +endp setxy + +;==========SHOWPIXEL========= +;Affiche un pixel de couleur AL en X:%0,Y:%1 +;-> %0 coordonnées x, %1 coordonnées y, %2 couleur +;<- +;============================ +PROC showpixel FAR + ARG @x:word,@y:word,@color:word + USES ax,bx,cx,dx,si,di,es + mov bx,[@x] + mov cx,[@y] + mov ax,[@color] + cmp [cs:datablock.color],4 + je @@showpixel4 + mov si,ax + mov ax,cx + mov cl,bl + mul [cs:datablock.linesize] + shr bx,2 + add ax,bx + mov di,ax + add di,[cs:datablock.adress] + and cl,3 + mov ah,1 + shl ah,cl + mov al,2 + mov dx,sequencer + out dx,ax + mov bx,0A000h + mov es,bx + mov ax,si + mov [es:di],al + jmp @@endofshow + +@@showpixel4: + mov dx,ax + mov ax,cx + mov ch,dl + mov cl,bl + mul [cs:datablock.linesize] + shr bx,3 + add ax,bx + mov di,ax + add di,[cs:datablock.adress] + and cl,111b + xor cl,111b + mov ah,1 + shl ah,cl + mov al,8 + mov dx,graphics ;masque + out dx,ax + mov ax,0205h + out dx,ax + mov ax,0003h + out dx,ax + mov bx,0A000h + mov es,bx + mov al,[es:di] + mov [es:di],ch +@@endofshow: + ret +endp showpixel + +;!!!!!!!!!!!!!! gerer le mode chain 4 +;==========GETPIXEL========= +;Récupère en ax la couleur du pixel de coordonnées X:%0,Y:%1 +;-> %0 coordonnées x, %1 coordonnées y +;<- AX couleur +;========================================= +PROC getpixel FAR + ARG @x:word,@y:word + USES ax,bx,cx,dx,di,es + mov bx,[@x] + mov cx,[@y] + mov ax,cx + mov cl,bl + mul [cs:datablock.linesize] + shr bx,2 + add ax,bx + mov di,ax + add di,[cs:datablock.adress] + and cl,3 + mov ah,cl + mov al,4 + mov dx,graphics + out dx,ax + mov bx,0A000h + mov es,bx + mov al,[es:di] + ret +endp getpixel + +;==========GETVGAINFO========= +;Renvoie un bloc de donnée en ES:DI sur l'état de la carte graphique +;<- ES:%0 pointeur +;-> +;============================================= +PROC getvideoinfos FAR + ARG @pointer:word + USES cx,si,di,ds + push cs + pop ds + mov cx,size datablock + mov si,offset datablock + mov di,[@pointer] + cld + rep movsb + ret +endp getvideoinfos + +;==========WAITRETRACE========= +;Synchronisation avec la retrace verticale +;<- +;-> +;============================== +PROC waitretrace FAR + USES ax,dx + mov dx,3DAh +@@waitr: + in al,dx + test al,8 + jz @@waitr + ret +endp waitretrace + +;==========WAITHRETRACE========= +;Synchronisation avec la retrace horizontale +;<- +;-> +;=============================== +PROC waithretrace FAR + USES ax,dx + mov dx,3DAh +@@waitr: + in al,dx + test al,1 + jz @@waitr + ret +endp waithretrace + +;==========GETCHAR========= +;Renvoie en AX le caractère sur le curseur +;<- +;-> +;========================== +PROC getchars FAR + USES di,es + mov ax,0B800h + mov es,ax + mov di,[cs:datablock.xy] + mov al,[es:di] + xor ah,ah + ret +endp getchars + +;==========SHOWCHAR========= +;Ecrit le caractère ASCII %0 attribut %1 aprés le curseur, en le mettant à jours +;<- +;-> +;=========================== +PROC showchars FAR + ARG @char:word,@attr:word + USES ax,bx,cx,dx,di,es + mov cl,[byte ptr @char] + mov ch,[byte ptr @attr] + cmp [@attr],0FFFFh + jne @@notlastattr + mov ch,[cs:datablock.colors] +@@notlastattr: + cmp [cs:datablock.graphic],1 + jne @@textaccess + call emulatechar + jmp @@adjusttext +@@textaccess: + mov ax,0B800h + mov es,ax + mov di,[cs:datablock.xy] + mov [es:di],cx + add [cs:datablock.xy],2 +@@adjusttext: + inc [cs:datablock.x] + mov cl,[cs:datablock.columns] + cmp [cs:datablock.x],cl + jb @@noadjusted + call addline +@@noadjusted: + call setcursor + ret +endp showchars + +setcursor: + push ax cx dx + cmp [cs:datablock.cursor],1 + jne notshow + mov dx,ccrt + mov al,0Eh + mov cx,[cs:datablock.xy] + shr cx,1 + mov ah,ch + out dx,ax + mov ah,cl + inc al + out dx,ax +notshow: + pop dx cx ax + ret + + +;Ecrit le caractère ASCII CL attribut CH aprés le curseur graphique, en le mettant à jours en mode graphique +emulatechar: + push ax bx cx dx di + mov al,ch + mov di,cx + and di,11111111b + shl di,3 + add di,offset font8x8 + mov bl,[cs:datablock.x] + mov cl,[cs:datablock.y] + xor bh,bh + xor ch,ch + shl bx,3 + shl cx,3 + mov ah,[cs:di] + xor dx,dx +bouclet: + rol ah,1 + push ax + jc colored + shr al,4 + cmp [cs:datablock.style],0 + jnz transparent +colored: + and ax,1111b + call showpixel,bx,cx,ax +transparent: + pop ax + inc bx + inc dl + cmp dl,8 + jb bouclet + inc di + mov ah,[cs:di] + xor dl,dl + sub bx,8 + inc cx + inc dh + cmp dh,8 + jb bouclet +ended: + pop di dx cx bx ax + ret + +;sauve l'ecran dans un bloc de mémoire +PROC savescreen FAR +USES ax,ds,bp +mov bp,sp +push cs +pop ds +call [cs:mbcreate],offset data3,[cs:datablock.pagesize] +jc @@error +call [cs:mbchown],ax,[word ptr ss:bp+8] +jc @@error +push ax +pop ds +call savescreento,0 +clc +ret +@@error: +stc +ret +endp savescreen +data3 db '/vgascreen',0 + + +;===================================sauve l'ecran rapidement en ds:%1================ +PROC savescreento FAR + ARG @offset:word + USES ecx,si,di,ds,es + push ds + pop es + mov cx,0B800h + mov ds,cx + xor ecx,ecx + mov cx,[cs:datablock.pagesize] + mov di,[@offset] + shr cx,2 + xor si,si + cld + rep movsd + ret +endp savescreento + +;===================================sauve les parametres en ds:%0================ +PROC saveparamto FAR + ARG @offset:word + USES ecx,si,di,ds,es + push ds + pop es + push cs + pop ds + xor ecx,ecx + mov cx,size datablock + mov di,[@offset] + mov si,offset datablock + cld + rep movsb + ret +endp saveparamto + +;===================================restore les parametres depuis en ds:%0================ +PROC restoreparamfrom FAR + ARG @offset:word + USES ecx,si,di,es + push cs + pop es + xor ecx,ecx + mov cx,size datablock + mov si,[@offset] + call setvideomode,[word ptr (vgainf si).mode] + mov di,offset datablock + cld + rep movsb + ret +endp restoreparamfrom + + + + + + + +;restaure l'ecran dans un bloc de mémoire +PROC restorescreen FAR +USES ax,ds,bp +mov bp,sp +push cs +pop ds +call [cs:mbfindsb],offset data3,[word ptr ss:bp+8] +jc @@error +push ax +pop ds +call restorescreenfrom,0 +clc +ret +@@error: +stc +ret +endp restorescreen + + +;===================================restaure l'ecran rapidement en %1================ +PROC restorescreenfrom FAR + ARG @offset:word + USES ecx,si,di,es + mov cx,0B800h + mov es,cx + xor ecx,ecx + mov cx,[cs:datablock.pagesize] + mov si,[@offset] + shr cx,2 + xor di,di + cld + rep movsd + ret +endp restorescreenfrom + + + + +;===============================Page2to1============================ + +PROC page2to1 FAR + USES ecx,si,di,ds,es + mov cx,0B800H + mov es,cx + mov ds,cx + xor ecx,ecx + mov cx,[cs:datablock.pagesize] + shr cx,2 + mov si,[cs:datablock.pagesize] + xor di,di + cld + rep movsd + ret +endp page2to1 + +;===============================Page1to2============================ +PROC page1to2 FAR + USES ecx,si,di,ds,es + mov cx,0B800H + mov es,cx + mov ds,cx + xor ecx,ecx + mov cx,[cs:datablock.pagesize] + shr cx,2 + mov di,[cs:datablock.pagesize] + xor si,si + cld + rep movsd + ret +endp page1to2 +;===============================xchgPages============================ +PROC xchgpages FAR + USES ax,ecx,si,di,ds,es,bp +mov bp,sp +push cs +pop ds +call [cs:mbcreate],offset data4,[cs:datablock.pagesize] +jc @@error +call [cs:mbchown],ax,[word ptr ss:bp+18] +jc @@error +push ax +pop ds +call savescreento,0 +call page2to1 +xor si,si +mov cx,0B800H +mov es,cx +mov di,[cs:datablock.pagesize] +xor ecx,ecx +mov cx,[cs:datablock.pagesize] +shr cx,2 +cld +rep movsd +call [cs:mbfree],ax +clc +ret +@@error: +stc +ret +endp xchgpages + +data4 db '/vgatemp',0 + + + + + +;Sauve l'‚tat de la carte dans un bloc mémoire +PROC savestate FAR +USES ax,cx,di,ds,bp +mov bp,sp +mov cx,size datablock +add cx,[cs:datablock.pagesize] +add cx,3*256 +push cs +pop ds +call [cs:mbcreate],offset data,cx +jc @@error +call [cs:mbchown],ax,[word ptr ss:bp+12] +jc @@error +push ax +pop ds +xor di,di +call saveparamto,di +add di,size datablock +call savescreento,di +add di,[cs:datablock.pagesize] +call savedacto,di +clc +ret +@@error: +stc +ret +endp savestate + +data db '/vga',0 + + + + +;R‚cupŠre l'‚tat de la carte depuis son bloc mémoire +PROC restorestate FAR +USES ax,cx,di,ds,bp +mov bp,sp +push cs +pop ds +call [cs:mbfindsb],offset data,[word ptr ss:bp+12] +jc @@error +push ax +pop ds +xor di,di +call restoreparamfrom,di +add di,size datablock +call restorescreenfrom,di +add di,[cs:datablock.pagesize] +call restoredacfrom,di +clc +ret +@@error: +stc +ret +endp restorestate + + +;sauve le DAC dans un bloc de mémoire +PROC savedac FAR +USES ax,ds,bp +mov bp,sp +push cs +pop ds +call [cs:mbcreate],offset data3,3*256 +jc @@error +call [cs:mbchown],ax,[word ptr ss:bp+8] +jc @@error +push ax +pop ds +call savedacto,0 +clc +ret +@@error: +stc +ret +endp savedac + +data2 db '/vgadac',0 + + + +;R‚cupŠre le dac depuis son bloc mémoire +PROC restoredac FAR +USES ax,ds,bp +mov bp,sp +call [cs:mbfindsb],offset data2,[word ptr ss:bp+8] +jc @@error +push ax +pop ds +call restoredacfrom,0 +clc +ret +@@error: +stc +ret +endp restoredac + + + +;sauve le DAC en ds:%0 +PROC savedacto FAR +ARG @offset:word +USES ax,cx,dx,di +mov di,[@offset] +mov dx,3C7h +mov cx,256 +@@save: +mov al,cl +dec al +out dx,al +inc dx +inc dx +in al,dx +mov [ds:di],al +inc di +in al,dx +mov [ds:di],al +inc di +in al,dx +mov [ds:di],al +inc di +dec dx +dec dx +dec cx +jne @@save +ret +endp savedacto + +;restore le DAC depuis ds:si +PROC restoredacfrom FAR +ARG @offset:word +USES ax,cx,dx,si +mov si,[@offset] +xor ax,ax +mov dx,3C8h +mov cx,256 +@@save2: +mov al,cl +dec al +out dx,al +inc dx +mov al,[ds:si] +inc si +out dx,al +mov al,[ds:si] +inc si +out dx,al +mov al,[ds:si] +inc si +out dx,al +dec dx +dec cx +jne @@save2 +ret +endp restoredacfrom + + + +font8x8: +include "..\include\pol8x8.inc" +font8x16: +include "..\include\pol8x16.inc" + +