PIO

Used Exports

BUILTINS: DEC INTEGER LONGINT ROR
SYSTEM: BIT PUT

MODULE PIO; (*NW 16.10.2014 PIC Input/Output for RISC*)
.MODULE PIO (KEY E4FAD793, VERSION 1, SIZE 000001C4)
.FIXUP T 0H
IMPORT SYSTEM;
(* PIC interface, output:
D0 = PIC B7 data out
D1 = PIC B6 clk out
D2 = PIC A4 data in *)
CONST gpio = -32; gpoc = -28; (*I/O addresses*)
PROCEDURE del(i: INTEGER);
BEGINa
0000a(4EE90008): SUB SP, SP, 8H
0001a(AFE00000): STR LNK, SP, 0H
0002a(A0E00004): STR R0, SP, 4H
REPEAT DEC(i) UNTILb i = 0
0003b(80E00004): LDR R0, SP, 4H
0004b(40090001): SUB R0, R0, 1H
0005b(A0E00004): STR R0, SP, 4H
ENDc del;
0006c(80E00004): LDR R0, SP, 4H
0007c(E9FFFFFB): BNE -5 [0003H]
0008c(8FE00000): LDR LNK, SP, 0H
0009c(4EE80008): ADD SP, SP, 8H
000Ac(C700000F): B LNK
PROCEDURE Send*(x: LONGINT);
VAR i: INTEGER;
BEGINd (*send byte*)
000Bd .PROC 1
000Bd(4EE9000C): SUB SP, SP, CH
000Cd(AFE00000): STR LNK, SP, 0H
000Dd(A0E00004): STR R0, SP, 4H
FOR i := 0 TOe 7 DO
000Ee(40000000): MOV R0, R0, 0H
SYSTEMf.PUT(gpio, x MOD 2 +g 2)h;i del(60)j;k SYSTEM.PUT(gpio, x MOD 2)l;m del(25)n;o x := x DIV 2
000Ff(41090007): SUB R1, R0, 7H
0010f(EE000014): BGT 20 [0025H]
0011f(A0E00008): STR R0, SP, 8H
0012g(80E00004): LDR R0, SP, 4H
0013g(40040001): AND R0, R0, 1H
0014h(40080002): ADD R0, R0, 2H
0015i(5100FFE0): MOV R1, R0, FFFFFFE0H
0016i(A0100000): STR R0, R1, 0H
0017j(4000003C): MOV R0, R0, 3CH
0018k(F7FFFFE7): BL -25 [0000H]
0019l(80E00004): LDR R0, SP, 4H
001Al(40040001): AND R0, R0, 1H
001Bm(5100FFE0): MOV R1, R0, FFFFFFE0H
001Cm(A0100000): STR R0, R1, 0H
001Dn(40000019): MOV R0, R0, 19H
001Eo(F7FFFFE1): BL -31 [0000H]
ENDp ;q
001Fp(80E00004): LDR R0, SP, 4H
0020p(40020001): ASR R0, R0, 1H
0021p(A0E00004): STR R0, SP, 4H
0022q(80E00008): LDR R0, SP, 8H
0023q(40080001): ADD R0, R0, 1H
0024q(E7FFFFEA): B -22 [000FH]
SYSTEM.PUT(gpio, 0);r del(100)s
0025r(5000FFE0): MOV R0, R0, FFFFFFE0H
0026r(41000000): MOV R1, R0, 0H
0027r(A1000000): STR R1, R0, 0H
0028s(40000064): MOV R0, R0, 64H
ENDt Send;
0029t(F7FFFFD6): BL -42 [0000H]
002At(8FE00000): LDR LNK, SP, 0H
002Bt(4EE8000C): ADD SP, SP, CH
002Ct(C700000F): B LNK
PROCEDURE Receive*(VAR x: LONGINT);
VAR i, x0: INTEGER;
BEGINu (*receive byte*) x0 := 0;v
002Du .PROC 2
002Du(4EE90010): SUB SP, SP, 10H
002Eu(AFE00000): STR LNK, SP, 0H
002Fu(A0E00004): STR R0, SP, 4H
0030v(40000000): MOV R0, R0, 0H
0031v(A0E0000C): STR R0, SP, CH
REPEAT UNTIL ~SYSTEM.BIT(gpio, 2);w
0032w(5000FFE0): MOV R0, R0, FFFFFFE0H
0033w(80000000): LDR R0, R0, 0H
0034w(40030003): ROR R0, R0, 3H
0035w(E0FFFFFC): BMI -4 [0032H]
FOR i := 0 TOx 7 DO
0036x(40000000): MOV R0, R0, 0H
SYSTEMy.PUT(gpio, 2);z del(60)a;b
0037y(41090007): SUB R1, R0, 7H
0038y(EE000018): BGT 24 [0051H]
0039y(A0E00008): STR R0, SP, 8H
003Az(5000FFE0): MOV R0, R0, FFFFFFE0H
003Bz(41000002): MOV R1, R0, 2H
003Cz(A1000000): STR R1, R0, 0H
003Da(4000003C): MOV R0, R0, 3CH
003Eb(F7FFFFC1): BL -63 [0000H]
IF SYSTEM.BIT(gpio, 2) THENc x0 := x0 + 100H ENDd ;
003Fc(5000FFE0): MOV R0, R0, FFFFFFE0H
0040c(80000000): LDR R0, R0, 0H
0041c(40030003): ROR R0, R0, 3H
0042c(E8000003): BPL 3 [0046H]
0043d(80E0000C): LDR R0, SP, CH
0044d(40080100): ADD R0, R0, 100H
0045d(A0E0000C): STR R0, SP, CH
SYSTEM.PUT(gpio, 0);e del(25)f;g x0 := ROR(x0, 1)
0046e(5000FFE0): MOV R0, R0, FFFFFFE0H
0047e(41000000): MOV R1, R0, 0H
0048e(A1000000): STR R1, R0, 0H
0049f(40000019): MOV R0, R0, 19H
004Ag(F7FFFFB5): BL -75 [0000H]
ENDh ;i
004Bh(80E0000C): LDR R0, SP, CH
004Ch(40030001): ROR R0, R0, 1H
004Dh(A0E0000C): STR R0, SP, CH
004Ei(80E00008): LDR R0, SP, 8H
004Fi(40080001): ADD R0, R0, 1H
0050i(E7FFFFE6): B -26 [0037H]
x := x0
ENDj Receive;
0051j(80E0000C): LDR R0, SP, CH
0052j(81E00004): LDR R1, SP, 4H
0053j(A0100000): STR R0, R1, 0H
0054j(8FE00000): LDR LNK, SP, 0H
0055j(4EE80010): ADD SP, SP, 10H
0056j(C700000F): B LNK
PROCEDURE Reset*;
BEGINk SYSTEM.PUT(gpio, 0);l SYSTEM.PUT(gpoc, 3) (*set bit 0, 1 to output*)
0057k .PROC 3
0057k .COMMAND Reset
0057k(4EE90004): SUB SP, SP, 4H
0058k(AFE00000): STR LNK, SP, 0H
0059l(5000FFE0): MOV R0, R0, FFFFFFE0H
005Al(41000000): MOV R1, R0, 0H
005Bl(A1000000): STR R1, R0, 0H
ENDm Reset;
005Cm(5000FFE4): MOV R0, R0, FFFFFFE4H
005Dm(41000003): MOV R1, R0, 3H
005Em(A1000000): STR R1, R0, 0H
005Fm(8FE00000): LDR LNK, SP, 0H
0060m(4EE80004): ADD SP, SP, 4H
0061m(C700000F): B LNK
BEGINn Reset
0062n .PROC 0
0062n .ENTRYPOINT
0062n(4EE90004): SUB SP, SP, 4H
0063n(AFE00000): STR LNK, SP, 0H
ENDo PIO.p
0064o(F7FFFFF2): BL -14 [0057H]
0065p(8FE00000): LDR LNK, SP, 0H
0066p(4EE80004): ADD SP, SP, 4H
0067p(C700000F): B LNK