2001-02-18 21:48:09 +01:00
.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 0 D , 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
dt a db 43 dup ( 0 )
copycos:
2001-02-25 21:48:09 +01:00
mov ah , 4ah
mov bx , 1000h
int 21h
jc error
mov ah , 48h
mov bx , 65536 / 16
int 21h
jc error
mov fs , ax
2001-02-18 21:48:09 +01:00
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 al lboot
int 21h
jc error
mov dx , offset boot
call addfile
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
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
mov ah , 4fh
int 21h
jnc al lfile
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:
2001-02-25 21:48:09 +01:00
push ax bx dx si di bp ds es
2001-02-18 21:48:09 +01:00
mov cx , 1
mov bx , offset fat
call readsector
jc error2
mov ax , 3D00h
int 21h
jc error2
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
2001-02-25 21:48:09 +01:00
push fs
pop ds
push fs
pop es
2001-02-18 21:48:09 +01:00
mov ah , 3fh
2001-02-25 21:48:09 +01:00
mov cx , 0FFFFh
xor dx , dx
2001-02-18 21:48:09 +01:00
int 21h
2001-02-25 21:48:09 +01:00
push cs
pop ds
2001-02-18 21:48:09 +01:00
jc error2
mov si , - 2
mov di , 0
2001-02-25 21:48:09 +01:00
xor bx , bx
2001-02-18 21:48:09 +01:00
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
2001-02-25 21:48:09 +01:00
push cs
pop es
2001-02-18 21:48:09 +01:00
call writesector
mov cx , entrie
end1:
2001-02-25 21:48:09 +01:00
pop es ds bp di si dx bx ax
2001-02-18 21:48:09 +01:00
ret
entrie dw 0
error2:
stc
jmp end1
makefit:
push bx cx si di bp
mov ax , cx
mov bx , offset fat
mov cx , 13
call readsector
jc error3
xor si , si
findfit:
cmp byte ptr [ si + bx ], 0
je finishfit
add si , 32
cmp si , 512
jb findfit
jmp error3
finishfit:
mov di , si
add di , bx
mov si , dx
call asciiztofit
jc error3
mov [ di + 26 ], ax
mov cx , 13
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 Di skSectorsPerTrack
mov CL , DL ;{ Set the sector }
and CL , 63 ;{ Top two bits are bits 8&9 of the cylinder }
xor DX , DX
div Di skTracksPerHead
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 Di skHeads
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 si gn
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 : Di skSectorsPerTrack
mov CL , DL ;{ Set the sector }
and CL , 63 ;{ Top two bits are bits 8&9 of the cylinder }
xor DX , DX
div cs : Di skTracksPerHead
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 : Di skHeads
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<63> re syst<73> 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<63> 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