Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Для начинающих (http://zx-pk.ru/forumdisplay.php?f=43)
-   -   Конвертнуть jpeg в формат zx screen. (http://zx-pk.ru/showthread.php?t=9908)

anarchyman 4th April 2009 20:41

Конвертнуть jpeg в формат zx screen.
 
Всем привет!
Как бодрость духа?

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

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

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

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

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

wbr.

Rindex 4th April 2009 20:46

Поройся тут.

anarchyman 4th April 2009 20:55

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

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

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

AAA 4th April 2009 21:52

http://www.zxmodules.de/
 
А мы не ищем легких путей...

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

http://www.zxmodules.de/

anarchyman 4th April 2009 21:54

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

AAA 4th April 2009 21:58

Quote:

Originally Posted by anarchyman (Post 193068)
А где можно посмотреть пример программы (желательно на assembler), который выводит scr на экран.
Конвертил в формат normal screen

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

Ewgeny7 4th April 2009 21:59

Quote:

Originally Posted by anarchyman (Post 193068)
А где можно посмотреть пример программы (желательно на assembler), который выводит scr на экран.

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

anarchyman 4th April 2009 22:14

Quote:

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

ща буду зырить.
Если что у тебя icq / skype есть?

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

Originally Posted by ewgeny7 (Post 193086)
А это как понять? Можно с диска прямо на экран грузить, можно закинуть картинкку в память и там уже перемещать. Да много как можно.

Пока интересует наиболее простой и понимаемый вариант.

AAA 4th April 2009 22:23

Quote:

Originally Posted by anarchyman (Post 193093)
ща буду зырить.
Если что у тебя icq / skype есть?

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

rasmer 4th April 2009 22:38

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

вуаля...

icq - 7804414

Kurles 5th April 2009 01:12

Quote:

Originally Posted by rasmer (Post 193103)
если загружена непакованная картинка, то:
ld hl,адрес картинки в памяти
ld de,#4000
ld bc,#1b00
ldir

вуаля...

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

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

Code:

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

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

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

Code:

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 5th April 2009 01:46

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

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

Kurles 5th April 2009 02:33

Quote:

Originally Posted by anarchyman (Post 193147)
С выводом картинки на экран разобрался.
Громадное спасибо rasmer'у (с меня простава при встрече).

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

Тут можно почитать =)

anarchyman 5th April 2009 02:37

Quote:

Originally Posted by Kurles (Post 193152)
Тут можно почитать =)

О, круто :-)
Ща в лом пьяный, завтра буду читать и разбираться :-)

anarchyman 5th April 2009 16:32

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

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

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 5th April 2009 18:49

Quote:

Originally Posted by anarchyman (Post 193264)
Почитал :-)
Возникло несколько вопросов:

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 5th April 2009 19:08

Спасибо за ответ!
Сейчас буду пробовать.

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

Quote:

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 минут
Скроллер теперь компилируется без проблем, но не работает :-)
Что то наверное я не так сделал. Код такой:

Quote:

ORG #6000
STARTF ei
Далее копипаст оригинального кода:
Quote:

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
Тут я добавил его вызов:

Quote:

m_loop call 6000
halt
jp m_loop
Далее продолжение оригинального кода:

Quote:

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 5th April 2009 20:25

1 Attachment(s)
Quote:

Originally Posted by anarchyman (Post 193290)
В чем может быть дело?

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

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

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

anarchyman 5th April 2009 21:07

Огромное спасибо!!!
Сейчас буду пробовать и разбираться!

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

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

Quote:

loop
halt
ld ix,a1
call play
ld ix,a2
call play
jp loop
ret
Что стало:

Quote:

loop
halt
ld ix,a1
call play
ld ix,a2
call play
ld bc,#10
push bc
call loop
pop bc
djnz newloop
ret
Но компилятор ругается:
Quote:

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 6th April 2009 00:11

Quote:

Originally Posted by anarchyman (Post 193301)
чем ему там bc не понравился? :-(

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

psndcj 6th April 2009 00:17

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

anarchyman 6th April 2009 00:28

Quote:

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

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

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

Kurles 6th April 2009 00:30

Quote:

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

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

Исходник в студию =)

anarchyman 6th April 2009 00:37

Quote:

Originally Posted by Kurles (Post 193328)
Исходник в студию =)

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

Code:

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 6th April 2009 01:37

Quote:

Originally Posted by anarchyman (Post 193330)
Ну где то так :-)

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

Code:

      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

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

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

тоже в этом же цикле выполнялись - переносишь вот этот
Code:

      ld        B,#10
mloop1
      push        bc

участок кода в начало перед первым halt.
дальше твой код пока не смотрел, виснет явно на этом участке.

и вот это:

Code:

hframeaddr
        defw    s1
        defw    s2

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


All times are GMT +4. The time now is 00:25.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.