home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / borland / jnfb88.arc / PROCPU.ARC / ASMCPU.ASM next >
Assembly Source File  |  1987-10-28  |  3KB  |  86 lines

  1. ; Set up for call from Turbo PROLOG
  2.  
  3. CSEG      SEGMENT   
  4.           ASSUME CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
  5.     
  6. PUBLIC      getcpu_0       ; Turbo PROLOG expects external procedures
  7.                ; to end with "_0"
  8. getcpu_0  PROC FAR         ; Turbo PROLOG requires all ext procedures
  9.                ; to be "FAR"
  10.              PUSH BP          ; Save old Base Pointer, and load Stack
  11.                         ; Pointer, so that BP can be used to 
  12.              MOV BP,SP        ; address parameters
  13.            
  14. ; MAIN subroutine (code contributed by Juan Jimenez)
  15.  
  16.           PUSHF            ; Save the flag registers 
  17.        XOR AX,AX        ; Clear AX and push it onto the stack
  18.                            ; etc..............
  19.       PUSH AX
  20.       POPF             ; Pop 0 into flag registers (all bits to 
  21.                        ; 0),
  22.       PUSHF            ; attempting to set bits 12-15 of flags to 
  23.                        ; 0's
  24.           POP AX           ; Recover the saved flags
  25.           AND AX,08000h    ; If bits 12-15 of flags are set to zero 
  26.           CMP AX,08000h    ; then cpu is 8088/86 or 80188/86
  27.           JZ  _8x_18x
  28.  
  29. ; Decide whether CPU is 80286 or 80386
  30.  
  31.           MOV  AX,07000h   ; Try to set flag bits 12-14 to 1's
  32.           PUSH AX          ; Push the test value onto the stack
  33.           POPF             ; Pop it into the flag register
  34.           PUSHF            ; Push it back onto the stack
  35.           POP  AX          ; Pop it into AX for check
  36.           AND  AX,07000h   ; If bits 12-14 are cleared then the chip
  37.           JZ   _286        ; is an 80286
  38.  
  39. ; It's an 80386
  40.  
  41.           MOV  AX,386      ; It's not a 286, so it must be a 386
  42.           JMP  DONE
  43.  
  44. ; It's an 80286
  45.  
  46. _286:     MOV  AX,286      ; Get the msg ready
  47.           JMP  DONE
  48.  
  49. ; It's an 8088/86 or 80188/86
  50.  
  51. _8x_18x:
  52.           MOV  AX,0ffffh   ; Set AX to all 1's
  53.           MOV  CL,33       ; Now we try to shift left 33 times. If
  54.           SHL  AX,CL       ; it's an 808x it will shift it 33 times,  
  55.                            ; id it's an 8018x it will only shift one
  56.                            ; time.
  57.           JNZ _18x         ; Shifting 33 times would have left all
  58.                            ; 0's. If any 1's are left it's an 
  59.                            ; 80188/186
  60.           MOV  AX,86       ; No 1's, it's an 8088/86
  61.           JMP  DONE
  62.  
  63. ; It's an 80188 or 80186
  64.  
  65. _18x:     MOV  AX,186      ; Found a 1 in there somewhere, it's an 
  66.                            ; 80188 or an 80186
  67.  
  68. ; New "DONE" gets us back to Turbo PROLOG
  69.                            
  70. DONE:   
  71.           LDS SI,DWORD PTR [BP]+6  ; Move returned value's address
  72.                        ; into SI (another register which
  73.                        ; allows indirect addressing can
  74.                        ; be used
  75.           MOV [SI],AX           ; Move the value in AX (i.e. the 
  76.                        ; processor # to the address in SI
  77.           POPF               ; Restore the flag registers
  78.             POP BP           ; Restore Base Pointer
  79.           RET 4                   ; Return to next execution address
  80.                          ; IP and de-allocate parameters (4
  81.                          ; bytes for returned variable)
  82.  
  83. getcpu_0  ENDP
  84. CSEG      ENDS
  85. END
  86.