Browse Source

refactor: Passage aux outils GNU (Cygwin, make)

BREAKING CHANGE: attention modification majeure du code
feature/test
Nicolas Hordé 20 years ago
parent
commit
5a23656824
  1. 97
      API.md
  2. 321
      INFORMATIONS.md
  3. 1017
      LICENSE.md
  4. 52
      MAKEFILE
  5. 17
      commande/MAKEFILE
  6. 54
      commande/asm.bat
  7. 3
      commande/clean.bat
  8. 714
      commande/commande.asm
  9. 2
      commande/debog.bat
  10. 1702
      commande/str0.asm
  11. 25
      commande/test.asm
  12. 4
      commande/write.bat
  13. 20
      contribs/MAKEFILE
  14. 14
      contribs/ex-nasm.asm
  15. 19
      contribs/ex-tasm.asm
  16. 40
      include/bmp.h
  17. 58
      include/fat.h
  18. 19
      include/pci.h
  19. 256
      include/pol8x16.inc
  20. 128
      include/pol8x8.inc
  21. 16
      install/MAKEFILE
  22. 620
      install/setup.asm
  23. 266
      noyau/8237.asm
  24. 482
      noyau/8259a.asm
  25. 67
      noyau/MAKEFILE
  26. 55
      noyau/asm.bat
  27. 11
      noyau/asmsys.bat
  28. 440
      noyau/boot.asm
  29. 426
      noyau/clavier.asm
  30. 3
      noyau/clean.bat
  31. 2
      noyau/debog.bat
  32. 964
      noyau/disque.asm
  33. 505
      noyau/drive.asm
  34. BIN
      noyau/font/2_hebrew.fnt
  35. BIN
      noyau/font/8x11snsf.fnt
  36. BIN
      noyau/font/ad&d.fnt
  37. BIN
      noyau/font/antique.fnt
  38. BIN
      noyau/font/applicat.fnt
  39. BIN
      noyau/font/backward.fnt
  40. BIN
      noyau/font/bigserif.fnt
  41. BIN
      noyau/font/blcksnsf.fnt
  42. BIN
      noyau/font/block.fnt
  43. BIN
      noyau/font/bold.fnt
  44. BIN
      noyau/font/breeze.fnt
  45. BIN
      noyau/font/broadway.fnt
  46. BIN
      noyau/font/comp.fnt
  47. BIN
      noyau/font/computer.fnt
  48. BIN
      noyau/font/courier.fnt
  49. BIN
      noyau/font/cyrillic.fnt
  50. BIN
      noyau/font/dblmtx14.fnt
  51. BIN
      noyau/font/dblmtx16.fnt
  52. BIN
      noyau/font/finnish.fnt
  53. BIN
      noyau/font/font1!!!.dat
  54. BIN
      noyau/font/font2!!!.dat
  55. BIN
      noyau/font/font3!!!.dat
  56. BIN
      noyau/font/font4!!!.dat
  57. BIN
      noyau/font/frankfrt.fnt
  58. BIN
      noyau/font/fresno.fnt
  59. BIN
      noyau/font/future.fnt
  60. BIN
      noyau/font/greek.fnt
  61. BIN
      noyau/font/hebrew.fnt
  62. BIN
      noyau/font/hollow.fnt
  63. BIN
      noyau/font/hylas.fnt
  64. BIN
      noyau/font/inverted.fnt
  65. BIN
      noyau/font/italic.fnt
  66. BIN
      noyau/font/italics.fnt
  67. BIN
      noyau/font/itt.fnt
  68. BIN
      noyau/font/lcd.fnt
  69. BIN
      noyau/font/mechanix.fnt
  70. BIN
      noyau/font/medieval.fnt
  71. BIN
      noyau/font/modern-1.fnt
  72. BIN
      noyau/font/norway.fnt
  73. BIN
      noyau/font/norway2.fnt
  74. 0
      noyau/font/old8x8.fnt
  75. BIN
      noyau/font/oldeng.fnt
  76. BIN
      noyau/font/roman.fnt
  77. BIN
      noyau/font/sanserif.fnt
  78. BIN
      noyau/font/script.fnt
  79. BIN
      noyau/font/standard.fnt
  80. BIN
      noyau/font/stretch.fnt
  81. BIN
      noyau/font/thai.fnt
  82. BIN
      noyau/font/thin.fnt
  83. 911
      noyau/format.asm
  84. 162
      noyau/heure.asm
  85. 64
      noyau/horloge.asm
  86. 596
      noyau/manette.asm
  87. 119
      noyau/mcb.asm
  88. BIN
      noyau/old8x8.fnt
  89. 1398
      noyau/port.asm
  90. 654
      noyau/souris.asm
  91. 676
      noyau/system.asm
  92. 897
      noyau/systeme.asm
  93. 7
      noyau/systeme.ini
  94. 3381
      noyau/video.asm
  95. 4
      noyau/write.bat
  96. 67
      outils/exe2boot.asm
  97. 108
      outils/rip.asm
  98. 88
      outils/unrip.asm
  99. 57
      programs/MAKEFILE
  100. 54
      programs/asm.bat
  101. Some files were not shown because too many files have changed in this diff Show More

97
API.md

@ -1,97 +0,0 @@
Liste exhaustive des APIs supportée par cos
78 fonctions
Drive.sys : Gestionnaires FAT,FIT et partition
Interruption 48h (Disquette uniquement)
fonctions 00h readsector
01h writesector
02h verifysector
03h loadfatway
04h loadfile
05h compressrle
06h decompressrle
lpt.sys : Gestionnaires port parallèle
Interruption 0Dh (LPT1) ou 0Fh (LPT2)
fonctions 00h getlptin
01h getlptout
02h getlptinout
03h setlptin
04h setlptout
05h setlptinout
06h getlpt
07h getfirstlpt
08h setemettor
09h setreceptor
0Ah settimeout
0Bh gettimeout
0Ch receivelpt
0Dh sendlpt
0Eh receivelptblock
0Fh sendlptblock
10h receivecommand
11h sendcommand
mouse.sys : Gestionnaires souris
Interruption 74h (PS/2)
fonctions 00h cmdmouse
01h cmdmouse2
02h detectmouse
03h getmouse
04h getmousescreen
05h configmouse
pic8259a.sys : Gestionnaires contrôleur d'interruption programmable
Interruption 50h (Maître et esclave)
fonctions 00h enableirq
01h disableirq
02h readmaskirq
03h readirr
04h readisr
05h installhandler
06h replacehandler
07h getint
08h setint
09h seteoi
video.sys : Gestionnaires de la carte video
Interruption 47h (VGA)
fonctions 00h setvideomode
01h getvideomode
02h cleartext
03h changefont
04h loadfont
05h space
06h line
07h showchar
08h showint
09h showsigned
0Ah showhex
0Bh showbin
0Ch showstring
0Dh showstring0
0Eh showcharat
0Fh showintat
10h showsignedat
11h showhexat
12h showbinat
13h showstringat
14h showstring0at
15h setcolor
16h getcolor
17h scrolldown
18h getxy
19h setxy
1Ah savescreen
1Bh restorescreen
1Ch page2to1
1Dh page1to2
1Eh xchgPages
1Fh savepage1
20h changelineattr
21h waitretrace
22h getinfos
23h loadbmp
24h showbmp
25h clearscr
26h savedac
27h restoredac
28h savestate
29h restorestate

321
INFORMATIONS.md

@ -1,53 +1,268 @@
< COS2000 the new operating system >
I. Présentation
COS2000, par définition, est système d'exploitation. Celui-ci prend la direction des opérations à partir
du moment où le PC est mis sous tension (Après le BIOS). Il gère tous les périphériques rattachés au PC et
offre aux programmeurs les moyens de développer des applications compatibles en fournissant des APIs
(Application Programming Interface). COS2000 est basé sur un concept particulier qui est d'offrir aux
programmeurs un maximum de fonctions intégrées pour faciliter le travail des programmeurs et réduire la
taille des programmes.
II. Comment l'installer ?
Pour installer COS2000 :
- Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur.
- Lancez le programme SETUP.COM situé dans le dossier de COS2000.
- Si celui-ci ne détecte pas d'erreur, COS2000 est installé !
Pour lancer COS2000 :
- Insérez la disquette où COS2000 est installé.
- Veillez que dans le BIOS vous puissiez démarrer à partir de A:.
- Redémarrer votre ordinateur et vous serez sur COS2000.
Il est possible de télécharger une version plus récente de COS2000 à :
https://github.com/dahut87/cos2000v1
III. Mode d'emploi
Le COS MENU LOADER est le premier logiciel qui est lancé au démarrage. A partir de celui-ci, vous pouvez
visionner tout les fichiers présents sur votre disquette et éventuellement les exécuter s'ils possèdent
l'extension EXE . Pour cela, il suffit de sélectionner avec la ligne en surbrillance le programme à exécuter
en utilisant les flèches de direction. Pour exécuter le programmer, pressez la touche "Entrée".
A partir du COS MENU LOADER on peut lancer un interpréteur de commandes . Celui-ci s'appelle PROMPT.EXE.
Une fois dans l'interpréteur de commande, vous pouvez tout aussi bien lancer des logiciels en saisissant leurs
noms après "COS>".
En plus des logiciels, l'interpréteur de commandes peut exécuter 6 commandes :
EXIT Quitte l'interpréteur
VERSION Donne la version de COS2000
CLS Efface l'écran
REBOOT Redémarre le PC
COMMAND Donne la liste des commandes disponibles
MODE [mode] Permet de changer de mode vidéo. [mode] doit être un entier compris entre 1 et 9. les
modes au delà de 4 sont des modes graphiques à texte émulé. Il est déconseillé de les
utiliser car il est parfois impossible de revenir aux modes texte.
Les possibilités de COS2000 sont aujourd'hui très limitées car il est en cours de développement.
![logo](https://github.com/dahut87/cos2000v1/raw/master/graphisme/logo.png)
## Documentation d'origine (importée)
COS 2000
Compatible Operating System
Présentation
Comment l’installer
Mode d’emploi
Faire un programme pour COS
Liste des APIs
En cas de problème
mailto:nicolas@palon.fr
Présentation
COS2000, par définition, est système d'exploitation. Celui-ci prend la direction des opérations à partir du moment où le PC est mis sous tension (Après le BIOS). Il gère tous les périphériques rattachés au PC et offre aux programmeurs les moyens de développer des applications compatibles en fournissant des APIs (Application Programming Interface). COS2000 est basé sur un concept particulier qui est d'offrir aux programmeurs un maximum de fonctions intégrées pour faciliter le travail des programmeurs et réduire la taille des programmes.
Comment l'installer ?
Pour installer COS2000 :
Sous dos/windows
Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur.
Lancez le programme SETUP.COM situé dans le dossier de COS2000.
- Si celui ci ne détecte pas d'erreur, COS2000 est installé !
Sous Linux
Insérez une disquette 1.44 Mo vierge ou inutile dans votre lecteur.
Lancez le programme SETUP.SH situé dans le dossier de COS2000.
- Si celui ci ne détecte pas d'erreur, COS2000 est installé !
Pour lancer COS2000 :
Insérez la disquette où COS2000 est installé.
Veillez que dans le BIOS vous puissiez démarrer à partir de A:.
Redémarrer votre ordinateur et vous serez sur COS2000.
Mode d'emploi
L’interpréteur de commande COS est le premier logiciel qui est lancé au démarrage. A partir de celui-ci vous pouvez exécuter quelques commandes ou logiciels.
En plus des logiciels, l'interpréteur de commandes peut exécuter 6 commandes :
QUIT
Quitte l'interpréteur.
VERS
Donne la version de COS2000.
EFFAC
Efface l'écran.
REDEM
Redémarre le PC.
CMDS
Donne la liste des commandes disponibles.
MODE [mode]
Permet de changer de mode vidéo. [mode] doit être un entier compris entre 1 et 9. les modes au delà de 4 sont des modes graphiques à texte émulé. Il est déconseillé de les utiliser car il est parfois impossible de revenir aux modes texte.
LIRE
Permet de lire un support disquette 1.44 Mo au format FAT12.
CH
Change le dossier actuel vers celui spécifié.
VOIR
Permet de lister le contenu du dossier actuel.
Faire un programme pour COS
Toute contribution à COS 2000 en terme de programme est la bienvenue, un répertoire « contribs » contiendra les programmes des différents contributeurs. Aucune modification a ceux-ci ne sera faire sans l’accord explicite de l’auteur. Pour une contribution écrivez moi a l’adresse mailto:nicolas@palon.fr.
Pour l’instant il n’y a aucun formatage particulier du code à respecter pour faire un programme pour COS 2000. Il faut pour l’instant seulement un point d’entrée en 0100h comme un .COM de dos, 64 Ko sont donc disponible au programme, la pile utilisé est celle du système d’exploitation, c’est donc le seul segment qui ne sera pas initialisé comme les autres.
Pour clore le programme il suffit de faire un retour far.
Exemple avec un Hello Word.
Avec tasm
.model tiny ;model tiny (.com)
.486 ;Pour processeur 80486
Smart ;Optimisations
.code ;Segment de code
org 0100h ;Point d’entré en 0100h
start:
mov ah,0Dh
mov si,offset msg
int 47h ;Afficher le texte pointé par DS:SI (Showstring0)
xor ax,ax
int 16h ;Attendre l’appuie sur une touche
db 0CBH ;retour far
msg db ‘Hello World’,0
end start
Avec nasm
[bits 16] ;16 bits
[org 0x0100] ;Point d’entré en 0100h
section .text ;Segment de code
start:
mov ah,0x0D
mov si,msg
int 0x47 ;Afficher le texte pointé par DS:SI (Showstring0)
xor ax,ax
int 0x16 ;Attendre l’appuie sur une touche
retf ;retour far
msg db ‘Hello World’,0
Comme vous pouvez le constater l’appel des APIs de Cos se réalise par le biais d’interruptions logiciels dont voici la liste.
Liste des APIs
disque.sys : Gestionnaires FAT12 et Disquette
Interruption 48h (Disquette uniquement)
00h readsector
01h writesector
02h verifysector
03h initdrive
04h loadfile
05h compressrle
06h decompressrle
07h findfirstfile
08h getfreespace
09h searchfile
0Ah getname
0Bh getserial
0Ch changedir
0Dh readcluster
0Eh writecluster
0Fh getdir
port.sys : Gestionnaires port parallèle
Interruption 0Dh (LPT1) ou 0Fh (LPT2)
00h getlptin
01h getlptout
02h getlptinout
03h setlptin
04h setlptout
05h setlptinout
06h getlpt
07h getfirstlpt
08h setemettor
09h setreceptor
0Ah settimeout
0Bh gettimeout
0Ch receivelpt
0Dh sendlpt
0Eh receivelptblock
0Fh sendlptblock
10h receivecommand
11h sendcommand
souris.sys : Gestionnaires souris
Interruption 74h (PS/2)
00h cmdmouse
01h cmdmouse2
02h detectmouse
03h getmouse
04h getmousescreen
05h configmouse
8259a.sys : Gestionnaires contrôleur d'interruption programmable
Interruption 50h (Maître et esclave)
00h enableirq
01h disableirq
02h readmaskirq
03h readirr
04h readisr
05h installhandler
06h replacehandler
07h getint
08h setint
09h seteoi
video.sys : Gestionnaires de la carte vidéo
Interruption 47h (VGA)
00h setvideomode
01h getvideomode
02h cleartext
03h changefont
04h loadfont
05h space
06h line
07h showchar
08h showint
09h showsigned
0Ah showhex
0Bh showbin
0Ch showstring
0Dh showstring0
0Eh showcharat
0Fh showintat
10h showsignedat
11h showhexat
12h showbinat
13h showstringat
14h showstring0at
15h setcolor
16h getcolor
17h scrolldown
18h getxy
19h setxy
1Ah savescreen
1Bh restorescreen
1Ch page2to1
1Dh page1to2
1Eh xchgPages
1Fh savepage1
20h changelineattr
21h waitretrace
22h getinfos
23h loadbmp
24h showbmp
25h clearscr
26h savedac
27h restoredac
28h savestate
29h restorestate
30h enablescroll
31h disablescroll
32h showdate
33h showtime
34h showname
35h showattr
36h showsize
Pour l’instant je n’ai pas fait de guide détaillé de l’utilisation des fonctions de COS… A venir
Les possibilités de COS2000 sont aujourd'hui très limitées car il est en cours de développement.
En cas de problèmes
Si des bugs surviennent ou si COS2000 ne veut pas s'installer, veuillez s'il vous plaît m'envoyer un E Mail à :
mailto:nicolas@palon.fr
COS2000 n'exploite pas les disques durs, il est donc impossible qu'il altère de quelque manière que ce soit vos données !!!!!!!!!!!!!

1017
LICENSE.md

File diff suppressed because it is too large Load Diff

52
MAKEFILE

@ -0,0 +1,52 @@
all:
cd commande
make
cd ..
cd programs
make
cd ..
cd noyau
make
cd ..
cd contribs
make
cd ..
cd install
make
cd ..
copy:
make all
copy commande\*.exe ..\data
copy programs\*.exe ..\data
copy programs\*.rip ..\data
copy noyau\*.sys ..\data
rem copy noyau\*.bin ..\data
copy contribs\*.exe ..\data
copy install\*.com ..\
make clean
clean:
cd commande
make clean
cd ..
cd programs
make clean
cd ..
cd noyau
make clean
cd ..
cd contribs
make clean
cd ..
cd install
make clean
cd ..

17
commande/MAKEFILE

@ -0,0 +1,17 @@
lnk_boot = tlink /x
asm= tasm /t/m5/zi
lnk= tlink /x/t
all: commande.exe
commande.exe: commande.asm str0.asm
$(asm) commande
$(lnk) commande
ren commande.com commande.exe
clean:
del *.obj
del *.exe
del *.com
del *.sys
del *.err

54
commande/asm.bat

@ -1,54 +0,0 @@
@echo off
echo Assembling file %1...
..\util\tasm %1.asm /m5/x/t
if errorlevel 1 goto end
if "%1"=="boot" goto boot
echo Linking file %1...
..\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"=="mouse" goto system
if "%1"=="pic8259a" goto system
if "%1"=="timer" goto system
if "%1"=="drive" goto system
if "%1"=="joystick" goto system
if "%1"=="system" goto system
if "%1"=="setup" goto setup
copy %1.com ..\data\%1.exe>nul
goto end
:boot
echo Linking file %1...
..\util\tlink %1.obj /x
if errorlevel 1 goto end
echo Copying file %1...
..\util\exe2boot %1.exe
copy %1.bin ..\data\%1.bin>nul
goto end
:video
type thin8x8.fnt>>%1.com
:system
copy %1.com ..\data\%1.sys>nul
goto end
:setup
copy %1.com ..\%1.com>nul
goto end
:end
if not exist *.bin goto exes
del *.bin
:exes
if not exist *.exe goto coms
del *.exe
:coms
if not exist *.com goto objs
del *.com
:objs
if not exist *.obj goto nobjs
del *.obj
:nobjs

3
commande/clean.bat

@ -1,3 +0,0 @@
@echo off
echo nettoyage en cours...
del ..\data\*.* >nul

714
commande/prompt.asm → commande/commande.asm

@ -1,265 +1,449 @@
.model tiny
.486
smart
.code
org 0100h
start:
mov ah,2
int 47h
mov ah,6
int 47h
mov ah,6
int 47h
mov ah,42
int 47h
mov ah,13
mov si,offset msg
int 47h
xor bp,bp
mov dl,' '
call setdelimiter0
replay:
mov ah,6
int 47h
noret:
mov ah,6
int 47h
mov ah,13
mov si,offset prompt
int 47h
mov di,offset buffer
waitchar:
mov ax,0
int 16h
cmp ah,59
jne norr
cmp bp,0
je waitchar
mov ah,13
mov si,cs:[bp-8]
int 47h
push cs
pop es
call copy0
call getlength0
add di,cx
jmp waitchar
norr:
cmp al,0Dh
je entere
cmp di,offset buffer+256
je waitchar
mov [di],al
inc di
mov dl,al
mov ah,7
int 47h
jmp waitchar
entere:
mov byte ptr [di],0
mov si,offset buffer
cmp si,di
je noret
mov ah,6
int 47h
push cs
pop es
mov di,offset buffer2
xor cx,cx
call getitem0
mov si,di
call uppercase0
mov bx,offset commands
xor bp,bp
tre:
mov di,[bx]
add bx,8
cmp di,0
je error
push cs
pop es
call evalue0
cmp dx,bp
jb noadd
mov bp,dx
mov ax,bx
noadd:
call cmpstr0
jne tre
mov si,offset buffer
mov di,offset buffer2
call copy0
mov si,di
call uppercase0
xor cx,cx
inc cx
call getpointeritem0
cmp byte ptr [di-1],0
jne nopod
mov byte ptr [di],0
nopod:
mov si,di
mov di,[bx-4]
call checksyntax0
jc errorprec
mov bx,[bx-6]
call bx
jmp replay
error:
mov bp,ax
push cs
pop es
mov dl,'.'
call searchchar0
je noaddext
mov di,offset buffer
mov si,offset extcom
call concat0
noaddext:
mov si,offset buffer
push cs
mov ax,offset arrive
push ax
mov di,offset vga
mov ah,40
int 47h
mov ax,6000h
mov es,ax
push ax
mov di,0100h
push di
mov ah,4
int 48h
jc reallyerror
push es
push es
push es
pop ds
pop fs
pop gs
push 7202h
popf
db 0CBh
arrive:
push cs
push cs
push cs
push cs
pop ds
pop es
pop fs
pop gs
mov si,offset vga
mov ah,41
int 47h
xor bp,bp
jmp replay
reallyerror:
pop ax
pop ax
pop ax
pop ax
mov ah,13
mov si,offset Error_Syntax
int 47h
mov ah,13
mov si,cs:[bp-8]
int 47h
jmp replay
errorprec:
mov ah,13
mov si,offset derror
int 47h
jmp replay
Code_Exit:
pop ax
db 0CBh
Code_Version:
mov ah,13
mov si,offset Version_Text
int 47h
ret
Version_Text db 'Cos 2000 version 2.0.1B by Nico',0
Code_Cls:
mov ah,2
int 47h
ret
Code_Reboot:
push 0FFFFh
push 00000h
db 0CBH
Code_Command:
mov bx,offset commands
showalls:
mov si,[bx]
add bx,8
cmp si,0
je endoff
mov ah,13
int 47h
mov ah,6
int 47h
jmp showalls
endoff:
ret
Code_Mode:
mov cx,0
call gettypeditem0
mov ah,0
mov al,dl
and al,1111b
int 47h
mov ah,2
int 47h
ret
extcom db '.EXE',0
commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit
dw Str_Version,Code_Version,Syn_Version,Help_Version
dw Str_Cls ,Code_Cls ,Syn_Cls ,Help_Cls
dw Str_Reboot ,Code_Reboot ,Syn_Reboot ,Help_Reboot
dw Str_Command,Code_Command,Syn_Command,Help_Command
dw Str_Mode ,Code_Mode ,Syn_Mode ,Help_Mode
dw 0
Str_Exit db 'EXIT',0
Str_Version db 'VERSION',0
Str_Cls db 'CLS',0
Str_Reboot db 'REBOOT',0
Str_Command db 'COMMAND',0
Str_Mode db 'MODE',0
Syn_Exit db 0
Syn_Version db 0
Syn_Cls db 0
Syn_Reboot db 0
Syn_Command db 0
Syn_Mode db 'FFH',0
Help_Exit db 0
Help_Version db 0
Help_Cls db 0
Help_Reboot db 0
Help_Command db 0
Help_Mode db 0
derror db 'Syntax error',0
Error_Syntax db 'Command or executable doesn''t exist ! F1 for ',0
prompt db 'COS>',0
msg db 'Cos command interpretor V1.0',0
include str0.asm
buffer equ $
buffer2 equ $+256
vga equ $+512
end start
.model tiny
.486
smart
.code
org 0100h
include ..\include\fat.h
start:
push cs
push cs
push cs
push cs
pop ds
pop es
pop fs
pop gs
mov ah,21
mov cl,7
int 47h
mov ah,3
int 48h
mov ax,0002
int 47h
mov ah,2
int 47h
mov ah,6
int 47h
mov ah,6
int 47h
mov ah,42
int 47h
mov ah,13
mov si,offset msg
int 47h
xor bp,bp
mov dl,' '
call setdelimiter0
replay:
mov ah,6
int 47h
noret:
mov ah,6
int 47h
mov ah,16
mov di,offset dir
int 48h
mov si,di
mov ah,13
int 47h
mov si,offset prompt
int 47h
mov di,offset buffer
waitchar:
mov ax,0
int 16h
cmp ah,59
jne norr
cmp bp,0
je waitchar
mov ah,13
mov si,cs:[bp-8]
int 47h
push cs
pop es
call copy0
call getlength0
add di,cx
jmp waitchar
norr:
cmp al,0Dh
je entere
cmp di,offset buffer+256
je waitchar
mov [di],al
inc di
mov dl,al
mov ah,7
int 47h
jmp waitchar
entere:
mov byte ptr [di],0
mov si,offset buffer
cmp si,di
je noret
mov ah,6
int 47h
push cs
pop es
mov di,offset buffer2
xor cx,cx
call getitem0
mov si,di
call uppercase0
mov bx,offset commands
xor bp,bp
tre:
mov di,[bx]
add bx,8
cmp di,0
je error
push cs
pop es
call evalue0
cmp dx,bp
jb noadd
mov bp,dx
mov ax,bx
noadd:
call cmpstr0
jne tre
mov si,offset buffer
mov di,offset buffer2
call copy0
mov si,di
call uppercase0
xor cx,cx
inc cx
call getpointeritem0
cmp byte ptr [di-1],0
jne nopod
mov byte ptr [di],0
nopod:
mov si,di
mov di,[bx-4]
call checksyntax0
jc errorprec
mov bx,[bx-6]
call bx
jmp replay
error:
mov bp,ax
push cs
pop es
mov dl,'.'
call searchchar0
je noaddext
mov di,offset buffer
mov si,offset extcom
call concat0
noaddext:
mov si,offset buffer
push cs
mov ax,offset arrive
push ax
mov di,offset vga
mov ah,40
int 47h
mov ax,9000h
mov es,ax
push ax
mov di,0100h
push di
mov ah,4
int 48h
jc reallyerror
push es
push es
push es
pop ds
pop fs
pop gs
push 7202h
popf
db 0CBh
arrive:
push cs
push cs
push cs
push cs
pop ds
pop es
pop fs
pop gs
mov si,offset vga
mov ah,41
int 47h
xor bp,bp
jmp replay
reallyerror:
pop ax
pop ax
pop ax
pop ax
mov ah,13
mov si,offset Error_Syntax
int 47h
mov ah,13
mov si,cs:[bp-8]
int 47h
jmp replay
errorprec:
mov ah,13
mov si,offset derror
int 47h
jmp replay
Code_Exit:
pop ax
db 0CBh
Code_Version:
mov ah,13
mov si,offset Version_Text
int 47h
ret
Version_Text db 'Cos 2000 version 3.0.2Fr par Nico',0
Code_Cls:
mov ah,2
int 47h
ret
Code_Reboot:
push 0FFFFh
push 00000h
db 0CBH
Code_Command:
mov bx,offset commands
showalls:
mov si,[bx]
add bx,8
cmp si,0
je endoff
mov ah,13
int 47h
mov ah,6
int 47h
jmp showalls
endoff:
ret
Code_Mode:
mov cx,0
call gettypeditem0
mov ah,0
mov al,dl
and al,1111b
int 47h
mov ah,2
int 47h
ret
present db 'Le volume insere est nomme ',0
present2 db ', Numero de serie : ',0
nomdisque db 13 dup (0)
Code_Dir:
mov si,offset present
mov ah,13
int 47h
mov ah,11
mov di,offset nomdisque
int 48h
mov si,di
mov ah,13
int 47h
mov si,offset present2
mov ah,13
int 47h
mov ah,12
int 48h
mov ah,10
mov cx,32
int 47h
mov ah,6
int 47h
mov ah,6
int 47h
xor ebp,ebp
mov di,offset bufferentry
mov si,di
mov ah,7
int 48h
jc nofiles
go:
mov ah,46
int 47h
mov ah,05
int 47h
int 47h
int 47h
mov ah,44
mov dx,[si+Entries.FileDateCrea]
int 47h
mov ah,05
int 47h
int 47h
int 47h
mov ah,45
mov dx,[si+Entries.FileTimeCrea]
int 47h
mov ah,05
int 47h
int 47h
int 47h
mov ah,44
mov dx,[si+Entries.FileDate]
int 47h
mov ah,05
int 47h
int 47h
int 47h
mov ah,45
mov dx,[si+Entries.FileTime]
int 47h
mov ah,05
int 47h
int 47h
int 47h
mov ah,48
mov edx,[si+Entries.FileSize]
int 47h
mov ah,05
int 47h
int 47h
int 47h
mov ah,47
mov dl,[si+Entries.FileAttr]
int 47h
mov ah,6
int 47h
inc bp
mov ah,8
int 48h
jnc go
nofiles:
mov edx,ebp
mov ah,6
int 47h
mov ah,8
int 47h
mov si,offset filess
mov ah,13
int 47h
ret
bufferentry db 32 dup (0)
filess db ' Fichier(s) au total',0
changing db 'Changement de repertoire vers ',0
code_cd:
mov cx,0
call gettypeditem0
push si
mov si,offset changing
mov ah,13
int 47h
pop si
int 47h
mov ah,6
int 47h
mov si,di
mov ah,13
int 48h
jnc okchange
mov si,offset errorchanging
mov ah,13
int 47h
okchange:
ret
errorchanging db 'Impossible d''atteindre ce dossier',0
code_refresh:
mov ah,3
int 48h
jnc okrefresh
mov si,offset errorrefreshing
mov ah,13
int 47h
ret
okrefresh:
mov si,offset present
mov ah,13
int 47h
mov ah,11
mov di,offset nomdisque
int 48h
mov si,di
mov ah,13
int 47h
mov si,offset present2
mov ah,13
int 47h
mov ah,12
int 48h
mov ah,10
mov cx,32
int 47h
mov ah,6
int 47h
ret
errorrefreshing db 'Impossible de lire le support',0
extcom db '.EXE',0
commands dw Str_Exit ,Code_Exit ,Syn_Exit ,Help_Exit
dw Str_Version,Code_Version,Syn_Version,Help_Version
dw Str_Cls ,Code_Cls ,Syn_Cls ,Help_Cls
dw Str_Reboot ,Code_Reboot ,Syn_Reboot ,Help_Reboot
dw Str_Command,Code_Command,Syn_Command,Help_Command
dw Str_Mode ,Code_Mode ,Syn_Mode ,Help_Mode
dw Str_Dir ,Code_Dir ,Syn_Dir ,Help_Dir
dw Str_refresh ,Code_refresh ,Syn_refresh ,Help_refresh
dw Str_cd ,Code_cd ,Syn_cd ,Help_cd
dw 0
Str_Exit db 'QUIT',0
Str_Version db 'VERS',0
Str_Cls db 'EFFAC',0
Str_Reboot db 'REDEM',0
Str_Command db 'CMDS',0
Str_Mode db 'MODE',0
Str_Dir db 'VOIR',0
Str_refresh db 'LIRE',0
Str_cd db 'CH',0
Syn_Exit db 0
Syn_Version db 0
Syn_Cls db 0
Syn_Reboot db 0
Syn_Command db 0
Syn_Mode db 'FFH',0
Syn_Dir db 0
Syn_refresh db 0
Syn_cd db '@',0
Help_Exit db 0
Help_Version db 0
Help_Cls db 0
Help_Reboot db 0
Help_Command db 0
Help_Mode db 0
Help_Dir db 0
Help_refresh db 0
Help_cd db 0
derror db 'Erreur de Syntaxe !',0
Error_Syntax db 'La commande ou l''executable n''existe pas ! F1 pour ',0
prompt db '>',0
msg db 'Interpreteur de commande COS V1.1',0
include str0.asm
dir equ $
buffer equ $+128
buffer2 equ $+128+512
vga equ $+128+512+512
end start

2
commande/debog.bat

@ -1,2 +0,0 @@
@echo off
..\util\td %1

1702
commande/str0.asm

File diff suppressed because it is too large Load Diff

25
commande/test.asm

@ -0,0 +1,25 @@
.model tiny
.486
smart
.code
org 0100h
start:
mov si,offset essai
call whatis0
mov si,offset pop1
mov di,offset pop2
call checksyntax0
ret
essai db '#',0
pop1 db 'essai 0FFh',0
pop2 db 'ESSAI 012H',0
include str0.asm
end start

4
commande/write.bat

@ -1,4 +0,0 @@
@echo off
cd ..
setup
cd sources

20
contribs/MAKEFILE

@ -0,0 +1,20 @@
lnk_boot = tlink /x
asm= tasm /t/m5/zi
lnk= tlink /x/t
all: ex-tasm.exe ex-nasm.exe
ex-tasm.exe: ex-tasm.asm
$(asm) ex-tasm
$(lnk) ex-tasm
ren ex-tasm.com ex-tasm.exe
ex-nasm.exe: ex-nasm.asm
nasm ex-nasm.asm -o ex-nasm.exe
clean:
del *.obj
del *.exe
del *.com
del *.sys
del *.err

14
contribs/ex-nasm.asm

@ -0,0 +1,14 @@
[bits 16] ;16 bits
[org 0x0100] ;Point d'entré en 0100h
section .text ;Segment de code
start:
mov ah,0x0D
mov si,msg
int 0x47 ;Afficher le texte (Showstring0)
xor ax,ax
int 0x16 ;Attendre l'appuie sur une touche
retf ;retour far
msg db 'Hello World',0

19
contribs/ex-tasm.asm

@ -0,0 +1,19 @@
.model tiny ;model tiny (.com)
.486 ;Pour processeur 80486
Smart ;Optimisations
.code ;Segment de code
org 0100h ;Point d'entré en 0100h
start:
mov ah,0Dh
mov si,offset msg
int 47h ;Afficher le texte (Showstring0)
xor ax,ax
int 16h ;Attendre l'appuie sur une touche
db 0CBH ;retour far
msg db 'Hello World',0
end start

40
include/bmp.h

@ -0,0 +1,40 @@
BMP_File struc
BMP_FileType db 'BM'
BMP_FileSize dd ? ; taille du fichier
BMP_Reserved dd 0 ; toujours 0
BMP_BitMapOffset dd ? ; offset de l'image
BMP_HeaderSize dd ? ; taille de l'entete en octects
BMP_Width dd ? ; largeur en pixels de l'image
BMP_Height dd ? ; hauteur en pixels de l'image
BMP_Planes dw 1 ; nombre de plan utilisés
BMP_BitsPerPixel dw ? ; nombre de bits par pixels
BMP_Compression dd ? ; méthode de compression
BMP_SizeOfBitMap dd ? ; taille de l'image en octects
BMP_HorzResolution dd ? ; resolution horizontale en pixels par mètre
BMP_VertResolution dd ? ; resolution verticale en pixels par mètre
BMP_ColorsUsed dd ? ; nombre de couleur dans la palette si 0: palette entière si BitPerPixel<=8
BMP_ColorsImportant dd ? ; nombre de couleurs importantes masques pour les modes de plus de 8 bits par pixels
BMP_RedMask dd ?
BMP_GreenMask dd ?
BMP_BlueMask dd ?
BMP_AlphaMask dd ?
BMP_ColorSpaceType dd ?
BMP_RedX dd ?
BMP_RedY dd ?
BMP_RedZ dd ?
BMP_GreenX dd ?
BMP_GreenY dd ?
BMP_GreenZ dd ?
BMP_BlueX dd ?
BMP_BlueY dd ?
BMP_BlueZ dd ?
BMP_GammaRed dd ?
BMP_GammaGreen dd ?
BMP_GammeBlue dd ?
BMP_file ends
;BMP_Compression peut prendre les valeurs suivantes:
BMP_COMP_UNCOMP equ 0 ; pas de compression
BMP_COMP_RLE8 equ 1 ; 8-bit run length encoding
BMP_COMP_RLE4 equ 2 ; 4-bit tun length encoding
BMP_COMP_BFE equ 3 ; bitfields encoding

After

Width:  |  Height:  |  Size: 1.9 KiB

58
include/fat.h

@ -0,0 +1,58 @@
Free equ 0
True equ 1
False equ 0
DPT struc
StepRate&HeadUnload db 0DFh ;Vitesse de progression & monte de la tˆte
DMAFlag&HeadLoad db 002h ;Etat Dma et temps de descente de la tˆte
DelayMotorOff db 025h ;Temps avant extinction moteur
BytePerSector db 002h ;Taille des secteurs
SectorPerTracks db 000h ;Nombre de secteur par piste
InterSectGapLength db 01Bh ;Taille du GAP3 en lecture/criture
DataLength db 0FFh ;Longueur du transfert de donnes
InterSectGapLengthF db 054h ;Taille du GAP3 en formatage
FormatByte db 0F6h ;Octet de formatage
HeadSettlingTime db 000h ;Temps de repos des tˆtes
DelayMotorNormSpeed db 008h ;Temps de monte en vitesse du moteur
DPT ends
Entries Struc
FileName db 8 dup (0)
FilExt db 3 dup (0)
FileAttr db 0
FileReserved db 0
FileTimeCreaMs db 0 ;(*10 ms)
FileTimeCrea dw 0
FileDateCrea dw 0
FileDateAcc dw 0
FileNotused dw 0
FileTime dw 0
FileDate dw 0
FileGroup dw 0
FileSize dd 0
Entries Ends
BootSector Struc
jumper db 0,0,0
Vendor db 'COS2000A' ;Fabricant + n°série Formatage
SectorSize dw 512 ;octet/secteur
SectorsPerCluster db 1 ;secteur/cluster
ReservedSectors dw 1 ;secteur reserv
FatsPerDrive db 2 ;nb de copie de la FAT
DirectorySize dw 224 ;taille rep racine
SectorsPerDrive dw 2880 ;nb secteur du volume si < 32 még
MédiaDescriptor db 0F0h ;Descripteur de média
SectorsPerFat dw 9 ;secteur/FAT
SectorsPerTrack dw 18 ;secteur/piste
HeadsPerDrive dw 2 ;nb de tˆteb de lecture/écriture
HiddenSectorsH dw 0 ;nombre de secteur cachs
HiddenSectorsL dw 0 ;
SectorPerDisk2 dd 0 ;Nombre secteur du volume si > 32 Mo+20h ; the number of sectors
BootDrive db 0 ;Lecteur de dmarrage
ReservedForNT db 0 ;NA
BootSign db 29h ;boot signature 29h
SerialNumber dd 01020304h ;no de serie
DriveName db 'COS2000 ' ;nom de volume
TypeOffAt db 'FAT16 ' ;FAT
bootcode db 453 dup (0)
BootSector ends

19
include/pci.h

@ -0,0 +1,19 @@
pci Struc
vendor dw 0 ;vendor ID (read-only), FFFFh returned if requested device non-existent
device dw 0 ;device ID (read-only)
command dw 0 ;command register
status dw 0 ;status register
revision db 0 ;revision ID
interface db 0 ;programming interface
subclass db 0 ;sub-class
class db 0 ;class code
cache db 0 ;cache line size
timer db 0 ;latency timer
typed db 0 ;header type
;bits 6-0: header format
;00h other
;01h PCI-to-PCI bridge
;02h PCI-to-CardBus bridge
;bit 7: multi-function device
result db 0 ;Built-In Self-Test result
pci Ends

256
include/pol8x16.inc

@ -0,0 +1,256 @@
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 07Eh, 081h, 0A5h, 081h, 081h, 0BDh, 099h, 081h, 07Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 07Eh, 0FFh, 0DBh, 0FFh, 0FFh, 0C3h, 0E7h, 0FFh, 07Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 036h, 07Fh, 07Fh, 07Fh, 07Fh, 03Eh, 01Ch, 008h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 008h, 01Ch, 03Eh, 07Fh, 03Eh, 01Ch, 008h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 03Ch, 03Ch, 0E7h, 0E7h, 0E7h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 03Ch, 07Eh, 0FFh, 0FFh, 07Eh, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 018h, 03Ch, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0E7h, 0C3h, 0C3h, 0E7h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h
DB 000h, 000h, 000h, 000h, 03Ch, 066h, 042h, 042h, 066h, 03Ch, 000h, 000h, 000h, 000h, 000h, 000h
DB 0FFh, 0FFh, 0FFh, 0FFh, 0C3h, 099h, 0BDh, 0BDh, 099h, 0C3h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h
DB 000h, 000h, 00Fh, 007h, 00Dh, 019h, 03Ch, 066h, 066h, 066h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 03Ch, 066h, 066h, 066h, 03Ch, 018h, 07Eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 03Fh, 033h, 03Fh, 030h, 030h, 030h, 070h, 0F0h, 0E0h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 07Fh, 063h, 07Fh, 063h, 063h, 063h, 067h, 0E7h, 0E6h, 0C0h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 018h, 0DBh, 03Ch, 0E7h, 03Ch, 0DBh, 018h, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 040h, 060h, 070h, 07Ch, 07Fh, 07Ch, 070h, 060h, 040h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 001h, 003h, 007h, 01Fh, 07Fh, 01Fh, 007h, 003h, 001h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 03Ch, 07Eh, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 033h, 033h, 033h, 033h, 033h, 033h, 000h, 033h, 033h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 07Fh, 0DBh, 0DBh, 0DBh, 07Bh, 01Bh, 01Bh, 01Bh, 01Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 03Eh, 063h, 030h, 01Ch, 036h, 063h, 063h, 036h, 01Ch, 006h, 063h, 03Eh, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07Fh, 07Fh, 07Fh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 03Ch, 07Eh, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 07Eh, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 03Ch, 07Eh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 018h, 018h, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 00Ch, 006h, 07Fh, 006h, 00Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 018h, 030h, 07Fh, 030h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 060h, 060h, 060h, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 024h, 066h, 0FFh, 066h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 008h, 01Ch, 01Ch, 03Eh, 03Eh, 07Fh, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 07Fh, 07Fh, 03Eh, 03Eh, 01Ch, 01Ch, 008h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 010h, 010h, 000h, 000h, 000h, 000h
DB 000h, 024h, 024h, 024h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 042h, 042h, 042h, 0FFh, 042h, 042h, 042h, 0FFh, 042h, 042h, 042h, 000h, 000h, 000h, 000h
DB 000h, 010h, 07Eh, 090h, 090h, 090h, 07Ch, 012h, 012h, 012h, 0FCh, 010h, 000h, 000h, 000h, 000h
DB 000h, 000h, 061h, 091h, 092h, 064h, 008h, 010h, 026h, 049h, 089h, 086h, 000h, 000h, 000h, 000h
DB 000h, 070h, 088h, 088h, 088h, 050h, 060h, 091h, 08Ah, 084h, 04Ah, 031h, 000h, 000h, 000h, 000h
DB 000h, 018h, 018h, 010h, 020h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 006h, 018h, 020h, 040h, 040h, 040h, 040h, 040h, 020h, 018h, 006h, 000h, 000h, 000h, 000h
DB 000h, 060h, 018h, 004h, 002h, 002h, 002h, 002h, 002h, 004h, 018h, 060h, 000h, 000h, 000h, 000h
DB 000h, 000h, 010h, 092h, 054h, 038h, 0FEh, 038h, 054h, 092h, 010h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 010h, 010h, 010h, 0FEh, 010h, 010h, 010h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 010h, 020h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
DB 000h, 000h, 001h, 001h, 002h, 004h, 008h, 010h, 020h, 040h, 080h, 080h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 083h, 085h, 089h, 091h, 0A1h, 0C1h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 010h, 030h, 050h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 07Ch, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 001h, 002h, 03Ch, 040h, 080h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 001h, 002h, 03Ch, 002h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 002h, 006h, 00Ah, 012h, 022h, 042h, 082h, 0FFh, 002h, 002h, 002h, 000h, 000h, 000h, 000h
DB 000h, 0FFh, 080h, 080h, 080h, 0FCh, 002h, 001h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 080h, 0BCh, 0C2h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 0FFh, 081h, 001h, 002h, 004h, 008h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 081h, 042h, 03Ch, 042h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 081h, 043h, 03Dh, 001h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 018h, 018h, 010h, 020h, 000h, 000h
DB 000h, 002h, 004h, 008h, 010h, 020h, 040h, 020h, 010h, 008h, 004h, 002h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 0FEh, 000h, 000h, 000h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 040h, 020h, 010h, 008h, 004h, 002h, 004h, 008h, 010h, 020h, 040h, 000h, 000h, 000h, 000h
DB 000h, 038h, 044h, 082h, 082h, 004h, 008h, 010h, 010h, 000h, 010h, 010h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 099h, 0A5h, 0A5h, 0A5h, 09Eh, 080h, 041h, 03Eh, 000h, 000h, 000h, 000h
DB 000h, 018h, 024h, 042h, 081h, 081h, 0FFh, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h
DB 000h, 0FCh, 042h, 041h, 041h, 042h, 07Ch, 042h, 041h, 041h, 042h, 0FCh, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 081h, 080h, 080h, 080h, 080h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 0FCh, 042h, 041h, 041h, 041h, 041h, 041h, 041h, 041h, 042h, 0FCh, 000h, 000h, 000h, 000h
DB 000h, 0FFh, 080h, 080h, 080h, 080h, 0FCh, 080h, 080h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h
DB 000h, 0FFh, 080h, 080h, 080h, 080h, 0FCh, 080h, 080h, 080h, 080h, 080h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 081h, 080h, 09Fh, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 081h, 081h, 081h, 081h, 081h, 0FFh, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h
DB 000h, 038h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 038h, 000h, 000h, 000h, 000h
DB 000h, 007h, 002h, 002h, 002h, 002h, 002h, 002h, 082h, 082h, 044h, 038h, 000h, 000h, 000h, 000h
DB 000h, 081h, 082h, 084h, 088h, 090h, 0E0h, 090h, 088h, 084h, 082h, 081h, 000h, 000h, 000h, 000h
DB 000h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h
DB 000h, 081h, 0C3h, 0A5h, 099h, 099h, 081h, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h
DB 000h, 081h, 0C1h, 0A1h, 091h, 089h, 085h, 083h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 0FCh, 082h, 081h, 081h, 082h, 0FCh, 080h, 080h, 080h, 080h, 080h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 081h, 081h, 081h, 081h, 089h, 085h, 042h, 03Dh, 000h, 000h, 000h, 000h
DB 000h, 0FCh, 082h, 081h, 081h, 082h, 0FCh, 090h, 088h, 084h, 082h, 081h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 042h, 081h, 080h, 040h, 03Ch, 002h, 001h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 0FEh, 092h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h
DB 000h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 081h, 081h, 081h, 081h, 081h, 042h, 042h, 024h, 024h, 018h, 018h, 000h, 000h, 000h, 000h
DB 000h, 081h, 081h, 081h, 081h, 081h, 081h, 099h, 099h, 0A5h, 0A5h, 042h, 000h, 000h, 000h, 000h
DB 000h, 081h, 081h, 081h, 042h, 024h, 018h, 024h, 042h, 081h, 081h, 081h, 000h, 000h, 000h, 000h
DB 000h, 082h, 082h, 082h, 082h, 044h, 028h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h
DB 000h, 0FFh, 001h, 001h, 002h, 004h, 018h, 020h, 040h, 080h, 080h, 0FFh, 000h, 000h, 000h, 000h
DB 000h, 07Eh, 040h, 040h, 040h, 040h, 040h, 040h, 040h, 040h, 040h, 07Eh, 000h, 000h, 000h, 000h
DB 000h, 000h, 080h, 080h, 040h, 020h, 010h, 008h, 004h, 002h, 001h, 001h, 000h, 000h, 000h, 000h
DB 000h, 07Eh, 002h, 002h, 002h, 002h, 002h, 002h, 002h, 002h, 002h, 07Eh, 000h, 000h, 000h, 000h
DB 000h, 018h, 024h, 042h, 081h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h
DB 000h, 008h, 004h, 002h, 001h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 07Ch, 002h, 002h, 07Eh, 082h, 082h, 07Dh, 000h, 000h, 000h, 000h
DB 000h, 080h, 080h, 080h, 080h, 0BCh, 0C2h, 081h, 081h, 081h, 0C2h, 0BCh, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Ch, 042h, 080h, 080h, 080h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 001h, 001h, 001h, 001h, 03Dh, 043h, 081h, 081h, 081h, 043h, 03Dh, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Ch, 042h, 081h, 0FFh, 080h, 040h, 03Eh, 000h, 000h, 000h, 000h
DB 000h, 00Eh, 011h, 010h, 010h, 0FEh, 010h, 010h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Dh, 043h, 081h, 081h, 043h, 03Dh, 001h, 002h, 07Ch, 000h, 000h
DB 000h, 080h, 080h, 080h, 080h, 0BCh, 0C2h, 081h, 081h, 081h, 081h, 081h, 000h, 000h, 000h, 000h
DB 000h, 000h, 008h, 008h, 000h, 038h, 008h, 008h, 008h, 008h, 008h, 03Eh, 000h, 000h, 000h, 000h
DB 000h, 000h, 002h, 002h, 000h, 006h, 002h, 002h, 002h, 002h, 002h, 082h, 044h, 038h, 000h, 000h
DB 000h, 080h, 080h, 080h, 080h, 082h, 084h, 088h, 090h, 0A8h, 0C4h, 082h, 000h, 000h, 000h, 000h
DB 038h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 008h, 03Eh, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0ECh, 092h, 092h, 092h, 092h, 092h, 092h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0B8h, 0C4h, 082h, 082h, 082h, 082h, 082h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Ch, 042h, 081h, 081h, 081h, 042h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0BCh, 0C2h, 081h, 081h, 081h, 0C2h, 0BCh, 080h, 080h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Dh, 043h, 081h, 081h, 081h, 043h, 03Dh, 001h, 001h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0BEh, 0C1h, 080h, 080h, 080h, 080h, 080h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 07Eh, 081h, 080h, 07Eh, 001h, 081h, 07Eh, 000h, 000h, 000h, 000h
DB 010h, 010h, 010h, 010h, 010h, 0FEh, 010h, 010h, 010h, 010h, 011h, 00Eh, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 081h, 081h, 081h, 081h, 081h, 043h, 03Dh, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 081h, 081h, 081h, 081h, 042h, 024h, 018h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 082h, 082h, 092h, 092h, 092h, 0AAh, 044h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 081h, 042h, 024h, 018h, 024h, 042h, 081h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 081h, 081h, 081h, 081h, 043h, 03Dh, 001h, 002h, 07Ch, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0FFh, 002h, 004h, 018h, 020h, 040h, 0FFh, 000h, 000h, 000h, 000h
DB 000h, 004h, 008h, 010h, 010h, 010h, 020h, 010h, 010h, 010h, 008h, 004h, 000h, 000h, 000h, 000h
DB 000h, 010h, 010h, 010h, 010h, 000h, 000h, 010h, 010h, 010h, 010h, 000h, 000h, 000h, 000h, 000h
DB 000h, 040h, 020h, 010h, 010h, 010h, 008h, 010h, 010h, 010h, 020h, 040h, 000h, 000h, 000h, 000h
DB 000h, 000h, 070h, 099h, 00Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 008h, 01Ch, 036h, 063h, 063h, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 01Eh, 033h, 061h, 060h, 060h, 061h, 033h, 01Eh, 006h, 003h, 03Eh, 000h, 000h, 000h
DB 000h, 000h, 066h, 066h, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 006h, 00Ch, 018h, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 008h, 01Ch, 036h, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 066h, 066h, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 030h, 018h, 00Ch, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 01Ch, 036h, 01Ch, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 03Ch, 066h, 060h, 066h, 03Ch, 00Ch, 006h, 03Ch, 000h, 000h, 000h, 000h
DB 000h, 008h, 01Ch, 036h, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 066h, 066h, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 030h, 018h, 00Ch, 000h, 03Eh, 063h, 07Fh, 060h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 066h, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 018h, 03Ch, 066h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 060h, 030h, 018h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 063h, 063h, 008h, 01Ch, 036h, 063h, 063h, 07Fh, 063h, 063h, 000h, 000h, 000h, 000h, 000h
DB 01Ch, 036h, 01Ch, 000h, 01Ch, 036h, 063h, 063h, 07Fh, 063h, 063h, 000h, 000h, 000h, 000h, 000h
DB 00Ch, 018h, 030h, 000h, 07Fh, 033h, 030h, 03Eh, 030h, 033h, 07Fh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 06Eh, 03Bh, 01Bh, 07Eh, 0D8h, 0DCh, 077h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 01Fh, 036h, 066h, 066h, 07Fh, 066h, 066h, 066h, 067h, 000h, 000h, 000h, 000h, 000h
DB 000h, 008h, 01Ch, 036h, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 063h, 063h, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 030h, 018h, 00Ch, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 018h, 03Ch, 066h, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 030h, 018h, 00Ch, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 063h, 063h, 000h, 063h, 063h, 063h, 063h, 03Fh, 003h, 006h, 03Ch, 000h, 000h, 000h
DB 000h, 063h, 063h, 01Ch, 036h, 063h, 063h, 063h, 063h, 036h, 01Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 063h, 063h, 000h, 063h, 063h, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 018h, 018h, 07Eh, 0C3h, 0C0h, 0C0h, 0C3h, 07Eh, 018h, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 01Ch, 036h, 032h, 030h, 078h, 030h, 030h, 030h, 073h, 07Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 0C3h, 066h, 03Ch, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 0FCh, 066h, 066h, 07Ch, 062h, 066h, 06Fh, 066h, 066h, 0F3h, 000h, 000h, 000h, 000h, 000h
DB 000h, 00Eh, 01Bh, 018h, 018h, 018h, 07Eh, 018h, 018h, 018h, 018h, 0D8h, 070h, 000h, 000h, 000h
DB 000h, 00Ch, 018h, 030h, 000h, 03Ch, 006h, 03Eh, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 00Ch, 018h, 030h, 000h, 038h, 018h, 018h, 018h, 018h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 00Ch, 018h, 030h, 000h, 03Eh, 063h, 063h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 00Ch, 018h, 030h, 000h, 066h, 066h, 066h, 066h, 066h, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 03Bh, 06Eh, 000h, 06Eh, 033h, 033h, 033h, 033h, 033h, 000h, 000h, 000h, 000h, 000h
DB 03Bh, 06Eh, 000h, 063h, 073h, 07Bh, 07Fh, 06Fh, 067h, 063h, 063h, 000h, 000h, 000h, 000h, 000h
DB 000h, 03Ch, 06Ch, 06Ch, 03Eh, 000h, 07Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 038h, 06Ch, 06Ch, 038h, 000h, 07Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 018h, 000h, 018h, 018h, 030h, 063h, 063h, 03Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 07Fh, 060h, 060h, 060h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 07Fh, 003h, 003h, 003h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 060h, 0E0h, 063h, 066h, 06Ch, 018h, 030h, 06Eh, 0C3h, 006h, 00Ch, 01Fh, 000h, 000h, 000h
DB 000h, 060h, 0E0h, 063h, 066h, 06Ch, 018h, 033h, 067h, 0CFh, 01Fh, 003h, 003h, 000h, 000h, 000h
DB 000h, 000h, 018h, 018h, 000h, 018h, 018h, 03Ch, 03Ch, 03Ch, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 01Bh, 036h, 06Ch, 036h, 01Bh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 06Ch, 036h, 01Bh, 036h, 06Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 011h, 044h, 000h, 000h
DB 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 000h, 000h
DB 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 0DDh, 077h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 0F8h, 018h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0F6h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FEh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0F8h, 018h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 0F6h, 006h, 0F6h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0FEh, 006h, 0F6h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 0F6h, 006h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0FEh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 0F8h, 018h, 0F8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0F8h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 01Fh, 018h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 037h, 030h, 03Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Fh, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 0F7h, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0F7h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 037h, 030h, 037h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 0F7h, 000h, 0F7h, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 0FFh, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 03Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 01Fh, 018h, 01Fh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 01Fh, 018h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 03Fh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 036h, 036h, 036h, 036h, 036h, 036h, 036h, 0FFh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 0FFh, 018h, 0FFh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0F8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 01Fh, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h
DB 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 0F0h, 000h, 000h
DB 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 00Fh, 000h, 000h
DB 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Bh, 06Eh, 06Ch, 06Ch, 06Eh, 03Bh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 03Eh, 063h, 07Eh, 063h, 063h, 07Eh, 060h, 060h, 020h, 000h, 000h, 000h
DB 000h, 000h, 07Fh, 063h, 063h, 060h, 060h, 060h, 060h, 060h, 060h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 07Fh, 036h, 036h, 036h, 036h, 036h, 036h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 07Fh, 063h, 030h, 018h, 00Ch, 018h, 030h, 063h, 07Fh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 03Fh, 06Ch, 06Ch, 06Ch, 06Ch, 038h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 033h, 033h, 033h, 033h, 03Eh, 030h, 030h, 060h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 03Bh, 06Eh, 00Ch, 00Ch, 00Ch, 00Ch, 00Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 07Eh, 018h, 03Ch, 066h, 066h, 066h, 03Ch, 018h, 07Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 01Ch, 036h, 063h, 063h, 07Fh, 063h, 063h, 036h, 01Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 01Ch, 036h, 063h, 063h, 063h, 036h, 036h, 036h, 077h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 01Eh, 030h, 018h, 00Ch, 03Eh, 066h, 066h, 066h, 03Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 07Eh, 0DBh, 0DBh, 07Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 003h, 006h, 07Eh, 0DBh, 0DBh, 0F3h, 07Eh, 060h, 0C0h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 01Ch, 030h, 060h, 060h, 07Ch, 060h, 060h, 030h, 01Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 03Eh, 063h, 063h, 063h, 063h, 063h, 063h, 063h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 07Fh, 000h, 000h, 07Fh, 000h, 000h, 07Fh, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 018h, 018h, 0FFh, 018h, 018h, 018h, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 030h, 018h, 00Ch, 006h, 00Ch, 018h, 030h, 000h, 07Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 00Ch, 018h, 030h, 060h, 030h, 018h, 00Ch, 000h, 07Eh, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 00Eh, 01Bh, 01Bh, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 000h, 000h
DB 018h, 018h, 018h, 018h, 018h, 018h, 018h, 018h, 0D8h, 0D8h, 070h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 018h, 018h, 000h, 000h, 0FFh, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 03Bh, 06Eh, 000h, 03Bh, 06Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 038h, 06Ch, 06Ch, 038h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 018h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 018h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 00Fh, 00Ch, 00Ch, 00Ch, 00Ch, 00Ch, 0ECh, 06Ch, 03Ch, 01Ch, 000h, 000h, 000h, 000h, 000h
DB 000h, 0D8h, 06Ch, 06Ch, 06Ch, 06Ch, 06Ch, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 070h, 0D8h, 030h, 060h, 0C8h, 0F8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 03Eh, 03Eh, 03Eh, 03Eh, 03Eh, 03Eh, 000h, 000h, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h

128
include/pol8x8.inc

@ -0,0 +1,128 @@
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 07Eh, 081h, 0A5h, 081h, 0BDh, 099h, 081h, 07Eh
DB 07Eh, 0FFh, 0DBh, 0FFh, 0C3h, 0E7h, 0FFh, 07Eh, 06Ch, 0FEh, 0FEh, 0FEh, 07Ch, 038h, 010h, 000h
DB 010h, 038h, 07Ch, 0FEh, 07Ch, 038h, 010h, 000h, 038h, 07Ch, 038h, 0FEh, 0FEh, 07Ch, 038h, 07Ch
DB 010h, 010h, 038h, 07Ch, 0FEh, 07Ch, 038h, 07Ch, 000h, 000h, 018h, 03Ch, 03Ch, 018h, 000h, 000h
DB 0FFh, 0FFh, 0E7h, 0C3h, 0C3h, 0E7h, 0FFh, 0FFh, 000h, 03Ch, 066h, 042h, 042h, 066h, 03Ch, 000h
DB 0FFh, 0C3h, 099h, 0BDh, 0BDh, 099h, 0C3h, 0FFh, 00Fh, 007h, 00Fh, 07Dh, 0CCh, 0CCh, 0CCh, 078h
DB 03Ch, 066h, 066h, 066h, 03Ch, 018h, 07Eh, 018h, 03Fh, 033h, 03Fh, 030h, 030h, 070h, 0F0h, 0E0h
DB 07Fh, 063h, 07Fh, 063h, 063h, 067h, 0E6h, 0C0h, 099h, 05Ah, 03Ch, 0E7h, 0E7h, 03Ch, 05Ah, 099h
DB 080h, 0E0h, 0F8h, 0FEh, 0F8h, 0E0h, 080h, 000h, 002h, 00Eh, 03Eh, 0FEh, 03Eh, 00Eh, 002h, 000h
DB 018h, 03Ch, 07Eh, 018h, 018h, 07Eh, 03Ch, 018h, 066h, 066h, 066h, 066h, 066h, 000h, 066h, 000h
DB 07Fh, 0DBh, 0DBh, 07Bh, 01Bh, 01Bh, 01Bh, 000h, 03Eh, 063h, 038h, 06Ch, 06Ch, 038h, 0CCh, 078h
DB 000h, 000h, 000h, 000h, 07Eh, 07Eh, 07Eh, 000h, 018h, 03Ch, 07Eh, 018h, 07Eh, 03Ch, 018h, 0FFh
DB 018h, 03Ch, 07Eh, 018h, 018h, 018h, 018h, 000h, 018h, 018h, 018h, 018h, 07Eh, 03Ch, 018h, 000h
DB 000h, 018h, 00Ch, 0FEh, 00Ch, 018h, 000h, 000h, 000h, 030h, 060h, 0FEh, 060h, 030h, 000h, 000h
DB 000h, 000h, 0C0h, 0C0h, 0C0h, 0FEh, 000h, 000h, 000h, 024h, 066h, 0FFh, 066h, 024h, 000h, 000h
DB 000h, 018h, 03Ch, 07Eh, 0FFh, 0FFh, 000h, 000h, 000h, 0FFh, 0FFh, 07Eh, 03Ch, 018h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 040h, 040h, 040h, 040h, 040h, 000h, 040h, 000h
DB 090h, 090h, 000h, 000h, 000h, 000h, 000h, 000h, 050h, 050h, 0F8h, 050h, 0F8h, 050h, 050h, 000h
DB 020h, 078h, 0A0h, 070h, 028h, 0F0h, 020h, 000h, 0C8h, 0C8h, 010h, 020h, 040h, 098h, 098h, 000h
DB 070h, 088h, 050h, 020h, 054h, 088h, 074h, 000h, 060h, 020h, 040h, 000h, 000h, 000h, 000h, 000h
DB 020h, 040h, 080h, 080h, 080h, 040h, 020h, 000h, 020h, 010h, 008h, 008h, 008h, 010h, 020h, 000h
DB 000h, 020h, 0A8h, 070h, 070h, 0A8h, 020h, 000h, 000h, 000h, 020h, 020h, 0F8h, 020h, 020h, 000h
DB 000h, 000h, 000h, 000h, 000h, 060h, 020h, 040h, 000h, 000h, 000h, 000h, 0F8h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 000h, 060h, 060h, 000h, 002h, 004h, 008h, 010h, 020h, 040h, 080h, 000h
DB 070h, 088h, 098h, 0A8h, 0C8h, 088h, 070h, 000h, 040h, 0C0h, 040h, 040h, 040h, 040h, 0E0h, 000h
DB 070h, 088h, 008h, 010h, 020h, 040h, 0F8h, 000h, 070h, 088h, 008h, 010h, 008h, 088h, 070h, 000h
DB 008h, 018h, 028h, 048h, 0FCh, 008h, 008h, 000h, 0F8h, 080h, 080h, 0F0h, 008h, 088h, 070h, 000h
DB 020h, 040h, 080h, 0F0h, 088h, 088h, 070h, 000h, 0F8h, 008h, 010h, 020h, 040h, 040h, 040h, 000h
DB 070h, 088h, 088h, 070h, 088h, 088h, 070h, 000h, 070h, 088h, 088h, 078h, 008h, 008h, 070h, 000h
DB 000h, 000h, 060h, 060h, 000h, 060h, 060h, 000h, 000h, 000h, 060h, 060h, 000h, 060h, 060h, 020h
DB 010h, 020h, 040h, 080h, 040h, 020h, 010h, 000h, 000h, 000h, 0F8h, 000h, 0F8h, 000h, 000h, 000h
DB 080h, 040h, 020h, 010h, 020h, 040h, 080h, 000h, 078h, 084h, 004h, 008h, 010h, 000h, 010h, 000h
DB 070h, 088h, 088h, 0A8h, 0B8h, 080h, 078h, 000h, 020h, 050h, 088h, 088h, 0F8h, 088h, 088h, 000h
DB 0F0h, 088h, 088h, 0F0h, 088h, 088h, 0F0h, 000h, 070h, 088h, 080h, 080h, 080h, 088h, 070h, 000h
DB 0F0h, 088h, 088h, 088h, 088h, 088h, 0F0h, 000h, 0F8h, 080h, 080h, 0E0h, 080h, 080h, 0F8h, 000h
DB 0F8h, 080h, 080h, 0E0h, 080h, 080h, 080h, 000h, 070h, 088h, 080h, 080h, 098h, 088h, 078h, 000h
DB 088h, 088h, 088h, 0F8h, 088h, 088h, 088h, 000h, 0E0h, 040h, 040h, 040h, 040h, 040h, 0E0h, 000h
DB 038h, 010h, 010h, 010h, 010h, 090h, 060h, 000h, 088h, 090h, 0A0h, 0C0h, 0A0h, 090h, 088h, 000h
DB 080h, 080h, 080h, 080h, 080h, 080h, 0F8h, 000h, 082h, 0C6h, 0AAh, 092h, 082h, 082h, 082h, 000h
DB 084h, 0C4h, 0A4h, 094h, 08Ch, 084h, 084h, 000h, 070h, 088h, 088h, 088h, 088h, 088h, 070h, 000h
DB 0F0h, 088h, 088h, 0F0h, 080h, 080h, 080h, 000h, 070h, 088h, 088h, 088h, 0A8h, 090h, 068h, 000h
DB 0F0h, 088h, 088h, 0F0h, 0A0h, 090h, 088h, 000h, 070h, 088h, 080h, 070h, 008h, 088h, 070h, 000h
DB 0F8h, 020h, 020h, 020h, 020h, 020h, 020h, 000h, 088h, 088h, 088h, 088h, 088h, 088h, 070h, 000h
DB 088h, 088h, 088h, 050h, 050h, 020h, 020h, 000h, 082h, 082h, 082h, 082h, 092h, 092h, 06Ch, 000h
DB 088h, 088h, 050h, 020h, 050h, 088h, 088h, 000h, 088h, 088h, 088h, 050h, 020h, 020h, 020h, 000h
DB 0F8h, 008h, 010h, 020h, 040h, 080h, 0F8h, 000h, 0E0h, 080h, 080h, 080h, 080h, 080h, 0E0h, 000h
DB 080h, 040h, 020h, 010h, 008h, 004h, 002h, 000h, 0E0h, 020h, 020h, 020h, 020h, 020h, 0E0h, 000h
DB 020h, 050h, 088h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 0F8h, 000h
DB 040h, 020h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 070h, 008h, 078h, 088h, 074h, 000h
DB 080h, 080h, 0B0h, 0C8h, 088h, 0C8h, 0B0h, 000h, 000h, 000h, 070h, 088h, 080h, 088h, 070h, 000h
DB 008h, 008h, 068h, 098h, 088h, 098h, 068h, 000h, 000h, 000h, 070h, 088h, 0F8h, 080h, 070h, 000h
DB 030h, 048h, 040h, 0E0h, 040h, 040h, 040h, 000h, 000h, 000h, 034h, 048h, 048h, 038h, 008h, 030h
DB 080h, 080h, 0B0h, 0C8h, 088h, 088h, 088h, 000h, 020h, 000h, 060h, 020h, 020h, 020h, 070h, 000h
DB 010h, 000h, 030h, 010h, 010h, 010h, 090h, 060h, 080h, 080h, 088h, 090h, 0A0h, 0D0h, 088h, 000h
DB 0C0h, 040h, 040h, 040h, 040h, 040h, 0E0h, 000h, 000h, 000h, 0ECh, 092h, 092h, 092h, 092h, 000h
DB 000h, 000h, 0B0h, 0C8h, 088h, 088h, 088h, 000h, 000h, 000h, 070h, 088h, 088h, 088h, 070h, 000h
DB 000h, 000h, 0B0h, 0C8h, 0C8h, 0B0h, 080h, 080h, 000h, 000h, 068h, 098h, 098h, 068h, 008h, 008h
DB 000h, 000h, 0B0h, 0C8h, 080h, 080h, 080h, 000h, 000h, 000h, 078h, 080h, 070h, 008h, 0F0h, 000h
DB 040h, 040h, 0E0h, 040h, 040h, 050h, 020h, 000h, 000h, 000h, 088h, 088h, 088h, 098h, 068h, 000h
DB 000h, 000h, 088h, 088h, 088h, 050h, 020h, 000h, 000h, 000h, 082h, 082h, 092h, 092h, 06Ch, 000h
DB 000h, 000h, 088h, 050h, 020h, 050h, 088h, 000h, 000h, 000h, 088h, 088h, 098h, 068h, 008h, 070h
DB 000h, 000h, 0F8h, 010h, 020h, 040h, 0F8h, 000h, 010h, 020h, 020h, 040h, 020h, 020h, 010h, 000h
DB 040h, 040h, 040h, 000h, 040h, 040h, 040h, 000h, 040h, 020h, 020h, 010h, 020h, 020h, 040h, 000h
DB 076h, 0DCh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 010h, 038h, 06Ch, 0C6h, 0C6h, 0FEh, 000h
DB 03Eh, 060h, 0C0h, 060h, 03Eh, 008h, 004h, 018h, 000h, 048h, 000h, 0CCh, 0CCh, 0CCh, 0CCh, 076h
DB 018h, 020h, 000h, 078h, 0CCh, 0FCh, 0C0h, 078h, 010h, 028h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h
DB 000h, 048h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 030h, 008h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h
DB 048h, 030h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 078h, 0CCh, 0C0h, 0CCh, 078h, 010h, 008h, 030h
DB 030h, 048h, 084h, 078h, 0CCh, 0FCh, 0C0h, 078h, 000h, 048h, 000h, 078h, 0CCh, 0FCh, 0C0h, 078h
DB 030h, 008h, 000h, 078h, 0CCh, 0FCh, 0C0h, 078h, 000h, 048h, 000h, 030h, 030h, 030h, 030h, 030h
DB 030h, 048h, 000h, 030h, 030h, 030h, 030h, 030h, 060h, 010h, 000h, 030h, 030h, 030h, 030h, 030h
DB 048h, 000h, 030h, 078h, 0CCh, 0CCh, 0FCh, 0CCh, 030h, 048h, 030h, 048h, 084h, 0FCh, 084h, 084h
DB 018h, 020h, 000h, 0F8h, 080h, 0F0h, 080h, 0F8h, 000h, 000h, 000h, 066h, 019h, 077h, 088h, 077h
DB 000h, 000h, 000h, 00Fh, 014h, 03Eh, 044h, 087h, 030h, 048h, 084h, 078h, 0CCh, 0CCh, 0CCh, 078h
DB 000h, 048h, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h, 060h, 010h, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h
DB 030h, 048h, 084h, 000h, 0CCh, 0CCh, 0CCh, 076h, 060h, 010h, 000h, 0CCh, 0CCh, 0CCh, 0CCh, 076h
DB 048h, 000h, 0CCh, 0CCh, 0CCh, 07Ch, 00Ch, 0F8h, 044h, 000h, 038h, 06Ch, 0C6h, 0C6h, 06Ch, 038h
DB 024h, 000h, 066h, 066h, 066h, 066h, 066h, 03Ch, 000h, 008h, 01Ch, 028h, 028h, 01Ch, 008h, 000h
DB 01Ch, 022h, 020h, 070h, 020h, 022h, 05Ch, 000h, 044h, 028h, 010h, 010h, 038h, 010h, 038h, 010h
DB 0F0h, 088h, 08Ah, 0F7h, 082h, 082h, 083h, 000h, 006h, 008h, 008h, 03Ch, 010h, 010h, 060h, 000h
DB 018h, 020h, 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 018h, 020h, 000h, 030h, 030h, 030h, 030h, 030h
DB 018h, 020h, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h, 018h, 020h, 000h, 0CCh, 0CCh, 0CCh, 0CCh, 076h
DB 080h, 078h, 004h, 0F8h, 0CCh, 0CCh, 0CCh, 0CCh, 080h, 07Eh, 001h, 0C6h, 0E6h, 0D6h, 0CEh, 0C6h
DB 000h, 078h, 00Ch, 07Ch, 0CCh, 076h, 000h, 0FEh, 000h, 078h, 0CCh, 0CCh, 0CCh, 078h, 000h, 0FCh
DB 000h, 000h, 018h, 018h, 030h, 060h, 066h, 03Ch, 0FFh, 080h, 080h, 080h, 000h, 000h, 000h, 000h
DB 0FFh, 001h, 001h, 001h, 000h, 000h, 000h, 000h, 040h, 0C4h, 048h, 050h, 026h, 049h, 082h, 007h
DB 040h, 0C4h, 048h, 050h, 026h, 04Ah, 09Fh, 002h, 000h, 030h, 000h, 030h, 030h, 030h, 030h, 030h
DB 000h, 012h, 024h, 048h, 090h, 048h, 024h, 012h, 000h, 048h, 024h, 012h, 009h, 012h, 024h, 048h
DB 049h, 000h, 092h, 000h, 049h, 000h, 092h, 000h, 06Dh, 000h, 0B6h, 000h, 06Dh, 000h, 0B6h, 000h
DB 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 0AAh, 055h, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 010h
DB 010h, 010h, 010h, 010h, 0F0h, 010h, 010h, 010h, 010h, 010h, 010h, 0F0h, 010h, 0F0h, 010h, 010h
DB 028h, 028h, 028h, 028h, 0E8h, 028h, 028h, 028h, 000h, 000h, 000h, 000h, 0F8h, 028h, 028h, 028h
DB 000h, 000h, 000h, 0F0h, 010h, 0F0h, 010h, 010h, 028h, 028h, 028h, 0E8h, 008h, 0E8h, 028h, 028h
DB 028h, 028h, 028h, 028h, 028h, 028h, 028h, 028h, 000h, 000h, 000h, 0F8h, 008h, 0E8h, 028h, 028h
DB 028h, 028h, 028h, 0E8h, 008h, 0F8h, 000h, 000h, 028h, 028h, 028h, 028h, 0F8h, 000h, 000h, 000h
DB 010h, 010h, 010h, 0F0h, 010h, 0F0h, 000h, 000h, 000h, 000h, 000h, 000h, 0F0h, 010h, 010h, 010h
DB 010h, 010h, 010h, 010h, 01Fh, 000h, 000h, 000h, 010h, 010h, 010h, 010h, 0FFh, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 0FFh, 010h, 010h, 010h, 010h, 010h, 010h, 010h, 01Fh, 010h, 010h, 010h
DB 000h, 000h, 000h, 000h, 0FFh, 000h, 000h, 000h, 010h, 010h, 010h, 010h, 0FFh, 010h, 010h, 010h
DB 010h, 010h, 010h, 01Fh, 010h, 01Fh, 010h, 010h, 028h, 028h, 028h, 028h, 03Fh, 028h, 028h, 028h
DB 028h, 028h, 028h, 02Fh, 020h, 03Fh, 000h, 000h, 000h, 000h, 000h, 03Fh, 020h, 02Fh, 028h, 028h
DB 028h, 028h, 028h, 0EFh, 000h, 0FFh, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0EFh, 028h, 028h
DB 028h, 028h, 028h, 02Fh, 020h, 02Fh, 028h, 028h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 000h, 000h
DB 028h, 028h, 028h, 0EFh, 000h, 0EFh, 028h, 028h, 010h, 010h, 010h, 0FFh, 000h, 0FFh, 000h, 000h
DB 028h, 028h, 028h, 028h, 0FFh, 000h, 000h, 000h, 000h, 000h, 000h, 0FFh, 000h, 0FFh, 010h, 010h
DB 000h, 000h, 000h, 000h, 0FFh, 028h, 028h, 028h, 028h, 028h, 028h, 028h, 03Fh, 000h, 000h, 000h
DB 010h, 010h, 010h, 01Fh, 010h, 01Fh, 000h, 000h, 000h, 000h, 000h, 01Fh, 010h, 01Fh, 010h, 010h
DB 000h, 000h, 000h, 000h, 03Fh, 028h, 028h, 028h, 028h, 028h, 028h, 028h, 0FFh, 028h, 028h, 028h
DB 010h, 010h, 010h, 0FFh, 010h, 0FFh, 010h, 010h, 010h, 010h, 010h, 010h, 0F0h, 000h, 000h, 000h
DB 000h, 000h, 000h, 000h, 01Fh, 010h, 010h, 010h, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh, 0FFh
DB 000h, 000h, 000h, 000h, 0FFh, 0FFh, 0FFh, 000h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h, 0E0h
DB 007h, 007h, 007h, 007h, 007h, 007h, 007h, 007h, 0FFh, 0FFh, 0FFh, 0FFh, 000h, 000h, 000h, 000h
DB 000h, 000h, 000h, 002h, 034h, 04Ch, 04Ch, 032h, 000h, 05Ch, 022h, 022h, 03Ch, 044h, 044h, 078h
DB 07Eh, 042h, 042h, 040h, 040h, 040h, 040h, 040h, 000h, 000h, 002h, 07Ch, 0A8h, 028h, 028h, 044h
DB 000h, 07Eh, 061h, 030h, 018h, 008h, 010h, 020h, 000h, 000h, 008h, 07Fh, 088h, 088h, 088h, 070h
DB 000h, 000h, 000h, 022h, 044h, 044h, 07Ah, 080h, 000h, 000h, 000h, 07Ch, 010h, 010h, 010h, 010h
DB 000h, 01Ch, 008h, 03Eh, 041h, 041h, 041h, 03Eh, 000h, 000h, 038h, 044h, 044h, 07Ch, 044h, 044h
DB 03Ch, 066h, 0C3h, 0C3h, 0C3h, 066h, 024h, 066h, 00Ch, 010h, 008h, 01Ch, 022h, 022h, 022h, 01Ch
DB 000h, 000h, 000h, 000h, 06Ch, 092h, 092h, 06Ch, 000h, 001h, 01Ah, 026h, 02Ah, 032h, 02Ch, 040h
DB 000h, 018h, 020h, 020h, 030h, 020h, 020h, 018h, 000h, 03Ch, 042h, 042h, 042h, 042h, 042h, 042h
DB 000h, 000h, 07Eh, 000h, 07Eh, 000h, 07Eh, 000h, 000h, 008h, 008h, 03Eh, 008h, 008h, 000h, 03Eh
DB 000h, 010h, 008h, 004h, 008h, 010h, 000h, 03Eh, 000h, 004h, 008h, 010h, 008h, 004h, 000h, 03Eh
DB 000h, 006h, 009h, 009h, 008h, 008h, 008h, 000h, 000h, 000h, 008h, 008h, 008h, 048h, 048h, 030h
DB 000h, 000h, 008h, 000h, 03Eh, 000h, 008h, 000h, 000h, 060h, 092h, 00Ch, 060h, 092h, 00Ch, 000h
DB 060h, 090h, 060h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 030h, 078h, 030h, 000h, 000h
DB 000h, 000h, 000h, 000h, 020h, 000h, 000h, 000h, 000h, 003h, 004h, 004h, 0C8h, 028h, 010h, 000h
DB 000h, 000h, 000h, 07Ch, 042h, 042h, 042h, 000h, 018h, 024h, 008h, 010h, 03Ch, 000h, 000h, 000h
DB 000h, 000h, 000h, 03Eh, 03Eh, 03Eh, 03Eh, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h

16
install/MAKEFILE

@ -0,0 +1,16 @@
lnk_boot = tlink /x
asm= tasm /t/m5/zi
lnk= tlink /x/t
all: setup.com
setup.com: setup.asm
$(asm) setup
$(lnk) setup
clean:
del *.obj
del *.exe
del *.com
del *.sys
del *.err

620
install/setup.asm

@ -1,456 +1,164 @@
.model tiny
.486
smart
.code
org 0100h
ent equ 32h
start:
jmp CopyCOS
DiskSectorsPerTrack dw 18
DiskTracksPerHead dw 80
DiskHeads dw 2
Message db 0Dh,0Ah,'COS 2000b installation program (Celyn Operating System) !!',0Dh,0Ah,'Written By Nico',0Ah,0Dh,'Site online HTTP://WWW.MULTIMANIA.COM/COS2000',0Dh,0AH,'Copyright 2000',0Dh,0AH,'Please insert a floppy disk and press a key...',0Dh,0AH,'Be careful! All the disk is going to be deleted',0Dh,0AH,'$'
Message2 db 0Dh,0AH,'Create boot sector$'
systfile db 0Dh,0AH,'Creating file allocation table 16 bits$'
systfile2 db 0Dh,0AH,'Creating file information table 32 bytes$'
systfile3 db 0Dh,0AH,'Creating operating system files',0Dh,0Ah,'$'
systfile4 db 0D,0Ah,'Creating system tools',0Dh,0Ah,'$'
Errormsg db 0Dh,0AH,0Dh,0AH,'Installing error, please contact me at COS2000@MULTIMANIA.COM !',0Dh,0AH,'$'
Ok db 0Dh,0AH,0Dh,0AH,'The boot sector and the system files had been succefully copied.',0Dh,0AH, 'To try COS reboot with this system disk',0Dh,0AH,'$'
files db '*.*',0
tools db '*.exe',0
allboot db 0dh,0ah
boot db 'boot.bin',0,' $'
retu db 0Dh,0AH,'$'
dat db 'data',0
dat2 db '..',0
dta db 43 dup (0)
copycos:
mov ah,4ah
mov bx,1000h
int 21h
jc error
mov ah,48h
mov bx,65536/16
int 21h
jc error
mov fs,ax
mov ah,3Bh
mov dx,offset dat
int 21h
mov ah,9
mov dx,offset message
int 21h
jc error
mov ax,0
int 16h
mov ah,9
mov dx,offset systfile
int 21h
jc error
mov cx,12
mov bx,offset fat
erase:
call writesector
jc error
dec cx
jnz erase
mov ah,9
mov dx,offset message2
int 21h
jc error
mov dx,Offset allboot
int 21h
jc error
mov dx,offset boot
call addfile
jc error
mov ax,0F0FFh
mov cx,14
mov di,offset fat
cld
rep stosw
mov bx,offset fat
mov cx,1
call writesector
jc error
mov ah,9
mov dx,offset systfile2
int 21h
jc error
mov eax,0
mov cx,512/4
mov di,offset fat
cld
rep stosd
mov bx,offset fat
mov cx,13
call writesector
jc error
mov ah,1Ah
mov dx,offset dta
int 21h
jc error
mov ah,4eh
xor cx,cx
mov dx,offset files
int 21h
mov ah,9
mov dx,offset systfile3
int 21h
jc error
allfile:
mov di,offset dta+43
mov byte ptr [di],'$'
mov ah,9
mov si,offset dta+30
mov cl,13
call uppercasemem
mov dx,si
cmp dword ptr [si],'toob'
clc
je allfilesend
int 21h
jc error
call addfile
jc error
call makefit
jc error
mov ah,9
mov dx,offset retu
int 21h
jc error
mov di,offset dta+30
mov al,0
mov cl,13
cld
rep stosb
allfilesend:
mov ah,4fh
int 21h
jnc allfile
mov ah,9
mov dx,Offset ok
int 21h
mov ah,3Bh
mov dx,offset dat2
int 21h
ret
error:
mov ah,3Bh
mov dx,offset dat2
int 21h
mov ah,9
mov dx,offset errormsg
int 21h
ret
addfile:
push ax bx dx si di bp ds es
mov cx,1
mov bx,offset fat
call readsector
jc error2
mov ax,3D00h
int 21h
jc error2
mov cs:temp,ax
mov bx,ax
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
jc error2
cmp dx,0
jne error2
cmp ax,0
je error2
sub ax,1
shr ax,9
inc ax
mov bp,ax
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
jc error2
push fs
pop ds
push fs
pop es
mov ah,3fh
mov cx,0FFFFh
xor dx,dx
int 21h
push cs
pop ds
jc error2
mov si,-2
mov di,0
xor bx,bx
fats:
add si,2
cmp si,512
jz error2
cmp WORD PTR [si+offset fat],0h
jne fats
mov ax,si
shr ax,1
cmp di,0
jne nonew
mov entrie,ax
jmp new
nonew:
mov [offset fat+di],ax
new:
mov di,si
mov cx,ax
call writesector
jc error2
add bx,512
dec bp
jnz fats
mov word ptr [offset fat+di],0FFFFh
mov bx,offset fat
mov cx,1
push cs
pop es
call writesector
mov cx,entrie
end1:
mov ah,3eh
mov bx,cs:temp
int 21h
errorend:
pop es ds bp di si dx bx ax
ret
entrie dw 0
error2:
mov ah,3eh
mov bx,cs:temp
int 21h
stc
jmp errorend
temp dw 0
makefit:
push bx cx si di bp
mov ax,cx
mov bx,offset fat
mov cx,13
retry:
call readsector
jc error3
xor si,si
findfit:
cmp byte ptr [si+bx],0
je finishfit
add si,32
cmp si,512
jb findfit
inc cx
jmp retry
finishfit:
mov di,si
add di,bx
mov si,dx
call asciiztofit
jc error3
mov [di+26],ax
call writesector
jc error3
end3:
pop bp di si cx bx
ret
error3:
stc
jmp end3
WriteSector:
push cx dx si
mov AX, CX
xor DX, DX
div DiskSectorsPerTrack
mov CL, DL ;{ Set the sector }
and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder }
xor DX, DX
div 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 DiskHeads
mov DH, DL ;{ Set the head }
inc CL
mov SI, 4
TryAgain:
mov AL, 1
mov DL, 0
mov AH, 3
int 13h
jnc Done
dec SI
jnz TryAgain
Done:
jc enddd
mov cl, AH
mov ah,9
mov dx,offset sign
int 21h
cmp cl,0
enddd:
pop si dx cx
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
TryAgain2:
mov AL, 1
mov DL, 0
mov AH, 2
int 13h
jnc Done2
dec SI
jnz TryAgain2
Done2:
pop si dx cx ax
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
namesize equ 12
extsize equ 5
sign db '.$'
fat DB 512 dup (0)
buffer db 0
end start
.model tiny
.486
smart
.code
org 0100h
ent equ 32h
start:
jmp CopyCOS
Message db 0Dh,0Ah,'COS 2000 V3.02Fr programme d''installation',0Dh,0AH,'Inserez une disquette formatee et appuyez sur entre...',0Dh,0AH,'Attention le contenu de celle ci peut etre altere !!!',0Dh,0AH,'$'
Message2 db 0Dh,0AH,'Creation du secteur de demarrage...',0Dh,0Ah,'$'
Message3 db 0Dh,0AH,'Copie des fichiers systeme...',0Dh,0Ah,'$'
Errormsg db 0Dh,0AH,'Erreur d''installation, contactez moi a COS2000@MULTIMANIA.COM !',0Dh,0AH,'$'
Ok db 0Dh,0AH,'COS2000 a été correctement installé, veuillez redemarrer votre PC',0Dh,0AH,'$'
files db '*.*',0
boot db 'boot.bin',0
dat db 'data',0
retu db 0Dh,0AH,'$'
dta db 43 dup (0)
copycos:
mov ah,9
mov dx,offset message
int 21h
xor ax,ax
int 16h
mov ah,4ah
mov bx,1000h
int 21h
jc error
mov ah,48h
mov bx,65536/16
int 21h
jc error
mov fs,ax
mov ah,3Bh
mov dx,offset dat
int 21h
jc error
mov ah,1Ah
mov dx,offset dta
int 21h
jc error
mov ah,4eh
xor cx,cx
mov dx,offset files
int 21h
jc error
mov ah,09
mov dx,offset message3
int 21h
allfile:
mov byte ptr [offset dta+43],'$'
mov ah,9
mov dx,offset dta+30
int 21h
push dx
mov ah,09
mov dx,offset retu
int 21h
pop dx
mov ax,3D00h
int 21h
jc error
mov bx,ax
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
jc error
cmp dx,0
jne error
cmp ax,0
je error
mov bp,ax
mov ax,4200h
xor cx,cx
xor dx,dx
int 21h
jc error
push fs
pop ds
mov ah,3fh
mov cx,0FFFFh
xor dx,dx
int 21h
push cs
pop ds
jc error
mov ah,3eh
int 21h
jc error
mov ah,3ch
push cs
pop es
mov di,offset dta+30-3
mov word ptr [di],":a"
mov byte ptr [di+2],"\"
xor cx,cx
mov dx,di
int 21h
jc error
mov bx,ax
push fs
pop ds
xor dx,dx
mov ah,40h
mov cx,bp
int 21h
push cs
pop ds
jc error
mov ah,3eh
int 21h
jc error
mov ah,4fh
int 21h
jnc allfile
mov ah,09
mov dx,offset message2
int 21h
mov ax,3D00h
mov dx,offset boot
int 21h
jc error
push fs
pop ds
mov ah,3fh
mov cx,000FFh
xor dx,dx
int 21h
push cs
pop ds
jc error
mov ah,3eh
int 21h
jc error
push fs
pop es
mov ax,0301h
mov dx,0
mov cx,0001h
xor bx,bx
int 13h
mov ah,09
mov dx,offset Ok
int 21h
xor ax,ax
int 16h
ret
error:
mov ah,09
mov dx,offset errormsg
int 21h
xor ax,ax
int 16h
ret
end start

266
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

482
noyau/pic8259a.asm → noyau/8259a.asm

@ -1,241 +1,241 @@
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
db 'PIC8259A'
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 enableirq
dw disableirq
dw readmaskirq
dw readirr
dw readisr
dw installhandler
dw replacehandler
dw getint
dw setint
dw seteoi
;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 : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC
EnableIRQ:
push ax cx dx
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
pop dx cx ax
ret
;Desactive une interruption ‚lectronique
;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC
DisableIRQ:
push ax cx dx
mov dx,MASTERPIC+IRQMASK
cmp al,7
jbe master2
mov dx,SLAVEPIC+IRQMASK
master2:
mov cl,al
and cl,7
mov al,1
shl al,cl
mov ah,al
in al,dx
or al,ah
out dx,al
pop dx cx ax
ret
;Signale "End Of Interrupt" de l'interruption al
SetEOI:
push ax dx
cmp al,7
jbe master3
mov al,EOI
out SLAVEPIC,al
master3:
mov al,EOI
out MASTERPIC,al
pop dx ax
ret
;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
ReadmaskIrq:
push dx
mov dx,MASTERPIC+ IRQMASK
cmp bh,0
jne Master5
mov dx,SLAVEPIC+ IRQMASK
master5:
in al,dx
pop dx
ret
;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
ReadISR:
push dx
mov dx,MASTERPIC
cmp bh,0
jne Master6
mov dx,SLAVEPIC
master6:
mov al,isr
out dx,al
in al,dx
pop dx
ret
;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
ReadIRR:
push dx
mov dx,MASTERPIC
cmp bh,0
jne Master7
mov dx,SLAVEPIC
master7:
mov al,irr
out dx,al
in al,dx
pop dx
ret
;remplace le handler pointer par ds:si en bx:100h interruption ax
replacehandler:
push ax bx cx si di ds es
mov es,bx
mov di,0100h
mov ah,4
int 48h
jc reph
mov bx,ax
call getint
mov es:[102h],si
mov es:[104h],ds
call setint
reph:
pop es ds di si cx bx ax
ret
;install le handler pointer par ds:si en bx:100h interruption ax
installhandler:
push bx cx di es
mov es,bx
mov di,100h
mov ah,4
int 48h
jc inh
mov bx,ax
call setint
inh:
pop es di cx bx
ret
;met es:di le handle de l'int al
setint:
push ax bx ds
call disableirq
cli
xor ah,ah
mov bx,ax
shl bx,2
xor ax,ax
mov ds,ax
mov ds:[bx],di
mov ds:[bx+2],es
pop ds bx ax
sti
call enableirq
ret
;met ds:si le handle de l'int al
getint:
push ax bx es
xor ah,ah
mov bx,ax
shl bx,2
xor ax,ax
mov es,ax
mov si,es:[bx]
mov ds,es:[bx+2]
pop es bx ax
ret
end start
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
db 'PIC8259A'
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 enableirq
dw disableirq
dw readmaskirq
dw readirr
dw readisr
dw installhandler
dw replacehandler
dw getint
dw setint
dw seteoi
;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 : AL - Num‚ro de l'interruption (0-15) … autoriser 0-7 = MASTERPIC , 8-15 = SLAVEPIC
EnableIRQ:
push ax cx dx
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
pop dx cx ax
ret
;Desactive une interruption ‚lectronique
;Entr‚e : AL - Num‚ro de l'interruption (0-15) … desactiver 0-7 = MASTERPIC , 8-15 = SLAVEPIC
DisableIRQ:
push ax cx dx
mov dx,MASTERPIC+IRQMASK
cmp al,7
jbe master2
mov dx,SLAVEPIC+IRQMASK
master2:
mov cl,al
and cl,7
mov al,1
shl al,cl
mov ah,al
in al,dx
or al,ah
out dx,al
pop dx cx ax
ret
;Signale "End Of Interrupt" de l'interruption al
SetEOI:
push ax dx
cmp al,7
jbe master3
mov al,EOI
out SLAVEPIC,al
master3:
mov al,EOI
out MASTERPIC,al
pop dx ax
ret
;Lit les masques d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
ReadmaskIrq:
push dx
mov dx,MASTERPIC+ IRQMASK
cmp bh,0
jne Master5
mov dx,SLAVEPIC+ IRQMASK
master5:
in al,dx
pop dx
ret
;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
ReadISR:
push dx
mov dx,MASTERPIC
cmp bh,0
jne Master6
mov dx,SLAVEPIC
master6:
mov al,isr
out dx,al
in al,dx
pop dx
ret
;Lit le registre d'‚tat d'un contr“leur IRQ dans al, 0 master ou slave 1 ds bh
ReadIRR:
push dx
mov dx,MASTERPIC
cmp bh,0
jne Master7
mov dx,SLAVEPIC
master7:
mov al,irr
out dx,al
in al,dx
pop dx
ret
;remplace le handler pointer par ds:si en bx:100h interruption ax
replacehandler:
push ax bx cx si di ds es
mov es,bx
mov di,0100h
mov ah,4
int 48h
jc reph
mov bx,ax
call getint
mov es:[102h],si
mov es:[104h],ds
call setint
reph:
pop es ds di si cx bx ax
ret
;install le handler pointer par ds:si en bx:100h interruption ax
installhandler:
push bx cx di es
mov es,bx
mov di,100h
mov ah,4
int 48h
jc inh
mov bx,ax
call setint
inh:
pop es di cx bx
ret
;met es:di le handle de l'int al
setint:
push ax bx ds
call disableirq
cli
xor ah,ah
mov bx,ax
shl bx,2
xor ax,ax
mov ds,ax
mov ds:[bx],di
mov ds:[bx+2],es
pop ds bx ax
sti
call enableirq
ret
;met ds:si le handle de l'int al
getint:
push ax bx es
xor ah,ah
mov bx,ax
shl bx,2
xor ax,ax
mov es,ax
mov si,es:[bx]
mov ds,es:[bx+2]
pop es bx ax
ret
end start

67
noyau/MAKEFILE

@ -0,0 +1,67 @@
lnk_boot = tlink /x
asm= tasm /t/m5/zi
lnk= tlink /x/t
all: boot.bin clavier.sys 8259a.sys disque.sys heure.sys horloge.sys manette.sys port.sys souris.sys systeme.sys video.sys
boot.bin: boot.asm
$(asm) boot
$(lnk_boot) boot
exe2boot boot.exe boot.bin
clavier.sys: clavier.asm
$(asm) clavier
$(lnk) clavier
ren clavier.com clavier.sys
8259a.sys: 8259a.asm
$(asm) 8259a
$(lnk) 8259a
ren 8259a.com 8259a.sys
disque.sys: disque.asm
$(asm) disque
$(lnk) disque
ren disque.com disque.sys
heure.sys: heure.asm
$(asm) heure
$(lnk) heure
ren heure.com heure.sys
horloge.sys: horloge.asm
$(asm) horloge
$(lnk) horloge
ren horloge.com horloge.sys
manette.sys: manette.asm
$(asm) manette
$(lnk) manette
ren manette.com manette.sys
port.sys: port.asm
$(asm) port
$(lnk) port
ren port.com port.sys
souris.sys: souris.asm
$(asm) souris
$(lnk) souris
ren souris.com souris.sys
systeme.sys: systeme.asm
$(asm) systeme
$(lnk) systeme
ren systeme.com systeme.sys
video.sys: video.asm
$(asm) video
$(lnk) video
ren video.com video.sys
clean:
del *.obj
del *.exe
del *.com
del *.sys
del *.err

55
noyau/asm.bat

@ -1,55 +0,0 @@
@echo off
echo Assembling file %1...
..\util\tasm %1.asm /m5/x/t
if errorlevel 1 goto end
if "%1"=="boot" goto boot
echo Linking file %1...
..\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"=="mouse" goto system
if "%1"=="pic8259a" goto system
if "%1"=="timer" goto system
if "%1"=="drive" goto system
if "%1"=="joystick" goto system
if "%1"=="system" goto system
if "%1"=="setup" goto setup
if "%1"=="hours" goto system
copy %1.com ..\data\%1.exe>nul
goto end
:boot
echo Linking file %1...
..\util\tlink %1.obj /x
if errorlevel 1 goto end
echo Copying file %1...
..\util\exe2boot %1.exe
copy %1.bin ..\data\%1.bin>nul
goto end
:video
type thin8x8.fnt>>%1.com
:system
copy %1.com ..\data\%1.sys>nul
goto end
:setup
copy %1.com ..\%1.com>nul
goto end
:end
if not exist *.bin goto exes
del *.bin
:exes
if not exist *.exe goto coms
del *.exe
:coms
if not exist *.com goto objs
del *.com
:objs
if not exist *.obj goto nobjs
del *.obj
:nobjs

11
noyau/asmsys.bat

@ -1,11 +0,0 @@
@echo off
call asm video
call asm system
call asm lpt
call asm keyboard
call asm pic8259a
call asm timer
call asm drive
call asm mouse
call asm joystick
call asm boot

440
noyau/boot.asm

@ -1,219 +1,221 @@
boots segment
.386
org 7C00h
;org 100h
assume cs:boots,ds:boots
start:
jmp boot
bootdb db 'COS2000A' ;Fabricant + n°série Formatage
sizec dw 512 ;octet/secteur
db 1 ;secteur/cluster
reserv dw 1 ;secteur reserv‚
nbfat db 1 ;nb de copie de la FAT
nbfit dw 25 ;taille rep racine
allclu dw 2880 ;nb secteur du volume si < 32 még
db 0F0h ;Descripteur de média
fatsize dw 12 ;secteur/FAT
nbtrack dw 18 ;secteur/piste
head dw 2 ;nb de tˆteb de lecture/écriture
hidden dd 0 ;nombre de secteur cach‚s
dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors
bootdrv db 0 ;Lecteur de d‚marrage
db 0 ;NA
bootsig db 29h ;boot signature 29h
dd 01020304h ;no de serie
pope db 'COS2000 ' ;nom de volume
db 'FAT16 ' ;FAT
specialboot:
errorloading db 'It''s not a COS disk!',0dh,0ah,0
okloading db 'COS search system',0Dh,0ah,0
syst db 'Ok',0dh,0ah,0
dot db '.',0
carry db 0dh,0ah,0
Sys db 'system',0,0,0,0,0,0
sys2 db 'sys',0
errorboot:
mov si,offset errorloading
call showstr
mov ah,0
int 16h
int 19h
boot:
mov Bootdrv,dl
cli
mov ax,09000h
mov ss,ax
mov sp,0FFFFh
sti
p:
push cs
pop ds
xor ax,ax
int 13h
jc errorboot
mov si,offset okloading
call showstr
mov cx,nbtrack
les si,ds:[1Eh*4]
mov byte ptr es:[si+4], cl
mov byte ptr es:[si+9], 0Fh
xor ax,ax
mov al,NbFat
mov bx,FatSize
mul bx
mov cx,ax
add cx,word ptr [offset Hidden]
adc cx,word ptr [offset Hidden+2]
add cx,Reserv
mov word ptr [offset BootSig],cx
xor dx,dx
mov ax,allclu
div nbtrack
xor dx,dx
div head
mov word ptr [offset pope],ax
push cs
pop es
mov bx,offset buffer
mov si,bx
xor dx,dx
CheckRoot:
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
call showstr
mov ax,si
mov si,offset dot
call showstr
mov si,ax
add si,12
call showstr
mov si,offset carry
call showstr
mov si,ax
mov di,offset sys
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 Checkroot
oksystem:
mov si,offset syst
call showstr
mov cx,[di+BX+26]
mov bx,200h
mov es,bx
push bx
mov bx,0100h
push bx
mov si,offset dot
fatagain:
cmp cx,0FFF0h
jae finishload
call readsector
jc errorboot
call showstr
add bx,sizec
call getfat
jnc fatagain
finishload:
push es
push es
push es
pop ds
pop fs
pop gs
push 7202h
popf
db 0CBh
;<-cx nøsecteur ->cx code FAT
getfat:
push es bx
mov ax,cx
xor dx,dx
div sizec
mov cx,ax
add cx,reserv
mov bx,offset buffer
push cs
pop es
call readsector
jc errorgetfat
shl dx,1
add bx,dx
mov cx,[bx]
errorgetfat:
pop bx es
ret
ReadSector:
push ax cx dx si
mov AX, CX
xor DX, DX
div nbtrack
mov CL, DL ;{ Set the sector }
and CL, 63 ;{ Top two bits are bits 8&9 of the cylinder }
xor DX, DX
div word ptr pope
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 head
mov DH, DL ;{ Set the head }
inc CL
mov SI, 4
TryAgain:
mov AX,0201h
mov DL, bootdrv
int 13h
jnc Done
dec SI
jnz TryAgain
Done:
pop si dx cx 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
Buffer equ $
boots ends
end start
boots segment
.386
org 7C00h
;org 100h
assume cs:boots,ds:boots
start:
jmp boot
bootdb db 'COS2000A' ;Fabricant + n°série Formatage
sizec dw 512 ;octet/secteur
db 1 ;secteur/cluster
reserv dw 1 ;secteur reserv‚
nbfat db 2 ;nb de copie de la FAT
nbfit dw 224 ;taille rep racine
allclu dw 2880 ;nb secteur du volume si < 32 még
db 0F0h ;Descripteur de média
fatsize dw 9 ;secteur/FAT
nbtrack dw 18 ;secteur/piste
head dw 2 ;nb de tˆteb de lecture/écriture
hidden dd 0 ;nombre de secteur cach‚s
dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors
bootdrv db 0 ;Lecteur de d‚marrage
bootsig db 0 ;NA
db 29h ;boot signature 29h
bootsig2 dd 01020304h ;no de serie
pope db 'COS2000 ' ;nom de volume
db 'FAT12 ' ;FAT
specialboot:
errorloading db ' Erreur !!',0dh,0ah,0
okloading db 'Recherche noyau',0Dh,0ah,' - system.sys',0
syst db ' Ok',0dh,0ah,'Chargement',0
dot db '.',0
Sys db 'SYSTEME SYS'
errorboot:
mov si,offset errorloading
call showstr
mov ah,0
int 16h
int 19h
boot:
mov Bootdrv,dl
cli
mov ax,09000h
mov ss,ax
mov sp,0FFFFh
sti
boot2:
push cs
push cs
pop es
pop ds
xor ax,ax
int 13h
jc errorboot
mov si,offset okloading
call showstr
mov cx,Reserv
add cx,word ptr [offset Hidden]
adc cx,word ptr [offset Hidden+2]
push cx
mov bx,fatsize
mov di,offset bufferfat
readfat:
call readsector
inc cx
add di,sizec
dec bx
jnz readfat
pop cx
xor ax,ax
mov al,NbFat
mov bx,FatSize
mul bx
add cx,ax
mov ax,32
mul nbfit
div sizec
add ax,cx
sub ax,2
mov word ptr [offset bootsig],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,nbfit
ja errorboot
cmp bx,sizec
jb findnext
inc cx
jmp Checkroot
oksystem:
mov si,offset syst
call showstr
mov cx,[di+26]
mov ax,0900h
mov es,ax
push es
mov di,100h
push di
mov si,offset dot
xor ax,ax
fatagain:
cmp cx,0FF0h
jae finishload
push cx
add cx,word ptr [offset bootsig]
call readsector
pop cx
jc errorboot
inc ax
call showstr
add di,sizec
call getfat
jnc fatagain
finishload:
db 0CBh
;=============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 nbtrack
inc dl
mov bl,dl
xor dx,dx
div head
mov dh, 0
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
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
Buffer equ $
BufferFat equ $+2048
boots ends
end start

426
noyau/keyboard.asm → noyau/clavier.asm

@ -1,208 +1,218 @@
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
offsets dd 0
db 'KEYBOARD'
tsr:
pushf
db 2eh,0ffh,1eh
dw offsets
cli
mov cs:feax,eax
in al,60h
cmp cs:isstate,1
jne nostate
cmp al,57
jne endof
mov cs:isstate,0
jmp endof
nostate:
cmp al,87
je F11
cmp al,88
je F12
endof:
mov eax,cs:feax
sti
iret
isstate db 0
infos db 40 dup (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:
mov cs:isstate,1
pop word ptr cs:fip
pop word ptr cs:fcs
pop dword ptr cs:ffl
mov cs:fesp,esp
push ds es
pusha
push word ptr cs:fip
push gs
push fs
push ss
push es
push ds
push word ptr cs:fcs
push dword ptr cs:fesp
push ebp
push edi
push esi
push edx
push ecx
push ebx
push eax
push dword ptr cs:ffl
push cs
push cs
pop es
pop ds
mov ah,26
int 47h
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+7
mov ah,21
mov cl,6
int 47h
showallREG:
mov ah,6
int 47h
cmp bx,8
jb nodr
pop edx
mov cx,32
jmp popo
nodr:
mov ah,21
mov cl,1
int 47h
xor edx,edx
pop dx
mov cx,16
popo:
mov ah,13
int 47h
mov ah,10
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
sti
waitt:
cmp cs:isstate,0
jne waitt
mov ah,27
int 47h
popa
pop es ds
push dword ptr cs:ffl
push word ptr cs:fcs
push word ptr cs:fip
jmp endof
reg db ' State of registers',0
fla db 'Eflags:',0
regs db 'EAX:',0
db 'EBX:',0
db 'ECX:',0
db 'EDX:',0
db 'ESI:',0
db 'EDI:',0
db 'EBP:',0
db 'ESP:',0
db ' CS:',0
db ' DS:',0
db ' ES:',0
db ' FS:',0
db ' GS:',0
db ' SS:',0
db ' IP:',0
gr db '(',0
dr db ')',0
app db 'Press space to quit...',0
ffl dd 0
fcs dw 0
fip dw 0
fesp dd 0
feax dd 0
end start
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
offsets dd 0
db 'KEYBOARD'
tsr:
pushf
db 2eh,0ffh,1eh
dw offsets
cli
mov cs:feax,eax
in al,60h
cmp cs:isstate,1
jne nostate
cmp al,57
jne endof
mov cs:isstate,0
jmp endof
nostate:
cmp al,68
je F10
cmp al,87
je F11
cmp al,88
je F12
endof:
mov eax,cs:feax
sti
iret
isstate db 0
infos db 40 dup (0)
F10:
mov ax,6000h
push ax
mov di,0100h
push di
sti
db 0CBh
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:
mov cs:isstate,1
pop word ptr cs:fip
pop word ptr cs:fcs
pop dword ptr cs:ffl
mov cs:fesp,esp
push ds es
pusha
push word ptr cs:fip
push gs
push fs
push ss
push es
push ds
push word ptr cs:fcs
push dword ptr cs:fesp
push ebp
push edi
push esi
push edx
push ecx
push ebx
push eax
push dword ptr cs:ffl
push cs
push cs
pop es
pop ds
mov ah,26
int 47h
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+7
mov ah,21
mov cl,6
int 47h
showallREG:
mov ah,6
int 47h
cmp bx,8
jb nodr
pop edx
mov cx,32
jmp popo
nodr:
mov ah,21
mov cl,1
int 47h
xor edx,edx
pop dx
mov cx,16
popo:
mov ah,13
int 47h
mov ah,10
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
sti
waitt:
cmp cs:isstate,0
jne waitt
mov ah,27
int 47h
popa
pop es ds
push dword ptr cs:ffl
push word ptr cs:fcs
push word ptr cs:fip
jmp endof
reg db ' Etats des registres',0
fla db 'Eflags:',0
regs db 'EAX:',0
db 'EBX:',0
db 'ECX:',0
db 'EDX:',0
db 'ESI:',0
db 'EDI:',0
db 'EBP:',0
db 'ESP:',0
db ' CS:',0
db ' DS:',0
db ' ES:',0
db ' FS:',0
db ' GS:',0
db ' SS:',0
db ' IP:',0
gr db '(',0
dr db ')',0
app db 'Appuyez sur espace pour quitter...',0
ffl dd 0
fcs dw 0
fip dw 0
fesp dd 0
feax dd 0
end start

3
noyau/clean.bat

@ -1,3 +0,0 @@
@echo off
echo nettoyage en cours...
del ..\data\*.* >nul

2
noyau/debog.bat

@ -1,2 +0,0 @@
@echo off
..\util\td %1

964
noyau/disque.asm

@ -0,0 +1,964 @@
.model tiny
.486
smart
.code
org 0100h
include ..\include\fat.h
start:
jmp tsr ;Saute à la routine résidente
names db 'DRIVE' ;Nom drivers
id dw 1234h ;Identifiant drivers
Tsr:
cli ;Désactive interruptions logiciellement
cmp ax,cs:ID ;Compare si test de chargement
jne nomore ;Si pas test alors on continu
rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé
jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO
nomore:
cmp ah,maxfunc
jbe noerrorint
stc
jmp itsok
noerrorint:
clc
push bx
mov bl,ah ;On calcule d'aprés le n° de fonction
xor bh,bh ;quel sera l'entrée dans la table indexée
shl bx,1 ;des adresses fonctions.
mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table
mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine
pop bx
clc
call cs:current ;Puis on execute la fonction
itsok:
push bp
mov bp,sp ;On prend sp dans bp pour adresser la pile
jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ?
or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET
;xor eax,eax
;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique
;shl eax,4 ;de l'erreur.
;add ax,cs:current
jmp endofint ;on termine l'int
noerror:
and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET
endofint:
pop bp
sti ;On réactive les interruptions logiciellement
iret ;Puis on retourne au programme appelant.
current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée
tables dw readsector
dw writesector
dw verifysector2
dw initdrive
dw loadfile
dw compressrle
dw decompressrle
dw FindFirstfile
dw Findnextfile
dw GetFreeSpace
dw Searchfile
dw Getname
dw Getserial
dw changedir
dw readcluster
dw writecluster
dw getdir
maxfunc equ 24
;DPT disquette
mydpt DPT ?
;Secteur de boot
myboot bootSector ?
;Données Calculée
clustersize dw 0
TracksPerHead dw 0
DriveSize dd 0
AdressBoot dw 0
AdressFat dw 0
AdressParent dw 0
AdressData dw 0
AddingValue dw 0
CurrentDir dw 0 ;En cluster
CurrentDirStr db 128 dup (0)
;Pour recherches
EntryPlace dw 0 ;En octet
AdressDirectory dw 0 ;En cluster
firstsearch dw 1 ;Premiere requete ?
getfat:
push ax bx dx si
mov ax,cx
mov bx,ax
and bx,0000000000000001b
shr ax,1
mov cx,3
mul cx
mov si,offset bufferfat
add si,ax
cmp bx,0h
jnz evenfat
oddfat:
mov dx,cs:[si]
and dx,0FFFh
mov cx,dx
jmp endfat
evenfat:
mov dx,cs:[si+1]
and dx,0FFF0h
shr dx,4
mov cx,dx
endfat:
cmp dx,0FF0h
jbe nocarry
stc
pop si dx bx ax
ret
nocarry:
clc
pop si dx bx ax
ret
;============loadfile (Fonction 4)===============
;Charge le fichier ds:si en es:di ->ecx taille
;-> AH=4
;<- Flag Carry si erreur
;=====================================================
loadfile:
push eax bx di
push es di
push cs
pop es
mov di,offset tempfit
call searchfile
pop di es
jne errorload
jc errorload
mov cx,cs:tempfit.FileGroup
mov eax,cs:tempfit.FileSize
call loadway
jc errorload
clc
mov ecx,eax
pop di bx eax
ret
errorload:
stc
mov ecx,0
pop di bx eax
ret
tempfit db 32 dup (0)
;=============SearchFile (Fonction 10)===============
;Renvois dans ES:DI la fit du fichier DS:SI et non equal si pas existant
;-> AH=10
;<- Flag Carry si erreur
;=====================================================
SearchFile:
push ax cx ds si di es
call uppercase
push ds si
call findfirstfilez
push ds
pop es
mov di,si
pop si ds
jc errorsearch
jmp founded
nextsearch:
push ds si
call findnextfilez
push ds
pop es
mov di,si
pop si ds
founded:
cmp byte ptr cs:[di],0
je notgood
cmp byte ptr cs:[di+FileAttr],0Fh
je nextsearch
call cmpnames
jc nextsearch
okfound:
push cs
pop ds
mov si,di
pop es di
push di es
mov cx,32
rep movsb
clc
pop es di si ds cx ax
ret
notgood:
cmp si,0FF5h
pop es di si ds cx ax
ret
errorsearch:
stc
pop es di si ds cx ax
ret
;Transforme la chaine ds:si en maj
uppercase:
push si ax
mov di,si
uppercaser:
mov al,ds:[si]
cmp al,0
je enduppercase
cmp al,'a'
jb nonmaj
cmp al,'z'
ja nonmaj
sub al,'a'-'A'
mov ds:[si],al
nonmaj:
inc si
jmp uppercaser
enduppercase:
clc
pop ax si
ret
;Compare le nom ds:si '.' avec es:di
CmpNames:
push ax cx si di
mov cx,8
repe cmpsb
jne nequal
inc si
nequal:
cmp byte ptr [si-1],'.'
jne trynoext
mov al,' '
rep scasb
mov cx,3
rep cmpsb
jne notequal
cmp byte ptr [si],0
jne notequal
cmp cx,0
jl notequal
itok:
pop di si cx ax
ret
trynoext:
cmp byte ptr [si-1],0
jne notequal
jmp itok
notequal:
stc
pop di si cx ax
ret
;charge le fichier de de groupe CX et de taille eax
LoadWay:
push eax bx dx si di ecx ds es
cmp eax,0
je Zeroload
rol eax,16
mov dx,ax
ror eax,16
div cs:clusterSize
mov bx,ax
cmp bx,1
jb adjustlast
Loadfat:
call readcluster
jc noway
add di,cs:clusterSize
call getfat
dec bx
jnz loadfat
AdjustLast:
push es di
push cs
pop es
mov di,offset bufferread
mov si,di
call Readcluster
pop di es
jc noway
mov cx,dx
push cs
pop ds
rep movsb
zeroload:
clc
pop es ds ecx di si dx bx eax
ret
noway:
stc
pop es ds ebp di si dx bx eax
ret
;=============INITDRIVE (Fonction 04H)===============
;Initialise le lecteur pour une utilisation ultérieure
;-> AH=4
;<- Flag Carry si erreur
;=====================================================
InitDrive:
push eax bx cx edx di ds es
push cs
pop ds
push cs
pop es
mov di,3
againtry:
xor ax,ax
mov dx,0000h
int 13h
mov bx,offset myboot
mov ax,0201h
mov cx,0001h
mov dx,0000h
int 13h
jnc oknoagaintry
dec di
jnz againtry
oknoagaintry:
mov cs:lastseg,0
mov cs:lastoff,0
mov cs:LastRead,0
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 EntryPlace,0
mov adressdirectory,0
mov firstsearch,1
mov currentdirstr,0
mov di,offset bufferfat
mov dx,myboot.SectorsPerFat
mov cx,AdressFat
SeeFat:
call readsector
jc ErrorInit
add di,myboot.SectorSize
inc cx
dec dx
jnz seefat
clc
pop es ds di edx cx bx eax
ret
ErrorInit:
stc
pop es ds di edx cx bx eax
ret
;=============FindFirstFile (Fonction 7)==============
;Renvois dans ES:DI un bloc d'info
;-> AH=7
;<- Flag Carry si erreur
;=====================================================
FindFirstFile:
push cx ds di si
call FindFirstFileZ
mov cx,32
rep movsb
pop si di ds cx
ret
FindFirstFileZ:
push cx
mov cx,cs:CurrentDir
mov cs:AdressDirectory,cx
xor cx,cx
mov cs:EntryPlace,cx
mov cs:firstsearch,1
call findnextfileZ
pop cx
ret
;=============FindnextFile (Fonction 8)==============
;Renvois dans ES:DI un bloc d'info
;-> AH=8
;<- Flag Carry si erreur
;=====================================================
;Renvois dans ES:DI un bloc d'info
FindnextFile:
push cx ds di si
call FindnextFileZ
mov cx,32
rep movsb
pop si di ds cx
ret
;fait pointer ds:si sur la prochaine entrée du repertoire courant
FindnextFileZ:
push ax bx cx es di
push cs
pop ds
mov cx,cs:AdressDirectory
mov bx,cs:Entryplace
FindnextFileagain:
cmp cs:firstsearch,1
je first
add bx,32
cmp bx,cs:clusterSize
jb nopop
first:
mov di,offset bufferentry
push cs
pop es
mov bx,0
cmp cs:currentdir,0
jne notrootdir
cmp cs:firstsearch,1
je noaddfirst1
inc cx
noaddfirst1:
add cx,cs:adressparent
mov al,myboot.sectorspercluster
readroot:
call readsector
jc notwell
add di,myboot.sectorsize
dec al
jnz readroot
sub cx,cs:adressparent
jmp nopop
notrootdir:
cmp cs:firstsearch,1
je noaddfirst2
call getfat
noaddfirst2:
jc notwell
call readcluster
jc notwell
nopop:
mov cs:firstsearch,0
mov si,offset bufferentry
add si,bx
cmp byte ptr cs:[si],0
je notwell
mov cs:entryplace,bx
mov cs:AdressDirectory,cx
cmp byte ptr cs:[si],0E5h
je findnextfileagain
cmp byte ptr cs:[si+fileattr],28h
je findnextfileagain
cmp byte ptr cs:[si+fileattr],0Fh
je findnextfileagain
clc
pop di es cx bx ax
ret
notwell:
stc
pop di es cx bx ax
ret
;=============GetFreeSpace (Fonction 09H)===============
;Renvoie en EDX l'espace disque libre du volume
;-> AH=9
;<- Flag Carry si erreur
;=====================================================
GetFreeSpace:
push eax
xor eax,eax
call getsector
mul cs:myboot.SectorSize
shl edx,16
add edx,eax
pop eax
ret
;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 (Fonction 14)===============
;Lit le secteur CX et le met en es:di
;-> AH=14
;<- Flag Carry si erreur
;=====================================================
readcluster:
push ax bx cx dx di
mov ax,cx
mov bl,cs:myboot.sectorspercluster
xor bh,bh
mul bx
mov cx,ax
add cx,cs:addingvalue
readsectors:
call readsector
jc errorreadincluster
add di,cs:myboot.sectorsize
inc cx
dec bl
jnz readsectors
clc
pop di dx cx bx ax
ret
errorreadincluster:
stc
pop di dx cx bx ax
ret
;=============WRITECLUSTER (Fonction 15)===============
;Ecrit le cluster CX et le met en es:di
;-> AH=14
;<- Flag Carry si erreur
;=====================================================
writecluster:
push ax bx cx dx si
mov ax,cx
mov bl,cs:myboot.sectorspercluster
xor bh,bh
mul cx
mov cx,ax
add cx,cs:addingvalue
writesectors:
call writesector
jc errorwriteincluster
add si,cs:myboot.sectorsize
inc cx
dec bx
jnz writesectors
clc
pop si dx cx bx ax
ret
errorwriteincluster:
stc
pop si dx cx bx ax
ret
;=============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
cmp cx,cs:lastread
jne gom
mov ax,es
cmp cs:lastseg,ax
jne gom
cmp di,cs:lastoff
jne gom
jmp done
gom:
mov cs:lastseg,ax
mov cs:lastoff,di
mov cs:LastRead,cx
mov ax,cx
xor dx,dx
div cs:myboot.SectorsPerTrack
inc dl
mov bl,dl
xor dx,dx
div cs:myboot.HeadsPerDrive
mov dh,cs:myboot.bootdrive
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
int 13h
jnc Done
dec SI
jnz TryAgain
Done:
pop si dx cx bx ax
ret
lastread dw 0
lastseg dw 0
lastoff dw 0
;=============WRITESECTOR (Fonction 02H)==============
;Ecrit le secteur CX pointé par ds:si
;-> AH=2
;<- Flag Carry si erreur
;=====================================================
WriteSector:
push ax bx cx dx si es
cmp cs:Lastread,cx
jne nodestruct
mov cs:Lastread,0ffffh
nodestruct:
push ds
pop es
mov ax,cx
xor dx,dx
div cs:myboot.SectorsPerTrack
inc dl
mov bl,dl
xor dx,dx
div cs:myboot.HeadsPerDrive
mov dh,cs:myboot.BootDrive
xchg dl,dh
mov cx,ax
xchg cl,ch
shl cl,6
or cl, bl
mov bx,si
mov SI, 4
mov AL,1
TryAgains:
mov AH, 3
int 13h
jnc Dones
dec SI
jnz TryAgains
Dones:
pop es si dx cx bx ax
ret
;=============Getname (Fonction 11)==============
;Renvoie le nom en ES:DI
;-> AH=11
;<- Flag Carry si erreur
;=====================================================
getname:
push ax cx dx si di ds es
push cs
pop ds
mov dx,di
mov si,offset myboot.DriveName
mov cx,11
rep movsb
mov al,' '
mov di,dx
mov cx,11
repne scasb
mov byte ptr es:[di],0
pop es ds di si dx cx ax
ret
;=============Getserial (Fonction 12)==============
;Renvoie le numéro de serie en EDX
;-> AH=12
;<- Flag Carry si erreur
;=====================================================
getserial:
mov edx,cs:myboot.serialnumber
ret
;=============VERIFYSECTOR (Fonction 03H)==============
;Vérifie le secteur CX
;-> AH=3
;<- Flag Carry si erreur, Flag Equal si secteurs égaux
;=====================================================
VerifySector:
push bx cx si di ds es
push cs
pop es
push cs
pop ds
mov bx,offset bufferread
call ReadSector
jc errorverify
call inverse
call WriteSector
jc errorverify
mov bx,offset bufferwrite
call ReadSector
call inverse
jc errorverify
mov bx,offset bufferread
call inverse
call WriteSector
jc errorverify
mov cx,cs:myboot.SectorSize
shr cx,2
mov si,offset bufferread
mov di,offset bufferwrite
cld
rep cmpsd
errorverify:
pop es ds di si cx bx
ret
Inverse:
mov si,cs:myboot.sectorsize
shr si,2
invert:
shl si,2
not dword ptr [bx+si-4]
shr si,2
dec si
jnz invert
ret
VerifySector2:
call verifysector
jne nook
or byte ptr [bp+6],10b
nook:
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
;=====================================================
DecompressRle:
push cx dx si di
mov dx,cx
mov bp,di
decompression:
mov eax,[si]
cmp al,'/'
jne nocomp
cmp si,07FFFh-6
jae thenen
mov ecx,eax
ror ecx,16
cmp cl,'*'
jne nocomp
cmp byte ptr [si+4],'/'
jne nocomp
mov al,ch
mov cl,ah
xor ah,ah
xor ch,ch
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:
mov ax,dx
sub bp,di
neg bp
clc
pop di si dx cx
ret
;=============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
;=====================================================
CompressRle:
push ax bx cx dx si di ds es
mov bp,di
xchg si,di
push es
push ds
pop es
pop ds
mov dx,cx
;mov bp,cx
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:
sub bp,si
neg bp
clc
pop es ds di si dx cx bx ax
ret
;=============Changedir (Fonction 13)==============
;Change le repertoire courant a DS:SI
;-> AH=13
;<- Flag Carry si erreur, Flag Equal si secteurs égaux
;=====================================================
Changedir:
push ax cx dx si di ds es
push cs
pop es
;cmp [si],005Ch ;'\',0 (root dir)
mov di,offset tempdir
call searchfile
jc noch
mov cx,cs:tempdir.Filegroup
mov cs:CurrentDir,cx
mov cs:EntryPlace,0
mov cs:adressdirectory,cx
mov cs:firstsearch,1
cmp cs:[di],' ..'
jne notback
cmp cs:[di],' .'
je theend
mov di,offset currentdirstr
mov cx,128
mov al,0
repne scasb
mov al,'\'
std
repne scasb
cld
inc di
mov byte ptr es:[di],0
jmp theend
notback:
mov di,offset currentdirstr
mov cx,128
mov al,0
repne scasb
dec di
mov al,'\'
stosb
mov dx,di
push ds
pop es
mov di,si
mov cx,128
mov al,0
repne scasb
sub cx,128
neg cx
push cs
pop es
mov di,dx
rep movsb
theend:
pop es ds di si dx cx ax
clc
ret
noch:
pop es ds di si dx cx ax
stc
ret
tempdir db 32 dup (0)
;=============getdir (Fonction 16)==============
;Recupere le repertoire courant a ES:DI
;-> AH=16
;<- Flag Carry si erreur
;=====================================================
getdir:
push ax cx si di ds es
push es di
push cs
pop es
mov di,offset currentdirstr
mov cx,128
mov al,0
repne scasb
sub cx,128
neg cx
pop di es
push cs
pop ds
mov si,offset currentdirstr
rep movsb
pop es ds di si cx ax
clc
ret
bufferread equ $
bufferwrite equ $+2048
bufferentry equ $+2048+2048
bufferFat equ $+2048+2048+2048
end start

505
noyau/drive.asm

@ -1,505 +0,0 @@
.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
dw compressrle
dw decompressrle
;cx entr‚e -> fatway chemin
getfatway:
push bx cx
mov bx,offset fatway
fatagain:
mov cs:[bx],cx
add bx,2
cmp cx,0FFF0h
jae finishload
call getfat
jnc fatagain
finishload:
pop cx bx
ret
;Charge le fichier de chemin cx -> taille dx
loadfatway:
push ax bx cx di
call getfatway
jc endload
mov di,offset fatway
xor dx,dx
loadagain:
mov cx,cs:[di]
cmp cx,0FFF0h
jae endload
add di,2
mov al,1
call readsector
jc endload
add bx,cs:sizec
add dx,cs:sizec
jmp loadagain
endload:
pop di cx bx ax
ret
;<-cx nøsecteur ->cx code FAT
getfat:
push es ax bx dx
push cs
pop ds
push cs
pop es
mov ax,cx
xor dx,dx
div sizec
mov cx,ax
add cx,reserv
mov bx,offset buffer
call readsector
jc errorgetfat
shl dx,1
add bx,dx
mov cx,[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 taille-> cx
loadfile:
push bx
call searchfile
jc errorloadfile
mov bx,di
call loadfatway
jc errorloadfile
mov cx,dx
errorloadfile:
pop bx
ret
;Recherche le fichier et retourne sont path et en cx sont debut
Searchfile:
push ax bx dx si di ds es
push cs
pop es
xor dx,dx
mov di,offset temp
call asciiztofit
push cs
pop ds
mov cx,13
check:
mov al,1
mov bx,offset buffer
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
cld
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]
cld
jmp goodboot
errorboot:
stc
goodboot:
pop es ds di si dx bx ax
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:
clc
pop di
ret
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
;decompress ds:si en es:di taille bp d‚compress‚ cx compress‚
DecompressRle:
push cx dx si di
mov dx,cx
mov bp,di
decompression:
mov eax,[si]
cmp al,'/'
jne nocomp
cmp si,07FFFh-6
jae thenen
mov ecx,eax
ror ecx,16
cmp cl,'*'
jne nocomp
cmp byte ptr [si+4],'/'
jne nocomp
mov al,ch
mov cl,ah
xor ah,ah
xor ch,ch
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:
mov ax,dx
sub bp,di
neg bp
pop di si dx cx
ret
;compress ds:si en es:di taille cx d‚compress‚ BP compress‚
CompressRle:
push ax bx cx dx si di ds es
mov bp,di
xchg si,di
push es
push ds
pop es
pop ds
mov dx,cx
;mov bp,cx
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:
sub bp,si
neg bp
pop es ds di si dx cx bx ax
ret
nbfit equ 255
namesize equ 12
extsize equ 5
exeptchar db '/\<>:|.',01,0,0
temp db 12+5+1+90 dup (0)
DiskSectorsPerTrack dw 18
DiskTracksPerHead dw 80
DiskHeads dw 2
sizec dw 512
reserv dw 1
buffer equ $
buffer2 equ $+512
fatway equ $+512
end start

BIN
noyau/font/2_hebrew.fnt

Binary file not shown.

BIN
noyau/font/8x11snsf.fnt

Binary file not shown.

BIN
noyau/font/ad&d.fnt

Binary file not shown.

BIN
noyau/font/antique.fnt

Binary file not shown.

BIN
noyau/font/applicat.fnt

Binary file not shown.

BIN
noyau/font/backward.fnt

Binary file not shown.

BIN
noyau/font/bigserif.fnt

Binary file not shown.

BIN
noyau/font/blcksnsf.fnt

Binary file not shown.

BIN
noyau/font/block.fnt

Binary file not shown.

BIN
noyau/font/bold.fnt

Binary file not shown.

BIN
noyau/font/breeze.fnt

Binary file not shown.

BIN
noyau/font/broadway.fnt

Binary file not shown.

BIN
noyau/font/comp.fnt

Binary file not shown.

BIN
noyau/font/computer.fnt

Binary file not shown.

BIN
noyau/font/courier.fnt

Binary file not shown.

BIN
noyau/font/cyrillic.fnt

Binary file not shown.

BIN
noyau/font/dblmtx14.fnt

Binary file not shown.

BIN
noyau/font/dblmtx16.fnt

Binary file not shown.

BIN
noyau/font/finnish.fnt

Binary file not shown.

BIN
noyau/font/font1!!!.dat

Binary file not shown.

BIN
noyau/font/font2!!!.dat

Binary file not shown.

BIN
noyau/font/font3!!!.dat

Binary file not shown.

BIN
noyau/font/font4!!!.dat

Binary file not shown.

BIN
noyau/font/frankfrt.fnt

Binary file not shown.

BIN
noyau/font/fresno.fnt

Binary file not shown.

BIN
noyau/font/future.fnt

Binary file not shown.

BIN
noyau/font/greek.fnt

Binary file not shown.

BIN
noyau/font/hebrew.fnt

Binary file not shown.

BIN
noyau/font/hollow.fnt

Binary file not shown.

BIN
noyau/font/hylas.fnt

Binary file not shown.

BIN
noyau/font/inverted.fnt

Binary file not shown.

BIN
noyau/font/italic.fnt

Binary file not shown.

BIN
noyau/font/italics.fnt

Binary file not shown.

BIN
noyau/font/itt.fnt

Binary file not shown.

BIN
noyau/font/lcd.fnt

Binary file not shown.

BIN
noyau/font/mechanix.fnt

Binary file not shown.

BIN
noyau/font/medieval.fnt

Binary file not shown.

BIN
noyau/font/modern-1.fnt

Binary file not shown.

BIN
noyau/font/norway.fnt

Binary file not shown.

BIN
noyau/font/norway2.fnt

Binary file not shown.

0
noyau/thin8x8.fnt → noyau/font/old8x8.fnt

BIN
noyau/font/oldeng.fnt

Binary file not shown.

BIN
noyau/font/roman.fnt

Binary file not shown.

BIN
noyau/font/sanserif.fnt

Binary file not shown.

BIN
noyau/font/script.fnt

Binary file not shown.

BIN
noyau/font/standard.fnt

Binary file not shown.

BIN
noyau/font/stretch.fnt

Binary file not shown.

BIN
noyau/font/thai.fnt

Binary file not shown.

BIN
noyau/font/thin.fnt

Binary file not shown.

911
noyau/format.asm

@ -0,0 +1,911 @@
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr ;Saute à la routine résidente
names db 'FORMAT' ;Nom drivers
id dw 1234h ;Identifiant drivers
Tsr:
cli ;Désactive interruptions logiciellement
cmp ax,cs:ID ;Compare si test de chargement
jne nomore ;Si pas test alors on continu
rol ax,3*4 ;Rotation de 3 chiffre de l'ID pour montrer que le drivers est chargé
jmp itsok ;On termine l'int avec notre code d'ID preuve du bon chargement de VIDEO
nomore:
cmp ah,maxfunc
jbe noerrorint
stc
jmp itsok
noerrorint:
clc
push bx
mov bl,ah ;On calcule d'aprés le n° de fonction
xor bh,bh ;quel sera l'entrée dans la table indexée
shl bx,1 ;des adresses fonctions.
mov bx,cs:[bx+tables] ;On récupère cette adresse depuis la table
mov cs:current,bx ;On la stocke temporairement pour obtenir les registres d'origine
pop bx
clc
call cs:current ;Puis on execute la fonction
itsok:
push bp
mov bp,sp ;On prend sp dans bp pour adresser la pile
jnc noerror ;La fonction appelée a renvoyer une erreur : Flag CARRY ?
or byte ptr [bp+6],1b;Si oui on le retranscrit sur le registre FLAG qui sera dépilé lors du IRET
;xor eax,eax
;mov ax,cs ;On récupère le segment et l'offset puis en renvoie l'adresse physique
;shl eax,4 ;de l'erreur.
;add ax,cs:current
;jmp endofint ;on termine l'int
noerror:
and byte ptr [bp+6],0FEh;Si pas d'erreur on efface le Bit CARRY du FLAG qui sera dépilé lors du IRET
endofint:
pop bp
sti ;On réactive les interruptions logiciellement
iret ;Puis on retourne au programme appelant.
current dw 0 ;Mot temporaire qui contient l'adresse de la fonction appelée
tables dw setvideomode ;Table qui contient les adresses de toutes les fonctions de VIDEO (WORD)
;Librairie qui prend en charge le format de STR ASCIIZ
;# nombre 8
;@ str 7
;& nom 6
;High Low
;0 variable 4 hex
;1 byte 3 dec
;2 word 2 oct
;3 3 octets 1 bin
;4 dword 5 adresse
;5 5 octets 6 nom
;6 ... 7 str
; 8 nombre
;Renvoie carry si la syntaxe de ds:si n'est pas respect‚ par rapport a es:di
CheckSyntax0:
push ax bx dx bp si di ds es
push es di
push cs
pop es
mov di,offset temp2
call copy0
mov si,di
push cs
pop ds
pop di es
call getdelimiter0
mov bp,dx
mov dl,' '
call setdelimiter0
call compressdelimiter0
call uppercase0
call getnbitems0
;call xch
;mov ax,cx
;call getnbitem0
;call xch
;cmp ax,cx
;call xch
;jne notequalatall
mov bx,cx
xor cx,cx
itemer:
call whatisitem0
mov dx,ax
call xch
call whatisitem0
call xch
cmp ax,dx
jne prob
cmp al,6
jb equal
call cmpitems0
je equal
prob:
cmp dl,4
ja nosize
cmp al,8
je equal
cmp al,4
jne notequalatall
cmp dh,ah
ja notequalatall
jmp equal
nosize:
cmp al,7
jne noname
cmp ah,0
jne notequalatall
jmp equal
noname:
cmp al,8
je equal
jmp notequalatall
equal:
inc cx
cmp cx,bx
jne itemer
cld
ackno:
mov dx,bp
call setdelimiter0
pop es ds di si bp dx bx ax
ret
notequalatall:
stc
jmp ackno
xch:
push ds
push es
pop ds
pop es
xchg si,di
ret
temp2 db 256 dup (0)
;Compare les ‚l‚ments cx de deux chaine ds:si et es:di
Cmpitems0:
push cx dx si di
push cx di
call getpointeritem0
mov si,di
xor cx,cx
inc cx
call getpointeritem0
mov dx,di
sub dx,si
dec cx
pop di cx
push ds si
push es
pop ds
mov si,di
call getpointeritem0
pop si ds
mov cx,dx
rep cmpsb
pop di si dx cx
ret
;Renvoie l'‚l‚ment cx de ds:si dans edx si nb et dans es:di si str ou name
gettypeditem0:
push bx cx si
call getpointeritem0
mov si,di
xor cx,cx
inc cl
call getpointeritem0
mov bx,di
dec bx
mov cl,0
xchg cl,ds:[bx]
call gettyped0
xchg cl,ds:[bx]
pop si cx bx
ret
;Renvoie ds:si dans edx si nb et dans es:di si str ou name
gettyped0:
push ax
call whatis0
cmp al,5
jb number
cmp al,6
je pointer
push ds
pop es
call getpointeritem0
jmp endofGettypeditem0
number:
mov edx,cs:lastnumber
jmp endofgettypeditem0
pointer:
call str0toadress
endofgettypeditem0:
pop ax
ret
;Renvoie dans ax le type de la str0 point‚e par ds:si ‚l‚ment cx
whatisitem0:
push bx cx si di
call getpointeritem0
mov si,di
xor cx,cx
inc cl
call getpointeritem0
mov bx,di
dec bx
mov cl,0
xchg cl,ds:[bx]
call whatis0
xchg cl,ds:[bx]
pop di si cx bx
ret
;Renvoie dans ax le type de la str0 point‚e par ds:si
;High Low
;0 variable 4 hex
;1 byte 3 dec
;2 word 2 oct
;3 3 octets 1 bin
;4 dword 5 adresse
;5 5 octets 6 name
;6 ... 7 str
whatis0:
push bx cx edx
mov cl,2
call str0isbase
jnc finbase
mov cl,8
call str0isbase
jnc finbase
mov cl,10
call str0isbase
jnc finbase
mov cl,16
call str0isbase
jc testadress
finbase:
mov bx,cx
xor ch,ch
mov al,cs:[bx+offset basenn-2]
call str0toint
mov cs:Lastnumber,edx
cmp edx,0000FFFFh
ja bits32
cmp dx,00FFh
ja bits16
mov ah,1
jmp endofwhat
bits16:
mov ah,2
jmp endofwhat
bits32:
mov ah,3
jmp endofwhat
testadress:
call str0isadress
jc testname
mov ax,0005h
jmp endofwhat
testname:
;call str0isname
;jc testvarstr
;jnc isok
;mov al,06h
cmp byte ptr [si],'&'
jne testvarstr
mov al,06h
call getlength0
dec cl
mov ah,cl
jmp endofwhat
testvarstr:
cmp byte ptr [si],'@'
jne testnumber
mov al,07h
call getlength0
dec cl
mov ah,cl
jmp endofwhat
testnumber:
cmp byte ptr [si],'#'
jne isstr
mov al,8
call getlength0
dec cl
mov ah,cl
jmp endofwhat
isstr:
mov al,07h
call getlength0
mov ah,cl
endofwhat:
pop edx cx bx
ret
Lastnumber dd 0
;Renvoie non carry si la str ds:si point‚e peut ˆtre une adresse
str0isadress:
;push
stc
;pop
ret
;Renvoie en es:di le pointeur str0 ds:si
Str0toAdress:
;push
stc
;pop
ret
;Renvoie non carry si la str ds:si point‚e peut ˆtre un nom de fichier
str0isname:
push ax si di
isname:
mov al,[si]
inc si
cmp al,0
je itsok
mov di,offset non
verify:
mov ah,[di]
inc di
cmp ah,0FFh
je isname
cmp ah,al
jne verify
stc
jmp itsdead
itsok:
clc
itsdead:
pop di si ax
ret
non db '/<>|"?*:\',01,0FFh
;Renvoie non carry si le texte point‚ par si est de la base cl
str0isbase:
push ax cx si di es
push cs
pop es
mov ah,cl
isstrbase:
mov al,[si]
cmp al,0
je okbase
mov cl,ah
xor ch,ch
mov di,cx
cmp al,es:[di-2+offset basen]
je verifbase
xor ch,ch
inc cl
mov di,offset base
cld
repne scasb
cmp cx,0
je nobase
inc si
jmp isstrbase
okbase:
clc
endbase:
pop es di si cx ax
ret
verifbase:
cmp byte ptr [si+1],0
je okbase
nobase:
stc
jmp endbase
temp dw 0
;Converti un str de base cl en int dans edx
str0toint:
push eax bx ecx si edi ebp es
push cs
pop es
mov ah,cl
mov cs:temp,si
gotos:
cmp byte ptr [si+1], 0
je oklo
inc si
jmp gotos
oklo:
mov edi,1
xor ebp,ebp
mov bl,cl
baseto:
cmp si,cs:temp
jb endbaseto
mov al,[si]
xor ecx,ecx
mov cl,bl
inc cl
push di
mov di,offset base
cld
repne scasb
pop di
jne noop
sub cl,bl
neg cl
mov eax,edi
mul ecx
add ebp,eax
mov eax,edi
mov cl,bl
mul ecx
mov edi,eax
noop:
dec si
jmp baseto
endbaseto:
mov edx,ebp
pop es ebp edi si ecx bx eax
ret
base db '0123456789ABCDEF'
basen db 'B O D H'
basenn db 1,0,0,0,0,0,2,0,3,0,0,0,0,0,4
;Renvoie en es:di la partie de cx caractŠres a partir de la gauche de ds:si
Left0:
push ax cx si di
cld
rep movsb
mov al,0
stosb
pop di si cx ax
ret
;Renvoie en es:di la partie de cx caractŠres a partir de la droite de ds:si
Right0:
push ax cx dx si di
mov dx,cx
call getlength0
add si,cx
sub si,dx
mov cx,dx
cld
rep movsb
mov al,0
stosb
pop di si dx cx ax
ret
;Renvoie en es:di la partie de cx caractŠres a partir de la position bx de ds:si
middle0:
push ax cx si di
add si,bx
cld
rep movsb
mov al,0
stosb
pop di si cx ax
ret
;Rempli de cx caractŠres dl a partir de la position bx de ds:si
Fill0:
push ax bx cx si di es
push ds
pop es
add si,bx
mov al,dl
mov di,si
cld
rep stosb
pop es di si cx bx ax
ret
;Remplace tout les caractŠres al de ds:si par des caractŠres dl
ReplaceAllchar0:
push ax cx di es
call GetLength0
push ds
pop es
mov di,si
findandchange:
repne scasb
cmp cx,0
je endofchange
mov es:[di-1],dl
jmp findandchange
endofchange:
pop es di cx ax
ret
;Recherche un caractŠre dl dans la chaŒne ds:si
SearchChar0:
push ax cx di es
call GetLength0
push ds
pop es
mov di,si
mov al,dl
repne scasb
pop es di cx ax
ret
;Inverse la chaine point‚e en ds:si
invert0:
push ax cx si di es
call GetLength0
push ds
pop es
mov di,si
add di,cx
dec di
revert:
mov al,[si]
xchg al,es:[di]
mov [si],al
inc si
dec di
cmp si,di
je finishinvert
dec di
cmp si,di
je finishinvert
inc di
jmp revert
finishinvert:
pop es di si cx ax
ret
;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal
cmpstr0:
push cx dx si di
call GetLength0
mov dx,cx
push ds si
push es
pop ds
mov si,di
call GetLength0
pop si ds
cmp cx,dx
jne NotEqual
repe cmpsb
NotEqual:
pop di si dx cx
ret
;Compares 2 chaines de caractŠres DS:SI et ES:DI zerof si non equal et renvoie le nb de caractŠre egaux dans dx
evalue0:
push cx si di
push ds si
push es
pop ds
mov si,di
call GetLength0
pop si ds
mov dx,cx
repe cmpsb
pushf
sub dx,cx
popf
pop di si cx
ret
;Insert une chaine ds:si en es:di a partir du caractŠre cx
insert0:
push cx di si
add di,cx
call getlength0
push si di ds
push es
pop ds
mov si,di
add di,cx
call copy20
pop ds di si
cld
inc di
rep movsb
pop si di cx
ret
;Detruit CX caractŠres a partir du caractŠre BX de DS:SI
delete0:
push cx dx si di es
push ds
pop es
mov dx,cx
call getlength0
sub cx,dx
sub cx,bx
inc cx
add si,bx
mov di,si
add si,dx
cld
rep movsb
pop es di si dx cx
ret
;Copie une chaine de ds:si en es:di
Copy0:
push ax cx si di
call GetLength0
cld
rep movsb
mov al,0
stosb
pop di si cx ax
ret
;Copie une chaine de ds:si en es:di
Copy20:
push ax cx si di
call GetLength0
cld
add si,cx
add di,cx
inc cx
std
rep movsb
pop di si cx ax
ret
;ConcatŠne le chaine ds:si avec es:di
Concat0:
push ax cx dx si di
call GetLength0
mov dx,cx
xchg si,di
push ds
push es
pop ds
call GetLength0
pop ds
xchg si,di
add di,cx
mov cx,dx
cld
rep movsb
mov al,0
stosb
pop di si dx cx ax
ret
;Met DL comme d‚limiteur par d‚faut
SetDelimiter0:
mov cs:delim,dl
ret
;Renvoie le d‚limiteur par d‚faut dans dl
GetDelimiter0:
mov dl,cs:delim
ret
delim db 0
;D‚truit les d‚limiteur qui sont cons‚cutifs dans ds:si
CompressDelimiter0:
push ax dx si di es
call Getlength0
push ds
pop es
mov di,si
mov al,cs:delim
xor dx,dx
Compressitems:
repne scasb
inc dx
againcomp:
cmp [di],al
jne nosup
mov si,di
mov bx,0
push cx
mov cx,1
call delete0
pop cx
jmp againcomp
nosup:
cmp cx,0
jne compressitems
mov cx,dx
pop es di si dx ax
ret
;Met le nombre d'‚l‚ments … cx
Setnbitems0:
push ax cx dx di es
mov dx,cx
call Getnbitems0
cmp cx,dx
je noadjust
ja subsome
push ds
pop es
mov di,si
sub cx,dx
neg cx
push cx
call getlength0
add di,cx
pop cx
mov al,cs:delim
mov ah,'a'
rep stosw
mov al,0
stosb
jmp noadjust
subsome:
mov cx,dx
call GetPointeritem0
dec di
mov byte ptr [di],0
noadjust:
pop es di dx cx
ret
;Renvoie la taille dx de l'‚l‚ment cx
Getitemsize:
push cx di
call getpointeritem0
mov dx,di
inc cx
call getpointeritem0
sub dx,di
neg dx
dec dx
pop di cx
ret
;Renvoie en es:di l'‚l‚ment cx de ds:si
Getitem0:
push si di cx ax
push di
call getPointeritem0
call getitemsize
mov si,di
pop di
mov cx,dx
rep movsb
mov al,0
stosb
pop ax cx di si
ret
;renvoi un pointeur di sur l'‚l‚ment cx de ds:si
GetPointeritem0:
push ax bx cx dx es
mov bx,cx
call Getlength0
push ds
pop es
mov di,si
mov al,cs:delim
xor dx,dx
Countnbitems:
cmp bx,dx
je finishpointer
repne scasb
inc dx
cmp cx,0
jne countnbitems
inc di
finishpointer:
pop es dx cx bx ax
ret
;Renvoie le nombre d'‚l‚ments cx de ds:si
GetNbitems0:
push ax dx di es
call Getlength0
push ds
pop es
mov di,si
mov al,cs:delim
xor dx,dx
Countitems:
repne scasb
inc dx
cmp cx,0
jne countitems
mov cx,dx
pop es di dx ax
ret
;renvoie la taille en octets CX de la chaine point‚e en ds:si
GetLength0:
push ax di es
push ds
pop es
mov di,si
mov al,0
mov cx,0FFFFh
cld
repne scasb
neg cx
dec cx
dec cx
pop es di ax
ret
;Met la taille en octets de la chaine point‚e ds:si a CX
SetLength0:
push bx
mov bx,cx
mov byte ptr [si+bx],0
pop bx
ret
;met en majuscule la chaine ds:si
UpperCase0:
push si ax
UpperCase:
mov al,ds:[si]
inc si
cmp al,0
je EndUpperCase
cmp al,'a'
jb UpperCase
cmp al,'z'
ja UpperCase
sub byte ptr [si-1],'a'-'A'
jmp UpperCase
EndUpperCase:
clc
pop ax si
ret
;met en majuscule la premiŠre lettre chaine ds:si
OneCase0:
push ax
OneUpperCase:
mov al,ds:[si]
cmp al,'a'
jb OneEndUpperCase
cmp al,'z'
ja OneEndUpperCase
sub byte ptr [si],'a'-'A'
OneEndUpperCase:
clc
pop ax
ret
;met en minuscule la chaine ds:si
LowerCase0:
push si ax
LowerCase:
mov al,ds:[si]
inc si
cmp al,0
je EndLowerCase
cmp al,'A'
jb LowerCase
cmp al,'Z'
ja LowerCase
add byte ptr [si-1],'a'-'A'
jmp LowerCase
EndLowerCase:
clc
pop ax si
ret
;Inverse la casse la chaine ds:si
InvertCase0:
push si ax
InvertCase:
mov al,ds:[si]
inc si
cmp al,0
je EndInvertCase
cmp al,'A'
jb InvertCase
cmp al,'Z'
jbe GoInvertCase
cmp al,'a'
jb InvertCase
cmp al,'z'
ja InvertCase
sub byte ptr [si-1],'a'-'A'
jmp InvertCase
GoInvertCase:
add byte ptr [si-1],'a'-'A'
jmp InvertCase
EndInvertCase:
clc
pop ax si
ret
end start

162
noyau/hours.asm → noyau/heure.asm

@ -1,81 +1,81 @@
.model tiny
.486
smart
.code
org 0100h
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
.model tiny
.486
smart
.code
org 0100h
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

64
noyau/timer.asm → noyau/horloge.asm

@ -1,32 +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
.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

596
noyau/joystick.asm → noyau/manette.asm

@ -1,298 +1,298 @@
.model tiny
.486
smart
.code
org 0100h
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
.model tiny
.486
smart
.code
org 0100h
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

119
noyau/mcb.asm

@ -0,0 +1,119 @@
FirstMB dw 0
;Initialise les blocs de mémoire
MBinit:
push ax cx es
mov ax,gs
mov cs:Firstmb,ax
dec ax
mov es,ax
mov cx,0A000h
sub cx,ax
dec cx
mov es:[MB.Reference],Free
mov es:[MB.Sizes],cx
mov es:[MB.Check],'NH'
mov es:[MB.IsNotLast],False
clc
pop es cx ax
ret
notforfree:
stc
pop es cx ax
ret
;Libère le bloc de mémoire GS
MBFree:
push bx es
mov bx,gs
dec bx
mov es,bx
cmp es:[MB.Check],'NH'
je notforfree
mov es:[MB.IsResident],0
mov es:[MB.Reference],Free
mov dword ptr es:[MB.Names],'eerF'
mov dword ptr es:[MB.Names+4],0
pop es bx
ret
;Creér un bloc de nom ds:si de taille cx (octets) -> n°segement dans GS
MBCreate:
push ax bx cx dx si di es
shr cx,4
inc cx
mov bx,cs:firstmb
dec bx
searchfree:
mov es,bx
cmp es:[MB.Check],'NH'
jne wasntgood
cmp es:[MB.IsNotLast],True
sete dl
cmp es:[MB.Reference],Free
je weregood
cmp dl,False
je wasntgood
notsogood:
inc bx
add bx,es:[MB.Sizes]
jmp searchfree
weregood:
mov ax,es:[MB.Sizes]
cmp cx,ax
ja notsogood
mov es:[MB.IsNotLast],True
mov es:[MB.Reference],cs
mov es:[MB.IsResident],False
mov es:[MB.Sizes],cx
mov di,MB.Names
push ax cx
mov cx,8
loops:
mov dh,[si]
inc si
dec cx
jz endofloops
cmp dh,0
je endofloops
mov es:[di],dh
inc di
jmp loops
endofloops:
inc cx
mov al,0
rep stosb
pop cx ax
mov word ptr es:[MB.Check],'NH'
sub ax,cx
dec ax
js nofree
inc bx
mov gs,bx
add bx,cx
mov es,bx
mov es:[MB.IsNotLast],dl
mov es:[MB.IsResident],False
mov es:[MB.Reference],Free
mov es:[MB.Sizes],ax
mov dword ptr es:[MB.Names],'eerF'
mov dword ptr es:[MB.Names+4],0
mov es:[MB.Check],'NH'
nofree:
clc
pop es di si dx cx bx ax
ret
wasntgood:
stc
pop es di si dx cx bx ax
ret
;Rend le segment GS résident
MBresident:
push bx es
mov bx,gs
dec bx
mov es,bx
mov es:[MB.IsResident],True
pop es bx
ret

BIN
noyau/old8x8.fnt

Binary file not shown.

1398
noyau/lpt.asm → noyau/port.asm

File diff suppressed because it is too large Load Diff

654
noyau/mouse.asm → noyau/souris.asm

@ -1,327 +1,327 @@
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
drv db 'MOUSE',0
Tsr:
cli
cmp ax,1234h
jne nomore
mov ax,4321h
jmp itsok
nomore:
push bx ax
mov ah,4
mov bh,0
int 50h
mov bl,al
pop ax
cmp byte ptr cs:isact,1
je nottest
mov cs:isact,1
and bl,10000b
cmp bl,16
jae react
mov bl,ah
xor bh,bh
shl bx,1
mov bx,cs:[bx].tables
mov cs:current,bx
pop bx
call cs:current
itsok:
jnc noerror
push bp
mov bp,sp
or byte ptr [bp+6],1b
pop bp
mov ax,cs
shl eax,16
mov ax,cs:current
jmp endofint
noerror:
push bp
mov bp,sp
and byte ptr [bp+6],0FEh
pop bp
endofint:
mov cs:isact,0
sti
iret
nottest:
pop bx
jmp endofint
current dw 0
tables dw cmdmouse
dw cmdmouse2
dw detectmouse
dw getmouse
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
.model tiny
.486
smart
.code
org 0100h
start:
jmp tsr
drv db 'MOUSE',0
Tsr:
cli
cmp ax,1234h
jne nomore
mov ax,4321h
jmp itsok
nomore:
push bx ax
mov ah,4
mov bh,0
int 50h
mov bl,al
pop ax
cmp byte ptr cs:isact,1
je nottest
mov cs:isact,1
and bl,10000b
cmp bl,16
jae react
mov bl,ah
xor bh,bh
shl bx,1
mov bx,cs:[bx].tables
mov cs:current,bx
pop bx
call cs:current
itsok:
jnc noerror
push bp
mov bp,sp
or byte ptr [bp+6],1b
pop bp
mov ax,cs
shl eax,16
mov ax,cs:current
jmp endofint
noerror:
push bp
mov bp,sp
and byte ptr [bp+6],0FEh
pop bp
endofint:
mov cs:isact,0
sti
iret
nottest:
pop bx
jmp endofint
current dw 0
tables dw cmdmouse
dw cmdmouse2
dw detectmouse
dw getmouse
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

676
noyau/system.asm

@ -1,676 +0,0 @@
.model tiny
.486
smart
.code
org 0100h
start:
mov si,offset video
mov bx,400h
mov ax,47h
call installhandler
jc erroron
mov si,offset timer
mov bx,900h
mov ax,8h
call replacehandler
jc erroron
mov si,offset pic
mov bx,950h
mov ax,50h
call installhandler
jc erroron
mov si,offset drive
mov bx,1020h
mov ax,48h
call installhandler
jc erroron
mov si,offset keyboard
mov bx,1400h
mov ax,9h
call replacehandler
jc erroron
mov ax,40h
mov es,ax
mov dx,es:[8]
cmp dx,0
je nolpt1
mov al,0FFh
add dx,2
out dx,al
mov si,offset lpt
mov bx,1500h
mov ax,0Fh
call installhandler
jc erroron
mov es,bx
sub al,8
xor ah,ah
int 50h
mov byte ptr es:[105h],'1'
nolpt1:
push es
mov ax,40h
mov es,ax
mov dx,es:[10]
pop es
cmp dx,0
je nolpt2
mov al,0FFh
add dx,2
out dx,al
mov si,offset lpt
mov bx,1700h
mov ax,0Dh
call installhandler
jc erroron
sub al,8
xor ah,ah
int 50h
mov es,bx
mov byte ptr es:[105h],'2'
nolpt2:
mov si,offset mouse
mov bx,1900h
mov ax,74h
call installhandler
jc erroron
mov ax,0012
int 50h
mov ah,2
int 74h
;mov si,offset joystick
;mov bx,2700h
;mov ax,08h
;call replacehandler
mov si,offset hours
mov bx,2900h
mov ax,08h
call replacehandler
start2:
push cs
push cs
pop ds
pop es
mov ah,21
mov cl,7
int 47h
mov ax,0002
int 47h
mov ah,2
int 47h
mov ah,25
mov bx,0
int 47h
mov ah,13
mov si,offset msg1
int 47h
mov ah,6
int 47h
int 47h
mov ah,13
mov si,offset prompt
int 47h
mov ah,6
int 47h
xor di,di
mov ax,0001h
mov bx,offset buffer
mov cx,13
int 48h
xor bp,bp
showall:
cmp byte ptr [bx+di],0
je endof2
mov al,[bx+di+12]
mov byte ptr [bx+di+12],0
mov si,bx
add si,di
mov ah,13
int 47h
mov si,offset spaces
int 47h
mov [bx+di+12],al
mov byte ptr [bx+di+12+5],0
mov si,bx
add si,di
add si,12
int 47h
mov ah,6
int 47h
add di,32
inc bp
jmp showall
endof2:
mov ah,21
mov cl,112
int 47h
mov ah,13
mov si,offset menu
int 47h
mov xx,1
mov xxold,2
call Select
endof:
mov ax,0
int 16h
cmp ah,50h
jne tre1
cmp xx,bp
je endof
inc xx
call select
jmp endof
tre1:
cmp ah,48h
jne tre2
cmp xx,1
je endof
dec xx
call select
jmp endof
tre2:
cmp al,0Dh
jne tre3
mov di,xx
dec di
shl di,5
mov dx,[di+bx+26]
cmp [di+bx+12],00657865h ;EXE
jne tre3
mov ah,6
int 47h
int 47h
mov ah,21
mov cl,7
int 47h
mov ah,13
mov si,offset msg2
int 47h
mov cx,dx
call executefatway
tre3:
cmp ah,59
jne tre4
mov lastread,0FFFFh
jmp start2
tre4:
cmp ah,67
jne endof
mov ax,0001
int 47h
mov ah,2
int 47h
mov ah,21
mov cl,4
int 47h
mov ah,13
mov si,offset msg3
int 47h
mov ax,0
int 16h
mov ax,40h
mov ds,ax
mov bx,1234h
mov ds:[072h],bx
push 0FFFFh
push 0000h
db 0CBh
executefatway:
push cs
mov bx,offset start2
push bx
mov bx,03000h
mov es,bx
push bx
mov bx,0100h
push bx
call loadfatway
push es
push es
push es
pop ds
pop fs
pop gs
push 7202h
popf
db 0CBh
;selectionne la ligne xx
Select:
push ax di
mov di,xxold
mov al,7
add di,2
mov ah,32
int 47h
mov ax,xx
mov xxold,ax
mov di,xx
mov ah,32
mov al,112
add di,2
int 47h
pop di ax
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
msg2 db 'The program is loading',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
;cx entr‚e -> fatway chemin
getfatway:
push bx cx
mov bx,offset fatway
fatagain:
mov cs:[bx],cx
add bx,2
cmp cx,0FFF0h
jae finishload
call getfat
jnc fatagain
finishload:
pop cx bx
ret
;Charge le fichier de chemin cx -> taille dx
loadfatway:
push ax bx cx di
call getfatway
jc endload
mov di,offset fatway
mov si,offset dot
mov ah,13
xor dx,dx
loadagain:
mov cx,cs:[di]
cmp cx,0FFF0h
jae endload
add di,2
call readsector
jc endload
add bx,cs:sizec
add dx,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
push cs
pop ds
push cs
pop es
mov ax,cx
xor dx,dx
div sizec
mov cx,ax
add cx,reserv
mov bx,offset buffer
call readsector
jc errorgetfat
shl dx,1
add bx,dx
mov cx,[bx]
errorgetfat:
pop dx bx ax es
ret
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
Lastread dw 0FFFFh
;remplace le handler pointer par ds:si en bx:100h interruption ax
replacehandler:
push ax bx cx si di ds es
mov es,bx
mov di,0100h
call loadfile
jc reph
mov bx,ax
call getint
mov es:[102h],si
mov es:[104h],ds
call setint
reph:
pop es ds di si cx bx ax
ret
;install le handler pointer par ds:si en bx:100h interruption ax
installhandler:
push bx cx di es
mov es,bx
mov di,100h
call loadfile
jc insh
mov bx,ax
call setint
insh:
pop es di cx bx
ret
;Charge le fichier Ds:si en es:di taille-> cx
loadfile:
push bx
call searchfile
jc errorloadfile
mov bx,di
call loadfatway
jc errorloadfile
mov cx,dx
errorloadfile:
pop bx
ret
;met es:di le handle de l'int bx
setint:
push ax bx ds
cli
shl bx,2
xor ax,ax
mov ds,ax
mov ds:[bx],di
mov ds:[bx+2],es
pop ds bx ax
sti
ret
;met ds:si le handle de l'int bx
getint:
push ax bx es
shl bx,2
xor ax,ax
mov es,ax
mov si,es:[bx]
mov ds,es:[bx+2]
pop es bx ax
ret
;Recherche le fichier et retourne sont path et en cx sont debut
Searchfile:
push ax bx dx si di ds es
push cs
pop es
xor dx,dx
mov di,offset temp
call asciiztofit
push cs
pop ds
mov cx,13
check:
mov bx,offset buffer
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
cld
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]
cld
jmp goodboot
errorboot:
stc
goodboot:
pop es ds di si dx bx ax
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:
clc
pop di
ret
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
erroron:
push cs
pop ds
xor edx,edx
mov dx,ax
mov ax,0001h
int 47h
mov ah,6
int 47h
mov ah,6
int 47h
mov ah,13
mov si,offset errormsg
int 47h
mov ah,10
mov cx,16
int 47h
mov ah,6
int 47h
mov ah,6
int 47h
mov ah,13
mov si,offset errormsg2
int 47h
mov ax,0
int 16h
push 0FFFFh
push 0
db 0CBh
errormsg db 'Error with drivers loading on interrupt nø',0
errormsg2 db 'Press a key to restart...',0
namesize equ 12
extsize equ 5
nbfit equ 255
hours db 'hours.sys',0
joystick db 'joystick.sys',0
mouse db 'mouse.sys',0
pic db 'pic8259a.sys',0
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)
exeptchar db '/\<>:|.',01,0,0
DiskSectorsPerTrack dw 18
DiskTracksPerHead dw 80
DiskHeads dw 2
fatway equ $
buffer equ $+3000
end start

897
noyau/systeme.asm

@ -0,0 +1,897 @@
.model tiny
.486
smart
.code
org 0100h
include ..\include\fat.h
start:
push cs
push cs
push cs
push cs
pop ds
pop es
pop fs
pop gs
;xor ax,ax
;mov ds,ax
;mov si,7C00h
mov si,offset eepop
mov di,offset myboot
mov cx,type bootsector
push cs
pop es
rep movsb
jmp noone
eepop db 0,0,0
bootdb db 'COS2000A' ;Fabricant + n°série Formatage
sizec dw 512 ;octet/secteur
db 1 ;secteur/cluster
reserv dw 1 ;secteur reserv‚
nbfat db 2 ;nb de copie de la FAT
nbfit dw 224 ;taille rep racine
allclu dw 2880 ;nb secteur du volume si < 32 még
db 0F0h ;Descripteur de média
fatsize dw 9 ;secteur/FAT
nbtrack dw 18 ;secteur/piste
head dw 2 ;nb de tˆteb de lecture/écriture
hidden dd 0 ;nombre de secteur cach‚s
dd 0 ;si nbsecteur = 0 nbsect ; the number of sectors
bootdrv db 0 ;Lecteur de d‚marrage
bootsig db 0 ;NA
db 29h ;boot signature 29h
bootsig2 dd 01020304h ;no de serie
pope db 'COS2000 ' ;nom de volume
db 'FAT12 ' ;FAT
xor ax,ax
mov es,ax
mov di,1Eh*4
lds si,es:[di]
mov es:[di],cs
mov word ptr es:[di],offset myDPT
push cs
pop es
mov cx,type DPT
rep movsb
mov ax,cs:[Bootsector.SectorsPerTrack]
mov es:[DPT.SectorPerTracks],al
noone:
push cs
push cs
push cs
push cs
pop ds
pop es
pop fs
pop gs
call InitDrive
mov si,offset premice
mov bx,7
call showstr
mov si,offset next
call showstr
mov si,offset conf
call showstr
mov al,0
mov cx,2000
mov di,offset loadinglist
rep stosb
mov di,offset loadinglist
call loadfile
jc noconfread
mov si,offset debut
mov bx,7
call showstr
mov bx,500h
xor cx,cx
mov si,offset loadinglist
suiteloading:
call readline
jc noconfload
push bx si
mov bl,7
mov si,offset next
call showstr
pop si bx
call showstr
mov dx,bx
push bx si
mov bx,7
mov si,offset address
call showstr
mov cx,16
call showhex
mov si,offset addressend
call showstr
xor bp,bp
mov dx,ax
cmp ax,8h
jb noadder
cmp ax,10h
ja noadder
mov bp,1
sub dx,8
jmp haveirq
noadder:
cmp ax,70h
jb noadd
cmp ax,78h
ja noadd
mov bp,1
sub dx,68h
haveirq:
mov si,offset irqs
call showstr
mov cx,4
call showhex
mov si,offset irqsend
call showstr
noadd:
pop si bx
cmp bp,1
jne install
call replacehandler
jmp suites
install:
call installhandler
suites:
jc nohandlerload
add bx,0F00h
inc cx
call nextline
jnz suiteloading
mov si,offset fini
mov bl,7
call showstr
mov si,offset next
call showstr
mov si,offset prompt
call showstr
mov ax,6000h
mov es,ax
push ax
mov di,0100h
push di
call loadfile
jc nopromptload
push 7202h
popf
push es
push es
push es
pop ds
pop fs
pop gs
db 0CBh
nopromptload:
mov si,offset prompte
mov bl,4
call showstr
jmp erroron
nohandlerload:
mov si,offset handlere
mov bl,4
call showstr
jmp erroron
noconfread:
mov si,offset confee
mov bl,4
call showstr
jmp erroron
noconfload:
mov di,si
mov si,offset confe
mov bl,4
call showstr
mov dx,cx
mov cx,16
call showhex
mov si,offset confe2
mov bl,3
call showstr
mov dx,di
mov cx,16
call showhex
erroron:
push cs
pop ds
mov si,offset erreur
mov bl,4
call showstr
mov ax,0
int 16h
push 0FFFFh
push 0
db 0CBh
address db ' [',0
addressend db ':0100] ',0
irqs db ' (IRQ ',0
irqsend db ')',0
prompt db 'commande.exe',0
conf db 'systeme.ini',0
premice db 0Dh,0Ah,'Chargement du fichier de configuration:',0
debut db 0Dh,0Ah,'Chargement des pilotes systeme:',0
fini db 0Dh,0Ah,'Chargement de l''interpreteur de commande:',0
next db 0Dh,0Ah,' - ',0
prompte db 0Dh,0Ah,'Erreur lors du chargement de l''interpreteur',0
handlere db 0Dh,0Ah,'Erreur lors du chargement des pilotes',0
confe db 0Dh,0Ah,'Erreur dans le fichier de configuration a la ligne ',0
confee db 0Dh,0Ah,'Erreur de lecture du fichier de configuration',0
confe2 db ' caractere ',0
erreur db 0Dh,0Ah,'Pressez une touche pour redemarrer...',0
;==positionne si sur l'entrée suivante de la loading liste jusqu'a equal
nextline:
push ax cx di
mov di,si
mov al,0Ah
mov cx,20
repnz scasb
mov si,di
cmp byte ptr [di],0
pop di cx ax
ret
;==Lit la loading list et initialise SI(Fichier) BX(adresse) AX(interruption)
readline:
push cx dx di es
push ds
pop es
;Voir taille de la ligne -> DX
mov di,si
mov al,0Dh
mov cx,20
repne scasb
sub cx,20
neg cx
mov dx,cx
;N° interruption ??
mov di,si
mov al,'('
repne scasb
jne noaddr
;Non, je recherche l'int positionnement parenthese de fin
mov al,')'
repne scasb
jne errorlist
;Je lit l'interruption dans DL
xor dl,dl
xor cx,cx
dec di
readingint:
dec di
mov al,[di]
cmp al,'('
je finishint
call eval
jc errorlist
shl ax,cl
add dl,al
add cx,4
cmp cx,8
ja errorlist
jmp readingint
noaddr:
dec di
mov dl,0
finishint:
;mise d'un 0 a la fin du nom
mov byte ptr [di],0
mov al,dl
pop es di dx cx
clc
ret
errorlist:
sub di,si
mov si,di
pop es di dx cx
stc
ret
;return carry si pas hexa pour al et renvoie dans al la valeur décimale
eval:
push si
xor si,si
searchex:
cmp al,cs:[si+offset hexas]
je endsearchex
inc si
cmp si,15
jbe searchex
pop si
stc
ret
endsearchex:
mov ax,si
pop si
clc
ret
hexas db '0123456789ABCDEF',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,0Eh
and bx,1111b
Hexaize:
rol edx,4
mov si,dx
and si,1111b
mov al,[si+offset tab]
int 10h
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 si
again:
lodsb
or al,al
jz fin
mov ah,0Eh
and bx,1111b
int 10h
jmp again
fin:
pop si bx ax
ret
;================================================
;Routine de gestion de handler
;================================================
;remplace le handler pointer par ds:si en bx:100h interruption ax
replacehandler:
push ax bx cx si di ds es
mov es,bx
mov di,0100h
call loadfile
jc reph
mov bx,ax
call getint
mov es:[102h],si
mov es:[104h],ds
call setint
reph:
pop es ds di si cx bx ax
ret
;install le handler pointer par ds:si en bx:100h interruption ax
installhandler:
push bx cx di es
mov es,bx
mov di,100h
call loadfile
jc insh
mov bx,ax
call setint
insh:
pop es di cx bx
ret
;met es:di le handle de l'int bx
setint:
push ax bx ds
cli
shl bx,2
xor ax,ax
mov ds,ax
mov ds:[bx],di
mov ds:[bx+2],es
pop ds bx ax
sti
ret
;met ds:si le handle de l'int bx
getint:
push ax bx es
shl bx,2
xor ax,ax
mov es,ax
mov si,es:[bx]
mov ds,es:[bx+2]
pop es bx ax
ret
;================================================
;Routine de gestion de systeme de fichier FAT12
;================================================
;DPT disquette
mydpt DPT ?
;Secteur de boot
myboot bootSector ?
;Données Calculée
clustersize dw 0
TracksPerHead dw 0
DriveSize dd 0
AdressBoot dw 0
AdressFat dw 0
AdressParent dw 0
AdressData dw 0
AddingValue dw 0
CurrentDir dw 0 ;En cluster
CurrentDirStr db 128 dup (0)
;Pour recherches
EntryPlace dw 0 ;En octet
AdressDirectory dw 0 ;En cluster
firstsearch dw 1 ;Premiere requete ?
getfat:
push ax bx dx si
mov ax,cx
mov bx,ax
and bx,0000000000000001b
shr ax,1
mov cx,3
mul cx
mov si,offset bufferfat
add si,ax
cmp bx,0h
jnz evenfat
oddfat:
mov dx,cs:[si]
and dx,0FFFh
mov cx,dx
jmp endfat
evenfat:
mov dx,cs:[si+1]
and dx,0FFF0h
shr dx,4
mov cx,dx
endfat:
cmp dx,0FF0h
jbe nocarry
stc
pop si dx bx ax
ret
nocarry:
clc
pop si dx bx ax
ret
;============loadfile (Fonction 4)===============
;Charge le fichier ds:si en es:di ->ecx taille
;-> AH=4
;<- Flag Carry si erreur
;=====================================================
loadfile:
push eax bx di
push es di
push cs
pop es
mov di,offset tempfit
call searchfile
pop di es
jne errorload
jc errorload
mov cx,cs:tempfit.FileGroup
mov eax,cs:tempfit.FileSize
call loadway
jc errorload
clc
;mov ecx,eax
pop di bx eax
ret
errorload:
stc
mov ecx,0
pop di bx eax
ret
tempfit db 32 dup (0)
;=============SearchFile (Fonction 10)===============
;Renvois dans ES:DI la fit du fichier DS:SI et non equal si pas existant
;-> AH=10
;<- Flag Carry si erreur
;=====================================================
SearchFile:
push ax cx ds si di es
call uppercase
push ds si
call findfirstfilez
push ds
pop es
mov di,si
pop si ds
jc errorsearch
jmp founded
nextsearch:
push ds si
call findnextfilez
push ds
pop es
mov di,si
pop si ds
founded:
cmp byte ptr cs:[di],0
je notgood
cmp byte ptr cs:[di+FileAttr],0Fh
je nextsearch
call cmpnames
jc nextsearch
okfound:
push cs
pop ds
mov si,di
pop es di
push di es
mov cx,32
rep movsb
clc
pop es di si ds cx ax
ret
notgood:
cmp si,0FF5h
pop es di si ds cx ax
ret
errorsearch:
stc
pop es di si ds cx ax
ret
;Transforme la chaine ds:si en maj
uppercase:
push si ax
mov di,si
uppercaser:
mov al,ds:[si]
cmp al,0
je enduppercase
cmp al,'a'
jb nonmaj
cmp al,'z'
ja nonmaj
sub al,'a'-'A'
mov ds:[si],al
nonmaj:
inc si
jmp uppercaser
enduppercase:
clc
pop ax si
ret
;Compare le nom ds:si '.' avec es:di
CmpNames:
push ax cx si di
mov cx,8
repe cmpsb
jne nequal
inc si
nequal:
cmp byte ptr [si-1],'.'
jne trynoext
mov al,' '
rep scasb
mov cx,3
rep cmpsb
jne notequal
cmp byte ptr [si],0
jne notequal
cmp cx,0
jl notequal
itok:
pop di si cx ax
ret
trynoext:
cmp byte ptr [si-1],0
jne notequal
jmp itok
notequal:
stc
pop di si cx ax
ret
;charge le fichier de de groupe CX et de taille eax
LoadWay:
push eax bx dx si di ecx ds es
cmp eax,0
je Zeroload
rol eax,16
mov dx,ax
ror eax,16
div cs:clusterSize
mov bx,ax
cmp bx,1
jb adjustlast
Loadfat:
call readcluster
jc noway
add di,cs:clusterSize
call getfat
dec bx
jnz loadfat
AdjustLast:
push es di
push cs
pop es
mov di,offset bufferread
mov si,di
call Readcluster
pop di es
jc noway
mov cx,dx
push cs
pop ds
rep movsb
zeroload:
clc
pop es ds ecx di si dx bx eax
ret
noway:
stc
pop es ds ebp di si dx bx eax
ret
;=============INITDRIVE (Fonction 04H)===============
;Initialise le lecteur pour une utilisation ultérieure
;-> AH=4
;<- Flag Carry si erreur
;=====================================================
InitDrive:
push eax bx cx edx di ds es
push cs
pop ds
push cs
pop es
mov cs:lastseg,0
mov cs:lastoff,0
mov cs:LastRead,0
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 EntryPlace,0
mov adressdirectory,0
mov firstsearch,1
mov currentdirstr,0
mov di,offset bufferfat
mov dx,myboot.SectorsPerFat
mov cx,AdressFat
SeeFat:
call readsector
jc ErrorInit
add di,myboot.SectorSize
inc cx
dec dx
jnz seefat
clc
pop es ds di edx cx bx eax
ret
ErrorInit:
stc
pop es ds di edx cx bx eax
ret
;=============FindFirstFile (Fonction 7)==============
;Renvois dans ES:DI un bloc d'info
;-> AH=7
;<- Flag Carry si erreur
;=====================================================
FindFirstFileZ:
push cx
mov cx,cs:CurrentDir
mov cs:AdressDirectory,cx
xor cx,cx
mov cs:EntryPlace,cx
mov cs:firstsearch,1
call findnextfileZ
pop cx
ret
;=============FindnextFile (Fonction 8)==============
;Renvois dans ES:DI un bloc d'info
;-> AH=8
;<- Flag Carry si erreur
;=====================================================
;fait pointer ds:si sur la prochaine entrée du repertoire courant
FindnextFileZ:
push ax bx cx es di
push cs
pop ds
mov cx,cs:AdressDirectory
mov bx,cs:Entryplace
FindnextFileagain:
cmp cs:firstsearch,1
je first
add bx,32
cmp bx,cs:clusterSize
jb nopop
first:
mov di,offset bufferentry
push cs
pop es
mov bx,0
cmp cs:currentdir,0
jne notrootdir
cmp cs:firstsearch,1
je noaddfirst1
inc cx
noaddfirst1:
add cx,cs:adressparent
mov al,myboot.sectorspercluster
readroot:
call readsector
jc notwell
add di,myboot.sectorsize
dec al
jnz readroot
sub cx,cs:adressparent
jmp nopop
notrootdir:
cmp cs:firstsearch,1
je noaddfirst2
call getfat
noaddfirst2:
jc notwell
call readcluster
jc notwell
nopop:
mov cs:firstsearch,0
mov si,offset bufferentry
add si,bx
cmp byte ptr cs:[si],0
je notwell
mov cs:entryplace,bx
mov cs:AdressDirectory,cx
cmp byte ptr cs:[si],0E5h
je findnextfileagain
cmp byte ptr cs:[si+fileattr],28h
je findnextfileagain
cmp byte ptr cs:[si+fileattr],0Fh
je findnextfileagain
clc
pop di es cx bx ax
ret
notwell:
stc
pop di es cx bx ax
ret
;=============READCLUSTER (Fonction 14)===============
;Lit le secteur CX et le met en es:di
;-> AH=14
;<- Flag Carry si erreur
;=====================================================
readcluster:
push ax bx cx dx di
mov ax,cx
mov bl,cs:myboot.sectorspercluster
xor bh,bh
mul bx
mov cx,ax
add cx,cs:addingvalue
readsectors:
call readsector
jc errorreadincluster
add di,cs:myboot.sectorsize
inc cx
dec bl
jnz readsectors
clc
pop di dx cx bx ax
ret
errorreadincluster:
stc
pop di dx cx bx ax
ret
;=============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
cmp cx,cs:lastread
jne gom
mov ax,es
cmp cs:lastseg,ax
jne gom
cmp di,cs:lastoff
jne gom
jmp done
gom:
mov cs:lastseg,ax
mov cs:lastoff,di
mov cs:LastRead,cx
mov ax,cx
xor dx,dx
div cs:myboot.SectorsPerTrack
inc dl
mov bl,dl
xor dx,dx
div cs:myboot.HeadsPerDrive
mov dh,cs:myboot.bootdrive
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
int 13h
jnc Done
dec SI
jnz TryAgain
Done:
pop si dx cx bx ax
ret
lastread dw 0
lastseg dw 0
lastoff dw 0
bufferread equ $
bufferFat equ $+2048
bufferentry equ $+2048+2048
loadinglist equ $+2048+2048+2048
end start

7
noyau/systeme.ini

@ -0,0 +1,7 @@
video.sys(47)
horloge.sys(8)
8259a.sys(50)
disque.sys(48)
souris.sys(74)
clavier.sys(9)
heure.sys(8)

3381
noyau/video.asm

File diff suppressed because it is too large Load Diff

4
noyau/write.bat

@ -1,4 +0,0 @@
@echo off
cd ..
setup
cd sources

67
outils/exe2boot.asm

@ -1,67 +0,0 @@
.model tiny
.486
smart
.code
org 0100h
start:
jmp transform
NameBoot db 'Boot.exe',0
nameboot2 db 'Boot.bin',0
buffer db 510 dup (0)
dw 0AA55h
message db 0ah,0dh,'Transformation of boot.com to boot.bin...',0ah,0dh,'By Nico',0ah,0dh,'Copyright 2000',0ah,0dh,'$'
ok db 0ah,0dh,'The transformation was done succefully !',0ah,0dh,'$'
errormsg db 0ah,0dh,'Some errors has been detected !',0ah,0dh,'$'
transform:
mov ah,09
mov dx,offset message
int 21h
mov ax,3D00h
mov dx,offset nameboot
int 21h
jc error
mov bx,ax
mov ax,4202h
xor cx,cx
xor dx,dx
int 21h
jc error
cmp dx,0
jne error
mov ax,4200h
xor cx,cx
mov dx,7E00h
int 21h
jc error
mov ah,3fh
mov cx,512
mov dx,offset buffer
int 21h
jc error
mov ah,3eh
int 21h
jc error
mov ah,3ch
xor cx,cx
mov dx,offset nameboot2
int 21h
jc error
mov ah,40h
mov cx,512
mov dx,offset buffer
int 21h
jc error
mov ah,09
mov dx,offset ok
int 21h
ret
error:
mov ah,09
mov dx,offset errormsg
int 21h
ret
end start

108
outils/rip.asm

@ -1,108 +0,0 @@
net segment
org 0100h
assume cs:net,ds:net
start:
jmp deb
taille dw 0
signe db 'rip'
signe2 db 64 dup (0)
p1 db '@'
p2 db '@'
min db 4
deb:
mov BL,DS:[0080h]
xor BH,BH
or BX,BX
mov byte ptr [0081h+BX],00h
mov AX,3D02h
mov DX,0082H
int 21h
mov bx,ax
mov ah,3fh
mov cx,0ffffh
mov dx,offset data
int 21h
mov taille,ax
mov ah,3eh
int 21h
mov si,82h
mov di,offset signe2
mov cx,64
rep movsb
mov di,offset signe2
mov cx,64
mov al,2eh
repne scasb
push di
mov si,di
mov di,offset data
add di,taille
mov cx,3
rep movsb
mov ax,di
pop di
mov cx,3
mov si,offset signe
rep movsb
mov di,ax
mov cx,taille
mov si,offset data
mov dx,1
boucle:
lodsb
cmp al,[si]
jne pas
inc dl
loop boucle
jmp fin
pas:
cmp dl,min
jb suite
cmp dl,1
jne go
suite:
mov bx,cx
mov cx,dx
rep stosb
mov cx,bx
mov dl,1
loop boucle
jmp fin
go:
mov ah,al
mov al,p1
stosb
mov al,dl
stosb
mov al,ah
stosb
mov al,p2
stosb
mov dl,1
loop boucle
fin:
mov ah,3ch
mov cx,0
mov dx,offset signe2
int 21h
mov bx,ax
mov ah,40h
mov cx,di
sub cx,offset data
sub cx,taille
mov dx,offset data
add dx,taille
int 21h
mov ah,3eh
int 21h
mov ah,41h
mov dx,82h
int 21h
ret
data db 0
net ends
end start
net

88
outils/unrip.asm

@ -1,88 +0,0 @@
net segment
org 0100h
assume cs:net,ds:net
start:
jmp deb
taille dw 0
signe2 db 64 dup (0)
p1 db '@'
p2 db '@'
deb:
mov BL,DS:[0080h]
xor BH,BH
or BX,BX
mov byte ptr [0081h+BX],00h
mov AX,3D02h
mov DX,0082H
int 21h
mov bx,ax
mov ah,3fh
mov cx,0ffffh
mov dx,offset data
int 21h
mov taille,ax
mov ah,3eh
int 21h
mov si,82h
mov di,offset signe2
mov cx,64
rep movsb
mov di,offset signe2
mov cx,64
mov al,2eh
repne scasb
mov si,offset data
mov cx,3
rep movsb
mov cx,taille
mov di,offset data
add di,taille
mov dx,1
boucle:
lodsb
cmp al,p1
je pas
suite:
stosb
loop boucle
jmp fin
pas:
mov al,p2
cmp [si+2],al
jne suite
lodsb
mov bx,cx
mov cl,al
xor ch,ch
lodsb
rep stosb
mov cx,bx
sub cx,3
inc si
loop boucle
fin:
mov ah,3ch
mov cx,0
mov dx,offset signe2
int 21h
mov bx,ax
mov ah,40h
mov cx,di
sub cx,offset data
sub cx,taille
mov dx,offset data
add dx,taille
int 21h
mov ah,3eh
int 21h
mov ah,41h
mov dx,82h
int 21h
ret
data db 0
net ends
end start
net

57
programs/MAKEFILE

@ -0,0 +1,57 @@
lnk_boot = tlink /x
asm= tasm /t/m5/zi
lnk= tlink /x/t
all: detect.exe editeur.exe gestion.exe logo.exe pmode.exe souris.exe test.exe verifier.exe volume.exe
detect.exe: detect.asm
$(asm) detect
$(lnk) detect
ren detect.com detect.exe
editeur.exe: editeur.asm
$(asm) editeur
$(lnk) editeur
ren editeur.com editeur.exe
gestion.exe: gestion.asm
$(asm) gestion
$(lnk) gestion
ren gestion.com gestion.exe
logo.exe: logo.asm
$(asm) logo
$(lnk) logo
ren logo.com logo.exe
pmode.exe: pmode.asm
$(asm) pmode
$(lnk) pmode
ren pmode.com pmode.exe
souris.exe: souris.asm
$(asm) souris
$(lnk) souris
ren souris.com souris.exe
test.exe: test.asm
$(asm) test
$(lnk) test
ren test.com test.exe
verifier.exe: verifier.asm
$(asm) verifier
$(lnk) verifier
ren verifier.com verifier.exe
volume.exe: volume.asm
$(asm) volume
$(lnk) volume
ren volume.com volume.exe
clean:
del *.obj
del *.exe
del *.com
del *.sys
del *.err

54
programs/asm.bat

@ -1,54 +0,0 @@
@echo off
echo Assembling file %1...
..\util\tasm %1.asm /m5/x/t
if errorlevel 1 goto end
if "%1"=="boot" goto boot
echo Linking file %1...
..\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"=="mouse" goto system
if "%1"=="pic8259a" goto system
if "%1"=="timer" goto system
if "%1"=="drive" goto system
if "%1"=="joystick" goto system
if "%1"=="system" goto system
if "%1"=="setup" goto setup
copy %1.com ..\data\%1.exe>nul
goto end
:boot
echo Linking file %1...
..\util\tlink %1.obj /x
if errorlevel 1 goto end
echo Copying file %1...
..\util\exe2boot %1.exe
copy %1.bin ..\data\%1.bin>nul
goto end
:video
type thin8x8.fnt>>%1.com
:system
copy %1.com ..\data\%1.sys>nul
goto end
:setup
copy %1.com ..\%1.com>nul
goto end
:end
if not exist *.bin goto exes
del *.bin
:exes
if not exist *.exe goto coms
del *.exe
:coms
if not exist *.com goto objs
del *.com
:objs
if not exist *.obj goto nobjs
del *.obj
:nobjs

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save