страница pouet.net:http://www.pouet.net/prod.php?which=79828

В январе этого года у меня нашлось свободное время. На что бы его потратить?
Просиживать на форумах и в чатиках - лишняя трата времени, лучше вернуться к своим начатым проектам, которые по некоторым причинам были заморожены.
Так сложилось, что остались две программы для Apple II, которые я не довел до конца.
Мне нравится этот компьютер потому, что он иногда предоставляет возможность для новых, интересных открытий.
Или бросает некий вызов мне - смогу ли я выполнить поставленную задачу? В январе нерешенных задач было две.

Задача 1. Звук

Каюсь, к изучению я подошел немного поверхностно. Существует дополнительная плата Mockingboard(wiki)  - синтез речи, два чипа AY, на этом мое знакомство и
закончилось, я запасся образцом вывода звука и синтеза речи(Hello,DiHalt!). Но однажды я увидел новое демо - Plasmagoria by French Touch, просмотр которой меня вверг в состояние
легкой шандарахнутости, потому что я ине подозревал, что качество звука может быть таким.

Скриншот демо Plasmagoria

Изучить принцип работы не удалось, потому что образ диска не открывался вообще. Переписка с авторами закончилась чем-то наподобие "Вау! я вообще не верю, что такое возможно!".

Короче, я пошел вабанк, выгрузил из взятого наугад .YM-файла(это такой способ хранения сжатых данных для звукового чипа Atari ST) в формат .PSG. Этот формат документирован и я написал плеер под ZX Spectrum.
В общем, плеер я написал, но звк был просто ужасным, мелодия хрипела и заикалась. После нескольких попыток я отложил проект на будущее, надеясь, что исходники демо появятся.
Приятная, но в тоже время и грустная новость - группа French Touch выложила исходные тексты(это приятно), заявив, что прекращает деятельность(это очень грустно).
На сайте были выложены архивы релизов и исходные тексты демо. Увы, сейчас сайт уже загнулся, но архивы можно найти в интернетах.
Архивы лежали на моем диске, но я никак не мог себя заставить сесть за написание плеера. Но задолго до мучений со звуком я занимался

Задача 2. Графика.

Первое знакомство с графикой было простым: сушествует несколько режимов - текстовый, Lo-Res, Hi-res. Однако, структура экрана оказалось непростой из-за Memory Holes
Прочитав массу документов, я научился рисовать на экране, но при работе с Hi-Res мало что толком удавалось. Использовать готовые процедуры Basic - не решение, так как работают процедуры медленно.

И понеслось. В одной статье попалась некая формула:
BA = BA+(1024*(YY-(INT(YY/8)*8)))+INT(XX/7)

Apple Assembly line предлагает другой вариант
  1200 *--------------------------------
  1210 *      BASE ADDRESS CALCULATOR
  1220 *      HARRY CHEUNG
  1230 *      PMB 1601, ONITSHA, NIGERIA
  1240 *      CALL APPLE, JULY 1983, PAGE 70
  1250 *--------------------------------
  1260 CALC   TAY          (TAY..TYA COULD BE PHA..PLA)
  1270        AND #$C7     ABCDEFGH
  1280        STA 0        AB000FGH
  1290        ORA #$08     FOR BASE = $2000, $10 FOR $4000
  1300        STA 1        AB001FGH
  1310        TYA          ABCDEFGH
  1320 *                CARRY..A-REG......$00.......$01...
  1330        ASL          A--BCDEFGH0  AB000FGH  AB001FGH
  1340        ASL          B--CDEFGH00     "         "
  1350        ROR 0        H--   "      BAB000FG     "
  1360        ASL          C--DEFGH000     "         "
  1370        ROL 1        A--   "         "      B001FGHC
  1380        ROR 0        G--   "      ABAB000G     "
  1390        ASL          D--EFGH0000
  1400        ROL 1        B--   "         "      001FGHCD
  1410        ASL          E--FGH00000     "         "
  1420        ROR 0        G--   "      EABAB000  001FGHCD
  1430        RTS



Окончательно добила статья Preshift Table Graphics On Your Apple

Цвета определяются следующим образом:


И контрольный выстрел:


Я стал скачивать с web.archive.org журналы, в которых были статьи, посвященные вопросам Hi-Res. Однако читать текст и набирать исходные тексты оказалось сложно из-за  чересчур сжатого текста(на помощь придет архив сканированных страниц в формате JPEG2000).

Читатель скучает и собирается перелистать нудную статью. Нет, я всего лишь хотел, чтобы читатель ощутил, какая каша была у меня в голове после двух лет борьбы с хитрой структурой экрана. Некоторые объясняют формат тем, что Возняк, проектируя компьютер стремился съэкономить на чипах.

Короче, попытки провалились. Одна готовая процедура на экране рисовала не пойми что, хотя на реале выглядело прилично. Задача 2 была отложена.
В прошлом году я дизассемблировал готовую процедуру HPLOT, теперь точки на экране появились. Осталось всего лишь заменить вычисления процедуры на look-up таблицы, где необходимые данные были подготовлены.
Эффект я когда-то подглядел на ZX Spectrum в одном megademo. Готовый набросок у меня уже был:

Dim s.b(256)
Dim s2.w(256)
Dim t1.b(255)
;Dim t2.w(255)

For i=0 To 255
  s(i)=Int(127*Sin(i*#PI/128))
  s2(i)=Int(191*Sin(i*#PI/128))
Next i

    For i=0 To 255
      t.a=i*4
      y1.b=s(t)
      y2.b=s(i>>1)
      y3.b=(y2*y1)>>8
      t1(i)=y3
     
      t1(i)=Int(191*Sin(i*#PI/128*4)*127*Sin(i*#PI/128/2))>>8
 ;     t2(i)=y3>>2
 ;     Debug Hex(i)+":"+Hex(y3)
    Next i

    b0.a=0
    d0.a=$FE-2
If InitSprite() And OpenWindow(0,0,0,640,480,"SineWave",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
  Repeat
    StartDrawing(ScreenOutput())
    Box(0,0,280,192,$FF0000)
   
    b0=b0+1
    b.a=b0
    d0=d0+1
    d.a=d0
   
    a.a=b0
    c.a=d0
   
    For i=0 To 255
       Box(32+64+t1(a),32+64+t1(i),1,1,RGB(0,255,0))
       ;Box(64+t1(c),64+t1(i),1,1,0)
      a+1
      c+1
      Box(280+i,32+64+t1(i),1,1,RGB(255,255,255))
    Next i
    
       StopDrawing()
      FlipBuffers()
  Until WindowEvent()=#PB_Event_CloseWindow
EndIf

CreateFile(0,"sindots.bin")
For i=0 To 255
  WriteAsciiCharacter(0,32+64+t1(i))
  Next i
CloseFile(0)

; IDE Options = PureBasic 5.30 (Windows - x86)
; CursorPosition = 42
; FirstLine = 4




Я решил упростить работу и использовать два экрана Hi-Res. Это было ошибкой и готовой код отбросил решение задачи. В январе я решил сначала покончить с эффектом. Несколько прогонов отладчика дали подсказку, где и в чем ошибка.
Я сделал несколько правок и точки закрутились. Вернулся к звуку, почитал исходники. Подход кодера French Touch в другом, запись данных в регистр AY был сделан иначе. Я адаптировал код к плееру .PSG-дампа. А в ответ тишина.
Пара дней, и до меня дошло, что начальная процедура использует определение MockingBoard, по нужным адресам осуществляется запись данных. Интересным решением было использование прерывания:

        LDA #<PLAYER_PSG
        STA $03FE
        LDA #>PLAYER_PSG
        STA $03FF


код в стиле "О чем молчат учебники информатики".  Музыка заиграла, но после детекта MockingBoard работала просто странно. Поэтому код привязан к слоту 4-5.
Осталась еще одна задача. PSG-дамп весил 11610 байт, что очень много. Демо размещена по адресу $4000, если сложить размер кода и размер дампа, то выйдет очень грустно, поскольку общий код наложится на память Apple DOS и загрузка не прокатит. Кодеры FrenchTouch решают задачу иначе - пишут собственный загрузчик и распаковку данных. Нет, хватит с меня этих извращений. Для процессора 6502 есть несколько решений сжатия данных. Для простоты я взял пакер zx7 и сжал дамп. Вышло 728 байт. Сложность была в том, что код распаковки данных написан на z80, сам процесс адаптации к коду 6502 был бы трудоемким, я несколько раз откладывал задачу. К тому же нашелся более шустрый и компактный puncrunch.
На страничке  нашелся нужный код, но заявленный ассемблер ACME не воспринимал исходник. Неясно, чем руководствовался автор, когда писал эту процедуру. Последний ва-банк: взять процедуру от 65816 и переписать на 6502.
Музыка заиграла, а я уже и не знал, радоваться, или нет. На странице pouet нет видео для ленивых(качество звука плохое после записи), каждый сможет скачать AppleWin и настроить на Apple IIe, установив MockingBoard.

Теперь, когда задача выполнена, остается полюбоваться на работу - кому как, а мне нравится. И, заодно, накопить силы на решение других задач - изучение SWEET16 и построение окружности Брезенхема, о чем я расскажу в других номерах.