dos_compilers/Microsoft C v1/CC.ASM
2024-06-30 12:06:07 -07:00

133 lines
3.5 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; name XCMAIN -- initiate execution of C program
;
; description This is the main module for a C program on the
; MS-DOS implementation. It initializes the segment
; registers, sets up the stack, and calls the C main
; function _main with a pointer to the remainder of
; the command line.
;
; Also defined in this module is the exit entry point
; XCEXIT.
;
pgroup group base,prog,tail
dgroup group data,stack
assume cs:pgroup
;
; The following segment serves only to force "pgroup" lower in
; memory.
;
base segment 'prog'
db ?
base ends
;
; The data segment defines locations which contain the offsets
; of the base and top of the stack.
;
data segment public 'data'
public _top, _base
_top dw 0
_base dw 0
data ends
;
; The stack segment defines the base (lowest address) of the
; stack. Note that in this module it is NOT defined to be
; of the STACK combining type, thus allowing a .COM file to be
; made of the resulting .EXE file.
;
stack segment 'data'
sbase dw 128 dup (?)
stack ends
;
; The tail segment allows this module to determine the paragraph
; at which the data segment begins, without use of a relocatable
; value.
;
tail segment byte 'prog'
db "MS-C V 1.04 "
last db 0 ;last byte in PGROUP
tail ends
;
; The main program must set up the initial segment registers
; and the stack pointer, and set up a far return to the MS-DOS
; exit point at ES:0. The command line bytes from the program
; segment prefix are moved onto the stack, and a pointer to
; them supplied to the C main module _main (which calls main).
;
prog segment byte public 'prog'
public XCMAIN, XCEXIT
extrn _main:near
assume cs:pgroup, ds:dgroup, ss:dgroup
org 0ffh
XCMAIN proc far
cli
mov ax,offset pgroup:last ;get offset of last byte
add ax,16
mov cl,4
shr ax,cl ;number of paragraphs in PGROUP
mov bx,cs
add ax,bx ;base of DGROUP
mov ds,ax ;initialize ds and ss
mov ss,ax
mov bx,es:2 ;total memory size (paragraphs)
sub bx,ax
test bx,0f000h
jnz m1 ;branch if more than 64K bytes
mov cl,4
shl bx,cl ;highest available byte
jmp short m2
m1: mov bx,0fff0h
m2: mov sp,bx ;set stack pointer
sti
mov _top,bx ;save top of stack
mov ax,offset dgroup:sbase
mov _base,ax ;store ptr to bottom of stack
push es ;push ptr to pgm segment prefix
xor ax,ax
push ax ;instr ptr for far return
mov bp,sp ;save in bp
mov si,80h ;ptr to command line bytes
mov cl,es:[si] ;get number of bytes
inc si
xor ch,ch ;clear high byte
mov bx,cx
add bx,4 ;3 bytes additional, 1 for rounding
and bx,0fffeh ;force even number of bytes
sub sp,bx ;allocate space on stack
mov di,sp
mov byte ptr [di],'c' ;store dummy program name
inc di
jcxz m4 ;skip if no bytes to move
mov byte ptr [di],' '
inc di
m3: mov al,es:[si] ;move bytes to stack
mov [di],al
inc si
inc di
loop m3
m4: xor ax,ax
mov [di],al ;store null byte
mov ax,ds
mov es,ax ;es, ds, and ss are all equal
mov ax,sp
push ax ;ptr to command line
call _main ;call C main
mov sp,bp ;restore ptr to far return
ret ;return to MS-DOS
XCMAIN endp
;
; name XCEXIT -- terminate execution of C program
;
; description This function terminates execution of the current
; program by returning to MS-DOS. The error code
; argument normally supplied to XCEXIT is ignored
; in this implementation.
;
XCEXIT proc far
mov ax,_top ;load stack ptr with top address
sub ax,4
mov sp,ax
ret ;return
XCEXIT endp
prog ends
end XCMAIN