home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / screen / smode.lzh / SM.ASM < prev    next >
Assembly Source File  |  1988-05-02  |  7KB  |  241 lines

  1.                 .SEQ
  2. CODE            Segment WORD PUBLIC 'CODE'
  3. CODE            EndS
  4.  
  5. include vga.inc
  6.  
  7. CODE            Segment
  8.                 Assume  CS:Code, DS:ABS40
  9.  
  10.                 Org     80h
  11. Params          db      ?
  12.  
  13.                 Org     100h
  14. Start:          Mov     Ax, 40h
  15.                 Mov     Ds, Ax
  16.  
  17.                 Mov     Bl, 10h
  18.                 Mov     Ah, 12h;        Test for VGA/EGA
  19.                 Int     10h
  20.                 Cmp     Bl, 10h
  21.                 Je      Bad;            Neither VGA/EGA
  22.  
  23.                 Mov     Si, Offset Cs:Params
  24.                 Lods    Cs:Params
  25.                 Xor     Ah, Ah
  26.                 Mov     Bx, Ax
  27.                 Mov     Byte Ptr Cs:[Si+Bx], 0
  28.  
  29. P_Loop:         Lods    Cs:Params
  30.                 Cmp     Al, ' '
  31.                 Je      P_Loop
  32.                 Cmp     Al, 0
  33.                 Je      NoArgs
  34.                 Xor     Bx, Bx
  35.                 Jmp     TryNumber
  36.  
  37. NoArgs:         Mov     Al, video_rows
  38.                 Inc     Al
  39.                 Cmp     Al, 25
  40.                 Jne     Return_Rows
  41.                 Xor     Al, Al
  42.  
  43. Return_Rows:    Mov     Ah, 4Ch
  44.                 Int     21h
  45.  
  46. Bad:            Mov     Al, 0FFh
  47.                 Jmp     Return_Rows
  48.  
  49. No_Change:      Xor     Al, Al
  50.                 Jmp     Return_Rows
  51.  
  52. TryNumber:      Sub     Al, '0'
  53.                 Jb      Bad
  54.                 Cmp     Al, 9
  55.                 Ja      Bad
  56.                 Mov     Cx, Bx
  57.                 Shl     Cx, 1
  58.                 Shl     Cx, 1
  59.                 Add     Bx, Cx
  60.                 Shl     Bx, 1
  61.                 Add     Bl, Al
  62.  
  63. MoreDigits:     Lods    Cs:Params
  64.                 Cmp     Al, 0
  65.                 Je      Check_Which
  66.                 Cmp     Al, ' '
  67.                 Je      Check_Which
  68.                 Cmp     Al, ','
  69.                 Je      Check_Which
  70.                 Cmp     Al, ';'
  71.                 Je      Check_Which
  72.                 Jmp     TryNumber
  73.  
  74. Check_Which:    Cmp     Bx, 25
  75.                 Jbe     StdMode
  76.                 Jmp     HiDensityMode
  77.  
  78. SaveRows        db      ?
  79. CurPosition     dw      ?
  80. CurChar         dw      ?
  81. ScrollCount     db      ?
  82.  
  83. StdMode:        Mov     Al, video_rows
  84.                 Mov     SaveRows, Al
  85.  
  86.                 Call    Near Ptr GetCurrentChar
  87.                 Mov     CurChar, Ax
  88.                 Mov     CurPosition, Dx
  89.                 
  90.                 Inc     Dh
  91.                 Cmp     Dh, video_rows
  92.                 Ja      NoClear
  93.  
  94.                 Mov     Cx, Dx
  95.                 Mov     Dh, video_rows
  96.                 Mov     Dl, Byte Ptr crt_cols
  97.                 Dec     Dl
  98.                 Mov     Bx, CurChar
  99.                 Mov     Ax, 0600h
  100.                 Int     10h
  101.                 
  102. NoClear:        Xor     Cx, Cx
  103.                 Mov     Dx, CurPosition
  104.                 Mov     Dl, Byte Ptr crt_cols
  105.                 Dec     Dl
  106.                 Mov     Bx, CurChar
  107.                 Mov     Ah, 06h
  108.                 Mov     Al, Dh
  109.                 Sub     Al, 24
  110.                 Jle     NoScroll
  111.                 Mov     ScrollCount, Al
  112.                 Int     10h
  113.                 Jmp     ChangeTo_Std
  114.  
  115. NoScroll:       Xor     Al, Al
  116.                 Mov     ScrollCount, Al
  117.  
  118. ChangeTo_Std:   Mov     Ax, 1A00h; Check Vga/Ega
  119.                 Int     10h
  120.                 Cmp     Al, 1Ah
  121.                 Jne     Ega_8x14
  122.  
  123.                 Mov     Ax, 1114h; Load 9x16 charset, program controller
  124.                 Mov     Bl, 0
  125.                 Int     10h
  126.  
  127.                 Mov     Ax, 1200h;  Enable cursor emulation
  128.                 Mov     Bl, 34h
  129.                 Int     10h
  130.                 Jmp     SetCursor_Std
  131.  
  132. Ega_8x14:       Mov     Ax, 1111h; Load 8x14 charset, program controller
  133.                 Mov     Bl, 0
  134.                 Int     10h
  135.                 And     info, 0FEh
  136.  
  137. SetCursor_Std:  Mov     Ah, 1;  Set cursor type
  138.                 Mov     Cx, 0707h
  139.                 Int     10h
  140.  
  141.                 Mov     Ah, 2;  Move cursor
  142.                 Mov     Bh, active_page
  143.                 Mov     Dx, CurPosition
  144.                 Sub     Dh, ScrollCount
  145.                 Int     10h
  146.  
  147.                 Jmp     Finish
  148.  
  149. HiDensityMode:  Mov     Al, video_rows
  150.                 Mov     SaveRows, Al
  151.                 Call    Near Ptr GetCurrentChar
  152.                 Mov     CurChar, Ax
  153.                 Mov     CurPosition, Dx
  154.                 Mov     Ax, 1112h; Load 8x8 charset; program controller
  155.                 Mov     Bl, 0
  156.                 Int     10h
  157.  
  158.                 Mov     Ax, 1200h; Select alternate print screen routine
  159.                 Mov     Bl, 20h
  160.                 Int     10h
  161.                 
  162.                 Mov     Ax, 1A00h; Check Vga/Ega
  163.                 Int     10h
  164.                 Cmp     Al, 01Ah
  165.                 Jne     Ega_8x8
  166.  
  167.                 Mov     Ax, 1201h;  Disable cursor emulation
  168.                 Mov     Bl, 34h
  169.                 Int     10h
  170.                 Jmp     SetCursor_8x8
  171.  
  172. Ega_8x8:        Or      info, 1   
  173.  
  174. SetCursor_8x8:  Mov     Ah, 1;  Set cursor type
  175.                 Mov     Cx, 0707h
  176.                 Int     10h
  177.  
  178.                 Mov     Ah, 2;  Position cursor
  179.                 Mov     Bh, active_page
  180.                 Mov     Dx, CurPosition
  181.                 Int     10h
  182.  
  183.                 Mov     Cx, CurPosition
  184.                 Inc     Ch
  185.                 Cmp     Ch, video_rows
  186.                 Ja      NoClearExcess
  187.  
  188.                 Xor     Cl, Cl
  189.                 Mov     Dh, video_rows
  190.                 Mov     Dl, Byte Ptr crt_cols
  191.                 Dec     Dl
  192.                 Mov     Bx, CurChar
  193.                 Mov     Ax, 0600h
  194.                 Int     10h
  195.  
  196. NoClearExcess:  Jmp     Finish
  197.  
  198. Finish:         Mov     Al, SaveRows
  199.                 Cmp     Al, video_rows
  200.                 Jne     Changed
  201.                 Jmp     No_Change
  202.  
  203. Changed:        Mov     Al, 1
  204.                 Jmp     Return_Rows
  205.  
  206.  
  207. ;      Returns: Ax - current char & attribute
  208. ;               Dx - current position
  209.  
  210.  
  211. GetCurrentChar  Proc    Near
  212.  
  213.                 Mov     Ax, crt_start
  214.                 Shr     Ax, 1
  215.                 Shr     Ax, 1
  216.                 Shr     Ax, 1
  217.                 Shr     Ax, 1
  218.                 Mov     Ah, 0B8h
  219.                 Mov     Es, Ax
  220.  
  221.                 Xor     Bx, Bx
  222.                 Mov     Bl, active_page
  223.                 Shl     Bx, 1
  224.                 Mov     Dx, cursor_posn[Bx]
  225.  
  226.                 Xor     Bx, Bx
  227.                 Mov     Bl, Dl
  228.                 Shl     Bx, 1
  229.                 Mov     Al, Byte Ptr crt_cols
  230.                 Mul     Dh
  231.                 Add     Bx, Ax
  232.                 Mov     Ax, Es:[Bx]
  233.  
  234.                 Ret
  235.  
  236. GetCurrentChar  EndP
  237.  
  238. CODE            Ends                
  239.  
  240.                 End     Start
  241.