1 1.1 rin /* $NetBSD: dos_file.S,v 1.1 2024/06/29 13:45:14 rin Exp $ */ 2 1.1 rin 3 1.1 rin /* extracted from Tor Egge's patches for NetBSD boot */ 4 1.1 rin 5 1.1 rin #include <machine/asm.h> 6 1.1 rin 7 1.1 rin /* 8 1.1 rin # MSDOS call "INT 0x21 Function 0x3d" to open a file. 9 1.1 rin # Call with %ah = 0x3d 10 1.1 rin # %al = 0x0 (access and sharing modes) 11 1.1 rin # %ds:%dx = ASCIZ filename 12 1.1 rin # %cl = attribute mask of files to look for 13 1.1 rin */ 14 1.1 rin 15 1.1 rin .globl _C_LABEL(doserrno) 16 1.1 rin _C_LABEL(doserrno): .long 1 17 1.1 rin 18 1.1 rin ENTRY(dosopen) 19 1.1 rin .code32 20 1.1 rin pushl %ebp 21 1.1 rin movl %esp, %ebp 22 1.1 rin pushl %edx 23 1.1 rin pushl %ebx 24 1.1 rin pushl %esi 25 1.1 rin pushl %edi 26 1.1 rin 27 1.1 rin movl 0x8(%ebp), %edx # File name. 28 1.1 rin 29 1.1 rin call _C_LABEL(prot_to_real) # enter real mode 30 1.1 rin .code16 31 1.1 rin 32 1.1 rin push %ds 33 1.1 rin movl %edx, %eax 34 1.1 rin shrl $4, %eax 35 1.1 rin mov %ds, %si 36 1.1 rin add %si, %ax 37 1.1 rin mov %ax, %ds 38 1.1 rin and $0xf, %dx 39 1.1 rin 40 1.1 rin movb $0x3d, %ah # Open existing file. 41 1.1 rin movb $0x0 , %al # ro 42 1.1 rin 43 1.1 rin sti 44 1.1 rin int $0x21 45 1.1 rin cli 46 1.1 rin pop %ds 47 1.1 rin 48 1.1 rin jnc ok1 49 1.1 rin mov %ax, _C_LABEL(doserrno) 50 1.1 rin movl $-1, %edx 51 1.1 rin jmp err1 52 1.1 rin ok1: 53 1.1 rin movl $0,%edx 54 1.1 rin mov %ax, %dx 55 1.1 rin err1: 56 1.1 rin calll _C_LABEL(real_to_prot) # back to protected mode 57 1.1 rin .code32 58 1.1 rin 59 1.1 rin movl %edx, %eax # return value in %eax 60 1.1 rin 61 1.1 rin popl %edi 62 1.1 rin popl %esi 63 1.1 rin popl %ebx 64 1.1 rin popl %edx 65 1.1 rin popl %ebp 66 1.1 rin ret 67 1.1 rin 68 1.1 rin ENTRY(dosread) 69 1.1 rin .code32 70 1.1 rin pushl %ebp 71 1.1 rin movl %esp, %ebp 72 1.1 rin pushl %ebx 73 1.1 rin pushl %ecx 74 1.1 rin pushl %edx 75 1.1 rin pushl %esi 76 1.1 rin pushl %edi 77 1.1 rin 78 1.1 rin movl 0x8(%ebp), %ebx # File handle 79 1.1 rin movl 0xc(%ebp), %edx # Buffer. 80 1.1 rin movl 0x10(%ebp), %ecx # Bytes to read 81 1.1 rin 82 1.1 rin call _C_LABEL(prot_to_real) # enter real mode 83 1.1 rin .code16 84 1.1 rin 85 1.1 rin push %ds 86 1.1 rin movl %edx, %eax 87 1.1 rin shrl $4, %eax 88 1.1 rin mov %ds, %si 89 1.1 rin add %si, %ax 90 1.1 rin mov %ax, %ds 91 1.1 rin and $0xf, %dx 92 1.1 rin 93 1.1 rin movb $0x3f, %ah # Read from file or device 94 1.1 rin 95 1.1 rin sti 96 1.1 rin int $0x21 97 1.1 rin cli 98 1.1 rin pop %ds 99 1.1 rin 100 1.1 rin jnc ok2 101 1.1 rin mov %ax, _C_LABEL(doserrno) 102 1.1 rin movl $-1, %edx 103 1.1 rin jmp err2 104 1.1 rin ok2: 105 1.1 rin movl $0,%edx 106 1.1 rin mov %ax, %dx 107 1.1 rin err2: 108 1.1 rin calll _C_LABEL(real_to_prot) # back to protected mode 109 1.1 rin .code32 110 1.1 rin 111 1.1 rin movl %edx, %eax # return value in %eax 112 1.1 rin 113 1.1 rin popl %edi 114 1.1 rin popl %esi 115 1.1 rin popl %edx 116 1.1 rin popl %ecx 117 1.1 rin popl %ebx 118 1.1 rin popl %ebp 119 1.1 rin ret 120 1.1 rin 121 1.1 rin ENTRY(dosclose) 122 1.1 rin .code32 123 1.1 rin pushl %ebp 124 1.1 rin movl %esp, %ebp 125 1.1 rin pushl %ebx 126 1.1 rin pushl %esi 127 1.1 rin pushl %edi 128 1.1 rin 129 1.1 rin movl 0x8(%ebp), %ebx # File handle 130 1.1 rin 131 1.1 rin call _C_LABEL(prot_to_real) # enter real mode 132 1.1 rin .code16 133 1.1 rin 134 1.1 rin movb $0x3e, %ah # Close file. 135 1.1 rin 136 1.1 rin sti 137 1.1 rin int $0x21 138 1.1 rin cli 139 1.1 rin 140 1.1 rin jnc ok3 141 1.1 rin mov %ax, _C_LABEL(doserrno) 142 1.1 rin movl $-1, %ebx 143 1.1 rin jmp err3 144 1.1 rin ok3: 145 1.1 rin movl $0, %ebx 146 1.1 rin err3: 147 1.1 rin calll _C_LABEL(real_to_prot) # back to protected mode 148 1.1 rin .code32 149 1.1 rin 150 1.1 rin movl %ebx, %eax # return value in %eax 151 1.1 rin 152 1.1 rin popl %edi 153 1.1 rin popl %esi 154 1.1 rin popl %ebx 155 1.1 rin popl %ebp 156 1.1 rin ret 157 1.1 rin 158 1.1 rin ENTRY(dosseek) 159 1.1 rin .code32 160 1.1 rin pushl %ebp 161 1.1 rin movl %esp, %ebp 162 1.1 rin pushl %ebx 163 1.1 rin pushl %ecx 164 1.1 rin pushl %edx 165 1.1 rin pushl %esi 166 1.1 rin pushl %edi 167 1.1 rin 168 1.1 rin movl 0x8(%ebp), %ebx # File handle 169 1.1 rin movl 0xc(%ebp), %ecx # Offset 170 1.1 rin movl 0x10(%ebp) , %edx # whence 171 1.1 rin 172 1.1 rin call _C_LABEL(prot_to_real) # enter real mode 173 1.1 rin .code16 174 1.1 rin 175 1.1 rin movb $0x42, %ah # Seek 176 1.1 rin movb %dl, %al # whence 177 1.1 rin mov %cx, %dx #offs lo 178 1.1 rin shrl $0x10, %ecx #offs hi 179 1.1 rin 180 1.1 rin sti 181 1.1 rin int $0x21 182 1.1 rin cli 183 1.1 rin 184 1.1 rin jnc ok4 185 1.1 rin mov %ax, _C_LABEL(doserrno) 186 1.1 rin movl $-1, %edx 187 1.1 rin jmp err4 188 1.1 rin ok4: 189 1.1 rin shll $0x10, %edx #new ofs hi 190 1.1 rin mov %ax, %dx #new ofs lo 191 1.1 rin err4: 192 1.1 rin calll _C_LABEL(real_to_prot) # back to protected mode 193 1.1 rin .code32 194 1.1 rin 195 1.1 rin movl %edx, %eax # return value in %eax 196 1.1 rin 197 1.1 rin popl %edi 198 1.1 rin popl %esi 199 1.1 rin popl %edx 200 1.1 rin popl %ecx 201 1.1 rin popl %ebx 202 1.1 rin popl %ebp 203 1.1 rin ret 204