;====================================================================
; Steinis Mini Compiler
; (c)Copyright 2002 by Sebastian Steinhauer
; steini@steini-welt.de
;====================================================================
; Diese Datei enthält alle wichtigen Startup-Codes und Prozeduren.
; Viele sind es ja noch nicht ;)
; Ein herzliches Dankeschön geht an Michael Tischer für seinen guten
; COM-Startup-Code. *g*
;====================================================================
; Letzte Änderung: 15:05 28.06.2002
; by Steini
;
; 17:02 28.06.2002
;	- INIT.ASM alloziert gleich einen sogenannten Heap
;	  Dieser Buffer kann von Subroutinen zur kurzen
;	  Zwischenspeicherung von Daten verwendet werden.
;	  Ausserdem sollen Strings, die dynamisch angelegt
;	  werden hier gespeichert werden.
;
; 15:04 28.06.2002
;	- neuer COM-Startup-Code eingebaut.
;	- nicht benötigter Speicher wird freigegeben
;	- Programmabhängige reservierung von Stack-Speicher
;====================================================================

stack_size      equ 1024*2      ; Wird vom Compiler gesetzt!
pstack_size	equ stack_size/16+1
heap_size       equ 4096        ; Wird vom Compiler gesetzt!
pheap_size	equ heap_size/16+1

;====================================================================
ORG     0x100                   ; Wir erzeugen eine DOS-Datei (.COM)
start:
	push	cs           	; CS, DS und ES auf CS setzen, da wir                  
        pop	DS           	; momentan eh nur COM-Dateien erzeugen.
	jmp	short mem_init	; Wir initialisieren den Speicher
	
prog_start:			; Hier beginnt jetzt das Hauptprogramm
        call	__main		; Hauptprogramm aufrufen

prog_halt:			
        mov	ah,0x49		; Wir geben den Heap frei
        mov     dx,[heap_seg]   ; Basis-Adresse des Heap
	mov	es,dx		; Adresse in ES übergeben
	int	0x21		; Freigabe!
				; Wir geben unseren Stackspace wieder frei
	mov	ah,0x49		; Freigabe von Speicher
	push	ss		; Im ES-Register wird der Platz übergeben
	pop	es
	int	0x21		; Speicher freigegeben

prog_quit:			; Hier wird das Programm beendet!
        mov     ax,0x4c00       ; Ok. Wir sind fertig. Programm wird beendet.
        int     0x21            ; UND SERVUS! Hoffentlich lief das Programm

;====================================================================
	db      'Steinis Mini Compiler 0.0.1'

;====================================================================
mem_init:			; Wir initialisieren den Hauptspeicher
	mov	ah,0x4a		; Wir wollen die Speichergröße ändern
	mov	bx,prog_ende	; Den gesamten Speicher hinter dem Programm
				; freigeben.
	add	bx,15		; Auf den nächsten Paragraphen aufrunden.
	mov	cl,4		; Adresse in Paragraphen umrechnen
	shr	bx,cl
	inc	bx
	int	0x21		; DOS-Aufrufen
	
	mov	ah,0x48		; Wir wollen jetzt den Stackspeicher
	mov	bx,pstack_size	; initialisieren.
	int	0x21		; DOS-Aufrufen
	jc	fail1@mem_init	; Fehler in der Speicherreservierung!!!
	
	cli			; Interrupts sperren
	mov	ss,ax		; Neuen Stack setzen
	mov	sp,stack_size		
	sti			; Interrupts wieder erlauben
	
	mov	ah,0x48		; Wir definieren jetzt den Heap
	mov	bx,pheap_size	; Größe
	int	0x21		; DOS-Aufrufen
	jc	fail2@mem_init	; Fehler in der Reservierung!!
	mov	[heap_seg],ax	; Speicheradresse des Heaps merken
	
	jmp	short prog_start; Programm starten

fail1@mem_init:
	mov	dx,mem_fail_msg1
	jmp	short display@mem_init
fail2@mem_init:
	mov	dx,mem_fail_msg2
display@mem_init:	
	mov	ah,9		; Fehlermeldung!
	int	0x21
	jmp	short prog_quit	; Programm beenden

;====================================================================
mem_fail_msg1:	db "ERROR: Can't allocate stack space!$"
mem_fail_msg2:  db "ERROR: Can't allocate heap!$"
heap_seg:	dw 0
heap_ptr:	dw 0
;====================================================================
