LD HL,RESERVED_PAGES LD DE,#4000 + RESERVED_PAGES_COPY LD BC,RESERVED_PAGES.Size LDIR LD SP,#4000 LD A,SYS_FN_PAGE OUT (SLOT0),A JP INIT_SCREEN - #4000 ; .start_code EQU $ ;███████ инициализация экрана █████████████████████████████████; INIT_SCREEN: CALL FN_SYNC ; LD IX,VideoModes.graf_mode320x256 LD E,%00010001 CALL WIN_OPEN ;███████ инициализация палитры ████████████████████████████████; INIT_PALETTE: ;IN A,(SLOT1) ;PUSH AF LD B,#FF LD HL,PICTURE.bdPallete ;#8FBC ;!HARDCODE PICTURE.bdPallete LD DE,0 LD A,1 CALL SET_PALETTE CALL SET_PICTURE CALL SET_BOARD_NUMBER ; Определение чипа ПЗУ CALL DETECT_ROM ; ; установка регистров ; прыжок на точку входа во флешере ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; SET_BOARD_NUMBER: IN A,(SLOT3) EX AF,AF' LD A,#18 ;!HARDCODE OUT (SLOT3),A ; LD HL,(BOARD_ID_DATA.Start) LD (BoardNumOffsets.Start),HL LD HL,(BOARD_ID_DATA.Number) LD (BoardNumOffsets.Number),HL LD HL,(BOARD_ID_DATA.End) LD (BoardNumOffsets.End),HL LD A,(BOARD_ID_DATA.Type) LD (BoardNumOffsets.Type),A ; LD A,#10 ;!HARDCODE OUT (SLOT3),A LD A,(FOR_ACEX) LD (#C000 + expBIOS_Vars.msgStrings.str_ACEX_MODEL),A LD (#C000 + expBIOS_Vars.msgRusStrings.str_ACEX_MODEL),A ; EX AF,AF' OUT (SLOT3),A RET ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; DISP_WINDOW EQU $ DISP #4000 + DISP_WINDOW DETECT_ROM: LD HL,0 ADD HL,SP LD SP,#4000 LD (.sp_save),HL ; CALL TEST_ROM_CHIP ;!HARDCODE TEST_ROM_CHIP #8E59 LD (TST_R.jp),BC ;!HARDCODE TST_R.jp #81D5 ; .sp_save+1: LD SP,0000 XOR A OUT (SYS_PORT.RAM),A RET ENT ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; SET_PICTURE: LD A,#FF - MAIN_PICTURE.PIC_Y .loop_pic: PUSH AF LD A,#50 OUT (SLOT1),A POP AF OUT (PORT_Y),A LD HL,.pic_buffer LD DE,#4000 + Screen_Offset + MAIN_PICTURE.PIC_X ; LD BC,MAIN_PICTURE.PIC_WIDTH LDIR ; LD H,A POP AF OUT (SLOT1),A PUSH AF LD A,H DEC A CP MAIN_PICTURE.PIC_Y-1 JR NZ,.loop_pic POP AF OUT (SLOT1),A IM 1 EI RET .pic_buffer: BLOCK MAIN_PICTURE.PIC_WIDTH,0 ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; Установка режима на линии LP_MODE_LINE: BIT 0,(IX+Window_Variables.USER.MODE_S) JP NZ,LP_MODE_LINE2 ; идти на спектрум BIT 4,A JP Z,LP_MODE_LINE3 ; идти на графику! DEC D ; текстовый режим. EX AF,AF' LD A,#50 OUT (SLOT3),A LD A,L ; вертикальное положение CP #80 JR NC,LP_EXIT_MODE ; LP_MODE_RECURSE: LD A,D ; горизонтальное положение AND 7FH SUB 80 JR C,LP_MODE_LL SUB 48 NEG ; LD E,A ; запомнить ADD A,D LD D,A ; новое положение ; LD A,E ; восстановить RRA AND 3FH SUB C JR NC,LP_EXIT_MODE NEG LD C,A ; новое значение C JR LP_MODE_RECURSE ; LP_MODE_LL: NEG RRA AND 3FH CP C JR NC,LP_MODE_LR LD C,A LP_MODE_LR: EX AF,AF' INC D LP_MD_LL1: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; режим INC D EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; режим INC D DEC C JR NZ,LP_MD_LL1 EX AF,AF' LP_EXIT_MODE: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' RET ; ; Установка режима на линии ; Spectrum mode LP_MODE_LINE2: LD A,(IX+Window_Variables.WORK_2) LD B,(IX+Window_Variables.WORK_1) ; DEC D ; EX AF,AF' LD A,#50 OUT (SLOT3),A LD A,L ; вертикальное положение CP #80 JR NC,LP_EXIT_MODE2 ; LP_MODE_RECURSE2: LD A,D ; горизонтальное положение AND #7F SUB 80 JR C,LP_MODE_LL2 SUB 48 NEG ; LD E,A ; запомнить ADD A,D LD D,A ; новое положение ; LD A,E ; восстановить RRA AND #3F SUB C JR NC,LP_EXIT_MODE2 NEG LD C,A ; новое значение C JR LP_MODE_RECURSE2 ; LP_MODE_LL2: NEG RRA AND #3F CP C JR NC,LP_MODE_LR2 LD C,A LP_MODE_LR2: EX AF,AF' INC D LP_MD_LL2: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; режим INC L LD (HL),B INC L LD (HL),B DEC L DEC L INC D BIT 4,A JR NZ,lp_md_ll3x INC B lp_md_ll3x: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),A ; режим INC L LD (HL),B INC L LD (HL),B DEC L DEC L INC D INC B JR NZ,LP_NO_ADD_40 ADD A,#40 LP_NO_ADD_40: DEC C JR NZ,LP_MD_LL2 EX AF,AF' LP_EXIT_MODE2: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD (IX+Window_Variables.WORK_1),B LD (IX+Window_Variables.WORK_2),A RET ; ; Установка режима на линии LP_MODE_LINE3: ; Grafic Mode LD A,(IX+Window_Variables.WORK_1) LD B,(IX+Window_Variables.WORK_2) DEC D EX AF,AF' LD A,#50 OUT (SLOT3),A LD A,L ; вертикальное положение CP #80 JR NC,LP_EXIT_MODE3 ; LP_MODE_RECURSE3: LD A,D ; горизонтальное положение AND #7F SUB 80 JR C,LP_MODE_LL3 SUB 48 NEG LD E,A ; запомнить ADD A,D LD D,A ; новое положение LD A,E ; восстановить RRA AND #3F SUB C JR NC,LP_EXIT_MODE3 NEG LD C,A ; новое значение C JR LP_MODE_RECURSE3 ; LP_MODE_LL3: NEG RRA AND #3F CP C JR NC,LP_MODE_LR3 LD C,A LP_MODE_LR3: EX AF,AF' INC D BIT 5,B JR Z,LP_GR_640 ; LP_MD_LL3: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),B ; режим INC L LD (HL),A ; режим 2 INC L LD (HL),0 ; режим 2 DEC L DEC L INC D INC D INC A LD E,A AND 7 JR NZ,LP_NO_INC_B LD A,E SUB 8 LD E,A INC B LP_NO_INC_B: LD A,E DEC C JR NZ,LP_MD_LL3 ; LP_640_RET: EX AF,AF' LP_EXIT_MODE3: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD A,(IX+Window_Variables.WORK_1) ADD A,8 LD (IX+Window_Variables.WORK_1),A RET ; LP_GR_640: EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),B ; режим 1 INC L LD (HL),A ; режим 2 INC L LD (HL),0 ; режим 3 INC D EX AF,AF' LD A,D OUT (PORT_Y),A EX AF,AF' LD (HL),0 ; режим 3 DEC L LD (HL),A ; режим 2 DEC L LD (HL),B ; режим 1 INC D INC A LD E,A AND 7 JR NZ,LP_NO_INC_B6 LD A,E SUB 8 LD E,A INC B LP_NO_INC_B6: LD A,E DEC C JR NZ,LP_GR_640 JP LP_640_RET ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ; вход: HL - данные палитры RGB, E - начальный цвет ; D - число цветов, B - PAL-mask, A - page PAL SET_PALETTE: PUSH IX ; EX AF,AF' IN A,(RGADR) PUSH AF ; сохранить положение RGADR LD A,E OUT (RGADR),A ; начальный цвет в порт LD A,D ; сохранить число цветов EX AF,AF' ; вернуть страницу PAL ; BIT 7,H ; проверить адрес данных LD C,SLOT3 ; если ниже 8000h LD D,#C3 ; то граф.экран на странице 3 JR Z,.NO_PAGE1 LD D,#43 ; иначе LD C,SLOT1 ; на странице 1 .NO_PAGE1: ADD A,A ADD A,A AND #1C XOR #E0 ; младший байт адреса PAL LD E,A ; DE - адрес в видео-ОЗУ PUSH DE POP IX ; адрес палитры ; LD D,B ; маска PAL EX AF,AF' ; вернуть число цветов LD B,A ; число цветов ; IN E,(C) ; сохранить страницу 3 LD A,#50 ; страница графического RAM OUT (C),A .loopPal: ; цикл установки цветов палитры LD A,(HL) ; B AND D LD (IX+2),A INC HL ; LD A,(HL) ; G AND D LD (IX+1),A INC HL ; LD A,(HL) ; R AND D LD (IX+0),A INC HL ; LD A,(HL) ; Y AND D LD (IX+3),A INC HL ; IN A,(RGADR) INC A OUT (RGADR),A DJNZ .loopPal ; выполнять, пока не 0 ; .exit: OUT (C),E ; восстановить страницу 3 POP AF OUT (RGADR),A ; восстановить Y_PORT POP IX AND A RET ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; LP_OPEN_PG: IN A,(SLOT3) LD C,A LD A,SYS_PAGE OUT (SLOT3),A ; LD A,C LD (SYS_PAGE.COPY_SLOT3),A IN A,(PORT_Y) LD (SYS_PAGE.COPY_RGADR),A RET LP_CLOSE_PG: LD A,(SYS_PAGE.COPY_RGADR) OUT (PORT_Y),A LD A,(SYS_PAGE.COPY_SLOT3) OUT (SLOT3),A RET ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; WIN_OPEN: CALL LP_OPEN_PG LD (SYS_PAGE.WIN_MAP_SC),IX ; карта окна PUSH DE LD HL,(SYS_PAGE.WIN_MAP_SC) LD DE,WIN_ID_0 LD BC,Window_UserVars LDIR LD IX,WIN_ID_0 POP DE LD L,(IX+Window_Variables.USER.PLACE_H) LD H,(IX+Window_Variables.USER.PLACE_V) LD (IX+Window_Variables.MODE_E),E ; LD A,L ADD A,A INC A ; вычисление PORT_Y BIT 4,E JR NZ,.LP_SET_NO_OR OR #80 ; если вывод на второй экран .LP_SET_NO_OR: LD (IX+Window_Variables.H_BEG),A LD D,A LD A,(IX+Window_Variables.USER.SIZE_H) ADD A,A ADD A,D LD (IX+Window_Variables.H_END),A LD (SYS_PAGE.WIN_MODE_SC),DE ; место по горизонтали и страница моды LD A,H AND #3F ADD A,A ADD A,A LD L,A LD H,#C3 LD (SYS_PAGE.WIN_MODE_SH),HL ; место по вертикали с адресом LD (IX+Window_Variables.V_BEG),A LD A,(IX+Window_Variables.USER.SIZE_V) ADD A,A ADD A,A ADD A,L LD (IX+Window_Variables.V_END),A ; LD L,(IX+Window_Variables.V_BEG) LD H,#C3 LD B,(IX+Window_Variables.USER.SIZE_V) ; размер по вертикали ; LD (IX+Window_Variables.WORK_1),0 LD A,(IX+Window_Variables.USER.MODE) ; знакогенератор плюс режим LD (IX+Window_Variables.WORK_2),A BIT 4,A JR NZ,.LOOP ; переход, если текстовый режим ; AND #F0 LD C,A LD A,(IX+Window_Variables.USER.GR_X) RRCA RRCA RRCA LD D,A AND #0F OR C LD (IX+Window_Variables.WORK_2),A ; LD A,D AND #E0 LD C,A LD A,(IX+Window_Variables.USER.GR_Y) AND #1F OR C RLCA RLCA RLCA LD (IX+Window_Variables.WORK_1),A ; .LOOP: LD D,(IX+Window_Variables.H_BEG) ; D - начало строки (PORT_Y) LD C,(IX+Window_Variables.USER.SIZE_H) ; размер по горизонтали LD A,(IX+Window_Variables.USER.MODE) ; знакогенератор плюс режим ; PUSH BC CALL LP_MODE_LINE POP BC INC L INC L INC L INC L DJNZ .LOOP ; LD A,(IX+Window_Variables.MODE_E) AND 1 OUT (RGMOD),A CALL LP_CLOSE_PG CALL LP_INI_P CALL LP_SIZE XOR A RET ; LP_INI_P: EX AF,AF' EXX CALL LP_OPEN_PG ; открытие графического экрана ; LP_INI_NO_ZG: LD A,(WIN_ID_0.H_BEG) LD D,A LD A,(WIN_ID_0.V_BEG) LD L,A INC L LD H,#C3 AND A LD A,(WIN_ID_0.USER.MODE) BIT 5,A LD A,(WIN_ID_0.USER.SIZE_H) JR NZ,LP_INI_40 ADD A,A SCF ;!TODO что-то тут подвыпиленно LP_INI_40: LD B,A LD (WIN_ID_0.SIZE_REL),A EX AF,AF' EXX JP LP_END_P ; ; WIN_MAP_SC - карта экрана ; 0 - hor size ; 1 - ver size ; 2 - hor place ; 3 - ver place LP_SIZE: ; определение size CALL LP_OPEN_PG LD DE,(WIN_ID_0.USER.SIZE_H) LD A,(WIN_ID_0.USER.MODE) BIT 5,A CALL LP_CLOSE_PG RET NZ LD A,E ADD A,A LD E,A RET ; LP_END_P: LD A,SYS_PAGE OUT (SLOT3),A .SYS_PAGE: EX AF,AF' EXX RLA LD E,A LD (WIN_ID_0.reg_HL),HL ; место печати LD (WIN_ID_0.reg_DE),DE LD (WIN_ID_0.reg_BC),BC CALL LP_CLOSE_PG EXX EX AF,AF' AND A RET .short: EX AF,AF' EXX CALL LP_CLOSE_PG EXX EX AF,AF' AND A RET ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; FN_SYNC: LD A,Port_VSYNC.SET_320L OUT (Port_VSYNC),A LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (C),A LD A,(SYS_PAGE.VSyncAndWaits) OR 1 LD (SYS_PAGE.VSyncAndWaits),A ; .INT_DEF: LD DE,(SYS_PAGE.CONFIG_ALL) OUT (C),B LD IX,SCREEN_TABLES.PENTAGON IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' LD (SYS_PAGE.COPY_SLOT3),A IN A,(PORT_Y) LD (SYS_PAGE.COPY_RGADR),A LD (SYS_PAGE.CONFIG_ALL),IX XOR A ;----[START]-----------------------[? 1] .loop_1: OUT (PORT_Y),A EX AF,AF' LD A,#50 OUT (SLOT3),A LD HL,#C300 ;----[START]------------------[v 2]----- .loop_2: LD C,(IX) ;----[START]-------------[v 3]---------- .loop_3: ; взять адрес данных для записи в служебную область экрана LD E,(IX+1) ; take adress of line X LD D,(IX+2) ;----[START]--------[v 4]--------------- .loop_4: LD A,(DE) ; take counter in table 1, line X, column Y INC DE AND A JR Z,.loop_4_exit ; exit if zero-counter LD B,A LD A,(DE) INC DE ;----[START]---[v 5]-------------------- .loop_5: LD (HL),A INC L LD (HL),0 INC L LD (HL),0 ; EX AF,AF' INC A OUT (PORT_Y),A EX AF,AF' ; LD (HL),0 DEC L LD (HL),0 DEC L LD (HL),A ; EX AF,AF' INC A OUT (PORT_Y),A EX AF,AF' DJNZ .loop_5 ;--------------[^ 5]-------------------- JR .loop_4 ;-------------------[^ 4]--------------- .loop_4_exit: INC HL ; next line INC HL INC HL INC HL IN A,(PORT_Y) AND #80 OUT (PORT_Y),A DEC C JR NZ,.loop_3 ;------------------------[^ 3]---------- INC IX ; next counter INC IX INC IX LD A,(IX) AND A JR NZ,.loop_2 ;-----------------------------[^ 2]----- LD A,SYS_PAGE OUT (SLOT3),A LD IX,(SYS_PAGE.CONFIG_ALL) EX AF,AF' ADD A,#80 JR NC,.loop_1 ;----------------------------------[^ 1] ; Exit LD A,(SYS_PAGE.COPY_RGADR) OUT (PORT_Y),A LD A,(SYS_PAGE.COPY_SLOT3) OUT (SLOT3),A .exit: OR A RET ;--- Screen data table 1: counter1, data1 .. counterX, dataX SCREEN_TABLES:; | число | значения | ; | строк | в | ; | /2 | строках | .SCR: DB 41 , #F8 DB 3 , #FC DB 4 , #FC DB 7 , #FC DB 9 , #F8 DB 0 .INT: DB 40,#FC, 2,#FD, 6,#FC, 7,#FC, 9,#FC, 0 .BLN: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 .SNC: DB 41,#FC, 3,#FC, 4,#FC, 7,#FC, 9,#FC, 0 .RES: DB 41,#F8, 3,#FE, 4,#FE, 7,#FE, 9,#F8, 0 ;--- Screen data tables 2: counter1, data address1 .. counterX, data addressX ; ; | кол-во | значения | ; | строк | в | ; | | строке | .PENTAGON: DB 33 : DW .SCR DB 1 : DW .INT ; DW .BLN DB 3 : DW .SNC DB 1 : DW .BLN DB 1 : DW .SCR DB 1 : DW .RES DB 0 ; end ;--- VideoModes: .text_mode80x32: DB 40 DB 32 DB 0 DB 0 DB %00011011 DB 0 DB 0 DB 0 .graf_mode320x256: DB 80 DB 32 DB 0 DB 0 DB %01100000 DB 0 DB 0 DB 0 ;---------------------------------------------------------------------; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; RESERVED_PAGES_COPY: BLOCK RESERVED_PAGES.Size,#FF .SYS_FN EQU RESERVED_PAGES.SYS_FN - RESERVED_PAGES .BIOS EQU RESERVED_PAGES.BIOS - RESERVED_PAGES .PICTURE EQU RESERVED_PAGES.PICTURE - RESERVED_PAGES .FLASHER_RAM EQU RESERVED_PAGES.FLASHER_RAM - RESERVED_PAGES ;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░; ;-----------------------------------------------------------------------; BYTE "ACEX 1K" FOR_ACEX: DB "0" + TYPE_OF_ACEX BYTE "0" BYTE "FULL BOARD ID:" BOARD_ID_DATA: .Start: DW #5283 .Number: DW 0 ; выводится как 5 десятичных цифр: 0..99999 или #0000..#270F .End: DW #47E8 .Type: DB 0 BYTE "--<=END=>--" ;-----------------------------------------------------------------------;