PDA

Просмотр полной версии : Конвертнуть jpeg в формат zx screen.



anarchyman
04.04.2009, 19:41
Всем привет!
Как бодрость духа?

Подскажите, а чем можно конвертнуть jpeg в какой либо формат, пригодный в дальнейшем для использования, ну грубо говоря в intro (на самом деле gift).

Если простыми словами, чего хочется:
Есть несколько фоток в формате jpeg. Хочется конвертнуть их, далее последовательно выводить на экран, ну и там прикрутить скрол какой нить, и какую нить музыку :-)

Пока задача в том что бы конвертнуть.

Спасибо за помощь.

p.s.
До этого для/на спектруме ничего не программировал, вот только сейчас пытаюсь начать :-)

wbr.

Rindex
04.04.2009, 19:46
Поройся тут (http://tr-dos.narod.ru/dloads/winzx.htm).

anarchyman
04.04.2009, 19:55
О! Спасибо за оперативный ответ!!!
Gfx SpeConvertor
То что нужно :-)

Теперь вопрос:
А где можно посмотреть пример программы (желательно на assembler), который выводит scr на экран.
Конвертил в формат normal screen

Спасибо за ответы!

AAA
04.04.2009, 20:52
А мы не ищем легких путей...

http://pic.ipicture.ru/uploads/090404/e1WITTWvXj.jpg

http://www.zxmodules.de/

anarchyman
04.04.2009, 20:54
alexeenko, ну вообще крутой и хакерский вариант :-)))

AAA
04.04.2009, 20:58
А где можно посмотреть пример программы (желательно на assembler), который выводит scr на экран.
Конвертил в формат normal screen

Сначала картинку надо сжать компрессором. Оно тебе даст адрес запуска. См. наверно тему:
Я там до картинки с музыкой дашел, а дельше форум начал психовать...
http://zx.pk.ru/showthread.php?t=8586

Ewgeny7
04.04.2009, 20:59
А где можно посмотреть пример программы (желательно на assembler), который выводит scr на экран.
А это как понять? Можно с диска прямо на экран грузить, можно закинуть картинкку в память и там уже перемещать. Да много как можно.

anarchyman
04.04.2009, 21:14
Сначала картинку надо сжать компрессором. Оно тебе даст адрес запуска. См. наверно тему:
Я там до картинки с музыкой дашел, а дельше форум начал психовать...
http://zx.pk.ru/showthread.php?t=8586
ща буду зырить.
Если что у тебя icq / skype есть?

Добавлено через 50 секунд

А это как понять? Можно с диска прямо на экран грузить, можно закинуть картинкку в память и там уже перемещать. Да много как можно.
Пока интересует наиболее простой и понимаемый вариант.

AAA
04.04.2009, 21:23
ща буду зырить.
Если что у тебя icq / skype есть?

Нет, но я и подсказать ничего не смогу. Там в теме все написано и я присоединял программу в которой и картинка и музон запузыривался. писалось в ассемблере. Развивай там тему, тебе подскажут.

rasmer
04.04.2009, 21:38
если загружена непакованная картинка, то:
ld hl,адрес картинки в памяти
ld de,#4000
ld bc,#1b00
ldir

вуаля...

icq - 7804414

Kurles
05.04.2009, 00:12
если загружена непакованная картинка, то:
ld hl,адрес картинки в памяти
ld de,#4000
ld bc,#1b00
ldir

вуаля...
а если пакованая с декомпрессором, то ещё проще =)

call адрес картинки с декомпессором ; =)

правда перед этим желательно атрибуты экрана в 0 выставить, что бы не было заметно, как картинка распаковывается -


ld hl,#5800
ld d,h
ld e,l
inc de
ld (hl),l
ld bc,#2ff
ldir


но это и для простого ldir справедливо.

Добавлено через 7 минут
а можно ещё проще:


10 CLEAR 24999: BORDER 0: PAPER 0: CLS
20 RANDOMIZE USR 15619: REM: LOAD "screen" CODE 32768: REM адрес компрессированой картинки с декомпрессором
30 RANDOMIZE USR 32768
40 PAUSE 0

В итоге на экране - картинка =)

anarchyman
05.04.2009, 00:46
С выводом картинки на экран разобрался.
Громадное спасибо rasmer'у (с меня простава при встрече).

Сейчас остро нуждаюсь в примере кода со скролом :-)
Где бы про это прочитать?

Kurles
05.04.2009, 01:33
С выводом картинки на экран разобрался.
Громадное спасибо rasmer'у (с меня простава при встрече).

Сейчас остро нуждаюсь в примере кода со скролом :-)
Где бы про это прочитать?Тут (http://zx.pk.ru/showpost.php?p=157546&postcount=62) можно почитать =)

anarchyman
05.04.2009, 01:37
Тут (http://zx.pk.ru/showpost.php?p=157546&postcount=62) можно почитать =)
О, круто :-)
Ща в лом пьяный, завтра буду читать и разбираться :-)

anarchyman
05.04.2009, 15:32
Почитал :-)
Возникло несколько вопросов:

1. Почему используется ORG 40000
2. При компиляции выползает вот такая ошибка:

C:\Documents and Settings\Administrator\Desktop\spectrum\_sj\sj\ana rchy2>..\sjasm
plus.exe -mbi. test.a80
SjASMPlus Z80/R800 Cross-Assembler v1.06 Stable (build 2006-08-02)
Pass 1 complete (0 errors)
test.a80 line 29: Label not found: FFH
test.a80 line 64: Label not found: FFH
Pass 2 complete
Errors: 2, compiled: 193 lines, work time: 0.016 seconds

Хотя в коде он вроде как присутствует:

DEFB FFH

Спасибо за ответы!

Kurles
05.04.2009, 17:49
Почитал :-)
Возникло несколько вопросов:

1. Почему используется ORG 40000
2. При компиляции выползает вот такая ошибка:


Хотя в коде он вроде как присутствует:

DEFB FFH

Спасибо за ответы!

1. Можешь заменить ORG на любой другой адрес.
2. замени "DEFB FFH" на "DEFB #FF". C "CP A,FFH" аналогично - "CP A,#FF" или короче - "CP #FF", ибо команда CP всегда с аккумулятором (регистром A) работает.

anarchyman
05.04.2009, 18:08
Спасибо за ответ!
Сейчас буду пробовать.

А пока возник еще один вопрос. Предположим есть процедура:


loop
halt
ld ix,a1
call play
ld ix,a2
call play
jp loop
ret

Где можно почитать про таймер или подсчет циклов.
Чего хочется: что бы jump на процедуру loop был бы не бесконечным, а например выполнялся несколько раз.

на pc assembler'е можно было бы сделать примерно так:

loop:
inc %eax ; увеличиваем %eax на 1.
...
основная процедура
...
cmp 111,%eax ; сравниваем значение регистра %eax, с интересующим числом.
jne loop ; если не равно прыгаем на loop.
je newloop ; если равно прыгаем на новую процедуру.

Спасибо за ответы!

Добавлено через 16 минут
Скроллер теперь компилируется без проблем, но не работает :-)
Что то наверное я не так сделал. Код такой:


ORG #6000
STARTF ei

Далее копипаст оригинального кода:

LD A,(COUNT)
CP 0
JR Z,SETCHAR
DEC A
LD (COUNT),A

START LD HL,401FH
LD DE,BUF
LD B,08
MET LD A,(DE)
SLA A
PUSH HL
DUP 32
RL (HL)
DEC L
EDUP
LD (DE),A
INC DE
POP HL
INC H
DJNZ MET
RET
SETCHAR LD A,7
LD (COUNT),A
VAR LD HL,MESS
LD A,(HL)
CP A,FFH
CALL Z,SETST
PUSH HL
LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD DE,(23606)
ADD HL,DE
LD DE,BUF
LD B,08
MET1 LD A,(HL)
LD (DE),A
INC HL
INC DE
DJNZ MET1
POP HL
INC HL
LD (VAR+1),HL
JP START
SETST LD HL,MESS
LD (VAR+1),HL
RET


Тут я добавил его вызов:


m_loop call 6000
halt
jp m_loop

Далее продолжение оригинального кода:


COUNT DEFB 0
BUF DEFB 0,0,0,0,0,0,0,0
MESS DEFB " I made it! I made it! I made this stupid "
DEFB "scroll!!! Well, now i haven't any idea "
DEFB "to write something here. What about "
DEFB "greets? Erm.. There is no greetinx :(( "
DEFB "Now it's really end of my message. Scroll "
DEFB "coded by mig'95 on 01.11.2006 at 21:20 "
DEFB "... Read again: "

DEFB #FF

В чем может быть дело?

Kurles
05.04.2009, 19:25
В чем может быть дело?Ну во-первых, sjasm хоть и понимает запись шеснадцатиричных чисел в формате "FFFFH", но лучше их привести к виду 0xfff или #ffff. Во-вторых адресс в памяти 6000 - это адрес ПЗУ, собственно по этому адресу пользователь не может хранить собственные программы, лучше использовать для этого память выше 0x8000. В-третьих в данном конкретном случае лучше воспользоваться одним ORG'ом в начале, а все остальное вызывать через метки, а не абсолютные адреса. Считать количество циклов - проще пареной репы:

ld b,#ff ; сколько раз надо повторить участок кода
loop
push bc ; запоминаем за стеке регистр B
call scroll
pop bc ; вытаскиваем со стека регистр B
djnz loop ;уменьшаем B на еденицу, и если B<>0, то переходим на loop
ret ; выход


в аттаче работающий исходник скролла для sjasmplus 1.07RC7

anarchyman
05.04.2009, 20:07
Огромное спасибо!!!
Сейчас буду пробовать и разбираться!

Добавлено через 1 час 58 минут
Очень странно :-(
Почему то ругается на вышенаписанный код.

Суть. Что было:


loop
halt
ld ix,a1
call play
ld ix,a2
call play
jp loop
ret

Что стало:


loop
halt
ld ix,a1
call play
ld ix,a2
call play
ld bc,#10
push bc
call loop
pop bc
djnz newloop
ret


Но компилятор ругается:

C:\Documents and Settings\Administrator\Desktop\spectrum\_sj\sj\ana rchy2>..\sjasm
plus.exe -mbi. testf.a80
SjASMPlus Z80/R800 Cross-Assembler v1.06 Stable (build 2006-08-02)
Pass 1 complete (0 errors)
testf.a80 line 35: Unrecognized instruction: bc,#10
testf.a80 line 36: Unrecognized instruction: bc
testf.a80 line 37: Unrecognized instruction: loop
testf.a80 line 38: Unrecognized instruction: bc
testf.a80 line 39: Unrecognized instruction: newloop
Pass 2 complete

чем ему там bc не понравился? :-(

Kurles
05.04.2009, 23:11
чем ему там bc не понравился? :-(не знаю, попробуй в строках, где нет меток, перед мнемониками пробелов наставить, ибо оригинальная версия sjasm'а не поддерживала компиляцию ассемблерных команд в начале строки, может твоя ситуация - это отголоски того времени. Ещё ошибка - где у тебя задается количество циклов в регистровой паре bc - надо, что бы кол-во циклов задавалось в регистре B. ld b,#10. Ещё: не нашёл у тебе метки newloop, которая в комманде djnz newloop используется, определи куда нибудь.

psndcj
05.04.2009, 23:17
если в BC задавать количество повторов, то в конце цикла надо не DJNZ ставить, а DEC BC:LD A,B:OR C:JR NZ,....кудатамнадо.... в B просто максимум 256 повторов задать можно - то есть 5 секунд с небольшим (с HALT'ом в цикле)...

anarchyman
05.04.2009, 23:28
не знаю, попробуй в строках, где нет меток, перед мнемониками пробелов наставить, ибо оригинальная версия sjasm'а не поддерживала компиляцию ассемблерных команд в начале строки, может твоя ситуация - это отголоски того времени. Ещё ошибка - где у тебя задается количество циклов в регистровой паре bc - надо, что бы кол-во циклов задавалось в регистре B. ld b,#10. Ещё: не нашёл у тебе метки newloop, которая в комманде djnz newloop используется, определи куда нибудь.
Отлично!
Исправил ошибку в ld b,#10
и добавил пробелы. Все компилируется и даже работает (почти :-))
После исполнения цикла, программа почему то сбрасывается, а не передает управление на следующую процедуру (newloop)

Как можно выяснить в чем причина?

Kurles
05.04.2009, 23:30
Отлично!
Исправил ошибку в ld b,#10
и добавил пробелы. Все компилируется и даже работает (почти :-))
После исполнения цикла, программа почему то сбрасывается, а не передает управление на следующую процедуру (newloop)

Как можно выяснить в чем причина?Исходник в студию =)

anarchyman
05.04.2009, 23:37
Исходник в студию =)

Ну где то так :-)



hframeaddr
defw s1
defw s2

loop
halt
ld ix,a1
call play
ld ix,a2
call play

ld B,#10
push bc
call loop
pop bc
djnz aaa
ret
play
ld a,(ix+0)
dec a
jr nz,rret
ld l,(ix+2)
ld h,(ix+3)
ld e,(ix+4)
ld d,(ix+5)
ld c,8

play2
push bc
push de
rept 9
ldi
endm
pop de
pop bc
push hl
ld hl,32
add hl,de
ex de,hl
pop hl
dec c
jp nz,play2

ld a,(ix+1)
inc a
and 1
ld (ix+1),a
ld hl,hframeaddr
add a,a ; x2
ld d,0
ld e,a
add hl,de
ld e,(hl)
inc hl
ld d,(hl)
ld (ix+2),e
ld (ix+3),d
ld a,10
rret
ld (ix+0),a
ret

a1
defb 2
defb 0
defw s1
defw 22528+7+32*0

a2
defb 7
defb 1
defw s2
defw 22528+16+32*4

aaa ld hl,tablend
inc hl
xor a
or (hl)
jr nz,nenovaya
ld hl,tablichko

...
Продолжение процедуры aaa

Kurles
06.04.2009, 00:37
Ну где то так :-)
у тебя главный цикл какой-то не правильный - call loop вызывает гурбо говоря саму себя, в следствии чего происходит переполнение стека и сброс. И djnz хрен знает куда прыгает. В теории вот так должно быть:


halt
ld ix,a1
call play
ld ix,a2
call play

ld B,#10
mloop1
push bc
halt ; для синхронизации
call aaa ;или что ты тут собрался в цикле вызывать
pop bc
djnz mloop1
ret

если надо, что бы

ld ix,a1
call play
ld ix,a2
call playтоже в этом же цикле выполнялись - переносишь вот этот

ld B,#10
mloop1
push bc
участок кода в начало перед первым halt.
дальше твой код пока не смотрел, виснет явно на этом участке.

и вот это:


hframeaddr
defw s1
defw s2

тоже в начале кода хранить не следует, перенеси в конец программы, что бы не путаться.