Сага о CLSN Pascal.
Часть1.
Снова мне хотелось бы представить Вам новый древний язык программирования для Атари.
Прежде всего - это Паскаль.
Затем, Паскаль ВПОЛНЕ совершенный!
И, наконец, он - Атарьский. (* Я имею ввиду, что системные вещи Атари в нём весьма заметно реализованы *).
(* Вот так в CLSN пишутся комментарии (,в отсутствии фигурных скобок...) *)
Как Вы понимаете, и CC8 и PL65 и CLSN являются ПРЯМЫМИ наследниками ПЕРВОГО языка программирования - ALGOL. Для нас значимо, что синтаксис у наследников заимствует большинство принцыпов синтаксиса родителя.
Уточню, НЕ САМОГО СИНТАКСИСА, А ПРИНЦЫПОВ!
Что же внесено нового после ALGOL'а?
IMHO:
PL65 - Эклектичность = бессистемная всеядность. (всё новое, что тогда было...)
CC8 - Приверженность к C = (максимальная безошибочность чтения C текстов, как источника логично-короткого, но полноценного синтаксиса для переносимости.)
CLSN - Приверженность к Pascal = (максимальная предобработка текстов для беспроблемной их компиляции при условии точного соблюдения правил языка.)
Откровенно, мне до лампочки на каком языке писать. Хочется найти СВОЙ!
И CLSN близок к этому. Причин необычайно много! О них я расскажу позднее.
Давайте, будучи знакомыми с моими ранее опубликованными постами об ассемблере, напишем программку для инверсии строки символов со скоростью ассемблера.
(* Кстати, в CLSN есть встроенная функция инверсии символов с клавиатуры!
Но это не то, что нам надо... *).
Мы хотим - просто взять строку (либо ATASCII, либо INTERNAL) и преобразовать её в инверсную. Здесь строка = короткая (0-255) символов.
Вот код:
Код:
(* Global *)
var
_s_temp: string; (* Temporary global *)
function invStr(s: string): string;
begin
_s_temp := s; (* Copy the local to an absolute memory location *)
inline($ac/_s_temp/ (* LDY _S_TEMP *)
$f0/$0c/ (* BEQ XIT *)
$b9/_s_temp/ (* NXT LDA _S_TEMP,Y *)
$49/$80/ (* EOR #$80 *)
$99/_s_temp/ (* STA _S_TEMP,Y *)
$88/ (* DEY *)
$d0/$f3); (* BNE NXT *)
(* XIT *)
invstr := _s_temp; (* Return the value *)
end;
(* Main Procedure *)
procedure main;
(* Local *)
var
s: string;
begin
repeat (*repeat this ...*)
writeln('Enter some string:'); write('>'); (*prompt symbol*)
readln(s); (*reads line*) writeln; (*place it on screen as input*)
writeln(invstr(s)); (*place on screen the result*) writeln; (*skip line*)
until (s=''); (*... to the end of line, looking at chars *)
end;
(* Calling *)
begin main; end.
Как Вы видете, CLSN не различает Прописных и Строчных символов.