From 2d04cacc5322951f187bb17e017c12920ac8ebe2 Mon Sep 17 00:00:00 2001 From: Mark Zbikowski Date: Thu, 25 Apr 2024 21:24:10 +0100 Subject: MZ is back! --- v4.0/src/BIOS/MSCON.ASM | 328 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 v4.0/src/BIOS/MSCON.ASM (limited to 'v4.0/src/BIOS/MSCON.ASM') diff --git a/v4.0/src/BIOS/MSCON.ASM b/v4.0/src/BIOS/MSCON.ASM new file mode 100644 index 0000000..68fcfff --- /dev/null +++ b/v4.0/src/BIOS/MSCON.ASM @@ -0,0 +1,328 @@ + PAGE ,132 ; + TITLE MSCON - BIOS + %OUT ...MSCON.ASM +;============================================================================== +;REVISION HISTORY: +;AN000 - New for DOS Version 4.00 - J.K. +;AC000 - Changed for DOS Version 4.00 - J.K. +;AN00x - PTM number for DOS Version 4.00 - J.K. +;============================================================================== + + itest=0 + INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT + INCLUDE JUMPMAC.INC + INCLUDE MSEQU.INC + INCLUDE MSMACRO.INC + +;*** DOS 3.3 will not support more than 25 rows +; INCLUDE DEVSYM.INC ;J.K. 4/29/86 for CON$GENIOCTL support +; INCLUDE IOCTL.INC ;J.K. 4/29/86 for CON$GENIOCTL support + + EXTRN EXIT:NEAR ;MSBIO1 + EXTRN BUS$EXIT:NEAR ;MSBIO1 + +; EXTRN CMDERR:NEAR ;MSBIO1 J.K. 4/29/86 + +;DATA + EXTRN PTRSAV:DWORD ;MSBIO1 + EXTRN FHAVEK09:BYTE ;MSDISK + EXTRN ALTAH:BYTE ;MSBDATA + EXTRN KEYRD_Func:Byte ;MSBDATA + EXTRN KEYSTS_Func:Byte ;MSBDATA + +; EXTRN SAV_SC_INFO:BYTE ;MSBDATA J.K. 4/29/86 +; EXTRN SAV_SC_MODE:BYTE ;MSBDATA J.K. 4/29/86 +;------------------------------------------------------ +; +; CONSOLE READ ROUTINE +; + ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT + PUBLIC CON$READ +CON$READ PROC NEAR + JCXZ CON$EXIT +CON$LOOP: + CALL CHRIN ;GET CHAR IN AL + STOSB ;STORE CHAR AT ES:DI + LOOP CON$LOOP +CON$EXIT: + JUMP EXIT +CON$READ ENDP +;--------------------------------------------------------- +; +; INPUT SINGLE CHAR INTO AL +; +;J.K.5/12/87 We are going to issue extended keyboard function, if supported. +;The returning value of the extended key stroke of the extended key board +;function uses 0E0h in AL instead of 00 as in the conventional key board +;function. This creates a conflict when the user entered real Greek Alpha +;charater (= 0E0h) to distinguish the extended key stroke and the Greek Alpha. +;This case will be handled in the following manner; +; AH = 16h +; INT 16h +; If AL == 0, then extended code (in AH) +; else If AL == 0E0h, then +; IF AH <> 0, then extended code (in AH) +; else Greek_Alpha character. +;Also, for compatibility reason, if an extended code is detected, then we +;are going to change the value in AL from 0E0h to 00h. + + +CHRIN PROC NEAR +;AN000; +; XOR AX,AX + mov ah,KEYRD_Func ;AN000; Set by MSINIT. 0 or 10h + xor al,al ;AN000; + XCHG AL,ALTAH ;GET CHARACTER & ZERO ALTAH + + OR AL,AL + JNZ KEYRET +;SB34CON000************************************************************** +;SB Keyboard I/O interrupt +;SB AH already contains the keyboard read function number +;SB 1 LOC + + int 16h +;SB34CON000************************************************************** +ALT10: + OR AX,AX ;CHECK FOR NON-KEY AFTER BREAK + JZ CHRIN + CMP AX,7200H ;CHECK FOR CTRL-PRTSC + JNZ ALT_Ext_Chk ;AN000; + MOV AL,16 + jmp KeyRet ;AN000; +ALT_Ext_Chk: +;SB34CON001************************************************************** +;SB IF operation was extended function (i.e. KEYRD_Func != 0) THEN +;SB IF character read was 0E0h THEN +;SB IF extended byte was zero (i.e. AH == 0) THEN +;SB goto keyret +;SB ELSE +;SB set AL to zero +;SB goto ALT_SAVE +;SB ENDIF +;SB ENDIF +;SB ENDIF +;SB 9 LOCS + + cmp BYTE PTR KEYRD_Func,0 + jz NOT_EXT + cmp al,0E0h + jnz NOT_EXT + or ah,ah + jz KEYRET + xor al,al + jmp short ALT_SAVE +NOT_EXT: + +;SB34CON001************************************************************** + OR AL,AL ;SPECIAL CASE? + JNZ KEYRET +ALT_SAVE: + MOV ALTAH,AH ;STORE SPECIAL KEY +KEYRET: + RET +CHRIN ENDP + +;-------------------------------------------------------------- +; +; KEYBOARD NON DESTRUCTIVE READ, NO WAIT +; +; PC-CONVERTIBLE-TYPE MACHINE: IF BIT 10 IS SET BY THE DOS IN THE STATUS WORD +; OF THE REQUEST PACKET, AND THERE IS NO CHARACTER IN THE INPUT BUFFER, THE +; DRIVER ISSUES A SYSTEM WAIT REQUEST TO THE ROM. ON RETURN FROM THE ROM, IT +; RETURNS A 'CHAR-NOT-FOUND' TO THE DOS. +; +CONBUSJ: + ASSUME DS:NOTHING + JMP CONBUS + + ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT + PUBLIC CON$RDND +CON$RDND: + MOV AL,[ALTAH] + OR AL,AL + JZ RD1 + JMP RDEXIT + +RD1: +;SB34CON002************************************************************** +;SB Keyboard I/O interrupt +;SB Get keystroke status (KEYSTS_Func) +;SB 2 LOCS + + mov ah,KEYSTS_Func + int 16h +;SB34CON002************************************************************** + JZ NOCHR + JMP GOTCHR +NOCHR: + CMP FHAVEK09,0 + JZ CONBUSJ + LDS BX,[PTRSAV] + ASSUME DS:NOTHING + TEST [BX].STATUS,0400H ; SYSTEM WAIT ENABLED? + JZ CONBUSJ + +;******************************** +; NEED TO WAIT FOR IBM RESPONSE TO REQUEST FOR CODE ON HOW TO USE THE SYSTEM +; WAIT CALL. +;******************************** + MESSAGE FTESTCON,<"SYSTEM WAIT STAGE",CR,LF> + MOV AX,4100H ; WAIT ON AN EXTERNAL EVENT +; MOV BX,0300H ; NO TIMEOUT +; MOV DX,60H ; LOOK AT I/O PORT 60H + INT 15H ; CALL ROM FOR SYSTEM WAIT + MESSAGE FTESTCON,<"OUT OF WAIT. AX IS "> + MNUM FTESTCON,AX + MESSAGE FTESTCON, + JMP CONBUS + + ASSUME DS:CODE +GOTCHR: + OR AX,AX + JNZ NOTBRK ;CHECK FOR NULL AFTER BREAK +;SB34CON004************************************************************** +;SB Keyboard I/O interrupt +;SB Keyboard read function (KEYRD_Func) +;SB 2 LOCS + + mov ah,KEYRD_Func + int 16h +;SB34CON004************************************************************** + JUMP CON$RDND ;AND GET A REAL STATUS +NOTBRK: + CMP AX,7200H ;CHECK FOR CTRL-PRTSC + JNZ RD_Ext_Chk ;AN000; + MOV AL,16 + jmp RDEXIT ;AN000; +RD_Ext_Chk: ;AN000; + cmp KEYRD_Func, 0 ;AN000; Extended Keyboard function? + jz RDEXIT ;AN000; No. Normal exit. + cmp al,0E0h ;AN000; Extended key value or Greek Alpha? + jne RDEXIT ;AN000; + cmp ah, 0 ;AN000; Scan code exist? + jz RDEXIT ;AN000; Yes. Greek Alpha char. + mov al, 0 ;AN000; No. Extended key stroke. Change it for compatibility + PUBLIC RDEXIT +RDEXIT: + LDS BX,[PTRSAV] + ASSUME DS:NOTHING + MOV [BX].MEDIA,AL +EXVEC: + JUMP EXIT + +CONBUS: + ASSUME DS:NOTHING + JUMP BUS$EXIT +;-------------------------------------------------------------- +; +; KEYBOARD FLUSH ROUTINE +; + ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT + PUBLIC CON$FLSH +CON$FLSH: + CALL FLUSH + JUMP EXIT + + PUBLIC FLUSH +FLUSH: + MOV [ALTAH],0 ;CLEAR OUT HOLDING BUFFER + +FLLOOP: +;SB33012**************************************************************** + ;SB ; Is there a char there? + mov AH, 1 ;SB ; command code for check status + int 16h ;SB ; call rom-bios keyboard routine +;SB33012**************************************************************** + JZ FLDONE +;SB33013**************************************************************** + xor AH, AH ;SB ; if zf is nof set, get character + int 16h ;SB ; call rom-bios to get character +;SB33013**************************************************************** + JMP FLLOOP +FLDONE: + + RET +;---------------------------------------------------------- +; +; CONSOLE WRITE ROUTINE +; + ASSUME DS:CODE ; THIS WAS SET BY THE CON DD ENTRY POINT + PUBLIC CON$WRIT +CON$WRIT: + JCXZ EXVEC +CON$LP: + MOV AL,ES:[DI] ;GET CHAR + INC DI + INT CHROUT ;OUTPUT CHAR + LOOP CON$LP ;REPEAT UNTIL ALL THROUGH + JUMP EXIT +;----------------------------------------------- +; +; BREAK KEY HANDLING +; + PUBLIC CBREAK +CBREAK: + MOV CS:ALTAH,3 ;INDICATE BREAK KEY SET + + PUBLIC INTRET +INTRET: + IRET + +;------------------------------------------------------------------------------ +;J.K. 4/29/86 - CONSOLE GENERIC IOCTL SUPPORT FOR DOS 3.3. +;CON$GENIOCTL supports Get mode information, Set mode information functions. +;It will only save the value from "Set mode information" and will return +;the value through "Get mode information". It is supposed to be set by +;the MODE.COM and other application program can retrieve information +;through "Get mode information" call. +;Initially, there is no valuable informaton until set by MODE command, so +;any attemp to "Get mode information" at that points will fail. (unknown +;command with carry set.) +;At entry: CS = DS = code +; CS:[PTRSAV] has seg, address of the Request Header saved in +; in Strategy routine. +; +; PUBLIC CON$GENIOCTL +; ASSUME DS:CODE +;CON$GENIOCTL: +; les di, CS:[PTRSAV] ;get the request header +; cmp es:[di].MajorFunction, IOC_SC +; je Major_SC_OK +;SC_CMDERR: +; stc +; jmp cmderr ;carry is set, exit to cmderr +;Major_SC_OK: +; mov al, es:[di].MinorFunction ;save minor function +; les di, es:[di].GenericIOCTL_Packet ;pointer of SC_MODE_INFO structure +; mov cx, es:[di].SC_INFO_LENGTH ;save length +; inc di +; inc di ;ES:DI -> SC_MODE in Info. Packet +; cmp cx, SC_INFO_PACKET_LENGTH ;currently 9. +; jne SC_CMDERR ;cannot accept the different packet +; cmp al, GET_SC_MODE ;minor function = 60h ? +; jne SC_SET_MODE_FUNC ;no, check if it is "Set mode function" +; cmp SAV_SC_MODE, 0 ;information set before? +; je SC_CMDERR ;no, cannot get the info. +;;SC_GET_MODE_FUNC: ;es:di -> SC_MODE in info. packet +; ;cx - length +; mov si, offset SAV_SC_INFO +; rep movsb ;ds:si -> sav_sc_info, es:di -> sc_mode +; jmp exit +; +;SC_SET_MODE_FUNC: ;es:di -> SC_MODE +; cmp al, SET_SC_MODE ;minor function = 40h ? +; jne SC_CMDERR +; mov si, offset SAV_SC_INFO +; xchg di, si +; push es +; push ds +; pop es +; pop ds +; rep movsb ;ds:si -> sc_mode, es:di -> sav_sc_info +; jmp exit +; +;J.K. 4/29/86 - End of CONSOLE GENERIC IOCTL SUPPORT FOR DOS 3.3. + +CODE ENDS + END -- cgit v1.2.3