Здравствуйте, друзья!
Чтобы не быть голословным, предлагаю Вашему вниманию Сниппеты кода, где явно видно необычное применение PL65.
1) В PL65 существуют Абсолютные как в ассемблере целые переменные
2) А вот, следующий код демонстрирует поведение PL65 очень похожее на стэковый язык Форт.Код:BYTE NMIEN=$D40E ! Определение Абсолютного целого ... NMIEN=$C0 ! Присваивание этому абсолютному адресу значения
Я имею ввиду, что данные на стэке, полученные из формальных параметров,Код:PROC POS(INT col=$55 BYTE row=$54) BEGIN END
которые типизируются прямо в списке формальных параметров как абсолютные целые,
как в форте сразу же из стэка поступают в необходимые ячейки памяти.
Больше ничего делать программе не нужно.
3) А вот этот код по поведению похож на форму Лиспа LAMBDA, где Лямбда это определение функции,
которое может и существовать и вычисляться отдельно от объявления, даже без имени ...
4) ... и даже быть аргументом другой функции ...Код:PROC WRTSTR(INT addr,len) FORWARD ! Это объявление процедуры ... BODY WRTSTR ! А это её определение (что, собственно, она делает) ... BEGIN ! Как видите, не заданы ранее описанные параметры PCHAR(0,addr,len) ! Вызов библиотечной процедуры END
Я имею ввиду здесь, что арументы из ранее описанной процедуры POS, при таком её вызове,
не стягиваются со стэка, а напрямую передаются в процедуру PLOT, что экономит машинное время,
затрачиваемое обычно на подготовку стэка для любой процедуры.
5) А это ПРИМАТИВНАЯ(со звёздочкой), от слова Примат, то есть ПРЕДПОЧИТАЕМАЯ,Код:PROC PLOT(PROC POS) ! Earlier defined... BEGIN PUT(6,color) END
процедура на встроенном ассемблере.
Это означает, что PL65, убирает прочь свои руки от ассемблирования.
Это просто библиотечная процедура CIO.
Разница с ассемблером в том, что PL65 использует свой собственный программный стэк,
в отличие от аппаратного стэка процессора, применяя свою собственную
внутреннюю переменную STACK и что регистр процессора X используется в PL65 только
для обслуживания программного стэка, а значит до его использования должен быть сохранён
во встроенной переменной XSAVE и после его использования, восстановлен из этой переменной.
6) Из Бейсика в PL65 сохранены операторы DATA, TRAP NOTRAP ON GOTO.Код: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
Как Вы понимаете, я например могу использовать DATA задаваемые в Бейсике
как инлайн код в PL65, задавая таким образом, например шрифт
или сассемблированный код Бейсика, применив лишь незначительные изменения.
заменяя лишь PLA на PULL и PHA на PUSH.
Ну, что? Нравится ?..
ez
PS Я, кстати, добавил ещё видео
https://www.youtube.com/watch?v=NlBwBybF9Us




Ответить с цитированием