Subversion Repositories Kolibri OS

Rev

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;