home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / grafik / hgdemo / hgdemo.asm next >
Assembly Source File  |  1993-07-12  |  26KB  |  1,420 lines

  1.     PAGE    60,132
  2.     TITLE  HGDEMO   GRAPHICS PACKAGE FOR HERCULES CARD
  3.     DOSSEG
  4.     .MODEL  SMALL
  5.  
  6. ;***********************************************************************
  7. ; HGDEMO       Title: HERCULES GRAPHICS PACKAGE DEMO                   *
  8. ;                                                                      *
  9. ; Programmer: Scott A. Armitage     (c) 1993                           *
  10. ;                                                                      *
  11. ; Purpose: Illustrate the use of HIGH resolution graphics              *
  12. ;          routines for HGA display.                                   *
  13. ;                                                                      *
  14. ;                                                                      *
  15. ; Special Requirements: Must use a HERCULES CARD                       *
  16. ;***********************************************************************
  17.  
  18.  
  19. GLOBAL SCRN_ADR:WORD, PLOT_SUB:WORD
  20.  
  21. ;  some equates....
  22.  
  23. ;  HGA port address           used by _gmode, _tmode & setmd procs.
  24. index equ 03b4h
  25. cntrl equ 03b8h
  26.  
  27. ;        control    codes
  28. scrn_on           equ        8
  29. grph               equ        2
  30. text               equ        20h
  31.  
  32.  
  33. SX_MIN   EQU  0      ; MIN/MAX X/Y VALUES FOR HGA HIGH RES...
  34. SX_MAX   EQU  719
  35. SY_MIN   EQU  0
  36. SY_MAX   EQU  347
  37.  
  38. HGA_ADR  EQU  0B000H  ; HGA SCREEN ADR
  39.  
  40. FNT_LEN  EQU 8        ; SIZE OF CHARS IN TABLE - FOR DSPLY_MGS PROC...
  41.  
  42.  
  43.  
  44. .CODE
  45.  
  46. MAIN PROC FAR
  47.  
  48.     MOV  AX,@DATA
  49.     MOV  DS,AX        ; GET ADDRESSABILITY TO OUR DATA SEGMENT
  50.  
  51.     CALL SET_MODE     ; SET TO GRAPHICS HIGH RESOLUTION MODE
  52.  
  53.  
  54.     MOV  DX,3
  55.     MOV  BX,9
  56.     MOV  CX,4
  57.     MOV  AX,7
  58.  
  59.     CALL G_FR_2
  60.  
  61.  
  62.     LEA SI,HR_MESS
  63.     CALL DSPLY_MSG
  64.  
  65.     LEA SI,SA_MESS
  66.     CALL DSPLY_MSG
  67.     CALL WOW_WHEE    ; display "wow" in 7 sizes.... font scaleing demo
  68.  
  69.  
  70.     ; START OF MAIN LOOP, DRAW SCREENS UNTIL KEYHIT.....
  71.  
  72. LLLS:
  73.     CALL CLR_FR    ; CLEAR SCREEN AND FRAME IT....
  74.  
  75.     CALL STEP_ADJ  ; ADJUST SOME COORDINATE VALUES....
  76.     CALL CHK_KBD   ; CHECK KEYBOARD...
  77.     JNZ MX_T0
  78.  
  79.     LEA SI,FRAME_DAT   ; SET UP FOR CALL TO SWEEP BOX...
  80.     MOV  X1,359
  81.     MOV  Y1,170
  82.     MOV  X2,83
  83.     MOV  Y2,23
  84.     CALL SWEEP_BOX     ; DRAW BOX FULL OF SWEEPING LINES...
  85.  
  86.     CALL STEP_ADJ      ; ADJUST SOME COORDINATES AGAIN...
  87.  
  88.     CALL DELAY         ; WAIT A BIT AND DO MORE OF THE SAME....
  89.  
  90.     CALL CHK_KBD
  91.     JNZ MX_T0
  92.  
  93.    LEA SI,FRAME_DAT
  94.     MOV  X1,359
  95.     MOV  Y1,170
  96.     MOV  X2,283
  97.     MOV  Y2,123
  98.     CALL SWEEP_BOX
  99.  
  100.     CALL DELAY
  101.     CALL STEP_ADJ
  102.  
  103.     CALL CHK_KBD
  104. MX_T0:
  105.     JNZ MX_TARG_0
  106.  
  107.     CALL STEP_ADJ
  108.  
  109.     LEA  SI,CIRCLE_DATA          ;SET UP FOR DRAWING 3 CIRCLES...
  110.     MOV  WORD PTR [SI+4],140
  111.     MOV  WORD PTR [SI+8],1100
  112.  
  113. REPEAT:
  114.  
  115.     CALL CHK_KBD
  116.     JNZ  MX_TARG
  117.  
  118.     SUB  WORD PTR [SI],150
  119.     CALL CIRCLE
  120.     ADD  WORD PTR [SI],150
  121.     CALL CIRCLE
  122.     ADD  WORD PTR [SI],150
  123.     CALL CIRCLE
  124.     SUB  WORD PTR [SI],150
  125.     SUB  WORD PTR [SI+4],AX
  126.     JG   REPEAT
  127.  
  128.     CALL DELAY
  129.  
  130.     CALL CHK_KBD
  131. MX_TARG_0:
  132.     JNZ  MX_TARG
  133.  
  134.     CALL CLR_FR          ; CLEAR WHOLE SCREEN
  135.     CALL STEP_ADJ
  136.  
  137.  
  138.    LEA SI,FRAME_DAT
  139.     MOV  X1,359
  140.     MOV  Y1,170
  141.     MOV  X2,122
  142.     MOV  Y2,84
  143.     CALL SWEEP_BOX
  144.  
  145.     CALL DELAY
  146.     CALL STEP_ADJ
  147.  
  148.  
  149.  
  150.  
  151.     LEA  SI,CIRCLE_DATA            ; DRAW SOME MORE CIRCLES....
  152.     MOV  WORD PTR [SI+4],155
  153.     MOV  WORD PTR [SI+8],1000
  154.  
  155. REPEAT1:
  156.  
  157.     CALL CHK_KBD
  158. MX_TARG:
  159.     JNZ  MX_TARGIT
  160.  
  161.     SUB  WORD PTR [SI],150
  162.     CALL CIRCLE
  163.     ADD  WORD PTR [SI],150
  164.     CALL CIRCLE
  165.     ADD  WORD PTR [SI],150
  166.     CALL CIRCLE
  167.     SUB  WORD PTR [SI],150
  168.     SUB  WORD PTR [SI+4],AX
  169.  
  170.     JG   REPEAT1
  171.  
  172.  
  173.     CALL DELAY
  174.     CALL CLR_FR          ; CLEAR WHOLE SCREEN
  175.  
  176.  
  177.     CALL STEP_ADJ
  178.  
  179.     LEA  SI,CIRCLE_DATA
  180.     MOV  WORD PTR [SI+4],115
  181.     MOV  WORD PTR [SI+8],600
  182.  
  183. REPEAT2:
  184.     CALL CHK_KBD
  185.     JNZ  MX_TARGIT
  186.     SUB  WORD PTR [SI],175
  187.     CALL CIRCLE
  188.     ADD  WORD PTR [SI],175
  189.     CALL CIRCLE
  190.     ADD  WORD PTR [SI],175
  191.     CALL CIRCLE
  192.     SUB  WORD PTR [SI],175
  193.     SUB  WORD PTR [SI+4],AX
  194.  
  195.     JG   REPEAT2
  196.  
  197.     CALL STEP_ADJ
  198.     CALL CHK_KBD
  199. MX_TARGIT:
  200.     JNZ  M_EXIT
  201.  
  202.     CALL SWEEP_FRAME
  203.  
  204.     CALL STEP_ADJ
  205.  
  206.     LEA  SI,CIRCLE_DATA
  207.     MOV  WORD PTR [SI+4],115
  208.     MOV  WORD PTR [SI+8],1200
  209.  
  210. REPEAT3:
  211.     CALL CHK_KBD
  212.     JNZ  M_EXIT
  213.     SUB  WORD PTR [SI],175
  214.     CALL CIRCLE
  215.     ADD  WORD PTR [SI],175
  216.     CALL CIRCLE
  217.     ADD  WORD PTR [SI],175
  218.     CALL CIRCLE
  219.     SUB  WORD PTR [SI],175
  220.     SUB  WORD PTR [SI+4],AX
  221.     JG   REPEAT3
  222.  
  223.  
  224.     CALL CHK_KBD
  225.     JNZ  M_EXIT
  226.     CALL DELAY
  227.     JMP  LLLS           ; GO DO THE WHOLE MESS AGAIN UNTIL KEYPRESS...
  228.  
  229. M_EXIT:
  230.  
  231.     MOV  AH,0
  232.     INT  16H
  233.  
  234.     CALL RESTORE_MODE ; RESTORE hga text MODE
  235.  
  236.     MOV  AX,4C00H     ; SET FOR RETURN TO DOS WITH RETURN CODE 0
  237.     INT  21H
  238.  
  239. MAIN ENDP
  240.  
  241.     SUBTTL  VARIOUS graphics ROUTINES
  242.     PAGE    +
  243.  
  244.  
  245. G_FRAME PROC NEAR   ; draws a box... set X1,X2,Y1,Y2  to opposite corner
  246.                     ; coordinates.....
  247.     PUSH AX
  248.     PUSH BX
  249.     PUSH CX
  250.     PUSH DX
  251.     PUSH SI
  252.  
  253.     LEA  SI,LINE1
  254.     MOV  AX,X1
  255.     MOV  BX,X2
  256.     MOV  CX,Y1
  257.     MOV  DX,Y2
  258.  
  259.     MOV  Y2,CX
  260.     CALL PLOTLINE
  261.  
  262.     MOV  X2,AX
  263.     MOV  Y2,DX
  264.     CALL PLOTLINE
  265.  
  266.     MOV  X1,BX
  267.     MOV  Y1,DX
  268.     CALL PLOTLINE
  269.  
  270.     MOV  X2,BX
  271.     MOV  Y1,CX
  272.     CALL PLOTLINE
  273.  
  274.     MOV X1,AX
  275.     MOV X2,BX
  276.     MOV Y1,CX
  277.     MOV Y2,DX
  278.     POP SI
  279.     POP DX
  280.     POP CX
  281.     POP BX
  282.     POP AX
  283.     RET
  284. G_FRAME ENDP
  285.  
  286. G_FR_2 PROC NEAR   ; SETS UP LINE1 FOR G_FRAME CALLS
  287.                    ; USES FRAME_PARMS STRUC AND FRAME_DAT DATA
  288.                    ; draws box with NUMREPS lines spaced @
  289.                    ; X_STEP/Y_STEP pixels apart...
  290.  
  291. FRAME_PARMS STRUC
  292.  
  293. X_MIN    DW ?
  294. X_MAX    DW ?
  295. Y_MIN    DW ?
  296. Y_MAX    DW ?
  297. X_STEP   DW ?
  298. Y_STEP   DW ?
  299. NUM_REPS DW ?
  300.  
  301. FRAME_PARMS ENDS
  302.  
  303.     PUSH AX
  304.     PUSH BX
  305.     PUSH CX
  306.     PUSH SI
  307.     LEA  SI,FRAME_DAT
  308.     MOV  AX,[SI].X_MIN
  309.     MOV  X1,AX
  310.     MOV  AX,[SI].X_MAX
  311.     MOV  X2,AX
  312.     MOV  AX,[SI].Y_MIN
  313.     MOV  Y1,AX
  314.     MOV  AX,[SI].Y_MAX
  315.     MOV  Y2,AX
  316.     MOV  CX,[SI].NUM_REPS
  317.     MOV  AX,[SI].X_STEP
  318.     MOV  BX,[SI].Y_STEP
  319.  
  320. GFR_LOOP:
  321.     CALL G_FRAME
  322.     ADD X1,AX
  323.     SUB X2,AX
  324.     ADD Y1,BX
  325.     SUB Y2,BX
  326.     LOOP GFR_LOOP
  327.  
  328.     POP SI
  329.     POP CX
  330.     POP BX
  331.     POP AX
  332.     RET
  333. G_FR_2 ENDP
  334.  
  335.  
  336. SWEEP_BOX PROC NEAR  ; draws box of sweeping lines.....
  337.     PUSH AX
  338.     PUSH BX
  339.     PUSH CX
  340.     PUSH DX
  341.     PUSH SI
  342.     PUSH DI
  343.  
  344.     LEA  DI,FRAME_DAT
  345.  
  346.     MOV AX,X1
  347.     MOV BX,X2
  348.     SUB AX,BX
  349.     ADD AX,X1
  350.     MOV [DI].X_MAX,AX
  351.     MOV [DI].X_MIN,BX
  352.     MOV AX,Y1
  353.     MOV BX,Y2
  354.     SUB AX,BX
  355.     ADD AX,Y1
  356.     MOV [DI].Y_MAX,AX
  357.     MOV [DI].Y_MIN,BX
  358.  
  359.     MOV  AX,[DI].X_STEP
  360.     MOV  BX,[DI].Y_STEP
  361.  
  362.     LEA  SI,LINE1
  363.     MOV  CX,[DI].X_MAX
  364. TOP_SIDE:
  365.  
  366.     CALL PLOTLINE
  367.     ADD  X2,AX
  368.     CMP  X2,CX
  369.     JBE  TOP_SIDE
  370.     SUB  X2,AX
  371.  
  372.     MOV  CX,[DI].Y_MAX
  373. RIGHT_SIDE:
  374.  
  375.     CALL PLOTLINE
  376.     ADD  Y2,BX
  377.     CMP  Y2,CX
  378.     JBE  RIGHT_SIDE
  379.     SUB  Y2,BX
  380.  
  381.     MOV  CX,[DI].X_MIN
  382. BOT_SIDE:
  383.  
  384.     CALL PLOTLINE
  385.     SUB  X2,AX
  386.     CMP  X2,CX
  387.     JGE   BOT_SIDE
  388.     ADD X2,AX
  389.  
  390.     MOV  CX,[DI].Y_MIN
  391. LEFT_SIDE:
  392.  
  393.     CALL PLOTLINE
  394.     SUB  Y2,BX
  395.     CMP  Y2,CX
  396.     JGE   LEFT_SIDE
  397.  
  398.     POP DI
  399.     POP SI
  400.     POP DX
  401.     POP CX
  402.     POP BX
  403.     POP AX
  404.     RET
  405. SWEEP_BOX ENDP
  406.  
  407.  
  408. SWEEP_FRAME PROC NEAR  ; draws frame where each edge is a swept box....?
  409.     PUSH AX
  410.     PUSH SI
  411.  
  412.     LEA  SI,SWFRAME_DAT
  413.  
  414.  
  415.     MOV  AX,[SI].X_MAX
  416.     SUB  AX,[SI].X_MIN
  417.     SHR  AX,1
  418.     ADD  AX,[SI].X_MIN
  419.  
  420.     MOV  X1,AX
  421.     MOV  AX,[SI].Y_MIN
  422.     ADD  AX,[SI].Y_STEP
  423.     MOV  Y1,AX
  424.  
  425.     MOV  AX,[SI].X_MIN
  426.     MOV  X2,AX
  427.     MOV  AX,[SI].Y_MIN
  428.     MOV  Y2,AX
  429.     CALL SWEEP_BOX
  430.  
  431.     MOV  AX,[SI].X_MAX
  432.     SUB  AX,[SI].X_MIN
  433.     SHR  AX,1
  434.     ADD  AX,[SI].X_MIN
  435.  
  436.     MOV  X1,AX
  437.     MOV  AX,[SI].Y_MAX
  438.     SUB  AX,[SI].Y_STEP
  439.     MOV  Y1,AX
  440.  
  441.     MOV  AX,[SI].X_MIN
  442.     MOV  X2,AX
  443.     MOV  AX,[SI].Y_MAX
  444.     SUB  AX,[SI].Y_STEP
  445.     SUB  AX,[SI].Y_STEP
  446.     MOV  Y2,AX
  447.     CALL SWEEP_BOX
  448.  
  449.     MOV  AX,[SI].Y_MAX
  450.     SUB  AX,[SI].Y_MIN
  451.     SHR  AX,1
  452.     ADD  AX,[SI].Y_MIN
  453.  
  454.     MOV  Y1,AX
  455.     MOV  AX,[SI].X_MIN
  456.     ADD  AX,[SI].X_STEP
  457.     MOV  X1,AX
  458.  
  459.     MOV  AX,[SI].Y_MIN
  460.     ADD  AX,[SI].Y_STEP
  461.     ADD  AX,[SI].Y_STEP
  462.     MOV  Y2,AX
  463.     MOV  AX,[SI].X_MIN
  464.     MOV  X2,AX
  465.     CALL SWEEP_BOX
  466.  
  467.     MOV  AX,[SI].Y_MAX
  468.     SUB  AX,[SI].Y_MIN
  469.     SHR  AX,1
  470.     ADD  AX,[SI].Y_MIN
  471.     MOV  Y1,AX
  472.     MOV  AX,[SI].X_MAX
  473.     SUB  AX,[SI].X_STEP
  474.     MOV  X1,AX
  475.  
  476.     MOV  AX,[SI].X_MAX
  477.     SUB  AX,[SI].X_STEP
  478.     SUB  AX,[SI].X_STEP
  479.     MOV  X2,AX
  480.     MOV  AX,[SI].Y_MIN
  481.     ADD  AX,[SI].Y_STEP
  482.     ADD  AX,[SI].Y_STEP
  483.     MOV  Y2,AX
  484.     CALL SWEEP_BOX
  485.  
  486.  
  487.     POP  SI
  488.     POP  AX
  489.     RET
  490. SWEEP_FRAME ENDP
  491.  
  492.  
  493.  
  494. ; Routines to plot straight lines and circles
  495. ; Based on routines by Rollins - "8088 Macro Assembler Programming"
  496.  
  497.     INCLUDE HGD.INC  ; INCLUDE ROUTINES FOR PLOTLINE AND CIRCLE HERE
  498.                      ; SOURCE CODE NOT PROVIDED....see doc file.
  499.  
  500.  
  501.  
  502.  
  503. GET_RLET PROC NEAR  ; LOOKUP CHAR IN BL STASH VALS IN LETTER DB 8 DUP ?
  504.                     ; GRABS FONT VALUE FROM ROM TABLE...
  505.      PUSH AX
  506.      PUSH CX
  507.      PUSH SI
  508.      PUSH DI
  509.  
  510.      MOV  CX,8
  511.      MOV  AL,BL
  512.      CBW
  513.      SHL  AX,1
  514.      SHL  AX,1
  515.      SHL  AX,1
  516.      ADD  AX,0FA6EH+7
  517.      MOV  SI,AX
  518.      MOV  DI,DS        ; SAVE  DS
  519.      MOV  AX,0F000H
  520.      MOV  DS,AX
  521.      STD
  522.  
  523. G_RCH1:
  524.      LODSB
  525.      PUSH AX
  526.      LOOP G_RCH1
  527.  
  528.      MOV  DS,DI        ; RESTORE DS...
  529.      LEA  SI,LETTER
  530.      MOV  CX,8
  531.  
  532. P_RCH1:
  533.      POP  AX
  534.      MOV  [SI],AL
  535.      INC  SI
  536.      LOOP P_RCH1
  537.  
  538.      POP  DI
  539.      POP  SI
  540.      POP  CX
  541.      POP  AX
  542.      RET
  543.  
  544. GET_RLET ENDP
  545.  
  546.  
  547.     SUBTTL  C_DISPLAY  ROUTINE TO DISPLAY A CHARACTER
  548.     PAGE    +
  549.  
  550. C_DISPLAY PROC     ; CALLED BY DSPLY_MSG PROCEDURE....
  551.  
  552. ; C_DISPLAY shows a character in small format for HIGH resolution graphics
  553. ; uses LETTER_TBL for stroke sequences - assumes color 1 - pixel on...
  554. ; each letter uses 4 pixels by 8 pixels x X/Y scale values
  555.  
  556. ; assumes DX = line number
  557. ;         CX = column number
  558. ;         BL = character to display
  559. ;         AH = SIZE OF CHARACTER... WIDTH  8xAH COLS...
  560. ;         BH = SIZE OF CHARACTER... LENGTH 8xBH ROWS...
  561.  
  562.     PUSH AX
  563.     PUSH BX
  564.     PUSH CX
  565.     PUSH DX
  566.     PUSH SI
  567.     PUSH DI
  568.     PUSH BP
  569.  
  570.  
  571. ; set SI to point to character definition array
  572.      CALL GET_RLET
  573.      LEA  SI,LETTER
  574.  
  575. ; set length to display 8 lines of 1 byte
  576.  
  577.     MOV  BL,8       ; SET NUMBER OF BYTES TO MOVE
  578.     PUSH AX
  579.     MOV  AL,AH
  580.     CBW
  581.     MOV  BP,AX      ; BP NOW HAS S_XSIZE VALUE...
  582.     POP  AX
  583.  
  584. DISPLAY_LOOP:
  585.  
  586.     MOV  AL,[SI]    ; GET NEXT BYTE TO SHOW
  587.  
  588.     PUSH CX
  589.  
  590. SCALE_LOOP:
  591. ; now display the lines that make the character
  592.  
  593.     MOV  AH,080H
  594.  
  595. T_PIX_L:
  596.     TEST AL,AH    ; ANY PIXEL?
  597.     JZ   D1         ; NO SO SKIP
  598.  
  599.     CALL CD_PLOT2
  600.  
  601. D1:
  602.     ADD  CX,BP
  603.  
  604.     SHR  AH,1
  605.     JNZ  T_PIX_L
  606.  
  607.  
  608.  
  609.  
  610.  
  611.     ADD  DL,BH
  612.     ADC  DH,00H
  613.     POP  CX
  614.  
  615.     INC  SI           ; POINT TO NEXT BYTE TO DISPLAY
  616.     DEC  BL
  617.     JNZ  DISPLAY_LOOP ; REPEAT FOR WHOLE LETTER
  618.  
  619.  
  620.     POP  BP
  621.     POP  DI
  622.     POP  SI
  623.     POP  DX
  624.     POP  CX
  625.     POP  BX
  626.     POP  AX
  627.  
  628.     RET
  629.  
  630. C_DISPLAY ENDP
  631.  
  632. CD_PLOT2 PROC NEAR
  633.     PUSH  AX
  634.     PUSH  BX
  635.     PUSH  CX
  636.     PUSH  DX
  637.     PUSH  BP
  638.  
  639.     MOV  AX,BP    ; HOLD X SCALE VALUE IN AX...
  640. CD_PL:
  641.     MOV  BP,AX    ; RESTORE X SCALE FOR EACH PASS
  642.     PUSH CX       ; HOLD COL VAL ON STACK...
  643. CD_PLX:
  644.     CALL PLOT_SUB ; PLOT A DOT
  645.     INC  CX       ; INC COLUMN
  646.     DEC  BP       ; DO THE LOOP THING WITH BP...
  647.     JNZ  CD_PLX
  648.  
  649.     POP  CX       ; RESTORE START COLUMN VALUE...
  650.     INC  DX       ; DX = LINE#, BH = Y SCALE...
  651.     DEC  BH       ; DO IT FOR ALL LINES NEEDED
  652.     JNZ CD_PL
  653.  
  654.     POP  BP
  655.     POP  DX
  656.     POP  CX
  657.     POP  BX
  658.     POP  AX
  659.     RET
  660. CD_PLOT2 ENDP
  661.  
  662.  
  663.     SUBTTL  DSPLY_MSG  ROUTINE TO DISPLAY ANY SIZED LETTER MESSAGE
  664.     PAGE    +
  665.  
  666. DSPLY_MSG PROC
  667.  
  668. ; Routine will display a message in ASCIIZ string format
  669.  
  670. ; assumes  SI = address of scale_mess structure
  671.  
  672. SCALE_MESS STRUC
  673.  
  674. S_ROW   DW ?      ; ROW COORD
  675. S_COL   DW ?      ; COLUMN COORD
  676. S_XSIZE   DB ?    ; X SCALE
  677. S_YSIZE   DB ?    ; Y SCALE
  678. MESSAGE DW ?      ; ACTUALLY A ASCIIZ STRING....
  679.  
  680. SCALE_MESS ENDS
  681.  
  682.     PUSH AX
  683.     PUSH BX
  684.     PUSH CX
  685.     PUSH SI
  686.  
  687.     MOV  AL,00H
  688.     MOV  AH,[SI].S_XSIZE
  689. C_XSL:
  690.     ADD  AL,8
  691.     DEC  AH
  692.     JNZ  C_XSL
  693.  
  694.     MOV  BH,[SI].S_YSIZE
  695.     MOV  AH,[SI].S_XSIZE
  696.     MOV  DX,[SI].S_ROW
  697.     MOV  CX,[SI].S_COL
  698.     LEA  SI,[SI].MESSAGE
  699.  
  700. DSPLY_LOOP:
  701.  
  702.     MOV  BL,[SI]    ; FETCH CHARACTER TO DISPLAY
  703.     CMP  BL,0       ; ARE WE DONE?
  704.     JE   DSPLY_DONE ; YES, SO LEAVE
  705.     CALL C_DISPLAY    ; SHOW ONE CHARACTER
  706.  
  707.  
  708.  
  709.     INC  SI         ; POINT TO NEXT CHARACTER TO DISPLAY
  710.     ADD  CL,AL      ; POINT TO NEXT BYTE ON LINE
  711.     ADC  CH,00H     ; + ANY CARRY...
  712.  
  713.     JMP  DSPLY_LOOP ; REPEAT FOR ENTIRE MESSAGE
  714.  
  715. DSPLY_DONE:
  716.  
  717.     POP  SI
  718.     POP  CX
  719.     POP  BX
  720.     POP  AX
  721.     RET
  722.  
  723. DSPLY_MSG ENDP
  724.  
  725. CLR_FR PROC NEAR
  726.     PUSH CX
  727.     PUSH SI
  728.  
  729.     CALL CLS           ; CLEAR THE SCREEN
  730.     CALL G_FR_2        ; DRAW A DOUBLE FRAME
  731.  
  732.     MOV  SI,PLOT_ADR
  733.     MOV  PLOT_SUB,SI
  734.  
  735.     LEA SI,HR_MESS    ; POINT AT HI-RES MESSAGE DATA
  736.     CALL DSPLY_MSG    ; DISPLAY IT....
  737.     LEA SI,PX_MESS    ; POINT AT PRESS ANY KEY MESSAGE DATA
  738.     CALL DSPLY_MSG    ; DISPLAY IT
  739.  
  740.  
  741.     POP  CX
  742.     POP  SI
  743.     RET
  744. CLR_FR ENDP
  745.  
  746. WOW_WHEE PROC NEAR
  747.     PUSH CX
  748.  
  749.     MOV  CX,3     ; CALL ROUTINE WOW 3 TIMES...
  750.  
  751. WOW_LOOP:
  752.     CALL WOW
  753.     LOOP WOW_LOOP
  754.  
  755.     POP  CX
  756.     RET
  757. WOW_WHEE ENDP
  758.  
  759.  
  760. WOW PROC NEAR    ; DISPLAY 'WOW' MESSAGE AND SCALE IT UP AND DOWN ON THE FLY
  761.      PUSH CX
  762.      PUSH SI
  763.  
  764.     MOV  SI,XPLOT_ADR    ; USE XPLOT FOR EASY WIPE OUT OF PREVIOUS MESSAGE...
  765.     MOV  PLOT_SUB,SI
  766.     LEA  SI,TST_MESS
  767.  
  768.     MOV  CX,7            ; SHOW 7 INCREASEING SIZES....
  769. WL_1:
  770.     CALL DSPLY_MSG
  771.     ; NO CALL DELAY
  772.     CALL DSPLY_MSG
  773.  
  774.     SUB WORD PTR [SI],4     ; ADJUST ROW COORDINATE TO KEEP MESSAGE CENTERED
  775.     SUB WORD PTR [SI+2],12  ;  "  "  COLUMN  "    "          "          "
  776.     INC BYTE PTR [SI+4]     ; INCREASE SCALE..
  777.     INC BYTE PTR [SI+5]
  778.     LOOP WL_1
  779.  
  780.     MOV  CX,7            ; SHOW 7 DECREASING SIZES....
  781. WL_2:
  782.     LEA  SI,TST_MESS
  783.     CALL DSPLY_MSG
  784.  
  785.     LEA  SI,TST_MESS
  786.     CALL DSPLY_MSG
  787.     ADD WORD PTR [SI],4
  788.     ADD WORD PTR [SI+2],12
  789.     DEC BYTE PTR [SI+4]
  790.     DEC BYTE PTR [SI+5]
  791.     LOOP WL_2
  792.  
  793.     ; COORDINATES FOR TST_MESS DATA NOW AT ORIGINAL VALUES....
  794.  
  795.     POP  SI
  796.     POP  CX
  797.     RET
  798. WOW ENDP
  799.  
  800.  
  801.  
  802. STEP_ADJ PROC NEAR  ; ROUTINE MODIFIES COORDINATES, NUMBER
  803.                     ; OF REPETITIONS AND PLOT ROUTINE USED
  804.                     ; IN AN ATTEMPT TO CREATE MANY VARIATIONS
  805.                     ; OF THE GRAPHICS SCREENS....
  806.  
  807.    PUSH SI
  808.    DEC  AX
  809.    DEC  BX
  810.    INC  CX
  811.    INC  DX
  812.    CMP  AX,0
  813.    JA  SA_1
  814.    MOV  AX,5
  815. SA_1:
  816.    CMP  BX,0
  817.    JA  SA_2
  818.    MOV  BX,12
  819. SA_2:
  820.    CMP  DX,17
  821.    JB  SA_3
  822.    MOV  DX,2
  823. SA_3:
  824.    CMP  CX,14
  825.    JB  SA_X
  826.    MOV  CX,2
  827.  
  828. SA_X:
  829.    TEST CX,1
  830.    JNZ NPDT
  831.    CALL PD_TOG
  832.  
  833. NPDT:
  834.    LEA  SI,SWFRAME_DAT
  835.    MOV  [SI].NUM_REPS,DX
  836.    MOV [SI].X_MIN,0
  837.    MOV [SI].X_MAX,719
  838.    MOV [SI].Y_MIN,0
  839.    MOV [SI].Y_MAX,347
  840.    ADD [SI].X_STEP,CX
  841.    ADD [SI].Y_STEP,DX
  842.    CMP [SI].X_STEP,100
  843.    JB  NFXS
  844.    MOV [SI].X_STEP,CX
  845.    SHL [SI].X_STEP,1
  846.  
  847. NFXS:
  848.    CMP [SI].Y_STEP,100
  849.    JB  NFYS
  850.    MOV [SI].Y_STEP,DX
  851.    SHL [SI].Y_STEP,1
  852.  
  853. NFYS:
  854.  
  855.    LEA  SI,FRAME_DAT
  856.    MOV  [SI].NUM_REPS,CX
  857.    MOV [SI].X_MIN,0
  858.    MOV [SI].X_MAX,719
  859.    MOV [SI].Y_MIN,0
  860.    MOV [SI].Y_MAX,347
  861.    MOV [SI].X_STEP,BX
  862.    MOV [SI].Y_STEP,DX
  863.    INC [SI].NUM_REPS
  864.    SHL [SI].NUM_REPS,1
  865.  
  866.  
  867.    POP SI
  868.    RET
  869. STEP_ADJ ENDP
  870.  
  871.  
  872.  
  873. CHK_KBD PROC NEAR   ; CALL BIOS FOR KEYCHECK.....
  874.     PUSH AX
  875.  
  876.     MOV  AH,1
  877.     INT  16H
  878.     POP AX
  879.     RET
  880. CHK_KBD ENDP
  881.  
  882. PD_TOG PROC NEAR    ; TOGGLE CURRENT PLOT ROUTINE ADDRESS....
  883.    PUSH SI
  884.    MOV  SI,PLOT_ADR
  885.    CMP  SI,PLOT_SUB
  886.    JNE  SET_PLD
  887.    MOV  SI,XPLOT_ADR
  888.    MOV  PLOT_SUB,SI
  889.    JMP  HR_CONT
  890. SET_PLD:
  891.    MOV  SI,PLOT_ADR
  892.    MOV  PLOT_SUB,SI
  893.  
  894. HR_CONT:
  895.    POP SI
  896.    RET
  897. PD_TOG ENDP
  898.  
  899.  
  900.  
  901.  
  902. PLOT_HGA PROC NEAR
  903.  
  904. ; assumes DX = line offset number 0 to 347
  905. ;         CX = column offset from 0 to 719
  906.  
  907. ; routine plots the pixel dot
  908.  
  909.  
  910.     PUSH AX
  911.     PUSH BX
  912.     PUSH DI
  913.     PUSH ES
  914.  
  915. ; determine mask by table look up
  916.  
  917.     MOV  DI,CX
  918.     AND  DI,7
  919.     SHL  DI,1       ; AND MULTIPLY BY 2
  920.  
  921.     MOV  BX,GMASK_TBL [DI] ; BL = OFF MASK, BH = ON MASK
  922.     PUSH BX
  923. ; get the address of the pixel byte
  924.  
  925.     MOV  DI,DX      ; GET LINE NUMBER
  926.     AND  DI,0FFFEH  ; ELIMINATE EVEN ODD BIT
  927.     SHR  DI,1
  928.     SHR  DI,1
  929.  
  930.     SHL  DI,1       ; AND MULTIPLY BY SUCCESSIVE POWERS OF 2
  931.     MOV  BX,DI      ; save val*2...
  932.     SHL  DI,1
  933.     SHL  DI,1
  934.     ADD  BX,DI      ; add val*2...
  935.  
  936.     SHL  DI,1       ; DI IS NOW MULTIPLIED BY 16
  937.     MOV  AX,DI      ; SAVE PARTIAL PRODUCT
  938.     SHL  DI,1
  939.     SHL  DI,1       ; DI IS NOW MULTIPLIED BY 64
  940.     ADD  DI,AX      ; DI IS NOW * 80
  941.     ADD  DI,BX      ; DI IS NOW * 90
  942.     POP  BX
  943.  
  944.     TEST DX,3       ; IS LINE N3?
  945.     JZ   N_N1       ; NO BITS SET, GO ON
  946.     ADD  DI,2000H   ; ODD, SO ADD 2000H TO GET TO 2ND SECTION
  947.     TEST DX,2
  948.     JZ   N_N1
  949.     ADD  DI,2000H
  950.     TEST DX,1
  951.     JZ   N_N1
  952.     ADD  DI,2000H
  953. N_N1:
  954.  
  955.     MOV  AX,CX      ; GET COLUMN NUMBER
  956.     SHR  AX,1
  957.     SHR  AX,1       ; AND DIVIDE BY 4 FOR OFFSET FROM START OF LINE
  958.     SHR  AX,1
  959.  
  960.     ADD  DI,AX      ; AND ADD TO FINAL ADDRESS
  961.  
  962.     MOV  AX,0B000H  ; POINT TO DMA
  963.     MOV  ES,AX      ; ES = DMA
  964.  
  965. ; now set the pixel
  966.  
  967.     AND  ES:[DI],BL ; BLANK OUT PIXEL
  968.     OR   ES:[DI],BH ; INSERT NEW PIXEL
  969.  
  970.     POP  ES
  971.     POP  DI
  972.     POP  BX
  973.     POP  AX
  974.  
  975.     RET
  976.  
  977. PLOT_HGA ENDP
  978.  
  979.     SUBTTL  XPLOTDOT  PLOTS ONE PIXEL DOT USING XOR
  980.     PAGE    +
  981.  
  982. XPLOT_HGA PROC NEAR
  983.  
  984. ; assumes DX = line offset number 0 to 347
  985. ;         CX = column offset from 0 to 719
  986.  
  987. ; routine plots the pixel dot by XOR
  988.  
  989.  
  990.  
  991.  
  992.  
  993.     PUSH AX
  994.     PUSH BX
  995.     PUSH DI
  996.     PUSH ES
  997.  
  998. ; determine mask and color bits by table look up
  999. ; table index = ( (pixel number * 4) + color ) * 2
  1000.  
  1001.     MOV  DI,CX
  1002.     AND  DI,7
  1003.     SHL  DI,1       ; AND MULTIPLY BY 2
  1004.  
  1005.     MOV  BX,GMASK_TBL [DI] ; BL = OFF MASK, BH = ON MASK
  1006.     PUSH BX
  1007. ; get the address of the pixel byte
  1008.  
  1009.     MOV  DI,DX      ; GET LINE NUMBER
  1010.     AND  DI,0FFFEH  ; ELIMINATE EVEN ODD BIT
  1011.     SHR  DI,1
  1012.     SHR  DI,1
  1013.     SHL  DI,1       ; AND MULTIPLY BY SUCCESSIVE POWERS OF 2
  1014.     MOV  BX,DI
  1015.     SHL  DI,1
  1016.     SHL  DI,1
  1017.     ADD  BX,DI
  1018.  
  1019.     SHL  DI,1       ; DI IS NOW MULTIPLIED BY 16
  1020.     MOV  AX,DI      ; SAVE PARTIAL PRODUCT
  1021.     SHL  DI,1
  1022.     SHL  DI,1       ; DI IS NOW MULTIPLIED BY 64
  1023.     ADD  DI,AX      ; DI IS NOW * 80
  1024.     ADD  DI,BX      ;  "    "   * 90
  1025.     POP  BX
  1026.  
  1027.     TEST DX,3       ; IS LINE N3?
  1028.     JZ   XN_N1      ; NO,
  1029.     ADD  DI,2000H   ; ODD, SO ADD 2000H TO GET TO 2ND SECTION
  1030.     TEST DX,2
  1031.     JZ   XN_N1
  1032.     ADD  DI,2000H
  1033.     TEST DX,1
  1034.     JZ   XN_N1
  1035.     ADD  DI,2000H
  1036. XN_N1:
  1037.  
  1038.     MOV  AX,CX      ; GET COLUMN NUMBER
  1039.     SHR  AX,1
  1040.     SHR  AX,1
  1041.     SHR  AX,1       ; AND DIVIDE BY 8 FOR OFFSET FROM START OF LINE
  1042.  
  1043.     ADD  DI,AX      ; AND ADD TO FINAL ADDRESS
  1044.  
  1045.     MOV  AX,0B000H  ; POINT TO DMA
  1046.     MOV  ES,AX      ; ES = DMA
  1047.  
  1048. ; now set the pixel
  1049.  
  1050.     XOR  ES:[DI],BH ; XOR IN NEW COLOR
  1051.  
  1052.     POP  ES
  1053.     POP  DI
  1054.     POP  BX
  1055.     POP  AX
  1056.  
  1057.     RET
  1058.  
  1059. XPLOT_HGA ENDP
  1060.  
  1061.  
  1062.  
  1063.  
  1064. DELAY PROC NEAR
  1065.       PUSH AX
  1066.       PUSH BX
  1067.       PUSH CX
  1068.       PUSH ES
  1069.  
  1070.       MOV AX,0040H
  1071.       MOV ES,AX
  1072.       MOV CX,D_VAL        ; OR DELAY VAL  # OF CLOCKS....
  1073.       CMP CX,00H
  1074.       JE D2_L_EX
  1075.  
  1076. D2_L_2:
  1077.       MOV AX,ES:[006CH]
  1078. D2_L_1:
  1079.       MOV BX,ES:[006CH]
  1080.       CMP AX,BX
  1081.       JE  D2_L_1
  1082.       LOOP D2_L_2
  1083. D2_L_EX:
  1084.       POP ES
  1085.       POP CX
  1086.       POP BX
  1087.       POP AX
  1088.       RET
  1089. DELAY ENDP
  1090.  
  1091.  
  1092.  
  1093.     SUBTTL  SET_MODE  AND RESTORE GRAPHICS MODE ROUTINES
  1094.     PAGE    +
  1095.  
  1096. SET_MODE PROC
  1097.  
  1098. ; routine to set high resolution mode and plot routine addresses...
  1099.  
  1100.  
  1101.     PUSH AX
  1102.     PUSH BX
  1103.  
  1104.  
  1105.  
  1106.     LEA  SI,PLOT_HGA
  1107.     MOV  PLOT_ADR,SI
  1108.     MOV  PLOT_SUB,SI
  1109.  
  1110.     LEA  SI,XPLOT_HGA
  1111.     MOV  XPLOT_ADR,SI
  1112.     MOV  SCRN_ADR,HGA_ADR
  1113.  
  1114.     CALL _GMODE     ; SET HERC TO 720 x 348 GRAPHICS MODE ??
  1115.  
  1116.     POP  BX
  1117.     POP  AX
  1118.     RET
  1119.  
  1120. SET_MODE ENDP
  1121.  
  1122.  
  1123.  
  1124. ; routine to restore HGA text video mode
  1125.  
  1126. RESTORE_MODE PROC
  1127.  
  1128.     PUSH AX
  1129.  
  1130.     CALL _TMODE
  1131.  
  1132.     POP  AX
  1133.     RET
  1134.  
  1135. RESTORE_MODE ENDP
  1136.  
  1137.  
  1138.  
  1139. ;*********************************************************************
  1140. ;GRAPHICS MODE - Programs the 6845 CRT controller for the 720 x 348 graphics
  1141. ;mode. The active page for both writing and display is set to the default value
  1142. ;of page 0.
  1143. ;ON ENTRY - no parameters.
  1144. ;   source unknown ??   c-serve ?
  1145. ;*********************************************************************
  1146.  
  1147. _gmode  proc near
  1148.  
  1149.     push    si
  1150.     push    di
  1151.  
  1152.     mov    al,1
  1153.     mov    dx, 3bfh
  1154.     out    dx, al
  1155.     mov    al,grph
  1156.     lea    si,gtable
  1157.     mov    bx,0
  1158.     mov    cx,4000h
  1159.     call    setmd
  1160.  
  1161.     pop    di
  1162.     pop    si
  1163.  
  1164.     ret
  1165.  
  1166. _gmode    endp
  1167.  
  1168. ;**********************************************************************
  1169. ;TEXT MODE - Programs the 6845 and control register to produce text mode.
  1170. ;
  1171. ;ON ENTRY - no parameters.
  1172. ;***********************************************************************
  1173.  
  1174. _tmode proc near
  1175.  
  1176.     push    si
  1177.     push    di
  1178.  
  1179.     mov    al,text
  1180.     lea    si,ttable
  1181.     mov    bx,720h
  1182.     mov    cx,2000
  1183.     call    setmd
  1184.  
  1185.     pop    di
  1186.     pop    si
  1187.  
  1188.     ret
  1189.  
  1190. _tmode    endp
  1191.  
  1192. setmd    proc    near
  1193.  
  1194. ;     sets mode to graphics or text
  1195. ;     depending on al
  1196. ;     si = parameter table
  1197. ;     cx = number of words to be cleared
  1198. ;     bx = blank value
  1199.     push    ds
  1200.     push    es
  1201.     push    ax
  1202.     push    bx
  1203.     push    cx
  1204.  
  1205. ;     change mode but without scrn_on
  1206.     mov    dx,cntrl
  1207.     out    dx,al
  1208.  
  1209. ;     intialize the 6845
  1210.  
  1211.     mov    dx,index
  1212.     mov    cx,12        ;12 parameters to
  1213.                 ;be output
  1214.     xor    ah,ah        ;starting from
  1215.                 ;reg. 0
  1216. parms:    mov    al,ah
  1217.     out    dx,al        ;output register
  1218.                 ;number
  1219.     cld
  1220.  
  1221.     inc    dx
  1222.     lodsb
  1223.     out    dx,al        ;output data
  1224.  
  1225.     inc    ah        ;next value
  1226.     dec    dx
  1227.     loop    parms
  1228.  
  1229.     pop    cx        ;clear the buffer
  1230.     mov    ax,0b000h
  1231.  
  1232.     mov    es,ax
  1233.     xor    di,di
  1234.     pop    ax
  1235.     rep    stosw
  1236.  
  1237. ;     scrn_on, page 0
  1238.  
  1239.     mov    dx,cntrl
  1240.     pop    ax
  1241.     add    al,scrn_on
  1242.     out    dx,al
  1243.  
  1244.     pop    es
  1245.     pop    ds
  1246.  
  1247.     ret
  1248.  
  1249. setmd    endp
  1250.  
  1251.  
  1252.  
  1253.     SUBTTL  CLS  CLEAR THE GRAPHICS SCREEN
  1254.     PAGE    +
  1255.  
  1256. CLS PROC
  1257.  
  1258. ; clears a graphics screen using color palette choice COLOR_CLS
  1259.  
  1260.  
  1261.     PUSH AX
  1262.     PUSH CX
  1263.     PUSH DI
  1264.     PUSH ES
  1265.  
  1266.  
  1267.     MOV  AX,0B000H    ; POINT TO DMA
  1268.     MOV  ES,AX        ; ES = DMA ADDRESS
  1269.     MOV  DI,0         ; POINT TO START OF SCREEN
  1270.  
  1271.     MOV  CX,4000H     ; WORD COUNT OF WHOLE SCREEN
  1272.     MOV  AX,COLOR_CLS ; SET PIXEL PATTERN FOR WHOLE SCREEN
  1273.     CLD               ; SET FOR FORWARD DIRECTION
  1274.  
  1275.     REP  STOSW        ; CLEAR WHOLE SCREEN
  1276.  
  1277.     POP  ES
  1278.     POP  DI
  1279.     POP  CX
  1280.     POP  AX
  1281.  
  1282.     RET
  1283.  
  1284.  
  1285. CLS ENDP
  1286.  
  1287.  
  1288.     SUBTTL  DATA AREA
  1289.     PAGE    +
  1290.  
  1291. .DATA
  1292.  
  1293.  
  1294. ; used by CLS
  1295.  
  1296. COLOR_CLS DW  0000H ; SET CLEAR SCREEN COLOR TO 00
  1297.  
  1298.  
  1299. ; used by SET_MODE and RESTORE_MODE routines
  1300.  
  1301. ST_MODE  DB  ?   ; OLD VIDEO MODE
  1302. SCRN_ADR DW  ?
  1303. PLOT_SUB DW  ?
  1304.  
  1305. PLOT_ADR DW ?
  1306. XPLOT_ADR DW ?
  1307.  
  1308.  
  1309.  
  1310.  
  1311. ; used by PLOTDOT and XPLOTDOT routines
  1312.  
  1313. GMASK_TBL LABEL WORD
  1314.  
  1315.     DB  01111111B, 10000000B  ; LEFT PIXEL
  1316.     DB  10111111B, 01000000B  ;
  1317.     DB  11011111B, 00100000B  ;
  1318.     DB  11101111B, 00010000B  ;
  1319.     DB  11110111B, 00001000B  ; RIGHT PIXEL
  1320.     DB  11111011B, 00000100B  ;
  1321.     DB  11111101B, 00000010B  ;
  1322.     DB  11111110B, 00000001B  ;
  1323.  
  1324.  
  1325.  
  1326. ; used by PLOTLINE routine
  1327.  
  1328. SHORT_STEP  DW  ?
  1329. LONG_STEP   DW  ?
  1330. LINE_START  DW  ?
  1331. LINE_STOP   DW  ?
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337. LINE1 LABEL WORD
  1338. X1 DW 0
  1339. Y1 DW 0
  1340. X2 DW 719
  1341. Y2 DW 347
  1342. CO DB 1
  1343. LN DW 0
  1344. SK DW 0
  1345.  
  1346. FRAME_DAT LABEL WORD
  1347.         DW 0         ; X_MIN
  1348.         DW 719       ; X_MAX
  1349.         DW 0         ; Y_MIN
  1350.         DW 347       ; Y_MAX
  1351.         DW 8         ; X_STEP
  1352.         DW 3         ; Y_STEP
  1353.         DW 2         ; NUM_REPS
  1354.  
  1355. SWFRAME_DAT LABEL WORD
  1356.         DW 0         ; X_MIN
  1357.         DW 719       ; X_MAX
  1358.         DW 0         ; Y_MIN
  1359.         DW 347       ; Y_MAX
  1360.         DW 8         ; X_STEP
  1361.         DW 3         ; Y_STEP
  1362.         DW 2         ; NUM_REPS
  1363.  
  1364.  
  1365.  
  1366. ; used by CIRCLE routine
  1367.  
  1368. CIRCLE_DATA DW 359, 172, 90, 1, 5000/8
  1369.  
  1370.  
  1371. gtable    db    35h,2dh,2eh,07h
  1372.         db    5bh,02h,57h,57h
  1373.         db    02h,03h,00h,00h
  1374.  
  1375. ttable    db    61h,50h,52h,0fh
  1376.         db    19h,06h,19h,19h
  1377.         db    02h,0dh,0bh,0ch
  1378.  
  1379.  
  1380. LETTER  DB FNT_LEN DUP (?)
  1381.  
  1382. HR_MESS LABEL WORD
  1383.      DW  5         ; LINE #
  1384.      DW  275       ; COLUMN #
  1385.      DB  1         ; X SCALE
  1386.      DB  2         ; Y SCALE
  1387.      DB  'Hi-Res graphics demo !?!',00H
  1388.  
  1389. SA_MESS LABEL WORD
  1390.      DW  275         ; LINE #
  1391.      DW  200       ; COLUMN #
  1392.      DB  2         ; X SCALE
  1393.      DB  1         ; Y SCALE
  1394.      DB  '(c) 1993 Scott Armitage',00H
  1395.  
  1396. PX_MESS LABEL WORD
  1397.      DW  320      ; LINE #
  1398.      DW  175      ; COLUMN #
  1399.      DB  2        ; X SCALE
  1400.      DB  3        ; Y SCALE
  1401.      DB 'Press any key to QUIT...',00H
  1402.  
  1403. TST_MESS LABEL WORD
  1404.      DW  162      ; LINE #
  1405.      DW  336      ; COLUMN #
  1406.      DB  2        ; X SCALE
  1407.      DB  2        ; Y SCALE
  1408.      DB 'WoW',00H
  1409.  
  1410. ; USE FOR # OF CLOCKS TO DELAY IN DELAY ROUTINE...
  1411.  
  1412. D_VAL  DW 10H
  1413.  
  1414.  
  1415. .STACK
  1416.  
  1417.      DW  50 DUP (?)
  1418.  
  1419.     END MAIN
  1420.