Display

Used Exports

BUILTINS: ASR BYTE INC INTEGER LSL ROR SET
SYSTEM: ADR GET PUT VAL

MODULE Display; (*NW 5.11.2013 / 3.7.2016*)
.MODULE Display (KEY 4C08D3EA, VERSION 1, SIZE 000011B0)
.TYPEDESC 00000020 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000040 FFFFFFFF FFFFFFFF FFFFFFFF 00000004 00000000 FFFFFFFF
.DATA 28H
.STRING TABLE SKIPPED
.FIXUP T 0H
IMPORT SYSTEM;
CONST black* = 0; white* = 1; (*black = background*)
replace* = 0; paint* = 1; invert* = 2; (*modes*)
base = 0E7F00H; (*adr of 1024 x 768 pixel, monocolor display frame*)
TYPE Frame* = POINTER TO FrameDesc;
FrameMsg* = RECORD END ;
Handler* = PROCEDURE (F: Frame; VAR M: FrameMsg);
FrameDesc* = RECORD next*, dsc*: Frame;
X*, Y*, W*, H*: INTEGER;
handle*: Handler
END ;
VAR Base*, Width*, Height*: INTEGER;
arrow*, star*, hook*, updown*, block*, cross*, grey*: INTEGER;
(*a pattern is an array of bytes; the first is its width (< 32), the second its height, the rest the raster*)
PROCEDURE Handle*(F: Frame; VAR M: FrameMsg);
BEGINa
0000a .PROC 1
0000a .PROC 13
0000a(4EE90010): SUB SP, SP, 10H
0001a(AFE00000): STR LNK, SP, 0H
0002a(A0E00004): STR R0, SP, 4H
0003a(A1E00008): STR R1, SP, 8H
0004a(A2E0000C): STR R2, SP, CH
IF (F # NIL)b & (cF.handled # NIL)e THENf F.handleg(Fh,i M)j ENDk
0005b .PROC 2
0005b(80E00004): LDR R0, SP, 4H
0006c(E1000010): BEQ 16 [0017H]
0007d(80E00004): LDR R0, SP, 4H
0008d(D103154C): BLEQ MT [trap=4, pos=789]
0009e(80000018): LDR R0, R0, 18H
000Af(E100000C): BEQ 12 [0017H]
000Bg(80E00004): LDR R0, SP, 4H
000Cg .PROC 3
000Cg(D1032A4C): BLEQ MT [trap=4, pos=810]
000Dh .PROC 4
000Dh(80000018): LDR R0, R0, 18H
000Eh .PROC 5
000Eh(4EE90004): SUB SP, SP, 4H
000Fh .PROC 6
000Fh(A0E00000): STR R0, SP, 0H
0010i .PROC 7
0010i(80E00008): LDR R0, SP, 8H
0011j .PROC 8
0011j(81E0000C): LDR R1, SP, CH
0012j .PROC 9
0012j(82E00010): LDR R2, SP, 10H
0013k .PROC 10
0013k(83E00000): LDR R3, SP, 0H
0014k .PROC 11
0014k(4EE80004): ADD SP, SP, 4H
0015k .PROC 12
0015k(D103345C): BLEQ MT [trap=5, pos=820]
0016k(D7000003): BL R3
ENDl Handle;
0017l(8FE00000): LDR LNK, SP, 0H
0018l(4EE80010): ADD SP, SP, 10H
0019l(C700000F): B LNK
(* raster ops *)
PROCEDURE Dot*(col, x, y, mode: INTEGER);
VAR a: INTEGER; u, s: SET;
BEGINm a := base + (x DIV 32)n*4 +o y*128;p
001Am .PROC 14
001Am(4EE90020): SUB SP, SP, 20H
001Bm(AFE00000): STR LNK, SP, 0H
001Cm(A0E00004): STR R0, SP, 4H
001Dm(A1E00008): STR R1, SP, 8H
001Em(A2E0000C): STR R2, SP, CH
001Fm(A3E00010): STR R3, SP, 10H
0020n(80E00008): LDR R0, SP, 8H
0021n(40020005): ASR R0, R0, 5H
0022o(40010002): LSL R0, R0, 2H
0023o(6100000E): MOV' R1, R0, EH
0024o(41167F00): IOR R1, R1, 7F00H
0025o(00180000): ADD R0, R1, R0
0026p(81E0000C): LDR R1, SP, CH
0027p(41110007): LSL R1, R1, 7H
0028p(00080001): ADD R0, R0, R1
0029p(A0E00014): STR R0, SP, 14H
s := {x MOD 32}q;r SYSTEM.GET(a, u);s
002Aq(80E00008): LDR R0, SP, 8H
002Bq(4004001F): AND R0, R0, 1FH
002Cq(41000001): MOV R1, R0, 1H
002Dq(00110000): LSL R0, R1, R0
002Er(A0E0001C): STR R0, SP, 1CH
002Fs(80E00014): LDR R0, SP, 14H
0030s(80000000): LDR R0, R0, 0H
0031s(A0E00018): STR R0, SP, 18H
IF mode = paint THENt SYSTEM.PUT(a, u + s)u
0032t(80E00010): LDR R0, SP, 10H
0033t(40090001): SUB R0, R0, 1H
0034t(E9000006): BNE 6 [003BH]
0035u(80E00018): LDR R0, SP, 18H
0036u(81E0001C): LDR R1, SP, 1CH
0037u(00060001): IOR R0, R0, R1
ELSIFv modew = invert THENx SYSTEM.PUT(a, u / s)y
0038v(81E00014): LDR R1, SP, 14H
0039v(A0100000): STR R0, R1, 0H
003Aw(E7000016): B 22 [0051H]
003Bx(80E00010): LDR R0, SP, 10H
003Cx(40090002): SUB R0, R0, 2H
003Dx(E9000006): BNE 6 [0044H]
003Ey(80E00018): LDR R0, SP, 18H
003Fy(81E0001C): LDR R1, SP, 1CH
0040y(00070001): XOR R0, R0, R1
ELSEz (*mode = replace*)
0041z(81E00014): LDR R1, SP, 14H
0042z(A0100000): STR R0, R1, 0H
IFa col # black THENb SYSTEM.PUT(a, u + s)c ELSEd SYSTEMe.PUT(a, u - s)f ENDg
0043a(E700000D): B 13 [0051H]
0044b(80E00004): LDR R0, SP, 4H
0045b(E1000006): BEQ 6 [004CH]
0046c(80E00018): LDR R0, SP, 18H
0047c(81E0001C): LDR R1, SP, 1CH
0048c(00060001): IOR R0, R0, R1
0049d(81E00014): LDR R1, SP, 14H
004Ad(A0100000): STR R0, R1, 0H
004Be(E7000005): B 5 [0051H]
004Cf(80E00018): LDR R0, SP, 18H
004Df(81E0001C): LDR R1, SP, 1CH
004Ef(00050001): ANN R0, R0, R1
004Fg(81E00014): LDR R1, SP, 14H
0050g(A0100000): STR R0, R1, 0H
END
ENDh Dot;
0051h(8FE00000): LDR LNK, SP, 0H
0052h(4EE80020): ADD SP, SP, 20H
0053h(C700000F): B LNK
PROCEDURE ReplConst*(col, x, y, w, h, mode: INTEGER);
VAR al, ar, a0, a1: INTEGER; left, right, mid, pix, pixl, pixr: SET;
BEGINi al := base + y*128;j
0054i .PROC 15
0054i(4EE90044): SUB SP, SP, 44H
0055i(AFE00000): STR LNK, SP, 0H
0056i(A0E00004): STR R0, SP, 4H
0057i(A1E00008): STR R1, SP, 8H
0058i(A2E0000C): STR R2, SP, CH
0059i(A3E00010): STR R3, SP, 10H
005Ai(A4E00014): STR R4, SP, 14H
005Bi(A5E00018): STR R5, SP, 18H
005Cj(80E0000C): LDR R0, SP, CH
005Dj(40010007): LSL R0, R0, 7H
005Ej(6100000E): MOV' R1, R0, EH
005Fj(41167F00): IOR R1, R1, 7F00H
0060j(00180000): ADD R0, R1, R0
0061j(A0E0001C): STR R0, SP, 1CH
ar := ((x+w-k1)l DIV 32)m*4 +n al;o al := (x DIV 32)p*4 +q al;r
0062k(80E00008): LDR R0, SP, 8H
0063k(81E00010): LDR R1, SP, 10H
0064k(00080001): ADD R0, R0, R1
0065l(40090001): SUB R0, R0, 1H
0066m(40020005): ASR R0, R0, 5H
0067n(40010002): LSL R0, R0, 2H
0068o(81E0001C): LDR R1, SP, 1CH
0069o(00080001): ADD R0, R0, R1
006Ao(A0E00020): STR R0, SP, 20H
006Bp(80E00008): LDR R0, SP, 8H
006Cp(40020005): ASR R0, R0, 5H
006Dq(40010002): LSL R0, R0, 2H
006Er(81E0001C): LDR R1, SP, 1CH
006Fr(00080001): ADD R0, R0, R1
0070r(A0E0001C): STR R0, SP, 1CH
IF ar = al THENs
0071s(80E00020): LDR R0, SP, 20H
0072s(81E0001C): LDR R1, SP, 1CH
0073s(00090001): SUB R0, R0, R1
0074s(E9000035): BNE 53 [00AAH]
mid := {(x MOD 32)t .. ((x+w-u1)v MOD 32)w}x;y
0075t(80E00008): LDR R0, SP, 8H
0076t(4004001F): AND R0, R0, 1FH
0077u(81E00008): LDR R1, SP, 8H
0078u(82E00010): LDR R2, SP, 10H
0079u(01180002): ADD R1, R1, R2
007Av(41190001): SUB R1, R1, 1H
007Bw(4114001F): AND R1, R1, 1FH
007Cx(5200FFFF): MOV R2, R0, FFFFFFFFH
007Dx(00210000): LSL R0, R2, R0
007Ex(5200FFFE): MOV R2, R0, FFFFFFFEH
007Fx(01210001): LSL R1, R2, R1
0080x(00050001): ANN R0, R0, R1
0081y(A0E00034): STR R0, SP, 34H
FOR a1 := al TOz al + (h-1)a*128 BYb 128 DO
0082z(80E0001C): LDR R0, SP, 1CH
0083a(81E00014): LDR R1, SP, 14H
0084a(41190001): SUB R1, R1, 1H
0085b(41110007): LSL R1, R1, 7H
0086b(82E0001C): LDR R2, SP, 1CH
0087b(01280001): ADD R1, R2, R1
SYSTEMc.GET(a1, pix);d
0088c(01090001): SUB R1, R0, R1
0089c(EE00001F): BGT 31 [00A9H]
008Ac(A0E00028): STR R0, SP, 28H
008Bd(80E00028): LDR R0, SP, 28H
008Cd(80000000): LDR R0, R0, 0H
008Dd(A0E00038): STR R0, SP, 38H
IF mode = invert THENe SYSTEM.PUT(a1, pix / mid)f
008Ee(80E00018): LDR R0, SP, 18H
008Fe(40090002): SUB R0, R0, 2H
0090e(E9000006): BNE 6 [0097H]
0091f(80E00038): LDR R0, SP, 38H
0092f(81E00034): LDR R1, SP, 34H
0093f(00070001): XOR R0, R0, R1
ELSIFg (hmode = replace)i & (jcol = black)k THENl (*erase*) SYSTEM.PUT(a1, pix - mid)m
0094g(81E00028): LDR R1, SP, 28H
0095g(A0100000): STR R0, R1, 0H
0096h(E700000F): B 15 [00A6H]
0097i(80E00018): LDR R0, SP, 18H
0098j(E9000008): BNE 8 [00A1H]
0099k(80E00004): LDR R0, SP, 4H
009Al(E9000006): BNE 6 [00A1H]
009Bm(80E00038): LDR R0, SP, 38H
009Cm(81E00034): LDR R1, SP, 34H
009Dm(00050001): ANN R0, R0, R1
ELSEn (* (mode = paint) OR (mode = replace) & (col # black) *) SYSTEMo.PUT(a1, pix + mid)p
009En(81E00028): LDR R1, SP, 28H
009Fn(A0100000): STR R0, R1, 0H
00A0o(E7000005): B 5 [00A6H]
00A1p(80E00038): LDR R0, SP, 38H
00A2p(81E00034): LDR R1, SP, 34H
00A3p(00060001): IOR R0, R0, R1
ENDq
00A4q(81E00028): LDR R1, SP, 28H
00A5q(A0100000): STR R0, R1, 0H
END
ELSIFr ars > al THENt
00A6r(80E00028): LDR R0, SP, 28H
00A7r(40080080): ADD R0, R0, 80H
00A8r(E7FFFFDA): B -38 [0083H]
00A9s(E700007E): B 126 [0128H]
00AAt(80E00020): LDR R0, SP, 20H
00ABt(81E0001C): LDR R1, SP, 1CH
00ACt(00090001): SUB R0, R0, R1
00ADt(E600007A): BLE 122 [0128H]
left := {(x MOD 32)u .. 31}v;w right := {0 .. ((x+w-x1)y MOD 32)z}a;b
00AEu(80E00008): LDR R0, SP, 8H
00AFu(4004001F): AND R0, R0, 1FH
00B0v(5100FFFF): MOV R1, R0, FFFFFFFFH
00B1v(00110000): LSL R0, R1, R0
00B2v(4100001F): MOV R1, R0, 1FH
00B3v(5200FFFE): MOV R2, R0, FFFFFFFEH
00B4v(01210001): LSL R1, R2, R1
00B5v(00050001): ANN R0, R0, R1
00B6w(A0E0002C): STR R0, SP, 2CH
00B7x(80E00008): LDR R0, SP, 8H
00B8x(81E00010): LDR R1, SP, 10H
00B9x(00080001): ADD R0, R0, R1
00BAy(40090001): SUB R0, R0, 1H
00BBz(4004001F): AND R0, R0, 1FH
00BCa(5100FFFE): MOV R1, R0, FFFFFFFEH
00BDa(00110000): LSL R0, R1, R0
00BEa(5007FFFF): XOR R0, R0, FFFFFFFFH
00BFa(5004FFFF): AND R0, R0, FFFFFFFFH
00C0b(A0E00030): STR R0, SP, 30H
FOR a0 := al TOc al + (h-1)d*128 BYe 128 DO
00C1c(80E0001C): LDR R0, SP, 1CH
00C2d(81E00014): LDR R1, SP, 14H
00C3d(41190001): SUB R1, R1, 1H
00C4e(41110007): LSL R1, R1, 7H
00C5e(82E0001C): LDR R2, SP, 1CH
00C6e(01280001): ADD R1, R2, R1
SYSTEMf.GET(a0, pixl);g SYSTEM.GET(ar, pixr);h
00C7f(01090001): SUB R1, R0, R1
00C8f(EE00005F): BGT 95 [0128H]
00C9f(A0E00024): STR R0, SP, 24H
00CAg(80E00024): LDR R0, SP, 24H
00CBg(80000000): LDR R0, R0, 0H
00CCg(A0E0003C): STR R0, SP, 3CH
00CDh(80E00020): LDR R0, SP, 20H
00CEh(80000000): LDR R0, R0, 0H
00CFh(A0E00040): STR R0, SP, 40H
IF mode = invert THENi
00D0i(80E00018): LDR R0, SP, 18H
00D1i(40090002): SUB R0, R0, 2H
00D2i(E900001C): BNE 28 [00EFH]
SYSTEM.PUT(a0, pixl / left)j;k
00D3j(80E0003C): LDR R0, SP, 3CH
00D4j(81E0002C): LDR R1, SP, 2CH
00D5j(00070001): XOR R0, R0, R1
00D6k(81E00024): LDR R1, SP, 24H
00D7k(A0100000): STR R0, R1, 0H
FOR a1 := a0+4 TOl ar-4 BYm 4 DO SYSTEMn.GET(a1, pix);o SYSTEM.PUT(a1, -pix)p ENDq ;r
00D8l(80E00024): LDR R0, SP, 24H
00D9l(40080004): ADD R0, R0, 4H
00DAm(81E00020): LDR R1, SP, 20H
00DBm(41190004): SUB R1, R1, 4H
00DCn(01090001): SUB R1, R0, R1
00DDn(EE00000B): BGT 11 [00E9H]
00DEn(A0E00028): STR R0, SP, 28H
00DFo(80E00028): LDR R0, SP, 28H
00E0o(80000000): LDR R0, R0, 0H
00E1o(A0E00038): STR R0, SP, 38H
00E2p(80E00038): LDR R0, SP, 38H
00E3p(5007FFFF): XOR R0, R0, FFFFFFFFH
00E4q(81E00028): LDR R1, SP, 28H
00E5q(A0100000): STR R0, R1, 0H
00E6r(80E00028): LDR R0, SP, 28H
00E7r(40080004): ADD R0, R0, 4H
00E8r(E7FFFFF1): B -15 [00DAH]
SYSTEM.PUT(ar, pixr / right)s
00E9s(80E00040): LDR R0, SP, 40H
00EAs(81E00030): LDR R1, SP, 30H
00EBs(00070001): XOR R0, R0, R1
ELSIFt (umode = replace)v & (wcol = black)x THENy (*erase*)
00ECt(81E00020): LDR R1, SP, 20H
00EDt(A0100000): STR R0, R1, 0H
00EEu(E7000033): B 51 [0122H]
00EFv(80E00018): LDR R0, SP, 18H
00F0w(E900001A): BNE 26 [010BH]
00F1x(80E00004): LDR R0, SP, 4H
00F2y(E9000018): BNE 24 [010BH]
SYSTEM.PUT(a0, pixl - left)z;a
00F3z(80E0003C): LDR R0, SP, 3CH
00F4z(81E0002C): LDR R1, SP, 2CH
00F5z(00050001): ANN R0, R0, R1
00F6a(81E00024): LDR R1, SP, 24H
00F7a(A0100000): STR R0, R1, 0H
FOR a1 := a0+4 TOb ar-4 BYc 4 DO SYSTEMd.PUT(a1, {}) ENDe ;f
00F8b(80E00024): LDR R0, SP, 24H
00F9b(40080004): ADD R0, R0, 4H
00FAc(81E00020): LDR R1, SP, 20H
00FBc(41190004): SUB R1, R1, 4H
00FCd(01090001): SUB R1, R0, R1
00FDd(EE000007): BGT 7 [0105H]
00FEd(A0E00028): STR R0, SP, 28H
00FFe(80E00028): LDR R0, SP, 28H
0100e(41000000): MOV R1, R0, 0H
0101e(A1000000): STR R1, R0, 0H
0102f(80E00028): LDR R0, SP, 28H
0103f(40080004): ADD R0, R0, 4H
0104f(E7FFFFF5): B -11 [00FAH]
SYSTEM.PUT(ar, pixr - right)g
0105g(80E00040): LDR R0, SP, 40H
0106g(81E00030): LDR R1, SP, 30H
0107g(00050001): ANN R0, R0, R1
ELSEh (* (mode = paint) OR (mode = replace) & (col # black) *)
0108h(81E00020): LDR R1, SP, 20H
0109h(A0100000): STR R0, R1, 0H
SYSTEMi.PUT(a0, pixl + left)j;k
010Ai(E7000017): B 23 [0122H]
010Bj(80E0003C): LDR R0, SP, 3CH
010Cj(81E0002C): LDR R1, SP, 2CH
010Dj(00060001): IOR R0, R0, R1
010Ek(81E00024): LDR R1, SP, 24H
010Fk(A0100000): STR R0, R1, 0H
FOR a1 := a0+4 TOl ar-4 BYm 4 DO SYSTEMn.PUT(a1, {0 .. 31}) ENDo ;p
0110l(80E00024): LDR R0, SP, 24H
0111l(40080004): ADD R0, R0, 4H
0112m(81E00020): LDR R1, SP, 20H
0113m(41190004): SUB R1, R1, 4H
0114n(01090001): SUB R1, R0, R1
0115n(EE000007): BGT 7 [011DH]
0116n(A0E00028): STR R0, SP, 28H
0117o(80E00028): LDR R0, SP, 28H
0118o(5100FFFF): MOV R1, R0, FFFFFFFFH
0119o(A1000000): STR R1, R0, 0H
011Ap(80E00028): LDR R0, SP, 28H
011Bp(40080004): ADD R0, R0, 4H
011Cp(E7FFFFF5): B -11 [0112H]
SYSTEM.PUT(ar, pixr + right)q
011Dq(80E00040): LDR R0, SP, 40H
011Eq(81E00030): LDR R1, SP, 30H
011Fq(00060001): IOR R0, R0, R1
ENDr ;
0120r(81E00020): LDR R1, SP, 20H
0121r(A0100000): STR R0, R1, 0H
INC(ar, 128)
ENDs
0122s(80E00020): LDR R0, SP, 20H
0123s(40080080): ADD R0, R0, 80H
0124s(A0E00020): STR R0, SP, 20H
ENDt
0125t(80E00024): LDR R0, SP, 24H
0126t(40080080): ADD R0, R0, 80H
0127t(E7FFFF9A): B -102 [00C2H]
ENDu ReplConst;
0128u(8FE00000): LDR LNK, SP, 0H
0129u(4EE80044): ADD SP, SP, 44H
012Au(C700000F): B LNK
PROCEDURE CopyPattern*(col, patadr, x, y, mode: INTEGER); (*only for modes = paint, invert*)
VAR a, a0, pwd: INTEGER;
w, h, pbt: BYTE; pix: SET;
BEGINv SYSTEM.GET(patadr, w);w SYSTEM.GET(patadr+1,x h);y INC(patadr, 2);z
012Bv .PROC 16
012Bv(4EE9002C): SUB SP, SP, 2CH
012Cv(AFE00000): STR LNK, SP, 0H
012Dv(A0E00004): STR R0, SP, 4H
012Ev(A1E00008): STR R1, SP, 8H
012Fv(A2E0000C): STR R2, SP, CH
0130v(A3E00010): STR R3, SP, 10H
0131v(A4E00014): STR R4, SP, 14H
0132w(80E00008): LDR R0, SP, 8H
0133w(90000000): LDR R0, R0, 0H
0134w(B0E00024): STR R0, SP, 24H
0135x(80E00008): LDR R0, SP, 8H
0136x(40080001): ADD R0, R0, 1H
0137y(90000000): LDR R0, R0, 0H
0138y(B0E00025): STR R0, SP, 25H
0139z(80E00008): LDR R0, SP, 8H
013Az(40080002): ADD R0, R0, 2H
013Bz(A0E00008): STR R0, SP, 8H
a := base + (x DIV 32)a*4 +b y*128;c
013Ca(80E0000C): LDR R0, SP, CH
013Da(40020005): ASR R0, R0, 5H
013Eb(40010002): LSL R0, R0, 2H
013Fb(6100000E): MOV' R1, R0, EH
0140b(41167F00): IOR R1, R1, 7F00H
0141b(00180000): ADD R0, R1, R0
0142c(81E00010): LDR R1, SP, 10H
0143c(41110007): LSL R1, R1, 7H
0144c(00080001): ADD R0, R0, R1
0145c(A0E00018): STR R0, SP, 18H
FOR a0 := a TOd a + (h-1)e*128 BYf 128 DO
0146d(80E00018): LDR R0, SP, 18H
0147e(91E00025): LDR R1, SP, 25H
0148e(41190001): SUB R1, R1, 1H
0149f(41110007): LSL R1, R1, 7H
014Af(82E00018): LDR R2, SP, 18H
014Bf(01280001): ADD R1, R2, R1
(*build pattern line; w < 32*)
SYSTEMg.GET(patadr, pbt);h INC(patadr);i pwd := pbt;j
014Cg(01090001): SUB R1, R0, R1
014Dg(EE000071): BGT 113 [01BFH]
014Eg(A0E0001C): STR R0, SP, 1CH
014Fh(80E00008): LDR R0, SP, 8H
0150h(90000000): LDR R0, R0, 0H
0151h(B0E00026): STR R0, SP, 26H
0152i(80E00008): LDR R0, SP, 8H
0153i(40080001): ADD R0, R0, 1H
0154i(A0E00008): STR R0, SP, 8H
0155j(90E00026): LDR R0, SP, 26H
0156j(A0E00020): STR R0, SP, 20H
IF w > 8 THENk SYSTEM.GET(patadr, pbt);l INC(patadr);m pwd := pbt*100H +n pwd;o
0157k(90E00024): LDR R0, SP, 24H
0158k(40090008): SUB R0, R0, 8H
0159k(E6000027): BLE 39 [0181H]
015Al(80E00008): LDR R0, SP, 8H
015Bl(90000000): LDR R0, R0, 0H
015Cl(B0E00026): STR R0, SP, 26H
015Dm(80E00008): LDR R0, SP, 8H
015Em(40080001): ADD R0, R0, 1H
015Fm(A0E00008): STR R0, SP, 8H
0160n(90E00026): LDR R0, SP, 26H
0161n(40010008): LSL R0, R0, 8H
0162o(81E00020): LDR R1, SP, 20H
0163o(00080001): ADD R0, R0, R1
0164o(A0E00020): STR R0, SP, 20H
IF w > 16 THENp SYSTEM.GET(patadr, pbt);q INC(patadr);r pwd := pbt*10000H +s pwd;t
0165p(90E00024): LDR R0, SP, 24H
0166p(40090010): SUB R0, R0, 10H
0167p(E6000019): BLE 25 [0181H]
0168q(80E00008): LDR R0, SP, 8H
0169q(90000000): LDR R0, R0, 0H
016Aq(B0E00026): STR R0, SP, 26H
016Br(80E00008): LDR R0, SP, 8H
016Cr(40080001): ADD R0, R0, 1H
016Dr(A0E00008): STR R0, SP, 8H
016Es(90E00026): LDR R0, SP, 26H
016Fs(40010010): LSL R0, R0, 10H
0170t(81E00020): LDR R1, SP, 20H
0171t(00080001): ADD R0, R0, R1
0172t(A0E00020): STR R0, SP, 20H
IF w > 24 THENu SYSTEM.GET(patadr, pbt);v INC(patadr);w pwd := pbt*1000000H +x pwd ENDy
0173u(90E00024): LDR R0, SP, 24H
0174u(40090018): SUB R0, R0, 18H
0175u(E600000B): BLE 11 [0181H]
0176v(80E00008): LDR R0, SP, 8H
0177v(90000000): LDR R0, R0, 0H
0178v(B0E00026): STR R0, SP, 26H
0179w(80E00008): LDR R0, SP, 8H
017Aw(40080001): ADD R0, R0, 1H
017Bw(A0E00008): STR R0, SP, 8H
017Cx(90E00026): LDR R0, SP, 26H
017Dx(40010018): LSL R0, R0, 18H
017Ey(81E00020): LDR R1, SP, 20H
017Fy(00080001): ADD R0, R0, R1
0180y(A0E00020): STR R0, SP, 20H
END
END ;
SYSTEM.GET(a0, pix);z
0181z(80E0001C): LDR R0, SP, 1CH
0182z(80000000): LDR R0, R0, 0H
0183z(A0E00028): STR R0, SP, 28H
IF mode = invert THENa SYSTEM.PUT(a0, SYSTEM.VAL(SET, LSL(pwd, x MOD 32)b)c / pix)d
0184a(80E00014): LDR R0, SP, 14H
0185a(40090002): SUB R0, R0, 2H
0186a(E9000009): BNE 9 [0190H]
0187b(80E0000C): LDR R0, SP, CH
0188b(4004001F): AND R0, R0, 1FH
0189c(81E00020): LDR R1, SP, 20H
018Ac(00110000): LSL R0, R1, R0
018Bd(81E00028): LDR R1, SP, 28H
018Cd(00070001): XOR R0, R0, R1
ELSEe SYSTEMf.PUT(a0, SYSTEM.VAL(SET, LSL(pwd, x MOD 32)g)h + pix)i
018De(81E0001C): LDR R1, SP, 1CH
018Ee(A0100000): STR R0, R1, 0H
018Ff(E7000008): B 8 [0198H]
0190g(80E0000C): LDR R0, SP, CH
0191g(4004001F): AND R0, R0, 1FH
0192h(81E00020): LDR R1, SP, 20H
0193h(00110000): LSL R0, R1, R0
0194i(81E00028): LDR R1, SP, 28H
0195i(00060001): IOR R0, R0, R1
ENDj ;
0196j(81E0001C): LDR R1, SP, 1CH
0197j(A0100000): STR R0, R1, 0H
IF (x MOD 32)k + w >l 32 THENm (*spill over*)
0198k(80E0000C): LDR R0, SP, CH
0199k(4004001F): AND R0, R0, 1FH
019Al(91E00024): LDR R1, SP, 24H
019Bl(00080001): ADD R0, R0, R1
019Cm(40090020): SUB R0, R0, 20H
019Dm(E600001E): BLE 30 [01BCH]
SYSTEM.GET(a0+4,n pix);o
019En(80E0001C): LDR R0, SP, 1CH
019Fn(40080004): ADD R0, R0, 4H
01A0o(80000000): LDR R0, R0, 0H
01A1o(A0E00028): STR R0, SP, 28H
IF mode = invert THENp SYSTEM.PUT(a0+4,q SYSTEM.VAL(SET, ASR(pwd, -(x MOD 32)r)s)t / pix)u
01A2p(80E00014): LDR R0, SP, 14H
01A3p(40090002): SUB R0, R0, 2H
01A4p(E900000C): BNE 12 [01B1H]
01A5q(80E0001C): LDR R0, SP, 1CH
01A6q(40080004): ADD R0, R0, 4H
01A7r(81E0000C): LDR R1, SP, CH
01A8r(4114001F): AND R1, R1, 1FH
01A9s(42000000): MOV R2, R0, 0H
01AAs(01290001): SUB R1, R2, R1
01ABt(82E00020): LDR R2, SP, 20H
01ACt(01220001): ASR R1, R2, R1
01ADu(82E00028): LDR R2, SP, 28H
01AEu(01170002): XOR R1, R1, R2
ELSEv SYSTEMw.PUT(a0+4,x SYSTEM.VAL(SET, ASR(pwd, -(x MOD 32)y)z)a + pix)b
01AFv(A1000000): STR R1, R0, 0H
01B0w(E700000B): B 11 [01BCH]
01B1x(80E0001C): LDR R0, SP, 1CH
01B2x(40080004): ADD R0, R0, 4H
01B3y(81E0000C): LDR R1, SP, CH
01B4y(4114001F): AND R1, R1, 1FH
01B5z(42000000): MOV R2, R0, 0H
01B6z(01290001): SUB R1, R2, R1
01B7a(82E00020): LDR R2, SP, 20H
01B8a(01220001): ASR R1, R2, R1
01B9b(82E00028): LDR R2, SP, 28H
01BAb(01160002): IOR R1, R1, R2
ENDc
01BBc(A1000000): STR R1, R0, 0H
END
END
ENDd CopyPattern;
01BCd(80E0001C): LDR R0, SP, 1CH
01BDd(40080080): ADD R0, R0, 80H
01BEd(E7FFFF88): B -120 [0147H]
01BFd(8FE00000): LDR LNK, SP, 0H
01C0d(4EE8002C): ADD SP, SP, 2CH
01C1d(C700000F): B LNK
PROCEDURE CopyBlock*(sx, sy, w, h, dx, dy, mode: INTEGER); (*only for mode = replace*)
VAR sa, da, sa0, sa1, d, len: INTEGER;
u0, u1, u2, u3, v0, v1, v2, v3, n: INTEGER;
end, step: INTEGER;
src, dst, spill: SET;
m0, m1, m2, m3: SET;
BEGINe
01C2e .PROC 17
01C2e(4EE90080): SUB SP, SP, 80H
01C3e(AFE00000): STR LNK, SP, 0H
01C4e(A0E00004): STR R0, SP, 4H
01C5e(A1E00008): STR R1, SP, 8H
01C6e(A2E0000C): STR R2, SP, CH
01C7e(A3E00010): STR R3, SP, 10H
01C8e(A4E00014): STR R4, SP, 14H
01C9e(A5E00018): STR R5, SP, 18H
01CAe(A6E0001C): STR R6, SP, 1CH
u0 := sx DIV 32;f u1 := sx MOD 32;g u2 := (sx+w)h DIV 32;i u3 := (sx+w)j MOD 32;k
01CBf(80E00004): LDR R0, SP, 4H
01CCf(40020005): ASR R0, R0, 5H
01CDf(A0E00038): STR R0, SP, 38H
01CEg(80E00004): LDR R0, SP, 4H
01CFg(4004001F): AND R0, R0, 1FH
01D0g(A0E0003C): STR R0, SP, 3CH
01D1h(80E00004): LDR R0, SP, 4H
01D2h(81E0000C): LDR R1, SP, CH
01D3h(00080001): ADD R0, R0, R1
01D4i(40020005): ASR R0, R0, 5H
01D5i(A0E00040): STR R0, SP, 40H
01D6j(80E00004): LDR R0, SP, 4H
01D7j(81E0000C): LDR R1, SP, CH
01D8j(00080001): ADD R0, R0, R1
01D9k(4004001F): AND R0, R0, 1FH
01DAk(A0E00044): STR R0, SP, 44H
v0 := dx DIV 32;l v1 := dx MOD 32;m v2 := (dx+w)n DIV 32;o v3 := (dx+w)p MOD 32;q
01DBl(80E00014): LDR R0, SP, 14H
01DCl(40020005): ASR R0, R0, 5H
01DDl(A0E00048): STR R0, SP, 48H
01DEm(80E00014): LDR R0, SP, 14H
01DFm(4004001F): AND R0, R0, 1FH
01E0m(A0E0004C): STR R0, SP, 4CH
01E1n(80E00014): LDR R0, SP, 14H
01E2n(81E0000C): LDR R1, SP, CH
01E3n(00080001): ADD R0, R0, R1
01E4o(40020005): ASR R0, R0, 5H
01E5o(A0E00050): STR R0, SP, 50H
01E6p(80E00014): LDR R0, SP, 14H
01E7p(81E0000C): LDR R1, SP, CH
01E8p(00080001): ADD R0, R0, R1
01E9q(4004001F): AND R0, R0, 1FH
01EAq(A0E00054): STR R0, SP, 54H
sa := base + u0*4 +r sy*128;s da := base + v0*4 +t dy*128;u
01EBr(80E00038): LDR R0, SP, 38H
01ECr(40010002): LSL R0, R0, 2H
01EDr(6100000E): MOV' R1, R0, EH
01EEr(41167F00): IOR R1, R1, 7F00H
01EFr(00180000): ADD R0, R1, R0
01F0s(81E00008): LDR R1, SP, 8H
01F1s(41110007): LSL R1, R1, 7H
01F2s(00080001): ADD R0, R0, R1
01F3s(A0E00020): STR R0, SP, 20H
01F4t(80E00048): LDR R0, SP, 48H
01F5t(40010002): LSL R0, R0, 2H
01F6t(6100000E): MOV' R1, R0, EH
01F7t(41167F00): IOR R1, R1, 7F00H
01F8t(00180000): ADD R0, R1, R0
01F9u(81E00018): LDR R1, SP, 18H
01FAu(41110007): LSL R1, R1, 7H
01FBu(00080001): ADD R0, R0, R1
01FCu(A0E00024): STR R0, SP, 24H
d := da - sa;v n := u1 - v1;w (*displacement in words and bits*)
01FDv(80E00024): LDR R0, SP, 24H
01FEv(81E00020): LDR R1, SP, 20H
01FFv(00090001): SUB R0, R0, R1
0200v(A0E00030): STR R0, SP, 30H
0201w(80E0003C): LDR R0, SP, 3CH
0202w(81E0004C): LDR R1, SP, 4CH
0203w(00090001): SUB R0, R0, R1
0204w(A0E00058): STR R0, SP, 58H
len := (u2 - u0)x * 4;y
0205x(80E00040): LDR R0, SP, 40H
0206x(81E00038): LDR R1, SP, 38H
0207x(00090001): SUB R0, R0, R1
0208y(40010002): LSL R0, R0, 2H
0209y(A0E00034): STR R0, SP, 34H
m0 := {v1 .. 31}z;a m2 := {v3 .. 31}b;c m3 := m0 / m2;d
020Az(80E0004C): LDR R0, SP, 4CH
020Bz(5100FFFF): MOV R1, R0, FFFFFFFFH
020Cz(00110000): LSL R0, R1, R0
020Dz(4100001F): MOV R1, R0, 1FH
020Ez(5200FFFE): MOV R2, R0, FFFFFFFEH
020Fz(01210001): LSL R1, R2, R1
0210z(00050001): ANN R0, R0, R1
0211a(A0E00070): STR R0, SP, 70H
0212b(80E00054): LDR R0, SP, 54H
0213b(5100FFFF): MOV R1, R0, FFFFFFFFH
0214b(00110000): LSL R0, R1, R0
0215b(4100001F): MOV R1, R0, 1FH
0216b(5200FFFE): MOV R2, R0, FFFFFFFEH
0217b(01210001): LSL R1, R2, R1
0218b(00050001): ANN R0, R0, R1
0219c(A0E00078): STR R0, SP, 78H
021Ad(80E00070): LDR R0, SP, 70H
021Bd(81E00078): LDR R1, SP, 78H
021Cd(00070001): XOR R0, R0, R1
021Dd(A0E0007C): STR R0, SP, 7CH
IF d >= 0 THENe (*copy up, scan down*) sa0 := sa + (h-1)f*128;g end := sa-128;h step := -128
021Ee(80E00030): LDR R0, SP, 30H
021Fe(40090000): SUB R0, R0, 0H
0220e(E500000C): BLT 12 [022DH]
0221f(80E00010): LDR R0, SP, 10H
0222f(40090001): SUB R0, R0, 1H
0223g(40010007): LSL R0, R0, 7H
0224g(81E00020): LDR R1, SP, 20H
0225g(00180000): ADD R0, R1, R0
0226g(A0E00028): STR R0, SP, 28H
0227h(80E00020): LDR R0, SP, 20H
0228h(40090080): SUB R0, R0, 80H
0229h(A0E0005C): STR R0, SP, 5CH
ELSEi (*copy down, scan up*) sa0j := sa;k end := sa + h*128;l step := 128
022Ai(5000FF80): MOV R0, R0, FFFFFF80H
022Bi(A0E00060): STR R0, SP, 60H
022Cj(E7000009): B 9 [0236H]
022Dk(80E00020): LDR R0, SP, 20H
022Ek(A0E00028): STR R0, SP, 28H
022Fl(80E00010): LDR R0, SP, 10H
0230l(40010007): LSL R0, R0, 7H
0231l(81E00020): LDR R1, SP, 20H
0232l(00180000): ADD R0, R1, R0
0233l(A0E0005C): STR R0, SP, 5CH
ENDm ;
0234m(40000080): MOV R0, R0, 80H
0235m(A0E00060): STR R0, SP, 60H
WHILE sa0 # end DOn
0236n(80E00028): LDR R0, SP, 28H
0237n(81E0005C): LDR R1, SP, 5CH
0238n(00090001): SUB R0, R0, R1
0239n(E10000F9): BEQ 249 [0333H]
IF n >= 0 THENo (*shift right*) m1 := {n .. 31}p;q
023Ao(80E00058): LDR R0, SP, 58H
023Bo(40090000): SUB R0, R0, 0H
023Co(E500007E): BLT 126 [02BBH]
023Dp(80E00058): LDR R0, SP, 58H
023Ep(5100FFFF): MOV R1, R0, FFFFFFFFH
023Fp(00110000): LSL R0, R1, R0
0240p(4100001F): MOV R1, R0, 1FH
0241p(5200FFFE): MOV R2, R0, FFFFFFFEH
0242p(01210001): LSL R1, R2, R1
0243p(00050001): ANN R0, R0, R1
0244q(A0E00074): STR R0, SP, 74H
IF v1 + w >=r 32 THENs
0245r(80E0004C): LDR R0, SP, 4CH
0246r(81E0000C): LDR R1, SP, CH
0247r(00080001): ADD R0, R0, R1
0248s(40090020): SUB R0, R0, 20H
0249s(E5000059): BLT 89 [02A3H]
SYSTEM.GET(sa0+len,t src);u src := ROR(src, n);v
024At(80E00028): LDR R0, SP, 28H
024Bt(81E00034): LDR R1, SP, 34H
024Ct(00080001): ADD R0, R0, R1
024Du(80000000): LDR R0, R0, 0H
024Eu(A0E00064): STR R0, SP, 64H
024Fv(80E00064): LDR R0, SP, 64H
0250v(81E00058): LDR R1, SP, 58H
0251v(00030001): ROR R0, R0, R1
0252v(A0E00064): STR R0, SP, 64H
SYSTEM.GET(sa0+len+wd,x dst);y
0253w(80E00028): LDR R0, SP, 28H
0254w(81E00034): LDR R1, SP, 34H
0255w(00080001): ADD R0, R0, R1
0256x(81E00030): LDR R1, SP, 30H
0257x(00080001): ADD R0, R0, R1
0258y(80000000): LDR R0, R0, 0H
0259y(A0E00068): STR R0, SP, 68H
SYSTEM.PUT(sa0+len+zd,a (dst * m2)b + (src - m2)c)d;e
025Az(80E00028): LDR R0, SP, 28H
025Bz(81E00034): LDR R1, SP, 34H
025Cz(00080001): ADD R0, R0, R1
025Da(81E00030): LDR R1, SP, 30H
025Ea(00080001): ADD R0, R0, R1
025Fb(81E00068): LDR R1, SP, 68H
0260b(82E00078): LDR R2, SP, 78H
0261b(01140002): AND R1, R1, R2
0262c(82E00064): LDR R2, SP, 64H
0263c(83E00078): LDR R3, SP, 78H
0264c(02250003): ANN R2, R2, R3
0265d(01160002): IOR R1, R1, R2
0266e(A1000000): STR R1, R0, 0H
spill := src - m1;f
0267f(80E00064): LDR R0, SP, 64H
0268f(81E00074): LDR R1, SP, 74H
0269f(00050001): ANN R0, R0, R1
026Af(A0E0006C): STR R0, SP, 6CH
FOR sa1 := sa0 + len-g4 TOh sa0+4 BYi -4 DO
026Bg(80E00028): LDR R0, SP, 28H
026Cg(81E00034): LDR R1, SP, 34H
026Dg(00080001): ADD R0, R0, R1
026Eh(40090004): SUB R0, R0, 4H
026Fi(81E00028): LDR R1, SP, 28H
0270i(41180004): ADD R1, R1, 4H
SYSTEMj.GET(sa1, src);k src := ROR(src, n);l
0271j(01090001): SUB R1, R0, R1
0272j(E5000018): BLT 24 [028BH]
0273j(A0E0002C): STR R0, SP, 2CH
0274k(80E0002C): LDR R0, SP, 2CH
0275k(80000000): LDR R0, R0, 0H
0276k(A0E00064): STR R0, SP, 64H
0277l(80E00064): LDR R0, SP, 64H
0278l(81E00058): LDR R1, SP, 58H
0279l(00030001): ROR R0, R0, R1
027Al(A0E00064): STR R0, SP, 64H
SYSTEM.PUT(sa1+d,m spill + (src * m1)n)o;p
027Bm(80E0002C): LDR R0, SP, 2CH
027Cm(81E00030): LDR R1, SP, 30H
027Dm(00080001): ADD R0, R0, R1
027En(81E00064): LDR R1, SP, 64H
027Fn(82E00074): LDR R2, SP, 74H
0280n(01140002): AND R1, R1, R2
0281o(82E0006C): LDR R2, SP, 6CH
0282o(01260001): IOR R1, R2, R1
0283p(A1000000): STR R1, R0, 0H
spill := src - m1
ENDq ;r
0284q(80E00064): LDR R0, SP, 64H
0285q(81E00074): LDR R1, SP, 74H
0286q(00050001): ANN R0, R0, R1
0287q(A0E0006C): STR R0, SP, 6CH
0288r(80E0002C): LDR R0, SP, 2CH
0289r(5008FFFC): ADD R0, R0, FFFFFFFCH
028Ar(E7FFFFE4): B -28 [026FH]
SYSTEM.GET(sa0, src);s src := ROR(src, n);t
028Bs(80E00028): LDR R0, SP, 28H
028Cs(80000000): LDR R0, R0, 0H
028Ds(A0E00064): STR R0, SP, 64H
028Et(80E00064): LDR R0, SP, 64H
028Ft(81E00058): LDR R1, SP, 58H
0290t(00030001): ROR R0, R0, R1
0291t(A0E00064): STR R0, SP, 64H
SYSTEM.GET(sa0+d,u dst);v
0292u(80E00028): LDR R0, SP, 28H
0293u(81E00030): LDR R1, SP, 30H
0294u(00080001): ADD R0, R0, R1
0295v(80000000): LDR R0, R0, 0H
0296v(A0E00068): STR R0, SP, 68H
SYSTEM.PUT(sa0+d,w (src * m0)x + (dst - m0)y)z
0297w(80E00028): LDR R0, SP, 28H
0298w(81E00030): LDR R1, SP, 30H
0299w(00080001): ADD R0, R0, R1
029Ax(81E00064): LDR R1, SP, 64H
029Bx(82E00070): LDR R2, SP, 70H
029Cx(01140002): AND R1, R1, R2
029Dy(82E00068): LDR R2, SP, 68H
029Ey(83E00070): LDR R3, SP, 70H
029Fy(02250003): ANN R2, R2, R3
02A0z(01160002): IOR R1, R1, R2
ELSEa SYSTEMb.GET(sa0, src);c src := ROR(src, n);d
02A1a(A1000000): STR R1, R0, 0H
02A2b(E7000017): B 23 [02BAH]
02A3c(80E00028): LDR R0, SP, 28H
02A4c(80000000): LDR R0, R0, 0H
02A5c(A0E00064): STR R0, SP, 64H
02A6d(80E00064): LDR R0, SP, 64H
02A7d(81E00058): LDR R1, SP, 58H
02A8d(00030001): ROR R0, R0, R1
02A9d(A0E00064): STR R0, SP, 64H
SYSTEM.GET(sa0+d,e dst);f
02AAe(80E00028): LDR R0, SP, 28H
02ABe(81E00030): LDR R1, SP, 30H
02ACe(00080001): ADD R0, R0, R1
02ADf(80000000): LDR R0, R0, 0H
02AEf(A0E00068): STR R0, SP, 68H
SYSTEM.PUT(sa0+d,g (src * m3)h + (dst - m3)i)j
02AFg(80E00028): LDR R0, SP, 28H
02B0g(81E00030): LDR R1, SP, 30H
02B1g(00080001): ADD R0, R0, R1
02B2h(81E00064): LDR R1, SP, 64H
02B3h(82E0007C): LDR R2, SP, 7CH
02B4h(01140002): AND R1, R1, R2
02B5i(82E00068): LDR R2, SP, 68H
02B6i(83E0007C): LDR R3, SP, 7CH
02B7i(02250003): ANN R2, R2, R3
02B8j(01160002): IOR R1, R1, R2
ENDk
02B9k(A1000000): STR R1, R0, 0H
ELSE (*shift left*) m1l := {-n ..m 31}n;o
02BAl(E7000073): B 115 [032EH]
02BBm(80E00058): LDR R0, SP, 58H
02BCm(41000000): MOV R1, R0, 0H
02BDm(00190000): SUB R0, R1, R0
02BEn(5100FFFF): MOV R1, R0, FFFFFFFFH
02BFn(00110000): LSL R0, R1, R0
02C0n(4100001F): MOV R1, R0, 1FH
02C1n(5200FFFE): MOV R2, R0, FFFFFFFEH
02C2n(01210001): LSL R1, R2, R1
02C3n(00050001): ANN R0, R0, R1
02C4o(A0E00074): STR R0, SP, 74H
SYSTEM.GET(sa0, src);p src := ROR(src, n);q
02C5p(80E00028): LDR R0, SP, 28H
02C6p(80000000): LDR R0, R0, 0H
02C7p(A0E00064): STR R0, SP, 64H
02C8q(80E00064): LDR R0, SP, 64H
02C9q(81E00058): LDR R1, SP, 58H
02CAq(00030001): ROR R0, R0, R1
02CBq(A0E00064): STR R0, SP, 64H
SYSTEM.GET(sa0+d,r dst);s
02CCr(80E00028): LDR R0, SP, 28H
02CDr(81E00030): LDR R1, SP, 30H
02CEr(00080001): ADD R0, R0, R1
02CFs(80000000): LDR R0, R0, 0H
02D0s(A0E00068): STR R0, SP, 68H
IF v1 + w <t 32 THENu
02D1t(80E0004C): LDR R0, SP, 4CH
02D2t(81E0000C): LDR R1, SP, CH
02D3t(00080001): ADD R0, R0, R1
02D4u(40090020): SUB R0, R0, 20H
02D5u(ED00000C): BGE 12 [02E2H]
SYSTEM.PUT(sa0+d,v (dst - m3)w + (src * m3)x)y
02D6v(80E00028): LDR R0, SP, 28H
02D7v(81E00030): LDR R1, SP, 30H
02D8v(00080001): ADD R0, R0, R1
02D9w(81E00068): LDR R1, SP, 68H
02DAw(82E0007C): LDR R2, SP, 7CH
02DBw(01150002): ANN R1, R1, R2
02DCx(82E00064): LDR R2, SP, 64H
02DDx(83E0007C): LDR R3, SP, 7CH
02DEx(02240003): AND R2, R2, R3
02DFy(01160002): IOR R1, R1, R2
ELSEz SYSTEMa.PUT(sa0+d,b (dst - m0)c + (src * m0)d)e;f
02E0z(A1000000): STR R1, R0, 0H
02E1a(E700004C): B 76 [032EH]
02E2b(80E00028): LDR R0, SP, 28H
02E3b(81E00030): LDR R1, SP, 30H
02E4b(00080001): ADD R0, R0, R1
02E5c(81E00068): LDR R1, SP, 68H
02E6c(82E00070): LDR R2, SP, 70H
02E7c(01150002): ANN R1, R1, R2
02E8d(82E00064): LDR R2, SP, 64H
02E9d(83E00070): LDR R3, SP, 70H
02EAd(02240003): AND R2, R2, R3
02EBe(01160002): IOR R1, R1, R2
02ECf(A1000000): STR R1, R0, 0H
spill := src - m1;g
02EDg(80E00064): LDR R0, SP, 64H
02EEg(81E00074): LDR R1, SP, 74H
02EFg(00050001): ANN R0, R0, R1
02F0g(A0E0006C): STR R0, SP, 6CH
FOR sa1 := sa0+4 TOh sa0 + len-i4 BYj 4 DO
02F1h(80E00028): LDR R0, SP, 28H
02F2h(40080004): ADD R0, R0, 4H
02F3i(81E00028): LDR R1, SP, 28H
02F4i(82E00034): LDR R2, SP, 34H
02F5i(01180002): ADD R1, R1, R2
02F6j(41190004): SUB R1, R1, 4H
SYSTEMk.GET(sa1, src);l src := ROR(src, n);m
02F7k(01090001): SUB R1, R0, R1
02F8k(EE000018): BGT 24 [0311H]
02F9k(A0E0002C): STR R0, SP, 2CH
02FAl(80E0002C): LDR R0, SP, 2CH
02FBl(80000000): LDR R0, R0, 0H
02FCl(A0E00064): STR R0, SP, 64H
02FDm(80E00064): LDR R0, SP, 64H
02FEm(81E00058): LDR R1, SP, 58H
02FFm(00030001): ROR R0, R0, R1
0300m(A0E00064): STR R0, SP, 64H
SYSTEM.PUT(sa1+d,n spill + (src * m1)o)p;q
0301n(80E0002C): LDR R0, SP, 2CH
0302n(81E00030): LDR R1, SP, 30H
0303n(00080001): ADD R0, R0, R1
0304o(81E00064): LDR R1, SP, 64H
0305o(82E00074): LDR R2, SP, 74H
0306o(01140002): AND R1, R1, R2
0307p(82E0006C): LDR R2, SP, 6CH
0308p(01260001): IOR R1, R2, R1
0309q(A1000000): STR R1, R0, 0H
spill := src - m1
ENDr ;s
030Ar(80E00064): LDR R0, SP, 64H
030Br(81E00074): LDR R1, SP, 74H
030Cr(00050001): ANN R0, R0, R1
030Dr(A0E0006C): STR R0, SP, 6CH
030Es(80E0002C): LDR R0, SP, 2CH
030Fs(40080004): ADD R0, R0, 4H
0310s(E7FFFFE2): B -30 [02F3H]
SYSTEM.GET(sa0+len,t src);u src := ROR(src, n);v
0311t(80E00028): LDR R0, SP, 28H
0312t(81E00034): LDR R1, SP, 34H
0313t(00080001): ADD R0, R0, R1
0314u(80000000): LDR R0, R0, 0H
0315u(A0E00064): STR R0, SP, 64H
0316v(80E00064): LDR R0, SP, 64H
0317v(81E00058): LDR R1, SP, 58H
0318v(00030001): ROR R0, R0, R1
0319v(A0E00064): STR R0, SP, 64H
SYSTEM.GET(sa0+len+wd,x dst);y
031Aw(80E00028): LDR R0, SP, 28H
031Bw(81E00034): LDR R1, SP, 34H
031Cw(00080001): ADD R0, R0, R1
031Dx(81E00030): LDR R1, SP, 30H
031Ex(00080001): ADD R0, R0, R1
031Fy(80000000): LDR R0, R0, 0H
0320y(A0E00068): STR R0, SP, 68H
SYSTEM.PUT(sa0+len+zd,a (src - m2)b + (dst * m2)c)d
0321z(80E00028): LDR R0, SP, 28H
0322z(81E00034): LDR R1, SP, 34H
0323z(00080001): ADD R0, R0, R1
0324a(81E00030): LDR R1, SP, 30H
0325a(00080001): ADD R0, R0, R1
0326b(81E00064): LDR R1, SP, 64H
0327b(82E00078): LDR R2, SP, 78H
0328b(01150002): ANN R1, R1, R2
0329c(82E00068): LDR R2, SP, 68H
032Ac(83E00078): LDR R3, SP, 78H
032Bc(02240003): AND R2, R2, R3
032Cd(01160002): IOR R1, R1, R2
ENDe
032De(A1000000): STR R1, R0, 0H
END ;
INC(sa0, step)
ENDf
032Ef(80E00028): LDR R0, SP, 28H
032Ff(81E00060): LDR R1, SP, 60H
0330f(00080001): ADD R0, R0, R1
0331f(A0E00028): STR R0, SP, 28H
0332f(E7FFFF03): B -253 [0236H]
ENDg CopyBlock;
0333g(8FE00000): LDR LNK, SP, 0H
0334g(4EE80080): ADD SP, SP, 80H
0335g(C700000F): B LNK
PROCEDURE ReplPattern*(col, patadr, x, y, w, h, mode: INTEGER);
(* pattern width = 32, fixed; pattern starts at patadr+4, for mode = invert only *)
VAR al, ar, a0, a1: INTEGER;
pta0, pta1: INTEGER; (*pattern addresses*)
ph: BYTE;
left, right, mid, pix, pixl, pixr, ptw: SET;
BEGINh al := base + y*128;i SYSTEM.GET(patadr+1,j ph);k
0336h .PROC 18
0336h(4EE90058): SUB SP, SP, 58H
0337h(AFE00000): STR LNK, SP, 0H
0338h(A0E00004): STR R0, SP, 4H
0339h(A1E00008): STR R1, SP, 8H
033Ah(A2E0000C): STR R2, SP, CH
033Bh(A3E00010): STR R3, SP, 10H
033Ch(A4E00014): STR R4, SP, 14H
033Dh(A5E00018): STR R5, SP, 18H
033Eh(A6E0001C): STR R6, SP, 1CH
033Fi(80E00010): LDR R0, SP, 10H
0340i(40010007): LSL R0, R0, 7H
0341i(6100000E): MOV' R1, R0, EH
0342i(41167F00): IOR R1, R1, 7F00H
0343i(00180000): ADD R0, R1, R0
0344i(A0E00020): STR R0, SP, 20H
0345j(80E00008): LDR R0, SP, 8H
0346j(40080001): ADD R0, R0, 1H
0347k(90000000): LDR R0, R0, 0H
0348k(B0E00038): STR R0, SP, 38H
pta0 := patadr+4;l pta1 := ph*4 +m pta0;n
0349l(80E00008): LDR R0, SP, 8H
034Al(40080004): ADD R0, R0, 4H
034Bl(A0E00030): STR R0, SP, 30H
034Cm(90E00038): LDR R0, SP, 38H
034Dm(40010002): LSL R0, R0, 2H
034En(81E00030): LDR R1, SP, 30H
034Fn(00080001): ADD R0, R0, R1
0350n(A0E00034): STR R0, SP, 34H
ar := ((x+w-o1)p DIV 32)q*4 +r al;s al := (x DIV 32)t*4 +u al;v
0351o(80E0000C): LDR R0, SP, CH
0352o(81E00014): LDR R1, SP, 14H
0353o(00080001): ADD R0, R0, R1
0354p(40090001): SUB R0, R0, 1H
0355q(40020005): ASR R0, R0, 5H
0356r(40010002): LSL R0, R0, 2H
0357s(81E00020): LDR R1, SP, 20H
0358s(00080001): ADD R0, R0, R1
0359s(A0E00024): STR R0, SP, 24H
035At(80E0000C): LDR R0, SP, CH
035Bt(40020005): ASR R0, R0, 5H
035Cu(40010002): LSL R0, R0, 2H
035Dv(81E00020): LDR R1, SP, 20H
035Ev(00080001): ADD R0, R0, R1
035Fv(A0E00020): STR R0, SP, 20H
IF ar = al THENw
0360w(80E00024): LDR R0, SP, 24H
0361w(81E00020): LDR R1, SP, 20H
0362w(00090001): SUB R0, R0, R1
0363w(E9000035): BNE 53 [0399H]
mid := {(x MOD 32)x .. ((x+w-y1)z MOD 32)a}b;c
0364x(80E0000C): LDR R0, SP, CH
0365x(4004001F): AND R0, R0, 1FH
0366y(81E0000C): LDR R1, SP, CH
0367y(82E00014): LDR R2, SP, 14H
0368y(01180002): ADD R1, R1, R2
0369z(41190001): SUB R1, R1, 1H
036Aa(4114001F): AND R1, R1, 1FH
036Bb(5200FFFF): MOV R2, R0, FFFFFFFFH
036Cb(00210000): LSL R0, R2, R0
036Db(5200FFFE): MOV R2, R0, FFFFFFFEH
036Eb(01210001): LSL R1, R2, R1
036Fb(00050001): ANN R0, R0, R1
0370c(A0E00044): STR R0, SP, 44H
FOR a1 := al TOd al + (h-1)e*128 BYf 128 DO
0371d(80E00020): LDR R0, SP, 20H
0372e(81E00018): LDR R1, SP, 18H
0373e(41190001): SUB R1, R1, 1H
0374f(41110007): LSL R1, R1, 7H
0375f(82E00020): LDR R2, SP, 20H
0376f(01280001): ADD R1, R2, R1
SYSTEMg.GET(a1, pix);h SYSTEM.GET(pta0, ptw);i SYSTEM.PUT(a1, (pix - mid)j + (pix/ptw *k mid)l)m;n INC(pta0, 4);o
0377g(01090001): SUB R1, R0, R1
0378g(EE00001F): BGT 31 [0398H]
0379g(A0E0002C): STR R0, SP, 2CH
037Ah(80E0002C): LDR R0, SP, 2CH
037Bh(80000000): LDR R0, R0, 0H
037Ch(A0E00048): STR R0, SP, 48H
037Di(80E00030): LDR R0, SP, 30H
037Ei(80000000): LDR R0, R0, 0H
037Fi(A0E00054): STR R0, SP, 54H
0380j(80E00048): LDR R0, SP, 48H
0381j(81E00044): LDR R1, SP, 44H
0382j(00050001): ANN R0, R0, R1
0383k(81E00048): LDR R1, SP, 48H
0384k(82E00054): LDR R2, SP, 54H
0385k(01170002): XOR R1, R1, R2
0386l(82E00044): LDR R2, SP, 44H
0387l(01140002): AND R1, R1, R2
0388m(00060001): IOR R0, R0, R1
0389n(81E0002C): LDR R1, SP, 2CH
038An(A0100000): STR R0, R1, 0H
038Bo(80E00030): LDR R0, SP, 30H
038Co(40080004): ADD R0, R0, 4H
038Do(A0E00030): STR R0, SP, 30H
IF pta0 = pta1 THENp pta0 := patadr+4 ENDq
038Ep(80E00030): LDR R0, SP, 30H
038Fp(81E00034): LDR R1, SP, 34H
0390p(00090001): SUB R0, R0, R1
0391p(E9000003): BNE 3 [0395H]
0392q(80E00008): LDR R0, SP, 8H
0393q(40080004): ADD R0, R0, 4H
0394q(A0E00030): STR R0, SP, 30H
END
ELSIFr ars > al THENt
0395r(80E0002C): LDR R0, SP, 2CH
0396r(40080080): ADD R0, R0, 80H
0397r(E7FFFFDA): B -38 [0372H]
0398s(E7000061): B 97 [03FAH]
0399t(80E00024): LDR R0, SP, 24H
039At(81E00020): LDR R1, SP, 20H
039Bt(00090001): SUB R0, R0, R1
039Ct(E600005D): BLE 93 [03FAH]
left := {(x MOD 32)u .. 31}v;w right := {0 .. ((x+w-x1)y MOD 32)z}a;b
039Du(80E0000C): LDR R0, SP, CH
039Eu(4004001F): AND R0, R0, 1FH
039Fv(5100FFFF): MOV R1, R0, FFFFFFFFH
03A0v(00110000): LSL R0, R1, R0
03A1v(4100001F): MOV R1, R0, 1FH
03A2v(5200FFFE): MOV R2, R0, FFFFFFFEH
03A3v(01210001): LSL R1, R2, R1
03A4v(00050001): ANN R0, R0, R1
03A5w(A0E0003C): STR R0, SP, 3CH
03A6x(80E0000C): LDR R0, SP, CH
03A7x(81E00014): LDR R1, SP, 14H
03A8x(00080001): ADD R0, R0, R1
03A9y(40090001): SUB R0, R0, 1H
03AAz(4004001F): AND R0, R0, 1FH
03ABa(5100FFFE): MOV R1, R0, FFFFFFFEH
03ACa(00110000): LSL R0, R1, R0
03ADa(5007FFFF): XOR R0, R0, FFFFFFFFH
03AEa(5004FFFF): AND R0, R0, FFFFFFFFH
03AFb(A0E00040): STR R0, SP, 40H
FOR a0 := al TOc al + (h-1)d*128 BYe 128 DO
03B0c(80E00020): LDR R0, SP, 20H
03B1d(81E00018): LDR R1, SP, 18H
03B2d(41190001): SUB R1, R1, 1H
03B3e(41110007): LSL R1, R1, 7H
03B4e(82E00020): LDR R2, SP, 20H
03B5e(01280001): ADD R1, R2, R1
SYSTEMf.GET(a0, pixl);g SYSTEM.GET(pta0, ptw);h SYSTEM.PUT(a0, (pixl - left)i + (pixl/ptw *j left)k)l;m
03B6f(01090001): SUB R1, R0, R1
03B7f(EE000042): BGT 66 [03FAH]
03B8f(A0E00028): STR R0, SP, 28H
03B9g(80E00028): LDR R0, SP, 28H
03BAg(80000000): LDR R0, R0, 0H
03BBg(A0E0004C): STR R0, SP, 4CH
03BCh(80E00030): LDR R0, SP, 30H
03BDh(80000000): LDR R0, R0, 0H
03BEh(A0E00054): STR R0, SP, 54H
03BFi(80E0004C): LDR R0, SP, 4CH
03C0i(81E0003C): LDR R1, SP, 3CH
03C1i(00050001): ANN R0, R0, R1
03C2j(81E0004C): LDR R1, SP, 4CH
03C3j(82E00054): LDR R2, SP, 54H
03C4j(01170002): XOR R1, R1, R2
03C5k(82E0003C): LDR R2, SP, 3CH
03C6k(01140002): AND R1, R1, R2
03C7l(00060001): IOR R0, R0, R1
03C8m(81E00028): LDR R1, SP, 28H
03C9m(A0100000): STR R0, R1, 0H
FOR a1 := a0+4 TOn ar-4 BYo 4 DO SYSTEMp.GET(a1, pix);q SYSTEM.PUT(a1, pix/ptw)r ENDs ;t
03CAn(80E00028): LDR R0, SP, 28H
03CBn(40080004): ADD R0, R0, 4H
03CCo(81E00024): LDR R1, SP, 24H
03CDo(41190004): SUB R1, R1, 4H
03CEp(01090001): SUB R1, R0, R1
03CFp(EE00000C): BGT 12 [03DCH]
03D0p(A0E0002C): STR R0, SP, 2CH
03D1q(80E0002C): LDR R0, SP, 2CH
03D2q(80000000): LDR R0, R0, 0H
03D3q(A0E00048): STR R0, SP, 48H
03D4r(80E00048): LDR R0, SP, 48H
03D5r(81E00054): LDR R1, SP, 54H
03D6r(00070001): XOR R0, R0, R1
03D7s(81E0002C): LDR R1, SP, 2CH
03D8s(A0100000): STR R0, R1, 0H
03D9t(80E0002C): LDR R0, SP, 2CH
03DAt(40080004): ADD R0, R0, 4H
03DBt(E7FFFFF0): B -16 [03CCH]
SYSTEM.GET(ar, pixr);u SYSTEM.PUT(ar, (pixr - right)v + (pixr/ptw *w right)x)y;z
03DCu(80E00024): LDR R0, SP, 24H
03DDu(80000000): LDR R0, R0, 0H
03DEu(A0E00050): STR R0, SP, 50H
03DFv(80E00050): LDR R0, SP, 50H
03E0v(81E00040): LDR R1, SP, 40H
03E1v(00050001): ANN R0, R0, R1
03E2w(81E00050): LDR R1, SP, 50H
03E3w(82E00054): LDR R2, SP, 54H
03E4w(01170002): XOR R1, R1, R2
03E5x(82E00040): LDR R2, SP, 40H
03E6x(01140002): AND R1, R1, R2
03E7y(00060001): IOR R0, R0, R1
03E8z(81E00024): LDR R1, SP, 24H
03E9z(A0100000): STR R0, R1, 0H
INC(pta0, 4);a INC(ar, 128);b
03EAa(80E00030): LDR R0, SP, 30H
03EBa(40080004): ADD R0, R0, 4H
03ECa(A0E00030): STR R0, SP, 30H
03EDb(80E00024): LDR R0, SP, 24H
03EEb(40080080): ADD R0, R0, 80H
03EFb(A0E00024): STR R0, SP, 24H
IF pta0 = pta1 THENc pta0 := patadr+4 ENDd
03F0c(80E00030): LDR R0, SP, 30H
03F1c(81E00034): LDR R1, SP, 34H
03F2c(00090001): SUB R0, R0, R1
03F3c(E9000003): BNE 3 [03F7H]
03F4d(80E00008): LDR R0, SP, 8H
03F5d(40080004): ADD R0, R0, 4H
03F6d(A0E00030): STR R0, SP, 30H
END
ENDe
03F7e(80E00028): LDR R0, SP, 28H
03F8e(40080080): ADD R0, R0, 80H
03F9e(E7FFFFB7): B -73 [03B1H]
ENDf ReplPattern;
03FAf(8FE00000): LDR LNK, SP, 0H
03FBf(4EE80058): ADD SP, SP, 58H
03FCf(C700000F): B LNK
BEGINg Base := base;h Width := 1024;i Height := 768;j
03FDg .PROC 0
03FDg .ENTRYPOINT
03FDg(4EE90004): SUB SP, SP, 4H
03FEg(AFE00000): STR LNK, SP, 0H
03FFh(6000000E): MOV' R0, R0, EH
0400h(40067F00): IOR R0, R0, 7F00H
0401h .FIXUP D
0401h(8D000401): LDR SB, MT, MOD0 [Display]
0402h(A0D00030): STR R0, SB, 30H [data]
0403i(40000400): MOV R0, R0, 400H
0404i(A0D00034): STR R0, SB, 34H
0405j(40000300): MOV R0, R0, 300H
0406j(A0D00038): STR R0, SB, 38H
arrow := SYSTEM.ADR($0F0F 0060 0070 0038 001C 000E 0007 8003 C101 E300 7700 3F00 1F00 3F00 7F00 FF00$);k
0407k(40D80058): ADD R0, SB, 58H
0408k(A0D0003C): STR R0, SB, 3CH
star := SYSTEM.ADR($0F0F 8000 8220 8410 8808 9004 A002 C001 7F7F C001 A002 9004 8808 8410 8220 8000$);l
0409l(40D80078): ADD R0, SB, 78H
040Al(A0D00040): STR R0, SB, 40H
hook := SYSTEM.ADR($0C0C 070F 8707 C703 E701 F700 7F00 3F00 1F00 0F00 0700 0300 01$);m
040Bm(40D80098): ADD R0, SB, 98H
040Cm(A0D00044): STR R0, SB, 44H
updown := SYSTEM.ADR($080E 183C 7EFF 1818 1818 1818 FF7E3C18$);n
040Dn(40D800B4): ADD R0, SB, B4H
040En(A0D00048): STR R0, SB, 48H
block := SYSTEM.ADR($0808 FFFF C3C3 C3C3 FFFF$);o
040Fo(40D800C4): ADD R0, SB, C4H
0410o(A0D0004C): STR R0, SB, 4CH
cross := SYSTEM.ADR($0F0F 0140 0220 0410 0808 1004 2002 4001 0000 4001 2002 1004 0808 0410 0220 0140$);p
0411p(40D800D0): ADD R0, SB, D0H
0412p(A0D00050): STR R0, SB, 50H
grey := SYSTEM.ADR($2002 0000 5555 5555 AAAA AAAA$)
ENDq Display.r
0413q(40D800F0): ADD R0, SB, F0H
0414q(A0D00054): STR R0, SB, 54H
0415r(8FE00000): LDR LNK, SP, 0H
0416r(4EE80004): ADD SP, SP, 4H
0417r(C700000F): B LNK