From bc3397d2048abe5ea6e4aa2368a9b7fd3bf77afb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 10 Sep 2023 00:21:44 +1000 Subject: [PATCH] PIC_GET_PAL optimized and documented --- Shared_Includes | 2 +- src/bios/exp/FUNC_PIC.ASM | 164 ++++++++++++++++---------------- src/bios/rom/SETUP/VIDEO_IO.asm | 106 +-------------------- src/bios/shared/DEFINES.INC | 2 +- src/bios/shared/RECOVERY.IMG | Bin 98304 -> 98304 bytes 5 files changed, 87 insertions(+), 187 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 9a65a38..90f4b54 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9a65a386bfb6aaccc7fb476a3e159a684af65743 +Subproject commit 90f4b54edb1effbd0b57b0ee64771d27e84023ff diff --git a/src/bios/exp/FUNC_PIC.ASM b/src/bios/exp/FUNC_PIC.ASM index 9f1ca71..fc9451b 100644 --- a/src/bios/exp/FUNC_PIC.ASM +++ b/src/bios/exp/FUNC_PIC.ASM @@ -183,101 +183,98 @@ PIC_FN3_NO: RET ;************************************************************************** +;PIC_FN4: ; вход: HL - данные палитры RGB, E - начальный цвет ; D - число цветов, B - PAL-mask, A - page PAL -;PIC_FN4: PIC_SET_PAL: - PUSH IX + PUSH IX - EX AF,AF' - IN A,(RGADR) - PUSH AF ; сохранить положение RGADR - LD A,E - OUT (RGADR),A ; начальный цвет в порт - LD A,D ; сохранить число цветов - EX AF,AF' ; вернуть страницу PAL + 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,0C3H ; то граф.экран на странице 3 - JR Z,PIC_FN4_NO_PAGE1 - LD D,043H ; иначе - LD C,SLOT1 ; на странице 1 -PIC_FN4_NO_PAGE1: + 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 + PUSH AF - ADD A,A - JR C,PIC_PAL_READ + ADD A,A + AND #1C + XOR #E0 ; младший байт адреса PAL + LD E,A ; DE - адрес в видео-ОЗУ + PUSH DE + POP IX ; адрес палитры - ADD A,A - AND 1CH - XOR 0E0H ; младший байт адреса PAL - LD E,A ; DE - адрес в видео-ОЗУ - PUSH DE - POP IX ; адрес палитры + LD D,B ; маска PAL + EX AF,AF' ; вернуть число цветов + LD B,A ; число цветов - LD D,B ; маска PAL - EX AF,AF' ; вернуть число цветов - LD B,A ; число цветов + IN E,(C) ; сохранить страницу 3 + LD A,#50 ; страница графического RAM + OUT (C),A - IN E,(C) ; сохранить страницу 3 - LD A,#50 ; страница графического RAM - OUT (C),A + POP AF + JR C,PIC_GET_PAL + ; цикл установки цветов палитры +.loopPal: + LD A,(HL) ; B + AND D + LD (IX+2),A + INC HL -PIC_FN4_L1: ; цикл установки цветов палитры + LD A,(HL) ; G + AND D + LD (IX+1),A + INC HL - LD A,(HL) ; B - AND D - LD (IX+2),A - INC HL + LD A,(HL) ; R + AND D + LD (IX+0),A + INC HL - LD A,(HL) ; G - AND D - LD (IX+1),A - INC HL + LD A,(HL) ; Y + AND D + LD (IX+3),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 PIC_FN4_L1 ; выполнять, пока не 0 - - OUT (C),E ; восстановить страницу 3 + 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 -PIC_PAL_READ: +PIC_GET_PAL: + ; ADD A,A + ; AND #1C + ; XOR #E0 ; младший байт адреса PAL + ; LD E,A ; DE - адрес в видео-ОЗУ + ; PUSH DE + ; POP IX ; адрес палитры - ADD A,A - AND 1CH - XOR 0E0H ; младший байт адреса 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 - -PIC_FN4_L2: ; цикл установки цветов палитры + ; LD D,B ; маска PAL + ; EX AF,AF' ; вернуть число цветов + ; LD B,A ; число цветов + ; IN E,(C) ; сохранить страницу 3 + ; LD A,#50 ; страница графического RAM + ; OUT (C),A + ; цикл чтения цветов палитры +.loopPal: LD A,(IX+2) LD (HL),A ; B INC HL @@ -297,16 +294,15 @@ PIC_FN4_L2: ; цик IN A,(RGADR) INC A OUT (RGADR),A + DJNZ .loopPal ; выполнять, пока не 0 - DJNZ PIC_FN4_L2 ; выполнять, пока не 0 - - OUT (C),E ; восстановить страницу 3 - - POP AF - OUT (RGADR),A ; восстановить Y_PORT - POP IX - AND A - RET + JR PIC_SET_PAL.exit + ; OUT (C),E ; восстановить страницу 3 + ; POP AF + ; OUT (RGADR),A ; восстановить Y_PORT + ; POP IX + ; AND A + ; RET ;******************************************************************** @@ -339,9 +335,9 @@ PIC_FN6: ; AND 3 ; ADD A,A ; ADD A,A -; ADD A,0E0H +; ADD A,#E0 ; LD L,A -; LD H,43H +; LD H,#43 ; IN A,(SLOT1) ; PUSH AF ; diff --git a/src/bios/rom/SETUP/VIDEO_IO.asm b/src/bios/rom/SETUP/VIDEO_IO.asm index 555244d..23af571 100644 --- a/src/bios/rom/SETUP/VIDEO_IO.asm +++ b/src/bios/rom/SETUP/VIDEO_IO.asm @@ -330,10 +330,10 @@ LOGOX: LD IX,win_descriptor.tab320x256 LD HL,memBUFFER.Shared ; A = 0 - LD D,A ; SET DESKTOP PALETTE & CURSOR COLORS - LD E,A - LD B,def_pal_mask - CALL PIC_SET_PAL + LD D,A ; SET DESKTOP PALETTE & CURSOR COLORS + LD E,A + LD B,def_pal_mask + CALL PIC_SET_PAL SAFE_PORTY @@ -594,101 +594,5 @@ DCR01: LDIR RET - MODULE COLORS -CGA: - ; B G R _ -.PALETTE: DB #00,#00,#00,#00 ; 0 BLACK - DB #A8,#00,#00,#00 ; 1 BLUE - DB #00,#A8,#00,#00 ; 2 GREEN - DB #A8,#A8,#00,#00 ; 3 CYAN - DB #00,#00,#A8,#00 ; 4 RED - DB #A8,#00,#A8,#00 ; 5 MAGENTA - DB #00,#54,#A8,#00 ; 6 BROWN - DB #A8,#A8,#A8,#00 ; 7 WHITE - DB #54,#54,#54,#00 ; 8 GRAY - DB #FC,#54,#54,#00 ; 9 BRIGHT BLUE - DB #54,#FC,#54,#00 ; 10 BRIGHT GREEN - DB #FC,#FC,#54,#00 ; 11 BRIGHT CYAN - DB #54,#54,#FC,#00 ; 12 BRIGHT RED - DB #FC,#54,#FC,#00 ; 13 BRIGHT MAGENTA - DB #54,#FC,#FC,#00 ; 14 YELLOW - DB #FC,#FC,#FC,#00 ; 15 WHITE -; -; -INC: -.BLACK EQU #00 -.BLUE EQU #01 -.GREEN EQU #02 -.CYAN EQU #03 -.RED EQU #04 -.MAGENTA EQU #05 -.BROWN EQU #06 -.LGRAY EQU #07 -.DGRAY EQU #08 -.LBLUE EQU #09 -.LGREEN EQU #0A -.LCYAN EQU #0B -.LRED EQU #0C -.LMAGENT EQU #0D -.YELLOW EQU #0E -.WHITE EQU #0F -PAPER: -.BLACK EQU 16*INC.BLACK -.BLUE EQU 16*INC.BLUE -.GREEN EQU 16*INC.GREEN -.CYAN EQU 16*INC.CYAN -.RED EQU 16*INC.RED -.MAGENTA EQU 16*INC.MAGENTA -.BROWN EQU 16*INC.BROWN -.LGRAY EQU 16*INC.LGRAY -.DGRAY EQU 16*INC.DGRAY -.LBLUE EQU 16*INC.LBLUE -.LGREEN EQU 16*INC.LGREEN -.LCYAN EQU 16*INC.LCYAN -.LRED EQU 16*INC.LRED -.LMAGENT EQU 16*INC.LMAGENT -.YELLOW EQU 16*INC.YELLOW -.WHITE EQU 16*INC.WHITE - -FLASH EQU #80 - -/* -INC_COLOR: -.BLACK EQU #00 -.BLUE EQU #01 -.GREEN EQU #02 -.CYAN EQU #03 -.RED EQU #04 -.MAGENTA EQU #05 -.BROWN EQU #06 -.LGRAY EQU #07 -.DGRAY EQU #08 -.LBLUE EQU #09 -.LGREEN EQU #0A -.LCYAN EQU #0B -.LRED EQU #0C -.LMAGENT EQU #0D -.YELLOW EQU #0E -.WHITE EQU #0F -.FLASH EQU #80 -PAPER_COLOR: -.BLACK EQU 16*COLORS.INC.BLACK -.BLUE EQU 16*COLORS.INC.BLUE -.GREEN EQU 16*COLORS.INC.GREEN -.CYAN EQU 16*COLORS.INC.CYAN -.RED EQU 16*COLORS.INC.RED -.MAGENTA EQU 16*COLORS.INC.MAGENTA -.BROWN EQU 16*COLORS.INC.BROWN -.LGRAY EQU 16*COLORS.INC.LGRAY -.DGRAY EQU 16*COLORS.INC.DGRAY -.LBLUE EQU 16*COLORS.INC.LBLUE -.LGREEN EQU 16*COLORS.INC.LGREEN -.LCYAN EQU 16*COLORS.INC.LCYAN -.LRED EQU 16*COLORS.INC.LRED -.LMAGENT EQU 16*COLORS.INC.LMAGENT -.YELLOW EQU 16*COLORS.INC.YELLOW -.WHITE EQU 16*COLORS.INC.WHITE -.FLASH EQU #80 -*/ - ENDMODULE + include 'shared_includes/constants/standart_colors.inc' ; \ No newline at end of file diff --git a/src/bios/shared/DEFINES.INC b/src/bios/shared/DEFINES.INC index f2a390a..d329567 100644 --- a/src/bios/shared/DEFINES.INC +++ b/src/bios/shared/DEFINES.INC @@ -7,7 +7,7 @@ DEFINE NeedSafePort_Y 1 ; !!!!! если 0, то в режиме sp-спектрума некоторые процедуры могут засрать экран DEFINE Pashalki 0 ; DEFINE PICTURE_FILE './src/bios/logo/psfathers.bmp' - + DEFINE StandartCGApallete 1 ; Подключать палитру из standart_colors.inc ; Задержка в кадрах после отрисовки логотипа (0 = 256) diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 72b1d2c87a264a947a1fe5761ced2a6a64e5183c..666c9e3b7a0a5f8f2be8ede85397d66fb9c8b8d5 100755 GIT binary patch delta 10330 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 Lotppn>*xO)=T}Vk