2045 lines
70 KiB
NASM
2045 lines
70 KiB
NASM
PAGE 109,132
|
||
TITLE MS-DOS 5.0 CONSOLE.ASM
|
||
|
||
;************************************************************************
|
||
;* *
|
||
;* *
|
||
;* MODULE: CONSOLE.ASM *
|
||
;* *
|
||
;* *
|
||
;* COPYRIGHT (C) NEC CORPORATION 1990 *
|
||
;* *
|
||
;* NEC CONFIDENTIAL AND PROPRIETARY *
|
||
;* *
|
||
;* All rights reserved by NEC Corporation. *
|
||
;* this program must be used solely for *
|
||
;* the purpose for which it was furnished *
|
||
;* by NEC Corporation. No past of this program *
|
||
;* may be reproduced or disclosed to others, *
|
||
;* in any form, without the prior written *
|
||
;* permission of NEC Corporation. *
|
||
;* Use of copyright notice does not evidence *
|
||
;* publication of this program. *
|
||
;* *
|
||
;************************************************************************
|
||
|
||
;************************************************************************
|
||
;* *
|
||
;* *
|
||
;* *
|
||
;* MS-DOS V2.00/V3.10 CONSOLE(VIDEO) OUTPUT ROUTINE *
|
||
;* *
|
||
;* *
|
||
;* *
|
||
;************************************************************************
|
||
;
|
||
; 85/03/15 DSPCSR CORRECTION FOR ROM
|
||
; 85/04/29
|
||
; 86/09/23 FOR SOURCE CLEAN
|
||
|
||
; 87/08 -- HIRESO/NORMAL
|
||
; 87/10/01 BUG FIX (DIPLAY FUNCTION-KEY ROUTINE)
|
||
;
|
||
; 90/11,12 MS-DOS 5.0
|
||
;
|
||
;
|
||
|
||
;
|
||
; This file defines the segment structure of the BIOS.
|
||
; It should be included at the beginning of each source file.
|
||
; All further segment declarations in the file can then be done by just
|
||
; by specifying the segment name, with no attribute, class, or align type.
|
||
|
||
datagrp group Bios_Data,Bios_Data_Init
|
||
|
||
Bios_Data segment word public 'Bios_Data'
|
||
Bios_Data ends
|
||
|
||
Bios_Data_Init segment word public 'Bios_Data_Init'
|
||
Bios_Data_Init ends
|
||
|
||
Filler segment para public 'Filler'
|
||
Filler ends
|
||
|
||
Bios_Code segment word public 'Bios_Code'
|
||
Bios_Code ends
|
||
|
||
Filler2 segment para public 'Filler2'
|
||
Filler2 ends
|
||
|
||
SysInitSeg segment word public 'system_init'
|
||
SysInitSeg ends
|
||
|
||
|
||
Bios_Data segment word public 'Bios_Data'
|
||
ASSUME CS:DATAGRP
|
||
|
||
EXTRN FKYCNT:BYTE,SFTJISMOD:BYTE
|
||
EXTRN MODMARK1:BYTE,MODMARK2:BYTE,MEM_SW5:BYTE
|
||
|
||
EXTRN FKYPTR:WORD
|
||
EXTRN ESCBUF:WORD,ESCPTR:WORD,ESCSUBRTN:WORD,ESCPOSSAVE:WORD
|
||
EXTRN ESCCNT:BYTE,ESCPRM:BYTE,SRMFLG:BYTE,ESCATRSAVE:BYTE
|
||
EXTRN ESCCPRBUF:BYTE,ESCCPRLIN:WORD,ESCCPRCOL:WORD,KANJICNT:BYTE
|
||
EXTRN K1STSAV:BYTE,WRAPMOD:BYTE,ROLSW:BYTE,NULCHR:WORD,ENDLINE:BYTE
|
||
EXTRN CSRSW:BYTE,FKYSW:BYTE,CURLIN:BYTE,CURCOL:BYTE,DEFATTR:BYTE
|
||
EXTRN CURATTR:BYTE,ROLTOP:BYTE,WAITCNT:WORD,FKYD_KCNT:BYTE
|
||
EXTRN FKYD_K1SAV:BYTE
|
||
EXTRN LINMOD:BYTE
|
||
|
||
EXTRN VRAMSEG:WORD ; 870811
|
||
EXTRN SYS_501:BYTE ; 870815
|
||
;----------------------------------------------------- 89/08/16 ---
|
||
EXTRN CRTDOTF:WORD
|
||
|
||
EXTRN CURATTR2:WORD,DEFATTR2:WORD
|
||
EXTRN ATRSAVE2:WORD,BIOSF_3:byte ; 89/08/21
|
||
EXTRN FKYTBL:NEAR,FKYTBL2:NEAR
|
||
EXTRN ESCATTRTBL:NEAR,SGRFLG:BYTE,ATTRTBL2:NEAR
|
||
EXTRN LINETBL:NEAR
|
||
;--------------------------------------------------------------------
|
||
|
||
EXTRN ATTRF:WORD
|
||
|
||
Bios_Data ends
|
||
|
||
Bios_Code segment word public 'Bios_Code'
|
||
ASSUME CS:BIOS_CODE
|
||
|
||
EXTRN FKYDSP:NEAR
|
||
EXTRN CHGLIN:NEAR
|
||
EXTRN CRTMD2AT:NEAR,CRTMD1AT:NEAR
|
||
EXTRN CRTMD480:NEAR,CRTMD400:NEAR
|
||
extrn bdata_seg:word
|
||
|
||
Bios_Code ends
|
||
|
||
|
||
Bios_Code segment word public 'Bios_Code'
|
||
ASSUME CS:BIOS_CODE,DS:DATAGRP
|
||
|
||
PUBLIC CONSOLE_CODE_START
|
||
|
||
PUBLIC CRTOUT,CRTRDY
|
||
PUBLIC CRTOUT_FAR,CRTRDY_FAR
|
||
PUBLIC LOOKUP,CLRRTN,HOMERTN
|
||
PUBLIC HOMERTN_FAR
|
||
PUBLIC CLRRTN_FAR
|
||
PUBLIC BELRTN,CRTCLR
|
||
PUBLIC BELRTN_FAR
|
||
PUBLIC LINECLR,ROLLUP,DSPCSR,DSPFKY,D_MCONV
|
||
PUBLIC D_MCONV_FAR
|
||
PUBLIC CODECHK
|
||
PUBLIC ESCADM,ESCIND,ESCRI,ESCVT_CUU,ESCVT_CUD
|
||
PUBLIC ESCVT_CUF,ESCVT_CUB,ESCVT_ED,ESCVT_EL
|
||
PUBLIC ESCVT_IL,ESCVT_DL,ESCKNJ
|
||
|
||
; PUBLIC KBCODTBL
|
||
; PUBLIC CTRLXFER,CTRLNFER,CTRLFKY ;
|
||
; PUBLIC BUFSIZE,CHRTBL ; 870825
|
||
|
||
CONSOLE_CODE_START:
|
||
|
||
;****************************************************************
|
||
;* *
|
||
;* SCREEN DRIVER DATA *
|
||
;* *
|
||
;****************************************************************
|
||
|
||
;************************************************
|
||
;* *
|
||
;* EQU *
|
||
;* *
|
||
;************************************************
|
||
|
||
ESCBUFSIZ EQU 20
|
||
FKYBUFSIZ EQU 80 ;FUNC KEY BUFFER SIZE
|
||
;VRAMSEG EQU 0E000H ;VIDEO RAM SEGMENT ADDR
|
||
ATTROFST EQU 2000H ;ATTR MEM(IN VRAM) OFFSET
|
||
LINEEND EQU 79
|
||
LINESIZE EQU 80
|
||
CRTSIZE EQU LINESIZE*31 ;SCREEN CHARACTER LENGTH
|
||
|
||
PAGE
|
||
;************************************************
|
||
;* *
|
||
;* TABLES *
|
||
;* *
|
||
;************************************************
|
||
EVEN
|
||
;************************************************
|
||
;* CONTROL DATA SUBROUTINE TABLE *
|
||
;************************************************
|
||
CTLRTNTBL DB 07H ;BEEP
|
||
DW BELRTN
|
||
DB 08H ;BACK SPACE
|
||
DW BSRTN
|
||
DB 09H ;HORIZONTAL TAB
|
||
DW TABRTN
|
||
DB 0AH ;LINE FEED
|
||
DW LFRTN
|
||
DB 0BH ;VERTICAL UP
|
||
DW UPRTN
|
||
DB 0CH ;FORE SPACE
|
||
DW FSRTN
|
||
DB 0DH ;CARRIAGE RETURN
|
||
DW CRRTN
|
||
DB 1AH ;CLEAR & HOME
|
||
DW CLRRTN
|
||
DB 1BH ;ESCAPE
|
||
DW ESCRTN
|
||
DB 1EH ;HOME
|
||
DW HOMERTN
|
||
DB 0 ;OTHER
|
||
DW DATARTN
|
||
|
||
;************************************************
|
||
;* ESC ROUTINE TABLE *
|
||
;************************************************
|
||
ESCCSITBL EQU $
|
||
DB '[' ;VT100 LIKE ESC
|
||
DW ESCVT
|
||
DB '=' ;ADM-3A MODE ESC
|
||
DW ESCADM
|
||
DB '*' ;CLEAR SCREEN
|
||
DW ESCHMCLR
|
||
DB '(' ;NOP
|
||
DW ESCNOP
|
||
DB 'D' ;INDEX
|
||
DW ESCIND
|
||
DB 'E' ;NEXT LINE
|
||
DW ESCNEL
|
||
DB 'M' ;REVERSE INDEX
|
||
DW ESCRI
|
||
DB ')' ;KANJI / ANK MODE
|
||
DW ESCKNJ
|
||
DB 0
|
||
DW ESC_NOP2
|
||
|
||
;************************************************
|
||
;* VT100 LIKE ESC SUBROUTINE TABLE *
|
||
;************************************************
|
||
VTRTNTBL EQU $
|
||
DB 'A' ;CURSOR UP
|
||
DW ESCVT_CUU
|
||
DB 'B' ;CURSOR DOWN
|
||
DW ESCVT_CUD
|
||
DB 'C' ;CURSOR FORWARD
|
||
DW ESCVT_CUF
|
||
DB 'D' ;CURSOR BACKWARD
|
||
DW ESCVT_CUB
|
||
DB 'H' ;CURSOR POSITION
|
||
DW ESCVT_CUP
|
||
DB 'J' ;ERASE IN DISPLAY
|
||
DW ESCVT_ED
|
||
DB 'K' ;ERASE IN LINE
|
||
DW ESCVT_EL
|
||
DB 'L' ;INSERT LINE
|
||
DW ESCVT_IL
|
||
DB 'M' ;DELETE LINE
|
||
DW ESCVT_DL
|
||
DB 'm' ;SELECT GRAPHIC RENDITION
|
||
DW ESCVT_SGR
|
||
DB 'f' ;HORIZONTAL & VERTICAL POSITION
|
||
DW ESCVT_CUP
|
||
DB 'h' ;SET MODE
|
||
DW ESCVT_SM
|
||
DB 'l' ;RESET MODE
|
||
DW ESCVT_RM
|
||
DB 'n' ;DEVICE STATUS REPORT
|
||
DW ESCVT_DSR
|
||
DB 's' ;SAVE CURSOR POSITION
|
||
DW ESCVT_PSCP
|
||
;-------------------------------------------------------------- 880504
|
||
DB 'p' ;KEYBOARD REASSIGNMENT
|
||
DW ESCVT_KASS
|
||
;---------------------------------------------------------------------
|
||
DB 'u' ;SET CURSOR POSITION
|
||
DW ESCVT_PRCP
|
||
DB '>' ;INTERMEDIATE CHAR 1
|
||
DW ESCVT_IMC1
|
||
DB '?' ;INTERMEDIATE CHAR 2
|
||
DW ESCVT_IMC2
|
||
DB '=' ;INTERMEDIATE CHAR 3
|
||
DW ESCVT_IMC3
|
||
DB 0 ;STOPPER(ILLEGAL FINAL CHAR)
|
||
DW ESCVT_NOP ;NOP
|
||
|
||
EVEN
|
||
;************************************************
|
||
;* SUBROUTINE FOR DATARTN *
|
||
;************************************************
|
||
DD_RTNTBL DW W1CHR ;W, ANK TO ANK-ANK
|
||
DW W2CHR ;W, KNJ TO ANK-ANK
|
||
DW W1CHR ;W, ANK TO ANK-KNJ
|
||
DW DD_KNJ_AL ;W, KNJ TO ANK-KNJ
|
||
DW DD_ANK_L ;W, ANK TO KNJ(L)
|
||
DW W2CHR ;W, KNJ TO KNJ
|
||
DW DD_ANK_R ;W, ANK TO KNJ(R)
|
||
DW DD_KNJ_RA ;W, KNJ TO KNJ(R)-ANK
|
||
DW DD_ANK_R ;W, ANK TO KNJ(R)
|
||
DW DD_KNJ_RL ;W, KNJ TO KNJ(R)-KNJ
|
||
|
||
|
||
PAGE
|
||
;****************************************************************
|
||
;* CONSOLE OUTPUT *
|
||
;* *
|
||
;* ENTRY: (CL)=ASCII CODE *
|
||
;* *
|
||
;****************************************************************
|
||
|
||
CRTRDY_FAR PROC FAR
|
||
CALL CRTRDY
|
||
RET
|
||
CRTRDY_FAR ENDP
|
||
|
||
CRTRDY:
|
||
MOV AX,0100H
|
||
RET
|
||
|
||
;
|
||
; VIDEO DRIVER
|
||
;
|
||
|
||
CRTOUT_FAR PROC FAR
|
||
CALL CRTOUT
|
||
RET
|
||
CRTOUT_FAR ENDP
|
||
|
||
CRTOUT:
|
||
CMP [ESCCNT],0 ;ESCAPE MODE ?
|
||
JNE CRTOUTESC ;YES
|
||
; NOT ESC_MODE
|
||
CMP CL,' ' ;CONTROL DATA ?
|
||
JB CRTOUT1 ;Y
|
||
CALL DATARTN
|
||
RET
|
||
CRTOUT1:
|
||
MOV BX,OFFSET CTLRTNTBL
|
||
CALL LOOKUP ;TABLE LOOKUP
|
||
CALL BX ;SUBROUTINE @DOS5
|
||
RET
|
||
;
|
||
; IN ESCAPE MODE
|
||
CRTOUTESC:
|
||
INC [ESCCNT]
|
||
CMP [ESCCNT],2
|
||
JNE CRTOUTESC1
|
||
MOV BX,OFFSET ESCCSITBL
|
||
CALL LOOKUP ;TABLE SEARCH
|
||
MOV [ESCSUBRTN],BX ;SAVE SUBRTN ADDRESS
|
||
CRTOUTESC1:
|
||
CALL [ESCSUBRTN]
|
||
RET
|
||
|
||
;********************************
|
||
;* TABLE LOOKUP *
|
||
;********************************
|
||
LOOKUP:
|
||
CMP BYTE PTR CS:[BX],0 ;TABLE END ?
|
||
JE LOOKUPRET ;YES
|
||
CMP CS:[BX],CL
|
||
JE LOOKUPRET ;FOUND
|
||
ADD BX,3
|
||
JMP LOOKUP
|
||
|
||
LOOKUPRET:
|
||
MOV BX,CS:1[BX] ;GET SUBROUTINE ADDRESS
|
||
RET
|
||
|
||
PAGE
|
||
;****************************************************************
|
||
;* *
|
||
;* ESCAPE SEQUENCE ROUTINES *
|
||
;* *
|
||
;****************************************************************
|
||
|
||
;****************************************
|
||
;* ADM-3A MODE ESC *
|
||
;* (ESC = L C ) *
|
||
;****************************************
|
||
ESCADM:
|
||
MOV BX,[ESCPTR]
|
||
MOV [BX],CL ;SET DATA TO BUFFER
|
||
INC [ESCPTR]
|
||
CMP [ESCCNT],4 ;DATA END ?
|
||
JB ESCADMRET ;NO
|
||
|
||
ESCADM1:
|
||
MOV BX,OFFSET ESCBUF+1
|
||
MOV CX,[BX] ;GET PARAMETER (L,C)
|
||
MOV AL,CL ;
|
||
MOV AH,[ENDLINE]
|
||
CALL CHKPOS ;CHECK LINE
|
||
MOV [CURLIN],AL
|
||
MOV AL,CH ;
|
||
MOV AH,LINEEND
|
||
CALL CHKPOS ;CHECK COLUMN
|
||
MOV [CURCOL],AL
|
||
CALL DSPCSR ;DISPLAY CURSOR
|
||
MOV [ESCCNT],0 ;EXIT ESC
|
||
ESCADMRET:
|
||
RET
|
||
|
||
;************************
|
||
;* CHECK LINE/COLUMN *
|
||
;************************
|
||
CHKPOS:
|
||
SUB AL,20H
|
||
JNB CHKPOS1 ;IF AL < 20H
|
||
MOV AL,0 ; THEN AL:=00H
|
||
CHKPOS1:
|
||
CMP AL,AH ;IF AL > LIMIT
|
||
JBE CHKPOSRET ; THEN AL:=LIMIT VALUE
|
||
MOV AL,AH
|
||
CHKPOSRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* KANJI(SHFT JIS) MODE *
|
||
;* ANK (JIS) MODE *
|
||
;****************************************
|
||
ESCKNJ:
|
||
CMP [ESCCNT],3
|
||
JNE ESCKNJRET
|
||
CMP CL,'3' ;ANK ?
|
||
JE ESCKNJ1 ;Y
|
||
CMP CL,'0' ;KANJI ?
|
||
JNE ESCKNJ2 ;N
|
||
MOV [SFTJISMOD],1
|
||
MOV [MODMARK1],' '
|
||
JMP short ESCKNJ2
|
||
ESCKNJ1:
|
||
MOV [MODMARK1],'g'
|
||
MOV [SFTJISMOD],0
|
||
ESCKNJ2:
|
||
CMP [FKYSW],0 ;
|
||
JE ESCKNJ3 ;
|
||
PUSH ES ;
|
||
MOV AX,[VRAMSEG] ;
|
||
MOV ES,AX ;
|
||
MOV DH,[ENDLINE] ;
|
||
INC DH ;
|
||
XOR DL,DL ;
|
||
CALL LCCONV ;
|
||
ADD BX,2 ;
|
||
MOV AL,[MODMARK1] ;
|
||
XOR AH,AH ;
|
||
MOV ES:[BX],AX ;
|
||
POP ES ;
|
||
ESCKNJ3:
|
||
MOV [ESCCNT],0 ;EXIT ESC MODE
|
||
ESCKNJRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* NO OPERATION ESCAPE *
|
||
;* ESC ( N *
|
||
;****************************************
|
||
ESCNOP:
|
||
CMP [ESCCNT],3
|
||
JB ESCNOPRET
|
||
MOV [ESCCNT],0 ;EXIT ESC
|
||
ESCNOPRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* SOROC MODE ESCAPE *
|
||
;* ESC * ( CLEAR SCREEN ) *
|
||
;****************************************
|
||
ESCHMCLR:
|
||
CALL CLRRTN ;CLEAR SCREEN
|
||
MOV [ESCCNT],0 ;EXIT ESC
|
||
RET
|
||
|
||
;****************************************
|
||
;* NEXT LINE (ANSI COMPATIBLE) *
|
||
;* ESC E *
|
||
;* INDEX (ANSI COMPATIBLE) *
|
||
;* ESC D *
|
||
;****************************************
|
||
ESCNEL:
|
||
CALL CRRTN
|
||
ESCIND: CALL LFRTN
|
||
ESC_NOP2:
|
||
MOV [ESCCNT],0
|
||
RET
|
||
|
||
;****************************************
|
||
;* REVERSE INDEX (ANSI COMPATIBLE) *
|
||
;* ESC M *
|
||
;****************************************
|
||
ESCRI:
|
||
CMP [CURLIN],0 ;TOP MARJIN ?
|
||
JE ESCRI1 ;YES
|
||
DEC [CURLIN]
|
||
CALL DSPCSR
|
||
JMP SHORT ESCRI2
|
||
ESCRI1:
|
||
CALL ROLDOWN ;SCROLL DOWN 1 LINE
|
||
ESCRI2:
|
||
MOV [ESCCNT],0
|
||
RET
|
||
|
||
PAGE
|
||
;************************************************
|
||
;* ESCVT: ANSI MODE ESC SEQUENCE *
|
||
;* ESC [ ... *
|
||
;* *
|
||
;************************************************
|
||
;
|
||
ESCVT:
|
||
CMP [ESCCNT],2
|
||
JE ESCVTRET
|
||
|
||
CMP CL,';' ;SEPARATER ?
|
||
JE ESCVT_SP ;YES
|
||
;-------------------------------------------------------------- 880504
|
||
CMP CL,"'"
|
||
JE ESCVT_QUAT ;QUATATION (FOR KB-REASS)
|
||
CMP CL,'"'
|
||
JE ESCVT_QUAT ;QUATATION (FOR KB-REASS)
|
||
CMP [SRMFLG],-1 ;CHAR MODE?
|
||
JE ESCVT_CHAR ;YES
|
||
;---------------------------------------------------------------------
|
||
CMP CL,3AH ;NUMERIC ?
|
||
JNB ESCVT_EX ;NO, TREAT FINAL CHAR
|
||
AND CL,0FH
|
||
CMP CL,09H ;CL >= 09H ?
|
||
JBE ESCVT_NUM ;NO
|
||
ESCVT_EX:
|
||
MOV BX,OFFSET VTRTNTBL ;TABLE ADDR
|
||
CALL LOOKUP
|
||
MOV SI,OFFSET ESCBUF ;SET BUFFER OFFSET
|
||
CALL BX ;SUBROUTINE
|
||
CMP [SRMFLG],0 ;CONTINUE ?
|
||
JNE ESCVTRET ;JUMP IF 'ESC [ >'
|
||
MOV [ESCCNT],0 ;EXIT ESC
|
||
ESCVTRET:
|
||
RET
|
||
|
||
; NUMERIC PARAMETER
|
||
ESCVT_NUM:
|
||
MOV BX,[ESCPTR]
|
||
MOV AX,10
|
||
MUL WORD PTR[BX]
|
||
AND CX,0FH
|
||
ADD AX,CX
|
||
MOV [BX],AX
|
||
RET
|
||
|
||
; SEPARATER PROC
|
||
ESCVT_SP:
|
||
ADD [ESCPTR],2
|
||
INC [ESCPRM] ;PARAM COUNT
|
||
CMP [ESCPRM],ESCBUFSIZ ;BUFFER FULL ?
|
||
JBE ESCVT_SP1 ;NO
|
||
MOV [ESCCNT],0 ;EXIT ESC
|
||
ESCVT_SP1:
|
||
RET
|
||
|
||
;-------------------------------------------------------------- 880504
|
||
ESCVT_QUAT:
|
||
XOR [SRMFLG],-1 ;FLIP QUATATION FLAG
|
||
JZ ESCVT_QUATRET
|
||
SUB [ESCPTR],2 ;ADJUST POINTER
|
||
DEC [ESCPRM] ;ADJUST COUNTER
|
||
ESCVT_QUATRET:
|
||
RET
|
||
|
||
ESCVT_CHAR:
|
||
ADD [ESCPTR],2
|
||
INC [ESCPRM] ;PARAM COUNT
|
||
CMP [ESCPRM],ESCBUFSIZ ;BUFFER FULL ?
|
||
JBE ESCVT_CHR1 ;NO
|
||
MOV [ESCCNT],0 ;EXIT ESC
|
||
RET
|
||
ESCVT_CHR1:
|
||
MOV BX,[ESCPTR] ;GET POINTER
|
||
MOV [BX],CL
|
||
RET
|
||
|
||
;---------------------------------------------------------------------
|
||
PAGE
|
||
;****************************************
|
||
;* CURSOR UP *
|
||
;* ESC [ PN A *
|
||
;****************************************
|
||
ESCVT_CUU:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_CUURET
|
||
MOV CX,[SI] ;GET PRM
|
||
MOV AL,[CURLIN]
|
||
XOR AH,AH
|
||
AND CX,CX ;PARAM = 0 ?
|
||
JNZ ESCVT_CUU1
|
||
MOV CX,1 ;TREAT CX=1
|
||
ESCVT_CUU1:
|
||
CMP AX,CX
|
||
JNB ESCVT_CUU2
|
||
MOV CX,AX
|
||
ESCVT_CUU2:
|
||
SUB [CURLIN],CL
|
||
CALL DSPCSR
|
||
ESCVT_CUURET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* CURSOR DOWN *
|
||
;* ESC [ PN B *
|
||
;****************************************
|
||
ESCVT_CUD:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_CUDRET
|
||
MOV CX,[SI] ;GET PARAM
|
||
MOV AL,[ENDLINE]
|
||
SUB AL,[CURLIN]
|
||
XOR AH,AH
|
||
AND CX,CX ;PARAM = 0 ?
|
||
JNZ ESCVT_CUD1
|
||
MOV CX,1 ;TREAT CX = 1
|
||
ESCVT_CUD1:
|
||
CMP AX,CX
|
||
JNB ESCVT_CUD2
|
||
MOV CX,AX
|
||
ESCVT_CUD2:
|
||
ADD [CURLIN],CL
|
||
CALL DSPCSR
|
||
ESCVT_CUDRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* CURSOR FOREWARD *
|
||
;* ESC [ PN C *
|
||
;****************************************
|
||
ESCVT_CUF:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_CUFRET
|
||
MOV CX,[SI] ;GET PARAM
|
||
MOV AX,LINEEND
|
||
SUB AL,[CURCOL]
|
||
;----------------------------------------------- DOS5 91/02/19 -------
|
||
;PATCH FIX
|
||
JC ESCVT_CUF3
|
||
;---------------------------------------------------------------------
|
||
AND CX,CX ;PARAM = 0 ?
|
||
JNZ ESCVT_CUF1
|
||
MOV CX,1
|
||
ESCVT_CUF1:
|
||
CMP AX,CX
|
||
JNB ESCVT_CUF2
|
||
MOV CX,AX
|
||
ESCVT_CUF2:
|
||
ADD [CURCOL],CL
|
||
;----------------------------------------------- DOS5 91/02/19 -------
|
||
;PATCH FIX
|
||
ESCVT_CUF3:
|
||
;---------------------------------------------------------------------
|
||
CALL DSPCSR
|
||
ESCVT_CUFRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* CURSOR BACKWARD *
|
||
;* ESC [ PN D *
|
||
;****************************************
|
||
ESCVT_CUB:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_CUBRET
|
||
MOV CX,[SI] ;GET PARAM
|
||
MOV AL,[CURCOL]
|
||
XOR AH,AH
|
||
AND CX,CX ;PARAM = 0 ?
|
||
JNZ ESCVT_CUB1
|
||
MOV CX,1
|
||
ESCVT_CUB1:
|
||
CMP AX,CX
|
||
JNB ESCVT_CUB2
|
||
MOV CX,AX
|
||
ESCVT_CUB2:
|
||
SUB [CURCOL],CL
|
||
CALL DSPCSR
|
||
ESCVT_CUBRET:
|
||
RET
|
||
|
||
PAGE
|
||
;****************************************
|
||
;* CURSOR POSITION *
|
||
;* ESC [ PL ;PC H *
|
||
;* ESC [ PL ;PC F *
|
||
;****************************************
|
||
ESCVT_CUP:
|
||
CMP [SRMFLG],0 ;SET/RESET MODE ?
|
||
JNE ESCVT_CUPRET ;Y (ILLEGAL ESC)
|
||
CMP [ESCPRM],2
|
||
JB ESCVT_CUPHOM ;NO OPERATION
|
||
MOV AX,[SI] ;GET PARAM (LINE)
|
||
MOV CL,[ENDLINE]
|
||
CALL CHKPOS_VT
|
||
MOV [CURLIN],AL ;SET LINE
|
||
MOV AX,2[SI] ;GET PARAM (COLUMN)
|
||
MOV CL,LINEEND
|
||
CALL CHKPOS_VT
|
||
MOV [CURCOL],AL ;SET COLUMN
|
||
CALL DSPCSR ;DISPLAY CURSOR
|
||
RET
|
||
; CURSOR HOME
|
||
ESCVT_CUPHOM:
|
||
XOR AX,AX
|
||
CMP AX,[SI] ;PARAM = 00H ?
|
||
JNE ESCVT_CUPRET
|
||
CALL HOMERTN ;CURSOR HOME
|
||
ESCVT_CUPRET:
|
||
MOV [SRMFLG],0
|
||
RET
|
||
|
||
;********************************
|
||
;* CHECK LINE/COLUMN *
|
||
;********************************
|
||
CHKPOS_VT:
|
||
AND AX,AX
|
||
JZ CKPSVT_RET
|
||
DEC AX ;PARAM - 1
|
||
JZ CKPSVT_RET
|
||
XOR CH,CH
|
||
CMP CX,AX
|
||
JNB CKPSVT_RET
|
||
MOV AL,CL
|
||
CKPSVT_RET:
|
||
RET
|
||
|
||
PAGE
|
||
;****************************************
|
||
;* ERASE IN DISPLAY *
|
||
;* ESC [ PS 'J' *
|
||
;****************************************
|
||
ESCVT_ED:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_EDRET ;NO OPERATION
|
||
MOV AX,[SI] ;GET PARAM
|
||
AND AX,AX ;TEST FOR AX=0
|
||
JZ ESCVT_ED0
|
||
DEC AX ;TEST FOR AX=1
|
||
JZ ESCVT_ED1
|
||
DEC AX ;TEST FOR AX=2
|
||
JNZ ESCVT_EDRET ;ILLEGAL PARAM (NO OPERATION)
|
||
; PARAM = 2 (ERASE ALL OF THE DISPLAY (CURSOR DOES NOT MOVE))
|
||
CALL CLRRTN
|
||
JMP short ESCVT_EDRET ;
|
||
|
||
; PARAM = 1 (ERASE FROM THE START OF SCREEN TO THE ACTIVE POSITION)
|
||
ESCVT_ED1:
|
||
CALL PATNCHK ;VRAM PATTERN CHECK
|
||
SHR BX,1
|
||
INC BX
|
||
MOV CX,BX ;SIZE
|
||
XOR DI,DI ;START ADDR
|
||
CMP AL,2 ;IF ACTIVE POS. = KANJI(L)
|
||
JNE ESCVT_ED000 ; THEN ..
|
||
INC CX
|
||
JMP short ESCVT_ED000 ;
|
||
|
||
; PARAM = 0 ( ERASE FROM THE ACTIVE POSITION TO THE END OF SCREEN)
|
||
ESCVT_ED0:
|
||
CALL PATNCHK
|
||
MOV DI,BX ;START ADDR
|
||
SHR BX,1
|
||
MOV CX,CRTSIZE
|
||
SUB CX,BX ;SIZE
|
||
CMP AL,3
|
||
JB ESCVT_ED000
|
||
SUB DI,2
|
||
INC CX
|
||
ESCVT_ED000:
|
||
CALL CRTCLR
|
||
CALL DSPFKY ;IF FKYSW=1
|
||
ESCVT_EDRET: ;
|
||
RET
|
||
|
||
|
||
;****************************************
|
||
;* ERASE IN LINE *
|
||
;* ESC [ PS 'K' *
|
||
;****************************************
|
||
ESCVT_EL:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_ELRET
|
||
MOV AX,[SI] ;GET PARAM
|
||
AND AX,AX ;TEST FOR AX=0
|
||
JZ ESCVT_EL0
|
||
DEC AX ;TEST FOR AX=1
|
||
JZ ESCVT_EL1
|
||
DEC AX ;TEST FOR AX=2
|
||
JNZ ESCVT_ELRET ;ILLEGAL PARAM (NO OPERATION)
|
||
|
||
; PARAM = 2 (ERASE ALL OF THE LINE)
|
||
MOV DH,[CURLIN]
|
||
CALL LINECLR ;ERASE ALL OF THE LINE
|
||
JMP short ESCVT_ELRET ;
|
||
|
||
; PARAM = 1 (ERASE FROM THE START OF THE LINE TO THE ACTIVE POS.)
|
||
ESCVT_EL1:
|
||
CALL PATNCHK
|
||
MOV DH,[CURLIN]
|
||
MOV DL,0
|
||
CALL LCCONV
|
||
MOV DI,BX ;START ADDR
|
||
MOV CL,[CURCOL] ;SIZE
|
||
XOR CH,CH
|
||
INC CX
|
||
CMP AL,2
|
||
JNE ESCVT_EL01 ;
|
||
INC CX
|
||
JMP short ESCVT_EL01 ;
|
||
|
||
; PARAM = 0 (ERASE FROM THE ACTIVE POSITION TO THE END OF LINE)
|
||
ESCVT_EL0:
|
||
CALL PATNCHK
|
||
MOV DI,BX ;START ADDR
|
||
MOV BL,[CURCOL]
|
||
XOR BH,BH
|
||
MOV CX,LINESIZE
|
||
SUB CX,BX ;SIZE
|
||
CMP AL,3
|
||
JB ESCVT_EL01
|
||
SUB DI,2
|
||
INC CX
|
||
ESCVT_EL01:
|
||
CALL CRTCLR
|
||
ESCVT_ELRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* SELECT GRAPHIC RENDITION *
|
||
;* ESC [ PN ;... ;PN 'M' *
|
||
;****************************************
|
||
ESCVT_SGR:
|
||
MOV DH,00H ; 89/08/21
|
||
MOV AH,01H ;WORK INITIALIZE
|
||
MOV [SGRFLG],0FFH
|
||
MOV SI,OFFSET ESCBUF
|
||
MOV CL,[ESCPRM] ;NUMBER OF PARAMETER
|
||
XOR CH,CH
|
||
ESCVT_SGR1:
|
||
MOV BX,[SI] ;GET PARAM
|
||
ADD SI,2
|
||
CMP BX,48 ;CHECK PARAM
|
||
JNB ESCVT_SGR3 ;ILLEGAL PARAM
|
||
CMP BX,8 ;SECRET ?
|
||
JE ESCVT_SGR21 ;Y
|
||
CMP BX,16 ;SECRET ?
|
||
JNE ESCVT_SGR22
|
||
ESCVT_SGR21:
|
||
AND AH,0FEH ;SET SECRET
|
||
JMP short ESCVT_SGR24
|
||
ESCVT_SGR22:
|
||
CMP BX,30 ;BLACK ?
|
||
JE ESCVT_SGR23 ;Y
|
||
;----------------------------------------------------- 89/08/16 ---
|
||
CMP BX,40
|
||
JB VT_SGR210
|
||
VT2AT010:
|
||
TEST ATTRF,0001H
|
||
JNZ VT_SGR210
|
||
AND DH,8FH
|
||
ADD BX,OFFSET ATTRTBL2
|
||
MOV DL,[BX]
|
||
OR DH,DL
|
||
JMP short ESCVT_SGR3
|
||
VT_SGR210:
|
||
;--------------------------------------------------------------------
|
||
CMP BX,40 ;REVERSE BLACK ?
|
||
JNE ESCVT_SGR24
|
||
ESCVT_SGR23:
|
||
MOV [SGRFLG],1FH ;SET BLACK STATE
|
||
ESCVT_SGR24:
|
||
CMP BX,17
|
||
JB ESCVT_SGR25
|
||
AND AH,1FH
|
||
ESCVT_SGR25:
|
||
ADD BX,OFFSET ESCATTRTBL
|
||
MOV AL,[BX] ;GET ATTRIBUTE
|
||
OR AH,AL
|
||
ESCVT_SGR3:
|
||
LOOP ESCVT_SGR1
|
||
|
||
TEST AH,0E0H
|
||
JNZ ESCVT_SGR4
|
||
MOV AL,[DEFATTR] ;DEFAULT ATTRIBUTE
|
||
AND AL,0FEH ;RESET SECRET FLAG
|
||
OR AH,AL
|
||
AND AH,[SGRFLG]
|
||
ESCVT_SGR4:
|
||
MOV [CURATTR],AH ;SET ATTRIBUTE
|
||
MOV DL,AH ; 89/08/16
|
||
MOV [CURATTR2],DX ;SET 2BYTE ATTRIBUTE 89/08/16
|
||
RET
|
||
|
||
;****************************************
|
||
;* INSERT LINE *
|
||
;* ESC [ PN L *
|
||
;****************************************
|
||
ESCVT_IL:
|
||
CMP [SRMFLG],0 ;SET/RESET MODE ?
|
||
JNE ESCVT_ILRET ;Y (ILLEGAL ESC)
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_ILRET
|
||
MOV CX,[SI] ;GET PARAM
|
||
AND CX,CX ;PARAM = 0 ?
|
||
JNZ ESCVT_IL1
|
||
MOV CX,1 ;TREAT CX = 1
|
||
ESCVT_IL1:
|
||
PUSH CX
|
||
MOV AH,[CURLIN] ;CURRENT LINE #
|
||
CALL MLINEDWN ;ROLL DOWN
|
||
POP CX
|
||
LOOP ESCVT_IL1
|
||
CALL CRRTN ;CARRIAGE RETURN
|
||
ESCVT_ILRET:
|
||
MOV [SRMFLG],0
|
||
RET
|
||
|
||
;****************************************
|
||
;* DELETE LINE *
|
||
;* ESC [ PN M *
|
||
;****************************************
|
||
ESCVT_DL:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_DLRET
|
||
MOV CX,[SI] ;GET PARAM
|
||
AND CX,CX ;PARAM = 0 ?
|
||
JNZ ESCVT_DL1
|
||
MOV CX,1 ;TREAT CX =1
|
||
ESCVT_DL1:
|
||
PUSH CX
|
||
MOV AH,[CURLIN] ;CURRENT LINE #
|
||
CALL MLINEUP ;ROLL UP
|
||
POP CX
|
||
LOOP ESCVT_DL1
|
||
CALL CRRTN ;CARRIAGE RETURN
|
||
ESCVT_DLRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* INTERMEDIATE CHARACTER *
|
||
;* ESC [ > OR ESC [ ? *
|
||
;****************************************
|
||
ESCVT_IMC1: ;'>'
|
||
MOV [SRMFLG],1
|
||
RET
|
||
|
||
ESCVT_IMC2: ;'?'
|
||
MOV [SRMFLG],2
|
||
RET
|
||
|
||
ESCVT_IMC3: ;'='
|
||
MOV [SRMFLG],3
|
||
RET
|
||
|
||
;****************************************
|
||
;* RESET MODE *
|
||
;* ESC [ XX L *
|
||
;****************************************
|
||
ESCVT_RM:
|
||
CMP [ESCPRM],1
|
||
JE ESCVT_01
|
||
JMP ESCVT_RMRET
|
||
ESCVT_01:
|
||
MOV AX,[SI] ;GET PARAM
|
||
CMP [SRMFLG],1
|
||
JA ESCVT_DEL
|
||
JB ESCVT_0
|
||
CMP AX,1
|
||
JNE ESCVT_1
|
||
MOV [FKYSW],0
|
||
CALL FKYDSP ;DISABLE BOTTOM LINE
|
||
ESCVT_0:
|
||
JMP short ESCVT_RMRET
|
||
ESCVT_1:
|
||
CMP AX,3
|
||
JNE ESCVT_CON
|
||
;-----------------------------------------------------870825--------------
|
||
; MOV LINMOD,1
|
||
;----------------
|
||
MOV CL,1 ;
|
||
TEST [SYS_501],00001000B ;HW MODE ?
|
||
JNZ ESCVT_1HN ;IF H-MODE
|
||
MOV CL,0 ; THEN LINMOD = 1
|
||
ESCVT_1HN: ; ELSE LINMOD = 0
|
||
MOV [LINMOD],CL ;SET FLAG
|
||
;-------------------------------------------------------------------------
|
||
CALL CHGLIN
|
||
JMP short ESCVT_RMRET
|
||
ESCVT_CON:
|
||
CMP AX,5 ;PARAM = 5 ?
|
||
JNE ESCVT_RMRET ;NO
|
||
MOV [CSRSW],1 ;CURSOR ON
|
||
MOV AH,11H ;85.02.01
|
||
INT 18H ;85.02.01
|
||
CALL DSPCSR
|
||
JMP short ESCVT_RMRET
|
||
ESCVT_DEL:
|
||
CMP [SRMFLG],2
|
||
JA ESCVT_RMRET ;SRMFLG > 2 , IGNORE
|
||
CMP AX,7 ;PARAM = 7 ?
|
||
;----------------------------------------------------- 89/08/16 ---
|
||
JNE VT_RM010 ;NO
|
||
MOV [WRAPMOD],1 ;"DISCARD AT END OF LINE"
|
||
JMP short ESCVT_RMRET
|
||
VT_RM010:
|
||
;----------------------------------------------- DOS5A 92/10/01 ------
|
||
;<patch BIOS50-P27>
|
||
extrn patch10:near
|
||
|
||
call patch10
|
||
db 2 dup (90h)
|
||
;---------------
|
||
; TEST byte PTR [BIOSF_3],80H ;NPC CHECK 89/08/21
|
||
;---------------------------------------------------------------------
|
||
JZ ESCVT_RMRET ;NO JMP 89/08/21
|
||
CMP AX,5 ;1BYTE ATTRIBUTE
|
||
JNE VT_RM020
|
||
TEST ATTRF,0001H
|
||
JNZ ESCVT_RMRET
|
||
MOV AX,0001H
|
||
CALL CRTMD1AT ;1BYTE ATTR SET
|
||
JMP SHORT ESCVT_RMRET
|
||
VT_RM020:
|
||
CMP AX,3 ;400 DOT MODE
|
||
JNE ESCVT_RMRET
|
||
TEST CRTDOTF,0001H
|
||
JNZ ESCVT_RMRET
|
||
MOV AX,0011H
|
||
CALL CRTMD400
|
||
;--------------------------------------------------------------------
|
||
ESCVT_RMRET:
|
||
MOV [SRMFLG],0
|
||
RET
|
||
|
||
;****************************************
|
||
;* SET MODE *
|
||
;* ESC [ XX H *
|
||
;****************************************
|
||
ESCVT_SM:
|
||
CMP [ESCPRM],1
|
||
JE ESCVT_SM10
|
||
JMP ESCVT_SMRET
|
||
ESCVT_SM10:
|
||
MOV AX,[SI] ;GET PARAM
|
||
CMP [SRMFLG],1
|
||
JA ESCVT_WEL
|
||
JB ESCVT_SM15
|
||
CMP AX,1
|
||
JNE ESCVT_L25 ;------------- H/N DOS --------
|
||
MOV [FKYSW],2
|
||
CALL FKYDSP ;ENABLE BOTTOM LINE
|
||
ESCVT_SM15:
|
||
JMP short ESCVT_SMRET
|
||
;----------------------------- SELECT 20LINE (NORMAL MODE) ------------
|
||
ESCVT_L25:
|
||
CMP AX,3 ;PARAM = 3 ?
|
||
JNE ESCVT_COF ;NO, NEXT
|
||
TEST [SYS_501],00001000B ;NORMAL MODE ?
|
||
JNZ ESCVT_SMRET ;NO, IGNORE
|
||
;--------------------------------------------------------- 90/03/19 --
|
||
CMP CRTDOTF,0000H ;480 DOT 89/08/16
|
||
JZ ESCVT_SMRET ;THEN JMP 89/08/16
|
||
;---------------------------------------------------------------------
|
||
MOV [LINMOD],1 ;
|
||
CALL CHGLIN ;CHG LINMOD 0 -> 1
|
||
JMP short ESCVT_SMRET
|
||
;----------------------------------------------------------------------
|
||
ESCVT_COF:
|
||
CMP AX,5 ;PARAM = 5 ?
|
||
JNE ESCVT_SMRET
|
||
MOV [CSRSW],0 ;CURSOR OFF
|
||
MOV AH,12H ;
|
||
INT 18H ;BIOS
|
||
JMP short ESCVT_SMRET
|
||
ESCVT_WEL:
|
||
CMP [SRMFLG],2
|
||
JA ESCVT_SMRET ;SRMFLG > 2 , IGNORE
|
||
CMP AX,7
|
||
;----------------------------------------------------- 89/08/16 ---
|
||
JNE VT_SM010
|
||
MOV [WRAPMOD],0 ;"WRAP AROUND AT END OF LINE"
|
||
JMP short ESCVT_SMRET
|
||
VT_SM010:
|
||
;
|
||
;----------------------------------------------- DOS5A 92/10/01 ------
|
||
;<patch BIOS50-P27>
|
||
extrn patch10:near
|
||
|
||
call patch10
|
||
db 2 dup (90h)
|
||
;---------------
|
||
; TEST byte PTR [BIOSF_3],80H ;NPC CHECK 89/08/21
|
||
;---------------------------------------------------------------------
|
||
JZ ESCVT_SMRET ;NO JMP 89/08/21
|
||
CMP AX,5 ; 2BYTE ATTR
|
||
JNE VT_SM020
|
||
TEST WORD PTR ATTRF,0001H
|
||
JE ESCVT_SMRET
|
||
MOV AX,0000H
|
||
CALL CRTMD2AT ; 2BYTE ATTR SET
|
||
JMP SHORT ESCVT_SMRET
|
||
VT_SM020:
|
||
CMP AX,3 ;480 MODE
|
||
JNE ESCVT_SMRET
|
||
TEST WORD PTR CRTDOTF,0001H
|
||
JE ESCVT_SMRET
|
||
MOV AX,0010H
|
||
CALL CRTMD480 ;480DOT SET
|
||
;--------------------------------------------------------------------
|
||
ESCVT_SMRET:
|
||
MOV [SRMFLG],0
|
||
RET
|
||
|
||
;****************************************
|
||
;* DEVICE STATUS REPORT *
|
||
;* --> CURSOR POSITION REPORT *
|
||
;* ESC [ 6 N --> ESC [ PL ;PC R *
|
||
;****************************************
|
||
ESCVT_DSR:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_DSRRET
|
||
MOV AX,[SI]
|
||
CMP [SRMFLG],1
|
||
JNE ESCVT_DSR10
|
||
CMP AX,3
|
||
JNE ESCVT_DSR10
|
||
;--------------------------------------- ADD H/W MODE CHECK ------------
|
||
TEST [SYS_501],00001000B ;HIRESO MODE ?
|
||
JZ ESCVT_SMRET ;NO, IGNORE
|
||
;-----------------------------------------------------------------------
|
||
MOV [LINMOD],0
|
||
CALL CHGLIN
|
||
JMP ESCVT_SMRET ;
|
||
ESCVT_DSR10:
|
||
CMP AX,6 ;PARAM = 6 ?
|
||
JNE ESCVT_DSRRET ;NO, ILLEGAL
|
||
MOV AL,[CURLIN]
|
||
MOV AH,[CURCOL]
|
||
CALL BINDEC
|
||
MOV [ESCCPRLIN],AX ;SET LINE
|
||
MOV AL,[CURCOL]
|
||
CALL BINDEC
|
||
MOV [ESCCPRCOL],AX ;SET COLUMN
|
||
MOV [FKYCNT],8
|
||
MOV [FKYPTR],OFFSET ESCCPRBUF
|
||
ESCVT_DSRRET:
|
||
RET
|
||
;
|
||
;*** SUBROUTINE
|
||
BINDEC: ;BINARY TO DECIMAL(ASCII)
|
||
INC AL
|
||
XOR AH,AH
|
||
MOV CL,10
|
||
DIV CL
|
||
OR AX,3030H
|
||
RET
|
||
|
||
;****************************************
|
||
;* SAVE CURSOR POSITION (WITH ATTR) *
|
||
;* ESC [ S *
|
||
;****************************************
|
||
ESCVT_PSCP:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_PSCPRET
|
||
MOV AX,[SI] ;GET PARAM
|
||
AND AX,AX
|
||
JNZ ESCVT_PSCPRET
|
||
MOV AL,[CURLIN]
|
||
MOV AH,[CURCOL]
|
||
MOV [ESCPOSSAVE],AX ;SAVE
|
||
MOV AX,[CURATTR2] ; 89/08/16
|
||
MOV [ATRSAVE2],AX ; 89/08/16
|
||
MOV AL,[CURATTR] ;GET CURR. ATTRIBUTE
|
||
MOV [ESCATRSAVE],AL
|
||
ESCVT_PSCPRET:
|
||
RET
|
||
|
||
;****************************************
|
||
;* SET CURSOR POSITION (WITH ATTR) *
|
||
;* ESC [ U *
|
||
;****************************************
|
||
ESCVT_PRCP:
|
||
CMP [ESCPRM],1
|
||
JNE ESCVT_PRCPRET
|
||
MOV AX,[SI] ;GET PARAM
|
||
AND AX,AX
|
||
JNZ ESCVT_PRCPRET
|
||
MOV AX,[ESCPOSSAVE] ;GET SAVED LINE/COLUMN
|
||
MOV [CURLIN],AL
|
||
MOV [CURCOL],AH
|
||
MOV AX,[ATRSAVE2] ; 89/08/16
|
||
MOV [CURATTR2],AX ; 89/08/16
|
||
MOV AL,[ESCATRSAVE] ;GET SAVED ATTRIBUTE
|
||
MOV [CURATTR],AL
|
||
CALL DSPCSR
|
||
ESCVT_PRCPRET:
|
||
RET
|
||
|
||
;-------------------------------------------------------------- 880504
|
||
;****************************************
|
||
;* KEYBOARD REASSIGNMENT *
|
||
;* ESC [ xxxxxxxxxx p *
|
||
;****************************************
|
||
ESCVT_KASS:
|
||
;;;; CMP [ESCPRM],1 ;COMMENT ------ 880520
|
||
;;;; JE ESCVT_KASSRET ;COMMENT ------ 880520
|
||
|
||
PUSH ES
|
||
mov ES,cs:[bdata_seg] ; @dos5
|
||
|
||
MOV SI,OFFSET ESCBUF
|
||
MOV DI,SI ;DI := ESCBUF ADDR
|
||
MOV CX,0001
|
||
ADD SI,2
|
||
ESCVT_KA00:
|
||
LODSW ;GET CHAR LENGTH
|
||
OR AX,AX
|
||
JZ ESCVT_KA05
|
||
INC CX
|
||
JMP ESCVT_KA00
|
||
ESCVT_KA05:
|
||
MOV SI,DI
|
||
PUSH CX
|
||
ESCVT_KA10:
|
||
MOVSB ;PACK PARAMETER (WORD TO BYTE)
|
||
INC SI ;WORD
|
||
LOOP ESCVT_KA10
|
||
POP CX
|
||
|
||
MOV SI,DI
|
||
DEC SI ;SI = LAST CHAR
|
||
INC DI ;DI = LAST CHAR + 2
|
||
XOR AX,AX
|
||
MOV AH,BYTE PTR [ESCBUF] ;GET FIRST CHAR
|
||
OR AH,AH
|
||
JNZ ESCVT_KA20 ;NOT SPECIAL KEY
|
||
DEC CL
|
||
DEC DI ;DI = LAST CHAR + 1
|
||
MOV AL,BYTE PTR [ESCBUF+1]
|
||
ESCVT_KA20:
|
||
PUSH CX
|
||
STD
|
||
REP MOVSB ;PARAM SHIFT TO RIGHT
|
||
CLD
|
||
POP CX
|
||
ADD CX,2 ;ADJUST ENTRY SIZE
|
||
MOV BYTE PTR [ESCBUF],CL ;SET LENGTH OF ENTRY
|
||
MOV WORD PTR [ESCBUF+1],AX ;SET CHAR
|
||
|
||
MOV CL,13 ;SET SOFT KEY FUNCTION
|
||
MOV DX,OFFSET ESCBUF
|
||
MOV AX,0101H ;ADD DATA KEY
|
||
INT 220
|
||
|
||
POP ES
|
||
ESCVT_KASSRET:
|
||
RET
|
||
;---------------------------------------------------------------------
|
||
|
||
;********************************
|
||
;* NO OPERATION *
|
||
;********************************
|
||
ESCVT_NOP:
|
||
RET
|
||
|
||
PAGE
|
||
;********************************************************
|
||
;* *
|
||
;* ASCII CONTROL CODE *
|
||
;* *
|
||
;********************************************************
|
||
|
||
;************************************************
|
||
;* *
|
||
;* ESCAPE 1B(^[) *
|
||
;* *
|
||
;************************************************
|
||
ESCRTN:
|
||
PUSH ES ;
|
||
MOV [ESCPTR],OFFSET ESCBUF
|
||
MOV [ESCCNT],1 ;ENTER ESC_MODE
|
||
MOV [ESCPRM],1
|
||
MOV DI,OFFSET ESCBUF
|
||
MOV AX,0
|
||
MOV CX,ESCBUFSIZ
|
||
MOV DX,DS
|
||
MOV ES,DX ;DEST. SEGMENT
|
||
REP STOSW ;
|
||
POP ES ;
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* BELL 07(^G) *
|
||
;* *
|
||
;************************************************
|
||
BELRTN_FAR PROC FAR
|
||
CALL BELRTN
|
||
RET
|
||
BELRTN_FAR ENDP
|
||
|
||
BELRTN:
|
||
MOV AH,17H ;
|
||
INT 18H ;BUZZER ON
|
||
MOV CX,05A64H+1428H ;SET COUNTER
|
||
BEL1:
|
||
BEL2:
|
||
PUSH AX
|
||
NOP
|
||
POP AX
|
||
LOOP BEL2 ;ABOUT 0.5 SEC
|
||
|
||
MOV AH,18H ;
|
||
INT 18H ;BUZZER OFF
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* HORIZONTAL TAB 09(^I) *
|
||
;* *
|
||
;************************************************
|
||
TABRTN:
|
||
MOV AL,[CURCOL]
|
||
ADD AL,8 ;
|
||
MOV CL,3 ; AX = (AL+8) / 8 * 8
|
||
SHR AL,CL ;
|
||
MOV CL,8 ;
|
||
MUL CL ;
|
||
MOV [CURCOL],AL
|
||
CMP AL,LINEEND
|
||
JB TAB1
|
||
MOV [CURCOL],LINEEND
|
||
CALL FSRTN ;NEXT LINE
|
||
RET
|
||
|
||
TAB1: CALL DSPCSR
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CURSOR BACKWARD 0B(^H) *
|
||
;* *
|
||
;************************************************
|
||
BSRTN:
|
||
CMP [CURCOL],0
|
||
JE BS1
|
||
DEC [CURCOL] ;COLUMN - 1
|
||
JMP SHORT BS2
|
||
|
||
BS1: CMP [CURLIN],0 ;CURSOR = HOME POSITION ?
|
||
JE BSRTNRET ;YES (NOP)
|
||
DEC [CURLIN] ;LINE - 1
|
||
MOV [CURCOL],LINEEND
|
||
BS2: CALL DSPCSR ;DISPLAY CURSOR
|
||
BSRTNRET:
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CURSOR UP 0B(^K) *
|
||
;* *
|
||
;************************************************
|
||
UPRTN:
|
||
CMP [CURLIN],0 ;LINE = 0 ?
|
||
JE UPRTNRET ;YES. (NOP)
|
||
DEC [CURLIN] ;LINE - 1
|
||
CALL DSPCSR ;CURSOR DISPLAY 83/2/14
|
||
UPRTNRET:
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* LINE FEED 0A(^J) *
|
||
;* *
|
||
;************************************************
|
||
LFRTN:
|
||
MOV AL,[CURLIN] ;
|
||
CMP AL,[ENDLINE] ;CURRENT LINE = ENDLINE ?
|
||
JE LF1 ;YES.
|
||
INC [CURLIN] ;LINE + 1
|
||
CALL DSPCSR ;DISPLAY CURSOR
|
||
RET
|
||
|
||
LF1: CALL ROLLUP ;SCROLL UP
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CARRIAGE RETURN 0D(^M) *
|
||
;* *
|
||
;************************************************
|
||
CRRTN:
|
||
MOV [CURCOL],0
|
||
CALL DSPCSR ;DISPLAY CURSOR
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CURSOR HOME 1E(^^) *
|
||
;* *
|
||
;************************************************
|
||
HOMERTN_FAR PROC FAR
|
||
CALL HOMERTN
|
||
RET
|
||
HOMERTN_FAR ENDP
|
||
|
||
HOMERTN:
|
||
MOV [CURLIN],0 ;HOME POSITION
|
||
MOV [CURCOL],0 ; LINE = 0 COLUMN = 0
|
||
CALL DSPCSR ;DISPLAY CURSOR
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CLEAR SCREEN 1A(^Z) *
|
||
;* *
|
||
;* NOTE: CURSOR DOES NOT MOVE *
|
||
;* *
|
||
;************************************************
|
||
CLRRTN_FAR PROC FAR
|
||
CALL CLRRTN
|
||
RET
|
||
CLRRTN_FAR ENDP
|
||
|
||
|
||
CLRRTN:
|
||
XOR DI,DI ;POS.
|
||
MOV CX,CRTSIZE
|
||
CALL CRTCLR ;ERASE ALL OF THE DISPLAY
|
||
CALL DSPFKY ;DISPLAY FUNCTION KEYS
|
||
CALL HOMERTN ;CURSOR MOVES TO HOME POS.
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CURSOR FOREWARD 0C(^L) *
|
||
;* *
|
||
;************************************************
|
||
|
||
FSRTN:
|
||
INC [CURCOL] ;COLUMN + 1
|
||
CMP [CURCOL],LINEEND ;END OF LINE ?
|
||
JBE FSRTNRET
|
||
MOV [CURCOL],0 ;COLUMN = LEFT MARJIN
|
||
MOV AL,[CURLIN] ;GET CURRENT LINE
|
||
INC [CURLIN] ;
|
||
CMP AL,[ENDLINE] ;Q. LINE = ENDLINE ?
|
||
JNE FSRTNRET ;NO.
|
||
MOV [CURLIN],AL ;
|
||
CALL ROLLUP ;SCROLL UP
|
||
FSRTNRET:
|
||
CALL DSPCSR ;CURSOR DISP
|
||
RET ;
|
||
|
||
PAGE
|
||
;********************************************************
|
||
;* *
|
||
;* DISPLAY ASCII CHARACTER *
|
||
;* WITH CURRENT ATTRIBUTE *
|
||
;* *
|
||
;********************************************************
|
||
|
||
DATARTN:
|
||
CMP [CURCOL],LINESIZE
|
||
JB DATARTN1 ;DISPLAY DATA
|
||
CMP [WRAPMOD],0 ;WRAP AROUND MODE ?
|
||
JE DATARTN0 ;YES
|
||
RET ;DISCARD AT EOL
|
||
DATARTN0:
|
||
PUSH CX ;SAVE DATA
|
||
CALL FSRTN ;NEXT LINE
|
||
POP CX ;
|
||
DATARTN1:
|
||
CMP [SFTJISMOD],0 ;SHFTJIS(KANJI) MODE ?
|
||
JE DATADSP ;NO,
|
||
CMP [KANJICNT],0 ;SHIFT JIS 2ND BYTE ?
|
||
JNE DATACNV ;YES,
|
||
CMP CL,81H ;
|
||
JB DATADSP
|
||
CMP CL,0A0H
|
||
JB DATARTN2
|
||
CMP CL,0E0H
|
||
JB DATADSP
|
||
CMP CL,0FDH
|
||
JNB DATADSP
|
||
;
|
||
; SHIFT JIS FIRST BYTE
|
||
DATARTN2:
|
||
MOV [K1STSAV],CL ;SAVE 1ST BYTE
|
||
MOV [KANJICNT],1
|
||
RET
|
||
;
|
||
; SHIFT JIS -> JIS C6226
|
||
DATACNV:
|
||
MOV CH,[K1STSAV] ;GET 1ST BYTE
|
||
CALL D_MCONV ;CONVERT
|
||
XCHG CH,CL
|
||
SUB CL,20H
|
||
JMP short DATADSP1
|
||
;
|
||
; DATA DISPLAY
|
||
DATADSP:
|
||
MOV CH,0 ;ANK (CODE_H = 00H)
|
||
DATADSP1:
|
||
CALL PATNCHK ;CHECK VRAM DATA
|
||
CALL CODECHK
|
||
SHL AX,1
|
||
ADD AL,DL
|
||
SHL AX,1
|
||
MOV DI,BX
|
||
MOV BX,AX
|
||
ADD BX,OFFSET DD_RTNTBL
|
||
MOV BX,CS:[BX] ;GET SUBROUTINE ADDR
|
||
PUSH ES
|
||
MOV AX,[VRAMSEG]
|
||
MOV ES,AX
|
||
MOV AX,CX ;DATA
|
||
CALL BX
|
||
POP ES
|
||
MOV [KANJICNT],0
|
||
|
||
ADD [CURCOL],AL ;CURCOL + 1 (2)
|
||
CALL DSPCSR ;DISPLAY CURSOR
|
||
DATARTNRET:
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CONVERT SHIFT JIS TO JIS *
|
||
;* *
|
||
;* INPUT : CX = SHIFT JIS *
|
||
;* OUTPUT: CX = JIS C6226 *
|
||
;* *
|
||
;************************************************
|
||
|
||
D_MCONV_FAR PROC FAR
|
||
CALL D_MCONV
|
||
RET
|
||
D_MCONV_FAR ENDP
|
||
|
||
|
||
D_MCONV:
|
||
CMP CH,80H ;IF CH=80H
|
||
JE D_MCONV4 ; THEN RETURN
|
||
CMP CH,0A0H ; ELSE IF CH < A0H
|
||
JNB D_MCONV0 ; THEN CH := CH-70H
|
||
SUB CH,70H
|
||
JMP short D_MCONV1
|
||
D_MCONV0:
|
||
SUB CH,0B0H ;
|
||
D_MCONV1:
|
||
OR CL,CL ;IF CL <= 80H
|
||
JNS D_MCONV2 ; THEN CL := CL-1
|
||
DEC CL
|
||
D_MCONV2:
|
||
ADD CH,CH ;CH := CH * 2
|
||
CMP CL,9EH ;IF CL >= 9EH
|
||
JB D_MCONV25 ; THEN CL := CL-5EH
|
||
SUB CL,5EH
|
||
JMP short D_MCONV3
|
||
D_MCONV25:
|
||
DEC CH ; ELSE CH := CH-1
|
||
D_MCONV3:
|
||
SUB CL,1FH ;CL := CL-1FH
|
||
D_MCONV4:
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* VRAM DATA GET & CHECK *
|
||
;* *
|
||
;************************************************
|
||
PATNCHK:
|
||
PUSH ES
|
||
PUSH CX
|
||
MOV AX,[VRAMSEG]
|
||
MOV ES,AX ;ES = VRAM SEG
|
||
MOV DH,[CURLIN]
|
||
MOV DL,[CURCOL]
|
||
CALL LCCONV
|
||
MOV CX,ES:[BX] ;GET DATA IN CURR. POS.
|
||
CALL CODECHK
|
||
MOV AX,2
|
||
CMP DL,1 ;DATA = KANJI(L) ?
|
||
JE PTNCHKRET ;Y
|
||
MOV DH,DL ;SAVE RTNCODE
|
||
MOV CX,ES:2[BX]
|
||
CALL CODECHK
|
||
MOV AX,0 ;RETURN CODE (AX)
|
||
CMP DH,2
|
||
JNE PTNCHK1 ;0: ANK-ANK
|
||
MOV AX,3 ;1: ANK-KNJ
|
||
PTNCHK1: ;2: KNJ
|
||
CMP DL,0 ;3: KNJ(R)-ANK
|
||
JE PTNCHKRET ;4: KNJ(R)-KNJ
|
||
INC AX
|
||
PTNCHKRET:
|
||
POP CX
|
||
POP ES
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* CODE CHECK *
|
||
;* ENTRY: CX = CODE (H,L) *
|
||
;* EXIT : DL = RTNCODE *
|
||
;* *
|
||
;************************************************
|
||
CODECHK:
|
||
MOV DL,0
|
||
CMP CH,0 ;ANK ?
|
||
JE CODCHKRET ;Y
|
||
CMP CH,0FFH ;ANK ?
|
||
JE CODCHKRET ;Y
|
||
CMP CL,09H ;KANJI(HANKAKU) ?
|
||
JB CODCHK1
|
||
CMP CL,0CH
|
||
JB CODCHKRET ;Y
|
||
CODCHK1:
|
||
MOV DL,1
|
||
OR CL,CL ;KANJI(LEFT) ?
|
||
JNS CODCHKRET ;Y
|
||
MOV DL,2 ;KANJI(RIGHT)
|
||
CODCHKRET:
|
||
RET
|
||
|
||
;************************************************
|
||
;* *
|
||
;* DSP DATA SUBROUTINES *
|
||
;* *
|
||
;************************************************
|
||
|
||
DD_ANK_L: ;WRITE ANK TO KANJI(L) FIELD
|
||
CALL NXTCLR
|
||
CALL W1CHR
|
||
RET
|
||
|
||
DD_ANK_R: ;WRITE ANK TO KANJI(R) FIELD
|
||
CALL PRECLR
|
||
CALL W1CHR
|
||
RET
|
||
;
|
||
DD_KNJ_AL: ;WRITE KANJI
|
||
CALL NXTCLR2 ; ANK-KANJI(L) FIELD
|
||
CALL W2CHR
|
||
RET
|
||
;
|
||
DD_KNJ_RA: ;WRITE KANJI
|
||
CALL PRECLR ; KANJI(R)-ANK FIELD
|
||
CALL W2CHR
|
||
RET
|
||
;
|
||
DD_KNJ_RL: ;WRITE KANJI
|
||
CALL PRECLR ; KANJI(R)-KANJI FIELD
|
||
CALL NXTCLR2
|
||
CALL W2CHR
|
||
RET
|
||
;
|
||
W1CHR: ;WRITE ANK(HANKAKU) CHAR
|
||
MOV ES:[DI],AX ;WRITE CODE
|
||
ADD DI,ATTROFST
|
||
MOV AX,[CURATTR2] ;CURR. ATTRIBUTE 89/08/16
|
||
MOV ES:[DI],AX ;WRITE ATTRIBUTE
|
||
MOV AL,1
|
||
RET
|
||
;
|
||
W2CHR: ;WRITE KANJI CHAR
|
||
CMP [CURCOL],LINEEND ;CURR POS = END OF LINE ?
|
||
JB W2CHR1 ;N
|
||
PUSH AX ;
|
||
MOV CX,0020H ;SPACE
|
||
MOV ES:[DI],CX ;
|
||
CALL FSRTN ;SCROLL UP
|
||
MOV DH,[CURLIN] ;GET LINE & COLUMN
|
||
MOV DL,[CURCOL] ;
|
||
CALL LCCONV ;L,C TO VRAM ADDR
|
||
MOV DI,BX ;VRAM ADDR
|
||
POP AX
|
||
W2CHR1:
|
||
STOSW ;WRITE FIRST WORD
|
||
OR AL,80H
|
||
STOSW ;WRITE SCOND WORD(RIGHT)
|
||
SUB DI,4
|
||
ADD DI,ATTROFST
|
||
MOV AX,[CURATTR2] ;CURR. ATTRIBUTE 89/08/16
|
||
STOSW ;WRITE ATTRIBUTE
|
||
STOSW ;WRITE ATTRIBUTE
|
||
MOV AL,2
|
||
RET
|
||
;
|
||
PRECLR: ;PRECEDING CHAR CLEAR
|
||
PUSH DI
|
||
SUB DI,2
|
||
MOV CX,0020H ;SPACE
|
||
MOV ES:[DI],CX
|
||
POP DI
|
||
RET
|
||
;
|
||
NXTCLR: ;NEXT CHAR CLEAR
|
||
PUSH DI
|
||
ADD DI,2
|
||
MOV CX,0020H ;SPACE
|
||
MOV ES:[DI],CX
|
||
POP DI
|
||
RET
|
||
;
|
||
NXTCLR2: ;
|
||
PUSH DI
|
||
ADD DI,4
|
||
MOV CX,0020H ;SPACE
|
||
MOV ES:[DI],CX
|
||
POP DI
|
||
RET
|
||
|
||
PAGE
|
||
;************************************************
|
||
;* *
|
||
;* SCROLL UP *
|
||
;* *
|
||
;************************************************
|
||
ROLLUP:
|
||
MOV AH,[ROLTOP]
|
||
MOV [WAITCNT],1
|
||
OR [ROLSW],0
|
||
JZ ROLLUP1
|
||
MOV [WAITCNT],0A000H+4000H
|
||
ROLLUP1:
|
||
MLINEUP:
|
||
MOV CL,[ENDLINE]
|
||
XOR CH,CH
|
||
SUB CL,AH
|
||
JZ MLINUP2 ;START_L = END_L
|
||
CLD
|
||
PUSH ES
|
||
PUSH DS
|
||
MOV DH,AH ;START LINE NO. @dos5
|
||
XOR DL,DL
|
||
CALL LCCONV ;VRAM RELATIVE ADDR
|
||
MOV DX,[VRAMSEG]
|
||
MOV ES,DX
|
||
MOV DS,DX ;SET VRAM SEGMENT ADDR
|
||
MOV DX,BX
|
||
ADD DX,LINESIZE*2
|
||
MLINUP1:
|
||
PUSH CX
|
||
MOV SI,DX ;SRCE PTR
|
||
MOV DI,BX ;DEST PTR
|
||
MOV CX,LINESIZE
|
||
REP MOVSW ;CODE MOVE
|
||
XCHG SI,DX
|
||
XCHG DI,BX
|
||
ADD SI,ATTROFST
|
||
ADD DI,ATTROFST
|
||
MOV CX,LINESIZE
|
||
REP MOVSW ;ATTR MOVE
|
||
;
|
||
POP CX
|
||
LOOP MLINUP1
|
||
POP DS
|
||
POP ES
|
||
MLINUP2:
|
||
MOV DH,[ENDLINE]
|
||
CALL LINECLR
|
||
MOV CX,[WAITCNT]
|
||
MLINUP3:
|
||
NOP
|
||
LOOP MLINUP3
|
||
RET
|
||
;
|
||
;************************************************
|
||
;* *
|
||
;* SCROLL DOWN *
|
||
;* *
|
||
;************************************************
|
||
ROLDOWN:
|
||
MOV AH,[ROLTOP]
|
||
|
||
MLINEDWN:
|
||
MOV CL,[ENDLINE]
|
||
XOR CH,CH
|
||
SUB CL,AH
|
||
JZ MLINDN2 ;START_L = END_L
|
||
STD
|
||
PUSH ES
|
||
PUSH DS
|
||
MOV DH,[ENDLINE] ;START LINE NO.
|
||
MOV DL,LINEEND
|
||
CALL LCCONV
|
||
MOV DX,[VRAMSEG]
|
||
MOV ES,DX
|
||
MOV DS,DX ;SET VRAM SEGMENT
|
||
MOV DX,BX
|
||
SUB DX,LINESIZE*2
|
||
MLINDN1:
|
||
PUSH CX
|
||
MOV SI,DX
|
||
MOV DI,BX
|
||
MOV CX,LINESIZE
|
||
REP MOVSW ;CODE MOVE
|
||
XCHG SI,DX
|
||
XCHG DI,BX
|
||
ADD SI,ATTROFST
|
||
ADD DI,ATTROFST
|
||
MOV CX,LINESIZE
|
||
REP MOVSW ;ATTR MOVE
|
||
POP CX
|
||
LOOP MLINDN1 ;PRECEDING LINE
|
||
POP DS
|
||
POP ES
|
||
MLINDN2:
|
||
CLD
|
||
MOV DH,AH ;CLEAR
|
||
CALL LINECLR
|
||
RET
|
||
|
||
PAGE
|
||
;************************************************
|
||
;* *
|
||
;* DISPLAY FUNCTION KEYS *
|
||
;* *
|
||
;* INPUT: NONE *
|
||
;* OUTPUT: NONE *
|
||
;* *
|
||
;************************************************
|
||
DSPFKY:
|
||
CMP [FKYSW],0 ;NO DISP MODE ?
|
||
JNE DSPFKY00 ;N
|
||
RET
|
||
DSPFKY00:
|
||
PUSH ES
|
||
MOV AX,[VRAMSEG]
|
||
MOV ES,AX
|
||
MOV DH,[ENDLINE]
|
||
INC DH
|
||
XOR DL,DL
|
||
CALL LCCONV
|
||
MOV DI,BX
|
||
MOV CX,FKYBUFSIZ
|
||
MOV AX,[NULCHR]
|
||
REP STOSW
|
||
;
|
||
MOV SI,OFFSET FKYTBL+1 ;
|
||
CMP [FKYSW],2 ;SHIFT_FUNC ?
|
||
JB DSPFKY0 ;NO,
|
||
MOV SI,OFFSET FKYTBL2+1 ;
|
||
;
|
||
; DISPLAY FUNCTION KEY _ LIST
|
||
;
|
||
DSPFKY0:
|
||
MOV DI,BX
|
||
ADD DI,2
|
||
MOV AX,WORD PTR [MODMARK1]
|
||
PUSH AX ;SET ' 'G'
|
||
CALL FKYDSP_S ;
|
||
POP AX ;
|
||
MOV AL,AH
|
||
CALL FKYDSP_S ;SET '*' OR ' '
|
||
ADD DI,2
|
||
;
|
||
MOV CX,2 ;SET COUNTER 1
|
||
DSPFKY1:
|
||
PUSH CX ;
|
||
MOV CX,5 ;SET COUNTER 2
|
||
DSPFKY2:
|
||
PUSH CX ;
|
||
MOV [FKYD_KCNT],0
|
||
LODSB
|
||
CALL FKYDSP_S
|
||
LODSB
|
||
CALL FKYDSP_S
|
||
LODSB
|
||
CALL FKYDSP_S
|
||
LODSB
|
||
CALL FKYDSP_S
|
||
LODSB
|
||
CALL FKYDSP_S
|
||
LODSB
|
||
CALL FKYDSP_S
|
||
CMP [FKYD_KCNT],0 ;LAST CHAR = KANJI 1ST ? 871001
|
||
JE DSPFKY3 ;NO, 871001
|
||
ADD DI,2 ;INCREMENT DI 871001
|
||
DSPFKY3: ; 871001
|
||
POP CX ;
|
||
ADD SI,10 ;NEXT TABLE
|
||
ADD DI,2
|
||
LOOP DSPFKY2
|
||
POP CX ;
|
||
ADD DI,6
|
||
LOOP DSPFKY1 ;
|
||
;
|
||
; SET ATTRIBUTE
|
||
;
|
||
MOV DI,BX ;
|
||
ADD DI,ATTROFST ;ATTR MEM OFFSET
|
||
MOV CX,4 ;
|
||
MOV AX,[DEFATTR2] ; 89/08/22
|
||
; XOR AH,AH ; 89/08/22
|
||
REP STOSW ;FIRST 4 BYTE
|
||
|
||
MOV CX,2 ;
|
||
DSPFKY4:
|
||
PUSH CX ;
|
||
MOV CX,5 ;
|
||
DSPFKY5:
|
||
PUSH CX ;
|
||
MOV AX,[DEFATTR2] ; 89/08/22
|
||
OR AL,04H ;REVERSE ATTRIBUTE
|
||
MOV CX,6 ;
|
||
REP STOSW ;
|
||
MOV AX,[DEFATTR2] ;DEFAULT ATTRIB 89/08/22
|
||
STOSW ;
|
||
POP CX ;
|
||
LOOP DSPFKY5 ;REPEAT 5 TIMES
|
||
MOV CX,3 ;DEFAULT ATTRIB
|
||
REP STOSW ;
|
||
POP CX ;
|
||
LOOP DSPFKY4 ;REPEAT 2 TIMES
|
||
POP ES
|
||
RET ;RETURN TO CALLER
|
||
|
||
;
|
||
;SUBROUTINE
|
||
|
||
FKYDSP_S:
|
||
CMP [SFTJISMOD],0
|
||
JE FKYDSP_S_1B
|
||
CMP [FKYD_KCNT],0
|
||
JNE FKYDSP_S_2B
|
||
CMP AL,81H
|
||
JB FKYDSP_S_1B
|
||
CMP AL,0A0H
|
||
JB FKYDSP_S1
|
||
CMP AL,0E0H
|
||
JB FKYDSP_S_1B
|
||
CMP AL,0FCH
|
||
JA FKYDSP_S_1B
|
||
FKYDSP_S1:
|
||
MOV [FKYD_K1SAV],AL
|
||
MOV [FKYD_KCNT],1
|
||
RET
|
||
FKYDSP_S_2B:
|
||
MOV CH,[FKYD_K1SAV]
|
||
MOV CL,AL
|
||
CALL D_MCONV
|
||
XCHG CH,CL
|
||
MOV AX,CX
|
||
SUB AL,20H
|
||
STOSW
|
||
STOSW
|
||
MOV [FKYD_KCNT],0
|
||
RET
|
||
FKYDSP_S_1B:
|
||
XOR AH,AH
|
||
STOSW
|
||
RET
|
||
;
|
||
;************************************************
|
||
;* *
|
||
;* CONVERT LINE,COLUMN TO *
|
||
;* VRAM ADDRESS *
|
||
;* *
|
||
;* INPUT: (DH)=LINE *
|
||
;* (DL)=COLUMN *
|
||
;* OUTPUT: (BX)=VRAM ADDRESS *
|
||
;* *
|
||
;************************************************
|
||
LCCONV:
|
||
XOR BX,BX
|
||
MOV BL,DH
|
||
SHL BX,1
|
||
ADD BX,OFFSET LINETBL
|
||
MOV BX,DS:[BX] ;GET TABLE CONTENT
|
||
XOR DH,DH ;
|
||
SHL DL,1 ;(DL)*2
|
||
ADD BX,DX ;
|
||
RET ;ON EXIT: (BX)=VRAM ADDRESS
|
||
;
|
||
;************************************************
|
||
;* *
|
||
;* LINE CLEAR *
|
||
;* *
|
||
;************************************************
|
||
;
|
||
LINECLR:
|
||
MOV DL,0 ;COLUMN = 0
|
||
CALL LCCONV ;CONVERT
|
||
MOV DI,BX ;SET POINTER
|
||
MOV CX,LINESIZE ;SET COUNTER
|
||
CALL CRTCLR
|
||
RET
|
||
;
|
||
;************************************************
|
||
;* *
|
||
;* SCREEN CLEAR *
|
||
;* *
|
||
;************************************************
|
||
;
|
||
CRTCLR:
|
||
CLD
|
||
PUSH ES
|
||
MOV AX,[VRAMSEG] ;VRAM SEGMENT
|
||
MOV ES,AX
|
||
MOV DX,CX ;COUNTER
|
||
MOV BX,DI ;SAVE POINTER
|
||
MOV AX,[NULCHR]
|
||
REP STOSW ;STORE STRING (NULL CHAR)
|
||
MOV AX,[DEFATTR2] ;SET DEFAULT ATTRIBUTE 89/08/22
|
||
MOV CX,DX
|
||
MOV DI,BX
|
||
ADD DI,ATTROFST
|
||
REP STOSW ;STORE STRING (ATTR)
|
||
POP ES
|
||
;----------------------------------------------- DOS5A 93/01/18 ------
|
||
;<patch BIOS50-P32>
|
||
|
||
DSPCSRRET: ;only change label location
|
||
;---------------------------------------------------------------------
|
||
RET
|
||
;
|
||
;************************************************
|
||
;* *
|
||
;* DISPLAY CURSOR *
|
||
;* *
|
||
;************************************************
|
||
;
|
||
DSPCSR:
|
||
CMP [CSRSW],0 ;CURSOR SWITCH = 0 ?
|
||
JE DSPCSRRET ;YES.
|
||
MOV DH,[CURLIN] ;GET CURRENT LINE
|
||
MOV DL,[CURCOL] ;GET CURRENT COLUMN
|
||
CMP DL,LINESIZE ;DUMMY POSITION ?
|
||
JB DSPCSR0 ;NO
|
||
DEC DL ;
|
||
DSPCSR0:
|
||
CALL LCCONV ;CONVERT
|
||
MOV AH,13H ;SET CURSOR
|
||
MOV DX,BX
|
||
;----------------------------------------------- DOS5A 93/01/18 ------
|
||
;<patch BIOS50-P32>
|
||
|
||
extrn patch_p32:near
|
||
|
||
jmp patch_p32
|
||
;---------------
|
||
; INT 18H ;
|
||
;DSPCSRRET:
|
||
; RET
|
||
;---------------------------------------------------------------------
|
||
;
|
||
;******************** END CONSOLE ************************************
|
||
;
|
||
CONSOLE_CODE_END:
|
||
CONSOLE_END:
|
||
PUBLIC CONSOLE_CODE_END
|
||
PUBLIC CONSOLE_END
|
||
|
||
Bios_Code ends
|
||
END
|
||
|
||
|