Написал вывод спрайта с произвольными координатами.
Образ .bkd
Платформу поджал в пропорциях 5:8 и подрисовал чтобы красиво было:
Процедура XY - преобразование координат в адрес экрана и маску начального пикселя.
Процедура DRAWSPRITE16 - вывод спрайта 16 точек высотой. Ну или можно такие высокие спрайты разбивать на два (по 8 точек в высоту каждый), тогда процедура немного упростится.
SCREEN - начальный адрес игрового поля (у меня 47402). То бишь координаты не абсолютные для всего экрана, а относительные внутри игровой области.
Ещё для оптимизации можно подумать вот над чем:Код:MOV #45.,R1 ; x coord MOV #19.,R2 ; y coord CALL XY ; get screen address and pencil mask MOV #PLATFORM,R1 ; sprite address MOV #25.,R5 ; sprite width in pixels CALL DRAWSPRITE16 HALT ; subroutine: calculate address from x (R1) and y (R2) ; returns screen addres in R2 and pencil mask in R0 XY: SWAB R2 MOV R1,R0 BIC #7,R0 BIS R0,R2 ASR R2 ASR R2 ADD #SCREEN,R2 ; screen address BIC #177770,R1 ASL R1 MOV DOTS(R1),R0 ; pencil mask RET DOTS: .WORD 2,10,40,200,1000,4000,20000,100000 ; subroutine: draw sprite 16 pixels high ; input: ; R0 - pencil mask, R1 - sprite address, ; R2 - screen address, R5 - sprite width in pixels DRAWSPRITE16: 1: MOV R2,-(SP) ; save screen address MOV #100,R4 2: MOV (R1)+,R3 ; word to rotate CLC ; draw a column of points 3: ROL R3 BCC 31 ; if zero skip next command BIS R0,(R2) ; draw 1st bit of dot CLC 31: ROL R3 BCC 32 CLC ROR R0 BIS R0,(R2) ; draw 2nd bit of dot ASL R0 32: ADD R4,R2 ; next row of the screen TST R3 ; no more dots? BNE 3 MOV (SP),R2 ADD #1000,R2 INC PC ; repeat twice BR 2 MOV (SP)+,R2 ; column is drawn, restore screen address ASL R0 ; move pencil ASL R0 BNE 4 MOV #2,R0 ; set pencil to the first point ADD #2,R2 ; increase screen address 4: DEC R5 ; switch to the next column BNE 1 ; all columns are drawn? RET PLATFORM: insert_file "sprites/platform01.raw" .EVEN
платформа состоит из верхней неизменной части и нижней анимированной. Действительно тогда стоит разбить платформу на 2 спрайта и выводить их разными процедурами. Если на каждом кадре объекты могут сдвигаться только на 1 пиксель, то неанимированные спрайты можно не перерисовывать целиком, а просто сдвигом на экране обновлять. А вот с анимированными сложней: придётся стирать старый спрайт и рисовать поверх новый. Благо, это можно делать поточечно, то есть мерцания из-за стирания старого спрайта не будет.





Ответить с цитированием