Акселератор

Компьютер "Спринтер" http://sprinter.nedopc.org

Moderator: Shaos

User avatar
CHRV
God
Posts: 1101
Joined: 29 Dec 2003 01:00
Location: Москва

Акселератор

Post by CHRV »

LD B, B - Switch the Accelerator off.

LD D, D - Switch the Accelerator in the mode of load a byte of block size.
Next command is "LD A, dat" where "dat" is a new block size.

LD C, C - Switch the Accelerator to filling by one byte mode for horizontal line.
Next command "LD (HL), A" will fill all bytes by value of A.

LD E, E - Switch the Accelerator to filling by one byte mode for vertical line.

LD H, H - Reserved.

LD L, L - Switch the Accelerator to copying a data block mode for horizontal line of the screen.
Next command "LD A, (HL)" will fill the Accelerator memory by value of (HL).
And the command "LD (DE), A" will copy the data from the Accelerator memory to RAM or to VideoRAM.

LD A, A - Switch the Accelerator to copying a data block mode for vertical line of the screen.
Люди кто нить проверял работу оного?
Короче у меня функции OR и AND работает, а вот XOR не работает....
Видеопамять в первом окне (#4000-#7FFF), прога во втором (#8000-#BFFF).
Фрагмент следующий:
DI
LD l,l
LD a,(de)
XOR (hl)
LD (hl),a
LD b,b
EI
причем HL и DE адреса в видеопамяти.
OR и AND работают, а XOR работает как OR :-(
Mac Buster
Retired
Posts: 1474
Joined: 03 Aug 2003 22:37
Location: Moscow

Re: [rus] Акселератор

Post by Mac Buster »

Второй день забываю проверить :( Может быть стоит каждую инструкцию акселератора завершать кодом его отключения ?
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: [rus] Акселератор

Post by Shaos »

Mac Buster wrote:Второй день забываю проверить :( Может быть стоит каждую инструкцию акселератора завершать кодом его отключения ?
Похоже, что именно так и надо делать - включил акселератор, выполнил 1 команду, выключил - и т.д. Иначе он работает не так, как ожидалось или вообще не работает (на реальной железяке).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
CHRV
God
Posts: 1101
Joined: 29 Dec 2003 01:00
Location: Москва

Re: [rus] Акселератор

Post by CHRV »

Похоже, что именно так и надо делать - включил акселератор, выполнил 1 команду, выключил - и т.д. Иначе он работает не так, как ожидалось или вообще не работает (на реальной железяке).
Я покрутил по всякому XOR чтото у меня не получился, ну ладно. Впринципе OR и AND вполне достаточно :-)
Hard
Novelist
Posts: 35
Joined: 10 Feb 2011 07:04
Location: 92.112.8.125

Post by Hard »

Shaos wrote:
Hard wrote:Искал причину почему не работает flc-плейер на моем эмуле, нашел. Плейер заработал. Но, эта причина мешает работать плейеру и на твоем эмуляторе - инициализацию акселя я подсматривал в твоих исходниках. в плейере такая конструкция имеет место быть:

Code: Select all

ld a,#80
ld d,d
ld (de),a
ld b,b
Т.е. тут идет изменение размера буфера посредством операции записи, а эмулятор ожидает только операцию чтения.
непонял - давай поподробнее в форуме

можно новый топик создать или в конец вот этого написать: viewtopic.php?t=7390
Код из flicplay.exe:

Code: Select all

      ...
#86a5: ld a,c  ;размер буфера в аккуме
      ld d,d       ;команда определения размера буфера
      ld (de),a   ;передаем в аксель
      ld b,b       ;выключаем аксель
      ...
Тут мы устанавливаем размер буфера записью значения аккумулятора в (DE), операция записи.
кусок из сырка sprint, отработка команды акселя по установке размера буфера:

Code: Select all

 case 1: // LD D,D - set size of accelerator buffer
  if(a=='R')
  { AccelSize = b;
    if(AccelSize==0) AccelSize=256;
  }      
  break; 
Тут видно, что сия конструкция реагирует лишь на чтение, т.е. на команды типа LD A,X;LD A,(DE) и пр. Другими словами твой эмулятор проигнорирует команду установки буфера, оставит его равным 256 байт, и соответственно в программах, с подобным способом инициализации акселя полезут глюки. Я могу назвать по крайней мере 2 таких программы: flicplay и gfxview.
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Hard wrote: Код из flicplay.exe:

Code: Select all

      ...
#86a5: ld a,c  ;размер буфера в аккуме
      ld d,d       ;команда определения размера буфера
      ld (de),a   ;передаем в аксель
      ld b,b       ;выключаем аксель
      ...
Тут мы устанавливаем размер буфера записью значения аккумулятора в (DE), операция записи.
кусок из сырка sprint, отработка команды акселя по установке размера буфера:

Code: Select all

 case 1: // LD D,D - set size of accelerator buffer
  if(a=='R')
  { AccelSize = b;
    if(AccelSize==0) AccelSize=256;
  }      
  break; 
Тут видно, что сия конструкция реагирует лишь на чтение, т.е. на команды типа LD A,X;LD A,(DE) и пр. Другими словами твой эмулятор проигнорирует команду установки буфера, оставит его равным 256 байт, и соответственно в программах, с подобным способом инициализации акселя полезут глюки. Я могу назвать по крайней мере 2 таких программы: flicplay и gfxview.
я боюсь, что это опечатка в самом flicplay - после ld d,d должна отрабатывать только ld a,# и ничего больше...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Hard
Novelist
Posts: 35
Joined: 10 Feb 2011 07:04
Location: 92.112.8.125

Post by Hard »

Shaos wrote: я боюсь, что это опечатка в самом flicplay - после ld d,d должна отрабатывать только ld a,# и ничего больше...
Не думаю. Т.к. до исправления сего глюка у меня не работал как flicplayer (вылетал с матерными словами, либо ресетил "машину"), так и gfxview (копирование в буфер фона под окнами глючило), после исправления - все заработало как на реале. В твоем эмуляторе указанный софт глючит так же как и у меня ранее.
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Hard wrote:
Shaos wrote: я боюсь, что это опечатка в самом flicplay - после ld d,d должна отрабатывать только ld a,# и ничего больше...
Не думаю. Т.к. до исправления сего глюка у меня не работал как flicplayer (вылетал с матерными словами, либо ресетил "машину"), так и gfxview (копирование в буфер фона под окнами глючило), после исправления - все заработало как на реале. В твоем эмуляторе указанный софт глючит так же как и у меня ранее.
ну значит это недокументированная фича ;)

P.S. чую я придётся хардверные сырцы акселя ковырять чтобы истину найти :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Post by Sayman »

набросал ещё один тест и вот вам первая ошибка в работе спринта. Hard, тебе тоже проверить надо на своём эмуле.
суть такова - я взял тест ldee.exe и изменил в нём размер буфера и размер блока с 256 байт до 16 байт. предполагалось, что проверка сможет показать работу акселя совместно с портом "У". на реале если не делать отслеживание порта "У", получаются дыры каждые 16 байт начиная с нуля. размер дыр - 16 байт. этот же тест в эмуляторе спринт делает заполнение вертикали полностью. без быр. на реале чтобы достич этого же эффекта мне пришлось читать порт_у и вычитать 16. только тогда получил полную вертикаль!

http://www.nedopc.org/nedopc/sprinter/upload/ldeen_1.zip

как обычно - ногами не пенать, просьба к Александру прикрепить архивчик к посту (но лучше эту кнопку в форум добавить).

p.s. прошу обратить внимание на то, что я намеренно не использую отключение работы акселя между режимами/операциями. если на реале это работает, значит должно работать у всех. однако, если в процессе эксперемента (теста) всё таки без отключения не обойтись, я его приминяю.
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Sayman wrote:набросал ещё один тест и вот вам первая ошибка в работе спринта. Hard, тебе тоже проверить надо на своём эмуле.
суть такова - я взял тест ldee.exe и изменил в нём размер буфера и размер блока с 256 байт до 16 байт. предполагалось, что проверка сможет показать работу акселя совместно с портом "У". на реале если не делать отслеживание порта "У", получаются дыры каждые 16 байт начиная с нуля. размер дыр - 16 байт. этот же тест в эмуляторе спринт делает заполнение вертикали полностью. без быр. на реале чтобы достич этого же эффекта мне пришлось читать порт_у и вычитать 16. только тогда получил полную вертикаль!

Code: Select all

lp1:            di
                ld d,d
                ld a,16
                ld e,e
                ld a,(hl)
                ld (de),a
                ld b,b
                ei
                djnz lp1
                ld c,waitkey
                rst 10h
                jp _exit
ну в-принципе логично - ld a,(hl) сдвигает на 16 и потом ld (de),a сдвигает ещё на 16 - по идее спринт должен делать абсолютно тоже самое:

Code: Select all

case 6: // LD A,A - copy in video
  switch(a)
  {
   case 'R':  
    for(i=0;i<AccelSize;i++)
    {   
        AccelRAM[i] = readbyte(adr);
        VideoY = 0xFF&(VideoY+1);
    }
    break;
   case 'W':  
    for(i=0;i<AccelSize;i++)
    {   
        writebyte(adr,AccelRAM[i]);
        VideoY = 0xFF&(VideoY+1);
    }
    break;
  ....
P.S. у меня в эмуле LDEEN1.EXE вообще ничего не делает...
Я тут за главного - если что шлите мыло на me собака shaos точка net
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Post by Sayman »

я думаю что вот так будет чуть более заметно :)
скриншот из эмулятора


скриншот (камрип) с реала


кусок кода

Code: Select all

		ld hl,data
		ld de,screen
		ld c,0
lp2:                          push bc
                               ld b,16		
lp1:		di
		ld d,d
		ld a,16
;                ld b,b
                ld e,e
		ld a,(hl)
		ld (de),a
		ld b,b
		ei
		djnz lp1
                pop bc
                inc de
                dec c
                jp nz,lp2
		ld c,waitkey
		rst 10h
		jp _exit
Hard
Novelist
Posts: 35
Joined: 10 Feb 2011 07:04
Location: 92.112.8.125

Post by Hard »

Shaos, имеется в виду операция типа LD E,E, (Graph Fill) а не LD A,A (Graph Copy).
У меня тоже полное заполнение, т.к. не предполагал, что эта команда реагирует на чтение, вот интересно что в этот момент происходит с буфером? Saymon, можешь подправить этот тест - после LD A,(HL) включить аксель LD A,A и выкинуть данные из буфера на экран LD (DE),A.

Че-та кусок кода с бинарником не совпадает - в бинарнике нет инкремента адреса DE, сейчас после патчинга у меня идет пунктирная линия по краю экрана...
Sayman
Maniac
Posts: 223
Joined: 05 Oct 2009 19:44
Location: 212.164.105.5

Post by Sayman »

User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Hard wrote:
Shaos wrote: я боюсь, что это опечатка в самом flicplay - после ld d,d должна отрабатывать только ld a,# и ничего больше...
Не думаю. Т.к. до исправления сего глюка у меня не работал как flicplayer (вылетал с матерными словами, либо ресетил "машину"), так и gfxview (копирование в буфер фона под окнами глючило), после исправления - все заработало как на реале. В твоем эмуляторе указанный софт глючит так же как и у меня ранее.
Разобрался в чём дело - мой эмуль до сегодняшнего дня ничего не знал про вторую страницу видеопамяти :oops:
И в плеере фликов палитро хитро-хакерски по смещению в 992 и более пикселов пишется в каждую строчку - замапил это на свою палитру и всё заработало :)
Причём акселератор трогать не пришлось ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24097
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

А вот чего я точно упустил, так это возможность с помощью номера страницы управлять режимами копирования (сквозное и/или с прозрачностью):

Code: Select all

        LD A,50h        ; Use   50h for normal mode
                        ;       54h for "no copy in main shadow RAM" mode
                        ;       58h for "FF is transparent" mode
                        ;       5Ch for "no copy in main shadow RAM" and
                        ;               "FF is transparent" mode
        OUT (PAGE3),A 
Только я пока не встретил ни одной программы, которые бы этим пользовались...
Я тут за главного - если что шлите мыло на me собака shaos точка net