DragonVM/extra/dss/drake/disk.dss

70 lines
No EOL
1.5 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:
mov ACC, [{DISK_INTERFACE_ADDR + DiskRegisters.RO_STATUS}]
jne $_disk_load_from_ddd_blocking_wait_loop, DiskStatus.FREE
or FL, 0b0000000000000001 ## Enable interrupts
mov FL, ACC
ret