DIRECTORY DragonProcessOffsets, DragOpsCross, DragOpsCrossProcess, DragOpsCrossUtils, HandCoding, HandCodingSupport, HandCodingPseudos; GenAcker: CEDAR PROGRAM IMPORTS HandCoding, HandCodingPseudos = BEGIN OPEN DragonProcessOffsets, HandCoding, HandCodingSupport, HandCodingPseudos; CARD: TYPE = LONG CARDINAL; Word: TYPE = DragOpsCross.Word; GenAck: PROC [enter: Label] = { rX: RegSpec = reg0; rY: RegSpec = reg1; returnLabel: Label = GenLabel[]; ProcedureEntry[enter, 2]; MakeLabelGlobal["Acker.Ack", enter]; {elseLabel: Label = GenLabel[]; drLRn[rX]; drJNEBBJ[0, UseLabel8B[elseLabel]]; drLC1[]; drJB[UseLabel8A[returnLabel]]; SetLabel[elseLabel]; }; {elseLabel: Label = GenLabel[]; drLRn[rY]; drJNEBBJ[0, UseLabel8B[elseLabel]]; {innerElseLabel: Label = GenLabel[]; drLRn[rX]; drJNEBB[1, UseLabel8B[innerElseLabel]]; drLC2[]; drJB[UseLabel8A[returnLabel]]; SetLabel[innerElseLabel]; drRADD[pushDst, rX, const2]; drJB[UseLabel8A[returnLabel]]; }; SetLabel[elseLabel]; }; drRSUB[pushDst, rX, const1]; drLRn[rY]; drLFC[UseLabel16[enter]]; drRSUB[pushDst, rY, const1]; drLFC[UseLabel16[enter]]; SetLabel[returnLabel]; drSRn[reg0]; ProcedureExit[1]; }; All: PROC = { startLabel: Label = GenLabelHere[]; enterRecurse: Label = GenLabel[]; testLabel: Label = GenLabel[]; MakeLabelGlobal["Acker.Start", startLabel]; EnableTraps[]; -- to detect stack overflow drASL[255]; -- ensure that stack is empty, regardless of where it was drJDB[UseLabel16[testLabel]]; GenAck[enterRecurse]; SetLabel[testLabel]; drLIB[11]; drLIB[2]; drLFC[UseLabel16[enterRecurse]]; Halt[0]; }; END. GenAcker.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Russ Atkinson, July 19, 1984 11:18:31 pm PDT Russ Atkinson (RRA) January 10, 1986 3:39:38 pm PST This is the assembly level code for: Ack: PROC [x,y: INT] RETURNS [ans: INT] = { SELECT TRUE FROM x = 0 => ans _ 1; y = 0 => ans _ IF x = 1 THEN 2 ELSE x+2; ENDCASE => ans _ Ack[Ack[x-1, y], y-1]; }; GenAcker.All[] is a procedure that gets called by LizardTool to generate the code when GenAcker.bcd is loaded and started. 81.25 in leftMargin 1.25 in rightMargin 6.0 in lineLength J m1