Subversion Repositories pentevo

Rev

Rev 1120 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. ; LAST UPDATE: 16.02.2025 savelij
  3.  
  4. PAGE   
  5.         TITLE "rst8service.a80 ROM_RST83"
  6.  
  7.                 include macros.a80
  8.                 include define.a80
  9.                 include global_vars.a80
  10.                 include ports_ide.a80
  11.                 include ports_ngs.a80
  12.                 include sdcomand.a80
  13.                 include bootsecfat.a80
  14.                 include evodos_vars.a80
  15.                 include tmpkeys.a80
  16.                 include nums_devices.a80
  17.                 include version.a80
  18.                 include cmd_cdhdd.a80
  19.                 include fat_dir.a80
  20.                 include fat/sl811_equ.a80
  21.                 include struct_mount.a80
  22. FATVAR
  23.  _INIT_VAR BUF_CURRFATVAR
  24.                 include fat_vars.a80
  25.  
  26. USB_ENABLE      EQU 0
  27.  
  28. _CMP_FONT       EQU 0
  29. TXTMODE_DEBUG   EQU 0
  30.  
  31. TXT
  32. .H_FILES        EQU 60
  33. .V_FILES        EQU 25
  34. ZX
  35. .H_FILES        EQU 32
  36. .V_FILES        EQU 24
  37.  
  38. MAGIC_COLOR     EQU BLUE << 3 + WHITE + BR_INK
  39.  
  40.         PHASE 0
  41.                 JP $                            ; 0000
  42.  
  43.                 DB 0x0008-$ DUP 0xFF
  44.                 JP $                            ; 0008
  45.  
  46.                 DB 0x0010-$ DUP 0xFF
  47.                 JP $                            ; 0010
  48.  
  49.                 DB ADR_SEL_ROM-$ DUP 0xFF
  50.                 OUT (C),A                       ; 0014
  51.                 NOP
  52.                 RET
  53.  
  54.                 DB 0x0018-$ DUP 0xFF
  55.                 JP $                            ; 0018
  56.  
  57.                 DB 0x001C-$ DUP 0xFF
  58.                 JP RST8_DOS
  59.  
  60.                 DB 0x0020-$ DUP 0xFF
  61.                 JP CALL2RAMPAGE                 ; 0020
  62.  
  63.                 DB 0x0024-$ DUP 0xFF
  64.                 JP RST8PAGE0                    ; 0024
  65.  
  66.                 DB 0x0028-$ DUP 0xFF
  67.                 JP $                            ; 0028
  68.  
  69.                 DB CONT_RST8-$ DUP 0xFF         ; 002C
  70.                 JP NEXT_RST8
  71.  
  72. ; переход в страницу 4 с возвратом
  73.                 DB 0x0030-$ DUP 0xFF
  74.                 JP CALL2PAGE                    ; 0030
  75.  
  76. ; продолжение обработки нажатия MAGIC
  77.                 DB CONTINUE_MAGIC-$ DUP 0xFF    ; 0034
  78.                 JP CONT_MAGIC
  79.  
  80.                 DB 0x0038-$ DUP 0xFF            ; 0038
  81. ;               PUSH HL                         ; 11
  82. ;               LD HL,(ADR_INT)                 ; 16
  83. ;               EX (SP),HL                      ; 19
  84. ;               RET                             ; 10=56
  85.  
  86.                 EI                              ; 4
  87.                 RET                             ; 10=14
  88.  
  89.                 DB 0x003E-$ DUP 0xFF
  90.                 EI
  91.                 RET
  92.  
  93. ; выход из RST8
  94. EXIT_RST8       LD BC,P4_EXIT_RST8              ; адрес возврата в последней странице RAM
  95.                 PUSH BC
  96.                 LD BC,WIN_P0
  97.                 XOR A
  98.                 JP ADR_SEL_ROM
  99.  
  100. ; вход RST 8 для DOS
  101. RST8_DOS        LD HL,ERST8_DOS
  102.                 JP NEXT_RST
  103.  
  104. ; выход RST 8 для DOS
  105. ERST8_DOS       LD BC,WIN_A0
  106.                 LD A,6
  107.                 JP ADR_SEL_ROM
  108.  
  109. ; обработчик MAGIC
  110.                 DB 0x0066-$ DUP 0xFF
  111.                 NOP
  112. CONT_MAGIC      NOP
  113.                 DI
  114.                 LD HL,N_77
  115.                 CALL CONVERT_BPORT
  116.                 CALL STORE_AY                   ; сохранение состояния регистров и заглушение AY
  117.                 LD A,(CPU2 + DEBUG_ONOFF)
  118.                 BIT DEBUGGER.B_TRACE,A
  119.                 JP NZ,NMI_DEBUG                 ; если активен отладчик, то переход на его запуск
  120.                 LD A,(N_BF)
  121.                 AND M_BREAK_BF
  122.                 JP Z,CONT_MAGIC2
  123.                 LD HL,(NADRRET_L)
  124.                 LD A,H
  125.                 CP 5
  126.                 JP NZ,CONT_MAGIC2
  127.                 LD A,L
  128.                 CP 0x6C
  129.                 JP NC,CONT_MAGIC2
  130.                 CP 0x67
  131.                 JP C,CONT_MAGIC2
  132.                 CALL MAINPAGE3_TAP
  133.                 LD HL,(NREG_IXL)
  134.                 LD (RREG_IXL),HL
  135.                 LD HL,(NREG_E)
  136.                 LD (RREG_E),HL
  137.                 LD HL,(NREG_F)
  138.                 LD (RREG_F),HL
  139.         ROMCALL EMULOADTAP,ROM_RST82
  140.                 LD HL,(RREG_IXL)
  141.                 LD (NREG_IXL),HL
  142.                 LD HL,(RREG_E)
  143.                 LD (NREG_E),HL
  144.                 LD HL,0x56B
  145.                 LD (NADRRET_L),HL
  146.                 LD HL,(RREG_F)
  147.                 LD (NREG_F),HL
  148.                 JP CONTMAGIC3
  149.  
  150.                 DB 0x00FF - $ DUP 0xFF
  151.                 DW 0x0038
  152.  
  153. ; таблица переходов для RST 8
  154. CODE_TABL       DW AY_PRN_INIT_                 ; 40
  155.                 DW AY_PRN_A__                   ; 41
  156.                 DW AY_PRN_TOKEN_                ; 42
  157.                 DW AY_PRN_SCR_                  ; 43
  158.                 DW TAPE_INIT_                   ; 44
  159.                 DW TAPE_EMUL_                   ; 45
  160.                 DW WINW_                        ; 46
  161.                 DW PRINT_MESSAGE_               ; 47
  162.                 DW PRINT_A_                     ; 48
  163.                 DW SCRUP_                       ; 49
  164.                 DW SCRDN_                       ; 4A
  165.                 DW SET_MODE_                    ; 4B
  166.                 DW MATH                         ; 4C
  167.                 DW VERSION_                     ; 4D
  168.                 DW EXT_FILE_BROWSER_            ; 4E
  169.                 DW NMI_FB_BLOCK_                ; 4F
  170.                 DW COM_DEV                      ; 50
  171.                 DW COM_FAT                      ; 51
  172.                 DW SORT_FINDFILES               ; 52
  173.                 DW MOUNTER                      ; 53
  174.                 DW INST_FATBOOT_                ; 54
  175.                 DW CMOS_RW_                     ; 55
  176.                 DW SETUP_PAL_                   ; 56
  177.                 DW SETUP_FONT_                  ; 57
  178. ECODE_TABL
  179.  
  180. ;===============
  181.  
  182. ; вход в основное меню MAGIC если не перехвачено отладчиком
  183. CONT_MAGIC2     LD BC,CONF_128
  184.         READ_7FFD
  185.                 AND M_ZX_SCREEN ! 0xFF
  186.                 OUT (C),A                       ; включение отображения экрана 0
  187.                 LD A,(N_77)
  188.                 CALL CMP_SCRMODE                ; проверка видеорежима прерванной программы
  189.                 LD HL,EI_RET
  190.                 LD (ADR_INT),HL                 ; заглушка на прерывания
  191.         ROMCALL STORE_TXTMODE,ROM_RST82         ; сохранение текстмодного экрана
  192.         ROMCALL SCAN_FONT,ROM_RST80             ; чтение текущего загруженного шрифта
  193.         ROMCALL RD_SET_PAL,ROM_RST82            ; сохранение и установка палитры для MAGIC
  194. ;==========времянка
  195.         IF _CMP_FONT=1
  196.                 CALL CMP_FONT                   ; времянка, проверка считанного шрифта
  197.                 RLA
  198.                 LD (CMP_FONT_FLAG),A
  199.         ENDIF
  200. ;==========времянка
  201.         ROMCALL MAGIC_FONT,ROM_RST82            ; установка временного шрифта для MAGIC режима
  202.                 LD A,(CPU2 + DEBUG_ONOFF)
  203.                 BIT DEBUGGER.B_ACTIV,A
  204.                 JP NZ,NMI_DEBUG                 ; если активен отладчик, то переход на его запуск
  205.         ROMCALL STORE_FATVARS,ROM_RST82         ; сохранили переменные FAT внешнего софта
  206. RESTART_NMI
  207.         ROMCALL CLS_TXTMODE8,ROM_RST82          ; очистка текстмодного экрана
  208.         EVOPORT WIN_A1,ROM_RST83                ; включение этой страницы ROM в 1 окно проецирования
  209.                 LD HL,CPU1 + TEXT_PORTREGS
  210.         ROMCALL PRTT_MSG,ROM_RST82              ; печать текста
  211.                 LD A,(SYSFLAGS)
  212.                 AND SYSFLAGS.M_NMI_FB_BLOCK
  213.                 JR Z,.L3
  214.                 LD HL,CPU1 + TXT_FB_BLOCKED
  215.         ROMCALL PRTT_MSG,ROM_RST82              ; печать текста
  216. .L3
  217.         ROMCALL PRT_PORTREGS,ROM_RST82          ; печать содержимого портов считанной конфигурации
  218. ;==========времянка
  219.         IF _CMP_FONT=1
  220.                 LD HL,CPU1 + TXT_VERIFY_FONT
  221.         ROMCALL PRTT_MSG,ROM_RST82              ; печать текста о проверке шрифта
  222.                 LD A,(CMP_FONT_FLAG)
  223.                 RRA
  224.                 LD HL,CPU1 + TXT_VERIFY_OK      ; текст если все совпало
  225.                 JR NC,.L1
  226.                 LD HL,CPU1 + TXT_VERIFY_ERR     ; текст если не совпало
  227. .L1
  228.         ROMCALL PRTT_MSG,ROM_RST82              ; печать об ошибке
  229.         ENDIF
  230. ;==========времянка
  231.         EVOPORT WIN_A1,ROM_RST81                ; включение дополнений в 1 окно проецирования
  232.                 LD IX,MAIN_MENU
  233.         ROMCALL SETUP4SEL,ROM_RST82
  234.         ROMCALL INT_TXT_WINDOW,ROM_RST82        ; вывод окна на текстмодный экран
  235.         ROMCALL ITSELECTOR,ROM_RST82
  236. ; восстановление буферов FAT внешнего софта
  237.                 AND A
  238.                 JP Z,.L2
  239.                 DEC A
  240.                 JP Z,RESTART_NMI                ; нажат BREAK, перезапускаемся
  241.                 DEC A
  242.                 JP Z,CONTMAGIC3
  243. ; выход из MAGIC
  244. .L2             XOR A
  245.                 IN A,(0xFE)
  246.                 CPL
  247.                 AND 0x1F
  248.                 JR NZ,.L2                       ; ждем отпускания кнопок клавиатуры
  249.         ROMCALL RESTORE_TXTMODE,ROM_RST82       ; восстановление текстмодного экрана
  250.         ROMCALL RESTORE_FONT,ROM_RST82          ; восстановление шрифта
  251.         ROMCALL RESTORE_PAL,ROM_RST82           ; восстановление палитры
  252. CONTMAGIC3
  253. ;               CALL RESTORE_AY                 ; восстановление рагистров AY
  254.         ROMCALL RESTORE_FATVARS,ROM_RST82       ; восстановили переменные FAT внешнего софта
  255.                 LD BC,EXITNMISERVICE
  256.                 PUSH BC
  257.                 LD BC,WIN_P0
  258.                 XOR A
  259.                 JP ADR_SEL_ROM
  260.  
  261. VERSION_        LD HL,VERSBIN >> 16
  262.                 LD (RREG_C),HL
  263.                 LD HL,VERSBIN & 0xFFFF
  264.                 LD (RREG_E),HL
  265.         IFDEF DOS_FE
  266.                 LD L,1                          ; требует прошивки zxevo_fw.bin из standalone_base_trdemu
  267.         ELSE
  268.                 LD L,0                          ; прошивка не критична
  269.         ENDIF
  270.                 LD BC,FDD_EMU_PORT
  271.                 IN H,(C)                        ; сохраняем текущее значение порта
  272.                 LD E,%00001010
  273.                 OUT (C),E                       ; записали число
  274.                 IN A,(C)                        ; прочитали обратно
  275.                 CP E
  276.                 JR Z,.L1
  277.                 SET B_INCORRECTFPGA,L           ; при не совпадении зашито zxevo_fw.bin не той системы
  278. .L1             LD A,L
  279.                 LD (RREG_A),A                   ; выставили в A что получилось
  280.                 OUT (C),H                       ; восстановили текщее значение порта
  281.                 RET
  282.  
  283. NMI_FB_BLOCK_   LD A,(RREG_A)
  284.                 LD HL,SYSFLAGS
  285.                 RES SYSFLAGS.B_NMI_FB_BLOCK,(HL)
  286.                 AND A
  287.                 RET Z
  288.                 SET SYSFLAGS.B_NMI_FB_BLOCK,(HL)
  289.                 RET
  290.  
  291. EXT_FILE_BROWSER_
  292.         ROMCALL EXT_FILE_BROWSER,ROM_RST82
  293.                 RET
  294.  
  295. SETUP_FONT_
  296.         ROMCALL SETUP_FONT,ROM_RST81
  297.                 RET
  298.  
  299. SET_MAP_
  300.         ROMCALL 0x40,ROM_ERS
  301.                 RET
  302.  
  303. SETUP_PAL_
  304.         ROMCALL SETUP_PAL,ROM_RST82
  305. RESERVED        RET
  306.  
  307. AY_PRN_INIT_
  308.         ROMCALL AY_PRN_INIT,ROM_RST82
  309.                 RET
  310.  
  311. AY_PRN_A__
  312.         ROMCALL AY_PRN_A_,ROM_RST82
  313.                 RET
  314.  
  315. AY_PRN_TOKEN_
  316.         ROMCALL AY_PRN_TOKEN,ROM_RST82
  317.                 RET
  318.  
  319. AY_PRN_SCR_
  320.         ROMCALL AY_PRN_SCR,ROM_RST82
  321.                 RET
  322.  
  323. TAPE_INIT_
  324.         ROMCALL TAPE_INIT,ROM_RST82
  325.                 RET
  326.  
  327. TAPE_EMUL_
  328.         ROMCALL TAPE_EMUL,ROM_RST82
  329.                 RET
  330.  
  331. WINW_
  332.         ROMCALL EXT_ZX_WINDOW,ROM_RST82
  333.                 RET
  334.  
  335. PRINT_MESSAGE_
  336.         ROMCALL PRINT_MESSAGE,ROM_RST82
  337.                 RET
  338.  
  339. PRINT_A_
  340.         ROMCALL PRINT_A,ROM_RST82
  341.                 RET
  342.  
  343. SCRUP_          LD A,(RREG_A)
  344.                 LD (SCROLL_MODE),A
  345.         ROMCALL SCRUP,ROM_RST82
  346.                 RET
  347.  
  348. SCRDN_          LD A,(RREG_A)
  349.                 LD (SCROLL_MODE),A
  350.         ROMCALL SCRDN,ROM_RST82
  351.                 RET
  352.  
  353. SET_MODE_
  354.         ROMCALL SET_MODE,ROM_RST82
  355.                 RET
  356.  
  357. INST_FATBOOT_
  358.         ROMCALL UNP_MICRO_BOOT,ROM_RST80
  359.                 RET
  360.  
  361. CMOS_RW_
  362.         ROMCALL CMOS_RW,ROM_RST82
  363.                 RET
  364.  
  365. RST8PAGE0       LD HL,ERST8PAGE0
  366.                 JP NEXT_RST
  367.  
  368. ERST8PAGE0      LD BC,WIN_A0
  369.                 XOR A
  370.                 JP ADR_SEL_ROM
  371.  
  372. SELECT_MAPPER  
  373.         READ_7FFD
  374.                 AND 0x10
  375.                 RET NZ
  376.                 LD A,-8
  377.                 ADD A,L
  378.                 LD L,A
  379.                 RET
  380.  
  381. ; продолжение обработки RST8
  382. NEXT_RST8       LD HL,EXIT_RST8
  383. NEXT_RST        PUSH HL
  384.                 LD (INTERNAL_SP),SP
  385.                 LD HL,R_77
  386.                 CALL CONVERT_BPORT
  387.                 CALL P5_READ_BYTE
  388.                 LD A,(R_77)
  389.                 CALL CMP_SCRMODE
  390.                 LD HL,B1_CPU2
  391.                 CALL SELECT_MAPPER
  392. NEXT_RST1       LD B,(HL)
  393.                 INC HL
  394.                 LD A,(HL)
  395.                 AND 8
  396.                 LD A,B
  397.                 JR Z,NEXT_RST2
  398.                 OR 0xC0
  399. NEXT_RST2       LD (PAGE4READ),A
  400.                 LD A,(NEXTBYTERST8)
  401.                 AND 0x3F
  402.                 LD L,A
  403.                 LD H,0
  404.                 ADD HL,HL
  405.                 LD DE,CODE_TABL
  406.                 ADD HL,DE
  407.                 LD E,(HL)
  408.                 INC HL
  409.                 LD D,(HL)
  410.                 EX DE,HL
  411.                 JP (HL)
  412.  
  413. ; переконфигурация окон проецирования
  414. ; страница переменных в окно 1, основная память в зависимости от адреса в окна 2 и 3
  415. RESETUP_WINS    EXX
  416.         EVOPORT WIN_P1,RAM_NMI                  ; страница переменных в окно 1
  417.                 LD HL,CPU3
  418.                 ADD HL,SP
  419.                 LD SP,HL                        ; стек тоже в окно 1
  420.                 LD HL,B1_CPU0-CPU1              ; для 0 маппера
  421.                 CALL SELECT_MAPPER
  422. RESETUPWINS1    EXX
  423.                 LD BC,CPU2                      ; адрес чтения/записи на 0x8000 выше
  424.                 LD A,H                          ; проверка старшего байта адреса
  425.                 EXX
  426.                 CP 0x40
  427.                 JR C,RESETUPWINS2               ; установка для окон 0,1
  428.                 INC HL
  429.                 INC HL
  430.                 EXX
  431.                 LD BC,CPU1                      ; адрес чтения/записи на 0x4000 выше
  432.                 EXX
  433.                 CP 0x80
  434.                 JR C,RESETUPWINS2               ; установка для окон 1,2
  435.                 INC HL
  436.                 INC HL
  437.                 EXX
  438.                 LD BC,CPU0                      ; адрес чтения/записи без изменений
  439.                 EXX
  440.                 CP 0xC0
  441.                 JR C,RESETUPWINS2               ; установка для окон 2,3
  442.                 INC HL
  443.                 INC HL
  444.                 EXX
  445.                 LD BC,CPU3                      ; адрес чтения/записи на 0x4000 ниже
  446.                 EXX
  447.                 LD B,HIGH (WIN_A2)              ; старший байт адреса порта окна 2
  448.                 CALL RESETUPWINS4
  449.                 LD DE,0xFFF8
  450.                 ADD HL,DE                       ; адрес где конфиг страниц основной памяти лежит
  451.                 JR RESETUPWINS5
  452.  
  453. RESETUPWINS2    LD B,HIGH (WIN_A2)              ; старший байт адреса порта окна 2
  454.                 CALL RESETUPWINS4
  455. RESETUPWINS5    LD B,HIGH (WIN_A3)              ; старший байт адреса порта окна 3
  456.                 CALL RESETUPWINS4
  457.                 EXX
  458.                 RET
  459.  
  460. RESETUPWINS4    LD E,(HL)                       ; байт для записи в порт
  461.                 INC HL                          ; указание на байт адреса порта
  462.                 BIT 3,(HL)
  463.                 JR NZ,RESETUPWINS3
  464.                 SET 3,B
  465.                 LD A,(HL)
  466.                 AND 3
  467.                 RRCA
  468.                 RRCA
  469.                 OUT (C),A                       ; сначала пишем в порт xFF7
  470.                 RES 3,B
  471. RESETUPWINS3    INC HL
  472.                 OUT (C),E                       ; теперь пишем в порт x7F7
  473.                 RET
  474.  
  475. ; чтение байта из области памяти вызвашей проги
  476. P5_READ_BYTE    PUSH HL
  477.                 PUSH DE
  478.                 PUSH BC
  479.                 PUSH AF
  480.                 LD A,(RADRRET_H)                ; старший байт адреса откуда читать
  481.                 CP 0x40
  482.                 JR NC,READBYTE_03
  483. ; если адрес чтения ниже 0x4000
  484.                 LD HL,B1_CPU0                   ; байты и адреса портов 0 маппера
  485.                 CALL SELECT_MAPPER
  486. READ_CPU0_01    LD D,(HL)                       ; байт для записи в порт
  487.                 INC HL
  488.                 LD A,(HL)                       ; старший байт адреса порта нужной страницы
  489.                 AND HIGH (WIN_A1)
  490.                 OR HIGH (WIN_P1)                ; преобразовали старший байт адреса для включения в 1 окне
  491.                 LD B,A
  492.                 LD C,LOW (WIN_A0)               ; BC = адрес порта
  493.                 LD A,(R_77)
  494.                 LD E,0x3F
  495.                 AND 0x10                        ; определяем DOS или не DOS
  496.                 JR Z,READ_CPU0_02
  497.                 DEC E
  498. READ_CPU0_02    LD A,D
  499.                 AND E
  500.                 OUT (C),A                       ; включаем пагу BASIC или DOS
  501.                 LD DE,CPU1                      ; смещение до 1 окна проецирования
  502.                 LD HL,(RADRRET_L)               ; адрес откуда читать
  503.                 ADD HL,DE                       ; читать через 1 окно проецирования
  504.                 LD A,(HL)                       ; прочитали байт
  505.                 SBC HL,DE                       ; вернули адрес байта
  506.                 INC HL                          ; увеличили адрес возврата
  507.                 LD (RADRRET_L),HL               ; вернули адрес возврата
  508.                 JR READBYTE_02
  509.  
  510. ; если адрес чтения выше 0x4000
  511. READBYTE_03     LD HL,B1_CPU0                   ; байты и адреса портов 0 маппера
  512.                 CALL SELECT_MAPPER
  513. READBYTE_01     LD A,(RADRRET_H)                ; старший байт адреса откуда читать
  514.                 AND 0xC0
  515.                 LD C,A
  516.                 RLCA
  517.                 RLCA
  518.                 RLCA
  519.                 LD E,A
  520.                 LD D,0                          ; DE = смещение в таблице байта и старшего байта страницы чтения
  521.                 ADD HL,DE
  522.                 LD D,(HL)                       ; байт для записи в порт
  523.                 INC HL
  524.                 LD A,(HL)
  525.                 AND HIGH (WIN_A1)
  526.                 OR HIGH (WIN_P1)
  527.                 LD B,A
  528.                 LD C,LOW (WIN_A1)               ; BC = адрес порта для 1 окна проецирования
  529.                 LD HL,(RADRRET_L)               ; адрес откуда читать
  530.                 OUT (C),D                       ; включили страницу для чтения байта
  531.                 LD E,L                          ; младший байт адреса чтения
  532.                 LD A,H
  533.                 AND HIGH (WIN_A1)
  534.                 OR HIGH (CPU1)
  535.                 LD D,A                          ; старший байт адреса чтения
  536.                 LD A,(DE)                       ; прочитали байт
  537.                 INC HL                          ; увеличили адрес возврата
  538.                 LD (RADRRET_L),HL               ; вернули адрес возврата
  539. READBYTE_02     LD (NEXTBYTERST8),A             ; положили прочитанный байт
  540.                 CALL MAIN_MEM13                 ; вернули страницы в 1 и 3 окно проецирования
  541.                 POP AF
  542.                 POP BC
  543.                 POP DE
  544.                 POP HL
  545.                 RET
  546.  
  547. LDIR_BYTES      EXX
  548.                 LD BC,INT_ONLY_RET
  549.                 PUSH BC
  550.                 LD BC,LDIR__BYTES
  551.                 PUSH BC
  552.                 LD BC,WIN_P0
  553.                 XOR A
  554.                 JP ADR_SEL_ROM
  555.  
  556. ; восстановлениe страниц в окнах проецирования 1 и 3
  557. MAIN_MEM13      LD HL,B1_CPU1                   ; для 0 маппера
  558.                 CALL SELECT_MAPPER
  559. MAINMEM1        CALL MAINMEM3                   ; вернули для 1 окна проецирования
  560.                 INC HL                          ; далее возвращаем для 3 окна проецирования
  561.                 INC HL
  562.                 CALL MAINMEM3
  563. SET_7FFD        DEC HL
  564.                 BIT 3,(HL)
  565.                 RET Z
  566.                 DEC HL
  567.                 BIT 7,(HL)
  568.                 RET Z
  569.         READ_7FFD
  570.                 LD D,A
  571.                 LD E,0
  572.                 LD HL,PAGES_7FFD_ALL
  573.                 JR NZ,SET7FFD1
  574.                 AND 0xE0
  575.                 RRCA
  576.                 RRCA
  577.                 LD E,A
  578. SET7FFD1        LD A,D
  579.                 AND 7
  580.                 OR E
  581.                 LD E,A
  582.                 LD D,0
  583.                 ADD HL,DE
  584.                 LD A,(HL)
  585.                 OUT (C),A
  586.                 RET
  587.  
  588. XXF7_7FFD       MACRO B
  589. PLUSIK := B
  590.                 REPT 8
  591.                 DB PLUSIK
  592. PLUSIK := PLUSIK-1
  593.                 ENDM
  594.                 ENDM
  595.  
  596. PAGES_7FFD_ALL  XXF7_7FFD 0xFF
  597.                 XXF7_7FFD 0xEF
  598.                 XXF7_7FFD 0xDF
  599.                 XXF7_7FFD 0xCF
  600.  
  601.                 XXF7_7FFD 0xF7
  602.                 XXF7_7FFD 0xE7
  603.                 XXF7_7FFD 0xD7
  604.                 XXF7_7FFD 0xC7
  605.  
  606. MAINPAGE3_TAP   LD HL,B1_CPU3
  607.                 CALL SELECT_MAPPER
  608.                 CALL MAINMEM3
  609.                 JR SET_7FFD
  610.  
  611. MAINMEM3        LD C,LOW (WIN_A0)
  612.                 LD E,(HL)
  613.                 INC HL
  614.                 LD A,8
  615.                 AND (HL)
  616.                 LD A,E
  617.                 JR Z,MAINMEM4
  618.                 OR 0xC0
  619. MAINMEM4        LD E,A
  620.                 LD A,(HL)
  621.                 OR 0x3F
  622.                 LD B,A
  623.                 LD A,0x40
  624.                 OUT (C),A
  625.                 RES 3,B
  626.                 INC HL
  627.                 OUT (C),E
  628. INT_ONLY_RET    RET
  629.  
  630. ; конверсия считанных значений из портов конфигурации
  631. ; HL = адрес откуда брать считанные значения для конверсии
  632. ; DE = биты 7,6 для декодирования
  633. ; BC = куда складывать декодированное
  634. ;  A = считанное значение для конверсии для порта xx77
  635. CONVERT_BPORT   LD A,(HL)
  636.                 PUSH AF
  637.                 INC HL
  638.                 INC HL
  639.                 INC HL
  640.                 LD E,(HL)
  641.                 INC HL
  642.                 LD D,(HL)
  643.                 LD BC,8
  644.                 LD A,C                          ; конвертить 8 байт
  645.                 ADD HL,BC
  646.                 LD BC,B0_CPU0
  647.                 LD IYL,HIGH (WIN_A3) & 0xF8
  648. .L3             EX AF,AF'
  649.                 LD A,(HL)
  650.                 CP 0xC0
  651.                 JR NC,.L1
  652. ; если число менее, то восстанавливать в порты x7F7
  653.                 LD (BC),A                       ; номер страницы для записи в порт при восстановлении
  654.                 INC BC
  655.                 LD A,IYL
  656.                 ADD A,0x40
  657.                 LD IYL,A
  658.                 AND 0xF0
  659.                 SRL E
  660.                 SRL D
  661.                 LD (BC),A                       ; старший байт адреса порта
  662.                 INC BC
  663.                 JR .L2
  664.  
  665. ; если число больше, то восстанавливать в порты xFF7
  666. .L1             LD A,(HL)
  667.                 RLCA
  668.                 RLCA
  669.                 SRL D
  670.                 RRA
  671.                 SRL E
  672.                 RRA
  673.                 LD (BC),A                       ; номер страницы для записи в порт при восстановлении
  674.                 INC BC
  675.                 LD A,IYL
  676.                 ADD A,0x40
  677.                 LD IYL,A
  678.                 LD (BC),A                       ; старший байт адреса порта
  679.                 INC BC
  680. .L2             DEC HL
  681.                 EX AF,AF'
  682.                 DEC A
  683.                 JR NZ,.L3
  684.                 POP HL
  685.                 LD L,0xBC
  686.                 LD A,H
  687.                 AND 0x0F
  688.                 OR 0xA0
  689.                 LD (BC),A                       ; байт для записи в порт при восстановлении
  690.                 INC BC
  691.                 LD A,H
  692.                 AND 0x80
  693.                 RRCA
  694.                 OR L
  695.                 LD L,A
  696.                 LD A,H
  697.                 AND 0x60
  698.                 RLCA
  699.                 RLCA
  700.                 RLCA
  701.                 OR L
  702.                 LD (BC),A                       ; старший байт адреса порта
  703.                 RET
  704.  
  705. READ_KEYS
  706.                 RET
  707.  
  708. ; драйвера
  709.                 include fat/mounter.a80
  710.                 include fat/dev_drv.a80
  711.                 include fat/ngs_sd_drv.a80
  712.                 include fat/z_sd_drv.a80
  713.                 include fat/nemo_drv.a80
  714.                 include fat/read_fat.a80
  715.                 include fat/usb_drv.a80
  716.  
  717. STORE_AY        LD BC,0xFFFD
  718.                 LD A,0xFE
  719.                 OUT (C),A
  720. ;               LD HL,AY_REGS2
  721.                 CALL .L1
  722.                 LD BC,0xFFFD
  723.                 LD A,0xFF
  724.                 OUT (C),A
  725. ;               LD HL,AY_REGS1
  726. .L1             LD DE,0xFFBF;C0
  727. ;               LD A,0x0D
  728. ;.L2            LD B,D
  729. ;               OUT (C),A
  730. ;               LD B,E
  731. ;               INI
  732. ;               DEC A
  733. ;               JP P,.L2
  734. ;               DEC E
  735.                 LD H,0
  736.                 LD A,0x0D
  737. .L3             LD B,D
  738.                 OUT (C),A
  739.                 LD B,E
  740.                 OUT (C),H
  741.                 DEC A
  742.                 JP P,.L3
  743.                 RET
  744.  
  745. ;RESTORE_AY     LD BC,0xFFFD
  746. ;               LD A,0xFE
  747. ;               OUT (C),A
  748. ;               LD HL,AY_REGS2
  749. ;               CALL .L1
  750. ;               LD BC,0xFFFD
  751. ;               LD A,0xFF
  752. ;               OUT (C),A
  753. ;               LD HL,AY_REGS1
  754. ;.L1            LD DE,0xFFC0
  755. ;               LD C,0xFD
  756. ;               LD A,0x0D
  757. ;.L2            LD B,D
  758. ;               OUT (C),A
  759. ;               LD B,E
  760. ;               OUTI
  761. ;               DEC A
  762. ;               JP P,.L2
  763. ;               RET
  764.  
  765. X_OFFSET        EQU 63
  766. Y_OFFSET        EQU 2
  767. TEXT_PORTREGS   DB 0x17,MAGIC_COLOR
  768.                 DB 0x16,Y_OFFSET+0x01,X_OFFSET+0,"SP:      PC:"
  769.                 DB 0x16,Y_OFFSET+0x02,X_OFFSET+0,"IR:"
  770.                 DB 0x16,Y_OFFSET+0x03,X_OFFSET+0,"AF:     AF':"
  771.                 DB 0x16,Y_OFFSET+0x04,X_OFFSET+0,"BC:     BC':"
  772.                 DB 0x16,Y_OFFSET+0x05,X_OFFSET+0,"DE:     DE':"
  773.                 DB 0x16,Y_OFFSET+0x06,X_OFFSET+0,"HL:     HL':"
  774.                 DB 0x16,Y_OFFSET+0x07,X_OFFSET+0,"IX:      IY:"
  775.                 DB 0x16,Y_OFFSET+0x08,X_OFFSET+0," INT      IM"
  776.                 DB 0x16,Y_OFFSET+0x0A,X_OFFSET+0,"  MAP  0 1"
  777.                 DB 0x16,Y_OFFSET+0x0B,X_OFFSET+0,"CPU3:"
  778.                 DB 0x16,Y_OFFSET+0x0C,X_OFFSET+0,"CPU2:"
  779.                 DB 0x16,Y_OFFSET+0x0D,X_OFFSET+0,"CPU1:"
  780.                 DB 0x16,Y_OFFSET+0x0E,X_OFFSET+0,"CPU0:"
  781.                 DB 0x16,Y_OFFSET+0x10,X_OFFSET+0,"7FFD:   FF:"
  782.                 DB 0x16,Y_OFFSET+0x11,X_OFFSET+0,"EFF7:   7F:"
  783.                 DB 0x16,Y_OFFSET+0x12,X_OFFSET+0,"  77:   5F:"
  784.                 DB 0x16,Y_OFFSET+0x13,X_OFFSET+0,"  BF:   3F:"
  785.                 DB 0x16,Y_OFFSET+0x14,X_OFFSET+0," DOS:   1F:"
  786.                 DB 0x16,Y_OFFSET+0x15,X_OFFSET+0,"BREAK: "
  787.                 DB 0x16,Y_OFFSET+0x16,X_OFFSET+0,"TURBO: "
  788.                 DB 0x16,1,0x10,0x17,%00110010," EVO Magic Service v"
  789.                 DB VERSBIOS,"beta ",0
  790.  
  791. TXT_VERIFY_FONT DB "\x16\x18\x00\x17\x22  VERIFY READING FONT ",0
  792. TXT_VERIFY_OK   DZ " OK    "
  793. TXT_VERIFY_ERR  DZ "ERROR  "
  794. TXT_FB_BLOCKED  DZ "\x16\x17\x08\x17\xBA  File Browser is blocked  "
  795.  
  796. ; проверка считанного фонта
  797.         IF _CMP_FONT=1
  798. CMP_FONT        LD H,CMOS_BYTE_00
  799.         ROMCALL READCMOS,ROM_RST82
  800.                 AND M_TYPE_FONT
  801.                 LD HL,CP866_FONT
  802.                 JR NZ,.L1
  803.                 LD HL,ATM_FONT
  804. .L1             LD DE,CPU1 + OFFSET_BUFSYM
  805.                 PUSH DE
  806.         ROMCALL UNPACK,ROM_RST80
  807.                 POP DE
  808.                 INC D
  809.                 LD BC,0x700
  810.                 LD HL,CPU1 + OFFSET_FNTSAVE + 0x100
  811. .L2             LD A,(DE)
  812.                 INC DE
  813.                 CP (HL)
  814.                 SCF
  815.                 RET NZ
  816.                 CPI
  817.                 JP PE,.L2
  818.                 XOR A
  819.                 RET
  820.         ENDIF
  821.  
  822. CMP_SCRMODE     LD HL,SYSFLAGS
  823.                 RES SYSFLAGS.B_VIDEO_MODE,(HL)
  824.                 AND 7
  825.                 CP 3
  826.                 RET Z
  827.                 SET SYSFLAGS.B_VIDEO_MODE,(HL)
  828.                 RET
  829.  
  830. SD_CARD_LOST    LD HL,DEVMAN_VARS.FLAGS_DRV
  831.                 LD A,B_NEW_SD
  832.                 OR (HL)
  833.                 LD (HL),A
  834.         PEC_ON M_SHADOW_BF
  835.                 CALL MAIN_MEM13
  836.                 LD IX,SDCARD_LOST
  837.         ROMCALL INT_ZX_WINDOW,ROM_RST82
  838.                 JR $
  839.  
  840.                 include math.a80
  841.                 include sortfiles.a80
  842.  
  843. FREE_MAIN       EQU 0x3FF6-$
  844.  
  845.                 DB FREE_MAIN DUP 0xFF
  846.                 DW FREE_MAIN                    ; размер свободного места
  847.                 DB "RST_08"
  848.                 DW DATA_VERS
  849.         DEPHASE
  850.  
  851.                 include addons.a80
  852.                 include addon1.a80
  853.                 include addon2.a80
  854.                 include mainmenu.a80
  855.