;-----------------------------------------------------------------------; ; DATA FOR DCP ; вбиваем в таблицу DCP.XLSX нужный внешний порт, ; смотрим смещение для OUT (С),x - это адрес ; ; ; C C E D / A A A A A A A A A ; N N 1 O W 1 1 6 5 1 7 2 1 0 ; F F 2 S R 5 4 3 ; 1 0 8 ; ; CCED/AAAAAAAAA ; NN1OW116517210 ; FF2SR54 3 ;DCP_DATA: 108 ; ....0..11.1110 ; WORD %00000001101110 ; - адрес ; WORD %00001001101111 ; - маска - 0 изменяемые биты, 1 неизменяемые ; BYTE ACEX.Border_FE ; - порт ; DCP END MARKER ; DW 0,0,0 ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; DW %00'000'0'0000'0111 DW %00'010'0'0110'1111 DB ACEX.VG93_1F DW %11'010'0'0000'0111 DW %11'010'0'0110'1111 DB ACEX.VG93_1F DW %00'000'0'0010'0111 DW %00'010'0'0110'1111 DB ACEX.VG93_3F DW %11'010'0'0010'0111 DW %11'010'0'0110'1111 DB ACEX.VG93_3F DW %00'000'0'0100'0111 DW %00'010'0'0110'1111 DB ACEX.VG93_5F DW %11'010'0'0100'0111 DW %11'010'0'0110'1111 DB ACEX.VG93_5F DW %00'000'0'0110'0111 DW %00'010'0'0110'1111 DB ACEX.VG93_7F DW %11'010'0'0110'0111 DW %11'010'0'0110'1111 DB ACEX.VG93_7F DW %00'000'0'0110'1111 DW %00'011'0'0110'1111 DB ACEX.VG93_State DW %11'010'0'0110'1111 DW %11'011'0'0110'1111 DB ACEX.VG93_State ; For joystick DW %00'011'0'0000'0111 DW %10'011'0'0110'1111 DB ACEX.JOY_VG93 DW %10'011'0'0000'0111 DW %11'011'0'0110'1111 DB ACEX.JOY_VG93 ; For VG93 with dos on DW %00'001'0'0110'1111 DW %00'011'0'0110'1111 DB ACEX.JOY_VG93 ; For VG93 with dos off DW %11'011'0'0110'1111 DW %11'011'0'0110'1111 DB ACEX.JOY_VG93 DW %00'000'0'0010'1101 DW %11'011'1'1111'1111 DB ACEX.FDD720 DW %11'000'0'0010'1101 DW %11'001'1'1111'1111 DB ACEX.FDD720 DW %00'000'0'0011'1101 DW %11'011'1'1111'1111 DB ACEX.FDD144 DW %11'000'0'0011'1101 DW %11'001'1'1111'1111 DB ACEX.FDD144 ;!FIXIT UNKNOWN PORTS--------------------------------------------------; dos on, только через BC, чтение/запись DW %10'000'1'0010'1101 DW %11'010'1'1111'1111 DB #18 DW %10'000'1'0011'1101 DW %11'010'1'1111'1111 DB #19 DW %10'000'1'1010'1101 DW %11'010'1'1111'1111 DB #1A ;----------------------------------------------------------------------; DW %00'000'1'0010'1101 DW %11'001'1'1111'1111 DB ACEX.ISA_CTRL DW %10'000'1'1011'1101 DW %11'010'1'1111'1111 DB ACEX.ISA_CTRL DW %11'000'1'0010'1101 DW %11'001'1'1111'1111 DB ACEX.ISA_CTRL DW %00'001'1'0011'1101 DW %11'001'1'0111'1111 DB ACEX.CMOS_DATA.READ DW %11'001'1'0011'1101 DW %11'001'1'0111'1111 DB ACEX.CMOS_DATA.READ DW %00'000'1'1010'1101 DW %11'001'1'1111'1111 DB ACEX.CMOS_ADDR.WRITE DW %11'000'1'1010'1101 DW %11'001'1'1111'1111 DB ACEX.CMOS_ADDR.WRITE DW %00'000'1'0011'1101 DW %11'001'1'0111'1111 DB ACEX.CMOS_DATA.WRITE DW %11'000'1'0011'1101 DW %11'001'1'0111'1111 DB ACEX.CMOS_DATA.WRITE ; ;---------HDD[v] DW %00'000'0'0100'0000 DW %11'000'0'0110'1111 DB #20 DW %01'000'0'0100'0000 DW %11'010'0'0110'1111 DB #20 DW %10'000'0'0100'0000 DW %11'010'0'0110'1111 DB #20 DW %11'000'0'0100'0000 DW %11'000'0'0110'1111 DB #20 DW %00'000'0'0100'0001 DW %00'010'1'1110'1111 DB #21 DW %00'010'0'0100'0001 DW %11'010'1'1110'1111 DB #21 DW %11'010'0'0100'0001 DW %11'010'1'1110'1111 DB #21 DW %00'000'0'0100'0010 DW %00'010'1'1110'1111 DB #22 DW %00'010'0'0100'0010 DW %11'010'1'1110'1111 DB #22 DW %11'010'0'0100'0010 DW %11'010'1'1110'1111 DB #22 DW %00'000'0'0100'0011 DW %00'010'1'1110'1111 DB #23 DW %00'010'0'0100'0011 DW %11'010'1'1110'1111 DB #23 DW %11'010'0'0100'0011 DW %11'010'1'1110'1111 DB #23 DW %00'000'0'0100'0100 DW %00'010'1'1110'1111 DB #24 DW %00'010'0'0100'0100 DW %11'010'1'1110'1111 DB #24 DW %11'010'0'0100'0100 DW %11'010'1'1110'1111 DB #24 DW %00'000'0'0100'0101 DW %00'010'1'1110'1111 DB #25 DW %00'010'0'0100'0101 DW %11'010'1'1110'1111 DB #25 DW %11'010'0'0100'0101 DW %11'010'1'1110'1111 DB #25 DW %00'000'0'1100'0010 DW %00'010'1'1110'1111 DB #26 DW %00'010'0'1100'0010 DW %11'010'1'1110'1111 DB #26 DW %11'010'0'1100'0010 DW %11'010'1'1110'1111 DB #26 DW %00'000'0'1100'0011 DW %00'010'1'1110'1111 DB #27 DW %00'010'0'1100'0011 DW %11'010'1'1110'1111 DB #27 DW %11'010'0'1100'0011 DW %11'010'1'1110'1111 DB #27 ;---------HDD[^] ; DW %00'000'0'1100'0100 DW %00'010'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 DW %00'010'0'1100'0100 DW %11'010'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 DW %11'010'0'1100'0100 DW %11'010'1'1110'1111 DB ACEX.IDE_CONTROL_3F6 DW %00'000'0'1100'0101 DW %00'010'1'1110'1111 DB ACEX.IDE_STATUS_3F7 DW %00'010'0'1100'0101 DW %11'010'1'1110'1111 DB ACEX.IDE_STATUS_3F7 DW %11'010'0'1100'0101 DW %11'010'1'1110'1111 DB ACEX.IDE_STATUS_3F7 DW %00'000'0'0010'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_1 DW %11'000'0'0010'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_1 DW %00'000'0'0011'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_2 DW %11'000'0'0011'1100 DW %11'001'1'1111'1111 DB ACEX.IDE_CHANEL_2 DW %00'000'0'1010'1101 DW %11'001'1'1111'1111 DB ACEX.VSYNC320 DW %11'000'0'1010'1101 DW %11'001'1'1111'1111 DB ACEX.VSYNC320 DW %00'000'0'1011'1101 DW %11'001'1'1111'1111 DB ACEX.VSYNC312 DW %11'000'0'1011'1101 DW %11'001'1'1111'1111 DB ACEX.VSYNC312 DW %00'000'0'1010'1100 DW %11'001'1'1111'1111 DB ACEX.RESET DW %11'000'0'1010'1100 DW %11'001'1'1111'1111 DB ACEX.RESET DW %00'000'0'1011'1100 DW %11'001'1'1111'1111 DB ACEX.UNKNOWN ;!FIXIT можно пока убрать DW %11'000'0'1011'1100 DW %11'001'1'1111'1111 DB ACEX.UNKNOWN ;!FIXIT можно пока убрать DW %00'010'0'0010'1011 DW %11'010'0'0110'1011 DB ACEX.ISA_Control ;!FIXIT можно пока убрать ??? DW %00'011'0'0110'1110 DW %10'011'0'0110'1111 DB ACEX.ZX_Keyboard DW %10'011'0'0110'1110 DW %11'011'0'0110'1111 DB ACEX.ZX_Keyboard DW %00'001'1'1111'1101 DW %00'001'1'1111'1111 DB ACEX.AY_FFFD_READ DW %00'001'1'1101'1111 DW %11'001'1'1111'1111 DB ACEX.Kempston_Mouse DW %11'001'1'1101'1111 DW %11'001'1'1111'1111 DB ACEX.Kempston_Mouse DW %00'011'0'0110'0011 DW %11'011'0'0110'1111 DB ACEX.CBL_OUT DW %01'010'0'0110'0011 DW %11'010'0'0110'1111 DB ACEX.CBL_OUT DW %10'010'0'0110'0011 DW %11'010'0'0110'1111 DB ACEX.CBL_OUT DW %00'010'0'0000'0111 DW %11'011'0'0000'1111 DB ACEX.CBL_OUT DW %00'011'0'0000'1000 DW %11'011'0'0110'1111 DB ACEX.CBL_OUT DW %00'010'0'0110'1011 DW %10'010'0'0110'1111 DB ACEX.CBL_OUT DW %10'010'0'0110'1011 DW %11'010'0'0110'1111 DB ACEX.CBL_OUT DW %00'000'0'0100'0110 DW %11'001'1'1111'1111 DB ACEX.CBL_SYS_PORT DW %11'000'0'0100'0110 DW %11'001'1'1111'1111 DB ACEX.CBL_SYS_PORT DW %00'000'1'1111'1101 DW %00'001'1'1111'1111 DB ACEX.AY_FFFD_WRITE DW %00'000'1'0111'1101 DW %00'001'1'1111'1111 DB ACEX.AY_BFFD DW %00'000'0'0110'1101 DW %10'000'1'1111'1111 DB ACEX.Scorp_1FFD DW %11'000'0'0110'1101 DW %11'000'1'1111'1111 DB ACEX.Scorp_1FFD DW %00'000'0'1110'1101 DW %00'100'1'1110'1111 DB ACEX.Pent_7FFD DW %00'100'0'1110'1101 DW %11'110'1'1110'1111 DB ACEX.Pent_7FFD DW %11'100'0'1110'1101 DW %11'100'1'1110'1111 DB ACEX.Pent_7FFD DW %10'000'0'0110'1101 DW %11'100'1'1110'1111 DB ACEX.Pent_7FFD DW %00'000'0'0110'1110 DW %00'001'0'0110'1111 DB ACEX.Border_FE DW %00'000'0'0101'0110 DW %11'001'1'1111'1111 DB ACEX.ALL_MODE DW %11'000'0'0101'0110 DW %11'001'1'1111'1111 DB ACEX.ALL_MODE DW %00'000'0'0000'1001 DW %00'010'0'0110'1111 DB ACEX.PORT_Y DW %00'010'0'0000'1001 DW %11'010'0'0110'1111 DB ACEX.PORT_Y DW %11'010'0'0000'1001 DW %11'010'0'0110'1111 DB ACEX.PORT_Y DW %00'000'0'0100'1001 DW %00'010'0'0110'1111 DB ACEX.RGMOD DW %00'010'0'0100'1001 DW %11'010'0'0110'1111 DB ACEX.RGMOD DW %11'010'0'0100'1001 DW %11'010'0'0110'1111 DB ACEX.RGMOD DW %00'000'0'0010'0100 DW %00'000'0'0010'1111 DB ACEX.CNF_PORT ;!FIXIT можно убрать DW %00'000'0'0110'1100 DW %11'001'0'0110'1111 DB ACEX.SCALE DW %11'000'0'0110'1100 DW %11'001'0'0110'1111 DB ACEX.SCALE DW %00'000'0'0000'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT0 DW %00'010'0'0000'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT0 DW %11'010'0'0000'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT0 DW %00'000'0'0010'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT1 DW %00'010'0'0010'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT1 DW %11'010'0'0010'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT1 DW %00'000'0'0100'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT2 DW %00'010'0'0100'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT2 DW %11'010'0'0100'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT2 DW %00'000'0'0110'1010 DW %00'010'0'0110'1111 DB ACEX.SLOT3 DW %00'010'0'0110'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT3 DW %11'010'0'0110'1010 DW %11'010'0'0110'1111 DB ACEX.SLOT3 ; DCP END MARKER DW 0,0,0 ;-----------------------------------------------------------------------; ; ; ;----------------------------------------------------------------------; DCP_INIT: LD C,XL LD B,XH LD E,YL LD D,YH EXX LD HL,#C000 LD DE,#C001 LD BC,#3FFF LD (HL),L LDIR LD IY,DCP_DATA LD IX,.ret .loop: LD L,(IY) LD H,(IY+1) LD E,(IY+2) LD D,(IY+3) LD B,(IY+4) JP DCP_CONFIG.PARSE_TABLE .ret: LD BC,5 ADD IY,BC LD A,(IY+2) OR (IY+3) JR NZ,.loop EXX LD XL,C LD XH,B LD YL,E LD YH,D ; First IN command - OPEN DCP IN A,(SLOT3) JP (HL) ;-----------------------------------------------------------------------; ; ; ;-----------------------------------------------------------------------; ; Функция дешифратора портов. ; HL - адрес ; DE - маска - 0 изменяемые биты, 1 неизменяемые ; B - порт ; DCP_CONFIG: AND A JP Z,PORTS_INIT LD A,R DI PUSH AF PUSH IX LD IX,.exit IN A,(SLOT3) EX AF,AF' LD A,DCP_PAGE OUT (SLOT3),A JR .PARSE_TABLE .exit: EX AF,AF' OUT (SLOT3),A AND A POP IX POP AF RET PO EI RET .PARSE_TABLE: LD A,L AND E LD L,A LD A,H AND D OR #C0 LD H,A LD A,D OR #C0 LD D,A .loop: LD (HL),B LD A,L ; замаскировать неизменяемые биты 1-ми OR E ; для прохождения переноса INC A ; увеличить адрес JR Z,.carry ; возник перенос OR E XOR E ; обнулить неизменяемые биты LD C,A ; изменяемая часть LD A,L AND E ; выделить неизменяемую OR C LD L,A ; добавить изменяемую часть JR .loop ; цикл ; A = 0 .carry: LD A,L ; забить изменяемые биты нулями AND E LD L,A LD A,H ; замаскировать неизменяемые биты 1-ми OR D ; для прохождения переноса INC A ; увеличить адрес JR Z,.return OR D XOR D LD C,A ; изменяемая часть LD A,H AND D ; выделить неизменяемую OR C LD H,A ; добавить изменяемую часть JR .loop .return: JP (IX) ;-----------------------------------------------------------------------; ; ;----------------------------------------------------------------------; ;[x] 26/01/2024 READ_PORTS: CALL SET_PORTS.Prepare LD BC,0 IN B,(C) JR SET_PORTS.End ;[x] 26/01/2024 ; WRITE_PORTS: ; SCF ; RET ;----------------------------------------------------------------------; ; ;-----------------------------------------------------------------------; ;[x] Теперь это не нужно: CALL from 3D13h! Осторожнее с прерываниями, лучше гасить, чтоб не сбить сигнал DOS_ON ; in: A - внутренний порт, B - значение для записи во внутренний порт ; out: B - старое значение внутреннего порта; Перед выходом восстанавливается конфа прописанная в CONFIG_DE. SET_PORTS: CALL .Prepare ; EX AF,AF' LD A,B LD BC,0 EX AF,AF' ; ; Чтение порта IN A,(C) ; Запись порта EX AF,AF' OUT (C),A ; установить новое значение порта EX AF,AF' ; LD B,A ; прошлое состояние порта ; .End: LD A,DCP_PAGE ; установить DCP LD C,SLOT2 OUT (C),A LD A,L LD (#8000),A ; вернуть порт LD A,H LD (#8200),A ; вернуть порт ; LD A,SYS_PAGE OUT (C),A LD A,(SYS_PAGE.CONFIG_DE-#4000) OUT (C),D ; вернуть страницу OUT (SYS_PORT.ROM),A ; CALL DOS_OFF ; ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 BIT 2,E RET Z EI RET ;AND A ;RET ; .Prepare: EX AF,AF' ;[x] SET_PORTS: no need to call from #3D13 and DI. 31/12/23 AND A LD A,R PUSH AF POP DE DI CALL DOS_ON ; LD A,CNF_PORT.CNF_0 + ROM.BIOS OUT (SYS_PORT.ROM),A ; LD C,SLOT2 ; получить страницу IN D,(C) ; LD A,DCP_PAGE ; установить новую OUT (C),A ; LD A,(#8000) ; сохранить то что было LD L,A LD A,(#8200) LD H,A EX AF,AF' ; страница ; LD (#8000),A ; установить внутренний порт LD (#8200),A OUT (C),D ; вернуть страницу RET ;-----------------------------------------------------------------------; ;