pcs/smmu.asm

173 lines
4.0 KiB
NASM
Raw Permalink Normal View History

2023-05-20 05:57:06 -04:00
name SMMU
title Scheme Memory Management Utilities
page 62,132
; =====> SMMU.ASM
;****************************************************************
;* TIPC Scheme '84 Memory Management Utilities *
;* *
;* (C) Copyright 1985, 1987 by Texas Instruments Incorporated. *
;* All rights reserved. *
;* *
;* Author: Terry Caudill *
;* Date written: 18 March 1986 *
;* History: *
;* rb 4/ 5/87 "getbase" returns a page's swap state in carry *
;* (for compatibility with PCSEXT and PCSEXP) *
;****************************************************************
include schemed.equ
include schemed.ref
DOS equ 021h
DGROUP group data
PGROUP group prog
data segment word public 'DATA'
assume ds:DGROUP
extrn page0:byte, page4:byte, page5:byte, page6:byte
extrn page7:byte, page8:byte
extrn _top:word, _paras:word,first_pa:word,first_dos:word
public GC_ING
GC_ING dw 0
data ends
prog segment byte public 'PROG'
assume cs:PGROUP
;;======================================================================
;;
;; Get page base address of page
;;
;; On exit, carry is clear to indicate page is always in memory
;; (for compatibility with extended and expanded versions of this routine)
;;
;;======================================================================
public getbase
getbase proc near
push BP
mov BP,SP
mov BX,word ptr [BP+4]
mov AX,word ptr [BX+pagetabl] ;; Get table indicator
clc ;; page always avail in conv. memory
pop BP
ret
getbase endp
;;======================================================================
;;
;; InitMem()
;; Compute the best page size, but not smaller than MIN_PAGESIZE
;;
;;======================================================================
public InitMem
InitMem proc near
push BP
sub SP,2 ;; Local storage
mov BP,SP
mov BX,DS
mov ES,BX ;; Ensure ES = DS
;; Convert offset within pagetabl[0] into paragraph address
mov DI,offset pagetabl
mov AX,word ptr [DI]
mov CX,4
shr AX,CL
add AX,BX
mov word ptr [DI],AX
;; Same for pagetabl[4] through pagetabl[8]
mov DX,5
mov DI,offset pagetabl[8]
EmmP$0:
mov AX,word ptr [DI]
shr AX,CL
add AX,BX
mov word ptr [DI],AX
add DI,2
dec DX
jnz EmmP$0
;; Allocate all the memory that DOS will give us.
mov BX,0FFFFh ;; first ask for too much
mov AH,048h
int DOS ;; DOS gets an error, but tells us
;; in BX how much we CAN get
mov AH,048h
int DOS ;; reissue allocation request
mov first_dos,AX ;; save address for returning it to DOS
mov first_pa,AX ;; save address for Scheme heap
;; Compute the best page size, but not smaller than MIN_PAGESIZE
mov AX,_paras ;; max number of paragraphs
sub AX,first_pa ;; subtract first paragragh
xor DX,DX ;; get ready for divide
mov CX,NUMPAGES-PreAlloc ;; CX <= number heap allocated pages
idiv CX ;; AX <= paras-per-page
mov DX,(MIN_PAGESIZE shr 4)
cmp AX,DX ;; If paras-per-page < MIN_PAGESIZE/16
jge EmmP$05 ;; then
mov AX,DX ;; paras-per-page = MIN_PAGESIZE/16
EmmP$05:
mov [BP],AX ;; Save paras-per-page
;; Pagesize = (paras-per-page * 16)
mov CX,4
shl AX,CL
mov pagesize,AX
mov SI,AX
;; Initialize page management table
xor CX,CX ;; Keep number of pages in CX
mov DX,nextpage
mov freepage,DX ;; freepage = nextpage
mov AX,first_pa ;; AX <= next paragraph
mov DI,_paras ;; DI <= (_paras - paras per page)
sub DI,[BP]
EmmP$1:
cmp DI,AX ;; Did we reach it
jb EmmP$2 ;; Yes...no more
cmp DX,NUMPAGES ;; See if we have filled the table
jae EmmP$2
mov BX,DX
shl BX,1
mov word ptr [BX+pagetabl],AX
mov word ptr [BX+psize],SI
and word ptr [BX+attrib],not NOMEMORY
inc DX
mov word ptr [BX+pagelink],DX
mov word ptr [BX+nextcell],0
inc CX ;; page_count++
add AX,[BP] ;; nextpara = nextpara + para per page
jmp EmmP$1
EmmP$2:
mov nextpage,DX ;; nextpage = lastpage
mov lastpage,DX
mov AX,CX
pop BP
pop BP
ret
InitMem endp
prog ends
end