1,7 → 1,7 |
(* |
BSD 2-Clause License |
|
Copyright (c) 2019-2020, Anton Krotov |
Copyright (c) 2019-2021, Anton Krotov |
All rights reserved. |
*) |
|
34,7 → 34,7 |
_new* = 21; |
|
|
HP = 14; |
HP* = 15; |
|
LenIV* = 32; |
|
42,9 → 42,7 |
bsl = iv - 2; |
sp = bsl - 2; |
empty_proc* = sp - 2; |
free_size = empty_proc - 2; |
free_adr = free_size - 2; |
bits = free_adr - 272; |
bits = empty_proc - 272; |
bits_offs = bits - 32; |
DataSize* = iv - bits_offs; |
types = bits_offs - 2; |
53,7 → 51,11 |
|
VarSize* = 4; |
|
StkReserve* = 40; |
|
trap = 2; |
|
|
TYPE |
|
EMITPROC = PROCEDURE (n: INTEGER); |
61,7 → 63,7 |
|
VAR |
|
ram*, trap*, int*: INTEGER; |
ram*: INTEGER; |
|
rtl*: ARRAY 22 OF |
RECORD |
187,7 → 189,7 |
Word1(5405H); (* ADD R4, R5 *) |
Word2(5035H, bits); (* ADD bits, R5 *) |
Word1(4524H); (* MOV @R5, R4 *) |
Word1(4130H); (* MOV @SP+, PC *) |
Word1(4130H); (* RET *) |
(* L1: *) |
Word1(4304H); (* MOV #0, R4 *) |
Word1(4130H) (* RET *) |
202,7 → 204,7 |
Word1(5404H); (* ADD R4, R4 *) |
Word2(5034H, bits); (* ADD bits, R4 *) |
Word1(4424H); (* MOV @R4, R4 *) |
Word1(4130H); (* MOV @SP+, PC *) |
Word1(4130H); (* RET *) |
(* L1: *) |
Word1(4304H); (* MOV #0, R4 *) |
Word1(4130H) (* RET *) |
234,7 → 236,7 |
Word2(0F114H, 2); (* AND 2(SP), R4 *) |
Word1(2400H + 3); (* JZ L1 *) |
Word1(4314H); (* MOV #1, R4 *) |
Word1(4130H); (* MOV @SP+, PC *) |
Word1(4130H); (* RET *) |
(* L2: *) |
Word1(4304H); (* MOV #0, R4 *) |
(* L1: *) |
374,22 → 376,18 |
(* _error (modNum, modName, err, line: INTEGER) *) |
IF rtl[_error].used THEN |
Label(rtl[_error].label); |
Word1(0C232H); (* BIC #8, SR; DINT *) |
Word1(4303H); (* MOV R3, R3; NOP *) |
Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- modNum *) |
Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- modName *) |
Word2(4116H, 6); (* MOV 6(SP), R6; R6 <- err *) |
Word2(4117H, 8); (* MOV 8(SP), R7; R7 <- line *) |
Word1(5321H); (* ADD #2, SP *) |
Word1(4134H); (* POP R4; R4 <- modNum *) |
Word1(4135H); (* POP R5; R5 <- modName *) |
Word1(4136H); (* POP R6; R6 <- err *) |
Word1(4137H); (* POP R7; R7 <- line *) |
Word2(4211H, sp); (* MOV sp(SR), SP *) |
Word1(1207H); (* PUSH R7 *) |
Word1(1206H); (* PUSH R6 *) |
Word1(1205H); (* PUSH R5 *) |
Word1(1204H); (* PUSH R4 *) |
Word2(4214H, trap); (* MOV trap(SR), R4 *) |
Word1(9304H); (* TST R4 *) |
Word1(2400H + 1); (* JZ L *) |
Word1(1284H); (* CALL R4 *) |
(* L: *) |
Word2(4214H, sp); (* MOV sp(SR), R4 *) |
Word2(1294H, trap); (* CALL trap(R4) *) |
Word2(04032H, 0F0H) (* MOV CPUOFF+OSCOFF+SCG0+SCG1, SR *) |
END; |
|
400,7 → 398,7 |
Word1(4302H); (* MOV #0, SR *) |
Word1(4303H); (* NOP *) |
Word1(4104H); (* MOV SP, R4 *) |
Word2(8034H, 16); (* SUB #16, R4 *) |
Word2(8034H, StkReserve); (* SUB #StkReserve, R4 *) |
Word1(4005H + 100H * HP); (* MOV HP, R5 *) |
Word2(5115H, 6); (* ADD 6(SP), R5 *) |
Word1(9504H); (* CMP R5, R4 *) |
442,7 → 440,7 |
Word1(9405H); (* CMP R4, R5 *) |
Word1(2400H + 2); (* JZ L2 *) |
Word1(4304H); (* MOV #0, R4 *) |
Word1(4130H); (* MOV @SP+, PC *) |
Word1(4130H); (* RET *) |
(* L2: *) |
Word1(4314H); (* MOV #1, R4 *) |
Word1(4130H) (* RET *) |
661,14 → 659,12 |
END Used; |
|
|
PROCEDURE Init* (pLabel, pWord, pCall: EMITPROC; ramSize: INTEGER); |
PROCEDURE Init* (pLabel, pWord, pCall: EMITPROC); |
BEGIN |
Label := pLabel; |
Word := pWord; |
Call := pCall; |
ram := 200H; |
trap := ram; |
int := trap + 2 |
END Init; |
|
|