home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / pctech / pctj1188.arc / SCREENOR.ASM < prev    next >
Assembly Source File  |  1988-09-06  |  7KB  |  156 lines

  1. ; Microsoft C: 
  2. ;       void ScreenOrigin( x, y ); 
  3. ;               int     x, y;           /* pixel x,y coordinates */ 
  4.  
  5. _TEXT           SEGMENT byte public 'CODE' 
  6.                 ASSUME  cs:_TEXT 
  7.  
  8.                 PUBLIC  _ScreenOrigin 
  9. _ScreenOrigin   PROC    near 
  10.  
  11.                 push    bp              ; preserve caller registers 
  12.                 mov     bp,sp 
  13.  
  14. ; setup for pixel x-coordinate: 
  15. ;       - determine 8 or 9 bits per pixel by examining bit 0 in 
  16. ;            Sequencer Clocking Mode register 
  17. ;       - compute value for Attribute Controller Horizontal Pel Pan register 
  18.  
  19.                 mov     dx,3C4h         ; DX = port for Sequencer index register 
  20.                 mov     al,1 
  21.                 cli                     ; disable interrupts 
  22.                 out     dx,al           ; select Sequencer Clocking Mode reg 
  23.                 jmp     $+2             ; wait for Sequencer to respond 
  24.  
  25.                 inc     dx 
  26.                 in      al,dx 
  27.                 sti                     ; set interrupts 
  28.                 and     al,1            ; isolate low-order bit 
  29.                 mov     cl,9 
  30.                 sub     cl,al           ; CL = 8 or 9 (number of pixels/byte) 
  31.  
  32.                 mov     ax,[bp+4]       ; AX = pixel x-coordinate 
  33.                 div     cl              ; AH = bit offset in byte 
  34.                                         ; AL = byte offset in row 
  35.                 cmp     cl,8 
  36.                 je      L01             ; jump if 8 pixels/byte 
  37.  
  38.                 dec     ah              ; AH = -1, 0-7 
  39.                 jns     L01             ; if AH = -1 ... 
  40.                 mov     ah,8            ; ... set AH = 8 
  41.  
  42. L01:            mov     cl,ah           ; CL = Horizontal Pel Pan value 
  43.                 mov     bl,al 
  44.                 xor     bh,bh           ; BX = byte offset in row 
  45.  
  46. ; setup for pixel y-coordinate: 
  47. ;       - use value in CRTC Max Scan Line register to compute value for 
  48. ;            CRTC Preset Row Scan register 
  49. ;       - read CRTC Offset register to determine logical width of video buffer; 
  50. ;            use this to compute value for CRTC Start Address registers 
  51.  
  52.                 mov     ax,40h 
  53.                 mov     es,ax           ; ES -> video BIOS data segment 
  54.  
  55.                 mov     dx,es:[63h]     ; DX = port for CTRC index reg 
  56.                 mov     al,9            ; AL = Max Scan Line reg number 
  57.                 cli 
  58.                 out     dx,al 
  59.  
  60.                 push    bx              ; preserve BX (byte offset in row) 
  61.                 push    dx              ; preserve DX (CRTC index reg port) 
  62.  
  63.                 inc     dx 
  64.                 in      al,dx           ; AL = Max Scan Line value 
  65.                 sti 
  66.  
  67.                 and     ax,1Fh          ; AX = value from bits 0-4 
  68.                 inc     ax 
  69.                 mov     bx,ax           ; DX = scan lines per character 
  70.  
  71.                 xor     dx,dx 
  72.                 mov     ax,[bp+6]       ; AX = pixel y-coordinate 
  73.                 div     bx              ; AX = character row 
  74.                                         ; DL = value for Preset Row Scan reg 
  75.                 mov     ch,dl           ; save in CH 
  76.                 mov     bx,ax           ; save character row in BX 
  77.  
  78.                 pop     dx              ; DX = port for CRTC index reg 
  79.                 push    dx 
  80.                 mov     al,13h          ; AL = Offset reg number 
  81.                 cli                     ; disable interrupts 
  82.                 out     dx,al 
  83.                 jmp     $+2 
  84.  
  85.                 inc     dx 
  86.                 in      al,dx           ; AL = Offset reg value 
  87.                 sti                     ; enable interrupts 
  88.  
  89.                 xor     ah,ah 
  90.                 mul     bx              ; AX = word offset of start of row 
  91.                 shl     ax,1            ; AX = byte offset of start of row 
  92.  
  93.                 pop     dx              ; DX = port for CRTC index reg 
  94.                 pop     bx              ; BX = byte offset in row 
  95.                 add     bx,ax           ; BX = buffer offset 
  96.  
  97.                 add     dl,6            ; video status port (3BAH or 3DAH) 
  98.  
  99. ; update CRTC Start Address registers 
  100.  
  101. L02:            in      al,dx           ; wait for start of vertical retrace 
  102.                 test    al,8 
  103.                 jz      L02 
  104.  
  105. L03:            in      al,dx           ; wait for end of vertical retrace 
  106.                 test    al,8 
  107.                 jnz     L03 
  108.  
  109.                 cli                     ; disable interrupts 
  110.                 sub     dl,6            ; DX = 3B4H or 3D4H 
  111.  
  112.                 mov     ah,bh           ; AH = value for Start Address High 
  113.                 mov     al,0Ch          ; AL = Start Address High reg number 
  114.                 out     dx,ax           ; update this register 
  115.  
  116.                 mov     ah,bl           ; AH = value for Start Address Low 
  117.                 inc     al              ; AL = Start Address Low reg number 
  118.                 out     dx,ax           ; update this register 
  119.                 sti                     ; enable interrupts 
  120.  
  121. ; update CRTC Preset Row Scan and 
  122. ;  Attribute Controller Horizontal Pel Pan registers 
  123.  
  124.                 add     dl,6            ; DX = video status port 
  125.  
  126. L04:            in      al,dx           ; wait for start of vertical retrace 
  127.                 test    al,8 
  128.                 jz      L04 
  129.  
  130.                 cli                     ; disable interrupts 
  131.                 sub     dl,6            ; DX = 3B4H or 3D4H 
  132.                 mov     ah,ch           ; AH = value for Preset Row Scan reg 
  133.                 mov     al,8            ; AL = Preset Row Scan reg number 
  134.                 out     dx,ax           ; update this register 
  135.  
  136.                 mov     dl,0C0h         ; DX = 3C0h (Attribute Controller port) 
  137.                 mov     al,13h OR 20h   ; AL bit 0-4 = Horiz Pel Pan reg number 
  138.                                         ; AL bit 5 = 1 
  139.                 out     dx,al           ; write Attribute Controller Address reg 
  140.                                         ;  (The Attribute Controller address 
  141.                                         ;    flip-flop has been reset by the 
  142.                                         ;    IN at L04.) 
  143.                 mov     al,cl           ; AL = value for Horiz Pel Pan reg 
  144.                 out     dx,al           ; update this register 
  145.                 sti                     ; re-enable interrupts 
  146.  
  147.                 mov     sp,bp 
  148.                 pop     bp 
  149.                 ret 
  150.  
  151. _ScreenOrigin   ENDP 
  152.  
  153. _TEXT           ENDS 
  154.