| rev | line source | 
| pascal@19515 | 1 ;*************************************************************** | 
| pascal@19515 | 2 ;****** This file is distributed under GPL | 
| pascal@19515 | 3 ;*************************************************************** | 
| pascal@19515 | 4                 ideal | 
| pascal@19515 | 5                 %crefref | 
| pascal@19515 | 6                 %noincl | 
| pascal@19515 | 7                 %nomacs | 
| pascal@19636 | 8 		ifdef	NO386 | 
| pascal@19636 | 9                 p8086 | 
| pascal@19636 | 10 		else | 
| pascal@19515 | 11                 p386 | 
| pascal@19636 | 12 		endif | 
| pascal@19515 | 13 | 
| pascal@19515 | 14         group   DGROUP  _TEXT,_DATA,_BSS | 
| pascal@19515 | 15         assume  cs:DGROUP,ds:DGROUP | 
| pascal@19515 | 16 | 
| pascal@19515 | 17         segment _DATA byte public use16 'DATA' | 
| pascal@19515 | 18 | 
| pascal@20451 | 19 		global	_heap_top | 
| pascal@20451 | 20 		extrn	_bss_end | 
| pascal@19546 | 21 _heap_top	dw	_bss_end | 
| pascal@19546 | 22 msg_hang	db      "High mem corrupted - not exiting to DOS" | 
| pascal@20527 | 23 msg_lf		db	10,0 | 
| pascal@20451 | 24 vcpi_alloc_err	db	"VCPI " | 
| pascal@20451 | 25 msg_malloc      db      "malloc error",0 | 
| pascal@19825 | 26 	ifdef	EXTRA | 
| pascal@19825 | 27 tazboot_cmd	db	"tazboot.cmd",0 | 
| pascal@19825 | 28 	endif | 
| pascal@19515 | 29 | 
| pascal@19515 | 30         ends    _DATA | 
| pascal@19515 | 31 | 
| pascal@19515 | 32         segment _BSS byte public use16 'BSS' | 
| pascal@19515 | 33 | 
| pascal@20538 | 34 _xfer_buf	db	4096	dup (?) | 
| pascal@19515 | 35         global  _no_exit:byte | 
| pascal@19515 | 36 _no_exit	db	? | 
| pascal@19515 | 37 filecnt		db	?		; in fact 0 minus file count... | 
| pascal@19515 | 38 nextfilename	dw	? | 
| pascal@19571 | 39 	ifdef	LARGE_IMAGES | 
| pascal@19571 | 40 curdata		dw	? | 
| pascal@19571 | 41 	endif | 
| pascal@19825 | 42 	ifdef	EXTRA | 
| pascal@19825 | 43 ultoabuf	db	12	dup (?) | 
| pascal@19825 | 44 	endif | 
| pascal@19515 | 45 | 
| pascal@19515 | 46         ends    _BSS | 
| pascal@19515 | 47 | 
| pascal@19515 | 48         segment _TEXT byte public use16 'CODE' | 
| pascal@19515 | 49 | 
| pascal@19515 | 50 ;*************************************************************** | 
| pascal@20630 | 51 ;_fastcall void strcpy(bx:const char* a, ax:const char* b); | 
| pascal@20630 | 52 ;_fastcall void strcat(bx:const char* a, ax:const char* b); | 
| pascal@20630 | 53 ;_fastcall void strcatb(bx:const char* a, ax:const char* b); | 
| pascal@19538 | 54 ;*************************************************************** | 
| pascal@20528 | 55         global  @strcatb$qpxzct1:near | 
| pascal@20528 | 56         proc	@strcatb$qpxzct1 near | 
| pascal@19538 | 57 | 
| pascal@19826 | 58 	ifdef	EXTRA | 
| pascal@20142 | 59 		mov	cl,7Fh | 
| pascal@20539 | 60 		db	0bah			; mov	dx,imm opcode | 
| pascal@20528 | 61         global  @strcat$qpxzct1:near | 
| pascal@20528 | 62 @strcat$qpxzct1: | 
| pascal@20142 | 63 		mov	cl,80h | 
| pascal@20539 | 64 		db	0bah			; mov	dx,imm opcode | 
| pascal@20528 | 65         global	@strcpy$qpxzct1:near | 
| pascal@20528 | 66 @strcpy$qpxzct1: | 
| pascal@20142 | 67 		xor	cx,cx | 
| pascal@19826 | 68 	endif | 
| pascal@19538 | 69                 push	si | 
| pascal@20630 | 70                 xchg	ax,bx			; b | 
| pascal@20630 | 71                 xchg	ax,si			; a | 
| pascal@19826 | 72 	ifdef	EXTRA | 
| pascal@20142 | 73 		jcxz	@@nocat | 
| pascal@19826 | 74 	endif | 
| pascal@19538 | 75 @@catlp: | 
| pascal@20630 | 76 		lodsb				; a=si | 
| pascal@20527 | 77 		or	al,al | 
| pascal@19538 | 78                 jne	@@catlp | 
| pascal@19538 | 79 		dec	si | 
| pascal@19826 | 80 	ifdef	EXTRA | 
| pascal@20630 | 81 		cmp	bx,si | 
| pascal@20630 | 82 		adc	al,cl		; set S when bx != si or cl = 80 | 
| pascal@20142 | 83 		mov	al,20h | 
| pascal@20142 | 84 		jns	@@cpyhead | 
| pascal@19826 | 85 	endif | 
| pascal@19538 | 86 @@nocat: | 
| pascal@19538 | 87 @@cpylp: | 
| pascal@20142 | 88                 mov	al,[bx] | 
| pascal@20142 | 89                 inc	bx | 
| pascal@20142 | 90 @@cpyhead: | 
| pascal@19538 | 91                 mov	[si],al | 
| pascal@19538 | 92                 inc	si | 
| pascal@20527 | 93 		or	al,al | 
| pascal@19538 | 94                 jne	@@cpylp | 
| pascal@20142 | 95 strfound: | 
| pascal@20142 | 96 		xchg	ax,dx | 
| pascal@20142 | 97 strend: | 
| pascal@19538 | 98                 pop	si | 
| pascal@20142 | 99 		ret | 
| pascal@19538 | 100 | 
| pascal@20528 | 101         endp	@strcatb$qpxzct1 | 
| pascal@19538 | 102 | 
| pascal@19538 | 103 | 
| pascal@20146 | 104 	ifdef	EXTRA | 
| pascal@20146 | 105                 p8086 | 
| pascal@20146 | 106 ;*************************************************************** | 
| pascal@20630 | 107 ;_fastcall char strstr(bx:const char* a, ax:const char* b); | 
| pascal@20146 | 108 ;*************************************************************** | 
| pascal@20528 | 109         global  @strstr$qpxzct1:near | 
| pascal@20528 | 110         proc    @strstr$qpxzct1 near | 
| pascal@20146 | 111 | 
| pascal@20538 | 112                 xchg	ax,cx			; b | 
| pascal@20538 | 113                 mov	dx,bx			; a | 
| pascal@20146 | 114                 push	si | 
| pascal@20146 | 115 @@loop: | 
| pascal@20146 | 116 		xor	ax,ax | 
| pascal@20146 | 117 		mov	si,dx | 
| pascal@20146 | 118 		cmp	[si],al			; *a | 
| pascal@20146 | 119 		jz	strend			; return ax = NULL | 
| pascal@20146 | 120 		mov	bx,cx | 
| pascal@20146 | 121 @@match: | 
| pascal@20146 | 122 		or	ah,[bx]			; *b | 
| pascal@20146 | 123 		jz	strfound | 
| pascal@20146 | 124 		inc	bx | 
| pascal@20146 | 125 		lodsb | 
| pascal@20146 | 126 		sub	ah,al | 
| pascal@20146 | 127 		jz	@@match | 
| pascal@20146 | 128 		inc	dx | 
| pascal@20146 | 129 		jmp	@@loop | 
| pascal@20146 | 130 | 
| pascal@20528 | 131         endp    @strstr$qpxzct1 | 
| pascal@20146 | 132 | 
| pascal@20146 | 133 | 
| pascal@20146 | 134 ;*************************************************************** | 
| pascal@20630 | 135 ;_fastcall int strcmp(bx:const char* a, ax:const char* b); | 
| pascal@20146 | 136 ;*************************************************************** | 
| pascal@20528 | 137         global  @strcmp$qpxzct1:near | 
| pascal@20528 | 138         proc    @strcmp$qpxzct1 near | 
| pascal@20146 | 139 | 
| pascal@20146 | 140                 push	si | 
| pascal@20146 | 141 		xchg	ax,si | 
| pascal@20146 | 142 		dec	bx | 
| pascal@20146 | 143 @@lp: | 
| pascal@20146 | 144 		inc	bx | 
| pascal@20146 | 145 		lodsb | 
| pascal@20146 | 146 		sub	al,[bx] | 
| pascal@20146 | 147 		jnz	@@out | 
| pascal@20630 | 148 		or	al,[bx] | 
| pascal@20146 | 149 		jnz	@@lp | 
| pascal@20146 | 150 @@out: | 
| pascal@20146 | 151 		cbw | 
| pascal@20146 | 152                 pop	si | 
| pascal@20146 | 153                 ret | 
| pascal@20146 | 154 | 
| pascal@20528 | 155         endp    @strcmp$qpxzct1 | 
| pascal@20146 | 156 	endif | 
| pascal@20146 | 157 | 
| pascal@20146 | 158 | 
| pascal@19538 | 159 ;*************************************************************** | 
| pascal@20630 | 160 ;_fastcall void puts(bx:const char* s): | 
| pascal@19515 | 161 ;*************************************************************** | 
| pascal@20528 | 162         global  @puts$qpxzc:near | 
| pascal@20528 | 163         proc    @puts$qpxzc near | 
| pascal@19515 | 164 | 
| pascal@20486 | 165 ;        global  puts:near			; puts(bx) | 
| pascal@19515 | 166 puts: | 
| pascal@20510 | 167 		call	@@putsz | 
| pascal@20527 | 168                 mov	bx,offset msg_lf | 
| pascal@20527 | 169 		mov	dl,13 | 
| pascal@20510 | 170 @@putcz: | 
| pascal@20160 | 171 		mov	ah,2 | 
| pascal@20146 | 172 		int	21h | 
| pascal@20510 | 173 @@putsz: | 
| pascal@20160 | 174 		mov	dl,[bx] | 
| pascal@20146 | 175 		inc	bx | 
| pascal@20160 | 176 		or	dl,dl | 
| pascal@20510 | 177 		jne	@@putcz			; ZF=1  (for malloc failure) | 
| pascal@19538 | 178 		ret | 
| pascal@19515 | 179 | 
| pascal@20528 | 180         endp    @puts$qpxzc | 
| pascal@19515 | 181 | 
| pascal@19515 | 182 | 
| pascal@19515 | 183 ;*************************************************************** | 
| pascal@20630 | 184 ;_fastcall int fileattr(bx:const char* name); | 
| pascal@19538 | 185 ;*************************************************************** | 
| pascal@20528 | 186         global  @fileattr$qpxzc:near | 
| pascal@20528 | 187         proc    @fileattr$qpxzc near | 
| pascal@19538 | 188 | 
| pascal@19538 | 189                 mov	ax,4300h | 
| pascal@20538 | 190 		call	dos_filename | 
| pascal@19538 | 191 		xchg	ax,cx | 
| pascal@19538 | 192 		jmp	chkc | 
| pascal@19538 | 193 | 
| pascal@20528 | 194         endp    @fileattr$qpxzc | 
| pascal@19538 | 195 | 
| pascal@19538 | 196 | 
| pascal@19538 | 197 ;*************************************************************** | 
| pascal@20630 | 198 ;_fastcall int open(bx:const char* name, int flags=O_RDONLY); | 
| pascal@19515 | 199 ;*************************************************************** | 
| pascal@20538 | 200         global  openargs:near			; openargs(bx) | 
| pascal@20538 | 201 openargs: | 
| pascal@20538 | 202 		cmp	[byte bx],'@' | 
| pascal@20538 | 203 		stc | 
| pascal@20538 | 204 		jne	fail | 
| pascal@20538 | 205 		inc	bx | 
| pascal@20538 | 206 | 
| pascal@20528 | 207         global  @open$qpxzc:near | 
| pascal@20528 | 208         proc    @open$qpxzc near | 
| pascal@19515 | 209 | 
| pascal@19546 | 210         global  open:near			; open(bx) | 
| pascal@19515 | 211 open: | 
| pascal@20630 | 212 	ifdef	LONG_FILENAME | 
| pascal@20630 | 213 		mov	ax,716Ch | 
| pascal@20630 | 214 		push	bx si di | 
| pascal@20630 | 215 		mov	di,di			; alias hint | 
| pascal@20630 | 216 		mov	si,bx | 
| pascal@20630 | 217 		xor	bx,bx			; R/O | 
| pascal@20630 | 218 		xor	cx,cx			; attributes | 
| pascal@20630 | 219 		cwd				; action = open | 
| pascal@20630 | 220                 int	21h | 
| pascal@20630 | 221 		pop	di si bx | 
| pascal@20630 | 222                 jnc	doret | 
| pascal@20630 | 223 	endif | 
| pascal@20538 | 224                 mov	ax,3d00h		; read-only+compatibility | 
| pascal@20538 | 225 		;mov	cl,0			; attribute mask | 
| pascal@20538 | 226 dos_filename: | 
| pascal@19515 | 227                 mov	dx,bx | 
| pascal@19515 | 228 dos: | 
| pascal@19515 | 229                 int	21h | 
| pascal@19538 | 230 chkc: | 
| pascal@19515 | 231                 jnc	doret | 
| pascal@19515 | 232 fail: | 
| pascal@19515 | 233                 sbb	ax,ax			; ax=-1 CF | 
| pascal@19515 | 234 		cwd | 
| pascal@19515 | 235 doret: | 
| pascal@19515 | 236 		ifndef	NO386 | 
| pascal@19538 | 237 		push	dx			; see next_chunk:lseek | 
| pascal@19538 | 238 		push	ax | 
| pascal@19538 | 239 		pop	eax | 
| pascal@19515 | 240 		endif | 
| pascal@19515 | 241                 ret | 
| pascal@19515 | 242 | 
| pascal@20528 | 243         endp    @open$qpxzc | 
| pascal@19515 | 244 | 
| pascal@19515 | 245 | 
| pascal@19515 | 246 ;*************************************************************** | 
| pascal@20630 | 247 ;_fastcall int close(ax:int fd); | 
| pascal@19515 | 248 ;*************************************************************** | 
| pascal@20528 | 249         global  @close$qi:near | 
| pascal@20528 | 250         proc    @close$qi near | 
| pascal@19515 | 251 | 
| pascal@20540 | 252         global  close:near			; close(ax) | 
| pascal@19515 | 253 close: | 
| pascal@20540 | 254 		xchg	ax,bx | 
| pascal@19515 | 255 		mov	ah,3Eh | 
| pascal@19515 | 256 		or	bx,bx | 
| pascal@19515 | 257 		jnz	dos | 
| pascal@19515 | 258 		ret | 
| pascal@19515 | 259 | 
| pascal@20528 | 260         endp    @close$qi | 
| pascal@19515 | 261 | 
| pascal@19515 | 262 | 
| pascal@19515 | 263 ;*************************************************************** | 
| pascal@20630 | 264 ;_fastcall int read(ax:int fd, bx:void* data, dx:int sz); | 
| pascal@20630 | 265 ;_fastcall int write(ax:int fd, bx:const void* data, dx:int sz); | 
| pascal@19515 | 266 ;*************************************************************** | 
| pascal@20528 | 267         global  @read$qipvi:near | 
| pascal@20528 | 268         proc    @read$qipvi near | 
| pascal@19515 | 269 | 
| pascal@20146 | 270 		ifdef	WRITE | 
| pascal@19580 | 271                 stc | 
| pascal@19634 | 272 		db	0B0h			; mov al,im | 
| pascal@20528 | 273         global  @write$qipvi:near | 
| pascal@20528 | 274 @write$qipvi: | 
| pascal@19580 | 275                 clc | 
| pascal@20146 | 276 		endif | 
| pascal@20538 | 277 		xchg	ax,bx			; fd | 
| pascal@20538 | 278 		xchg	ax,dx			; data | 
| pascal@20538 | 279 		xchg	ax,cx			; sz | 
| pascal@20146 | 280 		ifdef	WRITE | 
| pascal@19580 | 281                 mov	ah,40h | 
| pascal@19580 | 282 		sbb	ah,0 | 
| pascal@20146 | 283 		else | 
| pascal@20528 | 284 	global	@read$cxdxbx:near | 
| pascal@20528 | 285 @read$cxdxbx: | 
| pascal@20146 | 286                 mov	ah,3Fh | 
| pascal@20146 | 287 		endif | 
| pascal@19515 | 288                 jcxz	fail | 
| pascal@19515 | 289 		jmp	dos | 
| pascal@19515 | 290 | 
| pascal@20528 | 291         endp    @read$qipvi | 
| pascal@19515 | 292 | 
| pascal@19515 | 293 ;*************************************************************** | 
| pascal@20630 | 294 ;_fastcall long lseekset(ax:int fd, dx:unsigned whence); | 
| pascal@20630 | 295 ;_fastcall long lseekcur(ax:int fd, dx:int whence); | 
| pascal@19515 | 296 ;*************************************************************** | 
| pascal@19899 | 297 | 
| pascal@20548 | 298         global  @lseekcur$qii:near		; fd=ax whence=dx | 
| pascal@20542 | 299         proc    @lseekcur$qii near | 
| pascal@20542 | 300 | 
| pascal@20542 | 301 		xchg	ax,bx | 
| pascal@20542 | 302 		xchg	ax,dx | 
| pascal@20542 | 303 		cwd | 
| pascal@20542 | 304 		xchg	ax,dx | 
| pascal@20542 | 305 		xchg	ax,cx | 
| pascal@20542 | 306 		mov	al,1 | 
| pascal@20542 | 307 		jmp	lseek | 
| pascal@20542 | 308 		ifdef EXTRA | 
| pascal@20538 | 309         global  @lseekset$qiui:near | 
| pascal@20542 | 310 @lseekset$qiui: | 
| pascal@20542 | 311 		mov	bl,0 | 
| pascal@20542 | 312 		jmp	lseek0x | 
| pascal@19571 | 313 lseekset: | 
| pascal@20542 | 314 		mov	bl,0 | 
| pascal@20542 | 315 		jmp	lseekx | 
| pascal@20542 | 316 		endif | 
| pascal@20542 | 317 rewind:						; rewind(ax) | 
| pascal@20542 | 318 		mov	bl,0 | 
| pascal@19571 | 319 lseek0:						; lseek0(bx,ax=dir) | 
| pascal@20542 | 320 		xor	dx,dx | 
| pascal@20542 | 321 lseek0x: | 
| pascal@19571 | 322 		xor	cx,cx | 
| pascal@20542 | 323 lseekx: | 
| pascal@20542 | 324 		xchg	ax,bx | 
| pascal@20542 | 325 lseek: | 
| pascal@20548 | 326 		mov	ah,42h			; bx=fd cx:dx=offset al=whence | 
| pascal@19515 | 327 		jmp	dos | 
| pascal@19515 | 328 | 
| pascal@20542 | 329         endp    @lseekcur$qii | 
| pascal@19825 | 330 | 
| pascal@20538 | 331 		ifdef EXTRA | 
| pascal@20538 | 332 | 
| pascal@20534 | 333 ;typedef unsigned dirsizetype; | 
| pascal@20534 | 334 struc		isostate		; struct isostate { | 
| pascal@20534 | 335 fd		dw	?		; 0	int fd; | 
| pascal@20534 | 336 filemod		dw	?		; 2	unsigned short filemod; | 
| pascal@20534 | 337 fileofs		dd	?		; 4	unsigned long fileofs; | 
| pascal@20534 | 338 filesize	dd	?		; 8	unsigned long filesize; | 
| pascal@20534 | 339 filename	dw	?		;12	char *filename; | 
| pascal@20534 | 340 curdirsize	dw	?		;14	dirsizetype curdirsize; | 
| pascal@20534 | 341 dirsize		dw	?		;16	dirsizetype dirsize; | 
| pascal@20534 | 342 curdirofs	dd	?		;18	unsigned long curdirofs; | 
| pascal@20534 | 343 dirofs		dd	?		;22	unsigned long dirofs; | 
| pascal@20534 | 344 curpos		dw	?		;26	unsigned curpos; | 
| pascal@20534 | 345 buffer		db	2560	dup(?)	;28	char buffer[2048+512]; | 
| pascal@20534 | 346 ends					; } isostate; | 
| pascal@19825 | 347 ;*************************************************************** | 
| pascal@20630 | 348 ;_fastcall long isolseek(bx:const unsigned long *offset); | 
| pascal@19825 | 349 ;*************************************************************** | 
| pascal@20528 | 350         global  @isolseek$qpxul:near | 
| pascal@20528 | 351         proc    @isolseek$qpxul near | 
| pascal@19825 | 352 | 
| pascal@20534 | 353 isolseek: | 
| pascal@19825 | 354 		mov	dx,[bx] | 
| pascal@19825 | 355 		mov	cx,[bx+2] | 
| pascal@19825 | 356 		extrn	_isostate:isostate | 
| pascal@20548 | 357 		mov	ax,[_isostate.fd] | 
| pascal@20538 | 358 		jmp	lseekset | 
| pascal@20534 | 359 | 
| pascal@20538 | 360 	endp	@isolseek$qpxul | 
| pascal@20534 | 361 | 
| pascal@20534 | 362 ;*************************************************************** | 
| pascal@20630 | 363 ;_fastcall int isoreadsector(bx:const unsigned long *offset); | 
| pascal@20534 | 364 ;*************************************************************** | 
| pascal@20534 | 365         global  @isoreadsector$qpxul:near | 
| pascal@20534 | 366         proc    @isoreadsector$qpxul near | 
| pascal@20534 | 367 | 
| pascal@20534 | 368 		call	isolseek | 
| pascal@20528 | 369 		and	ax,dx | 
| pascal@20528 | 370 		inc	ax | 
| pascal@20534 | 371 		jz	@@fail | 
| pascal@20534 | 372 		mov	cx,2560 | 
| pascal@20534 | 373 		mov	dx,offset _isostate.buffer | 
| pascal@20534 | 374 		mov	bx,[_isostate.fd] | 
| pascal@20534 | 375 		call	@read$cxdxbx		; read(fd,buffer,2560) | 
| pascal@20534 | 376 @@fail: | 
| pascal@20534 | 377 		cmp	ax,2048 | 
| pascal@20534 | 378 		sbb	ax,ax | 
| pascal@20528 | 379 		ret | 
| pascal@20534 | 380 | 
| pascal@20534 | 381         endp    @isoreadsector$qpxul | 
| pascal@20534 | 382 | 
| pascal@19825 | 383 		endif | 
| pascal@19515 | 384 | 
| pascal@19515 | 385 | 
| pascal@19515 | 386 ;*************************************************************** | 
| pascal@20630 | 387 ;_fastcall int strhead(bx:const char* a, ax:const char* b); | 
| pascal@19515 | 388 ;*************************************************************** | 
| pascal@20528 | 389         global  @strhead$qpxzct1:near | 
| pascal@20528 | 390         proc    @strhead$qpxzct1 near | 
| pascal@19515 | 391 | 
| pascal@19515 | 392 @@loop: | 
| pascal@19634 | 393 		xchg	ax,bx | 
| pascal@19515 | 394                 mov	cl,[bx]			; cl = *b++ | 
| pascal@19515 | 395                 inc	bx | 
| pascal@19515 | 396 		or	cl,cl			; clear C | 
| pascal@19515 | 397 		jz	fail			; return 0 | 
| pascal@19515 | 398 		xchg	ax,bx | 
| pascal@19515 | 399                 xor	cl,[bx]			; cl -= *a++ | 
| pascal@19634 | 400                 inc	bx | 
| pascal@19515 | 401 		and	cl,0dfh			; case insensitive | 
| pascal@19634 | 402                 jz	@@loop | 
| pascal@19634 | 403 		ret				; return b (is not 0) | 
| pascal@19515 | 404 | 
| pascal@20528 | 405 	endp	@strhead$qpxzct1 | 
| pascal@19515 | 406 | 
| pascal@19515 | 407 | 
| pascal@19515 | 408 ;*************************************************************** | 
| pascal@20630 | 409 ;_fastcall char* malloc_or_die(ax:unsigned size); | 
| pascal@19515 | 410 ;*************************************************************** | 
| pascal@20528 | 411         global  @malloc_or_die$qui:near | 
| pascal@20528 | 412         proc    @malloc_or_die$qui near | 
| pascal@19515 | 413 | 
| pascal@20540 | 414                 xchg	ax,cx			; size | 
| pascal@19515 | 415         global  malloc_or_die:near		; malloc_or_die(cx) | 
| pascal@19515 | 416 malloc_or_die: | 
| pascal@20510 | 417 		mov	ax,[_heap_top]		; return value | 
| pascal@20510 | 418 		mov	bx,sp | 
| pascal@20510 | 419 		add	bh,-14h			; MIN_STACK=_1k+PAGE_SIZE | 
| pascal@20510 | 420 		sub	bx,ax			; can't overflow | 
| pascal@20510 | 421 		cmp	bx,cx | 
| pascal@20456 | 422 		mov	bx,offset msg_malloc | 
| pascal@20510 | 423 		jb	die | 
| pascal@20510 | 424 		add	[_heap_top],cx		; _BEG has zero'd heap | 
| pascal@19515 | 425 		ret | 
| pascal@19515 | 426 | 
| pascal@20528 | 427         endp    @malloc_or_die$qui | 
| pascal@19515 | 428 | 
| pascal@19515 | 429 | 
| pascal@19515 | 430 ;*************************************************************** | 
| pascal@20630 | 431 ;_fastcall int die(bx:const char* msg); | 
| pascal@19538 | 432 ;int exit(); | 
| pascal@19515 | 433 ;int abort(); | 
| pascal@19515 | 434 ;*************************************************************** | 
| pascal@20528 | 435 	global	@die$qpxzc:near | 
| pascal@20528 | 436 	proc	@die$qpxzc near | 
| pascal@20528 | 437 @die$qpxzc: | 
| pascal@19515 | 438         global  die:near			; die(bx) | 
| pascal@19515 | 439 die: | 
| pascal@19515 | 440 		call	puts | 
| pascal@20486 | 441 ;        global  _exit:near | 
| pascal@19538 | 442 _exit: | 
| pascal@19515 | 443 		mov	al,[_no_exit] | 
| pascal@20527 | 444 		or	al,al | 
| pascal@19515 | 445 		jne	@@hang | 
| pascal@19515 | 446 		extrn	exit:near | 
| pascal@19515 | 447 		inc	ax | 
| pascal@19515 | 448 		jmp	near exit | 
| pascal@19515 | 449 @@hang: | 
| pascal@19515 | 450 		mov	bx, offset msg_hang | 
| pascal@19515 | 451 		call	puts | 
| pascal@20486 | 452 ;        global  _abort:near | 
| pascal@19515 | 453 _abort: | 
| pascal@19515 | 454 		cli | 
| pascal@19515 | 455 @@stop: | 
| pascal@19515 | 456 		hlt | 
| pascal@19515 | 457 		jmp	@@stop | 
| pascal@19515 | 458 | 
| pascal@20528 | 459 	endp	@die$qpxzc | 
| pascal@19515 | 460 | 
| pascal@19546 | 461 struc   image_himem		;struct image_himem { | 
| pascal@19546 | 462 fd		dw	?	; 0    int fd; | 
| pascal@19546 | 463 fallback	dd	?	; 2    u32 fallback; | 
| pascal@19546 | 464 size		dd	?	; 6    u32 size; | 
| pascal@19546 | 465 remaining	dd	?	;10    u32 remaining; | 
| pascal@19546 | 466 buf		dd	?	;14    u32 buf; | 
| pascal@19546 | 467 bufv		dw	?	;18    u32 *bufv; | 
| pascal@19546 | 468 errmsg		dw	?	;20    char *errmsg; | 
| pascal@19546 | 469 chunk_size	dd	?	;22    u32 chunk_size; | 
| pascal@19546 | 470 next_chunk	dw	?	;26    void (*next_chunk)(struct image_himem *); | 
| pascal@19546 | 471 state		dw	?	;28    u16 state; | 
| pascal@19546 | 472 fd2close	dw	?	;30    u16 fd2close; | 
| pascal@19546 | 473 ends				;}; | 
| pascal@19515 | 474 | 
| pascal@19636 | 475 ;*************************************************************** | 
| pascal@20630 | 476 ;static long next_chunk(struct image_himem *di); | 
| pascal@19636 | 477 ;*************************************************************** | 
| pascal@19636 | 478         proc    next_chunk near | 
| pascal@19636 | 479 | 
| pascal@19636 | 480 		push	si | 
| pascal@20540 | 481 		mov	ax,[(image_himem di).fd] | 
| pascal@19636 | 482 		call	close | 
| pascal@19636 | 483 		ifndef	NO386 | 
| pascal@19636 | 484 		xor	eax,eax | 
| pascal@19636 | 485 		else | 
| pascal@19636 | 486 		xor	ax,ax | 
| pascal@20485 | 487 		cwd | 
| pascal@19636 | 488 		endif | 
| pascal@19636 | 489 		mov	[(image_himem di).fd],ax | 
| pascal@19636 | 490 		mov	bx,[(image_himem di).state] | 
| pascal@19636 | 491 		cmp	al,[bx]			; "" | 
| pascal@19636 | 492 		jz	@@end | 
| pascal@19636 | 493 		mov	si,bx | 
| pascal@19636 | 494 @@scan: | 
| pascal@19636 | 495 		lodsb | 
| pascal@19636 | 496 		mov	cx,si | 
| pascal@19636 | 497 		cmp	al,',' | 
| pascal@19636 | 498 		jz	@@eos | 
| pascal@20527 | 499 		or	al,al | 
| pascal@19636 | 500 		jnz	@@scan | 
| pascal@19636 | 501 		dec	cx | 
| pascal@19636 | 502 @@eos: | 
| pascal@19636 | 503 		mov	[(image_himem di).state],cx | 
| pascal@19636 | 504 		dec	si | 
| pascal@19636 | 505 		push	[word si] | 
| pascal@20485 | 506 		mov	[byte si],ah		; set temp eos | 
| pascal@19636 | 507 		call	open | 
| pascal@19636 | 508 		pop	[word si]		; restore string | 
| pascal@19636 | 509 		jc	@@die | 
| pascal@19636 | 510 		mov	[(image_himem di).fd],ax | 
| pascal@19636 | 511 		mov	[(image_himem di).fd2close],ax | 
| pascal@20542 | 512 		mov	bl,02h			; SEEK_END | 
| pascal@19636 | 513 		call	lseek0 | 
| pascal@19636 | 514 @@die: | 
| pascal@19636 | 515 		mov	bx,[(image_himem di).errmsg] | 
| pascal@19636 | 516 		jc	die | 
| pascal@19636 | 517 		ifndef	NO386 | 
| pascal@19636 | 518 		push	eax | 
| pascal@20548 | 519 		mov	ax,[(image_himem di).fd] | 
| pascal@19636 | 520 		call	rewind | 
| pascal@19636 | 521 		pop	eax | 
| pascal@19636 | 522 @@end: | 
| pascal@19636 | 523 		mov	[(image_himem di).chunk_size],eax | 
| pascal@19636 | 524 		else | 
| pascal@19636 | 525 		push	ax | 
| pascal@19636 | 526 		push	dx | 
| pascal@20548 | 527 		mov	ax,[(image_himem di).fd] | 
| pascal@19636 | 528 		call	rewind | 
| pascal@19636 | 529 		pop	dx | 
| pascal@19636 | 530 		pop	ax | 
| pascal@19636 | 531 @@end: | 
| pascal@19636 | 532 		mov	[word (image_himem di).chunk_size],ax | 
| pascal@19636 | 533 		mov	[word ((image_himem di).chunk_size)+2],dx | 
| pascal@19636 | 534 		endif | 
| pascal@19636 | 535 		pop	si | 
| pascal@19636 | 536 		ret | 
| pascal@19636 | 537 | 
| pascal@19636 | 538         endp    next_chunk | 
| pascal@19636 | 539 | 
| pascal@19636 | 540 | 
| pascal@19571 | 541 	ifdef	LARGE_IMAGES | 
| pascal@19571 | 542 struc   data_himem			;struct data_himem { | 
| pascal@19571 | 543 first		dd	?		;   0  u32 first; | 
| pascal@19571 | 544 cacheidx	dw	?		;   4  int cacheidx; | 
| pascal@19571 | 545 pageidx		dw	?		;   6  int pageidx; | 
| pascal@19571 | 546 cache		dd	1024 dup(?)	;   8  int cache; | 
| pascal@19571 | 547 page		dd	1024 dup(?)	;4104  int page; | 
| pascal@19571 | 548 ends					;}; // size=8200 | 
| pascal@19571 | 549 	endif | 
| pascal@19571 | 550 | 
| pascal@19515 | 551 ;*************************************************************** | 
| pascal@20630 | 552 ;_fastcall u32* malloc_bufv_or_die(bx:struct image_himem *m); | 
| pascal@19538 | 553 ;*************************************************************** | 
| pascal@20528 | 554         global  @malloc_bufv_or_die$qp11image_himem:near | 
| pascal@20528 | 555         proc    @malloc_bufv_or_die$qp11image_himem near | 
| pascal@19538 | 556 | 
| pascal@19636 | 557                 p386 | 
| pascal@19538 | 558 		push	si | 
| pascal@20538 | 559 		mov	si,bx | 
| pascal@19571 | 560 	ifdef	LARGE_IMAGES | 
| pascal@20527 | 561 		movzx	ecx,[word ((image_himem si).size) + 2] | 
| pascal@19571 | 562 		shr	cx,4			; pages index size = size >> 20 | 
| pascal@19571 | 563 		add	cx,8+4096+8 | 
| pascal@19571 | 564 		call	malloc_or_die | 
| pascal@20527 | 565 		mov	cx,4096+4095		; cnt = 1+(m->size+PAGE_MASK)/PAGE_SIZE; | 
| pascal@19571 | 566 		add	ecx,[(image_himem si).size] | 
| pascal@19571 | 567 		shr	ecx,12 | 
| pascal@19571 | 568 		mov	[curdata],ax | 
| pascal@19571 | 569 	else | 
| pascal@19546 | 570 		mov	ecx,[(image_himem si).size] | 
| pascal@19538 | 571 		dec	ecx | 
| pascal@19538 | 572 		shr	ecx,12 | 
| pascal@19538 | 573 		inc	cx			; cnt = (m->size+PAGE_MASK)/PAGE_SIZE; | 
| pascal@19538 | 574 		push	cx | 
| pascal@19538 | 575 		inc	cx			; cnt+1 | 
| pascal@19538 | 576 		shl	cx,2			; bufv => vcpi => vm86 | 
| pascal@19538 | 577 ; our malloc zeroes allocated mem: bufv[cnt]=0; | 
| pascal@19538 | 578 ; Allocate pages, storing addrs in addrbuf | 
| pascal@19538 | 579 		call	malloc_or_die | 
| pascal@19571 | 580 		pop	cx | 
| pascal@19571 | 581 		push	ax | 
| pascal@19571 | 582 	endif | 
| pascal@19546 | 583 		mov	[(image_himem si).bufv],ax | 
| pascal@19571 | 584 		xchg	ax,si | 
| pascal@19538 | 585 @@vcpi_alloc: | 
| pascal@19538 | 586                 xor     edx,edx | 
| pascal@19538 | 587                 mov     ax,0DE04h | 
| pascal@19538 | 588                 int     67h | 
| pascal@19538 | 589 		or	ah,ah | 
| pascal@19538 | 590 		mov	bx,offset vcpi_alloc_err | 
| pascal@19571 | 591 		jnz	die | 
| pascal@19571 | 592 ; for (i = cnt-1; i >= 0; i--) | 
| pascal@19571 | 593 	ifdef	LARGE_IMAGES | 
| pascal@19571 | 594 		mov	eax,ecx | 
| pascal@19571 | 595 		dec	eax | 
| pascal@19571 | 596 	else | 
| pascal@19571 | 597 		mov	ax,cx | 
| pascal@19571 | 598 		dec	ax | 
| pascal@19571 | 599 		cwde | 
| pascal@19571 | 600 	endif | 
| pascal@19571 | 601 		shl	eax,12		; i*_4k | 
| pascal@19571 | 602 ; if (edx < pm.fallback+i*_4k && edx >= pm.fallback) again | 
| pascal@19899 | 603 		extrn	_imgs | 
| pascal@19899 | 604 		mov	bx,offset _imgs+2 | 
| pascal@19571 | 605 		push	eax | 
| pascal@19571 | 606 		add	eax,[bx-2+2] | 
| pascal@19571 | 607 		cmp	eax,edx		; pm.fallback+i*_4k <= edx ? | 
| pascal@19571 | 608 		pop	eax		; i*_4k | 
| pascal@19571 | 609 		jbe	@@pmok | 
| pascal@19571 | 610 		cmp	edx,[bx-2+2]	; edx >= pm.fallback ? | 
| pascal@19571 | 611 		jae	@@vcpi_alloc | 
| pascal@19571 | 612 @@pmok: | 
| pascal@19571 | 613 ; if (edx >= initrd.fallback+i*_4k && edx < initrd.fallback+initrd.size) again | 
| pascal@19899 | 614 		extrn	_imgs | 
| pascal@19899 | 615 		mov	bx,offset _imgs+32+2 | 
| pascal@19571 | 616 		add	eax,[bx-2+2]	; +initrd.fallback | 
| pascal@19571 | 617 		cmp	eax,edx		; initrd.fallback+i*_4k > edx ? | 
| pascal@19571 | 618 		ja	@@initrdok | 
| pascal@19571 | 619 		mov	eax,[bx-2+6]	; initrd.size | 
| pascal@19571 | 620 		add	eax,[bx-2+2]	; +initrd.fallback | 
| pascal@19571 | 621 		cmp	eax,edx		; initrd.fallback+initrd.size > edx ? | 
| pascal@19571 | 622 @@jnc_vcpi_alloc: | 
| pascal@19571 | 623 		ja	@@vcpi_alloc | 
| pascal@19571 | 624 @@initrdok: | 
| pascal@19571 | 625 	ifdef	LARGE_IMAGES | 
| pascal@19571 | 626 		cmp	[(data_himem si).first],0 | 
| pascal@19571 | 627 		jne	@@notfirst | 
| pascal@19571 | 628 		mov	[(data_himem si).first],edx | 
| pascal@19571 | 629 @@notfirst: | 
| pascal@19571 | 630 		mov	bx,[(data_himem si).cacheidx] | 
| pascal@19571 | 631 		cmp	bh,4 | 
| pascal@19571 | 632 		jae	@@nextpage | 
| pascal@19571 | 633 		shl	bx,2 | 
| pascal@19571 | 634 		inc	[(data_himem si).cacheidx] | 
| pascal@19571 | 635 		mov	[(data_himem bx+si).cache],edx | 
| pascal@19571 | 636 		loopd	@@vcpi_alloc | 
| pascal@19571 | 637 		mov	[(data_himem bx+si).cache],ecx	; last is 0 | 
| pascal@19571 | 638 @@nextpage: | 
| pascal@19571 | 639 		and	[(data_himem si).cacheidx],0 | 
| pascal@19571 | 640 		mov	bx,[(data_himem si).pageidx] | 
| pascal@19571 | 641 		mov	[(data_himem bx+si).page],edx | 
| pascal@19571 | 642 		add	[(data_himem si).pageidx],4 | 
| pascal@19571 | 643 		push	cx | 
| pascal@19571 | 644 		lea	cx,[(data_himem si).cache] | 
| pascal@19571 | 645 		ifdef	NO386 | 
| pascal@19571 | 646 		push	edx | 
| pascal@19571 | 647 		pop	dx | 
| pascal@19571 | 648 		pop	ax | 
| pascal@19571 | 649 		endif | 
| pascal@19571 | 650 		call	storepage		; storepage(edx,cx) | 
| pascal@19571 | 651 		pop	cx | 
| pascal@19571 | 652 		or	ecx,ecx			; clear C | 
| pascal@19571 | 653 		jnz	@@jnc_vcpi_alloc | 
| pascal@19571 | 654 		mov	[dword (data_himem si).cacheidx],ecx | 
| pascal@19571 | 655 		xchg	ax,si | 
| pascal@19571 | 656 	else | 
| pascal@19571 | 657 		mov	[si],edx | 
| pascal@19571 | 658 		lodsd				; si=+4 | 
| pascal@19538 | 659 		loop	@@vcpi_alloc | 
| pascal@19538 | 660 		pop	ax | 
| pascal@19571 | 661 	endif | 
| pascal@19538 | 662 		pop	si | 
| pascal@19538 | 663 		ret | 
| pascal@19636 | 664 		ifdef	NO386 | 
| pascal@19636 | 665                 p8086 | 
| pascal@19636 | 666 		endif | 
| pascal@19538 | 667 | 
| pascal@20528 | 668         endp    @malloc_bufv_or_die$qp11image_himem | 
| pascal@19538 | 669 | 
| pascal@19538 | 670 | 
| pascal@19538 | 671 ;*************************************************************** | 
| pascal@20630 | 672 ;_fastcall void memcpy_image(bx:struct image_himem *m); | 
| pascal@19515 | 673 ;*************************************************************** | 
| pascal@20528 | 674         global  @memcpy_image$qp11image_himem:near | 
| pascal@20528 | 675         proc    @memcpy_image$qp11image_himem near | 
| pascal@19515 | 676 | 
| pascal@19571 | 677 		ifndef	NO386 | 
| pascal@19571 | 678 		mov	edx,[(image_himem bx).fallback] | 
| pascal@19571 | 679 		mov	eax,[(image_himem bx).buf] | 
| pascal@19571 | 680 		cmp	eax,edx			; if (m->fallback != m->buf) | 
| pascal@19571 | 681 		jz	@@skip			;   memcpy32(m->fallback,0,m->buf,m->size) | 
| pascal@19571 | 682 	ifdef	LARGE_IMAGES | 
| pascal@19571 | 683 		mov	ecx,[(image_himem bx).size] | 
| pascal@20146 | 684 memcpy_imagez:					; memcpy_imagez(edx,eax,ecx) | 
| pascal@19571 | 685 		push	ecx | 
| pascal@19571 | 686 	else | 
| pascal@19571 | 687 		push	[(image_himem bx).size] | 
| pascal@19571 | 688 	endif | 
| pascal@19571 | 689 		push	eax | 
| pascal@19571 | 690 		push	0 | 
| pascal@19571 | 691 call_memcpy32: | 
| pascal@19571 | 692 		push	edx | 
| pascal@19571 | 693 		else | 
| pascal@19571 | 694 		mov	ax,[word ((image_himem bx).fallback)] | 
| pascal@19571 | 695 		mov	dx,[word ((image_himem bx).fallback)+2] | 
| pascal@19571 | 696 		mov	cx,[word ((image_himem bx).buf)] | 
| pascal@19571 | 697 		cmp	ax,cx			; if (m->fallback != m->buf) | 
| pascal@19571 | 698 		jnz	@@do | 
| pascal@19571 | 699 		cmp	dx,[word ((image_himem bx).buf)+2] | 
| pascal@19571 | 700 		jz	@@skip			;   memcpy32(m->fallback,0,m->buf,m->size) | 
| pascal@19571 | 701 @@do: | 
| pascal@19571 | 702 		push	[word ((image_himem bx).size)+2] | 
| pascal@19571 | 703 		push	[word ((image_himem bx).size)] | 
| pascal@19571 | 704 		push	[word ((image_himem bx).buf)+2] | 
| pascal@19571 | 705 		push	cx | 
| pascal@19571 | 706 		xor	cx,cx | 
| pascal@19571 | 707 		push	cx | 
| pascal@19571 | 708 call_memcpy32: | 
| pascal@19571 | 709 		push	dx | 
| pascal@19571 | 710 		push	ax | 
| pascal@19571 | 711 	ifdef	LARGE_IMAGES | 
| pascal@19571 | 712 		jmp	@@memcpy | 
| pascal@20146 | 713 memcpy_imagez:					; memcpy_imagez(edx,eax,ecx) | 
| pascal@19636 | 714 		p386 | 
| pascal@19571 | 715 		push	ecx | 
| pascal@19571 | 716 		push	eax | 
| pascal@19571 | 717 		push	0 | 
| pascal@19571 | 718 		push	edx | 
| pascal@19636 | 719 		ifdef	NO386 | 
| pascal@19636 | 720                 p8086 | 
| pascal@19636 | 721 		endif | 
| pascal@19571 | 722 	endif | 
| pascal@19571 | 723 		endif | 
| pascal@19571 | 724 @@memcpy: | 
| pascal@20528 | 725 		extrn	memcpy32:near | 
| pascal@20528 | 726 		call	near memcpy32 | 
| pascal@19571 | 727 @@skip: | 
| pascal@19571 | 728 		ret | 
| pascal@19571 | 729 | 
| pascal@20528 | 730         endp    @memcpy_image$qp11image_himem | 
| pascal@19571 | 731 | 
| pascal@19571 | 732 ;*************************************************************** | 
| pascal@20630 | 733 ;_fastcall void storepage(bx:u32 *dst); | 
| pascal@19571 | 734 ;*************************************************************** | 
| pascal@20538 | 735         global  @storepage$qpul:near | 
| pascal@20538 | 736         proc    @storepage$qpul near | 
| pascal@19571 | 737 | 
| pascal@19571 | 738 		ifndef	NO386 | 
| pascal@19571 | 739 		mov	edx,[bx] | 
| pascal@19571 | 740 		else | 
| pascal@19571 | 741 		mov	ax,[bx] | 
| pascal@19571 | 742 		mov	dx,[bx+2] | 
| pascal@19571 | 743 		endif | 
| pascal@20538 | 744 		mov	cx,offset _xfer_buf | 
| pascal@20146 | 745 storepage:					; storepage(edx,cx) | 
| pascal@19571 | 746 		ifndef	NO386 | 
| pascal@19571 | 747 		push	0 | 
| pascal@19571 | 748 		push	4096 | 
| pascal@19571 | 749 		push	0 | 
| pascal@19571 | 750 		else | 
| pascal@19571 | 751 		xor	bx,bx | 
| pascal@19571 | 752 		push	bx | 
| pascal@19571 | 753 		mov	bh,4096/256 | 
| pascal@19571 | 754 		push	bx | 
| pascal@19571 | 755 		xor	bx,bx | 
| pascal@19571 | 756 		push	bx | 
| pascal@19571 | 757 		endif | 
| pascal@19571 | 758 		push	cx | 
| pascal@19571 | 759 		push	ds | 
| pascal@19571 | 760 		jmp	call_memcpy32 | 
| pascal@19571 | 761 | 
| pascal@20538 | 762         endp    @storepage$qpul | 
| pascal@19571 | 763 | 
| pascal@19571 | 764 | 
| pascal@19571 | 765 	ifdef	LARGE_IMAGES | 
| pascal@19636 | 766                 p386 | 
| pascal@19571 | 767 ;*************************************************************** | 
| pascal@20630 | 768 ;_fastcall void reset_bufv(bx:u32 *p); | 
| pascal@19571 | 769 ;*************************************************************** | 
| pascal@20528 | 770         global  @reset_bufv$qpul:near | 
| pascal@20528 | 771         proc    @reset_bufv$qpul near | 
| pascal@19571 | 772 | 
| pascal@20524 | 773 		mov	[curdata],bx | 
| pascal@19571 | 774 		and	[dword (data_himem bx).cacheidx],0 | 
| pascal@19571 | 775 		ret | 
| pascal@19571 | 776 | 
| pascal@20528 | 777         endp    @reset_bufv$qpul | 
| pascal@19571 | 778 | 
| pascal@19571 | 779 ;*************************************************************** | 
| pascal@19571 | 780 ;u32* prev_bufv(); | 
| pascal@19571 | 781 ;u32* prev_bufv(); | 
| pascal@19571 | 782 ;*************************************************************** | 
| pascal@19571 | 783         global  _prev_bufv:near | 
| pascal@19571 | 784         global  _next_bufv:near | 
| pascal@19571 | 785         proc    _prev_bufv near | 
| pascal@19571 | 786 | 
| pascal@19571 | 787 		stc | 
| pascal@19571 | 788 		db	73h			; jnc | 
| pascal@19571 | 789 _next_bufv: | 
| pascal@19571 | 790 		clc | 
| pascal@20528 | 791 		push	si | 
| pascal@20528 | 792 		mov	si,[curdata] | 
| pascal@19571 | 793 		sbb	ax,ax | 
| pascal@20527 | 794 		cmc | 
| pascal@20527 | 795 		adc	ax,[(data_himem si).cacheidx]	; -1/+1 | 
| pascal@19571 | 796 		xor	ecx,ecx | 
| pascal@19571 | 797 		test	ax,0fc00h | 
| pascal@19571 | 798 		jz	@@gotpage | 
| pascal@19571 | 799 		push	ax			; FFFF / 0400 | 
| pascal@19571 | 800 		sar	ax,8			; FFFC / 0004 | 
| pascal@19571 | 801 		and	al,0fch | 
| pascal@19571 | 802 		add	[(data_himem si).pageidx],ax | 
| pascal@19571 | 803 		mov	bx,[(data_himem si).pageidx] | 
| pascal@19571 | 804 		lea	bx,[(data_himem bx+si).page] | 
| pascal@19571 | 805 		mov	edx,ds | 
| pascal@19571 | 806 		shl	edx,4 | 
| pascal@19571 | 807 		lea	cx,[(data_himem si).cache] | 
| pascal@19571 | 808 		add	edx,ecx | 
| pascal@19571 | 809 		mov	eax,[bx] | 
| pascal@19571 | 810 		or	eax,eax | 
| pascal@19571 | 811 		jnz	@@pageok | 
| pascal@19571 | 812 		pop	ax | 
| pascal@19571 | 813 		xchg	ax,bx | 
| pascal@19571 | 814 		pop	si | 
| pascal@19571 | 815 		ret | 
| pascal@19571 | 816 @@pageok: | 
| pascal@19571 | 817 		mov	cx,4096 | 
| pascal@19571 | 818 		call	memcpy_imagez		; get page | 
| pascal@19571 | 819 		pop	ax			; FFFF / 0400 | 
| pascal@19571 | 820 		cbw | 
| pascal@19571 | 821 		shr	ax,6			; 03FF / 0000 | 
| pascal@19571 | 822 @@gotpage: | 
| pascal@19571 | 823 		mov	[(data_himem si).cacheidx],ax | 
| pascal@19571 | 824 		shl	ax,2 | 
| pascal@19571 | 825 		xchg	ax,bx | 
| pascal@19571 | 826 		lea	ax,[(data_himem bx+si).cache] | 
| pascal@19571 | 827 		or	bx,[(data_himem si).pageidx]	; !pageidx && !cacheidx | 
| pascal@19571 | 828 		jnz	@@notfirst2 | 
| pascal@19571 | 829 		xchg	ax,si				; &first | 
| pascal@19571 | 830 @@notfirst2: | 
| pascal@19571 | 831 		pop	si | 
| pascal@19571 | 832 		ret | 
| pascal@19571 | 833 | 
| pascal@19571 | 834         endp    _prev_bufv | 
| pascal@19571 | 835 	endif | 
| pascal@19571 | 836 | 
| pascal@20146 | 837 		ifdef	NO386 | 
| pascal@20146 | 838                 p8086 | 
| pascal@20146 | 839 		endif | 
| pascal@19571 | 840 | 
| pascal@19571 | 841 ;*************************************************************** | 
| pascal@20630 | 842 ;_fastcall void open_image(bx:const char *name, ax:struct image_himem *m); | 
| pascal@19515 | 843 ;*************************************************************** | 
| pascal@20528 | 844         global  @open_image$qpxzcp11image_himem:near | 
| pascal@20528 | 845         proc    @open_image$qpxzcp11image_himem near | 
| pascal@19515 | 846 | 
| pascal@20484 | 847                 push	di | 
| pascal@20485 | 848 		xchg	ax,di | 
| pascal@20538 | 849 		ifdef	EXTRA | 
| pascal@20538 | 850 		cmp	[(image_himem di).fd],0		; iso image/kernel ? | 
| pascal@20538 | 851 		jnz	@@alreadydone | 
| pascal@20538 | 852 		endif | 
| pascal@20484 | 853                 mov	[(image_himem di).state],bx | 
| pascal@20484 | 854 		push	bx | 
| pascal@20534 | 855 		ifdef	EXTRA | 
| pascal@20538 | 856 		cmp	[(image_himem di).next_chunk],0	; iso image/initrd ? | 
| pascal@20538 | 857 		jnz	@@next | 
| pascal@20534 | 858 		endif | 
| pascal@20534 | 859 		mov	[(image_himem di).next_chunk],offset next_chunk | 
| pascal@19515 | 860 @@next: | 
| pascal@19546 | 861                 call	[(image_himem di).next_chunk]	; m->next_chunk() | 
| pascal@19515 | 862 		ifndef	NO386 | 
| pascal@19515 | 863 		add	eax,3 | 
| pascal@19515 | 864 		and	al,0FCh | 
| pascal@19546 | 865 		add	[(image_himem di).size],eax	; m->size += m->chunk_size | 
| pascal@19515 | 866 		or	eax,eax | 
| pascal@19515 | 867 		else | 
| pascal@19515 | 868 		add	ax,3 | 
| pascal@19515 | 869 		adc	dx,0 | 
| pascal@19515 | 870 		and	al,0FCh | 
| pascal@19546 | 871 		add	[word (image_himem di).size],ax	; m->size += m->chunk_size | 
| pascal@19546 | 872 		adc	[word ((image_himem di).size)+2],dx | 
| pascal@20520 | 873 		or	ax,dx | 
| pascal@19515 | 874 		endif | 
| pascal@20520 | 875 		jnz	@@next | 
| pascal@20484 | 876                 pop	[(image_himem di).state] | 
| pascal@19546 | 877                 call	[(image_himem di).next_chunk]	; m->next_chunk() | 
| pascal@20538 | 878 @@alreadydone: | 
| pascal@20484 | 879                 pop	di | 
| pascal@19515 | 880 		ret | 
| pascal@19515 | 881 | 
| pascal@20528 | 882         endp    @open_image$qpxzcp11image_himem | 
| pascal@19515 | 883 | 
| pascal@19515 | 884 | 
| pascal@19515 | 885 ;*************************************************************** | 
| pascal@20630 | 886 ;_fastcall int read_image(bx:struct image_himem *m); | 
| pascal@19515 | 887 ;*************************************************************** | 
| pascal@20538 | 888         global  @read_image$qp11image_himem:near | 
| pascal@20538 | 889         proc    @read_image$qp11image_himem near | 
| pascal@19515 | 890 | 
| pascal@20539 | 891 		push	si di | 
| pascal@20538 | 892 		mov	di,bx | 
| pascal@20539 | 893 		mov	si,4096 | 
| pascal@20539 | 894 		push	si		; original size | 
| pascal@19515 | 895 @@loop: | 
| pascal@19538 | 896 		ifndef	NO386 | 
| pascal@20539 | 897 		movzx	ecx,si | 
| pascal@19546 | 898 		mov	eax,[(image_himem di).chunk_size] | 
| pascal@19538 | 899 		cmp	ecx,eax | 
| pascal@19538 | 900 		jb	@@szok | 
| pascal@19538 | 901 		else | 
| pascal@20539 | 902 		mov	cx,si | 
| pascal@19546 | 903 		mov	ax,[word (image_himem di).chunk_size] | 
| pascal@19538 | 904 		cmp	cx,ax | 
| pascal@19515 | 905 		jb	@@szok | 
| pascal@19546 | 906 		cmp	[word ((image_himem di).chunk_size)+2],0	; hi m->chunk_size | 
| pascal@19515 | 907 		jne	@@szok | 
| pascal@20484 | 908 		endif | 
| pascal@19515 | 909 		xchg	ax,cx | 
| pascal@19515 | 910 @@szok: | 
| pascal@19538 | 911 		jcxz	image_done | 
| pascal@20539 | 912 		mov	dx,offset _xfer_buf | 
| pascal@20538 | 913 		mov	bx,[di] | 
| pascal@20528 | 914 		call	@read$cxdxbx | 
| pascal@19538 | 915 		jc	image_done | 
| pascal@19515 | 916 		xor	cx,cx | 
| pascal@20539 | 917 		cwd				; ax < 8000h | 
| pascal@19538 | 918 		ifndef	NO386 | 
| pascal@19538 | 919 		cwde				; ax < 8000h | 
| pascal@19546 | 920 		sub	[(image_himem di).chunk_size],eax | 
| pascal@20541 | 921 		xchg	eax,ebx | 
| pascal@19538 | 922 		else | 
| pascal@19546 | 923 		sub	[word (image_himem di).chunk_size],ax | 
| pascal@20539 | 924 		xchg	ax,bx | 
| pascal@19546 | 925 		sbb	[word ((image_himem di).chunk_size)+2],dx | 
| pascal@19538 | 926 		jnz	@@fill | 
| pascal@19546 | 927 		cmp	[word (image_himem di).chunk_size],dx | 
| pascal@19538 | 928 		endif | 
| pascal@19538 | 929 		jnz	@@fill | 
| pascal@20539 | 930 		dec	cx | 
| pascal@19515 | 931 @@fill: | 
| pascal@20539 | 932 		test	bl,3 | 
| pascal@19515 | 933 		je	@@filled | 
| pascal@20539 | 934 		mov	[bx+_xfer_buf],dh | 
| pascal@20539 | 935 		inc	bx | 
| pascal@19515 | 936 		jmp	@@fill | 
| pascal@19515 | 937 @@filled: | 
| pascal@19538 | 938 		ifndef	NO386 | 
| pascal@20541 | 939 		sub	[(image_himem di).remaining],ebx | 
| pascal@19538 | 940 		else | 
| pascal@20539 | 941 		sub	[word (image_himem di).remaining],bx | 
| pascal@19546 | 942 		sbb	[word ((image_himem di).remaining)+2],dx | 
| pascal@19538 | 943 		endif | 
| pascal@20541 | 944 		sub	si,bx | 
| pascal@19538 | 945 		pushf | 
| pascal@20539 | 946                 and	cx,[(image_himem di).next_chunk] | 
| pascal@20484 | 947 		jcxz	@@same_chunk | 
| pascal@20539 | 948 		call	cx | 
| pascal@19538 | 949 @@same_chunk: | 
| pascal@19538 | 950 		popf | 
| pascal@19538 | 951 		jnz	@@loop | 
| pascal@20484 | 952 image_done: | 
| pascal@20528 | 953                 pop	ax		; original size | 
| pascal@20539 | 954 		sub	ax,si | 
| pascal@20539 | 955                 pop	di si | 
| pascal@20538 | 956 		ret | 
| pascal@19515 | 957 | 
| pascal@20538 | 958         endp    @read_image$qp11image_himem | 
| pascal@19515 | 959 | 
| pascal@19515 | 960 | 
| pascal@19515 | 961 ;*************************************************************** | 
| pascal@20528 | 962 ;pascal unsigned long strtol(const char *s); | 
| pascal@19515 | 963 ;*************************************************************** | 
| pascal@20528 | 964 	global	@strtol$qpxzc:near | 
| pascal@20528 | 965 	proc	@strtol$qpxzc near | 
| pascal@19515 | 966 | 
| pascal@20538 | 967 		pop	ax | 
| pascal@20538 | 968                 pop	bx			; s | 
| pascal@19515 | 969 		push	ax | 
| pascal@20528 | 970 		ifndef	NO386 | 
| pascal@19515 | 971 		xor	ebx,ebx | 
| pascal@19515 | 972 		push	si | 
| pascal@19634 | 973 		jcxz	@@end | 
| pascal@19515 | 974 		mov	si,cx | 
| pascal@19515 | 975 		xor	ecx,ecx | 
| pascal@19515 | 976 		xor	eax,eax | 
| pascal@19515 | 977 		lodsb | 
| pascal@19634 | 978 		mov	dx,ax | 
| pascal@19634 | 979 		or	al,20h | 
| pascal@19634 | 980 		cmp	al,'n'			; vga=normal | 
| pascal@19538 | 981 		je	@@vga | 
| pascal@19538 | 982 		dec	cx | 
| pascal@19634 | 983 		cmp	al,'e'			; vga=extended | 
| pascal@19538 | 984 		je	@@vga | 
| pascal@19538 | 985 		dec	cx | 
| pascal@19634 | 986 		cmp	al,'a'			; vga=ask | 
| pascal@19538 | 987 		jne	@@notvga | 
| pascal@19538 | 988 @@vga: | 
| pascal@19538 | 989 		dec	cx | 
| pascal@19538 | 990 		xchg	ax,cx | 
| pascal@19538 | 991 		cwd | 
| pascal@19634 | 992 		jmp	@@popsiret | 
| pascal@19538 | 993 @@notvga: | 
| pascal@19538 | 994 		mov	cx,10			; radix | 
| pascal@19634 | 995 		xchg	ax,dx | 
| pascal@19515 | 996 		cmp	al,'+' | 
| pascal@19515 | 997 		je	@@radixskip | 
| pascal@19515 | 998 		cmp	al,'-' | 
| pascal@19515 | 999 		clc | 
| pascal@19515 | 1000 		jne	@@radixkeep | 
| pascal@19515 | 1001 		stc | 
| pascal@19515 | 1002 @@radixskip: | 
| pascal@19515 | 1003 		lodsb | 
| pascal@19515 | 1004 @@radixkeep: | 
| pascal@19515 | 1005 		pushf | 
| pascal@19515 | 1006 		cmp	al,'0' | 
| pascal@19515 | 1007 		jne	@@radixok | 
| pascal@19515 | 1008 		mov	cl,8 | 
| pascal@19515 | 1009 		lodsb | 
| pascal@19634 | 1010 		or	al,20h | 
| pascal@19634 | 1011 		cmp	al,'x' | 
| pascal@19515 | 1012 		jne	@@radixok | 
| pascal@19515 | 1013 		mov	cl,16 | 
| pascal@19515 | 1014 @@strtollp: | 
| pascal@19515 | 1015 		lodsb | 
| pascal@19515 | 1016 @@radixok: | 
| pascal@19634 | 1017 		or	al,20h | 
| pascal@19515 | 1018 		sub	al,'0' | 
| pascal@19515 | 1019 		jb	@@endstrtol | 
| pascal@19515 | 1020 		cmp	al,9 | 
| pascal@19515 | 1021 		jbe	@@digitok | 
| pascal@19515 | 1022 		cmp	al,'a'-'0' | 
| pascal@19515 | 1023 		jb	@@endstrtol | 
| pascal@19515 | 1024 		sub	al,'a'-'0'-10 | 
| pascal@19515 | 1025 @@digitok: | 
| pascal@19515 | 1026 		cmp	al,cl | 
| pascal@19515 | 1027 		jae	@@endstrtol | 
| pascal@19515 | 1028 		xchg	eax,ebx | 
| pascal@19515 | 1029 		mul	ecx | 
| pascal@19515 | 1030 		add	eax,ebx | 
| pascal@19515 | 1031 		xchg	eax,ebx | 
| pascal@19515 | 1032 		jmp	@@strtollp | 
| pascal@19515 | 1033 @@endstrtol: | 
| pascal@19515 | 1034 		mov	cl,10 | 
| pascal@19515 | 1035 		cmp	al,'k'-'a'+10 | 
| pascal@19515 | 1036 		je	@@shift | 
| pascal@19515 | 1037 		mov	cl,20 | 
| pascal@19515 | 1038 		cmp	al,'m'-'a'+10 | 
| pascal@19515 | 1039 		je	@@shift | 
| pascal@19515 | 1040 		mov	cl,30 | 
| pascal@19515 | 1041 		cmp	al,'g'-'a'+10 | 
| pascal@19515 | 1042 		jne	@@noshift | 
| pascal@19515 | 1043 @@shift: | 
| pascal@19515 | 1044 		shl	ebx,cl | 
| pascal@19515 | 1045 @@noshift: | 
| pascal@19515 | 1046 		popf | 
| pascal@19515 | 1047 		jnc	@@end | 
| pascal@19515 | 1048 		neg	ebx | 
| pascal@19515 | 1049 @@end: | 
| pascal@19515 | 1050 		push	ebx | 
| pascal@19515 | 1051 		pop	ax | 
| pascal@19515 | 1052 		pop	dx | 
| pascal@19634 | 1053 @@popsiret: | 
| pascal@19515 | 1054 		pop	si | 
| pascal@19515 | 1055 		else | 
| pascal@19515 | 1056 		push	si | 
| pascal@19515 | 1057 		push	di | 
| pascal@19515 | 1058 		xor	ax,ax | 
| pascal@19515 | 1059 		cwd | 
| pascal@19634 | 1060 		jcxz	@@goend | 
| pascal@19515 | 1061 		xchg	ax,di | 
| pascal@19515 | 1062 		mov	si,cx | 
| pascal@19538 | 1063 		lodsb | 
| pascal@19634 | 1064 		mov	bx,ax | 
| pascal@19634 | 1065 		or	al,20h | 
| pascal@19538 | 1066 		mov	cx,-1 | 
| pascal@19634 | 1067 		cmp	al,'n'			; vga=normal | 
| pascal@19538 | 1068 		je	@@vga | 
| pascal@19538 | 1069 		dec	cx | 
| pascal@19634 | 1070 		cmp	al,'e'			; vga=extended | 
| pascal@19538 | 1071 		je	@@vga | 
| pascal@19538 | 1072 		dec	cx | 
| pascal@19634 | 1073 		cmp	al,'a'			; vga=ask | 
| pascal@19538 | 1074 		jne	@@notvga | 
| pascal@19538 | 1075 @@vga: | 
| pascal@19538 | 1076 		xchg	ax,cx | 
| pascal@19538 | 1077 @@goend: | 
| pascal@19634 | 1078 		jmp	@@popdisiret | 
| pascal@19538 | 1079 @@notvga: | 
| pascal@19515 | 1080 		mov	cx,10			; radix | 
| pascal@19634 | 1081 		xchg	ax,bx | 
| pascal@19515 | 1082 		cmp	al,'+' | 
| pascal@19515 | 1083 		je	@@radixskip | 
| pascal@19515 | 1084 		cmp	al,'-' | 
| pascal@19515 | 1085 		clc | 
| pascal@19515 | 1086 		jne	@@radixkeep | 
| pascal@19515 | 1087 		stc | 
| pascal@19515 | 1088 @@radixskip: | 
| pascal@19515 | 1089 		lodsb | 
| pascal@19515 | 1090 @@radixkeep: | 
| pascal@19515 | 1091 		pushf | 
| pascal@19515 | 1092 		cmp	al,'0' | 
| pascal@19515 | 1093 		jne	@@radixok | 
| pascal@19515 | 1094 		mov	cl,8 | 
| pascal@19515 | 1095 		lodsb | 
| pascal@20146 | 1096 		or	al,20h | 
| pascal@19634 | 1097 		cmp	al,'x' | 
| pascal@19515 | 1098 		jne	@@radixok | 
| pascal@19515 | 1099 		mov	cl,16 | 
| pascal@19515 | 1100 @@strtollp: | 
| pascal@19515 | 1101 		lodsb | 
| pascal@19515 | 1102 @@radixok: | 
| pascal@19634 | 1103 		or	al,20h | 
| pascal@19515 | 1104 		sub	al,'0' | 
| pascal@19515 | 1105 		jb	@@endstrtol | 
| pascal@19515 | 1106 		cmp	al,9 | 
| pascal@19515 | 1107 		jbe	@@digitok | 
| pascal@19515 | 1108 		cmp	al,'a'-'0' | 
| pascal@19515 | 1109 		jb	@@endstrtol | 
| pascal@19515 | 1110 		sub	al,'a'-'0'-10 | 
| pascal@19515 | 1111 @@digitok: | 
| pascal@19515 | 1112 		cmp	al,cl | 
| pascal@19515 | 1113 		jae	@@endstrtol | 
| pascal@19515 | 1114 | 
| pascal@19515 | 1115 		push	ax | 
| pascal@19515 | 1116 		push	si | 
| pascal@19515 | 1117 		push	dx | 
| pascal@19515 | 1118 		xchg	ax,di | 
| pascal@19515 | 1119 		mul	cx | 
| pascal@19515 | 1120 		xchg	ax,di | 
| pascal@19515 | 1121 		xchg	ax,dx | 
| pascal@19515 | 1122 		xchg	ax,si | 
| pascal@19515 | 1123 		pop	ax | 
| pascal@19515 | 1124 		mul	cx | 
| pascal@19515 | 1125 		add	ax,si | 
| pascal@19515 | 1126 		pop	si | 
| pascal@19515 | 1127 		xchg	ax,dx | 
| pascal@19515 | 1128 		pop	ax | 
| pascal@19515 | 1129 		mov	ah,0 | 
| pascal@19515 | 1130 		add	di,ax | 
| pascal@19515 | 1131 		adc	dx,0 | 
| pascal@19515 | 1132 | 
| pascal@19515 | 1133 		jmp	@@strtollp | 
| pascal@19515 | 1134 @@endstrtol: | 
| pascal@19515 | 1135 		mov	cl,10 | 
| pascal@19515 | 1136 		cmp	al,'k'-'a'+10 | 
| pascal@19515 | 1137 		je	@@shift | 
| pascal@19515 | 1138 		mov	cl,20 | 
| pascal@19515 | 1139 		cmp	al,'m'-'a'+10 | 
| pascal@19515 | 1140 		je	@@shift | 
| pascal@19515 | 1141 		mov	cl,30 | 
| pascal@19515 | 1142 		cmp	al,'g'-'a'+10 | 
| pascal@19515 | 1143 		jne	@@noshift | 
| pascal@19515 | 1144 @@shift: | 
| pascal@19515 | 1145 		rcl	di,1 | 
| pascal@19515 | 1146 		shl	dx,1 | 
| pascal@19515 | 1147 		loop	@@shift | 
| pascal@19515 | 1148 @@noshift: | 
| pascal@19515 | 1149 		popf | 
| pascal@19515 | 1150 		jnc	@@end | 
| pascal@19515 | 1151 		not	dx | 
| pascal@19515 | 1152 		neg	di | 
| pascal@19515 | 1153 		jne	@@end | 
| pascal@19515 | 1154 		inc	dx | 
| pascal@19515 | 1155 @@end: | 
| pascal@19515 | 1156 		xchg	ax,di | 
| pascal@19634 | 1157 @@popdisiret: | 
| pascal@19515 | 1158 		pop	di | 
| pascal@19515 | 1159 		pop	si | 
| pascal@19515 | 1160 		endif | 
| pascal@20528 | 1161 strtol_ret: | 
| pascal@19515 | 1162 		ret | 
| pascal@19515 | 1163 | 
| pascal@20528 | 1164 	endp	@strtol$qpxzc | 
| pascal@19515 | 1165 | 
| pascal@19515 | 1166 | 
| pascal@19515 | 1167 		ifdef	NO386 | 
| pascal@19515 | 1168 ;*************************************************************** | 
| pascal@19515 | 1169 ;u16 topseg(); | 
| pascal@19515 | 1170 ;*************************************************************** | 
| pascal@19515 | 1171         global  _topseg:near | 
| pascal@19515 | 1172         proc    _topseg near | 
| pascal@19515 | 1173 | 
| pascal@19515 | 1174 		int	12h | 
| pascal@19515 | 1175 		jnc	@@max640k | 
| pascal@19515 | 1176 		mov	ax,640			; 9000 | 
| pascal@19515 | 1177 @@max640k: | 
| pascal@19634 | 1178 		dec	ax | 
| pascal@19515 | 1179 		and	al,0C0h | 
| pascal@19515 | 1180 		mov	cl,6 | 
| pascal@19515 | 1181 		shl	ax,cl | 
| pascal@19515 | 1182 		ret | 
| pascal@19515 | 1183 | 
| pascal@19515 | 1184         endp    _topseg | 
| pascal@19515 | 1185 		endif | 
| pascal@19515 | 1186 | 
| pascal@19825 | 1187 		ifdef	EXTRA | 
| pascal@19825 | 1188                 p8086 | 
| pascal@19825 | 1189 ;*************************************************************** | 
| pascal@19825 | 1190 ;char *progname(void) | 
| pascal@19825 | 1191 ;*************************************************************** | 
| pascal@19825 | 1192         global  _progname:near | 
| pascal@19825 | 1193         proc    _progname near | 
| pascal@19825 | 1194 | 
| pascal@19825 | 1195 		push	si di es | 
| pascal@19825 | 1196 		mov	ah,30h | 
| pascal@19825 | 1197 		int	21h | 
| pascal@19875 | 1198 		xor	di,di | 
| pascal@19825 | 1199 		cmp	al,3 | 
| pascal@19874 | 1200 		mov	ax,di | 
| pascal@19825 | 1201 		jb	@@skip | 
| pascal@19873 | 1202 		;mov	es,[cs:2Ch] | 
| pascal@19874 | 1203 		mov	es,[di+2Ch] | 
| pascal@20146 | 1204 		mov	cx,sp			; big enough | 
| pascal@19870 | 1205 @@loop: | 
| pascal@19825 | 1206 		repne | 
| pascal@19825 | 1207 		  scasb | 
| pascal@19825 | 1208 		scasb | 
| pascal@19870 | 1209 		jne	@@loop | 
| pascal@19870 | 1210 		inc	di | 
| pascal@19870 | 1211 		inc	di | 
| pascal@19870 | 1212 		mov	si,di			; progname @es:di | 
| pascal@19870 | 1213 		repne | 
| pascal@19870 | 1214 		  scasb | 
| pascal@19870 | 1215 		mov	cx,di | 
| pascal@19874 | 1216 		sub	cx,si			; progname len | 
| pascal@19870 | 1217 		call	malloc_or_die		; keep cx | 
| pascal@19870 | 1218 		mov	di,ax | 
| pascal@19825 | 1219 		push	ds | 
| pascal@19825 | 1220 		push	es | 
| pascal@19825 | 1221 		pop	ds | 
| pascal@19825 | 1222 		pop	es | 
| pascal@19870 | 1223 		rep | 
| pascal@19870 | 1224 		  movsb | 
| pascal@19870 | 1225 		push	es | 
| pascal@19825 | 1226 		pop	ds | 
| pascal@19825 | 1227 @@skip: | 
| pascal@19825 | 1228 		pop	es di si | 
| pascal@19825 | 1229 		ret | 
| pascal@19825 | 1230 | 
| pascal@19825 | 1231         endp    _progname | 
| pascal@19825 | 1232 | 
| pascal@19825 | 1233 | 
| pascal@19825 | 1234 ;*************************************************************** | 
| pascal@20630 | 1235 ;_fastcall void chdirname(bx:char *path) | 
| pascal@19825 | 1236 ;*************************************************************** | 
| pascal@20528 | 1237         global  @chdirname$qpzc:near | 
| pascal@20528 | 1238         proc    @chdirname$qpzc near | 
| pascal@19825 | 1239 | 
| pascal@20146 | 1240 		cmp	[byte bx+1],3Ah		; ':' | 
| pascal@19825 | 1241 		jne	@@nodisk | 
| pascal@19875 | 1242 		mov	dl,20h | 
| pascal@19875 | 1243 		or	dl,[bx] | 
| pascal@19825 | 1244 		sub	dl,61h | 
| pascal@19825 | 1245 		mov	ah,0Eh | 
| pascal@19825 | 1246 		int	21h | 
| pascal@19825 | 1247 		inc	bx | 
| pascal@19825 | 1248 		inc	bx | 
| pascal@19825 | 1249 @@nodisk: | 
| pascal@19825 | 1250 		xor	cx,cx | 
| pascal@19825 | 1251 @@next: | 
| pascal@19825 | 1252 		mov	al,[bx] | 
| pascal@19825 | 1253 		cmp	al,5Ch | 
| pascal@19825 | 1254 		jne	@@tsteos | 
| pascal@19875 | 1255 		mov	dx,bx | 
| pascal@19875 | 1256 		inc	cx | 
| pascal@19825 | 1257 @@tsteos: | 
| pascal@19825 | 1258 		inc	bx | 
| pascal@19825 | 1259 		or	al,al | 
| pascal@19825 | 1260 		jnz	@@next | 
| pascal@19825 | 1261 		jcxz	@@end | 
| pascal@19875 | 1262 		mov	bx,dx | 
| pascal@19825 | 1263 		push	[word bx] | 
| pascal@19825 | 1264 		mov	[bx],al | 
| pascal@20630 | 1265 	ifdef	LONG_FILENAME | 
| pascal@19875 | 1266 		stc | 
| pascal@20146 | 1267 		mov	ax,713Bh		; chdir long filename (ds:dx) | 
| pascal@19875 | 1268 		int	21h | 
| pascal@20630 | 1269 		jnc	@@chdirdone | 
| pascal@20630 | 1270 	endif | 
| pascal@20146 | 1271 		mov	ah,3Bh			; chdir(ds:dx) | 
| pascal@19875 | 1272 		int	21h | 
| pascal@20510 | 1273 @@chdirdone: | 
| pascal@19825 | 1274 		pop	[word bx] | 
| pascal@19825 | 1275 @@end: | 
| pascal@19825 | 1276 		ret | 
| pascal@19825 | 1277 | 
| pascal@20528 | 1278         endp    @chdirname$qpzc | 
| pascal@19825 | 1279 | 
| pascal@19825 | 1280 | 
| pascal@19825 | 1281 ;*************************************************************** | 
| pascal@20630 | 1282 ;_fastcall char *ultoa(axdx:unsigned long n); | 
| pascal@19825 | 1283 ;*************************************************************** | 
| pascal@20528 | 1284         global  @ultoa$qul:near | 
| pascal@20528 | 1285         proc    @ultoa$qul near | 
| pascal@19825 | 1286 | 
| pascal@20538 | 1287 		xchg	ax,cx | 
| pascal@20538 | 1288 		xchg	ax,dx		; AX:CX = n | 
| pascal@19825 | 1289 		push	si | 
| pascal@19825 | 1290 		mov	si,10 | 
| pascal@19825 | 1291 		mov	bx,offset ultoabuf+11 | 
| pascal@19825 | 1292 @@loop: | 
| pascal@19825 | 1293 		dec	bx | 
| pascal@19825 | 1294 		xor	dx,dx | 
| pascal@19825 | 1295 		div	si		; DX:AX = 0000:hi(n) | 
| pascal@19825 | 1296 		xchg	ax,cx		; CX = hi(n)/10 | 
| pascal@19825 | 1297 		div	si		; DX:AX = hi(n)%10:lo(n) | 
| pascal@19825 | 1298 		xchg	ax,cx		; CX = lo(n/10) | 
| pascal@20528 | 1299 					; AX = hi(n)/10 = hi(n/10) | 
| pascal@20528 | 1300 		mov	[byte bx],'0' | 
| pascal@20528 | 1301 		add	[bx],dl		; DL = n%10 | 
| pascal@20528 | 1302 		mov	dx,ax | 
| pascal@20528 | 1303 		or	dx,cx | 
| pascal@19825 | 1304 		jnz	@@loop | 
| pascal@19825 | 1305 		xchg	ax,bx | 
| pascal@19825 | 1306 		pop	si | 
| pascal@19825 | 1307 		ret | 
| pascal@19825 | 1308 | 
| pascal@20528 | 1309         endp    @ultoa$qul | 
| pascal@19825 | 1310 | 
| pascal@19825 | 1311 | 
| pascal@19825 | 1312 ;*************************************************************** | 
| pascal@20630 | 1313 ;_fastcall unsigned long kver2ul(bx:char *kernel_version); | 
| pascal@19825 | 1314 ;*************************************************************** | 
| pascal@20528 | 1315         global  @kver2ul$qpzc:near | 
| pascal@20528 | 1316         proc    @kver2ul$qpzc near | 
| pascal@19825 | 1317 | 
| pascal@20146 | 1318 		push	si | 
| pascal@20538 | 1319 		mov	si,bx | 
| pascal@20146 | 1320 		xor	bx,bx | 
| pascal@20146 | 1321 		mov	cx,304h | 
| pascal@19825 | 1322 @@number: | 
| pascal@19825 | 1323 		xor	ax,ax | 
| pascal@20146 | 1324 		cwd | 
| pascal@19825 | 1325 @@digit: | 
| pascal@19825 | 1326 		shl	al,cl | 
| pascal@19825 | 1327 		shl	ax,cl | 
| pascal@19825 | 1328 		lodsb | 
| pascal@19825 | 1329 		sub	al,30h | 
| pascal@19825 | 1330 		cmp	al,9 | 
| pascal@19825 | 1331 		jbe	@@digit | 
| pascal@20146 | 1332 		mov	dl,bh | 
| pascal@20146 | 1333 		mov	bh,bl | 
| pascal@20146 | 1334 		mov	bl,ah | 
| pascal@20146 | 1335 		dec	ch | 
| pascal@20146 | 1336 		jnz	@@number | 
| pascal@20146 | 1337 		xchg	ax,bx | 
| pascal@20146 | 1338 		pop	si | 
| pascal@19825 | 1339 kver2ulret: | 
| pascal@19825 | 1340 		ret | 
| pascal@19825 | 1341 | 
| pascal@20528 | 1342         endp    @kver2ul$qpzc | 
| pascal@19825 | 1343 | 
| pascal@20528 | 1344 			endif | 
| pascal@19825 | 1345 | 
| pascal@19825 | 1346 ;*************************************************************** | 
| pascal@19825 | 1347 ;void try_default_args(); | 
| pascal@19825 | 1348 ;*************************************************************** | 
| pascal@20528 | 1349 	ifdef	EXTRA | 
| pascal@20528 | 1350 | 
| pascal@19825 | 1351         global  _try_default_args:near | 
| pascal@19825 | 1352         proc    _try_default_args near | 
| pascal@19825 | 1353 | 
| pascal@19825 | 1354 		mov	bx,offset tazboot_cmd | 
| pascal@19825 | 1355 		call	open | 
| pascal@19825 | 1356 		jc	kver2ulret | 
| pascal@19825 | 1357 		mov	cx,4096 | 
| pascal@19825 | 1358 		mov	di,[_heap_top] | 
| pascal@19825 | 1359 		extrn	read_cmdline:near | 
| pascal@19825 | 1360 		jmp	near read_cmdline	; read_cmdline(ax,di,cx) | 
| pascal@19825 | 1361 | 
| pascal@19825 | 1362         endp    _try_default_args | 
| pascal@19825 | 1363 | 
| pascal@20528 | 1364 	endif | 
| pascal@19825 | 1365 | 
| pascal@19515 | 1366         ends    _TEXT | 
| pascal@19515 | 1367 | 
| pascal@19515 | 1368         end | 
| pascal@19515 | 1369 | 
| pascal@19515 | 1370 ;###### END OF FILE ############################################ | 
| pascal@19825 | 1371 |