@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 _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