home *** CD-ROM | disk | FTP | other *** search
/ America's Premier Sharewa…& Public Domain Software / Americas_Premiere_Shareware_for_1993.iso / wallpapr / orch512.asm < prev    next >
Assembly Source File  |  1992-09-18  |  17KB  |  708 lines

  1.         COMMENT %
  2.  
  3.     GRAPHIC WORKSHOP VGA SCREEN DRIVER
  4.     COPYRIGHT (C) 1990 ALCHEMY MINDWORKS INC.
  5.     VERSION 1.1
  6.  
  7.     This is a skeletal driver for use as the
  8.     basis for writing custom SVGA loadable drivers
  9.     for Graphic Workshop. You will require the
  10.     hardware specific information about your
  11.     card to customize this driver.
  12.  
  13.     As it stands, the driver implements the code for
  14.     a stock VGA card running in mode 13H for 256
  15.     colour images, mode 12H for 16 colour images
  16.     and mode 11H for monochrome images.
  17.  
  18.     To generate a driver from this file, it must
  19.     be assembled using MASM, linked and converted
  20.     to a binary file with EXE2BIN.
  21.  
  22.     The binary driver file must be less than 64K in size...
  23.     not a likely problem.
  24.  
  25.     Best of cosmic luck...
  26.  
  27.         %
  28.  
  29. VERSION        EQU    1        ;VERSION NUMBER
  30. SUBVERSION    EQU    1        ;SUBVERSION NUMBER
  31.  
  32. _AOFF        EQU    6        ;STACK OFFSET
  33.  
  34. VGA_WIDE    EQU    320        ;WIDTH OF VGA SCREEN IN PIXELS
  35. VGA_DEEP    EQU    200        ;DEPTH OF VGA SCREEN IN PIXELS
  36. VGA_SCREENSEG    EQU    0A000H        ;SEGMENT OF VGA SCREEN
  37. EGA_WIDE    EQU    640        ;WIDTH OF EGA SCREEN IN PIXELS
  38. EGA_DEEP    EQU    350        ;DEPTH OF EGA SCREEN IN PIXELS
  39. EGA_BYTES    EQU    80        ;WIDTH OF EGA SCREEN IN BYTES
  40. EGA_SCREENSEG    EQU    0A000H        ;SEGMENT OF EGA SCREEN
  41. MONO_WIDE    EQU    640        ;WIDTH OF MONO SCREEN IN PIXELS
  42. MONO_DEEP    EQU    480        ;DEPTH OF MONO SCREEN IN PIXELS
  43. MONO_BYTES    EQU    80        ;WIDTH OF MONO SCREEN IN BYTES
  44. MONO_SCREENSEG    EQU    0A000H        ;SEGMENT OF MONO SCREEN
  45.  
  46. ;THIS MACRO SELECTS AN EGA PLANE
  47. EGAPLANE        MACRO    ARG1
  48.         MOV    AL,2
  49.         MOV    DX,03C4H
  50.         OUT    DX,AL
  51.         INC    DX
  52.         MOV    AL,ARG1
  53.         OUT    DX,AL
  54.         ENDM
  55.  
  56. CODE        SEGMENT PARA PUBLIC 'CODE'
  57.         ASSUME    CS:CODE
  58.  
  59.         ORG    0000H        ;ORIGIN FOR LOADABLE DRIVER
  60.  
  61.         DB    'ALCHDRV2'    ;SIGNATURE - DON'T CHANGE THIS
  62.  
  63. ;THE FOLLOWING ARE THE POINTERS TO THE CALLABLE ROUTINES AND THE COMMON
  64. ;DATA. THE SEGMENTS ARE FILLED IN BY GRAPHIC WORKSHOP. DON'T CHANGE ANYTHING.
  65. DISPATCH    PROC    FAR
  66.         DW      VGA_ON        ;FAR POINTER TO VGA MODE SELECT
  67.         DW      ?
  68.         DW    VGA_LINE    ;FAR POINTER TO VGA LINE DISPLAY
  69.         DW    ?
  70.         DW    VGA_OFF        ;FAR POINTER TO VGA MODE DESELECT
  71.         DW    ?
  72.         DW    VGA_PALETTE    ;FAR POINTER TO VGA PALETTE SET
  73.         DW    ?
  74.         DW    VGA_OVERSCAN    ;FAR POINTER TO VGA OVERSCAN SET
  75.         DW    ?
  76.         DW      EGA_ON        ;FAR POINTER TO EGA MODE SELECT
  77.         DW      ?
  78.         DW    EGA_LINE    ;FAR POINTER TO EGA LINE DISPLAY
  79.         DW    ?
  80.         DW    EGA_OFF        ;FAR POINTER TO EGA MODE DESELECT
  81.         DW    ?
  82.         DW    EGA_PALETTE    ;FAR POINTER TO EGA PALETTE SET
  83.         DW    ?
  84.         DW      MONO_ON        ;FAR POINTER TO MONO MODE SELECT
  85.         DW      ?
  86.         DW    MONO_FRAME    ;FAR POINTER TO MONO PAGE DISPLAY
  87.         DW    ?
  88.         DW    MONO_LINE    ;FAR POINTER TO MONO LINE DISPLAY
  89.         DW    ?
  90.         DW    MONO_OFF    ;FAR POINTER TO MONO MODE DESELECT
  91.         DW    ?
  92.         DW    0,0        ;NULL ONE
  93.         DW    0,0        ;NULL TWO
  94.         DW    0,0        ;NULL THREE
  95.         DW    0,0        ;NULL FOUR
  96.  
  97. V_VGAWIDE    DW    ?           ;VGA SCREEN WIDTH
  98. V_VGADEEP    DW    ?           ;VGA SCREEN DEPTH
  99. V_VGASCRNSEG    DW    VGA_SCREENSEG    ;VGA SCREEN SEGMENT
  100. V_EGAWIDE    DW    ?           ;EGA SCREEN WIDTH
  101. V_EGADEEP    DW    ?           ;EGA SCREEN DEPTH
  102. V_EGABYTES    DW    ?           ;EGA SCREEN BYTES
  103. V_EGASCRNSEG    DW    EGA_SCREENSEG    ;EGA SCREEN SEGMENT
  104. V_MONOWIDE    DW    MONO_WIDE    ;MONO SCREEN WIDTH
  105. V_MONODEEP    DW    MONO_DEEP    ;MONO SCREEN DEPTH
  106. V_MONOBYTES    DW    MONO_BYTES    ;BYTE WIDTH ON MONOCHROME SCREEN
  107. V_MONOSCRNSEG    DW    MONO_SCREENSEG    ;MONOCHROME SCREEN SEGMENT
  108.  
  109. ;THESE VERSION NUMBERS REFLECT THE DRIVER TEMPLATE VERSION AND THE
  110. ;VERSION OF THE DRIVER ITSELF. YOU CAN CHANGE THE SUBVERSION VALUE
  111. ;TO REFLECT CHANGES IN YOUR DRIVER. THE VERSION VALUE MUST REMAIN
  112. ;UNCHANGED OR GRAPHIC WORKSHOP MAY REJECT YOUR DRIVER.
  113.         DW    VERSION
  114.         DW    SUBVERSION
  115.  
  116. ;THE DESCRIPTION APPEARS IN THE F10 "ABOUT" BOX IN GRAPHIC
  117. ;WORKSHOP WHEN AN EXTERNAL DRIVER IS BEING USED. IT CAN'T
  118. ;EXCEED 24 CHARACTERS AND MUST BE NULL TERMINATED
  119.         DB      'Orchid 512K ProDesigner',0
  120. DISPATCH        ENDP
  121.  
  122. ;THIS ROUTINE SELECTS THE VGA 256 COLOUR MODE
  123. ;THE HEIGHT AND WIDTH OF THE IMAGE ARE ON THE STACK - THESE
  124. ;MAY BE USEFUL IF YOU WANT TO PICK ONE OF SEVERAL AVAILABLE
  125. ;MODES BASED ON THE AREA OF THE PICTURE TO BE DISPLAYED
  126. VGA_ON        PROC    NEAR
  127.                 PUSH    BP
  128.                 MOV     BP,SP
  129.         PUSH    DS
  130.  
  131.                 MOV     AX,[BP+_AOFF]           ;GET WIDTH
  132.                 MOV     BX,[BP+_AOFF+2]         ;GET HEIGHT
  133.                 CMP     AX,320
  134.                 JE      SET_320x200
  135.                 CMP     AX,640
  136.                 JE      SET_640
  137.                 CMP     AX,800
  138.                 JE      SET_800x600
  139.                 JMP     SET_640                 ;DEFAULT TO 640x480
  140.  
  141. SET_320x200:    MOV     AX,013H
  142.                 MOV     CS:[BytesTx],AX
  143.                 MOV     V_VGAWIDE,320
  144.                 MOV     V_VGADEEP,200
  145.                 JMP     MODE_IS_SET
  146.  
  147. SET_640:        MOV     V_VGAWIDE,640
  148.                 CMP     BX,350
  149.                 JNE     NOT_350
  150.                 MOV     V_VGADEEP,350
  151.                 MOV     AX,02DH
  152.                 MOV     CS:[BytesTx],AX
  153.                 JMP     MODE_IS_SET
  154. NOT_350:        CMP     BX,400
  155.                 JNE     NOT_400
  156.                 MOV     V_VGADEEP,400
  157.                 MOV     AX,02DH ;NOTE: The 400 line mode for Tseng is 02FH but is not supported by Orchid
  158.                 MOV     CS:[BytesTx],AX
  159.                 JMP     MODE_IS_SET
  160. NOT_400:        MOV     V_VGADEEP,480
  161.                 MOV     AX,02EH
  162.                 MOV     CS:[BytesTx],AX
  163.                 JMP     MODE_IS_SET
  164.  
  165. SET_800x600:    MOV     V_VGAWIDE,800
  166.                 MOV     V_VGADEEP,600
  167.                 MOV     AX,030H
  168.                 MOV     CS:[BytesTx],AX
  169.  
  170. MODE_IS_SET:    MOV    AX,CS
  171.         MOV    DS,AX
  172.         MOV    CX,V_VGADEEP        ;DEPTH OF SCREEN
  173.         SUB    DX,DX
  174.         MOV    SI,OFFSET SCREENTABLE
  175.  
  176. VGA_ON1:    PUSH    DX
  177.         MOV    AX,V_VGAWIDE        ;WIDTH OF SCREEEN
  178.         MUL    DX
  179.         MOV    [SI],AX
  180.         ADD    SI,2
  181.         POP    DX
  182.         INC    DX
  183.         LOOP    VGA_ON1
  184.  
  185.                 MOV     DX,03C4H                ;Set Tseng registers
  186.                 MOV     AL,0
  187.                 OUT     DX,AL
  188.                 MOV     DX,03C5H
  189.                 IN      AL,DX
  190.                 AND     AL,0FEH
  191.                 OUT     DX,AL
  192.                 MOV     DX,03CEH
  193.                 MOV     AL,06H
  194.                 OUT     DX,AL
  195.                 MOV     DX,03CFH
  196.                 IN      AL,DX
  197.                 XOR     AL,06H
  198.                 OR      AL,02H
  199.                 OUT     DX,AL
  200.  
  201.         MOV    AX,CS:[BytesTx]
  202.         INT    10H
  203.  
  204.         POP    DS
  205.                 POP     BP
  206.         RETF
  207. VGA_ON        ENDP
  208.  
  209. ;THIS ROUTINE DISPLAYS A VGA LINE
  210. ;THE FIRST ARGUMENT ON THE STACK (2 WORDS) IS A FAR POINTER TO
  211. ;THE LINE. THE SECOND ARGUMENT IS THE LENGTH OF THE LINE IN PIXELS
  212. VGA_LINE    PROC    NEAR
  213.         PUSH    BP
  214.         MOV    BP,SP
  215.         PUSH    DS
  216.         PUSH    ES
  217.  
  218.         MOV    SI,[BP + _AOFF + 0]    ;OFFSET OF SOURCE
  219.         MOV    DS,[BP + _AOFF + 2]    ;SEGMENT OF SOURCE
  220.         MOV     BX,[BP + _AOFF + 6]    ;GET LINE NUMBER
  221.         CMP    BX,V_VGADEEP
  222.         JGE    SHOWVGAX
  223.  
  224.                 MOV     AX,V_VGAWIDE
  225.                 MUL     BX
  226.                 MOV     CX,0FFFFH
  227.                 DIV     CX
  228.  
  229.                 MOV     CS:[CurBank],AL
  230.                 MOV     CS:[BytesTx],DX
  231.                 CALL    NEW_BANK
  232.  
  233.                SHL    BX,1
  234.         MOV    DI,CS:[SCREENTABLE+BX]
  235.         CLD
  236.         MOV    CX,[BP + _AOFF + 4]    ;LENGTH OF MOVE IN BYTES
  237.         CMP    CX,0
  238.         JE    SHOWVGAX        ;CHECK FOR NASTIES
  239.         CMP    CX,V_VGAWIDE
  240.         JL      SHOWVGA1
  241.         MOV    CX,V_VGAWIDE
  242. SHOWVGA1:    MOV    AX,VGA_SCREENSEG
  243.         MOV    ES,AX
  244.  
  245.                 MOV     AX,CS:[BytesTx]
  246.  
  247. MOV_BYTES:      MOVSB
  248.                 INC     AX
  249.                 CMP     AX,0FFFFH
  250.                 JNE     NO_NEW_BANK
  251.                 MOV     AL,CS:[CurBank]
  252.                 INC     AL
  253.                 CALL    NEW_BANK
  254. NO_NEW_BANK:    LOOP    MOV_BYTES
  255.  
  256. SHOWVGAX:    POP    ES
  257.         POP    DS
  258.         POP    BP
  259.         RETF
  260.  
  261. VGA_LINE    ENDP
  262.  
  263. ;THIS ROUTINE SHIFTS Tseng TO A NEW MEMORY BANK
  264.  
  265. NEW_BANK        PROC    NEAR
  266.  
  267.                 AND     AL,7
  268.                 MOV     AH,AL
  269.                 SHL     AH,1
  270.                 SHL     AH,1
  271.                 SHL     AH,1
  272.                 OR      AL,AH
  273.                 OR      AL,01000000b
  274.                 MOV     DX,03CDH
  275.                 OUT     DX,AL
  276.                 XOR     AX,AX
  277.  
  278.                 RET
  279.  
  280. NEW_BANK        ENDP
  281.  
  282. ;THIS ROUTINE DESELECTS THE VGA 256 COLOUR MODE
  283. VGA_OFF        PROC    NEAR
  284.         MOV    AX,1200H
  285.         MOV    BX,0031H
  286.         INT    10H
  287.  
  288.         MOV    AX,0003H
  289.         INT    10H
  290.         RETF
  291. VGA_OFF        ENDP
  292.  
  293. ;THIS ROUTINE SETS THE VGA PALETTE
  294. ;THE FIRST ARGUMENT ON THE STACK IS A FAR POINTER TO
  295. ;THE PALETTE DATA. THE SECOND ARGUMENT IS THE NUMBER OF COLOURS.
  296. VGA_PALETTE    PROC    NEAR
  297.         PUSH    BP
  298.         MOV    BP,SP
  299.         PUSH    DS
  300.         PUSH    ES
  301.         MOV    AX,CS
  302.         MOV    ES,AX
  303.  
  304.         MOV    SI,[BP + _AOFF + 0]    ;OFFSET OF SOURCE
  305.         MOV    DS,[BP + _AOFF + 2]    ;SEGMENT OF SOURCE
  306.  
  307.         MOV    CX,[BP + _AOFF + 4]    ;NUMBER OF COLOURS
  308.         MOV    DI,OFFSET VGAPALETTE
  309.  
  310.                 CMP    CX,0            ;CHECK FOR NASTIES
  311.         JG    GVP0
  312.         JMP    GVPX
  313.  
  314.         ;WE'LL SET THE PALLETTE USING DIRECT REGISTERS RATHER
  315.         ;THAN A BIOS CALL AS IT LOOKS NICER
  316.  
  317. GVP0:        MOV    DX,03C6H
  318.         MOV    AL,0FFH
  319.         OUT    DX,AL
  320.  
  321.         MOV    BX,0
  322.  
  323. GVP1:        PUSH    CX
  324.         MOV    DX,03C8H
  325.         MOV    AL,BL
  326.         INC    BX
  327.         OUT    DX,AL
  328.  
  329.         INC    DX
  330.  
  331.         LODSB
  332.         SHR    AL,1
  333.         SHR    AL,1
  334.         OUT    DX,AL
  335.  
  336.         LODSB
  337.         SHR    AL,1
  338.         SHR    AL,1
  339.         OUT    DX,AL
  340.  
  341.         LODSB
  342.         SHR    AL,1
  343.         SHR    AL,1
  344.         OUT    DX,AL
  345.  
  346.         POP    CX
  347.         LOOP    GVP1
  348.  
  349.  
  350.         COMMENT &
  351.  
  352. GVP0:           PUSH    CX
  353.         LODSB
  354.         SHR    AL,1
  355.         SHR    AL,1
  356.         STOSB
  357.         LODSB
  358.         SHR    AL,1
  359.         SHR    AL,1
  360.         STOSB
  361.         LODSB
  362.         SHR    AL,1
  363.         SHR    AL,1
  364.         STOSB
  365.  
  366.         POP    CX
  367.         LOOP    GVP0
  368.  
  369.         MOV    AX,1012H                ;POINT TO THE PALETTE
  370.         MOV    BX,0000H
  371.         MOV    CX,256
  372.         MOV    DX,OFFSET VGAPALETTE
  373.         INT    10H
  374.  
  375.             &
  376.  
  377. GVPX:       POP    ES
  378.         POP    DS
  379.         POP    BP
  380.         RETF
  381. VGA_PALETTE    ENDP
  382.  
  383. ;THIS ROUTINE SETS THE VGA OVERSCAN.
  384. ;THE FIRST STACK ARGUMENT IS THE COLOUR NUMBER.
  385. VGA_OVERSCAN    PROC    NEAR
  386.         PUSH    BP
  387.         MOV    BP,SP
  388.         MOV    AX,1001H
  389.         MOV    BX,[BP + _AOFF + 0]
  390.         XCHG    BH,BL
  391.         INT    10H
  392.         POP    BP
  393.         RETF
  394. VGA_OVERSCAN    ENDP
  395.  
  396. ;THIS ROUTINE SELECTS THE EGA 16 COLOUR MODE
  397. ;THE HEIGHT AND WIDTH OF THE IMAGE ARE ON THE STACK - THESE
  398. ;MAY BE USEFUL IF YOU WANT TO PICK ONE OF SEVERAL AVAILABLE
  399. ;MODES BASED ON THE AREA OF THE PICTURE TO BE DISPLAYED
  400. EGA_ON        PROC    NEAR
  401.                 PUSH    BP
  402.                 MOV     BP,SP
  403.         PUSH    DS
  404.  
  405.                 MOV     AX,[BP+_AOFF]           ;GET WIDTH
  406.                 MOV     BX,[BP+_AOFF+2]         ;GET HEIGHT
  407.                 CMP     AX,320
  408.                 JE      SET_320x200E
  409.                 JMP     SET_640E                ;DEFAULT TO 640x350
  410.  
  411. SET_320x200E:   MOV     V_EGABYTES,40
  412.                 MOV     AX,0DH
  413.                 MOV     CS:[BytesTx],AX
  414.                 MOV     V_EGAWIDE,320
  415.                 MOV     V_EGADEEP,200
  416.                 JMP     MODE_IS_SETE
  417.  
  418. SET_640E:       MOV     V_EGABYTES,80
  419.                 MOV     V_EGAWIDE,640
  420.                 CMP     BX,480
  421.                 JNE     NOT_480E
  422.                 MOV     V_EGADEEP,480
  423.                 MOV     AX,012H
  424.                 MOV     CS:[BytesTx],AX
  425.                 JMP     MODE_IS_SETE
  426. NOT_480E:       CMP     BX,200
  427.                 JNE     NOT_200E
  428.                 MOV     V_EGADEEP,200
  429.                 MOV     AX,00EH
  430.                 MOV     CS:[BytesTx],AX
  431.                 JMP     MODE_IS_SETE
  432. NOT_200E:       MOV     V_EGADEEP,350
  433.                 MOV     AX,010H
  434.                 MOV     CS:[BytesTx],AX
  435.                 JMP     MODE_IS_SETE
  436.  
  437. MODE_IS_SETE:   MOV    AX,CS
  438.         MOV    DS,AX
  439.         MOV    CX,V_EGADEEP        ;DEPTH OF SCREEN
  440.         SUB    DX,DX
  441.         MOV    SI,OFFSET SCREENTABLE
  442.  
  443. EGA_ON1:    PUSH    DX
  444.         MOV    AX,V_EGABYTES        ;WIDTH OF SCREEEN
  445.         MUL    DX
  446.         MOV    [SI],AX
  447.         ADD    SI,2
  448.         POP    DX
  449.         INC    DX
  450.         LOOP    EGA_ON1
  451.  
  452.         MOV    AX,CS:[BytesTx]
  453.         INT    10H
  454.         POP    DS
  455.                 POP     BP
  456.         RETF
  457. EGA_ON        ENDP
  458.  
  459. ;THIS ROUTINE DISPLAYS AN EGA LINE
  460. ;THE FIRST ARGUMENT ON THE STACK (2 WORDS) IS A FAR POINTER TO
  461. ;THE LINE. THE SECOND ARGUMENT IS THE LENGTH OF THE LINE IN BYTES
  462. EGA_LINE    PROC    NEAR
  463.         PUSH    BP
  464.         MOV    BP,SP
  465.         PUSH    DS
  466.         PUSH    ES
  467.  
  468.         MOV    SI,[BP + _AOFF + 0]    ;OFFSET OF SOURCE
  469.         MOV    DS,[BP + _AOFF + 2]    ;SEGMENT OF SOURCE
  470.         MOV     BX,[BP + _AOFF + 6]    ;GET LINE NUMBER
  471.         CMP    BX,V_EGADEEP
  472.         JGE    SHOWEGAX
  473.  
  474.         SHL    BX,1
  475.         MOV    DI,CS:[SCREENTABLE+BX]
  476.  
  477.         MOV    AX,0A000H
  478.         MOV    ES,AX
  479.         MOV    BX,[BP + _AOFF + 4]    ;LENGTH OF MOVE IN BYTES
  480.  
  481.         MOV    CX,BX
  482.         EGAPLANE    1
  483.         CLD
  484.         PUSH    DI
  485.     REPNE    MOVSB
  486.         POP    DI
  487.  
  488.         MOV    CX,BX
  489.         EGAPLANE    2
  490.         PUSH    DI
  491.     REPNE    MOVSB
  492.         POP    DI
  493.  
  494.         MOV    CX,BX
  495.         EGAPLANE    4
  496.         PUSH    DI
  497.     REPNE    MOVSB
  498.         POP    DI
  499.  
  500.         MOV    CX,BX
  501.         EGAPLANE    8
  502.         PUSH    DI
  503.     REPNE    MOVSB
  504.         POP    DI
  505.         EGAPLANE    0FH
  506.  
  507. SHOWEGAX:    POP    ES
  508.         POP    DS
  509.         POP    BP
  510.         RETF
  511. EGA_LINE    ENDP
  512.  
  513. ;THIS ROUTINE SETS THE EGA PALETTE
  514. ;THE FIRST ARGUMENT ON THE STACK IS A FAR POINTER TO
  515. ;THE PALETTE DATA. THE SECOND ARGUMENT IS THE NUMBER OF COLOURS.
  516. EGA_PALETTE    PROC    NEAR
  517.         PUSH    BP
  518.         MOV    BP,SP
  519.         PUSH    DS
  520.  
  521.         MOV    SI,[BP + _AOFF + 0]    ;OFFSET OF SOURCE
  522.         MOV    DS,[BP + _AOFF + 2]    ;SEGMENT OF SOURCE
  523.  
  524.         MOV    CX,[BP + _AOFF + 4]    ;NUMBER OF COLOURS
  525.         SUB    BX,BX
  526.                 CMP    CX,16
  527.         JLE    EGA_PALETTE1
  528.         MOV    CX,16
  529. EGA_PALETTE1:    MOV    BH,[SI]
  530.         MOV    AX,1000H
  531.         INT    10H
  532.         INC    BL
  533.         INC    SI
  534.         LOOP    EGA_PALETTE1
  535.  
  536.         POP    DS
  537.         POP    BP
  538.         RETF
  539. EGA_PALETTE    ENDP
  540.  
  541. ;THIS ROUTINE DESELECTS THE EGA 16 COLOUR MODE
  542. EGA_OFF        PROC    NEAR
  543.         MOV    AX,0003H
  544.         INT    10H
  545.         RETF
  546. EGA_OFF        ENDP
  547.  
  548. ;THIS ROUTINE SELECTS THE 2 COLOUR MODE
  549. ;THE HEIGHT AND WIDTH OF THE IMAGE ARE ON THE STACK - THESE
  550. ;MAY BE USEFUL IF YOU WANT TO PICK ONE OF SEVERAL AVAILABLE
  551. ;MODES BASED ON THE AREA OF THE PICTURE TO BE DISPLAYED
  552. MONO_ON        PROC    NEAR
  553.         PUSH    DS
  554.         PUSH    ES
  555.         MOV    AX,CS
  556.         MOV    DS,AX
  557.         MOV    ES,AX
  558.         MOV    AX,0011H
  559.         INT    10H
  560.  
  561.         MOV    CX,MONO_DEEP
  562.         SUB    DX,DX
  563.         MOV    SI,OFFSET SCREENTABLE
  564.  
  565. MONO_ON1:    PUSH    DX
  566.         MOV    AX,MONO_BYTES
  567.         MUL    DX
  568.         MOV    [SI],AX
  569.         ADD    SI,2
  570.         POP    DX
  571.         INC    DX
  572.         LOOP    MONO_ON1
  573.  
  574.         POP     ES
  575.         POP    DS
  576.         SUB    AX,AX
  577.         RETF
  578. MONO_ON        ENDP
  579.  
  580. UPDATE_MOVE    EQU    2
  581. UPDATE_PAD    EQU    4
  582. UPDATE_ADJUST    EQU    6
  583.  
  584. ;THIS ROUTINE DISPLAYS A FULL MONOCHROME PAGE
  585. ;THE FIRST ARGUMENT ON THE STACK IS A FAR POINTER TO THE PAGE
  586. ;THE SECOND ARGUMENT IS THE WIDTH OF THE BITMAP (IN BYTES)
  587. ;THE THIRD ARGUMENT IS THE NUMBER OF LINES TO DISPLAY
  588. ;NOTE: THE SOURCE BUFFER MAY BE BIGGER THAN 64K.
  589. MONO_FRAME    PROC    NEAR
  590.         PUSH    BP
  591.         MOV    BP,SP
  592.         SUB    SP,UPDATE_ADJUST
  593.         PUSH    DS
  594.         PUSH    ES
  595.  
  596.         MOV    AX,MONO_SCREENSEG    ;POINT TO THE SCREEN
  597.         MOV    ES,AX
  598.         MOV    AX,[BP + _AOFF + 4]        ;GET THE WIDTH OF MOVE
  599.         MOV    [BP - UPDATE_MOVE],AX    ;SAVE IT LOCALLY
  600.         MOV    WORD PTR [BP - UPDATE_PAD],0    ;SET ADJUSTMENT
  601.  
  602.         CMP    AX,MONO_BYTES        ;IF THE MOVE IS LESS THAN
  603.         JL    UPDATE0            ;SCREEN WIDTH, GO FOR IT
  604.  
  605.         SUB    AX,MONO_BYTES        ;ELSE, SET MOVE WIDTH
  606.         MOV    [BP - UPDATE_PAD],AX    ;...AND THE AMOUNT TO
  607.  
  608.         MOV    AX,MONO_BYTES        ;...ADJUST THE POINTER
  609.         MOV    [BP - UPDATE_MOVE],AX    ;...AFTER EACH LINE
  610.  
  611. UPDATE0:    MOV    SI,[BP + _AOFF + 0]    ;OFFSET OF BITMAP
  612.         MOV    DS,[BP + _AOFF + 2]    ;SEGMENT OF BITMAP
  613.         MOV    CX,[BP + _AOFF + 6]    ;NUMBER OF LINES
  614.  
  615.         CLD                ;CLEAR DIRECTION FLAG
  616.         SUB    BX,BX
  617.  
  618. UPDATE1:    PUSH    CX            ;SAVE COUNT (LINE NUMBER)
  619.  
  620.         MOV    DI,CS:[SCREENTABLE + BX]
  621.         ADD    BX,2            ;POINT TO NEXT LINE
  622.  
  623.         MOV    CX,[BP - UPDATE_MOVE]    ;GET THE MOVE SIZE
  624.     REPNE    MOVSB                ;DO THE MOVE
  625.  
  626.         ADD    SI,[BP - UPDATE_PAD]    ;ADJUST THE POINTER
  627.  
  628.         CMP    SI,0F800H        ;ARE WE WITHIN 2K OF TOP?
  629.         JL      UPDATE2            ;IF NOT, CARRY ON
  630.  
  631.         MOV    AX,SI            ;SEE HOW MANY SEGMENTS ARE
  632.         MOV    CL,4            ;...IN SI (SI DIV 4)
  633.         SHR    AX,CL
  634.  
  635.         MOV    CX,DS            ;ADD THEM TO THE DATA SEGMENT
  636.         ADD    CX,AX            ;...(YOU CAN'T JUST ADD DS,AX)
  637.         MOV    DS,CX
  638.         AND    SI,000FH        ;ADJUST SI (SI MOD 16)
  639.  
  640. UPDATE2:    POP    CX            ;GET COUNT BACK
  641.         LOOP    UPDATE1                    ;DECREMENT AND LOOP
  642.  
  643.         POP    ES
  644.         POP    DS
  645.  
  646.         ADD    SP,UPDATE_ADJUST
  647.         POP    BP
  648.  
  649.         RETF
  650. MONO_FRAME    ENDP
  651.  
  652. ;THIS ROUTINE DISPLAYS A SINGLE MONOCHROME LINE
  653. ;THE FIRST ARGUMENT ON THE STACK IS A FAR POINTER TO THE LINE
  654. ;THE SECOND ARGUMENT IS THE LINE NUMBER
  655. ;THE THIRD ARGUMENT IS THE WIDTH OF THE BITMAP (IN BYTES)
  656. MONO_LINE    PROC    NEAR
  657.         PUSH    BP
  658.         MOV    BP,SP
  659.  
  660.         PUSH    DS
  661.         PUSH    ES
  662.  
  663.         MOV    AX,MONO_SCREENSEG    ;POINT TO THE SCREEN
  664.         MOV    ES,AX
  665.  
  666.         MOV    CX,[BP + _AOFF + 6]        ;GET THE WIDTH OF MOVE
  667.         CMP    CX,0
  668.         JE    MONO_LINE2
  669.         CMP    CX,MONO_BYTES
  670.         JL    MONO_LINE1
  671.         MOV    CX,MONO_BYTES
  672.  
  673. MONO_LINE1:    MOV    SI,[BP + _AOFF + 0]    ;OFFSET OF BITMAP
  674.         MOV    DS,[BP + _AOFF + 2]    ;SEGMENT OF BITMAP
  675.         MOV    BX,[BP + _AOFF + 4]    ;NUMBER OF LINE
  676.         SHL    BX,1
  677.  
  678.         CLD                ;CLEAR DIRECTION FLAG
  679.         MOV    DI,CS:[SCREENTABLE + BX]
  680.     REPNE    MOVSB                ;DO THE MOVE
  681.  
  682. MONO_LINE2:    POP    ES
  683.         POP    DS
  684.  
  685.         POP    BP
  686.         RETF
  687. MONO_LINE    ENDP
  688.  
  689. ;THIS ROUTINE DESELECTS THE 2 COLOUR MODE
  690. MONO_OFF    PROC    NEAR
  691.         MOV    AX,0003H
  692.         INT    10H
  693.         SUB    AX,AX
  694.         RETF
  695. MONO_OFF    ENDP
  696.  
  697. ;THIS IS A LINE START LOOKUP TABLE
  698.  
  699. SCREENTABLE    DW    MONO_DEEP DUP(?)    ;LINE START TABLE
  700.  
  701. ;THIS IS WHERE THE VGA PALETTE IS STORED
  702. VGAPALETTE    DB    768 DUP(?)        ;PALETTE
  703. CurBank         DB      ?                       ;Current VRAM Bank
  704. BytesTx         DW      ?                       ;Bytes transferred
  705. CODE        ENDS
  706.         END
  707.  
  708.