
страница 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 и построение окружности Брезенхема, о чем я расскажу в других
номерах.