home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / djsrc106.arj / CHIPS.ASM < prev    next >
Assembly Source File  |  1991-03-20  |  4KB  |  210 lines

  1. ; This is file CHIPS.ASM
  2. ;
  3. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. ;
  5. ; This file is distributed under the terms listed in the document
  6. ; "copying.dj", available from DJ Delorie at the address above.
  7. ; A copy of "copying.dj" should accompany this file; if not, a copy
  8. ; should be available from where this file was obtained.  This file
  9. ; may not be distributed without a verbatim copy of "copying.dj".
  10. ;
  11. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. ;
  14.  
  15. cseg    segment    byte public 'code'
  16.     assume    cs:cseg, ds:cseg, es:cseg, ss:nothing
  17.  
  18.     dw    offset init_routine
  19.     dw    offset paging_routine
  20.     dw    0    ; set to 1 if separate read & write windows or
  21.             ; only 64K of video RAM (ie: no paging)
  22.  
  23. def_tw    dw    80    ; filled in by go32 if GO32 env. var. is set
  24. def_th    dw    25
  25. def_gw    dw    640
  26. def_gh    dw    480
  27.  
  28. ;--------------------------------------------------------------------------
  29. ; Entry: AX=mode selection
  30. ;        0=80x25 text
  31. ;        1=default text
  32. ;        2=text CX cols by DX rows
  33. ;        3=biggest text
  34. ;        4=320x200 graphics
  35. ;        5=default graphics
  36. ;        6=graphics CX width by DX height
  37. ;        7=biggest non-interlaced graphics
  38. ;        8=biggest graphics
  39. ;
  40. ; NOTE: This runs in real mode, but don't mess with the segment registers.
  41. ;
  42. ; Exit:  CX=width (in pixels or characters)
  43. ;        DX=height
  44.  
  45. init_table    label    word
  46.     dw    offset init_0
  47.     dw    offset init_1
  48.     dw    offset init_2
  49.     dw    offset init_3
  50.     dw    offset init_4
  51.     dw    offset init_5
  52.     dw    offset init_6
  53.     dw    offset init_7
  54.     dw    offset init_8
  55.  
  56. init_routine    proc    far
  57.     cmp    ax,8
  58.     jbe    valid_req
  59.     ret
  60. valid_req:
  61.     shl    ax,1
  62.     mov    bx,ax
  63.     jmp    init_table[bx]
  64.  
  65. init_0: ; 80x25 text
  66.     mov    ax,3
  67.     int    10h
  68.     mov    cx,80
  69.     mov    dx,25
  70.     ret
  71.  
  72. init_1: ; default text
  73.     mov    cx,def_tw
  74.     mov    dx,def_th
  75.     jmp    init_2
  76.  
  77. init_2_table    label    word
  78.     dw    01h, 40, 25
  79.     dw    03h, 80, 25
  80. init_2_tend    label    word
  81.  
  82. init_2: ; CX*DX text
  83.     mov    si,offset init_2_table
  84. init_2a:
  85.     cmp    [si+2],cx
  86.     jb    init_2b
  87.     cmp    [si+4],dx
  88.     jb    init_2b
  89.     ; got a big enough one!
  90.     jmp    init_2c
  91. init_2b:
  92.     cmp    si,offset init_2_tend - 6
  93.     je    init_2c
  94.     add    si,6
  95.     jmp    init_2a
  96. init_2c:
  97.     mov    ax,[si]
  98.     push    si
  99.     int    10h
  100.     pop    si
  101.     mov    cx,[si+2]
  102.     mov    dx,[si+4]
  103.     ret
  104.  
  105. init_3: ; biggest text
  106.     mov    ax,[init_2_tend-6]
  107.     int    10h
  108.     mov    cx,[init_2_tend-4]
  109.     mov    dx,[init_2_tend-2]
  110.     ret
  111.  
  112. init_4: ; 320x200 graphics
  113.     mov    ax,13h
  114.     int    10h
  115.     mov    cx,320
  116.     mov    dx,200
  117.     ret
  118.  
  119. init_5: ; default graphics - should be 640x480 if supported
  120.     mov    cx,def_gw
  121.     mov    dx,def_gh
  122.     jmp    init_6
  123.  
  124. init_6_table    label    word
  125.     dw    13h, 320, 200
  126.     dw    78h, 640, 400
  127.     dw    79h, 640, 480
  128.     dw    7bh, 800, 600
  129. init_6_tend    label    word
  130.  
  131. init_6: ; CX*DX graphics
  132.     mov    si,offset init_6_table
  133. init_6a:
  134.     cmp    [si+2],cx
  135.     jb    init_6b
  136.     cmp    [si+4],dx
  137.     jb    init_6b
  138.     ; got a big enough one!
  139.     jmp    init_6c
  140. init_6b:
  141.     cmp    si,offset init_6_tend - 6
  142.     je    init_6c
  143.     add    si,6
  144.     jmp    init_6a
  145. init_6c:
  146.     mov    ax,[si]
  147.     push    si
  148.     int    10h
  149.     pop    si
  150.     mov    cx,[si+2]
  151.     mov    dx,[si+4]
  152.     ret
  153.  
  154. init_7: ; biggest non-interlaced graphics
  155.     mov    ax,7bh
  156.     int    10h
  157.     mov    cx,800
  158.     mov    dx,600
  159.     ret
  160.  
  161. init_8: ; biggest graphics
  162.     mov    ax,7bh
  163.     int    10h
  164.     mov    cx,800
  165.     mov    dx,600
  166.     ret
  167.  
  168. init_routine    endp
  169.  
  170. ;--------------------------------------------------------------------------
  171. ; Entry: AH=read page
  172. ;        AL=write page
  173. ;
  174. ; NOTE: This runs in protected mode!  Don't mess with the segment registers!
  175. ; This code must be relocatable and may not reference any data!
  176. ;
  177. ; Exit: VGA configured.
  178. ;       AX,BX,CX,DX,SI,DI may be trashed
  179. ;
  180. ; Derived from VGAKIT Version 3.4
  181. ;    Copyright 1988,89,90 John Bridges
  182.  
  183.     assume    ds:nothing, es:nothing
  184.  
  185. paging_routine    proc    far
  186.     mov    cx,ax
  187.     mov     dx,46e8h    ;place chip in setup mode
  188.     mov     ax,1eh
  189.     out     dx,ax
  190.     mov     dx,103h        ;enable extended registers
  191.     mov     ax,0080h
  192.     out     dx,ax
  193.     mov     dx,46e8h    ;bring chip out of setup mode
  194.     mov     ax,0eh
  195.     out     dx,ax
  196.     mov    ah,cl
  197.     shl    ah,1        ;change 64k bank number into 16k bank number
  198.     shl    ah,1
  199.     mov    al,10h
  200.     mov    dx,3d6h
  201.     out    dx,ax
  202.  
  203.     ret
  204. paging_routine    endp
  205.  
  206. ;--------------------------------------------------------------------------
  207.  
  208. cseg    ends
  209.     end
  210.