--this module provides compatability between Altos and D Machines --by implementing Long BITBLTs for Altos DIRECTORY LongDefs: FROM "LongDefs", BcplOps: FROM "BcplOps", BitBltDefs: FROM "BitBltDefs", InlineDefs: FROM "InlineDefs", SegmentDefs: FROM "SegmentDefs", SystemDefs: FROM "SystemDefs"; Long: PROGRAM IMPORTS BcplOps, InlineDefs, LongDefs, SegmentDefs, SystemDefs EXPORTS LongDefs = BEGIN NovaBBArgBlock: TYPE = MACHINE DEPENDENT RECORD [ bank: CARDINAL, bbt: POINTER TO BitBltDefs.BBTable ]; NovaCode: ARRAY [0..16) OF CARDINAL _ [ 54415B, -- STA 3 saveret 115000B, -- MOV 0 3 AC3: @arg 22415B, -- LDA 0 @bankno 40413B, -- STA 0 savebank savebank _ EmulatorBankRegister 21400B, -- LDA 0 0,3 42412B, -- STA 0 @bankno EmulatorBankRegister _ arg.bank 31401B, -- LDA 2 1,3 AC2: arg.bbt 126400B, -- SUB 1 1 AC1: 0 61024B, -- BITBLT 20405B, -- LDA 0 savebank 42405B, -- STA 0 @bankno EmulatorBankRegister _ savebank 34402B, -- LDA 3 saveret 1400B, -- JMP 0 3 0B, -- saveret: 0 0B, -- savebank: 0 177740B -- bankno: 177740 ]; Machine: SegmentDefs.MachineType = SegmentDefs.GetMemoryConfig[].AltoType; DMachine: PUBLIC BOOLEAN _ (Machine = D0) OR (Machine = Dorado); SoftBITBLT: PUBLIC PROCEDURE [ptr: POINTER TO BitBltDefs.BBTable] = BEGIN srcBank: CARDINAL _ InlineDefs.HighHalf[ptr.slbca]; destBank: CARDINAL _ InlineDefs.HighHalf[ptr.dlbca]; randomPointer: POINTER; arg: NovaBBArgBlock; x: ARRAY [0..SIZE[BitBltDefs.BBTable]] OF UNSPECIFIED; bbt: POINTER TO BitBltDefs.BBTable _ @x[LOOPHOLE[@x,CARDINAL] MOD 2]; bbt^ _ ptr^; --make sure DMachine variable was initialized IF DMachine THEN BEGIN LongDefs.HardBITBLT[ptr];RETURN;END; bbt.ptrs _ short; IF bbt.sourcetype = gray THEN srcBank _ 0; IF (srcBank = 0) OR (srcBank = destBank) OR (destBank = 0) THEN --easy BEGIN bbt.sourcealt _ srcBank#0; bbt.sbca _ InlineDefs.LowHalf[bbt.slbca]; bbt.destalt _ destBank#0; bbt.dbca _ InlineDefs.LowHalf[bbt.dlbca]; arg _ [bank: InlineDefs.BITOR[srcBank,destBank], bbt: bbt]; [] _ BcplOps.BcplJSR[code: JSR, address: @NovaCode, arg: @arg]; RETURN; END; --nope, hard case; allocate bank 0 block of appropriate size bbt.dlx _ 0; bbt.dty _ 0; bbt.dbmr _ (bbt.dw+15)/16; randomPointer _ SystemDefs.AllocateSegment[bbt.dbmr*bbt.dh]; bbt.sourcealt _ TRUE; bbt.sbca _ InlineDefs.LowHalf[bbt.slbca]; bbt.destalt _ FALSE; bbt.dbca _ randomPointer; bbt.function _ replace; bbt.sourcetype _ block; arg _ [bank: srcBank, bbt: bbt]; [] _ BcplOps.BcplJSR[code: JSR, address: @NovaCode, arg: @arg]; bbt.slx _ 0; bbt.sty _ 0; bbt.dlx _ ptr.dlx; bbt.dty _ ptr.dty; bbt.sbmr _ bbt.dbmr; bbt.dbmr _ ptr.dbmr; bbt.sourcealt _ FALSE; bbt.sbca _ randomPointer; bbt.destalt _ TRUE; bbt.dbca _ InlineDefs.LowHalf[bbt.dlbca]; bbt.function _ ptr.function; bbt.sourcetype _ ptr.sourcetype; arg _ [bank: destBank, bbt: bbt]; [] _ BcplOps.BcplJSR[code: JSR, address: @NovaCode, arg: @arg]; SystemDefs.FreeSegment[randomPointer]; END; InitMachineType: PUBLIC PROCEDURE = BEGIN END; --to initialize DMachine END. (635)\f1 1076b141B