User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 23

Тема: Программирование на Z80 в ассемблере и машинном коде на 48 Kb машине!

  1. #11

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    Если Вы программировали в машинном коде, то Ваше возмущение насчёт POKE и PEEK не понятно?
    Не знаю, откуда появилась мысль про "возмущение", но мне все-таки кажется, что PEEK и POKE - это команды BASIC, а не ассемблера. Или ошибаюсь?
    А смысл набивать бейсик вручную опкодами ассемблера, если сам ассемблер это и так делает автоматически - тоже с трудом понимаю.
    Последний раз редактировалось 0xDEAD; 25.01.2023 в 02:05.

  2. #12

    Регистрация
    15.05.2010
    Адрес
    Москва
    Сообщений
    64
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от goodboy Посмотреть сообщение
    диапазон адресов тот-же #0000-#FFFF, но 16к #C000-#FFFF можно подменять другим куском памяти.
    сами страницы переключаются через порт (командой OUT)
    Спасибо goodboy, диапазон #0000-#FFFF можно было представить в десятичном виде, потому что я думаю не все читатели статьи пока понимают, что FFFF в десятичном представлении это 65535, между прочим создатели журнала ZX Ревю тоже частенько упускали этот момент, возможно для экономии бумаги - предполагая что читатель читал все номера журнала и сориентируется. Я честно говоря сам долго догонял - вот статья с программой, в конце табличка с программой, а что с табличкой делать не понятно, так она ещё и в шестнадцатеричном виде представлена, перерыв весь журнал понял потом и даже разобрался в структуре написание программы в машинном коде! Правда об этом Я хотел позднее написать!

    - - - Добавлено - - -

    Цитата Сообщение от 0xDEAD Посмотреть сообщение
    Не знаю, откуда появилась мысль про "возмущение", но мне все-таки кажется, что PEEK и POKE - это команды BASIC, а не ассемблера. Или ошибаюсь?
    А смысл набивать бейсик вручную опкодами ассемблера, если сам ассемблер это и так делает автоматически - тоже с трудом понимаю.
    Дело в том, что уважаемый 0xDEAD, что программы в машинном коде и ассемблере отличаются - это первое! Второе: Ассемблер - это программа имеющая, доступ не ко всем командам процессора, а вот машинный код - совсем другое дело, даёт полный доступ абсолютно ко всем командам процессора, которые представлены в соответствующей литературе, описывающей команды процессора Z80! Как Вы ещё получите доступ к машинному коду, если не через POKE и PEEK?
    Последний раз редактировалось alex8418; 25.01.2023 в 02:27.

  3. #13

    Регистрация
    05.09.2007
    Адрес
    Орск
    Сообщений
    1,071
    Спасибо Благодарностей отдано 
    269
    Спасибо Благодарностей получено 
    1,245
    Поблагодарили
    370 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    диапазон #0000-#FFFF можно было представить в десятичном виде, потому что я думаю не все читатели статьи пока понимают, что FFFF в десятичном представлении это 65535
    Лучше учитесь читать в шестнадцатеричном виде числа, понятнее будет всё в дальнейшем.
    Цитата Сообщение от alex8418 Посмотреть сообщение
    что программы в машинном коде и ассемблере отличаются - это первое!
    А любопытно чем они отличаются?
    Цитата Сообщение от alex8418 Посмотреть сообщение
    Второе: Ассемблер - это программа
    Ассемблер это не программа, это представление команд процессора в виде, доступном(более понятном) для чтения человеком.
    А то, что вы называете ассемблером, это всего навсего компилятор, да и то, актуальные версии компиляторов, как правило, понимают недокументированные команды процессора
    Последний раз редактировалось LW; 25.01.2023 в 02:37.

  4. #14

    Регистрация
    18.07.2021
    Адрес
    г. Хмельницкий, Украина
    Сообщений
    105
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    Ассемблер - это программа имеющая, доступ не ко всем командам процессора, а вот машинный код - совсем другое дело
    Да?
    Понимаю, понимаю...

  5. #15

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    правда пользователь Bedazzle выложил ссылку в которой оператор OUT 32765 применяется, без цифры 16 после запятой - надо разобраться кто прав!
    Цифра 16 - это бит 4 значения, которое идет в порт. Этот бит переключает ПЗУ бейсика 48 или 128 (0 - 128, 1 - 48). Поскольку команда OUT реализована именно в 48м бейсике, то вывод в порт значений, где бит 4 равен нулю, подключит вместо 48го, который должен был остаться, 128й бейсик в неожиданном месте исполнения программы. В результате произойдет сбой.
    Цитата Сообщение от alex8418 Посмотреть сообщение
    Я так понимаю, что РОКЕ и PEEK в данном случае нужно применять в режиме BASIC 128 ?
    Можно 128, а можно (и лучше) набрать команду usr0 из 128го бейсика. В результате попадаешь в 48й, но 128К ОЗУ при этом не заблокировано (оно блокируется, если перейти в 48й бейсик из главного меню).
    Цитата Сообщение от alex8418 Посмотреть сообщение
    (будет разбираться программирование и в ассемблере и в машинном коде)!
    Программирование (не отладка/анализ существующих программ, а составление новых!) в машинном коде сродни особо тяжелой форме мазохизма. Этим можно заняться, составляя какие-нибудь ооочень коротенькие программы на десяток команд, чтобы развлечься и получить развитие. Но для практической цели, т.е. для составления сколько-нибудь сложных и полезных программ или игр, совершенно бессмысленно. Если уж программировать на Спектруме - то на ассемблере.

    И вообще, в машинном коде лучше программировать не из бейсика, а из хорошего отладчика с дизассемблером, такого, как STS. Там не надо мучаться переводить из шестнадцатеричной системы в десятичную и обратно. И еще там сразу можно посмотреть, что получилось "напрограммировать", исполнить его пошагово и т.д.

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

    Reobne(25.01.2023)

  6. #16

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    Ассемблер - это программа имеющая, доступ не ко всем командам процессора, а вот машинный код - совсем другое дело, даёт полный доступ абсолютно ко всем командам процессора, которые представлены в соответствующей литературе, описывающей команды процессора Z80!
    Неожиданно вся соответствующая литература описывает команды процессора мнемониками ассемблера и только потом расшифровкой ))
    И даже если использовать древнейшие трансляторы ассемблера, даже в этом случае любую недокументированную команду можно набить как DEFB байт, байт,...

    Цитата Сообщение от alex8418 Посмотреть сообщение
    Как Вы ещё получите доступ к машинному коду, если не через POKE и PEEK?
    Также как это обычно делают программы для спектрума - загрузкой кодового блока и передачей ему управления. Загрузка в самом простом виде выполняется загрузкой файла кода из команд бейсика. В более извращённом продвинутом - кодовый блок загрузчика впихивается в тело бейсик программы. Ну и естественно структура загрузчика зависит от того с ленты или диска производится загрузка.

    Цитата Сообщение от alex8418 Посмотреть сообщение
    диапазон #0000-#FFFF можно было представить в десятичном виде, потому что я думаю не все читатели статьи пока понимают, что FFFF в десятичном представлении это 65535
    Напротив если будете программировать в ассемблере под zx, забудьте как выглядят адреса и мнемоники в десятичном виде )) Практически все мониторы-отладчики и прочие используют шестнадцатеричное представление, поскольку оно намного удобнее для работы с маш-кодом.

    Ну и немного в тему страниц памяти.
    Запись в порт #7FFD (32765) имеет битовую структуру: %00BRSnnn,

    где nnn - номер страницы (биты 0-2 (0-7): изначально как правило 0),
    S - номер экрана (бит 3 (8): 0 - стандартный стр.5 , 1 - дополнительный стр.7),
    R - номер ПЗУ ( бит 4 (16): 1 - BASIC 48 , 0 - BASIC 128 ),
    B - блокировка 128 K ( бит 5 (32): 0 - доступно , 1 - заблокировано) - если заблокировать, то не разблокируется до перезагрузки.
    старшие биты 6,7 ставить в 0 ( в пентагоне, кае и других клонах могут использоваться для дополнительной памяти)

    В карте процессора страницы следуют:
    #0000 - #3FFF ( 0 -16383) - ПЗУ
    #4000 - #7FFF (16384 - 32767) - 5
    #8000 - #BFFF (32768 - 49151) - 2
    #C000 - #FFFF (49152 - 65535) - окно

    Если воткнуть в окно скажем 5-ю или 2-ю страницу, то она будет доступна сразу по двум адресам и по своему стандартному расположению и по окну.

    Запись в порт в Z80 на ассемблере производится командами:
    out (c),a ( есть также out(c),reg , где reg = a,b,c,d,e,h,l )
    out (n),a где n - короткий адрес порта. (не следует использовать для #7FFD)

    В случае OUT (C),A и подобными на самом деле запись A ведётся в порт с адресом в регистровой паре BC
    а в случае OUT (n),A старший байт адреса порта берется из самого A, то есть значение регистра A засылается в порт с адресом (A)*256+n

    В былые времена наплодили много программ, демок и т.п. использующих короткую адресацию по #xxFD вместо #7FFD, в результате на многих компах (с расширением памяти выше 128 особенно) эти программы вылетали со скрипом ))
    Последний раз редактировалось Dart Alver; 26.01.2023 в 04:27.

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

    Barmaley_m(30.01.2023)

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

  8. #17

    Регистрация
    15.05.2010
    Адрес
    Москва
    Сообщений
    64
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    1 сообщение
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за объемлющие ответы по теме машинных кодов для машины 128 килобайт, пользователям: Dart Alver, Barmaley_m, и даже пользователю LW; хорошо было бы посмотреть живые примеры применения оператора OUT 32765! Получилось, что тема переродилась из программирования на 48 килобайт машине в программирование на 128 килобайт машине! Ну это не страшно, исправим!

    - - - Добавлено - - -

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    Ну и немного в тему страниц памяти.
    Запись в порт #7FFD (32765) имеет битовую структуру: %00BRSnnn,

    out (c),a ( есть также out(c),reg , где reg = a,b,c,d,e,h,l )
    Dart Alver в этих строках Вы ошибки не допустили? Непонятна формула %00BRSnnn и какие такие значения a,b,c,d,e,h,l присваиваемые reg?

    - - - Добавлено - - -

    Цитата Сообщение от LW Посмотреть сообщение
    Лучше учитесь читать в шестнадцатеричном виде числа, понятнее будет всё в дальнейшем.

    Ассемблер это не программа, это представление команд процессора в виде, доступном(более понятном) для чтения человеком.
    А то, что вы называете ассемблером, это всего навсего компилятор, да и то, актуальные версии компиляторов, как правило, понимают недокументированные команды процессора
    Команда POKE понимает только десятичные числа и работает в встроенном BASIC спектрума, не требуя загрузки дополнительного ПО в машину! А почему тогда представление команд и компилятор имеет одно и тоже название? (НО КОМПИЛЯТОР - ЭТО ЖЕ ПРОГРАММА?)

  9. #18

    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,101
    Спасибо Благодарностей отдано 
    1,335
    Спасибо Благодарностей получено 
    322
    Поблагодарили
    151 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    хорошо было бы посмотреть живые примеры применения оператора OUT 32765!
    Для этого нужно в эмуляторе с отладчиком, поставить точку останова на запись в этот порт, и запускать всякие 128К программки.
    А когда программка тормознётся - долго и вдумчиво изучать что там только что делал код.

  10. #19

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от alex8418 Посмотреть сообщение
    Dart Alver в этих строках Вы ошибки не допустили? Непонятна формула %00BRSnnn и какие такие значения a,b,c,d,e,h,l присваиваемые reg?
    Хмм. Ну пожалуй про reg кривовато написал малость, не так надо было

    out (c),a ( есть также out(c),reg , где reg = a,b,c,d,e,h,l )

    а просто

    out(c),reg , где reg = a,b,c,d,e,h,l

    reg здесь это имя регистра (это не переменная а просто обозначение что параметром может быть один из регистров). Просто сократил чтобы не писать весь список : out (c),b , out (c),e и т.п.
    также как ld reg1,reg2 - куча различных инструкций с разными регистрами в качестве аргументов.


    А что непонятно в формуле %00BRSnnn ?
    Знак % означает число в двоичном виде. Соответственно всё что в него входит - это соответствующие биты числа

    Например этот код выставит по адресу #C000 страницу памяти с номером 7 :

    Код:
        ld bc,#7FFD
        ld a,#17
        out (c),a
                ; #17 = %00010111 -> 7-я страница (nnn=7), экран в 5-й странице (S=0),
                ;   ПЗУ BASIC 48 (R=1), порт не блокируется (B=0)
    - - - Добавлено - - -

    Цитата Сообщение от alex8418 Посмотреть сообщение
    хорошо было бы посмотреть живые примеры применения оператора OUT 32765!
    Хоть я уже бейсик позабыл напрочь, но если вам так нужен беспонтовый пример чего можно делать из бейсика, то вот :

    Код:
    10 CLEAR 45055
    20 DATA 0,1,3,4,6,7
    30 RESTORE 20
    40 GO SUB 1000 : RANDOMIZE USR 15619 : REM : LOAD "scr0" CODE 49152
    50 GO SUB 1000 : RANDOMIZE USR 15619 : REM : LOAD "scr1" CODE 49152
    60 GO SUB 1000 : RANDOMIZE USR 15619 : REM : LOAD "scr3" CODE 49152
    70 GO SUB 1000 : RANDOMIZE USR 15619 : REM : LOAD "scr4" CODE 49152
    80 GO SUB 1000 : RANDOMIZE USR 15619 : REM : LOAD "scr6" CODE 49152
    90 GO SUB 1000 : RANDOMIZE USR 15619 : REM : LOAD "scr7" CODE 49152
    200 DATA 33,0,192,17,0,64,1,0,27,237,176,201
    210 RESTORE 200
    220 FOR i=45056 TO 45056+11
    230 READ a : POKE i,a
    240 NEXT i
    300 RESTORE 20
    310 FOR i=0 TO 5
    320 GO SUB 1000
    330 RANDOMIZE USR 45056
    340 PAUSE 0 : NEXT i
    350 GO TO 300
    1000 READ a : OUT 32765,a+16 : RETURN
    Для работы примера нужно каким либо граф-редактором предварительно создать на диске 6 файлов скриншотов с расширением C (CODE) длиной 6912 байт : "scr0","scr1","scr3","scr4",scr6","scr7

    Програмка тупо грузит экраны по страницам памяти, создаёт совсем маленькую подпрограмку в кодах:
    Код:
    ld hl,#C000  ; 33,0,192
    ld de,#4000  ; 17,0,64
    ld bc,#1B00  ; 1,0,27
    ldir         ; 237,176
    ret          ; 201
    которая копирует со страницы в область отображаемого экрана.
    А потом циклически запускает эту програмку (новый запуск по нажатию любой клавиши), переключая страницы командой бейсика OUT.

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

    Barmaley_m(01.04.2023)

  11. #20

    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    14,289
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    202
    Спасибо Благодарностей получено 
    1,456
    Поблагодарили
    946 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dart Alver Посмотреть сообщение
    если вам так нужен беспонтовый пример чего можно делать из бейсика, то вот :
    я бы ещё и `теневой` экран задействовал, так сказать для показа всего функционала.
    а данные на страницы универсальней грузить в цикле, переменную можно добавить в имя файла.
    load "scr"+str$ A code
    ...........
    именно для basic128 out вообще не нужен, достаточно занести номер страницы в (23388) и он сам её выставит
    Последний раз редактировалось goodboy; 29.01.2023 в 12:48.

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Программирование на ассемблере
    от shuran33 в разделе Вектор
    Ответов: 341
    Последнее: 05.11.2025, 20:00
  2. Программирование на ассемблере
    от tnt23 в разделе Океан-240
    Ответов: 6
    Последнее: 30.10.2025, 12:56
  3. Ответов: 275
    Последнее: 16.12.2018, 23:01
  4. Продам книгу- AMIGA: программирование на ассемблере
    от Doctor Max в разделе Барахолка (архив)
    Ответов: 11
    Последнее: 01.03.2012, 00:35
  5. Интерфейс эмулятора в коде Z80
    от CityAceE в разделе Эмуляторы
    Ответов: 29
    Последнее: 15.09.2008, 20:23

Ваши права

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