0,0 → 1,409 |
|
;========================================= |
; |
; Simple program to view ZX Spectrum |
; screen files. |
; 6912 bytes (*.scr, *.s) |
; and |
; 6929 bytes (*.$c) files are supported now. |
|
; Ïðîñòàÿ ïðîãðàììà äëÿ ïðîñìîòðà |
; ôàéëîâ ýêðàíîâ ZX Spectrum. |
; Ïîääåðæèâàþòñÿ ôàéëû ðàçìåðîì |
; 6912 áàéò (*.scr, *.s) |
; è |
; 6929 áàéò (*.$c). |
; |
; author: Oleksandr Bogomaz |
; e-mail: albom85@yandex.ru |
; site: http://albom06.boom.ru/ |
; |
;========================================= |
|
use32 |
org 0 |
db 'MENUET01' |
dd 1 |
dd _start |
dd _end |
dd _memory |
dd _stack |
dd _param |
dd 0 |
|
;========================================= |
|
_start: |
|
call mem_init |
call file_getsize |
call file_read |
call file_convert |
call window_draw |
|
_event_wait: |
|
mov eax, 10 |
int 0x40 |
|
cmp eax, 1 |
je __repaint_wnd |
|
cmp eax, 2 |
je __key |
|
cmp eax, 3 |
je __button |
|
jmp _event_wait |
|
__repaint_wnd: |
call window_draw |
jmp _event_wait |
|
|
__key: |
mov eax, 2 |
int 0x40 |
|
cmp ah, 27 |
jne _event_wait |
|
jmp __end |
|
jmp _event_wait |
|
__button: |
|
mov eax, 17 |
int 0x40 |
|
cmp ah, 1 |
jne _event_wait |
|
__end: |
call mem_free |
|
mov eax, -1 |
int 0x40 |
|
|
|
;========================================= |
|
window_draw: |
mov eax, 12 |
mov ebx, 1 |
int 0x40 |
|
xor eax, eax |
mov ebx, 10*65536+290 |
mov ecx, 10*65536+230 |
mov edx, 0x34ffffff |
mov edi, _app_title |
int 0x40 |
|
mov eax, 65 |
mov ebx, [dst] |
mov ecx, 256*65536 + 192 |
mov edx, 5*65536 + 5 |
mov edi, _palette |
mov esi, 8 |
mov ebp, 0 |
int 0x40 |
|
mov eax, 12 |
mov ebx, 2 |
int 0x40 |
|
ret |
|
;========================================= |
|
mem_init: |
|
mov eax, 68 |
mov ebx, 11 |
int 0x40 |
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, 6144 |
int 0x40 |
mov dword [src], eax |
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, 768 |
int 0x40 |
mov dword [atr], eax |
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, 256*192 |
int 0x40 |
mov dword [dst], eax |
|
ret |
|
;========================================= |
|
mem_free: |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, [src] |
int 0x40 |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, [atr] |
int 0x40 |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, [dst] |
int 0x40 |
|
ret |
|
;========================================= |
|
file_read: |
|
mov eax, 70 |
mov ebx, _in_f1 |
mov ecx, [src] |
mov [_in_f1+16], ecx |
int 0x40 |
|
mov eax, 70 |
mov ebx, _in_f2 |
mov ecx, [atr] |
mov [_in_f2+16], ecx |
int 0x40 |
|
ret |
|
;========================================= |
|
file_getsize: |
|
mov eax, 68 |
mov ebx, 12 |
mov ecx, 0x5000 |
int 0x40 |
mov dword [tmp], eax |
|
mov eax, 70 |
mov ebx, _in_f0 |
mov ecx, [tmp] |
mov [_in_f0+16], ecx |
int 0x40 |
|
mov [fsize], ebx |
|
mov eax, 68 |
mov ebx, 13 |
mov ecx, [tmp] |
int 0x40 |
|
cmp [fsize], 6929 |
jne _ok_size |
|
mov dword [_in_f1+4], 17 |
mov dword [_in_f2+4], 6144+17 |
|
_ok_size: |
|
ret |
|
;========================================= |
|
file_convert: |
|
xor eax, eax |
mov [I], eax |
mov [J], eax |
mov [K], eax |
mov [L], eax |
mov [M], eax |
mov [N], eax |
|
__J: |
__I: |
__K: |
__L: |
xor ebx, ebx |
mov eax, [J] |
shl eax, 0x0b ; eax * 2048 |
add ebx, eax |
mov eax, [K] |
shl eax, 0x08 ; eax * 256 |
add ebx, eax |
mov eax, [I] |
shl eax, 0x05 ; eax * 32 |
add ebx, eax |
add ebx, [L] |
add ebx, [src] |
|
xor eax, eax |
mov ah, [ebx] |
mov [C], ah |
|
__M: |
mov ah, [C] |
and ah, 128 |
shr ah, 7 |
mov [S], ah |
|
xor ebx, ebx |
mov eax, [J] |
shl eax, 0x08 ; eax * 256 |
add ebx, eax |
mov eax, [I] |
shl eax, 0x05 ; eax * 32 |
add ebx, eax |
add ebx, [L] |
add ebx, [atr] |
|
xor eax, eax |
mov ah, [ebx] |
mov [A], ah |
|
and ah, 64 |
cmp ah, 64 |
jne __b0 |
mov [B], 8 |
jmp __OK_b |
__b0: |
mov [B], 0 |
__OK_b: |
|
mov ah, [S] |
cmp ah, 0 |
jne __1 |
|
mov ah, [A] |
shr ah, 3 |
and ah, 7 |
add ah, [B] |
jmp __OK_col |
|
__1: |
mov ah, [A] |
and ah, 7 |
add ah, [B] |
|
__OK_col: |
mov ebx, [dst] |
add ebx, [N] |
mov [ebx], ah |
inc [N] |
|
shl [C], 1 |
|
inc [M] |
cmp [M], 8 |
jne __M |
|
mov [M], 0 |
inc [L] |
cmp [L], 32 |
jne __L |
|
mov [L], 0 |
inc [K] |
cmp [K], 8 |
jne __K |
|
mov [K], 0 |
inc [I] |
cmp [I], 8 |
jne __I |
|
mov [I], 0 |
inc [J] |
cmp [J], 3 |
jne __J |
|
|
ret |
|
;========================================= |
|
_app_title: |
db 'ScrV 0.2 by O.Bogomaz', 0 |
|
_in_f0: |
dd 0 |
dq 0 |
dd 0x5000 |
dd 0 |
db 0 |
dd _param |
|
_in_f1: |
dd 0 |
dq 0 |
dd 6144 |
dd 0 |
db 0 |
dd _param |
|
_in_f2: |
dd 0 |
dq 6144 |
dd 768 |
dd 0 |
db 0 |
dd _param |
|
_palette: |
dd 0 ; black |
dd 0x000000b0 ; blue |
dd 0x00b00000 ; red |
dd 0x00b000b0 ; magenta |
dd 0x0000b000 ; green |
dd 0x0000b0b0 ; cyan |
dd 0x00b0b000 ; yellow |
dd 0x00b0b0b0 ; gray |
dd 0 ; black |
dd 0x000000ff ; light blue |
dd 0x00ff0000 ; light red |
dd 0x00ff00ff ; light magenta |
dd 0x0000ff00 ; light green |
dd 0x0000ffff ; light cyan |
dd 0x00ffff00 ; light yellow |
dd 0x00ffffff ; white |
|
src dd 0 |
dst dd 0 |
atr dd 0 |
tmp dd 0 |
|
fsize dd 0 |
|
I dd 0 |
J dd 0 |
K dd 0 |
L dd 0 |
M dd 0 |
N dd 0 |
|
C db 0 |
A db 0 |
B db 0 |
S db 0 |
|
_param: |
rb 256 |
|
_end: |
|
align 32 |
rb 2048 |
_stack: |
_memory: |
|
;========================================= |