wok-next annotate syslinux/stuff/iso2exe/libdos.c @ rev 17454

syslinux/iso2exe: create a vfat partition in usb bootkey (DOS case only)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 18 11:42:27 2014 +0100 (2014-12-18)
parents 7d300004a3b8
children 6aed6fc5819d
rev   line source
pascal@13691 1 #include "libdos.h"
pascal@13691 2
pascal@13691 3 char *progname(void)
pascal@13691 4 {
pascal@13691 5 #asm
pascal@13691 6 .bss
pascal@13691 7 ._name lcomm 80
pascal@13691 8 .text
pascal@13691 9 push es
pascal@13691 10 seg cs
pascal@13691 11 mov es, [0x2C]
pascal@13691 12 mov cx, #-1
pascal@13691 13 xor di, di
pascal@13691 14 xor al, al
pascal@13691 15 loop1:
pascal@13691 16 repne
pascal@13691 17 scasb
pascal@13691 18 scasb
pascal@13691 19 jne loop1
pascal@13691 20 lea si, [di+2]
pascal@13691 21 push ds
pascal@13691 22 push ds
pascal@13691 23 push es
pascal@13691 24 pop ds
pascal@13691 25 pop es
pascal@13691 26 mov di, ._name
pascal@13691 27 push di
pascal@13691 28 loop2:
pascal@13691 29 lodsb
pascal@13691 30 stosb
pascal@13691 31 or al, al
pascal@13691 32 jnz loop2
pascal@13691 33 pop ax
pascal@13691 34 pop ds
pascal@13691 35 pop es
pascal@13691 36 #endasm
pascal@13691 37 }
pascal@13691 38
pascal@13691 39 #ifdef __SLEEP
pascal@13691 40 void sleep(int seconds)
pascal@13691 41 {
pascal@13691 42 unsigned long n;
pascal@13691 43
pascal@13691 44 n = (seconds * 182) / 10;
pascal@13691 45 #asm
pascal@13691 46 push es
pascal@13691 47 push #0
pascal@13691 48 pop es
pascal@13691 49 mov di, #0x46C
pascal@13691 50 sleeplp:
pascal@13691 51 mov cx, #0x8000
pascal@13691 52 or dx, dx
pascal@13691 53 jne siok
pascal@13691 54 mov cx, ax
pascal@13691 55 jcxz done
pascal@13691 56 siok:
pascal@13691 57 sub ax, cx
pascal@13691 58 sbb dx, #0
pascal@13691 59 seg es
pascal@13691 60 add cx, [di]
pascal@13691 61 zzz:
pascal@13691 62 seg es
pascal@13691 63 cmp cx, [di]
pascal@13691 64 jne zzz
pascal@13691 65 jmp sleeplp
pascal@13691 66 done:
pascal@13691 67 pop es
pascal@13691 68 #endasm
pascal@13691 69 }
pascal@13691 70 #endif
pascal@13691 71
pascal@13691 72 int chdirname(char *path)
pascal@13691 73 {
pascal@13691 74 #asm
pascal@13691 75 pop ax
pascal@13691 76 pop bx
pascal@13691 77 push bx
pascal@13691 78 push ax
pascal@13691 79 cmp byte ptr [bx+1], #0x3A
pascal@13691 80 jne nodisk
pascal@13691 81 mov dl, [bx]
pascal@13691 82 or dl, #0x20
pascal@13691 83 sub dl, #0x61
pascal@13691 84 mov ah, #0x0E
pascal@13691 85 push bx
pascal@13691 86 int 0x21
pascal@13691 87 pop bx
pascal@13691 88 inc bx
pascal@13691 89 inc bx
pascal@13691 90 nodisk:
pascal@13691 91 mov dx, bx
pascal@13691 92 xor cx, cx
pascal@13691 93 next:
pascal@13691 94 mov al, [bx]
pascal@13691 95 cmp al, #0x5C
pascal@13691 96 jne tsteos
pascal@13691 97 mov cx, bx
pascal@13691 98 tsteos:
pascal@13691 99 inc bx
pascal@13691 100 or al, al
pascal@13691 101 jnz next
pascal@13691 102 cbw
pascal@13691 103 jcxz quit
pascal@13691 104 mov bx, cx
pascal@13691 105 push [bx]
pascal@13691 106 mov [bx], al
pascal@13691 107 push bx
pascal@13691 108 call chdir
pascal@13691 109 pop bx
pascal@13691 110 pop [bx]
pascal@13691 111 quit:
pascal@13691 112 ret
pascal@13691 113
pascal@13691 114 // int chdir(char *path)
pascal@13691 115 _chdir:
pascal@13691 116 pop ax
pascal@13691 117 pop dx
pascal@13691 118 push dx
pascal@13691 119 push ax
pascal@13691 120 chdir:
pascal@13691 121 stc
pascal@13691 122 mov ax, #0x713B
pascal@13691 123 int 0x21
pascal@13691 124 jnc chdireturn
pascal@13691 125 mov ah, #0x3B
pascal@13691 126 int 0x21
pascal@13691 127 chdireturn:
pascal@13691 128 sbb ax, ax
pascal@13691 129 #endasm
pascal@13691 130 }
pascal@17160 131
pascal@17160 132 void dosshutdown(void)
pascal@17160 133 {
pascal@17160 134 #asm
pascal@17160 135 push bp
pascal@17160 136 push si
pascal@17160 137 push di
pascal@17160 138 push ds
pascal@17160 139 seg cs
pascal@17160 140 mov stack+2, ss
pascal@17160 141 seg cs
pascal@17160 142 mov stack,sp
pascal@17160 143 xor bx, bx
pascal@17160 144 mov ds, bx // ds = 0
pascal@17160 145 mov [bx+4], #step
pascal@17160 146 mov [bx+6], cs
pascal@17160 147 pushf
pascal@17160 148 pop ax
pascal@17160 149 or ax, #0x100 // set TF
pascal@17160 150 push ax
pascal@17160 151 popf
pascal@17160 152 jmp far [bx+4*0x19]
pascal@17160 153 stack:
pascal@17160 154 .long 0
pascal@17160 155 stepagain:
pascal@17160 156 iret
pascal@17160 157 step:
pascal@17160 158 push si
pascal@17160 159 push ds
pascal@17160 160 mov si, sp
pascal@17160 161 seg ss
pascal@17160 162 lds si, [si+4]
pascal@17160 163 cmp word ptr [si], #0x19CD
pascal@17160 164 pop ds
pascal@17160 165 pop si
pascal@17160 166 jne stepagain
pascal@17160 167 seg cs
pascal@17160 168 lss sp, stack
pascal@17160 169 pop ds
pascal@17160 170 pop di
pascal@17160 171 pop si
pascal@17160 172 pop bp
pascal@17160 173 #endasm
pascal@17160 174 }
pascal@17160 175
pascal@17160 176 int versiondos;
pascal@17160 177 int dosversion(void)
pascal@17160 178 {
pascal@17160 179 #asm
pascal@17160 180 mov ah, #0x30
pascal@17160 181 int 0x21
pascal@17160 182 cbw
pascal@17160 183 mov _versiondos, ax
pascal@17160 184 #endasm
pascal@17160 185 }