Мож ему без сохранения надо. Мож ему токенами удобнее набивать. ;)
Вид для печати
С рамдиском есть подвох: если на него много записать, то сохранения будут портиться. Что-то в духе "каталог рамдиска повстречается с содержимым рамдиска и начнут затирать друг друга". Он вроде растёт навстречу типа стека.
Не помню где читал про это, может в описании ошибок пзу128.
Ну экран 6912 байт. 10-12 экранов влезет в рам диск
В ZX Like Pascal для этого имеются встроенные операторы WindowGet, WindowPut и WindowSet.
Но если надо на ассемблере, то вот они:
Код:
; ===== _window_get_put =====
; сохранение окна в памяти
; вход: нет
; выход: нет
getimage ld de,addr_virt_screen
ld hl,col_window
ldi
ldi
ldi
ldi
ld hl,(col_window) ; l=col_window, h=row_window
ld a,(height_window)
ld b,a
getimage_01 push bc
push hl
LD A,H ; расчет адреса первого байта знакоместа в HL
RRCA
RRCA
RRCA
AND A,224
ADD A,L
LD L,A
LD A,H
AND 24
OR 64
LD H,A
dup 8
push hl
ld bc,(width_window)
ld b,0
ldir
pop hl
inc h
edup
pop hl
inc h
pop bc
djnz getimage_01
; +++++ _flag_attr_window +++++
ld hl,(col_window) ; l=col_window, h=row_window
ld a,(height_window)
ld b,a
getimage_02 push bc
push hl
LD A,H ; расчет адреса атрибутов знакоместа в BC
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR L
LD C,A
ld h,b
ld l,c
ld bc,(width_window)
ld b,0
ldir
pop hl
inc h
pop bc
djnz getimage_02
; ----- _flag_attr_window -----
ret
; вывод окна из памяти
; вход: нет
; выход: нет
putimage ld hl,addr_virt_screen+2
ld de,col_window+2
ldi
ldi
ld de,(col_window) ; e=col_window, d=row_window
ld a,(height_window)
ld b,a
putimage_01 push bc
push de
LD A,D ; расчет адреса первого байта знакоместа в DE
RRCA
RRCA
RRCA
AND A,224
ADD A,E
LD E,A
LD A,D
AND 24
OR 64
LD D,A
dup 8
push de
ld bc,(width_window)
ld b,0
ldir
pop de
inc d
edup
pop de
inc d
pop bc
djnz putimage_01
; +++++ _flag_attr_window +++++
ld de,(col_window) ; e=col_window, d=row_window
ld a,(height_window)
ld b,a
putimage_02 push bc
push de
LD A,D ; расчет адреса атрибутов знакоместа в BC
RRCA
RRCA
RRCA
LD C,A
AND 31
OR 88
LD B,A
LD A,C
AND 252
OR E
LD C,A
ld d,b
ld e,c
ld bc,(width_window)
ld b,0
ldir
pop de
inc d
pop bc
djnz putimage_02
; ----- _flag_attr_window -----
ret
addr_virt_screen equ 57344 ; адрес вирт.экрана
col_window defb 0 ; столбец окна
row_window defb 0 ; строка окна
width_window defb 0 ; ширина окна
height_window defb 0 ; высота окна
Пока что до кода не добрался. Пилю арты и музло. Где-то половина работы проделана в этом направлении.
А вот что касается кода... Ну вроде бы Барсовы процедурки устраивают, правда на деле ещё не гонял.
Но помимо этого мне бы процедурку заполнения экрана заданными тайлами 8*8 (например дизеринг, или диагональные полосочки), но не просто заполнение, а OR.
Понели как хочу? Типа шоб предыдущие слайды были на месте, но они как бы покрывались дизерингом, а поверх накладывался следующий слайд, как диалоги диззи.
Надо бы ещё окантовку какую-то. Типа Bright 0 падающую тень. Или, фиг знает, синий пэйпер. Шото такое. Как в дос-окнах.
Во, такое реализовать хочется в виде комикса.
https://youtu.be/NpNTAf1gAho?t=14
В смысле сам принцип отображения слайдов
- - - Updated - - -
музон уже готов. Осталось арты дорисовать... ну и запихнуть в прогу как-то.
Делай спрайтами тогда, а не экранами.
Всё ещё рисую арты. И всё меньше верую в то, что оно уместится в память, если не использовать хотя бы RLE-компрессию.