Код:
PTSPR:
; R5 - указатель на спрайт
MOV R0,-(SP)
MOV R1,-(SP)
1$:
4$: CALL XYTOSC ; R3 адрес видеобуф. R4.. сдвиг
MOV R3, @#176640
MOV (R5)+,R0 ; размеры спрайта
CLR R1
BISB R0,R1 ; ширина спр
BIC #177400, R1
SWAB R0
BIC #177400, R0 ;высота спр
MOV R1,R3
MOV R0,3$+2
MOV R4,R0
ADD R0,R0
ADD #MASK,R0
MOV (R0),5$+2
22$: MOV R3,-(SP) ; Сохранить R3 на стеке
MOV @#176640,-(SP) ; Сохранить регистр адреса планов 1,2 на стеке
11$:
CLR R0 ; R0 = 0
MOV (R5)+,R1 ; (R5)+ -> R1
ASHC R4,R0 ; R0.R1 << R4
BIS R0,R1 ; R1 = (R5)+ rol R4
MOV R1,R0 ;
5$: BIC #7417,R0 ; Оставить старшие части сдвинутых байт 0x0f0f
BIS R0,@#176642 ; (план 1,2) = (план 1,2) | R0
INC @#176640 ; Прирастить регистр адреса планов 1,2
BIC R0,R1 ; Оставить младшие части сдвинутых байт
SWAB R1
BIS R1,@#176642 ; (план 1,2) = (план 1,2) | R1
SOB R3,11$ ; Цикл на R3 итераций
MOV (SP)+,@#176640
ADD #80.,@#176640
MOV (SP)+,R3
3$: DEC #0
BNE 22$;
;----------------------------------------------
6$:
MOV (SP)+,R1
MOV (SP)+,R0
RETURN
;----------------------------------------------------------------
MASK:
.WORD ^B0000000000000000
.WORD ^B0000000100000001
.WORD ^B0000001100000011
.WORD ^B0000011100000111
.WORD ^B0000111100001111
.WORD ^B0001111100011111
.WORD ^B0011111100111111
.WORD ^B0111111101111111
.WORD ^B1111111111111111
;----------------------------------------------------------------
; Подпрограмма: преобразовать координаты X,Y в адрес на экране R3 и смещение R4
; Вход: R3 = Y R4=X)
; Выход: R3 = адрес на экране, R4 = смещение 0..7
;----------------------------------------------------------------
XYTOSC:
MOV R0,-(SP)
MOV R2,-(SP)
MOV @#SCRADR,R0 ;начало видеопамяти
2$: MOV R4, R2 ; берём X
ASR R2
ASR R2
ASR R2 ; получаем номер байта в строке
ADD R2, R0 ; получили готовый адрес на экране
BIC #177770, R4 ; оставляем только смещение 0..7
MOV R3,R2
BIC #177400, R3 ; байт Y теперь в нижнем байте R3
MUL #80.,R2
ADD R0,R3
1$:
MOV (SP)+,R2
MOV (SP)+,R0
RETURN
;----------------------------------------------------------------