Важная информация

User Tag List

Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 26 из 26

Тема: Старый-Новый Язык Noahsoft PL65

  1. #21
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я, конечно огорчён, что программулька не работает гладко, но на Real HW ВСЕ работает !!!
    Вот изящный код.
    Код:
    !====================================!
    ! 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 <<< !
    Проблемы возникают только при переходе от 0-го (основного) банка памяти к расширенной памяти.
    Что интересно, данные заносятся и в основную память. Проверял в мониторе.
    При работе только с расширенной памятью(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|

  2. Этот пользователь поблагодарил ezswift за это полезное сообщение:

    Oleg N. Cher (22.12.2020)

  3. #22
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну, значит, продолжение истории...
    Связался я с Avery Lee - создатель Алтирры и он тут же намекнул в чём проблема кода.
    Почему намекнул, а потому, что он же не знал как именно я включаю реальную Атарьку.

    В общем, располагая данными программки XRAM, я отмаскировал все биты в PORTB, которые нас не могли интересовать и получил значение включённого нулевого(main) фрейма как $91. Здесь, почти ВСЁ было правильно, кроме первого(второй по счёту справа) бита.
    Для PORTB он работает инверсно по отношению к остальным.

    То есть когда я обнулял его программно, ОН ВКЛЮЧАЛ БЕЙСИК, а бейсик при загрузке вызывал GR. 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 -------------!
    !- 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 <<< !
    Заметьте, что я оставил маску ПРЕЖНЕЙ (Маска просто сохраняет от стирания системные данные в PORTB), зато значение нулевого тэга поменял. Можно ещё в конце MAIN добавить восстановление PORTB, но мне не это было нужно, а работа с EXTMEM.

    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|

  4. #23
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,552
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    272
    Спасибо Благодарностей получено 
    229
    Поблагодарили
    181 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ezswift Посмотреть сообщение
    Ну НЕТ у Атари фигурных скобок !!! Матчасть!
    где-то и квадратных нету еще - а паскаль и си есть, однако
    матчасть не мешает применять диграфы, не аргумент
    Прихожу без разрешения, сею смерть и разрушение...

  5. #24
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию



    Я знаю даже то, что некоторые диалекты Си способны воспринимать Пики да Буби как замену всяким Диграфам и Трезубам.
    Но я не этим занят...

    Например одна и та же стэндэлонная программка на Си вдвое больше по размеру, чем на PL65 и, что характерно, я для этой программки НЕ ТРОГАЛ родную библиотеку TERMINAL.LIB, а можно было бы её подчистить (выкинуть ненужные функции).

    zen
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  6. #25
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Увертюра...

    В 2014 г. на AtariAge появилась тема "PL65 Problem - WRTSTR/WRTLN" весьма уважаемого пользователя с ником MrFish.

    Речь шла о том, что PL65 неверно передаёт строковые параметры в процедуры.
    Занимались этой проблемой весьма серьёзные люди - FJC, например...
    Склонялись, что что-то портит стек.
    ...
    Так вот, вчера мне удалось понять что происходит и я даже начал писать TEXT.LIB - библиотеку строковых функций, над которой мучился уже полгода.

    Смысл был в том, что подробнейшая и полнейшая документация НЕСИСТЕМАТИЗИРОВАНА и несмотря на то, что описано ВСЁ, искать по всему тексту - сплошное мучение. Кроме этого понимание затруднялось неустоявшейся терминологией и наличием "Умолчаний" в документации.

    Прошло 8 лет и Вуаля!
    Оказалось, что по факту, в языке одновременно существуют два представления строк:

    1. Для программиста (для объявления переменной)
    объявление -
    Код:
    STRING strg$[255]
    инициализация -
    Код:
    DATA "It is simply a String";
    2. Для компилятора (для расчётов)
    Код:
    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|

  7. Этот пользователь поблагодарил ezswift за это полезное сообщение:

    Oleg N. Cher (12.11.2022)

  8. #26
    Activist Аватар для ezswift
    Регистрация
    26.02.2011
    Адрес
    Москва
    Сообщений
    258
    Спасибо Благодарностей отдано 
    8
    Спасибо Благодарностей получено 
    25
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Библиотека обработки текстов

    Здравствуйте, друзья!

    Мне удалось на днях закончить написание Библиотеки обработки текстов для 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|

  9. Эти 3 пользователя(ей) поблагодарили ezswift за это полезное сообщение:

    BelaLugoci (13.11.2023), crazy_bender/ex-PLACEBO (19.04.2023), Oleg N. Cher (19.04.2023)

Страница 3 из 3 ПерваяПервая 123

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. ПК8000 - Софт: Старый и Новый
    от ivagor в разделе ПК8000
    Ответов: 331
    Последнее: 05.11.2023, 14:33
  2. Новый старый ZX-Next: сборка, тестирование, производство.
    от ZXFanat в разделе Несортированное железо
    Ответов: 51
    Последнее: 01.10.2011, 08:41
  3. про новый-старый спектрум
    от xailar в разделе ZX Концепции
    Ответов: 3
    Последнее: 06.12.2010, 10:42

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •