Small operating system made in assembly language
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

676 lines
10 KiB

.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<EFBFBD>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<EFBFBD>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<EFBFBD>re syst<EFBFBD>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<EFBFBD>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<EFBFBD>',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