fx_twin.asm
资源名称:DOS系统的源代码.rar [点击查看]
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:5k
源码类别:
操作系统开发
开发平台:
Visual C++
- ;*
- ;* 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