home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / programming / msdos / xa214f.lzh / xa214f / loader / loader.a65 < prev    next >
Encoding:
Text File  |  1996-12-21  |  12.2 KB  |  910 lines

  1.  
  2. /**************************************************************************
  3.  * 
  4.  * lOADER FOR 6502 RELOCATABLE BINARY FORMAT
  5.  *
  6.  * tHE LOADER SUPPORTS 16 BIT O65 VERSION 1 FILES WITHOUT UNDEFINED 
  7.  * REFERENCES. aLSO IT DOESN'T LIKE PAGEWISE RELOCATION AND 65816 
  8.  * CODE, BECAUSE THERE ARE DIFFERENT/ADDITIONAL RELOCATION ENTRIES.
  9.  *
  10.  * tHE SUPPORT ROUTINES, THAT HAVE TO BE CHANGED ARE AT THE END OF THE
  11.  * FILE. tHE STUFF IN THIS FILE IS IN ABSOLUTE FORMAT (WELL, YOU HAVE TO
  12.  * BOOTSTRAP FROM SOMETHING :-)
  13.  * tHE SUPPORT ROUTINES FOR THE FILE HANDLING ARE FOR THE OPERATING SYSTEM
  14.  * os/a65, AS OF VERSION 1.3.10B. tHE FIRST PART OF THE FILE (WRAPPED IN
  15.  * "#IFDEF c64") SHOWS HOW TO USE IT WITH A c64, FOR EXAMPLE.
  16.  * 
  17.  * tHE SUBROUTINE 'LOADER' IS CALLED WITH A FILE DESCRIPTOR, THAT HAS A 
  18.  * MEANING FOR THE SUPPORT ROUTINES, IN THE x REGISTER.
  19.  * tHE FILE MUST ALREADY BE OPEN. aLSO BINIT MUST HAVE BEEN CALLED BEFORE.
  20.  * tHE LOADER DOESN'T CLOSE THE FILE.
  21.  *
  22.  * sUPPORT ROUTINES ARE:
  23.  *   BINITA   = HI BYTE START ADDRESS MEMORY TO HANDLE,
  24.  *X   = HI BYTE LENGTH OF MEMORY TO HANDLE
  25.  *   BALLOCA/Y = LENGTH OF BLOCK -> X = MEMORY DESCRIPTOR
  26.  *   BFREE      X   = MEMORY BLOCK DESCRIPTOR TO FREE
  27.  *   GETBADRX   = MEMORY DESCRIPTOR -> A/Y ADDRESS OF MEMORY BLOCK
  28.  *
  29.  *   ZALLOCA   = LENGTH OF NEEDED ZEROPAGE BLOCK. RETURNS A=ADDRESS
  30.  *   ZFREEA   = ADDRESS OF BLOCK TO FREE
  31.  *
  32.  *   FGETCX   = FILE DESCRIPTOR, RETURNS READ BYTE (C=0) OR ERROR (C=1)
  33.  *      tHE ERROR IS PASSED THROUGH; FGETC BLOCKS IF NO DATA
  34.  *      AVAILABLE
  35.  *   FGETBX   = FILEDESCRIPTOR, A/Y = ADDRESS OF BLOCK DESCRIPTOR,
  36.  *                    I.E. A WORD START ADDRESS AND A WORD LENGTH OF BLOCK.
  37.  *                    RETURNS (C=0) OR ERROR IN ACCU (C=1).
  38.  *
  39.  **************************************************************************/
  40.  
  41. /**************************************************************************
  42.  * tHIS PART IS A BINDING FOR A c64
  43.  * TO SHOW HOW IT WORKS
  44.  */
  45.  
  46. #DEFINEc64
  47.  
  48. #IFDEF c64
  49.  
  50. SYSMEM=$033C
  51. SYSZP=$57
  52.  
  53.  
  54. .WORD $0801
  55. *=$801
  56. .WORD NEXTL
  57. .WORD 10
  58. .BYT $9E, "2080",0
  59. NEXTL.WORD 0
  60. .DSB 2080-*, 0 
  61.  
  62. C64LOAD.(
  63. LDA #>prgend+255
  64. LDX #>$a000-prgend
  65. JSR BINIT; INIT MEMORY HANDLING
  66.  
  67. LDA #7
  68. LDX #<FNAME
  69. LDY #>FNAME
  70. JSR $FFBD; SETFNPAR
  71.  
  72. LDA #2
  73. LDX #11
  74. LDY #0
  75. JSR $FFBA; SETFPAR
  76.  
  77. JSR $FFC0; OPEN
  78. BCS END
  79.  
  80. LDX #2
  81. JSR $FFC6; CHKIN
  82. BCS END
  83.  
  84. JSR LOADER; DON'T CARE ABOUT X, CHKIN DID IT
  85.  
  86. PHP
  87. PHA
  88. JSR $FFCC; CLRCH
  89. LDA #2
  90. JSR $FFC3; CLOSE
  91. PLA
  92. PLP
  93. ENDRTS
  94.  
  95. FNAME;.ASC "EXAMPLE",0
  96. .BYT $45, $58, $41, $4D, $50, $4C, $45, 0
  97. .)
  98.  
  99. FGETC.(
  100. JSR $FFCF
  101. PHP
  102. PHA
  103. BCC CARRY
  104. LDA #"c"
  105. JSR $FFD2
  106. PLA
  107. PHA
  108. CARRY
  109. JSR HEXOUT
  110. LDA #$20
  111. JSR $FFD2
  112. PLA
  113. PLP
  114. RTS
  115. .)
  116.  
  117. HEXOUT.(
  118. PHA
  119. LSR
  120. LSR
  121. LSR
  122. LSR
  123. JSR NIBOUT
  124. PLA
  125. NIBOUTAND #$0F
  126. CLC
  127. ADC #$30
  128. CMP #$3A
  129. BCC OK
  130. ADC #$41-$3A-1
  131. OKJMP $FFD2
  132. .)
  133.  
  134. ZALLOC.(
  135. CMP #$80; SAVE FROM $90 UPWARD = os, BELOW IS ONLY BASIC
  136. BCS END
  137. LDA #$10
  138. ENDRTS
  139. .)
  140.  
  141. ZFREE.(
  142. CLC
  143. RTS
  144. .)
  145.  
  146. #ENDIF
  147.  
  148. /**************************************************************************
  149.  * hERE IS THE REAL LOADER CODE
  150.  */
  151.  
  152. #INCLUDE "FILE.DEF"
  153.  
  154. #DEFINEe_nomem<-40
  155. #DEFINEe_fversion<-41
  156.  
  157. LOADER .(
  158. P1=SYSZP
  159. P2=SYSZP+2
  160. -SYSZP+=4
  161.  
  162. TMP=SYSMEM
  163. FILE=SYSMEM+1
  164. -SYSMEM+=2
  165. HEADER=SYSMEM
  166. -SYSMEM+=hdr_len
  167. TEXTB=SYSMEM; MEMORY BLOCK id
  168. TEXTA=SYSMEM+1; ADDRESS OF BLOCK
  169. TEXTL=SYSMEM+3; ADDRESS OF BLOCK
  170. TEXTD=SYSMEM+5; DIFFERENCE TO ASSEMBLE ADDRESS
  171. -SYSMEM+=7
  172. DATAB=SYSMEM
  173. DATAA=SYSMEM+1
  174. DATAL=SYSMEM+3
  175. DATAD=SYSMEM+5
  176. -SYSMEM+=7
  177. BSSB=SYSMEM
  178. BSSA=SYSMEM+1
  179. BSSD=SYSMEM+3
  180. -SYSMEM+=5
  181. ZEROA=SYSMEM
  182. ZEROD=SYSMEM+1
  183. -SYSMEM+=3
  184.  
  185. STX FILE
  186. JSR FGETC
  187. BCS END
  188. STA TMP
  189. JSR FGETC
  190. BCS END
  191. TAY
  192. LDA TMP
  193. CPY #0
  194. BNE RT
  195. CMP #1
  196. BEQ LOAD
  197. RT LDA #e_fversion; OK, BUT NOT THIS VERSION
  198. ENDSEC
  199. RTS
  200.  
  201. LOAD.(
  202. LDA #<HEADER
  203. STA P1
  204. LDA #>HEADER
  205. STA P1+1
  206. LDA #<hdr_len
  207. STA P1+2
  208. LDA #>hdr_len
  209. STA P1+3
  210.  
  211. LDX FILE
  212. LDA #<P1
  213. LDY #>P1
  214. JSR FGETB
  215. BCS END
  216.  
  217. ; HEADER LOADED, CHECK MAGIC AND VERSION
  218. LDA HEADER+hdr_magic
  219. CMP #$6F
  220. BNE END
  221. LDA HEADER+hdr_magic+1
  222. CMP #"6"
  223. BNE END
  224. LDA HEADER+hdr_magic+2
  225. CMP #"5"
  226. BNE END
  227. LDA HEADER+hdr_version
  228. CMP #0
  229. BNE END
  230. LDA HEADER+hdr_mode+1
  231. AND #%11110000
  232. BNE END
  233. ; NOW ALLOCATE BUFFERS
  234. LDA HEADER+hdr_tlen
  235. LDY HEADER+hdr_tlen+1
  236. STA TEXTL
  237. STY TEXTL+1
  238. JSR BALLOC
  239. STX TEXTB
  240. BCS NO_TEXT2
  241. JSR GETBADR
  242. STA TEXTA
  243. STY TEXTA+1
  244. SEC
  245. SBC HEADER+hdr_tbase
  246. STA TEXTD
  247. TYA
  248. SBC HEADER+hdr_tbase+1
  249. STA TEXTD+1
  250.  
  251. LDA HEADER+hdr_dlen
  252. LDY HEADER+hdr_dlen+1
  253. STA DATAL
  254. STY DATAL+1
  255. JSR BALLOC
  256. STX DATAB
  257. BCS NO_DATA2
  258. NO_TEXT2 BCS NO_TEXT1
  259. JSR GETBADR
  260. STA DATAA
  261. STY DATAA+1
  262. SEC
  263. SBC HEADER+hdr_dbase
  264. STA DATAD
  265. TYA
  266. SBC HEADER+hdr_dbase+1
  267. STA DATAD+1
  268.  
  269. LDA HEADER+hdr_blen
  270. LDY HEADER+hdr_blen+1
  271. JSR BALLOC
  272. STX BSSB
  273. BCS NO_BSS
  274. NO_TEXT1 BCS NO_TEXT
  275. NO_DATA2 BCS NO_DATA
  276. JSR GETBADR
  277. STA BSSA
  278. STY BSSA+1
  279. SEC
  280. SBC HEADER+hdr_bbase
  281. STA BSSD
  282. TYA
  283. SBC HEADER+hdr_bbase+1
  284. STA BSSD+1
  285.  
  286. LDA HEADER+hdr_zlen
  287. JSR ZALLOC
  288. BCS NO_ZERO
  289. STA ZEROA
  290. SEC
  291. SBC HEADER+hdr_zbase
  292. STA ZEROD
  293. LDA #0
  294. STA ZEROD+1
  295.  
  296. JMP DO_LOAD
  297.  
  298. &NO_FILE LDA ZEROA
  299. JSR ZFREE
  300. NO_ZERO LDX BSSB
  301. JSR BFREE
  302. NO_BSSLDX DATAB
  303. JSR BFREE
  304. NO_DATALDX TEXTB
  305. JSR BFREE
  306. NO_TEXTRTS
  307.  
  308. DO_LOAD; LOAD OPTIONS (I.E. IGNORE THEM NOW)
  309. JSR FGETC
  310. BCS NO_FILE
  311. CMP #0
  312. BEQ LOAD_TEXT
  313. TAY
  314. DEY
  315. OPTLJSR FGETC
  316. BCS NO_FILE
  317. DEY
  318. BNE OPTL
  319. BEQ DO_LOAD
  320.  
  321. LOAD_TEXT; LOAD TEXT SEGMENT
  322. LDX FILE
  323. LDA #<TEXTA
  324. LDY #>TEXTA
  325. JSR FGETB
  326. BCS NO_FILE
  327.  
  328. LDX FILE
  329. LDA #<DATAA
  330. LDY #>DATAA
  331. JSR FGETB
  332. BCS NO_FILE
  333. ; CHECK NUMBER OF UNDEFINED REFERENCES
  334. LDX FILE
  335. JSR FGETC
  336. &NO_FILE2 BCS NO_FILE
  337. CMP #0
  338. BNE NO_FILE; WE HAVE SOME -> NOT HANDLED
  339. LDX FILE
  340. JSR FGETC
  341. BCS NO_FILE
  342. CMP #0
  343. BNE NO_FILE
  344. ; OK, TEXT SEGMENTS LOADED, NOW RELOCATE
  345. LDA TEXTA
  346. SEC
  347. SBC #1
  348. STA P1
  349. LDA TEXTA+1
  350. SBC #0
  351. STA P1+1
  352. JSR TREL
  353.  
  354. LDA DATAA
  355. SEC
  356. SBC #1
  357. STA P1
  358. LDA DATAA+1
  359. SBC #0
  360. STA P1+1
  361. JSR TREL
  362.  
  363. LDA TEXTA; RETURN START OF TEXT SEGMENT
  364. LDY TEXTA+1
  365. CLC
  366. RTS
  367. .)
  368.  
  369. TREL.(
  370. LDX FILE
  371. JSR FGETC
  372. NO_FILE1 BCS NO_FILE2
  373. CMP #0
  374. BEQ RELOC_RTS
  375. CMP #255
  376. BNE T1
  377. LDA #254
  378. CLC
  379. ADC P1
  380. STA P1
  381. BCC TREL
  382. INC P1+1
  383. JMP TREL
  384. T1CLC
  385. ADC P1
  386. STA P1
  387. BCC T1A
  388. INC P1+1
  389. T1A; P1 IS THE RELOCATION ADDRESS
  390. LDX FILE
  391. JSR FGETC
  392. BCS NO_FILE1
  393. TAY
  394. AND #a_mask
  395. STA TMP
  396. TYA
  397. AND #a_fmask
  398. JSR GETRELDIFF
  399. LDY TMP
  400. CPY #a_adr
  401. BNE T2
  402.  
  403. LDY #0
  404. CLC
  405. ADC (P1),Y
  406. STA (P1),Y
  407. INY
  408. TXA
  409. ADC (P1),Y
  410. STA (P1),Y
  411. JMP TREL
  412. T2
  413. CPY #a_low
  414. BNE T3
  415. LDY #0
  416. CLC
  417. ADC (P1),Y
  418. STA (P1),Y
  419. JMP TREL
  420. T3
  421. CPY #a_high
  422. BNE TREL
  423. STA P2
  424. STX P2+1
  425. LDX FILE
  426. JSR FGETC
  427. CLC
  428. ADC P2; JUST GET THE CARRY BIT
  429. LDY #0
  430. LDA P2+1; RELOCATE HIGH BYTE
  431. ADC (P1),Y
  432. STA (P1),Y
  433. JMP TREL
  434.  
  435. RELOC_RTS
  436. CLC
  437. RTS
  438. .)
  439.  
  440. GETRELDIFF .(; COMPARING WITH seg_undef WOULD GIVE A WAY
  441. ; TO GET LABEL VALUE HERE FOR UNDEFINED REFS
  442. CMP #seg_text
  443. BNE NOTEXT
  444. LDA TEXTD
  445. LDX TEXTD+1
  446. RTS
  447. NOTEXTCMP #seg_data
  448. BNE NODATA
  449. LDA DATAD
  450. LDX DATAD+1
  451. RTS
  452. NODATACMP #seg_bss
  453. BNE NOBSS
  454. LDA BSSD
  455. LDX BSSD+1
  456. RTS
  457. NOBSSCMP #seg_zero
  458. BNE NOZERO
  459. LDA ZEROD
  460. LDX ZEROD+1
  461. NOZERORTS
  462. .)
  463.  
  464. .)
  465.  
  466. /**************************************************************************
  467.  * hERE COME THE SUPPORT ROUTINES
  468.  *
  469.  * FIRST IS A SIMPLE AND BASIC IMPLEMENTATION OF FGETB, JUST USING FGETC
  470.  */
  471.  
  472. FGETB.(
  473. P=SYSZP
  474. -SYSZP+=2
  475. FILE=SYSMEM
  476. L=SYSMEM+1
  477. -SYSMEM+=3
  478.  
  479. STX FILE; X=FILE, A=ZP-ADR OF ADDRESS, Y=ZP-ADR OF LEN
  480. STA P
  481. STY P+1
  482. LDY #3
  483. LDA (P),Y
  484. STA L+1
  485. DEY
  486. LDA (P),Y
  487. STA L
  488. DEY
  489. LDA (P),Y
  490. PHA
  491. DEY
  492. LDA (P),Y
  493. STA P
  494. PLA
  495. STA P+1
  496.  
  497. LOOPLDX FILE
  498. JSR FGETC; THIS IS A SIMPLE IMPLEMENTATION
  499. BCS END
  500. LDY #0
  501. STA (P),Y
  502. INC P
  503. BNE L0
  504. INC P+1
  505. L0
  506. LDA L
  507. BNE L1
  508. DEC L+1
  509. L1DEC L
  510.  
  511. LDA L
  512. ORA L+1
  513. BNE LOOP
  514. CLC
  515. END
  516. RTS
  517. .)
  518.  
  519. /**************************************************************************
  520.  * SUPPORT FOR MEMORY ALLOCATION
  521.  *
  522.  * tHESE ROUTINES ARE TAKEN FROM A PRELIMINARY slip IMPLEMENTATION, AS OF
  523.  * os/a65 VERSION 1.3.10B
  524.  */
  525.  
  526. #DEFINEmaxslot8
  527.  
  528. /**********************************************************************/
  529. /* nEW MEMORY MANAGEMENT FOR ip BUFFERS       */
  530. /* EXPORTS      */
  531. /* BINIT      */
  532. /* BALLOC, BFREE, BTRUNC, BSPLIT, BREALLOC      */
  533. /*GETBADR, GETBLEN      */
  534.  
  535. #DEFINEminbuf8
  536. #DEFINEminmask%11111000
  537.  
  538. .(
  539.  
  540. SLOTLADR =SYSMEM
  541. SLOTHADR =SYSMEM+maxslot
  542. SLOTLLEN =SYSMEM+maxslot*2
  543. SLOTHLEN =SYSMEM+maxslot*3
  544. -SYSMEM+=maxslot*4
  545.  
  546. FLIST =SYSMEM
  547. SLOT=SYSMEM+2
  548. -SYSMEM+=3
  549.  
  550. P=SYSZP
  551. P2=SYSZP+2
  552. P3=SYSZP+4
  553. P4=SYSZP+6
  554. -SYSZP+=8
  555.  
  556. /* INIT MEMORY MANAGEMENT */
  557. &BINIT.(
  558. STA P+1; HI BYTE STARTADRESS BUFFER
  559. STX P2+1; HI BYTE LENGTH OF BUFFER
  560.  
  561. LDA #0
  562. TAY
  563. L0STA SLOTLADR,Y
  564. STA SLOTHADR,Y
  565. INY
  566. CPY #maxslot
  567. BCC L0
  568.  
  569. STA P
  570. TAY
  571. STA (P),Y
  572. INY 
  573. STA (P),Y
  574. INY
  575. STA (P),Y
  576. INY
  577. LDA P2+1
  578. STA (P),Y
  579.  
  580. LDA P
  581. STA FLIST
  582. LDA P+1
  583. STA FLIST+1
  584.  
  585. CLC
  586. RTS
  587. .)
  588.  
  589. /* A/Y = SIZE OF BUFFER TO BE ALLOCATED -> X BUFFER-id */       
  590. &BALLOC.(
  591. /* WALK ALONG FREELIST, AND TAKE FIRST MATCHING BUFFER 
  592.    LENGTH IS MADE A MULTIPLE OF 8 (FOR FREELIST CONNECTORS */
  593.  
  594. PHA
  595. JSR GETBSLOT
  596. PLA
  597. BCC GOTSLOT
  598. LDA #e_nomem
  599. RTS
  600. GOTSLOT
  601. STX SLOT
  602.  
  603. ADC #minbuf-1
  604. AND #minmask
  605. STA SLOTLLEN,X
  606. TYA
  607. ADC #0
  608. STA SLOTHLEN,X
  609.  
  610. LDA #0
  611. STA P2
  612. STA P2+1
  613. LDA FLIST
  614. STA P
  615. LDA FLIST+1
  616. STA P+1
  617. L0
  618. LDY #2
  619. LDA (P),Y
  620. SEC
  621. SBC SLOTLLEN,X
  622. STA P3
  623. INY
  624. LDA (P),Y
  625. SBC SLOTHLEN,X
  626. STA P3+1
  627. BCS FOUND 
  628.  
  629. LDA P
  630. STA P2
  631. LDA P+1
  632. STA P2+1
  633. LDY #1
  634. LDA (P2),Y
  635. STA P+1
  636. DEY
  637. LDA (P2),Y
  638. STA P
  639. ORA P+1
  640. BNE L0
  641.  
  642. OOPSLDA #e_nomem
  643. SEC
  644. RTS
  645.  
  646. FOUND
  647. /* OK, WE FOUND A FREE BUFFER: P POINTS TO THE BUFFER, P2 TO THE
  648.    PREVIOUS ONE. P3 IS THE LENGTH OF THE FREE BUFFER MINUS THE
  649.    NEEDED SIZE. iF THE BUFFER IS LONGER THAN NEEDED, CREATE A 
  650.    NEW FREE BUFFER, THEN LINK NEW BUFFER TO FREELIST */
  651.  
  652. LDA P/* SAVE BUFFER ADDRESS */
  653. STA SLOTLADR,X
  654. LDA P+1
  655. STA SLOTHADR,X
  656.  
  657. LDA P3 /* CHECK LENGTH */
  658. ORA P3+1
  659. BEQ NOCREATE
  660.  
  661. LDA P/* GET ADDRESS OF NEW FREE BUFFER */
  662. CLC
  663. ADC SLOTLLEN,X
  664. STA P4
  665. LDA P+1
  666. ADC SLOTHLEN,X
  667. STA P4+1
  668.  
  669. LDY #0/* COPY NEXT POINTER */
  670. LDA (P),Y
  671. STA (P4),Y
  672. INY
  673. LDA (P),Y
  674. STA (P4),Y
  675.  
  676. INY/* SET NEW LENGTH */
  677. LDA SLOTLLEN,X
  678. STA (P),Y
  679. LDA P3
  680. STA (P4),Y
  681. INY
  682. LDA SLOTHLEN,X
  683. STA (P),Y
  684. LDA P3+1
  685. STA (P4),Y
  686.  
  687. LDA P4
  688. STA P
  689. LDA P4+1
  690. STA P+1
  691.  
  692. NOCREATE
  693. LDA P2
  694. ORA P2+1
  695. BEQ FREESTART
  696.  
  697. LDY #0
  698. LDA P
  699. STA (P2),Y
  700. INY
  701. LDA P+1
  702. STA (P2),Y
  703. CLC
  704. BCC GETA
  705. FREESTART
  706. LDA P
  707. STA FLIST
  708. LDA P+1
  709. STA FLIST+1
  710. CLC
  711. GETA
  712. LDA SLOTLADR,X
  713. LDY SLOTHADR,X
  714. RTS
  715. .)
  716.  
  717. /* FREE BUFFER (id=XR) */
  718. &BFREE.( 
  719. LDA SLOTHADR,X
  720. STA P3+1
  721. LDA SLOTLADR,X
  722. STA P3
  723. ORA P3+1
  724. BEQ END2
  725.  
  726. LDY #2
  727. LDA SLOTLLEN,X
  728. STA (P3),Y
  729. INY
  730. LDA SLOTHLEN,X
  731. STA (P3),Y
  732.  
  733. LDA #0
  734. STA SLOTHADR,X
  735. STA SLOTLADR,X
  736.  
  737. LDA FLIST
  738. ORA FLIST+1
  739. BNE OK/* NO FREE BUFFER SO FAR? */
  740.  
  741. LDA P3
  742. STA FLIST
  743. LDA P3+1
  744. STA FLIST+1
  745. LDY #0
  746. TYA
  747. STA (P3),Y
  748. INY
  749. STA (P3),Y
  750. END2CLC
  751. RTS
  752. OK
  753. LDA #0
  754. STA P2
  755. STA P2+1
  756. LDA FLIST
  757. STA P
  758. LDA FLIST+1
  759. STA P+1
  760.  
  761. /* WE HAVE TO FIND THE PLACE WHERE TO PUT THE BUFFER IN THE
  762.    ORDERED FREE LIST. tHEN WE HAVE TO CHECK IF WE CAN MERGE
  763.    FREE BUFFERS */
  764. LOOP
  765. LDA P3+1
  766. CMP P+1
  767. BCC FOUND
  768. BNE NEXT
  769. LDA P3
  770. CMP P
  771. BCC FOUND
  772. NEXT
  773. LDA P
  774. STA P2
  775. LDA P+1
  776. STA P2+1
  777. LDY #0
  778. LDA (P2),Y
  779. STA P
  780. INY
  781. LDA (P2),Y
  782. STA P+1
  783. ORA P
  784. BNE LOOP
  785. BEQ FOUND
  786. END
  787. CLC
  788. RTS
  789.  
  790. FOUND/* P2 IS THE BUFFER BEFORE THE ONE TO BE FREED, P THE ONE BEHIND.
  791.    P3 IS THE BUFFER TO BE INSERTED */
  792.  
  793. LDA P2
  794. ORA P2+1
  795. BNE FOK
  796. ; INSERT BEFORE THE FIRST FREE BUFFER SO FAR
  797. LDY #0
  798. LDA FLIST
  799. STA (P3),Y
  800. INY
  801. LDA FLIST+1
  802. STA (P3),Y
  803. LDA P3
  804. STA FLIST
  805. LDY P3+1
  806. STY FLIST+1
  807. JSR BMERGE
  808. CLC
  809. RTS
  810. FOK; INSERT TO LIST
  811. LDY #1
  812. LDA P+1;LDA (P2),Y
  813. STA (P3),Y
  814. DEY
  815. LDA P;LDA (P2),Y
  816. STA (P3),Y
  817. LDA P3
  818. STA (P2),Y
  819. INY
  820. LDA P3+1
  821. STA (P2),Y
  822.  
  823. LDA P3
  824. LDY P3+1
  825. JSR BMERGE
  826. LDA P2
  827. LDY P2+1
  828. JSR BMERGE
  829. CLC
  830. RTS
  831. .)
  832.  
  833. /* GET ADRESS OF BUFFER */
  834. &GETBADR .(
  835. LDA SLOTLADR,X
  836. LDY SLOTHADR,X
  837. CLC
  838. RTS
  839. .)
  840.  
  841. /* GET LENGTH OF BUFFER */
  842. &GETBLEN .(
  843. LDA SLOTLLEN,X
  844. LDY SLOTHLEN,X
  845. CLC
  846. RTS
  847. .)
  848.  
  849. /* GET FREE BUFFER-id SLOT */
  850. GETBSLOT .(
  851. LDX #0
  852. L0
  853. CLC
  854. LDA SLOTLADR,X
  855. ORA SLOTHADR,X
  856. BEQ FOUND
  857. INX
  858. CPX #maxslot
  859. BCC L0
  860. FOUND
  861. RTS
  862. .)
  863.  
  864. /* CHECK IF TWO BUFFERS (I.E. A/Y PLUS FOLLOWING) CAN BE MERGED */
  865. BMERGE.(
  866. STA P
  867. STY P+1
  868. LDY #2
  869. CLC
  870. LDA (P),Y
  871. ADC P
  872. STA P3
  873. INY
  874. LDA (P),Y
  875. ADC P+1
  876. STA P3+1
  877. LDY #0
  878. LDA (P),Y
  879. CMP P3
  880. BNE NOMERGE
  881. INY
  882. LDA (P),Y
  883. CMP P3+1
  884. BNE NOMERGE
  885. MERGE
  886. LDY #2
  887. CLC
  888. LDA (P3),Y
  889. ADC (P),Y
  890. STA (P),Y
  891. INY
  892. LDA (P3),Y
  893. ADC (P),Y
  894. STA (P),Y
  895. LDY #0
  896. LDA (P3),Y
  897. STA (P),Y
  898. INY
  899. LDA (P3),Y
  900. STA (P),Y
  901. NOMERGE
  902. CLC
  903. RTS
  904. .)
  905.  
  906. .)
  907.  
  908. prgend 
  909.  
  910.