Просмотр полной версии : Машкод из Бейсика.
Есть ли хорошая русскоязычная (или хорошо переведённая на русский) книга о работе на низком уровне из Бейсика? Или про машкод и ассемблер вместе, но тоже грамотно написанная или грамотно переведённая.
- - - Добавлено - - -
PS Логан переведён плохо.
- - - Добавлено - - -
Не так вопрос формулирую. Правильно - "какая книга лучшая?".
null_device
14.09.2016, 22:03
книга о работе на низком уровне из Бейсика?
Звучит, как - изучаем асемблер на бейсике.
На моей памяти, было несколько книжек издательства "Питер": "...для пользователей и программистов" и "Как написать игру для zx-spectum...", ну и перевод фирменного мануала: "Микропроцессорный комплект Z80. Книга 1".
Звучит, как - изучаем асемблер на бейсике.
Я так понимаю, без Ассемблера это через POKE....PEEK делается. Ant Attack так написана вроде. И не только.
Spectramine
15.09.2016, 15:08
По мне, лучшая книга в этом плане - трехтомник Инфоркома по программированию в машинных кодах и на языке Ассемблера. Всё изложено очень доступно.
null_device
15.09.2016, 18:40
Sinner, на заре жизни платформы, частенько писались программы использующие вызов машинно-кодовых процедур из бесик программы (disasters park - например).
без Ассемблера это через POKE....PEEK делается. Ant Attack так написана вроде
Что под этим подразумевается? Данные операторы осуществляют обмен данными в памяти. Если, после этого, откуда-то с этого адреса вызвается инструкция USR adr, по сути это то же выполнение машинно-кодовых процедур.
Alex Rider
15.09.2016, 23:26
Есть ли хорошая русскоязычная (или хорошо переведённая на русский) книга о работе на низком уровне из Бейсика?
Прям вот отдельной книги про взаимодействие BASIC'а ми машколда не припомню. В 100500 разных мест описаны способы вызова машкода из BASIC'а и обмен данными. Вот тут (http://zxpress.ru/book.php?id=9), например, есть про функции пользователя. Есть еще всякоразные способы - каналы и потоки, обмен данными черезз переменные BASIC'а, подвешивание резидента (например, плеера AY-музыки) на прерывания, классический USR само собой. Можно пошукать линки. А какая задача решается?
А какая задача решается?
Задача хоть что-то понять.)))))))
Нет, ну я не только на кнопку джойстика умею жать.
Я, так-то, представляю, что есть память: ПЗУ и ОЗУ, всему этому дано какие-то цифровое пространство от нуля до скольки-то (в двоичной и шестнадцатеричной системах счисления худо-бедно считать тоже умею), где-то в ОЗУ есть рабочие области под экран и UDG. Есть процессор, в процессоре есть регистры, в которых можно оперировать с числами, загруженными из памяти, и в память их потом помещать, иногда - с каким-то видимым или слышимым результатом. Есть какие-то порты, вот они - вообще понятия не имею, как работают и как адресуются...
Спектрумисты оперируют командами POKE и PEEK с какими-то числовыми значениями, и каким-то чудом что-то печатается на принтер, устанавливается безлимитная жизнь в играх, исполняется подпрограмма в машинных кодах, издаётся звук и мерцает BORDER и т.п. А что они сделали - мне не прочесть.
Как они обратились к порту? И как он устроен? Как различить: считали что-то из ОЗУ, ПЗУ, из регистра процессора или порта? Как вообще что-то понимать? И чтобы хорошим языком описано - вот такую книгу хочу.
Как пример - я не понимаю, например, это:
Подскажите - как правильно запускать LB на реальном спеектруме? (Феникс рев-1)
Пока пробую на эмуле - результат - вывыливается в режим 48
Пробую набрать - RANDOUMAIZE USR 15616 - пробую запустить "LB DEMO"- вывливается с ошибкой в строке 700
Для начала дай ссылку на образ диска, про который идет речь.
Вот тут (http://vtrdos.ru/system/LASERBAS.ZIP) рабочий образ. Алгоритм такой:
1. В TR-DOS: RUN "LASERBAS" - остановится с сообщением OK на строке 70 потому что в нем ошибка - неправильное имя файла.
2. В BASIC: NEW
3. В BASIC: RANDOMIZE USR 15616
4. В TR-DOS: RUN "DEMO LB."
Оригинал тут:
http://zx-pk.ru/threads/24541-laser-basic.html
А как узнали этот адрес для строки RANDOMIZE USR 15616 ? Как это посмотреть? А ведь в наборе программ из пакета Laser BASIC есть не только демо, но и игра, наборы спрайтов, спрайтогенератор. Как я узнаю их адреса?
Где что вообще находится в Спектрумах?? )))))))))
Чтобы ответить мне, надо понять, что я на сей момент умею на ZX Spectrum.
POKE USR применительно к заданию значка для UDG доступно описан в "Диалекты Бейсика для ZX Spectrum" и "Как написать игру для ZX Spectrum" (на языке BASIC) - обе издательства "Питер". И это единственное применение POKE, которое я понимаю. К примеру... могу так (и только так):
10 POKE USR "A" + 4, 255
20 PRINT "A"
(условные обозначения возьму, как в книге "Как написать игру для ZX Spectrum": подчёркнутый символ - пользовательская графика (UDG, User Defined Graphic), "ПППП" - здесь "П" - это пробел).
Могу понять, как использовать это в распространённом примере с бегущей строкой:
10 POKE USR "A" + 4, 255
20 LET B$ = "ППППППППППППППППППППППППП ППППППП": REM 32 probela
30 LET A$ = B$ + "ППППAПППППAППAППППAППППAППAП ППAПППAППППППППППППППAППППA ППППAo" + B$
40 FOR N=1 TO LEN A$ - 31
50 LET B$ = A$(N TO N+31)
60 PRINT AT 11, 0; B$: PAUSE 10
70 NEXT N
(такую странную строку я соорудил для того, чтобы использовать её в следующем, уже моём авторском примере).
Я действительно могу и сам сделать что-то своё, корявое и не слишком сложное, но работающее. На основе второго примера. Хоть я и тугодум, но пока не законченный дурак:
10 BORDER 0: PAPER 0: INK 7: CLS
20 POKE USR "A" + 4, 255
30 FOR i = 0 TO 7
40 READ N: READ K: POKE USR "B" + i, N: POKE USR "C" + i, K
50 NEXT i
60 DATA 0, 0: DATA 56, 4: DATA 84, 8: DATA 56, 16: DATA 56, 32: DATA 40, 16: DATA 108, 8: DATA 0, 4
70 CLS: LET B$ = "ППППППППППППППППППППППППП ППППППП": REM 32 probela
80 LET A$ = B$ + "ППППAПППППAППAППППAППППAППAП ППAПППAППППППППППППППAППППA ППППAo" + B$
90 LET SC = 0: PRINT AT 0, 0; INK 6; "SCORE: "; SC
100 PRINT AT 19, 0; INK 6; FLASH 1; "<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C<C"
110 PLOT 0, 79: DRAW 255, 0
120 LET Y = 11
130 LET Ground = 0
140 FOR N=1 TO LEN A$ - 31
150 LET B$ = A$(N TO N+31)
160 IF INKEY$ <> "" AND (Ground = 0 OR Ground <= N) THEN LET Y=Y-1: PRINT AT Y, 15; "B"
170 IF B$(16) = " " AND Y=11 THEN LET B$(16) = "B"
180 IF Y=11 AND B$(16)="A" THEN GO TO 240
190 IF Y=10 AND B$(16)="A" THEN LET SC = SC+1: PRINT AT 0, 7; INK 6; SC
200 IF Y=11 AND B$(16)="o" THEN LET B$= "B": LET SC= SC+9: GO TO 300
210 PRINT AT 11, 0; B$: PAUSE 10
220 IF Y=10 THEN PRINT AT Y, 15; " ": LET Y=11: LET Ground = N+2
230 NEXT N
240 PRINT AT 11, 0; B$(1 TO 15); AT 11, 15; INK 2; "X"; AT 11, 16; INK 7; B$(17 TO 32): PAUSE 60: CLS
250 PRINT AT 11, 11; INK 2; "YOU LOSE"; AT 12, 8; "YOUR SCORE IS "; SC; AT 13, 0; FLASH 1; "DO YOU WANT TO PLAY AGAIN? (Y/N)"
260 INPUT E$
270 IF (E$ = "Y" OR E$ = "y") THEN GO TO 70
280 IF (E$ = "N" OR E$ = "n") THEN GO TO 400
290 GO TO 250
300 PRINT AT 11, 0; B$; AT 10, 15; INK 6; "o": PRINT AT 0, 7; INK 6; SC: PAUSE 30
310 FOR N=1 TO 5
320 PRINT AT 11, 15; " "; AT 10, 15; " "; AT 9, 15; "B"; AT 7, 15; INK 6; "o": PAUSE 15
330 PRINT AT 7, 15; " "; AT 9, 15; " "; AT 11, 15; "B"; AT 10, 15; INK 6; "o": PAUSE 15
340 NEXT N
350 CLS: PRINT AT 11, 7; INK 4; "CONGRATULATIONS!"; AT 12, 12; "YOU WIN"; AT 13, 8; "YOUR SCORE IS "; SC; AT 14, 0; FLASH 1; "DO YOU WANT TO PLAY AGAIN? (Y/N)"
360 INPUT E$
370 IF (E$ = "Y" OR E$ = "y") THEN GO TO 70
380 IF (E$ = "N" OR E$ = "n") THEN GO TO 400
390 GO TO 360
400 CLS: PAUSE 200
Это пока наибольшее, что я могу сделать на ZX Spectrum. Собственно, благодаря этой ветке родилась моя первая игра для ZX Spectrum.))
При этом я не до конца понимаю смысл команд PEEK и POKE, машинный код и архитектуру ZX Spectrum. Но вы видите, что я не просто скучающий тролль (хотя иногда и это тоже ;) ). Подскажите доступную книгу.
- - - Добавлено - - -
Вот такая у меня головная боль, словом...
null_device
26.12.2016, 08:21
Sinner, выше уже давал ссылку на книгу "... для пользователей и программистов". В ней вполне доступным языком описана архитектура zx-spectrum и мнемоники машинно-кодовых процедур.
как узнали этот адрес для строки RANDOMIZE USR 15616
Как правило, все точки входа описаны в мануалах программ или "железок".
Применительно к вышенаписанному адресу - это одна из точек входа tr-dos, наряду с 15619 (в отечественной реализации beta disk interface). В данном случае, это не вызов машкода (с адреса 15616 располагается знакогенератор), а точка аппаратного захвата.
Правильно - "какая книга лучшая?".
ИМХО лучшее - это серия из 4х книг Step-by-Step Programming ZX Spectrum
Там очень интересный подход к обучению пользователя.
И сами подпрограммы вызываются не банальным USR ADR - а через DEF FN( c кучей параметров).
Вот только беда в том, что на русский их не переводили.
Но написано простым английским, читается легко и просто.
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrum-BookOne.pdf
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrum-BookTwo.pdf
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookThree.pdf
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookFour.pdf
- - - Добавлено - - -
Поправка, первая и вторая книги целиком про бейсик. Но пролистать советую.
Качество сканов хорошее, вполне можно скормить FineReader-у. Ну а следом переводчику.
И сами подпрограммы вызываются не банальным USR ADR - а через DEF FN( c кучей параметров).
А вот это интересно, спасибо.
- - - Добавлено - - -
Как правило, все точки входа описаны в мануалах программ или "железок".
Применительно к вышенаписанному адресу - это одна из точек входа tr-dos, наряду с 15619 (в отечественной реализации beta disk interface). В данном случае, это не вызов машкода (с адреса 15616 располагается знакогенератор), а точка аппаратного захвата.
Спасибо большое.
Спасибо большое всем, кто откликнулся. Всем-всем респект.
А вот это интересно, спасибо.
Способ как раз для использования функций в машкоде из Бейсика.
Очень странно что он не описан в фирменном мануале, и множестве литературы по программированию. В русскоязычной литературе не встречал вообще.
Наверно это одно из последствий увольнения ключевых разработчиков, в т.ч. Стива Виккерса (написавшего Бейсик).
Работает очень элегантно.
Определяется функция DEF FN f (x,y,z,a,s,d,f,g...) = USR адрес. Ессно по адресу должен быть код. ;)
Из программы вызывается как FN (параметры через запятую), и процедура в машкоде получает эти параметры!
В книгах по ссылке множество подпрограмм, например "залить область с координатами x,y,x1,y1 цветом z".
Потрясающе. Я когда-то тоже пытался освоить машкод, но писать с нуля - не осилил. Фиксированную процедуру типа "перенести 6912 байта оттуда туда" освоил легко.
А дальше как раз затык - как передать значение Бейсик-переменных машкоду не сообщалось нигде, везде унылое randomize usr.
Как верх прогресса была находка LET X = USR addr...
Способ как раз для использования функций в машкоде из Бейсика.
Очень странно что он не описан в фирменном мануале, и множестве литературы по программированию. В русскоязычной литературе не встречал вообще.
ZX-review полистай, было там про это.
вот ещё нашёл.
книжка прикладная графика стр.150
там кстати дальше очень хорошо расписано использование встроенного `калькулятора`
(по его байт коду инфы очень мало)
Жаль только в книге не нашлось описания кода на ассемблере, механизм приема данных от бейсика и распихивания по регистрам.
Можно попробовать дизасмить процедуры из книг, но мое знание ассемблера Z80 за последние двадцать лет только уменьшилось...
- - - Добавлено - - -
ZX-review полистай, было там про это.
Все когда-то доступные номера в 90е были прочитаны не раз. Не подскажешь в каком примерно номере, или хотя бы за какой год?
З.Ы. Проверил мануал 128к, вышедшего позже этих книг. Нет описания этой великолепной фичи. О_о
Синклер выпускал компьютер, который не знал до конца. Буржуй глупый.
З.Ы. Проверил мануал +3, та же фигня.
механизм приема данных от бейсика и распихивания по регистрам.
в системных переменных содержится адрес с которого хранятся переданные значения
дальше всё на усмотрение пользователя,
параметры сами в регистры непропишутся,
надо самому рассматривать/анализировать переданные данные
- - - Добавлено - - -
Синклер выпускал компьютер, который не знал до конца. Буржуй глупый.
BetaBasic1.7 - 1983г
http://savepic.ru/12578215.png
очередное изобретение велосипеда
в системных переменных содержится адрес с которого хранятся переданные значения
Да, но нигде в мануалах нет про то, что бейсик умеет как-то передавать значения в процедуру на машкоде.
Если бы это знали в начале 80х в Британии и в начале 90х у нас - количество гибридных бейсик/машкод игрушек было б +100500!!!
Игру класса Диззи таким методом сваять элементарно...
- - - Добавлено - - -
Ага, про бетабарсик я забыл. У меня к нему доступа не было, увы. Хотя в в моем маленьком городе искал...
Но всё-таки странно, что такая мегаполезная команда вообще не описана в мануалах.
нигде в мануалах нет про то, что бейсик умеет как-то передавать значения в процедуру на машкоде.
???
бейсик просто размещает в памяти значения переданных параметров,
точно также как и строку программы.
???
Вопрос - как вызванный стандартной командой RANDOMIZE USR код будет знать где лежат в памяти какие-то параметры?
Я когда-то издевался с POKE по нужным адресам перед вызовом USR, ессно тормозной вариант.
Вопрос - как вызванный стандартной командой RANDOMIZE USR код будет знать где лежат в памяти какие-то параметры?
в системных переменных содержится адрес с которого хранятся переданные значения
только не говори что они плохо расписаны в мануалах
Oleg N. Cher
26.12.2016, 23:02
Вот пример передачи параметров из Basic в машкод через USR:
59131
http://i.piccy_.info/i9/9fad41eae832801199db0283cbe70165/1482782516/32395/1065564/FILL_A.png
P.S. Смотрю с умилением, насколько сильна тяга писать именно на Бейсике. ;-)
только не говори что они плохо расписаны в мануалах
Переменные то расписаны, ага. DEFADD - но вот только в описании барсика нигде не говорится что DEF FN можно юзать для машкода.
"Попробуй догадайся" (С) ;)
Короче забавная история...
Последнее время таких много. Например про аппаратную возможность расширенного управления бипером и т.д.
- - - Добавлено - - -
насколько сильна тяга писать именно на Бейсике. ;-)
20 лет назад была тяга писать на всём. ;)
А сейчас просто ностальгия и вот удивление что можно было так делать.
Alex Rider
28.12.2016, 07:20
Переменные то расписаны, ага. DEFADD - но вот только в описании барсика нигде не говорится что DEF FN можно юзать для машкода.
А где, собственно, расписано, что RANDOMIZE можно и нужно юзать для машкода? DEF FN - способ создания именованного параметрического выражения, способного содержать любые функции. USR - функция, принимающая адрес машкода, вызывающая его и возвращающая значение BC. I have a pen, I have an apple... Совместное использование конструкций языка (дальше примеров, позволяющих понять конструкцию, of course) - это не к мануалам языка, а как раз-таки к книжкам с программерскими приемами типа сборника по графике от Инфоркома.
В книге "Элементарная графика" ИНФОКОМ, 1993, начиная со страницы 109, подробнейшим образом изложены принципы передачи параметров из DEF FN() в машинный код.
Примеры тоже там есть.
Smalovsky
04.02.2017, 12:19
Передача параметров в ассемблерные вставки (http://ivr.webzone.ru/articles/call_asm/index.htm)
Alex Rider
08.02.2017, 17:02
Странно, что Рощин не использует процедуры из ПЗУ для поиска переменных.
Smalovsky
12.11.2017, 14:54
Alex Rider, я в своей игре тоже не использовал поиск переменных из пзу. Я сделал свой метод передачи параметров через переменные.
У меня пять служебных переменных p1, p2, p3, p4, p5. А параметры передаются так:
10 let p1= 65
15 randomize usr ____
Странно, что Рощин не использует процедуры из ПЗУ для поиска переменных. Правильно делает, потому что ПЗУ может быть иным!
А по вопросу, заданному ТС, вот: Как написать игру на ассемблере для ZX Spectrum (https://zxpress.ru/book.php?id=2)
Как минимум, один из авторов здесь присутствует. Все вопросы ему...
Alex Rider
12.11.2017, 19:45
Правильно делает, потому что ПЗУ может быть иным!
Ну процедура поиска адреса переенной будет не на своем месте в одном из двух случаев:
В адресном пространстве 0-3fff лежит не 48 BASIC. Если не щелкать ROM специально, там после USR лежит ROM 48K.
BASIC перепахан настолько, что поплыли адреса процедур интерпретатора. Тогда вообще стремно запускать на такой машине машкод, интегрированный с BASIC'ом. А вдруг там другой формат хранения переменных для оптимизации?
Я имею в виду SE BASIC или OPEN SE BASIC - там вообще всё другое...
Для меня это дичь - совмещение Бейсика с Ассемблером, заодно и использование процедур ROM(хотя бывают исключения)
Alex Rider
13.11.2017, 17:44
Я имею в виду SE BASIC или OPEN SE BASIC - там вообще всё другое...
А там такой же формат хранения переменных?
А там такой же формат хранения переменных? В SE BASIC скорее всего такой же, а про OPEN SE BASIC не знаю, в описании не указано, код я не копал, хотя исходник общедоступен...
Вот ещё подходящая книга: Программирование в машинных кодах (http://www.twirpx.com/file/1743823/)
krotan, зачем такие замудрённые ссылки, где для скачивания требуется регистрация? На vtrdos же есть http://vtrdos.ru/book/P_MC_PDF.ZIP
ИМХО лучшее - это серия из 4х книг Step-by-Step Programming ZX Spectrum
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrum-BookOne.pdf
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrum-BookTwo.pdf
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookThree.pdf
https://wos.meulie.net/pub/sinclair/books/s/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookFour.pdf
- - - Добавлено - - -
Не качаются третья и четвёртая книги. Если есть возможность, прошу выложить их например в облако и дать ссылку.
SoftFelix
11.02.2018, 16:06
Не качаются третья и четвёртая книги. Если есть возможность, прошу выложить их например в облако и дать ссылку.
Вот тут (http://www.mmnt.net/db/0/14/lan.oxfordinspire.co.uk/pub/mirrors/worldofspectrum/books/), вроде, качаются (3 (ftp://lan.oxfordinspire.co.uk/pub/mirrors/worldofspectrum/books/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookThree.pdf) и 4 (ftp://lan.oxfordinspire.co.uk/pub/mirrors/worldofspectrum/books/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookFour.pdf)).
Не качаются третья и четвёртая книги
Вот тут еще есть: https://computerarchive.org/files/comp/books/ZX%20spectrum/
https://computerarchive.org/files/comp/books/ZX%20spectrum/Step-By-StepProg-a5c4822d2b269e700f516686a85b8c1b.pdf
https://computerarchive.org/files/comp/books/ZX%20spectrum/Step-By-StepProg-e60ec9ea41ccba7456eef581494fe848.pdf
Вот тут (http://www.mmnt.net/db/0/14/lan.oxfordinspire.co.uk/pub/mirrors/worldofspectrum/books/), вроде, качаются (3 (ftp://lan.oxfordinspire.co.uk/pub/mirrors/worldofspectrum/books/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookThree.pdf) и 4 (ftp://lan.oxfordinspire.co.uk/pub/mirrors/worldofspectrum/books/Step-By-StepProgrammingZXSpectrumAndZXSpectrum%2BGraphics-BookFour.pdf)).
Да, тут качаются, спасибо.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot