Implemented DPT (Partition table) + started work on Drake (bootloader)
This commit is contained in:
parent
79261a67a2
commit
b2bbf7c560
26 changed files with 444 additions and 30 deletions
2
build.nr
2
build.nr
|
|
@ -1 +1 @@
|
|||
1592
|
||||
1593
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ rm dragon/disk1.dr
|
|||
./dtools new-vdisk dragon/disk1.dr 1048576
|
||||
|
||||
printf "\n${green}Compiling MBR Block...\n${clear}"
|
||||
./dasm dss/drake.dss -o dragon/drake.bin --save-disassembly disassembly/drake.dds --verbose
|
||||
./dasm dss/drake/entry.dss -o dragon/drake.bin --save-disassembly disassembly/drake.dds --verbose
|
||||
|
||||
printf "\n${green}Loading MBR Block...\n${clear}"
|
||||
./dtools load-binary dragon/disk1.dr dragon/drake.bin 0x00000000
|
||||
|
|
@ -46,8 +46,9 @@ rm ./bin/disassembly/test2.dds
|
|||
|
||||
mkdir ./win-release/dss4
|
||||
mkdir ./win-release/dss/bios
|
||||
mkdir ./win-release/dss/drake
|
||||
cp ./bin/dss/bios/* ./win-release/dss/bios
|
||||
cp ./bin/dss/drake.dss ./win-release/dss
|
||||
cp ./bin/dss/drake/* ./win-release/dss/drake
|
||||
cp ./bin/dss/tests/test1.dss ./win-release/dss
|
||||
cp ./bin/dss/tests/test2.dss ./win-release/dss
|
||||
|
||||
|
|
|
|||
BIN
extra/dpt_2_partitions_on_4_mb_disk.bin
Normal file
BIN
extra/dpt_2_partitions_on_4_mb_disk.bin
Normal file
Binary file not shown.
42
extra/dragon info/dpt_2_partitions_on_4_mb_disk.txt
Normal file
42
extra/dragon info/dpt_2_partitions_on_4_mb_disk.txt
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
F1 CA 00 02 04 FF FF FF FF FF FF FF
|
||||
|
||||
00 00 04 00
|
||||
00 00 14 00
|
||||
00 00
|
||||
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
42 4F 4F 54 53 45 43 54 4F 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
|
||||
00 00 18 00
|
||||
00 01 68 00
|
||||
00 00
|
||||
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
|
||||
00 01 80 00
|
||||
00 1F 40 00
|
||||
00 01
|
||||
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
44 72 61 67 6F 6E 4F 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
|
||||
00 20 C0 00
|
||||
00 1F 40 00
|
||||
00 00
|
||||
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
54 65 73 74 20 50 61 72 74 69 74 69 6F 6E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
|
||||
00 20 C0 00
|
||||
00 1F 40 00
|
||||
00 00
|
||||
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
|
||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||
|
||||
|
||||
|
||||
Disk: 4096 kb
|
||||
=============
|
||||
boot + dpt 1 kb 1024 bytes (9x400) 0x0000.0000 -> 0x0000.03FF
|
||||
-------------
|
||||
boot-ssector 5 kb 5120 bytes (0x1400) 0x0000.0400 -> 0x0000.17FF
|
||||
Unallocated 90 kb 92160 bytes (0x16800) 0x0000.1800 -> 0x0001.7FFF
|
||||
DragonOS 2000 kb 2048000 bytes (0x1F4000) 0x0001.8000 -> 0x0020.BFFF
|
||||
Test Partition 2000 kb 2048000 bytes (0x1F4000) 0x0020.C000 -> 0x0040.0000
|
||||
|
|
@ -12,8 +12,7 @@
|
|||
ClockSpeed: (2 bytes) 0x0004
|
||||
BootDisk: 0x0010
|
||||
|
||||
ICC_
|
||||
ICC_OutputAddr: (2 bytes) 0x007E
|
||||
DiskList: (2 bytes) 0x007E
|
||||
0x107F
|
||||
-------
|
||||
0x1080 INTERRUPT VECTOR (512 Bytes)
|
||||
|
|
@ -164,5 +163,6 @@ Partition Table: (0x20C - 0x3FF) (500 bytes)
|
|||
Entry: (100 bytes) (x5)
|
||||
0x00: (4 bytes) - Start Address
|
||||
0x04: (4 bytes) - Size
|
||||
0x08: (28 bytes) - Reserved
|
||||
0x40: (64 bytes) - Partition label
|
||||
0x08: (2 bytes) - Flags
|
||||
0x08: (26 bytes) - Reserved
|
||||
0x24: (64 bytes) - Partition label
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -4,6 +4,8 @@
|
|||
$string "Hello World!!"
|
||||
|
||||
.code
|
||||
mov R10, 0xE0
|
||||
int 0x30
|
||||
mov R10, 0x0C
|
||||
mov R9, $string
|
||||
int 0x30
|
||||
|
|
@ -12,4 +14,4 @@ end_loop:
|
|||
jmp $end_loop
|
||||
hlt
|
||||
|
||||
.fixed 512, 0x00
|
||||
.fixed 1024, 0x00
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
## ============================= Memory Mapped Devices and Registers =============================
|
||||
@export_comment /BIOS_API "These are the base addresses of the memory map."
|
||||
@group MemoryAddresses
|
||||
@group /BIOS_API MemoryAddresses
|
||||
MBR 0x1380
|
||||
INT_VEC 0x1080
|
||||
DISK_INTERFACE 0x1580
|
||||
|
|
@ -19,6 +19,8 @@
|
|||
MEM_SIZE { MemoryAddresses.CMOS + 0x0002 }
|
||||
CLOCK_SPEED { MemoryAddresses.CMOS + 0x0004 }
|
||||
BOOT_DISK { MemoryAddresses.CMOS + 0x0010 }
|
||||
|
||||
DISK_LIST { MemoryAddresses.CMOS + 0x007E }
|
||||
@end
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
_int_20_handler:
|
||||
mov ACC, R10
|
||||
jeq $_int_20_disk_interface, 0x0010
|
||||
jeq $_int_20_disk_interface_get_disk_list, 0x0011
|
||||
jeq $_int_20_set_new_interrupt_handler, 0x0000
|
||||
jeq $_int_20_clear_interrupt, 0x0001
|
||||
jmp $_int_20_end
|
||||
|
|
@ -24,6 +25,8 @@ _int_20_disk_interface:
|
|||
mov [{MemoryAddresses.DISK_INTERFACE + 0x9}], *R9 ## Memory Address
|
||||
movb [MemoryAddresses.DISK_INTERFACE], 0x00 ## Signal set to "Start Operation"
|
||||
jmp $_int_20_end
|
||||
_int_20_disk_interface_get_disk_list:
|
||||
jmp $_int_20_end
|
||||
_int_20_set_new_interrupt_handler:
|
||||
push R8 ## Interrupt Code
|
||||
push R9 ## Handler Address
|
||||
|
|
@ -117,7 +120,6 @@ _int_30_invert_colors_text_single_normal:
|
|||
jmp $_int_30_end
|
||||
_int_30_print_string_buffered:
|
||||
mov [VGA_Registers.TEXT_SIGNLE_STR], R9
|
||||
debug_break
|
||||
movb [VGA_Registers.SIGNAL], Sig_VGA_Text_Single_Color.PRINT_STRING
|
||||
jmp $_int_30_end
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,6 @@ _set_interrupt_vector_entry_end:
|
|||
_print_integer:
|
||||
mov R1, 0
|
||||
arg ACC
|
||||
debug_break
|
||||
jne $_print_integer_loop, 0
|
||||
push 48 ## '0' ASCII is 48
|
||||
inc R1
|
||||
|
|
@ -56,7 +55,6 @@ _print_integer_loop:
|
|||
addipu RV, 48
|
||||
push RV
|
||||
inc R1
|
||||
debug_break
|
||||
jmp $_print_integer_loop
|
||||
_print_integer_loop_end:
|
||||
pop R9
|
||||
|
|
|
|||
48
extra/dss/bios_api.dss
Normal file
48
extra/dss/bios_api.dss
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
## --
|
||||
## -- This file is automatically generated by the DragonAssembler (version 0.3.1592)
|
||||
## -- Please do not modify this file in any way.
|
||||
## --
|
||||
|
||||
@guard __AUTO_GEN_GUARD_BIOS_API_DSS__
|
||||
|
||||
## -- These are the base addresses of the memory map.
|
||||
@define MemoryAddresses.MBR 0x1380
|
||||
@define MemoryAddresses.INT_VEC 0x1080
|
||||
@define MemoryAddresses.DISK_INTERFACE 0x1580
|
||||
@define MemoryAddresses.RAM 0x1740
|
||||
@define MemoryAddresses.CMOS 0x1000
|
||||
@define MemoryAddresses.VGA 0x1600
|
||||
## --
|
||||
|
||||
## -- These are the Hardware Interrupt codes of this machine.
|
||||
@define HW_Int.DISK_INTERFACE_FINISHED 0x80
|
||||
@define HW_Int.KEY_PRESSED 0xA0
|
||||
@define HW_Int.KEY_RELEASED 0xA1
|
||||
@define HW_Int.TEXT_ENTERED 0xA2
|
||||
## --
|
||||
|
||||
## -- These are the memory-mapped registers used to interact with the video card's interface.
|
||||
@define VGA_Registers.VIDEO_MODE 0x1600
|
||||
@define VGA_Registers.SIGNAL 0x1603
|
||||
@define VGA_Registers.TEXT_SINGLE_CHAR 0x1604
|
||||
@define VGA_Registers.TEXT_SIGNLE_INVERT 0x1605
|
||||
@define VGA_Registers.TEXT_SIGNLE_STR 0x1606
|
||||
@define VGA_Registers.BUFF_START 0x16E0
|
||||
## --
|
||||
|
||||
## -- These are the different Video Modes that the video card supports.
|
||||
@define VGA_VideoModes.TEXT_SINGLE_COLOR 0x00
|
||||
## --
|
||||
|
||||
## -- These are signals used to comunicate with the video card's interface, when in TEXT_SINGLE_COLOR mode.
|
||||
@define Sig_VGA_Text_Single_Color.CONTINUE 0x00
|
||||
@define Sig_VGA_Text_Single_Color.PRINT_CHAR 0x02
|
||||
@define Sig_VGA_Text_Single_Color.STORE_CHAR 0x03
|
||||
@define Sig_VGA_Text_Single_Color.PRINT_FLUSH_BUFF 0x04
|
||||
@define Sig_VGA_Text_Single_Color.FLUSH_BUFF 0x05
|
||||
@define Sig_VGA_Text_Single_Color.PRINT_BUFF 0x06
|
||||
@define Sig_VGA_Text_Single_Color.PRINT_STRING 0x07
|
||||
@define Sig_VGA_Text_Single_Color.REFRESH_SCREEN 0xE0
|
||||
@define Sig_VGA_Text_Single_Color.CLEAR_SCREEN 0xE1
|
||||
## --
|
||||
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
.load 0x1380
|
||||
|
||||
.code
|
||||
jmp 0x1740
|
||||
hlt
|
||||
|
||||
.fixed 512, 0x00
|
||||
66
extra/dss/drake/disk.dss
Normal file
66
extra/dss/drake/disk.dss
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
@guard _DISK_DSS_
|
||||
|
||||
@define DISK_INTERFACE_ADDR 0x1580
|
||||
|
||||
@group DiskMode
|
||||
READ 0x00
|
||||
WRITE 0x01
|
||||
@end
|
||||
|
||||
@group DiskSignals
|
||||
START 0x00
|
||||
CANCEL 0x01
|
||||
IGNORE 0xFF
|
||||
@end
|
||||
|
||||
@group DiskStatus
|
||||
FREE 0x00
|
||||
WRITING 0x01
|
||||
READING 0x02
|
||||
@end
|
||||
|
||||
@group DiskRegisters
|
||||
SIGNAL 0x00
|
||||
MODE_SELECTOR 0x01
|
||||
DISK_SELECTOR 0x02
|
||||
SECTOR_SELECTOR 0x03
|
||||
ADDRESS_SELECTOR 0x05
|
||||
DATA_SIZE 0x07
|
||||
MEMORY_ADDRESS 0x09
|
||||
RO_STATUS 0x0B
|
||||
RO_CURRENT_DISK 0x0C
|
||||
RO_CURRENT_SECTOR 0x0D
|
||||
RO_CURRENT_ADDRESS 0x0F
|
||||
RO_REST_DATA_SIZE 0x11
|
||||
RO_MEMORY_ADDRESS 0x13
|
||||
@end
|
||||
|
||||
@struct DiskDriverData
|
||||
Mode:1 > 0x00
|
||||
Disk:1 > 0x00
|
||||
Sector:2 > 0x00, 0x00
|
||||
Address:2 > 0x00, 0x00
|
||||
DataSize:2 > 0x00, 0x00
|
||||
MemoryAddress: > 0x00, 0x00
|
||||
@end
|
||||
|
||||
.code
|
||||
|
||||
_disk_load_from_ddd_blocking:
|
||||
arg R1
|
||||
movb [{DISK_INTERFACE_ADDR + DiskRegisters.MODE_SELECTOR}], *R1
|
||||
inc R1
|
||||
movb [{DISK_INTERFACE_ADDR + DiskRegisters.DISK_SELECTOR}], *R1
|
||||
inc R1
|
||||
mov [{DISK_INTERFACE_ADDR + DiskRegisters.SECTOR_SELECTOR}], *R1
|
||||
addip R1, 2
|
||||
mov [{DISK_INTERFACE_ADDR + DiskRegisters.ADDRESS_SELECTOR}], *R1
|
||||
addip R1, 2
|
||||
mov [{DISK_INTERFACE_ADDR + DiskRegisters.DATA_SIZE}], *R1
|
||||
addip R1, 2
|
||||
mov [{DISK_INTERFACE_ADDR + DiskRegisters.MEMORY_ADDRESS}], *R1
|
||||
movb [{DISK_INTERFACE_ADDR + DiskRegisters.SIGNAL}], DiskSignals.START
|
||||
_disk_load_from_ddd_blocking_wait_loop:
|
||||
mov ACC, [{DISK_INTERFACE_ADDR + DiskRegisters.RO_STATUS}]
|
||||
jne $_disk_load_from_ddd_blocking_wait_loop, DiskStatus.FREE
|
||||
ret
|
||||
23
extra/dss/drake/dpt.dss
Normal file
23
extra/dss/drake/dpt.dss
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
@uard _DPT_DSS_
|
||||
|
||||
@group DPTStructure
|
||||
DISK_ADDR 0x0200
|
||||
ENTRIES_START 0x000C
|
||||
|
||||
ENTRY_START_ADDR 0x0000
|
||||
ENTRY_PART_SIZE 0x0004
|
||||
ENTRY_FLAGS 0x0008
|
||||
ENTRY_PART_LBL 0x0024
|
||||
|
||||
ID_CODE 0xF1CA
|
||||
ENTRY_SIZE_B 100
|
||||
@end
|
||||
|
||||
@struct DPTBlock
|
||||
ID:2
|
||||
VersionMaj:1
|
||||
VersionMin:1
|
||||
PartCount:1
|
||||
Reserved:7
|
||||
Entries:500
|
||||
@end
|
||||
61
extra/dss/drake/entry.dss
Normal file
61
extra/dss/drake/entry.dss
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
.load 0x1380
|
||||
|
||||
@include <../bios_api.dss>
|
||||
|
||||
.data
|
||||
$_drake_logo_line_1 " ___ ___ ___ __ ______"
|
||||
$_drake_logo_line_2 " / _ \/ _ \/ _ | / //_/ __/"
|
||||
$_drake_logo_line_3 " / // / , _/ __ |/ ,< / _/ "
|
||||
$_drake_logo_line_4 "/____/_/|_/_/ |_/_/|_/___/ "
|
||||
$_logo_padding " "
|
||||
|
||||
|
||||
.code
|
||||
mov R10, 0xE0
|
||||
int 0x30
|
||||
push 0
|
||||
call $_print_logo
|
||||
and FL, 0b1111111111111110 ## Disable interrupts
|
||||
mov FL, ACC
|
||||
push 0
|
||||
call $_load_boot_sector
|
||||
or FL, 0b0000000000000001 ## Enable interrupts
|
||||
mov FL, ACC
|
||||
jmp MemoryAddresses.RAM
|
||||
_infinite_loop:
|
||||
jmp $_infinite_loop
|
||||
hlt
|
||||
|
||||
_print_logo:
|
||||
mov R5, $_drake_logo_line_1
|
||||
mov R6, 0
|
||||
mov ACC, 6
|
||||
_print_logo_loop:
|
||||
mov R10, 0x0C
|
||||
inc R6
|
||||
mov R9, $_logo_padding
|
||||
int 0x30
|
||||
mov R9, R5
|
||||
int 0x30
|
||||
mov R10, 0x02
|
||||
int 0x30
|
||||
addip R5, 29
|
||||
jls $_print_logo_loop, R6
|
||||
ret
|
||||
|
||||
_load_boot_sector:
|
||||
movb [{MemoryAddresses.DISK_INTERFACE + 0x1}], 0x00 ## Mode = Read
|
||||
movb R1, [{ MemoryAddresses.CMOS + 0x10 }]
|
||||
movb [{MemoryAddresses.DISK_INTERFACE + 0x2}], R1 ## Disk = Default
|
||||
mov [{MemoryAddresses.DISK_INTERFACE + 0x3}],0x0000 ## Sector
|
||||
mov [{MemoryAddresses.DISK_INTERFACE + 0x5}],0x0400 ## Address
|
||||
mov [{MemoryAddresses.DISK_INTERFACE + 0x7}], 1024 ## Size
|
||||
mov [{MemoryAddresses.DISK_INTERFACE + 0x9}], MemoryAddresses.RAM ## MemoryAddress
|
||||
movb [MemoryAddresses.DISK_INTERFACE], 0x00 ## Signal = Start
|
||||
_load_boot_sector_block_wait_loop:
|
||||
mov ACC, [{MemoryAddresses.DISK_INTERFACE + 0xB}] ## Moving <Status> register into ACC
|
||||
jne $_load_boot_sector_block_wait_loop, 0x00 ## If <Status> register not Free, loop around and wait
|
||||
ret
|
||||
|
||||
|
||||
.fixed 512, 0x00
|
||||
|
|
@ -19,7 +19,10 @@ if [ $? -eq 0 ]; then
|
|||
printf "${green}Compiling Test Program...\n"
|
||||
./dasm dss/activeTest.dss -o activeTest.bin --extmov --extalu --save-disassembly disassembly/activeTest.dds --verbose
|
||||
printf "\n${green}Running Application...\n\n${clear}"
|
||||
./ddb config/testMachine.dvm --force-load activeTest.bin 0x00 --verbose-load
|
||||
./dtools load-binary dragon/disk1.dr activeTest.bin 0x00000400
|
||||
# ./ddb config/testMachine.dvm --force-load activeTest.bin 0x00 --verbose-load
|
||||
./ddb config/testMachine.dvm --verbose-load
|
||||
cp dragon/disk1.dr ../extra/dragon/disk1.dr
|
||||
cp dragon/cmos.dr ../extra/dragon/cmos.dr
|
||||
cp dss/bios_api.dss ../extra/dss/bios_api.dss
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -19,7 +19,10 @@ if [ $? -eq 0 ]; then
|
|||
printf "${green}Compiling Test Program...\n"
|
||||
./dasm dss/activeTest.dss -o activeTest.bin --extmov --extalu --save-disassembly disassembly/activeTest.dds --verbose
|
||||
printf "\n${green}Running Application...\n\n${clear}"
|
||||
./dvm config/testMachine.dvm --force-load activeTest.bin 0x00
|
||||
./dtools load-binary dragon/disk1.dr activeTest.bin 0x00000400
|
||||
./dvm config/testMachine.dvm
|
||||
# ./dvm config/testMachine.dvm --force-load activeTest.bin 0x00
|
||||
cp dragon/disk1.dr ../extra/dragon/disk1.dr
|
||||
cp dragon/cmos.dr ../extra/dragon/cmos.dr
|
||||
cp dss/bios_api.dss ../extra/dss/bios_api.dss
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ clear='\033[0m'
|
|||
|
||||
printf "\n${green}Reloading MBR Block...\n${clear}"
|
||||
cd ..
|
||||
cp ../extra/dss/drake.dss ./dss/drake.dss
|
||||
./dasm dss/drake.dss -o dragon/drake.bin --save-disassembly disassembly/drake.dds --verbose
|
||||
cp ../extra/dss/drake/* ./dss/drake/
|
||||
./dasm dss/drake/entry.dss -o dragon/drake.bin --extalu --save-disassembly disassembly/drake.dds --verbose
|
||||
./dtools load-binary dragon/disk1.dr dragon/drake.bin 0x00000000
|
||||
printf "\n"
|
||||
cp dragon/disk1.dr ../extra/dragon/disk1.dr
|
||||
|
|
|
|||
|
|
@ -626,18 +626,20 @@ namespace dragon
|
|||
m_busy = true;
|
||||
}
|
||||
|
||||
data::VDiskID Disk::connectDisk(VirtualHardDrive& hdd)
|
||||
bool Disk::connectDisk(VirtualHardDrive& hdd, data::VDiskID disk_id)
|
||||
{
|
||||
for (auto& disk : m_connectedDisks)
|
||||
{
|
||||
if (disk.second->isSame(hdd))
|
||||
{
|
||||
data::ErrorHandler::pushError(data::ErrorCodes::HardDrive_DiskAlreadyConnected, "Attempt to connect already connected Disk to Controller");
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
m_connectedDisks[Disk::s_nextDiskID] = &hdd;
|
||||
return Disk::s_nextDiskID++;
|
||||
m_connectedDisks[disk_id] = &hdd;
|
||||
return true;
|
||||
// m_connectedDisks[Disk::s_nextDiskID] = &hdd;
|
||||
// return Disk::s_nextDiskID++;
|
||||
}
|
||||
|
||||
bool Disk::disconnectDisk(data::VDiskID diskID)
|
||||
|
|
|
|||
|
|
@ -328,7 +328,7 @@ namespace dragon
|
|||
ostd::ByteStream* getByteStream(void) override;
|
||||
|
||||
void cycleStep(void);
|
||||
data::VDiskID connectDisk(VirtualHardDrive& hdd);
|
||||
bool connectDisk(VirtualHardDrive& hdd, data::VDiskID disk_id);
|
||||
bool disconnectDisk(data::VDiskID diskID);
|
||||
|
||||
inline bool isBusy(void) const { return m_busy; }
|
||||
|
|
@ -340,7 +340,7 @@ namespace dragon
|
|||
MemoryMapper& m_memory;
|
||||
VirtualCPU& m_cpu;
|
||||
|
||||
inline static data::VDiskID s_nextDiskID = 0;
|
||||
// inline static data::VDiskID s_nextDiskID = 0;
|
||||
|
||||
};
|
||||
class Graphics : public IMemoryDevice
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ namespace dragon
|
|||
for (auto const& disk_path : machine_config.vdisk_paths)
|
||||
{
|
||||
vDisks[disk_path.first] = dragon::hw::VirtualHardDrive(disk_path.second);
|
||||
vDiskInterface.connectDisk(vDisks[disk_path.first]);
|
||||
vDiskInterface.connectDisk(vDisks[disk_path.first], disk_path.first);
|
||||
if (verbose)
|
||||
out.fg(ostd::ConsoleColors::BrightYellow).p(" Disk").p(disk_path.first).p(" connected: ").p(disk_path.second.cpp_str()).nl();
|
||||
}
|
||||
|
|
@ -318,6 +318,14 @@ namespace dragon
|
|||
vCMOS.write16(data::CMOSRegisters::MemoryStart, data::MemoryMapAddresses::Memory_Start);
|
||||
vCMOS.write16(data::CMOSRegisters::MemorySize, data::MemoryMapAddresses::Memory_End);
|
||||
vCMOS.write16(data::CMOSRegisters::ClockSpeed, machine_config.clock_rate_sec);
|
||||
ostd::BitField_16 disk_list_bitfield;
|
||||
disk_list_bitfield.value = 0;
|
||||
for (int32_t i = 0; i < 16; i++)
|
||||
{
|
||||
if (vDisks.count(i) > 0)
|
||||
ostd::Bits::set(disk_list_bitfield, i);
|
||||
}
|
||||
vCMOS.write16(data::CMOSRegisters::DiskList, disk_list_bitfield.value);
|
||||
if (verbose)
|
||||
out.fg(ostd::ConsoleColors::BrightYellow).p(" Loading CMOS Machine info").nl();
|
||||
|
||||
|
|
|
|||
|
|
@ -216,6 +216,32 @@ namespace dragon
|
|||
inline static constexpr uint8_t MemorySize = 0x02;
|
||||
inline static constexpr uint8_t ClockSpeed = 0x04;
|
||||
inline static constexpr uint8_t BootDisk = 0x10;
|
||||
|
||||
inline static constexpr uint8_t DiskList = 0x7E;
|
||||
};
|
||||
|
||||
class DPTStructure
|
||||
{
|
||||
public: struct tFlags {
|
||||
inline static constexpr uint8_t Boot = 0;
|
||||
};
|
||||
public:
|
||||
inline static constexpr uint16_t DiskAddress = 0x200;
|
||||
|
||||
inline static constexpr uint16_t DPTID = 0x000;
|
||||
inline static constexpr uint16_t DPTVersionMaj = 0x002;
|
||||
inline static constexpr uint16_t DPTVersionMin = 0x003;
|
||||
inline static constexpr uint16_t PartitionCount = 0x004;
|
||||
|
||||
inline static constexpr uint16_t EntriesStart = 0x00C;
|
||||
|
||||
inline static constexpr uint16_t EntryStartAddress = 0x000;
|
||||
inline static constexpr uint16_t EntryPartitionSize = 0x004;
|
||||
inline static constexpr uint16_t EntryFlags = 0x008;
|
||||
inline static constexpr uint16_t EntryPartitionLabel = 0x024;
|
||||
|
||||
inline static constexpr uint16_t DPT_ID_CODE = 0xF1CA;
|
||||
inline static constexpr uint16_t EntrySizeBytes = 100;
|
||||
};
|
||||
|
||||
class CPUExtension
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@
|
|||
#include <ostd/Utils.hpp>
|
||||
#include <fstream>
|
||||
#include "../hardware/VirtualHardDrive.hpp"
|
||||
#include "GlobalData.hpp"
|
||||
#include <ostd/Serial.hpp>
|
||||
|
||||
namespace dragon
|
||||
{
|
||||
|
|
@ -37,6 +39,12 @@ namespace dragon
|
|||
if (rValue != ErrorNoError)
|
||||
return rValue;
|
||||
}
|
||||
else if (tool == "read-dpt")
|
||||
{
|
||||
rValue = tool_read_dpt(argc, argv);
|
||||
if (rValue != ErrorNoError)
|
||||
return rValue;
|
||||
}
|
||||
else if (tool == "--help")
|
||||
{
|
||||
print_application_help();
|
||||
|
|
@ -122,6 +130,121 @@ namespace dragon
|
|||
return ErrorNoError;
|
||||
}
|
||||
|
||||
int32_t Tools::tool_read_dpt(int argc, char** argv)
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
out.fg(ostd::ConsoleColors::Red).p("Error: too few arguments.").nl();
|
||||
out.fg(ostd::ConsoleColors::Red).p(" Usage: ./dtools read-dpt <virtual_disk_file>").reset().nl();
|
||||
return ErrorReadDPTTooFewArgs;
|
||||
}
|
||||
ostd::String vdisk_file = argv[2];
|
||||
dragon::hw::VirtualHardDrive vHDD(vdisk_file);
|
||||
if (!vHDD.isInitialized())
|
||||
{
|
||||
out.fg(ostd::ConsoleColors::Red).p("Error: Unable to load virtual disk.").reset().nl();
|
||||
return ErrorReadDPTUnableToLoadVDisk;
|
||||
}
|
||||
if (vHDD.getSize() < 1024)
|
||||
{
|
||||
out.fg(ostd::ConsoleColors::Red).p("Error: Disk too small.").reset().nl();
|
||||
return ErrorReadDPTSmallDisk;
|
||||
}
|
||||
ostd::ByteStream outData;
|
||||
if (!vHDD.read(data::DPTStructure::DiskAddress, 512, outData))
|
||||
{
|
||||
out.fg(ostd::ConsoleColors::Red).p("Error: Unable to read from disk.").reset().nl();
|
||||
return ErrorReadDPTUnableToRead;
|
||||
}
|
||||
// ostd::Utils::printByteStream(outData, 0, 16, 32, out);
|
||||
ostd::serial::SerialIO dpt_block(outData);
|
||||
int8_t outData8 = 0;
|
||||
int16_t outData16 = 0;
|
||||
int32_t outData32 = 0;
|
||||
//TODO: Add errors for all read calls
|
||||
dpt_block.r_Word(data::DPTStructure::DPTID, outData16);
|
||||
uint16_t code = (uint16_t)outData16;
|
||||
if (code != data::DPTStructure::DPT_ID_CODE)
|
||||
{
|
||||
out.fg(ostd::ConsoleColors::Red).p("Error: No DPT partition table on virtual disk.").reset().nl();
|
||||
return ErrorReadDPTNoPartitionTable;
|
||||
}
|
||||
dpt_block.r_Byte(data::DPTStructure::DPTVersionMaj, outData8);
|
||||
uint32_t version_maj = (uint32_t)outData8;
|
||||
dpt_block.r_Byte(data::DPTStructure::DPTVersionMin, outData8);
|
||||
uint32_t version_min = (uint32_t)outData8;
|
||||
dpt_block.r_Byte(data::DPTStructure::PartitionCount, outData8);
|
||||
uint32_t part_count = (uint32_t)outData8;
|
||||
struct tPartitionData {
|
||||
uint32_t startAddress { 0 };
|
||||
uint32_t size { 0 };
|
||||
ostd::BitField_16 flags { 0 };
|
||||
ostd::String label { "" };
|
||||
};
|
||||
std::vector<tPartitionData> partitionList;
|
||||
for (int32_t i = 0; i < part_count; i++)
|
||||
{
|
||||
tPartitionData pdata;
|
||||
uint32_t entry_addr = data::DPTStructure::EntriesStart + (data::DPTStructure::EntrySizeBytes * i);
|
||||
dpt_block.r_DWord(entry_addr + data::DPTStructure::EntryStartAddress, outData32);
|
||||
pdata.startAddress = (uint32_t)outData32;
|
||||
dpt_block.r_DWord(entry_addr + data::DPTStructure::EntryPartitionSize, outData32);
|
||||
pdata.size = (uint32_t)outData32;
|
||||
dpt_block.r_Word(entry_addr + data::DPTStructure::EntryFlags, outData16);
|
||||
pdata.flags.value = (uint16_t)outData16;
|
||||
dpt_block.r_NullTerminatedString(entry_addr + data::DPTStructure::EntryPartitionLabel, pdata.label);
|
||||
pdata.label.trim();
|
||||
partitionList.push_back(pdata);
|
||||
}
|
||||
out.fg(ostd::ConsoleColors::BrightRed).p("Disk: ").p(vdisk_file).p(" (").p(vHDD.getSize()).p(" bytes)").nl();
|
||||
auto print_part_size = [](uint32_t size, ostd::ConsoleOutputHandler& out, uint16_t line_len) {
|
||||
double dsize = size;
|
||||
ostd::String units[4] = { " bytes", " Kb", " Mb", " Gb" };
|
||||
int32_t unit_index = 0;
|
||||
while (dsize > 1024 && unit_index < 3)
|
||||
{
|
||||
unit_index++;
|
||||
dsize /= 1024.0;
|
||||
}
|
||||
out.p(ostd::String("").add(dsize, 2).add(units[unit_index]).new_fixedLength(line_len));
|
||||
};
|
||||
uint16_t len = 20;
|
||||
out.nl().fg(ostd::ConsoleColors::BrightGray);
|
||||
out.p(ostd::String("=").new_fixedLength(5 * len, '=')).nl();
|
||||
out.fg(ostd::ConsoleColors::Blue);
|
||||
out.p(" ");
|
||||
out.p(ostd::String("LABEL").new_fixedLength(len));
|
||||
out.p(ostd::String("SIZE").new_fixedLength(len));
|
||||
out.p(ostd::String("START").new_fixedLength(len));
|
||||
out.p(ostd::String("END").new_fixedLength(len));
|
||||
out.p(ostd::String("FLAGS").new_fixedLength(len));
|
||||
out.nl().fg(ostd::ConsoleColors::BrightGray);
|
||||
out.p(ostd::String("=").new_fixedLength(5 * len, '=')).nl();
|
||||
for (int32_t i = 0; i < partitionList.size(); i++)
|
||||
{
|
||||
bool comma = false;
|
||||
auto& part = partitionList[i];
|
||||
if (part.label == "")
|
||||
part.label = "<NO-LABEL>";
|
||||
out.fg(ostd::ConsoleColors::Cyan).p(" ");
|
||||
out.p(part.label.new_fixedLength(len));
|
||||
print_part_size(part.size, out, len);
|
||||
out.p(ostd::Utils::getHexStr(part.startAddress, true, 4).new_fixedLength(len));
|
||||
out.p(ostd::Utils::getHexStr(part.startAddress + part.size, true, 4).new_fixedLength(len));
|
||||
if (ostd::Bits::get(part.flags, data::DPTStructure::tFlags::Boot))
|
||||
{
|
||||
if (comma)
|
||||
out.p(", ");
|
||||
out.fg(ostd::ConsoleColors::Yellow).p("Boot").fg(ostd::ConsoleColors::Cyan);
|
||||
}
|
||||
out.nl();
|
||||
}
|
||||
out.fg(ostd::ConsoleColors::BrightGray);
|
||||
out.p(ostd::String("=").new_fixedLength(5 * len, '=')).nl();
|
||||
out.reset().nl();
|
||||
return ErrorNoError;
|
||||
}
|
||||
|
||||
void Tools::print_application_help(void)
|
||||
{
|
||||
out.nl().fg(ostd::ConsoleColors::Yellow).p("List of available tools:").nl().nl();
|
||||
|
|
@ -137,6 +260,10 @@ namespace dragon
|
|||
out.p(" <destination_file> Path of the destination Virtual Disk file to be created.").nl();
|
||||
out.p(" <size_in_bytes> Size of the new Virtual Disk file, in bytes .").nl().nl();
|
||||
|
||||
out.fg(ostd::ConsoleColors::Blue).p("read-dpt <virtual_disk_file>").nl();
|
||||
out.fg(ostd::ConsoleColors::Green).p("The <read-dpt> tool is used to read the partition table of a Virtual Disk File.").nl();
|
||||
out.p(" <virtual_disk_file> Path to the Virtual Disk file.").nl().nl();
|
||||
|
||||
out.fg(ostd::ConsoleColors::Magenta).p("Usage: ./dtools <tool_name> [...arguments...]").nl().nl().reset();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ namespace dragon
|
|||
private:
|
||||
static int32_t tool_new_virtual_disk(int argc, char** argv);
|
||||
static int32_t tool_load_binary(int argc, char** argv);
|
||||
static int32_t tool_read_dpt(int argc, char** argv);
|
||||
static void print_application_help(void);
|
||||
static int32_t get_tool(int argc, char** argv, ostd::String& outTool);
|
||||
|
||||
|
|
@ -31,5 +32,11 @@ namespace dragon
|
|||
inline static constexpr int32_t ErrorLoadProgNonIntAddr = 7;
|
||||
inline static constexpr int32_t ErrorLoadProgUnableToLoadVDisk = 8;
|
||||
inline static constexpr int32_t ErrorLoadProgUnableToLoadDataFile = 9;
|
||||
inline static constexpr int32_t ErrorReadDPTTooFewArgs = 10;
|
||||
inline static constexpr int32_t ErrorReadDPTUnableToLoadVDisk = 11;
|
||||
inline static constexpr int32_t ErrorReadDPTSmallDisk = 12;
|
||||
inline static constexpr int32_t ErrorReadDPTUnableToRead = 13;
|
||||
inline static constexpr int32_t ErrorReadDPTNoPartitionTable = 14;
|
||||
|
||||
};
|
||||
}
|
||||
Loading…
Reference in a new issue