;----------------------------------------------------------------------; ; Получение адресов портов и данных для восстановления ; Вход: A - номер окна проецирования ; Выход: B - данные, C - адрес порта окна EMM.GetBanksPorts: INC A LD B,A DJNZ .slot1 LD C,SLOT0 IN B,(C) RET ;45t .slot1: DJNZ .slot2 LD C,SLOT1 IN B,(C) RET ;58t .slot2: DJNZ .slot3 LD C,SLOT2 IN B,(C) RET ;71t .slot3: DJNZ .error LD C,SLOT3 IN B,(C) RET ;84t .error: SCF RET ;74t ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; HL - буфер ; !FIXIT SYS_PAGE.CONFIG_BYTE уже не то показывает, и вообще всю бы переделать, поправить в доке, как минимум FN_VERSION: PUSH HL EX DE,HL ; LD HL,ID_SPRINTER_FullSize ; LD B,0 ; LD C,(HL) ; INC HL LD HL,ID_SPRINTER LD BC,ID_SPRINTER.Size LDIR ; POP HL LD DE,(ID_Version) ;rdlow-ok ; IN A,(SLOT2) EX AF,AF' LD A,SYS_PAGE OUT (SLOT2),A LD BC,(SYS_PAGE.CONFIG_BYTE - #4000) ; Version PLD ; !TODO через структуру для переменных биоса EX AF,AF' OUT (SLOT2),A LD A,ID_SPRINTER.Records_Num ; Число полей AND A RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; [x] 28/01/24 добавлена подфункция выдачи инфы про Acex FN_CRIPT: DJNZ .Acex_ver ; ; BoardID_start old address #312A ; BoardID_end old address #312D .board_id: LD HL,(BOARD_INFO.number) ;rdlow-ok LD A,(BOARD_INFO.type) ;rdlow-ok LD BC,(BoardID.start) ;rdlow-ok LD DE,(BoardID.end) ;rdlow-ok AND A RET ; .error: LD A,BIOS.Error.InvalidSubFunction SCF RET ; .Acex_ver: DJNZ .error PUSH HL LD A,R DI PUSH AF ; LD HL,-.stackDepth - .readProcedure.size ; memory stack use! ADD HL,SP PUSH HL ; адрес программы .readProcedure LD DE,.readProcedure ; перенести программу на стек EX DE,HL LD BC,.readProcedure.size LDIR ; программа на стеке LD A,+(12 xor %0000'1000) ; !HARDCODE bitstream page in rom RET .return:; POP AF JP PO,.no_EI EI .no_EI: CALL .choose_chip POP DE LD BC,.chip_ID_TXT.RecordSize LDIR .cnf+1: LD DE,bitstream_ver_hex AND A RET ; .choose_chip: XOR A LD HL, - ACEX.Chip_ID.K30 ADC HL,DE LD HL,.chip_ID_TXT.K30 RET Z OR A ; снять CF INC A LD HL, - ACEX.Chip_ID.K50 ADC HL,DE LD HL,.chip_ID_TXT.K50 RET Z POP HL ; баланс стека .error_unknownChip: SCF POP HL LD A,BIOS.Error.UnknownDevice RET ; ; процедура, переносимая на стек для чтения Acex ID ; осторожнее с PUSH, если надо много, то увеличивай .stackDepth .readProcedure: OUT (ROM.SLOT0),A ; ROM_PAGE LD DE,(#100 + 3) ; !HARDCODE здесь читается Acex ID XOR A OUT (ROM.SLOT0),A OUT (SYS_PORT.ROM),A JP .return .stackDepth EQU 2 ; расстояние от конца процедуры до вершины стека. .readProcedure.size EQU $-.readProcedure ; .chip_ID_TXT: .chip_ID_TXT.K30: DZ "K30" .chip_ID_TXT.RecordSize EQU $-.chip_ID_TXT .chip_ID_TXT.K50 DZ "K50" ;.chip_ID_TXT.K100 DZ "K100" .chip_ID_TXT.Size EQU $-.chip_ID_TXT ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;EMM_FN7 EMM.CheckColdInit: IN A,(SLOT2) EX AF,AF' LD A,SYS_PAGE OUT (SLOT2),A LD HL,SYS_PAGE.ID_FLAG - #4000 ; LD DE,ID_SPRINTER_FullSize ; LD A,(DE) ; DEC A ; INC DE ; LD B,A LD B,ID_SPRINTER.Record1_Size LD DE,ID_SPRINTER .loop: LD A,(DE) CP (HL) JR NZ,INIT_SYS_ALL INC HL INC DE DJNZ .loop ; Disable user IM address in SYS_PAGE XOR A LD (SYS_PAGE.INT_ID - #4000),A ; EX AF,AF' OUT (SLOT2),A RET ;MSDOS_COLD_VARS: EMM.FullInit: DI IN A,(SLOT2) EX AF,AF' LD A,SYS_PAGE OUT (SLOT2),A INIT_SYS_ALL: DI ; LD HL,#8000 ; LD DE,#8001 ; LD (HL),#FF ; LD BC,#3FFF ; LDIR ; ; LD HL,ID_SPRINTER_FullSize ; LD DE,SYS_PAGE.ID_FLAG - #4000 ; LD C,(HL) ; LD B,0 ; INC HL LD HL,ID_SPRINTER LD DE,SYS_PAGE.ID_FLAG - #4000 LD BC,ID_SPRINTER.Record1_Size LDIR ; чистка переменных ZX HDD XOR A LD H,A LD L,A LD (SYS_PAGE.CURRENT_DIR_SEC_L - #4000),HL LD (SYS_PAGE.CURRENT_DIR_SEC_H - #4000),HL DEC A LD (SYS_PAGE.CURRENT_HDD - #4000),A LD (SYS_PAGE.CURRENT_DIR_DRIVE - #4000),A LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY - #4000),A ; Disable user IM address in SYS_PAGE XOR A LD (SYS_PAGE.INT_ID - #4000),A ; LD HL,SYS_PAGE.DISK_TYPE - #4000 LD (HL),DRIVE_CODES.TRDOS.FDD ; FDD A INC HL LD (HL),DRIVE_CODES.TRDOS.FDD + 1 ; FDD B INC HL LD (HL),DRIVE_CODES.TRDOS.HDD INC HL LD (HL),DRIVE_CODES.TRDOS.HDD INC HL LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT0, было 0 INC HL LD (HL),SHARED_PAGE; [x] free zx pages! ; SYS_PAGE.COPY_SLOT1, было 5 INC HL LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT2, было 2 INC HL LD (HL),ZERO_PAGE ; [x] free zx pages! ; SYS_PAGE.COPY_SLOT3, было 0 LD A,9 LD (SYS_PAGE.MSD_SECS - #4000),A XOR A LD (SYS_PAGE.DS_1440 - #4000),A LD HL,SYS_PAGE.RAMD_KEYS - #4000 LD DE,SYS_PAGE.RAMD_KEYS+1 - #4000 LD BC,SYS_PAGE.RAMD_KEYS.NUM-1 LD (HL),0 LDIR ; [x] 04/11/2023 LD HL,SYS_PAGE.Sp_RAMD_KEYS - #4000 LD DE,SYS_PAGE.Sp_RAMD_KEYS+1 - #4000 LD BC,SYS_PAGE.Sp_RAMD_KEYS.NUM-1 LD (HL),0 LDIR ; ; [x] 17/08/2024 fixed bug with change current RAM drives type XOR A LD (SYS_PAGE.CURRENT_RAM_DRV - #4000),A ; ; [ ] free zx pages! ;;; init task's ; LD DE,ZG_ADDRESS ; адрес знакогенератора LD (SYS_PAGE.WIN_ZG - #4000),DE ; ;-----------[new code start]------------; !!!!! посмотреть-причесать INIT_VSyncAndWaits: LD D,CMOS_CELL.ScreenSET CALL CMOS_RD ld d,a jr nc,.cmos_OK ; если нет CMOS, то стандартные настройки ld a,3 ld (SYS_PAGE.VSyncAndWaits - #4000),A jr z,INIT_CONFIG_ALL.setDefaultINT .cmos_OK: and high CMOS_CELL.ScreenSET.Mask.Sinc and #40 ld a,3 ; 320 lines & no waits jr z,.setVSyncAndWaits dec a ; 312 lines & no waits .setVSyncAndWaits: ld (SYS_PAGE.VSyncAndWaits - #4000),A INIT_CONFIG_ALL: ld a,d and high CMOS_CELL.ScreenSET.Mask.Int jr z,.setDefaultINT ; set default int xor high CMOS_CELL.ScreenSET.Mask.Int LD HL,SCREEN_TABLES.ORIGINAL ; set original int jr z,.setINT and #10 LD HL,SCREEN_TABLES.SCORPION ; set scorpion int jr z,.setINT .setDefaultINT: LD HL,SCREEN_TABLES.PENTAGON ; set pentagon int .setINT: LD (SYS_PAGE.SCREEN_TABLE - #4000),HL ;------------[new code end]------------- ; LD DE,CNF_PORT.CNF_0 + ROM.BIOS LD (SYS_PAGE.CONFIG_DE - #4000),DE LD HL,SYS_PAGE.ZX_TASK.CURRENT - #4000 ; убить все задачи LD DE,SYS_PAGE.ZX_TASK.CURRENT+1 - #4000 LD BC,_ZX_TASK - 1 LD (HL),0 LDIR EX AF,AF' OUT (SLOT2),A CALL EMM.InitMem ;************************************************************** ; Чтение последних 256 байтов ПЗУ в служебную страницу ; зачем-то, типа, флешер мог там сохранить данные CMOS. ;READ_ROM_PAGE_X: ; IN A,(SLOT3) ; PUSH AF ; LD A,SYS_PAGE ; OUT (SLOT3),A ; CALL READ_ROM_PAGE_X ; READ CMOS-DATA ; POP AF ; OUT (SLOT3),A ;************************************************************** RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; FN_TURBO: CP 2 JR Z,.TURBO_SWITCH CP 3 JR Z,.TURBO_SWITCH CP #12 JR Z,.SET_FDD_720 CP #13 JR Z,.SET_FDD_1440 SCF RET ;!FIXIT меняем плотность - меняем в системной странице инфу об этом .SET_FDD_720: LD A,FDD_Density.SET_720 OUT (FDD_Density),A AND A RET ;!FIXIT меняем плотность - меняем в системной странице инфу об этом .SET_FDD_1440: LD A,FDD_Density.SET_1440 OUT (FDD_Density),A AND A RET .TURBO_SWITCH: LD C,A IN A,(SLOT3) LD B,A LD A,SYS_PAGE OUT (SLOT3),A ; ;LD DE,(SYS_PAGE.CONFIG_DE) ;LD A,E LD A,(SYS_PAGE.CONFIG_DE) ; AND #FC ; !HARDCODE OR C ; ;LD E,A ;LD (SYS_PAGE.CONFIG_DE),DE LD (SYS_PAGE.CONFIG_DE),A AND 3 ; OUT (SYS_PORT.ROM),A LD A,B OUT (SLOT3),A AND A RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ;!TODO ;FN_GET_SYS_VAR: ; Вход: HL - номер системной переменной ; Выход: HL - значение системной переменной ; RET ;----------------------------------------------------------------------; ;!TODO скомпоновать ;----------------------------------------------------------------------; FN_SEND_BYTE: LD E,A ; сохранить байт CALL SEND_HALF_BYTE ; передать полубайт из Е RET C ; возврат по ошибке LD A,E ; сдвинуть байт на 4 бита RRCA RRCA RRCA RRCA LD E,A SEND_HALF_BYTE: ; передать половину байта _E_!! LD A,E OR #F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_SENT_1: IN A,(KEMPSTON.PC_Link) ; проверить бит 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 #0F ; сбросить старшие биты LPT - OUT (Z84.PIO.Port_A.Data),A ; счетчик тайм-аута LD BC,0 ; WAIT_SENT_2: IN A,(KEMPSTON.PC_Link) ; проверить бит 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 #F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A XOR A SCF ; тайм-аут RET CONTINUE_SENT2: ; полубайт передан LD A,E OR #F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A XOR A RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; FN_RESEIVE_B: ; принять байт в A CALL RESEIVE_POLU_BYTE ; принять полубайт RET C ; возврат по ошибке RLCA RLCA RLCA RLCA AND #F0 LD E,A CALL RESEIVE_POLU_BYTE ; второй RET C AND 0Fh OR E RET ; байт принят RESEIVE_POLU_BYTE: ; принять половину байта в Е LD A,#F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_RES_1: IN A,(KEMPSTON.PC_Link) ; проверить бит 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 (Z84.PIO.Port_A.Data),A LD BC,0 ; счетчик тайм-аута WAIT_RES_2: IN A,(KEMPSTON.PC_Link) ; проверить бит 4 на 0 - сообщение от PC BIT 4,A JR Z,CONTINUE_RES2 DEC BC LD A,B OR C JR NZ,WAIT_RES_2 LD A,#F0 ; установить старшие биты LPT дата OUT (Z84.PIO.Port_A.Data),A SCF RET ; ошибка CONTINUE_RES2: ; полубайт выставлен LOOP_EQ: ; прочитать еще раз, что бы совпало AND #0F LD B,A IN A,(KEMPSTON.PC_Link) AND #0F CP B JR NZ,LOOP_EQ OR #F0 ; установить старшие биты LPT дата в 1 - принято OUT (Z84.PIO.Port_A.Data),A RET ;----------------------------------------------------------------------; ; ;----------------------------------------------------------------------; ;********************************** ; START_DI: ; PUSH AF ; LD A,R ; LD A,#80 ; JP PE,XX_DI2 ; XOR A ; XX_DI2: LD R,A ; DI ; POP AF ; RET ; ; END_DI: PUSH AF ; LD A,R ; AND #80 ; JR Z,XX_DI3 ; EI ; POP AF ; PE ; RET ; XX_DI3: DI ; POP AF ; PO ; RET ;********************************** ;----------------------------------------------------------------------;????? ;DE - куда - страница открыта! ;BC - сколько ;HL - буфер ; ; PUSH BC ; LD H,D ; LD L,E ; ADD HL,BC ; JR C,CUT ; LD HL,BUFER ; LDIR ; POP BC ; RET ;CUT: ; PUSH HL ; LD A,L ; LD L,C ; LD C,A ; LD A,H ; LD H,B ; LD B,A ; ; AND A ; SBC HL,BC ; LD B,H ; LD C,L ; LD HL,BUFER ; LDIR ; CALL NEXT_BANK ; POP BC ; LD A,B ; OR C ; JR Z,LAB ; LDIR ;LAB: POP BC ; RET ;----------------------------------------------------------------------; ;----------------------------------------------------------------------;