home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / DYMA.SFX / dyma.asm next >
Encoding:
Assembly Source File  |  1990-02-12  |  26.5 KB  |  993 lines

  1.  
  2. * ├RAIG ┬RUCE'S ─YNAMIC ═EMORY ┴LLOCATION ROUTINES
  3. *  FROM ╔SSUE 2 OF ├= ╚ACKING ╬ET ═AGAZINE
  4. *
  5. * ╙UPPORT FOR ╥┴═2-7 ADDED BY ╥.╦NOP 92/05/23
  6.  
  7.          ─╙╦   "@0:DYMA.REL",8
  8.          ╥┼╠          ;╥ELATIVE LINKER FILE
  9.  
  10.          ╠╙╘   ╧╞╞
  11.          ╨╒╘   "ROBSEQUS.S",8
  12.          ╒╙┼   "ROBSMACS.S",8
  13.          ╠╙╘   ╧╬
  14.  
  15.  
  16. * ╟LOBAL DECLARATIONS:
  17.  
  18. * ┌╨1, ╘┼═╨1, AND ┌╫1 ARE IN ROBSEQUS.S
  19.  
  20. * ┌╨1   = $╞┴ ;┌ERO PAGE ╞AR ╨OINTER
  21. * ╘┼═╨1 = $╞─ ;╘EMP ╙TORAGE
  22. * ┌╫1   = $╞┼ ;┌ERO PAGE WORD
  23.  
  24. ╙┘╙╫╧╥╦  =     $80    ;16 BYTE BLOCK
  25.  
  26. ├╧═├╧─┼  =     $200   ;─┘═┴ COMMON CODE GOES HERE
  27. ╫╧╥╦┬╒╞  =     $┬00
  28.  
  29. ┬╦╙┘╙    =     $0┼    ;╥┴═╚┴╠╞ ══╒ CONFIGURATION
  30. ┬╦╦┼╥╬┼╠ =     $00    ;┬ANK 15
  31. ┬╦╙┼╠┼├╘ =     ══╒├╥
  32. ┬╦╙┼╠╥0  =     $╞╞01  ;╥┴═0 ╠OAD CONFIG REG.
  33. ┬╦╙┼╠╥1  =     $╞╞02  ;╥┴═1  "    "     "
  34. ╠─├╞╥1   =     $─502  ;╠OAD CONFIG. REGISTER FOR ╥┴═1
  35.  
  36. ┬╦╥┴═0   =     $3╞    ;╥┴═0
  37. ┬╦╥┴═1   =     $7╞    ;CONSTANT NO LONGER USED
  38.  
  39. *-------------------------------
  40. * ─YNAMIC ═EMORY BANKS ARE ORGAINZED AS FOLLOWS:
  41. *  $00 - $?? = ╥┼╒ BANKS
  42. *  $┼╞ - $╞┼ = ╔NTERNAL BANKS (UP TO 1 ═EG (EVENTUALLY...))
  43. *  $╞╞       = ╬╒╠╠
  44.  
  45. ┬╦┼╪╨0   =     $00    ;─┘═┴ BANK # FOR ╥┼╒ BANK 0
  46. ┬╦╔╬╘0   =     $┼╞    ;─┘═┴ BANK # FOR INTERNAL ╥┴═0
  47. ┬╦╬╒╠╠   =     $╞╞    ;─┘═┴ NULL BANK
  48. *-------------------------------
  49.  
  50. ┌╨╙┼╠┼├╘ =     $─507  ;┌ERO PAGE POINTER
  51. * ══╒╥├╥ = $─506 ;(╔N ROBSEQUS.S)
  52. ╥┼╒      =     $─╞00  ;─═┴ ACCESS REGISTER
  53. ╓╔├      =     $─000  ;╓╔├ REGISTERS
  54.  
  55. * ┼RORR RETURNS:
  56.  
  57. ╔╬╙╒╞═┼═ =     1      ;┼RROR INSUFFICIENT MEMORY
  58.  
  59. *-------------------------------
  60.  
  61. * ─┘═┴ JUMP TABLE
  62.  
  63. ╙╘┴╥╘╒╨  ┼╬╘
  64.          ╩═╨   ╔╙╘┴╥╘╒╨
  65. ╙╚╒╘─╧╫╬ ┼╬╘
  66.          ╩═╨   ╔╙╚╒╘─╫╬
  67. ┌╨╠╧┴─   ┼╬╘
  68.          ╩═╨   ╔┌╨╠╧┴─
  69. ┌╨╙╘╧╥┼  ┼╬╘
  70.          ╩═╨   ╔┌╨╙╘╧╥┼
  71. ╞┼╘├╚    ┼╬╘
  72.          ╩═╨   ╔╞┼╘├╚
  73. ╙╘┴╙╚    ┼╬╘
  74.          ╩═╨   ╔╙╘┴╙╚
  75. ═┴╠╠╧├   ┼╬╘
  76.          ╩═╨   ╔┴╠╠╧├
  77. ╞╥┼┼     ┼╬╘
  78.          ╩═╨   ╔╞╥┼┼
  79.  
  80. * ╙OME VARIABLE STORAGE:
  81.  
  82. ┼╥╥╬╧    ┼╬╘
  83.          ╚┼╪   00     ;┼RROR CODE FOR EXIT WITH ├ SET
  84. ╬┼╪╨┬╬╦  ┼╬╘
  85.          ╚┼╪   00     ;╬UMBER OF EXPANSION BANKS
  86. ╥┼╒╠╔═╔╘ ┼╬╘
  87.          ╚┼╪   7╞     ;═AX # ╥┼╒ BANKS TO SEARCH
  88. ╬╔╬╘┬╬╦  ┼╬╘
  89.          ╚┼╪   00     ;╬UMBER OF INTERNAL BANKS
  90. ╔╬╘╠╔═╔╘ ┼╬╘
  91.          ╚┼╪   08     ;═AX # INTERNAL BANKS TO SEARCH
  92. ═┴╠╠╧├╚─ ┼╬╘
  93.          ╚┼╪   000000 ;╚EADER POINTER TO FREE MEMORY LIST
  94. ╞╥┼┼═┼═  ┼╬╘
  95.          ╚┼╪   000000 ;╬UMBER OF BYTES FREE IN SYSTEM
  96. ╙╘┴╥╘╨╟0 ┼╬╘
  97.          ╚┼╪   40     ;╙TART PAGE FOR ╥┴═0
  98. ╙╘┴╥╘╨╟1 ┼╬╘
  99.          ╚┼╪   04     ;╙TART PAGE FOR ╥┴═ 1-7
  100. ╥┴═1╠┼╬  ┼╬╘
  101.          ╚┼╪   ╞┬     ;256-1-$04 = # PAGES FREE IN ╥┴═ 1-7
  102.  
  103.  
  104.  
  105. ┴╬─╫─506 ╚┼╪   00     ;╓ALUE ┴╬─ED WITH $─506 TO SET INTERNAL BANK
  106.  
  107. ********************************
  108. * ╙╘┴╥╘╒╨ - STARS UP ─┘═┴ ROUTINES.
  109. ********************************
  110. ╔╙╘┴╥╘╒╨ ╠─┴   #$00
  111.          ╨╚┴          ;├LEAR STATUS REG. IN CASE
  112.          ╨╠╨          ;─ECIMAL OR ╔╥╤ SET
  113.          ╠─┴   #┬╦╙┘╙
  114.          ╙╘┴   ┬╦╙┼╠┼├╘
  115.          ╩╙╥   ╔╬╙╘├╧══ ;╔NSTALL THE COMMON CODE
  116.          ╩╙╥   ╙╬╔╞╞╥┼╒ ;╞IGURE # EXPANSION BANKS AVAIL.
  117.          ╩╙╥   ╙╬╔╞╞╔╬╘ ;╞IGURE # INTERNAL BANKS AVAIL.
  118.          ╩╙╥   ╔╬╔╘─┘╬═ ;╔NIT DYNAMIC MEMORY
  119.          ╥╘╙
  120.  
  121. ********************************
  122. * ╙╚╒╘─╧╫╬ - ╞ILL ┬┴╙╔├ COMMAND LINE BUFFER
  123. *   WITH ZEROS TO AVOID ╙YNTAX ┼RROR
  124. ********************************
  125. ╔╙╚╒╘─╫╬ ╠─╪   #$00
  126.          ╠─┴   #$00
  127. ]╠10     ╙╘┴   $200,╪
  128.          ╔╬╪
  129.          ├╨╪   #├╧═┼╬─-├╧═╙╘┴╥╘
  130.          ┬╬┼   ]╠10
  131.          ╠─┴   #┬╦╦┼╥╬┼╠
  132.          ╙╘┴   ┬╦╙┼╠┼├╘
  133.          ╥╘╙
  134.  
  135. ********************************
  136. * ╔NSTALL ├OMMON ├ODE
  137. ********************************
  138. ╔╬╙╘├╧══ ╠─╪   #$00
  139. ]╠10     ╠─┴   ├╧═╙╘┴╥╘,╪
  140.          ╙╘┴   ├╧═├╧─┼,╪
  141.          ╔╬╪
  142.          ├╨╪   #├╧═┼╬─-├╧═╙╘┴╥╘
  143.          ┬├├   ]╠10
  144.          ╥╘╙
  145.  
  146. ********************************
  147. ********************************
  148. * ├OMMON CODE - IS RELOACTED TO ├╧═├╧─┼ ($200)
  149. ********************************
  150.  
  151. ├╧═╙╘┴╥╘
  152. ├╧═┌╨╠─  ╠─┴   ┌╨1+2  ;├OMMON ┌╨ LOAD
  153.          ╩╙╥   ╙┼╘╔╬╘┬╦-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╙ET BANK
  154.          ╙╘┘   ╘┼═╨1  ;╙AVE AMT TO GET
  155.          ╠─┘   #$00
  156. ]╠10     ╠─┴   (┌╨1),┘ ;├OPY THE MEMORY
  157.          ╙╘┴   $00,╪
  158.          ╔╬╪
  159.          ╔╬┘
  160.          ├╨┘   ╘┼═╨1  ;╟OT IT ALL?
  161.          ┬├├   ]╠10
  162.          ╠─┴   #┬╦╙┘╙ ;╥ESTORE SYSTEM BANK
  163.          ╙╘┴   ┬╦╙┼╠┼├╘
  164.          ╥╘╙
  165.  
  166. ├╧═┌╨╙╘╧ ╠─┴   ┌╨1+2  ;├OMMON ┌╨ ╙TORE
  167.          ╩╙╥   ╙┼╘╔╬╘┬╦-├╧═╙╘┴╥╘+├╧═├╧─┼
  168.          ╙╘┘   ╘┼═╨1
  169.          ╠─┘   #$00
  170. ]╠10     ╠─┴   $00,╪
  171.          ╙╘┴   (┌╨1),┘
  172.          ╔╬╪
  173.          ╔╬┘
  174.          ├╨┘   ╘┼═╨1
  175.          ┬├├   ]╠10
  176.          ╠─┴   #┬╦╙┘╙
  177.          ╙╘┴   ┬╦╙┼╠┼├╘
  178.          ╥╘╙
  179.  
  180. *===============================
  181. * ├OPY ╥┴═(1-7) TO ╥┴═0 # OF BYTES IN ┘;
  182. *   IF ┘=0, COPY 256 BYTES
  183.  
  184. ├╨╥1╘╧╥0 ─┼┘          ;0 = TRANSFER 256 BYTES
  185.          ┬┼╤   :╠20   ;╔F 1, JUST DO THE LAST XFER
  186. ]╠10     ╙╘┴   ┬╦╙┼╠╥1 ;├OPY THE FIRST 1-255 BYTES...
  187.          ╠─┴   (┌╨1),┘
  188.          ╙╘┴   ┬╦╙┼╠╥0
  189.          ╙╘┴   (┌╫1),┘
  190.          ─┼┘
  191.          ┬╬┼   ]╠10
  192. :╠20     ╙╘┴   ┬╦╙┼╠╥1 ;...AND DO ONE MORE BYTE
  193.          ╠─┴   (┌╨1),┘
  194.          ╙╘┴   ┬╦╙┼╠╥0
  195.          ╙╘┴   (┌╫1),┘
  196.          ╠─┴   #┬╦╙┘╙
  197.          ╙╘┴   ┬╦╙┼╠┼├╘
  198.          ╥╘╙
  199.  
  200. * VICE VERSA
  201.  
  202. ├╨╥0╘╧╥1 ─┼┘
  203.          ┬┼╤   :╠20
  204. ]╠10     ╙╘┴   ┬╦╙┼╠╥0
  205.          ╠─┴   (┌╫1),┘
  206.          ╙╘┴   ┬╦╙┼╠╥1
  207.          ╙╘┴   (┌╨1),┘
  208.          ─┼┘
  209.          ┬╬┼   ]╠10
  210. :╠20     ╙╘┴   ┬╦╙┼╠╥0
  211.          ╠─┴   (┌╫1),┘
  212.          ╙╘┴   ┬╦╙┼╠╥1
  213.          ╙╘┴   (┌╨1),┘
  214.          ╠─┴   #┬╦╙┘╙
  215.          ╙╘┴   ┬╦╙┼╠┼├╘
  216.          ╥╘╙
  217.  
  218. ╙┼╘╔╬╘┬╦ ╙╘╪   ╘┼═╨1  ;╙AVE X DURING THE PROCEEDINGS
  219.          ╙╒┬   #┬╦╔╬╘0 ;┴ HAS DYMA BANK #
  220.          ╘┴╪
  221.          ╠─┴   ══╒╥├╥
  222.          ┴╬─   ┴╬─╫─506
  223.          ╧╥┴   ─506╘┴┬,╪
  224.          ╙╘┴   ══╒╥├╥ ;╙ET ══╒╥├╥ TO GET RIGHT ╥┴═ BANK
  225.          ╠─┴   ├╥╘┴┬,╪
  226.          ╙╘┴   ┬╦╙┼╠┼├╘ ;╙ET ══╒├╥ TO APPROPRIATE BANK
  227.          ╠─╪   ╘┼═╨1  ;╥ESTORE ╪
  228.          ╥╘╙
  229.  
  230. ├╧═┼╬─
  231.  
  232. ─506╘┴┬  ╚┼╪   00,00,00,00,10,10,20,20
  233. ├╥╘┴┬    ╚┼╪   3╞,7╞,┬╞,╞╞,┬╞,╞╞,┬╞,╞╞
  234.  
  235.  
  236. ********************************
  237. * ┼ND OF ├OMMON ├ODE
  238. *  (WELL, ╧╦, THE TABLES AREN'T IN ├OMMON ╥┴═)
  239. ********************************
  240. ********************************
  241.  
  242. ********************************
  243. * ┌ERO PAGE LOAD ROUTINE
  244. *  ╬╧╘┼: FOR ─═┴ TO ZERO PAGE, WE HAVE
  245. *   TO READ THE PAGE FROM THE ══╒ REGISTER
  246. *   $D507, SINCE ─═┴'S IGNORE THE ══╒
  247. *   ZERO PAGE REGISTERS!
  248. ********************************
  249. ╔┌╨╠╧┴─  ╠─┴   ┌╨1+2
  250.          ├═╨   #┬╦╔╬╘0 ;╔S IT A ╥┼╒ BANK?
  251.          ┬├├   :╠10
  252.          ╩═╨   ├╧═┌╨╠─-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╔F INTERNAL, GO TO COMM. ROUT.
  253. :╠10     ╙╘┘   ╥┼╒+7  ;┬YTES TO TRANSFER LOW
  254.          ╠─┘   #$91   ;├ODE TO READ FROM ╥┼╒
  255. ┌╨╥┼╒╧╨  ╙╘┴   ╥┼╒+6  ;╥┼╒ BANK
  256.          ╙╘╪   ╥┼╒+2  ;╙YS ADDR. LOW
  257.          ╠─┴   ┌╨╙┼╠┼├╘
  258.          ╙╘┴   ╥┼╒+3  ;╙YS ADDR. HIGH
  259.          ╠─┴   ┌╨1
  260.          ╙╘┴   ╥┼╒+4  ;╥┼╒ ADDR. LOW
  261.          ╠─┴   ┌╨1+1
  262.          ╙╘┴   ╥┼╒+5  ;╥┼╒ ADDR. HIGH
  263.          ╠─┴   #$00
  264.          ╙╘┴   ╥┼╒+8  ;├OUNT HIGH
  265.          ╠─┴   ╓╔├+$30 ;╨UT SYSTEM CLOCK IN ╙╠╧╫ FOR TRANSFER-
  266.          ╠─╪   #$00   ; THIS IS NECESSARY!
  267.          ╙╘╪   ╓╔├+$30
  268.          ╙╘┘   ╥┼╒+1  ;─O THE COMMAND- STO/LOAD, DEP. ON ┘
  269.          ╙╘┴   ╓╔├+$30
  270.          ╥╘╙
  271.  
  272. ********************************
  273. * ┌╨╙╘╧╥┼ -- USE SAME CODE FOR ╥┼╒ OP AS ┌╨╠╧┴─,
  274. *  ONLY MAKE THE DIRECTION DIFFERENT
  275. ********************************
  276. ╔┌╨╙╘╧╥┼ ╠─┴   ┌╨1+2
  277.          ├═╨   #┬╦╔╬╘0 ;╔S IT AN ╥┼╒ BANK?
  278.          ┬├├   :╠10
  279.          ╩═╨   ├╧═┌╨╙╘╧-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╔F INTERNAL, DO COMM.
  280. :╠10     ╙╘┘   ╥┼╒+7
  281.          ╠─┘   #$90   ;CODE TO STORE TO ╥┼╒
  282.          ╩═╨   ┌╨╥┼╒╧╨
  283.  
  284. ********************************
  285. * ╞┼╘├╚
  286. ********************************
  287. ╞┼╘├╚╠┼╬ =     ╙┘╙╫╧╥╦
  288. ╞┼╘╙╓╙╥├ =     ╙┘╙╫╧╥╦+2 ;╞ETCH SAVE SOURCE
  289. ╞┼╘╙╓─╙╘ =     ╙┘╙╫╧╥╦+3 ;╞ETCH SAVE DEST
  290.  
  291. ╔╞┼╘├╚   ╠─╪   ┌╨1+2
  292.          ├╨╪   #┬╦╔╬╘0 ;╔S IT AN INTERNAL BANK
  293.          ┬├╙   :╠10
  294.          ╠─╪   #$91   ;╥EAD FROM ╥┼╒ COMMAND
  295.          ╩═╨   ─╧╥┼╒
  296. :╠10     ├╨┘   #$00
  297.          ┬╬┼   ╞┼╘╠╧╬╟ ;╔F >1 PAGE, DO LONG FETCH CODE
  298.          ╘┴┘
  299.          ┬╬┼   ╞┼╘╨┴╟┼ ;╧THERWISE, DO PAGE FETCH
  300.          ╥╘╙
  301.  
  302. ********************************
  303. * ╞ETCH ╨AGE -> .╪ HAS BANK CONFIG TO FETCH!
  304. ********************************
  305. ╞┼╘╨┴╟┼  ├╨╪   #┬╦╔╬╘0
  306.          ┬┼╤   :╠10   ;╔S THE BANK ╥┴═0?
  307.          ╠─┴   ══╒╥├╥ ;╔F NOT, SET UP ══╒╥├╥ AND
  308.          ┴╬─   ┴╬─╫─506 ; THE $D502 LOAD CONFIG. REGISTER
  309.          ╧╥┴   ─506╘┴┬-┬╦╔╬╘0,╪ ;FOR COPYING FROM WHATEVER BANK
  310.          ╙╘┴   ══╒╥├╥
  311.          ╠─┴   ├╥╘┴┬-┬╦╔╬╘0,╪
  312.          ╙╘┴   ╠─├╞╥1
  313.          ╩═╨   ├╨╥1╘╧╥0-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╟O TO COMMON CODE
  314. :╠10     ╠─╪   #┬╦╥┴═0
  315.          ╙╘╪   ┬╦╙┼╠┼├╘ ;╙WAP IN ╥┴═0
  316.          ─┼┘          ;├OPY THE <= PAGE
  317.          ┬┼╤   :╠30
  318. ]╠20     ╠─┴   (┌╨1),┘
  319.          ╙╘┴   (┌╫1),┘
  320.          ─┼┘
  321.          ┬╬┼   ]╠20
  322. :╠30     ╠─┴   (┌╨1),┘
  323.          ╙╘┴   (┌╫1),┘
  324.          ╠─┴   #┬╦╙┘╙ ;╥ESTORE SYSTEM BANK
  325.          ╙╘┴   ┬╦╙┼╠┼├╘
  326.          ╥╘╙
  327.  
  328. ********************************
  329. * ╞ETCH >1 PAGE
  330. ********************************
  331. ╞┼╘╠╧╬╟  ╙╘┴   ╞┼╘├╚╠┼╬
  332.          ╙╘┘   ╞┼╘├╚╠┼╬+1
  333.          ╠─┴   ┌╨1+1  ;╙AVE ┌╨ SO WE CAN MESS W/IT
  334.          ╙╘┴   ╞┼╘╙╓╙╥├
  335.          ╠─┴   ┌╫1+1  ;DITTO FOR ┌╫
  336.          ╙╘┴   ╞┼╘╙╓─╙╘
  337.          ╠─┴   ╞┼╘├╚╠┼╬+1
  338.          ┬┼╤   ╞┼╘╠╬╟┼╪ ;╞ETCH╠ONG┼XIT
  339. ]╠10     ╠─╪   ┌╨1+2  ;├OPY A PAGE AT A TIME
  340.          ╠─┘   #$00   ;┘=0 MEANS COPY 256 BYTES
  341.          ╩╙╥   ╞┼╘╨┴╟┼
  342.          ╔╬├   ┌╨1+1
  343.          ╔╬├   ┌╫1+1
  344.          ─┼├   ╞┼╘├╚╠┼╬+1
  345.          ┬╬┼   ]╠10
  346.  
  347. ╞┼╘╠╬╟┼╪ ╠─┘   ╞┼╘├╚╠┼╬ ;╟ETS LAST <256 BYTES
  348.          ┬┼╤   :╠10
  349.          ╠─╪   ┌╨1+2
  350.          ╩╙╥   ╞┼╘╨┴╟┼
  351. :╠10     ╠─┴   ╞┼╘╙╓╙╥├ ;╥ESTORE ZP,SW
  352.          ╙╘┴   ┌╨1+1
  353.          ╠─┴   ╞┼╘╙╓─╙╘
  354.          ╙╘┴   ┌╫1+1
  355.          ╥╘╙
  356.  
  357. ********************************
  358. * ╙╘┴╙╚ => MUCH LIKE FETCH
  359. ********************************
  360. ╙╘┴╠┼╬   =     ╙┘╙╫╧╥╦
  361. ╙╘┴╙╓╙╥├ =     ╙┘╙╫╧╥╦+2
  362. ╙╘┴╙╓─╙╘ =     ╙┘╙╫╧╥╦+3
  363.  
  364. ╔╙╘┴╙╚   ╠─╪   ┌╨1+2
  365.          ├╨╪   #┬╦╔╬╘0 ;├HECK FOR INTERNAL BANK
  366.          ┬├╙   :╠10
  367.          ╠─╪   #$90   ;╫RITE TO ╥┼╒ COMMAND
  368.          ╩═╨   ─╧╥┼╒
  369. :╠10     ├╨┘   #$00
  370.          ┬╬┼   ╙╘┴╠╧╬╟
  371.          ╘┴┘
  372.          ┬╬┼   ╙╘┴╨┴╟┼
  373.          ╥╘╙
  374.  
  375. ********************************
  376. * ╙TASH PAGE -> ╪ HAS CONFIG TO STASH TO
  377. ********************************
  378.  
  379. ╙╘┴╨┴╟┼  ├╨╪   #┬╦╔╬╘0
  380.          ┬┼╤   :╠10
  381.          ╠─┴   ══╒╥├╥
  382.          ┴╬─   ┴╬─╫─506
  383.          ╧╥┴   ─506╘┴┬-┬╦╔╬╘0,╪
  384.          ╙╘┴   ══╒╥├╥
  385.          ╠─┴   ├╥╘┴┬-┬╦╔╬╘0,╪
  386.          ╙╘┴   ╠─├╞╥1
  387.          ╩═╨   ├╨╥0╘╧╥1-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╔F NOT ╥┴═0, DO COMMON
  388. :╠10     ╠─╪   #┬╦╥┴═0
  389.          ╙╘╪   ┬╦╙┼╠┼├╘
  390.          ─┼┘
  391.          ┬┼╤   :╠30
  392. ]╠20     ╠─┴   (┌╫1),┘
  393.          ╙╘┴   (┌╨1),┘
  394.          ─┼┘
  395.          ┬╬┼   ]╠20
  396. :╠30     ╠─┴   (┌╫1),┘
  397.          ╙╘┴   (┌╨1),┘
  398.          ╠─┴   #┬╦╙┘╙
  399.          ╙╘┴   ┬╦╙┼╠┼├╘
  400.          ╥╘╙
  401.  
  402. ********************************
  403. * ╙TASH >1 PAGE
  404. ********************************
  405.  
  406. ╙╘┴╠╧╬╟  ╙╘┴   ╙╘┴╠┼╬
  407.          ╙╘┘   ╙╘┴╠┼╬+1
  408.          ╠─┴   ┌╫1+1
  409.          ╙╘┴   ╙╘┴╙╓╙╥├
  410.          ╠─┴   ┌╨1+1
  411.          ╙╘┴   ╙╘┴╙╓─╙╘
  412.          ╠─┴   ╙╘┴╠┼╬+1
  413.          ┬┼╤   ╙╘┴╠╬╟┼╪
  414. ]╠10     ╠─╪   ┌╨1+2  ;┴GAIN, COPY A PAGE @ A TIME
  415.          ╠─┘   #0
  416.          ╩╙╥   ╙╘┴╨┴╟┼
  417.          ╔╬├   ┌╨1+1
  418.          ╔╬├   ┌╫1+1
  419.          ─┼├   ╙╘┴╠┼╬+1
  420.          ┬╬┼   ]╠10
  421.  
  422. ╙╘┴╠╬╟┼╪ ╠─┘   ╙╘┴╠┼╬
  423.          ┬┼╤   :╠10
  424.          ╠─╪   ┌╨1+2
  425.          ╩╙╥   ╙╘┴╨┴╟┼
  426. :╠10     ╠─┴   ╙╘┴╙╓╙╥├
  427.          ╙╘┴   ┌╫1+1
  428.          ╠─┴   ╙╘┴╙╓─╙╘
  429.          ╙╘┴   ┌╨1+1
  430.          ╥╘╙
  431.  
  432. ********************************
  433. ********************************
  434. * ╥┴═0 LOAD(╪=$91) / STORE(╪=$90)
  435. *   EXPN. MEMORY [ZP1] <--> (ZW1) FOR .┴┘ BYTES
  436. ********************************
  437. ─╧╥┼╒    ╙╘┴   ╥┼╒+7  ;┬YTES TO TRANSFER (LOW)
  438.          ╙╘┘   ╥┼╒+8  ;┬YTES TO TRANSFER (HIGH)
  439.          ╠─┴   ┌╫1
  440.          ╠─┘   ┌╫1+1
  441.          ╙╘┴   ╥┼╒+2  ;╙YSTEM ADDR (LOW)
  442.          ╙╘┘   ╥┼╒+3  ;╙YSTEM ADDR (HIGH)
  443.          ╠─┴   ┌╨1
  444.          ╠─┘   ┌╨1+1
  445.          ╙╘┴   ╥┼╒+4  ;╥┼╒ ADDR (LOW)
  446.          ╙╘┘   ╥┼╒+5  ;╥┼╒ ADDR (HIGH)
  447.          ╠─┴   ┌╨1+2
  448.          ╙╒┬   #┬╦┼╪╨0 ;╙UBTRACT ╥┼╒ BANK 0 FROM DYMA BANK NUMBER
  449.          ╙╘┴   ╥┼╒+6  ; TO GET THE EXPANSION BANK NUMBER
  450.          ╠─┘   ╓╔├+$30
  451.          ╠─┴   #$00
  452.          ╙╘┴   ╓╔├+$30
  453.          ╙╘╪   ╥┼╒+1
  454.          ╙╘┘   ╓╔├+$30
  455.          ╥╘╙
  456.  
  457. ********************************
  458. *-------------------------------
  459. ********************************
  460. * ╙NIFF╥┼╒ -- DETERMINE NUMBER OF BANKS OF EXP. MEMORY
  461. ********************************
  462.  
  463. ╙╬╞╞╫╥╦1 =     ╙┘╙╫╧╥╦ ;╙TRING TO STORE TO 1ST 4 BYTES OF EACH BANK
  464. ╙╬╞╞╫╥╦2 =     ╙┘╙╫╧╥╦+4 ;╙TRING READ BACK TO SEE IF BANK IS THERE
  465.  
  466. ╙╬╔╞╞╥┼╒ ╠─┴   #┬╦╥┴═0
  467.          ╙╘┴   ┬╦╙┼╠┼├╘ ;╙AVE ╥┴═ "BENEATH" ╥┼╒
  468.          ╠─╪   #$0┴   ; REGISTERS IN CASE THERE
  469. ]╠10     ╠─┴   ╥┼╒,╪  ; IS NO ╥┼╒
  470.          ╙╘┴   ╫╧╥╦┬╒╞,╪
  471.          ─┼╪
  472.          ┬╨╠   ]╠10
  473.          ╠─┴   #┬╦╙┘╙
  474.          ╙╘┴   ┬╦╙┼╠┼├╘
  475.  
  476.          ╠─┴   #$00   ;╔NITIALIZE CONFIG. ╥┼╒ CONTROLLER REGS
  477.          ╙╘┴   ╥┼╒+$9 ;╔NTERRUPT MASK REG
  478.          ╙╘┴   ╥┼╒+$┴ ;┴DDRESS CONTROL REG
  479.          ╠─┴   ╥┼╒+$0 ;╙TATUS REG
  480.  
  481.          ╠─╪   #2     ;COPY 3 BYTE TAG + BANK NUMBER
  482. ]╠20     ╠─┴   ┼╪╨╥┴═╔─,╪
  483.          ╙╘┴   ╙╬╞╞╫╥╦1,╪
  484.          ─┼╪
  485.          ┬╨╠   ]╠20
  486.  
  487.          ╠─┴   #0     ;╙TART COPYING EXP BANKS @ ZERO
  488.          ╙╘┴   ╬┼╪╨┬╬╦
  489.          ╠─┴   #$00
  490.          ╠─╪   #┬╦┼╪╨0
  491.          ╙╘┴   ┌╨1
  492.          ╙╘┴   ┌╨1+1
  493.          ╙╘╪   ┌╨1+2  ;╨OINT ┌╨1 TO FIRST BYTE OF FIRST EXP BANK
  494.  
  495. ]╠30     ╩╙╥   ╘╙╘┼╪┬╬╦ ;═AIN LOOP TO TEST FOR ╥┼╒ BANK ╧╦
  496.          ┬├╙   :╠40   ;├ARRY SET = WE'RE DONE
  497.          ╔╬├   ╬┼╪╨┬╬╦ ;╧THERWISE, COUNT THIS BANK...
  498.          ╔╬├   ┌╨1+2  ;AND LOOK @ NEXT
  499.          ┬╬┼   ]╠30
  500. :╠40     ╠─┴   ╬┼╪╨┬╬╦
  501.          ┬╬┼   :╠50
  502.  
  503.          ╠─┴   #┬╦╥┴═0 ;╬╧ ╥┼╒ ┬┴╬╦╙ - SO ╥ESTORE
  504.          ╙╘┴   ┬╦╙┼╠┼├╘ ; ╥┴═ WHERE ╥┼╒ REGS WOULD BE
  505.          ╠─╪   #$0┴
  506. ]╠45     ╠─┴   ╫╧╥╦┬╒╞,╪
  507.          ╙╘┴   ╥┼╒,╪
  508.          ─┼╪
  509.          ┬╨╠   ]╠45
  510.          ╠─┴   #┬╦╙┘╙
  511.          ╙╘┴   ┬╦╙┼╠┼├╘
  512. :╠50     ╥╘╙          ;─ONE
  513.  
  514. *-------------------------------
  515. ╘╙╘┼╪┬╬╦ ╠─┴   ╬┼╪╨┬╬╦ ;═AKE SURE NOT PAST ╥┼╒╠╔═╔╘ BANKS!
  516.          ├═╨   ╥┼╒╠╔═╔╘
  517.          ┬├├   :╠10
  518.          ╥╘╙
  519. :╠10     ╠─┴   ┌╨1+2
  520.          ╙╘┴   ╙╬╞╞╫╥╦1+3 ;├OPY BANK # TO END OF TEST STRING
  521.          ╠─╪   #╙╬╞╞╫╥╦1
  522.          ╠─┘   #$04
  523.          ╩╙╥   ┌╨╙╘╧╥┼ ;╙TORE THE TEST PATTER TO REU @ [ZP1]
  524.          ╩╙╥   ╔╘┼╙╘┼╪╨ ;╘EST┼XP┬ANK╔NTERNAL
  525.          ┬├╙   :╠20
  526.          ╠─┴   ┌╨1+2
  527.          ╨╚┴
  528.          ╠─┴   #┬╦┼╪╨0 ;├HECK 0TH EXPANSION BANK FOR WRAPAROUND
  529.          ╙╘┴   ┌╨1+2
  530.          ╙╘┴   ╙╬╞╞╫╥╦1+3 ;AND PUT 0TH EXPANSION BANK # IN TEST STRING
  531.          ╩╙╥   ╔╘┼╙╘┼╪╨
  532.          ╨╠┴
  533.          ╙╘┴   ┌╨1+2
  534. :╠20     ╥╘╙
  535.  
  536. ╔╘┼╙╘┼╪╨ ╠─┴   #$00   ;├HECK TEST PATTER IN ╥┼╒ VS. ╙╬╞╞╫╥╦1
  537.          ╙╘┴   ╙╬╞╞╫╥╦2
  538.          ╙╘┴   ╙╬╞╞╫╥╦2+3 ;┌ERO (PARTS OF) DEST TEST STRING TO START
  539.          ╠─╪   #╙╬╞╞╫╥╦2
  540.          ╠─┘   #$04
  541.          ╩╙╥   ┌╨╠╧┴─ ;╠OAD FROM ╥┼╒ TO ╙╬╞╞╫╥╦2
  542.          ╠─╪   #$03
  543. ]╠10     ╠─┴   ╙╬╞╞╫╥╦2,╪ ;├HECK IF ╙╬╞╞╫╥╦2=╙╬╞╞╫╥╦1
  544.          ├═╨   ╙╬╞╞╫╥╦1,╪
  545.          ┬╬┼   :╠20
  546.          ─┼╪
  547.          ┬╨╠   ]╠10
  548.          ├╠├          ;┼QUAL
  549.          ╥╘╙
  550. :╠20     ╙┼├          ;╬OT EQUAL
  551.          ╥╘╙
  552.  
  553. ┼╪╨╥┴═╔─ ╘╪╘   'R╔─' ;3 BYTE IDENTIFICATION STRING
  554.  
  555. ********************************
  556.  
  557. ╙╬╔╞╞╔╬╘ ╠─╪   #$02
  558. ]╠10     ╠─┴   ╔╬╘╥┴═╔─,╪
  559.          ╙╘┴   ╙╬╞╞╫╥╦1,╪
  560.          ─┼╪
  561.          ┬╨╠   ]╠10
  562.  
  563.          ╠─┴   #$╞├   ;╙TORE TO POSITION $FEFC IN ALL BANKS
  564.          ╙╘┴   ┌╨1
  565.          ╠─┴   #$╞┼
  566.          ╙╘┴   ┌╨1+1
  567.  
  568.          ╠─┴   ══╒╥├╥
  569.          ┴╬─   #%00110000 ;├HECK IF WE ARE IN 2ND 256╦
  570.          ├═╨   #%00110000 ;╔F SO....
  571.          ┬╬┼   :╠20
  572.          ╠─┴   #$╞╞
  573.          ╙╘┴   ┴╬─╫─506 ;...DON'T EVER TURN OFF BITS 4 OR 5,
  574.          ╠─┴   #$04   ; AND DON'T CHECK MORE THAN 4 INTERNAL
  575.          ├═╨   ╔╬╘╠╔═╔╘ ; BANKS
  576.          ┬├╙   :╠30
  577.          ╙╘┴   ╔╬╘╠╔═╔╘
  578.          ┬├├   :╠30
  579. :╠20     ╠─┴   #%11001111
  580.          ╙╘┴   ┴╬─╫─506 ;╔F IN 1ST 256╦, WE CAN TRY ALL 8 INTERNAL
  581.          ╠─┴   #$08   ; BANKS
  582.          ├═╨   ╔╬╘╠╔═╔╘
  583.          ┬├╙   :╠30
  584.          ╙╘┴   ╔╬╘╠╔═╔╘
  585.  
  586. :╠30     ╠─┴   #$00
  587.          ╙╘┴   ╬╔╬╘┬╬╦
  588.  
  589. ]╬┼╪╘    ┴──   #┬╦╔╬╘0
  590.          ╙╘┴   ┌╨1+2
  591.          ╩╙╥   ╘╙╘╔╬╘┬╦
  592.          ┬├╙   :─╧╬┼
  593.          ╔╬├   ╬╔╬╘┬╬╦
  594.          ╠─┴   ╬╔╬╘┬╬╦
  595.          ├═╨   ╔╬╘╠╔═╔╘
  596.          ┬├├   ]╬┼╪╘
  597. :─╧╬┼    ╥╘╙
  598.  
  599. ╘╙╘╔╬╘┬╦ ╠─┴   ┌╨1+2
  600.          ╙╘┴   ╙╬╞╞╫╥╦1+3
  601.          ╠─╪   #╙╬╞╞╫╥╦1
  602.          ╠─┘   #$04
  603.          ╩╙╥   ┌╨╙╘╧╥┼
  604.          ╩╙╥   ╔╘┼╙╘╔╬╘
  605.          ┬├╙   :╠90
  606.          ╠─┴   #┬╦╔╬╘0 ;═AKE SURE NO WRAPAROUND OCCURRED
  607.          ╙╘┴   ┌╨1+2
  608.          ╙╘┴   ╙╬╞╞╫╥╦1+3
  609.          ╩╙╥   ╔╘┼╙╘╔╬╘
  610. :╠90     ╥╘╙
  611.  
  612. ╔╘┼╙╘╔╬╘ ╠─┴   #$00
  613.          ╠─╪   #$02
  614. ]╠10     ╙╘┴   ╙╬╞╞╫╥╦2,╪
  615.          ─┼╪
  616.          ┬╨╠   ]╠10
  617.          ╠─╪   #╙╬╞╞╫╥╦2
  618.          ╠─┘   #$04
  619.          ╩╙╥   ┌╨╠╧┴─
  620.          ╠─╪   #$03
  621. ]╠20     ╠─┴   ╙╬╞╞╫╥╦2,╪
  622.          ├═╨   ╙╬╞╞╫╥╦1,╪
  623.          ┬╬┼   :╠30
  624.          ─┼╪
  625.          ┬╨╠   ]╠20
  626.          ├╠├          ;╔NTERNAL BANK CHECKS OUT!
  627.          ╥╘╙
  628. :╠30     ╙┼├          ;VERIFY ERROR
  629.          ╥╘╙
  630.  
  631. ╔╬╘╥┴═╔─ ╘╪╘   '╥.├' ;(╚OMAGE TO ╥ICHARD ├URCIO)
  632.  
  633. ********************************
  634. ********************************
  635. * ╔NITIALIZE DYNAMICALLY ALLOCATED MEMORY(): NEXPBANKS
  636. ********************************
  637.  
  638. ├╒╥┼╪┬╬╦ =     ╙┘╙╫╧╥╦+$0╞
  639.  
  640. ╔╬╔╘─┘╬═ ╠─╪   #$02
  641. ]╠10     ╠─┴   #$00
  642.          ╙╘┴   ╞╥┼┼═┼═,╪ ;┌ERO FREE MEMORY
  643.          ╠─┴   #$╞╞
  644.          ╙╘┴   ═┴╠╠╧├╚─,╪ ;╨OINT HEADER TO NULL
  645.          ─┼╪
  646.          ┬╨╠   ]╠10
  647.  
  648. * ╞REE THE MEMORY OF ╥┴═ 1-7 (ASSUMES YOU HAVE AT LEAST ╥┴═0!)
  649.  
  650.          ╠─┴   ╬╔╬╘┬╬╦ ;─O HIGHEST BANKS FIRST, SO
  651.          ╙╘┴   ├╒╥┼╪┬╬╦ ; THEY ARE ALLOCATED LAST.
  652. ]╠22     ─┼├   ├╒╥┼╪┬╬╦
  653.          ┬┼╤   :─╧╥═0
  654.          ╠─┴   ├╒╥┼╪┬╬╦
  655.          ┴──   #┬╦╔╬╘0
  656.          ╘┴╪
  657.          ╠─┴   ╙╘┴╥╘╨╟1
  658.          ╠─┘   ╥┴═1╠┼╬
  659.          ╩╙╥   ╔╬╔╘╔╬╘═
  660.          ┬╥┴   ]╠22
  661.  
  662. * ─ETERMINE LENGTH OF FREE MEM ON ╥┴═0 AND FREE THE MEMORY
  663.  
  664. :─╧╥═0   ╙┼├
  665.          ╠─┴   $1212  ;╘OP OF ┬┴╙╔├ PROGRAM ╠OW
  666.          ┬┼╤   :╠20   ; (ACCEPT ONLY FULL PAGES)
  667.          ├╠├
  668. :╠20     ╠─┴   $1213  ;╘OP OF ┬┴╙╔├ PROGRAM ╚IGH
  669.          ╙┬├   ╙╘┴╥╘╨╟0
  670.          ╘┴┘          ;┘ HAS # PAGES FREE
  671.          ╠─┴   ╙╘┴╥╘╨╟0 ;┴ HAS 1ST BANK
  672.          ╠─╪   #┬╦╔╬╘0 ;╪ HAS BANK CONFIG
  673.          ╩╙╥   ╔╬╔╘╔╬╘═ ;╔NIT╔NTERNAL┬ANK═ALLOC
  674.  
  675. * ─O EXPANSION BANKS
  676.  
  677.          ╠─┴   ╬┼╪╨┬╬╦
  678.          ┬┼╤   :╠30   ; (SKIP IF THERE ARE NO EXPANSION BANKS)
  679.          ╙╒┬   #$01   ;╙TART WITH HIGHEST BANK
  680.          ╙╘┴   ├╒╥┼╪┬╬╦
  681. ]╠25     ╙╘┴   ┌╨1+2  ;╨UT ┬ANK IN ┌╨1
  682.          ╠─┴   #$00
  683.          ╙╘┴   ┌╨1    ;┌╨1 = $0000 -> START OF ╥┼╒ BANK
  684.          ╙╘┴   ┌╨1+1
  685.          ╠─┴   #$╞8   ;╞REE $FFF8 BYTES PER BANK
  686.          ╠─┘   #$╞╞
  687.          ╩╙╥   ╞╥┼┼
  688.          ─┼├   ├╒╥┼╪┬╬╦
  689.          ╠─┴   ├╒╥┼╪┬╬╦
  690.          ├═╨   #$╞╞   ;╙TOP AFTER FREEING EXP BANK 0
  691.          ┬╬┼   ]╠25
  692. :╠30     ╥╘╙
  693.  
  694. ╔╬╔╘╔╬╘═ ╙╘┴   ┌╨1+1  ;╔NIT╔NTERNAL┬ANK═ALLOC
  695.          ╙╘╪   ┌╨1+2  ;─YMA BANK TO FREE
  696.          ╠─┴   #$00
  697.          ╙╘┴   ┌╨1    ;╞REE AN EVEN # PAGES FOR INTERNAL MEM.
  698.          ╩═╨   ╞╥┼┼
  699.  
  700. ********************************
  701. * ═┴╠╠╧├(.┴┘ BYTES) : [ZP1]=╞AR╨OINTER
  702. ********************************
  703.  
  704. ═┴╠╬╪╘╨╘ =     ╙┘╙╫╧╥╦ ;╒SED TO STORE HEADER OF MEM. CHUNK
  705. ═┴╠═┼═╠  =     ╙┘╙╫╧╥╦+3 ; "
  706. ═┴╠╠┼╬   =     ╙┘╙╫╧╥╦+5 ;╠ENGTH INPUT PARAM
  707. ═┴╠╠╧├╤  =     ╙┘╙╫╧╥╦+7 ;╨REV FREE MEMCHUNK
  708.                       ; [ZP1] USED TO POINT TO CURR. FREE CHUNK
  709. ╔┴╠╠╧├   ├╠├          ;┴LIGN NUMBER OF BYTES REQUESTED TO MULT OF 8
  710.          ┴─├   #7     ; : ADD 7
  711.          ┬├├   :╠10
  712.          ╔╬┘
  713. :╠10     ┴╬─   #$╞8   ;...AND CLEAR LOW 3 BITS TO ROUND
  714.          ╙╘┴   ═┴╠╠┼╬ ; UP TO NEXT 8; STORE THIS LENGTH
  715.          ╙╘┘   ═┴╠╠┼╬+1 ; DESIRED IN ═┴╠╠┼╬
  716.  
  717.          ╠─╪   #$02   ;╙ET CURRENT FREE CHUNK POINTER TO 1ST
  718. ]╠20     ╠─┴   ═┴╠╠╧├╚─,╪ ; FREE CHUNK AND SET ╤ TO ╬╒╠╠
  719.          ╙╘┴   ┌╨1,╪
  720.          ╠─┴   #$╞╞
  721.          ╙╘┴   ═┴╠╠╧├╤,╪
  722.          ─┼╪
  723.          ┬╨╠   ]╠20
  724.  
  725.  
  726. * ╙EARCH FOR FREE CHUNK LONG ENOUGH:
  727.  
  728. ═┴╠╠╧╧╦  ╠─┴   ┌╨1+2
  729.          ├═╨   #$╞╞
  730.          ┬╬┼   ├╧╬╘╠╧╧╦
  731.  
  732. ═┴╠┼╥╥╧╥ ╠─┴   #$╞╞   ;├OULDN'T FIND A CHUNK LONG ENOUGH,
  733.          ╙╘┴   ┌╨1    ; SO RETURN A NULL POINTER
  734.          ╙╘┴   ┌╨1+1
  735.          ╙╘┴   ┌╨1+2
  736.          ╠─┴   #╔╬╙╒╞═┼═
  737.          ╙╘┴   ┼╥╥╬╧
  738.          ╙┼├
  739.          ╥╘╙
  740.  
  741. ├╧╬╘╠╧╧╦ ╠─╪   #═┴╠╬╪╘╨╘ ;├OPY LENGTH & NEXT PTR FROM CURRENT CHUNK
  742.          ╠─┘   #$05   ; TO SYSWORK [5 BYTES]
  743.          ╩╙╥   ┌╨╠╧┴─
  744.          ╠─┴   ═┴╠═┼═╠
  745.          ├═╨   ═┴╠╠┼╬ ;╙ET CARRY BASED ON LENGTH DESIRED VS.
  746.          ╠─┴   ═┴╠═┼═╠+1 ; LENGTH OF CHUNK
  747.          ╙┬├   ═┴╠╠┼╬+1
  748.          ┬├╙   ═┴╠╟╧╘┬╠ ;╔F LENGTH OF CHUNK > DESIRED, WE GOT ONE
  749.          ╠─╪   #$02   ;╧THERWISE, POINT ╤ TO CURRENT
  750. ]╠10     ╠─┴   ┌╨1,╪  ; AND CURRENT TO NEXT...
  751.          ╙╘┴   ═┴╠╠╧├╤,╪
  752.          ╠─┴   ═┴╠╬╪╘╨╘,╪
  753.          ╙╘┴   ┌╨1,╪
  754.          ─┼╪
  755.          ┬╨╠   ]╠10
  756.          ╩═╨   ═┴╠╠╧╧╦ ; ... AND TRY AGAIN
  757.  
  758. ═┴╠╟╧╘┬╠ ╙┼├   ;╫E'VE FOUND A BLOCK LARGE ENOUGH
  759.          ╠─┴   ╞╥┼┼═┼═ ;╙UBTRACT THE ALLOCATED MEMORY FROM THE
  760.          ╙┬├   ═┴╠╠┼╬ ;AMT. OF FREE MEMORY
  761.          ╙╘┴   ╞╥┼┼═┼═
  762.          ╠─┴   ╞╥┼┼═┼═+1
  763.          ╙┬├   ═┴╠╠┼╬+1
  764.          ╙╘┴   ╞╥┼┼═┼═+1
  765.          ┬├╙   :╠20
  766.          ─┼├   ╞╥┼┼═┼═+2
  767. :╠20     ╠─┴   ═┴╠═┼═╠
  768.          ├═╨   ═┴╠╠┼╬
  769.          ┬╬┼   :╠30
  770.          ╠─┴   ═┴╠═┼═╠+1
  771.          ╙┬├   ═┴╠╠┼╬+1
  772.          ┬┼╤   ═┴╠╫╚╧╠┼ ;╔F ═┴╠═┼═╠=═┴╠╠┼╬, JUST GRAB WHOLE CHUNK
  773. :╠30     ╙┼├
  774.          ╠─┴   ═┴╠═┼═╠ ;╧THERWISE, SUBTRACT WHAT WE'LL TAKE
  775.          ╙┬├   ═┴╠╠┼╬
  776.          ╙╘┴   ═┴╠═┼═╠
  777.          ╠─┴   ═┴╠═┼═╠+1
  778.          ╙┬├   ═┴╠╠┼╬+1
  779.          ╙╘┴   ═┴╠═┼═╠+1
  780.          ╠─╪   #═┴╠╬╪╘╨╘ ;╙AVE THAT INFO TO THE NOW
  781.          ╠─┘   #$05   ; SMALLER FREE CHUNK
  782.          ╩╙╥   ┌╨╙╘╧╥┼
  783.  
  784.          ├╠├
  785.          ╠─┴   ┌╨1    ;┴DD THAT RESIDUAL LENGTH TO OUR
  786.          ┴─├   ═┴╠═┼═╠ ; CURRENT POINTER TO JUST POINT TO
  787.          ╙╘┴   ┌╨1    ; THE LAST ═┴╠╠┼╬ BYTES
  788.          ╠─┴   ┌╨1+1
  789.          ┴─├   ═┴╠═┼═╠+1
  790.          ╙╘┴   ┌╨1+1
  791.          ├╠├          ;├╠├ FOR SUCCESSFUL
  792.          ╥╘╙   ;(╬O NEED TO CHANGE ═┴╠╠╧├╚─)
  793.  
  794. *-------------------------------
  795. ═┴╠╫╚╧╠┼ ╠─┴   ═┴╠╠╧├╤+2 ;╔S PREVIOUS POINTER NULL?
  796.          ├═╨   #┬╦╬╒╠╠
  797.          ┬╬┼   :╠20
  798.          ╠─╪   #$02
  799. ]╠10     ╠─┴   ═┴╠╬╪╘╨╘,╪ ;╔F SO, POINT ═┴╠╠╧├╚─ TO THE
  800.          ╙╘┴   ═┴╠╠╧├╚─,╪ ; NEXT CHUNK AFTER WHOLE ONE
  801.          ─┼╪          ; WE'RE GRABBING
  802.          ┬╨╠   ]╠10
  803.          ├╠├
  804.          ╥╘╙
  805.  
  806. :╠20     ╠─╪   #$02
  807. ]╠30     ╠─┴   ┌╨1,╪
  808.          ╠─┘   ═┴╠╠╧├╤,╪
  809.          ╙╘┴   ═┴╠╠╧├╤,╪ ;╨OINT PREVIOUS TO CURRENT
  810.          ╙╘┘   ┌╨1,╪  ; AND VICE VERSA
  811.          ─┼╪
  812.          ┬╨╠   ]╠30
  813.  
  814.          ╠─╪   #═┴╠╬╪╘╨╘ ;SET "NEXT" POINTER OF CHUNK BEFORE ONE
  815.          ╠─┘   #$03   ; WE'RE GRABBING TO CHUNK AFTER ONE
  816.          ╩╙╥   ┌╨╙╘╧╥┼ ; WE'RE GRABBING
  817.  
  818.          ╠─╪   #$02   ;╨OINT ┌╨1 BACK TO CURRENT CHUNK
  819. ]╠40     ╠─┴   ═┴╠╠╧├╤,╪
  820.          ╙╘┴   ┌╨1,╪
  821.          ─┼╪
  822.          ┬╨╠   ]╠40
  823.          ├╠├   ;┼XIT WITHOUT EXITING (HUH? -ED)
  824.          ╥╘╙
  825.  
  826. ********************************
  827. *-------------------------------
  828. ********************************
  829. * ╞╥┼┼( [ZP1]=╞AR╨OINTER, .┴┘=╠ENGTH )  (ALTERS [ZP1])
  830. ********************************
  831. ╞╥┼╬╪╘╨╘ =     ╙┘╙╫╧╥╦ ;╨OINTS TO CHUNK AFTER CURRENT
  832. ╞╥┼═┼═╠  =     ╙┘╙╫╧╥╦+3 ;╠ENGTH OF CURRENT CHUNK
  833. ╞╥┼╠┼╬   =     ╙┘╙╫╧╥╦+5 ;╠ENGTH OF BLOCK FREEING
  834. ╞╥┼╬┼╫╨╘ =     ╙┘╙╫╧╥╦+7 ;╔NPUT PARAM: NEW CHUNK TO BE FREED
  835. ╞╥┼┼╤    =     ╙┘╙╫╧╥╦+10 ;╨REV. POINTER
  836.  
  837. ╔╞╥┼┼    ├╠├          ;╬ORMALIZE TO 8
  838.          ┴─├   #$07
  839.          ┬├├   :╠10
  840.          ╔╬┘
  841. :╠10     ┴╬─   #$╞8
  842.          ╙╘┴   ╞╥┼╠┼╬ ;╙TORE LENGTH OF BLOCK FREEING
  843.          ╙╘┘   ╞╥┼╠┼╬+1 ; TO ╞╥┼╠┼╬
  844.          ╠─╪   #$02
  845. ]╠20     ╠─┴   ┌╨1,╪
  846.          ╙╘┴   ╞╥┼╬┼╫╨╘,╪ ;╞╥┼╬┼╫╨╘ HAS THE CHUNK WE WANNA FREE;
  847.          ╠─┴   ═┴╠╠╧├╚─,╪ ; POINT ┌╨1 TO 1ST FREE CHUNK ON LIST
  848.          ╙╘┴   ┌╨1,╪
  849.          ╠─┴   #$╞╞
  850.          ╙╘┴   ╞╥┼┼╤,╪ ;╨OINT ╤ TO NULL
  851.          ─┼╪
  852.          ┬╨╠   ]╠20
  853.  
  854. ╞╥┼╙╥├╚  ╠─┴   ┌╨1+2  ;╞REE╙EARCH╠OOP
  855.          ├═╨   #$╞╞   ;╔F CURRENT IS NULL,
  856.          ┬┼╤   ├╧┴╠╤  ; TRY TO COALESCE W/ ╤
  857.          ╠─┴   ╞╥┼╬┼╫╨╘+2 ;╔F CURRENT>NEW ("HIGHER" BANKS = HIGHER #)
  858.          ├═╨   ┌╨1+2  ; STOP SEARCHING
  859.          ┬├├   ├╧┴╠╤  ;├OALESCE WITH ╤
  860.          ┬╬┼   :╠10
  861.          ╠─┴   ┌╨1
  862.          ├═╨   ╞╥┼╬┼╫╨╘
  863.          ╠─┴   ┌╨1+1
  864.          ╙┬├   ╞╥┼╬┼╫╨╘+1
  865.          ┬├╙   ├╧┴╠╤  ;╔F CURRENT<NEW, COALESCE W/╤
  866.  
  867. :╠10     ╠─╪   #╞╥┼╬╪╘╨╘ ;╠OAD ┌╨1'S NEXT POINTER
  868.          ╠─┘   #$03   ; INTO ╞╥┼╬╪╘╨╘
  869.          ╩╙╥   ┌╨╠╧┴─
  870.          ╠─╪   #$02
  871. ]╠20     ╠─┴   ┌╨1,╪  ;╨OINT ╤ TO CURRENT...
  872.          ╙╘┴   ╞╥┼┼╤,╪
  873.          ╠─┴   ╞╥┼╬╪╘╨╘,╪ ; ...AND CURRENT TO NEXT
  874.          ╙╘┴   ┌╨1,╪
  875.          ─┼╪
  876.          ┬╨╠   ]╠20
  877.          ┬═╔   ╞╥┼╙╥├╚ ;├ONTINUE SEARCHING!
  878.  
  879. ├╧┴╠╤    ╠─╪   #$02   ;╘RY TO COALESCE ╤ AND NEW
  880. ]╠10     ╠─┴   ╞╥┼┼╤,╪
  881.          ╙╘┴   ┌╨1,╪  ;╨OINT ZP1 TO ╤
  882.          ─┼╪
  883.          ┬╨╠   ]╠10
  884.  
  885.          ╠─┴   ┌╨1+2  ;IS ╤ NULL?
  886.          ├═╨   #$╞╞
  887.          ┬╬┼   :╠30
  888.          ╠─╪   #$02   ;╔F SO, POINT NEW'S NEXT TO ═┴╠╠╧├╚─
  889. ]╠20     ╠─┴   ═┴╠╠╧├╚─,╪ ; AND ═┴╠╠╧├╚─ TO NEW
  890.          ╙╘┴   ╞╥┼╬╪╘╨╘,╪
  891.          ╠─┴   ╞╥┼╬┼╫╨╘,╪
  892.          ╙╘┴   ═┴╠╠╧├╚─,╪
  893.          ─┼╪
  894.          ┬╨╠   ]╠20
  895.          ╠─┴   ╞╥┼╠┼╬ ;╙ET LENGTH OF CURRENT FREE CHUNK AS THE
  896.          ╠─┘   ╞╥┼╠┼╬+1 ; LENGTH OF THE NEW FREE CHUNK
  897.          ╙╘┴   ╞╥┼═┼═╠ ;(─ID ╔ GET THIS RIGHT?  ═Y BRAIN HAS STOPPED
  898.          ╙╘┘   ╞╥┼═┼═╠+1 ; WORKING --╥┴╦)
  899.          ╩═╨   ├╧┴╠╨  ;╘RY TO COALESCE WITH THE NEXT CHUNK
  900.  
  901. :╠30     ╠─╪   #╞╥┼╬╪╘╨╘ ;╘HERE IS A ╤
  902.          ╠─┘   #$05   ;╟ET ╤'S HEADER
  903.          ╩╙╥   ┌╨╠╧┴─
  904.          ╠─┴   ┌╨1+2  ;├HECK IF ╤ & NEW
  905.          ├═╨   ╞╥┼╬┼╫╨╘+2 ; HAVE SAME BANK
  906.          ┬╬┼   :╠40   ;╔F NO, CAN'T COALESCE 'EM
  907.          ├╠├
  908.          ╠─┴   ┌╨1    ;─OES ╤+SIZE(╤) = NEW?
  909.          ┴─├   ╞╥┼═┼═╠
  910.          ╘┴╪
  911.          ╠─┴   ┌╨1+1
  912.          ┴─├   ╞╥┼═┼═╠+1
  913.          ├═╨   ╞╥┼╬┼╫╨╘+1
  914.          ┬╬┼   :╠40   ;╔F NOT, CAN'T COALESCE 'EM
  915.          ├╨╪   ╞╥┼╬┼╫╨╘
  916.          ┬╬┼   :╠40
  917.  
  918.          ├╠├          ;┴CTUALLY DO THE COALESCING
  919.          ╠─┴   ╞╥┼═┼═╠
  920.          ┴─├   ╞╥┼╠┼╬
  921.          ╙╘┴   ╞╥┼═┼═╠ ;┴DD NEW SIZE TO ╤ SIZE
  922.          ╠─┴   ╞╥┼═┼═╠+1
  923.          ┴─├   ╞╥┼╠┼╬+1
  924.          ╙╘┴   ╞╥┼═┼═╠+1
  925.          ╠─╪   #$02
  926. ]╠50     ╠─┴   ╞╥┼┼╤,╪ ;╨OINT NEW TO ╤
  927.          ╙╘┴   ╞╥┼╬┼╫╨╘,╪
  928.          ─┼╪
  929.          ┬╨╠   ]╠50
  930.          ┬═╔   ├╧┴╠╨  ;╞REE├OALESCE╬EW┴ND╨
  931.  
  932. :╠40     ╠─╪   #╞╥┼╬┼╫╨╘ ;├AN'T COALESCE
  933.          ╠─┘   #$03
  934.          ╩╙╥   ┌╨╙╘╧╥┼ ;╙TORE POINTER TO NEW AS ╤'S NEXT
  935.          ╠─┴   ╞╥┼╠┼╬
  936.          ╠─┘   ╞╥┼╠┼╬+1
  937.          ╙╘┴   ╞╥┼═┼═╠ ;╬EW CHUNK LENGTH = REQUEST LENGTH [?]
  938.          ╙╘┘   ╞╥┼═┼═╠+1
  939.  
  940. ├╧┴╠╨    ╠─┴   ╞╥┼╬┼╫╨╘+2 ;├HECK IF NEXT AND NEW SAME BANK
  941.          ├═╨   ╞╥┼╬╪╘╨╘+2
  942.          ┬╬┼   :╠10   ;╔F NO, CAN'T COALESCE 'EM
  943.          ├╠├
  944.          ╠─┴   ╞╥┼╬┼╫╨╘ ;╔F NEW+SIZE(NEW) = NEXT, COALESCE
  945.          ┴─├   ╞╥┼═┼═╠
  946.          ╘┴╪
  947.          ╠─┴   ╞╥┼╬┼╫╨╘+1
  948.          ┴─├   ╞╥┼═┼═╠+1
  949.          ├═╨   ╞╥┼╬╪╘╨╘+1
  950.          ┬╬┼   :╠10
  951.          ├╨╪   ╞╥┼╬╪╘╨╘
  952.          ┬╬┼   :╠10
  953.  
  954.          ╠─╪   #$02   ;┴CTUALLY COALESCE
  955. ]╠5      ╠─┴   ╞╥┼╬╪╘╨╘,╪
  956.          ╙╘┴   ┌╨1,╪
  957.          ─┼╪
  958.          ┬╨╠   ]╠5
  959.          ╠─┴   ╞╥┼═┼═╠+1
  960.          ╨╚┴
  961.          ╠─┴   ╞╥┼═┼═╠
  962.          ╨╚┴
  963.          ╠─╪   #╞╥┼╬╪╘╨╘
  964.          ╠─┘   #$05
  965.          ╩╙╥   ┌╨╠╧┴─ ;╟ET HEADER OF NEXT
  966.          ├╠├
  967.          ╨╠┴
  968.          ┴─├   ╞╥┼═┼═╠ ;┴DD LENGTH OF NEXT & NEW
  969.          ╙╘┴   ╞╥┼═┼═╠
  970.          ╨╠┴
  971.          ┴─├   ╞╥┼═┼═╠+1
  972.          ╙╘┴   ╞╥┼═┼═╠+1
  973.  
  974. :╠10     ╠─╪   #$02
  975. ]╠20     ╠─┴   ╞╥┼╬┼╫╨╘,╪
  976.          ╙╘┴   ┌╨1,╪
  977.          ─┼╪
  978.          ┬╨╠   ]╠20
  979.          ╠─╪   #╞╥┼╬╪╘╨╘
  980.          ╠─┘   #$05
  981.          ╩╙╥   ┌╨╙╘╧╥┼ ;╙AVE HEADER OF NEW
  982.          ├╠├
  983.          ╠─┴   ╞╥┼┼═┼═ ;ADD AMOUNT OF MEMORY FREED TO
  984.          ┴─├   ╞╥┼╠┼╬ ;FREE MEM COUNTER
  985.          ╙╘┴   ╞╥┼┼═┼═
  986.          ╠─┴   ╞╥┼┼═┼═+1
  987.          ┴─├   ╞╥┼╠┼╬+1
  988.          ╙╘┴   ╞╥┼┼═┼═+1
  989.          ┬├├   :╠30
  990.          ╔╬├   ╞╥┼┼═┼═+2
  991. :╠30     ├╠├          ;╬O ERROR
  992.          ╥╘╙          ;─ONE
  993.