;/////////////////////////////////////////////////////////////////////// ; Функция #50. Выбор режима экрана. ; ; вход: A - режим экрана ; #02 - текстовый 40x32x16 цветов ; #03 - текстовый 80x32x16 цветов ; #81 - графический 320x256x256 цветов ; #82 - графический 640x256x16 цветов ; B - страница экрана 0/1 ; выход: A - код ошибки, если CF=1 ;/////////////////////////////////////////////////////////////////////// SETVMOD: CP %1000'0000 LD C,A JR NC,.GRAPH .TEXT_M: LD IX,BACKTXT PUSH IX EX AF,AF' LD A,(VMODE) LD (BACKTXT.VMODE),A EX AF,AF' OR A JR Z,.NOMODE DEC A JR Z,.NOMODE DEC A LD HL,TAB_40x32 JR Z,.SET_TXT_MODE DEC A LD HL,TAB_80x32 JR Z,.SET_TXT_MODE .NOMODE: POP IX LD A,DSS_Error.sys.INVALID_VIDEO_MODE SCF RET ; Установка граф. режимов .GRAPH: CALL SAVETXT AND #7F JR Z,.G320_16c ; !TODO заменить на существующий режим DEC A JR Z,.G320_256c DEC A JR Z,.G640_16c ;DEC A ;JP Z,.G640_256c ; !TODO заменить на существующий режим .G320_16c: LD A,DSS_Error.sys.INVALID_VIDEO_MODE SCF RET ; .SET_TXT_MODE: PUSH BC LD A,B RLCA RLCA RLCA RLCA OR B AND #11 XOR #10 LD E,A .SETMODE_END: CALL SETMODE POP BC LD A,C LD (VMODE),A LD A,B AND #01 OUT (SCREEN_SWITCH),A LD A,(VMODE) LD C,Dss.Mouse.SetVideoMode RST ToDSS.Mouse SAFE_PORTY XOR A RET ; .G320_256c: PUSH BC LD HL,TAB_320x256_0 LD E,#11 CALL SETMODE LD HL,TAB_320x256_1 LD E,#00 JP .SETMODE_END ; .G640_16c: PUSH BC LD HL,TAB_640x256_0 LD E,#11 CALL SETMODE LD HL,TAB_640x256_1 LD E,#00 JP .SETMODE_END ; VMODE: DB #03 ;----------------------------------------------------------------------- ; Открыть окно ; вход: hl=описатель окна ; e=флаги окна ; ;02h - TEXT 40 x 32 (16 colors) ;03h - TEXT 80 x 32 (16 colors) ;80h - GRAF 320 x 256 (16 colors) ;!TODO занять другим ;81h - GRAF 320 x 256 (256 colors) ;82h - GRAF 640 x 256 (16 colors) ;83h - GRAF 640 x 256 (256 colors) ;!TODO занять другим ;----------------------------------------------------------------------- SETMODE: PUSH DE LD DE,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. кидает данные в буфер служебной страницы биоса. LD BC,ScreenDescriptorTable.Size ; БИОС при использовании IX предполагает, что он указывает IN A,(SLOT3) ; на адрес ниже #C000 и вставляет в третью банку страницу #FE EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A LDIR EX AF,AF' OUT (SLOT3),A .skip_EI: POP DE LD IX,SYS_PAGE.SHARED_BUFFER_32b ; грязный хак. LD C,BIOS.WIN_OPEN RST ToBIOS SAFE_PORTY XOR A RET ;IX+0 ;HORIZONTAL ;IX+1 ;VERTICAL ;IX+2 ;X - COORD ;IX+3 ;Y - COORD ;IX+4 ;MODE ;IX+5 ;EXT MODE ;IX+6 ;VIDEO RAM X OFFSET (SIGNPLACES) ;IX+7 ;VIDEO RAM Y OFFSET (SIGNPLACES) ; ;....................................................................... ;+0 X размер окна в знакоместах ;+1 Y размер окна в знакоместах ;+2 X полож. окна на экране ;+3 Y полож. окна на экране ;+4 режим знакоместа ;+5 доп. режим знакоместа (bit0=1 спек. адресация экрана) ;+6 X полож. в поле графики (в знакоместах) ;+7 Y полож. в поле графики (в знакоместах) ScreenDescriptorTable EQU $ ; 80x32. текстовое, знакоместо 16x8, #0B - номер знакоген. TAB_80x32 DB 40,32,0,0,%0001'1011,0,0,0 ;1 ; 40x32. текстовое, знакоместо 8x8, #0B - номер знакоген. TAB_40x32 DB 40,32,0,0,%0011'1011,0,0,0 ;2 ; 640x256. графическое, 0-й экран TAB_640x256_0 DB 40,32,0,0,%0000'0000,0,0,0 ;3 ; 320x256. графическое, 0-й экран TAB_320x256_0 DB 40,32,0,0,%0010'0000,0,0,0 ;4 ; 640x256. графическое, 1-й экран TAB_640x256_1 DB 40,32,0,0,%0100'0000,0,40,0 ;5 ; 320x256. графическое, 1-й экран TAB_320x256_1 DB 40,32,0,0,%0110'0000,0,40,0 ;6 ScreenDescriptorTable.Size EQU ($ - ScreenDescriptorTable)/6 ;....................................................................... ; /* PIC_320X256_1: DB 40,32,0,0,32,0,8,0 DB 0, 0,0,0, 0,0,0,0 */ ;----------------------------------------------------------------------- ; Сохранить экран текст. режима. ; Для буфера экрана исп. 2-я банка расширения ДОС. SAVETXT: PUSH AF LD A,(VMODE) ;BIT 7,A CP %1000'0000 JR NC,.NOSAVET SUB #02 JR C,.NOSAVET ; PUSH BC PUSH DE PUSH HL PUSH IX ; PUSH AF LD C,BIOS.LP_GET_PLACE RST ToBIOS LD (BACKTXT.CURS),DE POP AF LD IX,#C000 LD HL,#2050 OR A JR NZ,.SVTEXT1 LD L,#28 .SVTEXT1: LD (BACKTXT.WinMax),HL LD DE,#0000 LD A,(BANKTBL+TXTPAGE) LD B,A LD C,BIOS.WIN_COPY ;[x] 29/9/23 LD A,R PUSH AF ; XOR A DI RST ToBIOS ;[x] 29/9/23 POP AF JP PO,.skip_EI EI .skip_EI: ; POP IX POP HL POP DE POP BC .NOSAVET: POP AF RET ;----------------------------------------------------------------------- BACKTXT: PUSH AF .VMODE+1: LD A,#00 ;BIT 7,A CP %1000'0000 JR C,.NOBACKT ; PUSH BC PUSH DE PUSH HL PUSH IX LD IX,#C000 .WinMax+1: LD HL,#2050 LD DE,#0000 LD A,(BANKTBL+TXTPAGE) LD B,A LD C,BIOS.WIN_RESTORE ;[x] 29/9/23 LD A,R PUSH AF ; XOR A DI RST ToBIOS ;[x] 29/9/23 POP AF JP PO,.no_ei EI .no_ei: ; .CURS+1: LD DE,#0000 CALL LOCATE POP IX POP HL POP DE POP BC .NOBACKT: POP AF RET ;///////////////////////////////////////////////////////////////////////