Compare commits
22
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07e9095582 | ||
|
|
72769fbef7 | ||
|
|
95599c0e7c | ||
|
|
fcaafa0d12 | ||
|
|
e490b95f1d | ||
|
|
b601080960 | ||
|
|
27177979a2 | ||
|
|
f88a282893 | ||
|
|
ff4c597ff3 | ||
|
|
24c371cab1 | ||
|
|
7588a4c9cb | ||
|
|
5cb415c76b | ||
|
|
118d8b0c03 | ||
|
|
28caca3bcc | ||
|
|
6476a774dc | ||
|
|
e791edb02a | ||
|
|
da36f6fabb | ||
|
|
97e1a18253 | ||
|
|
88a850e8fc | ||
|
|
10c9194c5f | ||
|
|
94b477d8f7 | ||
|
|
ba38f4fd19 |
No files matched your search
-52
@@ -1,52 +0,0 @@
|
|||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: build-image
|
|
||||||
image: plugins/docker
|
|
||||||
settings:
|
|
||||||
repo: t3hn3rd/asuro-build
|
|
||||||
tags: latest
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
registry: docker.io
|
|
||||||
username:
|
|
||||||
from_secret: docker_username
|
|
||||||
password:
|
|
||||||
from_secret: docker_password
|
|
||||||
|
|
||||||
- name: compile
|
|
||||||
image: t3hn3rd/asuro-build:latest
|
|
||||||
depends_on:
|
|
||||||
- build-image
|
|
||||||
commands:
|
|
||||||
- git fetch --tags
|
|
||||||
- find . -type f -print0 | xargs -0 dos2unix
|
|
||||||
- chmod +x /drone/src/*.sh
|
|
||||||
- /drone/src/compile.sh
|
|
||||||
|
|
||||||
- name: upload-iso-artifact
|
|
||||||
image: alpine/git
|
|
||||||
depends_on:
|
|
||||||
- compile
|
|
||||||
when:
|
|
||||||
branch:
|
|
||||||
- master
|
|
||||||
environment:
|
|
||||||
GITEA_TOKEN:
|
|
||||||
from_secret: gitea_token
|
|
||||||
commands:
|
|
||||||
- apk add --no-cache curl
|
|
||||||
- chmod +w Asuro.iso
|
|
||||||
- cp Asuro.iso "Asuro-$(git rev-parse --short HEAD).iso"
|
|
||||||
- echo "Uploading Asuro-$(git rev-parse --short HEAD).iso to Gitea Packages..."
|
|
||||||
- |
|
|
||||||
curl -X PUT "https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/$(git rev-parse --short HEAD)/Asuro.iso" \
|
|
||||||
-H "Authorization: token $GITEA_TOKEN" --upload-file "Asuro-$(git rev-parse --short HEAD).iso"
|
|
||||||
- echo "Updating latest ISO reference..."
|
|
||||||
- |
|
|
||||||
curl -X DELETE https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/latest/Asuro.iso \
|
|
||||||
-H "Authorization: token $GITEA_TOKEN" || echo "No previous latest version found."
|
|
||||||
- |
|
|
||||||
curl -X PUT https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/latest/Asuro.iso \
|
|
||||||
-H "Authorization: token $GITEA_TOKEN" --upload-file "Asuro-$(git rev-parse --short HEAD).iso"
|
|
||||||
@@ -10,4 +10,3 @@
|
|||||||
/*.sh~
|
/*.sh~
|
||||||
/*.img
|
/*.img
|
||||||
src/include/asuro.pas
|
src/include/asuro.pas
|
||||||
localenv.json
|
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
stages:
|
||||||
|
- Compile Versions
|
||||||
|
- Compile Sources
|
||||||
|
- Link
|
||||||
|
- Generate Documentation
|
||||||
|
- Deploy
|
||||||
|
|
||||||
|
cache:
|
||||||
|
- key: ${CI_COMMIT_REF_SLUG}
|
||||||
|
paths:
|
||||||
|
- lib/*.o
|
||||||
|
- bin/kernel.bin
|
||||||
|
- doc
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- chmod +x *.sh
|
||||||
|
|
||||||
|
versions:
|
||||||
|
stage: Compile Versions
|
||||||
|
script:
|
||||||
|
- ./compile_vergen.sh
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- release/*.svg
|
||||||
|
- src/include/asuro.pas
|
||||||
|
|
||||||
|
compile_sources:
|
||||||
|
stage: Compile Sources
|
||||||
|
script:
|
||||||
|
- rm -f lib/*.so
|
||||||
|
- ./compile_sources.sh
|
||||||
|
needs:
|
||||||
|
- versions
|
||||||
|
|
||||||
|
link:
|
||||||
|
stage: Link
|
||||||
|
script:
|
||||||
|
- ./compile_stub.sh
|
||||||
|
- ./compile_link.sh
|
||||||
|
needs:
|
||||||
|
- versions
|
||||||
|
- compile_sources
|
||||||
|
|
||||||
|
isogen:
|
||||||
|
stage: Deploy
|
||||||
|
script:
|
||||||
|
- ./compile_isogen.sh
|
||||||
|
- ./compile_sumgen.sh
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- ./Asuro.iso
|
||||||
|
- ./release/checksum.svg
|
||||||
|
needs:
|
||||||
|
- link
|
||||||
|
|
||||||
|
docgen:
|
||||||
|
stage: Generate Documentation
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
script:
|
||||||
|
- ./compile_sourcelist.sh
|
||||||
|
- ./compile_docs.sh
|
||||||
|
# Remove comments when we want to use gitlab pages.
|
||||||
|
#- cp doc public
|
||||||
|
allow_failure: true
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- doc
|
||||||
|
#- public/*
|
||||||
|
#- ./sources.list
|
||||||
|
needs:
|
||||||
|
- versions
|
||||||
Vendored
+1
-1
@@ -6,7 +6,7 @@
|
|||||||
"type": "PowerShell",
|
"type": "PowerShell",
|
||||||
"preLaunchTask": "Build",
|
"preLaunchTask": "Build",
|
||||||
"script": "${workspaceFolder}/virtualbox-wrapper.ps1",
|
"script": "${workspaceFolder}/virtualbox-wrapper.ps1",
|
||||||
"args": ["-Command", "up"],
|
"args": ["-MachineName", "7d395c96-891c-4139-b77d-9b6b144b0b93"],
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Vendored
+2
-24
@@ -9,18 +9,14 @@
|
|||||||
"command": "docker-compose",
|
"command": "docker-compose",
|
||||||
"args": [
|
"args": [
|
||||||
"run",
|
"run",
|
||||||
"builder",
|
"builder"
|
||||||
],
|
],
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"problemMatcher": [],
|
"problemMatcher": [],
|
||||||
"group": {
|
"group": {
|
||||||
"kind": "build",
|
"kind": "build",
|
||||||
"isDefault": true
|
"isDefault": true
|
||||||
},
|
}
|
||||||
"dependsOn": [
|
|
||||||
"Close VirtualBox",
|
|
||||||
"Clean"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Build (Builder)",
|
"label": "Build (Builder)",
|
||||||
@@ -30,24 +26,6 @@
|
|||||||
"builder"
|
"builder"
|
||||||
],
|
],
|
||||||
"type": "shell"
|
"type": "shell"
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Clean",
|
|
||||||
"command": "docker-compose",
|
|
||||||
"args": [
|
|
||||||
"down",
|
|
||||||
"--remove-orphans"
|
|
||||||
],
|
|
||||||
"type": "shell"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Close VirtualBox",
|
|
||||||
"command": "./virtualbox-wrapper.ps1",
|
|
||||||
"args": [
|
|
||||||
"-Command",
|
|
||||||
"down"
|
|
||||||
],
|
|
||||||
"type": "shell"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
+1
-1
@@ -16,7 +16,7 @@ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSIO
|
|||||||
|
|
||||||
COPY compile.sh /compile.sh
|
COPY compile.sh /compile.sh
|
||||||
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
|
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
|
||||||
RUN chmod +x /usr/bin/semver
|
RUN mkdir /code && chmod +x /usr/bin/semver
|
||||||
WORKDIR /code
|
WORKDIR /code
|
||||||
RUN find . -type f -print0 | xargs -0 dos2unix
|
RUN find . -type f -print0 | xargs -0 dos2unix
|
||||||
ENTRYPOINT ["/bin/bash", "-c"]
|
ENTRYPOINT ["/bin/bash", "-c"]
|
||||||
|
|||||||
+14
-18
@@ -20,30 +20,26 @@ runOrFail() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
declare -a run_steps=(
|
runOrFail $(pwd)/compile_stub.sh "Failed to compile stub!"
|
||||||
"compile_stub.sh" "Failed to compile stub!"
|
|
||||||
"compile_vergen.sh" "Versions failed to compile"
|
|
||||||
"compile_sources.sh" "Failed to compile FPC Sources!"
|
|
||||||
"compile_link.sh" "Failed linking!"
|
|
||||||
"compile_isogen.sh" "Failed to create ISO!"
|
|
||||||
)
|
|
||||||
|
|
||||||
for ((i=0; i<${#run_steps[@]}; i+=2))
|
#Generate .pas with versioning headers.
|
||||||
do
|
runOrFail $(pwd)/compile_vergen.sh "Versions failed to compile"
|
||||||
if [ "$ERRCOUNT" -eq "0" ]
|
|
||||||
then
|
#Compile all .pas sources
|
||||||
script=$(pwd)/"${run_steps[$i]}"
|
runOrFail $(pwd)/compile_sources.sh "Failed to compile FPC Sources!"
|
||||||
message="${run_steps[$i+1]}"
|
|
||||||
runOrFail "$script" "$message"
|
#Link into a binary.
|
||||||
fi
|
runOrFail $(pwd)/compile_link.sh "Failed linking!"
|
||||||
done
|
|
||||||
|
#Generate an ISO with GRUB as the Bootloader.
|
||||||
|
runOrFail ./compile_isogen.sh "Failed to create ISO!"
|
||||||
|
|
||||||
#Call generate final artifacts based on failure or success of the above.
|
#Call generate final artifacts based on failure or success of the above.
|
||||||
if [ "$ERRCOUNT" -ne "0" ]
|
if [ "$ERRCOUNT" -ne "0" ]
|
||||||
then
|
then
|
||||||
. ./compile_finish.sh "failed"
|
./compile_finish.sh "failed"
|
||||||
else
|
else
|
||||||
. ./compile_finish.sh "success"
|
./compile_finish.sh "success"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
+1
-1
@@ -4,4 +4,4 @@ echo "======================="
|
|||||||
echo " "
|
echo " "
|
||||||
echo "Compiling FPC Sources..."
|
echo "Compiling FPC Sources..."
|
||||||
echo " "
|
echo " "
|
||||||
fpc -Aelf -gw -g -gl -n -vlewn -O3 -Op3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* src/kernel.pas
|
fpc -Aelf -gw -n -va -O3 -Op3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* src/kernel.pas
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#Flat filesystem
|
||||||
|
|
||||||
|
A super simple filesystem for asuro. Folders are emulated in filenames.
|
||||||
|
|
||||||
|
Starts with disk info sector, sector 0 of volume
|
||||||
|
|
||||||
|
---
|
||||||
|
#### disk info
|
||||||
|
|
||||||
|
jmp2boot : ubit24;
|
||||||
|
OEMName : array[0..7] of char;
|
||||||
|
version : uint16 // numerical version of filesystem
|
||||||
|
sectorCount : uint16;
|
||||||
|
fileCount : uint16
|
||||||
|
signature : uint32 = 0x0B00B1E5
|
||||||
|
|
||||||
|
|
||||||
|
the Rest of the sector is reserved
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Starting from sector 1 is the file table. Table size is determined by entry size (64) * fileCount
|
||||||
|
|
||||||
|
---
|
||||||
|
####File entry
|
||||||
|
|
||||||
|
name : array[0..59] of char //file name max 60 chars
|
||||||
|
fileStart : 16bit // start sector of data
|
||||||
|
fileSize : 16bit // data size in sectors
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
version: "3.9"
|
||||||
services:
|
services:
|
||||||
builder:
|
builder:
|
||||||
build: .
|
build: .
|
||||||
|
|||||||
+1
-2
@@ -2,7 +2,7 @@ ENTRY(loader)
|
|||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = 0xC0100000;
|
. = 0xC0100000;
|
||||||
kernel_start = .;
|
|
||||||
.text : AT(ADDR(.text) - 0xC0000000)
|
.text : AT(ADDR(.text) - 0xC0000000)
|
||||||
{
|
{
|
||||||
text = .; _text = .; __text = .;
|
text = .; _text = .; __text = .;
|
||||||
@@ -33,5 +33,4 @@ SECTIONS
|
|||||||
. = ALIGN(4096);
|
. = ALIGN(4096);
|
||||||
}
|
}
|
||||||
end = .; _end = .; __end = .;
|
end = .; _end = .; __end = .;
|
||||||
kernel_end = .;
|
|
||||||
}
|
}
|
||||||
@@ -50,26 +50,23 @@ We welcome everyone to give building/breaking/fixing/shooting Asuro a go, feel f
|
|||||||
```xml
|
```xml
|
||||||
<Machine uuid="{7d395c96-891c-4139-b77d-9b6b144b0b93}" name="Asuro" OSType="Linux" snapshotFolder="Snapshots" lastStateChange="2021-06-20T20:33:07Z">
|
<Machine uuid="{7d395c96-891c-4139-b77d-9b6b144b0b93}" name="Asuro" OSType="Linux" snapshotFolder="Snapshots" lastStateChange="2021-06-20T20:33:07Z">
|
||||||
```
|
```
|
||||||
Copy the uuid, in our case `7d395c96-891c-4139-b77d-9b6b144b0b93` & create a `localenv.json` file in the project root with the following content:
|
Copy the uuid, in our case `7d395c96-891c-4139-b77d-9b6b144b0b93` and replace the uuid found in `.vscode\launch.json` under `args`, so that it looks something like this:
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"VirtualBox":{
|
"configurations": [
|
||||||
"MachineName":"<YOUR_UUID_OR_MACHINE_NAME>"
|
{
|
||||||
|
"name":"Run",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "PowerShell",
|
||||||
|
"preLaunchTask": "Build",
|
||||||
|
"script": "${workspaceFolder}/virtualbox-wrapper.ps1",
|
||||||
|
"args": ["-MachineName", "7d395c96-891c-4139-b77d-9b6b144b0b93"],
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
}
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
This will allow VSCode to automatically launch VirtualBox once Asuro has been compiled.
|
This will allow VSCode to automatically launch VirtualBox once Asuro has been compiled.
|
||||||
|
|
||||||
You can also enable the serial adapter "COM1" in mode "Raw File", give it a path, and provide this path in the `localenv.json` as follows:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"VirtualBox" : {
|
|
||||||
"MachineName": "<YOUR_UUID_OR_MACHINE_NAME>",
|
|
||||||
"LogLocation": "Fully\\Qualified\\Path\\To\\Your\\Log\\File"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
This will allow you to see the console output from Asuro in your host terminal.
|
|
||||||
13. Open your project folder in VSCode, use CTRL+SHIFT+B to build & F5 to build + run in VBox.
|
13. Open your project folder in VSCode, use CTRL+SHIFT+B to build & F5 to build + run in VBox.
|
||||||
14. Congratulations! You can now play with Asuro!
|
14. Congratulations! You can now play with Asuro!
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -1776,15 +1776,14 @@ var
|
|||||||
fb: puint32;
|
fb: puint32;
|
||||||
|
|
||||||
Begin
|
Begin
|
||||||
Ready:= False;
|
|
||||||
fb:= puint32(uint32(multibootinfo^.framebuffer_addr));
|
fb:= puint32(uint32(multibootinfo^.framebuffer_addr));
|
||||||
Console_Properties.Width:= multibootinfo^.framebuffer_width;
|
Console_Properties.Width:= multibootinfo^.framebuffer_width;
|
||||||
Console_Properties.Height:= multibootinfo^.framebuffer_height;
|
Console_Properties.Height:= multibootinfo^.framebuffer_height;
|
||||||
Console_Properties.BitsPerPixel:= multibootinfo^.framebuffer_bpp;
|
Console_Properties.BitsPerPixel:= multibootinfo^.framebuffer_bpp;
|
||||||
Console_Properties.MAX_CELL_X:= (Console_Properties.Width div 8) - 1;
|
Console_Properties.MAX_CELL_X:= (Console_Properties.Width div 8) - 1;
|
||||||
Console_Properties.MAX_CELL_Y:= (Console_Properties.Height div 16) - 1;
|
Console_Properties.MAX_CELL_Y:= (Console_Properties.Height div 16) - 1;
|
||||||
If Console_Properties.BitsPerPixel <> 16 then begin
|
If Console_Properties.BitsPerPixel <> 16 then while true do begin
|
||||||
exit;
|
|
||||||
end;
|
end;
|
||||||
kpalloc(uint32(fb));
|
kpalloc(uint32(fb));
|
||||||
keyboard.hook(@keyhook);
|
keyboard.hook(@keyhook);
|
||||||
|
|||||||
-23
@@ -291,28 +291,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure enableAVX();
|
|
||||||
begin
|
|
||||||
if CPUID.Capabilities1^.AVX then begin
|
|
||||||
asm
|
|
||||||
PUSH EAX
|
|
||||||
PUSH ECX
|
|
||||||
PUSH EDX
|
|
||||||
XOR ECX, ECX
|
|
||||||
db $0F
|
|
||||||
db $01
|
|
||||||
db $D0
|
|
||||||
OR EAX, 7
|
|
||||||
db $0F
|
|
||||||
db $01
|
|
||||||
db $D1
|
|
||||||
POP EDX
|
|
||||||
POP ECX
|
|
||||||
POP EAX
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.');
|
terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.');
|
||||||
@@ -322,7 +300,6 @@ begin
|
|||||||
getCPUCapabilities;
|
getCPUCapabilities;
|
||||||
getCPUClockSpeed;
|
getCPUClockSpeed;
|
||||||
enableSSE;
|
enableSSE;
|
||||||
enableAVX;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -21,7 +21,9 @@ uses
|
|||||||
lmemorymanager,
|
lmemorymanager,
|
||||||
storagemanagement,
|
storagemanagement,
|
||||||
strings,
|
strings,
|
||||||
tracer;
|
tracer,
|
||||||
|
drivemanager,
|
||||||
|
storagetypes;
|
||||||
|
|
||||||
type
|
type
|
||||||
TPortMode = (P_READ, P_WRITE);
|
TPortMode = (P_READ, P_WRITE);
|
||||||
@@ -267,6 +269,7 @@ var
|
|||||||
slaveDevice : TStorage_Device;
|
slaveDevice : TStorage_Device;
|
||||||
buffer : puint8;
|
buffer : puint8;
|
||||||
i : uint8;
|
i : uint8;
|
||||||
|
test : PStorage_device;
|
||||||
begin
|
begin
|
||||||
push_trace('ide.load');
|
push_trace('ide.load');
|
||||||
console.writestringln('[IDE] (LOAD) BEGIN');
|
console.writestringln('[IDE] (LOAD) BEGIN');
|
||||||
@@ -288,14 +291,15 @@ begin
|
|||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
masterDevice.hpc:= uint32(IDEDevices[0].info[3] DIV IDEDevices[0].info[1]);
|
// masterDevice.hpc:= uint32(IDEDevices[0].info[3] DIV IDEDevices[0].info[1]); //TODO wtf is hpc
|
||||||
|
|
||||||
masterDevice.sectorSize:= 512;
|
masterDevice.sectorSize:= 512;
|
||||||
if masterDevice.maxSectorCount <> 0 then begin
|
if masterDevice.maxSectorCount <> 0 then begin
|
||||||
IDEDevices[0].exists:= true;
|
IDEDevices[0].exists:= true;
|
||||||
masterDevice.readCallback:= @dread;
|
masterDevice.readCallback:= @dread;
|
||||||
masterDevice.writeCallback:= @dwrite;
|
masterDevice.writeCallback:= @dwrite;
|
||||||
storagemanagement.register_device(@masterDevice);
|
// storagemanagement.register_device(@masterDevice);
|
||||||
|
drivemanager.register_device(@masterDevice);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
@@ -330,10 +334,14 @@ var
|
|||||||
device: uint8;
|
device: uint8;
|
||||||
data: uint16;
|
data: uint16;
|
||||||
begin
|
begin
|
||||||
|
push_trace('IDE.readPIO28');
|
||||||
|
|
||||||
if not validate_28bit_address(LBA) then begin
|
if not validate_28bit_address(LBA) then begin
|
||||||
console.writestringln('IDE (writePIO28) ERROR: Invalid LBA!');
|
console.writestringln('IDE (writePIO28) ERROR: Invalid LBA!');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// push_trace('IDE.readPIO28.2');
|
||||||
|
|
||||||
//Add last 4 bits of LBA to device port
|
//Add last 4 bits of LBA to device port
|
||||||
if IDEDevices[drive].isMaster then begin
|
if IDEDevices[drive].isMaster then begin
|
||||||
device:= ATA_DEVICE_MASTER;
|
device:= ATA_DEVICE_MASTER;
|
||||||
@@ -344,6 +352,8 @@ begin
|
|||||||
device_select($F0 or ((LBA and $0F000000) shr 24)); //LBA primary slave
|
device_select($F0 or ((LBA and $0F000000) shr 24)); //LBA primary slave
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// push_trace('IDE.readPIO28.3');
|
||||||
|
|
||||||
no_interrupt(device);
|
no_interrupt(device);
|
||||||
port_write(ATA_REG_ERROR, 0);
|
port_write(ATA_REG_ERROR, 0);
|
||||||
|
|
||||||
@@ -353,6 +363,8 @@ begin
|
|||||||
port_write(ATA_REG_LBA1, (LBA and $0000FF00) shr 8);
|
port_write(ATA_REG_LBA1, (LBA and $0000FF00) shr 8);
|
||||||
port_write(ATA_REG_LBA2, (LBA and $00FF0000) shr 16);
|
port_write(ATA_REG_LBA2, (LBA and $00FF0000) shr 16);
|
||||||
|
|
||||||
|
// push_trace('IDE.readPIO28.4');
|
||||||
|
|
||||||
//send read command
|
//send read command
|
||||||
port_write(ATA_REG_COMMAND, ATA_CMD_READ_PIO);
|
port_write(ATA_REG_COMMAND, ATA_CMD_READ_PIO);
|
||||||
if not is_ready() then exit;
|
if not is_ready() then exit;
|
||||||
@@ -368,6 +380,8 @@ begin
|
|||||||
|
|
||||||
i:= i + 2;
|
i:= i + 2;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// push_trace('IDE.readPIO28.5');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure writePIO28(drive : uint8; LBA : uint32; buffer : puint8);
|
procedure writePIO28(drive : uint8; LBA : uint32; buffer : puint8);
|
||||||
@@ -430,8 +444,10 @@ procedure dread(device : PStorage_device; LBA : uint32; sectorCount : uint32; bu
|
|||||||
var
|
var
|
||||||
i : uint16;
|
i : uint16;
|
||||||
begin
|
begin
|
||||||
|
push_trace('IDE.dread');
|
||||||
for i:=0 to sectorCount-1 do begin
|
for i:=0 to sectorCount-1 do begin
|
||||||
readPIO28(device^.controllerId0, LBA, puint8(@buffer[512*i]));
|
readPIO28(device^.controllerId0, LBA + i, puint8(@buffer[512*i]));
|
||||||
|
psleep(100)
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -440,7 +456,8 @@ var
|
|||||||
i : uint16;
|
i : uint16;
|
||||||
begin
|
begin
|
||||||
for i:=0 to sectorCount-1 do begin
|
for i:=0 to sectorCount-1 do begin
|
||||||
writePIO28(device^.controllerId0, LBA, puint8(@buffer[512*i]));
|
writePIO28(device^.controllerId0, LBA + i, puint8(@buffer[512*i]));
|
||||||
|
psleep(100)
|
||||||
end;
|
end;
|
||||||
// writePIO28(device^.controllerId0, LBA, puint8(buffer));
|
// writePIO28(device^.controllerId0, LBA, puint8(buffer));
|
||||||
end;
|
end;
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
Driver->Storage->MBR Master boot record
|
||||||
|
|
||||||
|
@author(Aaron Hance [email protected])
|
||||||
|
}
|
||||||
|
unit mbr;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
tracer;
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
PMaster_Boot_Record = ^TMaster_Boot_Record;
|
||||||
|
PPartition_table = ^TPartition_table;
|
||||||
|
|
||||||
|
TPartition_table = bitpacked record
|
||||||
|
attributes : uint8;
|
||||||
|
CHS_start : array[0..2] of uint8;
|
||||||
|
system_id : uint8;
|
||||||
|
CHS_end : array[0..2] of uint8;
|
||||||
|
LBA_start : uInt32;
|
||||||
|
sector_count : uInt32;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TMaster_Boot_Record = bitpacked record
|
||||||
|
bootstrap : array[0..439] of uint8;
|
||||||
|
signature : uint32;
|
||||||
|
rsv : uint16;
|
||||||
|
partition : array[0..3] of TPartition_table;
|
||||||
|
boot_sector : uint16;
|
||||||
|
end;
|
||||||
|
|
||||||
|
T24bit = array[0..2] of uint8;
|
||||||
|
|
||||||
|
function get_bootable(partition_table : PPartition_table) : boolean;
|
||||||
|
procedure set_bootable(partition_table : PPartition_table);
|
||||||
|
procedure setup_partition(partition_table : PPartition_table; address : uint32; sectorSize : uint32);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ convert LBA address to CHS address}
|
||||||
|
function LBA_2_CHS(lba : uint32) : T24bit;
|
||||||
|
var
|
||||||
|
dat : T24bit;
|
||||||
|
begin
|
||||||
|
//TODO impliment procedure
|
||||||
|
LBA_2_CHS := dat;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Set a partition struct to be bootable}
|
||||||
|
procedure set_bootable(partition_table : PPartition_table);
|
||||||
|
begin
|
||||||
|
push_trace('MBR.set_bootable');
|
||||||
|
//set the bootble bit in attributes
|
||||||
|
partition_table^.attributes := (partition_table^.attributes and $80);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Check a partitions bootable bit }
|
||||||
|
function get_bootable(partition_table : PPartition_table) : boolean;
|
||||||
|
begin
|
||||||
|
push_trace('MBR.get_bootable');
|
||||||
|
//get the bootble bit in attributes
|
||||||
|
get_bootable := (partition_table^.attributes and $80) = $80;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Setup a partition table struct }
|
||||||
|
procedure setup_partition(partition_table : PPartition_table; address : uint32; sectorSize : uint32);
|
||||||
|
begin
|
||||||
|
push_trace('MBR.setup_partition');
|
||||||
|
//set values in both LBA and CHS addressing schemes
|
||||||
|
partition_table^.LBA_start := address;
|
||||||
|
partition_table^.sector_count := sectorSize;
|
||||||
|
partition_table^.CHS_start := LBA_2_CHS(address);
|
||||||
|
partition_table^.CHS_start := LBA_2_CHS(address + sectorSize);
|
||||||
|
push_trace('MBR.setup_partition.end');
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -10,14 +10,16 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
console,
|
console,
|
||||||
storagemanagement,
|
util,
|
||||||
util, terminal,
|
terminal,
|
||||||
lmemorymanager,
|
lmemorymanager,
|
||||||
strings,
|
strings,
|
||||||
lists,
|
lists,
|
||||||
tracer,
|
tracer,
|
||||||
serial,
|
serial,
|
||||||
rtc;
|
rtc,
|
||||||
|
volumemanager,
|
||||||
|
storagetypes;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@@ -89,7 +91,7 @@ var
|
|||||||
filesystem : TFilesystem;
|
filesystem : TFilesystem;
|
||||||
|
|
||||||
procedure init;
|
procedure init;
|
||||||
procedure create_volume(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32);
|
procedure create_volume(volume : PStorage_Volume; sectors : uint32; start : uint32; config : puint32);
|
||||||
procedure detect_volumes(disk : PStorage_Device);
|
procedure detect_volumes(disk : PStorage_Device);
|
||||||
//function writeDirectory(volume : PStorage_volume; directory : pchar; attributes : uint32) : uint8; // need to handle parent table cluster overflow, need to take attributes
|
//function writeDirectory(volume : PStorage_volume; directory : pchar; attributes : uint32) : uint8; // need to handle parent table cluster overflow, need to take attributes
|
||||||
//function readDirectory(volume : PStorage_volume; directory : pchar; listPtr : PLinkedListBase) : uint8; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error
|
//function readDirectory(volume : PStorage_volume; directory : pchar; listPtr : PLinkedListBase) : uint8; //returns: 0 = success, 1 = dir not exsist, 2 = not directory, 3 = error
|
||||||
@@ -751,7 +753,7 @@ end;
|
|||||||
|
|
||||||
//TODO check directory commands for errors with a clean disk
|
//TODO check directory commands for errors with a clean disk
|
||||||
|
|
||||||
procedure create_volume(disk : PStorage_Device; sectors : uint32; start : uint32; config : puint32);
|
procedure create_volume(volume : PStorage_Volume; sectors : uint32; start : uint32; config : puint32);
|
||||||
var
|
var
|
||||||
buffer : puint32;
|
buffer : puint32;
|
||||||
bt: puint32;
|
bt: puint32;
|
||||||
@@ -772,9 +774,18 @@ var
|
|||||||
programFileArray : byteArray8 = ('P','R','O','G','R','A','M','S');
|
programFileArray : byteArray8 = ('P','R','O','G','R','A','M','S');
|
||||||
rootCluster : uint32 = 1;
|
rootCluster : uint32 = 1;
|
||||||
|
|
||||||
|
sysArray : byteArray8 = ('S','Y','S','T','E','M',' ',' ');
|
||||||
|
progArray : byteArray8 = ('P','R','O','G','R','A','M','S');
|
||||||
|
userArray : byteArray8 = ('U','S','E','R',' ',' ',' ',' ');
|
||||||
|
|
||||||
|
status : puint32;
|
||||||
|
disk : PStorage_device;
|
||||||
|
|
||||||
begin //maybe increase buffer size by one?
|
begin //maybe increase buffer size by one?
|
||||||
push_trace('fat32.create_volume()');
|
push_trace('fat32.create_volume()');
|
||||||
|
|
||||||
|
disk := volume^.device;
|
||||||
|
|
||||||
// zeroBuffer:= puint32(kalloc( disk^.sectorSize * 4 ));
|
// zeroBuffer:= puint32(kalloc( disk^.sectorSize * 4 ));
|
||||||
// memset(uint32(zeroBuffer), 0, disk^.sectorSize * 4);
|
// memset(uint32(zeroBuffer), 0, disk^.sectorSize * 4);
|
||||||
|
|
||||||
@@ -811,7 +822,7 @@ begin //maybe increase buffer size by one?
|
|||||||
bootRecord^.jmp2boot := $0; //TODO impliment boot jump
|
bootRecord^.jmp2boot := $0; //TODO impliment boot jump
|
||||||
bootRecord^.OEMName := asuroArray;
|
bootRecord^.OEMName := asuroArray;
|
||||||
bootRecord^.sectorSize := disk^.sectorsize;
|
bootRecord^.sectorSize := disk^.sectorsize;
|
||||||
bootRecord^.spc := config^;
|
bootRecord^.spc := 1;
|
||||||
bootRecord^.rsvSectors := 32; //32 is standard
|
bootRecord^.rsvSectors := 32; //32 is standard
|
||||||
bootRecord^.numFats := 1;
|
bootRecord^.numFats := 1;
|
||||||
bootRecord^.mediaDescp := $F8;
|
bootRecord^.mediaDescp := $F8;
|
||||||
@@ -873,8 +884,16 @@ begin //maybe increase buffer size by one?
|
|||||||
|
|
||||||
disk^.writecallback(disk, dataStart + (config^ * rootCluster), 1, buffer);
|
disk^.writecallback(disk, dataStart + (config^ * rootCluster), 1, buffer);
|
||||||
|
|
||||||
|
memset(uint32(buffer), 0, disk^.sectorsize);
|
||||||
|
|
||||||
|
status := puint32(kalloc(sizeof(uint32)));
|
||||||
|
writeDirectory(volume, '', sysArray, $10, status, '');
|
||||||
|
|
||||||
|
|
||||||
kfree(buffer);
|
kfree(buffer);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure detect_volumes(disk : PStorage_Device);
|
procedure detect_volumes(disk : PStorage_Device);
|
||||||
@@ -903,11 +922,11 @@ begin
|
|||||||
if (puint32(buffer)[127] = $55AA) and (PBootRecord(buffer)^.bsignature = $29) then begin //TODO partition table
|
if (puint32(buffer)[127] = $55AA) and (PBootRecord(buffer)^.bsignature = $29) then begin //TODO partition table
|
||||||
console.writestringln('FAT32: volume found!');
|
console.writestringln('FAT32: volume found!');
|
||||||
volume^.device:= disk;
|
volume^.device:= disk;
|
||||||
volume^.sectorStart:= 1;
|
volume^.sectorStart:= 1; //THIS MAKE SURE IF NOT FUCKY, cos im getting info from 2
|
||||||
volume^.sectorSize:= PBootRecord(buffer)^.sectorSize;
|
volume^.sectorSize:= PBootRecord(buffer)^.sectorSize;
|
||||||
volume^.freeSectors:= 1000000; //TODO implement get free sectors need FSINFO implemented first
|
volume^.freeSectors:= 1000000; //TODO implement get free sectors need FSINFO implemented first
|
||||||
volume^.filesystem := @filesystem;
|
volume^.filesystem := @filesystem;
|
||||||
storagemanagement.register_volume(disk, volume);
|
// storagemanagement.register_volume(disk, volume); TODO repalce with new thing
|
||||||
end;
|
end;
|
||||||
|
|
||||||
kfree(buffer);
|
kfree(buffer);
|
||||||
@@ -917,6 +936,7 @@ procedure init();
|
|||||||
begin
|
begin
|
||||||
push_trace('fat32.init()');
|
push_trace('fat32.init()');
|
||||||
filesystem.sName:= 'FAT32';
|
filesystem.sName:= 'FAT32';
|
||||||
|
filesystem.system_id:= $01;
|
||||||
filesystem.readDirCallback:= @readDirectoryGen;
|
filesystem.readDirCallback:= @readDirectoryGen;
|
||||||
filesystem.createDirCallback:= @writeDirectoryGen;
|
filesystem.createDirCallback:= @writeDirectoryGen;
|
||||||
filesystem.createcallback:= @create_volume;
|
filesystem.createcallback:= @create_volume;
|
||||||
@@ -924,7 +944,7 @@ begin
|
|||||||
filesystem.writecallback:= @writeFile;
|
filesystem.writecallback:= @writeFile;
|
||||||
filesystem.readcallback := @readFile;
|
filesystem.readcallback := @readFile;
|
||||||
|
|
||||||
storagemanagement.register_filesystem(@filesystem);
|
volumemanager.register_filesystem(@filesystem);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
Loaded 20 of 38 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user