Добавлю... Enter Esc Anykey Arrows работают.
Вид для печати
Добавлю... Enter Esc Anykey Arrows работают.
Вот вопрос denpopov оказался СУЩЕСТВЕННЫМ!
... к чему постоянные конструкции BEGIN-END?
Я долго искал и нашел. :)
Это оказалась сложная конструкция, исполняющая разные функции при компиляции для разных задач.
Например для процедуры MAIN() BEGIN производит подсчёт адреса начала скомпилированных машинных кодов, а END определяет их конец, то есть это адреса для создания полноценного атарьского *.COM файла.
Для обычных вызываемых процедур BEGIN производит все необходимые PLA для передачи параметров (только для своего программного, а не для аппаратного атарьского стека), а END производит все необходимые PHA, RTS для правильного выхода из программы.
Для процедур INTERRUPT, BEGIN делает то же, что и для обычных процедур, а END к тому же возвращает RTI.
В случае, если процедура должна возвращать данные, то есть является функцией, её END также кладёт возвращаемое на программный стек.
И наконец, в случае применения ПРИМАТИВНЫХ процедур, (От слова ПРИМАТЫ) то есть процедур, являющимися только исполняемыми машинными кодами, BEGIN и END являются только адресами входа и выхода.
Вот например как устанавливается VBI в PL65:
Код:PROC SetVBI*()
BEGIN
STX XSAVE
LDA #$06
LDX #VBI/256
LDY #VBI AND $FF
JSR SETVBV
LDX XSAVE
END
:v2_dizzy_tired2:
странный пример, конечно.
по идее в прерывании должны X и Y сохраняться, если задействованы.
На самом деле, это делает сам язык при BEGIN, однако он не сохраняет регистр X !
В PL65 регистр X используется только при работе с программным стеком языка, поэтому если он нужен в коде, сначала его сохраняют в XSAVE - (байт на нулевой странице), а потом восстанавливают.
Не во всяком языке ассемблер встроен, а где встроен, так там та ещё морока. :)
Кстати, я на PL65 перегнал руссификатор, который изначально на Си.
Мучался недельку методом тыка, потом прочитал мануал и вуаля!
Регистры A и Y сохраняются при вызове BEGIN и восстанавливаются при вызове END автоматически.
Вот сорц программульки:
Код:INCLUDE TERMINAL.LIB
CONST EN=$E0 BYTE RU,OLDCONS
BYTE CONSOL=$D01F,COLBAK=$02C8,CHBAS=$02F4
CONST BLUE=$80,RED=$32,SELECTED=$05
CONST SETVBV=$E45C,SYSVBV=$E45F,XITVBV=$E462
STRING FName$[20]
BYTE BumpUp[$400-(@ AND $3FF)],NewCSet[$400]
PROC VBI*()
BEGIN
LDA CONSOL
CMP OLDCONS BEQ Exit
CMP #SELECTED BNE Exit
!
LDA COLBAK
CMP #RED BNE ToRED
!
LDA #BLUE STA COLBAK
LDA #EN STA CHBAS
GOTO Exit
:ToRED
LDA #RED STA COLBAK
LDA RU STA CHBAS
:Exit
LDA CONSOL STA OLDCONS
JMP SYSVBV
END
PROC SetVBI*()
BEGIN
STX XSAVE
LDA #$06
LDX #VBI/256
LDY #VBI AND $FF
JSR SETVBV
LDX XSAVE
END
MAIN()
BEGIN
FName$="D1:RUS.FNT"
COLBAK=BLUE CHBAS=EN
RU=.NewCSet/256
OPEN(1,4,0,FName$)
GCHAR(1,.NewCSet,$400)
CLOSE(1)
SetVBI*()
END
А во вложении atr
Я только заменил расширение на zip, и надо переименовать в atr.
Сейчас пытаюсь сделать программу управления языком резидентной, чтобы по ресету не сбрасывалась.
Теорию ещё не знаю, пока читаю чужие коды.
:v2_dizzy_vodka:
запустил fld.com, а русских букв не видать. я что-то неправильно сделал?
все же мне думается, что тот вариант, который я сделал, проще. Это ребята из кооператива "Формат" написали, мы немного модифицировали потом русификатор, по Reset подпрограмма рестартует, но я не помню как делали..
Надо набрать FLD.
Когда рамка станет синей для переключения шрифта надо нажать Select. А потом писать русские буквы.
Мне не подходит рестарт программы по Reset, так как она читает шрифт с диска.
Нехорошо каждый раз загружать шрифт.
Я думаю, я добью эту программку...
Она будет ЛЮБОЙ шрифт подгружать, даже, переключаемый по Caps. :)
(Типа по звучанию, как KOI-8 Z=З и пр.)
На самом деле, мне эта программа вообще не интересна.
Я - учу PL65.
Там столько неведомого, что ВАЩЕ!
Я очень люблю Си, но Это - сухая выжимка из компьютерного опыта.
А PL65 = САМ компьютерный опыт!