Subversion Repositories SvarDOS

Rev

Rev 1559 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1556 mateusz.vi 1
/*
2
 * replacement for a couple of libc functions
3
 */
4
 
5
#include <i86.h>
6
#include <stddef.h>
7
 
8
#include "libc.h"
9
 
10
 
11
size_t strlen(const char *s) {
12
  size_t res = 0;
13
  while (s[res] != 0) res++;
14
  return(res);
15
}
16
 
17
void bzero(void *ptr, size_t len) {
18
  while (len > 0) ((char *)ptr)[--len] = 0;
19
}
20
 
21
/* TODO this function does not handle overlapping strings well! */
22
void far *_fmemmove(void far *dst, const void far *src, size_t len) {
23
  while (len-- > 0) {
24
    ((char far *)dst)[len] = ((char far *)src)[len];
25
  }
26
  return(dst);
27
}
28
 
1560 mateusz.vi 29
unsigned short mdr_dos_fopen(const char *fname, unsigned short *fhandle) {
30
  unsigned short res = 0;
31
  unsigned short handle = 0;
32
  _asm {
33
    push cx
34
    push dx
35
 
36
    mov ax, 0x3d00
37
    mov dx, fname
38
    xor cl, cl
39
    int 0x21
40
    jc err
41
    mov handle, ax
42
    jmp done
43
    err:
44
    mov res, ax
45
    done:
46
 
47
    pop dx
48
    pop cx
49
  }
50
  *fhandle = handle;
51
  return(res);
52
}
53
 
54
 
1556 mateusz.vi 55
unsigned short mdr_dos_fclose(unsigned short handle) {
56
  unsigned short res = 0;
57
  _asm {
58
    push bx
59
 
60
    mov ah, 0x3e
61
    mov bx, handle
62
    int 0x21
63
    jnc done
64
    mov res, ax
65
    done:
66
 
67
    pop bx
68
  }
69
  return(res);
70
}
71
 
72
 
73
unsigned short _dos_freemem(unsigned short segn) {
74
  unsigned short res = 0;
75
  _asm {
76
    push es
77
    mov ah, 0x49
78
    mov es, segn
79
    int 0x21
80
    pop es
81
    jnc done
82
    mov res, ax
83
    done:
84
  }
85
  return(res);
86
}
87
 
88
 
89
unsigned short mdr_dos_allocmem(unsigned short siz) {
90
  unsigned short segnum = 0;
91
 
92
  _asm {
93
    push bx
94
 
95
    mov ah, 0x48
96
    mov bx, siz
97
    int 0x21
98
    jc done
99
    mov segnum, ax
100
 
101
    done:
102
 
103
    pop bx
104
  }
105
 
106
  return(segnum);
107
}
108
 
109
 
1557 mateusz.vi 110
unsigned short mdr_dos_resizeblock(unsigned short siz, unsigned short segn) {
1556 mateusz.vi 111
  unsigned short res = 0;
112
 
113
  _asm {
114
    push bx
115
    push es
116
 
117
    mov ah, 0x4a
118
    mov bx, siz
119
    mov es, segn
120
    int 0x21
121
    jnc done
122
    mov res, ax
123
 
124
    done:
125
 
126
    pop es
127
    pop bx
128
  }
129
 
130
  return(res);
131
}
132
 
133
 
134
unsigned short mdr_dos_read(unsigned short handle, void far *buf, unsigned short count, unsigned short *bytes) {
135
  unsigned short res = 0;
136
  unsigned short resax = 0;
137
  unsigned short buf_off = FP_OFF(buf);
138
  unsigned short buf_seg = FP_SEG(buf);
139
 
140
  _asm {
141
    push bx,
142
    push cx
143
    push dx
144
 
145
    mov ah, 0x3f
146
    mov bx, handle
147
    mov cx, count
148
    mov dx, buf_off
149
    push ds
150
    mov ds, buf_seg
151
    int 0x21
152
    pop ds
153
 
154
    jnc done
155
    mov res, ax
156
 
157
    done:
158
    mov resax, ax
159
 
160
    pop dx
161
    pop cx
162
    pop bx
163
  }
164
 
165
  *bytes = resax;
166
  return(res);
167
}
168
 
169
 
170
unsigned short mdr_dos_write(unsigned short handle, const void far *buf, unsigned short count, unsigned short *bytes) {
171
  unsigned short res = 0;
172
  unsigned short resax = 0;
173
  unsigned short buf_seg = FP_SEG(buf);
174
  unsigned short buf_off = FP_OFF(buf);
175
 
176
  _asm {
177
    push bx
178
    push cx
179
    push dx
180
 
181
    mov ah, 0x40
182
    mov bx, handle
183
    mov cx, count
184
    mov dx, buf_off
185
    push ds
186
    mov ds, buf_seg
187
 
188
    int 0x21
189
    pop ds
190
    jnc done
191
    mov res, ax
192
 
193
    done:
194
    mov resax, ax
195
 
196
    pop dx
197
    pop cx
198
    pop bx
199
  }
200
 
201
  *bytes = resax;
202
  return(res);
203
}