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

User Tag List

Страница 4 из 6 ПерваяПервая 123456 ПоследняяПоследняя
Показано с 31 по 40 из 52

Тема: Где скачать ассемблер для эмулятора 800win

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

    По умолчанию

    Я тогда не знал точно как будет себя вести встроенный ассемблер. Сейчас уже проникся, а писал, ведь год назад.

    У меня, намного больше примеров, конечно.
    В частности библиотека прямого доступа к видеопамяти.
    Только всё это надо обсуждать, я же не программист вовсе.

    Кстати, вот пример очарования PL65:
    Выравнивание начала памяти PM графики по 2 килобайтам:

    BYTE PMDUMMY[$800-(@ AND $7FF)]

    То есть начиная от текущего программного указателя обозначен как @ строится массив, выравненный по 2кб, после этого @ указывает уже на начало PM памяти и адрес можно взять оператором точкой. То есть PM=.PMDUMMY.
    Соответственно, если надо выровнять модифицированный шрифт по 1кб границе,
    будет так:

    BYTE CHRDUMMY[$400-(@ AND $3FF)]

    Вкусно!

    Вот работа с прерываниями:


    Код:
    ! ------------------------------------ !
    INTERRUPT DLINT()
      BYTE ColReg=$D018
    BEGIN ColReg=0 END
    ! ------------------------------------ !
    PROC int_enable()
      POINTER Ptr
      INT Addr BASED Ptr
      BYTE Data BASED Ptr
      BYTE NMIEN=$D40E      ! Interrupt register
      INT SDL=$230              ! Display list address
    BEGIN
      Ptr=$200 Addr=.DLINT   !Store address of interrupt subroutine into vector
      Ptr=SDL+15 Data=$82   ! interrupt at line fifteen
      NMIEN=$C0                 ! Enable interrupt
    END
    ! ------------------------------------ !
    MAIN()
    BEGIN int_enable() END


    Здесь по DLI прерыванию, наступающему по достижении 15-й строки,
    цвет фона меняется на чёрный.

    DLINT() - меняет фон
    int_enable() - Инициализация DLI

    При работе с указателями
    сначала определяется сам указатель (2 байта на нулевой странице)
    После этого к нему привязываются переменные, которые BASED на нём.
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    еще не прочитал всё руководство, а к чему постоянные конструкции BEGIN-END?

    ---------- Post added at 15:38 ---------- Previous post was at 15:36 ----------

    Цитата Сообщение от ezswift Посмотреть сообщение
    Только всё это надо обсуждать, я же не программист вовсе.
    я думаю, что для графики будет нужно, потому что у меня есть только процедура включения графического режима и быстрое построение точки только для GR.8
    Заодно можно найти и рисование окружностей.

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

    По умолчанию

    Это как фигурныескобки в си. Наверное калька с Алгола.
    Там ещё встречаются GOTO Label и GOSUB Label и ON var GOTO/GOSUB L1,L2,L3 ...
    Так что язык вполне архаичный. Но ведь когда его создавали, не было даже Си.

    Я как-то не конкретизировал, что в объявлении фиктивного массива
    BYTE PMDUMMY[$800-(@ AND $7FF)]
    часть в квадратных скобках - это его размерность, вычисляемая во время компиляции и во время исполнения просто автоматически будет известен адрес этого массива, то есть начала PMG в памяти.

    Также не сказал, что процедура типа INTERRUPT сама достраивает необходимые например для связки Бейсика с ассемблером PLA и PHA при входе и при выходе из самой процедуры.

    Есть специальный тип - Абсолютная переменная
    То есть если переменная инициализируется при её описании, то она считается абсолютной и равной присваиваемой величине, то есть вот здесь присваивается Адрес, а память под байт не выделяется.

    BYTE NMIEN=$D40E
    ...
    NMIEN= <что-то> тут пойдёт занесение этого <что-то> по адресу NMIEN.

    А ещё у меня есть файл, описывающий цвета для колоризации кода PL65 в Notepad++.

    Он во вложении, но его нужно переименовать в pl65.udl перед импортом в Notepad++.
    Вложения Вложения
    • Тип файла: txt pl65.txt (6.4 Кб, Просмотров: 61)
    Последний раз редактировалось ezswift; 14.03.2014 в 16:14. Причина: Уточнение
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

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

    По умолчанию

    Добавлю:
    BEGIN и END нужны для структуризации программы.

    <здесь глобальные определения>
    (Видны с этого места вниз везде, так как расположены выше процедур и функций)
    PROC/FUNC(<здесь определяется тип и задаются имена параметров>)
    <здесь локальные переменные>
    BEGIN
    <здесь пакет операторов>
    ...
    END <здесь возвращаемое функцией значение>
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  6. #35
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что-то пока не очень понятно(
    А хватит ли мне этой функции, чтобы получить адрес экранной области?
    Код:
    FUNC PEEK(PO1NTER address) 
    BYTE byte BQSED address 
    BEG IN 
    END byte

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

    По умолчанию

    denpopov,
    В PL65 уже есть стандартная библиотека PEEKPOKE.LIB
    Там уже есть функции PEEK,POKE,DEEK,DOKE
    (То есть пользоваться названием PEEK нехорошо.)
    Там они задаются через указатель общего назначения gppointer и ассемблерные функции

    Я всегда поступаю иначе.
    Для избежания умножений в циклах прорисовки я доступ к экрану предоставляю через Абсолютную переменную
    INT SAVMSC=$58
    и массив адресов начал строк текстового режима.
    INT LinAdr[24]
    Произвольный доступ к экрану идёт через указатель
    POINTER ScrAdr
    и вносимую в экран величину загружаемую по адресу куда настроен указатель
    BYTE ScrVal BASED ScrAdr

    При работе программ массив адресов начал строк
    всегда должен быть инициализирован! процедурой
    InitVid()

    Вот моя библиотека панельных функций экрана в режиме BASIC GR0

    Она не оптимальна, но знакомит с PL65

    Код:
    !====================================!
    ! PANELS.LIB
    ! PL65 Screen Panels operations.
    !------------------------------------!
    ! InitVid(),
    ! SaveBlk(INT X0,Y0,X1,Y1 POINTER BP),
    ! SaveBlk(INT X0,Y0,X1,Y1 POINTER BP),
    ! Inverse(BYTE byte),
    ! InvLin(INT X0,Y0,X1)
    ! InvBlk(INT X0,Y0,X1,Y1),
    ! PutShp(INT X0,Y0 BYTE Shp,Mod),
    ! PlotHor(INT X0,Y0,L BYTE Shp,Mod),
    ! PlotVer(INT X0,Y0,L BYTE Shp,Mod)
    !------------------------------------!
    ! Copyright (C) 2014 EZsoft
    !====================================!
    CONST MINCOL=0,MAXCOL=39,MINROW=0,MAXROW=23
    INT SAVMSC=$58,LinAdr[24]
    POINTER ScrAdr BYTE ScrVal BASED ScrAdr
    !------------------------------------!
    ! Initialize Line-based Access
    ! to screen
    PROC InitVid()
      INT Y
    BEGIN
      FOR Y=0 TO 23 DO
        LinAdr[Y]=Y*40+SAVMSC
      NEXT
    END
    !------------------------------------!
    ! Save rectangular screen block
    ! to buffer defined in MAIN()
    !------------------------------------!
    ! INT PW,PH BYTE PBuf[PW*PH]
    ! POINTER BP
    PROC SaveBlk(INT X0,Y0,X1,Y1 POINTER BP)
      INT X,Y BYTE BV BASED BP
    BEGIN
      FOR Y=Y0 TO Y1 DO
        FOR X=X0 TO X1 DO
          ScrAdr=LinAdr[Y]+X
          BV=ScrVal ScrVal=0
          BP=BP+1
        NEXT
      NEXT
    END
    !------------------------------------!
    ! Restore rectangular screen block
    ! from buffer defined in MAIN()
    PROC RestBlk(INT X0,Y0,X1,Y1 POINTER BP)
      INT X,Y BYTE BV BASED BP
    BEGIN
      FOR Y=Y0 TO Y1 DO
        FOR X=X0 TO X1 DO
          ScrAdr=LinAdr[Y]+X
          ScrVal=BV
          BP=BP+1
        NEXT
      NEXT
    END
    ! ----------------------------
    ! Inverse Screen Byte !
    FUNC Inverse(BYTE byte)
      CONST mask=%10000000
    BEGIN
      byte=byte XOR mask
    END byte
    ! ----------------------------
    ! Inverse Line on Screen
    PROC InvLin(INT X0,Y0,X1)
      INT X,Y
    BEGIN
      Y=Y0
      FOR X=X0 TO X1 DO
        ScrAdr=LinAdr[Y]+X
    	ScrVal=Inverse(ScrVal)
      NEXT
    END
    ! ----------------------------
    ! Invert  rectangular screen block
    PROC InvBlk(INT X0,Y0,X1,Y1)
      INT X,Y
    BEGIN
      FOR Y=Y0 TO Y1 DO
        FOR X=X0 TO X1 DO
          ScrAdr=LinAdr[Y]+X
          ScrVal=Inverse(ScrVal)
        NEXT
      NEXT
    END
    ! ----------------------------
    ! Put Char/Byte to Screen
    ! 0=Screen Byte, 1=ATASCII Char
    PROC PutShp(INT X0,Y0 BYTE Shp,Mod)
      INT X,Y
    BEGIN
      IF Mod=1 THEN Shp=Asc2Scr(Shp) ENDIF
      X=X0 Y=Y0
      ScrAdr=LinAdr[Y]+X
      ScrVal=Shp
    END
    ! ----------------------------
    ! Put Horizontal line of Chars/Bytes
    ! 0=Screen Byte, 1=ATASCII Char
    PROC PlotHor(INT X0,Y0,L BYTE Shp,Mod)
      INT X,X1,Y
    BEGIN
      IF Mod=1 THEN Shp=Asc2Scr(Shp) ENDIF
      X1=X0+L Y=Y0
      FOR X=X0 TO X1 DO
        ScrAdr=LinAdr[Y]+X
        ScrVal=Shp
      NEXT
    END
    ! ----------------------------
    ! Put Vertical line of Chars/Bytes
    ! 0=Screen Byte, 1=ATASCII Char
    PROC PlotVer(INT X0,Y0,L BYTE Shp,Mod)
      INT X,Y,Y1
    BEGIN
      IF Mod=1 THEN Shp=Asc2Scr(Shp) ENDIF
      X=X0 Y1=Y0+L
      FOR Y=Y0 TO Y1 DO
        ScrAdr=LinAdr[Y]+X
        ScrVal=Shp
      NEXT
    END
    ! ----------------------------
    ! Draw Frame around Panel
    PROC DrawFrm(INT X0,Y0,X1,Y1,PW,PH)
      CONST TLC=$51,HOR=$52,TRC=$45,VER=$7C,BLC=$5A,BRC=$43
    BEGIN
      PutShp(X0,Y0,TLC,0) PlotHor(X0+1,Y0,PW,HOR,0) PutShp(X1,Y0,TRC,0)
      PlotVer(X0,Y0+1,PH,VER,0)               PlotVer(X1,Y0+1,PH,VER,0)
      PutShp(X0,Y1,BLC,0) PlotHor(X0+1,Y1,PW,HOR,0) PutShp(X1,Y1,BRC,0)
    END
    ! ----------------------------
    PROC DrawPnl(INT X0,Y0,PW,PH,PAdr)
      POINTER ChrPtr
      BYTE ChrShp BASED ChrPtr
      INT X,Y
    BEGIN
      ChrPtr=PAdr
      FOR Y=Y0+1 TO Y0+PH DO
        FOR X=X0+1 TO X0+PW DO
          ScrAdr=LinAdr[Y]+X
    	  ChrShp=Asc2Scr(ChrShp) ScrVal=ChrShp
          ChrPtr=ChrPtr+1
        NEXT
      NEXT
    END
    ! ----------------------------
    ENDFILE
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  8. #37
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ezswift Посмотреть сообщение
    и массив адресов начал строк текстового режима.
    INT LinAdr[24]
    по идее можно обращаться ко всей памяти.

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

    По умолчанию

    Да, забыл сказать, что эта библиотека использует функции другой моей библиотеки
    SCREEN.LIB, выполняющей рутинные экранные функции, такие как
    Asc2Scr(BYTE Byte)
    или
    Scr2Asc(BYTE Byte)

    ---------- Post added at 11:37 ---------- Previous post was at 11:33 ----------

    На самом деле я хотел написать DUP.SYS для DOS 2.5 выполненый как система выпадающих меню. В перспективе от мыши, но можно от клавы или джойстика.
    Я, правда недостаточно знаю сам Дос, но тут в помощь идут расширители бейсика, которые добавляют ему DOS функции. Просто слизать что там пишут и влепить в PL65

    ---------- Post added at 11:42 ---------- Previous post was at 11:37 ----------

    Правда там честнее доступ к экрану делать через SIO для совместимости с S: и E:
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

  10. #39
    Banned
    Регистрация
    12.02.2014
    Адрес
    г. Арзамас
    Сообщений
    6,123
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ezswift Посмотреть сообщение
    Правда там честнее доступ к экрану делать через SIO для совместимости с S: и E:
    все же мне думается, что быстрее будет через ($88)

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

    По умолчанию

    На самом деле быстро и через SIO, это же компилятор.
    Всего смешнее то, что имея ассемблерные коды DUP.SYS
    можно просто слизать нужные части напрямую в ассемблер PL65
    У меня есть пример примитивного меню через SIO.

    Это простой атарьский com файл!!! Его надо переименоватью
    (Просто в форуме не любят com файлы.)
    Вложения Вложения
    • Тип файла: zip VM.ZIP (5.2 Кб, Просмотров: 41)
    MAC и PC - это всего лишь периферия для Атари...
    130XE|XC12|CA2001|XF551|IDEPlus2.0|SIO2SD|SIO2IDE| RAM576XE+Covoх|SIO2PC|MAXFLASH8|MAXFLASH1|The Ultimate Cartridge|

Страница 4 из 6 ПерваяПервая 123456 ПоследняяПоследняя

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

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

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

Похожие темы

  1. С эмулятора в ZxNet
    от Kakos_nonos в разделе Эмуляторы
    Ответов: 12
    Последнее: 19.10.2011, 06:38
  2. playlist для эмулятора
    от daniel в разделе Эмуляторы
    Ответов: 16
    Последнее: 06.09.2011, 14:43
  3. как сделать без эмулятора
    от женя999 в разделе Эмуляторы
    Ответов: 6
    Последнее: 08.04.2009, 20:38
  4. Работа с НМЛ из эмулятора
    от Error404 в разделе Эмуляторы
    Ответов: 6
    Последнее: 28.11.2007, 23:29
  5. Как сократить код эмулятора Z80 на PC
    от Vladimir Kladov в разделе Эмуляторы
    Ответов: 27
    Последнее: 01.02.2006, 21:18

Ваши права

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