; ; EXPANSION VER 3.00 (C) 1997 ELSY Co. ; ;******************************************************************** ; ;R0003 22-09-2001 исправление названий в меню "Hardware" ;R0002 22-09-2001 вставлен номер ПЗУ и функция биоса для него 0EDh ;R0001 22-09-2001 добавлена функция GOTO Spectrum 0FBh ; ;******************************************************************** ORG 0 SPRIN2 EQU 2 ; 1 - включение Sprinter-1 первой прошивкой ; 2 - включение Sprinter-2 первой прошивкой INCLUDE 'INC/SPRINT00.INC' ; константы, макросы.. INCLUDE 'shared_includes/constants/zx_char_codes.inc' PORT_JOI EQU 0FFh ;****************************** ; ***** BEGIN EXPANSION ***** ;****************************** A_0000: JP GLOBAL_RESET JR SET_BIOS_TO_RAM ;R0002 ROM_NUMBER: DW 0001h ;*************************************** DEFS 8-$ EXP_FNS_2_RET: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A POP AF JR RST_18_1 ;*************************************** DEFS 16-$ JR RST10 ;*************************************** DEFS 24-$ JP EXP_FNS_RST18 RST_18_1: CALL EXP_FNS_RST18 JR EXP_FNS_2_RET ; DEFS 2Bh-$ ;*************************************** DEFS 20h-$ DEFS 28h-$ DEFS 30h-$ DEFS 38h-$ RST38: EI RETI ; PUSH AF ; PUSH HL ; CALL INT_PROG1 ; POP HL ; POP AF ; RET RST10: CALL_48 10h RET ;********************************** DEFS 66h-$ ; NMI ; RET ; резерв 3 байта для команды JP ; NOP ; NOP RETN NOP ;********************************** SET_BIOS_TO_RAM: ; программа работает на адресе 0C000h LD SP,0C0C0H LD A,0E0H LD C,PAGE3 IN B,(C) CALL SET_ROM_PAGES+0C000H JP NO_SUMX_EQ ;********************************** ;INKEYS: ; BIT 5,(IY+1) ; RET Z ; RES 5,(IY+1) ; LD A,(05C08h) ; RET ; ;WAIT_KEY: ; CALL INKEYS ; CALL NZ,BEEP ; RET NZ ; EI ; HALT ; JR WAIT_KEY BEEP: PUSH HL PUSH DE PUSH BC PUSH AF PUSH IX LD HL,BEEP_RET PUSH HL LD HL,SW_ROM PUSH HL LD HL,03B5h PUSH HL LD HL,200 LD D,H LD E,5 JP SW_ROM BEEP_RET: POP IX POP AF POP BC POP DE POP HL RET DEFS 0A0H-$ TABLE_X: ; таблица для Sprinter POST-Tester-a DB 00101000b ; "0" DB 10111101b ; "1" DB 00110010b ; "2" DB 00110100b ; "3" DB 10100101b ; "4" DB 01100100b ; "5" DB 01100000b ; "6" DB 00111101b ; "7" DB 00100000b ; "8" DB 00100100b ; "9" DB 00100001b ; "A" DB 11100000b ; "B" DB 01101010b ; "C" DB 10110000b ; "D" DB 01100010b ; "E" DB 01100011b ; "F" ; ========================== DEFS 0C0H-$ ;****** ВХОД ПО RANDOMIZE USR 15600 *************** BEGIN: ; Вход через USR 15600 CALL CH_2 CALL COMAND_LINE ; ВЫПОЛНЕНИЕ КОМАНДЫ, ЕСЛИ ЕСТЬ ;****** Вход без команды. ************************* JP SW_ROM_1 ; ВОЗВРАТ В << MAIN MENU >> ; CLS: C_0D6B: ; CLS CALL_48 0D6Bh RET ;___________________________ RESTARTS EQU 0FFE0H GLOBAL_RESET: DI IM 1 LD HL,RESTARTS LD DE,RESTART_TXT LD B,RESTART_TXT_L-4 RESTART_TEST: LD A,(DE) CP (HL) JR NZ,NO_RESTART INC HL INC DE DJNZ RESTART_TEST JP RESTARTS ;********************************** RESTART_TXT: LD HL,RESTARTS ; 3 LD B,16 ; 2 REST_LOOP: LD (HL),0 ; 2 INC HL ; 1 DJNZ REST_LOOP ; 2 NOP ; 1 NOP ; 1 LD A,1 ; 2 OUT (PAGE3),A ; 2 RESTART_TXT_L EQU $-RESTART_TXT ;********************************** SETUP_TXT: LD A,CNF_0+D_ROM16ON OUT (CNF_PORT),A LD HL,1000H LD DE,8000H LD BC,3000H LDIR LD A,CNF_0+D_ROM16OFF OUT (CNF_PORT),A LD HL,08005H LD A,0FEh LD BC,204Eh OUT (C),A LD A,7FH IN A,(0FEH) CPL AND 1 EX AF,AF' LD A,0FFh OUT (C),A EX AF,AF' JP (HL) SETUP_TXT_LEN EQU $-SETUP_TXT SYSTEM_ID_TXT: DB "NEW_BIOS" NO_RESTART: LD SP,0BFFFH ; CALL DCP_INIT LD A,5 ; COM port for Printer OUT OUT (COM_A),A LD A,062H OUT (COM_A),A LD A,0CFH ; BITS I/O OUT (LPT1_C),A XOR A OUT (LPT1_C),A OUT (LPT1_D),A ; PRINTER - PORT - all zeros ;******* INIT SYSTEM PORTS ******************** LD BC,0FFEEh XOR A OUT (C),A ; 0 register - waits INC C OUT (C),A ; set 0 Waits DEC C DEC A ; A->3 ; LD A,3 ; 3-nd register - boundaries OUT (C),A INC C XOR A OUT (C),A ; disable CS0,CS1 ; no boundary set! ; ==== POST PROCs ================================== POST_TEST: ; ************************************************ ; ===== Point 0 ======= ; ************************************************ LD A,(00A0h) OUT (LPT1_D),A ; "0" - start ; ==== TEST RAM BUS ======== TEST_RAM_BUS: LD BC,0 LD HL,0C000h LD DE,00055h LOOP_TEST_RB: LD (HL),E INC L LD (HL),D DEC L LD A,(HL) XOR E OR C LD C,A INC L LD A,(HL) XOR D OR B LD B,A DEC L DEC E INC D JR NZ,LOOP_TEST_RB LD A,E CPL LD E,A INC L INC L BIT 4,L JR Z,LOOP_TEST_RB LD A,B OR C JR Z,POST_RET_1 ; ************************************************ ; JP POST_RET_1 ; for test POST procedure ; ************************************************ ERROR_RAM_BUS: LD HL,0A0h ERB_2: BIT 0,C JR Z,ERB_1 LD A,(HL) AND 11011111b OUT (LPT1_D),A LD DE,0 LOOP_WTT: DEC DE LD A,D OR E JR NZ,LOOP_WTT ERB_1: LD A,C RRA RR B RR C INC L LD A,L AND 0AFh LD L,A JR ERB_2 ; ************************************************ ; ===== Point 1 ============== ; ************************************************ POST_RET_1: LD A,(0A1h) OUT (LPT1_D),A ; ===== TEST ADRESS BUS ====== TEST_ADRESS_BUS: ; LD B,0 ; LD HL,0C001h ; LD (HL),B ; ADD HL,HL ; LD A,H ; OR 0C0h ; LD H,A ; INC B LD HL,0C000h LD DE,00000h TSAB_1: LD (HL),E INC L LD (HL),D INC HL INC DE INC DE BIT 7,H JR NZ,TSAB_1 DEC HL DEC DE DEC DE TSAB_2: LD A,(HL) CP D JR NZ,ER_TSA DEC HL LD A,(HL) CP E JR NZ,ER_TSA DEC HL DEC DE DEC DE LD A,H CP 0BFh JR NZ,TSAB_2 JR POST_RET_2 ER_TSA: ; ************************************************ ; JP POST_RET_2 ; for test POST procedure ; ************************************************ TSAB_4: LD C,D LD B,11011111b LD IX,TSAB_3 JR OUT_C_BYTE TSAB_3: LD C,E LD B,0FFh LD IX,TSAB_4 JR OUT_C_BYTE ; ===== OUT BYTE PROGRAM ======= OUT_C_BYTE: LD A,C RRCA RRCA RRCA RRCA AND 0Fh OR 0A0h LD L,A LD H,0 LD A,(HL) AND B OUT (LPT1_D),A EXX LD DE,0 LOOP_WTT2: DEC DE LD A,D OR E JR NZ,LOOP_WTT2 LD A,0FFh OUT (LPT1_D),A LOOP_WTT21: DEC DE LD A,D OR E JR NZ,LOOP_WTT21 EXX LD A,C AND 0Fh OR 0A0h LD L,A LD A,(HL) OUT (LPT1_D),A EXX LD DE,0 LOOP_WTT3: DEC DE LD A,D OR E JR NZ,LOOP_WTT3 LD A,0FFh OUT (LPT1_D),A LOOP_WTT31: DEC DE LD A,D OR E JR NZ,LOOP_WTT31 EXX JP (IX) ; ************************************************ ; ===== Point 2 ========= ; ************************************************ POST_RET_2: LD A,(0A2h) OUT (LPT1_D),A ; ===== INIT DCP ======== LD HL,POST_RET_3 ; INIT PORTS JP DCP_INIT ; ************************************************ ; ===== Point 3 ========= ; ************************************************ POST_RET_3: LD A,(0A3h) OUT (LPT1_D),A IN A,(PAGE3) ; First IN command - OPEN DCP ; ===== TEST RAM PAGES == IN A,(PAGE3) EX AF,AF' POST_TEST_PAGES: LD B,0 TSPG_1: LD A,0FFh LD I,A LD A,B OUT (PAGE3),A LD A,0 LD I,A IN A,(PAGE3) CP B JR NZ,ERTP DJNZ TSPG_1 EX AF,AF' OUT (PAGE3),A JR POST_RET_4 ERTP: LD C,B LD IX,ERTP_1 ERTP_1: LD B,11011111b JP OUT_C_BYTE ; ************************************************ ; ===== Point 4 ========= ; ************************************************ POST_RET_4: LD A,(0A4h) OUT (LPT1_D),A LD B,0 loop4test: IN A,(0) CP 0FFh ; JR NZ,error_bus DJNZ loop4test JR POST_RET_5 error_bus: LD C,A erb1: LD IX,erbr1 LD B,11011111b JP OUT_C_BYTE erbr1: LD A,11011111b OUT (LPT1_D),A LD DE,0 LOOP_WTT4: DEC DE LD A,D OR E JR NZ,LOOP_WTT4 JR erb1 ; ************************************************ ; ===== Point 5 ========= ; ************************************************ POST_RET_5: LD A,(0A5h) OUT (LPT1_D),A ;=== post end =============== ;-( )=========================== ; LD SP,0BFFFh ; CALL EMM_FN7 ; инициализация памяти ; JP Spectrum_0 ; for TEST! ;-( )=========================== IN A,(PAGE3) EX AF,AF' ; SAVE LD A,SYS_PAGE OUT (PAGE3),A ; LD HL,SYSTEM_ID ; LD DE,SYSTEM_ID_TXT ; LD B,8 ;NEW_BIOS_L: ; LD A,(DE) ; CP (HL) ; JR NZ,NO_NEW_BIOS ; INC HL ; INC DE ; DJNZ NEW_BIOS_L ; LD A,(HL) ; DEC HL ; LD (HL),0 ; забить "NEW_BIOS" для выхода по RESET ; OUT (PAGE3),A ; JP 0C003H ; INIT_NEW_BIOS NO_SUMX_EQ: LD A,SYS_PAGE OUT (PAGE3),A NO_NEW_BIOS: DB 0FDH LD A,L LD L,A DB 0FDH LD A,H LD H,A ; LD SP,SYS_SP ; PUSH IY ; POP HL LD BC,0107H AND A SBC HL,BC JR NZ,NO_CONFIG_ LD (CONFIG_BYTE),IX NO_CONFIG_: LD HL,(CONFIG_BYTE) EX AF,AF' OUT (PAGE3),A ;********************************* LD A,0 OUT (PAGE3),A OUT (PAGE0),A LD A,5 OUT (PAGE1),A LD A,2 OUT (PAGE2),A LD SP,0BFFFH PUSH HL CALL PORTS_INIT CALL EMM_FN7 ; инициализация памяти POP HL ; конфигурация LD A,H CP 0FFH JR NZ,NO_SETUP_1 LD A,L IF SPRIN2 EQ 2 CP 0FDH ; LD BC,0FFFDH ; Конфигурация Sprinter-2 PG_SP1 equ 0ECH PG_SP2 equ 0EEH PG_AY equ 0EAH ELSE ; LD BC,0FFFEH ; Конфигурация Sprinter-1 CP 0FEH PG_AY equ 0EAH ENDIF JR NZ,NO_SETUP_2 ; AND A ; SBC HL,BC ; JR NZ,NO_SETUP_ ;************************************** ; COPY BIOS ТО RAM ???? ;************************************** ; ; ; ;************************************** ; LD A,07FH ; IN A,(0FEH) ; RRCA ; JR NC,NO_SETUP_ ; LD A,0 ; OUT (PAGE3),A ; OUT (PAGE0),A ; LD A,5 ; OUT (PAGE1),A ; LD A,2 ; OUT (PAGE2),A LD A,0FFh LD BC,204Eh ; system_port OUT (C),A LD SP,0BFFFH LD HL,L_PENTAGON CALL SINC_DEF LD SP,0BFFFH LD HL,L_PENTAGON CALL SINC_DEF LD HL,SETUP_TXT LD DE,0C000H LD BC,SETUP_TXT_LEN LDIR CALL 0C000H JP NO_SETUP_1 GOTO_SPEC: IN A,(PAGE3) EX AF,AF' LD A,SYS_PAGE OUT (PAGE3),A LD A,B LD (CONFIG_DE+1),A EX AF,AF' OUT (PAGE3),A NO_SETUP_2: ; CP 0FCH ; JR Z,SPECTRUM_0 ; Конфигурация AY NO_SETUP_1: LD A,(0A8h) OUT (LPT1_D),A LD A,0FEh ; ACC-off LD BC,204Eh OUT (C),A SND_TEST_RET: LD SP,0BFFFH LD HL,L_PENTAGON CALL SINC_DEF CALL SET_PAL_ZX LD HL,4104H LD E,0 LD B,4 CALL LP_OPEN_S LD HL,5104H LD E,0 LD B,4 CALL LP_OPEN_S ;************************************* LD D,35H CALL CMOS_RD BIT 0,A ; PUSH AF ; CALL Z,SPRINTER_1 ; POP AF ; PUSH AF ; CALL NZ,AY8910 ; POP AF ;************************************* SPECTRUM_0: XOR A ; задача 0, режим 256 килобайт SPECTRUM_TASK: LD IX,BASIC_128 JP INIT_PAGES ; инициализация номеров страниц режима спектрума BASIC_128: start_basic: LD SP,0BFFFH LD DE,5B00H ; запуск программы на BASIC-е. LD HL,RES128_PROG LD BC,LEN_RES128 LDIR DI JP 5B00H ;*********************************** ; Инициализация портов PORTS_INIT: LD BC,ISA_PORT LD A,0FFH OUT (C),A RESETTTT: DEC A JR NZ,RESETTTT OUT (C),A LD A,D_TBON+CNF_0 OUT (CNF_PORT),A LD A,D_ROM16OFF ; AROM16 = 0 OUT (CNF_PORT),A ; включить системную страницу CALL DOS_OFF XOR A LD BC,01FFDH OUT (C),A ; Scorp port !!! LD B,7FH OUT (C),A ; 128 port !!! LD BC,0FFEFh ; сброс WAIT-ов !!! LD A,0 OUT (C),A ; ; Инициализация последовательного порта клавиатуры LD A,0 OUT (COM_A),A LD A,1 OUT (COM_A),A LD A,0 ; 18H включение прерываний OUT (COM_A),A LD A,3 OUT (COM_A),A LD A,0C1h OUT (COM_A),A LD A,4 OUT (COM_A),A LD A,5h ; 5/7 паритет? OUT (COM_A),A LD A,5 OUT (COM_A),A LD A,062H OUT (COM_A),A ; Инициализация мыши LD A,0 ; for MOUSE OUT (COM_B),A LD A,1 OUT (COM_B),A LD A,0 OUT (COM_B),A LD A,3 OUT (COM_B),A LD A,041H OUT (COM_B),A LD A,4 OUT (COM_B),A LD A,44H OUT (COM_B),A LD A,5 OUT (COM_B),A LD A,0E0H OUT (COM_B),A ; Инициализация таймера мыши LD A,85 ; for MOUSE OUT (STC0_C),A LD A,45 OUT (STC0_C),A ; Инициализация параллельного порта 1 (принтер) ; LD A,0CFH ; BITS I/O ; OUT (LPT1_C),A ; XOR A ; OUT (LPT1_C),A ; OUT (LPT1_D),A ; PRINTER - PORT - all zeros LD A,00FH ; OUT OUT (LPT1_C),A OUT (LPT1_C),A ; Инициализация параллельного порта 2 (INT/DMA ISA) LD BC,LPT2_C LD A,0CFH ; BITS I/O OUT (C),A LD A,03FH OUT (C),A LD A,0C0h OUT (LPT2_D),A ; Зануление ковокса LD A,0 OUT (0FBH),A ; Сброс контроллера дисковода LD BC,7FFDH LD A,10H OUT (C),A ; BASIC_48 CALL DOS_ON ; DOS_on XOR A OUT (CBL_DIR),A OUT (P_DOS_FF),A push hl pop hl LD A,3CH OUT (P_DOS_FF),A LD A,0 OUT (WG_COM),A LD A,21h OUT (0BCh),A ; set HDD1/not-HDD2 CALL DOS_OFF LD BC,7FFDH XOR A OUT (C),A ; BASIC_128 RET RES128_PROG: LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A ; Возврат в 128k ROM LD C,PAGE3 IN B,(C) LD A,SYS_PAGE OUT (PAGE3),A LD DE,(CONFIG_DE) XOR A LD (CONFIG_DE+1),A OUT (C),B LD BC,1FFDH OUT (C),A ; Scorp порт LD B,7FH OUT (C),A ; 128 порт LD A,E ; установка конфигурации и режима TURBO OUT (SYS_PORT_OFF),A ; CONFIG_SET INC D DEC D JP Z,0 ; 0 ВХОД В BASIC-128 LD A,10H OUT (C),A DEC D JP Z,0 ; 1 ВХОД В BASIC-48 LD HL,0 PUSH HL DEC D JP Z,3D29H ; 2 ВХОД В TR-DOS XOR A OUT (C),A LD A,02H LD B,1FH OUT (C),A DEC D JP Z,0 ; 3 ВХОД В EXPANSION ??? LD A,0 OUT (C),A LD A,30H LD B,7FH OUT (C),A DEC D JP Z,3D29H ; 4 ВХОД В TR-DOS с закрытыми 128-ми портами JP 0 ; 5 ВХОД В BASIC-48 с закрытыми 128-ми портами LEN_RES128 EQU $-RES128_PROG CH_2: LD A,2 C_1601: ; OPEN CHANEL CALL_48 #1601 RET TURBO_OFF: LD A,D_TBOFF OUT (CNF_PORT),A RET TURBO_ON: LD A,D_TBON OUT (CNF_PORT),A RET PRINT_LINE: LD A,(HL) INC HL CP 0FFh RET Z RST 10H JR PRINT_LINE JP_HL: JP (HL) ; JP RESET_128 ;******************************** ; *** UTILITES *** ;******************************** ; получить раб обл C_0030: CALL_48X 0030h RET ; очистить раб обл C_19E8: CALL_48X 19E8h RET ; получить пространство C_1655: CALL_48X 1655h RET ;**************************************** ; ******* SERVICE ******* ;**************************************** ;******************************************************* ; ДЕШИФРАЦИЯ КОМАНДНОЙ СТРОКИ,ПЕРЕДАННОЙ ДЛЯ "EXPANSION" ;******************************************************* COMAND_LINE: LD HL,(CH_ADR) COMAND_LOOP: LD A,(HL) INC HL CP ":" JR Z,COMAND_L1 CP 0Dh JR NZ,COMAND_LOOP RET COMAND_L1: LD A,(HL) CP 0EAh ; REM !!! RET NZ INC HL COMAND_OK: ; ОБНАРУЖЕНА КОМАНДА ДЛЯ 'expansion' LD A,(HL) INC HL CP ':' JP Z,MENU_S1 CP 0Dh JP Z,MENU_S1 CP 'I' JR Z,COMAND_ISD CP 'i' JR Z,COMAND_ISD CP 'T' JR Z,TASK_SWITCH CP 't' JR Z,TASK_SWITCH DEC HL POP BC JP BASIC_MENU MENU_S1: POP BC CALL SERVICE JP SW_ROM_1 COMAND_ISD: LD A,(HL) INC HL CP 'S' JP Z,COMAND_ISD2 CP 's' JP Z,COMAND_ISD2 RET COMAND_ISD2: POP BC CALL ISDOS JP SW_ROM_1 TASK_SWITCH: ; *** Сохранить задачу *** PUSH IY PUSH IX PUSH AF PUSH BC PUSH DE PUSH HL EXX EX AF,AF' PUSH AF PUSH BC PUSH DE PUSH HL LD A,R PUSH AF LD A,I PUSH AF LD A,(HL) RLCA RLCA RLCA RLCA AND 30H ; новая задача 0..3 LD C,A IN A,(PAGE3) LD B,A ; 3-я страница текущей задачи LD A,SYS_PAGE OUT (PAGE3),A LD IX,TASK_DATA ; данные задач LD E,(IX) ; старая задача LD D,0 ADD IX,DE ; данные текущей задачи LD E,16 ADD IX,DE ; смещение данных в таблице задач LD (IX+1),B ; сохранить страницу 3 LD HL,0 ADD HL,SP LD (IX+2),L ; сохранить стек задачи LD (IX+3),H SET 0,(IX) ; установить флаг сохраненности текущей задачи RES 1,(IX) ; установить флаг, что задача покинута LD IX,TASK_DATA LD E,C LD D,0 ADD IX,DE ; новая задача LD E,16 ADD IX,DE ; смещение данных в таблице задач BIT 1,(IX) ; JR NZ,TASK_IN_WORK ; задача в работе ??? неверное завершение ; сбрасывать или просто возвращаться BIT 0,(IX) ; была сохранена/нет JR NZ,TASK_SET ; задача существует ; задачи не было! LD IX,TASK_DATA LD A,C ; задача LD (IX),A ; установить новую задачу текущей JP SPECTRUM_TASK ; запустить новую задачу! ; и пока пофиг распределение памяти! TASK_SET: LD IX,TASK_RESTORE LD A,C EXX JP INIT_PAGES ; переключить все страницы! TASK_RESTORE: EXX LD A,SYS_PAGE OUT (PAGE3),A LD A,C LD IX,TASK_DATA LD (IX),A ; установить новую задачу текущей LD E,A LD D,0 ADD IX,DE ; новая задача LD E,16 ADD IX,DE LD L,(IX+2) ; вспомнить стек LD H,(IX+3) LD SP,HL LD A,(IX+1) ; вспомнить третью страницу OUT (PAGE3),A POP AF ; восстановить LD I,A POP AF LD R,A POP HL POP DE POP BC POP AF EX AF,AF' EXX POP HL POP DE POP BC POP AF POP IX POP IY ; вернуться в задачу NO_TASK: POP BC JP SW_ROM_1 ; 259F - ADRESS BASIC128 - MAIN_MENU INCLUDE 'ZX_EXP/SERVICE.ASM' ; DSS 7FDh,255 ; DB 'END' ;************************************** INCLUDE 'ZX_EXP/TEST.ASM' ; INCLUDE MAGIC.ASM ;**************************************** ;********************************************** INCLUDE 'ZX_EXP/EXP_DCP2.ASM' INCLUDE 'ZX_EXP/FLEX.ASM' INCLUDE 'ZX_EXP/EXP_SCR.ASM' ; INCLUDE EXP_PIC.ASM INCLUDE 'ZX_EXP/EXP_PIC2.ASM' INCLUDE 'ZX_EXP/EXP_FN2.ASM' ;********************************************** ;BLOCK 1400H - $,255 ; #-5kb-############################## ; #::::::::::::::::::::::::::::::::::#\ ; #:::: Место данных для FLEX :::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ;********************************************** BLOCK 2800H - $,255 ; #-2kb-############################## ; #::::::::::::::::::::::::::::::::::#\ ; #:::: Здесь место для IBM-ZG ::::::#\ ; #::::::::::::::::::::::::::::::::::#\ ; ####################################\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ; INCLUDE ZGLION.ASM INCLUDE 'ZX_EXP/FONT.ASM' ;********************************************** BLOCK 3000H - $,255 INCLUDE 'ZX_EXP/EXP_FN.ASM' INCLUDE 'ZX_EXP/EXP_LP2.ASM' ; INCLUDE EXP_LP3.ASM ;********************************************** FN_SENT_BYTE: LD E,A ; сохранить байт CALL SENT_POLU_BYTE ; передать полубайт из Е RET C ; возврат по ошибке LD A,E ; сдвинуть байт на 4 бита RRCA RRCA RRCA RRCA LD E,A SENT_POLU_BYTE: ; передать половину байта _E_!! LD A,E OR 0F0h ; установить старшие биты LPT дата OUT (LPT1_D),A LD BC,0 ; счетчик тайм-аута WAIT_SENT_1: IN A,(PORT_JOI) ; проверить бит 4 на 1 при готовности PC BIT 4,A JR NZ,CONTINUE_SENT DEC BC LD A,B OR C JR NZ,WAIT_SENT_1 XOR A SCF ; тайм-аут RET CONTINUE_SENT: ; PC - готов LD A,E AND 0Fh ; сбросить старшие биты LPT - OUT (LPT1_D),A LD BC,0 ; счетчик тайм-аута WAIT_SENT_2: IN A,(PORT_JOI) ; проверить бит 4 на 0 - сообщение от PC BIT 4,A JR Z,CONTINUE_SENT2 DEC BC LD A,B OR C JR NZ,WAIT_SENT_2 LD A,E OR 0F0h ; установить старшие биты LPT дата OUT (LPT1_D),A XOR A SCF ; тайм-аут RET CONTINUE_SENT2: ; полубайт передан LD A,E OR 0F0h ; установить старшие биты LPT дата OUT (LPT1_D),A XOR A RET FN_RESEIVE_B: ; принять байт в A CALL RESEIVE_POLU_BYTE ; принять полубайт RET C ; возврат по ошибке RLCA RLCA RLCA RLCA AND 0F0h LD E,A CALL RESEIVE_POLU_BYTE ; второй RET C AND 0Fh OR E RET ; байт принят RESEIVE_POLU_BYTE: ; принять половину байта в Е LD A,0F0h ; установить старшие биты LPT дата OUT (LPT1_D),A LD BC,0 ; счетчик тайм-аута WAIT_RES_1: IN A,(PORT_JOI) ; проверить бит 4 на 1 при готовности PC BIT 4,A JR NZ,CONTINUE_RES DEC BC LD A,B OR C JR NZ,WAIT_RES_1 XOR A SCF ; тайм-аут RET CONTINUE_RES: ; PC - готов, ждать 0 XOR A ; сбросить старшие биты LPT - ждем полубайт OUT (LPT1_D),A LD BC,0 ; счетчик тайм-аута WAIT_RES_2: IN A,(PORT_JOI) ; проверить бит 4 на 0 - сообщение от PC BIT 4,A JR Z,CONTINUE_RES2 DEC BC LD A,B OR C JR NZ,WAIT_RES_2 LD A,0F0h ; установить старшие биты LPT дата OUT (LPT1_D),A SCF RET ; ошибка CONTINUE_RES2: ; полубайт выставлен LOOP_EQ: ; прочитать еще раз, что бы совпало AND 0Fh LD B,A IN A,(PORT_JOI) AND 0Fh CP B JR NZ,LOOP_EQ OR 0F0h ; установить старшие биты LPT дата в 1 - принято OUT (LPT1_D),A RET ;********************************************** ; DSS 3C10h,255 ;KBD_RET: ; LD A,D_ROM16OFF ; OUT (SYS_PORT_OFF),A ; JR KBD_EXP ; NOP ; NOP ;KBD_RET2: ; LD A,D_ROM16OFF ; OUT (SYS_PORT_OFF),A ; JR KBD_OFF1 ; NOP ; NOP ;KBD_EXP: ; CALL RET_INS ; PUSH HL ; CALL INT_PROG1 ; POP HL ; CALL DOS_ON ; JR KBD_RET ;KBD_OFF1: ; CALL RET_INS ; CALL KBD_OFF ; CALL DOS_ON ; JR KBD_RET2 ;****************************************************** BLOCK 3CC0h - $,255 MAGIC_1: ; ЗАГЛУШКА ДЛЯ MAGIC PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A POP AF JP MAGIC_1 MAGIC_3: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A POP AF RETN MAGIC_2: ; CALL MG_BEGIN JR MAGIC_3 ;************************* BLOCK #3CE0-$,0 SW_ROM_1: LD HL,#259F PUSH HL LD HL,5B00h LD A,(HL) CP #F5 ; #F5 - опкод 'PUSH AF'. Проверяется то ли в #5B00 JR Z,JP_HL_48 ; ВОЗВРАТ К МЕНЮ BASIC128 POP HL JR SW_ROM ; ПРОСТОЙ ВОЗВРАТ ; DEFS 3CF0h-$ ;JMP_48: ; LD HL,00h ; JR JP_HL_48 ; ; NOP ; NOP ; NOP DEFS 3CF8H-$ JP_HL_48: PUSH HL SW_ROM: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A POP AF RET ;****************************************** BLOCK 3D00H - $,255 DOS_ON: NOP RET ;****************************************** BLOCK 3D13H - $,255 NOP JP 18H ;****************************************** BLOCK 3E00H - $,255 DOS_OFF: PUSH AF PUSH BC LD BC,(5BFFH) LD A,0C9H LD (5BFFh),A CALL 5BFFh LD (5BFFh),BC POP BC POP AF RET START_HDD: LD C,2 CALL EXP_HDD RET C LD A,0 OUT (0FEH),A LD HL,4000H LD DE,4001H LD BC,1AFFH LD (HL),0 LDIR LD HL,0 LD IX,LP_SCR_80 CALL WIN_OPEN_WIN LD HL,2050H LD DE,0 LD B,07H CALL LP_CLS_WIN LD DE,0 CALL LP_SET_PLACE LD HL,ID_SPRINTER LD E,47H LD B,L_ID CALL LP_PRINT_LINE ; LD C,80H ; LD B,0 ; LD E,0 ; CALL LP_OPEN_S ; LD DE,0 ; LD C,84H ; CALL LP_SET_PLACE ; LD HL,HDD_MSG ; LD B,HDD_MSG_LEN ; LD E,47H ; CALL LP_PRINT_LINE LD C,0 CALL EXP_HDD RET C LD DE,1 LD IX,0 LD B,16 LD HL,8000H LD C,5 CALL EXP_HDD RET C LD HL,8000H LD DE,HDD_MSG LD B,HDD_MSG_LEN START_HDD_L: LD A,(DE) CP (HL) JR NZ,NO_BOOT INC HL INC DE DJNZ START_HDD_L JP (HL) NO_BOOT: RET HDD_MSG: DB "Starting...",0 HDD_MSG_LEN EQU $-HDD_MSG ;HDD_MSG_NO: DB "Boot record not found" ;HDD_NO_LEN EQU $-HDD_MSG_NO SAVE_AUTOSTART: LD HL,8000H LD DE,HDD_MSG LD B,HDD_MSG_LEN SAVE_AUTO_L1: LD A,(DE) CP (HL) RET NZ INC HL INC DE DJNZ SAVE_AUTO_L1 LD C,0 CALL EXP_HDD RET C LD HL,8000H LD A,0 LD DE,1 LD IX,0 LD B,16 LD C,6 CALL EXP_HDD RET ;****************************************** BLOCK 3F00H - $,255 FN_LIB: SCF RET IN A,(PAGE3) LD B,A LD A,SYS_PAGE OUT (PAGE3),A PUSH HL LD L,C LD H,0C1H LD A,(HL) POP HL AND A SCF JR Z,FN_LIB_RET OUT (PAGE3),A LD (0C0FEH),SP LD SP,0C0F0H PUSH BC CALL 0C100H POP BC LD SP,(0C0FEH) LD A,B OUT (PAGE3),A RET FN_LIB_RET: LD A,B OUT (PAGE3),A SCF RET FN_KBD_OUT: ; вход A - byte ; B - speed_parameter AND A LD E,A LD D,0FFh JP PE,kbd_parity ; установка паритета PE/PO ??? LD D,0FEh kbd_parity: AND A ; первый бит - start-bit - 0 RL E RL D ; в DE - 11 бит для передачи LD C,11 kbd_loop: LD A,5 OUT (COM_A),A LD A,60h BIT 0,E JR NZ,no_inv XOR 2 ; данные no_inv: LD L,A OUT (COM_A),A ; выставить данные LD A,5 OUT (COM_A),A LD A,L OR 80h ; синхроимпульс OUT (COM_A),A ; импульс синхро LD A,B ; speed_par kbd_loop1: PUSH HL POP HL DEC A JR NZ,kbd_loop1 LD A,5 OUT (COM_A),A LD A,L OUT (COM_A),A ; снять импульс синхро LD A,B ; speed_par kbd_loop2: PUSH HL POP HL DEC A JR NZ,kbd_loop2 RR D RR E DEC C JR NZ,kbd_loop LD A,5 OUT (COM_A),A LD A,60h OUT (COM_A),A ; закончить передачу AND A RET BLOCK 3FD0H - $,0 FN1_RET: PUSH AF LD A,D_ROM16ON OUT (CNF_PORT),A POP AF RST 18H JR FN1_RET ;****************************************** BLOCK 3FE0H - $,255 SOUND_TEST: LD A,D_ROM16ON ; AROM16 = 1 OUT (CNF_PORT),A JP SND_TEST_RET BLOCK 3FE8H - $,255 HDD_EXE: EXP_HDD: PUSH AF LD A,D_ROM16ON ;!FIXIT придумать названия меткам OUT (CNF_PORT),A POP AF RET BLOCK 3FF0H-$,255 BLOCK 3FF8H-$,255 EXP_FNS_RET: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A JP EXP_FNS ;****************************************** BLOCK 4000h-$,255 ;