72 lines
No EOL
1.6 KiB
Text
72 lines
No EOL
1.6 KiB
Text
@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:2 > 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
|
|
and FL, 0b1111111111111110 ## Disable interrupts
|
|
mov FL, ACC
|
|
_disk_load_from_ddd_blocking_wait_loop:
|
|
## debug_profile_start 0xE0, DBGProfilerTime.MILLIS
|
|
mov ACC, [{DISK_INTERFACE_ADDR + DiskRegisters.RO_STATUS}]
|
|
## debug_profile_stop
|
|
jne $_disk_load_from_ddd_blocking_wait_loop, DiskStatus.FREE
|
|
or FL, 0b0000000000000001 ## Enable interrupts
|
|
mov FL, ACC
|
|
ret |