OVL117.MOD 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. (*$N,A-,V-*)
  2. IMPLEMENTATION MODULE Ovl117;
  3. (* Copyright (C) 1987-1992 Clarion Software Corporation *)
  4. IMPORT Str,FIO,Storage,SYSTEM,Lib;
  5. PROCEDURE (*$S+ stack check for safety*) Load( n:CARDINAL );
  6. TYPE bp=POINTER TO SHORTCARD;
  7. LONG = ARRAY [0..MAX(CARDINAL)-1] OF BYTE;
  8. VAR
  9. f:CARDINAL; (* file handle *)
  10. s:CARDINAL; (* segment for overlay *)
  11. segsize:CARDINAL; (* in paras *)
  12. header:RECORD
  13. Alloc: LONGCARD; (* total size *)
  14. Init: LONGCARD; (* size of initialised part *)
  15. nifix: CARDINAL; (* number of patches in loaded overlay *)
  16. nefix: CARDINAL; (* number of patches in other overlays *)
  17. resvd: ARRAY[0..3] OF CHAR; (* Can be used for validity check *)
  18. END;
  19. Locseg:CARDINAL;
  20. Target:CARDINAL;
  21. tmp:CARDINAL;
  22. atmp:ADDRESS;
  23. count:LONGCARD;
  24. base:CARDINAL;
  25. chunk:CARDINAL;
  26. dummy:CARDINAL;
  27. fixbufseg:CARDINAL;
  28. fixbufoff:CARDINAL;
  29. fixbufcount:CARDINAL;
  30. fixbuf:ARRAY [1..5*200H] OF SHORTCARD;
  31. Filename:ARRAY[1..50] OF CHAR;
  32. Ext:ARRAY[0..3] OF CHAR;
  33. PROCEDURE chkread( buf:ADDRESS; count:CARDINAL );
  34. VAR tmp:POINTER TO LONG;
  35. BEGIN
  36. tmp := buf;
  37. IF FIO.RdBin(f, tmp^, count ) <> count THEN HALT END;
  38. END chkread;
  39. BEGIN
  40. IF (Seg[n]<>MAX(CARDINAL)) THEN RETURN END ; (* Already loaded *)
  41. Ext := '.ov ';
  42. Ext[3] := CHAR( ORD('0') + n );
  43. Str.Concat( Filename, Path, Ext );
  44. f := FIO.Open(Filename);
  45. chkread(ADR(header),SIZE(header));
  46. segsize := CARDINAL( ( header.Alloc + 15 ) DIV 16 );
  47. Storage.HeapAllocate( Storage.MainHeap, atmp, segsize );
  48. s := SYSTEM.Seg(atmp^);
  49. Seg[n] := s;
  50. Size[n] := segsize;
  51. tmp := s;
  52. count := header.Init;
  53. IF count > 0FFF0H THEN
  54. chkread( [tmp:0], 0FFF0H );
  55. DEC(count,0FFF0H);
  56. INC(tmp, 0FFFH );
  57. END;
  58. WHILE count > 0F000H DO
  59. chkread( [tmp:0], 0F000H );
  60. DEC(count,0F000H);
  61. INC(tmp, 0F00H );
  62. END;
  63. chkread( [tmp:0], CARDINAL(count) );
  64. WHILE ( header.nifix <> 0 ) OR ( header.nefix <> 0 ) DO
  65. fixbufcount := FIO.RdBin( f, fixbuf, SIZE(fixbuf) );
  66. fixbufseg := SYSTEM.Seg(fixbuf);
  67. fixbufoff := SYSTEM.Ofs(fixbuf);
  68. REPEAT
  69. tmp := VAL(CARDINAL,[fixbufseg:fixbufoff bp]^);
  70. INC(fixbufoff);
  71. Locseg := [fixbufseg:fixbufoff]^;
  72. INC(fixbufoff,2);
  73. Target := [fixbufseg:fixbufoff]^;
  74. INC(fixbufoff,2);
  75. base := Seg[ tmp DIV 16 ];
  76. tmp := tmp MOD 16;
  77. IF header.nefix <> 0 THEN
  78. DEC(header.nefix);
  79. IF base <> CARDINAL(-1) THEN
  80. [ Locseg+base : tmp ]^ := Target + s;
  81. END;
  82. ELSE
  83. DEC(header.nifix);
  84. IF base <> CARDINAL(-1) THEN
  85. [ Locseg + s : tmp ]^ := Target + base;
  86. END;
  87. END;
  88. DEC(fixbufcount,5);
  89. UNTIL fixbufcount = 0;
  90. END;
  91. FIO.Close(f);
  92. END Load;
  93. PROCEDURE UnLoad( n:CARDINAL );
  94. VAR a:ADDRESS;
  95. BEGIN
  96. IF (n<>0) AND ( Seg[n]<>MAX(CARDINAL) ) THEN
  97. a := [Seg[n]:0];
  98. Storage.HeapDeallocate( Storage.MainHeap, a, Size[n] );
  99. Seg[n] := MAX(CARDINAL);
  100. END ;
  101. END UnLoad;
  102. PROCEDURE (*$S-*) Init;
  103. VAR i:CARDINAL;
  104. BEGIN
  105. FOR i := 0 TO 9 DO
  106. Seg[i] := MAX(CARDINAL);
  107. END;
  108. Seg[0] := Lib.PSP+10H;
  109. END Init;
  110. BEGIN
  111. Path := 'OMAIN' ; (* Base mame of overlay files *)
  112. Init;
  113. END Ovl117.
  114.