home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / DRAWFLD.ZIP / DRWFIELD.ASM next >
Encoding:
Assembly Source File  |  1986-05-07  |  4.1 KB  |  75 lines

  1. ;--------------------------------------------------------------------------
  2. ;  The following are offsets in the stack for the input parameters:
  3. ;  The invoking statement is:
  4. ;
  5. ;    Draw_Field(Row,Column,Size,Attrib : integer);
  6. ;--------------------------------------------------------------------------
  7. Attrib  equ     4               ; Video Attribute to use
  8. FSize   equ     Attrib+2        ; Size of field to put out
  9. Column  equ     Attrib+4        ; Start column of field
  10. Row     equ     Attrib+6        ; Start row of field
  11. ;--------------------------------------------------------------------------
  12. ; Initialize registers for program to use
  13. ;--------------------------------------------------------------------------
  14.         PUSH    BP              ; save base page register for Turbo
  15.         MOV     BP,SP           ; set base pointer equal to stack pointer
  16. ;--------------------------------------------------------------------------
  17. ;  Calculate Cursor Address in video memory
  18. ;--------------------------------------------------------------------------
  19.         MOV     AX,ROW[BP]      ; Get Row value from parameter list
  20.         DEC     AX              ; Decrement to fit format of 0..24 rows
  21.         MOV     DI,COLUMN[BP]   ; Get Column value from parameter list
  22.         DEC     DI              ; Decrement to fit format of 0.79 columns
  23.         MOV     BX,0040H        ; Get segment address of video info
  24.         MOV     ES,BX           ; Into Segment register (can't be done direct)
  25.         MUL     ES:WORD PTR[4AH]; Multiply row value by # of col's on screen
  26.         ADD     DI,AX           ; Position = (row-1)*Screen_width+(col-1)
  27.         SHL     DI,1            ; times 2 for: attrib + value screen format
  28.         INC     DI              ; Point at Attribute postion, not value!
  29.  
  30. ;--------------------------------------------------------------------------
  31. ; Set up for checking video retrace
  32. ;--------------------------------------------------------------------------
  33.         MOV     DX,ES:WORD PTR[63H] ; get address of video hardware
  34.         ADD     DX,6            ; Offset of port which sees retrace interrupt
  35.         MOV     AX,0B800H       ; Get segment address of video memory
  36.         MOV     ES,AX           ; Into Segment register
  37.         MOV     CX,FSIZE[BP]    ; Get # of bytes to fill from parameter list
  38.         CMP     CX,0            ; Check for zero length!
  39.         JE      EXIT            ; Abort if true!!!!
  40.         MOV     AH,ATTRIB[BP]   ; Get attribute value from parameter list
  41.  
  42. ;--------------------------------------------------------------------------
  43. ; Wait for retrace to end (so we can get a full blanking period)
  44. ;--------------------------------------------------------------------------
  45. TEST_LOW:
  46.         IN      AL,DX           ;
  47.         TEST    AL,1            ;
  48.         JNZ     TEST_LOW        ;
  49.         CLI                     ;
  50.  
  51. ;--------------------------------------------------------------------------
  52. ; Ok, now wait for next retrace! (blanking period)
  53. ;--------------------------------------------------------------------------
  54. TEST_HI:
  55.         IN      AL,DX           ;
  56.         TEST    AL,1            ;
  57.         JZ      TEST_HI         ;
  58.  
  59. ;--------------------------------------------------------------------------
  60. ; Now move attribute value to memory... (keep going until CX = 0!)
  61. ;--------------------------------------------------------------------------
  62.         MOV     ES:[DI],AH      ; Store attribute into video memory
  63.         INC     DI              ; Increment video pointer
  64.         INC     DI              ; Twice (to get past next value byte)
  65.         LOOP    TEST_LOW        ; Keep going until for "Size" # of bytes
  66.  
  67. ;--------------------------------------------------------------------------
  68. ; Turn interrupts back on, and exit!
  69. ;--------------------------------------------------------------------------
  70. EXIT:
  71.         POP     BP              ; restore base page register for Turbo
  72.         STI                     ; Turn interrupts back on
  73.  
  74.         RET     8               ; Exit, and clear stack behind us!
  75.