Задача хоть что-то понять.)))))))
Нет, ну я не только на кнопку джойстика умею жать.
Я, так-то, представляю, что есть память: ПЗУ и ОЗУ, всему этому дано какие-то цифровое пространство от нуля до скольки-то (в двоичной и шестнадцатеричной системах счисления худо-бедно считать тоже умею), где-то в ОЗУ есть рабочие области под экран и UDG. Есть процессор, в процессоре есть регистры, в которых можно оперировать с числами, загруженными из памяти, и в память их потом помещать, иногда - с каким-то видимым или слышимым результатом. Есть какие-то порты, вот они - вообще понятия не имею, как работают и как адресуются...
Спектрумисты оперируют командами POKE и PEEK с какими-то числовыми значениями, и каким-то чудом что-то печатается на принтер, устанавливается безлимитная жизнь в играх, исполняется подпрограмма в машинных кодах, издаётся звук и мерцает BORDER и т.п. А что они сделали - мне не прочесть.
Как они обратились к порту? И как он устроен? Как различить: считали что-то из ОЗУ, ПЗУ, из регистра процессора или порта? Как вообще что-то понимать? И чтобы хорошим языком описано - вот такую книгу хочу.
Как пример - я не понимаю, например, это:
Оригинал тут:
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, которое я понимаю. К примеру... могу так (и только так):
(условные обозначения возьму, как в книге "Как написать игру для ZX Spectrum": подчёркнутый символ - пользовательская графика (UDG, User Defined Graphic), "ПППП" - здесь "П" - это пробел).10 POKE USR "A" + 4, 255
20 PRINT "A"
Могу понять, как использовать это в распространённом примере с бегущей строкой:
(такую странную строку я соорудил для того, чтобы использовать её в следующем, уже моём авторском примере).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
Я действительно могу и сам сделать что-то своё, корявое и не слишком сложное, но работающее. На основе второго примера. Хоть я и тугодум, но пока не законченный дурак:
Это пока наибольшее, что я могу сделать на ZX Spectrum. Собственно, благодаря этой ветке родилась моя первая игра для ZX Spectrum.))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
При этом я не до конца понимаю смысл команд PEEK и POKE, машинный код и архитектуру ZX Spectrum. Но вы видите, что я не просто скучающий тролль (хотя иногда и это тоже). Подскажите доступную книгу.
- - - Добавлено - - -
Вот такая у меня головная боль, словом...





). Подскажите доступную книгу.
Ответить с цитированием