Здравствуйте, друзья!
Вот как раз к Новому году написал на PL65 программульку доступа ко всей расширеной памяти Атари.
В эмуляторах глючит.
На реальной машине всё OK
Вот код: (Пока подождите. Выловил какие-то глюки при исправной IMHO программе)
Здравствуйте, друзья!
Вот как раз к Новому году написал на PL65 программульку доступа ко всей расширеной памяти Атари.
В эмуляторах глючит.
На реальной машине всё OK
Вот код: (Пока подождите. Выловил какие-то глюки при исправной IMHO программе)
Последний раз редактировалось ezswift; 20.12.2020 в 13:03.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Oleg N. Cher(22.12.2020)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Я, конечно огорчён, что программулька не работает гладко, но на Real HW ВСЕ работает !!!
Вот изящный код.
Проблемы возникают только при переходе от 0-го (основного) банка памяти к расширенной памяти.Код:!====================================! ! BANKS.PRG ! ! Using 130XE Extended Banks in ! ! PL65 Programming Language ! !------------------------------------! ! Evgeny Zolotarev,(aka 576XE), 2020 ! !====================================! INCLUDE TERMINAL.LIB !- CONSTANTS & VARIABLES: CONST bkMask=%10010001 BYTE PORTB=$D301,NMIEN=$D40E,bkTag INT bkNum !- DUMMY array representing ---------! !- selected BANK's slice ------------! BYTE bkMem[$4000]=$4000 !- Bank Selector Values 576XE -------! !- Atari800WinPlus/Altirra (Rambo) --! BYTE bkSel[33] DATA $91, $81,$83,$85,$87,$89,$8B,$8D,$8F, $A1,$A3,$A5,$A7,$A9,$AB,$AD,$AF, $C1,$C3,$C5,$C7,$C9,$CB,$CD,$CF, $E1,$E3,$E5,$E7,$E9,$EB,$ED,$EF; ! String VAR to store in all BANKS STRING inp$[4+27] DATA " => User DATA from Bank #00"; ! Set string as VAR for appending STRING out$[4+27] DATA " "; !- PROCEDURES: !- Clear Screen Procedure -----------! PROC clrScr() CONST clr=255 BEGIN WRTSTR(CHR$(125)) END !- Wait for Any Key Pressed ---------! PROC anyKey() CONST none=255 BYTE CH=764 BEGIN WRTSTR("Wait for a Key...") CR() WHILE CH=none DO ENDWHILE CH=none END !- Place bkSel Tags into PORTB ------! PROC setBk*(BYTE bkTag) BEGIN !- Wrapper STOPs/STARTs IRQ & NMI ---! SEI LDA #$00 STA NMIEN LDA PORTB AND bkMask OR bkTag STA PORTB LDA #$40 STA NMIEN CLI END !- Send bkNum to setBk subroutine ---! PROC setBank(INT bkNum) BEGIN bkTag=bkSel[bkNum] setBk*(bkTag) END !- Writes to Bank -------------------! PROC writBk() BEGIN FOR bkNum=0 TO 32 DO WRTSTR("Writing to BANK #") WRITE(bkNum) CR() IF bkNum<10 THEN inp$[25,25]=STR$(0) inp$[26,26]=STR$(bkNum) ELSE inp$[25]=STR$(bkNum) ENDIF out$=inp$ setBank(bkNum) MOVE(.out,LEN(out$),.bkMem) NEXT END !- Reads from Bank ------------------! PROC readBk() BEGIN FOR bkNum=0 TO 32 DO WRTSTR("Reading BANK #") WRITE(bkNum) CR() setBank(bkNum) MOVE(.bkMem,LEN(out$),.out) WRTSTR(out$) CR() NEXT END !------------------------------------! MAIN() BYTE PORT BEGIN LDA PORTB STA PORT clrScr() anyKey() writBk() anyKey() clrScr() readBk() LDA PORT STA PORTB END ! >>> EOF <<< !
Что интересно, данные заносятся и в основную память. Проверял в мониторе.
При работе только с расширенной памятью(bkNum от 1 to 32) их нет! Что-то в эмулях !!!
zen
Последний раз редактировалось ezswift; 22.12.2020 в 12:36.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Oleg N. Cher(22.12.2020)
Ну, значит, продолжение истории...
Связался я с Avery Lee - создатель Алтирры и он тут же намекнул в чём проблема кода.
Почему намекнул, а потому, что он же не знал как именно я включаю реальную Атарьку.
В общем, располагая данными программки XRAM, я отмаскировал все биты в PORTB, которые нас не могли интересовать и получил значение включённого нулевого(main) фрейма как $91. Здесь, почти ВСЁ было правильно, кроме первого(второй по счёту справа) бита.
Для PORTB он работает инверсно по отношению к остальным.
То есть когда я обнулял его программно, ОН ВКЛЮЧАЛ БЕЙСИК, а бейсик при загрузке вызывал GR. 0, то есть, переносил память и инициализировал новый экран, что и портило мою программку.
Вот рабочий код:
Заметьте, что я оставил маску ПРЕЖНЕЙ (Маска просто сохраняет от стирания системные данные в PORTB), зато значение нулевого тэга поменял. Можно ещё в конце MAIN добавить восстановление PORTB, но мне не это было нужно, а работа с EXTMEM.Код:!====================================! ! BANKS.PRG ! ! Using 130XE Extended Banks in ! ! PL65 Programming Language ! !------------------------------------! ! Evgeny Zolotarev,(aka 576XE), 2020 ! !====================================! INCLUDE TERMINAL.LIB !- CONSTANTS & VARIABLES: CONST bkMask=%10010001 BYTE PORTB=$D301,NMIEN=$D40E,bkTag INT bkNum !- DUMMY array representing ---------! !- selected BANK's slice ------------! BYTE bkMem[$4000]=$4000 !- Bank Selector Values -------------! !- Atari800WinPlus 576XE ------------! BYTE bkSel[33] DATA $93, $81,$83,$85,$87,$89,$8B,$8D,$8F, $A1,$A3,$A5,$A7,$A9,$AB,$AD,$AF, $C1,$C3,$C5,$C7,$C9,$CB,$CD,$CF, $E1,$E3,$E5,$E7,$E9,$EB,$ED,$EF; !- Bank Selector Values -------------! !- Altirra 576XE Compy scheme -------! ! BYTE bkSel[33] ! DATA $33, ! $21,$23,$25,$27,$29,$2B,$2D,$2F, ! $61,$63,$65,$67,$69,$6B,$6D,$6F, ! $A1,$A3,$A5,$A7,$A9,$AB,$AD,$AF, ! $E1,$E3,$E5,$E7,$E9,$EB,$ED,$EF; ! String VAR to store in all BANKS STRING inp$[4+27] DATA "==> User DATA from Bank #00"; ! Set string as VAR for appending STRING out$[4+27] DATA " "; !- PROCEDURES: !- Clear Screen Procedure -----------! PROC clrScr() CONST clr=255 BEGIN WRTSTR(CHR$(125)) END !- Wait for Any Key Pressed ---------! PROC anyKey() CONST none=255 BYTE CH=764 BEGIN WRTSTR("Wait for a Key...") CR() WHILE CH=none DO ENDWHILE CH=none END !- Place bkSel Tags into PORTB ------! PROC setBk*(BYTE bkTag) BEGIN !- Wrapper STOPs/STARTs IRQ & NMI ---! SEI LDA #$00 STA NMIEN LDA PORTB AND bkMask OR bkTag STA PORTB LDA #$40 STA NMIEN CLI END !- Send bkNum to setBk subroutine ---! PROC setBank(INT bkNum) BEGIN bkTag=bkSel[bkNum] setBk*(bkTag) END !- Writes to Bank -------------------! PROC writBk() BEGIN FOR bkNum=0 TO 32 DO WRTSTR("Writing to BANK #") WRITE(bkNum) CR() IF bkNum<10 THEN inp$[25,25]=STR$(0) inp$[26,26]=STR$(bkNum) ELSE inp$[25]=STR$(bkNum) ENDIF out$=inp$ setBank(bkNum) MOVE(.out,LEN(out$),.bkMem) NEXT END !- Reads from Bank ------------------! PROC readBk() BEGIN FOR bkNum=0 TO 32 DO WRTSTR("Reading BANK #") WRITE(bkNum) CR() setBank(bkNum) MOVE(.bkMem,LEN(out$),.out) WRTSTR(out$) CR() NEXT END !------------------------------------! MAIN() BEGIN clrScr() anyKey() writBk() anyKey() clrScr() readBk() END ! >>> EOF <<< !
zen
- - - Добавлено - - -
Ну, хотелось бы прояснить как с этим можно работать.
Раз у нас есть доступ ко всей памяти, мы можем исключить из списка основную память - $93, 130XE память - ($E3,$E7,$EB,$EF), например для рамдиска или программ её использующих (MAE assembler, CLSN Pascal etc.), зато остальную память отдать программной Куче.
zen
Последний раз редактировалось ezswift; 24.12.2020 в 12:07.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Я знаю даже то, что некоторые диалекты Си способны воспринимать Пики да Буби как замену всяким Диграфам и Трезубам.
Но я не этим занят...
Например одна и та же стэндэлонная программка на Си вдвое больше по размеру, чем на PL65 и, что характерно, я для этой программки НЕ ТРОГАЛ родную библиотеку TERMINAL.LIB, а можно было бы её подчистить (выкинуть ненужные функции).
zen
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Увертюра...
В 2014 г. на AtariAge появилась тема "PL65 Problem - WRTSTR/WRTLN" весьма уважаемого пользователя с ником MrFish.
Речь шла о том, что PL65 неверно передаёт строковые параметры в процедуры.
Занимались этой проблемой весьма серьёзные люди - FJC, например...
Склонялись, что что-то портит стек.
...
Так вот, вчера мне удалось понять что происходит и я даже начал писать TEXT.LIB - библиотеку строковых функций, над которой мучился уже полгода.
Смысл был в том, что подробнейшая и полнейшая документация НЕСИСТЕМАТИЗИРОВАНА и несмотря на то, что описано ВСЁ, искать по всему тексту - сплошное мучение. Кроме этого понимание затруднялось неустоявшейся терминологией и наличием "Умолчаний" в документации.
Прошло 8 лет и Вуаля!
Оказалось, что по факту, в языке одновременно существуют два представления строк:
1. Для программиста (для объявления переменной)
объявление -инициализация -Код:STRING strg$[255]2. Для компилятора (для расчётов)Код:DATA "It is simply a String";
Теперь-то понятно, что компилятор просто не может прожевать полностьюКод:FUNC pos(INT adr,len,adr1,len1)
бессмысленое определение:
так как не расшифровывает определения предназначенного только для программиста.Код:FUNC pos(STRING stg$[255],stg2[255])
zen
Последний раз редактировалось ezswift; 12.11.2022 в 08:02. Причина: описки в тексте
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
Oleg N. Cher(12.11.2022)
Здравствуйте, друзья!
Мне удалось на днях закончить написание Библиотеки обработки текстов для PL65
Я опубликовал соответствующее видео на Youtube.
Вот ссылка:
https://www.youtube.com/playlist?lis...xcsQqkHaMotUB4
Код Библиотеки:
Код:!====================================! ! TEXT.LIB ! ! Text Functions Library for PL65 ! ! Programming Language ! !------------------------------------! ! Evgeny Zolotarev,(aka 576XE), 2023 ! !====================================! POINTER sP BYTE sV BASED sP BYTE wV BASED sP !====================================! FUNC Left$(INT sA,sL,n) STRING out$[256] INT i BEGIN FOR i=0 TO n DO sP=sA+i out$[i,i]=CHR$(sV) NEXT END out$ !------------------------------------! FUNC Mid$(INT sA,sL,m,n) STRING out$[256] INT i BEGIN sA=sA+m-1 FOR i=0 TO n DO sP=sA+i out$[i,i]=CHR$(sV) NEXT END out$ !------------------------------------! FUNC Right$(INT sA,sL,n) STRING out$[256] INT i BEGIN sA=sA+sL-n FOR i=0 TO n DO sP=sA+i out$[i,i]=CHR$(sV) NEXT END out$ !------------------------------------! FUNC Pos(INT pA,pL,sA,sL) POINTER pP BYTE pV BASED pP INT i,j,psn BYTE f BEGIN IF pL<=sL THEN sL=sL-pL+1 i=0 j=0 ! While Fail ... ! Repeating along the String REPEAT f=$FF ! If Success... ! Indexing along the Pattern FOR j=0 TO pL-1 DO sP=sA+i+j pP=pA+j IF sV<>pV THEN f=0 ENDIF NEXT i=i+1 UNTIL (i=sL OR f<>0) IF f<>0 THEN psn=i ELSE psn=0 ENDIF ELSE psn=0 ENDIF END psn !------------------------------------! FUNC Conc$(INT sA,sL,pA,pL) STRING out$[256] INT i,j BEGIN FOR i=0 TO sL DO sP=sA+i out$[i,i]=CHR$(sV) NEXT FOR j=0 TO pL DO sP=pA+j out$[i+j,i+j]=CHR$(sV) NEXT i=sL out$[i,i]=" " END out$ !------------------------------------! FUNC Ins$(INT pA,pL,sA,sL,m) STRING out$[256],a$[256],b$[256] INT n BEGIN a$=Left$(sA,sL,m) b$=Right$(sA,sL,sL-m-1) n=LEN(a$)+pL+1 a$=Conc$(a$,pA,pL) out$=Conc$(a$,b$) END out$ !------------------------------------! FUNC Del$(INT sA,sL,m,n) STRING a$[256],b$[256],out$[256] INT i BEGIN a$=Left$(sA,sL,m) b$=Right$(sA,sL,sL-m-n) out$=Conc$(a$,b$) i=LEN(a$) out$[i,i]=" " sP=.out-2 wV=sL-n+1 END out$ !------------------------------------! FUNC Inv$(INT sA,sL,m,n) STRING out$[256] INT i BEGIN out$=Mid$(sA,sL,1,sL) FOR i=0 TO n-1 DO sP=.out+m-1+i sV=sV+128 NEXT END out$ !------------------------------------! FUNC Upper$(INT sA,sL,m,n) STRING out$[256] INT i BEGIN out$=Mid$(sA,sL,1,sL) FOR i=0 TO n-1 DO sP=.out+m-1+i IF sV>$60 AND sV<$7B THEN sV=sV-$20 ENDIF NEXT END out$ !------------------------------------! FUNC Lower$(INT sA,sL,m,n) STRING out$[256] INT i BEGIN out$=Mid$(sA,sL,1,sL) FOR i=0 TO n-1 DO sP=.out+m-1+i IF sV>$40 AND sV<$5B THEN sV=sV+$20 ENDIF NEXT END out$ !====================================! ENDFILE
Вот код проверочной программы:
Код:!====================================! ! TEXT.PRG ! ! Text Functions Program for PL65 ! ! Programming Language ! !------------------------------------! ! Evgeny Zolotarev,(aka 576XE), 2023 ! !====================================! INCLUDE TERMINAL.LIB INCLUDE TEXT.LIB !====================================! MAIN() STRING s$[256],p$[256],a$[256],out$[256] INT psn,m,n BEGIN s$="Moscow Alma-Ata Petersburg Evpatoria Feodosia Simeiz Konakovo" p$="Alma-Ata" a$="Syktyvkar" m=15 n=12 CR() WRTSTR("Left$ - ") WRTLN(Left$(s$,6)) WRTSTR("Mid$ - ") WRTLN(Mid$(s$,8,8)) WRTSTR("Right$ - ") WRTLN(Right$(s$,8)) CR() psn=Pos(p$,s$) WRTSTR("Pos - ") WRITE(psn) CR() CR() WRTSTR("Conc$ - ") WRTLN(Conc$(p$,a$)) out$=Ins$(a$,s$,m) WRTSTR("Ins$ -") WRTLN(out$) out$=Del$(s$,m,n) WRTSTR("Del$ -") WRTLN(out$) m=17 n=10 CR() WRTSTR("Inv$ - ") WRTLN(Inv$(s$,m,n)) WRTSTR("Upper$ - ") WRTLN(Upper$(s$,m,n)) WRTSTR("Lower$ - ") WRTLN(Lower$(s$,m,n)) END !====================================!
PL65 TEXT SpDOSx33a 360.zip
Пользуйтесь наздоровье
zen
Последний раз редактировалось ezswift; 19.04.2023 в 09:34.
MAC и PC - это всего лишь периферия для Атари...
130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|
BelaLugoci(13.11.2023), crazy_bender/ex-PLACEBO(19.04.2023), Oleg N. Cher(19.04.2023)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)