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

  1.                         COMMENT %
  2.  
  3.               GRAPHIC WORKSHOP AMSTRAD 1512 SCREEN DRIVER
  4.               COPYRIGHT (C) 1990 MARCEL WARD + ALCHEMY MINDWORKS INC.
  5.               VERSION 1.1
  6.  
  7.               This is a driver for use as a Amstrad 1512 loadable driver
  8.               for Graphic Workshop.
  9.  
  10.               To generate a driver from this file, it must be assembled
  11.               to a binary file.
  12.  
  13.               Written with A86 in mind - should carry over to MASM without
  14.               too much adjustment though.
  15.  
  16.                         %
  17.  
  18. VERSION         EQU     1
  19. SUBVERSION      EQU     1
  20.  
  21. _A0FF           EQU     6                  ;STACK OFFSET
  22.  
  23. AMST_WIDE       EQU     640
  24. AMST_DEEP       EQU     200
  25. AMST_BYTES      EQU     80
  26. AMST_SCREENSEG  EQU     0B800H
  27.  
  28. ;THIS MACRO SELECTS A COLOUR PLANE
  29. COLOURPLANE     MACRO                      ;#1 AS AN ARGUMENT
  30.                 MOV     AL,#1
  31.                 MOV     DX,03DDH           ;WRITE PLANE ADDRESS
  32.                 OUT     DX,AL              ;SET COLOUR PLANE
  33.                 #EM                        ;CHANGE TO ENDM FOR MASM COMPAT.
  34.  
  35. ;THIS MACRO SELECTS THE PLANE FROM WHICH SCREEN MEMORY READS ARE TAKEN
  36. READPLANE       MACRO
  37.                 MOV     AL,#1
  38.                 MOV     DX,03DEH
  39.                 OUT     DX,AL
  40.                 #EM
  41.  
  42. CODE            SEGMENT PARA PUBLIC 'CODE'
  43.                 ASSUME CS:CODE
  44.  
  45.                 ORG 0000H
  46.  
  47.                 DB      'ALCHDRV2'         ;SIGNATURE - DON'T CHANGE THIS
  48.  
  49. ;THE FOLLOWING ARE THE POINTERS TO THE CALLABLE ROUTINES AND THE COMMON
  50. ;DATA. THE SEGMENTS ARE FILLED IN BY GWS.
  51.  
  52. DISPATCH        PROC    FAR
  53.                 DW      A1512_ON           ;FAR PTR TO 16 COLOUR MODE SELECT
  54.                 DW      ?
  55.                 DW      TRY256_LINE        ;FAR PTR TO 256 > 16 COLOUR LINE
  56.                 DW      ?
  57.                 DW      A1512_OFF          ;FAR PTR TO 16 COLR MODE DESELECT
  58.                 DW      ?
  59.                 DW      NOT_USED           ;FAR POINTER TO DUMMY PROC
  60.                 DW      ?
  61.                 DW      NOT_USED
  62.                 DW      ?
  63.  
  64.                 DW      A1512_ON           ;FAR POINTER TO 1512 MODE SELECT
  65.                 DW      ?
  66.                 DW      A1512_LINE         ;FAR POINTER TO 1512 LINE DISPLAY
  67.                 DW      ?
  68.                 DW      A1512_OFF          ;FAR POINTER TO 1512 MODE DESELECT
  69.                 DW      ?
  70.                 DW      A1512_PALETTE      ;FAR POINTER TO NON-EXISTENT 1512
  71.                 DW      ?                  ;PALLETE SET!
  72.  
  73.                 DW      HICGA_ON           ;FAR POINTER TO CGA MODE SELECT
  74.                 DW      ?
  75.                 DW      HICGA_FRAME        ;FAR POINTER TO CGA FRAME SELECT
  76.                 DW      ?
  77.                 DW      HICGA_LINE         ;FAR POINTER TO CGA LINE DISPLAY
  78.                 DW      ?
  79.                 DW      HICGA_OFF          ;FAR POINTER TO CGA MODE DESELECT
  80.                 DW      ?
  81.  
  82.                 DW      0,0                ;NULL ONE
  83.                 DW      0,0                ;NULL TWO
  84.                 DW      0,0                ;NULL THREE
  85.                 DW      0,0                ;NULL FOUR
  86.  
  87. A_256WIDE       DW      AMST_WIDE
  88. A_256DEEP       DW      AMST_DEEP
  89. A_256SCRNSEG    DW      AMST_SCREENSEG
  90. A_1512WIDE      DW      AMST_WIDE          ;640
  91. A_1512DEEP      DW      AMST_DEEP          ;200
  92. A_1512BYTES     DW      AMST_BYTES         ;80
  93. A_1512SCRNSEG   DW      AMST_SCREENSEG     ;0b800
  94. A_MONOWIDE      DW      AMST_WIDE
  95. A_MONODEEP      DW      AMST_DEEP
  96. A_MONOBYTES     DW      AMST_BYTES
  97. A_MONOSCRNSEG   DW      AMST_SCREENSEG
  98.  
  99.  
  100. ;VERSION NUMBERS FOLLOW. YOU CAN CHANGE THE SUBVERSION NUMBER TO REFLECT
  101. ;CHANGES IN YOUR DRIVER ITSELF. THE VERSION VALUE MUST REMAIN UNCHANGED.
  102.                 DW      VERSION
  103.                 DW      SUBVERSION
  104.  
  105. ;THE DESCRIPTION APPEARS IN THE F10 "ABOUT" BOX IN GRAPHIC WORKSHOP WHEN
  106. ;AN EXTERNAL DRIVER IS BEING USED. IT CAN'T EXCEED 24 CHARACTERS AND MUST
  107. ;BE NULL TERMINATED
  108.                 DB      'Amstrad 16 col 640x200 ',0
  109. DISPATCH        ENDP
  110.  
  111. ;THIS ROUTINE DISPLAYS A COLOUR-FUDGED 16 COLOUR LINE USING THE AMSTRAD
  112. ;SPECIFIC 16 COLOUR MODE FROM A 256 COLOUR LINE IN MEMORY. EXPECT TO SEE
  113. ;INCORRECT COLOURS APPEAR. SOME COLOURS WHICH APPEARED AS DARK COLOURS
  114. ;ON A 256 COLOUR SCREEN MAY NOT COME OUT AT ALL IN 16 COLOURS.
  115. ;A FULL SCREEN DISPLAYS IN ABOUT 10 SECONDS - THIS IS AS FAST AS I COULD
  116. ;GET IT BECAUSE OF THE ABSENCE OF USING COMMANDS SUCH AS REPNE MOVSB.
  117. ;AS I AM RELATIVELY NEW TO MACHINE CODE, HOWEVER, I DO NOT KNOW ALL OF
  118. ;THE COMMANDS AND WOULD WELCOME ANY ALTERATIONS TO A MORE EFFICIENT CODE.
  119.  
  120. ;THE FIRST ARGUMENT ON THE STACK (2 WORDS) IS A FAR POINTER TO
  121. ;THE LINE. THE SECOND ARGUMENT IS THE LENGTH OF THE LINE IN PIXELS
  122. TRY256_LINE     PROC    NEAR
  123.                 PUSH    BP
  124.                 MOV     BP,SP
  125.                 PUSH    DS
  126.                 PUSH    ES
  127.  
  128.                 MOV     SI,[BP + _A0FF + 0]           ;OFFSET OF SOURCE
  129.                 MOV     DS,[BP + _A0FF + 2]           ;SEGMENT OF SOURCE
  130.  
  131.                 MOV     BX,[BP + _A0FF + 6]           ;GET LINE NUMBER
  132.                 CMP     BX,AMST_DEEP
  133.                 JGE     SHOW256X           ;RESTORE REGISTERS AND EXIT
  134.  
  135.                 SHL     BX,1
  136.                 MOV     DI,CS:[SCREENTABLE+BX]
  137.  
  138.                 CLD
  139.                 MOV     CX,[BP + _A0FF + 4];LENGTH OF MOVE IN BYTES
  140.                 CMP     CX,0
  141.                 JE      SHOW256X           ;CHECK FOR NASTIES
  142.                 CMP     CX,AMST_WIDE
  143.                 JL      SHOW256A
  144.                 MOV     CX,AMST_WIDE
  145. SHOW256A:       MOV     AX,AMST_SCREENSEG
  146.                 MOV     ES,AX
  147.  
  148.                 PUSH    DI                 ;SCREENTABLE
  149.                 PUSH    SI                 ;OFFSET OF SOURCE
  150.                 PUSH    CX                 ;WIDTH OF LINE
  151.  
  152. ;PLANE 8
  153.                 COLOURPLANE     8
  154.                 READPLANE       3
  155.                 MOV     AL,080H            ;BIT TO CONTROL
  156.  
  157. PLANE8_REPEAT:  MOV     AH,DS:[SI]         ;GET PIXEL
  158.                 AND     AH,08              ;ONLY WORRY ABOUT 4th BIT
  159.                 JZ      PLANE8_OFF
  160.                 OR      ES:[DI],AL         ;TURN BIT ON
  161.                 JMP     PLANE8_DONE
  162. PLANE8_OFF:     NOT     AL
  163.                 AND     ES:[DI],AL         ;TURN BIT OFF
  164.                 NOT     AL
  165. PLANE8_DONE:    INC     SI
  166.                 SHR     AL,1
  167.                 JNZ     PLANE8_BITOK
  168.                 MOV     AL,080H
  169.                 INC     DI
  170. PLANE8_BITOK:   LOOP    PLANE8_REPEAT      ;IF NOT FINISHED
  171.  
  172.                 POP     CX
  173.                 POP     SI
  174.                 POP     DI
  175.  
  176.                 JMP     PLANE4JMP
  177.  
  178.  
  179. SHOW256X:       POP     ES
  180.                 POP     DS
  181.                 POP     BP
  182.                 RETF
  183.  
  184. ;PLANE 4
  185. PLANE4JMP:      PUSH    DI                 ;SCREENTABLE
  186.                 PUSH    SI                 ;OFFSET OF SOURCE
  187.                 PUSH    CX                 ;WIDTH OF LINE
  188.  
  189.                 COLOURPLANE     4
  190.                 READPLANE       2
  191.                 MOV     AL,080H            ;BIT TO CONTROL
  192.  
  193. PLANE4_REPEAT:  MOV     AH,DS:[SI]         ;GET PIXEL
  194.                 AND     AH,04              ;ONLY WORRY ABOUT 4th BIT
  195.                 JZ      PLANE4_OFF
  196.                 OR      ES:[DI],AL         ;TURN BIT ON
  197.                 JMP     PLANE4_DONE
  198. PLANE4_OFF:     NOT     AL
  199.                 AND     ES:[DI],AL
  200.                 NOT     AL
  201. PLANE4_DONE:    INC     SI
  202.                 SHR     AL,1
  203.                 JNZ     PLANE4_BITOK
  204.                 MOV     AL,080H
  205.                 INC     DI
  206. PLANE4_BITOK:   LOOP    PLANE4_REPEAT      ;IF NOT FINISHED
  207.  
  208.                 POP     CX
  209.                 POP     SI
  210.                 POP     DI
  211.  
  212. ;PLANE 2
  213.                 PUSH    DI                 ;SCREENTABLE
  214.                 PUSH    SI                 ;OFFSET OF SOURCE
  215.                 PUSH    CX                 ;WIDTH OF LINE
  216.  
  217.                 COLOURPLANE     2
  218.                 READPLANE       1
  219.                 MOV     AL,080H            ;BIT TO CONTROL
  220.  
  221. PLANE2_REPEAT:  MOV     AH,DS:[SI]         ;GET PIXEL
  222.                 AND     AH,02              ;ONLY WORRY ABOUT 2nd BIT
  223.                 JZ      PLANE2_OFF
  224.                 OR      ES:[DI],AL         ;TURN BIT ON
  225.                 JMP     PLANE2_DONE
  226. PLANE2_OFF:     NOT     AL
  227.                 AND     ES:[DI],AL
  228.                 NOT     AL
  229. PLANE2_DONE:    INC     SI
  230.                 SHR     AL,1
  231.                 JNZ     PLANE2_BITOK
  232.                 MOV     AL,080H
  233.                 INC     DI
  234. PLANE2_BITOK:   LOOP    PLANE2_REPEAT      ;IF NOT FINISHED
  235.  
  236.                 POP     CX
  237.                 POP     SI
  238.                 POP     DI
  239.  
  240. ;PLANE 1
  241.                 COLOURPLANE     1
  242.                 READPLANE       0
  243.                 MOV     AL,080H            ;BIT TO CONTROL
  244.  
  245. PLANE1_REPEAT:  MOV     AH,DS:[SI]         ;GET PIXEL
  246.                 AND     AH,01              ;ONLY WORRY ABOUT LAST BIT
  247.                 JZ      PLANE1_OFF
  248.                 OR      ES:[DI],AL         ;TURN BIT ON
  249.                 JMP     PLANE1_DONE
  250. PLANE1_OFF:     NOT     AL
  251.                 AND     ES:[DI],AL
  252.                 NOT     AL
  253. PLANE1_DONE:    INC     SI
  254.                 SHR     AL,1
  255.                 JNZ     PLANE1_BITOK
  256.                 MOV     AL,080H
  257.                 INC     DI
  258. PLANE1_BITOK:   LOOP    PLANE1_REPEAT      ;IF NOT FINISHED
  259.  
  260.                 JMP     SHOW256X           ;ROUND UP
  261.  
  262. TRY256_LINE     ENDP
  263.  
  264. ;THIS ROUTINE SELECTS THE AMSTRAD 16 COLOUR MODE
  265. ;THE HEIGHT AND WIDTH OF THE IMAGE ARE ON THE STACK - THESE
  266. ;MAY BE USEFUL IF YOU WANT TO PICK ONE OF SEVERAL AVAILABLE
  267. ;MODES BASED ON THE AREA OF THE PICTURE TO BE DISPLAYED
  268. A1512_ON        PROC    NEAR
  269.                 MOV     AX,0006H
  270.                 INT     10H
  271.                 MOV     DX,03D9H
  272.                 MOV     AL,0FH
  273.                 OUT     DX,AL
  274.                 RETF
  275. A1512_ON        ENDP
  276.  
  277. ;THIS ROUTINE DISPLAYS AN AMSTRAD LINE
  278. ;THE FIRST ARGUMENT ON THE STACK (2 WORDS) IS A FAR POINTER TO
  279. ;THE LINE. THE SECOND ARGUMENT IS THE LENGTH OF THE LINE IN BYTES
  280. A1512_LINE      PROC    NEAR
  281.                 PUSH    BP
  282.                 MOV     BP,SP
  283.                 PUSH    DS
  284.                 PUSH    ES
  285.  
  286.                 MOV     SI,[BP + _A0FF + 0]      ;OFFSET OF SOURCE
  287.                 MOV     DS,[BP + _A0FF + 2]      ;SEGMENT OF SOURCE
  288.                 MOV     BX,[BP + _A0FF + 6]      ;GET LINE NUMBER
  289.                 CMP     BX,AMST_DEEP
  290.                 JGE     SHOWAMSTX
  291.  
  292.                 SHL     BX,1
  293.                 MOV     DI,CS:[SCREENTABLE+BX]
  294.  
  295.                 MOV     AX,AMST_SCREENSEG
  296.                 MOV     ES,AX
  297.                 MOV     BX,[BP + _A0FF + 4]      ;LENGTH OF MOVE IN BYTES
  298.  
  299.                 MOV     CX,BX
  300.                 COLOURPLANE     1
  301.                 CLD
  302.                 PUSH    DI
  303.          REPNE  MOVSB
  304.                 POP     DI
  305.  
  306.                 MOV     CX,BX
  307.                 COLOURPLANE     2
  308.                 PUSH    DI
  309.          REPNE  MOVSB
  310.                 POP     DI
  311.  
  312.                 MOV     CX,BX
  313.                 COLOURPLANE     4
  314.                 PUSH    DI
  315.          REPNE  MOVSB
  316.                 POP     DI
  317.  
  318.                 MOV     CX,BX
  319.                 COLOURPLANE     8
  320.                 PUSH    DI
  321.          REPNE  MOVSB
  322.                 POP     DI
  323.                                ;COLOURPLANE 0FH NOT NEEDED HERE
  324. SHOWAMSTX:      POP     ES
  325.                 POP     DS
  326.                 POP     BP
  327.                 RETF
  328. AMST_LINE       ENDP
  329.  
  330. A1512_OFF       PROC    NEAR
  331.                 MOV     AX,0003H
  332.                 INT     10H
  333.                 RETF
  334. A1512_OFF       ENDP
  335.  
  336. A1512_PALETTE   PROC    NEAR
  337.                 RETF
  338. A1512_PALETTE   ENDP
  339.  
  340. HICGA_ON        PROC    NEAR
  341.                 MOV     AX,0006H
  342.                 INT     10H
  343.                 RETF
  344. HICGA_ON        ENDP
  345.  
  346.  
  347. UPDATE_MOVE     EQU     2
  348. UPDATE_PAD      EQU     4
  349. UPDATE_ADJUST   EQU     6
  350.  
  351. ;THIS ROUTINE DISPLAYS A FULL MONOCHROME PAGE
  352. ;THE FIRST ARGUMENT ON THE STACK IS A FAR POINTER TO THE PAGE
  353. ;THE SECOND ARGUMENT IS THE WIDTH OF THE BITMAP (IN BYTES)
  354. ;THE THIRD ARGUMENT IS THE NUMBER OF LINES TO DISPLAY
  355. ;NOTE : THE SOURCE BUFFER MAY BE GREATER THAN 64K
  356. HICGA_FRAME     PROC    NEAR
  357.                 PUSH    BP
  358.                 MOV     BP,SP
  359.                 SUB     SP,UPDATE_ADJUST
  360.                 PUSH    DS
  361.                 PUSH    ES
  362.  
  363.                 MOV     AX,AMST_SCREENSEG              ;POINT TO THE SCREEN
  364.                 MOV     ES,AX
  365.                 MOV     AX,[BP + _A0FF + 4]           ;GET THE WIDTH OF MOVE
  366.                 MOV     [BP - UPDATE_MOVE],AX         ;SAVE IT LOCALLY
  367.                 MOV     WORD PTR [BP-UPDATE_PAD],0    ;SET ADJUSTMENT
  368.  
  369.                 CMP     AX,AMST_BYTES      ;IF THE MOVE IS LESS THAN
  370.                 JL      UPDATE0            ;SCREEN WIDTH, GO FOR IT
  371.  
  372.                 SUB     AX,AMST_BYTES      ;ELSE, SET MOVE WIDTH
  373.                 MOV     [BP-UPDATE_PAD],AX ;...AND THE AMOUNT TO
  374.  
  375.                 MOV     AX,AMST_BYTES      ;...ADJUST THE POINTER
  376.                 MOV     [BP-UPDATE_MOVE],AX ;..AFTER EACH LINE
  377.  
  378. UPDATE0:        MOV     SI,[BP+ _A0FF + 0] ;OFFSET OF BITMAP
  379.                 MOV     DS,[BP+ _A0FF + 2] ;SEGMENT OF BITMAP
  380.                 MOV     CX,[BP+ _A0FF + 6] ;NUMBER OF LINES
  381.  
  382.                 CLD
  383.                 SUB     BX,BX
  384.  
  385. UPDATE1:        PUSH    CX                 ;SAVE COUNT (LINE NUMBER)
  386.  
  387.                 MOV     DI,CS:[SCREENTABLE + BX]
  388.                 ADD     BX,2               ;POINT TO THE NEXT LINE
  389.  
  390.                 MOV     CX,[BP - UPDATE_MOVE]   ;GET THE MOVE SIZE
  391.          REPNE  MOVSB                           ;DO THE MOVE
  392.  
  393.                 ADD     SI,[BP-UPDATE_PAD] ;ADJUST THE POINTER
  394.  
  395.                 CMP     SI,0F800H          ;ARE WE WITHIN 2K OF THE TOP?
  396.                 JL      UPDATE2            ;IF NOT, CARRY ON
  397.  
  398.                 MOV     AX,SI              ;SEE HOW MANY SEGMENTS ARE IN
  399.                 MOV     CL,4               ;...SI (SI DIV 4)
  400.                 SHR     AX,CL
  401.  
  402.                 MOV     CX,DS              ;ADD THEM TO DATA SEGMENT
  403.                 ADD     CX,AX              ;...(YOU CAN'T JUST ADD DS,AX)
  404.                 MOV     DS,CX
  405.                 AND     SI,000FH           ;ADJUST SI (SI MOD 16)
  406.  
  407. UPDATE2:        POP     CX                 ;GET COUNT BACK
  408.                 LOOP    UPDATE1            ;DECREMENT AND LOOP
  409.  
  410.                 POP     ES
  411.                 POP     DS
  412.  
  413.                 ADD     SP,UPDATE_ADJUST
  414.                 POP     BP
  415.  
  416.                 RETF
  417. HICGA_FRAME     ENDP
  418.  
  419. ;THIS ROUTINE DISPLAYS A SINGLE MONOCHROME LINE
  420. ;THE FIRST ARGUMENT ON THE STACK IS A FAR POINTER TO THE LINE
  421. ;THE SECOND ARGUMENT IS THE LINE NUMBER
  422. ;THE THIRD ARGUMENT IS THE WIDTH OF THE BITMAP (IN BYTES)
  423. HICGA_LINE      PROC    NEAR
  424.                 PUSH    BP
  425.                 MOV     BP,SP
  426.  
  427.                 PUSH    DS
  428.                 PUSH    ES
  429.  
  430.                 MOV     AX,AMST_SCREENSEG  ;POINT TO THE SCREEN
  431.                 MOV     ES,AX
  432.  
  433.                 MOV     CX,[BP+ _A0FF + 6] ;SET THE WIDTH OF MOVE
  434.                 CMP     CX,0
  435.                 JE      MONO_LINE2
  436.                 CMP     CX,AMST_BYTES
  437.                 JL      MONO_LINE1
  438.                 MOV     CX,AMST_BYTES
  439.  
  440. MONO_LINE1:     MOV     SI,[BP + _A0FF + 0]     ;OFFSET OF BITMAP
  441.                 MOV     DS,[BP + _A0FF + 2]     ;SEGMENT OF BITMAP
  442.                 MOV     BX,[BP + _A0FF + 4]     ;GET LINE NUMBER
  443.                 SHL     BX,1
  444.  
  445.                 CLD                             ;CLEAR DIRECTION FLAG
  446.                 MOV     DI,CS:[SCREENTABLE +BX]
  447.          REPNE  MOVSB                           ;DO THE MOVE
  448.  
  449. MONO_LINE2:     POP     ES
  450.                 POP     DS
  451.                 POP     BP
  452.  
  453.                 RETF
  454. HICGA_LINE      ENDP
  455.  
  456. HICGA_OFF       PROC    NEAR
  457.                 MOV     AX,0003H
  458.                 INT     10H
  459.                 SUB     AX,AX
  460.                 RETF
  461. MONO_OFF        ENDP
  462.  
  463. NOT_USED        PROC    NEAR
  464.                 RETF                       ;EXIT IMMEDIATELY
  465. NOT_USED        ENDP
  466.  
  467. ;THIS IS A LINE START LOOKUP TABLE
  468. ;I FIND THIS IS A BETTER WAY TO STORE THE TABLE WITH THE AMSTRAD AS IT
  469. ;DOES NOT CHANGE AT ALL AS CGA>EGA>VGA TABLES MIGHT. YOU MIGHT, HOWEVER,
  470. ;WANT TO DO AWAY WITH THIS AND SAVE A BIT OF VALUABLE SPACE?
  471.  
  472. SCREENTABLE     dw      00,02000,050,02050, 0a0,020a0,0f0,020f0
  473.                 dw      0140,02140,0190,02190, 01e0,021e0,0230,02230
  474.                 dw      0280,02280,02d0,022d0, 0320,02320,0370,02370
  475.                 dw      03c0,023c0,0410,02410, 0460,02460,04b0,024b0
  476.                 dw      0500,02500,0550,02550, 05a0,025a0,05f0,025f0
  477.                 dw      0640,02640,0690,02690, 06e0,026e0,0730,02730
  478.                 dw      0780,02780,07d0,027d0, 0820,02820,0870,02870
  479.                 dw      08c0,028c0,0910,02910, 0960,02960,09b0,029b0
  480.                 dw      0a00,02a00,0a50,02a50, 0aa0,02aa0,0af0,02af0
  481.                 dw      0b40,02b40,0b90,02b90, 0be0,02be0,0c30,02c30
  482.                 dw      0c80,02c80,0cd0,02cd0, 0d20,02d20,0d70,02d70
  483.                 dw      0dc0,02dc0,0e10,02e10, 0e60,02e60,0eb0,02eb0
  484.                 dw      0f00,02f00,0f50,02f50, 0fa0,02fa0,0ff0,02ff0
  485.                 dw    01040,03040,01090,03090, 010e0,030e0,01130,03130
  486.                 dw    01180,03180,011d0,031d0, 01220,03220,01270,03270
  487.                 dw    012c0,032c0,01310,03310, 01360,03360,013b0,033b0
  488.                 dw    01400,03400,01450,03450, 014a0,034a0,014f0,034f0
  489.                 dw    01540,03540,01590,03590, 015e0,035e0,01630,03630
  490.                 dw    01680,03680,016d0,036d0, 01720,03720,01770,03770
  491.                 dw    017c0,037c0,01810,03810, 01860,03860,018b0,038b0
  492.                 dw    01900,03900,01950,03950, 019a0,039a0,019f0,039f0
  493.                 dw    01a40,03a40,01a90,03a90, 01ae0,03ae0,01b30,03b30
  494.                 dw    01b80,03b80,01bd0,03bd0, 01c20,03c20,01c70,03c70
  495.                 dw    01cc0,03cc0,01d10,03d10, 01d60,03d60,01db0,03db0
  496.                 dw    01e00,03e00,01e50,03e50, 01ea0,03ea0,01ef0,03ef0
  497.  
  498. CODE            ENDS
  499.                 END