
Сообщение от
jerri
В оригинале Принц персидский работал на 64к машинке.
и не жужжал.
А какая именно машинка имеется в виду? Коммодор, например? Ну да, работал. С постоянными подгрузками. БКшный грузится сразу весь, и больше диск не мучает, как я понимаю.

Сообщение от
jerri
присмотрись к движку Wolf48
там есть что почерпнуть.
От Alone Coder'а? Да, я в курсе, благо он основные решения разъяснил. Но у нас принципиальная разница в устройстве текстуры: у меня битовая карта, у него -- список столбцов одноцветных пикселей. Но я имею в виду, само собой.
- - - Добавлено - - -
Подумалось: поскольку я вольный копейщик, и свободное время у меня находится -- когда как, то выложу я исходники ключевых мест, чтобы интересующимся не приходилось возиться с дизассемблером, и гадать что зачем:
Код:
;
; trampoline for the dummy texture (r0 -- offset)
;
tramp1: add #dummy0 + 10, r0
clr -(sp)
mov -(r0), -(sp)
mov -(r0), -(sp)
mov -(r0), -(sp)
mov -(r0), -(sp)
br texc1
;
; trampoline for the half of dummy texture (r0 -- offset)
;
tramp2: add #dummy0 + 10, r0
clr -(sp)
mov -(r0), -(sp)
mov -(r0), -(sp)
br texc1
;
;
; draw the pixel column
; texture is 64 pixels high (8 bytes)
;
; r0 - scratch
; r1 - destination pointer (byte)
; r2 - destination column bit mask
; r3 - colors (low/high byte), pre-masked
; r4 - texture coordinate V delta
; r5 - (texture coordinate V fraction accumulator)
;
; stack -- texture terminated by #0;
; TODO run with aligned stack and terminate by tstb sp/beq exit
;
texc1: clr r5
10$: mov (sp)+, r0
beq 19$ ; exit
sec
11$: ror r0
beq 10$ ; next word
bcc 12$ ; if bit is 1 -- swap colors (TODO -- paired drawing rountine)
swab r3
12$: bicb r2, @r1
bisb r3, @r1
add #100, r1
bmi 18$ ; if reached the bottom of the screen -- exit
add r4, r5
bcc 12$
clc
br 11$
18$: tst (sp)+ ; unload stack until end of texture is found
bne 18$
19$: ret
Это текстурирование. Текстура кладётся на стек, и завершается нулевым словом. Используются все регистры. Для константы 100 (64.) регистра не хватило, увы. Основной фокус -- отсутствие счётчика битов. Вместо этого в сдвиговый регистр (r0) при первом сдвиге заталкивается единичный бит. И если он ушёл, то всё -- надо читать следующее слово (beq 10$).
Сам алгоритм масштабирований классический -- digital difference, то есть дробные приращения текстурной координаты.
- - - Добавлено - - -
Расчёт масштабирования. Ну тут классический алгоритм деления для младших моделей PDP, ничего такого:
Код:
;
; Calculate scale of 64-pixel texture to fit it into given pixel count
;
; r0 - pixel count
;
; returns:
; r0 - delta fraction
;
; TODO: 16-bit precision
calctexscale:
mov r1, -(sp)
mov r2, -(sp)
mov r3, -(sp)
mov #100000, r1 ; 64. * 256. * 2
clr r2
mov #16.,r3
1$: asl r1
rol r2
cmp r0, r2
bhi 2$
sub r0, r2
inc r1
2$: sob r3, 1$
mov r1, r0
asr r0
rol r3
swab r0 ; multiply fraction by 256 / 2
ror r3
rorb r0
bis #177, r0
mov (sp)+, r3
mov (sp)+, r2
mov (sp)+, r1
ret
Вот это нужно положить в r4 для текстурника.
- - - Добавлено - - -
Ах да, чуть не забыл: тут у меня 1 бит в текстуре означает инверсию цвета. Т.е. текстура хранится, как последовательность инверсий. Я планирую переделать в нормальный вид, а то так неудобно.
Извините за спам сообщениями