@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