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
-66
@@ -1,66 +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"
|
||||
|
||||
- name: msg status
|
||||
image: appleboy/drone-discord
|
||||
failure: ignore
|
||||
depends_on:
|
||||
- compile
|
||||
when:
|
||||
status: [success, failure, changed]
|
||||
settings:
|
||||
webhook_id:
|
||||
from_secret: discord_webhook_id
|
||||
webhook_token:
|
||||
from_secret: discord_webhook_secret
|
||||
message: "**Asuro Build**\n\n{{#success build.status}}✅ Build successful!\n\n{{else}}❌ Build failed!\n\n{{/success}}Repository: `{{repo.namespace}}/{{repo.name}}`\nBranch: `{{commit.branch}}`\nCommit: `{{commit.sha}}`\nAuthor: `{{commit.author}} <{{commit.email}}>`\n\nGitea Diff: [Link](<{{commit.link}}>)\nDrone Build: [Link](<{{build.link}}>)\n\nMessage: {{commit.message}}"
|
||||
@@ -10,4 +10,3 @@
|
||||
/*.sh~
|
||||
/*.img
|
||||
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
|
||||
@@ -1,13 +0,0 @@
|
||||
# Map all Aaron identities to a single preferred identity
|
||||
Aaron Hance <[email protected]> aaron <aaron@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c>
|
||||
Aaron Hance <[email protected]> aaronhance <[email protected]>
|
||||
Aaron Hance <[email protected]> aaron hance <[email protected]>
|
||||
Aaron Hance <[email protected]> Aaron <[email protected]>
|
||||
|
||||
# Map all Kieron identities to a single preferred identity
|
||||
Kieron Morris <[email protected]> kieron <kieron@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c>
|
||||
Kieron Morris <[email protected]> Kieron <[email protected]>
|
||||
Kieron Morris <[email protected]> t3hn3rd <[email protected]>
|
||||
|
||||
# Map goose's multiple identities
|
||||
goose <goose@6dbc8c32-bb84-406f-8558-d1cf31a0ab0c> goose <[email protected]>
|
||||
Vendored
+1
-1
@@ -6,7 +6,7 @@
|
||||
"type": "PowerShell",
|
||||
"preLaunchTask": "Build",
|
||||
"script": "${workspaceFolder}/virtualbox-wrapper.ps1",
|
||||
"args": ["-Command", "up"],
|
||||
"args": ["-MachineName", "7d395c96-891c-4139-b77d-9b6b144b0b93"],
|
||||
"cwd": "${workspaceFolder}",
|
||||
}
|
||||
]
|
||||
|
||||
Vendored
+2
-24
@@ -9,18 +9,14 @@
|
||||
"command": "docker-compose",
|
||||
"args": [
|
||||
"run",
|
||||
"builder",
|
||||
"builder"
|
||||
],
|
||||
"type": "shell",
|
||||
"problemMatcher": [],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"dependsOn": [
|
||||
"Close VirtualBox",
|
||||
"Clean"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Build (Builder)",
|
||||
@@ -30,24 +26,6 @@
|
||||
"builder"
|
||||
],
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -9,14 +9,14 @@ RUN apt-get update && apt-get install -y \
|
||||
apt-get clean my room
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
ARG FPC_VERSION=3.2.2
|
||||
ARG FPC_VERSION=2.6.4
|
||||
RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSION/fpc-$FPC_VERSION.i386-linux.tar/download | tar -xf - && \
|
||||
pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \
|
||||
rm -rf fpc-$FPC_VERSION.i386-linux
|
||||
|
||||
COPY compile.sh /compile.sh
|
||||
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
|
||||
RUN find . -type f -print0 | xargs -0 dos2unix
|
||||
ENTRYPOINT ["/bin/bash", "-c"]
|
||||
|
||||
+14
-18
@@ -20,30 +20,26 @@ runOrFail() {
|
||||
fi
|
||||
}
|
||||
|
||||
declare -a run_steps=(
|
||||
"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!"
|
||||
)
|
||||
runOrFail $(pwd)/compile_stub.sh "Failed to compile stub!"
|
||||
|
||||
for ((i=0; i<${#run_steps[@]}; i+=2))
|
||||
do
|
||||
if [ "$ERRCOUNT" -eq "0" ]
|
||||
then
|
||||
script=$(pwd)/"${run_steps[$i]}"
|
||||
message="${run_steps[$i+1]}"
|
||||
runOrFail "$script" "$message"
|
||||
fi
|
||||
done
|
||||
#Generate .pas with versioning headers.
|
||||
runOrFail $(pwd)/compile_vergen.sh "Versions failed to compile"
|
||||
|
||||
#Compile all .pas sources
|
||||
runOrFail $(pwd)/compile_sources.sh "Failed to compile FPC Sources!"
|
||||
|
||||
#Link into a binary.
|
||||
runOrFail $(pwd)/compile_link.sh "Failed linking!"
|
||||
|
||||
#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.
|
||||
if [ "$ERRCOUNT" -ne "0" ]
|
||||
then
|
||||
. ./compile_finish.sh "failed"
|
||||
./compile_finish.sh "failed"
|
||||
else
|
||||
. ./compile_finish.sh "success"
|
||||
./compile_finish.sh "success"
|
||||
fi
|
||||
|
||||
cd ..
|
||||
+1
-1
@@ -4,4 +4,4 @@ echo "======================="
|
||||
echo " "
|
||||
echo "Compiling FPC Sources..."
|
||||
echo " "
|
||||
fpc -Aelf -gw -g -gl -n -vlewn -O3 -OpPENTIUM3 -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:
|
||||
builder:
|
||||
build: .
|
||||
|
||||
+1
-12
@@ -2,7 +2,7 @@ ENTRY(loader)
|
||||
SECTIONS
|
||||
{
|
||||
. = 0xC0100000;
|
||||
kernel_start = .;
|
||||
|
||||
.text : AT(ADDR(.text) - 0xC0000000)
|
||||
{
|
||||
text = .; _text = .; __text = .;
|
||||
@@ -33,15 +33,4 @@ SECTIONS
|
||||
. = ALIGN(4096);
|
||||
}
|
||||
end = .; _end = .; __end = .;
|
||||
kernel_end = .;
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.init_array*)
|
||||
*(.fini_array*)
|
||||
*(.ctors)
|
||||
*(.dtors)
|
||||
*(.eh_frame*)
|
||||
*(.gcc_except_table*)
|
||||
*(.note.GNU-stack)
|
||||
}
|
||||
}
|
||||
@@ -50,26 +50,23 @@ We welcome everyone to give building/breaking/fixing/shooting Asuro a go, feel f
|
||||
```xml
|
||||
<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
|
||||
{
|
||||
"VirtualBox":{
|
||||
"MachineName":"<YOUR_UUID_OR_MACHINE_NAME>"
|
||||
"configurations": [
|
||||
{
|
||||
"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.
|
||||
|
||||
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.
|
||||
14. Congratulations! You can now play with Asuro!
|
||||
|
||||
|
||||
@@ -58,19 +58,16 @@ begin
|
||||
end;
|
||||
|
||||
function sinb(port : uint16) : uint8;
|
||||
var
|
||||
tmp : uint8;
|
||||
begin
|
||||
asm
|
||||
PUSH EAX
|
||||
PUSH EDX
|
||||
MOV DX, port
|
||||
IN AL, DX
|
||||
MOV tmp, AL
|
||||
MOV sinb, AL
|
||||
POP EDX
|
||||
POP EAX
|
||||
end;
|
||||
sinb := tmp;
|
||||
io_wait;
|
||||
end;
|
||||
|
||||
|
||||
@@ -491,26 +491,22 @@ begin
|
||||
|
||||
{ Create a new header to the use in our DHCP REQUEST packet }
|
||||
SendHeader:= createHeader();
|
||||
CopyIPv4(@getIPv4Config^.Address[0], puint8(@SendHeader^.Client_IP[0]));
|
||||
CopyIPv4(puint8(@Header^.Your_IP[0]), puint8(@SendHeader^.Client_IP[0]));
|
||||
CopyIPv4(puint8(@Header^.Server_IP[0]), puint8(@SendHeader^.Server_IP[0]));
|
||||
processHeader(SendHeader);
|
||||
|
||||
{ Setup Options }
|
||||
SendOptions:= newOptions();
|
||||
|
||||
{ Create a message type option and assign it the value REQUEST }
|
||||
SendMsgType:= ord(TDHCPMessageType.REQUEST);
|
||||
NewOption(SendOptions, TDHCPOpCode.DHCP_MESSAGE_TYPE, void(@SendMsgType), 1, false);
|
||||
|
||||
{ Create a Requested IP option and assign it the value from the OFFER packet header }
|
||||
NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@Header^.Your_IP[0]), 4, false);
|
||||
|
||||
NewOption(SendOptions, TDHCPOpCode.REQUESTED_IP_ADDRESS, void(@SendHeader^.Client_IP[0]), 4, false);
|
||||
{ Create a Server Identifier Option and assign it the value from the OFFER packet options }
|
||||
Option:= getOptionByOpcode(Options, TDHCPOpCode.SERVER_IDENTIFIER);
|
||||
if Option <> nil then begin
|
||||
NewOption(SendOptions, TDHCPOpCode.SERVER_IDENTIFIER, void(@Option^.Value[0]), 4, false);
|
||||
end;
|
||||
|
||||
{ Create a Parameter Request List, Request the following: Netmask, Gateway, DNS Name & DNS Server }
|
||||
RequestParams[0]:= Ord(TDHCPOpCode.SUBNET_MASK);
|
||||
RequestParams[1]:= Ord(TDHCPOpCode.ROUTER);
|
||||
@@ -526,13 +522,9 @@ begin
|
||||
MAC:= getMAC();
|
||||
packetCtx:= PPacketContext(Kalloc(sizeof(TPacketContext)));
|
||||
packetCtx^.TTL:= 128;
|
||||
|
||||
{ Copy over MAC - src: broadcast - dst: DHCP Server }
|
||||
copyMAC(MAC, @packetCtx^.MAC.Source[0]);
|
||||
copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]);
|
||||
|
||||
{ Copy over IP - src: NULL - dst: Broadcast }
|
||||
CopyIPv4(@getIPv4Config^.Address[0], @packetCtx^.IP.Source[0]);
|
||||
copyMAC(MAC, @packetCtx^.MAC.Source[0]);
|
||||
copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0]);
|
||||
copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]);
|
||||
|
||||
{ Setup UDPContext (UDP) & copy in the correct details }
|
||||
@@ -578,7 +570,7 @@ begin
|
||||
|
||||
{ Check the frame is for us and then process }
|
||||
MAC:= getMAC;
|
||||
if MACEqual(@context^.PacketContext^.MAC.Destination[0], MAC) or MACEqual(@context^.PacketContext^.MAC.Destination[0], BROADCAST_MAC) then begin
|
||||
if MACEqual(@context^.PacketContext^.MAC.Destination[0], MAC) then begin
|
||||
Outputln('DHCP','Frame is addressed to us.');
|
||||
{ Check the message type is client specific }
|
||||
If Header^.Message_Type = $02 then begin
|
||||
@@ -663,7 +655,7 @@ begin
|
||||
copyMAC(@BROADCAST_MAC[0], @packetCtx^.MAC.Destination[0]);
|
||||
MAC:= getMAC;
|
||||
copyMAC(MAC, @packetCtx^.MAC.Source[0]);
|
||||
CopyIPv4(@getIPv4Config^.Address[0], @packetCtx^.IP.Source[0]);
|
||||
copyIPv4(@NULL_IP[0], @packetCtx^.IP.Source[0]);
|
||||
copyIPv4(@BROADCAST_IP[0], @packetCtx^.IP.Destination[0]);
|
||||
|
||||
{ Setup UDPContext (UDP) }
|
||||
|
||||
@@ -21,7 +21,9 @@ uses
|
||||
lmemorymanager,
|
||||
storagemanagement,
|
||||
strings,
|
||||
tracer;
|
||||
tracer,
|
||||
drivemanager,
|
||||
storagetypes;
|
||||
|
||||
type
|
||||
TPortMode = (P_READ, P_WRITE);
|
||||
@@ -267,6 +269,7 @@ var
|
||||
slaveDevice : TStorage_Device;
|
||||
buffer : puint8;
|
||||
i : uint8;
|
||||
test : PStorage_device;
|
||||
begin
|
||||
push_trace('ide.load');
|
||||
console.writestringln('[IDE] (LOAD) BEGIN');
|
||||
@@ -288,14 +291,15 @@ begin
|
||||
exit;
|
||||
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;
|
||||
if masterDevice.maxSectorCount <> 0 then begin
|
||||
IDEDevices[0].exists:= true;
|
||||
masterDevice.readCallback:= @dread;
|
||||
masterDevice.writeCallback:= @dwrite;
|
||||
storagemanagement.register_device(@masterDevice);
|
||||
// storagemanagement.register_device(@masterDevice);
|
||||
drivemanager.register_device(@masterDevice);
|
||||
end;
|
||||
|
||||
end;
|
||||
@@ -330,10 +334,14 @@ var
|
||||
device: uint8;
|
||||
data: uint16;
|
||||
begin
|
||||
push_trace('IDE.readPIO28');
|
||||
|
||||
if not validate_28bit_address(LBA) then begin
|
||||
console.writestringln('IDE (writePIO28) ERROR: Invalid LBA!');
|
||||
end;
|
||||
|
||||
// push_trace('IDE.readPIO28.2');
|
||||
|
||||
//Add last 4 bits of LBA to device port
|
||||
if IDEDevices[drive].isMaster then begin
|
||||
device:= ATA_DEVICE_MASTER;
|
||||
@@ -344,6 +352,8 @@ begin
|
||||
device_select($F0 or ((LBA and $0F000000) shr 24)); //LBA primary slave
|
||||
end;
|
||||
|
||||
// push_trace('IDE.readPIO28.3');
|
||||
|
||||
no_interrupt(device);
|
||||
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_LBA2, (LBA and $00FF0000) shr 16);
|
||||
|
||||
// push_trace('IDE.readPIO28.4');
|
||||
|
||||
//send read command
|
||||
port_write(ATA_REG_COMMAND, ATA_CMD_READ_PIO);
|
||||
if not is_ready() then exit;
|
||||
@@ -368,6 +380,8 @@ begin
|
||||
|
||||
i:= i + 2;
|
||||
end;
|
||||
|
||||
// push_trace('IDE.readPIO28.5');
|
||||
end;
|
||||
|
||||
procedure writePIO28(drive : uint8; LBA : uint32; buffer : puint8);
|
||||
@@ -430,8 +444,10 @@ procedure dread(device : PStorage_device; LBA : uint32; sectorCount : uint32; bu
|
||||
var
|
||||
i : uint16;
|
||||
begin
|
||||
push_trace('IDE.dread');
|
||||
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;
|
||||
|
||||
@@ -440,7 +456,8 @@ var
|
||||
i : uint16;
|
||||
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;
|
||||
// writePIO28(device^.controllerId0, LBA, puint8(buffer));
|
||||
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
|
||||
console,
|
||||
storagemanagement,
|
||||
util, terminal,
|
||||
util,
|
||||
terminal,
|
||||
lmemorymanager,
|
||||
strings,
|
||||
lists,
|
||||
tracer,
|
||||
serial,
|
||||
rtc;
|
||||
rtc,
|
||||
volumemanager,
|
||||
storagetypes;
|
||||
|
||||
type
|
||||
|
||||
@@ -89,7 +91,7 @@ var
|
||||
filesystem : TFilesystem;
|
||||
|
||||
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);
|
||||
//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
|
||||
@@ -751,7 +753,7 @@ end;
|
||||
|
||||
//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
|
||||
buffer : puint32;
|
||||
bt: puint32;
|
||||
@@ -772,9 +774,18 @@ var
|
||||
programFileArray : byteArray8 = ('P','R','O','G','R','A','M','S');
|
||||
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?
|
||||
push_trace('fat32.create_volume()');
|
||||
|
||||
disk := volume^.device;
|
||||
|
||||
// zeroBuffer:= puint32(kalloc( 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^.OEMName := asuroArray;
|
||||
bootRecord^.sectorSize := disk^.sectorsize;
|
||||
bootRecord^.spc := config^;
|
||||
bootRecord^.spc := 1;
|
||||
bootRecord^.rsvSectors := 32; //32 is standard
|
||||
bootRecord^.numFats := 1;
|
||||
bootRecord^.mediaDescp := $F8;
|
||||
@@ -873,8 +884,16 @@ begin //maybe increase buffer size by one?
|
||||
|
||||
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);
|
||||
|
||||
|
||||
|
||||
end;
|
||||
|
||||
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
|
||||
console.writestringln('FAT32: volume found!');
|
||||
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^.freeSectors:= 1000000; //TODO implement get free sectors need FSINFO implemented first
|
||||
volume^.filesystem := @filesystem;
|
||||
storagemanagement.register_volume(disk, volume);
|
||||
// storagemanagement.register_volume(disk, volume); TODO repalce with new thing
|
||||
end;
|
||||
|
||||
kfree(buffer);
|
||||
@@ -917,6 +936,7 @@ procedure init();
|
||||
begin
|
||||
push_trace('fat32.init()');
|
||||
filesystem.sName:= 'FAT32';
|
||||
filesystem.system_id:= $01;
|
||||
filesystem.readDirCallback:= @readDirectoryGen;
|
||||
filesystem.createDirCallback:= @writeDirectoryGen;
|
||||
filesystem.createcallback:= @create_volume;
|
||||
@@ -924,7 +944,7 @@ begin
|
||||
filesystem.writecallback:= @writeFile;
|
||||
filesystem.readcallback := @readFile;
|
||||
|
||||
storagemanagement.register_filesystem(@filesystem);
|
||||
volumemanager.register_filesystem(@filesystem);
|
||||
end;
|
||||
|
||||
end.
|
||||
File diff suppressed because it is too large.
Load diff
Loaded 20 of 29 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user