forked from KolibriOS/kolibrios
409 lines
4.9 KiB
NASM
409 lines
4.9 KiB
NASM
|
|
|||
|
;=========================================
|
|||
|
;
|
|||
|
; Simple program to view ZX Spectrum
|
|||
|
; screen files.
|
|||
|
; 6912 bytes (*.scr, *.s)
|
|||
|
; and
|
|||
|
; 6929 bytes (*.$c) files are supported now.
|
|||
|
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ZX Spectrum.
|
|||
|
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
; 6912 <20><><EFBFBD><EFBFBD> (*.scr, *.s)
|
|||
|
; <20>
|
|||
|
; 6929 <20><><EFBFBD><EFBFBD> (*.$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:
|
|||
|
|
|||
|
;=========================================
|