home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume7 / nethack3 / patch7aa < prev    next >
Internet Message Format  |  1990-02-26  |  56KB

  1. Path: uunet!cs.utexas.edu!rutgers!mit-eddie!uw-beaver!zephyr.ens.tek.com!tekred!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v09i027:  NetHack3 -  display oriented dungeons & dragons (Ver. 3.0), Patch7aa
  5. Message-ID: <5241@tekred.CNA.TEK.COM>
  6. Date: 24 Feb 90 01:09:25 GMT
  7. Sender: news@tekred.CNA.TEK.COM
  8. Lines: 2437
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: Izchak Miller <izchak@linc.cis.upenn.edu>
  12. Posting-number: Volume 9, Issue 27
  13. Archive-name: NetHack3/Patch7aa
  14. Patch-To: NetHack3: Volume 7, Issue 56-93
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 27 (of 30)."
  25. # Contents:  others/ovlmgr.asm src/lev_lex.c
  26. # Wrapped by billr@saab on Wed Feb 21 10:04:50 1990
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'others/ovlmgr.asm' -a "${1}" != "-c" ; then 
  29.   echo shar: Renaming existing file \"'others/ovlmgr.asm'\" to \"'others/ovlmgr.asm.orig'\"
  30.   mv -f 'others/ovlmgr.asm' 'others/ovlmgr.asm.orig'
  31. fi
  32. echo shar: Extracting \"'others/ovlmgr.asm'\" \(30539 characters\)
  33. sed "s/^X//" >'others/ovlmgr.asm' <<'END_OF_FILE'
  34. X;    SCCS Id: @(#)ovlmgr.asm     3.0.624    90/02/18
  35. X;  Copyright (c) Pierre Martineau and Stephen Spackman, 1989, 1990.
  36. X;  This product may be freely redistributed.  See NetHack license for details.
  37. X
  38. X        PAGE    60,132
  39. X        TITLE    'Overlay manager for use with Microsoft overlay linker'
  40. X        SUBTTL    'Brought to you by Pierre Martineau and Stephen Spackman'
  41. X
  42. X; acknowledgements:   - No thanks to Microsoft
  43. X;              - alltrsidsctysti!!!
  44. X;              - izchak and friends for impetus
  45. X;              - us for brilliance
  46. X;              - coffee for speed
  47. X;              - others as necessary
  48. X
  49. X; assumptions:          - all registers are preserved including flags
  50. X;              - the stack is preserved
  51. X;              - re-entrancy is not rEQUired
  52. X
  53. XDOSALLOC    EQU    48h            ; memory allocation
  54. XDOSFREE     EQU    49h            ; free allocated memory
  55. XDOSREALLOC    EQU    4ah            ; modify memory block
  56. XDOSREAD     EQU    3fh            ; read bytes from handle
  57. XDOSSEEK     EQU    42h            ; logical handle seek
  58. XDOSOPEN     EQU    3dh            ; open handle
  59. XDOSCLOSE    EQU    3eh            ; close handle
  60. XDOSGETVEC    EQU    35h            ; get interrupt vector
  61. XDOSSETVEC    EQU    25h            ; set interrupt vector
  62. XDOSEXEC     EQU    4bh            ; exec child process
  63. XDOS        EQU    21h            ; Dos interrupt #
  64. XPRINT        EQU    09h            ; print string
  65. XTERMINATE    EQU    4ch            ; terminate process
  66. XCR        EQU    0dh
  67. XLF        EQU    0ah
  68. XBELL        EQU    07h
  69. XFAERIE        EQU    0h            ; Used for dummy segment allocation
  70. XPARSIZ        EQU    10h            ; this is the size of a paragraph - this better not change!
  71. X
  72. X; The following EXTRNs are supplied by the linker
  73. X
  74. XEXTRN        $$OVLBASE:BYTE            ; segment of OVERLAY_AREA
  75. XEXTRN        $$MPGSNOVL:BYTE         ; ^ to module table
  76. XEXTRN        $$MPGSNBASE:WORD        ; ^ to module segment fixups
  77. XEXTRN        $$INTNO:BYTE            ; interrupt number to be used
  78. XEXTRN        $$COVL:WORD            ; number of physical overlays
  79. XEXTRN        $$CGSN:WORD            ; number of modules
  80. XEXTRN        $$MAIN:FAR            ; ^ to function main()
  81. X
  82. XPUBLIC        $$OVLINIT            ; Our entry point
  83. X                        ; called by the c startup code
  84. X
  85. Xovlflgrec    RECORD    running:1=0,locked:1=0,loaded:1=0 ; overlay flags
  86. X
  87. X; This is a dirty hack. What we need is a virtual segment that will be built
  88. X; by the (our) loader in multiple copies, one per overlay. Unfortunately, this
  89. X; doesn't seem to be a sensible idea in the minds of the folks at Microsoft.
  90. X; Declaring this segment AT will ensure that it never appears in the exefile,
  91. X; and ASSUME is dumb enough to be fooled.
  92. X;
  93. X; The reason we want to do this is also not-to-be-tried-at-home: it turns out
  94. X; that we can code a faster interrupt handler if we map overlay numbers to
  95. X; segment values. Normally I would consider this unacceptable programming
  96. X; practise because it is 86-mode specific, but the *need* for this entire
  97. X; programme is 86-mode specific, anyway.
  98. X
  99. Xpspseg        SEGMENT PARA AT FAERIE        ; dummy segment for psp
  100. X        ORG    2ch            ; ^ to segment of environmemt in psp
  101. Xpspenv        LABEL    WORD
  102. Xpspseg        ENDS
  103. X
  104. Xovltbl        SEGMENT PARA AT FAERIE        ; Dummy segment definition for overlay table
  105. X
  106. X; NOTE: This segment definition MUST be exactly 16 bytes long
  107. X
  108. Xovlflg        ovlflgrec    <0,0,0>     ; overlay flags
  109. Xovltblpad1    DB    ?            ; go ahead, delete me!
  110. Xovlmemblk    DW    ?            ; ^ to allocated memory block
  111. Xovllrudat    DD    ?            ; misc lru data (pseudo time stamp)
  112. Xovlseg        DW    ?            ; ovl segment physical add.
  113. Xovlfiloff    DW    ?            ; ovl file offset in pages (512 bytes)
  114. Xovlsiz        DW    ?            ; ovl size in paragraphs
  115. Xovltblpad    DB    PARSIZ - ($ - ovlflg) MOD PARSIZ DUP (?) ; pad to 16 bytes
  116. X
  117. XIF1
  118. XIF        ($ - ovlflg) GT PARSIZ
  119. X        .ERR
  120. X        %OUT This segment MUST be no more than 16 bytes, REALLY!!!
  121. XENDIF
  122. XENDIF
  123. X
  124. XOVLSEGSIZ    EQU    PARSIZ            ; this had better be true!!! (16 bytes)
  125. X
  126. Xovltbl        ENDS
  127. X
  128. XEXEHDR        STRUC                ; structure of an EXE header
  129. Xexesign     DW    5a4dh            ; signature
  130. Xexelstpgesiz    DW    ?            ; last page size (512 byte pages)
  131. Xexesiz        DW    ?            ; total pages (including partial last page)
  132. Xrelocitems    DW    ?            ; number of relocation entries
  133. Xhdrparas    DW    ?            ; number of paragraphs in the header
  134. Xminalloc    DW    ?            ; minimum paragraph allocation
  135. Xmaxalloc    DW    ?            ; maximum patagraph allocation
  136. Xexess        DW    ?            ; initial stack segment
  137. Xexesp        DW    ?            ; initial stack pointer
  138. Xexechksum    DW    ?            ; checksum
  139. Xexeip        DW    ?            ; initial instruction pointer
  140. Xexecs        DW    ?            ; initial code segment
  141. Xreloctbloff    DW    ?            ; offset from beginning of header to relocation table
  142. Xexeovlnum    DW    ?            ; overlay number
  143. XEXEHDR        ENDS
  144. X
  145. XMASK_used    EQU    1            ; memory block flag
  146. X
  147. XMEMCTLBLK    STRUC                ; memory block structure
  148. Xmemblkflg    DB    ?            ; flags
  149. Xmemblkpad1    DB    ?            ; go ahead, delete me!
  150. Xmemblknxt    DW    ?            ; ^ to next block
  151. Xmemblkprv    DW    ?            ; ^ to previous block
  152. Xmemblkovl    DW    ?            ; ^ to overlay occupying this block
  153. Xmemblksiz    DW    ?            ; size in paragraphs
  154. Xmemblkpad    DB    PARSIZ - memblkpad MOD PARSIZ DUP (?) ; pad to 16 bytes
  155. XMEMCTLBLK    ENDS
  156. X
  157. XMEMCTLBLKSIZ    EQU    TYPE MEMCTLBLK / PARSIZ ; should equal 1 paragraph
  158. X
  159. X;-------------------------------------------------------------------------------
  160. X
  161. Xcode        SEGMENT PUBLIC
  162. X
  163. X; NOTE: the following order is optimum for alignement purposes accross the
  164. X;    entire INTEL 80x86 family of processors.
  165. X
  166. Xovltim        DD    ?            ; pseudo-lru time variable
  167. Xfarcall     DD    ?            ; internal trampoline.
  168. Xoldvec        DD    -1            ; saved interrupt vector
  169. Xoldint21    DD    -1            ; saved int 21 vector
  170. Xovlexefilhdl    DW    -1            ; always-open file handle of our .EXE
  171. Xovltblbse    DW    -1            ; segment of first overlay descriptor
  172. Xovlcnt        DW    ?            ; # overlays
  173. Xmodcnt        DW    ?            ; # of modules
  174. Xovlrootcode    DW    ?            ; logical segment of OVERLAY_AREA
  175. Xovldata     DW    ?            ; logical segment of OVERLAY_END
  176. Xmemblk1st    DW    ?            ; first memory block
  177. Xpspadd        DW    ?            ; our psp address + 10h (for relocations)
  178. Xbxreg        DW    ?            ; temp save area
  179. Xesreg        DW    ?            ; temp save area
  180. Xmoduletbl    DD    256 DUP (?)        ; module lookup table (256 modules)
  181. Xcurovl        DW    OFFSET stkframe     ; ^ into stack frame
  182. Xstkframe    DW    64*3 DUP (?)        ; internal stack (64 ovls deep)
  183. Xhdr        EXEHDR    <>            ; EXE header work area
  184. Xintnum        DB    ?            ; overlay interrupt number
  185. X
  186. Xnoroom        DB    CR,LF,'Not enough memory to run this program. Time to go to the store.',CR,LF,BELL,'$'
  187. Xnocore        DB    CR,LF,'Your dog eats all your remaining memory! You die.',CR,LF,BELL,'$'
  188. Xnofile        DB    CR,LF,'The Nymph stole your .EXE file! You die.',CR,LF,BELL,'$'
  189. Xexitmsg     DB    CR,LF,'$'
  190. X
  191. X;-------------------------------------------------------------------------------
  192. X
  193. X$$OVLINIT    PROC    FAR            ; Init entry point
  194. X
  195. X        ASSUME    CS:code,DS:pspseg,ES:NOTHING
  196. X
  197. X        push    ax
  198. X        push    bx
  199. X        push    cx
  200. X        push    dx
  201. X        push    si
  202. X        push    di
  203. X        push    bp
  204. X        push    ds
  205. X        push    es            ; save the world
  206. X        mov    ax,ds            ; get our psp
  207. X        add    ax,10h
  208. X        mov    pspadd,ax        ; save it
  209. X        mov    ds,pspenv        ; get environment segment
  210. X        mov    si,-1
  211. Xenvloop:                    ; search for end of environment
  212. X        inc    si
  213. X        cmp    WORD PTR [si],0
  214. X        jnz    envloop
  215. X        add    si,4            ; point to EXE filename
  216. X        mov    al,0            ; access code
  217. X        mov    ah,DOSOPEN
  218. X        mov    dx,si
  219. X        int    DOS            ; open EXE
  220. X        jnc    dontdie
  221. X        mov    al,5
  222. X        mov    dx,OFFSET nofile
  223. X        jmp    putserr         ; cry to the world!
  224. Xdontdie:
  225. X        mov    ovlexefilhdl,ax     ; save handle
  226. X        mov    ax,SEG $$OVLBASE    ; OVERLAY_AREA segment
  227. X        mov    ovlrootcode,ax
  228. X
  229. X; Now allocate memory
  230. X        mov    bx,0900h        ; allocate memory for malloc()
  231. X        mov    ah,DOSALLOC
  232. X        int    DOS
  233. X        jnc    getmore
  234. X        jmp    buyram
  235. Xgetmore:
  236. X        mov    es,ax            ; find largest free memory
  237. X        mov    ah,DOSALLOC
  238. X        mov    bx,0ffffh        ; Everything
  239. X        int    DOS
  240. X        mov    ah,DOSALLOC        ; allocate our own memory
  241. X        int    DOS
  242. X        jnc    gotitall
  243. X        jmp    buyram
  244. Xgotitall:
  245. X        mov    ovltblbse,ax        ; overlay descriptor table begins at start of memory block
  246. X        mov    ax,SEG $$COVL        ; segment of DGROUP
  247. X        mov    ds,ax
  248. X        mov    cx,$$CGSN        ; number of modules
  249. X        mov    modcnt,cx        ; save for later use
  250. X        mov    cx,$$COVL        ; number of physical overlays
  251. X        mov    ovlcnt,cx        ; save for later use
  252. X        sub    bx,cx            ; enough mem for ovl tbl?
  253. X        jnc    memloop
  254. X        jmp    buyram
  255. Xmemloop:
  256. X        push    bx
  257. X        mov    ah,DOSFREE        ; free first block for malloc()
  258. X        int    DOS
  259. X        jnc    cockadoodledoo
  260. X        jmp    buyram
  261. Xcockadoodledoo:
  262. X
  263. X        ASSUME    ES:ovltbl
  264. X
  265. X        xor    bp,bp
  266. X        xor    di,di
  267. X        xor    si,si
  268. Xfilsegtbllpp:                    ; initialise ovl table
  269. X        call    gethdr            ; get an EXE header
  270. X        mov    ax,ovltblbse
  271. X        add    ax,hdr.exeovlnum
  272. X        mov    es,ax            ; ^ to ovl table entry
  273. X        xor    ax,ax
  274. X        mov    WORD PTR ovllrudat,ax    ; initialise ovl lru
  275. X        mov    WORD PTR ovllrudat+2,ax
  276. X        mov    ovlseg,ax        ; initialise ovl segment
  277. X        mov    ovlflg,al        ; initialise ovl flags
  278. X        mov    ax,hdr.exesiz
  279. X        shl    ax,1
  280. X        shl    ax,1
  281. X        shl    ax,1
  282. X        shl    ax,1
  283. X        shl    ax,1            ; * 32
  284. X        mov    dx,hdr.exelstpgesiz
  285. X        or    dx,dx
  286. X        jz    emptypage
  287. X        shr    dx,1
  288. X        shr    dx,1
  289. X        shr    dx,1
  290. X        shr    dx,1            ; / 16
  291. X        inc    dx
  292. X        sub    ax,20h
  293. X        add    ax,dx
  294. Xemptypage:
  295. X        mov    ovlsiz,ax        ; overlay size in paragraphs
  296. X        sub    ax,hdr.hdrparas     ; actual size of code and relocation table
  297. X        cmp    hdr.exeovlnum,0     ; skip if ovl 0 (root code)
  298. X        jz    notlargest
  299. X        cmp    ax,di            ; find largest ovl
  300. X        jc    notlargest
  301. X        mov    di,ax
  302. X        mov    si,ovlsiz
  303. Xnotlargest:
  304. X        mov    ovlfiloff,bp        ; initialise ovl file offset
  305. X        add    bp,hdr.exesiz        ; ^ to next overlay
  306. X        mov    dx,bp
  307. X        mov    cl,dh
  308. X        mov    dh,dl
  309. X        xor    ch,ch
  310. X        xor    dl,dl
  311. X        shl    dx,1
  312. X        rcl    cx,1            ; cx:dx = bp * 512
  313. X        mov    al,0
  314. X        mov    ah,DOSSEEK        ; seek to next ovl
  315. X        int    DOS
  316. X        mov    ax,ovlcnt
  317. X        dec    ax
  318. X        cmp    ax,hdr.exeovlnum    ; all overlays done?
  319. X        jz    makmemblk
  320. X        jmp    filsegtbllpp        ; Nope, go for more.
  321. Xmakmemblk:
  322. X        push    si            ; contains largest ovl size in paragraphs
  323. X
  324. X        ASSUME    ES:nothing        ; prepare first two memory blocks
  325. X                        ; OVERLAY_AREA and allocated memory block
  326. X        mov    ax,ovlrootcode        ; OVERLAY_AREA segment
  327. X        mov    es,ax
  328. X        mov    si,ovltblbse
  329. X        add    si,ovlcnt        ; end of ovl table
  330. X        mov    es:memblkflg,0        ; clear mem flags
  331. X        mov    es:memblknxt,si     ; point to next
  332. X        mov    es:memblkprv,0        ; set previous to nothing
  333. X        mov    es:memblksiz,di     ; di contains OVERLAY_AREA size in paragraphs
  334. X        add    di,ax
  335. X        mov    ovldata,di        ; end of OVERLAY_END
  336. X        mov    es,si            ; end of ovl tbl (first memory block in allocated memory)
  337. X        mov    es:memblkflg,0        ; clear mem flags
  338. X        mov    es:memblknxt,0        ; set next to nothing
  339. X        mov    es:memblkprv,ax     ; point to previous
  340. X        pop    si
  341. X        pop    bx
  342. X        mov    es:memblksiz,bx     ; allocated memory block size less ovl table
  343. X        mov    memblk1st,ax        ; save pointer to first mem block
  344. X        mov    WORD PTR ovltim,0    ; initialise global lru time stamp
  345. X        mov    WORD PTR ovltim+2,0
  346. X        mov    ax,OFFSET stkframe
  347. X        mov    curovl,ax        ; initialise stack frame pointer
  348. X        mov    di,ax
  349. X        mov    WORD PTR cs:[di],-1    ; initialise stack frame
  350. X        add    di,6
  351. X        mov    ax,ovltblbse
  352. X        mov    cs:[di],ax
  353. X        mov    curovl,di
  354. X        mov    es,ax
  355. X        mov    es:ovlflg,MASK running OR MASK locked OR MASK loaded ; set flags on ovl 0
  356. X        inc    si            ; largest ovl size + 1 paragraph
  357. X        cmp    bx,si            ; enough memory to alloc largest?
  358. X        jnc    chgintvec
  359. Xbuyram:
  360. X        mov    al,5
  361. X        mov    dx,OFFSET noroom    ; free up some TSRs or something
  362. X        jmp    putserr
  363. Xchgintvec:
  364. X        mov    ax,SEG $$INTNO
  365. X        mov    ds,ax
  366. X        mov    ah,DOSGETVEC
  367. X        mov    al,$$INTNO        ; get int number to use
  368. X        mov    intnum,al
  369. X        int    DOS            ; get original vector
  370. X        mov    WORD PTR oldvec,bx    ; save original vector
  371. X        mov    WORD PTR oldvec+2,es
  372. X
  373. X        mov    ah,DOSGETVEC
  374. X        mov    al,21h
  375. X        int    DOS            ; get original vector
  376. X        mov    WORD PTR oldint21,bx    ; save original vector
  377. X        mov    WORD PTR oldint21+2,es
  378. X
  379. X        mov    ah,DOSSETVEC
  380. X        mov    al,intnum
  381. X        mov    bx,cs
  382. X        mov    ds,bx
  383. X        mov    dx,OFFSET ovlmgr    ; point to ovlmgr
  384. X        int    DOS            ; set vector
  385. X
  386. X        mov    ah,DOSSETVEC
  387. X        mov    al,21h
  388. X        mov    bx,cs
  389. X        mov    ds,bx
  390. X        mov    dx,OFFSET int21     ; point to int21
  391. X        int    DOS            ; set vector
  392. X
  393. X        mov    cx,modcnt        ; module count
  394. X        mov    ax,SEG $$MPGSNBASE
  395. X        mov    es,ax
  396. X        mov    ax,cs
  397. X        mov    ds,ax
  398. X
  399. X        ASSUME    DS:code
  400. X
  401. X        mov    bx,OFFSET $$MPGSNBASE    ; ^ to linker provided overlay segment fixups
  402. X        mov    si,OFFSET $$MPGSNOVL    ; ^ to linker provided module table
  403. X        mov    di,OFFSET moduletbl    ; ^ to our module table
  404. Xmodloop:
  405. X        mov    al,es:[si]        ; real physical ovl number
  406. X        xor    ah,ah
  407. X        add    ax,ovltblbse        ; ovlctlseg address
  408. X        mov    [di],ax         ; save in module table
  409. X        mov    ax,es:[bx]        ; get seg fixup
  410. X        sub    ax,ovlrootcode        ; adjust for relative reference
  411. X        mov    [di+2],ax        ; save in module table
  412. X        add    di,4
  413. X        add    bx,2
  414. X        inc    si
  415. X        loop    modloop
  416. X
  417. X        pop    es
  418. X        pop    ds
  419. X        pop    bp
  420. X        pop    di
  421. X        pop    si
  422. X        pop    dx
  423. X        pop    cx
  424. X        pop    bx
  425. X        pop    ax            ; restore the world
  426. X        jmp    $$MAIN            ; And away we go!
  427. X
  428. X$$OVLINIT    ENDP
  429. X
  430. X;-------------------------------------------------------------------------------
  431. X
  432. Xovlmgr        PROC    FAR            ; This the it!
  433. X
  434. X        ASSUME CS:code,DS:NOTHING,ES:NOTHING
  435. X
  436. X        mov    bxreg,bx        ; preserve bx
  437. X        mov    esreg,es        ; and es
  438. X        pop    bx            ; retrieve caller ip
  439. X        pop    es            ;     "      "    cs
  440. X        push    ax
  441. X        push    si
  442. X        mov    ax,es:[bx+1]        ; offset in ovl to call
  443. X        mov    WORD PTR farcall,ax    ; into trampoline
  444. X        xor    ah,ah
  445. X        mov    al,es:[bx]        ; module # to call
  446. X        add    bx,3            ; fix return address
  447. X        mov    si,curovl        ; get stack frame pointer
  448. X        mov    cs:[si+2],es        ; save return seg
  449. X        mov    cs:[si+4],bx        ; and return offset
  450. X
  451. X        mov    bx,ax
  452. X        shl    bx,1
  453. X        shl    bx,1            ; * 4 (2 words/entry in module tbl)
  454. X        add    bx,OFFSET moduletbl
  455. X        mov    es,cs:[bx]        ; ovl tbl entry
  456. X        mov    ax,cs:[bx+2]        ; segment fixup
  457. X        mov    cs:[si+6],es        ; ovl entry into stack frame
  458. X        add    curovl,6        ; update stack
  459. X
  460. X        ASSUME    ES:ovltbl
  461. X
  462. X        mov    si,WORD PTR ovltim    ; lru time stamp
  463. X        inc    si            ; time passes!
  464. X        mov    WORD PTR ovltim,si    ; update global clock
  465. X        mov    WORD PTR ovllrudat,si    ; as well as ovl clock
  466. X        mov    si,WORD PTR ovltim+2    ; high order word
  467. X        jz    ininc            ; dword increment
  468. Xcryupcdon:    mov    WORD PTR ovllrudat+2,si
  469. X        test    ovlflg,mask loaded    ; ovl loaded?
  470. X        jz    inload            ; load it then.
  471. Xovlloadedupc:
  472. X        add    ax,ovlseg        ; add fixup and segment address
  473. X        mov    WORD PTR farcall+2,ax    ; into trampoline
  474. X        mov    bx,bxreg        ; retore all registers
  475. X        mov    es,esreg
  476. X        pop    si
  477. X        pop    ax
  478. X        popf                ; don't forget these!
  479. X        call    DWORD PTR farcall    ; and GO
  480. X        pushf                ; preserve registers again!
  481. X        mov    esreg,es
  482. X        mov    bxreg,bx
  483. X        mov    bx,curovl        ; stack frame pointer
  484. X        mov    es,cs:[bx-6]        ; retrieve ovl tbl entry
  485. X        push    cs:[bx-4]        ; set return address
  486. X        push    cs:[bx-2]
  487. X        push    cx
  488. X        mov    cx,WORD PTR ovltim    ; do the lru thing again
  489. X        inc    cx
  490. X        mov    WORD PTR ovltim,cx
  491. X        mov    WORD PTR ovllrudat,cx
  492. X        mov    cx,WORD PTR ovltim+2
  493. X        jz    outinc
  494. Xcrydncdon:    mov    WORD PTR ovllrudat+2,cx
  495. X        test    ovlflg,mask loaded    ; ovl loaded?
  496. X        jz    outload         ; better get it before someone notices
  497. Xjmpback:
  498. X        sub    curovl,6        ; adjust stack
  499. X        mov    bx,bxreg        ; get registers back
  500. X        mov    es,esreg
  501. X        pop    cx
  502. X        iret                ; and GO back
  503. X
  504. Xininc:
  505. X        inc    si
  506. X        mov    WORD PTR ovltim+2,si    ; update global clock
  507. X        jmp    cryupcdon
  508. X
  509. Xinload:
  510. X        call    loadoverlay        ; self explanatory
  511. X        jmp    ovlloadedupc
  512. X
  513. Xoutinc:
  514. X        inc    cx
  515. X        mov    WORD PTR ovltim+2,cx
  516. X        jmp    crydncdon
  517. X
  518. Xoutload:
  519. X        call    loadoverlay
  520. X        jmp    jmpback
  521. X
  522. Xovlmgr        ENDP
  523. X
  524. X;-------------------------------------------------------------------------------
  525. X
  526. Xloadoverlay    PROC    NEAR            ; load overlay pointed to by es
  527. X
  528. X        ASSUME    CS:code,DS:NOTHING,ES:ovltbl
  529. X
  530. X        push    ax
  531. X        push    bx
  532. X        push    cx
  533. X        push    dx
  534. X        push    si
  535. X        push    di
  536. X        push    bp
  537. X        push    ds
  538. X        push    es            ; just in case
  539. X        call    setrunning        ; set the running flags
  540. X        test    ovlflg,MASK running    ; was it already running?
  541. X        jnz    fxdadr            ; Yup, it's a toughie
  542. X        mov    ax,ovlsiz        ; How much?
  543. X        call    getpages        ; never fail mem alloc, you bet.
  544. X        jmp    gleaner
  545. Xfxdadr:
  546. X        call    releasepages        ; free memory where this ovl should be loaded
  547. Xgleaner:
  548. X        mov    ovlmemblk,ax        ; memory block to use
  549. X        add    ax,MEMCTLBLKSIZ     ; skip mem ctl blk
  550. X        mov    ds,ax
  551. X        mov    dx,ovlfiloff        ; where in the file is it?
  552. X        mov    cl,dh
  553. X        mov    dh,dl
  554. X        xor    ch,ch
  555. X        xor    dl,dl
  556. X        shl    dx,1
  557. X        rcl    cx,1            ; cx:dx = dx * 512
  558. X        mov    ah,DOSSEEK        ; lseek to position
  559. X        mov    al,0
  560. X        mov    bx,ovlexefilhdl     ; never closing handle
  561. X        int    DOS
  562. X        jc    burnhead        ; oops!
  563. X        xor    dx,dx
  564. X        mov    cx,ovlsiz        ; number of paragraphs to load
  565. X        shl    cx,1
  566. X        shl    cx,1
  567. X        shl    cx,1
  568. X        shl    cx,1            ; * 16 = number of bytes
  569. X        mov    ah,DOSREAD        ; prevent random DOS behaviour
  570. X        int    DOS
  571. X        jc    burnhead        ; double oops!
  572. X        call    ovlrlc            ; perform relocation normally done by DOS EXE loader
  573. X        pop    es            ; retrieve ovl tbl entry
  574. X        or    ovlflg,MASK loaded    ; because it is now
  575. X        pop    ds
  576. X        pop    bp
  577. X        pop    di
  578. X        pop    si
  579. X        pop    dx
  580. X        pop    cx
  581. X        pop    bx
  582. X        pop    ax
  583. X        ret
  584. X
  585. Xburnhead:
  586. X        mov    al,5
  587. X        mov    dx,OFFSET nofile
  588. X        jmp    putserr
  589. X
  590. Xloadoverlay    ENDP
  591. X
  592. X;-------------------------------------------------------------------------------
  593. X
  594. Xovlrlc        PROC    NEAR            ; ds:0 -> the overlay to relocate
  595. X
  596. X        ASSUME    CS:code,DS:NOTHING,ES:ovltbl
  597. X
  598. X        mov    cx,ds:relocitems    ; roto-count
  599. X        mov    ax,ds
  600. X        add    ax,ds:hdrparas        ; skip header
  601. X        mov    ovlseg,ax        ; actual code starts here
  602. X        mov    di,ax
  603. X        sub    di,ovlrootcode        ; segment fixup value
  604. X        mov    si,ds:reloctbloff    ; ^ relocation tbl in header
  605. X        jcxz    relocdone        ; not such a good idea, after all
  606. Xdorelocs:                    ; labels don't GET comments
  607. X        lodsw                ; offset into load module
  608. X        mov    bx,ax
  609. X        lodsw                ; segment in load module (zero reference)
  610. X        add    ax,pspadd        ; now it is psp relative
  611. X        add    ax,di            ; and now it is relative to the actual load address
  612. X        mov    es,ax
  613. X        mov    ax,es:[bx]        ; pickup item to relocate
  614. X        add    ax,pspadd        ; make it psp relative
  615. X        cmp    ax,ovlrootcode        ; is it below the OVERLAY_AREA?
  616. X        jc    reloccomputed        ; yup. it's relocated
  617. X        cmp    ax,ovldata        ; is it above OVERLAY_AREA
  618. X        jnc    reloccomputed        ; yup. it's relocated
  619. X        add    ax,di            ; it's in OVERLAY_AREA, this one's ours.
  620. Xreloccomputed:
  621. X        mov    es:[bx],ax        ; RAM it home!?!
  622. X        loop    dorelocs        ; what goes around, comes around.
  623. Xrelocdone:    ret
  624. X
  625. Xovlrlc        ENDP
  626. X
  627. X;-------------------------------------------------------------------------------
  628. X
  629. Xgetvictim    PROC    NEAR            ; select a victim to discard (and free up some memory)
  630. X
  631. X        ASSUME    CS:code,DS:ovltbl,ES:NOTHING
  632. X
  633. X        push    bx
  634. X        push    cx
  635. X        push    dx
  636. X        push    si
  637. X        push    di
  638. X        push    bp
  639. X        push    ds
  640. X        mov    ds,ovltblbse        ; ^ ovl tbl
  641. X        xor    ax,ax            ; will contain the low word of lru
  642. X        mov    dx,ax            ; will contain the high word of lru
  643. X        mov    bp,ax            ; will contain ovl tbl entry
  644. X        mov    bx,ax            ; ovl tbl ptr
  645. X        mov    cx,ovlcnt
  646. Xfoon1:        test    ovlflg[bx],MASK loaded
  647. X        jz    skip1
  648. X        test    ovlflg[bx],MASK locked
  649. X        jnz    skip1
  650. X        mov    si,WORD PTR ovltim
  651. X        mov    di,WORD PTR ovltim+2
  652. X        sub    si,WORD PTR ovllrudat[bx]
  653. X        sbb    di,WORD PTR ovllrudat[bx+2]
  654. X        cmp    dx,di
  655. X        jc    better1
  656. X        jnz    skip1
  657. X        cmp    ax,si
  658. X        jnc    skip1
  659. Xbetter1:    mov    ax,si
  660. X        mov    dx,di
  661. X        mov    bp,bx
  662. Xskip1:        add    bx,OVLSEGSIZ
  663. X        loop    foon1
  664. X        or    bp,bp            ; were we more successful this time?
  665. X        jnz    gotvictim        ; now we got one.
  666. Xnomoremem:
  667. X        mov    al,5            ; were really %$# now!
  668. X        mov    dx,OFFSET nocore
  669. X        jmp    putserr
  670. Xgotvictim:
  671. X        shr    bp,1            ; convert offset to segment
  672. X        shr    bp,1
  673. X        shr    bp,1
  674. X        shr    bp,1
  675. X        mov    ax,ds
  676. X        add    ax,bp
  677. X        pop    ds
  678. X        pop    bp
  679. X        pop    di
  680. X        pop    si
  681. X        pop    dx
  682. X        pop    cx
  683. X        pop    bx
  684. X        ret
  685. Xgetvictim    ENDP
  686. X
  687. X;-------------------------------------------------------------------------------
  688. X
  689. Xsetrunning    PROC    NEAR            ; set running flag on overlays still running
  690. X
  691. X        ASSUME CS:code,DS:NOTHING,ES:ovltbl
  692. X
  693. X        push    es
  694. X        mov    es,ovltblbse
  695. X        mov    cx,ovlcnt
  696. X        xor    bx,bx
  697. Xjim:        and    ovlflg[bx],NOT MASK running ; start by clearing them all
  698. X        add    bx,OVLSEGSIZ
  699. X        loop    jim
  700. X
  701. X        ; Now chain down the stack links, setting running flags
  702. X
  703. X        mov    bx,curovl
  704. X        sub    bx,6
  705. X        jmp    jam
  706. Xjamloop:
  707. X        mov    ds,cs:[bx]
  708. X
  709. X        ASSUME    DS:ovltbl
  710. X
  711. X        or    ovlflg,MASK running
  712. X        sub    bx,6
  713. Xjam:
  714. X        cmp    WORD PTR cs:[bx],-1    ; end of stack ?
  715. X        jnz    jamloop
  716. X        pop    es
  717. X        ret
  718. X
  719. Xsetrunning    ENDP
  720. X
  721. X;-------------------------------------------------------------------------------
  722. X
  723. Xint21        PROC    FAR
  724. X
  725. X; free almost all overlay memory if app. tries to call the DOS exec function.
  726. X
  727. X        cmp    ah,DOSEXEC
  728. X        jz    freeall
  729. X        cmp    ah,TERMINATE
  730. X        jz    saybyebye
  731. Xnotours:
  732. X        jmp    cs:oldint21
  733. Xsaybyebye:
  734. X        pop    ax            ; clean up stack
  735. X        pop    ax
  736. X        pop    ax
  737. X        mov    al,0            ; return code 0
  738. X        mov    dx,OFFSET exitmsg
  739. X        jmp    putserr
  740. Xfreeall:
  741. X        or    al,al            ; is it load and exec?
  742. X        jnz    notours
  743. X        push    ax
  744. X        push    bx
  745. X        push    cx
  746. X        push    dx
  747. X        push    si
  748. X        push    di
  749. X        push    bp
  750. X        push    es
  751. X        push    ds            ; preserve calling env.
  752. X
  753. X        ASSUME CS:code,DS:NOTHING,ES:ovltbl
  754. X
  755. X        mov    ax,cs:memblk1st     ; start de-allocating from first blk
  756. X        jmp    short lastblk
  757. Xunloadlp:
  758. X        mov    ds,ax
  759. X        cmp    ax,cs:ovltblbse     ; in alloced area ?
  760. X        jc    nextmemblk
  761. X        test    ds:memblkflg,MASK_used    ; mem blk used ?
  762. X        jz    nextmemblk
  763. X        mov    es,ds:memblkovl
  764. X        and    ovlflg,NOT MASK loaded    ; flag overlay as unloaded
  765. Xnextmemblk:
  766. X        mov    ax,ds:memblknxt
  767. Xlastblk:
  768. X        or    ax,ax            ; keep going till no more
  769. X        jnz    unloadlp
  770. X
  771. X        mov    ax,cs:ovltblbse
  772. X        add    ax,cs:ovlcnt
  773. X        mov    es,ax            ; ^ to first mem blk in alloced mem
  774. X        mov    es:memblksiz,2        ; adjust size
  775. X        mov    es:memblknxt,0        ; no other blocks after this one
  776. X        mov    es:memblkflg,0        ; not used
  777. X
  778. X        mov    dx,WORD PTR cs:oldint21
  779. X        mov    ds,WORD PTR cs:oldint21+2
  780. X        mov    ah,DOSSETVEC        ; put back DOS vector to avoid calling ourselves again!
  781. X        mov    al,21h
  782. X        int    DOS
  783. X
  784. X        mov    dx,WORD PTR cs:oldvec
  785. X        mov    ds,WORD PTR cs:oldvec+2
  786. X        mov    ah,DOSSETVEC
  787. X        mov    al,intnum
  788. X        int    DOS
  789. X
  790. X        mov    es,cs:ovltblbse
  791. X        mov    bx,cs:ovlcnt
  792. X        add    bx,2            ; re-adjust alloced size
  793. X        mov    ah,DOSREALLOC
  794. X        int    DOS
  795. X        mov    bp,sp
  796. X        push    [bp+22]            ; ensure returned flags are based on user's!
  797. X        popf
  798. X        pop    ds
  799. X        pop    es
  800. X        pop    bp
  801. X        pop    di
  802. X        pop    si
  803. X        pop    dx
  804. X        pop    cx
  805. X        pop    bx
  806. X        pop    ax
  807. X
  808. X        int    DOS            ; allow DOS to continue!
  809. X
  810. X        push    ax
  811. X        push    bx
  812. X        push    cx
  813. X        push    dx
  814. X        push    si
  815. X        push    di
  816. X        push    bp
  817. X        push    es
  818. X        push    ds            ; preserve calling env.
  819. X        mov    bp,sp
  820. X        pushf
  821. X        pop    [bp+22]            ; fix return flags
  822. X
  823. X; re-allocate our memory after a DOS exec function
  824. X
  825. X        call    reallocmem
  826. X
  827. X        mov    ah,DOSGETVEC
  828. X        mov    al,21h
  829. X        int    DOS            ; get original vector
  830. X        mov    WORD PTR cs:oldint21,bx ; save original vector
  831. X        mov    WORD PTR cs:oldint21+2,es
  832. X
  833. X        mov    ah,DOSSETVEC
  834. X        mov    al,21h
  835. X        mov    bx,cs
  836. X        mov    ds,bx
  837. X        mov    dx,OFFSET int21     ; point to int21
  838. X        int    DOS            ; set vector
  839. X
  840. X        mov    ah,DOSGETVEC
  841. X        mov    al,intnum
  842. X        int    DOS            ; get original vector
  843. X        mov    WORD PTR cs:oldvec,bx    ; save original vector
  844. X        mov    WORD PTR cs:oldvec+2,es
  845. X
  846. X        mov    ah,DOSSETVEC
  847. X        mov    al,intnum
  848. X        mov    bx,cs
  849. X        mov    ds,bx
  850. X        mov    dx,OFFSET ovlmgr    ; point to ovlmgr
  851. X        int    DOS            ; set vector
  852. X
  853. X        pop    ds
  854. X        pop    es
  855. X        pop    bp
  856. X        pop    di
  857. X        pop    si
  858. X        pop    dx
  859. X        pop    cx
  860. X        pop    bx
  861. X        pop    ax
  862. X        iret
  863. X
  864. Xint21        ENDP
  865. X
  866. X;-------------------------------------------------------------------------------
  867. X
  868. Xreallocmem    PROC    NEAR
  869. X
  870. X; re-allocate our memory after a DOS exec function
  871. X
  872. X        push    es
  873. X        mov    ah,DOSREALLOC
  874. X        mov    es,cs:ovltblbse     ; mem blk handle
  875. X        mov    bx,0ffffh        ; find out how much there is
  876. X        int    DOS
  877. X        mov    ah,DOSREALLOC        ; re-allocate our own memory
  878. X        mov    es,cs:ovltblbse
  879. X        push    bx            ; contains largest available blk
  880. X        int    DOS
  881. X        mov    ax,cs:ovltblbse
  882. X        add    ax,cs:ovlcnt
  883. X        mov    es,ax            ; ^ to first mem blk in alloced mem
  884. X        pop    ax
  885. X        sub    ax,cs:ovlcnt        ; remove ovl tbl size
  886. X        mov    es:memblksiz,ax     ; fix mem blk size
  887. X
  888. X        pop    es
  889. X        ret
  890. X
  891. Xreallocmem    ENDP
  892. X
  893. X;-------------------------------------------------------------------------------
  894. X
  895. Xreleasepages    PROC    NEAR            ; Arg in es, result in ax
  896. X
  897. X; release any memory (and overlays) where this overlay should reside
  898. X
  899. X        ASSUME    ES:ovltbl
  900. X
  901. X        mov    bx,es:ovlmemblk     ; start of memory to release
  902. Xdoitagain:
  903. X        mov    ax,memblk1st        ; first memory blk
  904. X        jmp    dvart
  905. Xdvartloop:
  906. X        mov    ds,ax            ; memory blk to check
  907. X        cmp    bx,ax            ; does it start below the memory to release?
  908. X        jnc    dvartsmaller        ; yup
  909. X        mov    dx,bx
  910. X        add    dx,es:ovlsiz
  911. X        add    dx,MEMCTLBLKSIZ     ; end of memory to release
  912. X        cmp    ax,dx            ; does it start above?
  913. X        jnc    dvartsilly        ; yup
  914. X        call    killmem         ; it's in the way. Zap it.
  915. X        jmp    chkmemblk
  916. Xdvartsmaller:
  917. X        add    ax,ds:memblksiz     ; end of this memory blk
  918. X        cmp    bx,ax            ; does it end below the memory to release?
  919. X        jnc    dvartsilly        ; yup
  920. X        call    killmem         ; Oh well, zap it too.
  921. Xchkmemblk:                    ; was that enough?
  922. X        mov    ax,ds            ; recently freed memory blk
  923. X        cmp    bx,ax            ; does it start in the memory to be released?
  924. X        jc    dvartsilly        ; yup, wasn't enough
  925. X        mov    dx,bx
  926. X        add    dx,es:ovlsiz
  927. X        add    dx,MEMCTLBLKSIZ     ; end of memory to be released
  928. X        add    ax,ds:memblksiz     ; end of freed memory
  929. X        cmp    ax,dx            ; does it end in the memory to be released?
  930. X        jc    dvartsilly        ; yup, release more
  931. Xdvartgotblk:
  932. X        mov    ax,ds            ; this is it!
  933. X        mov    cx,bx
  934. X        sub    cx,ax            ; # of paragraphs between start of memory to release and mem blk
  935. X        jz    nosplit
  936. X        call    splitblkhigh        ; split the block
  937. Xnosplit:
  938. X        mov    cx,es:ovlsiz
  939. X        add    cx,MEMCTLBLKSIZ     ; paragraphs needed to load ovl
  940. X        jmp    splitblklow        ; split remaining block
  941. Xdvartsilly:
  942. X        mov    ax,ds:memblknxt
  943. Xdvart:
  944. X        or    ax,ax            ; enf of mem list?
  945. X        jz    dvartnocore
  946. X        jmp    dvartloop        ; play it again Sam.
  947. Xdvartnocore:
  948. X        mov    al,5            ; super OOPS!
  949. X        mov    dx,OFFSET nocore
  950. X        jmp    putserr
  951. X
  952. Xreleasepages    ENDP
  953. X
  954. X;-------------------------------------------------------------------------------
  955. X
  956. Xgetpages    PROC    NEAR            ; get enough memory to load ovl
  957. X
  958. X        mov    cx,ax
  959. X        add    cx,MEMCTLBLKSIZ     ; total paragraphs needed
  960. X        call    largestmem        ; find largest free blk
  961. X        cmp    dx,cx            ; large enough?
  962. X        jnc    gotdork         ; yup.
  963. Xdorkkill:
  964. X        call    getvictim        ; select a victim to release
  965. X        call    killovl         ; kill the selected victim
  966. X        cmp    ds:memblksiz,cx     ; was it enough?
  967. X        jc    dorkkill        ; nope, select another one
  968. Xgotdork:
  969. X        jmp    splitblklow        ; split the free blk
  970. X
  971. Xgetpages    ENDP
  972. X
  973. X;-------------------------------------------------------------------------------
  974. X
  975. Xsplitblklow    PROC    NEAR
  976. X
  977. X; split a block of memory returning the lower one to be used.
  978. X
  979. X        push    es
  980. X        or    ds:memblkflg,MASK_used    ; set low block used
  981. X        mov    ax,ds
  982. X        add    ax,cx
  983. X        mov    es,ax            ; ^ to upper blk to be created
  984. X        mov    ax,ds:memblksiz
  985. X        sub    ax,cx
  986. X        cmp    ax,1            ; must be at least 1 para remaining to split
  987. X        jc    noodorksplit        ; don't split
  988. X        mov    ds:memblksiz,cx     ; fix blk sizes
  989. X        mov    es:memblksiz,ax
  990. X        mov    ax,ds:memblknxt     ; fix pointers
  991. X        mov    es:memblknxt,ax
  992. X        mov    ds:memblknxt,es
  993. X        mov    es:memblkprv,ds
  994. X        mov    es:memblkflg,0        ; set upper to not used
  995. X        push    ds
  996. X        mov    ax,es:memblknxt
  997. X        or    ax,ax
  998. X        jz    domergelow
  999. X        mov    ds,ax            ; fix blk after upper to point to upper
  1000. X        mov    ds:memblkprv,es
  1001. Xdomergelow:
  1002. X        mov    ax,es
  1003. X        mov    ds,ax
  1004. X        call    mergemem        ; merge remaining free memory
  1005. X        pop    ds
  1006. Xnoodorksplit:
  1007. X        pop    es
  1008. X        mov    ds:memblkovl,es     ; fix ptr to ovl
  1009. X        mov    ax,ds            ; return lower blk segment
  1010. X        ret
  1011. X
  1012. Xsplitblklow    ENDP
  1013. X
  1014. X;-------------------------------------------------------------------------------
  1015. X
  1016. Xsplitblkhigh    PROC    NEAR
  1017. X
  1018. X; split a block of memory returning the upper one to be used.
  1019. X
  1020. X        push    es
  1021. X        mov    ax,ds
  1022. X        add    ax,cx
  1023. X        mov    es,ax            ; ^ to upper blk to be created
  1024. X        mov    ax,ds:memblksiz
  1025. X        sub    ax,cx            ; # of para remaining in upper blk
  1026. X        mov    ds:memblksiz,cx     ; fix blk sizes
  1027. X        mov    es:memblksiz,ax
  1028. X        mov    ax,ds:memblknxt     ; fix blk pointers
  1029. X        mov    es:memblknxt,ax
  1030. X        mov    ds:memblknxt,es
  1031. X        mov    es:memblkprv,ds
  1032. X        mov    ds:memblkflg,0        ; set lower to not used
  1033. X        or    es:memblkflg,MASK_used    ; set upper to used
  1034. X        mov    ax,es:memblknxt
  1035. X        or    ax,ax
  1036. X        jz    domergehigh
  1037. X        push    ds            ; fix blk after upper to point to upper
  1038. X        mov    ds,ax
  1039. X        mov    ds:memblkprv,es
  1040. X        pop    ds
  1041. Xdomergehigh:
  1042. X        call    mergemem        ; merge remaining free memory
  1043. Xnodorksplit:
  1044. X        mov    ax,es
  1045. X        mov    ds,ax
  1046. X        pop    es
  1047. X        mov    ds:memblkovl,es     ; fix ovl ptr
  1048. X        mov    ax,ds            ; return upper blk segment
  1049. X        ret
  1050. X
  1051. Xsplitblkhigh    ENDP
  1052. X
  1053. X;-------------------------------------------------------------------------------
  1054. X
  1055. Xlargestmem    PROC    NEAR    ; returns seg in ax, size in dx; clobbers bx,ds,es
  1056. X                ; retruns first block that's large enough if possible
  1057. X
  1058. X        mov    ax,memblk1st        ; first mem blk
  1059. X        xor    dx,dx            ; largest size found
  1060. X        jmp    gook
  1061. Xgookloop:    mov    ds,ax
  1062. X        test    ds:memblkflg,MASK_used    ; is this blk used?
  1063. X        jnz    gookme            ; yup
  1064. X        cmp    ds:memblksiz,cx     ; is it large enough?
  1065. X        jc    gookme            ; nope
  1066. X        mov    dx,ds:memblksiz     ; got one!
  1067. X        ret
  1068. Xgookme:
  1069. X        mov    ax,ds:memblknxt
  1070. Xgook:        or    ax,ax            ; end of list?
  1071. X        jnz    gookloop        ; around and around
  1072. X        ret
  1073. X
  1074. Xlargestmem    ENDP
  1075. X
  1076. X;-------------------------------------------------------------------------------
  1077. X
  1078. Xkillmem     PROC    NEAR
  1079. X
  1080. X        test    ds:memblkflg,MASK_used    ; is it used?
  1081. X        jz    memnotused        ; don't kill ovl
  1082. X        push    es
  1083. X        mov    es,ds:memblkovl
  1084. X        and    es:ovlflg,NOT MASK loaded ; zap ovl associated with this blk
  1085. X        pop    es
  1086. Xmemnotused:
  1087. X        jmp    mergemem        ; merge free memory
  1088. X
  1089. Xkillmem     ENDP
  1090. X
  1091. X;-------------------------------------------------------------------------------
  1092. X
  1093. Xkillovl     PROC    NEAR        ; preserves bx
  1094. X
  1095. X        mov    ds,ax
  1096. X
  1097. X        ASSUME    DS:ovltbl
  1098. X
  1099. X        and    ovlflg,NOT MASK loaded    ; ovl no longer loaded
  1100. X        mov    ax,ovlmemblk        ; get mem blk
  1101. X        mov    ds,ax
  1102. X        jmp    mergemem        ; merge free memory
  1103. X
  1104. Xkillovl     ENDP
  1105. X
  1106. X;-------------------------------------------------------------------------------
  1107. X
  1108. Xmergemem    PROC    NEAR
  1109. X
  1110. X; merge physically adjacent free memory blocks. Preserves es. ds -> a free block.
  1111. X
  1112. X        push    es
  1113. X        and    ds:memblkflg,NOT MASK_used ; set current free
  1114. X        mov    ax,ds:memblkprv     ; get previous blk
  1115. X        or    ax,ax            ; was there a previous blk?
  1116. X        jz    gibber            ; nope
  1117. X        mov    es,ax
  1118. X        test    es:memblkflg,MASK_used    ; is the previous blk used?
  1119. X        jnz    gibber            ; yup
  1120. X        add    ax,es:memblksiz     ; end of previous blk
  1121. X        mov    dx,ds
  1122. X        cmp    dx,ax            ; physically adjacent?
  1123. X        jnz    gibber            ; nope
  1124. X        mov    ax,ds:memblksiz
  1125. X        add    es:memblksiz,ax     ; adjust size of new larger blk
  1126. X        mov    ax,ds:memblknxt     ; fix pointers
  1127. X        mov    es:memblknxt,ax
  1128. X        or    ax,ax
  1129. X        jz    almostgibber
  1130. X        mov    ds,ax            ; fix pointer of next blk
  1131. X        mov    ds:memblkprv,es
  1132. Xalmostgibber:
  1133. X        mov    ax,es
  1134. X        mov    ds,ax            ; new blk segment
  1135. Xgibber:
  1136. X        mov    ax,ds:memblknxt     ; get next blk
  1137. X        or    ax,ax            ; was there a next blk?
  1138. X        jz    killdone        ; nope
  1139. X        mov    es,ax
  1140. X        test    es:memblkflg,MASK_used    ; is the nxt blk used?
  1141. X        jnz    killdone        ; yup
  1142. X        mov    ax,ds
  1143. X        add    ax,ds:memblksiz     ; end of this blk
  1144. X        mov    dx,es
  1145. X        cmp    ax,dx            ; physically adjacent?
  1146. X        jnz    killdone        ; nope
  1147. X        mov    ax,es:memblksiz
  1148. X        add    ds:memblksiz,ax     ; adjust size of new larger blk
  1149. X        mov    ax,es:memblknxt     ; fix pointers
  1150. X        mov    ds:memblknxt,ax
  1151. X        or    ax,ax
  1152. X        jz    killdone
  1153. X        mov    es,ax            ; fix pointer of blk after nxt
  1154. X        mov    es:memblkprv,ds
  1155. Xkilldone:
  1156. X        and    ds:memblkflg,NOT MASK_used ; make sure it's free
  1157. X        pop    es
  1158. X        ret
  1159. X
  1160. Xmergemem    ENDP
  1161. X
  1162. X;-------------------------------------------------------------------------------
  1163. X
  1164. Xgethdr        PROC    NEAR            ; read EXE header from handle
  1165. X
  1166. X        push    cx
  1167. X        mov    ax,cs
  1168. X        mov    ds,ax
  1169. X        mov    dx,OFFSET hdr        ; a place to put it
  1170. X        mov    bx,ovlexefilhdl     ; the file handle
  1171. X        mov    cx,TYPE EXEHDR        ; header size in bytes
  1172. X        mov    ah,DOSREAD
  1173. X        int    DOS            ; read from file
  1174. X        jc    exegone         ; oops
  1175. X        cmp    ax,cx            ; got correct number of bytes?
  1176. X        jnz    exegone         ; nope
  1177. X        pop    cx
  1178. X        ret                ; Wow, it worked!
  1179. Xexegone:
  1180. X        mov    al,5            ; You lose!
  1181. X        mov    dx,OFFSET nofile
  1182. X        jmp    putserr
  1183. X
  1184. Xgethdr        ENDP
  1185. X
  1186. X;-------------------------------------------------------------------------------
  1187. X
  1188. Xputserr     PROC    NEAR
  1189. X
  1190. X; display error msg, close file, restore int vectors, free mem and return to DOS.
  1191. X
  1192. X        push    ax            ; keep return code for later
  1193. X        mov    ax,cs
  1194. X        mov    ds,ax
  1195. X        mov    ah,PRINT
  1196. X        int    DOS            ; display error msg
  1197. X        mov    dx,WORD PTR oldvec    ; get old vector
  1198. X        cmp    dx,-1            ; was it ever replaced?
  1199. X        jz    free21            ; nope
  1200. X        push    ds
  1201. X        mov    ds,WORD PTR oldvec+2
  1202. X        mov    ah,DOSSETVEC        ; put it back then.
  1203. X        mov    al,intnum
  1204. X        int    DOS
  1205. X        pop    ds
  1206. Xfree21:
  1207. X        mov    dx,WORD PTR oldint21
  1208. X        cmp    dx,-1
  1209. X        jz    freemem
  1210. X        push    ds
  1211. X        mov    ds,WORD PTR oldint21+2
  1212. X        mov    ah,DOSSETVEC        ; put it back then.
  1213. X        mov    al,21h
  1214. X        int    DOS
  1215. X        pop    ds
  1216. Xfreemem:
  1217. X        mov    ax,ovltblbse        ; get memory blk segment
  1218. X        cmp    ax,-1            ; was one ever allocated?
  1219. X        jz    closefile        ; nope
  1220. X        mov    es,ax
  1221. X        mov    ah,DOSFREE        ; must free it.
  1222. X        int    DOS
  1223. Xclosefile:
  1224. X        mov    bx,ovlexefilhdl     ; get file handle
  1225. X        cmp    bx,-1            ; was the file ever opened?
  1226. X        jz    byebye            ; nope
  1227. X        mov    ah,DOSCLOSE        ; close it
  1228. X        int    DOS
  1229. Xbyebye:
  1230. X        pop    ax            ; return code in al
  1231. X        mov    ah,TERMINATE
  1232. X        int    DOS            ; terminate this process
  1233. X
  1234. Xputserr     ENDP
  1235. X
  1236. Xcode        ENDS
  1237. X
  1238. X        END
  1239. END_OF_FILE
  1240. if test 30539 -ne `wc -c <'others/ovlmgr.asm'`; then
  1241.     echo shar: \"'others/ovlmgr.asm'\" unpacked with wrong size!
  1242. fi
  1243. # end of 'others/ovlmgr.asm'
  1244. if test -f 'src/lev_lex.c' -a "${1}" != "-c" ; then 
  1245.   echo shar: Renaming existing file \"'src/lev_lex.c'\" to \"'src/lev_lex.c.orig'\"
  1246.   mv -f 'src/lev_lex.c' 'src/lev_lex.c.orig'
  1247. fi
  1248. echo shar: Extracting \"'src/lev_lex.c'\" \(21018 characters\)
  1249. sed "s/^X//" >'src/lev_lex.c' <<'END_OF_FILE'
  1250. X# include "stdio.h"
  1251. X# define U(x) x
  1252. X# define NLSTATE yyprevious=YYNEWLINE
  1253. X# define BEGIN yybgin = yysvec + 1 +
  1254. X# define INITIAL 0
  1255. X# define YYLERR yysvec
  1256. X# define YYSTATE (yyestate-yysvec-1)
  1257. X# define YYOPTIM 1
  1258. X# define YYLMAX 200
  1259. X# define output(c) putc(c,yyout)
  1260. X# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
  1261. X# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
  1262. X# define yymore() (yymorfg=1)
  1263. X# define ECHO fprintf(yyout, "%s",yytext)
  1264. X# define REJECT { nstr = yyreject(); goto yyfussy;}
  1265. Xint yyleng; extern char yytext[];
  1266. Xint yymorfg;
  1267. Xextern char *yysptr, yysbuf[];
  1268. Xint yytchar;
  1269. XFILE *yyin ={stdin}, *yyout ={stdout};
  1270. Xextern int yylineno;
  1271. Xstruct yysvf { 
  1272. X    struct yywork *yystoff;
  1273. X    struct yysvf *yyother;
  1274. X    int *yystops;};
  1275. Xstruct yysvf *yyestate;
  1276. Xextern struct yysvf yysvec[], *yybgin;
  1277. X/*    SCCS Id: @(#)lev_lex.c    3.0    90/01/04
  1278. X/*    Copyright (c) 1989 by Jean-Christophe Collet */
  1279. X/* NetHack may be freely redistributed.  See license for details. */
  1280. X
  1281. X#define LEV_LEX_C
  1282. X
  1283. X/* block some unused #defines to avoid overloading some cpp's */
  1284. X#define MONDATA_H    /* comment this line for pre-compiled headers */
  1285. X#define MONFLAG_H    /* comment this line for pre-compiled headers */
  1286. X
  1287. X#include "hack.h"
  1288. X#include "lev_comp.h"
  1289. X#include "sp_lev.h"
  1290. X
  1291. X/* Most of these don't exist in flex, yywrap is macro and
  1292. X * yyunput is properly declared in flex.skel.
  1293. X */
  1294. X#ifndef FLEX_SCANNER
  1295. Xint FDECL (yyback, (int *, int));
  1296. Xint NDECL (yylook);
  1297. Xint NDECL (yyinput);
  1298. Xint NDECL (yywrap);
  1299. Xint NDECL (yylex);
  1300. Xint FDECL (yyunput, (int));
  1301. Xint FDECL (yyoutput, (int));
  1302. X#endif
  1303. X
  1304. X#ifdef MSDOS
  1305. X#undef exit
  1306. X#endif
  1307. X
  1308. X/* this doesn't always get put in lev_comp.h
  1309. X * (esp. when using older versions of bison)
  1310. X */
  1311. X
  1312. Xextern YYSTYPE yylval;
  1313. X
  1314. X#ifdef MACOS
  1315. X#undef putchar
  1316. X#undef putc
  1317. X#undef printf
  1318. X#undef Printf
  1319. X#define Printf printf
  1320. X# ifdef LSC
  1321. X#define    putc(c,stream)    (fputc(c,stream))
  1322. X#define    putchar(c)    (fputc(c,stdout))
  1323. X# endif
  1324. X#endif
  1325. Xint line_number = 1;
  1326. X
  1327. X/* This is *** UGLY *** but I can't think a better way to do it
  1328. X * I really need a huge buffer to scan maps...
  1329. X */
  1330. X
  1331. X#undef YYLMAX
  1332. X#define YYLMAX    2048
  1333. X
  1334. X# define MAPC 2
  1335. X# define YYNEWLINE 10
  1336. Xyylex(){
  1337. Xint nstr; extern int yyprevious;
  1338. Xwhile((nstr = yylook()) >= 0)
  1339. Xyyfussy: switch(nstr){
  1340. Xcase 0:
  1341. Xif(yywrap()) return(0); break;
  1342. Xcase 1:
  1343. X{ line_number++; yymore(); }
  1344. Xbreak;
  1345. Xcase 2:
  1346. X{ BEGIN 0;
  1347. X          line_number++;
  1348. X          yytext[yyleng-7] = 0; /* Discard \nENDMAP */
  1349. X          yylval.map = (char *) alloc(strlen(yytext)+1);
  1350. X          strcpy(yylval.map, yytext);
  1351. X          return MAP_ID;
  1352. X        }
  1353. Xbreak;
  1354. Xcase 3:
  1355. X    { line_number++; }
  1356. Xbreak;
  1357. Xcase 4:
  1358. X    return MAZE_ID;
  1359. Xbreak;
  1360. Xcase 5:
  1361. X    return LEVEL_ID;
  1362. Xbreak;
  1363. Xcase 6:
  1364. Xreturn GEOMETRY_ID;
  1365. Xbreak;
  1366. Xcase 7:
  1367. X    { BEGIN MAPC; line_number++; }
  1368. Xbreak;
  1369. Xcase 8:
  1370. X    return OBJECT_ID;
  1371. Xbreak;
  1372. Xcase 9:
  1373. X    return MONSTER_ID;
  1374. Xbreak;
  1375. Xcase 10:
  1376. X    return TRAP_ID;
  1377. Xbreak;
  1378. Xcase 11:
  1379. X    return DOOR_ID;
  1380. Xbreak;
  1381. Xcase 12:
  1382. Xreturn DRAWBRIDGE_ID;
  1383. Xbreak;
  1384. Xcase 13:
  1385. Xreturn MAZEWALK_ID;
  1386. Xbreak;
  1387. Xcase 14:
  1388. X    return REGION_ID;
  1389. Xbreak;
  1390. Xcase 15:
  1391. Xreturn RANDOM_OBJECTS_ID;
  1392. Xbreak;
  1393. Xcase 16:
  1394. Xreturn RANDOM_MONSTERS_ID;
  1395. Xbreak;
  1396. Xcase 17:
  1397. Xreturn RANDOM_PLACES_ID;
  1398. Xbreak;
  1399. Xcase 18:
  1400. X    return ALTAR_ID;
  1401. Xbreak;
  1402. Xcase 19:
  1403. X    return LADDER_ID;
  1404. Xbreak;
  1405. Xcase 20:
  1406. Xreturn NON_DIGGABLE_ID;
  1407. Xbreak;
  1408. Xcase 21:
  1409. X    return ROOM_ID;
  1410. Xbreak;
  1411. Xcase 22:
  1412. X    { yylval.i=D_ISOPEN; return DOOR_STATE; }
  1413. Xbreak;
  1414. Xcase 23:
  1415. X    { yylval.i=D_CLOSED; return DOOR_STATE; }
  1416. Xbreak;
  1417. Xcase 24:
  1418. X    { yylval.i=D_LOCKED; return DOOR_STATE; }
  1419. Xbreak;
  1420. Xcase 25:
  1421. X    { yylval.i=D_NODOOR; return DOOR_STATE; }
  1422. Xbreak;
  1423. Xcase 26:
  1424. X    { yylval.i=D_BROKEN; return DOOR_STATE; }
  1425. Xbreak;
  1426. Xcase 27:
  1427. X    { yylval.i=W_NORTH; return DIRECTION; }
  1428. Xbreak;
  1429. Xcase 28:
  1430. X    { yylval.i=W_EAST; return DIRECTION; }
  1431. Xbreak;
  1432. Xcase 29:
  1433. X    { yylval.i=W_SOUTH; return DIRECTION; }
  1434. Xbreak;
  1435. Xcase 30:
  1436. X    { yylval.i=W_WEST; return DIRECTION; }
  1437. Xbreak;
  1438. Xcase 31:
  1439. X    { yylval.i = -1; return RANDOM_TYPE; }
  1440. Xbreak;
  1441. Xcase 32:
  1442. X    return O_REGISTER;
  1443. Xbreak;
  1444. Xcase 33:
  1445. X    return M_REGISTER;
  1446. Xbreak;
  1447. Xcase 34:
  1448. X    return P_REGISTER;
  1449. Xbreak;
  1450. Xcase 35:
  1451. X    return A_REGISTER;
  1452. Xbreak;
  1453. Xcase 36:
  1454. X    { yylval.i=1; return LEFT_OR_RIGHT; }
  1455. Xbreak;
  1456. Xcase 37:
  1457. X    { yylval.i=3; return LEFT_OR_RIGHT; }
  1458. Xbreak;
  1459. Xcase 38:
  1460. X    { yylval.i=2; return CENTER; }
  1461. Xbreak;
  1462. Xcase 39:
  1463. X    { yylval.i=1; return TOP_OR_BOT; }
  1464. Xbreak;
  1465. Xcase 40:
  1466. X    { yylval.i=3; return TOP_OR_BOT; }
  1467. Xbreak;
  1468. Xcase 41:
  1469. X    { yylval.i=1; return LIGHT_STATE; }
  1470. Xbreak;
  1471. Xcase 42:
  1472. X    { yylval.i=0; return LIGHT_STATE; }
  1473. Xbreak;
  1474. Xcase 43:
  1475. X    { yylval.i=A_LAW; return ALIGNMENT; }
  1476. Xbreak;
  1477. Xcase 44:
  1478. X    { yylval.i=A_NEUTRAL; return ALIGNMENT; }
  1479. Xbreak;
  1480. Xcase 45:
  1481. X    { yylval.i=A_CHAOS; return ALIGNMENT; }
  1482. Xbreak;
  1483. Xcase 46:
  1484. X    { yylval.i=1; return ALTAR_TYPE; }
  1485. Xbreak;
  1486. Xcase 47:
  1487. X    { yylval.i=0; return ALTAR_TYPE; }
  1488. Xbreak;
  1489. Xcase 48:
  1490. X    { yylval.i=1; return UP_OR_DOWN; }
  1491. Xbreak;
  1492. Xcase 49:
  1493. X    { yylval.i=0; return UP_OR_DOWN; }
  1494. Xbreak;
  1495. Xcase 50:
  1496. X    { yylval.i=atoi(yytext); return INTEGER; }
  1497. Xbreak;
  1498. Xcase 51:
  1499. X{ yytext[yyleng-1] = 0; /* Discard the trailing \" */
  1500. X          yylval.map = (char *) alloc(strlen(yytext+1)+1);
  1501. X          strcpy(yylval.map, yytext+1); /* Discard the first \" */
  1502. X          return STRING; }
  1503. Xbreak;
  1504. Xcase 52:
  1505. X    { line_number++; }
  1506. Xbreak;
  1507. Xcase 53:
  1508. X    ;
  1509. Xbreak;
  1510. Xcase 54:
  1511. X    { yylval.i = yytext[1]; return CHAR; }
  1512. Xbreak;
  1513. Xcase 55:
  1514. X    { return yytext[0]; }
  1515. Xbreak;
  1516. Xcase -1:
  1517. Xbreak;
  1518. Xdefault:
  1519. Xfprintf(yyout,"bad switch yylook %d",nstr);
  1520. X} return(0); }
  1521. X/* end of yylex */
  1522. X#ifdef    AMIGA
  1523. Xlong *alloc(n)
  1524. X    unsigned n;
  1525. X{
  1526. X    return ((long *)malloc (n));
  1527. X}
  1528. X#endif
  1529. Xint yyvstop[] ={
  1530. X0,
  1531. X
  1532. X55,
  1533. X0,
  1534. X
  1535. X53,
  1536. X55,
  1537. X0,
  1538. X
  1539. X52,
  1540. X0,
  1541. X
  1542. X55,
  1543. X0,
  1544. X
  1545. X55,
  1546. X0,
  1547. X
  1548. X50,
  1549. X55,
  1550. X0,
  1551. X
  1552. X55,
  1553. X0,
  1554. X
  1555. X55,
  1556. X0,
  1557. X
  1558. X55,
  1559. X0,
  1560. X
  1561. X55,
  1562. X0,
  1563. X
  1564. X55,
  1565. X0,
  1566. X
  1567. X55,
  1568. X0,
  1569. X
  1570. X55,
  1571. X0,
  1572. X
  1573. X55,
  1574. X0,
  1575. X
  1576. X55,
  1577. X0,
  1578. X
  1579. X55,
  1580. X0,
  1581. X
  1582. X55,
  1583. X0,
  1584. X
  1585. X55,
  1586. X0,
  1587. X
  1588. X55,
  1589. X0,
  1590. X
  1591. X55,
  1592. X0,
  1593. X
  1594. X55,
  1595. X0,
  1596. X
  1597. X55,
  1598. X0,
  1599. X
  1600. X55,
  1601. X0,
  1602. X
  1603. X55,
  1604. X0,
  1605. X
  1606. X55,
  1607. X0,
  1608. X
  1609. X55,
  1610. X0,
  1611. X
  1612. X55,
  1613. X0,
  1614. X
  1615. X55,
  1616. X0,
  1617. X
  1618. X55,
  1619. X0,
  1620. X
  1621. X55,
  1622. X0,
  1623. X
  1624. X55,
  1625. X0,
  1626. X
  1627. X55,
  1628. X0,
  1629. X
  1630. X1,
  1631. X52,
  1632. X0,
  1633. X
  1634. X53,
  1635. X55,
  1636. X0,
  1637. X
  1638. X55,
  1639. X0,
  1640. X
  1641. X55,
  1642. X0,
  1643. X
  1644. X55,
  1645. X0,
  1646. X
  1647. X53,
  1648. X0,
  1649. X
  1650. X51,
  1651. X0,
  1652. X
  1653. X50,
  1654. X0,
  1655. X
  1656. X48,
  1657. X0,
  1658. X
  1659. X3,
  1660. X0,
  1661. X
  1662. X1,
  1663. X0,
  1664. X
  1665. X53,
  1666. X0,
  1667. X
  1668. X1,
  1669. X3,
  1670. X0,
  1671. X
  1672. X54,
  1673. X0,
  1674. X
  1675. X43,
  1676. X0,
  1677. X
  1678. X41,
  1679. X0,
  1680. X
  1681. X39,
  1682. X0,
  1683. X
  1684. X11,
  1685. X0,
  1686. X
  1687. X4,
  1688. X0,
  1689. X
  1690. X21,
  1691. X0,
  1692. X
  1693. X10,
  1694. X0,
  1695. X
  1696. X49,
  1697. X0,
  1698. X
  1699. X28,
  1700. X0,
  1701. X
  1702. X36,
  1703. X0,
  1704. X
  1705. X22,
  1706. X0,
  1707. X
  1708. X30,
  1709. X0,
  1710. X
  1711. X7,
  1712. X0,
  1713. X
  1714. X18,
  1715. X0,
  1716. X
  1717. X5,
  1718. X0,
  1719. X
  1720. X35,
  1721. X0,
  1722. X
  1723. X47,
  1724. X0,
  1725. X
  1726. X45,
  1727. X0,
  1728. X
  1729. X27,
  1730. X0,
  1731. X
  1732. X34,
  1733. X0,
  1734. X
  1735. X37,
  1736. X0,
  1737. X
  1738. X29,
  1739. X0,
  1740. X
  1741. X42,
  1742. X0,
  1743. X
  1744. X19,
  1745. X0,
  1746. X
  1747. X8,
  1748. X0,
  1749. X
  1750. X14,
  1751. X0,
  1752. X
  1753. X40,
  1754. X0,
  1755. X
  1756. X26,
  1757. X0,
  1758. X
  1759. X38,
  1760. X0,
  1761. X
  1762. X23,
  1763. X0,
  1764. X
  1765. X24,
  1766. X0,
  1767. X
  1768. X25,
  1769. X0,
  1770. X
  1771. X32,
  1772. X0,
  1773. X
  1774. X31,
  1775. X0,
  1776. X
  1777. X46,
  1778. X0,
  1779. X
  1780. X9,
  1781. X0,
  1782. X
  1783. X33,
  1784. X0,
  1785. X
  1786. X44,
  1787. X0,
  1788. X
  1789. X2,
  1790. X0,
  1791. X
  1792. X6,
  1793. X0,
  1794. X
  1795. X13,
  1796. X0,
  1797. X
  1798. X12,
  1799. X0,
  1800. X
  1801. X20,
  1802. X0,
  1803. X
  1804. X17,
  1805. X0,
  1806. X
  1807. X15,
  1808. X0,
  1809. X
  1810. X16,
  1811. X0,
  1812. X0};
  1813. X# define YYTYPE int
  1814. Xstruct yywork { YYTYPE verify, advance; } yycrank[] ={
  1815. X0,0,    0,0,    1,5,    0,0,    
  1816. X0,0,    0,0,    0,0,    0,0,    
  1817. X8,43,    0,0,    1,6,    1,7,    
  1818. X9,45,    0,0,    6,42,    0,0,    
  1819. X8,43,    8,43,    0,0,    0,0,    
  1820. X9,45,    9,0,    41,94,    0,0,    
  1821. X0,0,    0,0,    0,0,    0,0,    
  1822. X0,0,    0,0,    0,0,    0,0,    
  1823. X0,0,    1,6,    0,0,    1,8,    
  1824. X1,5,    6,42,    0,0,    8,43,    
  1825. X1,9,    8,44,    8,43,    9,45,    
  1826. X41,95,    9,45,    9,45,    41,95,    
  1827. X45,96,    1,10,    0,0,    0,0,    
  1828. X0,0,    0,0,    0,0,    8,43,    
  1829. X0,0,    0,0,    0,0,    9,45,    
  1830. X0,0,    0,0,    0,0,    0,0,    
  1831. X0,0,    0,0,    1,11,    14,51,    
  1832. X15,53,    1,12,    13,50,    14,52,    
  1833. X1,13,    17,56,    36,89,    49,99,    
  1834. X51,101,    1,14,    1,15,    1,16,    
  1835. X1,17,    11,47,    15,54,    1,18,    
  1836. X12,48,    1,19,    16,55,    12,49,    
  1837. X2,5,    18,57,    19,60,    40,93,    
  1838. X47,97,    18,58,    48,98,    50,100,    
  1839. X2,6,    2,7,    1,20,    1,21,    
  1840. X1,22,    1,23,    1,24,    18,59,    
  1841. X24,68,    34,86,    52,102,    53,103,    
  1842. X54,104,    1,25,    1,26,    1,27,    
  1843. X1,28,    1,29,    20,61,    1,30,    
  1844. X1,31,    1,32,    1,33,    2,6,    
  1845. X1,34,    2,8,    2,35,    23,67,    
  1846. X21,62,    26,73,    2,9,    21,63,    
  1847. X29,78,    32,83,    2,5,    55,105,    
  1848. X2,5,    2,5,    28,76,    2,10,    
  1849. X10,46,    10,46,    10,46,    10,46,    
  1850. X10,46,    10,46,    10,46,    10,46,    
  1851. X10,46,    10,46,    22,64,    27,74,    
  1852. X28,77,    22,65,    56,106,    30,79,    
  1853. X2,11,    22,66,    31,81,    2,12,    
  1854. X57,107,    27,75,    2,13,    30,80,    
  1855. X58,108,    31,82,    2,5,    2,14,    
  1856. X2,36,    2,16,    2,17,    59,109,    
  1857. X25,69,    2,18,    2,5,    2,19,    
  1858. X25,70,    33,84,    60,110,    33,85,    
  1859. X25,71,    62,113,    61,111,    2,5,    
  1860. X63,114,    64,115,    25,72,    65,116,    
  1861. X2,20,    2,21,    2,22,    2,23,    
  1862. X2,24,    61,112,    66,117,    3,37,    
  1863. X67,118,    68,119,    69,120,    2,25,    
  1864. X2,26,    2,27,    2,28,    2,29,    
  1865. X35,87,    2,30,    2,31,    2,32,    
  1866. X2,33,    70,121,    2,34,    71,122,    
  1867. X35,87,    35,88,    2,5,    2,5,    
  1868. X2,5,    3,38,    72,123,    73,124,    
  1869. X3,39,    74,125,    75,126,    76,128,    
  1870. X3,9,    77,129,    78,130,    79,131,    
  1871. X80,132,    81,133,    82,134,    83,135,    
  1872. X84,136,    86,137,    89,138,    35,87,    
  1873. X75,127,    35,87,    35,87,    93,139,    
  1874. X97,140,    98,141,    99,142,    95,94,    
  1875. X89,103,    100,143,    101,144,    102,145,    
  1876. X103,146,    104,147,    3,11,    35,87,    
  1877. X105,148,    3,12,    3,40,    106,149,    
  1878. X3,13,    107,150,    108,151,    109,152,    
  1879. X110,153,    3,14,    3,15,    3,16,    
  1880. X3,17,    95,95,    111,154,    3,18,    
  1881. X95,95,    3,19,    112,155,    113,156,    
  1882. X114,157,    115,158,    116,159,    117,160,    
  1883. X118,161,    119,162,    121,163,    123,164,    
  1884. X124,165,    4,37,    3,20,    3,21,    
  1885. X3,22,    3,23,    3,24,    125,166,    
  1886. X126,167,    127,168,    128,169,    129,170,    
  1887. X130,171,    3,25,    3,26,    3,27,    
  1888. X3,28,    3,29,    131,172,    3,30,    
  1889. X3,31,    3,32,    3,33,    4,38,    
  1890. X3,34,    132,173,    4,41,    133,174,    
  1891. X134,175,    136,176,    4,9,    137,177,    
  1892. X138,178,    139,179,    4,39,    140,180,    
  1893. X4,39,    4,39,    142,181,    143,182,    
  1894. X144,183,    145,184,    146,185,    147,186,    
  1895. X148,187,    149,188,    150,189,    151,190,    
  1896. X154,191,    155,192,    156,193,    157,194,    
  1897. X158,195,    159,196,    160,197,    164,198,    
  1898. X4,11,    165,199,    166,200,    4,12,    
  1899. X4,40,    167,201,    4,13,    168,202,    
  1900. X169,203,    171,204,    4,39,    4,14,    
  1901. X4,36,    4,16,    4,17,    172,205,    
  1902. X173,206,    4,18,    4,39,    4,19,    
  1903. X174,207,    175,208,    176,209,    179,210,    
  1904. X181,211,    182,212,    183,213,    4,39,    
  1905. X185,214,    186,215,    38,42,    38,90,    
  1906. X4,20,    4,21,    4,22,    4,23,    
  1907. X4,24,    187,216,    188,217,    189,218,    
  1908. X190,219,    193,220,    194,221,    4,25,    
  1909. X4,26,    4,27,    4,28,    4,29,    
  1910. X195,222,    4,30,    4,31,    4,32,    
  1911. X4,33,    38,91,    4,34,    39,90,    
  1912. X38,92,    197,223,    4,39,    4,39,    
  1913. X4,39,    198,224,    199,225,    200,226,    
  1914. X38,92,    201,227,    38,92,    38,92,    
  1915. X203,228,    205,229,    207,230,    210,231,    
  1916. X211,232,    212,233,    214,234,    215,235,    
  1917. X216,236,    39,92,    218,237,    225,238,    
  1918. X39,92,    226,239,    231,240,    232,241,    
  1919. X233,242,    234,243,    236,244,    241,248,    
  1920. X39,92,    244,249,    39,92,    39,92,    
  1921. X237,245,    245,250,    237,246,    237,247,    
  1922. X38,92,    246,251,    247,252,    248,253,    
  1923. X249,254,    250,255,    251,256,    252,257,    
  1924. X38,92,    254,258,    255,259,    256,260,    
  1925. X257,261,    258,262,    259,263,    260,264,    
  1926. X261,265,    38,92,    263,266,    264,267,    
  1927. X265,268,    266,269,    267,270,    269,271,    
  1928. X39,92,    0,0,    0,0,    0,0,    
  1929. X0,0,    0,0,    0,0,    0,0,    
  1930. X39,92,    0,0,    0,0,    0,0,    
  1931. X0,0,    0,0,    0,0,    0,0,    
  1932. X0,0,    39,92,    0,0,    0,0,    
  1933. X0,0,    0,0,    0,0,    0,0,    
  1934. X38,92,    38,92,    38,92,    0,0,    
  1935. X0,0,    0,0,    0,0,    0,0,    
  1936. X0,0,    0,0,    0,0,    0,0,    
  1937. X0,0,    0,0,    0,0,    0,0,    
  1938. X0,0,    0,0,    0,0,    0,0,    
  1939. X0,0,    0,0,    0,0,    0,0,    
  1940. X39,92,    39,92,    39,92,    0,0,    
  1941. X0,0};
  1942. Xstruct yysvf yysvec[] ={
  1943. X0,    0,    0,
  1944. Xyycrank+-1,    0,        0,    
  1945. Xyycrank+-87,    0,        0,    
  1946. Xyycrank+-181,    yysvec+1,    0,    
  1947. Xyycrank+-267,    yysvec+2,    0,    
  1948. Xyycrank+0,    0,        yyvstop+1,
  1949. Xyycrank+5,    0,        yyvstop+3,
  1950. Xyycrank+0,    0,        yyvstop+6,
  1951. Xyycrank+-7,    0,        yyvstop+8,
  1952. Xyycrank+-11,    0,        yyvstop+10,
  1953. Xyycrank+88,    0,        yyvstop+12,
  1954. Xyycrank+5,    0,        yyvstop+15,
  1955. Xyycrank+5,    0,        yyvstop+17,
  1956. Xyycrank+1,    0,        yyvstop+19,
  1957. Xyycrank+2,    0,        yyvstop+21,
  1958. Xyycrank+3,    0,        yyvstop+23,
  1959. Xyycrank+7,    0,        yyvstop+25,
  1960. Xyycrank+7,    0,        yyvstop+27,
  1961. Xyycrank+24,    0,        yyvstop+29,
  1962. Xyycrank+8,    0,        yyvstop+31,
  1963. Xyycrank+6,    0,        yyvstop+33,
  1964. Xyycrank+13,    0,        yyvstop+35,
  1965. Xyycrank+45,    0,        yyvstop+37,
  1966. Xyycrank+12,    0,        yyvstop+39,
  1967. Xyycrank+7,    0,        yyvstop+41,
  1968. Xyycrank+71,    0,        yyvstop+43,
  1969. Xyycrank+14,    0,        yyvstop+45,
  1970. Xyycrank+46,    0,        yyvstop+47,
  1971. Xyycrank+36,    0,        yyvstop+49,
  1972. Xyycrank+20,    0,        yyvstop+51,
  1973. Xyycrank+54,    0,        yyvstop+53,
  1974. Xyycrank+50,    0,        yyvstop+55,
  1975. Xyycrank+18,    0,        yyvstop+57,
  1976. Xyycrank+63,    0,        yyvstop+59,
  1977. Xyycrank+4,    0,        yyvstop+61,
  1978. Xyycrank+-199,    0,        yyvstop+63,
  1979. Xyycrank+9,    yysvec+15,    yyvstop+65,
  1980. Xyycrank+0,    0,        yyvstop+67,
  1981. Xyycrank+353,    0,        yyvstop+70,
  1982. Xyycrank+377,    0,        yyvstop+73,
  1983. Xyycrank+13,    0,        yyvstop+75,
  1984. Xyycrank+-12,    yysvec+35,    yyvstop+77,
  1985. Xyycrank+0,    yysvec+6,    yyvstop+79,
  1986. Xyycrank+0,    yysvec+8,    0,    
  1987. Xyycrank+0,    0,        yyvstop+81,
  1988. Xyycrank+9,    0,        0,    
  1989. Xyycrank+0,    yysvec+10,    yyvstop+83,
  1990. Xyycrank+8,    0,        0,    
  1991. Xyycrank+15,    0,        0,    
  1992. Xyycrank+10,    0,        0,    
  1993. Xyycrank+16,    0,        0,    
  1994. Xyycrank+8,    0,        0,    
  1995. Xyycrank+20,    0,        0,    
  1996. Xyycrank+17,    0,        0,    
  1997. Xyycrank+30,    0,        0,    
  1998. Xyycrank+53,    0,        0,    
  1999. Xyycrank+76,    0,        0,    
  2000. Xyycrank+78,    0,        0,    
  2001. Xyycrank+89,    0,        0,    
  2002. Xyycrank+88,    0,        0,    
  2003. Xyycrank+109,    0,        0,    
  2004. Xyycrank+73,    0,        0,    
  2005. Xyycrank+61,    0,        0,    
  2006. Xyycrank+69,    0,        0,    
  2007. Xyycrank+71,    0,        0,    
  2008. Xyycrank+86,    0,        0,    
  2009. Xyycrank+79,    0,        0,    
  2010. Xyycrank+73,    0,        0,    
  2011. Xyycrank+78,    0,        0,    
  2012. Xyycrank+75,    0,        0,    
  2013. Xyycrank+103,    0,        0,    
  2014. Xyycrank+91,    0,        0,    
  2015. Xyycrank+115,    0,        0,    
  2016. Xyycrank+105,    0,        0,    
  2017. Xyycrank+100,    0,        0,    
  2018. Xyycrank+118,    0,        0,    
  2019. Xyycrank+113,    0,        0,    
  2020. Xyycrank+120,    0,        0,    
  2021. Xyycrank+125,    0,        0,    
  2022. Xyycrank+113,    0,        0,    
  2023. Xyycrank+121,    0,        0,    
  2024. Xyycrank+111,    0,        0,    
  2025. Xyycrank+109,    0,        0,    
  2026. Xyycrank+115,    0,        0,    
  2027. Xyycrank+120,    0,        0,    
  2028. Xyycrank+0,    0,        yyvstop+85,
  2029. Xyycrank+114,    0,        0,    
  2030. Xyycrank+0,    yysvec+35,    0,    
  2031. Xyycrank+0,    0,        yyvstop+87,
  2032. Xyycrank+150,    0,        0,    
  2033. Xyycrank+0,    0,        yyvstop+89,
  2034. Xyycrank+0,    yysvec+38,    yyvstop+91,
  2035. Xyycrank+0,    yysvec+39,    0,    
  2036. Xyycrank+167,    0,        0,    
  2037. Xyycrank+0,    0,        yyvstop+93,
  2038. Xyycrank+-229,    yysvec+35,    0,    
  2039. Xyycrank+0,    0,        yyvstop+96,
  2040. Xyycrank+171,    0,        0,    
  2041. Xyycrank+155,    0,        0,    
  2042. Xyycrank+151,    0,        0,    
  2043. Xyycrank+164,    0,        0,    
  2044. Xyycrank+174,    0,        0,    
  2045. Xyycrank+174,    0,        0,    
  2046. Xyycrank+175,    0,        0,    
  2047. Xyycrank+162,    0,        0,    
  2048. Xyycrank+153,    0,        0,    
  2049. Xyycrank+182,    0,        0,    
  2050. Xyycrank+185,    0,        0,    
  2051. Xyycrank+181,    0,        0,    
  2052. Xyycrank+178,    0,        0,    
  2053. Xyycrank+176,    0,        0,    
  2054. Xyycrank+159,    0,        0,    
  2055. Xyycrank+169,    0,        0,    
  2056. Xyycrank+151,    0,        0,    
  2057. Xyycrank+161,    0,        0,    
  2058. Xyycrank+153,    0,        0,    
  2059. Xyycrank+159,    0,        0,    
  2060. Xyycrank+156,    0,        0,    
  2061. Xyycrank+162,    0,        0,    
  2062. Xyycrank+157,    0,        0,    
  2063. Xyycrank+0,    0,        yyvstop+98,
  2064. Xyycrank+158,    0,        0,    
  2065. Xyycrank+0,    0,        yyvstop+100,
  2066. Xyycrank+168,    0,        0,    
  2067. Xyycrank+161,    0,        0,    
  2068. Xyycrank+167,    0,        0,    
  2069. Xyycrank+173,    0,        0,    
  2070. Xyycrank+169,    0,        0,    
  2071. Xyycrank+185,    0,        0,    
  2072. Xyycrank+177,    0,        0,    
  2073. Xyycrank+189,    0,        0,    
  2074. Xyycrank+194,    0,        0,    
  2075. Xyycrank+197,    0,        0,    
  2076. Xyycrank+198,    0,        0,    
  2077. Xyycrank+188,    0,        0,    
  2078. Xyycrank+0,    0,        yyvstop+102,
  2079. Xyycrank+200,    0,        0,    
  2080. Xyycrank+191,    0,        0,    
  2081. Xyycrank+298,    0,        0,    
  2082. Xyycrank+232,    0,        0,    
  2083. Xyycrank+229,    0,        0,    
  2084. Xyycrank+0,    0,        yyvstop+104,
  2085. Xyycrank+248,    0,        0,    
  2086. Xyycrank+246,    0,        0,    
  2087. Xyycrank+247,    0,        0,    
  2088. Xyycrank+241,    0,        0,    
  2089. Xyycrank+231,    0,        yyvstop+106,
  2090. Xyycrank+235,    0,        0,    
  2091. Xyycrank+252,    0,        0,    
  2092. Xyycrank+254,    0,        0,    
  2093. Xyycrank+243,    0,        0,    
  2094. Xyycrank+244,    0,        0,    
  2095. Xyycrank+0,    0,        yyvstop+108,
  2096. Xyycrank+0,    0,        yyvstop+110,
  2097. Xyycrank+214,    0,        0,    
  2098. Xyycrank+211,    0,        0,    
  2099. Xyycrank+215,    0,        0,    
  2100. Xyycrank+226,    0,        0,    
  2101. Xyycrank+227,    0,        0,    
  2102. Xyycrank+214,    0,        0,    
  2103. Xyycrank+229,    0,        0,    
  2104. Xyycrank+0,    0,        yyvstop+112,
  2105. Xyycrank+0,    0,        yyvstop+114,
  2106. Xyycrank+0,    0,        yyvstop+116,
  2107. Xyycrank+230,    0,        0,    
  2108. Xyycrank+217,    0,        0,    
  2109. Xyycrank+220,    0,        0,    
  2110. Xyycrank+226,    0,        0,    
  2111. Xyycrank+235,    0,        0,    
  2112. Xyycrank+241,    0,        0,    
  2113. Xyycrank+0,    0,        yyvstop+118,
  2114. Xyycrank+240,    0,        0,    
  2115. Xyycrank+236,    0,        0,    
  2116. Xyycrank+232,    0,        0,    
  2117. Xyycrank+242,    0,        0,    
  2118. Xyycrank+249,    0,        0,    
  2119. Xyycrank+238,    0,        0,    
  2120. Xyycrank+0,    0,        yyvstop+120,
  2121. Xyycrank+0,    0,        yyvstop+122,
  2122. Xyycrank+290,    0,        0,    
  2123. Xyycrank+0,    0,        yyvstop+124,
  2124. Xyycrank+274,    0,        0,    
  2125. Xyycrank+273,    0,        0,    
  2126. Xyycrank+276,    0,        0,    
  2127. Xyycrank+0,    0,        yyvstop+126,
  2128. Xyycrank+295,    0,        0,    
  2129. Xyycrank+292,    0,        0,    
  2130. Xyycrank+296,    0,        0,    
  2131. Xyycrank+286,    0,        0,    
  2132. Xyycrank+294,    0,        0,    
  2133. Xyycrank+294,    0,        0,    
  2134. Xyycrank+0,    0,        yyvstop+128,
  2135. Xyycrank+0,    0,        yyvstop+130,
  2136. Xyycrank+264,    0,        0,    
  2137. Xyycrank+264,    0,        0,    
  2138. Xyycrank+266,    0,        0,    
  2139. Xyycrank+0,    0,        yyvstop+132,
  2140. Xyycrank+289,    0,        0,    
  2141. Xyycrank+293,    0,        0,    
  2142. Xyycrank+293,    0,        0,    
  2143. Xyycrank+298,    0,        0,    
  2144. Xyycrank+283,    0,        0,    
  2145. Xyycrank+0,    0,        yyvstop+134,
  2146. Xyycrank+284,    0,        0,    
  2147. Xyycrank+0,    0,        yyvstop+136,
  2148. Xyycrank+292,    0,        0,    
  2149. Xyycrank+0,    0,        yyvstop+138,
  2150. Xyycrank+301,    0,        0,    
  2151. Xyycrank+0,    0,        yyvstop+140,
  2152. Xyycrank+0,    0,        yyvstop+142,
  2153. Xyycrank+323,    0,        0,    
  2154. Xyycrank+331,    0,        0,    
  2155. Xyycrank+323,    0,        0,    
  2156. Xyycrank+0,    0,        yyvstop+144,
  2157. Xyycrank+330,    0,        0,    
  2158. Xyycrank+325,    0,        0,    
  2159. Xyycrank+337,    0,        0,    
  2160. Xyycrank+0,    0,        yyvstop+146,
  2161. Xyycrank+315,    0,        0,    
  2162. Xyycrank+0,    0,        yyvstop+148,
  2163. Xyycrank+0,    0,        yyvstop+150,
  2164. Xyycrank+0,    0,        yyvstop+152,
  2165. Xyycrank+0,    0,        yyvstop+154,
  2166. Xyycrank+0,    0,        yyvstop+156,
  2167. Xyycrank+0,    0,        yyvstop+158,
  2168. Xyycrank+297,    0,        0,    
  2169. Xyycrank+305,    0,        0,    
  2170. Xyycrank+0,    0,        yyvstop+160,
  2171. Xyycrank+0,    0,        yyvstop+162,
  2172. Xyycrank+0,    0,        yyvstop+164,
  2173. Xyycrank+0,    0,        yyvstop+166,
  2174. Xyycrank+404,    0,        0,    
  2175. Xyycrank+347,    0,        0,    
  2176. Xyycrank+327,    0,        0,    
  2177. Xyycrank+342,    0,        0,    
  2178. Xyycrank+0,    0,        yyvstop+168,
  2179. Xyycrank+347,    0,        0,    
  2180. Xyycrank+347,    0,        0,    
  2181. Xyycrank+0,    0,        yyvstop+170,
  2182. Xyycrank+0,    0,        yyvstop+172,
  2183. Xyycrank+0,    0,        yyvstop+174,
  2184. Xyycrank+348,    0,        0,    
  2185. Xyycrank+0,    0,        yyvstop+176,
  2186. Xyycrank+0,    0,        yyvstop+178,
  2187. Xyycrank+356,    0,        0,    
  2188. Xyycrank+346,    0,        0,    
  2189. Xyycrank+363,    0,        0,    
  2190. Xyycrank+354,    0,        0,    
  2191. Xyycrank+362,    0,        0,    
  2192. Xyycrank+366,    0,        0,    
  2193. Xyycrank+355,    0,        0,    
  2194. Xyycrank+360,    0,        0,    
  2195. Xyycrank+370,    0,        0,    
  2196. Xyycrank+0,    0,        yyvstop+180,
  2197. Xyycrank+361,    0,        0,    
  2198. Xyycrank+355,    0,        0,    
  2199. Xyycrank+370,    0,        0,    
  2200. Xyycrank+373,    0,        0,    
  2201. Xyycrank+372,    0,        0,    
  2202. Xyycrank+358,    0,        0,    
  2203. Xyycrank+376,    0,        0,    
  2204. Xyycrank+375,    0,        0,    
  2205. Xyycrank+0,    0,        yyvstop+182,
  2206. Xyycrank+377,    0,        0,    
  2207. Xyycrank+363,    0,        0,    
  2208. Xyycrank+365,    0,        0,    
  2209. Xyycrank+367,    0,        0,    
  2210. Xyycrank+367,    0,        0,    
  2211. Xyycrank+0,    0,        yyvstop+184,
  2212. Xyycrank+368,    0,        0,    
  2213. Xyycrank+0,    0,        yyvstop+186,
  2214. Xyycrank+0,    0,        yyvstop+188,
  2215. X0,    0,    0};
  2216. Xstruct yywork *yytop = yycrank+502;
  2217. Xstruct yysvf *yybgin = yysvec+1;
  2218. Xchar yymatch[] ={
  2219. X00  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2220. X01  ,011 ,012 ,01  ,01  ,01  ,01  ,01  ,
  2221. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2222. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2223. X040 ,01  ,'"' ,'#' ,01  ,01  ,01  ,01  ,
  2224. X01  ,01  ,01  ,'#' ,01  ,'#' ,'#' ,01  ,
  2225. X'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,
  2226. X'0' ,'0' ,01  ,01  ,01  ,01  ,01  ,01  ,
  2227. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2228. X01  ,01  ,01  ,'#' ,01  ,01  ,01  ,01  ,
  2229. X01  ,01  ,01  ,'#' ,01  ,01  ,01  ,01  ,
  2230. X01  ,01  ,01  ,01  ,'#' ,01  ,01  ,01  ,
  2231. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2232. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2233. X01  ,01  ,01  ,01  ,01  ,01  ,01  ,01  ,
  2234. X01  ,01  ,01  ,'#' ,'#' ,'#' ,01  ,01  ,
  2235. X0};
  2236. Xchar yyextra[] ={
  2237. X0,0,0,0,0,0,0,0,
  2238. X0,0,0,0,0,0,0,0,
  2239. X0,0,0,0,0,0,0,0,
  2240. X0,0,0,0,0,0,0,0,
  2241. X0,0,0,0,0,0,0,0,
  2242. X0,0,0,0,0,0,0,0,
  2243. X0,0,0,0,0,0,0,0,
  2244. X0};
  2245. X/*    ncform    4.1    83/08/11    */
  2246. X
  2247. Xint yylineno =1;
  2248. X# define YYU(x) x
  2249. X# define NLSTATE yyprevious=YYNEWLINE
  2250. Xchar yytext[YYLMAX];
  2251. Xstruct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
  2252. Xchar yysbuf[YYLMAX];
  2253. Xchar *yysptr = yysbuf;
  2254. Xint *yyfnd;
  2255. Xextern struct yysvf *yyestate;
  2256. Xint yyprevious = YYNEWLINE;
  2257. Xyylook(){
  2258. X    register struct yysvf *yystate, **lsp;
  2259. X    register struct yywork *yyt;
  2260. X    struct yysvf *yyz;
  2261. X    int yych;
  2262. X    struct yywork *yyr;
  2263. X# ifdef LEXDEBUG
  2264. X    int debug;
  2265. X# endif
  2266. X    char *yylastch;
  2267. X    /* start off machines */
  2268. X# ifdef LEXDEBUG
  2269. X    debug = 0;
  2270. X# endif
  2271. X    if (!yymorfg)
  2272. X        yylastch = yytext;
  2273. X    else {
  2274. X        yymorfg=0;
  2275. X        yylastch = yytext+yyleng;
  2276. X        }
  2277. X    for(;;){
  2278. X        lsp = yylstate;
  2279. X        yyestate = yystate = yybgin;
  2280. X        if (yyprevious==YYNEWLINE) yystate++;
  2281. X        for (;;){
  2282. X# ifdef LEXDEBUG
  2283. X            if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
  2284. X# endif
  2285. X            yyt = yystate->yystoff;
  2286. X            if(yyt == yycrank){        /* may not be any transitions */
  2287. X                yyz = yystate->yyother;
  2288. X                if(yyz == 0)break;
  2289. X                if(yyz->yystoff == yycrank)break;
  2290. X                }
  2291. X            *yylastch++ = yych = input();
  2292. X        tryagain:
  2293. X# ifdef LEXDEBUG
  2294. X            if(debug){
  2295. X                fprintf(yyout,"char ");
  2296. X                allprint(yych);
  2297. X                putchar('\n');
  2298. X                }
  2299. X# endif
  2300. X            yyr = yyt;
  2301. X            if ( (int)yyt > (int)yycrank){
  2302. X                yyt = yyr + yych;
  2303. X                if (yyt <= yytop && yyt->verify+yysvec == yystate){
  2304. X                    if(yyt->advance+yysvec == YYLERR)    /* error transitions */
  2305. X                        {unput(*--yylastch);break;}
  2306. X                    *lsp++ = yystate = yyt->advance+yysvec;
  2307. X                    goto contin;
  2308. X                    }
  2309. X                }
  2310. X# ifdef YYOPTIM
  2311. X            else if((int)yyt < (int)yycrank) {        /* r < yycrank */
  2312. X                yyt = yyr = yycrank+(yycrank-yyt);
  2313. X# ifdef LEXDEBUG
  2314. X                if(debug)fprintf(yyout,"compressed state\n");
  2315. X# endif
  2316. X                yyt = yyt + yych;
  2317. X                if(yyt <= yytop && yyt->verify+yysvec == yystate){
  2318. X                    if(yyt->advance+yysvec == YYLERR)    /* error transitions */
  2319. X                        {unput(*--yylastch);break;}
  2320. X                    *lsp++ = yystate = yyt->advance+yysvec;
  2321. X                    goto contin;
  2322. X                    }
  2323. X                yyt = yyr + YYU(yymatch[yych]);
  2324. X# ifdef LEXDEBUG
  2325. X                if(debug){
  2326. X                    fprintf(yyout,"try fall back character ");
  2327. X                    allprint(YYU(yymatch[yych]));
  2328. X                    putchar('\n');
  2329. X                    }
  2330. X# endif
  2331. X                if(yyt <= yytop && yyt->verify+yysvec == yystate){
  2332. X                    if(yyt->advance+yysvec == YYLERR)    /* error transition */
  2333. X                        {unput(*--yylastch);break;}
  2334. X                    *lsp++ = yystate = yyt->advance+yysvec;
  2335. X                    goto contin;
  2336. X                    }
  2337. X                }
  2338. X            if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
  2339. X# ifdef LEXDEBUG
  2340. X                if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
  2341. X# endif
  2342. X                goto tryagain;
  2343. X                }
  2344. X# endif
  2345. X            else
  2346. X                {unput(*--yylastch);break;}
  2347. X        contin:
  2348. X# ifdef LEXDEBUG
  2349. X            if(debug){
  2350. X                fprintf(yyout,"state %d char ",yystate-yysvec-1);
  2351. X                allprint(yych);
  2352. X                putchar('\n');
  2353. X                }
  2354. X# endif
  2355. X            ;
  2356. X            }
  2357. X# ifdef LEXDEBUG
  2358. X        if(debug){
  2359. X            fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
  2360. X            allprint(yych);
  2361. X            putchar('\n');
  2362. X            }
  2363. X# endif
  2364. X        while (lsp-- > yylstate){
  2365. X            *yylastch-- = 0;
  2366. X            if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
  2367. X                yyolsp = lsp;
  2368. X                if(yyextra[*yyfnd]){        /* must backup */
  2369. X                    while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
  2370. X                        lsp--;
  2371. X                        unput(*yylastch--);
  2372. X                        }
  2373. X                    }
  2374. X                yyprevious = YYU(*yylastch);
  2375. X                yylsp = lsp;
  2376. X                yyleng = yylastch-yytext+1;
  2377. X                yytext[yyleng] = 0;
  2378. X# ifdef LEXDEBUG
  2379. X                if(debug){
  2380. X                    fprintf(yyout,"\nmatch ");
  2381. X                    sprint(yytext);
  2382. X                    fprintf(yyout," action %d\n",*yyfnd);
  2383. X                    }
  2384. X# endif
  2385. X                return(*yyfnd++);
  2386. X                }
  2387. X            unput(*yylastch);
  2388. X            }
  2389. X        if (yytext[0] == 0  /* && feof(yyin) */)
  2390. X            {
  2391. X            yysptr=yysbuf;
  2392. X            return(0);
  2393. X            }
  2394. X        yyprevious = yytext[0] = input();
  2395. X        if (yyprevious>0)
  2396. X            output(yyprevious);
  2397. X        yylastch=yytext;
  2398. X# ifdef LEXDEBUG
  2399. X        if(debug)putchar('\n');
  2400. X# endif
  2401. X        }
  2402. X    }
  2403. Xyyback(p, m)
  2404. X    int *p;
  2405. X{
  2406. Xif (p==0) return(0);
  2407. Xwhile (*p)
  2408. X    {
  2409. X    if (*p++ == m)
  2410. X        return(1);
  2411. X    }
  2412. Xreturn(0);
  2413. X}
  2414. X    /* the following are only used in the lex library */
  2415. Xyyinput(){
  2416. X    return(input());
  2417. X    }
  2418. Xyyoutput(c)
  2419. X  int c; {
  2420. X    output(c);
  2421. X    }
  2422. Xyyunput(c)
  2423. X   int c; {
  2424. X    unput(c);
  2425. X    }
  2426. END_OF_FILE
  2427. if test 21018 -ne `wc -c <'src/lev_lex.c'`; then
  2428.     echo shar: \"'src/lev_lex.c'\" unpacked with wrong size!
  2429. fi
  2430. # end of 'src/lev_lex.c'
  2431. echo shar: End of archive 27 \(of 30\).
  2432. cp /dev/null ark27isdone
  2433. MISSING=""
  2434. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
  2435.     if test ! -f ark${I}isdone ; then
  2436.     MISSING="${MISSING} ${I}"
  2437.     fi
  2438. done
  2439. if test "${MISSING}" = "" ; then
  2440.     echo You have unpacked all 30 archives.
  2441.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2442. else
  2443.     echo You still need to unpack the following archives:
  2444.     echo "        " ${MISSING}
  2445. fi
  2446. ##  End of shell archive.
  2447. exit 0
  2448.