CATASM.ASM 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. ; The Catacomb Source Code
  2. ; Copyright (C) 1993-2014 Flat Rock Software
  3. ;
  4. ; This program is free software; you can redistribute it and/or modify
  5. ; it under the terms of the GNU General Public License as published by
  6. ; the Free Software Foundation; either version 2 of the License, or
  7. ; (at your option) any later version.
  8. ;
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. ; GNU General Public License for more details.
  13. ;
  14. ; You should have received a copy of the GNU General Public License along
  15. ; with this program; if not, write to the Free Software Foundation, Inc.,
  16. ; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  17. MASM
  18. locals
  19. .MODEL SMALL,C
  20. .DATA
  21. EXTRN xormask:WORD
  22. EXTRN oldtiles, view, background, originx, originy: WORD
  23. EXTRN priority: BYTE
  24. EXTRN obj, altobj: objtype
  25. EXTRN pics:WORD
  26. objtype STRUC
  27. active dw ?
  28. class dw ?
  29. x db ?
  30. y db ?
  31. stage db ?
  32. delay db ?
  33. dir dw ?
  34. hp db ?
  35. oldx db ?
  36. oldy db ?
  37. oldtile dw ?
  38. filler1 db ?
  39. think db ?
  40. contact db ?
  41. solid db ?
  42. firstchar dw ?
  43. psize db ?
  44. stages db ?
  45. dirmask db ?
  46. speed dw ?
  47. hitpoints db ?
  48. damage db ?
  49. points dw ?
  50. filler2 db ?,?
  51. objtype ENDS
  52. obp dw ? ;temporary for turbo's BP
  53. .CODE
  54. ;========================================================================
  55. ;{=========================================}
  56. ;{ }
  57. ;{ DRAWOBJ }
  58. ;{ Draws the object to TILES in the proper }
  59. ;{ direction and state. }
  60. ;{ }
  61. ;{=========================================}
  62. ;
  63. ;Procedure DrawObj;
  64. ;var
  65. ; objpri,bsize,tilenum:integer;
  66. ;Begin
  67. ; tilenum:=obj.firstchar + obj.size * obj.size
  68. ; *((integer(obj.dir) and obj.dirmask) * obj.stages + obj.stage);
  69. ; obj.oldtile:= tilenum;
  70. ; obj.oldx:=obj.x;
  71. ; obj.oldy:=obj.y;
  72. ; objpri:=priority[tilenum];
  73. ; For y:=obj.y to obj.y+obj.size-1 do
  74. ; for x:=obj.x to obj.x+obj.size-1 do
  75. ; Begin
  76. ; if priority[view[y,x]]<=objpri then
  77. ; view[y,x]:=tilenum;
  78. ; inc(tilenum);
  79. ; end;
  80. ;End;
  81. ;
  82. ;
  83. squares db 0,1,4,9,16,25,36,49,64
  84. table86 dw 0, 86, 172, 258, 344, 430, 516, 602, 688, 774, 860, 946,1032,1118
  85. dw 1204,1290,1376,1462,1548,1634,1720,1806,1892,1978,2064,2150,2236,2322
  86. dw 2408,2494,2580,2666,2752,2838,2924,3010,3096,3182,3268,3354,3440,3526
  87. dw 3612,3698,3784,3870,3956,4042,4128,4214,4300,4386,4472,4558,4644,4730
  88. dw 4816,4902,4988,5074,5160,5246,5332,5418,5504,5590,5676,5762,5848,5934
  89. dw 6020,6106,6192,6278,6364,6450,6536,6622,6708,6794,6880,6966,7052,7138
  90. dw 7224,7310,7396
  91. drawobj PROC NEAR
  92. USES SI,DI
  93. PUBLIC drawobj
  94. mov al,BYTE PTR obj.dir
  95. and al,obj.dirmask
  96. mul obj.stages
  97. add al,obj.stage
  98. mov cl,al
  99. mov bl,obj.psize
  100. xor bh,bh
  101. mov al,cs:[squares+bx]
  102. mul cl
  103. add ax,obj.firstchar
  104. mov SI,ax
  105. mov obj.oldtile,SI ;SI holds the first tile to put in
  106. mov dl,[priority+SI] ;entire object has same priority
  107. ;priority is saved in DL
  108. mov bl,obj.y
  109. mov obj.oldy,bl
  110. xor bh,bh
  111. shl bx,1
  112. mov ax,cs:[table86+bx] ;View is 86*86
  113. mov bl,obj.x
  114. mov obj.oldx,bl
  115. xor bh,bh
  116. add ax,bx ;calculate origin's offset in VIEW
  117. shl ax,1 ;becuase view is WORD width
  118. mov di,ax ;DI will point into VIEW
  119. mov al,obj.psize ;throughout loop
  120. xor ah,ah
  121. mov dh,al ;do this many lines
  122. @@yloop:
  123. mov cx,ax ;do this many characters / line
  124. @@xloop:
  125. mov bx,[view+DI]
  126. cmp dl,[priority+bx] ;check tiles priority level
  127. jb @@next ;don't draw if lower than what's there
  128. mov [view+di],si
  129. @@next:
  130. inc si
  131. inc di
  132. inc di
  133. loop @@xloop
  134. sub di,ax
  135. sub di,ax
  136. add di,86*2 ;position destination at start of next line
  137. dec dh ;any more lines to do?
  138. jnz @@yloop
  139. ret
  140. DrawObj ENDP
  141. ;========================================================================
  142. ;{=======================================}
  143. ;{ }
  144. ;{ ERASEOBJ }
  145. ;{ Erases the current object by copying }
  146. ;{ the background onto the view where the}
  147. ;{ object is standing }
  148. ;{ }
  149. ;{=======================================}
  150. ;
  151. ;Procedure EraseObj;
  152. ;var
  153. ; objpri,bsize,tilenum:integer;
  154. ;Begin
  155. ; tilenum:=obj.oldtile;
  156. ; For y:=obj.oldy to obj.oldy+obj.size-1 do
  157. ; for x:=obj.oldx to obj.oldx+obj.size-1 do
  158. ; Begin
  159. ; if view[y,x]=tilenum then
  160. ; view[y,x]:=background[y,x];
  161. ; inc(tilenum);
  162. ; end;
  163. ;End;
  164. ;
  165. eraseobj PROC NEAR
  166. USES SI,DI
  167. PUBLIC eraseobj
  168. mov SI,obj.oldtile ;only erase chars that match what was
  169. ;drawn by the last drawobj
  170. mov bl,obj.oldy
  171. xor bh,bh
  172. shl bx,1
  173. mov ax,cs:[table86+bx] ;View is 86*86
  174. mov bl,obj.oldx
  175. xor bh,bh
  176. add ax,bx ;calculate origin's offset in VIEW
  177. shl ax,1 ;becuase view is WORD width
  178. mov di,ax ;DI will point into VIEW
  179. mov al,obj.psize ;throughout loop
  180. xor ah,ah
  181. mov dh,al ;do this many lines
  182. @@yloop:
  183. mov cx,ax ;do this many characters / line
  184. @@xloop:
  185. cmp si,[view+DI]
  186. jne @@next ;don't erase if its not part of the shape
  187. mov bx,[background+di]
  188. mov [view+di],bx ;erase it
  189. @@next:
  190. inc si
  191. inc di
  192. inc di
  193. loop @@xloop
  194. sub di,ax
  195. sub di,ax
  196. add di,86*2 ;position destination at start of next line
  197. dec dh ;any more lines to do?
  198. jnz @@yloop
  199. ret
  200. EraseObj ENDP
  201. ;========================================================================
  202. ;{====================}
  203. ;{ }
  204. ;{ DoAll }
  205. ;{ The main play loop }
  206. ;{ }
  207. ;{====================}
  208. ;
  209. ;Procedure Doall;
  210. ;begin
  211. ; Repeat {until leveldone or playdone}
  212. ; For objecton:=numobj downto 0 do
  213. ; Begin
  214. ; move (o[objecton],obj.active,sizeof(o[objecton]) );
  215. ; if obj.class<>nothing then {class=nothing means it was killed}
  216. ; Begin
  217. ; move (ObjDef[obj.class],obj.think,sizeof(objdef[obj.class]) );
  218. ; if obj.active then
  219. ; DoActive
  220. ; else
  221. ; DoInactive;
  222. ; end;
  223. ; end;
  224. ; refresh;
  225. ; inc (frameon);
  226. ; until leveldone or playdone;
  227. ;end;
  228. .DATA
  229. EXTRN o:objtype
  230. EXTRN objdef:WORD ;actually the second half of objtype record
  231. EXTRN frameon:WORD
  232. EXTRN numobj:WORD
  233. EXTRN objecton:WORD
  234. EXTRN leveldone:BYTE
  235. EXTRN playdone:BYTE
  236. .CODE
  237. EXTRN refresh:NEAR
  238. EXTRN doactive:NEAR
  239. EXTRN doinactive:NEAR
  240. doall PROC NEAR
  241. USES SI,DI
  242. PUBLIC doall
  243. @@repeat:
  244. mov ax,[numobj]
  245. mov [objecton],ax
  246. @@forobjecton:
  247. mov si,[objecton]
  248. shl si,1
  249. shl si,1
  250. shl si,1
  251. shl si,1 ;o[] is 16 bytes wide
  252. add si,OFFSET o
  253. mov di,OFFSET obj
  254. push ds
  255. pop es
  256. movsw
  257. movsw
  258. movsw
  259. movsw
  260. movsw
  261. movsw
  262. movsw
  263. movsw ;copy 16 bytes
  264. mov al,[BYTE PTR obj.class]
  265. or al,al
  266. jz @@next
  267. xor ah,ah
  268. mov si,ax
  269. shl si,1
  270. shl si,1
  271. shl si,1
  272. shl si,1 ;objdef is 16 bytes wide
  273. add si,OFFSET objdef
  274. movsw
  275. movsw
  276. movsw
  277. movsw
  278. movsw
  279. movsw
  280. movsw
  281. movsw ;copy second 16 bytes into obj
  282. mov al,[BYTE PTR obj.active]
  283. or al,al
  284. jnz @@isactive
  285. call DoInactive
  286. jmp @@next
  287. @@isactive:
  288. call DoActive
  289. @@next:
  290. mov al,[leveldone] ; check end
  291. or al,al
  292. jnz @@done
  293. mov al,[playdone]
  294. or al,al
  295. jnz @@done
  296. dec [objecton]
  297. jns @@forobjecton ; END for
  298. call refresh
  299. inc [frameon]
  300. mov al,[leveldone] ; UNTIL
  301. or al,al
  302. jnz @@done
  303. mov al,[playdone]
  304. or al,al
  305. jz @@repeat
  306. @@done:
  307. ret
  308. DoAll ENDP
  309. ;========================================================================
  310. ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
  311. ;
  312. ; Move EGA tiles into EGA memory at "EGATileLoc"!
  313. ;
  314. ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
  315. EGAmove PROC NEAR
  316. USES SI,DI
  317. PUBLIC EGAmove
  318. mov dx,3c4h ;turn MapMask register on!
  319. mov al,2
  320. out dx,al
  321. inc dx
  322. mov ax,0A400h
  323. mov es,ax ;ES:DI = just after screen in latch memory
  324. xor di,di
  325. mov ax,WORD PTR [pics+2]
  326. mov ds,ax
  327. xor si,si ;DS:SI = start of tiles!
  328. cld
  329. mov cx,2048
  330. @@0:
  331. mov ah,1b ;start at bitplane 0
  332. mov bx,di
  333. @@2:
  334. mov al,ah
  335. out dx,al ;select new bitplane!
  336. movsb
  337. movsb
  338. movsb
  339. movsb
  340. movsb
  341. movsb
  342. movsb
  343. movsb
  344. mov di,bx
  345. shl ah,1
  346. test ah,1111b
  347. jnz @@2 ;do all bitplanes in shape
  348. add di,8
  349. loop @@0 ;do all tiles
  350. mov al,1111b
  351. out dx,al ;select all bitplanes
  352. mov ax,ss ;reset DATA segment
  353. mov ds,ax
  354. ret
  355. EGAMove ENDP
  356. ;=======================================================================
  357. ;=========
  358. ;
  359. ; CGAREFRESH redraws the tiles that have changed in the tiled screen area
  360. ;
  361. ;=========
  362. cgarefresh PROC NEAR
  363. USES SI,DI
  364. PUBLIC cgarefresh
  365. mov obp,bp ;save off turbo's BP
  366. mov ax,0B800h ;start of CGA memory
  367. mov es,ax
  368. cld ;just in case
  369. mov cx,OFFSET @@next ;so it can be JMPd to
  370. mov ax,originy
  371. mov bl,86 ;View is 86*86 so no clipping
  372. mul bl
  373. add ax,originx ;calculate origin's offset in VIEW
  374. shl ax,1 ;becuase view is WORD width
  375. mov bp,ax ;BP will point into VIEW
  376. mov dx,ax
  377. add dx,48 ;when BP=DX, one row has been filled
  378. xor bx,bx ;fast mov bx,0
  379. @@check:
  380. mov ax,view[bp] ;load the current tile
  381. cmp ax,oldtiles[bx] ;compare it with the old tile
  382. jne @@drawone ;if different, redraw
  383. @@next:
  384. add bx,2 ;next oldtile
  385. add bp,2 ;next view tile
  386. cmp bp,dx ;has an entire row from VIEW been drawn?
  387. jne @@check
  388. cmp bx,24*24*2 ;have all tiles been drawn?
  389. je @@done
  390. add bp,124 ;point it to the start of the next row
  391. add dx,172 ;point to end of next row
  392. jmp @@check
  393. @@done:
  394. mov bp,obp ;restore turbo's BP
  395. ret
  396. @@drawone:
  397. mov oldtiles[bx],ax ;store the tile back to the oldtiles
  398. mov di,word ptr cs:CGAtileloc[bx] ;set di to screen address
  399. shl ax,1 ;character number * 16 = start of data
  400. shl ax,1
  401. shl ax,1
  402. shl ax,1
  403. mov si,ax
  404. mov ds,[pics+2] ;segment of pics (para aligned)
  405. movsw ;load in a row of the tile's picture
  406. add di,1FFEh
  407. movsw
  408. sub di,1FB2h
  409. movsw
  410. add di,1FFEh
  411. movsw
  412. sub di,1FB2h
  413. movsw
  414. add di,1FFEh
  415. movsw
  416. sub di,1FB2h
  417. movsw
  418. add di,1FFEh
  419. movsw
  420. mov ax,ss
  421. mov ds,ax ;restore turbo's data segment
  422. jmp CX ;CX holds OFFSET NEXT
  423. CgaRefresh ENDP
  424. ;=======================================================================
  425. ;=========
  426. ;
  427. ; EGAREFRESH redraws the tiles that have changed in the tiled screen area
  428. ;
  429. ;=========
  430. egarefresh PROC NEAR
  431. USES SI,DI
  432. PUBLIC egarefresh
  433. mov obp,bp ;save off turbo's BP
  434. mov ax,105h
  435. mov dx,3ceh ;set write mode 1
  436. out dx,ax
  437. mov ax,0A000h ;start of EGA memory
  438. mov es,ax
  439. cld ;just in case
  440. mov cx,OFFSET @@next ;so it can be JMPd to
  441. mov ax,originy
  442. mov bl,86 ;View is 86*86 so no clipping
  443. mul bl
  444. add ax,originx ;calculate origin's offset in VIEW
  445. shl ax,1 ;becuase view is WORD width
  446. mov bp,ax ;BP will point into VIEW
  447. mov dx,ax
  448. add dx,48 ;when BP=DX, one row has been filled
  449. xor bx,bx ;fast mov bx,0
  450. @@check:
  451. mov ax,view[bp] ;load the current tile
  452. cmp ax,oldtiles[bx] ;compare it with the old tile
  453. jne @@drawone ;if different, redraw
  454. @@next:
  455. add bx,2 ;next oldtile
  456. add bp,2 ;next view tile
  457. cmp bp,dx ;has an entire row from VIEW been drawn?
  458. jne @@check
  459. cmp bx,24*24*2 ;have all tiles been drawn?
  460. je @@done
  461. add bp,124 ;point it to the start of the next row
  462. add dx,172 ;point to end of next row
  463. jmp @@check
  464. @@done:
  465. mov bp,obp ;restore turbo's BP
  466. ret
  467. @@drawone:
  468. mov oldtiles[bx],ax ;store the tile back to the oldtiles
  469. mov di,word ptr cs:EGAtileloc[bx] ;set di to screen address
  470. shl ax,1 ;character number * 8 = start of data
  471. shl ax,1
  472. shl ax,1
  473. add ax,4000h ;because the ega pics are in same bank as screen
  474. mov si,ax
  475. mov ax,es
  476. mov ds,ax ;pics are just later in screen memory
  477. movsb ;load in a row of the tile's picture
  478. add di,39
  479. movsb
  480. add di,39
  481. movsb
  482. add di,39
  483. movsb
  484. add di,39
  485. movsb
  486. add di,39
  487. movsb
  488. add di,39
  489. movsb
  490. add di,39
  491. movsb
  492. mov ax,ss
  493. mov ds,ax ;restore turbo's data segment
  494. jmp CX ;CX holds OFFSET NEXT
  495. EgaRefresh ENDP
  496. dataseg
  497. linetables dw 0,0
  498. blockingtiles db 128 dup (0)
  499. db 1,1,1,1,1,1,1
  500. db 2048 dup (0)
  501. codeseg
  502. ;===========================================================================
  503. if 0
  504. ;=========
  505. ;
  506. ; EGAREFRESH with hidden area removal
  507. ;
  508. ;=========
  509. egarefresh PROC NEAR
  510. USES SI,DI
  511. PUBLIC egarefresh
  512. mov obp,bp ;save off turbo's BP
  513. mov ax,105h
  514. mov dx,3ceh ;set write mode 1
  515. out dx,ax
  516. mov ax,0A000h ;start of EGA memory
  517. mov es,ax
  518. cld ;just in case
  519. mov cx,OFFSET @@next ;so it can be JMPd to
  520. mov ax,originy
  521. mov bl,86 ;View is 86*86 so no clipping
  522. mul bl
  523. add ax,originx ;calculate origin's offset in VIEW
  524. shl ax,1 ;becuase view is WORD width
  525. mov bp,ax ;BP will point into VIEW
  526. mov dx,ax
  527. add dx,48 ;when BP=DX, one row has been filled
  528. xor bx,bx ;fast mov bx,0
  529. @@check:
  530. mov cx,view[bp] ;load the current tile
  531. ;
  532. ; check for blocking tiles
  533. ;
  534. mov ds,[linetables+2]
  535. mov si,[bx] ;start of blocking table
  536. @@checkblock:
  537. lodsw
  538. test ax,ax
  539. jz @@cansee ;0 is end of offset list
  540. add si,bx ;si holds tile offset from map start
  541. mov si,[ss:view+si]
  542. cmp [BYTE PTR ss:blockingtiles+si],0
  543. jz @@checkblock
  544. xor cx,cx ;can't see it, draw black
  545. @@cansee:
  546. mov ax,ss
  547. mov ds,ax ;restore data segment
  548. mov ax,cx
  549. cmp ax,oldtiles[bx] ;compare it with the old tile
  550. jne @@drawone ;if different, redraw
  551. @@next:
  552. add bx,2 ;next oldtile
  553. add bp,2 ;next view tile
  554. cmp bp,dx ;has an entire row from VIEW been drawn?
  555. jne @@check
  556. cmp bx,24*24*2 ;have all tiles been drawn?
  557. je @@done
  558. add bp,124 ;point it to the start of the next row
  559. add dx,172 ;point to end of next row
  560. jmp @@check
  561. @@done:
  562. mov bp,obp ;restore turbo's BP
  563. ret
  564. @@drawone:
  565. mov oldtiles[bx],ax ;store the tile back to the oldtiles
  566. mov di,word ptr cs:EGAtileloc[bx] ;set di to screen address
  567. shl ax,1 ;character number * 8 = start of data
  568. shl ax,1
  569. shl ax,1
  570. add ax,4000h ;because the ega pics are in same bank as screen
  571. mov si,ax
  572. mov ax,es
  573. mov ds,ax ;pics are just later in screen memory
  574. movsb ;load in a row of the tile's picture
  575. add di,39
  576. movsb
  577. add di,39
  578. movsb
  579. add di,39
  580. movsb
  581. add di,39
  582. movsb
  583. add di,39
  584. movsb
  585. add di,39
  586. movsb
  587. add di,39
  588. movsb
  589. mov ax,ss
  590. mov ds,ax ;restore turbo's data segment
  591. jmp CX ;CX holds OFFSET NEXT
  592. EgaRefresh ENDP
  593. endif
  594. ;=======================================================================
  595. ;=========
  596. ;
  597. ; TILELOC has the offsets from $B800 of all 24*24 tiles
  598. ;
  599. ;=========
  600. CGAtileloc label word
  601. dw 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26
  602. dw 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 320, 322, 324, 326
  603. dw 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354
  604. dw 356, 358, 360, 362, 364, 366, 640, 642, 644, 646, 648, 650, 652, 654
  605. dw 656, 658, 660, 662, 664, 666, 668, 670, 672, 674, 676, 678, 680, 682
  606. dw 684, 686, 960, 962, 964, 966, 968, 970, 972, 974, 976, 978, 980, 982
  607. dw 984, 986, 988, 990, 992, 994, 996, 998,1000,1002,1004,1006,1280,1282
  608. dw 1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310
  609. dw 1312,1314,1316,1318,1320,1322,1324,1326,1600,1602,1604,1606,1608,1610
  610. dw 1612,1614,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638
  611. dw 1640,1642,1644,1646,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938
  612. dw 1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966
  613. dw 2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266
  614. dw 2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2560,2562,2564,2566
  615. dw 2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2594
  616. dw 2596,2598,2600,2602,2604,2606,2880,2882,2884,2886,2888,2890,2892,2894
  617. dw 2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922
  618. dw 2924,2926,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222
  619. dw 3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3520,3522
  620. dw 3524,3526,3528,3530,3532,3534,3536,3538,3540,3542,3544,3546,3548,3550
  621. dw 3552,3554,3556,3558,3560,3562,3564,3566,3840,3842,3844,3846,3848,3850
  622. dw 3852,3854,3856,3858,3860,3862,3864,3866,3868,3870,3872,3874,3876,3878
  623. dw 3880,3882,3884,3886,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178
  624. dw 4180,4182,4184,4186,4188,4190,4192,4194,4196,4198,4200,4202,4204,4206
  625. dw 4480,4482,4484,4486,4488,4490,4492,4494,4496,4498,4500,4502,4504,4506
  626. dw 4508,4510,4512,4514,4516,4518,4520,4522,4524,4526,4800,4802,4804,4806
  627. dw 4808,4810,4812,4814,4816,4818,4820,4822,4824,4826,4828,4830,4832,4834
  628. dw 4836,4838,4840,4842,4844,4846,5120,5122,5124,5126,5128,5130,5132,5134
  629. dw 5136,5138,5140,5142,5144,5146,5148,5150,5152,5154,5156,5158,5160,5162
  630. dw 5164,5166,5440,5442,5444,5446,5448,5450,5452,5454,5456,5458,5460,5462
  631. dw 5464,5466,5468,5470,5472,5474,5476,5478,5480,5482,5484,5486,5760,5762
  632. dw 5764,5766,5768,5770,5772,5774,5776,5778,5780,5782,5784,5786,5788,5790
  633. dw 5792,5794,5796,5798,5800,5802,5804,5806,6080,6082,6084,6086,6088,6090
  634. dw 6092,6094,6096,6098,6100,6102,6104,6106,6108,6110,6112,6114,6116,6118
  635. dw 6120,6122,6124,6126,6400,6402,6404,6406,6408,6410,6412,6414,6416,6418
  636. dw 6420,6422,6424,6426,6428,6430,6432,6434,6436,6438,6440,6442,6444,6446
  637. dw 6720,6722,6724,6726,6728,6730,6732,6734,6736,6738,6740,6742,6744,6746
  638. dw 6748,6750,6752,6754,6756,6758,6760,6762,6764,6766,7040,7042,7044,7046
  639. dw 7048,7050,7052,7054,7056,7058,7060,7062,7064,7066,7068,7070,7072,7074
  640. dw 7076,7078,7080,7082,7084,7086,7360,7362,7364,7366,7368,7370,7372,7374
  641. dw 7376,7378,7380,7382,7384,7386,7388,7390,7392,7394,7396,7398,7400,7402
  642. dw 7404,7406
  643. EGAtileloc label word
  644. dw 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13
  645. dw 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 320, 321, 322, 323
  646. dw 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337
  647. dw 338, 339, 340, 341, 342, 343, 640, 641, 642, 643, 644, 645, 646, 647
  648. dw 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661
  649. dw 662, 663, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971
  650. dw 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983,1280,1281
  651. dw 1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295
  652. dw 1296,1297,1298,1299,1300,1301,1302,1303,1600,1601,1602,1603,1604,1605
  653. dw 1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619
  654. dw 1620,1621,1622,1623,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929
  655. dw 1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943
  656. dw 2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253
  657. dw 2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2560,2561,2562,2563
  658. dw 2564,2565,2566,2567,2568,2569,2570,2571,2572,2573,2574,2575,2576,2577
  659. dw 2578,2579,2580,2581,2582,2583,2880,2881,2882,2883,2884,2885,2886,2887
  660. dw 2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899,2900,2901
  661. dw 2902,2903,3200,3201,3202,3203,3204,3205,3206,3207,3208,3209,3210,3211
  662. dw 3212,3213,3214,3215,3216,3217,3218,3219,3220,3221,3222,3223,3520,3521
  663. dw 3522,3523,3524,3525,3526,3527,3528,3529,3530,3531,3532,3533,3534,3535
  664. dw 3536,3537,3538,3539,3540,3541,3542,3543,3840,3841,3842,3843,3844,3845
  665. dw 3846,3847,3848,3849,3850,3851,3852,3853,3854,3855,3856,3857,3858,3859
  666. dw 3860,3861,3862,3863,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169
  667. dw 4170,4171,4172,4173,4174,4175,4176,4177,4178,4179,4180,4181,4182,4183
  668. dw 4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493
  669. dw 4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4800,4801,4802,4803
  670. dw 4804,4805,4806,4807,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817
  671. dw 4818,4819,4820,4821,4822,4823,5120,5121,5122,5123,5124,5125,5126,5127
  672. dw 5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141
  673. dw 5142,5143,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451
  674. dw 5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5760,5761
  675. dw 5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775
  676. dw 5776,5777,5778,5779,5780,5781,5782,5783,6080,6081,6082,6083,6084,6085
  677. dw 6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099
  678. dw 6100,6101,6102,6103,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409
  679. dw 6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423
  680. dw 6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733
  681. dw 6734,6735,6736,6737,6738,6739,6740,6741,6742,6743,7040,7041,7042,7043
  682. dw 7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057
  683. dw 7058,7059,7060,7061,7062,7063,7360,7361,7362,7363,7364,7365,7366,7367
  684. dw 7368,7369,7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381
  685. dw 7382,7383
  686. END