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/MSBIO1.ASM | 645 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 645 insertions(+) create mode 100644 v4.0/src/BIOS/MSBIO1.ASM (limited to 'v4.0/src/BIOS/MSBIO1.ASM') diff --git a/v4.0/src/BIOS/MSBIO1.ASM b/v4.0/src/BIOS/MSBIO1.ASM new file mode 100644 index 0000000..36dac91 --- /dev/null +++ b/v4.0/src/BIOS/MSBIO1.ASM @@ -0,0 +1,645 @@ + + PAGE ,132 ; + TITLE MSBIO1.asm - BIOS +;============================================================================== +;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. +;============================================================================== +COMMENT * +THE LINK STEP IS PERFORMED BY USING THE FOLLOWING "NEW.ARF" FILE: +msbio1+ +msSTACK+ +MsCON+ +msAUX+ +msLPT+ +msCLOCK+ +msdISK+ +msBIO2+ +C:\BIO2\OLDOBJ\disk+ +C:\BIO2\OLDOBJ\msinit+ +C:\BIO2\OLDOBJ\sysinit1+ +C:\BIO2\OLDOBJ\sysinit2+ +C:\BIO2\OLDOBJ\sysimes,msbio,/M; + +THE FOLLOWING IS A BATCH FILE THAT CAN BE USED TO CREATE THE IBMBIO.COM +WHERE "LOCSCR" IS A FILE THAT JUST HAS THE NUMBER, 70: + +link @NEW.ARF +exe2bin ibmbio ibmbio.com buffer to dump in Hex. +; CX -> # of bytes (Length of the buffer) +; +DUMPBYTES proc near + pushf + push ax +dumploops: + lodsb + mov ah, al + shr ah, 1 + shr ah, 1 + shr ah, 1 + shr ah, 1 + call hex_to_ascii + push ax + mov al, ah + call outchar + pop ax + call outchar + mov al, ' ' + call outchar + loop dumploops + + mov al, 0dh + call outchar + mov al, 0ah + call outchar + + pop ax + popf + ret +DUMPBYTES endp + + PUBLIC Hex_to_ascii +Hex_to_ascii proc near ;J.K. - 4/9/86 + and ax, 0f0fh + add ah, 30h + cmp ah, 3ah + jb hta_$1 + add ah, 7 +hta_$1: + add al, 30h + cmp al, 3ah + jb hta_$2 + add al, 7 +hta_$2: + ret +Hex_to_ascii endp + + PUBLIC outchar +Outchar proc near + PUSH AX + PUSH SI + PUSH DI + PUSH BP + PUSH BX +;SB33002******************************************************* + MOV AH, 0Eh ;SET COMMAND TO WRITE A CHAR ;SB;3.30* + MOV BX, 7 ;SET FOREGROUND COLOR ;SB;3.30* + INT 10h ;CALL ROM-BIOS ;SB;3.30* +;SB33002******************************************************* + POP BX + POP BP + POP DI + POP SI + POP AX + RET +Outchar endp + + ENDIF + INCLUDE MSMACRO.INC + +;--------------------------------------------------- +; +; DEVICE ENTRY POINT +; +CMDLEN = 0 ;LENGTH OF THIS COMMAND +UNIT = 1 ;SUB UNIT SPECIFIER +CMD = 2 ;COMMAND CODE +STATUS = 3 ;STATUS +MEDIA = 13 ;MEDIA DESCRIPTOR +TRANS = 14 ;TRANSFER ADDRESS +COUNT = 18 ;COUNT OF BLOCKS OR CHARACTERS +START = 20 ;FIRST BLOCK TO TRANSFER +EXTRA = 22 ;USUALLY A POINTER TO VOL ID FOR ERROR 15 +START_L = 26 ;AN000; Extended start sector (Low) +START_H = 28 ;AN000; Extended start sector (High) + + PUBLIC STRATEGY +STRATEGY PROC FAR + MOV WORD PTR CS:[PTRSAV],BX + MOV WORD PTR CS:[PTRSAV+2],ES + RET +STRATEGY ENDP + + PUBLIC CON$IN +CON$IN PROC FAR + PUSH SI + MOV SI,OFFSET CONTBL + JMP SHORT ENTRY +CON$IN ENDP + + PUBLIC AUX0$IN +AUX0$IN PROC FAR + PUSH SI + PUSH AX + XOR AL,AL + JMP SHORT AUXENT +AUX0$IN ENDP + + PUBLIC AUX1$IN +AUX1$IN PROC FAR + PUSH SI + PUSH AX + MOV AL,1 + JMP short AUXENT ;J.K. 4/15/86 +AUX1$IN ENDP + +;SB33102**************************************************************** +;SB Add code to handle two more COM Ports +;boban + + PUBLIC AUX2$IN +AUX2$IN proc far + push si + push ax + mov al,2 + jmp short AUXENT +AUX2$IN endp + + PUBLIC AUX3$IN +AUX3$IN proc far + push si + push ax + mov al,3 + jmp short AUXENT + +;SB33102**************************************************************** + +AUXENT: + MOV SI,OFFSET AUXTBL + JMP SHORT ENTRY1 +AUX3$IN ENDP + +PRN0$IN PROC FAR + PUBLIC PRN0$IN + + PUSH SI + PUSH AX + XOR AX,AX + JMP SHORT PRNENT +PRN0$IN ENDP + + PUBLIC PRN1$IN +PRN1$IN PROC FAR + PUSH SI + PUSH AX + XOR AL,AL + MOV AH,1 + JMP SHORT PRNENT +PRN1$IN ENDP + + PUBLIC PRN2$IN +PRN2$IN PROC FAR + PUSH SI + PUSH AX + MOV AL,1 + MOV AH,2 + JMP SHORT PRNENT +PRN2$IN ENDP + + PUBLIC PRN3$IN +PRN3$IN PROC FAR + PUSH SI + PUSH AX + MOV AL,2 + MOV AH,3 +PRNENT: + MOV SI,OFFSET PRNTBL + MOV CS:[PRINTDEV],AH ;SAVE INDEX INTO ARRAY OF RETRY COUNTS + JMP SHORT ENTRY1 +PRN3$IN ENDP + + PUBLIC TIM$IN +TIM$IN PROC FAR + PUSH SI + MOV SI,OFFSET TIMTBL + JMP SHORT ENTRY +TIM$IN ENDP + + PUBLIC DSK$IN +DSK$IN PROC FAR + PUSH SI + MOV SI,OFFSET DSKTBL + +ENTRY: + PUSH AX +ENTRY1: + PUSH CX + PUSH DX + PUSH DI + PUSH BP + PUSH DS + PUSH ES + PUSH BX + + MOV CS:[AUXNUM],AL ;SAVE CHOICE OF AUX/PRN DEVICE + + LDS BX,CS:[PTRSAV] ;GET POINTER TO I/O PACKET + ASSUME DS:NOTHING + + MOV AL,BYTE PTR DS:[BX].UNIT ;AL = UNIT CODE + MOV AH,BYTE PTR DS:[BX].MEDIA ;AH = MEDIA DESCRIP + MOV CX,WORD PTR DS:[BX].COUNT ;CX = COUNT + MOV DX,WORD PTR DS:[BX].START ;DX = START SECTOR + +;SB34MSB100********************************************************************* +;SB +;SB The disk device driver can now handle 32 bit start sector number. +;SB So we should check to see if a 32 bit sector number has been specified +;SB and if so get it. Whether a 32 bit sector has been specified or not +;SB the disk driver expects a 32 bit sector number with the high word +;SB in cs:Start_Sec_H and the low word in dx. +;SB +;SB Algorithm: +;SB 1. Check to see if the request is for the disk driver by +;SB checking to see if SI points to DSKTBL. +;SB +;SB 2. If request not for the disk nothing special needs to be done. +;SB +;SB 3. If request for the disk then check to see if a 32 bit +;SB sector number has been specified by seeing whether the +;SB the conventional sector number specified is -1. If so +;SB we need to pick the 32 bit sector number from the new +;SB fields in the request packet. See the request header +;SB struc for the fields you need. If the conventional +;SB sector field is not -1 then a 16 bit sector number +;SB has been specified and we just need to initalise the +;SB high word in cs:Start_Sec_H to 0 +;SB +;SB NOTE: START_L and START_H are the offsets withing the IO_REQUEST packet +;SB which contain the low and hi words of the 32 bit start sector if +;SB it has been used. +;SB +;SB NOTE:Remember not to destroy the registers which have been set up before + + CMP SI,OFFSET DSKTBL + JNZ DSK_REQ_CONT ; Not Disk Req + CMP DX,-1 + JNZ DSK_REQ_16 + MOV DX,DS:[BX].START_H ; 32 bits DSK REQ + MOV CS:START_SEC_H,DX ; CS:Start_sec_H = Packet.Start_H + MOV DX,DS:[BX].START_L ; DX = Packet.Start_L + JMP SHORT DSK_REQ_CONT +DSK_REQ_16: + MOV CS:START_SEC_H,0 +DSK_REQ_CONT: + +;SB34MSB100********************************************************************* + + XCHG DI,AX + MOV AL,BYTE PTR DS:[BX].CMD + CMP AL,CS:[SI] ;ARR 2.41 + JA CMDERR + + CBW ; NOTE THAT AL <= 15 MEANS OK + SHL AX,1 + + ADD SI,AX + XCHG AX,DI + + LES DI,DWORD PTR DS:[BX].TRANS + + PUSH CS + POP DS + + ASSUME DS:CODE + + CLD + JMP WORD PTR [SI+1] ;GO DO COMMAND +DSK$IN ENDP + PAGE +;===================================================== +;= +;= SUBROUTINES SHARED BY MULTIPLE DEVICES +;= +;===================================================== +;---------------------------------------------------------- +; +; EXIT - ALL ROUTINES RETURN THROUGH THIS PATH +; + PUBLIC BUS$EXIT +BUS$EXIT PROC FAR + ASSUME DS:NOTHING + MOV AH,00000011B + JMP SHORT ERR1 + + PUBLIC CMDERR +CMDERR: + MOV AL,3 ;UNKNOWN COMMAND ERROR + + PUBLIC ERR$CNT +ERR$CNT: + LDS BX,CS:[PTRSAV] + ASSUME DS:NOTHING + SUB WORD PTR [BX].COUNT,CX ;# OF SUCCESSFUL I/O'S + + PUBLIC ERR$EXIT +ERR$EXIT: + MOV AH,10000001B ;MARK ERROR RETURN + JMP SHORT ERR1 +BUS$EXIT ENDP + +EXITP PROC FAR + ASSUME DS:CODE ; WE ARE NOT SURE THIS IS CORRECT 3/18/86 +EXIT$ZER: + LDS BX,[PTRSAV] + ASSUME DS:NOTHING + XOR AX,AX + MOV WORD PTR [BX].COUNT,AX ;INDICATE NO CHARS READ + + PUBLIC EXIT +EXIT: + ASSUME DS:NOTHING + MOV AH,00000001B +ERR1: + ASSUME DS:NOTHING + LDS BX,CS:[PTRSAV] + MOV WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE + + POP BX + POP ES + POP DS + POP BP + POP DI + POP DX + POP CX + POP AX + POP SI + RET ;RESTORE REGS AND RETURN +EXITP ENDP + +;------------------------------------------------------------- +; +; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE +; +; CALLED VIA INT 29H +; + PUBLIC CHROUT +CHROUT = 29H + + PUBLIC OUTCHR +OUTCHR PROC FAR + PUSH AX + PUSH SI + PUSH DI + PUSH BP +;SB33002a******************************************************* + push bx ; ;SB ;3.30 + mov AH, 0Eh ; set command to write a character;SB;3.30 + mov BX, 7 ; set foreground color ;SB ;3.30 + int 10h ; call rom-bios ;SB ;3.30 + pop bx ; ;SB ;3.30 +;SB33002a******************************************************* + POP BP + POP DI + POP SI + POP AX + IRET +OUTCHR ENDP +;---------------------------------------------- +; +; SET DX TO AUXNUM +; + PUBLIC GETDX +GETDX PROC NEAR + MOV DX,WORD PTR CS:[AUXNUM] + RET +GETDX ENDP + PAGE +;************************************************** ARR 2.15 + +;----------------------------------------------- +; +; TIMER INTERRUPT HANDLER +; +;TIMER_LOW DW 0 +;TIMER_HIGH DW 0 +; +;TIMER: +; STI +; PUSH AX +; PUSH CX +; PUSH DX +; PUSH DS +; PUSH CS +; POP DS +; XOR AX,AX +; INT 1AH ; GET ROM TIME AND ZAP ROLL OVER +; MOV [TIMER_HIGH],CX +; MOV [TIMER_LOW],DX +; OR AL,AL +; JZ T5 +; INC WORD PTR [DAYCNT] ; ONE DAY GONE BY +;T5: +; POP DS +; POP DX +; POP CX +; POP AX +; IRET +;************************************************** ARR 2.15 +CODE ENDS + END -- cgit v1.2.3