c71e249a4e
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>
1060 lines
59 KiB
Plaintext
1060 lines
59 KiB
Plaintext
Форум
|
||
“Программирование Спринтера»
|
||
|
||
|
||
|
||
Оглавление:
|
||
TOC \o "1-3" \h \z HYPERLINK \l "_Toc65383363" Экран и палитра PAGEREF _Toc65383363 \h 2
|
||
HYPERLINK \l "_Toc65383364" Шрифты PAGEREF _Toc65383364 \h 7
|
||
HYPERLINK \l "_Toc65383365" Память PAGEREF _Toc65383365 \h 10
|
||
HYPERLINK \l "_Toc65383366" Файлы PAGEREF _Toc65383366 \h 14
|
||
HYPERLINK \l "_Toc65383367" Звук PAGEREF _Toc65383367 \h 16
|
||
HYPERLINK \l "_Toc65383368" ISA-8 слоты PAGEREF _Toc65383368 \h 18
|
||
HYPERLINK \l "_Toc65383369" Summary PAGEREF _Toc65383369 \h 18
|
||
HYPERLINK \l "_Toc65383370" More information PAGEREF _Toc65383370 \h 18
|
||
HYPERLINK \l "_Toc65383371" Акселератор компьютера Sprinter. PAGEREF _Toc65383371 \h 20
|
||
HYPERLINK \l "_Toc65383372" Прерывания PAGEREF _Toc65383372 \h 22
|
||
HYPERLINK \l "_Toc65383373" IDE контроллер PAGEREF _Toc65383373 \h 23
|
||
HYPERLINK \l "_Toc65383374" FDD контроллер PAGEREF _Toc65383374 \h 24
|
||
HYPERLINK \l "_Toc65383375" Клавиатура PAGEREF _Toc65383375 \h 25
|
||
HYPERLINK \l "_Toc65383376" Коды ошибок DSS PAGEREF _Toc65383376 \h 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
|
||
PAGE
|
||
|
||
|
||
PAGE 27
|
||
|
||
|
||
|
||
|