Rev 7983 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7983 | Rev 8859 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2019-2020, Anton Krotov |
4 | Copyright (c) 2019-2021, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 32... | Line 32... | ||
32 | _guardrec* = 19; |
32 | _guardrec* = 19; |
33 | _length* = 20; |
33 | _length* = 20; |
34 | _new* = 21; |
34 | _new* = 21; |
Line 35... | Line 35... | ||
35 | 35 | ||
Line 36... | Line 36... | ||
36 | 36 | ||
Line 37... | Line 37... | ||
37 | HP = 14; |
37 | HP* = 15; |
38 | 38 | ||
39 | LenIV* = 32; |
39 | LenIV* = 32; |
40 | 40 | ||
41 | iv = 10000H - LenIV * 2; |
- | |
42 | bsl = iv - 2; |
- | |
43 | sp = bsl - 2; |
41 | iv = 10000H - LenIV * 2; |
44 | empty_proc* = sp - 2; |
42 | bsl = iv - 2; |
45 | free_size = empty_proc - 2; |
43 | sp = bsl - 2; |
46 | free_adr = free_size - 2; |
44 | empty_proc* = sp - 2; |
Line 47... | Line 45... | ||
47 | bits = free_adr - 272; |
45 | bits = empty_proc - 272; |
Line 48... | Line 46... | ||
48 | bits_offs = bits - 32; |
46 | bits_offs = bits - 32; |
Line -... | Line 47... | ||
- | 47 | DataSize* = iv - bits_offs; |
|
- | 48 | types = bits_offs - 2; |
|
- | 49 | ||
- | 50 | IntVectorSize* = LenIV * 2 + DataSize; |
|
Line 49... | Line 51... | ||
49 | DataSize* = iv - bits_offs; |
51 | |
Line 50... | Line 52... | ||
50 | types = bits_offs - 2; |
52 | VarSize* = 4; |
Line 51... | Line 53... | ||
51 | 53 | ||
Line 52... | Line 54... | ||
52 | IntVectorSize* = LenIV * 2 + DataSize; |
54 | StkReserve* = 40; |
Line 53... | Line 55... | ||
53 | 55 | ||
54 | VarSize* = 4; |
56 | trap = 2; |
55 | 57 | ||
56 | 58 | ||
Line 185... | Line 187... | ||
185 | Word1(4424H); (* MOV @R4, R4 *) |
187 | Word1(4424H); (* MOV @R4, R4 *) |
186 | Word1(5505H); (* ADD R5, R5 *) |
188 | Word1(5505H); (* ADD R5, R5 *) |
187 | Word1(5405H); (* ADD R4, R5 *) |
189 | Word1(5405H); (* ADD R4, R5 *) |
188 | Word2(5035H, bits); (* ADD bits, R5 *) |
190 | Word2(5035H, bits); (* ADD bits, R5 *) |
189 | Word1(4524H); (* MOV @R5, R4 *) |
191 | Word1(4524H); (* MOV @R5, R4 *) |
190 | Word1(4130H); (* MOV @SP+, PC *) |
192 | Word1(4130H); (* RET *) |
191 | (* L1: *) |
193 | (* L1: *) |
192 | Word1(4304H); (* MOV #0, R4 *) |
194 | Word1(4304H); (* MOV #0, R4 *) |
193 | Word1(4130H) (* RET *) |
195 | Word1(4130H) (* RET *) |
194 | END; |
196 | END; |
Line 200... | Line 202... | ||
200 | Word2(0B034H, 0FFF0H); (* BIT #0FFF0H, R4 *) |
202 | Word2(0B034H, 0FFF0H); (* BIT #0FFF0H, R4 *) |
201 | Word1(2000H + 5); (* JNZ L1 *) |
203 | Word1(2000H + 5); (* JNZ L1 *) |
202 | Word1(5404H); (* ADD R4, R4 *) |
204 | Word1(5404H); (* ADD R4, R4 *) |
203 | Word2(5034H, bits); (* ADD bits, R4 *) |
205 | Word2(5034H, bits); (* ADD bits, R4 *) |
204 | Word1(4424H); (* MOV @R4, R4 *) |
206 | Word1(4424H); (* MOV @R4, R4 *) |
205 | Word1(4130H); (* MOV @SP+, PC *) |
207 | Word1(4130H); (* RET *) |
206 | (* L1: *) |
208 | (* L1: *) |
207 | Word1(4304H); (* MOV #0, R4 *) |
209 | Word1(4304H); (* MOV #0, R4 *) |
208 | Word1(4130H) (* RET *) |
210 | Word1(4130H) (* RET *) |
209 | END; |
211 | END; |
Line 232... | Line 234... | ||
232 | Word2(5034H, bits); (* ADD bits, R4 *) |
234 | Word2(5034H, bits); (* ADD bits, R4 *) |
233 | Word1(4424H); (* MOV @R4, R4 *) |
235 | Word1(4424H); (* MOV @R4, R4 *) |
234 | Word2(0F114H, 2); (* AND 2(SP), R4 *) |
236 | Word2(0F114H, 2); (* AND 2(SP), R4 *) |
235 | Word1(2400H + 3); (* JZ L1 *) |
237 | Word1(2400H + 3); (* JZ L1 *) |
236 | Word1(4314H); (* MOV #1, R4 *) |
238 | Word1(4314H); (* MOV #1, R4 *) |
237 | Word1(4130H); (* MOV @SP+, PC *) |
239 | Word1(4130H); (* RET *) |
238 | (* L2: *) |
240 | (* L2: *) |
239 | Word1(4304H); (* MOV #0, R4 *) |
241 | Word1(4304H); (* MOV #0, R4 *) |
240 | (* L1: *) |
242 | (* L1: *) |
241 | Word1(4130H) (* RET *) |
243 | Word1(4130H) (* RET *) |
242 | END; |
244 | END; |
Line 372... | Line 374... | ||
372 | END; |
374 | END; |
Line 373... | Line 375... | ||
373 | 375 | ||
374 | (* _error (modNum, modName, err, line: INTEGER) *) |
376 | (* _error (modNum, modName, err, line: INTEGER) *) |
375 | IF rtl[_error].used THEN |
377 | IF rtl[_error].used THEN |
376 | Label(rtl[_error].label); |
378 | Label(rtl[_error].label); |
377 | Word1(0C232H); (* BIC #8, SR; DINT *) |
- | |
378 | Word1(4303H); (* MOV R3, R3; NOP *) |
379 | Word1(5321H); (* ADD #2, SP *) |
379 | Word2(4114H, 2); (* MOV 2(SP), R4; R4 <- modNum *) |
380 | Word1(4134H); (* POP R4; R4 <- modNum *) |
380 | Word2(4115H, 4); (* MOV 4(SP), R5; R5 <- modName *) |
381 | Word1(4135H); (* POP R5; R5 <- modName *) |
381 | Word2(4116H, 6); (* MOV 6(SP), R6; R6 <- err *) |
382 | Word1(4136H); (* POP R6; R6 <- err *) |
382 | Word2(4117H, 8); (* MOV 8(SP), R7; R7 <- line *) |
383 | Word1(4137H); (* POP R7; R7 <- line *) |
383 | Word2(4211H, sp); (* MOV sp(SR), SP *) |
384 | Word2(4211H, sp); (* MOV sp(SR), SP *) |
384 | Word1(1207H); (* PUSH R7 *) |
385 | Word1(1207H); (* PUSH R7 *) |
385 | Word1(1206H); (* PUSH R6 *) |
386 | Word1(1206H); (* PUSH R6 *) |
386 | Word1(1205H); (* PUSH R5 *) |
387 | Word1(1205H); (* PUSH R5 *) |
387 | Word1(1204H); (* PUSH R4 *) |
388 | Word1(1204H); (* PUSH R4 *) |
388 | Word2(4214H, trap); (* MOV trap(SR), R4 *) |
- | |
389 | Word1(9304H); (* TST R4 *) |
- | |
390 | Word1(2400H + 1); (* JZ L *) |
389 | Word2(4214H, sp); (* MOV sp(SR), R4 *) |
391 | Word1(1284H); (* CALL R4 *) |
- | |
392 | (* L: *) |
390 | Word2(1294H, trap); (* CALL trap(R4) *) |
393 | Word2(04032H, 0F0H) (* MOV CPUOFF+OSCOFF+SCG0+SCG1, SR *) |
391 | Word2(04032H, 0F0H) (* MOV CPUOFF+OSCOFF+SCG0+SCG1, SR *) |
Line 394... | Line 392... | ||
394 | END; |
392 | END; |
395 | 393 | ||
396 | (* _new (t, size: INTEGER; VAR ptr: INTEGER) *) |
394 | (* _new (t, size: INTEGER; VAR ptr: INTEGER) *) |
397 | IF rtl[_new].used THEN |
395 | IF rtl[_new].used THEN |
398 | Label(rtl[_new].label); |
396 | Label(rtl[_new].label); |
399 | Word1(1202H); (* PUSH SR *) |
397 | Word1(1202H); (* PUSH SR *) |
400 | Word1(4302H); (* MOV #0, SR *) |
398 | Word1(4302H); (* MOV #0, SR *) |
401 | Word1(4303H); (* NOP *) |
399 | Word1(4303H); (* NOP *) |
402 | Word1(4104H); (* MOV SP, R4 *) |
400 | Word1(4104H); (* MOV SP, R4 *) |
403 | Word2(8034H, 16); (* SUB #16, R4 *) |
401 | Word2(8034H, StkReserve); (* SUB #StkReserve, R4 *) |
404 | Word1(4005H + 100H * HP); (* MOV HP, R5 *) |
402 | Word1(4005H + 100H * HP); (* MOV HP, R5 *) |
405 | Word2(5115H, 6); (* ADD 6(SP), R5 *) |
403 | Word2(5115H, 6); (* ADD 6(SP), R5 *) |
406 | Word1(9504H); (* CMP R5, R4 *) |
404 | Word1(9504H); (* CMP R5, R4 *) |
Line 440... | Line 438... | ||
440 | Word1(3C00H + 400H - 10); (* JMP L3 *) |
438 | Word1(3C00H + 400H - 10); (* JMP L3 *) |
441 | (* L1: *) |
439 | (* L1: *) |
442 | Word1(9405H); (* CMP R4, R5 *) |
440 | Word1(9405H); (* CMP R4, R5 *) |
443 | Word1(2400H + 2); (* JZ L2 *) |
441 | Word1(2400H + 2); (* JZ L2 *) |
444 | Word1(4304H); (* MOV #0, R4 *) |
442 | Word1(4304H); (* MOV #0, R4 *) |
445 | Word1(4130H); (* MOV @SP+, PC *) |
443 | Word1(4130H); (* RET *) |
446 | (* L2: *) |
444 | (* L2: *) |
447 | Word1(4314H); (* MOV #1, R4 *) |
445 | Word1(4314H); (* MOV #1, R4 *) |
448 | Word1(4130H) (* RET *) |
446 | Word1(4130H) (* RET *) |
449 | END; |
447 | END; |
Line 659... | Line 657... | ||
659 | rtl[_mul].used := TRUE |
657 | rtl[_mul].used := TRUE |
660 | END |
658 | END |
661 | END Used; |
659 | END Used; |
Line 662... | Line 660... | ||
662 | 660 | ||
663 | 661 | ||
664 | PROCEDURE Init* (pLabel, pWord, pCall: EMITPROC; ramSize: INTEGER); |
662 | PROCEDURE Init* (pLabel, pWord, pCall: EMITPROC); |
665 | BEGIN |
663 | BEGIN |
666 | Label := pLabel; |
664 | Label := pLabel; |
667 | Word := pWord; |
665 | Word := pWord; |
668 | Call := pCall; |
- | |
669 | ram := 200H; |
- | |
670 | trap := ram; |
666 | Call := pCall; |
Line 671... | Line 667... | ||
671 | int := trap + 2 |
667 | ram := 200H; |
672 | END Init; |
668 | END Init; |