Код:
;22$:
; MOV (SP)+,R2
MOV R3,(R2)+ ;адрес для стирания
; MOV R1,R3
; ASL R3
MOV R1,(R2)+ ;ШИРИНА
MOV R0,(R2)+ ;
MOV R1,R3
MOV R0,3$+2
MOV R4,R0
ADD R0,R0
ADD #MASK,R0
MOV (R0),5$+2
; R0, R1 - рабочие регистры
; R2 - какой-то буфер для спрайтов
; R3 - счетчик столбцов
; R4 - сдвиг
; R5 - указатель на спрайт
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
MOV R0,(R2)+ ; R0 -> (R2)+
INC @#176640 ; Прирастить регистр адреса планов 1,2
BIC R0,R1 ; Оставить младшие части сдвинутых байт
SWAB R1
BIS R1,@#176642 ; (план 1,2) = (план 1,2) | R1
MOV R1,(R2)+ ; R1 -> (R2)+
SOB R3,11$ ; Цикл на R3 итераций
MOV (SP)+,@#176640
ADD #80.,@#176640
MOV (SP)+,R3
3$: DEC #0
BNE 22$; SOB R2,22$
;----------------------------------------------
6$:; MOV (SP)+,R5
; MOV (SP)+,R4
; MOV (SP)+,R3
MOV (SP)+,R2
MOV (SP)+,R1
MOV (SP)+,R0
; MTPS #0
RETURN
MASK:
.WORD ^B0000000000000000
.WORD ^B0000000100000001
.WORD ^B0000001100000011
.WORD ^B0000011100000111
.WORD ^B0000111100001111
.WORD ^B0001111100011111
.WORD ^B0011111100111111
.WORD ^B0111111101111111
.WORD ^B1111111111111111