Обновление. Перевел пятую главу.
Вид для печати
Обновление. Перевел пятую главу.
Шестая глава практически переведена, осталось немного причесать. Однако, в первый раз меня подвел встроенный ассемблер эмулятора ZX Spin. Ругается на строчку ld a,(ix), выдает "Invalid combination of opcode and operands". Не понимаю что его смущает в данной конструкции. Все же верно: загрузить в аккумулятор значение, которое находится по адресу указанному в ix, так? Скомпилировал в sjasm'е и проверил в Spectaculator - все работает нормально. Может кто подскажет, что нужно подправить, чтобы в ZX Spin заработало (он кстати, гад еще и выражения вычислять не умеет).
Второй момент: я не понял что такое аббревиатура GP в комментариях к коду (Generic Point??). Коментарии я так же выделил жирным шрифтом и оставил непереведенными. Прошу помочь с этим.
Листинг программы из этой главы в приложении.Вложение 54939
Спасибо за перевод! Набрал "простую игру" из второй главы...запустил ...вроде цвет поменялся и всё, курсор мигает и больше ничего...
Участок кода из-за которого не работало:
; Initialise coordinates.
ld hl,21+15*256 ; load hl pair with starting coords. эта начальная координата по x, оставил ld hl,21 и все заработало.
ld (plx),hl ; set player coords.
call basexy ; set the x and y positions of the player.
call splayr
Какой ещё курсор? :/
Скормил это sjasm-у, скомпилировалось. Запускаю в эмуле - чёрный экран с треугольничком, управляется цифровыми клавишами.
Код:DEVICE ZXSPECTRUM48
org 25000
; Устанавливаем черный экран.
ld a,71 ; белые чернила (7) на черной бумаге (0),
; яркость (64).
ld (23693),a ; устанавливаем наши цвета.
xor a ; быстрый способ загрузить 0 в аккумулятор.
call 8859 ; устанавливаем постоянный цвет бордюра.
; Настраиваем нашу графику.
ld hl,blocks ; адрес данных UDG.
ld (23675),hl ; переменная теперь указывает на него.
; ОК, начнем игру.
call 3503 ; Процедура ПЗУ – очищает экран, открывает канал 2.
; Инициализация координат.
ld hl,21+15*256 ; загружаем в hl начальные координаты.
ld (plx),hl ; устанавливаем координаты игрока.
call basexy ; устанавливаем координаты x,y игрока.
call splayr ; выводим изображение игрока.
; Здесь основной цикл.
mloop equ $
; Стираем изображение игрока.
call basexy ; устанавливаем координаты x,y игрока.
call wspace ; выводим пробел поверх изображения игрока.
; Теперь после стирания мы можем передвигать игрока, перед тем как вывести
; его по новым координатам.
ld bc,63486 ; группа клавиш 1-5/порт джойстика 2.
in a,(c) ; смотрим какие клавиши нажаты.
rra ; крайний бит = клавиша 1.
push af ; запоминаем значение.
call nc,mpl ; если была нажата, двигаем влево.
pop af ; восстанавливаем аккумулятор.
rra ; следующий бит (значение 2) = клавиша 2.
push af ; запоминаем значение.
call nc,mpr ; если была нажата, двигаем вправо.
pop af ; восстанавливаем аккумулятор.
rra ; следующий бит (значение 4) = клавиша 3.
push af ; запоминаем значение.
call nc,mpd ; если была нажата, двигаем вниз.
pop af ; восстанавливаем аккумулятор.
rra ; следующий бит (значение 8) считывает клавишу 4.
call nc,mpu ; если была нажата, двигаем вверх.
; После передвижения игрока можем снова отобразить его.
call basexy ; устанавливаем координаты x,y игрока.
call splayr ; выводим игрока.
halt ; задержка.
; Переходим на начало основного цикла.
jp mloop
; Движение игрока влево.
mpl
ld hl,ply ; запомните, y координата по горизонтали!
ld a,(hl) ; каково текущее значение?
and a ; оно равно нулю?
ret z ; если да – мы не можем больше идти влево.
dec (hl) ; вычитаем 1 из координаты y.
ret
; Движение игрока вправо.
mpr
ld hl,ply ; запомните, y координата по горизонтали!
ld a,(hl) ; каково текущее значение?
cp 31 ; это правый край экрана (31)?
ret z ; если да - мы не можем больше идти вправо.
inc (hl) ; прибавляем 1 к координате y.
ret
; Движение игрока вверх.
mpu
ld hl,plx ; запомните, x координата по вертикали!
ld a,(hl) ; каково текущее значение?
cp 4 ; это верхний край экрана (4)?
ret z ; если да – не можем двигаться выше.
dec (hl) ; вычитаем 1 из координаты x.
ret
; Движение игрока вниз.
mpd
ld hl,plx ; запомните, x координата по вертикали!
ld a,(hl) ; каково текущее значение?
cp 21 ; это нижний край экрана (21)?
ret z ; если да – не можем двигаться ниже.
inc (hl) ; прибавляем 1 к координате x.
ret
; Установка координат x, y для позиции игрока.
; Эта процедура вызывается перед выводом и стиранием изображения игрока.
basexy
ld a,22 ; управляющий ASCII-код AT.
rst 16
ld a,(plx) ; x координата игрока.
rst 16 ; устанавливаем ее.
ld a,(ply) ; y координата игрока.
rst 16 ; устанавливаем ее.
ret
; Вывод игрока в текущей позиции печати.
splayr
ld a,69 ; голубые чернила (5) на черной бумаге (0),
; яркость (64).
ld (23695),a ; устанавливаем наши временные цвета.
ld a,144 ; ASCII-код для символа UGD 'A'.
rst 16 ; выводим изображение игрока.
ret
wspace
ld a,71 ; белые чернила (7) на черной бумаге (0), яркость (64).
ld (23695),a ; устанавливаем наши временные цвета.
ld a,32 ; символ пробела.
rst 16 ; выводим пробел.
ret
plx defb 0 ; x координата игрока.
ply defb 0 ; y координата игрока.
; UDG графика.
blocks defb 16,16,56,56,124,124,254,254 ; изображение игрока.
SAVESNA "program.sna",25000
Обновление. Перевел шестую главу. Еще раз попрошу людей разбирающихся помочь с переводом комментариев к коду:
GP x area.
GP y area.
set up GP y coord.
Сам я так и не разобрался для чего эти строчки, а самое главное, что здесь означает GP?