;LAST UPDATE: 28.05.2021 savelij
include ../../../pentevo/rom/macros.a80
include ports_ngs.a80
include vers.a80
DDMMYY EQU "28.05.20121"
DD EQU 28 ;ЧИСЛО
MM EQU 5 ;МЕСЯЦ
YY EQU 21 ;ГОД
DATA EQU DD|MM<<5|YY<<9|0X8000 ;ЗАКОДИРОВАННАЯ ДАТА
SM_LDT EQU 0X54
ADR_PROGR EQU 0X5800
BUFTSC EQU 0XB800
TXT_DEC EQU BUFTSC+0X0180
TXT_HEX EQU TXT_DEC+0X10
BUF_CRC16_TABL EQU 0X9000 ;200
BUFFER_ZAG EQU BUF_CRC16_TABL+0X200 ;200
SKLAD EQU BUFFER_ZAG+0X200 ;100
DRV_VAR EQU SKLAD+0X100
;ФОРМАТ ФЛАГОВОГО БАЙТА ОКНА
;X,Y,V,H,C,C
;IX+8
;7-1-НИЖНИЙ ЗАГОЛОВОК
;6-0-С РАМКОЙ,1-БЕЗ РАМКИ
;5-1-ВЕРХНИЙ ЗАГОЛОВОК
;4-0-ТЕКСТ ОКНА,1-БЕЗ ТЕКСТА
;3
;2-0-FILE,1-*.TRD
;1-0-MENU,1-FILES
;0-0-TRDOS,1-MSDOS
;BIT 4,(IY+55)
;BIT 3,(IY+55) 1-НЕТ ДИСКА, 0-ЕСТЬ
;BIT 2,(IY+55) 1-НЕ НАЙДЕНО, 0-FAT ЕСТЬ
;ОПИСАТЕЛЬ ОКНА (АДРЕС В IX)
;+00 X
;+01 Y
;+02 V
;+03 H
;+04 C
;+05 C
;+06 | АДРЕСА
;+07 | ПОДПРОГРАММ
;+08 F
;+09 X
;+0A Y
;+0B V
;+0C H
;+0D | АДРЕС
;+0E | ТЕКСТА
;+0F : НОМЕР ПУНКТА В ОКНЕ
;+10 : КОЛИЧЕСТВО
;+11 : ПУНКТОВ МЕНЮ
;+12 "C" | ТЕКУЩИЙ
;+13 "B" | ПУНКТ МЕНЮ
ORG 0x8000
START_ DI
LD A,0X10
LD BC,0X7FFD
OUT (C),A ;ВКЛЮЧИЛИ СТРАНИЦУ 0
CALL INITLOADER
PUSH AF
LD A,0X0A
OUT (GSCOM),A
SET 3,(IY+48)
LD HL,0X0110
LD (0X5C09),HL ;УСТАНОВИЛИ ПАРАМЕТРЫ ОПРОСА КЛАВИАТУРЫ
LD A,0X28
CALL CLS ;ОЧИСТКА ЭКРАНА
RES 5,(IY+1)
RES 7,(IY+48)
RES 3,(IY+55) ;УСТАНОВКА ЕЩЕ НЕКОТОРЫХ ПАРАМЕТРОВ
CALL ADRTSC ;ФОРМИРОВАНИЕ ТАБЛИЦЫ АДРЕСОВ ЭКРАНА
POP AF
JP NZ,NGSNOTFOUND
RESTARTUPD LD A,7
OUT (GSCOM),A
CALL WC
IN A,(GSDAT)
AND A
JR Z,PROD001
PUSH AF
LD IX,ERROR_UPDATE
CALL WINW
POP AF
LD HL,TXT_ERRUPD1
CP 0XAA
JR Z,ERRORRING
LD HL,TXT_ERRUPD2
CP 0XDD
JR Z,ERRORRING
LD HL,TXT_ERRUPD3
ERRORRING CALL NEXT
CALL KEYS
LD IX,ALLSCR
CALL WINW ;ВЫВОД ОСНОВНОГО ОКНА
PROD001 LD A,9
OUT (GSCOM),A
CALL WC
IN A,(GSDAT) ;код ошибки
EX AF,AF'
CALL WN
IN A,(GSDAT) ;младший байт ответа
LD L,A
CALL WN
IN A,(GSDAT) ;старший байт ответа
LD H,A
EX AF,AF'
AND 3
JR Z,PROD000
LD IX,ERROR_UPDATE
CALL WINW
LD HL,TXT_CRC
CALL NEXT
PROD000 LD IX,ALLSCR
CALL WINW
LD IX,HELPS
CALL WINW
LD IX,VERS_PAGESNGS
CALL WINW
CALL RD_VERS_NGS
LD IX,WEKS2
CALL WINW
PROD01 CALL UPDOWN
CALL CP_KEYS
DB 0X0D
DW KENTER
DB 0
JR PROD01
RD_VERS_NGS LD IXL,"0"
LD DE,TEXT_VERSUS
RVN2 LD HL,TXT_PAGES
LD BC,ETXT_PAGES-TXT_PAGES
LDIR
LD A,IXL
INC IXL
LD (DE),A
LD A," "
EX DE,HL
INC HL
LD (HL),":"
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD A,IXL
SUB "1"
OUT (GSDAT),A
LD A,8
OUT (GSCOM),A
CALL WC
LD BC,GSDAT
RVN1 CALL WN
IN A,(C)
LD (HL),A
INC HL
AND A
JR NZ,RVN1
DEC HL
EX DE,HL
LD A,IXL
CP '2'
CALL Z,COPY_VERS
CP "8"
JR C,RVN2
LD HL,TEXT_VERSUS
JP NEXT
COPY_VERS PUSH AF
PUSH DE
EXX
POP DE
LD HL,MAINROM_VERS
.L2 LD A,(HL)
AND A
JR Z,.L1
LDI
JR .L2
.L1 PUSH DE
EXX
POP DE
POP AF
RET
NGSNOTFOUND LD IX,ERROR_UPDATE
CALL WINW
LD HL,TXT_NONGS
CALL NEXT
CALL KEYS
LD HL,0
PUSH HL
JP 0X3D2F
;ОТРАБОТКА ПЕДАЛИ ENTER
KENTER LD A,(IX+0X12)
AND A
JR Z,KENTER1 ;ПЕРЕХОД ДЛЯ ПУНКТА 1-ЗАГРУЗКА ОБНОВЛЕНИЯ
JP KENTER4 ;ПЕРЕХОД ДЛЯ ПУНКТА 3-ВЫХОД В TR-DOS
;ВЫБОР И ЗАГРУЗКА ОБНОВЛЕНИЯ ПЗУ
KENTER1 LD IX,UPDATE_NGS
CALL WINW
LD A,7
OUT (GSCOM),A
CALL WC
IN A,(GSDAT)
AND A
JP NZ,RESTARTUPD
LD A,9
OUT (GSCOM),A
CALL WC
IN A,(GSDAT) ;код ошибки
EX AF,AF'
CALL WN
IN A,(GSDAT) ;младший байт ответа
LD L,A
CALL WN
IN A,(GSDAT) ;старший байт ответа
LD H,A
EX AF,AF'
CP 0X80
JP NZ,RESTARTUPD
XOR A
OUT (GSDAT),A
LD A,6
OUT (GSCOM),A
CALL WC
XOR A
OUT (GSDAT),A
CALL WD
LD A,0X58
OUT (GSDAT),A
CALL WD
IN A,(GSDAT)
CP 0X99
JR NZ,$-4
EI
REPT 5
HALT
ENDM
DI
LD IX,ERROR_UPDATE
CALL WINW
LD HL,TXT_OKUPDATE
CALL NEXT
CALL KEYS
JP START_
LD A,0X0A
OUT (GSCOM),A
EI
HALT
HALT
HALT
DI
JP RESTARTUPD
;ВЫХОД ИЗ ПРОШИВАЛЬЩИКА
KENTER4 LD HL,0
PUSH HL
JP 0X3D2F
UPDOWN LD C,(IX+0X12)
LD B,(IX+0X13)
CALL RVERT
SET 3,(IY+55)
UPD04 BIT 3,(IY+55)
JR Z,UPD02
RES 3,(IY+55)
UPD02 EI
HALT
DI
BIT 5,(IY+1)
JR Z,UPD04
LD A,(IY-0X32)
RES 5,(IY+1)
CP 0X0A
JR NZ,UPD01
CALL DOWN
SET 3,(IY+55)
JR UPD02
UPD01 CP 0X0B
JR NZ,UPD03
CALL UP
SET 3,(IY+55)
JR UPD02
UPD03 RES 7,(IY+48)
LD (IX+0X12),C
LD (IX+0X13),B
PUSH AF
LD A,(IX+4)
CALL WYDELK
POP AF
RET
DOWN LD L,(IX+0X10)
LD H,(IX+0X11)
LD A,H
OR L
RET Z
SCF
SBC HL,BC
RET Z
INC BC
LD A,(IX+2)
SUB 3
CP (IX+0X0F)
JR Z,DOWN1
INC (IX+0X0F)
LD A,(IX+4)
CALL WYDELK
LD DE,0X20
ADD HL,DE
LD (ADRAT+1),HL
LD A,(IX+5)
JP WYDELK
DOWN1 LD A,(IX)
ADD A,A
ADD A,A
ADD A,A
INC A
LD H,A
LD A,(IX+1)
ADD A,(IX+2)
SUB 2
ADD A,A
ADD A,A
ADD A,A
LD L,A
LD (ADRSTR+1),HL
JP SCRUP
UP LD A,B
OR C
RET Z
DEC BC
LD A,(IX+0X0F)
AND A
JR Z,UP1
DEC (IX+0X0F)
LD A,(IX+4)
CALL WYDELK
AND A
LD DE,0X20
SBC HL,DE
LD (ADRAT+1),HL
LD A,(IX+5)
JR WYDELK
UP1 LD A,(IX)
ADD A,A
ADD A,A
ADD A,A
INC A
LD H,A
LD A,(IX+1)
INC A
ADD A,A
ADD A,A
ADD A,A
LD L,A
LD (ADRSTR+1),HL
JP SCRDN
RVERT PUSH DE
LD H,(IX)
LD L,(IX+1)
LD A,(IX+0X0F)
ADD A,L
LD L,A
INC L
CALL ADRDIS
EX DE,HL
LD (ADRAT+1),HL
LD A,(IX+5)
POP DE
WYDELK PUSH BC
ADRAT LD HL,0
PUSH HL
LD B,(IX+3)
LD (HL),A
INC HL
DJNZ $-2
POP HL
POP BC
RET
READ_NGS_VERS EXX
LD HL,BUFRD
LD DE,0x138
LD B,8
LD A,B
CALL SD ; LEN LOW
LD A,0X15
CALL SC
EI
HALT
DI
XOR A
CALL SD ; LEN HIGH
CALL WD
LD A,E
CALL SD ; ADR LOW
CALL WD
LD A,D
CALL SD ; ADR HIGH
.L1 CALL WN
CALL GD
LD (HL),A
INC HL
INC DE
DJNZ .L1
.L2 DEC HL
LD A,'!'
CP (HL)
JR NC,.L2
INC HL
LD (HL),0
EXX
RET
MAINROM_VERS DB "ver "
BUFRD DUPL 0x18
FINDNGS LD A,0X80
OUT (GSCTR),A
;DS 3:LD A,0X55:OUT (GSDAT),A
;OUT (GSCOM),A:CALL WC:LD A,0XAA
;OUT (GSDAT),A,(GSCOM),A:XOR A
;OUT (GSDAT),A:LD A,0X1D
;OUT (GSCOM),A:CALL WC
;IN A,(GSDAT)
EI
HALT
HALT
DI
LD A,0XF3
OUT (GSCOM),A
EI
HALT
HALT
DI
LD B,0X30
FNDNGS1 EI
HALT
DI
DEC B
JR Z,FNDNGS2
IN A,(GSCOM)
RRA
JR C,FNDNGS1
LD E,GSCFG0
CALL INPORT
INC A
JR Z,NONGS
XOR A
RET
NONGS XOR A
INC A
RET
FNDNGS2 XOR A
DEC A
RET
INPORT LD A,E
OUT (GSDAT),A
LD A,0X11
OUT (GSCOM),A
CALL WC
IN A,(GSDAT)
RET
INITLOADER CALL FINDNGS
AND A
RET NZ
CALL READ_NGS_VERS
LD BC,GSDAT
LD HL,0X5800
LD DE,MINILDE-MINILD
OUT (C),E
LD A,0X14
OUT (GSCOM),A
CALL WC
OUT (C),D
CALL WD
OUT (C),L
CALL WD
OUT (C),H
CALL WD
LD HL,MINISTR
OUTCOD OUTI
CALL WD
DEC DE
LD A,D
OR E
JR NZ,OUTCOD
LD HL,0X5800
OUT (C),L
LD A,0X13
OUT (GSCOM),A
CALL WC
OUT (C),H
CALL WD
LD DE,NGS_LOADERE-NGS_LOADER
OUT (C),E
CALL WD
OUT (C),D
CALL WD
LD HL,NGS_LOADER
OUTCOD1 OUTI
CALL WD
DEC DE
LD A,D
OR E
JR NZ,OUTCOD1
EI
HALT
HALT
HALT
DI
XOR A
RET
SC OUT (GSCOM),A
RET
SD OUT (GSDAT),A
RET
GD IN A,(GSDAT)
RET
WC IN A,(GSCOM)
RRCA
JR C,WC
RET
WD IN A,(GSCOM)
RLCA
JR C,WD
RET
WN IN A,(GSCOM)
RLCA
JR NC,WN
RET
MINISTR
PHASE ADR_PROGR
MINILD DI
IN A,(ZXDATRD)
OUT (CLRCBIT),A
LD A,0X11
OUT (GSCFG0),A ;ОТКЛЮЧИЛИ ПЗУ И ВКЛЮЧИЛИ ЧАСТОТЦ 12МГЦ
LD HL,0 ;АДРЕС ЗАГРУЗКИ КОДА СО СПЕКА
XOR A
OUT (MPAG),A ;СТРАНИЦА 0
LD BC,ZXDATRD
IN A,(ZXSTAT)
RLA
JR NC,$-3
IN E,(C)
IN A,(ZXSTAT)
RLA
JR NC,$-3
IN D,(C) ;DE=ДЛИНА КОДА ДЛЯ ЗАГРУЗКИ В НГС
MINILD1 IN A,(ZXSTAT)
RLA
JR NC,$-3
INI
DEC DE
LD A,D
OR E
JR NZ,MINILD1
LD HL,MINILD
LD (HL),0XC3
INC HL
LD (HL),LOW (PROGR)
INC HL
LD (HL),HIGH (PROGR)
LD A,0X11
OUT (GSCFG0),A
LD SP,0X4080
XOR A
JP 0X0045
PROGR DI
LD A,2
OUT (MPAG),A
LD A,0X11
OUT (GSCFG0),A
LD HL,0X8000
LD A,(HL)
RRCA
RRCA
RRCA
RRCA
AND 7
LD B,A
LD DE,8
ADD HL,DE
PROG0 LD A,2
OUT (MPAG),A
PUSH BC
LD DE,MINILD+0X10
LD BC,0X10
LDIR
PUSH HL
CALL PROGR0
POP HL
POP BC
DJNZ PROG0
LD A,0X99
OUT (ZXDATWR),A
DJNZ $
XOR A
OUT (MPAG),A
LD A,0X31
LD HL,0X80D3
OUT (GSCFG0),A
LD (0XFFFE),HL
XOR A
JP 0XFFFE
PROGR0 LD HL,(MINILD+0X12)
LD A,L
AND 0X7F
LD DE,(MINILD+0X11)
LD D,A
ADD HL,HL
LD A,2
ADD A,H
LD IYH,A;HY,A
LD HL,0
LD A,(MINILD+0X10)
AND 7
LD IX,0X8000
ADD IX,DE
CALL SET_ADR
CALL ERA_BLK
LD DE,(MINILD+0X14)
CALL PROGR1
LD A,(MINILD+0X10)
AND 7
LD HL,0XFFF8
CALL SET_ADR
LD IX,MINILD+0X18
LD DE,8
PROGR1 LD A,IYH
OUT (MPAG),A
LD A,(IX)
INC IX
PUSH DE
CALL WR_BYTE
LD A,IXH
OR IXL
JR NZ,PROGR2
INC IYH
LD IX,0X8000
PROGR2 POP DE
DEC DE
LD A,D
OR E
JR NZ,PROGR1
RET
include flasher_ngs.a80
MINILDE
DEPHASE
NGS_LOADER binclude ../loader_ngs/loader_ngs.rom
NGS_LOADERE
include window.a80
CHARS binclude altstd.bin
include flasher_data.a80
TEXT_VERSUS