home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 November
/
VPR9811A.BIN
/
BENCH
/
CWSDPMI2
/
CWSDPMI2.LZH
/
SRC.LZH
/
START.ASM
< prev
next >
Wrap
Assembly Source File
|
1997-09-24
|
6KB
|
343 lines
; Copyright (C) 1995,1996 CW Sandmann (sandmann@clio.rice.edu) 1206 Braelinn, Sugarland, TX 77479
;
; This file is distributed under the terms listed in the document
; "copying.cws", available from CW Sandmann at the address above.
; A copy of "copying.cws" should accompany this file; if not, a copy
; should be available from where this file was obtained. This file
; may not be distributed without a verbatim copy of "copying.cws".
;
; This file is distributed WITHOUT ANY WARRANTY; without even the implied
; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
title cwsdpmi
include segdefs.inc
;------------------------------------------------------------------------
.8086
start_data16
public __psp, __osmajor, __osminor, __brklvl, ___brklvl
__psp dw 0
__osmajor db 0
__osminor db 0
__brklvl dd 0
___brklvl dw offset DGROUP:bss_end
firstf dw offset DGROUP:bss_end
extrn __stklen:word
end_data16
start_bss
bss_start label byte
public _errno
_errno dw ?
end_bss
_bssend segment
bss_end label word
ends
;------------------------------------------------------------------------
start_code16
extrn _main:near
.8086
start proc near
mov bp, ds:[2] ; Highest memory segment
mov dx, DGROUP
mov ds, dx
mov __psp, es
sub bp, dx ; Our current DGROUP size in paragraphs
mov di, __stklen ; Requested stack size
add di, offset DGROUP:bss_end
mov cl, 4
shr di, cl ; Convert bss_end+stack to paragraphs
inc di ; Wanted DGROUP size in paragraphs
cmp bp, di
jb short _exit ; Not enough memory (but we fixed header!?)
mov di, 1000h ; More than 64K?
cmp bp, di
ja short mem_ok ; Someone carried away with CWSPARAM, 64K Max
mov di, bp ; The usual case
; Move to new stack, then return extra memory to DOS
mem_ok: mov bx, di
shl di, cl ; Convert back to bytes from paragraphs
mov ss, dx ; Set the program stack
mov sp, di
add bx, dx ; Segment value for end of our new DGROUP
mov word ptr __brklvl+2, bx
mov ax, es ; __psp
sub bx, ax ; Number of paragraphs to keep
mov ah, 04Ah ; DOS resize memory block call
int 021h
; Clear BSS area to zero
push ds
pop es
mov di, offset DGROUP:bss_start
mov cx, offset DGROUP:bss_end
sub cx, di
xor ax, ax
cld
rep stosb
mov ah, 30h ; get DOS version into TCC like variable
int 21h
mov word ptr __osmajor, ax
mov ds:[bss_end],8000h ; For malloc
call _main ; Never return, so this is OK
endp
PUBLIC __exit,_exit ; Always error exit here
__exit proc near
_exit: mov ax,4C01h
int 21h
endp
PUBLIC _unlink
_unlink proc near
push bp
mov bp,sp
mov ah,41h ; Delete file
jmp short comn1
endp
PUBLIC __creat
__creat proc near
push bp
mov bp,sp
xor cx,cx ; No attributes (ignore bp+6)
mov ah,3Ch ; Create new (or zero length existing) file
comn1: mov dx,[bp+4] ; Name of file
int 21h
jnc short do_ret
mov ah,-1 ; AX thus negative, shorter, AL has err code
jmp short do_ret
endp
PUBLIC __write
__write proc near
push bp
mov bp,sp
mov ah,40h ; Write
com3: mov cx,[bp+8] ; Buffer size
mov dx,[bp+6] ; Buffer offset
com1: mov bx,[bp+4] ; File handle
int 21h
jnc short do_ret
xor ax,ax
do_ret: pop bp
ret
endp
PUBLIC __read
__read proc near
push bp
mov bp,sp
mov ah,3fh ; Read
jmp short com3
endp
PUBLIC _lseek
_lseek proc near
push bp
mov bp,sp
mov ax,4200h ; Seek absolute (always abs here)
jmp short com3
endp
PUBLIC __close
__close proc near
push bp
mov bp,sp
mov ah,3eh ; Close
jmp short com1
endp
PUBLIC __restorezero ; Bogus, for TCC compatibility
__restorezero proc near
ret
endp
PUBLIC _free
_free proc near
push bp
mov bp,sp
mov bx,[bp+4] ; pointer
dec bx
or byte ptr [bx], 80h ; negative size means "free"
dec bx
cmp firstf,bx
jb short f1
mov firstf,bx
f1: pop bp
ret
endp
PUBLIC _malloc
_malloc proc near
push bp
mov bp,sp
mov dx,[bp+4] ; size
add dx,3 ; for header and roundup
and dl,0feh ; clear roundup
mov bx,firstf
m0: mov ax,[bx] ; header size/tag
test ax,ax
js short m1
cmp firstf,bx ; not free!
jne short m3
add firstf,ax
m3: add bx,ax
jmp short m0
m1: and ah,7fh ; get the size
cmp ax,dx
jb short m2
; We have a big enough block
sub ax,dx ; ax is now extra
jmp short m4
m2: or ax,ax
jne short m3 ; don't try to merge since all same size
; End of chain (ax = 0)
mov cx,bx
add cx,dx ; new end
add cx,380h ; enough for a single HW interrupt
cmp cx,sp
ja short mend
mov ax,8000h
m4: mov [bx],dx
add bx,dx
or ax,ax
je short m5
or ah,80h
mov [bx],ax
m5: mov ax,bx
sub ax,dx
cmp firstf,ax
jne short m6
mov firstf,bx
m6: add ax,2
mend: pop bp
ret
endp
csub macro name
public name
name : push bp
mov bp,sp
endm
asub macro name
public name
name :
endm
csub _getvect
mov ah,35h
mov al,[bp+4]
int 21h
mov dx,es
xchg bx,ax ; Shorter than mov ax,bx
pop bp
ret
csub _setvect
mov ah,25h
push ds
mov al,[bp+4]
lds dx,[bp+6]
int 21h
pop ds
pop bp
ret
csub _memset
push ds
pop es
cld
push di
mov di,[bp+4]
mov al,[bp+6]
mov cx,[bp+8]
rep stosb
pop di
pop bp
ret
csub _movedata
push si
push di
push ds
mov ds,[bp+4]
les si,[bp+6] ; si=6,es=8 (horrid hack for space!)
mov di,[bp+10]
mov cx,[bp+12]
cld
rep movsb
pop ds
pop di
pop si
pop bp
ret
csub N_SCOPY@
push si
push di
push ds
lds si,[bp+4]
les di,[bp+8]
cld
rep movsb
pop ds
pop di
pop si
pop bp
ret 8
asub N_LXMUL@ ; Cheat - assume only result is long
mul bx
ret
.386
asub N_LXLSH@
shld dx,ax,cl
xor bx,bx
shld ax,bx,cl
ret
asub N_LXRSH@
mov bx,dx
sar bx,15
rsh: shrd ax,dx,cl
shrd dx,bx,cl
ret
asub N_LXURSH@
xor bx,bx
jmp short rsh
end_code16
_STACK segment stack 'STACK'
db 128 dup(?) ;minimal startup stack (overwritten)
ends
end start