First commit
This commit is contained in:
commit
62e1d36c38
23 files changed
+2501
No files matched your search
+342
@@ -0,0 +1,342 @@
|
||||
BITS 16
|
||||
vsfs_format_disk:
|
||||
; When SingOS it booted for the first time,
|
||||
; we have to format the disk to create the global structure
|
||||
; of the VSFS.
|
||||
pusha
|
||||
;AH 03h
|
||||
;AL Sectors To Write Count
|
||||
;CH Track
|
||||
;CL Sector
|
||||
;DH Head
|
||||
;DL Drive
|
||||
|
||||
; Set the es to point to the data segment,
|
||||
; this is the global segment, where we calculate all
|
||||
; our adresses from
|
||||
; ES:BX Buffer Address Pointer
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
|
||||
; Set the bx to point to the pointer of the sector we have to write
|
||||
; to the disk.
|
||||
mov bx, .vsfs_format_disk_buffer
|
||||
mov ah, 0x03 ;Write sectors to drive
|
||||
mov al, 0x01 ;Number of sectors to write (8 * 512 = 4096 bytes)
|
||||
mov cl, 0x01 ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov ch, 0x08
|
||||
mov dh, 0x00 ;Head number
|
||||
mov dl, [global_disk_identifier] ;Drive number
|
||||
int 0x13 ;Low level disk services
|
||||
|
||||
popa
|
||||
ret
|
||||
|
||||
.vsfs_format_disk_buffer db 'VSFS v0.1', 13, 10, '(VerySimpelFileSystem)', 13, 10, 'Developed to SingOS', 13, 10, 'by Jorn Guldberg', 13, 10, 0 ; 66 chars + 8 bytes
|
||||
times 431 db 0
|
||||
dw 8, 0, 9 ; Start index, number of files, next free index
|
||||
|
||||
vsfs_get_fs_info:
|
||||
pusha
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
mov bx, vsfs_loading_buffer
|
||||
|
||||
mov ah, 0x02 ; Read sectors from drive
|
||||
mov al, 0x01 ; Number of sectors to read (8 * 512 = 4096 bytes)
|
||||
mov ch, 0x08 ; cylinder
|
||||
mov cl, 0x01 ; First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov dh, 0x00 ; Head number
|
||||
mov dl, [global_disk_identifier] ; Drive number
|
||||
int 0x13
|
||||
|
||||
mov si, vsfs_loading_buffer
|
||||
call print
|
||||
popa
|
||||
ret
|
||||
|
||||
vsfs_read_file_index_in_ax:
|
||||
; INPUT ax = file index
|
||||
; INPUT bx = filebuffer
|
||||
pusha ; save all register state
|
||||
;call vsfs_convert_index_into_regs
|
||||
;mov bx, .buffer_for_svim
|
||||
push bx
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
pop bx
|
||||
|
||||
mov ch, al ; Low 8 bits of cylinder
|
||||
; the file index into ch, we need to calculatet this, if the number is larger than 16-bits
|
||||
mov ah, 0x02 ; Read sectors from drive
|
||||
mov al, 0x01 ; Number of sectors to read (8 * 512 = 4096 bytes)
|
||||
mov cl, 0x01 ; First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov dh, 0x00 ; Head number
|
||||
mov dl, [global_disk_identifier] ; Drive number
|
||||
int 0x13
|
||||
popa
|
||||
ret
|
||||
|
||||
|
||||
vsfs_write_file_to_index_in_ax:
|
||||
pusha ; save all register state
|
||||
;AH 03h
|
||||
;AL Sectors To Write Count
|
||||
;CH Track
|
||||
;CL Sector
|
||||
;DH Head
|
||||
;DL Drive
|
||||
;ES:BX Buffer Address Pointer
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
xor bx, bx
|
||||
;mov bx, .buffer_for_svim
|
||||
xor cx, cx
|
||||
xor ax, ax
|
||||
mov ah, 0x03 ;Write sectors to drive
|
||||
mov al, 0x01 ;Number of sectors to write (8 * 512 = 4096 bytes)
|
||||
mov cl, 0x03 ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov ch, 0x02
|
||||
mov dh, 0x01 ;Head number
|
||||
mov dl, [global_disk_identifier] ;Drive number
|
||||
int 0x13 ;Low level disk services
|
||||
popa
|
||||
ret
|
||||
|
||||
vsfs_convert_index_into_regs:
|
||||
; This function takes a file index in ax, do the calculations
|
||||
; to set the registers to the right place at the disk
|
||||
; CH Track
|
||||
; CL Sector
|
||||
; DH Head
|
||||
; The rest of the parameters is set in the read and write function.
|
||||
|
||||
ret
|
||||
|
||||
vsfs_create_file:
|
||||
; ax pointer to filename
|
||||
; bx size
|
||||
; cx fileIndex
|
||||
|
||||
pusha ; save all register state
|
||||
|
||||
mov si, .vsfs_create_file_type_filename
|
||||
call print
|
||||
|
||||
; Ask the user for the filename
|
||||
xor bx, bx
|
||||
xor cx, cx ; are going to be the counter
|
||||
xor dx, dx
|
||||
.enter_filename_loop:
|
||||
push cx
|
||||
mov ax, 0x10 ; BIOS call to wait for key
|
||||
int 0x16
|
||||
cmp ax, 0x1c0d ; enter key
|
||||
je .filename_done
|
||||
|
||||
cmp ax, 0x0e08 ; backspace
|
||||
jne .no_enter
|
||||
pop cx
|
||||
cmp cx, 0
|
||||
je .enter_filename_loop
|
||||
|
||||
sub cx, 1
|
||||
mov bx, .new_filename_buffer
|
||||
add bx, cx
|
||||
mov BYTE [bx], 0
|
||||
; Go back one space
|
||||
mov ax, 0x0e08 ; ah=0x0e means teletype output. al=0x08 means backspace character.
|
||||
int 0x10
|
||||
|
||||
; Place a NULL
|
||||
mov al, 0x0 ; NULL
|
||||
int 0x10
|
||||
|
||||
; Go back one space again as the above print of NULL pushes the cursor forward again.
|
||||
mov ax, 0x0e08
|
||||
int 0x10
|
||||
jmp .enter_filename_loop
|
||||
|
||||
.no_enter:
|
||||
mov bh, 0x00
|
||||
mov bl, 0x02
|
||||
mov ah, 0x0E
|
||||
int 0x10 ; print char
|
||||
pop cx
|
||||
mov bx, .new_filename_buffer
|
||||
add bx, cx
|
||||
mov [bx], al
|
||||
add cx, 1
|
||||
; filename must only be 120 chars
|
||||
cmp cx, 120
|
||||
jae .filename_done
|
||||
|
||||
jmp .enter_filename_loop
|
||||
|
||||
.filename_done:
|
||||
pop cx ; Cleanup, and now contain filename size
|
||||
mov bx, .new_filename_buffer
|
||||
add bx, cx
|
||||
mov BYTE [bx], 0
|
||||
call printCRLF
|
||||
|
||||
|
||||
; We first need to know the index for the file.
|
||||
; The next avaliable index are we going to get from the
|
||||
; FSinfo sctor of the disk:
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
|
||||
mov bx, vsfs_loading_buffer
|
||||
mov ch, 0x08 ; Low 8 bits of cylinder
|
||||
; the file index into ch, we need to calculatet this, if the number is larger than 16-bits
|
||||
mov ah, 0x02 ; Read sectors from drive
|
||||
mov al, 0x01 ; Number of sectors to read (8 * 512 = 4096 bytes)
|
||||
mov cl, 0x01 ; First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov dh, 0x00 ; Head number
|
||||
mov dl, [global_disk_identifier] ; Drive number
|
||||
int 0x13
|
||||
|
||||
mov ax, [vsfs_loading_buffer + 510]
|
||||
mov [.to_write_fileindex], ax
|
||||
|
||||
; We have to do modulo 4, to know where in the sector the
|
||||
; file entry has to be written
|
||||
add DWORD [vsfs_loading_buffer + 510], 1
|
||||
add DWORD [vsfs_loading_buffer + 508], 1
|
||||
|
||||
mov bx, vsfs_loading_buffer
|
||||
mov ah, 0x03 ;Write sectors to drive
|
||||
mov al, 0x01 ;Number of sectors to write (8 * 512 = 4096 bytes)
|
||||
mov cl, 0x01 ;First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov ch, 0x08
|
||||
mov dh, 0x00 ;Head number
|
||||
mov dl, [global_disk_identifier] ;Drive number
|
||||
int 0x13 ;Low level disk services
|
||||
|
||||
; Now we have the index in ax.
|
||||
|
||||
;AH 03h
|
||||
;AL Sectors To Write Count
|
||||
;CH Track
|
||||
;CL Sector
|
||||
;DH Head
|
||||
;DL Drive
|
||||
|
||||
; Set the es to point to the data segment,
|
||||
; this is the global segment, where we calculate all
|
||||
; our adresses from
|
||||
; ES:BX Buffer Address Pointer
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
|
||||
mov bx, [.to_write_fileindex]
|
||||
sub bx, 0x07 ; Det skal den bare
|
||||
mov cl, bl ; First sector to write (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
; Set the bx to point to the pointer of the sector we have to write
|
||||
; to the disk.
|
||||
mov bx, .new_filename_buffer
|
||||
mov ah, 0x03 ;Write sectors to drive
|
||||
mov al, 0x01 ;Number of sectors to write (8 * 512 = 4096 bytes)
|
||||
mov ch, 0x08
|
||||
mov dh, 0x00 ;Head number
|
||||
mov dl, [global_disk_identifier] ;Drive number
|
||||
int 0x13 ;Low level disk services
|
||||
popa
|
||||
ret
|
||||
|
||||
.vsfs_create_file_type_filename db 'Enter filename: ', 0
|
||||
.new_filename_buffer times 122 db 0
|
||||
.new_file_size dw 0, 0
|
||||
.to_write_fileindex dw 0
|
||||
|
||||
vsfs_list_files_command:
|
||||
; This function takes the adress of the first sector of the disk
|
||||
; which the OS has to know
|
||||
; the adress is given by ax
|
||||
|
||||
; Check which registers to save
|
||||
pusha
|
||||
|
||||
; Load the master table into memory
|
||||
;mov ax, 8 ; file index for master record
|
||||
;mov bx, vsfs_loading_buffer ; pointer to the input buffer
|
||||
;call vsfs_read_file_index_in_ax ; call the fucntion which read the master record
|
||||
; TODO we might want this to be in memory at all times
|
||||
; loaded already from boot
|
||||
|
||||
mov bx, ds
|
||||
mov es, bx
|
||||
|
||||
mov si, .ls_header
|
||||
call print
|
||||
|
||||
mov si, .seperate_line
|
||||
call print
|
||||
|
||||
mov BYTE [.ls_counter], 1
|
||||
.load_next_fileinfo:
|
||||
add BYTE [.ls_counter], 1
|
||||
mov bl, [.ls_counter]
|
||||
mov cl, bl ; First sector to read (bits 0-5), upper bits of cylinder (bits 6-7)
|
||||
mov bx, vsfs_loading_buffer
|
||||
;mov ch, al ; Low 8 bits of cylinder
|
||||
; the file index into ch, we need to calculatet this, if the number is larger than 16-bits
|
||||
mov ah, 0x02 ; Read sectors from drive
|
||||
mov al, 0x01 ; Number of sectors to read (8 * 512 = 4096 bytes)
|
||||
mov ch, 0x08 ; cylinder
|
||||
mov dh, 0x00 ; Head number
|
||||
mov dl, [global_disk_identifier] ; Drive number
|
||||
int 0x13
|
||||
|
||||
mov ax, [vsfs_loading_buffer + 126]
|
||||
mov bx, ax
|
||||
mov cx, ' '
|
||||
mov dx, 'X'
|
||||
|
||||
cmp ax, 0
|
||||
je .end_ls
|
||||
cmp ax, 10
|
||||
ja .index_over_10
|
||||
mov [.fileentry_line + 3 ], cx
|
||||
mov [.fileentry_line + 4 ], cx
|
||||
add bx, 48 ; get ascii value
|
||||
mov [.fileentry_line + 5 ], bl
|
||||
jmp .stop_index
|
||||
.index_over_10:
|
||||
cmp ax, 10
|
||||
ja .index_over_100
|
||||
mov [.fileentry_line + 3 ], cx
|
||||
mov [.fileentry_line + 4 ], dx
|
||||
mov [.fileentry_line + 5 ], dx
|
||||
jmp .stop_index
|
||||
|
||||
.index_over_100:
|
||||
mov [.fileentry_line + 3 ], dx
|
||||
mov [.fileentry_line + 4 ], dx
|
||||
mov [.fileentry_line + 5 ], dx
|
||||
|
||||
|
||||
.stop_index:
|
||||
|
||||
mov si, .fileentry_line ; printing the buffer
|
||||
call print
|
||||
mov si, vsfs_loading_buffer ; printing the buffer
|
||||
call print
|
||||
|
||||
call printCRLF
|
||||
mov si, .seperate_line
|
||||
|
||||
call print
|
||||
jmp .load_next_fileinfo
|
||||
|
||||
.end_ls:
|
||||
popa
|
||||
ret
|
||||
|
||||
.ls_counter db 0
|
||||
.ls_header db 'List of files:', 13, 10, 'Index | Filename ', 13, 10, 0
|
||||
.seperate_line db '- - - - - - - - - - - - - - - - ', 13, 10, 0
|
||||
.fileentry_line db ' 456 | ', 0
|
||||
|
||||
vsfs_loading_buffer times 512 db 0
|
||||
Reference in new issue
Block a user