The following code checks to make sure that we're not about to start executing '386-specific instructions on a previous-generation CPU. It uses quirks in the different processors to identify which is actually running.
Note that this code isn't strictly necessary, since there's nothing we can really do if the CPU isn't a '386 or above anyway: a
JMP $ loop is hardly user friendly! So this will be the first code up against The Wall if I need more room in the Boot sector...
; ; Boot/CPU.inc ; ; Test whether CPU is a '386 (minimum) Boot.CPU: CPU 8086 ; Assume lowest possible option ; The 8086 pushes a different SP to the others PUSH SP POP AX CMP SP,AX ; Comparison designed to set Carry too JNE $ ; Uh oh! ***STOP!*** CPU 286 ; At least we know it's this good! ; The '286 always clears IOPL PUSHF POP AX OR AX,x86.EFlags.IOPL PUSH AX POPF PUSHF POP CX CMP CX,AX ; Comparison designed to set Carry too JNE $ ; Uh oh! ***STOP!*** CPU 386 ; From now on, we're confident!