Files
Sprinter-SDCC/docs/part2/forum.txt
T
snark13 c71e249a4e Add full compiler toolchain, libc, examples and reference docs
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.

What's in here:
  bin/sprinter-cc        — driver script invoking SDCC + linker + mkexe
  libc/                  — Sprinter-specific libc layer over ESTEX/BIOS
                           (conio, gfx, io, mem, stdio + headers)
  runtime/               — crt0 variants (default/small/banked/minimal)
                           + heap + bank trampolines
  toolchain/             — mkexe (SprintEXE packer, C + tests)
  examples/              — 30 demo programs (gfx, file I/O, env, time, …)
  lib/Makefile           — builds the libc archive (sprinter.lib)
  docs/                  — converted Sprinter manuals + asm reference samples
  third_party/           — solid-c reference compiler dump + sdcc setup script
  release_docs/          — packaging / release notes

gitignore overhaul:
  • Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
    and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
    on macOS APFS).  Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
  • Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
    INPUT fixtures, not build outputs.
  • Collapse the duplicated SDCC/C/Sdcc sections into one section per
    concern (build outputs / vendored / OS-junk).
  • Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-03 16:13:21 +03:00

2525 lines
59 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Форум
“Программирование Спринтера»
Оглавление:
Экран и палитра 2
Шрифты 7
Память 10
Файлы 14
Звук 16
ISA-8 слоты 18
Summary 18
More information 18
Акселератор компьютера Sprinter. 20
Прерывания 22
IDE контроллер 23
FDD контроллер 24
Клавиатура 25
Коды ошибок DSS 27
Экран и палитра
Denis Parinov
(Sprinter Team)
2002/10/02 00:57
Re: Графические режимы [re: Shiru_Otaku]
Функции для работы с экраном:
Сейчас DOS поддерживает четыре режима экрана.
Два текстовых:
40x32 символов c 16 цветами (режим 02h);
80x32 символов c 16 цветами (режим 03h);
и два графических:
320x256 точек с 256 цветами (режим 81h);
640x256 точек с 16 цветами (режим 82h);
Основным режимом является текстовый режим 80x32 (03h), если вашапрограмма
работает в другом режиме, то вам следует перед переключением режимаполучить
номер текущего режима функцией 51h GETVMOD и сохранить его, а передзавершением
программы восстановить его.
Например:
LD C,51h ;получить режим экрана
RST 10h
LD C,A ;поместить номер режима экрана в регистр C
PUSH BC ;и сохранить на стеке (B - страница, C - режим)
.
. ;ваша программа
.
POP BC ;взять со стека режим экрана
LD A,C ;поместить номер режима экрана в регистр A
LD C,50h ;установить режим экрана
RST 10h
LD C,41h ;завершить программу.
RST 10h
DSS имеет функции вывода на текстовый экран символов и символьных строк.Для
графических режимов требуются собственные процедуры вывода на экран.Например,
при завершении программы вы можете выдать строку на текстовый экран:
LD HL,STRING ;указатель на строку символов
LD C,5Ch ;вывод строки символов
RST 10h
STRING DB "Thank you for using my program..." ;текстовая строка
DB 13,10 ;символы возврата каретки и перевода строки
DB 0 ;символ конца строки
Для вывода на графический экран, вам необходимо подключить видео память водно
из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Этоосуществля-
ется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в
зависимости от окна памяти. При подключении обратите внимание на то, чтобыстек
вашей программы не попадал в это адресное пространство.
Например, если вам нужно поставить точку на экране, то подпрограмма длярежима
81h будет выглядеть так:
; HL - горизонтальная координата
; DE - вертикальная координата
IN A,(0E2h) ;считать из порта номер страницы подключенной в
;третье окно памяти
LD C,A ;запомнить в регистре C
LD A,50h ;страница видео памяти
OUT (0E2h),A ;подключение видео памяти
LD A,E ;поместить вертикальную координату в регистр A.
OUT (89h),A ;выдать в порт
LD DE,0C000h ;адрес начала третьего окна памяти
ADD HL,DE ;получить адрес точки (адрес начала окна +
;горизонтальная координата)
LD A,255 ;цвет выводимой точки (от 0 до 255)
LD (HL),A ;вывод точки на экран
LD A,C ;вспомнить номер страницы памяти
OUT (0E2h) ;подключить страницу памяти вместо страницы видео
;памяти
Перед выводом точек следует установить необходимые цвета в палитре.Различные
режимы вывода на экран задаются номером видео страницы от 50h до 5Fh.Подробнее
о режимах вывода вы можете прочитать в описании архитектуры компьютера.
50h (80) SETVMOD (Выбор режима экрана)
входные данные:
A - режим экрана
02h - текстовый 40x32x16 цветов
03h - текстовый 80x32x16 цветов
81h - графический 320x256x256 цветов
82h - графический 640x256x16 цветов
B - страница экрана 0/1
C - 50h
выходные данные:
A - код ошибки, если CF=1
Функция устанавливает режим экрана. Седьмой бит режима экрана установлен
для графических режимов и сброшен для текстовых. Существуют два текстовыхрежима
и два графических.
51h (81) GETVMOD (Получить текущий режим экрана)
входные данные:
C - 51h
выходные данные:
A - текущий режим экрана
B - страница экрана 0/1
Функция возвращает текущий режим экрана и номер страницы экрана.
Anonymous
(Unregistered)
2003/03/01 10:13
Здравствуйте. А как с палитрами??? Как загрузить произвольную
палитру (отдельный цвет). Желательно с исходником.
Почему системная палитра выглядит по разному в эмуляторе и реальном
Спринтере.
Alex_Goryachev
(Sprinter Team)
2003/03/01 12:51
Пример из исходников Антона Енина (
http://www.petersplus.com/download/sources/aprint.zip )
;[]=======================================================================[]
; palette from Flex Navigator
CustomPalette:
db 0x00, 0x00, 0x00, 0x00 ; Black 00
db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01
db 0x00, 0x80, 0x00, 0x00 ; Green 02
db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03
db 0x80, 0x00, 0x00, 0x00 ; Blue 04
db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05
db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06
db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07
db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08
db 0x80, 0x00, 0x00, 0x00 ; Panel 09
db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A
db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B
db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C
db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D
db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E
db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F
;[]=======================================================================[]
;[]=======================================================================[]
; set requist video mode 640x256x16
SetVideoMode:
ld c, 0x51 ; save previos vmode
rst 0x10
ld (vmode + 1), a
ld a, b
ld (vscrn + 1), a
sub a
call CrearVideoRam
ld bc, 0x0050 ; set 640x256x16
ld a, 0x82
rst 0x10
ld hl, CustomPalette
ld de, 0x1000
ld bc, 0xFFA4
sub a
rst 0x08 ; load palette
ret
;[]=======================================================================[]
Denis Parinov
(Sprinter Team)
2003/03/02 02:47
Re: Графические режимы [re: Anonymous]
> Здравствуйте. А как с палитрами??? Как загрузить произвольную
палитру
(отдельный цвет). Желательно с исходником.
;Установить 5-й цвет "средне-зеленым"
LD HL,COLOUR
LD DE,#0105
LD BC,#FFA4
XOR A
RST #08
; B G R
COLOUR DB #00,#80,#00,#00
;Изменить все 256 цветов в палитре
LD HL,COLOURS
LD DE,#0000
LD BC,#FFA4
XOR A
RST #08
;Параметры цвета
; B G R
COLOUR DB #00,#80,#00,#00
;Палитра
COLOURS DB #00,#00,#00,#00 ;Colour 0
DB #00,#00,#80,#00 ;Colour 1
DB #00,#80,#00,#00 ;Colour 2
DB #00,#80,#80,#00 ;Colour 3
...
DB #FF,#FF,#FF,#00 ;Colour 255
> I set A=0 in the SCROLL call, expecting this to clear the bottom line,
but this did not happen, so I had to add a CLEAR call as well. Is this a
bug, or did I misunderstand the documentation?
Unfortunately, I can't check it on Sprinter now. But source code of the
SCROLL function looks good. I will check it as soon as possible.
> For the cursor, I am just doing RDCHAR and then WRCHAR with all the
attribute bits inverted. This gives me a solid cursor block (if over a
space) or an inverted blinking character (if over a character). This is
fine, but I may like to try and improve the appearance, so it is always
solid or always flashing. Can you give me some information on what the
attribute values represent?
We use standard CGA / VGA text colors by default. It can be changed in the
palette.
Text attributes
bit 7 - Blink symbol
bits 6,5,4 - Background color (8 colors) (0...7) RGB
bits 3,2,1,0 - Ink colors (16 colors) (0...15) IRGB
Colors used for Background and Ink
0 0h 0000b - Black
1 1h 0001b - Blue
2 2h 0010b - Green
3 3h 0011b - Cyan
4 4h 0100b - Red
5 5h 0101b - Magenta
6 6h 0110b - Brown
7 7h 0111b - White
Colors used for Ink only
8 8h 1000b - Gray
9 9h 1001b - Bright Blue
10 Ah 1010b - Bright Green
11 Bh 1011b - Bright Cyan
12 Ch 1100b - Bright Red
13 Dh 1101b - Bright Magenta
14 Eh 1110b - Yellow
15 Fh 1111b - Bright White
Как я понял, сейчас есть проблема с выводом на экран.
Попробую расписать схему видео-вывода на словах.
Режим адресации. Задается номером страницы.
Если номер 5Xh - адресация графическая.
Если номер не 5Xh - адресация спектрумовская, и она включена все время, даже если в соседней странице включился номер 5Xh.
Спектрумовская адресация, это доступ к видеопамяти на запись в адресах 4000h..5FFFh или в 4000h - 7FFFh, в зависимости от состояния порта PORT_Y (89h).
Бит 6 = 1 - отключает вывод в спектрумовское окно памяти.
Бит 7 = 1 - расширяет спектрумовское окно с 8Kb до 16Kb
Бит 4..0 - пределяет 8kb банк спектрумовского режима.
Эти банки располагаются "вертикально", т.е. такой банк соответствует 32-м последовательным точкам на графической линии и 256-ти линиям.
Сначала я чаще всего использовал окно 4000h..7FFFh для работы с графикой, поэтому получилось так, что графическая адресация перекрывала спектрумовскую при включении в порт A2h значения 5Xh, а выше 8000h использовалось программой, потом, когда стали использовать для вывода на экран страницу 0C000h, получилось так, что в странице 4000h оставалась открыта видеопамять со спектрумовской адресацией, а порт 89h используется и там и там, но с разным назначением.
Т.е. после открытия страницы 0C000h для графики остается открытой и спектрумовский способ адресации видеопамяти в странице 4000h..7FFFh...
P.S. Надеюсь, что не запутал все окончательно...
Шрифты
Alex_Goryachev
(Sprinter Team)
2002/05/28 11:44
Re: Несколько наборов шрифтов одновременно [re: Shaos]
Вот ответ, полученный от Ivan Mak.
=== Cut ===
Через Bios:
IX - 32-хбайтовый описатель окна
(искать в описании, здесь только только самое важное)
........
(IX+4) - режим знакоместа
bit4=1 - text_mode
bit5=0 - 16, bit5=1 - 8 точек в знакоместе (80/40 символов)
bit7..6,3..0 - номер знакогенератора
исключение: bit7..6=B"11" - бордер
.......
Он же (IX+4) - номер используемого знакогенератора в этом окне, он
же
регистр B в функциях B4,B5
Функция B0 открытие окна использует описатель, в котором указан
знакогенератор, открытый для всех символов данного окна. Он может
быть
перебит прямой записью в видео-память или фунцией B5, которая пишет
символ
со знакогенератором. При использовании функции B0 четвертый бит
регистра E
определяет, какая страница режима будет использоваться. Для работы с
двумя
страницами надо открывать окно два раза со значениями 0 и 1 в 4-м
бите рег.E
=================================
0B4h (180) WIN_GET_SYM Взять символ с экрана
Значение регистров на входе:
C=0B4h
A - идентификатор окна (д.б. 0)
DE - положение символа в окне:
D - вертикаль, E - горизонталь
Значение регистров на выходе:
NC - нормальное завершение
L - символ, H - атрибут,
B - знакогенератор
CF - ошибка неверный идентификатор окна
=================================
0B5h (181) WIN_PUT_SYM Положить символ на экран
Значение регистров на входе:
C=0B5h
A - идентификатор окна
DE - положение символа в окне:
D - вертикаль, E - горизонталь
L - символ, H - атрибут символа
B - знакогенератор
Значение регистров на выходе:
NC - нормальное завершение
CF - ошибка неверный идентификатор окна
=================================
0B6h (182) WIN_SET_ZG Установка знакогенератора
Значение регистров на входе:
C=0B6h
A - системный номер знакогенератора
DE - указатель на 2Kb данных знакогенератора
Значение регистров на выходе:
NC - нормальное завершение
CF - ошибка (старая версия, нет функции)
=================================
0B8h (184) WIN_GET_ZG Получение знакогенератора
Значение регистров на входе:
C=0B8h
DE - адрес, куда будет загружено 2kb знакогенератора
Значение регистров на выходе:
NC - нормальное завершение
CF - ошибка (старая версия, нет функции)
Функция копирует имеющийся знакогенератор из ПЗУ
=================================
Для работы напрямую, окна должны быть открыты биосом,
знакогенераторы установлены.
Вывод символов осуществляется в графическом режиме адресации, через
страницу 50h. В порт 89h записывается номер символа, адрес в линии
определяет строку. В этот адрес записывается четыре байта,
определяющих
символ, атрибут и знакогенератор.
Bytes:
byte0 - знакогенератор/режим то же, что в (IX+4)
byte1 - символ
byte2 - атрибут
byte3 - reserved (заполнить нулями)
Port_Y - номер линии засылаемый в порт 89h
линия 1+S S=0..79 - номер символа в строке для экрана 0
линия 128+S S=0..79 - номер символа в строке для экрана 1
(S=0 - выводит символ слева)
Adress: в линии 768+N*4 - N - номер строки экрана 0..31.
Адрес одинаков для обоих экранов.
(N=0 выводит символ сверху)
В режиме 40 символов, номера строк через один: 1,3,5...79
Экраны переключаются нулевым битом порта 0C9h
=== Cut ===
---
PETERS PLUS LTD
----------------------------------------------------------------
Текстовый экран устроен на удивление просто: в области описания экрана в текстовом режиме на один символ отводится 4 байта (номер знакогенератора, код символа, атрибут и один неиспользуемый байт), причем надо обратить внимание на то, что в этом режиме экран "повернут на бок". Что-бы вывести символ на экран, надо в Port_Y (0x89) записать 128+номер символа в строке (от 0 до 79), затем к адресу начала экранной страницы прибавить 768 (для первого экрана), после чего мы получим адрес байта, в котором хранится номер знакогенератора для вывода символа (поменяйте его, если это необходимо), увеличиваем адрес на один и туда записываем уже код самого символа, а в следующий байт - атрибут этого символа. Что-бы перейти на следующую строку текстового экрана, надо прибавить к адресу начала экранной страницы число 4*номер строки. Используя акселератор (команду копирования вертикальной линии) можно очень быстро выводить текст строки на экран.
Остается только добавить что прямой доступ к области описания экрана не рекомендован разработчиками, т.к. есть веротяность потери совместимости со следующими моделями, где символы могут описываться подругому. Но если вам необходима большая скорость вывода на экран в текстовом режиме и вы готовы после выпуска программы вносить в неё изменения для обеспечения совместимости со следующими моделями, либо выложить исходники программы, что-бы желающие могли их исправить при необходимости, то, мне кажется можно использовать прямой доступ.
---
Mac Buster^Extreme Entertainment
Also use BIOS fn. 0B6h for set new font and 0B8h for get current font.
Font format like first 2K bytes of spectrum screen. You can load font at the 4000h address in ZX mode and see it.
for example, char "A" will placed in the memory as
offset bytes
0041h 00000000b
0141h 00111100b
0241h 01000010b
0341h 01000010b
0441h 01111110b
0541h 01000010b
0641h 01000010b
0741h 00000000b
Память
Denis Parinov
(Sprinter Team)
2002/08/28 22:11
Re: Манаджмент памяти [re: cr0acker]
> В конфигурации спринтер
> по #0000..#3FFF, при работе ДСС находится сама ДСС с её Резетами,
тет
чтоб использывать когда сюда подставленна страница пользователся
резеты не доступны!.
Это так в нижних 16K находится DSS / BIOS в остальных 48К
приложение, но с
определенными особенностями. Стек не должен быть выше #BFFF при
вызове DSS и ниже #8000 при вызове некоторых функций BIOS.
В следующих версиях DSS планируется снятие ряда ограничений на стек
и расположения данных при вызове ее функций.
> Теперь адресса #4000..#7FFF,#8000..#BFFF,#C000..#FFFF, когда ДСС
передаёт управление эти прогораммам, какие банки там нахадятся по
умолчанию?
В зависимости от адреса загрузки и размера приложения DSS выделяет
необходимое число страниц памяти. Так при размере меньше 16К будет
выделена
одна страница, при размере больше 16К - две, и т.д. В окна с
"неиспользуемым" адресном пространством будет подключатся
специальная страница #FF.Если приложению требуется памяти больше чем
зарезервировано в exe-файле, оно должно выделить себе дополнительный
блок памяти самостоятельно.
> Теперь память можно челкать по портам #7FFD,1FFD или нет?
> И если да, то как типа in #&7FFD,(номер страницы).
Напрямую память можно счелкать через 4 порта памяти:
#82 - #0000-#3FFFF
#A2 - #4000-#7FFFF
#C2 - #8000-#BFFFF
#E2 - #C000-#FFFFF
Записывая физический номер страницы в порт. Список номеров
физических страниц для выделенного блока памяти можно получить через
BIOS.
> Также хотеловсь бы увидет пример по использывани фции 38х Setwin!
SETWIN работает с логичискими страницами.
38h (56) SETWIN (Подключение страницы памяти)
входные данные:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
H - биты 6 и 7 задают номер окна, в которое будет подключена страница
C - 38h
выходные данные:
A - номер страницы, если CF=0
A - код ошибки, если CF=1
Функция вычисляет физический номер страницы в блоке памяти и подключаетеё
в окно адресного пространства в зависимости от значения регистра HL. Тоесть,
если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница
подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000hдо
0FFFFh - третье.
На выходе в регистре A содержится физический номер страницы, которая
была подключена до выполнения функции.
Выделить блок памяти 32К и подключить его страницы в #8000 и #C000
окна:
;
LD C,#3D ;GETMEM
LD B,2 ;BLOCK 32K
RST #10 ;SYSTEM CALL
JR C,ERROR ;MEMORY ALLOCATION ERROR
LD (MEMHND),A ;SAVE MEMORY HANDLE
;
LD HL,#8000 ;FRAME ADDRESS
LD C,#38 ;SETMEM
LD B,0 ;FIRST MEMORY PAGE
LD A,(MEMHND) ;MEMORY HANDLE
RST #10 ;SYSTEM CALL
JR C,ERROR ;MEMORY ALLOCATION ERROR
;
LD HL,#C000 ;FRAME ADDRESS
LD C,#38 ;SETMEM
LD B,1 ;SECOND MEMORY PAGE
LD A,(MEMHND) ;MEMORY HANDLE
RST #10 ;SYSTEM CALL
JR C,ERROR ;MEMORY ALLOCATION ERROR
;
> Заранне спасибо
Denis Parinov
(Sprinter Team)
2002/08/31 00:43
Re: Манаджмент памяти [re: cr0acker]
> Во! Пасибо большое? А еслищёлкать портами то есть возможномть что
программа будет совместима с будущей версией ПЗУ/АЛТЕРЫ/ДСС/ПЛАТЫ?
Да, в любом случае будет возможность запуска программ в той
конфигурации для которой она была написана. Что-то вроде режима
совместимости. Но если для программы не критично работа напрямую
через порты, лучше пользоваться SETWIN как более универсальный.
>> Так при размере меньше 16К будет выделена одна >страница, при
размере больше 16К - две, и т.д. В окна с "неиспользуемым" адресном
пространством будет >подключатся специальная страница #FF.
> Какие физические номера этих страниц к приме 1,2,3,,,256!
Это можно узнать через функцию BIOS, эти номера будут разными в
зависимости от того сколько памяти было выделено другим приложениям.
Denis Parinov
(Sprinter Team)
2002/08/31 00:50
Re: Манаджмент памяти [re: cr0acker]
> Денис а такой вариант выделения памяти будет работать?
> START
> ORG #4000
> NOP
> ORG #8000
> NOP
> ORG #C000
> nop
> Дальше нужный орг и прога!
Да, если конечно будет записан код от #4000 до конца программы, а не
от последнего ORG, как это делают некоторые ассемблеры.
Еще одно замечание, для DSS1.xx exe-файлы могут начинаться с #4100,
но после запуска можно использовать память с #4000.
cr0acker
(enthusiast)
2003/07/19 22:34
Непонятки. [re: Denis Parinov]
В документации по спринтеру, есть такая фраза:
#82 - PAGE0 - страница ОЗУ, подключаемая вместо ПЗУ через порт
#1FFD.
Что-бы это значило?
ld a, номер_подключаемой_страницы
out (#82),a
ld a, _что?_
out (#1ffd),a
Denis Parinov
(Sprinter Team)
2003/07/20 00:39
Re: Непонятки. [re: cr0acker]
LD A,1 ;RAM #0000-#3FFF
LD BC,#1FFD
OUT (C),A
;
LD A,0 ;ROM #0000-#3FFF
LD BC,#1FFD
OUT (C),A
Fast-RAM включается подобно КЭШ-памяти в 'Пентагоне'.
Включение/выключение происходит с помощью кода:
DI
IN A,(#FB) ; включить Fast-RAM - 16к в 0-е окно
; (в адреса #0000..#3FFF)
......... ; your programm
IN A,(#7B) ; выключить Fast-RAM
EI
Если надо использовать прерывания, программа должна установить
свой обработчик в адрес #0038
Следует иметь в виду, что Fast-RAM может быть использована другими
программами, т.е. при запуске некоего процесса через DSS содержание
Fast-RAM может не сохраниться.
Перед вызовом функций DSS и BIOS Fast-RAM надо отключать.
Файлы
Denis Parinov
(Sprinter Team)
2002/06/26 12:58
Re: Оргинизация памяти [re: cr0acker]
> И ещё аопрос по функции 16h подскажите плз намера атрибутов в
частномти можно ли узнать размер файла этой функцией?
Размер файла можно узнать с помощью функции 15h.
15h (21) MOVE_FP (Перемещение указателя в файле)
входные данные:
A - файловый манипулятор
HL:IX - смещение указателя в файле
B - способ перемещения
B=0 от начала файла
B=1 от текущего значения указателя
B=2 от конца файла
C - 15h
выходные данные:
A - код ошибки, если CF=1
HL:IX - новое значение указателя
HL:IX интерпретируется как 32-битное число. Если число меньше 65536,
регистр HL содержит 0. Возможны следующие способы перемещения указателя:
B=0 Смещение считается от начала файла, если HL:IX=0, указатель
устанавливается на начало файла.
B=1 Смещение считается от текущего значения указателя.
B=2 Смещение считается от конца файла, если HL:IX=0, послеперемещения
HL:IX получится длина файла в байтах.
Атрибуты файла:
Каждый бит байта атрибутов задаёт определённый атрибут файла.
Атрибуты
файлов можно изменять специальной функцией ДОС.
бит 0 - Только для чтения
бит 1 - Скрытый
бит 2 - Системный
бит 3 - Метка тома
бит 4 - Каталог
бит 5 - Архивный
бит 6 - Не используется
бит 7 - Не используется
Атрибут "только для чтения". При значении 1 из файла можно читать,
но в
него нельзя писать и его нельзя стереть.
Атрибут "скрытый". При значении 1 файл невиден для обычных операций
ДОС.
Атрибут "системный". Указывает, что файл является системным.
Атрибут "метка тома". В старых версиях MSDOS использовался для
задания
метки диска.
Атрибут "каталог". При значении 1 идентифицирует файл как каталог,
подчинённый данному каталогу или элементы "." и "..".
Атрибут "архивный". Этот бит устанавливается при операциях записи в
файл.
Его могут использовать утилиты создающие архивные копии для
сохранения
изменённых файлов.
Звук
Ivan_Mak
(Sprinter Team)
2002/09/13 04:28
Re: Программирование звука [re: Shaos]
Звук через COVOX-Blaster (COVOX с буферным ОЗУ)
CBL=COVOX-Blaster
Порт управления: 004Eh (16-bit port!!!, писать только через OUT
(c),reg)
; bit 7 - COVOX-Blaster on (если 0 то обычный режим COVOX)
; bit 6 - STEREO-mode on
; bit 5 - 16bit-mode on
; bit 4 - Interrupt on - включение прерываний
; bits 3..0 - частота
;
; 0 16khz -- mono/stereo --- это старые режимы -- не использовать!
; 1 22khz -- mono/stereo --- это старые режимы -- не использовать!
; 2 reserved
; 3 reserved
; 4 reserved
; 5 reserved
; 6 reserved
; 7 reserved
;
; 8 7.8125 KHz -- mono/stereo 8/16 bit
; 9 10.9375 KHz -- mono/stereo 8/16 bit
; A 15.625 KHz -- mono/stereo 8/16 bit
; B 21.875 KHz -- mono/stereo 8/16 bit
; C 31.25 KHz -- mono/stereo 8/16 bit
; D 43.75 KHz -- mono/stereo 8/16 bit
; E 54.6875 KHz -- mono/stereo 8/16 bit
; F 109.375 KHz -- mono/stereo 8/16 bit
Порт 0FEh - биты запроса прерываний от CBL
bit 7 - запрос данных для CBL
bit 5 - синхронизация экрана (кадровый импульс, 4мс длиной, 20мс
период)
Запись данных в COVOX-Blaster производится с помощью акселератора,
записью в страницу ОЗУ 0FDh (просто записать блок 128/256 байт с
адреса 0C000h)
или через порт 4Fh командами OTIR блок записываемых данных по
запросу. Для 8 бит режима - 128 байт; для 16 бит - 256 байт
Самый простой пример:
Test:
LD BC,04Eh
LD A,8Bh ; включить 8 бит 22khz mono
OUT (C),A ; - CBL - включен!
INC C
LD HL,Sample
OTIR ; загрузить все 256 байт
RET
Sample:
DB 80h,81,82h,.... ; (256 отсчетов звука с нулем на уровне 80h)
Должен пищать одну ноту (если в Sample записать синус, то должно
чисто звучать).
Запрос данных в бите 7 порта FE появляется для каждых 128 байт (256
в режиме 16 бит). Его следует проверять, если его не оказалось, то
прерывание экранное, а не от CBL.
При выставленных прерываниях от CBL, стоит использовать режим IM 2,
иначе, будет часто вызываться DOS-овая процедура прерываний и могут
появиться тормоза на высоких частотах.
В режиме 8 бит сэмплы должны иметь уровень нуля на 80h,
16 бит сэмплы - уровень нуля - 0000h
Stereo-сэмплы - должны иметь чередующиеся отсчеты левого и правого
канала.
mono_8bit:
DB 80h,81h,7Fh....
mono_16bit:
DW 0,1000,-1000...
stereo_8bit:
DB 80h,80h,81h,80h,7Fh,80h... ; здесь один канал играет, второй молчит
stereo_16bit:
DW 0,0,1000,0,-1000,0... ; аналогично, один канал играет, второймолчит
(При тестировании 16 бит режима следует помнить, что звук с
амплитудой в единицы почти не слышен)
P.S. Формат данных выбран так, что бы из WAV-файлов данные в CBL
пересылать простой операцией блочной пересылки.
ISA-8 слоты
Summary
This article describe ISA-8 interaction.
More information
If you want to interaction with ISA devices, you have to make following steps:
1) send 10h value to port 1FFDh(system port);
2) send control byte to port 0E2h(third memory window port);
control byte:
D7...should be 1
D6...should be 1
D5...should be 0
D4...should be 1
D3...should be 0
D2...specify number of ISA slot
D1...specify access mode (0 - ISA memory, 1 - ISA ports)
D0...should be 0
The read/write signals are forming from read/write signals memory range 0C000h-0FFFFh.
And the address lines A13...A0 has taken from processor data-BUS. The other ISA-signals such as RESET, AEN, A19...A14 can be set in port 9FBDh. And default value is 00h.
port 9FBDh:
D7...RESET
D6...AEN
D5...A19
D4...A18
D3...A17
D2...A16
D1...A15
D0...A14
ISA_DIR EQU 9FBDh
SC_PORT EQU 1FFDh
PAGE3 EQU 0E2h
SAVE_PAGE DB 0 ;variable for previous status of third memory port
RESET_ISA: ; reset ISA device
LD C, ISA_DIR
LD A,0C0h
OUT (C),A
CALL Pause_10ms
LD A,0
OUT (C),A
RET
Pause_10ms:
LD HL,10000
Loop:
DEC HL
LD A,H
XOR L
JR NZ,Loop
RET
OPEN_ISA_PORTS: ; open access to ISA
LD BC,SC_PORT
LD A,10h
OUT (C),A
IN A,(PAGE3) ; read value from memory port
LD (SAVE_PAGE),A ; save previous status of memory port
LD A,0D2h ; control byte for (first (upper) ISA slot)
OUT (PAGE3), A ; opening ISA port address space
LD C,ISA_DIR
LD A,0 ; high ISA addresses RESET and AEN signals.
OUT (C),A
RET
CLOSE_ISA_PORTS: ; close access to ISA
LD A,(SAVE_PAGE)
OUT (PAGE3),A ; restore value of memory port
LD BC,SC_PORT
LD A,0
OUT (C),A ;
RET
WRITE_ISA_PORT:
LD HL,ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3
memory page
LD A,DATA_OUT ; data for writing
LD (HL),A ; write data to port which pointered HL
RET
READ_ISA_PORT:
LD HL, ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3
memory page
LD A,(HL) ; read data from port which pointered HL
RET
When you work with ISA, the access to third memory page are disabled. If you want to address ISA-memory more than 3FFFh, you should specify high bits in port 9FBDh.
Акселератор компьютера Sprinter.
Акселератор предназначен для ускорения операций по пересылке блоков данных в ОЗУ и видео-ОЗУ.
Акселератор позволяет:
- быстро заполнять горизонтальную или вертикальную линию длиной до 256 точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную линию длиной до 512 точек)
- быстро копировать горизонтальную или вертикальную линию длиной до 256 точек (в режиме 640x256 - горизонтальную линию до 512 точек)
- проводить быстрые операции AND, OR, XOR с блоками памяти.
Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ.
ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ.
Операции по пересылке данных производятся путем записи блока данных в это
внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ акселератора.
Блок данных, записываемый в ОЗУ акселератора может иметь различную
длинну из диапазона 1..256 байт.
После одной записи копирование может производиться несколько раз и, таким
образом, можно производить заполнение экрана текстурами.
Для заполнения экрана одним цветом используется другой режим
акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ
производится запись данных с шины процессора, которые в этот момент не
изменяются.
Управление акселератором производится непосредственно из программы.
Для этого изпользуются команды процессора, которые, фактически, являются
операциями типа NOP.
LD B,B - выключить акселетарор.
LD D,D - включить акселератор в режим приема байта размера блока
далее следует команда типа LD A,dat, где dat и будет новым
размером блока. Если размер блока был установлен ранее,
его можно не устанавливать.
LD C,C - Операция Fill - заполнение одним байтом. Последующая
команда типа LD (HL),A приведет к заполнению указанного
ранее количества байт значением A
LD E,E - Операция Fill для графического экрана - заполнение
вертикальных линий.
LD H,H - rezerved
LD L,L - копирование блока. Последующая команда типа LD A,(HL)
приведет к заполнению ОЗУ акселератора данными из адреса (HL),
а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ
акселератора в ОЗУ или видео-ОЗУ.
LD A,A - копирование блока для графического экрана подобна команде
LD L,L, но работает с вертикальными линиями экрана.
Пример использования акселератора:
; Считаем, что экранная страница уже открыта по адресу #C000
LD HL,#C040 ; адрес начала линии первого экрана
LD DE,#C180 ; адрес начала линии второго экрана
LD BC,#140 ; длина экрана по горизонтали
DI ; запретить прерывания для работы с акселератором
LD D,D ; включить акселератор на установку размера блока
LD A,0 ; установить размер блока - 256 байт
LD A,A ; установить акселератор на копирование
; вертикальных линий.
LDIR ; копировать
LD B,B ; выключить акселератор
EI ; включить прерывания
Эта часть программы произведет копирование всего содержимого первого экрана на другой.
Время исполения составляет примерно 26 милисекунд.
Дополнительные функции акселератора (AND, OR, XOR) работают таким же образом.
Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL).
Пример кодирования блока в 256 байт.
LD HL,ADRES_1
LD DE,XOR_DAT
DI
LD D,D
LD A,0 ; число байт, которые надо закодировать
LD L,L
LD A,(DE) ; взять блок данных в ОЗУ акселератора
XOR (HL) ; произвести операцию XOR с данными акселератора
LD (HL),A ; запомнить в ОЗУ результат операции
LD B,B
EI
Скорость работы акселератора ограничивается только физической
скоростью работы основного ОЗУ. Определить примерное время работы команды с
акселератором можно по такой формуле:
Время работы = время работы команды без акселератора + время работы
акселератора
Время работы акселератора = число пересылаемых байт /7 микросекунд
Во время работы акселератора необходимо отключать прерывания, так как в этот момент изменяется система команд процессора и программа на прерывании не сможет работать корректно.
Прерывания
Кадровые и клавиатурные прерывания приходят с вектором 0FFh, отличать по биту приема байта в порте клавиатуры, не пришел, значит экран. Возможно, конечно, совпадение но это исключительно редкий случай.
От мыши прерывания не приходят. Сделать можно, но сейчас их нет. Кстати и различие от экранных прерываний можно (и, видимо, надо будет в новой версии) сделать пожестче через прошивку в ПЛМ.
От ISA и других внутренных портов процессора прерывания приходят с другим вектором (настраивается в портах), поэтому в режиме IM 2 они легко различаются.
IDE контроллер
Доступ к поpтам осуществляется пpи неактивном Beta-Disk интеpфейсе.
Со схемой без поллитpы не pазобpаться, пpивожу поpты как есть:
поpт pегистp накопителя
---- блок командных регистров ----
xx50 0 (data)
0051 1 (error/feature)
0052 2 (sector count)
0053 3 (sector number)
0054 4 (cylinder low)
0055 5 (cylinder high)
4052 6 (device/head)
4053 7 (status/command)
---- блок управляющих регистров ----
4054 16 (alternate status/control)
4055 17 ?
Пpи записи в поpт нужно его адpес увеличить на 0x100.
Пpи чтении pегистpа данных пpи a8=0 выpабатывается стpоб чтения и
младшая часть (D0-D7) шины данных накопителя выдаётся на шину спектpума,
а стаpшая сохpаняется в теневом pегистpе. Пpи a8=1 читается теневой
pегистp (D8-D15).
Пpи записи pегистpа данных когда a8=0 байт сохpаняется в теневом pегистpе
и стpоб записи для накопителя не выpабатывается. Пpи записи pегистpа данных когда
a8=1 выpабатывается стpоб записи для накопителя и байт с шины спектpума выдаётся на
D8-D15 шины накопителя, на D0-D7 выдаётся содеpжимое теневого pегистpа.
Контроллер имеет общий теневой регистр для записи и чтения.
вот мои раскопки на эту тему от 13.10.2003:
- регистр команд | регистр состояния
4153h запись, 4053h чтение
- регистр накопителя/головки
4152h запись, 4052h чтение
- регистр циллиндра (старший байт)
0155h запись, 0255h чтение
- регистр циллиндра (младший байт)
0154h запись, 0254h чтение
- регистр данных
0150h запись, 0050h чтение
Верна информация.
С одним добавлением. Доступ открыт в режиме Sprinter-ZX,
а в режимах Pentagon, Scorpion и т.п. - закрыт!
FDD контроллер
0Fh Command/Status register
3Fh Track register
5Fh Sector register
FFh Drive Control register
In Spectrum configuration the port 0Fh also mapped to 1Fh for TRDOS
compatibility.
But I would recommend to you don't use direct port access for it.
A Sprinter have BIOS functions for reading/writing any disk sectors.
for example:
At first, make reset disk and to set required parameters.
INIT_DISK
LD D,n ; drive number 0-FDD A, 1-FDD B, 80h-HDD C...
LD C,#51 ; reset disk
RST #08 ; BIOS call
;
LD D,n ; drive number
LD E,n ; sectors per track.
PUSH DE
LD A,D
LD C,#58 ; get disk parameters
RST #08 ; BIOS call
LD A,H
POP HL
PUSH HL
LD H,A
POP AF
LD IX,256 ; sector size
LD C,#59 ; set disk parameters
RST #08 ; BIOS call
RET
And next to use BIOS fn. 055h for reading.
DRV_READ: ; reading from disk
LD A,drv_type ; bit 0..3 - drive number
; bit 4..7 - drive type
; 0 - FDD
; 6 - ram-disk (reserved)
; 8 - HDD
; C - CD-ROM (reserved)
LD HL,sec_h ; sector number (high)
LD IX,sec_l ; sector number (low)
; (HL:IX - 32bit sector number, like LBA)
LD B,n_sec ; sectors count
LD DE,bufer_adr ; memory address for reading
LD C,#55 ;
RST #08 ; CF=0 - read OK
; CF=1 - read error
Клавиатура
> How is it done ?
It's possible by DSS function 36h (K_SETUP). Sprinter has two keyboard
layouts (standard and alternative) which can be switched by [CTRL] +
[SPACE]. Each layout includes four keyboard modes. You can reload all of
them.
LD HL,LAYOUT
LD A,0 ;LAYOUT FOR NORMAL MODE
LD BC,#0036
RST #10
Esc EQU #1B
Bcs EQU #08
Tab EQU #09
Cps EQU #00
Spc EQU #20
Ent EQU #0D
;Normal mode (without CAPS and SHIFT not pressed)
DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]"
DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent
DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;SHIFT mode (without CAPS and SHIFT are pressed)
DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs
DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}"
DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent
DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;CAPS mode (with CAPS and SHIFT not pressed)
DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]"
DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent
DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;CAPS+SHIFT mode (with CAPS and SHIFT are pressed)
DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs
DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}"
DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent
DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
Прерывания от клавиатуры выставляют бит 0 в порте 19h, им и отличаются от прерываний экрана. Конечно, возможны случайные совпадения, когда прерывание от клавиатуры пришло одновременно с экранным, но это очень маловероятно. От других устройств прерывание может придти, но так же с некими признаками в портах (но это только в случае, если программа эти порты настроила и использует для себя)
Коды ошибок DSS
This is a list of DSS error numbers.
00h (00) - Success
01h (01) - Invalid function
02h (02) - Invalid drive number
03h (03) - File not found
04h (04) - Path not found
05h (05) - Invalid handle
06h (06) - Too many open files
07h (07) - File exist
08h (08) - File read only
09h (09) - Root overflow
0Ah (10) - No free space
0Bh (11) - Directory not empty
0Ch (12) - Attempt to remove current directory
0Dh (13) - Invalid media
0Eh (14) - Invalid operation
0Fh (15) - Directory exist
10h (16) - Invalid filename
11h (17) - Invalid EXE-file
12h (18) - Not supported EXE-file
13h (19) - Permission denied
14h (20) - Not ready
15h (21) - Seek error
16h (22) - Sector not found
17h (23) - CRC error
18h (24) - Write protect
19h (25) - Read error
1Ah (26) - Write error
1Bh (27) - Drive failure
1Ch (28) - Unknown error : 28
1Dh (29) - Unknown error : 29
1Eh (30) - No free memory
1Fh (31) - Invalid memory block
20h (32) - Unknown error : 32
---
PETERS PLUS LTD