DOSSEG .MODEL LARGE .CODE ConDevName db 'CON',0 .286 ;++ ; ; unsigned ; _far ; GetGlobalCodepage( ; VOID ; ); ; ; Routine Description: ; ; Fetch the active global codepage ; ; Arguments: ; ; None. ; ; Return Value: ; ; 0 - error ; non-0 - codepage ; ;-- public _GetGlobalCodepage _GetGlobalCodepage proc far push bp mov bp,sp push ds push es push bx push si push di mov ax,6601h int 21h mov ax,0 ; don't clobber carry jc ggexit mov ax,bx ggexit: pop di pop si pop bx pop es pop ds leave retf _GetGlobalCodepage endp ;++ ; ; unsigned ; _far ; GetScreenCodepage( ; VOID ; ); ; ; Routine Description: ; ; Fetch the active codepage in use for the screen (device CON). ; ; Arguments: ; ; None. ; ; Return Value: ; ; 0 - error ; non-0 - codepage ; ;-- getcp_packet equ byte ptr [bp-30] getcp_codepage equ word ptr [bp-28] public _GetScreenCodepage _GetScreenCodepage proc far push bp mov bp,sp sub sp,30 push ds push es push bx push si push di ; ; Open CON ; push cs pop ds mov dx,offset CS:ConDevName ; ds:dx -> device name mov ax,3d02h int 21h jnc @f mov ax,0 ; preserves carry jmp short gsdone @@: mov bx,ax ; bx = handle to CON device push bx ; save handle for later mov ax,440ch ; generic char device ioctl mov cx,36ah ; query selected codepage for console push ss pop ds lea dx,getcp_packet ; ds:dx -> return packet int 21h mov ax,0 ; assume error pop bx ; bx = CON device handle jc gsdone1 mov ax,getcp_codepage ; ax = active codepage for CON device gsdone1: push ax ; save return code mov ah,3eh ; bx set from above int 21h ; close CON device pop ax ; restore return code gsdone: pop di pop si pop bx pop es pop ds leave retf _GetScreenCodepage endp ;++ ; ; BOOL ; _far ; SetGlobalCodepage( ; IN unsigned Codepage ; ); ; ; Routine Description: ; ; Set the active global codepage (equivalent to chcp x). ; ; Arguments: ; ; Codepage - supplies the codepage id ; ; Return Value: ; ; Boolean value indicating outcome. ; ;-- Codepage equ word ptr [bp+6] public _SetGlobalCodepage _SetGlobalCodepage proc far push bp mov bp,sp push ds push es push bx push si push di mov ax,6602h mov bx,Codepage int 21h mov ax,0 ; don't clobber carry jc sgexit inc ax sgexit: pop di pop si pop bx pop es pop ds leave retf _SetGlobalCodepage endp ;++ ; ; BOOL ; _far ; SetScreenCodepage( ; IN unsigned Codepage ; ); ; ; Routine Description: ; ; Set the active codepage for the screen (equivalent to ; mode con cp select=x). ; ; Arguments: ; ; Codepage - supplies the codepage id ; ; Return Value: ; ; Boolean value indicating outcome. ; ;-- Codepage equ word ptr [bp+6] setcp_packet equ word ptr [bp-4] setcp_codepage equ word ptr [bp-2] public _SetScreenCodepage _SetScreenCodepage proc far push bp mov bp,sp sub sp,4 push ds push es push bx push si push di ; ; Open CON ; push cs pop ds mov dx,offset CS:ConDevName ; ds:dx -> device name mov ax,3d02h int 21h jnc @f mov ax,0 ; preserves carry jmp short ssdone @@: mov bx,ax ; bx = handle to CON device push bx ; save handle for later mov cx,34ah ; set selected codepage for console push ss pop ds lea dx,setcp_packet ; ds:dx -> param packet mov ax,Codepage mov setcp_codepage,ax mov setcp_packet,2 mov ax,440ch ; generic char device ioctl int 21h mov ax,0 ; assume error, ax = FALSE pop bx ; bx = CON device handle jc ssdone1 inc ax ; ax = TRUE; ssdone1: push ax ; save return code mov ah,3eh ; bx set from above int 21h ; close CON device pop ax ; restore return code ssdone: pop di pop si pop bx pop es pop ds leave retf _SetScreenCodepage endp end