|
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 - 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