📄 fx_twin.asm
字号:
;*
;* CW : Character Windows Drivers
;*
;* fx_ega.asm : CSD for IBM version with screen saving
;* (code taken from twin.asm for QC/QB)
;* * DOES NOT INCLUDE "csd_code"
;*************************************************************************
BUILTIN_SNOW = 1 ;* builtin snow control
TWINCSD = 1
include csd_head.inc
include fxdrv.inc
include csd_data.inc
;*****************************************************************************
include fx_data.asm
;*****************************************************************************
sBegin DRV
assumes CS,DRV
assumes ds,NOTHING
assumes ss,NOTHING
;*****************************************************************************
;* * There is no low memory structure for the linked driver
OFF_lpwDataCsd DW dataOffset rgwDataCsd
include saveega.inc ;* screen save specifics
;*****************************************************************************
MDACSD = 1 ;enable all drivers
CGACSD = 1
EGACSD = 1
MCGACSD = 1
VGACSD = 1
include genmodes.asm ;* modes table
;*****************************************************************************
NonStandard FInitCsd
;********** FInitCsd **********
;* entry:
;* pinch = near pointer to INCH structure to fill
;* * Initialize the screen to the given mode
;* exit: AX != 0 if ok
cProc FInitCsd, <FAR, PUBLIC, ATOMIC>, <ds,di>
parmDP pinst
parmDP pinch
localB modeCur
localB fscanset
cBegin FInitCsd
mov di,OFF_lpwDataCsd ;* Data in data segment
;* * save old mode
cCall ModeGetCur ;* al = mode, ah = ayMac
mov modeCur,al ;* current mode
mov bx,pinst
cmp ds:[bx].ayMacInst,ah
je @F ;* same resolution
mov modeCur,0 ;* cause mode reset
@@:
;* * set mode
mov [di].pinstDrv,bx
mov bx,ds:[bx].pdmInst ;* CS:BX => DM info
;* * copy mode info into driver globals
mov ax,cs:[bx].vparmCursOnDm
mov [di].vparmCursOn,ax ;initialize underline cursor
mov [di].vparmCursSize,ax
mov ax,cs:[bx].wExtraDm
mov [di].wExtra,ax
mov al,cs:[bx].modeDm
cmp al,modeCur
jne @F
jmp finitdone ;same mode, no reset
@@:
mov fscanset,0
test [di].fvmCurAdap,fvmVGA ;Test for VGA
jz initvideomode
mov al,2 ;default 400 scan lines
cmp cs:[bx].modeDm,7
je @F
cmp cs:[bx].ayMacDm,43 ;80x43 text ?
jne not43line
@@:
dec al ;350 lines (EGA)
mov fscanset,al
not43line:
mov ah,12h ;set vertical scan line for VGA
push bx
mov bl,30h
int 10h
pop bx
initvideomode:
xor ah,ah ;* set mode
mov al,cs:[bx].modeDm
or al,80h ;* don't clear REGEN
int 10h
test ss:[bx].fvmCurAdap, fvmEGA or fvmVGA or fvm64KEGA or fvmMCGA or fvmEGAM
jz @F
;* Clear the "don't clear regen" bit in the BIOS image
xor ax,ax
mov es,ax
and byte ptr es:[BIOS_info],7fH ;487H
@@:
mov ax,40H
mov es,ax
mov al,cs:[bx].ayMacDm
dec al ; rows - 1
mov byte ptr es:[0084H],al ;* update BIOS rows
test [di].fvmCurAdap,fvmCGA
jnz finitdone
mov al,12h ;8x8 fonts
mov ah,8
cmp cs:[bx].ayMacDm,25
jne @F
test [di].fvmCurAdap,fvmEGA or fvmEGAM or fvm64KEGA
jnz finitdone
mov al,14h ;8x16
mov ah,16
cmp fscanset,1
jne @F
mov al,11h ;8x14 (VGA 350 scan mode)
mov ah,14
@@:
push bx
xor bl,bl
mov bh,ah
mov ah,11h ;load char set
int 10h
pop bx
cmp cs:[bx].ayMacDm,50 ;* 50 line mode ?
jne finitdone
test [di].fvmCurAdap,fvmMCGA
jz finitdone
;extra works for MCGA 50 line mode
mov ax,1103h ;load font page
xor bx,bx
int 10h
mov dx,3D4h ;program CRT
mov ax,309h
out dx,ax
mov al,0Ah
out dx,ax
mov al,0Bh
out dx,ax
push ds
mov ax,40h ;update video Bios data segment
mov ds,ax
mov word ptr ds:[4Ch],1F40h ;80x50x2
mov byte ptr ds:[84h],31h ;50-1 rows
mov word ptr ds:[85h],8 ;points
pop ds
finitdone:
;* * normally the INCH array would be copied (but since it is already
;* * setup in DATA just leave it alone).
;* * Do other diddling
cCall DiddleBlinkBit
mov [di].fBlinkEnable,0 ;disable blink attribute
mov ax,sp ;* success
cEnd FInitCsd
;*****************************************************************************
IFDEF PROJECT_LQB
include saveega.new ;* save stuff + bug fix
ELSE ;PROJECT_LQB
include saveega.asm ;* save stuff
ENDIF ;PROJECT_LQB
;*****************************************************************************
include csd_std.asm ;* standard init/term
include csd_ibm.asm ;* IBM specific routines
;*****************************************************************************
include csd_vram.asm ;* default procs for direct video I/O
include csd_save.asm ;* default screen save (none)
;*****************************************************************************
include csd_tail.asm ;* tail file
;*****************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -