|
|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 5600 (0x15e0)
Notes: Mikados TextFile, Mikados_K
Names: »ALLOCA«
└─⟦38ff28550⟧ Bits:30004682 Pascal Standard Assembler til MIKADOS
└─⟦this⟧ »ALLOCA«
;*************************************************************
;* PASCAL STANDARD ASSEMBLER PACKAGE. *
;* *
;* (C) 1980 DANSK DATA ELEKTRONIK APS. *
;*************************************************************
;
;*************************************************************
;* PROCEDURE NAME: ALLOCA *
;*************************************************************
;
; CT 05-MAY-1980
;
;=============================================================
; DESCRIPTION:
; THIS PROCEDURE IS USED TO ALLOCATE A MEMORY AREA.
; PLEASE REFER TO THE PASCAL STANDARD ASSEMBLER PACKAGE MANUAL
; SECTION 6.1 FOR DETAILS.
;
;-------------------------------------------------------------
; STACK CONTENTS ON ENTRY: I I
; I---------------I
; I RETURN ADR. I
; I---------------I
; I -> STATUS I
; I---------------I
; I LENGTH I
; I---------------I
; I -> ADDRESS I
; I---------------I
; I I
;-------------------------------------------------------------
; STACK CONTENTS ON EXIT: EMPTY
;-------------------------------------------------------------
; THIS PROCEDURE ACTUALLY ALLOCATES THREE BYTES MORE THAN THE
; USER REQUESTED. THE TWO FIRST BYTES OF THE ALLOCATED AREA
; ARE THEN USED TO HOLD THE LENGTH OF THE AREA AND ARE USED
; WHEN DEALLO IS CALLED; THE THIRD BYTE CONTAINS THE CODE EE
; (HEX) AND IS A FLAG THAT INDICATES THAT THIS PARTICULAR AREA
; IS IN USE.
; THE ADDRESS RETURNED TO THE USER IS THE ADDRESS OF THE BYTE
; FOLLOWING THE THREE EXTRA BYTES.
;=============================================================
SKIP
ALLOCA::
;
;GET THE REQUESTED LENGTH OF THE MEMORY AREA
;
POP B ;BC=RETURN ADDRESS
POP D ;DE->STATUS
POP H ;HL=REQUESTED LENGTH
PUSH B
PUSH D
;THE STACK NOW LOOKS LIKE THIS:
; I I
; I---------------I
; I -> STATUS I
; I---------------I
; I RET. ADR. I
; I---------------I
; I -> ADDRESS I
; I---------------I
; I I
INX H
INX H
INX H ;WE SHOULD ALLOCATE THREE EXTRA BYTES
;
;IF THE LENGTH IS LESS THAN 4, 4 BYTES ARE ALLOCATED
;
MOV A,H ;A:=MSB OF LENGTH
ANA A ;A=0?
JNZ LENGOK ;NO (I.E. LENGTH >= 256)
MOV A,L ;YES, A:=LSB OF LENGTH
CPI 4 ;A<4?
JNC LENGOK ;NO
MVI L,4 ;YES, LENGTH:=4
;
;ALLOCATE!
;
LENGOK:CALL ALLOC
;DE=0 OR DE=-1 IN CASE OF ERROR
;OTHERWISE: DE->ALLOCATED AREA
; HL=LENGTH OF ALLOCATED AREA
;
;TEST DE
;
PUSH D ;SAVE ADDR. OF ALLOCATED AREA
INX D ;DE=1 OR DE=0 IN CASE OF ERROR
MOV A,D ;A:=MSB OF DE
ANA A ;A=0?
JNZ OK ;NO, ALLOCATION IS OK
MOV A,E ;A:=LSB OF DE
ANA A ;A=0? I.E. ILLEGAL LENGTH?
JNZ LEGLEN ;NO
MVI A,2 ;YES, A:=ERROR CODE FOR ILLEGAL LENGTH
JMP EXI ;GO CLEAN UP
LEGLEN:CPI 1 ;A=1? I.E. NO AREA AVAILABLE?
JNZ OK ;NO, ALLOCATION IS OK
;YES, A=1 (WHICH IS THE ERROR CODE FOR
; NO AREA AVAILABLE)
JMP EXI ;GO CLEAN UP
;
;ALLOCATION WAS OK
;
OK: XRA A ;A:=0 (I.E. NO ERROR CODE)
;
;CLEAN UP. MOST OF THIS CODE IS IRRELEVANT IF THE ALLOCATION
;WAS A FAILURE
;
EXI: POP D ;DE->ALLOCATED AREA
XCHG ;HL->ALLOCATED AREA; DE=LENGTH OF AREA
MOV M,E ;STORE LENGTH
INX H ; OF ALLOCATED AREA
MOV M,D ; IN FIRST TWO BYTES
INX H
MVI M,0EE ;SET FLAG BYTE
INX H ;AND POINT TO NEXT BYTE
XCHG ;DE->THE AREA THE USER GETS
;
;REG. A CONTAINS THE STATUS VALUE. STORE IT.
;
POP H ;HL->STATUS
MOV M,A ;STORE STATUS VALUE
INX H
MVI M,0 ;STORE 0 IN MSB. OF STATUS VALUE
;
;SET POINTER TO ALLOCATED AREA
;
POP H ;HL=RETURN ADDRESS
XTHL ;HL->ADDRESS
MOV M,E ;STORE
INX H ; ADDRESS OF
MOV M,D ; ALLOCATED AREA
RET
END