home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / DOS_HELP / NEWVER11.ZIP / NEW_VER.ASM next >
Encoding:
Assembly Source File  |  1989-06-05  |  3.9 KB  |  209 lines

  1. CSEG    SEGMENT
  2.     ASSUME CS:CSEG,DS:CSEG
  3.     ORG 100h
  4. START:  JMP NV_BEGIN
  5.  
  6. DOS     DD
  7. MAJVER  DB
  8. MINVER  DB
  9.  
  10. PROG    DB 'NEW_VER 1.1'
  11. INT21:
  12.     CMP AH,30h            ;IF NOT ASKING FOR DOS VERSION
  13.     JNE BYE               ;EXIT
  14.     MOV AL,20h            ;TELL CONTROLER WE ARE
  15.     OUT 20h,AL            ;(ALMOST) FINISHED
  16.     MOV AL,CS:MAJVER
  17.     MOV AH,CS:MINVER
  18.     MOV CX,0
  19.     MOV BX,0
  20.     IRET
  21. BYE:
  22.     JMP CS:DOS
  23.     
  24. STARTER:
  25. HELPMSG DB 'NEW VERSION 1.1  BY Paul Vercellotti',0aH,0dH
  26.     DB 'Use to change what DOS version the computer thinks you have.',0aH,0dH,0Ah
  27.     DB 'USAGE: NEW_VER [major version].[minor version]',0Ah,0Dh
  28.     DB 'EXAMPLE: NEW_VER 2.01',0Ah,0Dh,24h
  29. VERSION DB 0Ah,'DOS VERSION IS $'
  30. ERROR    DB 'SYNTAX ERROR$'
  31.  
  32. NV_BEGIN:
  33.     MOV AL,20h          ;CHECK FOR SPACES
  34.     MOV DI,5Dh          ;AT [5Dh]
  35.     MOV CX,9
  36.     REPE SCASB
  37.     JCXZ HELP
  38.     MOV DS:64h,AL             ;USE DOS'S FCB FOR VERSION#
  39.     MOV DS:68h,AL             ;PUT A SPACE (20h) AT END IN CASE SOMEONE
  40. ;PUTS AN 8 CHARACTER VERSION# (THE SUBROUTINE WON'T STOP UNTIL IT REACHES ONE)
  41.     MOV DI,5Dh
  42.     CALL ASC2NUM              ;CONVERT TO A BINARY NUMBER
  43.     MOV MAJVER,AL
  44.     MOV DI,5Ch+9              ;EXTENTION
  45.     CALL ASC2NUM
  46.     CMP BH,1
  47.     JNE PUT_MIN_VER
  48.     MOV CL,10
  49.     MUL CL
  50. PUT_MIN_VER:
  51.     MOV MINVER,AL             ;DIFFERENTLY THAN MAJOR
  52.     CALL CHK_IF_IN            ;CHECK OF INSTALLED
  53.     CMP AH,0FFh               ;IF NOT...
  54.     JE LOAD                   ;...INSTALL
  55.     
  56.     MOV AX,35F4h
  57.     INT 21h
  58.     DEC BX               ;MINVER IS 2 BYTES BEHIND
  59.     MOV AL,MINVER             ;INT F4  VECTOR
  60.     MOV ES:[BX],AL          ;STICK IT IN
  61.     DEC BX
  62.     MOV AL,MAJVER          ;MAJVER IS ONE BEHIND MINVER
  63.     MOV ES:[BX],AL          ;STICK IT IN
  64.     CALL GET_VER
  65.     INT 20h              ;AND EXIT
  66.  
  67. HELP:    MOV DX,OFFSET HELPMSG      ;PRINT MESSAGE AND EXIT
  68.     MOV AH,9
  69.     INT 21h
  70.     INT 20h
  71.     
  72. LOAD:    
  73.     MOV AX,3521h          ;GET OLD INT
  74.     INT 21h
  75.     MOV DOS,BX          ;SAVE IT
  76.     MOV DOS[2],ES
  77.     MOV DX,OFFSET INT21       ;SET NEW INT
  78.     MOV AX,2521h
  79.     INT 21h
  80.     MOV AX,25F4h
  81.     MOV DX,OFFSET PROG
  82.     INT 21h
  83.  
  84.     CALL GET_VER          ;PRINT VERSION #
  85.     MOV DX,OFFSET STARTER
  86.     INT 27h              ;AND T.S.R.
  87.  
  88. ASC2NUM PROC NEAR          ;CONVERT ASCII DECIMAL TO BINARY
  89.     XOR AX,AX
  90.     MOV CL,10
  91.     XOR DX,DX
  92.     XOR BH,BH
  93.     MOV SI,DI
  94.  
  95. MULTIPLY_LOOP:    
  96.     MOV BL,[DI]
  97.     CMP BL,20h
  98.     JE EXIT
  99.     CMP BL,0Dh
  100.     JE EXIT
  101.     CALL CHKNUM
  102.     MUL CL
  103.     SUB BL,30h
  104.     ADD AL,BL
  105.     INC DI
  106.     INC BH
  107.     JMP MULTIPLY_LOOP
  108.  
  109. EXIT:
  110.     RET
  111. ASC2NUM ENDP
  112.  
  113.  
  114. ;PRINT 'DOS VERSION IS' THEN VERSION
  115.     
  116. GET_VER    PROC NEAR
  117.     CALL PRINTMSG
  118.     MOV AH,30h          ;SERVICE 30h GETS DOS VERSION
  119.     INT 21h
  120.     PUSH AX
  121.     CALL PRINTNUM          ;PRINT THE NUMBER
  122.     MOV AH,2
  123.     MOV DL,'.'
  124.     INT 21h
  125.     POP AX
  126.     CMP AH,10
  127.     JB CALL_PRNT0          ;IF THE MINOR VERSION IS BELOW 10
  128.     JMP OK              ;PUT A '0' IN FRONT OF IT
  129. CALL_PRNT0:
  130.     PUSH AX
  131.     XOR AL,AL
  132.     CALL PRINTNUM
  133.     POP AX
  134. OK:
  135.     MOV AL,AH
  136.     CALL PRINTNUM
  137.     MOV DL,0Ah          ;DO A LINE LEED
  138.     MOV AH,2
  139.     INT 21h
  140.     RET
  141.  
  142. GET_VER    ENDP
  143.     
  144. ;PRINT NUMBER IN AL TO SCREEN
  145.     
  146. PRINTNUM PROC NEAR
  147.     MOV DX,0FFFFh
  148.     PUSH DX
  149.     MOV BL,10
  150. LOOP:
  151.     MOV AH,0
  152.     DIV BL
  153.     PUSH AX
  154.     CMP AL,0
  155.     JE PRINT
  156.     JMP LOOP
  157. PRINT:
  158.     POP AX
  159.     CMP AX,0FFFFh
  160.     JE END
  161.     ADD AH,30h
  162.     MOV DL,AH
  163.     MOV AH,2
  164.     INT 21h
  165.     JMP PRINT
  166. END:
  167.     RET
  168. PRINTNUM ENDP
  169.  
  170. CHKNUM    PROC NEAR          ;CHECK IF [DI] IS AN ASCII NUMBER
  171.     CMP BL,30h
  172.     JB SYN_ERROR
  173.     CMP BL,39h
  174.     JA SYN_ERROR
  175.     MOV DL,0
  176.     RET
  177. SYN_ERROR:
  178.     MOV DX,OFFSET ERROR      ;IF NOT PRINT ERROR MESSAGE AND EXIT
  179.     MOV AH,9
  180.     INT 21h
  181.     INT 20h
  182.     RET
  183. CHKNUM    ENDP
  184.     
  185. PRINTMSG PROC NEAR
  186.     MOV DX,OFFSET VERSION
  187.     MOV AH,9
  188.     INT 21h
  189.     RET
  190. PRINTMSG ENDP
  191.     
  192.  
  193. CHK_IF_IN PROC NEAR          ;CHECK IS ALREADY INSTALLED
  194.     MOV AX,35F4h          ;IF AH=0 YES AH=FFh NO
  195.     INT 21h              ;GET VECTOR OF INT 21h
  196.     MOV SI,OFFSET PROG      ;SEE IF IT SAYS 'NEW_VER 1.1'
  197.     MOV CX,11
  198.     MOV DI,BX
  199.     CLD
  200.     REPE CMPSB
  201.     JNE AH_FF        ;IF IT DOESN'T THEN IT'S NOT INSTALLED
  202.     MOV AH,0        
  203.     RET
  204. AH_FF:
  205.     MOV AH,0FFh
  206.     RET
  207. CHK_IF_IN ENDP
  208. CSEG    ENDS
  209.     END START