Skip to content

Instantly share code, notes, and snippets.

@svofski
Last active July 16, 2022 21:56
Show Gist options
  • Save svofski/1623c1468a7a90d91d3b797622b19bdc to your computer and use it in GitHub Desktop.
Save svofski/1623c1468a7a90d91d3b797622b19bdc to your computer and use it in GitHub Desktop.
512x256 4 colours demo
; Вектор-06ц
;
; Пример рисования в режиме 512x256 4 цвета
;
.project test512-4col.rom
.tape v06c-rom
.encoding cp1251
rastint .equ 38h ; прервывание обратного хода луча
.org 100h
; стандартная точка входа .rom файла
di ; запретить прерывания
xra a
out 10h ; выключить квазидиск
Restart:
lxi sp, $100 ; инициализировать указатель стека
mvi a, 0c9h ; код инструкции RET
sta rastint ; инициализировать обработчик RST7
mvi a, 0c3h
sta 0
lxi h, Restart
shld 1
call clrscr ; очистить экран
ei
hlt
; настроить палитру и включить режим 512 точек
lxi h, palette + 15
call colorset
; нарисуем четыре цветных прямоугольничка цветами 0, 1, 2, 3
mvi d, 32
mvi l, $90
mvi b, 0
boxes:
; выделяем бит 4 и расширяем знак
; a = (d & 8) ? 0 : 255
mvi a, 8
ana d
rar \ rar \ rar \ rar \ sbb a
; старший бит цвета -> плоскости 8, C
mvi h, $80
mov m, a
mvi h, $c0
mov m, a
; a = (d & 4) ? 0 : 255
mvi a, 4
ana d
rar \ rar \ rar \ sbb a
; младший бит цвета --> плоскости A, E
mvi h, $a0
mov m, a
mvi h, $e0
mov m, a
inr l
dcr d
jnz boxes
; три маленькие диагонали
diagonals:
mvi a, $80 ; бит пикселей x = 0, 1
sta $e080 ; красный пиксель x = 0, y = $80
sta $a081 ; красный пиксель x = 1, y = $81
sta $c180 ; зеленый пиксель x = 16, y= $80
sta $8181 ; зеленый пиксель x = 17, y= $81
sta $c280 \ sta $e280 ; синий x = 32, y = $80
sta $8281 \ sta $a281 ; синий x = 32, y = $81
rrc ; бит пикселей x = 2, 3
sta $e082
sta $a083
sta $c182
sta $8183
sta $c282 \ sta $e282
sta $8283 \ sta $a283
rrc
sta $e084
sta $a085
sta $c184
sta $8185
sta $c284 \ sta $e284
sta $8285 \ sta $a285
; все сделали, стоп
di \ hlt
; Область временного хранения SP
__savedsp .dw 0
; Очистка всей экранной области
clrscr
di
lxi h,0
dad sp
shld __savedsp
lxi sp, 0
lxi b, 0
lxi d, $1000
_clrscr_1:
push b
push b
push b
push b
dcx d
mov a, d
ora e
jnz _clrscr_1
lhld __savedsp
sphl
ret
; Как работает режим 512x256
; Битовые плоскости по старшему разряду: 8 A C E
; Индекс палитры формируется так:
; Четные столбцы: [0,0,C,E]
; Нечетные столбцы: [8,A,0,0]
;
; Пример 1: однобитный экран в плоскостях A,C, 8,E - обычная память
;
; 8ACE
;
; Цвет 0 -> 0000 (все нули, бордюр то же)
; 0001 плоскость C = 0, E = 1 -> фон
; 1000 плоскость 8 = 1, A = 0 -> фон
; Цвет 1 -> 0010
; 0011
; 0100
; 1100
;
; Пример 2: 4 цвета
; Цвет 0 -> 0000
; Цвет 1 -> 0001
; -> 0100
; Цвет 2 -> 0010
; -> 1000
; Цвет 3 -> 0011
; -> 1100
;
;
;
; index & 03
; 8 A C E
; x x 0 0 0
; x x 0 1 1
; x x 1 0 2
; x x 1 1 3
; index & 0c
; 0 0 x x 0
; 0 1 x x 1
; 1 0 x x 2
; 1 1 x x 3
WHITE .equ 377q
RED .equ 007q
GREEN .equ 070q
BLUE .equ 300q
C0 .equ WHITE
C1 .equ RED
C2 .equ GREEN
C3 .equ BLUE
palette
color_4
.db C0 ; 0 = все нули: бордюр и когда все плоскости в 0
.db C1
.db C2
.db C3
.db C1
.db 0
.db 0
.db 0
.db C2
.db 0
.db 0
.db 0
.db C3
.db 0
.db 0
.db 0
; палитра для однобитного цвета в плоскости C,A
color_1
.db C0 ; 0 = все нули: бордюр и когда все плоскости в 0
.db C0 ; xx11
.db C1 ; xx10
.db C1
.db C1
.db 0
.db 0
.db 0
.db C0
.db 0
.db 0
.db 0
.db C1
.db 0
.db 0
.db 0
; h points to palette + 15
colorset:
mvi a, 88h
out 0
mvi c, 15
colorset1:
mov a, c
out 2
mov a, m
out 0Ch
dcx h
out 0Ch
out 0Ch
dcr c
out 0Ch
out 0Ch
out 0Ch
jp colorset1
; включить режим 512 точек
mvi a, $10
out 2
; сбросить прокрутку
mvi a, 255
out 3
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment