Файл CODEFILE.DOC
===============================================================================
Описание на YcodeFile
Първите няколко байта от всеки YcodeFile са със следния строго фиксиран формат.
Даденото съдържание обикновено се отнася до Пълдинската реализация.
offset size съдържание Описание
------------------------------------------------------------------------------
------¦
$0000 2 bytes Lc0 deL magic
+--+---
$0002 1 byte L10L Големина на една дума в битове
+--L
$0003 1 byte L00L Byte sex (0 - negative).
+--+--¦
$0004 2 bytes L01 xxL version
+--+--L
$0006 2 bytes L00 00L unused
+--+--L
$0008 1 word L20 00L Големина на параграф
+--+--L
$000a 1 word L00 02L Големина на блок
+--+--L
$000c 1 word Lxx xxL Module Descriptor of first module
+--+--L
$000e |Unused unused to end of paragraph
Module Descriptor
------------------------¦
L module name 8 chars L
+--+--+--+--+--+--+--+---
L Ver L version
+--+--L
LDate L compilation date
+--+--L
LTime L compilation time
+--+--L
LNext L Next module descriptor
+--+--L
LMseg L main segment descriptor
+--+--L
LLang L language type
+--+--L
LCstrtL interface offset
+--+--L
LCsizeL interface size
+--+--L
LUsageL usage list offset
+--+--L
L L
+--+--L
L L
+--+---
LNeL (byte) number of external modules
+--L
LNiL (byte) number of internal segments
L---
Usage Paragraph
------------------------¦
L module name 8 chars L
+--+--+--+--+--+--+--+---
L Ver L (word) module version (все още има само 0 обикновено)
+--+--L
LDate L (2 bytes) compilation data
+--+--L
LTime L (2 bytes) compilation time
+--+--L
LNext L (word) next usage paragraph
+--+--L
Lunused
Segment Descriptor
------------------------¦
L segment name 8 chars L
+--+--+--+--+--+--+--+---
LStartL Start of a code segment
+--+--L
LSize L Size of a code segment
+--+--L
LNo L Segment No
+--+--L
LNext L Next Segment
+--+--L
unused
Segment Header Info
------------------------¦
L segment name 8 chars L
+--+--+--+--+--+--+--+---
L10L word size
+--L
L00L byte sex
+--+--¦
L L version
+--+--L
LTsizeL Total size
+--+--L
LCsizeL cpool size
+--+--L
| . | unused
| : |
+-----L
LRelctL (word) ptr to rel info
+-----L
LPdictL (word) ptr to pdict
+--+--L
LCPoolL (word) ptr to cpool
L--+---
RelTbl (Relocation table)
Relocation table представлява информация за relocate-ване на асемблерските
процедури (MC6800 Пълдин). Организирацията и е строго специфична за Пълдин.
Това са таблиците генерирани за всеки obj файл залепени една след друга.
Procedure
--------------------------------------¦
| exit code of a procedure |
->| exit: |
| | Ycode of a procedure. |
| | |
L +-----T--------------------------------
L-Lexit L (word) ExitPtr: exit pointer
+--+--L
LPsizeL (word) ParamSize: parameters size
+--+--L
LDsizeL (word) DataSize: data size
+--+---
LLxL (byte) LexLevel: proc lex level
+--L
LNoL (byte) ProcNo: procedure number
L---
Файл SPECIAL.DOC
=========================================================================
; Real format number (IEEE standard in Negative Byte Sex):
; (всъщност четирите байта са обърнати заради negative ByteSex)
; ---- byte 3 ----T--- byte 2 ----T--- byte 1 ----T--- byte 0 ----¦
; --T---------------T---------------------------------------------¦
; LsL exponent L m a n t i s s a L
; L-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--
; 31 30 23 22 0
;
; assume e = exponent; m = mantissa; s = sign
;
; (1) if 0 < e < 255 then value = (-1)^s * 2^(e - 127) * (1.m);
; (2) if (e = 0) and (m = 0) then value = (-1)^s * 0;
; (3) if (e = 0) and (m <> 0) then value = (-1)^s * 2^(-126) * (0.m);
; (4) if (e = 255) and (m = 0) then value = (-1)^s * infinite;
; (5) if (e = 255) and (m <> 0) then value is a NaN (Not A Number);
;
; this implementation of FP arithmetics can't handle:
; denormals (3), infinites (4) and NaNs (5)
6-те вида сравнения на две реални числа -> 0/1
sqr(r) вдигане на квадрат (еквивалентно на r*r)
sqrt(r) корен квадратен (може би трябва да се пренапише = exp(0.5*ln(r))
sin, cos, exp, ln, arctan, trunc, round, +, -, *, /, negative
int(r) цялата част от реално число
frac(r) дробната част от реално число
random връща 0<= random <1
integer -> real, cardinal -> real, longint -> real, real -> longint
power(r, accA): r -> (r * 10) accA пъти
f(r, accA): r -> r*10+accA специална работа, която може и да върши работа
други специални процедури от вида:
смятане на ред: a + b*x + c*x^2 + d*x^3 + ...
смятане на ред: ax + b*x^3 + c*x^5 + d*x^7 + ...
Целочислена аритметика:
сравнения (6-те вида)
+, -, *, div/mod, sqr, hi/lo(word): byte, HiWord/LoWord(longword): word
random(N) - връща 0<= random < N, ако N = 0 получаваме 0<= random <=$ffff
randomize[(N)] задава ядката (или я установява по случаен начен от clock)
negative <-> positive byte sex convertion:
swap(word): word - разменя двата байта
longswap(longword): longword - разменя четирите байта
Низове (Pascal Like):
сравнения (6-те вида)
pos, delete, insert, присвоявания, string <-> ASCIIz,
Up/Lo case на низ, буква, на ASCII и на разширен ASCII (барабар с кирилица)
IdSearch - сравнително мощен табличен лексически анализатор
+, -, *, / на низове (обаче го имам само на унит и то на торбалан (засега))
Byte Array
scan for търсене на байт в масив (назад, напред)
scan not for търсене на различен от даден байт в масив (назад, напред)
compare - сравняване на два масива връща къде се различават
Превръщания:
string -> longint (може и в HEX формат, може и с _ )
longint, integer, cardinal -> string
longword -> string със N<=8 шестнадесетични цифри
string -> real по синтаксиса на парцал
real -> string във експоненциален формат с 8<=N позиции
real -> string във формат с фиксирана точка с N<=40 цифри след точката