Как пользоваться Паскалем
May. 30th, 2019 12:22 pmСейчас всё это ещё не очень удобно: общей запускалки нет, и компоненты компилятора надо вызывать по отдельности. Но для Makefile вполне достаточно.
К примеру, берём файл hello.pas. Сначала превратим его в объектный файл hello.obj:
Для преобразования в форматы Intel HEX и МЭСМ-6 oct, в утилиту besm6-objdump надо будет добавить флаги -Oihex и -Oboct.
У Паскаль компилятора есть куча флагов. Нам могут оказаться полезными -a0, -p-, -s7, -s8, -t-, -u+:
К примеру, берём файл hello.pas. Сначала превратим его в объектный файл hello.obj:
$ besm6-pascompl hello.pas hello.objТеперь скомпонуем его с паскалевской библиотекой и получим выполняемый файл hello.out:
$ besm6-ld hello.obj -lpas -o hello.outСмотрим размер:
$ besm6-size hello.outСмотрим таблицу символов:
text data bss dec oct filename
1047 270 1754 3071 5777 hello.out
$ besm6-nm -n -g hello.outЧтобы всё это работало, нужно сначала установить симулятор dispak, а потом скомпилировать и установить утилиты из каталога mesm6/toolchain:
00001 T HELLO
00026 T P/1
00032 T P/7A
00034 T P/7AD
00047 T P/BX
00061 T P/EN
00074 T P/EF
00077 T P/E
00102 T P/HIDE
00105 T P/EDIH
00110 T P/SC
00114 T P/SYS
00130 T P/MOD
00134 T P/DIV
00146 T P/IT
00150 T P/CO
00156 T P/RE1
00320 T P/RE2
00353 T PASCTRP
00426 T P/GF
00465 T P/RACPAK
00535 T PASINBUF
00572 T PASGIVEP
00653 T P/PF
00704 T P/WOLN
00705 T P/WL
00757 T P/RF
01042 T P/TF
01065 T P/TRPAGE
01115 T P/WX
01124 T P/WXD
01140 T PASEOF
01150 T PASISOXT
01160 T PASOUT
01161 T P/PRINT
01217 T PASTN
01233 T PASWHT
01274 T PASPMD
01327 T P/PMDSET
01406 T PRINT8
01410 T PULT
01411 T READ*
01412 T STOP*
01413 T P/BEXF
01420 T P/CW
01422 T P/DA
01432 T P/DI
01436 T P/ER
01444 T P/HT
01455 T P/MD
01464 T P/PAGES
01465 T P/RC
01506 T P/SP
01514 T P/WI
01566 T P/WO
01616 T P/WR
01761 T PASEVN
02000 T PASHID
02003 T PASDIH
02007 T PASNB8
02017 T P/A7
02025 T P/TR
02030 D /ETEXT
02204 D PASTENS
02232 C P/1D
02232 D /EDATA
02302 C *OUTPUT*
02340 C RGEXPORT
02341 C P/STACK
02342 C PASEOLSY
02343 C PASZERO*
02344 C PASMINS*
02345 C SPACE*
02346 C PASEOFCD
02347 C PASENDS*
02350 C PASCELUP
02351 C PASPMDAD
02352 C PASPAGN*
02353 C PASDRN*
02354 C PASDRUM*
02355 C MONCARD*
02373 C *PASDDS*
02374 C *PASTEL*
02425 C PASEXFT*
02444 C PASPERID
02445 C PASPLUS*
04000 P P/FIRP
06000 B /END
$ cd ~mesm6/toolchain/pascomplЕдинственная проблема: в линкере пока недоделан флаг -Daddress, включающий раздельные адресные пространства для кода и данных, и задающий начальный адрес для данных. По умолчанию код и данные линкуются как на БЭСМ-6, в общее адресное пространство.
$ make install
$ cd ~mesm6/toolchain/ld
$ make install
$ cd ~mesm6/toolchain/libpas
$ make install
Для преобразования в форматы Intel HEX и МЭСМ-6 oct, в утилиту besm6-objdump надо будет добавить флаги -Oihex и -Oboct.
У Паскаль компилятора есть куча флагов. Нам могут оказаться полезными -a0, -p-, -s7, -s8, -t-, -u+:
$ besm6-pascomplУ линкера тоже есть флаги. Скажем, -Taddress задаёт начальный адрес размещения сегмента кода. Флаг -t включает выдачу списка линкуемых файлов, а повторив -t дважды, можно посмотреть подробную трассировку всех действий линкера.
Pascal-Monitor in C++ (17.05.2019)
Usage:
pascompl [option...] infile [outfile]
Options:
-a0 -a1 -a2 Output encoding for strings:
-a0: UTF-8
-a1: KOI-8
-a2: KOI-7 (aka ISO, default)
-b0 -b1 ... -b4 Size of file buffer, in 256-word chunks
-c- -c+ Disable/enable checking of data types
-d0 -d1 ... -d15 Bitmask of debug flags:
-d1: Trace function calls
-d2: Enable debug() as writeln()
-d4: Enable code enclosed in {=Z-}/{=Z+}
-d8: Invoke Pascal Debugger
-e- -e+ Make procedures external (-e+) or local (-e-)
-f- -f+ Compile procedures as Pascal (-f-) or Fortran (-f+)
-k0 -k1 ... -k23 Heap size in 1024-word chunks (default -k4)
-l0 -l1 -l2 -l3 Listing mode:
-l0: No listing, only error messages
-l1: Print listing with relative addresses per line
-l2: Also print generated object code
-l3: Also print offsets for variables and fields
-m+ -m- Optimize integer multiplication (positives only)
-p+ -p- Enable/disable debug information and crash dump
-r+ -r- Compare reals with predefined tolerance
-s0 Use stars for commons (like *foobar*)
-s1 Append one star for external names (like foobar*)
-s2 No stars for external names (like foobar)
-s3 Re-start line numbering from this line
-s4 Print columns 73-80 as line tags
-s5 Disable external files
-s6 Pack record fields from right to left
-s7 Disable pointer checking
-s8 Disable checking for stack overflow
-s9 Unknown
-t+ -t- Enable/disable range checks
-u- -u+ Set length of source lines: 120 or 72 columns
-y- -y+ Disable/enable non-standard syntax
-v Output version information and exit
-h Display this help and exit
$ besm6-ld
Linker for BESM-6 object files
Usage:
besm6-ld [options] file...
Options:
-d Force common symbols to be defined
-D address Use a separate address space for data and BSS
-e symbol Set entry address
-l name Search for library `libname'
-o filename Set output file name
-r Generate relocatable output
-s Strip all symbol information
-t Trace names of linked files
-T address Set base address (default 1)
-u symbol Start with undefined reference to `symbol'
no subject
Date: 2019-05-30 11:23 pm (UTC)no subject
Date: 2019-05-31 12:48 am (UTC)no subject
Date: 2019-05-31 01:08 am (UTC)no subject
Date: 2019-05-31 02:14 am (UTC)Можно и полностью на Паскале эту процедуру сделать. Регистры UART лежат в памяти, а из Паскале удобней будет в цикле по строке ходить.
no subject
Date: 2019-05-31 03:22 am (UTC)(*=F+*)procedure print8(var start, finish: alfa; pos: integer);
или
(*=F+*)procedure print8(start, finish:
no subject
Date: 2019-05-31 05:57 am (UTC)Так, например, можно написать:
PROGRAM MAIN(OUTPUT); procedure print80(start, finish: @alfa; pos:integer); fortran; (*=e+,f+*)procedure print8(start, finish: @alfa; pos:integer); begin print80(start, finish, pos); end; begin writeln(' hello, world'); END.По какой-то не очень понятной причине печатается не просто "HELLO, WORLD", а
Но вот такой трюк из фортрана (где библиотека, наоборот, вызывает PRINT80) работает:
*pascal PROGRAM noprogram(OUTPUT); procedure print8(var start, finish: alfa; pos:integer); fortran; (*=e+,f+,l2*)procedure print80(var start, finish: alfa; pos:integer); var tt:alfa; begin tt := '******'; print8(tt, tt, 12); print8(start, finish, pos); end; begin END. *fortran program main print 1 1 format(' hello, world') end *executeпечатает, как и ожидается,
****** HELLO, WORLDno subject
Date: 2019-05-31 04:32 am (UTC)no subject
Date: 2019-05-31 04:40 am (UTC)no subject
Date: 2019-05-31 04:35 am (UTC)