Форум

“Программирование Спринтера»







Оглавление:

Экран и палитра	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

