457 lines
7.2 KiB
NASM
Executable File
457 lines
7.2 KiB
NASM
Executable File
.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<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
|