Здравствуйте, друзья!
Чтобы не быть голословным, предлагаю Вашему вниманию Сниппеты кода, где явно видно необычное применение PL65.
1) В PL65 существуют Абсолютные как в ассемблере целые переменные
Код:
BYTE NMIEN=$D40E ! Определение Абсолютного целого
...
NMIEN=$C0 ! Присваивание этому абсолютному адресу значения
2) А вот, следующий код демонстрирует поведение PL65 очень похожее на стэковый язык Форт.
Код:
PROC POS(INT col=$55 BYTE row=$54)
BEGIN END
Я имею ввиду, что данные на стэке, полученные из формальных параметров,
которые типизируются прямо в списке формальных параметров как абсолютные целые,
как в форте сразу же из стэка поступают в необходимые ячейки памяти.
Больше ничего делать программе не нужно.
3) А вот этот код по поведению похож на форму Лиспа LAMBDA, где Лямбда это определение функции,
которое может и существовать и вычисляться отдельно от объявления, даже без имени ...
Код:
PROC WRTSTR(INT addr,len) FORWARD ! Это объявление процедуры
...
BODY WRTSTR ! А это её определение (что, собственно, она делает) ...
BEGIN ! Как видите, не заданы ранее описанные параметры
PCHAR(0,addr,len) ! Вызов библиотечной процедуры
END
4) ... и даже быть аргументом другой функции ...
Я имею ввиду здесь, что арументы из ранее описанной процедуры POS, при таком её вызове,
не стягиваются со стэка, а напрямую передаются в процедуру PLOT, что экономит машинное время,
затрачиваемое обычно на подготовку стэка для любой процедуры.
Код:
PROC PLOT(PROC POS) ! Earlier defined...
BEGIN PUT(6,color) END
5) А это ПРИМАТИВНАЯ(со звёздочкой), от слова Примат, то есть ПРЕДПОЧИТАЕМАЯ,
процедура на встроенном ассемблере.
Это означает, что PL65, убирает прочь свои руки от ассемблирования.
Это просто библиотечная процедура CIO.
Разница с ассемблером в том, что PL65 использует свой собственный программный стэк,
в отличие от аппаратного стэка процессора, применяя свою собственную
внутреннюю переменную STACK и что регистр процессора X используется в PL65 только
для обслуживания программного стэка, а значит до его использования должен быть сохранён
во встроенной переменной XSAVE и после его использования, восстановлен из этой переменной.
Код:
PROC CIO*(BYTE iocb BYTE com INT addr,len)
BEGIN
LDA STACK+6,X
ASLA ASLA ASLA ASLA
TAY
LDA STACK+4,X STA ICCOM,Y
LDA STACK+2,X STA ICBAL,Y
LDA STACK+3,X STA ICBAH,Y
LDA STACK,X STA ICBLL,Y
LDA STACK+1,X STA ICBLH,Y
TXA CLC
ADC #8 STA XSAVE
TYA TAX
LDA OCHAR
JSR $E456 BMI ioerr
LDX XSAVE RETURN
:ioerr LDX XSAVE
DEX DEX TYA
STA STACK,X
LDA #0 STA STACK+1,X
ERROR*()
WRTSTR("Error ")
WRITE(ERRNUM)
END
6) Из Бейсика в PL65 сохранены операторы DATA, TRAP NOTRAP ON GOTO.
Как Вы понимаете, я например могу использовать DATA задаваемые в Бейсике
как инлайн код в PL65, задавая таким образом, например шрифт
или сассемблированный код Бейсика, применив лишь незначительные изменения.
заменяя лишь PLA на PULL и PHA на PUSH.
Ну, что? Нравится ?..
ez
PS Я, кстати, добавил ещё видео
https://www.youtube.com/watch?v=NlBwBybF9Us