diff --git a/asm.bat b/asm.bat index 27d5cb7..8223189 100755 --- a/asm.bat +++ b/asm.bat @@ -9,6 +9,10 @@ util\tlink %1.obj /x/t if errorlevel 1 goto end echo Copying file %1... if "%1"=="video" goto video +if "%1"=="lpt" goto system +if "%1"=="keyboard" goto system +if "%1"=="timer" goto system +if "%1"=="drive" goto system if "%1"=="system" goto system if "%1"=="setup" goto setup copy %1.com ..\data\%1.exe>nul diff --git a/disk.asm b/disk.asm index 370c46f..a90d01d 100755 --- a/disk.asm +++ b/disk.asm @@ -24,7 +24,8 @@ Adres: pop es mov cx,sect mov bx,offset buffer - call readsector + mov ax,0001h + int 48h jnc noerror errtr: mov ah,25 @@ -153,7 +154,8 @@ doaline2: jne suit6 mov cx,sect mov bx,offset buffer - call writesector + mov ah,1 + int 48h jnc waitkey jmp errtr suit6: @@ -189,7 +191,8 @@ waitst: pop es mov cx,sect mov bx,offset buffer - call writesector + mov ah,1 + int 48h jnc adres jmp errtr tre: @@ -356,88 +359,9 @@ pope db 'VIEW ',0 spaces db ' ³ ',0 showbuffer db 35 dup (0FFh) -Lastread dw 0FFFFh - -ReadSector: -push ax cx dx si - cmp cx,cs:lastread - je done - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - cmp cs:Lastread,cx - jne nodestruct - mov cs:Lastread,0ffffh - nodestruct: - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret oldmode db 0 -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -infos db 10 dup (0) - -buffer equ $+4000 - +infos db 10 dup (0) +buffer equ $ end start diff --git a/drive.asm b/drive.asm new file mode 100755 index 0000000..e2766a4 --- /dev/null +++ b/drive.asm @@ -0,0 +1,398 @@ +.model tiny +.486 +smart +.code + +org 0100h + +start: +jmp tsr +db 'DRIVE' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +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: +sti +iret +current dw 0 +tables dw readsector + dw writesector + dw verifysector2 + dw loadfatway + dw loadfile + +;cx entr‚e -> fatway chemin +getfatway: +push bx cx es +mov bx,offset fatway +fatagain: +mov cs:[bx],cx +add bx,2 +cmp cx,0FFF0h +jae finishload +call getfat +jnc fatagain +finishload: +pop es cx bx +ret + +;Charge le fichier de chemin cx +loadfatway: +push ax bx cx di +call getfatway +jc endload +mov di,offset fatway +loadagain: +mov cx,cs:[di] +cmp cx,0FFF0h +jae endload +add di,2 +xor al,al +call readsector +jc endload +add bx,cs:sizec +jmp loadagain +endload: +pop di cx bx ax +ret + +sizec dw 512 +reserv dw 1 + +;<-cx nøsecteur ->cx code FAT +getfat: +push es ax bx dx +mov ax,cx +xor dx,dx +div cs:sizec +mov cx,ax +add cx,cs:reserv +mov bx,offset buffer +push cs +pop es +call readsector +jc errorgetfat +shl dx,1 +add bx,dx +mov cx,cs:[bx] +errorgetfat: +pop dx bx ax es +ret + +ReadSector: +push ax cx dx si + cmp al,1 + je pr + cmp cx,cs:lastread + je done + pr: + mov cs:LastRead,cx + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor dX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain: + mov AL, 1 + mov DL, 0 + mov AH, 2 + int 13h + jnc Done + dec SI + jnz TryAgain +mov word ptr cs:lastread,0ffffh +Done: + pop si dx cx ax +ret + +WriteSector: +push ax cx dx si + cmp cs:Lastread,cx + jne nodestruct + mov cs:Lastread,0ffffh + nodestruct: + mov AX, CX + xor DX, DX + div cs:DiskSectorsPerTrack + mov CL, DL ;{ Set the sector } + and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } + xor DX, DX + div cs:DiskTracksPerHead + mov CH, DL ;{ Set the track bits 0-7 } + mov AL, DH + ror AL, 1 + ror AL, 1 + and AL, 11000000b + or CL, AL ;{ Set bits 8&9 of track } + xor DX, DX + div cs:DiskHeads + mov DH, DL ;{ Set the head } + inc CL + mov SI, 4 +TryAgain2: + mov AL, 1 + mov DL, 0 + mov AH, 3 + int 13h + jnc Done2 + dec SI + jnz TryAgain2 +Done2: + pop si dx cx ax +ret + +Lastread dw 0FFFFh + +Inverse: +mov si,512/4 +invert: +shl si,2 +not dword ptr [bx+si-4] +shr si,2 +dec si +jnz invert +ret + +VerifySector: +push bx cx si di ds es +push cs +pop es +push cs +pop ds +mov bx,offset buffer +call ReadSector +jc errorverify +call inverse +call WriteSector +jc errorverify +mov bx,offset buffer2 +call ReadSector +call inverse +jc errorverify +mov bx,offset buffer +call inverse +call WriteSector +jc errorverify +mov cx,512/4 +mov si,offset buffer +mov di,offset buffer2 +cld +rep cmpsd +errorverify: +pop es ds di si cx bx +ret + +VerifySector2: +call verifysector +jne nook +or byte ptr [bp+6],10b +nook: +ret + +;Charge le fichier Ds:si en es:di +loadfile: +push bx cx +call searchfile +mov bx,di +call loadfatway +pop cx bx +ret + +;Recherche le fichier et retourne sont path et en cx sont debut +Searchfile: +push bx dx si di ds es +push cs +pop es +mov di,offset temp +call asciiztofit +mov bx,offset buffer +push cs +pop ds +mov cx,13 +check: +call readsector +jc errorboot +xor di,di +findnext: +cmp byte ptr [bx+di],0 +je errorboot +push si di cx +mov si,di +add si,bx +mov di,offset temp +mov cx,12+4 +rep cmpsb +pop cx di si +je oksystem +add di,32 +inc dx +cmp dx,nbfit +ja errorboot +cmp di,sizec +jb findnext +inc cx +jmp Check +oksystem: +mov cx,[di+BX+26] +errorboot: +pop es ds di si dx bx +ret + +;->name ds:si ->es:di +AsciiZtoFit: +push ax bx cx dx si di ds es +xor bx,bx +mov dx,di +noextens: +mov al,[si+bx] +cmp al,'.' +je extens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,namesize ;(.) +jne noextens +erro: +stc +jmp errortranslate +extens: +add si,bx +inc si +sub bx,namesize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +xor bx,bx +wasextens: +mov al,[si+bx] +cmp al,0 +je endextens +call Issystchar +jc errortranslate +mov es:[di],al +inc di +inc bx +cmp bx,extsize +jne wasextens +jmp erro +endextens: +sub bx,extsize +neg bx +mov al,0 +mov cx,bx +cld +rep stosb +mov si,dx +mov di,dx +push es +pop ds +mov cx,extsize+namesize +call uppercaseMEM +clc +endtranslate: +pop es ds di si dx cx bx ax +ret +errortranslate: +stc +jmp endtranslate + +;Carry si al = caractŠre systŠme +isSystchar: +push di +mov di,offset exeptchar +isexcept: +cmp al,[di] +je nogood +inc di +cmp byte ptr [di],0 +jne isexcept +endanal: +pop di +ret +exeptchar db '/\<>:|.',01,0,0 +nogood: +stc +jmp endanal + +;Transforme les x caractŠres de la mem en ds:si en maj +uppercaseMEM: +push si di cx ax +mov di,si +uppercaser: +mov al,ds:[si] +inc si +cmp al,'A' +jb nonmaj +cmp al,'Z' +ja nonmaj +add al,'a'-'A' +nonmaj: +mov es:[di],al +inc di +dec cx +jnz uppercaser +enduppercase: +clc +pop ax cx di si +ret + +nbfit equ 255 +namesize equ 12 +extsize equ 5 + + +temp db 12+5+1 dup (0) + +DiskSectorsPerTrack dw 18 +DiskTracksPerHead dw 80 +DiskHeads dw 2 + +fatway equ $ + +buffer equ $+3000 +buffer2 equ $+512 +end start diff --git a/keyboard.asm b/keyboard.asm index 0fd52f0..ee09c17 100755 --- a/keyboard.asm +++ b/keyboard.asm @@ -2,83 +2,178 @@ .486 smart .code + org 0100h start: -mov al,0D0h -call keybcmd -in al,60h -ret - - -;============= PPI port A (Programmable Peripheral interface) ================ -;8048 (old XT) 8042 (old AT) 8741 8742 (with PS2 mouse) -; R/W -;Port 60h : Scancode & keyboarddata -overrun equ 000h ;Error too many keys pressed -BATend equ 0AAh ;End of the test BAT (basic test assurance) -MF2code equ 0ABh ;Code send by MF2 keyboard -MF2code2 equ 041h ;Code send by MF2 keyboard -echo equ 0EEh ;Send by echo command -Ack equ 0FAh ;Send by every comman exept EEh et FEh (Aknoledge) -BATerror equ 0FCh ;BAT failed -Resend equ 0FEh ;Resend data please -Error equ 0FFh ;Error of keyboard - -;Port 60h : command data -led equ 0EDh ;set the led like you want -echo equ 0EEh ;Echo byte for diagnostic -Set equ 0F0h ;Choose the Set of scancode -Id equ 0F2h ;Identify the keyboard -rate equ 0F3h ;Set the specified typematic rate -enable equ 0F4h ;clear buffer and scan -reset equ 0F5h ;Reset and no scan -reset2 equ 0F6h ;Reset and scan - -;============= PPI port A (Programmable Peripheral interface) ================ -;8048 (old XT) 8042 (old AT) 8741 8742 (with PS2 mouse) -; R/W -;Port 61h - -;==================== Data and control keyboard registers =================== -;8042 (old AT) 8741 8742 (with PS2 mouse) -; R/W -;Port 64h - - - -;Envoie la commande AL aux clavier et si besoin est la donn‚e DL -Keybcmd: -push ax -xchg al,ah -xor cx,cx -clearbuffer: -in al,64h -test al,02h -loopnz clearbuffer -jnz errorkb -xchg al,ah -out 64h,al -clearbuffer2: -in al,64h -test al,02h -loopnz clearbuffer2 -jnz errorkb -cmp dl,0 -je endkeyb -mov al,dl -out 60h,al -endkeyb: -clc -pop ax -ret -errorkb: -stc -pop ax -ret +jmp tsr +offsets dd 0 +db 'KEYBOARD' +tsr: + pushf + db 2eh,0ffh,1eh + dw offsets + cli + pusha + in al,60h + cmp cs:isstate,1 + jne nostate + cmp al,57 + jne nof12 + mov cs:isstate,0 + jmp noF12 + nostate: + cmp al,87 + jne NoF11 + push es + push cs + pop es + mov di,offset infos + mov ah,34 + int 47h + mov al,cs:infos+7 + inc al + and ax,111b + int 47h + pop es + nof11: + cmp al,88 + jne NoF12 + mov ah,26 + int 47h + call showstate + mov cs:isstate,1 + sti + waitt: + cmp cs:isstate,0 + jne waitt + mov ah,27 + int 47h + noF12: + popa + sti + iret + isstate db 0 + infos db 10 dup (0) + showstate: + push ds es + push ss + push gs + push fs + push es + push ds + push cs + pushad + pushfd + push cs + push cs + pop es + pop ds + mov ah,2 + int 47h + mov ah,21 + mov cl,4 + int 47h + mov ah,13 + mov si,offset reg + int 47h + mov ah,6 + int 47h + mov ah,21 + mov cl,7 + int 47h + mov ah,13 + mov si,offset fla + int 47h + pop edx + mov cx,32 + mov ah,11 + int 47h + mov ah,5 + int 47h + mov ah,10 + int 47h + mov si,offset regs + mov bx,8+6 + mov ah,21 + mov cl,6 + int 47h +showallREG: + mov ah,6 + int 47h + cmp bx,7 + jb nodr + pop edx + jmp popo + nodr: + mov ah,21 + mov cl,1 + int 47h + xor edx,edx + pop dx + popo: + mov ah,13 + int 47h + mov ah,10 + mov cx,32 + int 47h + mov ah,5 + int 47h + push si + mov si,offset gr + mov ah,13 + int 47h + mov ah,8 + int 47h + mov si,offset dr + mov ah,13 + int 47h + pop si + add si,5 + dec bx + jnz showallreg + mov ah,34 + mov di,offset infos + int 47h + mov ah,25 + mov bl,cs:infos + xor bh,bh + dec bl + int 47h + mov si,offset app + mov ah,13 + int 47h + mov ah,32 + mov bl,cs:infos + xor bh,bh + mov di,ax + dec di + mov cl,116 + int 47h + pop es ds + ret +reg db 'State of registers',0 +fla db 'Flags:',0 +regs db 'EDI:',0 + db 'ESI:',0 + db 'EBP:',0 + db 'ESP:',0 + db 'EBX:',0 + db 'EDX:',0 + db 'ECX:',0 + db 'EAX:',0 + db ' CS:',0 + db ' DS:',0 + db ' ES:',0 + db ' FS:',0 + db ' GS:',0 + db ' SS:',0 +gr db '(',0 +dr db ')',0 +app db 'Press space to quit...',0 end start diff --git a/logo.asm b/logo.asm index 53b4fce..842e04e 100755 --- a/logo.asm +++ b/logo.asm @@ -6,11 +6,11 @@ org 0100h start: mov si,offset logo -call searchfile +mov ah,4 +xor di,di mov bx,6000h mov es,bx -mov bx,0h -call loadfatway +int 48h push es pop ds mov bx,5000h @@ -119,203 +119,7 @@ nopp: shl cx,2 add si,cx jmp no - -Searchfile: -push bx dx si di ds es -mov di,offset temp -mov bx,offset buffer -call asciiztofit -mov cx,13 -check: -call readsector -jc errorboot -xor di,di -findnext: -cmp byte ptr [bx+di],0 -je errorboot -push si di cx -mov si,di -add si,bx -mov di,offset temp -mov cx,12+4 -rep cmpsb -pop cx di si -je oksystem -add di,32 -inc dx -cmp dx,nbfit -ja errorboot -cmp di,sizec -jb findnext -inc cx -jmp Check -oksystem: -mov cx,[di+BX+26] -errorboot: -pop es ds di si dx bx -ret - -;->name ds:si ->es:di -AsciiZtoFit: -push ax bx cx dx si di ds es -xor bx,bx -mov dx,di -noextens: -mov al,[si+bx] -cmp al,'.' -je extens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,namesize ;(.) -jne noextens -erro: -stc -jmp errortranslate -extens: -add si,bx -inc si -sub bx,namesize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -xor bx,bx -wasextens: -mov al,[si+bx] -cmp al,0 -je endextens -call Issystchar -jc errortranslate -mov es:[di],al -inc di -inc bx -cmp bx,extsize -jne wasextens -jmp erro -endextens: -sub bx,extsize -neg bx -mov al,0 -mov cx,bx -cld -rep stosb -mov si,dx -mov di,dx -push es -pop ds -mov cx,extsize+namesize -call uppercaseMEM -clc -endtranslate: -pop es ds di si dx cx bx ax -ret -errortranslate: -stc -jmp endtranslate - -;Carry si al = caractŠre systŠme -isSystchar: -push di -mov di,offset exeptchar -isexcept: -cmp al,cs:[di] -je nogood -inc di -cmp byte ptr cs:[di],0 -jne isexcept -endanal: -pop di -ret -exeptchar db '/\<>:|.',01,0,0 -nogood: -stc -jmp endanal - -;Transforme les x caractŠres de la mem en ds:si en maj -uppercaseMEM: -push si di cx ax -mov di,si -uppercaser: -mov al,ds:[si] -inc si -cmp al,'A' -jb nonmaj -cmp al,'Z' -ja nonmaj -add al,'a'-'A' -nonmaj: -mov es:[di],al -inc di -dec cx -jnz uppercaser -enduppercase: -clc -pop ax cx di si -ret - -nbfit equ 255 - - -namesize equ 12 -extsize equ 5 - -;cx entr‚e -> fatway chemin -getfatway: -push bx cx es -mov bx,offset fatway -fatagain: -mov cs:[bx],cx -add bx,2 -cmp cx,0FFF0h -jae finishload -call getfat -jnc fatagain -finishload: -pop es cx bx -ret - -lastread dw 0FFFFh - -ReadSector: -push ax cx dx si - cmp cx,cs:lastread - je done - mov cs:LastRead,cx - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -mov word ptr cs:lastread,0ffffh -Done: - pop si dx cx ax -ret - + DecompressRle: push cx dx si di mov dx,cx @@ -354,63 +158,5 @@ neg bp pop di si dx cx ret - - -dot db '.',0 - -loadfatway: -push bx di -call getfatway -jc endload -mov di,offset fatway -mov si,offset dot -mov ah,13 -loadagain: -mov cx,cs:[di] -cmp cx,0FFF0h -jae endload -add di,2 -call readsector -jc endload -int 47h -add bx,cs:sizec -jmp loadagain -endload: -mov cx,bx -pop di bx -ret - -sizec dw 512 -reserv dw 1 - -;<-cx nøsecteur ->cx code FAT -getfat: -push es ax bx dx -mov ax,cx -xor dx,dx -div cs:sizec -mov cx,ax -add cx,cs:reserv -mov bx,offset buffer -push cs -pop es -call readsector -jc errorgetfat -shl dx,1 -add bx,dx -mov cx,cs:[bx] -errorgetfat: -pop dx bx ax es -ret - logo db 'cos.rip',0 -temp db 12+5+1 dup (0) - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -fatway equ $ - -buffer equ $+5000 end start diff --git a/lpt.asm b/lpt.asm new file mode 100755 index 0000000..9f07dda --- /dev/null +++ b/lpt.asm @@ -0,0 +1,514 @@ +.model tiny +.486 +smart +.code +org 0100h +start: +jmp tsr +db 'LPT' +Tsr: +cli +cmp ax,1234h +jne nomore +mov ax,4321h +jmp itsok +nomore: +push bx +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: +sti +iret +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 + +;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 +call receivelptblock +pop ds cx bx ax +ret + +;Re‡ois une commande et l'execute +Receivecommand: +push ax bx cx di es +push cs +pop es +mov di,offset command +call receivelptblock +mov bl,al +xor bh,bh +shl bx,1 +add bx,offset cmd +call cs:[bx] +pop es di cx bx ax +ret +command db 25 dup (0) +cmd dw nothings + dw sendram + +nothings: +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 + + +;---------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 +tokenstart equ 0 +tokennext equ 1 +tokenstop equ 2 +tokenbad equ 3 +tokenresend equ 4 + + +Initlpt: +push ax ecx +call StartTimer +cmp 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 +mov ecx,0 +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 +end start diff --git a/system.asm b/system.asm index ef6c91e..4d26b56 100755 --- a/system.asm +++ b/system.asm @@ -5,27 +5,27 @@ smart org 0100h - - start: mov si,offset video -call searchfile mov bx,8400h -mov es,bx -mov bx,100h -call loadfatway -mov di,bx -mov bx,47h -call setint -ret -mov bx,9 -call getint -mov cs:int9seg,ds -mov cs:int9off,si -push cs -pop es -mov di,offset int9 -call setint +mov ax,47h +call installhandler +mov si,offset lpt +mov bx,7400h +mov ax,49h +call installhandler +mov si,offset keyboard +mov bx,7000h +mov ax,9h +call replacehandler +mov si,offset timer +mov bx,7800h +mov ax,8h +call replacehandler +mov si,offset drive +mov bx,9000h +mov ax,48h +call installhandler start2: push cs push cs @@ -53,9 +53,10 @@ int 47h mov ah,6 int 47h xor di,di +mov ax,0001h mov bx,offset buffer -mov cx,13 -call readsector +mov cx,13 +int 48h xor bp,bp showall: cmp byte ptr [bx+di],0 @@ -189,7 +190,7 @@ pop es cx bx ret loadfatway: -push bx cx di +push ax bx cx di call getfatway jc endload mov di,offset fatway @@ -206,7 +207,7 @@ int 47h add bx,cs:sizec jmp loadagain endload: -pop di cx bx +pop di cx bx ax ret sizec dw 512 @@ -253,9 +254,9 @@ ret xx dw 1 xxold dw 0 menu db 'F1 Read disk F2 Read file F9 Quit F11 Change video F12 Debug ',0 -msg1 db 'Cos 2000 menu loader release 1.0',0 +msg1 db ' Cos 2000 menu loader release 1.0',0 msg2 db 'The program is loading',0 -msg3 db 'Cos will restart your computer, eject the floppy disk and press a key',0 +msg3 db ' Cos will restart your computer, eject the floppy disk and press a key',0 prompt db '>',0 spaces db ' ',0 dot db '.',0 @@ -297,6 +298,7 @@ Done: pop si dx cx ax ret +WriteSector: push ax cx dx si cmp cs:Lastread,cx jne nodestruct @@ -332,10 +334,43 @@ Done2: pop si dx cx ax ret -Lastread dw 0FFFFh -WriteSector: +Lastread dw 0FFFFh + +;remplace le handler pointer par ds:si en bx:100h interruption ax +replacehandler: +push ax bx si di ds es +mov es,bx +mov di,0100h +call loadfile +mov bx,ax +call getint +mov es:[102h],si +mov es:[104h],ds +call setint +pop es ds di si bx ax +ret + +;install le handler pointer par ds:si en bx:100h interruption ax +installhandler: +push bx di es +mov es,bx +mov di,100h +call loadfile +mov bx,ax +call setint +pop es di bx +ret +;Charge le fichier Ds:si en es:di +loadfile: +push bx cx +call searchfile +mov bx,di +call loadfatway +pop cx bx +ret + ;met es:di le handle de l'int bx setint: push ax bx ds @@ -352,188 +387,19 @@ ret ;met ds:si le handle de l'int bx getint: push ax bx es -cli shl bx,2 xor ax,ax mov es,ax mov si,es:[bx] mov ds,es:[bx+2] pop es bx ax -sti -ret - -int9off dw 0 -int9seg dw 0 - -int9: - pushf - db 2eh,0ffh,1eh - dw int9off - cli - pusha - in al,60h - cmp cs:isstate,1 - jne nostate - cmp al,57 - jne nof12 - mov cs:isstate,0 - jmp noF12 - nostate: - cmp al,87 - jne NoF11 - push es - push cs - pop es - mov di,offset infos - mov ah,34 - int 47h - mov al,cs:infos+7 - inc al - and ax,111b - int 47h - pop es - - nof11: - cmp al,88 - jne NoF12 - mov ah,26 - int 47h - call showstate - mov cs:isstate,1 - sti - waitt: - cmp cs:isstate,0 - jne waitt - mov ah,27 - int 47h - noF12: - popa - sti - iret - isstate db 0 - infos db 10 dup (0) - - showstate: - push ds es - push ss - push gs - push fs - push es - push ds - push cs - pushad - pushfd - - push cs - push cs - pop es - pop ds - mov ah,2 - int 47h - mov ah,21 - mov cl,4 - int 47h - mov ah,13 - mov si,offset reg - int 47h - mov ah,6 - int 47h - mov ah,21 - mov cl,7 - int 47h - mov ah,13 - mov si,offset fla - int 47h - pop edx - mov cx,32 - mov ah,11 - int 47h - mov ah,5 - int 47h - mov ah,10 - int 47h - mov si,offset regs - mov bx,8+6 - mov ah,21 - mov cl,6 - int 47h -showallREG: - mov ah,6 - int 47h - cmp bx,7 - jb nodr - pop edx - jmp popo - nodr: - mov ah,21 - mov cl,1 - int 47h - xor edx,edx - pop dx - popo: - mov ah,13 - int 47h - mov ah,10 - mov cx,32 - int 47h - mov ah,5 - int 47h - push si - mov si,offset gr - mov ah,13 - int 47h - mov ah,8 - int 47h - mov si,offset dr - mov ah,13 - int 47h - pop si - add si,5 - dec bx - jnz showallreg - mov ah,34 - mov di,offset infos - int 47h - mov ah,25 - mov bl,cs:infos - xor bh,bh - dec bl - int 47h - mov si,offset app - mov ah,13 - int 47h - mov ah,32 - mov bl,cs:infos - xor bh,bh - mov di,ax - dec di - mov cl,116 - int 47h - pop es ds - ret - -reg db 'State of registers',0 -fla db 'Flags:',0 -regs db 'EDI:',0 - db 'ESI:',0 - db 'EBP:',0 - db 'ESP:',0 - db 'EBX:',0 - db 'EDX:',0 - db 'ECX:',0 - db 'EAX:',0 - db ' CS:',0 - db ' DS:',0 - db ' ES:',0 - db ' FS:',0 - db ' GS:',0 - db ' SS:',0 -gr db '(',0 -dr db ')',0 -app db 'Press space to quit...',0 +ret +;Recherchele fichier et retourne sont path et en cx sont debut Searchfile: push bx dx si di ds es +push cs +pop es mov di,offset temp mov bx,offset buffer call asciiztofit @@ -674,7 +540,11 @@ extsize equ 5 nbfit equ 255 +drive db 'drive.sys',0 +timer db 'timer.sys',0 +lpt db 'lpt.sys',0 video db 'video.sys',0 +keyboard db 'keyboard.sys',0 temp db 12+5+1 dup (0) DiskSectorsPerTrack dw 18 diff --git a/test.asm b/test.asm deleted file mode 100755 index b102754..0000000 --- a/test.asm +++ /dev/null @@ -1,274 +0,0 @@ -.model tiny -.486 -smart -.code - -org 0100h - -start: -go: -call calc -jmp go -ret - -calc: -pusha -mov ah,2Ch -int 21h -mov bh,dh -xor ebp,ebp -wait2: -xor bl,bl -waits: -mov dx,3dah -in al,dx -and al,1000b -jz wait2 -cmp bl,1 -je waits -inc ebp -inc bl -cmp ebp,300 -jne waits -mov ah,2Ch -int 21h -sub dh,bh -mov bl,dh -xor bh,bh -mov ax,bp -shr ebp,16 -mov dx,bp -div bx -xor edx,edx -mov dx,ax -call showint -popa -ret - -;===================================Afficher un int EDX a l'‚cran en ah,al================ -ShowInt: - push eax bx cx edx esi di es ds - mov di,0 - mov cx,0B800h - mov es,cx - xor cx,cx - mov eax,edx - mov esi,10 - mov bx,offset showbuffer+27 -decint3: - xor edx,edx - div esi - add dl,'0' - mov dh,cs:colors - sub bx,2 - add cx,2 - mov cs:[bx],dx - cmp ax,0 - jne decint3 - mov si,bx - push cs - pop ds - cld - rep movsb - pop ds es di esi edx cx bx eax -ret -showbuffer db 35 dup (0FFh) - -colors equ 1 - - -;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,01H,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,6H,7H,8H,9H,0AH,0BH,0CH,0DH,0EH,0FH - DB 0CH,00H,0FH,08H,00H - db 80,25 - -;80*50 16 couleurs -mode2 DB 67H, 00H, 03H,00H,03H,00H,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,00H,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 -mode22 DB 067H , 00H, 03H,01H,03H,00H,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 - - -Sequencer equ 03C4h -misc equ 03C2h -misc2 equ 03CCh -CCRT equ 03D4h -Attribs equ 03C0h -graphic equ 03CEh -statut equ 3DAh - -;====Met les cl registres cons‚cutif … ds:si du port dx -Setregs: -push ax -xor ax,ax -initreg: -mov ah,[si] -out dx,ax -inc al -inc si -cmp al,cl -jb initreg -pop ax -ret - -;met une serie de registres Cl a partir du port dx -Setlowregs: -push ax bx -xor bx,bx -cmp cl,0 -je only -initreg2: -mov al,bl -out dx,al -only: -mov al,[si] -out dx,al -inc bl -inc si -cmp bl,cl -jb initreg2 -pop bx ax -ret - -Setvideomode: -push ax cx dx si -xor ah,ah -mov si,ax -shl si,6 -add si,offset mode0 -xor cx,cx -mov dx,misc -call setlowregs -mov dx,statut -call setlowregs -mov dx,sequencer -mov cl,5 -call setregs -mov ax,0E11h -mov dx,ccrt -out dx,ax -mov cl,25 -call setregs -mov dx,graphic -mov cl,9 -call setregs -mov dx,attribs -mov cl,20 -call setlowregs -mov al,20h -out dx,al -pop dx cx ax si -ret - -;====Met les cl registres cons‚cutif … en es:DI du port dx TOUT REGISTRES -getregs: -push ax bx dx -xor bx,bx -cmp cl,0 -je only2 -initreg4: -mov al,bl -out dx,al -cmp dx,3C1h -je only2 -inc dx -only2: -in al,dx -mov es:[di],al -dec dx -inc bl -inc di -cmp bl,cl -jb initreg4 -pop dx bx ax -ret - -;====Met le mode video present dans Es:di -getvideomode: -push ax cx dx di -xor cx,cx -mov dx,misc2 -call getregs -mov dx,statut -call getregs -mov dx,sequencer -mov cl,5 -call getregs -mov dx,ccrt -mov cl,25 -call getregs -mov dx,graphic -mov cl,9 -call getregs -mov dx,attribs -mov cl,20 -call getregs -mov al,20h -out dx,al -pop di dx cx ax -ret - -;mode s‚curis‚ al -Safemode: -push cx si di ds es -call setvideomode -mov di,offset buffer -push cs -pop es -push cs -pop ds -call getvideomode -mov byte ptr es:[di+1],0 -mov si,offset mode1 -mov di,offset buffer -mov cx,62 -rep cmpsb -jne errormode -clc -endsafe: -pop ds es di si cx -ret -errormode: -stc -jmp endsafe - - - -buffer db 0 - -end start diff --git a/timer.asm b/timer.asm new file mode 100755 index 0000000..a7c11e4 --- /dev/null +++ b/timer.asm @@ -0,0 +1,32 @@ +.model tiny +.486 +smart +.code + +org 0100h + +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/verif.asm b/verif.asm index c418726..3250883 100755 --- a/verif.asm +++ b/verif.asm @@ -58,7 +58,8 @@ VerifAll: mov si,offset Msg3 int 47h call gauge - call verifysector + mov ah,2 + int 48h jc errors je noprob inc di @@ -147,116 +148,4 @@ max dw 2880 sizes dw 50 xy dw 0A12h gaugetxt db 'ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ',0 - -Inverse: -mov si,512/4 -invert: -shl si,2 -not dword ptr [bx+si-4] -shr si,2 -dec si -jnz invert -ret - -VerifySector: -push bx cx si di ds es -push cs -pop es -push cs -pop ds -mov bx,offset buffer -call ReadSector -jc errorverify -call inverse -call WriteSector -jc errorverify -mov bx,offset buffer2 -call ReadSector -call inverse -jc errorverify -mov bx,offset buffer -call inverse -call WriteSector -jc errorverify -mov cx,512/4 -mov si,offset buffer -mov di,offset buffer2 -cld -rep cmpsd -errorverify: -pop es ds di si cx bx -ret - -ReadSector: -push ax cx dx si - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor dX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain: - mov AL, 1 - mov DL, 0 - mov AH, 2 - int 13h - jnc Done - dec SI - jnz TryAgain -Done: - pop si dx cx ax -ret - -WriteSector: -push ax cx dx si - mov AX, CX - xor DX, DX - div cs:DiskSectorsPerTrack - mov CL, DL ;{ Set the sector } - and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder } - xor DX, DX - div cs:DiskTracksPerHead - mov CH, DL ;{ Set the track bits 0-7 } - mov AL, DH - ror AL, 1 - ror AL, 1 - and AL, 11000000b - or CL, AL ;{ Set bits 8&9 of track } - xor DX, DX - div cs:DiskHeads - mov DH, DL ;{ Set the head } - inc CL - mov SI, 4 -TryAgain2: - mov AL, 1 - mov DL, 0 - mov AH, 3 - int 13h - jnc Done2 - dec SI - jnz TryAgain2 -Done2: - pop si dx cx ax -ret - -DiskSectorsPerTrack dw 18 -DiskTracksPerHead dw 80 -DiskHeads dw 2 - -Buffer equ $ -Buffer2 equ $+512 - - End Start diff --git a/video.asm b/video.asm index 96d17c4..775ddc0 100755 --- a/video.asm +++ b/video.asm @@ -6,7 +6,8 @@ smart org 0100h start: - +jmp tsr +db 'VIDEO' Tsr: cli cmp ax,1234h @@ -185,14 +186,14 @@ mode1 DB 67H,00H, 03H,00H,03H,00H,02H db 80,25 ;80*50 16 couleurs -mode2 DB 67H, 00H, 03H,00H,03H,01H,02H +mode1b 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 - + 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 @@ -200,8 +201,7 @@ mode3 DB 067H,00H,03H,01H,03H,01H,02H 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 - + db 100,50 ;100*60 16 couleurs mode4b DB 067H,00H,03H,01H,03H,01H,02H