;--------------------------------------------------------------------------
; Here is a source for measuring relative speed of computer. This source
; will NOT function properly under multitaskers, as they use timer them-
; selves. At least DesqView, OS/2 and Windows mess up with timer.
;
; This source is copyright 1994 of Teemu Peltonen aka Quark/Remedy Prods.
; If you modify this source, please do not spread it! You may spread the
; unmodified source as much as you like, but please check that length of
; the actual source (not including this comment between vertical lines) is
; 91 lines!
;
; The way of measuring computer's speed is not the best possible, but it
; works. Here's a small kind of table of speeds:
;
; CPU           Output value
; 486DX/33MHz   024Ch
; 486SX/20MHz   03D4h
; 386DX/40MHz   05EDh
; 386DX/16MHz   0DBAh
; 286  /10MHz   1500h
; 086  /4.77MHz 6006h
;
; Notice! Values may differ from these about 2 up or down. You should
; run the tester for about five times and use the value that seems to
; appear most times. Disk caches and others can mess up test.
;
; Thanks to my BBS's users for testing this piece of software!
;
; If you wish to add your computer's speed here, please contact author.
; Feel free to contact me, even if you wouldn't want to add your speed..
; Contact addresses are:
; teemu.peltonen@stream.nullnet.fi in Internet
; Teemu Peltonen@2:222/100         in Fidonet
; Teemu Peltonen@68:100/100        in DGi-net
; Or call Bitstream BBS (+358-21-4383244) and leave a comment to operator
; (command C).
;--------------------------------------------------------------------------
stacki  segment para stack use16 'stack'
        dw      100h dup (?)
stacki  ends

data    segment para public use16 'data'
hexval  db      '0123456789ABCDEF'
stringi db      'Relative speed of computer is '
d       db      0
c       db      0
b       db      0
a       db      0
endi    db      'h.$'
data    ends

code    segment para public use16 'code'
        assume cs:code, ds:data, ss:stacki
startup:
        mov     ax, seg data
        mov     ds, ax

        cli

        mov     al, 34h
        out     43h, al         ;OUT can be used as immediate
                                ;if register value under 100h

        xor     al, al
        out     40h, al
        out     40h, al

        sti

        mov     cx, 1000h       ;action here,
here:                           ;must not take
        dec     cx              ;more than 1/18
        jnz     here            ;(0.0555) seconds to run

        cli

        mov     al, 4h
        out     43h, al


        in      al, 40h
        mov     dl, al
        in      al, 40h
        mov     dh, al

        sti

        neg     dx              ;Action took bx/1193180 seconds

        mov     cl, dh
        and     cl, 11110000b
        shr     cl, 4
        xor     bx, bx
        mov     bl, cl
        mov     ah, hexval[bx]
        mov     d, ah

        mov     cl, dh
        and     cl, 00001111b
        xor     bx, bx
        mov     bl, cl
        mov     ah, hexval[bx]
        mov     c, ah

        mov     cl, dl
        and     cl, 11110000b
        shr     cl, 4
        xor     bx, bx
        mov     bl, cl
        mov     ah, hexval[bx]
        mov     b, ah

        mov     cl, dl
        and     cl, 00001111b
        xor     bx, bx
        mov     bl, cl
        mov     ah, hexval[bx]
        mov     a, ah


        mov     ax, 0900h
        mov     dx, offset stringi
        int     21h

        mov     ax, 4c00h
        int     21h

code    ends
        end     startup
