home *** CD-ROM | disk | FTP | other *** search
- CSEG SEGMENT
- ASSUME CS:CSEG,DS:CSEG
- ORG 100h
- START: JMP NV_BEGIN
-
- DOS DD
- MAJVER DB
- MINVER DB
-
- PROG DB 'NEW_VER 1.1'
- INT21:
- CMP AH,30h ;IF NOT ASKING FOR DOS VERSION
- JNE BYE ;EXIT
- MOV AL,20h ;TELL CONTROLER WE ARE
- OUT 20h,AL ;(ALMOST) FINISHED
- MOV AL,CS:MAJVER
- MOV AH,CS:MINVER
- MOV CX,0
- MOV BX,0
- IRET
- BYE:
- JMP CS:DOS
-
- STARTER:
- HELPMSG DB 'NEW VERSION 1.1 BY Paul Vercellotti',0aH,0dH
- DB 'Use to change what DOS version the computer thinks you have.',0aH,0dH,0Ah
- DB 'USAGE: NEW_VER [major version].[minor version]',0Ah,0Dh
- DB 'EXAMPLE: NEW_VER 2.01',0Ah,0Dh,24h
- VERSION DB 0Ah,'DOS VERSION IS $'
- ERROR DB 'SYNTAX ERROR$'
-
- NV_BEGIN:
- MOV AL,20h ;CHECK FOR SPACES
- MOV DI,5Dh ;AT [5Dh]
- MOV CX,9
- REPE SCASB
- JCXZ HELP
- MOV DS:64h,AL ;USE DOS'S FCB FOR VERSION#
- MOV DS:68h,AL ;PUT A SPACE (20h) AT END IN CASE SOMEONE
- ;PUTS AN 8 CHARACTER VERSION# (THE SUBROUTINE WON'T STOP UNTIL IT REACHES ONE)
- MOV DI,5Dh
- CALL ASC2NUM ;CONVERT TO A BINARY NUMBER
- MOV MAJVER,AL
- MOV DI,5Ch+9 ;EXTENTION
- CALL ASC2NUM
- CMP BH,1
- JNE PUT_MIN_VER
- MOV CL,10
- MUL CL
- PUT_MIN_VER:
- MOV MINVER,AL ;DIFFERENTLY THAN MAJOR
- CALL CHK_IF_IN ;CHECK OF INSTALLED
- CMP AH,0FFh ;IF NOT...
- JE LOAD ;...INSTALL
-
- MOV AX,35F4h
- INT 21h
- DEC BX ;MINVER IS 2 BYTES BEHIND
- MOV AL,MINVER ;INT F4 VECTOR
- MOV ES:[BX],AL ;STICK IT IN
- DEC BX
- MOV AL,MAJVER ;MAJVER IS ONE BEHIND MINVER
- MOV ES:[BX],AL ;STICK IT IN
- CALL GET_VER
- INT 20h ;AND EXIT
-
- HELP: MOV DX,OFFSET HELPMSG ;PRINT MESSAGE AND EXIT
- MOV AH,9
- INT 21h
- INT 20h
-
- LOAD:
- MOV AX,3521h ;GET OLD INT
- INT 21h
- MOV DOS,BX ;SAVE IT
- MOV DOS[2],ES
- MOV DX,OFFSET INT21 ;SET NEW INT
- MOV AX,2521h
- INT 21h
- MOV AX,25F4h
- MOV DX,OFFSET PROG
- INT 21h
-
- CALL GET_VER ;PRINT VERSION #
- MOV DX,OFFSET STARTER
- INT 27h ;AND T.S.R.
-
- ASC2NUM PROC NEAR ;CONVERT ASCII DECIMAL TO BINARY
- XOR AX,AX
- MOV CL,10
- XOR DX,DX
- XOR BH,BH
- MOV SI,DI
-
- MULTIPLY_LOOP:
- MOV BL,[DI]
- CMP BL,20h
- JE EXIT
- CMP BL,0Dh
- JE EXIT
- CALL CHKNUM
- MUL CL
- SUB BL,30h
- ADD AL,BL
- INC DI
- INC BH
- JMP MULTIPLY_LOOP
-
- EXIT:
- RET
- ASC2NUM ENDP
-
-
- ;PRINT 'DOS VERSION IS' THEN VERSION
-
- GET_VER PROC NEAR
- CALL PRINTMSG
- MOV AH,30h ;SERVICE 30h GETS DOS VERSION
- INT 21h
- PUSH AX
- CALL PRINTNUM ;PRINT THE NUMBER
- MOV AH,2
- MOV DL,'.'
- INT 21h
- POP AX
- CMP AH,10
- JB CALL_PRNT0 ;IF THE MINOR VERSION IS BELOW 10
- JMP OK ;PUT A '0' IN FRONT OF IT
- CALL_PRNT0:
- PUSH AX
- XOR AL,AL
- CALL PRINTNUM
- POP AX
- OK:
- MOV AL,AH
- CALL PRINTNUM
- MOV DL,0Ah ;DO A LINE LEED
- MOV AH,2
- INT 21h
- RET
-
- GET_VER ENDP
-
- ;PRINT NUMBER IN AL TO SCREEN
-
- PRINTNUM PROC NEAR
- MOV DX,0FFFFh
- PUSH DX
- MOV BL,10
- LOOP:
- MOV AH,0
- DIV BL
- PUSH AX
- CMP AL,0
- JE PRINT
- JMP LOOP
- PRINT:
- POP AX
- CMP AX,0FFFFh
- JE END
- ADD AH,30h
- MOV DL,AH
- MOV AH,2
- INT 21h
- JMP PRINT
- END:
- RET
- PRINTNUM ENDP
-
- CHKNUM PROC NEAR ;CHECK IF [DI] IS AN ASCII NUMBER
- CMP BL,30h
- JB SYN_ERROR
- CMP BL,39h
- JA SYN_ERROR
- MOV DL,0
- RET
- SYN_ERROR:
- MOV DX,OFFSET ERROR ;IF NOT PRINT ERROR MESSAGE AND EXIT
- MOV AH,9
- INT 21h
- INT 20h
- RET
- CHKNUM ENDP
-
- PRINTMSG PROC NEAR
- MOV DX,OFFSET VERSION
- MOV AH,9
- INT 21h
- RET
- PRINTMSG ENDP
-
-
- CHK_IF_IN PROC NEAR ;CHECK IS ALREADY INSTALLED
- MOV AX,35F4h ;IF AH=0 YES AH=FFh NO
- INT 21h ;GET VECTOR OF INT 21h
- MOV SI,OFFSET PROG ;SEE IF IT SAYS 'NEW_VER 1.1'
- MOV CX,11
- MOV DI,BX
- CLD
- REPE CMPSB
- JNE AH_FF ;IF IT DOESN'T THEN IT'S NOT INSTALLED
- MOV AH,0
- RET
- AH_FF:
- MOV AH,0FFh
- RET
- CHK_IF_IN ENDP
- CSEG ENDS
- END START