Skip to content

Commit

Permalink
Cursor sprite with mask
Browse files Browse the repository at this point in the history
  • Loading branch information
nzeemin committed Jul 22, 2023
1 parent da4a606 commit 81b5a03
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 60 deletions.
68 changes: 36 additions & 32 deletions MINER.MAC
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.TITLE MINER
.ASECT

MAXFLD = <18.*14.> ; Максимальный размер поля, с учётом двух пустых колонок слева/справа
MAXFLD = 18.*14. ; Максимальный размер поля, с учётом двух пустых колонок слева/справа
SCICON = 100023 ; Адрес на экране для смайлика
SCINDL = 100125 ; Адрес на экране для левого индикатора
SCBACK = 103604 ; Адрес на экране с которого начинается фон
Expand Down Expand Up @@ -156,12 +156,17 @@ GMLOOP:
MTPS R0
BNE 5$ ; Игра окончена?
JMP GMEWIN
; Нажата ли клавиша
; Ожидание нажатия клавиши
5$: CALL WTKEY
CMP #130, R0 ; 'X'
BNE 10$
JMP MENU ; Возврат в меню
10$: CMP #15504, R0 ; Клавиша влево?
; Нарисовать ячейку под курсором - без курсора
10$: PUSH R0
CALL DRCURC ; Рисуем ячейку под курсором
POP R0
; Анализ нажатой клавиши
CMP #15504, R0 ; Клавиша влево?
BEQ GOLEFT
CMP #15503, R0 ; Клавиша вправо?
BEQ GORIGHT
Expand Down Expand Up @@ -190,41 +195,35 @@ GMLOOP:
; знак вопроса - меняем на пусто
22$: BIC #140, R0
25$: MOVB R0, (R1) ; записываем изменение флагов
CALL DRCURC ; Рисуем ячейку под курсором и курсор
CALL DRCURC ; Рисуем ячейку под курсором
; Нарисовать курсор и вернуться в меню
GMCUR: CALL DRCURS ; Нарисовать курсор
BR GMLOOP
; Обработка клавиш-стрелок
GOLEFT:
MOV CURSRX, R0
BEQ GMLOOP
CALL DRCURS
DEC CURSRX
CALL DRCURS
BR GMLOOP
BR GMCUR ; Нарисовать курсор и вернуться в меню
GORIGHT:
MOV CURSRX, R0
INC R0
CMP GMEWID, R0
BLOS GMLOOP
CALL DRCURS
INC CURSRX
CALL DRCURS
BR GMLOOP
BR GMCUR ; Нарисовать курсор и вернуться в меню
GOUP:
MOV CURSRY, R0
BEQ GMLOOP
CALL DRCURS
DEC CURSRY
CALL DRCURS
BR GMLOOP
BR GMCUR ; Нарисовать курсор и вернуться в меню
GODOWN:
MOV CURSRY, R0
INC R0
CMP GMEHEI, R0
BLOS GMLOOP
CALL DRCURS
INC CURSRY
CALL DRCURS
GMLOON: BR GMLOOP
BR GMCUR ; Нарисовать курсор и вернуться в меню
; Клавиша пробел - открыть ячейку
GOSPC:
CALL CUR2FLD ; R1 = адрес в FIELD
Expand All @@ -233,16 +232,17 @@ GOSPC:
BIC #177740, R0 ; Стираем признак закрытости и флаги
MOVB R0, (R1)
PUSH R0
CALL DRCURC ; Рисуем ячейку под курсором и курсор
CALL DRCURC ; Рисуем ячейку под курсором
CALL DRCURS ; Нарисовать курсор
POP R0
BNE 10$ ; ячейка пуста?
; Ячейка пуста - раскрываем область вокруг неё
MOV CURSRX, R0
MOV CURSRY, R1
CALL OPENAREA
BR GMLOON
BR GMCUR ; Нарисовать курсор и вернуться в меню
10$: BIT #20, R0 ; Это мина?
BEQ GMLOON ; нет
BEQ GMCUR ; нет => Нарисовать курсор и вернуться в меню
JMP GMEOVR ; Это мина, игра окончена

; Текущая ячейка пуста и уже открыта, раскрываем свободную область вокруг неё, рекурсия
Expand Down Expand Up @@ -598,14 +598,13 @@ CELL2SCR:
ADD FSCADR, R1
RETURN

; Нарисовать ячейку под курсором и курсор
; Нарисовать ячейку под курсором
DRCURC:
CALL CUR2SCR ; R1 = адрес на экране
MOV R1, R3
CALL CUR2FLD ; R1 = адрес в FIELD
MOVB (R1), R0
CALL DRCELL ; Нарисовать ячейку
JMP DRCURS ; Нарисовать курсор
;JMP DRCELL ; Нарисовать ячейку

; Нарисовать ячейку игрового поля
; R0 = содержимое ячейки, R3 = адрес на экране
Expand Down Expand Up @@ -765,21 +764,25 @@ DRCURS:
CALL CUR2SCR
MOV R1, R3
MOV #SPCURS, R2
;JMP SPR16X
;JMP SPR16M

; Вывод спрайта 16 x 16 пикселей по XOR
; Вывод спрайта 16 x 16 пикселей с маской
; R2 = адрес спрайта, R3 = адрес на экране
; Портит R5, R2, R3, R0
SPR16X:
SPR16M:
MOV #16., R5 ; Количество строк
1$:
MOV R3, @#176640
MOV (R2)+, R0
XOR R0, @#176642 ; Первое слово
MOV @#176642, R0
BIC (R2)+, R0 ; Первое слово, маска
BIS (R2)+, R0 ; Первое слово, цвета
MOV R0, @#176642
INC R3
MOV R3, @#176640
MOV (R2)+, R0
XOR R0, @#176642 ; Второе слово
MOV @#176642, R0
BIC (R2)+, R0 ; Второе слово, маска
BIS (R2)+, R0 ; Второе слово, цвета
MOV R0, @#176642
ADD #<80.-1>, R3 ; next line
SOB R5, 1$
RETURN
Expand Down Expand Up @@ -863,7 +866,6 @@ STPALG:
STPALD:
MOV #PALETD, @#PPBACP
;BR PPSEND

; Подпрограмма передачи по каналу К2 массива параметров в ПП
PPSEND: MOV #PPBADR, R0
MOV #5, R1
Expand Down Expand Up @@ -916,9 +918,11 @@ CURSRY: .WORD 0 ; Позиция Y курсора
BOMBMK: .WORD 0 ; Сколько осталось мин, число для индикатора
;TIME: .WORD 0

ENDVAR = .
STACK:: .BLKW 20 ; Временный стек, используется при запуске

ENDSTK = .
; Игровое поле; со всех сторон обрамлено свободным местом минимум в 1 ячейку
FIELD0 = ENDVAR ; .BLKB 18. ; Пустое пространство перед полем
FIELD0 = ENDSTK ; .BLKB 18. ; Пустое пространство перед полем
FIELD = FIELD0 + 18. ; .BLKB MAXFLD ; Основная часть игрового поля
FIELD1 = FIELD + MAXFLD ; .BLKB 18. ; Пустое пространство после поля
;
Expand Down
51 changes: 49 additions & 2 deletions SpriteRotate/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,10 @@ static void Main(string[] args)
ProcessSprite(writer, $"SPN{i}", 2 + i * 16, 102, 16 / 8, 21);

ProcessSprite(writer, "SPBLOCK", 20, 58, 16 / 8, 16);
ProcessSprite(writer, "SPCURS", 38, 58, 16 / 8, 16);

ProcessSprite(writer, "SPBAD", 2, 76, 24 / 8, 24);
ProcessSprite(writer, "SPGOOD", 28, 76, 24 / 8, 24);
ProcessSprite(writer, "SPWIN", 54, 76, 24 / 8, 24);
ProcessSpriteWithMask(writer, "SPCURS", 38, 58, 16 / 8, 16);

writer.WriteLine();
writer.WriteLine("; END OF TILES.MAC");
Expand Down Expand Up @@ -95,6 +94,54 @@ static void ProcessSprite(StreamWriter writer, string label, int x0, int y0, int
writer.WriteLine("\t.EVEN");
}

static void ProcessSpriteWithMask(StreamWriter writer, string label, int x0, int y0, int cols, int rows)
{
writer.Write($"{label}:");

int perline = 4;
int count = 0;
for (int row = 0; row < rows; row++)
{
int y = y0 + row;
for (int col = 0; col < cols; col++)
{
if (count % perline == 0)
{
writer.WriteLine();
writer.Write("\t.WORD\t");
}
else
{
writer.Write(", ");
}

int x = x0 + col * 8;
int mask = 0;
int word = 0;
for (int b = 0; b < 8; b++)
{
word = word >> 1;
mask = mask >> 1;
if (bmp.GetPixel(x + b, y) != Color.FromArgb(255, 128, 128, 128))
{
mask |= (1 << 7) | (2 << 14);
int index = GetColorIndex(bmp, x + b, y);
word |= (index & 1) << 7;
word |= (index & 2) << 14;
}
}
writer.Write(EncodeOctalString2(mask));
writer.Write(",");
writer.Write(EncodeOctalString2(word));

count++;
}
}

writer.WriteLine();
writer.WriteLine("\t.EVEN");
}

static int GetColorIndex(Bitmap bmp, int x, int y)
{
Color color = bmp.GetPixel(x, y);
Expand Down
Binary file modified SpriteRotate/tiles.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
56 changes: 30 additions & 26 deletions TILES.MAC
Original file line number Diff line number Diff line change
Expand Up @@ -105,34 +105,34 @@ SP0:
.WORD 000401, 000000, 000400, 000000, 000401, 000000, 000000, 000000
.EVEN
SP1:
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 000400, 001403
.WORD 100601, 001403, 140700, 001403, 160741, 001403, 100600, 001403
.WORD 100601, 001403, 100600, 001403, 100601, 001403, 100600, 001403
.WORD 100601, 001403, 000400, 000000, 000401, 000000, 000000, 000000
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 000400, 003403
.WORD 100601, 003403, 140700, 003403, 160741, 003403, 100600, 003403
.WORD 100601, 003403, 100600, 003403, 100601, 003403, 100600, 003403
.WORD 100601, 003403, 000400, 000000, 000401, 000000, 000000, 000000
.EVEN
SP2:
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 170760, 007417
.WORD 174771, 017437, 034470, 016034, 000401, 016034, 000400, 007417
.WORD 140701, 003407, 170760, 000401, 074571, 000000, 174770, 017437
.WORD 174771, 017437, 000400, 000000, 000401, 000000, 000000, 000000
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 170760, 017417
.WORD 174771, 037437, 034470, 036034, 000401, 036034, 000400, 017417
.WORD 140701, 007407, 170760, 001401, 174571, 000000, 174770, 037437
.WORD 174771, 037437, 000400, 000000, 000401, 000000, 000000, 000000
.EVEN
SP3:
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 170760, 007417
.WORD 170761, 017437, 000400, 016034, 000401, 016034, 140700, 007417
.WORD 140701, 007417, 000400, 016034, 000401, 016034, 174770, 017437
.WORD 174771, 007417, 000400, 000000, 000401, 000000, 000000, 000000
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 170760, 017417
.WORD 170761, 037437, 000400, 036034, 000401, 036034, 140700, 017417
.WORD 140701, 017417, 000400, 036034, 000401, 036034, 174770, 037437
.WORD 174771, 017417, 000400, 000000, 000401, 000000, 000000, 000000
.EVEN
SP4:
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 034470, 016034
.WORD 034471, 016034, 034470, 016034, 034471, 016034, 174770, 017437
.WORD 174771, 017437, 000400, 016034, 000401, 016034, 000400, 016034
.WORD 000401, 016034, 000400, 000000, 000401, 000000, 000000, 000000
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 034570, 016074
.WORD 034571, 016074, 034570, 016074, 034571, 016074, 174770, 017477
.WORD 174771, 017477, 000400, 016074, 000401, 016074, 000400, 016074
.WORD 000401, 016074, 000400, 000000, 000401, 000000, 000000, 000000
.EVEN
SP5:
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 170760, 017437
.WORD 170761, 017437, 070560, 000000, 070561, 000000, 170760, 007417
.WORD 170761, 007417, 000400, 016034, 000401, 016034, 000400, 016034
.WORD 174771, 017437, 174770, 007417, 000401, 000000, 000000, 000000
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 170760, 017477
.WORD 170761, 017477, 070760, 000000, 070761, 000000, 170760, 007437
.WORD 170761, 007437, 000400, 016074, 000401, 016074, 000400, 016074
.WORD 174771, 017477, 174770, 007437, 000401, 000000, 000000, 000000
.EVEN
SP6:
.WORD 177124, 077525, 000400, 000000, 000401, 000000, 000760, 000017
Expand Down Expand Up @@ -238,12 +238,6 @@ SPBLOCK:
.WORD 000000, 000000, 000000, 000000, 040000, 040000, 000000, 000000
.WORD 000000, 000000, 000000, 000000, 002000, 002000, 000000, 000000
.EVEN
SPCURS:
.WORD 000000, 000000, 000374, 000177, 000006, 000300, 000002, 000200
.WORD 000002, 000200, 000002, 000200, 000002, 000200, 000002, 000200
.WORD 000002, 000200, 000002, 000200, 000002, 000200, 000002, 000200
.WORD 000002, 000200, 000002, 000200, 000006, 000300, 000374, 000177
.EVEN
SPBAD:
.WORD 177777, 177777, 177777, 177777, 177777, 177777, 001653, 000252
.WORD 140352, 001527, 076001, 140325, 001653, 177400, 140752, 101527
Expand Down Expand Up @@ -277,5 +271,15 @@ SPWIN:
.WORD 177775, 173777, 177574, 177776, 165777, 177603, 157777, 173777
.WORD 177777, 167777, 077777, 177777, 137377, 177777, 177777, 177777
.EVEN
SPCURS:
.WORD 000000,000000, 000000,000000, 176374,000374, 077577,000177
.WORD 003006,000006, 140300,000300, 001002,000002, 100200,000200
.WORD 001002,000002, 100200,000200, 001002,000002, 100200,000200
.WORD 001002,000002, 100200,000200, 001002,000002, 100200,000200
.WORD 001002,000002, 100200,000200, 001002,000002, 100200,000200
.WORD 001002,000002, 100200,000200, 001002,000002, 100200,000200
.WORD 001002,000002, 100200,000200, 001002,000002, 100200,000200
.WORD 003006,000006, 140300,000300, 176374,000374, 077577,000177
.EVEN

; END OF TILES.MAC

0 comments on commit 81b5a03

Please sign in to comment.