TITLE Hercules Graphics Routines for FRACTINT ; required for compatibility if Turbo ASM IFDEF ??version MASM51 QUIRKS ENDIF .MODEL medium,c .8086 .data HGCBase equ 0B000h ;segment for HGC regen buffer page 0 herc_index equ 03B4h herc_cntrl equ 03B8h herc_status equ 03BAh herc_config equ 03BFh ; Hercules control/configuration register settings scrn_on equ 08h grph equ 02h text equ 20h enable equ 03h .code ; ; ; inithgc - Initialize the HGC in graphics mode. ; Code mostly from the Hercules Graphics Card Owner's Manual. ; inithgc PROC USES DI SI mov al,enable ; enable mode changes mov dx,herc_config ; same as HGC FULL command out dx,al mov al,grph ; set graphic mode lea si,gtable ; address of graphic parameters mov bx,0 mov cx,4000h call setmd ; call set mode common processing ret inithgc ENDP ; ; termhgc - Restore the Hercules Graphics Card to text mode. ; Code mostly from the Hercules Graphics Card Owner's Manual. ; termhgc PROC USES DI SI mov al,text ; set text mode lea si,ttable ; get address of text parameters mov bx,720h mov cx,2000 call setmd ret termhgc ENDP ; ; setmd - sets mode to graphic or text depending on al ; si = address of parameter table ; cx = number of words to be cleared ; bx = blank value ; ; from Hercules Graphics Card Owner's Manual ; setmd PROC NEAR ; push bp mov bp,sp push ax push bx push cx ; change mode, but without screen on mov dx,herc_cntrl ; get address of control register out dx,al ; al has the mode byte ; initialize the 6845 mov ax,ds mov es,ax ; also point es:si to parameter table mov dx,herc_index ; get index register address mov cx,12 ; 12 parameters to be output xor ah,ah ; starting from register 0 parms: mov al,ah ; first output register number out dx,al inc dx ; get data register address lodsb ; get next byte from param. table out dx,al ; output parameter data inc ah ; increment register number dec dx ; restore index register address loop parms ; go do another one ; now go clear the buffer pop cx ; get number of words to clear mov ax,HGCBase ; get address off video buffer cld ; set auto increment mov es,ax ; set segment for string move xor di,di ; start at offset 0 pop ax ; get blank value rep stosw ; repeat store string ; turn screen on with page 0 active mov dx,herc_cntrl ; get control register address pop ax ; get the mode byte add al,scrn_on ; set the screen-on bit out dx,al mov sp,bp pop bp ret setmd ENDP ; ; writehgc (x, y, c) - write a dot at x, y in color c ; x = x coordinate ; y = y coordinate ; c = color ; writehgc PROC USES DI SI, x, y, c cmp y,348 ; Clip for hardware boundaries jge WtDot030 cmp x,720 jge WtDot030 lea bx,HGCRegen ;set up offset of regen scan line table mov ax,HGCBase ;segment for regen buffer mov es,ax ; calculate byte address of dot in regen buffer mov si,y ;get y coordinate shl si,1 ;mult by 2 to get offset in Scan Line Table mov si,[bx][si] ;get address of start of scan line from table mov ax,x ;get x coordinate mov cl,3 shr ax,cl ;divide by 8 to get byte offset add si,ax ;es:si has address of byte with the bit ; build the bit mask for the specific dot in the byte mov cx,x ;get x coordinate and cx,0007h ;get bit number within the byte mov al,80h ;prepare bit mask shr al,cl ;al has bit mask ; either turn on the bit or turn it off, depending on the color cmp word ptr c,0 ;turn off bit? je WtDot020 ;yes -- branch ; turn on the bit or byte ptr es:[si],al jmp short WtDot030 WtDot020: ; turn off the bit xor al,0FFh and byte ptr es:[si],al WtDot030: ret writehgc ENDP ; ; readhgc (x,y) - read a dot at x,y ; x = x coordinate ; y = y coordinate ; ; dot value is to be returned in AX ; readhgc PROC USES DI SI, x,y lea bx,HGCRegen ;set up offset of regen scan line table mov ax,HGCBase ;segment for regen buffer mov es,ax ; calculate byte address of dot in regen buffer mov si,y ;get y coordinate shl si,1 ;mult by 2 to get offset in Scan Line Table mov si,[bx][si] ;get address of start of scan line from table mov ax,x ;get x coordinate mov cl,3 shr ax,cl ;divide by 8 to get byte offset add si,ax ;es:si has address of byte with the bit ; build the bit mask for the specific dot in the byte mov cx,x ;get x coordinate and cx,0007h ;get bit number within the byte mov al,80h ;prepare bit mask shr al,cl ;al has bit mask ; pick up the bit from the regen buffer test byte ptr es:[si],al jz readhgc020 ;branch if bit is zero mov ax,1 ;else return foreground bit value jmp short readhgc030 readhgc020: xor ax,ax ;bit is zero readhgc030: ret readhgc ENDP ; ; linehgc (x1,y1, x2,y2, c) - x1,y1 to x2,y2 in color c ; x1 = x1 coordinate ; y1 = y1 coordinate ; x2 = x2 coordinate ; y2 = y2 coordinate ; c = color ; linehgc PROC USES DI SI, x1,y1,x2,y2,c lea bx,HGCRegen ;set up offset of regen scan line table mov ax,HGCBase ;regen buffer segment mov es,ax ; calculate scan line address in regen buffer for y1 mov ax,y1 ;get y1 coordinate shl ax,1 ;mult by 2 to get offset of entry in table add bx,ax ;add to table beginning offset ; set increment for x and y mov ds:XStep[di],1 ;default to forward mov ds:YStep[di],1 xor dx,dx ;direction = 0 mov ax,x2 ;get x2 sub ax,x1 ;get delta x (x2 - x1) jns DrLine020 ;branch if result is positive neg ax ;else take absolute value mov ds:XStep[di],-1 ;and remember to step backwards jmp short DrLine030 DrLine020: jnz DrLine030 ;jump if delta x is not zero mov dx,-1 ;set direction = -1 if delta x = 0 DrLine030: mov ds:DeltaX[di],ax mov ax,y2 ;get y2 sub ax,y1 ;get delta y (y2 - y1) jns DrLine040 ;branch if result is positive neg ax ;else take absolute value mov ds:YStep[di],-1 ;and remember to step backwards DrLine040: mov ds:DeltaY[di],ax mov ax,x1 ;get x1 mov cx,y1 ;get y1 ;;; ;;; ax = x ;;; bx = y (encoded as address in the Scan Line Table) ;;; cx = y ;;; dx = direction ;;; cmp word ptr c,0 ;set to background color? je DrLine080 DrLine050: ; loop drawing the points of the line cmp ax,x2 ;x = x2? jne DrLine060 ;no: continue with loop cmp cx,y2 ;y = y2? je DrLineRet ;yes: finished!!! DrLine060: ; draw a point at (x,y) push cx ;save regs used push ax mov cl,3 shr ax,cl ;adjust ax for byte offset mov si,ds:[bx] ;get scan line address add si,ax ;get byte address in regen buffer pop cx ;restore x value push cx and cx,0007h ;build bit mask mov ah,80h shr ah,cl xor es:[si],ah ;turn on the bit pop ax ;restore regs used pop cx ; adjust for the next point cmp dx,0 ;direction less than zero? jge DrLine070 ;no: jump add cx,ds:YStep[di] add bx,ds:YStep[di] add bx,ds:YStep[di] add dx,ds:DeltaX[di] jmp DrLine050 DrLine070: add ax,ds:XStep[di] sub dx,ds:DeltaY[di] jmp DrLine050 DrLineRet: ret DrLine080: ; loop setting points of the line to the background color cmp ax,x2 ;x = x2? jne DrLine090 ;no: continue with loop cmp cx,y2 ;y = y2? je DrLineRet ;yes: finished!!! DrLine090: ; draw a point at (x,y) push cx ;save regs used push ax mov cl,3 shr ax,cl ;adjust ax for byte offset mov si,ds:[bx] ;get scan line address add si,ax ;get byte address in regen buffer pop cx ;restore x value push cx and cx,0007h ;build bit mask mov ah,80h shr ah,cl xor ah,0FFh and es:[si],ah ;turn off the bit pop ax ;restore regs used pop cx ; adjust for the next point cmp dx,0 ;direction less than zero? jge DrLine100 ;no: jump add cx,ds:YStep[di] add bx,ds:YStep[di] add bx,ds:YStep[di] add dx,ds:DeltaX[di] jmp DrLine080 DrLine100: add ax,ds:XStep[di] sub dx,ds:DeltaY[di] jmp DrLine080 linehgc ENDP ; ; charhgc (x,y,c) - draw char c at x,y ; x = x coordinate ; y = y coordinate ; c = character to draw ; charhgc PROC USES DI SI, x,y,c lea bx,HGCRegen ;set up offset of regen scan line table mov ax,HGCBase ;regen buffer segment mov es,ax ; determine offset to character in character table mov si,c ;get character and si,007Fh ;strip invalid bits mov cl,3 ;mult by 8 to get offset into table shl si,cl ;ds:si is addr of character in table lea di,Crt_Char ;add in table base offset add si,di ; adjust x coordinate for byte offset into regen buffer mov dx,x ;get x coordinate add dx,7 ;adjust to next byte boundary if reqd mov cl,3 shr dx,cl ;adjust for byte displacement into buffer ; get address in Regen Scan Line Table based on y coordinate mov ax,y ;get y coordinate shl ax,1 ;mult by 2 for offset into scan line table add bx,ax ;add to offset of table to get entry address ; loop 8 times to draw the character mov cx,8 charhgc020: lodsb ;al = byte from DS:SI; incr SI mov di,[bx] ;get offset into regen buffer add di,dx ;adjust for x coordinate mov es:[di],al ;store 8 pixels of char into regen buffer inc bx ;incr for next scan line inc bx loop charhgc020 ret charhgc ENDP .data gtable db 35h,2dh,2eh,07h db 5bh,02h,57h,57h db 02h,03h,00h,00h ttable db 61h,50h,52h,0fh db 19h,06h,19h,19h db 02h,0dh,0bh,0ch XStep dw 0 YStep dw 0 DeltaX dw 0 DeltaY dw 0 Crt_Char db 000h,000h,000h,000h,000h,000h,000h,000h ; #0 db 07Eh,081h,0A5h,081h,0BDh,099h,081h,07Eh ; #1 db 07Eh,0FFh,0DBh,0FFh,0C3h,0E7h,0FFh,07Eh ; #2 db 06Ch,0FEh,0FEh,0FEh,07Ch,038h,010h,000h ; #3 db 010h,038h,07Ch,0FEh,07Ch,038h,010h,000h ; #4 db 038h,07Ch,038h,0FEh,0FEh,07Ch,038h,07Ch ; #5 db 010h,010h,038h,07Ch,0FEh,07Ch,038h,07Ch ; #6 db 000h,000h,018h,03Ch,03Ch,018h,000h,000h ; #7 db 0FFh,0FFh,0E7h,0C3h,0C3h,0E7h,0FFh,0FFh ; #8 db 000h,03Ch,066h,042h,042h,066h,03Ch,000h ; #9 db 0FFh,0C3h,099h,0BDh,0BDh,099h,0C3h,0FFh ; #10 db 00Fh,007h,00Fh,07Dh,0CCh,0CCh,0CCh,078h ; #11 db 03Ch,066h,066h,066h,03Ch,018h,07Eh,018h ; #12 db 03Fh,033h,03Fh,030h,030h,070h,0F0h,0E0h ; #13 db 07Fh,063h,07Fh,063h,063h,067h,0E6h,0C0h ; #14 db 099h,05Ah,03Ch,0E7h,0E7h,03Ch,05Ah,099h ; #15 db 080h,0E0h,0F8h,0FEh,0F8h,0E0h,080h,000h ; #16 db 002h,00Eh,03Eh,0FEh,03Eh,00Eh,002h,000h ; #17 db 018h,03Ch,07Eh,018h,018h,07Eh,03Ch,018h ; #18 db 066h,066h,066h,066h,066h,000h,066h,000h ; #19 db 07Fh,0dbh,0dbh,07Bh,01Bh,01Bh,01Bh,000h ; #20 db 03Eh,063h,038h,06Ch,06Ch,038h,0CCh,078h ; #21 db 000h,000h,000h,000h,07Eh,07Eh,07Eh,000h ; #22 db 018h,03Ch,07Eh,018h,07Eh,03Ch,018h,0FFh ; #23 db 018h,03Ch,07Eh,018h,018h,018h,018h,000h ; #24 db 018h,018h,018h,018h,07Eh,03Ch,018h,000h ; #25 db 000h,018h,00Ch,0FEh,00Ch,018h,000h,000h ; #26 db 000h,030h,060h,0FEh,060h,030h,000h,000h ; #27 db 000h,000h,0C0h,0C0h,0C0h,0FEh,000h,000h ; #28 db 000h,024h,066h,0FFh,066h,024h,000h,000h ; #29 db 000h,018h,03Ch,07Eh,0FFh,0FFh,000h,000h ; #30 db 000h,0FFh,0FFh,07Eh,03Ch,018h,000h,000h ; #31 db 000h,000h,000h,000h,000h,000h,000h,000h ; #32 ' ' db 030h,078h,078h,030h,030h,000h,030h,000h ; #33 '!' db 06Ch,06Ch,06Ch,000h,000h,000h,000h,000h ; #34 '"' db 06Ch,06Ch,0FEh,06Ch,0FEh,06Ch,06Ch,000h ; #35 '#' db 030h,07Ch,0C0h,078h,00Ch,0F8h,030h,000h ; #36 '$' db 000h,0C6h,0CCh,018h,030h,066h,0C6h,000h ; #37 '%' db 038h,06Ch,038h,076h,0DCh,0CCh,076h,000h ; #38 '&' db 060h,060h,0C0h,000h,000h,000h,000h,000h ; #39 ''' db 018h,030h,060h,060h,060h,030h,018h,000h ; #40 '(' db 060h,030h,018h,018h,018h,030h,060h,000h ; #41 ')' db 000h,066h,03Ch,0FFh,03Ch,066h,000h,000h ; #42 '*' db 000h,030h,030h,0FCh,030h,030h,000h,000h ; #43 '+' db 000h,000h,000h,000h,000h,030h,030h,060h ; #44 ',' db 000h,000h,000h,0FCh,000h,000h,000h,000h ; #45 '-' db 000h,000h,000h,000h,000h,030h,030h,000h ; #46 '.' db 006h,00Ch,018h,030h,060h,0C0h,080h,000h ; #47 '/' db 07Ch,0C6h,0CEh,0DEh,0F6h,0E6h,07Ch,000h ; #48 '0' db 030h,070h,030h,030h,030h,030h,0FCh,000h ; #49 '1' db 078h,0CCh,00Ch,038h,060h,0CCh,0FCh,000h ; #50 '2' db 078h,0CCh,00Ch,038h,00Ch,0CCh,078h,000h ; #51 '3' db 01Ch,03Ch,06Ch,0CCh,0FEh,00Ch,01Eh,000h ; #52 '4' db 0FCh,0C0h,0F8h,00Ch,00Ch,0CCh,078h,000h ; #53 '5' db 038h,060h,0C0h,0F8h,0CCh,0CCh,078h,000h ; #54 '6' db 0FCh,0CCh,00Ch,018h,030h,030h,030h,000h ; #55 '7' db 078h,0CCh,0CCh,078h,0CCh,0CCh,078h,000h ; #56 '8' db 078h,0CCh,0CCh,07Ch,00Ch,018h,070h,000h ; #57 '9' db 000h,030h,030h,000h,000h,030h,030h,000h ; #58 ':' db 000h,030h,030h,000h,000h,030h,030h,060h ; #59 ';' db 018h,030h,060h,0C0h,060h,030h,018h,000h ; #60 '<' db 000h,000h,0FCh,000h,000h,0FCh,000h,000h ; #61 '=' db 060h,030h,018h,00Ch,018h,030h,060h,000h ; #62 '>' db 078h,0CCh,00Ch,018h,030h,000h,030h,000h ; #63 '?' db 07Ch,0C6h,0DEh,0DEh,0DEh,0C0h,078h,000h ; #64 '@' db 030h,078h,0CCh,0CCh,0FCh,0CCh,0CCh,000h ; #65 'A' db 0FCh,066h,066h,07Ch,066h,066h,0FCh,000h ; #66 'B' db 03Ch,066h,0C0h,0C0h,0C0h,066h,03Ch,000h ; #67 'C' db 0F8h,06Ch,066h,066h,066h,06Ch,0F8h,000h ; #68 'D' db 0FEh,062h,068h,078h,068h,062h,0FEh,000h ; #69 'E' db 0FEh,062h,068h,078h,068h,060h,0F0h,000h ; #70 'F' db 03Ch,066h,0C0h,0C0h,0CEh,066h,03Eh,000h ; #71 'G' db 0CCh,0CCh,0CCh,0FCh,0CCh,0CCh,0CCh,000h ; #72 'H' db 078h,030h,030h,030h,030h,030h,078h,000h ; #73 'I' db 01Eh,00Ch,00Ch,00Ch,0CCh,0CCh,078h,000h ; #74 'J' db 0E6h,066h,06Ch,078h,06Ch,066h,0E6h,000h ; #75 'K' db 0F0h,060h,060h,060h,062h,066h,0FEh,000h ; #76 'L' db 0C6h,0EEh,0FEh,0FEh,0D6h,0C6h,0C6h,000h ; #77 'M' db 0C6h,0E6h,0F6h,0DEh,0CEh,0C6h,0C6h,000h ; #78 'N' db 038h,06Ch,0C6h,0C6h,0C6h,06Ch,038h,000h ; #79 'O' db 0FCh,066h,066h,07Ch,060h,060h,0F0h,000h ; #80 'P' db 078h,0CCh,0CCh,0CCh,0DCh,078h,01Ch,000h ; #81 'Q' db 0FCh,066h,066h,07Ch,06Ch,066h,0E6h,000h ; #82 'R' db 078h,0CCh,0E0h,070h,01Ch,0CCh,078h,000h ; #83 'S' db 0FCh,0B4h,030h,030h,030h,030h,078h,000h ; #84 'T' db 0CCh,0CCh,0CCh,0CCh,0CCh,0CCh,0FCh,000h ; #85 'U' db 0CCh,0CCh,0CCh,0CCh,0CCh,078h,030h,000h ; #86 'V' db 0C6h,0C6h,0C6h,0D6h,0FEh,0EEh,0C6h,000h ; #87 'W' db 0C6h,0C6h,06Ch,038h,038h,06Ch,0C6h,000h ; #88 'X' db 0CCh,0CCh,0CCh,078h,030h,030h,078h,000h ; #89 'Y' db 0FEh,0C6h,08Ch,018h,032h,066h,0FEh,000h ; #90 'Z' db 078h,060h,060h,060h,060h,060h,078h,000h ; #91 '[' db 0C0h,060h,030h,018h,00Ch,006h,002h,000h ; #92 '\' db 078h,018h,018h,018h,018h,018h,078h,000h ; #93 ']' db 010h,038h,06Ch,0C6h,000h,000h,000h,000h ; #94 '^' db 000h,000h,000h,000h,000h,000h,000h,0FFh ; #95 '_' db 030h,030h,018h,000h,000h,000h,000h,000h ; #96 '`' db 000h,000h,078h,00Ch,07Ch,0CCh,076h,000h ; #97 'a' db 0E0h,060h,060h,07Ch,066h,066h,0DCh,000h ; #98 'b' db 000h,000h,078h,0CCh,0C0h,0CCh,078h,000h ; #99 'c' db 01Ch,00Ch,00Ch,07Ch,0CCh,0CCh,076h,000h ; #100 'd' db 000h,000h,078h,0CCh,0FCh,0C0h,078h,000h ; #101 'e' db 038h,06Ch,060h,0F0h,060h,060h,0F0h,000h ; #102 'f' db 000h,000h,076h,0CCh,0CCh,07Ch,00Ch,0F8h ; #103 'g' db 0E0h,060h,06Ch,076h,066h,066h,0E6h,000h ; #104 'h' db 030h,000h,070h,030h,030h,030h,078h,000h ; #105 'i' db 00Ch,000h,00Ch,00Ch,00Ch,0CCh,0CCh,078h ; #106 'j' db 0E0h,060h,066h,06Ch,078h,06Ch,0E6h,000h ; #107 'k' db 070h,030h,030h,030h,030h,030h,078h,000h ; #108 'l' db 000h,000h,0CCh,0FEh,0FEh,0D6h,0C6h,000h ; #109 'm' db 000h,000h,0F8h,0CCh,0CCh,0CCh,0CCh,000h ; #110 'n' db 000h,000h,078h,0CCh,0CCh,0CCh,078h,000h ; #111 'o' db 000h,000h,0DCh,066h,066h,07Ch,060h,0F0h ; #112 'p' db 000h,000h,076h,0CCh,0CCh,07Ch,00Ch,01Eh ; #113 'q' db 000h,000h,0DCh,076h,066h,060h,0F0h,000h ; #114 'r' db 000h,000h,07Ch,0C0h,078h,00Ch,0F8h,000h ; #115 's' db 010h,030h,07Ch,030h,030h,034h,018h,000h ; #116 't' db 000h,000h,0CCh,0CCh,0CCh,0CCh,076h,000h ; #117 'u' db 000h,000h,0CCh,0CCh,0CCh,078h,030h,000h ; #118 'v' db 000h,000h,0C6h,0D6h,0FEh,0FEh,06Ch,000h ; #119 'w' db 000h,000h,0C6h,06Ch,038h,06Ch,0C6h,000h ; #120 'x' db 000h,000h,0CCh,0CCh,0CCh,07Ch,00Ch,0F8h ; #121 'y' db 000h,000h,0FCh,098h,030h,064h,0FCh,000h ; #122 'z' db 01Ch,030h,030h,0E0h,030h,030h,01Ch,000h ; #123 '{' db 018h,018h,018h,000h,018h,018h,018h,000h ; #124 '|' db 0E0h,030h,030h,01Ch,030h,030h,0E0h,000h ; #125 '}' db 076h,0DCh,000h,000h,000h,000h,000h,000h ; #126 '~' db 000h,010h,038h,06Ch,0C6h,0C6h,0FEh,000h ; #127 ;offsets into HGC regen buffer for each scan line HGCRegen dw 0,8192,16384,24576,90,8282,16474,24666 dw 180,8372,16564,24756,270,8462,16654,24846 dw 360,8552,16744,24936,450,8642,16834,25026 dw 540,8732,16924,25116,630,8822,17014,25206 dw 720,8912,17104,25296,810,9002,17194,25386 dw 900,9092,17284,25476,990,9182,17374,25566 dw 1080,9272,17464,25656,1170,9362,17554,25746 dw 1260,9452,17644,25836,1350,9542,17734,25926 dw 1440,9632,17824,26016,1530,9722,17914,26106 dw 1620,9812,18004,26196,1710,9902,18094,26286 dw 1800,9992,18184,26376,1890,10082,18274,26466 dw 1980,10172,18364,26556,2070,10262,18454,26646 dw 2160,10352,18544,26736,2250,10442,18634,26826 dw 2340,10532,18724,26916,2430,10622,18814,27006 dw 2520,10712,18904,27096,2610,10802,18994,27186 dw 2700,10892,19084,27276,2790,10982,19174,27366 dw 2880,11072,19264,27456,2970,11162,19354,27546 dw 3060,11252,19444,27636,3150,11342,19534,27726 dw 3240,11432,19624,27816,3330,11522,19714,27906 dw 3420,11612,19804,27996,3510,11702,19894,28086 dw 3600,11792,19984,28176,3690,11882,20074,28266 dw 3780,11972,20164,28356,3870,12062,20254,28446 dw 3960,12152,20344,28536,4050,12242,20434,28626 dw 4140,12332,20524,28716,4230,12422,20614,28806 dw 4320,12512,20704,28896,4410,12602,20794,28986 dw 4500,12692,20884,29076,4590,12782,20974,29166 dw 4680,12872,21064,29256,4770,12962,21154,29346 dw 4860,13052,21244,29436,4950,13142,21334,29526 dw 5040,13232,21424,29616,5130,13322,21514,29706 dw 5220,13412,21604,29796,5310,13502,21694,29886 dw 5400,13592,21784,29976,5490,13682,21874,30066 dw 5580,13772,21964,30156,5670,13862,22054,30246 dw 5760,13952,22144,30336,5850,14042,22234,30426 dw 5940,14132,22324,30516,6030,14222,22414,30606 dw 6120,14312,22504,30696,6210,14402,22594,30786 dw 6300,14492,22684,30876,6390,14582,22774,30966 dw 6480,14672,22864,31056,6570,14762,22954,31146 dw 6660,14852,23044,31236,6750,14942,23134,31326 dw 6840,15032,23224,31416,6930,15122,23314,31506 dw 7020,15212,23404,31596,7110,15302,23494,31686 dw 7200,15392,23584,31776,7290,15482,23674,31866 dw 7380,15572,23764,31956,7470,15662,23854,32046 dw 7560,15752,23944,32136,7650,15842,24034,32226 dw 7740,15932,24124,32316 END