home *** CD-ROM | disk | FTP | other *** search
/ Assembly 1994 - The 3rd Phase / ASMROM94.mdf / fc / utils / stmik / init.asm < prev    next >
Assembly Source File  |  1991-07-03  |  5KB  |  336 lines

  1. ; (un)initialization routines + interrupt routines
  2.  
  3. initmisc PROC NEAR
  4.     cld
  5.     ret
  6. initmisc ENDP
  7.  
  8. tweaktbl LABEL BYTE    
  9.     db     5fh, 4fh, 50h, 82h
  10.     db     54h, 80h,0bfh, 0fh
  11.     db     00h, 080h, 00h, 00h
  12.     db     0, 0, 00h, 00h
  13.     db     9ch, 8eh, 8fh, 0a0h
  14.     db     00h, 96h,0b9h,0E3h
  15.     db     128-1
  16.  
  17. initvideo PROC NEAR 
  18.     ;set tweaked mode 1280x200x256 with 320x200 window with 320x64 subwindow
  19.     ;clear palette
  20.     cli
  21.     call    waitborder
  22.     xor    al,al
  23.     mov    dx,3c8h
  24.     out    dx,al
  25.     inc    dx
  26.     mov    cx,768
  27.     xor    al,al
  28. invid1:    out    dx,al
  29.     loop    invid1
  30.     call    waitborder
  31.     ;set 320x200x256 normal
  32.     sti
  33.     mov    ax,13h
  34.     int    10h
  35.     cli
  36.     ;clear palette again, to remove as much flicker as possible
  37.     xor    al,al
  38.     mov    dx,3c8h
  39.     out    dx,al
  40.     inc    dx
  41.     mov    cx,768
  42.     xor    al,al
  43. invid2:    out    dx,al
  44.     loop    invid2
  45.     call    waitborder
  46.     ;set tweaked mode registers    
  47.     mov    dx,3c4h
  48.     mov    ax,604h
  49.     out    dx,ax
  50.     mov    dx,3dah
  51.     in    al,dx
  52.     mov    dx,3c0h
  53.     mov    al,10h
  54.     out    dx,al
  55.     mov    al,1+32+64
  56.     out    dx,al
  57.     mov    al,11h
  58.     out    dx,al
  59.     mov    al,0
  60.     out    dx,al
  61.     mov    al,32
  62.     out    dx,al
  63.     mov    dx,3d4h
  64.     mov    si,OFFSET tweaktbl
  65.     mov    ah,cs:[si+11h]
  66.     and    ah,7fh
  67.     mov    al,11h
  68.     out    dx,ax
  69.     mov    cx,19h
  70.     mov    al,0
  71. invid3:    mov    ah,cs:[si]
  72.     out    dx,ax
  73.     inc    al
  74.     inc    si
  75.     loop    invid3
  76.     ;clear vram
  77.     mov    dx,3c4h
  78.     mov    ax,0f02h
  79.     out    dx,ax
  80.     mov    es,cs:vram
  81.     mov    di,0
  82.     mov    cx,32768
  83.     xor    ax,ax
  84.     rep    stosw
  85.     ;set row table    
  86.     mov    cx,200
  87.     mov    bx,OFFSET rows
  88.     xor    ax,ax
  89. invid4:    mov    cs:[bx],ax
  90.     add    ax,1280/4
  91.     inc    bx
  92.     inc    bx
  93.     loop    invid4
  94.     ;done!
  95.     sti
  96.     ret
  97. initvideo ENDP
  98.  
  99. uninitvideo PROC NEAR
  100.     ;clear palette
  101.     cli
  102.     call    waitborder
  103.     xor    al,al
  104.     mov    dx,3c8h
  105.     out    dx,al
  106.     inc    dx
  107.     mov    cx,768
  108.     xor    al,al
  109. uivid1:    out    dx,al
  110.     loop    uivid1
  111.     mov    ax,3
  112.     int    10h
  113.     xor    al,al
  114.     mov    dx,3c8h
  115.     out    dx,al
  116.     inc    dx
  117.     mov    cx,768
  118.     xor    al,al
  119. uivid2:    out    dx,al
  120.     loop    uivid2
  121.     ret
  122. uninitvideo ENDP
  123.  
  124. oldint8    dd    ?
  125. INTER    equ    8
  126. intti8 PROC FAR
  127.     ;timer interrupt
  128.     push    ax
  129.     sti
  130.     call    demointti
  131.     cli
  132.     mov    al,20h
  133.     out    20h,al
  134.     call    waitborder
  135.     mov    al,36h
  136.     out    43h,al
  137.     mov    al,byte ptr cs:frametimeb[0]
  138.     out    40h,al
  139.     mov    al,byte ptr cs:frametimeb[1]
  140.     out    40h,al
  141.     pop    ax
  142.     iret
  143. intti8 ENDP
  144.  
  145.     db    'FIND'
  146. setints PROC NEAR
  147.     cli
  148.     xor    ax,ax
  149.     mov    es,ax
  150.     mov    ax,es:[INTER*4]
  151.     mov    WORD PTR cs:oldint8,ax
  152.     mov    ax,es:[INTER*4+2]
  153.     mov    WORD PTR cs:oldint8[2],ax
  154.     mov    ax,OFFSET intti8
  155.     mov    es:[INTER*4],ax
  156.     mov    es:[INTER*4+2],cs
  157.     sti
  158.     call    waitborder
  159.     ;reset ints now!
  160.     mov    al,36h
  161.     out    43h,al
  162.     mov    al,0
  163.     out    40h,al
  164.     mov    al,0
  165.     out    40h,al
  166.     call    waitborder
  167.     xor    al,al
  168.     out    43h,al
  169.     in    al,40h
  170.     mov    ah,al
  171.     in    al,40h
  172.     xchg    al,ah
  173.     neg    ax
  174.     shr    ax,1
  175.     mov    cs:frametime,ax
  176.     mov    dx,ax
  177.     mov    al,ah
  178.     xor    ah,ah
  179.     sub    dx,ax
  180.     shl    dx,1
  181.     mov    cs:frametimeb,dx
  182.     mov    al,36h
  183.     out    43h,al
  184.     mov    al,dl
  185.     out    40h,al
  186.     mov    al,dh
  187.     out    40h,al
  188.     ret
  189. setints ENDP
  190.  
  191. clearints PROC NEAR
  192.     cli
  193.     mov    ax,0
  194.     mov    es,ax
  195.     mov    ax,WORD PTR cs:oldint8
  196.     mov    dx,WORD PTR cs:oldint8[2]
  197.     mov    es:[INTER*4],ax
  198.     mov    es:[INTER*4+2],dx
  199.     sti
  200.     mov    al,36h
  201.     out    43h,al
  202.     mov    al,0
  203.     out    40h,al
  204.     mov    al,0
  205.     out    40h,al
  206.     ret
  207. clearints ENDP
  208.  
  209. cbmmacro MACRO planeout
  210.     local    l1,l2,l3
  211.     push    di
  212.     push    si
  213.     mov    dx,3c4h
  214.     mov    ax,0002h+256*planeout
  215.     out    dx,ax
  216.     mov    cx,320/4
  217. l1:    lodsb
  218.     cmp    al,254
  219.     jb    l2
  220.     inc    di
  221.     jmp    l3
  222. l2:    stosb
  223. l3:    add    si,3
  224.     loop    l1
  225.     pop    si
  226.     pop    di
  227.     inc    si
  228.     ENDM
  229.     
  230. copybitmaps PROC NEAR
  231.     mov    ds,cs:bm1seg
  232.     mov    di,320/4
  233.     mov    cx,136
  234.     call    copybitmaptovram
  235.     mov    ds,cs:bm2seg
  236.     mov    di,640/4
  237.     mov    cx,136
  238.     call    copybitmaptovram
  239.     mov    ds,cs:bm3seg
  240.     mov    di,960/4
  241.     mov    cx,200
  242.     call    copybitmaptovram    
  243.     ret
  244. copybitmaps ENDP
  245.  
  246. copybitmaptovram PROC NEAR
  247.     mov    es,cs:vram
  248.     xor    si,si
  249. cbm1:    push    cx
  250.     push    si
  251.     push    di
  252.     ;plane 1
  253.     cbmmacro 1
  254.     ;plane 2
  255.     cbmmacro 2
  256.     ;plane 3
  257.     cbmmacro 4
  258.     ;plane 4
  259.     cbmmacro 8
  260.     pop    di
  261.     pop    si
  262.     pop    cx
  263.     add    si,320
  264.     add    di,1280/4
  265.     loop    cbm1x
  266.     ret
  267. cbm1x:    jmp    cbm1
  268. copybitmaptovram ENDP
  269.  
  270. disablekeyboard PROC NEAR
  271.     in    al,21h
  272.     or    al,2
  273.     out    21h,al
  274.     ret
  275. disablekeyboard ENDP
  276.  
  277. enablekeyboard PROC NEAR
  278.     in    al,21h
  279.     and    al,255-2
  280.     out    21h,al
  281.     ret
  282. enablekeyboard ENDP
  283.  
  284. oldint9 dd    ?
  285.  
  286. intti9 PROC FAR
  287.     push    ax
  288.         in      al,60h
  289.         cmp     al,1h
  290.         je    nokey
  291.         cmp     al,4ah
  292.         je    nokey
  293.         cmp     al,4eh
  294.         je    nokey
  295.         in      al,61h
  296.         mov     ah,al
  297.         or      al,80h
  298.         out     61h,al
  299.         xchg    ah,al
  300.         out     61h,al
  301.         mov     al,20h
  302.         out     20h,al
  303.         pop     ax
  304.         iret
  305. nokey:    pop     ax
  306.         jmp     cs:oldint9
  307. intti9 ENDP
  308.  
  309. disablepause PROC NEAR
  310.     cli ;actually only ESC, keypad+ and keypad- will work after this crap
  311.     xor    ax,ax
  312.     mov    es,ax
  313.     mov    ax,es:[9*4]
  314.     mov    WORD PTR cs:oldint9,ax
  315.     mov    ax,es:[9*4+2]
  316.     mov    WORD PTR cs:oldint9[2],ax
  317.     mov    ax,OFFSET intti9
  318.     mov    es:[9*4],ax
  319.     mov    es:[9*4+2],cs
  320.     sti
  321.     ret
  322. disablepause ENDP
  323.  
  324. enablepause PROC NEAR
  325.     cli
  326.     xor    ax,ax
  327.     mov    es,ax
  328.     mov    ax,WORD PTR cs:oldint9
  329.     mov    bx,WORD PTR cs:oldint9[2]
  330.     mov    es:[9*4],ax
  331.     mov    es:[9*4+2],bx
  332.     sti
  333.     ret
  334. enablepause ENDP
  335.  
  336.