https://github.com/akkartik/mu/blob/main/510disk.mu
1 fn load-sectors disk: (addr disk), lba: int, n: int, out: (addr stream byte) {
2 var curr-lba/ebx: int <- copy lba
3 var remaining/edx: int <- copy n
4 {
5 compare remaining, 0
6 break-if-<=
7
8 var sectors/eax: int <- copy remaining
9 compare sectors, 0x100
10 {
11 break-if-<=
12 sectors <- copy 0x100
13 }
14
15 read-ata-disk disk, curr-lba, sectors, out
16
17 remaining <- subtract sectors
18 curr-lba <- add sectors
19 loop
20 }
21 }
22
23 fn store-sectors disk: (addr disk), lba: int, n: int, in: (addr stream byte) {
24 var curr-lba/ebx: int <- copy lba
25 var remaining/edx: int <- copy n
26 {
27 compare remaining, 0
28 break-if-<=
29
30 var sectors/eax: int <- copy remaining
31 compare sectors, 0x100
32 {
33 break-if-<=
34 sectors <- copy 0x100
35 }
36
37 write-ata-disk disk, curr-lba, sectors, in
38
39 remaining <- subtract sectors
40 curr-lba <- add sectors
41 loop
42 }
43 }