mirror of
https://github.com/romychs/Orion-PRO.git
synced 2025-04-19 03:49:51 +03:00
1123 lines
32 KiB
NASM
1123 lines
32 KiB
NASM
;=========================================
|
||
;
|
||
; " ORION-PRO "
|
||
; Расширенные функции
|
||
; V0.06 12.02.95
|
||
; V2.10 18.04.00
|
||
;=========================================
|
||
|
||
; ==============================================
|
||
; Блок внешней загрузки CM/M для режима Орион-128
|
||
; ==============================================
|
||
EXTB
|
||
DISP 0xF3A0
|
||
|
||
EXTLD CALL 0x2003 ; Иициализация режима Orion-128
|
||
POP AF
|
||
LD C,A ; рабочая страница
|
||
LD A,0x1
|
||
CALL 0xF830 ; Установка страницы (XPAGE)
|
||
RST CLD_START
|
||
ENT
|
||
EXTE ;
|
||
|
||
MMMPB ;
|
||
DISP 0xF800
|
||
; ----------------------------------------------
|
||
; Знаком "*" помечены вектора, перенастраиваемые при
|
||
; инициализации драйвера TV-PRO
|
||
; ----------------------------------------------
|
||
MEXTX
|
||
JP ST1
|
||
JP KBRDX ; 03 переход на пп обработки клавиатуры
|
||
JP KBDCTL ; 06 управление клавиатурой
|
||
TVSYM JP TVC ; 09 * вывод символа на TV
|
||
TVSCR JP PUSTO ; 0С * управление экранами
|
||
TVOUT JP PUSTO ; 0F * вывод символа/курсора
|
||
KB_STTS JP STTSX ; 12 проверка статуса клавиатуры
|
||
HEX_OUT JP HEX ; 15 байт=>TV(2ASCII)
|
||
JP MSGX ; 18 вывод символьного сообщения
|
||
JP INKEYX ; 1B ввод кода нажатой клавиши
|
||
GCUR JP RCUR ; 1E положение курсора
|
||
JP PRINT ; 21 вывод на печать
|
||
JP NMKEYX ; 24 ввод номера нажатой клавиши
|
||
INFST JP INFAST ; 27 быстрый INKEY
|
||
TVGRF JP PUSTO ; 2A * вывод графики
|
||
TVSERV JP PUSTO ; 2D * вектор дополнительных функций TV
|
||
JP FILLP ; 30 запись константы в PAGE
|
||
JP MOVBL ; 33 перенос блока PAGE/PAGE
|
||
RRAM JP RRAMX ; 36 чтение байта доп. страницы
|
||
WRAM JP WRAMX ; 39 запись байта доп. сраницы
|
||
SCUR JP WCUR ; 3С установка курсора
|
||
SOUND JP SND ; 3F вход в звуковой синтез
|
||
JP RDWIN ; 42 восстановление состояния диспетчера ОЗУ
|
||
JP WRWIN ; 45 сохранение состояния диспетчера ОЗУ
|
||
JP JPWIN ; 48 установка варианта диспетчера и переход
|
||
JP OPCLW ; 4B открыть/закрыть окно ОЗУ, ПЗУ
|
||
MOUSE JP MOUS ; 4E опрос порта мыши
|
||
MOUCTR JP MOUCTL ; 51 управление мышью
|
||
JP RDSEC ; 54 чтение сектора диска
|
||
JP WRSEC ; 57 запись сектора диска
|
||
JP SYS_X ; 5A управление системой
|
||
JP VERSION ; 5D версия ROM1/ROM2
|
||
KBSND JP BEEP ; 60 звук клавиатуры
|
||
KBSIG JP PUSTO ; 63 сигнал переключения флагов клавиа...
|
||
|
||
ST1
|
||
LD SP,STACK
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
OR 0x18 ; Вкл ROM1 и ROM2
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
LD HL,STTYT ; ORION-POWER SYSTEM
|
||
CALL MSGXX
|
||
LD BC,0x40c4
|
||
|
||
LNTT
|
||
CALL TVSYM
|
||
DJNZ LNTT
|
||
LD HL,XTYT ; LOADING DISK-SYSTEM...
|
||
CALL MSGXX
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
AND 0xe0 ; Выкл ROM1 и ROM2
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
|
||
; ----------------------------------------------
|
||
; Загрузка системы с дисков
|
||
; ----------------------------------------------
|
||
IN A,(PORT_00_DIPSW)
|
||
RRCA
|
||
JP C,NOFDD
|
||
LD A,0x10
|
||
OUT (PORT_14_VG_CTL),A
|
||
LD A,0xd0 ; Принудительное прерывание
|
||
CALL WRCOM
|
||
LD A,0x4b ; Шаг вперед (для 3,5")
|
||
CALL WRCOM
|
||
LD A,0x8 ; TRK-00
|
||
CALL WRCOM
|
||
LD B,0xa
|
||
|
||
; ----------------------------------------------
|
||
; Проверка наличия дискеты (для 5.25") - ускоряет!
|
||
; Если дискета не вставлена в дисковод 5.25", то сигнал INDEX = 1.
|
||
; Если дискета вставлена но дверца не закрыта, INDEX = 0.
|
||
; При вращении дискеты, длительность сигнала INDEX = 1 около 5мс.
|
||
; Для дисководов 3.5", при отсутствии дискеты, всегда INDEX = 0.
|
||
; ----------------------------------------------
|
||
IS_IDX
|
||
PUSH BC
|
||
LD BC,0x1 ;1мс
|
||
LD DE,0x0 ;0Гц
|
||
CALL SOUND
|
||
POP BC
|
||
IN A,(PORT_10_VG_CMD)
|
||
BIT 0x1,A
|
||
JR Z,NOIDX
|
||
DJNZ IS_IDX
|
||
JP NOFDD
|
||
|
||
; Проверка готовности дисковода
|
||
NOIDX
|
||
LD DE,0x0
|
||
RDY
|
||
IN A,(PORT_10_VG_CMD)
|
||
RLCA
|
||
JP NC,ST2
|
||
LD A,0xa
|
||
RDYCYC
|
||
DEC A
|
||
JR NZ,RDYCYC
|
||
DEC DE
|
||
LD A,D
|
||
OR E
|
||
JR NZ,RDY
|
||
JP NOFDD
|
||
NOSYS
|
||
LD HL,TBER4
|
||
JR ERR2
|
||
ERROR
|
||
LD HL,TBERR
|
||
ERR2
|
||
PUSH HL
|
||
LD HL,TBER0
|
||
CALL MSGXX
|
||
POP HL
|
||
CALL MSGXX
|
||
LD HL,TBQT
|
||
CALL MSGXX
|
||
CALL KBRDX
|
||
CP 0x3
|
||
JR Z,ERR21
|
||
CP 0x1b
|
||
JP NZ,ST1
|
||
ERR21
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
OR 0x10
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
JP SYSMON
|
||
|
||
; Загрузка с дискеты
|
||
ST2
|
||
LD HL,FLTYT
|
||
CALL MSGXX ; Вывод: Загрузка с НГМД
|
||
LD A,0x1
|
||
OUT (PORT_12_VG_SECT),A
|
||
LD HL,BUFF
|
||
CALL RDSEC
|
||
JR NZ,ERROR
|
||
ANBUF
|
||
LD A,(HL)
|
||
CP 0xc3
|
||
JR NZ,NOSYS ; Не системный диск
|
||
LD HL,BUFF
|
||
LD DE,0x0
|
||
LD BC,0x100
|
||
LD A,(BUFF+0x2F)
|
||
INC A
|
||
JP Z,BUFF
|
||
CP 0x5
|
||
JP NC,NOSYS
|
||
DEC A
|
||
JR NZ,ST6
|
||
LD B,0x4
|
||
ST6
|
||
PUSH AF
|
||
CALL MOVBL
|
||
POP AF
|
||
OUT (PORT_08_RAM_PG),A
|
||
CP 0x2
|
||
JP NC,CLD_START
|
||
|
||
; Инициализация режима О128
|
||
LD SP,0xf3c0
|
||
PUSH AF ; Сохранить страницу
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
OR 0x18
|
||
OUT (PORT_0A_MEM_CFG),A ; Включить ROM1,2
|
||
XOR A
|
||
OUT (PORT_09_ROM2_SEG),A
|
||
DEAD
|
||
LD A,(0x2003)
|
||
CP 0xc3
|
||
JR NZ,DEAD
|
||
LD HL,EXTB
|
||
LD DE,EXTLD
|
||
LD BC,EXTE-EXTB
|
||
LDIR
|
||
JP EXTLD
|
||
|
||
; ----------------------------------------------
|
||
; Старт системы с HDD
|
||
; ----------------------------------------------
|
||
NOFDD
|
||
IN A,(PORT_00_DIPSW)
|
||
BIT 0x1,A
|
||
JR Z,LDHDD
|
||
|
||
;Нет дисков, загрузка из ПЗУ
|
||
CALL W93OFF
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
OR 0x18 ; Вкл ROM1,ROM2
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
LD HL,0x2008 ; Адрес ROM2
|
||
LD C,0x4 ; Сегмент ROM2 с CP/M
|
||
CALL TSTR2 ; Есть сегмент с CM/M?
|
||
JR Z,NODSK
|
||
LD HL,(CPM_ROM2)
|
||
LD A,L
|
||
CP H
|
||
JP NZ,CPM_ROM2
|
||
NODSK
|
||
JP SYSMON
|
||
LDHDD
|
||
CALL W93OFF
|
||
LD HL,HDTYT
|
||
CALL MSGXX
|
||
LD A,0x2
|
||
OUT (PORT_56_HDD_CTL),A
|
||
LD DE,0x6ff ; Ожидание готовности
|
||
NRLOOP DEC DE
|
||
LD A,D
|
||
OR E
|
||
JP Z,ERROR ; Not ready
|
||
LD B,0xff
|
||
HDD_DLY
|
||
EX (SP),HL
|
||
EX (SP),HL
|
||
EX (SP),HL
|
||
EX (SP),HL
|
||
EX (SP),HL
|
||
DJNZ HDD_DLY
|
||
IN A,(PORT_5F_HDD_STAT_CMD)
|
||
OR A
|
||
JP M,NRLOOP
|
||
IN A,(PORT_59_HDD_ERR)
|
||
AND 0x7f ; Игнорируем ошибки SLAVE
|
||
CP 0x1
|
||
JP NZ,ERROR
|
||
|
||
; Читать MBR
|
||
LD HL,BUFF
|
||
LD A,0x21
|
||
OUT (PORT_5F_HDD_STAT_CMD),A
|
||
BUS01
|
||
IN A,(PORT_5F_HDD_STAT_CMD)
|
||
BIT 0x7,A
|
||
JR NZ,BUS01
|
||
BIT 0x3,A
|
||
JR Z,STR ; Данные не готовы
|
||
LD B,0x0
|
||
CONRD
|
||
IN A,(PORT_58_HDD_LB) ; Читать мл. байт
|
||
LD (HL),A
|
||
INC HL
|
||
IN A,(PORT_57_HDD_HB) ; Читать ст. байт
|
||
LD (HL),A
|
||
INC HL
|
||
DJNZ CONRD
|
||
|
||
STR IN A,(PORT_5F_HDD_STAT_CMD)
|
||
AND 0x21
|
||
JP NZ,ERROR
|
||
LD HL,BUFF
|
||
JP ANBUF ; Анализ флаговой ячейки ОЗУ
|
||
|
||
; ----------------------------------------------
|
||
; Утилиты
|
||
; ----------------------------------------------
|
||
WR93
|
||
OUT (PORT_10_VG_CMD),A
|
||
LD A,0x2f
|
||
W93
|
||
DEC A
|
||
JR NZ,W93
|
||
RET
|
||
|
||
; Погасить НГМД
|
||
W93OFF IN A,(PORT_00_DIPSW)
|
||
RRCA
|
||
RET C
|
||
XOR A
|
||
|
||
; Запись кода команды (A) в ВГ93
|
||
WRCOM CALL WR93
|
||
|
||
WRC IN A,(PORT_10_VG_CMD)
|
||
RRCA
|
||
JR C,WRC
|
||
RET
|
||
|
||
RDS
|
||
LD A,0x80
|
||
CALL WR93
|
||
RDS1
|
||
IN A,(PORT_10_VG_CMD)
|
||
RRA
|
||
RET NC
|
||
RRA
|
||
JR NC,RDS1
|
||
IN A,(PORT_13_VG_DATA)
|
||
LD (HL),A
|
||
INC HL
|
||
JR RDS1
|
||
RDSEC
|
||
PUSH HL
|
||
CALL RDS
|
||
RDS2
|
||
EX DE,HL
|
||
POP HL
|
||
IN A,(PORT_10_VG_CMD)
|
||
AND 0xdd
|
||
RET
|
||
WRSEC
|
||
LD A,0xa0
|
||
CALL WR93
|
||
PUSH HL
|
||
LD (WRS5+1),SP
|
||
LD SP,HL
|
||
LD C,PORT_13_VG_DATA
|
||
WRS1
|
||
POP HL
|
||
WRS2
|
||
IN A,(PORT_10_VG_CMD)
|
||
XOR 0x1
|
||
JR Z,WRS2
|
||
OUT (C),L
|
||
RRA
|
||
JR C,WRS4
|
||
RRA
|
||
JR NC,WRS2
|
||
WRS3
|
||
IN A,(PORT_10_VG_CMD)
|
||
XOR 0x1
|
||
JR Z,WRS3
|
||
OUT (C),H ; PORT_13_VG_DATA
|
||
JR WRS1
|
||
WRS4
|
||
LD HL,-2
|
||
ADD HL,SP
|
||
WRS5
|
||
LD SP,0x0
|
||
JR RDS2
|
||
|
||
; ----------------------------------------------
|
||
; Вывод сообщения HL
|
||
; ----------------------------------------------
|
||
MSGX
|
||
LD A,(HL)
|
||
AND A
|
||
RET Z
|
||
CALL TVA
|
||
INC HL
|
||
JR MSGX
|
||
|
||
; ----------------------------------------------
|
||
; Установка позиции курсора
|
||
; ----------------------------------------------
|
||
WCUR
|
||
PUSH AF
|
||
LD A,NWCUR
|
||
CALL TVOUT
|
||
POP AF
|
||
PUSTO
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
;Получение позиции курсора
|
||
; ----------------------------------------------
|
||
RCUR
|
||
PUSH AF
|
||
PUSH BC
|
||
PUSH DE
|
||
LD A,NRCUR
|
||
CALL TVOUT
|
||
POP DE
|
||
POP BC
|
||
POP AF
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Вывод символа C
|
||
; ----------------------------------------------
|
||
TVC
|
||
PUSH AF
|
||
XOR A
|
||
CALL TVOUT
|
||
POP AF
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Запись байта в страницу
|
||
; Вход:
|
||
; A - номер страницы (0-7)
|
||
; C - записывемый байт
|
||
; ----------------------------------------------
|
||
WRAMX
|
||
PUSH AF
|
||
IN A,(PORT_08_RAM_PG)
|
||
LD (RRM1+1),A
|
||
POP AF
|
||
OUT (PORT_08_RAM_PG),A
|
||
LD (HL),C
|
||
JR RRM1
|
||
|
||
; ----------------------------------------------
|
||
; Чтение байта со страницы
|
||
; Вход:
|
||
; A - номер страницы (0-7)
|
||
; C - записывемый байт
|
||
; ----------------------------------------------
|
||
RRAMX
|
||
PUSH AF
|
||
IN A,(PORT_08_RAM_PG)
|
||
LD (RRM1+1),A
|
||
POP AF
|
||
OUT (PORT_08_RAM_PG),A
|
||
LD C,(HL)
|
||
RRM1
|
||
LD A,0x0
|
||
OUT (PORT_08_RAM_PG),A
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Сохранение портов диспетчера в ОЗУ
|
||
; HL - адрес сохранения (6-байт)
|
||
; порт 4 - WIN0
|
||
; порт 5 - WIN1
|
||
; порт 6 - WIN2
|
||
; порт 8 - PAGE
|
||
; порт 9 - WIN_ROM2
|
||
; порт A - диспетчер
|
||
; ----------------------------------------------
|
||
RDWIN
|
||
PUSH HL
|
||
PUSH BC
|
||
LD BC,0x304
|
||
RDW01
|
||
IN A,(C) ; PORT_04_RAM0P
|
||
LD (HL),A
|
||
INC HL
|
||
INC C
|
||
DJNZ RDW01
|
||
INC C
|
||
LD B,0x3
|
||
RDW02
|
||
IN A,(C) ; PORT_06_RAM2P
|
||
LD (HL),A
|
||
INC HL
|
||
INC C
|
||
DJNZ RDW02
|
||
POP BC
|
||
POP HL
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Восстановление портов диспетчера
|
||
; HL- адрес буфера с сохраненными портами
|
||
; ----------------------------------------------
|
||
WRWIN
|
||
PUSH HL
|
||
PUSH BC
|
||
LD BC,0x304
|
||
WWN01
|
||
LD A,(HL)
|
||
OUT (C),A ; PORT_04_RAM0P
|
||
INC HL
|
||
INC C
|
||
DJNZ WWN01
|
||
INC C
|
||
LD B,0x3
|
||
WWN02
|
||
LD A,(HL)
|
||
OUT (C),A ; PORT_06_RAM2P
|
||
INC HL
|
||
INC C
|
||
DJNZ WWN02
|
||
POP BC
|
||
POP HL
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Установка окон и диспетчера из таблиц и передача управления
|
||
; Вход:
|
||
; A=0ffh - уст адрес табл
|
||
; HL - адрес таблицы
|
||
; A=0-N - номер канала
|
||
;
|
||
; ADR WIN0 <- kanal_0
|
||
; WIN1
|
||
; WIN2
|
||
; PAGE
|
||
; WIN_ROM2
|
||
; DISP
|
||
; ADDR_START
|
||
; WIN0 <- kanal_1
|
||
; ....
|
||
; ADDR_START
|
||
; WIN0 <- kanal_N
|
||
; ----------------------------------------------
|
||
JPWIN
|
||
INC A
|
||
JR NZ,WRW1
|
||
LD (ADWRW+1),HL
|
||
RET
|
||
WRW1
|
||
PUSH BC
|
||
DEC A
|
||
ADD A,A
|
||
ADD A,A
|
||
ADD A,A
|
||
LD C,A
|
||
LD B,0x0
|
||
ADWRW
|
||
LD HL,0x0
|
||
ADD HL,BC
|
||
LD BC,0x304
|
||
WRW01
|
||
LD A,(HL)
|
||
INC HL
|
||
OUT (C),A ; PORT_04_RAM0P
|
||
INC C
|
||
DJNZ WRW01
|
||
INC C
|
||
LD B,0x3
|
||
WRW02
|
||
LD A,(HL)
|
||
INC HL
|
||
OUT (C),A ; PORT_06_RAM2P
|
||
INC C
|
||
DJNZ WRW02
|
||
LD A,(HL)
|
||
INC HL
|
||
LD H,(HL)
|
||
LD L,A
|
||
POP BC
|
||
JP HL
|
||
|
||
; ----------------------------------------------
|
||
; Открыть/закрыть окно
|
||
; Вход:
|
||
; A = 0 - открыть окно
|
||
; C = номер окна
|
||
; B = номер сегмента
|
||
; A != 0 - закрыть окно
|
||
; C = номер окна
|
||
; ----------------------------------------------
|
||
OPCLW PUSH HL
|
||
LD (FLOC+1),A
|
||
LD A,C
|
||
AND 0x7
|
||
LD L,A
|
||
LD C,A
|
||
LD A,0x1
|
||
INC L
|
||
OPC1 DEC L
|
||
JR Z,OPC2
|
||
RLCA
|
||
JR OPC1
|
||
OPC2 LD L,A
|
||
FLOC LD A,0x0
|
||
AND A
|
||
JR NZ,OPC20
|
||
LD A,L
|
||
CPL
|
||
LD L,A
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
AND L
|
||
JR OPC7
|
||
OPC20 LD A,B
|
||
INC C
|
||
DEC C
|
||
JR NZ,OPC3
|
||
OUT (PORT_04_RAM0P),A
|
||
JR OPC6
|
||
OPC3 DEC C
|
||
JR NZ,OPC4
|
||
OUT (PORT_05_RAM1P),A
|
||
JR OPC6
|
||
OPC4 DEC C
|
||
JR NZ,OPC5
|
||
OUT (PORT_06_RAM2P),A
|
||
JR OPC6
|
||
OPC5 DEC C
|
||
JR NZ,OPC6
|
||
OUT (PORT_09_ROM2_SEG),A
|
||
OPC6 IN A,(PORT_0A_MEM_CFG)
|
||
OR L
|
||
OPC7 OUT (PORT_0A_MEM_CFG),A
|
||
POP HL
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Управление системой
|
||
; ----------------------------------------------
|
||
SYS_X PUSH IX
|
||
db 0DDh
|
||
LD L,A;LD LX,A
|
||
LD A,0x15
|
||
CALL TUNEL
|
||
POP IX
|
||
RET
|
||
|
||
STTSX LD A,0xc
|
||
JP TUNEL
|
||
|
||
INKEYX LD A,0xf
|
||
JP TUNEL
|
||
|
||
KBRDX LD A,0x9
|
||
JP TUNEL
|
||
|
||
; ----------------------------------------------
|
||
; Управление клавиатурой
|
||
; ----------------------------------------------
|
||
KBDCTL PUSH IX
|
||
db 0DDh
|
||
LD L,A
|
||
LD A,0x6
|
||
CALL TUNEL
|
||
POP IX
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Управление мышью
|
||
; ----------------------------------------------
|
||
MOUCTL OR A
|
||
JR Z,MSWND
|
||
CP 0xa
|
||
JP NC,MOUC10
|
||
|
||
MOUS1 PUSH IX
|
||
db 0DDh
|
||
LD L,A
|
||
LD A,0x18
|
||
CALL TUNEL
|
||
POP IX
|
||
RET
|
||
|
||
MSWND LD (MSY),BC
|
||
LD (MSX),DE
|
||
PUSH HL
|
||
CALL GCUR
|
||
PUSH HL
|
||
LD A,GETWND
|
||
CALL TVSCR
|
||
PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
LD A,GETSCR
|
||
CALL TVSCR
|
||
LD A,(MSMODE)
|
||
RLCA
|
||
LD A,SETSCR
|
||
CALL C,TVSCR
|
||
XOR A
|
||
CALL MOUS1
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
PUSH AF
|
||
LD A,SETWND
|
||
CALL TVSCR
|
||
POP AF
|
||
POP HL
|
||
PUSH AF
|
||
CALL SCUR
|
||
POP AF
|
||
POP HL
|
||
LD BC,(MSY)
|
||
LD DE,(MSX)
|
||
RET
|
||
MOUC10 RET NZ
|
||
|
||
TSTOBL XOR A
|
||
CP B
|
||
RET C
|
||
LD A,(HL)
|
||
OR A
|
||
INC HL
|
||
SCF
|
||
RET Z
|
||
PUSH IX
|
||
PUSH HL
|
||
POP IX
|
||
PUSH AF
|
||
TSTO1 PUSH AF
|
||
PUSH BC
|
||
CALL TSTXY
|
||
JR NC,TSTO3
|
||
LD BC,0x6
|
||
ADD IX,BC
|
||
POP BC
|
||
POP AF
|
||
DEC A
|
||
JR NZ,TSTO1
|
||
POP AF
|
||
SCF
|
||
TSTO2 PUSH IX
|
||
POP HL
|
||
POP IX
|
||
RET
|
||
|
||
TSTO3 POP BC
|
||
LD A,C
|
||
POP BC
|
||
LD C,A
|
||
POP AF
|
||
SUB B
|
||
LD B,0x0
|
||
JR TSTO2
|
||
TSTXY LD L,(IX+0x0)
|
||
LD H,(IX+0x1)
|
||
PUSH HL
|
||
SCF
|
||
SBC HL,DE
|
||
POP HL
|
||
CCF
|
||
RET C
|
||
LD A,C
|
||
LD C,(IX+0x3)
|
||
LD B,(IX+0x4)
|
||
DEC BC
|
||
ADD HL,BC
|
||
LD C,A
|
||
OR A
|
||
SBC HL,DE
|
||
RET C
|
||
LD A,(IX+0x2)
|
||
SCF
|
||
SBC A,C
|
||
CCF
|
||
RET C
|
||
LD B,(IX+0x5)
|
||
LD A,(IX+0x2)
|
||
DEC B
|
||
ADD A,B
|
||
CP C
|
||
RET
|
||
|
||
MOUS PUSH BC
|
||
MO1 IN A,(PORT_1E_MOUSE)
|
||
LD C,A
|
||
IN A,(PORT_1E_MOUSE)
|
||
CP C
|
||
JR NZ,MO1
|
||
POP BC
|
||
RET
|
||
|
||
NMKEYX LD A,0x12
|
||
TUNEL LD (TSTECK+1),SP
|
||
LD SP,SPTUNL
|
||
LD (TUN0+1),A
|
||
IN A,(PORT_0A_MEM_CFG)
|
||
LD (TUN2+1),A
|
||
OR 0x10
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
TUN0 CALL CLD_START
|
||
PUSH AF
|
||
TUN2 LD A,0x0
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
POP AF
|
||
TSTECK LD SP,0x0
|
||
RET
|
||
|
||
HEX PUSH AF
|
||
RRCA
|
||
RRCA
|
||
RRCA
|
||
RRCA
|
||
CALL HEX1
|
||
POP AF
|
||
HEX1 AND 0xf
|
||
CP 0xa
|
||
JP M,HEX2
|
||
ADD A,0x7
|
||
HEX2 ADD A,0x30
|
||
;
|
||
|
||
TVA PUSH BC
|
||
LD C,A
|
||
CALL TVSYM
|
||
POP BC
|
||
RET
|
||
|
||
SND IN A,(PORT_0A_MEM_CFG)
|
||
LD (SND4+1),A
|
||
SET 0x5,A
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
SND0
|
||
LD HL,0x0
|
||
SND1
|
||
LD A,B
|
||
OR C
|
||
JR Z,SND4
|
||
DEC BC
|
||
PUSH BC
|
||
LD B,0x20
|
||
SND2
|
||
LD A,H
|
||
ADD HL,DE
|
||
ADD HL,DE
|
||
XOR H
|
||
RLCA
|
||
JR NC,SND3
|
||
OUT (PORT_FF_SPEAKER),A
|
||
SND3
|
||
NOP
|
||
NOP
|
||
LD A,0x0
|
||
DJNZ SND2
|
||
POP BC
|
||
JR SND1
|
||
SND4
|
||
LD A,0x40
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
LD (SND0+1),HL
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
RET
|
||
BEEP
|
||
LD A,E
|
||
AND 0x3
|
||
CP 0x3
|
||
LD A,D
|
||
LD BC,0x14
|
||
LD DE,0x400
|
||
JR NZ,BP1
|
||
XOR 0x20
|
||
BIT 0x5,A
|
||
JR BP2
|
||
BP1
|
||
BIT 0x6,A
|
||
BP2
|
||
JR Z,BP3
|
||
LD DE,0x800
|
||
BP3
|
||
JP SOUND
|
||
|
||
; ----------------------------------------------
|
||
; Вывод закодированного сообщения
|
||
; HL - адрес сообщения в ROM1
|
||
; ----------------------------------------------
|
||
MSGXX IN A,(PORT_0A_MEM_CFG) ; Сохранить конфигурацию памяти
|
||
PUSH AF
|
||
PUSH BC
|
||
SET ROM1_WND,A ; Включить окно ROM1
|
||
OUT (PORT_0A_MEM_CFG),A
|
||
; Вывод символов в цикле
|
||
MSGX1 LD A,(HL)
|
||
AND A
|
||
JR Z,MSGX2 ; Конец строки?
|
||
NEG ; Смена знака (декодирование)
|
||
CALL TVA
|
||
INC HL
|
||
JR MSGX1
|
||
|
||
MSGX2 POP BC
|
||
POP AF
|
||
OUT (PORT_0A_MEM_CFG),A ; Восстановить настройки памяти
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Быстрый INKEY
|
||
; ----------------------------------------------
|
||
INFAST PUSH HL
|
||
LD L,0
|
||
IN A,(PORT_00_DIPSW)
|
||
AND 0x4 ; 1 - РК86, 0 - МС7007
|
||
JP NZ,IN86F
|
||
LD A,0xFF
|
||
OUT (PORT_1A_KBD),A
|
||
LD A,0xFC
|
||
OUT (PORT_19_KBD),A
|
||
IN A,(PORT_18_KBD)
|
||
BIT 2,A ; УПР?
|
||
JR NZ,IN77F1
|
||
SET 0,L
|
||
|
||
IN77F1 AND 0x10 ; SHIFT?
|
||
JR NZ,IN77F2
|
||
SET 0x1,L
|
||
|
||
IN77F2 LD A,0xFB
|
||
OUT (PORT_19_KBD),A
|
||
IN A,(PORT_18_KBD)
|
||
AND 0x10 ; ФИКС?
|
||
JR NZ,IN77F3
|
||
SET 2,L
|
||
|
||
IN77F3 LD A,0xBF ; =>
|
||
OUT (PORT_19_KBD),A
|
||
IN A,(PORT_18_KBD)
|
||
AND 0x20
|
||
OR 0xdf
|
||
LD H,A
|
||
LD A,0x7F ; Вверх/вниз
|
||
OUT (PORT_19_KBD),A
|
||
IN A,(PORT_18_KBD)
|
||
BIT 5,A
|
||
JR NZ,IN77F6
|
||
RES 6,H
|
||
|
||
IN77F6 BIT 6,A
|
||
JR NZ,IN77F7
|
||
RES 4,H
|
||
IN77F7
|
||
LD A,0xFF
|
||
OUT (PORT_19_KBD),A
|
||
LD A,0xFD
|
||
OUT (PORT_1A_KBD),A
|
||
IN A,(PORT_18_KBD)
|
||
AND 0x10
|
||
JR NZ,IN77F5
|
||
RES 3,H
|
||
IN77F5
|
||
LD A,H
|
||
CPL
|
||
RLCA
|
||
IN77F8
|
||
AND 0xf0
|
||
OR L
|
||
POP HL
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; INFAST - РК86
|
||
; ----------------------------------------------
|
||
IN86F IN A,(PORT_1A_KBD)
|
||
CPL
|
||
RLA ; CY = ФИКС
|
||
RL L
|
||
RLA ; CY = УПР
|
||
PUSH AF
|
||
RLA ; CY = SHIFT
|
||
RL L
|
||
POP AF
|
||
RL L
|
||
LD A,0xFD
|
||
OUT (PORT_18_KBD),A
|
||
IN A,(PORT_19_KBD)
|
||
CPL
|
||
JR IN77F8
|
||
|
||
; ----------------------------------------------
|
||
; Получение версии
|
||
; Выход:
|
||
; H - ROM1, L - TV ROM2
|
||
; ----------------------------------------------
|
||
VERSION DB 21H ; LXI H,..
|
||
VERSTV DB 0 ; Версия TV-PRO
|
||
DB VERS/10H ; Версия ROM1
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Печать
|
||
; Вход:
|
||
; 1. A !=0 - чтение статуса PRINT
|
||
; 2. A = 0 - печать символа
|
||
; C = символ для печати
|
||
; Выход:
|
||
; A = 0 - символ принят
|
||
; A != 0 - принтер не готов
|
||
; D0=1 - неисправность (ERROR)
|
||
; D1=1 - занят (BYSY)
|
||
; ----------------------------------------------
|
||
PRINT
|
||
AND A
|
||
JR Z,WPRT1
|
||
STATU
|
||
PUSH BC
|
||
LD B,0x5
|
||
NOP
|
||
IN A,(PORT_02_PRNT_CTL)
|
||
RLCA
|
||
RLCA
|
||
RLCA
|
||
XOR B
|
||
AND 0x7
|
||
POP BC
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Печать символа из регистра С
|
||
; ----------------------------------------------
|
||
WPRT1 PUSH BC
|
||
PUSH DE
|
||
PUSH HL
|
||
WPRT2
|
||
CALL STATU
|
||
JR NZ,WPEND
|
||
LD A,C
|
||
CPL
|
||
OUT (PORT_01_PRNT_DAT),A
|
||
LD A,1 ; STROBE -\_
|
||
OUT (PORT_02_PRNT_CTL),A
|
||
NOP
|
||
NOP
|
||
XOR A
|
||
OUT (PORT_02_PRNT_CTL),A ; STRONE _/-
|
||
CALL STATU
|
||
WPEND
|
||
POP HL
|
||
POP DE
|
||
POP BC
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Запись константы в память
|
||
; Вход:
|
||
; A - Страница
|
||
; C - Записываемый байт
|
||
; HL - Адрес внутри страницы
|
||
; DE - Количество байт
|
||
; ----------------------------------------------
|
||
FILLP PUSH AF
|
||
IN A,(PORT_08_RAM_PG)
|
||
LD (FLP1+1),A ; Исходная страница
|
||
POP AF
|
||
;
|
||
AND 0x0F ; Сбросим лишние биты
|
||
OUT (PORT_08_RAM_PG),A ; и включи нужную страницу
|
||
;
|
||
LD (HL),C
|
||
LD B,D
|
||
LD C,E
|
||
LD D,H
|
||
LD E,L
|
||
INC DE
|
||
DEC BC
|
||
LD A,C
|
||
OR B
|
||
JR Z,FLP1
|
||
LDIR
|
||
FLP1 LD A,0
|
||
OUT (PORT_08_RAM_PG),A
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Перенос блока со страницы на страницу
|
||
; HL - начальный адрес - откуда
|
||
; DE - начальный адрес - куда
|
||
; BC - количество
|
||
; A 0000---- - страница, откуда читать
|
||
; ----0000 - страница, куда записывать
|
||
; ----------------------------------------------
|
||
MOVBL PUSH AF
|
||
AND 0x0F
|
||
LD (MVB2+1),A ; Куда писать
|
||
POP AF
|
||
RRCA
|
||
RRCA
|
||
RRCA
|
||
RRCA
|
||
AND 0x0F
|
||
LD (MVB1+1),A ; Откуда писать
|
||
IN A,(PORT_08_RAM_PG)
|
||
LD (MVB3+1),A ; Текущая страница
|
||
LD (MVSTK+1),SP ; Текущий стек
|
||
LD SP,HL ; Откуда
|
||
EX DE,HL ; Куда
|
||
|
||
MVB1 LD A,0 ; вместо 0, подставляется номер страницы
|
||
OUT (PORT_08_RAM_PG),A ; Выбрать стр. откуда
|
||
POP DE ; Два очередных байта
|
||
MVB2
|
||
LD A,0 ; вместо 0, подставляется номер страницы
|
||
OUT (PORT_08_RAM_PG),A ; Выбрать стр. куда
|
||
LD (HL),E ; Запись 1-го байта
|
||
INC HL
|
||
DEC BC
|
||
LD A,B
|
||
OR C ; Все?
|
||
JR Z,MVB3 ; да
|
||
LD (HL),D ; Запись 2-го байта
|
||
INC HL
|
||
DEC BC
|
||
LD A,B
|
||
OR C ; Все?
|
||
JR NZ,MVB1 ; нет
|
||
; Восстановление страницы памяти
|
||
MVB3 LD A,0
|
||
OUT (PORT_08_RAM_PG),A
|
||
; Восстановление стека
|
||
MVSTK LD SP,0
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Заглушка для ISR
|
||
; ----------------------------------------------
|
||
DEFESR EI
|
||
RETI
|
||
|
||
DUMMY
|
||
DB 0
|
||
ENDEXT ;
|
||
ENT
|
||
MMMPE ;
|
||
|
||
ASSERT ENDEXT < CELLS, Коллизия EXT и CELLS
|