	; 8080 assembler code
	; трансляция на сайте https://caglrc.cc/~svo/i8080/
        .hexfile test.hex
        .binfile test.com
        ; try "hex" for downloading in hex format 					
        .download bin  

;==============================================================
;             Драйвер ром диска на статик рам 537 РУ 17       =
;               Схема из Радио №5 1996 г. стр 25              =
;==============================================================


        

;=============== ордос шапка ================================== 	        
       .ORG	0ABF0H		;адрес посадки драйвера минус
				;10h байт на шапку
				;ордос файла

	db	'ramromd$'	;имя файла ордос + признак
				;запускаемого
				;файла    
	dw	0ac00h 		;адрес посадки файла
	dw	endaddr-begaddr+1
				;размер тела файла
	db	0		;флаг защиты от записи
	dw	0		;служебные ячейки ордос
	db	0		;служебные ячейки ордос

;================ код драйвера =================================
;AC00 - патч ОРДОС в ОЗУ и передача ей управления
;ВЕРСИЯ ОРДОС НЕ ПРОВЕРЯЕТСЯ !!!!!!!!!!!!!!!!!!
 	
begaddr:LXI	H,PRD		;НОВЫЙ АДРЕС ПОДПРОГРАММЫ	
				;ЧТЕНИЯ БАЙТА ИЗ ДОПОЛНИТЕЛЬНОЙ
				;СТРАНИЦЫ ОЗУ (F836)

	SHLD	0BB3AH		;патчим ОРДОС (контроль версий 
				;!!!)			 
	SHLD	0BEB8H		;патчим ОРДОС (контроль версий 
				;!!!)		
	
	LXI	H,PWR		;НОВЫЙ АДРЕС ПОДПРОГРАММЫ
				;ЗАПИСИ БАЙТА
				;В ДОПОЛНИТЕЛЬНЫЕ СТРАНИЦЫ
				;ОЗУ (F839)
	
	
	SHLD	0BB53H		;патчим ОРДОС (контроль версий 
				;!!!) 
						
	SHLD	0BED6H		;патчим ОРДОС (контроль версий 
				;!!!)	
	JMP	0bffdh		;ПЕРЕДАЧА УПРАВЛЕНИЯ ORDOS

;===== п/п чтения с доп. страницы ОЗУ, вызывается из ORDOS ====
; в акк. номер страницы ОЗУ 
; при попытке чтения с 3 страницы ОЗУ переход на чтение 
; рамром диска
; иначе читаем байт в рег. С из выбранной страницы ОЗУ

PRD:	CPI	03H		;ЕСЛИ ЧТЕНИЕ СО СТРАНИЦЫ 03 ОЗУ
	JZ	RDB		;(DISK D), ТО переход НА
				;ПОДПРОГРАММУ
				;ЧТЕНИЯ БАЙТА С S.DISK
	
	CALL	0f836h		;ИНАЧЕ читаем СТРАНИЦу ОЗУ
				;как обычно
	RET			;можно просто jmp 0f836h

;===== п/п записи в доп. страницы ОЗУ, вызывается из ORDOS ====
; в акк. номер страницы ОЗУ 
; при попытке записи в 3 страницы ОЗУ переход на запись 
; рамром диска
; иначе пишем байт из рег. С в выбранную страницу ОЗУ
PWR:	CPI	03H		;ЕСЛИ ЗАПИСЬ В СТРАНИЦУ 03 ОЗУ
	JZ	WRB		;(DISK D), ТО ПЕРЕХОД НА
				;ПОДПРОГРАММУ
				;ЗАПИСИ БАЙТА В S.DISK
	CALL	0F839H		;ИНАЧЕ пишем СТРАНИЦу ОЗУ
				;как обычно
	RET			;можно просто jmp 0f839h
	
;========= Чтение байта из рамром диска =======================
RDB:	CALL	KM		;ПОДПРОГРАММА ВЫБОРА
				;МИКРОСХЕМ RAM СОГЛАСНО АДРЕСУ
	
	LXI	H,0F603H	;ПРОГРАММИРОВАНИЕ ПОРТА
				
	MVI	M,90H		;НА ЧТЕНИЕ
	DCX	H
	DCX	H		;В HL число 0F601h
	MOV	M,B		;ЗАПИСЬ КОДА, ОПРЕДЕЛЯЮЩЕГО
				;МИКРОСХЕМУ RAM
	INX	H		;В HL число 0F602h
	MVI	M,40H		;ВЫСТАВИТЬ СИГНАЛ ЧТЕНИЯ RD
	MVI	M,0C0H		;СНЯТЬ ХРАНЕНИЕ CS2=1
	LDA	0F600H		;СЧИТАТЬ БАЙТ
	MOV	C,A		;СОХРАНИТЬ ПОЛУЧЕННЫЙ 
				;БАЙТ В рег. С
	MVI	M,40H		;ВЫСТАВИТЬ ХРАНЕНИЕ CS2=0
	XRA	M		;СНЯТЬ СИГНАЛ RD
	DCX	H		;В HL байт 0F601h
	XRA	M		;ПЕРЕВОД ДИСКА S В ОСНОВНОЙ
	RET			;РЕЖИМ ХРАНЕНИЯ
	
;========= Запись байта в рамром диск =======================
WRB:	CALL	KM		;ПОДПРОГРАММа ВЫБОРА МИКРО
				;СХЕМ RAM СОГЛАСНО АДРЕСУ
	
	LXI	H,0F603H	;ПРОГРАММИРОВАНИЕ ПОРТА
	MVI	M,80H		;НА ЗАПИСЬ
	LXI	H,0F600H	;ЗАПИСЬ ДАННЫХ В ПОРТ
	MOV	M,C
	INX	H		;В HL число 0F601h
	MOV	M,B		;ЗАПИСЬ КОДА, ОПРЕДЕЛЯЮЩЕГО
				;МИКРОСХЕМУ RAM
	INX	H		;В HL число 0F602h
	MVI	M,80H		;СНЯТЬ ХРАНЕНИЕ CS2=1
	XRA	M		;ВОССТАНОВИТЬ ХРАНЕНИЕ CS2=0
	DCX	H		;В HL число 0F601h
	XRA	M		;ПЕРЕВОД ВСЕХ МИКРОСХЕМ RAM
	RET			;В ОСНОВНОЙ РЕЖИМ ХРАНЕНИЯ

;====== ПОДПРОГРАММа ВЫБОРА МИКРОСХЕМ RAM СОГЛАСНО АДРЕСУ ===
KM: 	MVI	B,0FEH		;КОД FE СООТВЕТСТВУЕТ ПОДКЛЮ
	MOV	A,H		;ЧЕНИЮ ПЕРВОЙ МИКРОСХЕМЫ
	CPI	20H		;HL<207
	JC	WRA		;ЕСЛИ ДА, ТО НА ПОДПРОГРАММУ
				;ЗАПИСИ АДРЕСА В ПОРТ F500
	
	CALL	CEO		;ЕСЛИ НЕТ, ТО НА ПОДПРОГРАММУ
	CPI	40H		;ПЕРЕКЛОЧЕНИЯ НА СЛЕДУЩУЮ
	JC	WRA		;МИКРОСХЕМУ RAM

	CALL	CEO
	CPI	60H
	JC	WRA
	
	CALL	CEO
	CPI	80H
	JC	WRA

	CALL	CEO
	CPI	0A0H
	JC	WRA

	CALL	CEO
	CPI	0C0H
	JC	WRA
	CALL	CEO
	CPI	0E0H		;HL < Е07
	JC	WRA		;ЕСЛИ <, ТО НА ПОДПРОГРАММу
				;ЗАПИСИ АДРЕСА В ПОРТ F500
	CALL	CEO		;ЕСЛИ >, ТО НА ПОДПРОГРАММУ
				;ПЕРЕКЛЮЧЕНИЯ МИКРОСХЕМ RAM
;======   ПОДПРОГРАММА ЗАПИСИ АДРЕСА В ПОРТ F500 ============	
WRA:	PUSH	H		;WRA: ПОДПРОГРАММА УСТАНОВКИ
	LXI	H,0F503H	;АДРЕСА HA АДРЕСНОЙ ШИНЕ
	MVI	M,90h		;МИКРОСХЕМ RAM ПОСРЕДСТВОМ
	POP	H		;ПОРТА F500
	SHLD	0F501H
	RET	
;
CEO:    MOV	A,B		;СЕО: ПОДПРОГРАММА ИЗМЕНЕНИЯ
	RLC			;КОДА, ОПРЕДЕЛЯЩЕГО МИКРО
	MOV	B,A		;СХЕМУ, НА СЛЕДУЩИЙ
	MOV	A,H
endaddr:RET

	end	
