home *** CD-ROM | disk | FTP | other *** search
-
- * ├RAIG ┬RUCE'S ─YNAMIC ═EMORY ┴LLOCATION ROUTINES
- * FROM ╔SSUE 2 OF ├= ╚ACKING ╬ET ═AGAZINE
- *
- * ╙UPPORT FOR ╥┴═2-7 ADDED BY ╥.╦NOP 92/05/23
-
- ─╙╦ "@0:DYMA.REL",8
- ╥┼╠ ;╥ELATIVE LINKER FILE
-
- ╠╙╘ ╧╞╞
- ╨╒╘ "ROBSEQUS.S",8
- ╒╙┼ "ROBSMACS.S",8
- ╠╙╘ ╧╬
-
-
- * ╟LOBAL DECLARATIONS:
-
- * ┌╨1, ╘┼═╨1, AND ┌╫1 ARE IN ROBSEQUS.S
-
- * ┌╨1 = $╞┴ ;┌ERO PAGE ╞AR ╨OINTER
- * ╘┼═╨1 = $╞─ ;╘EMP ╙TORAGE
- * ┌╫1 = $╞┼ ;┌ERO PAGE WORD
-
- ╙┘╙╫╧╥╦ = $80 ;16 BYTE BLOCK
-
- ├╧═├╧─┼ = $200 ;─┘═┴ COMMON CODE GOES HERE
- ╫╧╥╦┬╒╞ = $┬00
-
- ┬╦╙┘╙ = $0┼ ;╥┴═╚┴╠╞ ══╒ CONFIGURATION
- ┬╦╦┼╥╬┼╠ = $00 ;┬ANK 15
- ┬╦╙┼╠┼├╘ = ══╒├╥
- ┬╦╙┼╠╥0 = $╞╞01 ;╥┴═0 ╠OAD CONFIG REG.
- ┬╦╙┼╠╥1 = $╞╞02 ;╥┴═1 " " "
- ╠─├╞╥1 = $─502 ;╠OAD CONFIG. REGISTER FOR ╥┴═1
-
- ┬╦╥┴═0 = $3╞ ;╥┴═0
- ┬╦╥┴═1 = $7╞ ;CONSTANT NO LONGER USED
-
- *-------------------------------
- * ─YNAMIC ═EMORY BANKS ARE ORGAINZED AS FOLLOWS:
- * $00 - $?? = ╥┼╒ BANKS
- * $┼╞ - $╞┼ = ╔NTERNAL BANKS (UP TO 1 ═EG (EVENTUALLY...))
- * $╞╞ = ╬╒╠╠
-
- ┬╦┼╪╨0 = $00 ;─┘═┴ BANK # FOR ╥┼╒ BANK 0
- ┬╦╔╬╘0 = $┼╞ ;─┘═┴ BANK # FOR INTERNAL ╥┴═0
- ┬╦╬╒╠╠ = $╞╞ ;─┘═┴ NULL BANK
- *-------------------------------
-
- ┌╨╙┼╠┼├╘ = $─507 ;┌ERO PAGE POINTER
- * ══╒╥├╥ = $─506 ;(╔N ROBSEQUS.S)
- ╥┼╒ = $─╞00 ;─═┴ ACCESS REGISTER
- ╓╔├ = $─000 ;╓╔├ REGISTERS
-
- * ┼RORR RETURNS:
-
- ╔╬╙╒╞═┼═ = 1 ;┼RROR INSUFFICIENT MEMORY
-
- *-------------------------------
-
- * ─┘═┴ JUMP TABLE
-
- ╙╘┴╥╘╒╨ ┼╬╘
- ╩═╨ ╔╙╘┴╥╘╒╨
- ╙╚╒╘─╧╫╬ ┼╬╘
- ╩═╨ ╔╙╚╒╘─╫╬
- ┌╨╠╧┴─ ┼╬╘
- ╩═╨ ╔┌╨╠╧┴─
- ┌╨╙╘╧╥┼ ┼╬╘
- ╩═╨ ╔┌╨╙╘╧╥┼
- ╞┼╘├╚ ┼╬╘
- ╩═╨ ╔╞┼╘├╚
- ╙╘┴╙╚ ┼╬╘
- ╩═╨ ╔╙╘┴╙╚
- ═┴╠╠╧├ ┼╬╘
- ╩═╨ ╔┴╠╠╧├
- ╞╥┼┼ ┼╬╘
- ╩═╨ ╔╞╥┼┼
-
- * ╙OME VARIABLE STORAGE:
-
- ┼╥╥╬╧ ┼╬╘
- ╚┼╪ 00 ;┼RROR CODE FOR EXIT WITH ├ SET
- ╬┼╪╨┬╬╦ ┼╬╘
- ╚┼╪ 00 ;╬UMBER OF EXPANSION BANKS
- ╥┼╒╠╔═╔╘ ┼╬╘
- ╚┼╪ 7╞ ;═AX # ╥┼╒ BANKS TO SEARCH
- ╬╔╬╘┬╬╦ ┼╬╘
- ╚┼╪ 00 ;╬UMBER OF INTERNAL BANKS
- ╔╬╘╠╔═╔╘ ┼╬╘
- ╚┼╪ 08 ;═AX # INTERNAL BANKS TO SEARCH
- ═┴╠╠╧├╚─ ┼╬╘
- ╚┼╪ 000000 ;╚EADER POINTER TO FREE MEMORY LIST
- ╞╥┼┼═┼═ ┼╬╘
- ╚┼╪ 000000 ;╬UMBER OF BYTES FREE IN SYSTEM
- ╙╘┴╥╘╨╟0 ┼╬╘
- ╚┼╪ 40 ;╙TART PAGE FOR ╥┴═0
- ╙╘┴╥╘╨╟1 ┼╬╘
- ╚┼╪ 04 ;╙TART PAGE FOR ╥┴═ 1-7
- ╥┴═1╠┼╬ ┼╬╘
- ╚┼╪ ╞┬ ;256-1-$04 = # PAGES FREE IN ╥┴═ 1-7
-
-
-
- ┴╬─╫─506 ╚┼╪ 00 ;╓ALUE ┴╬─ED WITH $─506 TO SET INTERNAL BANK
-
- ********************************
- * ╙╘┴╥╘╒╨ - STARS UP ─┘═┴ ROUTINES.
- ********************************
- ╔╙╘┴╥╘╒╨ ╠─┴ #$00
- ╨╚┴ ;├LEAR STATUS REG. IN CASE
- ╨╠╨ ;─ECIMAL OR ╔╥╤ SET
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╩╙╥ ╔╬╙╘├╧══ ;╔NSTALL THE COMMON CODE
- ╩╙╥ ╙╬╔╞╞╥┼╒ ;╞IGURE # EXPANSION BANKS AVAIL.
- ╩╙╥ ╙╬╔╞╞╔╬╘ ;╞IGURE # INTERNAL BANKS AVAIL.
- ╩╙╥ ╔╬╔╘─┘╬═ ;╔NIT DYNAMIC MEMORY
- ╥╘╙
-
- ********************************
- * ╙╚╒╘─╧╫╬ - ╞ILL ┬┴╙╔├ COMMAND LINE BUFFER
- * WITH ZEROS TO AVOID ╙YNTAX ┼RROR
- ********************************
- ╔╙╚╒╘─╫╬ ╠─╪ #$00
- ╠─┴ #$00
- ]╠10 ╙╘┴ $200,╪
- ╔╬╪
- ├╨╪ #├╧═┼╬─-├╧═╙╘┴╥╘
- ┬╬┼ ]╠10
- ╠─┴ #┬╦╦┼╥╬┼╠
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- ********************************
- * ╔NSTALL ├OMMON ├ODE
- ********************************
- ╔╬╙╘├╧══ ╠─╪ #$00
- ]╠10 ╠─┴ ├╧═╙╘┴╥╘,╪
- ╙╘┴ ├╧═├╧─┼,╪
- ╔╬╪
- ├╨╪ #├╧═┼╬─-├╧═╙╘┴╥╘
- ┬├├ ]╠10
- ╥╘╙
-
- ********************************
- ********************************
- * ├OMMON CODE - IS RELOACTED TO ├╧═├╧─┼ ($200)
- ********************************
-
- ├╧═╙╘┴╥╘
- ├╧═┌╨╠─ ╠─┴ ┌╨1+2 ;├OMMON ┌╨ LOAD
- ╩╙╥ ╙┼╘╔╬╘┬╦-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╙ET BANK
- ╙╘┘ ╘┼═╨1 ;╙AVE AMT TO GET
- ╠─┘ #$00
- ]╠10 ╠─┴ (┌╨1),┘ ;├OPY THE MEMORY
- ╙╘┴ $00,╪
- ╔╬╪
- ╔╬┘
- ├╨┘ ╘┼═╨1 ;╟OT IT ALL?
- ┬├├ ]╠10
- ╠─┴ #┬╦╙┘╙ ;╥ESTORE SYSTEM BANK
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- ├╧═┌╨╙╘╧ ╠─┴ ┌╨1+2 ;├OMMON ┌╨ ╙TORE
- ╩╙╥ ╙┼╘╔╬╘┬╦-├╧═╙╘┴╥╘+├╧═├╧─┼
- ╙╘┘ ╘┼═╨1
- ╠─┘ #$00
- ]╠10 ╠─┴ $00,╪
- ╙╘┴ (┌╨1),┘
- ╔╬╪
- ╔╬┘
- ├╨┘ ╘┼═╨1
- ┬├├ ]╠10
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- *===============================
- * ├OPY ╥┴═(1-7) TO ╥┴═0 # OF BYTES IN ┘;
- * IF ┘=0, COPY 256 BYTES
-
- ├╨╥1╘╧╥0 ─┼┘ ;0 = TRANSFER 256 BYTES
- ┬┼╤ :╠20 ;╔F 1, JUST DO THE LAST XFER
- ]╠10 ╙╘┴ ┬╦╙┼╠╥1 ;├OPY THE FIRST 1-255 BYTES...
- ╠─┴ (┌╨1),┘
- ╙╘┴ ┬╦╙┼╠╥0
- ╙╘┴ (┌╫1),┘
- ─┼┘
- ┬╬┼ ]╠10
- :╠20 ╙╘┴ ┬╦╙┼╠╥1 ;...AND DO ONE MORE BYTE
- ╠─┴ (┌╨1),┘
- ╙╘┴ ┬╦╙┼╠╥0
- ╙╘┴ (┌╫1),┘
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- * VICE VERSA
-
- ├╨╥0╘╧╥1 ─┼┘
- ┬┼╤ :╠20
- ]╠10 ╙╘┴ ┬╦╙┼╠╥0
- ╠─┴ (┌╫1),┘
- ╙╘┴ ┬╦╙┼╠╥1
- ╙╘┴ (┌╨1),┘
- ─┼┘
- ┬╬┼ ]╠10
- :╠20 ╙╘┴ ┬╦╙┼╠╥0
- ╠─┴ (┌╫1),┘
- ╙╘┴ ┬╦╙┼╠╥1
- ╙╘┴ (┌╨1),┘
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- ╙┼╘╔╬╘┬╦ ╙╘╪ ╘┼═╨1 ;╙AVE X DURING THE PROCEEDINGS
- ╙╒┬ #┬╦╔╬╘0 ;┴ HAS DYMA BANK #
- ╘┴╪
- ╠─┴ ══╒╥├╥
- ┴╬─ ┴╬─╫─506
- ╧╥┴ ─506╘┴┬,╪
- ╙╘┴ ══╒╥├╥ ;╙ET ══╒╥├╥ TO GET RIGHT ╥┴═ BANK
- ╠─┴ ├╥╘┴┬,╪
- ╙╘┴ ┬╦╙┼╠┼├╘ ;╙ET ══╒├╥ TO APPROPRIATE BANK
- ╠─╪ ╘┼═╨1 ;╥ESTORE ╪
- ╥╘╙
-
- ├╧═┼╬─
-
- ─506╘┴┬ ╚┼╪ 00,00,00,00,10,10,20,20
- ├╥╘┴┬ ╚┼╪ 3╞,7╞,┬╞,╞╞,┬╞,╞╞,┬╞,╞╞
-
-
- ********************************
- * ┼ND OF ├OMMON ├ODE
- * (WELL, ╧╦, THE TABLES AREN'T IN ├OMMON ╥┴═)
- ********************************
- ********************************
-
- ********************************
- * ┌ERO PAGE LOAD ROUTINE
- * ╬╧╘┼: FOR ─═┴ TO ZERO PAGE, WE HAVE
- * TO READ THE PAGE FROM THE ══╒ REGISTER
- * $D507, SINCE ─═┴'S IGNORE THE ══╒
- * ZERO PAGE REGISTERS!
- ********************************
- ╔┌╨╠╧┴─ ╠─┴ ┌╨1+2
- ├═╨ #┬╦╔╬╘0 ;╔S IT A ╥┼╒ BANK?
- ┬├├ :╠10
- ╩═╨ ├╧═┌╨╠─-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╔F INTERNAL, GO TO COMM. ROUT.
- :╠10 ╙╘┘ ╥┼╒+7 ;┬YTES TO TRANSFER LOW
- ╠─┘ #$91 ;├ODE TO READ FROM ╥┼╒
- ┌╨╥┼╒╧╨ ╙╘┴ ╥┼╒+6 ;╥┼╒ BANK
- ╙╘╪ ╥┼╒+2 ;╙YS ADDR. LOW
- ╠─┴ ┌╨╙┼╠┼├╘
- ╙╘┴ ╥┼╒+3 ;╙YS ADDR. HIGH
- ╠─┴ ┌╨1
- ╙╘┴ ╥┼╒+4 ;╥┼╒ ADDR. LOW
- ╠─┴ ┌╨1+1
- ╙╘┴ ╥┼╒+5 ;╥┼╒ ADDR. HIGH
- ╠─┴ #$00
- ╙╘┴ ╥┼╒+8 ;├OUNT HIGH
- ╠─┴ ╓╔├+$30 ;╨UT SYSTEM CLOCK IN ╙╠╧╫ FOR TRANSFER-
- ╠─╪ #$00 ; THIS IS NECESSARY!
- ╙╘╪ ╓╔├+$30
- ╙╘┘ ╥┼╒+1 ;─O THE COMMAND- STO/LOAD, DEP. ON ┘
- ╙╘┴ ╓╔├+$30
- ╥╘╙
-
- ********************************
- * ┌╨╙╘╧╥┼ -- USE SAME CODE FOR ╥┼╒ OP AS ┌╨╠╧┴─,
- * ONLY MAKE THE DIRECTION DIFFERENT
- ********************************
- ╔┌╨╙╘╧╥┼ ╠─┴ ┌╨1+2
- ├═╨ #┬╦╔╬╘0 ;╔S IT AN ╥┼╒ BANK?
- ┬├├ :╠10
- ╩═╨ ├╧═┌╨╙╘╧-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╔F INTERNAL, DO COMM.
- :╠10 ╙╘┘ ╥┼╒+7
- ╠─┘ #$90 ;CODE TO STORE TO ╥┼╒
- ╩═╨ ┌╨╥┼╒╧╨
-
- ********************************
- * ╞┼╘├╚
- ********************************
- ╞┼╘├╚╠┼╬ = ╙┘╙╫╧╥╦
- ╞┼╘╙╓╙╥├ = ╙┘╙╫╧╥╦+2 ;╞ETCH SAVE SOURCE
- ╞┼╘╙╓─╙╘ = ╙┘╙╫╧╥╦+3 ;╞ETCH SAVE DEST
-
- ╔╞┼╘├╚ ╠─╪ ┌╨1+2
- ├╨╪ #┬╦╔╬╘0 ;╔S IT AN INTERNAL BANK
- ┬├╙ :╠10
- ╠─╪ #$91 ;╥EAD FROM ╥┼╒ COMMAND
- ╩═╨ ─╧╥┼╒
- :╠10 ├╨┘ #$00
- ┬╬┼ ╞┼╘╠╧╬╟ ;╔F >1 PAGE, DO LONG FETCH CODE
- ╘┴┘
- ┬╬┼ ╞┼╘╨┴╟┼ ;╧THERWISE, DO PAGE FETCH
- ╥╘╙
-
- ********************************
- * ╞ETCH ╨AGE -> .╪ HAS BANK CONFIG TO FETCH!
- ********************************
- ╞┼╘╨┴╟┼ ├╨╪ #┬╦╔╬╘0
- ┬┼╤ :╠10 ;╔S THE BANK ╥┴═0?
- ╠─┴ ══╒╥├╥ ;╔F NOT, SET UP ══╒╥├╥ AND
- ┴╬─ ┴╬─╫─506 ; THE $D502 LOAD CONFIG. REGISTER
- ╧╥┴ ─506╘┴┬-┬╦╔╬╘0,╪ ;FOR COPYING FROM WHATEVER BANK
- ╙╘┴ ══╒╥├╥
- ╠─┴ ├╥╘┴┬-┬╦╔╬╘0,╪
- ╙╘┴ ╠─├╞╥1
- ╩═╨ ├╨╥1╘╧╥0-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╟O TO COMMON CODE
- :╠10 ╠─╪ #┬╦╥┴═0
- ╙╘╪ ┬╦╙┼╠┼├╘ ;╙WAP IN ╥┴═0
- ─┼┘ ;├OPY THE <= PAGE
- ┬┼╤ :╠30
- ]╠20 ╠─┴ (┌╨1),┘
- ╙╘┴ (┌╫1),┘
- ─┼┘
- ┬╬┼ ]╠20
- :╠30 ╠─┴ (┌╨1),┘
- ╙╘┴ (┌╫1),┘
- ╠─┴ #┬╦╙┘╙ ;╥ESTORE SYSTEM BANK
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- ********************************
- * ╞ETCH >1 PAGE
- ********************************
- ╞┼╘╠╧╬╟ ╙╘┴ ╞┼╘├╚╠┼╬
- ╙╘┘ ╞┼╘├╚╠┼╬+1
- ╠─┴ ┌╨1+1 ;╙AVE ┌╨ SO WE CAN MESS W/IT
- ╙╘┴ ╞┼╘╙╓╙╥├
- ╠─┴ ┌╫1+1 ;DITTO FOR ┌╫
- ╙╘┴ ╞┼╘╙╓─╙╘
- ╠─┴ ╞┼╘├╚╠┼╬+1
- ┬┼╤ ╞┼╘╠╬╟┼╪ ;╞ETCH╠ONG┼XIT
- ]╠10 ╠─╪ ┌╨1+2 ;├OPY A PAGE AT A TIME
- ╠─┘ #$00 ;┘=0 MEANS COPY 256 BYTES
- ╩╙╥ ╞┼╘╨┴╟┼
- ╔╬├ ┌╨1+1
- ╔╬├ ┌╫1+1
- ─┼├ ╞┼╘├╚╠┼╬+1
- ┬╬┼ ]╠10
-
- ╞┼╘╠╬╟┼╪ ╠─┘ ╞┼╘├╚╠┼╬ ;╟ETS LAST <256 BYTES
- ┬┼╤ :╠10
- ╠─╪ ┌╨1+2
- ╩╙╥ ╞┼╘╨┴╟┼
- :╠10 ╠─┴ ╞┼╘╙╓╙╥├ ;╥ESTORE ZP,SW
- ╙╘┴ ┌╨1+1
- ╠─┴ ╞┼╘╙╓─╙╘
- ╙╘┴ ┌╫1+1
- ╥╘╙
-
- ********************************
- * ╙╘┴╙╚ => MUCH LIKE FETCH
- ********************************
- ╙╘┴╠┼╬ = ╙┘╙╫╧╥╦
- ╙╘┴╙╓╙╥├ = ╙┘╙╫╧╥╦+2
- ╙╘┴╙╓─╙╘ = ╙┘╙╫╧╥╦+3
-
- ╔╙╘┴╙╚ ╠─╪ ┌╨1+2
- ├╨╪ #┬╦╔╬╘0 ;├HECK FOR INTERNAL BANK
- ┬├╙ :╠10
- ╠─╪ #$90 ;╫RITE TO ╥┼╒ COMMAND
- ╩═╨ ─╧╥┼╒
- :╠10 ├╨┘ #$00
- ┬╬┼ ╙╘┴╠╧╬╟
- ╘┴┘
- ┬╬┼ ╙╘┴╨┴╟┼
- ╥╘╙
-
- ********************************
- * ╙TASH PAGE -> ╪ HAS CONFIG TO STASH TO
- ********************************
-
- ╙╘┴╨┴╟┼ ├╨╪ #┬╦╔╬╘0
- ┬┼╤ :╠10
- ╠─┴ ══╒╥├╥
- ┴╬─ ┴╬─╫─506
- ╧╥┴ ─506╘┴┬-┬╦╔╬╘0,╪
- ╙╘┴ ══╒╥├╥
- ╠─┴ ├╥╘┴┬-┬╦╔╬╘0,╪
- ╙╘┴ ╠─├╞╥1
- ╩═╨ ├╨╥0╘╧╥1-├╧═╙╘┴╥╘+├╧═├╧─┼ ;╔F NOT ╥┴═0, DO COMMON
- :╠10 ╠─╪ #┬╦╥┴═0
- ╙╘╪ ┬╦╙┼╠┼├╘
- ─┼┘
- ┬┼╤ :╠30
- ]╠20 ╠─┴ (┌╫1),┘
- ╙╘┴ (┌╨1),┘
- ─┼┘
- ┬╬┼ ]╠20
- :╠30 ╠─┴ (┌╫1),┘
- ╙╘┴ (┌╨1),┘
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
- ╥╘╙
-
- ********************************
- * ╙TASH >1 PAGE
- ********************************
-
- ╙╘┴╠╧╬╟ ╙╘┴ ╙╘┴╠┼╬
- ╙╘┘ ╙╘┴╠┼╬+1
- ╠─┴ ┌╫1+1
- ╙╘┴ ╙╘┴╙╓╙╥├
- ╠─┴ ┌╨1+1
- ╙╘┴ ╙╘┴╙╓─╙╘
- ╠─┴ ╙╘┴╠┼╬+1
- ┬┼╤ ╙╘┴╠╬╟┼╪
- ]╠10 ╠─╪ ┌╨1+2 ;┴GAIN, COPY A PAGE @ A TIME
- ╠─┘ #0
- ╩╙╥ ╙╘┴╨┴╟┼
- ╔╬├ ┌╨1+1
- ╔╬├ ┌╫1+1
- ─┼├ ╙╘┴╠┼╬+1
- ┬╬┼ ]╠10
-
- ╙╘┴╠╬╟┼╪ ╠─┘ ╙╘┴╠┼╬
- ┬┼╤ :╠10
- ╠─╪ ┌╨1+2
- ╩╙╥ ╙╘┴╨┴╟┼
- :╠10 ╠─┴ ╙╘┴╙╓╙╥├
- ╙╘┴ ┌╫1+1
- ╠─┴ ╙╘┴╙╓─╙╘
- ╙╘┴ ┌╨1+1
- ╥╘╙
-
- ********************************
- ********************************
- * ╥┴═0 LOAD(╪=$91) / STORE(╪=$90)
- * EXPN. MEMORY [ZP1] <--> (ZW1) FOR .┴┘ BYTES
- ********************************
- ─╧╥┼╒ ╙╘┴ ╥┼╒+7 ;┬YTES TO TRANSFER (LOW)
- ╙╘┘ ╥┼╒+8 ;┬YTES TO TRANSFER (HIGH)
- ╠─┴ ┌╫1
- ╠─┘ ┌╫1+1
- ╙╘┴ ╥┼╒+2 ;╙YSTEM ADDR (LOW)
- ╙╘┘ ╥┼╒+3 ;╙YSTEM ADDR (HIGH)
- ╠─┴ ┌╨1
- ╠─┘ ┌╨1+1
- ╙╘┴ ╥┼╒+4 ;╥┼╒ ADDR (LOW)
- ╙╘┘ ╥┼╒+5 ;╥┼╒ ADDR (HIGH)
- ╠─┴ ┌╨1+2
- ╙╒┬ #┬╦┼╪╨0 ;╙UBTRACT ╥┼╒ BANK 0 FROM DYMA BANK NUMBER
- ╙╘┴ ╥┼╒+6 ; TO GET THE EXPANSION BANK NUMBER
- ╠─┘ ╓╔├+$30
- ╠─┴ #$00
- ╙╘┴ ╓╔├+$30
- ╙╘╪ ╥┼╒+1
- ╙╘┘ ╓╔├+$30
- ╥╘╙
-
- ********************************
- *-------------------------------
- ********************************
- * ╙NIFF╥┼╒ -- DETERMINE NUMBER OF BANKS OF EXP. MEMORY
- ********************************
-
- ╙╬╞╞╫╥╦1 = ╙┘╙╫╧╥╦ ;╙TRING TO STORE TO 1ST 4 BYTES OF EACH BANK
- ╙╬╞╞╫╥╦2 = ╙┘╙╫╧╥╦+4 ;╙TRING READ BACK TO SEE IF BANK IS THERE
-
- ╙╬╔╞╞╥┼╒ ╠─┴ #┬╦╥┴═0
- ╙╘┴ ┬╦╙┼╠┼├╘ ;╙AVE ╥┴═ "BENEATH" ╥┼╒
- ╠─╪ #$0┴ ; REGISTERS IN CASE THERE
- ]╠10 ╠─┴ ╥┼╒,╪ ; IS NO ╥┼╒
- ╙╘┴ ╫╧╥╦┬╒╞,╪
- ─┼╪
- ┬╨╠ ]╠10
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
-
- ╠─┴ #$00 ;╔NITIALIZE CONFIG. ╥┼╒ CONTROLLER REGS
- ╙╘┴ ╥┼╒+$9 ;╔NTERRUPT MASK REG
- ╙╘┴ ╥┼╒+$┴ ;┴DDRESS CONTROL REG
- ╠─┴ ╥┼╒+$0 ;╙TATUS REG
-
- ╠─╪ #2 ;COPY 3 BYTE TAG + BANK NUMBER
- ]╠20 ╠─┴ ┼╪╨╥┴═╔─,╪
- ╙╘┴ ╙╬╞╞╫╥╦1,╪
- ─┼╪
- ┬╨╠ ]╠20
-
- ╠─┴ #0 ;╙TART COPYING EXP BANKS @ ZERO
- ╙╘┴ ╬┼╪╨┬╬╦
- ╠─┴ #$00
- ╠─╪ #┬╦┼╪╨0
- ╙╘┴ ┌╨1
- ╙╘┴ ┌╨1+1
- ╙╘╪ ┌╨1+2 ;╨OINT ┌╨1 TO FIRST BYTE OF FIRST EXP BANK
-
- ]╠30 ╩╙╥ ╘╙╘┼╪┬╬╦ ;═AIN LOOP TO TEST FOR ╥┼╒ BANK ╧╦
- ┬├╙ :╠40 ;├ARRY SET = WE'RE DONE
- ╔╬├ ╬┼╪╨┬╬╦ ;╧THERWISE, COUNT THIS BANK...
- ╔╬├ ┌╨1+2 ;AND LOOK @ NEXT
- ┬╬┼ ]╠30
- :╠40 ╠─┴ ╬┼╪╨┬╬╦
- ┬╬┼ :╠50
-
- ╠─┴ #┬╦╥┴═0 ;╬╧ ╥┼╒ ┬┴╬╦╙ - SO ╥ESTORE
- ╙╘┴ ┬╦╙┼╠┼├╘ ; ╥┴═ WHERE ╥┼╒ REGS WOULD BE
- ╠─╪ #$0┴
- ]╠45 ╠─┴ ╫╧╥╦┬╒╞,╪
- ╙╘┴ ╥┼╒,╪
- ─┼╪
- ┬╨╠ ]╠45
- ╠─┴ #┬╦╙┘╙
- ╙╘┴ ┬╦╙┼╠┼├╘
- :╠50 ╥╘╙ ;─ONE
-
- *-------------------------------
- ╘╙╘┼╪┬╬╦ ╠─┴ ╬┼╪╨┬╬╦ ;═AKE SURE NOT PAST ╥┼╒╠╔═╔╘ BANKS!
- ├═╨ ╥┼╒╠╔═╔╘
- ┬├├ :╠10
- ╥╘╙
- :╠10 ╠─┴ ┌╨1+2
- ╙╘┴ ╙╬╞╞╫╥╦1+3 ;├OPY BANK # TO END OF TEST STRING
- ╠─╪ #╙╬╞╞╫╥╦1
- ╠─┘ #$04
- ╩╙╥ ┌╨╙╘╧╥┼ ;╙TORE THE TEST PATTER TO REU @ [ZP1]
- ╩╙╥ ╔╘┼╙╘┼╪╨ ;╘EST┼XP┬ANK╔NTERNAL
- ┬├╙ :╠20
- ╠─┴ ┌╨1+2
- ╨╚┴
- ╠─┴ #┬╦┼╪╨0 ;├HECK 0TH EXPANSION BANK FOR WRAPAROUND
- ╙╘┴ ┌╨1+2
- ╙╘┴ ╙╬╞╞╫╥╦1+3 ;AND PUT 0TH EXPANSION BANK # IN TEST STRING
- ╩╙╥ ╔╘┼╙╘┼╪╨
- ╨╠┴
- ╙╘┴ ┌╨1+2
- :╠20 ╥╘╙
-
- ╔╘┼╙╘┼╪╨ ╠─┴ #$00 ;├HECK TEST PATTER IN ╥┼╒ VS. ╙╬╞╞╫╥╦1
- ╙╘┴ ╙╬╞╞╫╥╦2
- ╙╘┴ ╙╬╞╞╫╥╦2+3 ;┌ERO (PARTS OF) DEST TEST STRING TO START
- ╠─╪ #╙╬╞╞╫╥╦2
- ╠─┘ #$04
- ╩╙╥ ┌╨╠╧┴─ ;╠OAD FROM ╥┼╒ TO ╙╬╞╞╫╥╦2
- ╠─╪ #$03
- ]╠10 ╠─┴ ╙╬╞╞╫╥╦2,╪ ;├HECK IF ╙╬╞╞╫╥╦2=╙╬╞╞╫╥╦1
- ├═╨ ╙╬╞╞╫╥╦1,╪
- ┬╬┼ :╠20
- ─┼╪
- ┬╨╠ ]╠10
- ├╠├ ;┼QUAL
- ╥╘╙
- :╠20 ╙┼├ ;╬OT EQUAL
- ╥╘╙
-
- ┼╪╨╥┴═╔─ ╘╪╘ 'R╔─' ;3 BYTE IDENTIFICATION STRING
-
- ********************************
-
- ╙╬╔╞╞╔╬╘ ╠─╪ #$02
- ]╠10 ╠─┴ ╔╬╘╥┴═╔─,╪
- ╙╘┴ ╙╬╞╞╫╥╦1,╪
- ─┼╪
- ┬╨╠ ]╠10
-
- ╠─┴ #$╞├ ;╙TORE TO POSITION $FEFC IN ALL BANKS
- ╙╘┴ ┌╨1
- ╠─┴ #$╞┼
- ╙╘┴ ┌╨1+1
-
- ╠─┴ ══╒╥├╥
- ┴╬─ #%00110000 ;├HECK IF WE ARE IN 2ND 256╦
- ├═╨ #%00110000 ;╔F SO....
- ┬╬┼ :╠20
- ╠─┴ #$╞╞
- ╙╘┴ ┴╬─╫─506 ;...DON'T EVER TURN OFF BITS 4 OR 5,
- ╠─┴ #$04 ; AND DON'T CHECK MORE THAN 4 INTERNAL
- ├═╨ ╔╬╘╠╔═╔╘ ; BANKS
- ┬├╙ :╠30
- ╙╘┴ ╔╬╘╠╔═╔╘
- ┬├├ :╠30
- :╠20 ╠─┴ #%11001111
- ╙╘┴ ┴╬─╫─506 ;╔F IN 1ST 256╦, WE CAN TRY ALL 8 INTERNAL
- ╠─┴ #$08 ; BANKS
- ├═╨ ╔╬╘╠╔═╔╘
- ┬├╙ :╠30
- ╙╘┴ ╔╬╘╠╔═╔╘
-
- :╠30 ╠─┴ #$00
- ╙╘┴ ╬╔╬╘┬╬╦
-
- ]╬┼╪╘ ┴── #┬╦╔╬╘0
- ╙╘┴ ┌╨1+2
- ╩╙╥ ╘╙╘╔╬╘┬╦
- ┬├╙ :─╧╬┼
- ╔╬├ ╬╔╬╘┬╬╦
- ╠─┴ ╬╔╬╘┬╬╦
- ├═╨ ╔╬╘╠╔═╔╘
- ┬├├ ]╬┼╪╘
- :─╧╬┼ ╥╘╙
-
- ╘╙╘╔╬╘┬╦ ╠─┴ ┌╨1+2
- ╙╘┴ ╙╬╞╞╫╥╦1+3
- ╠─╪ #╙╬╞╞╫╥╦1
- ╠─┘ #$04
- ╩╙╥ ┌╨╙╘╧╥┼
- ╩╙╥ ╔╘┼╙╘╔╬╘
- ┬├╙ :╠90
- ╠─┴ #┬╦╔╬╘0 ;═AKE SURE NO WRAPAROUND OCCURRED
- ╙╘┴ ┌╨1+2
- ╙╘┴ ╙╬╞╞╫╥╦1+3
- ╩╙╥ ╔╘┼╙╘╔╬╘
- :╠90 ╥╘╙
-
- ╔╘┼╙╘╔╬╘ ╠─┴ #$00
- ╠─╪ #$02
- ]╠10 ╙╘┴ ╙╬╞╞╫╥╦2,╪
- ─┼╪
- ┬╨╠ ]╠10
- ╠─╪ #╙╬╞╞╫╥╦2
- ╠─┘ #$04
- ╩╙╥ ┌╨╠╧┴─
- ╠─╪ #$03
- ]╠20 ╠─┴ ╙╬╞╞╫╥╦2,╪
- ├═╨ ╙╬╞╞╫╥╦1,╪
- ┬╬┼ :╠30
- ─┼╪
- ┬╨╠ ]╠20
- ├╠├ ;╔NTERNAL BANK CHECKS OUT!
- ╥╘╙
- :╠30 ╙┼├ ;VERIFY ERROR
- ╥╘╙
-
- ╔╬╘╥┴═╔─ ╘╪╘ '╥.├' ;(╚OMAGE TO ╥ICHARD ├URCIO)
-
- ********************************
- ********************************
- * ╔NITIALIZE DYNAMICALLY ALLOCATED MEMORY(): NEXPBANKS
- ********************************
-
- ├╒╥┼╪┬╬╦ = ╙┘╙╫╧╥╦+$0╞
-
- ╔╬╔╘─┘╬═ ╠─╪ #$02
- ]╠10 ╠─┴ #$00
- ╙╘┴ ╞╥┼┼═┼═,╪ ;┌ERO FREE MEMORY
- ╠─┴ #$╞╞
- ╙╘┴ ═┴╠╠╧├╚─,╪ ;╨OINT HEADER TO NULL
- ─┼╪
- ┬╨╠ ]╠10
-
- * ╞REE THE MEMORY OF ╥┴═ 1-7 (ASSUMES YOU HAVE AT LEAST ╥┴═0!)
-
- ╠─┴ ╬╔╬╘┬╬╦ ;─O HIGHEST BANKS FIRST, SO
- ╙╘┴ ├╒╥┼╪┬╬╦ ; THEY ARE ALLOCATED LAST.
- ]╠22 ─┼├ ├╒╥┼╪┬╬╦
- ┬┼╤ :─╧╥═0
- ╠─┴ ├╒╥┼╪┬╬╦
- ┴── #┬╦╔╬╘0
- ╘┴╪
- ╠─┴ ╙╘┴╥╘╨╟1
- ╠─┘ ╥┴═1╠┼╬
- ╩╙╥ ╔╬╔╘╔╬╘═
- ┬╥┴ ]╠22
-
- * ─ETERMINE LENGTH OF FREE MEM ON ╥┴═0 AND FREE THE MEMORY
-
- :─╧╥═0 ╙┼├
- ╠─┴ $1212 ;╘OP OF ┬┴╙╔├ PROGRAM ╠OW
- ┬┼╤ :╠20 ; (ACCEPT ONLY FULL PAGES)
- ├╠├
- :╠20 ╠─┴ $1213 ;╘OP OF ┬┴╙╔├ PROGRAM ╚IGH
- ╙┬├ ╙╘┴╥╘╨╟0
- ╘┴┘ ;┘ HAS # PAGES FREE
- ╠─┴ ╙╘┴╥╘╨╟0 ;┴ HAS 1ST BANK
- ╠─╪ #┬╦╔╬╘0 ;╪ HAS BANK CONFIG
- ╩╙╥ ╔╬╔╘╔╬╘═ ;╔NIT╔NTERNAL┬ANK═ALLOC
-
- * ─O EXPANSION BANKS
-
- ╠─┴ ╬┼╪╨┬╬╦
- ┬┼╤ :╠30 ; (SKIP IF THERE ARE NO EXPANSION BANKS)
- ╙╒┬ #$01 ;╙TART WITH HIGHEST BANK
- ╙╘┴ ├╒╥┼╪┬╬╦
- ]╠25 ╙╘┴ ┌╨1+2 ;╨UT ┬ANK IN ┌╨1
- ╠─┴ #$00
- ╙╘┴ ┌╨1 ;┌╨1 = $0000 -> START OF ╥┼╒ BANK
- ╙╘┴ ┌╨1+1
- ╠─┴ #$╞8 ;╞REE $FFF8 BYTES PER BANK
- ╠─┘ #$╞╞
- ╩╙╥ ╞╥┼┼
- ─┼├ ├╒╥┼╪┬╬╦
- ╠─┴ ├╒╥┼╪┬╬╦
- ├═╨ #$╞╞ ;╙TOP AFTER FREEING EXP BANK 0
- ┬╬┼ ]╠25
- :╠30 ╥╘╙
-
- ╔╬╔╘╔╬╘═ ╙╘┴ ┌╨1+1 ;╔NIT╔NTERNAL┬ANK═ALLOC
- ╙╘╪ ┌╨1+2 ;─YMA BANK TO FREE
- ╠─┴ #$00
- ╙╘┴ ┌╨1 ;╞REE AN EVEN # PAGES FOR INTERNAL MEM.
- ╩═╨ ╞╥┼┼
-
- ********************************
- * ═┴╠╠╧├(.┴┘ BYTES) : [ZP1]=╞AR╨OINTER
- ********************************
-
- ═┴╠╬╪╘╨╘ = ╙┘╙╫╧╥╦ ;╒SED TO STORE HEADER OF MEM. CHUNK
- ═┴╠═┼═╠ = ╙┘╙╫╧╥╦+3 ; "
- ═┴╠╠┼╬ = ╙┘╙╫╧╥╦+5 ;╠ENGTH INPUT PARAM
- ═┴╠╠╧├╤ = ╙┘╙╫╧╥╦+7 ;╨REV FREE MEMCHUNK
- ; [ZP1] USED TO POINT TO CURR. FREE CHUNK
- ╔┴╠╠╧├ ├╠├ ;┴LIGN NUMBER OF BYTES REQUESTED TO MULT OF 8
- ┴─├ #7 ; : ADD 7
- ┬├├ :╠10
- ╔╬┘
- :╠10 ┴╬─ #$╞8 ;...AND CLEAR LOW 3 BITS TO ROUND
- ╙╘┴ ═┴╠╠┼╬ ; UP TO NEXT 8; STORE THIS LENGTH
- ╙╘┘ ═┴╠╠┼╬+1 ; DESIRED IN ═┴╠╠┼╬
-
- ╠─╪ #$02 ;╙ET CURRENT FREE CHUNK POINTER TO 1ST
- ]╠20 ╠─┴ ═┴╠╠╧├╚─,╪ ; FREE CHUNK AND SET ╤ TO ╬╒╠╠
- ╙╘┴ ┌╨1,╪
- ╠─┴ #$╞╞
- ╙╘┴ ═┴╠╠╧├╤,╪
- ─┼╪
- ┬╨╠ ]╠20
-
-
- * ╙EARCH FOR FREE CHUNK LONG ENOUGH:
-
- ═┴╠╠╧╧╦ ╠─┴ ┌╨1+2
- ├═╨ #$╞╞
- ┬╬┼ ├╧╬╘╠╧╧╦
-
- ═┴╠┼╥╥╧╥ ╠─┴ #$╞╞ ;├OULDN'T FIND A CHUNK LONG ENOUGH,
- ╙╘┴ ┌╨1 ; SO RETURN A NULL POINTER
- ╙╘┴ ┌╨1+1
- ╙╘┴ ┌╨1+2
- ╠─┴ #╔╬╙╒╞═┼═
- ╙╘┴ ┼╥╥╬╧
- ╙┼├
- ╥╘╙
-
- ├╧╬╘╠╧╧╦ ╠─╪ #═┴╠╬╪╘╨╘ ;├OPY LENGTH & NEXT PTR FROM CURRENT CHUNK
- ╠─┘ #$05 ; TO SYSWORK [5 BYTES]
- ╩╙╥ ┌╨╠╧┴─
- ╠─┴ ═┴╠═┼═╠
- ├═╨ ═┴╠╠┼╬ ;╙ET CARRY BASED ON LENGTH DESIRED VS.
- ╠─┴ ═┴╠═┼═╠+1 ; LENGTH OF CHUNK
- ╙┬├ ═┴╠╠┼╬+1
- ┬├╙ ═┴╠╟╧╘┬╠ ;╔F LENGTH OF CHUNK > DESIRED, WE GOT ONE
- ╠─╪ #$02 ;╧THERWISE, POINT ╤ TO CURRENT
- ]╠10 ╠─┴ ┌╨1,╪ ; AND CURRENT TO NEXT...
- ╙╘┴ ═┴╠╠╧├╤,╪
- ╠─┴ ═┴╠╬╪╘╨╘,╪
- ╙╘┴ ┌╨1,╪
- ─┼╪
- ┬╨╠ ]╠10
- ╩═╨ ═┴╠╠╧╧╦ ; ... AND TRY AGAIN
-
- ═┴╠╟╧╘┬╠ ╙┼├ ;╫E'VE FOUND A BLOCK LARGE ENOUGH
- ╠─┴ ╞╥┼┼═┼═ ;╙UBTRACT THE ALLOCATED MEMORY FROM THE
- ╙┬├ ═┴╠╠┼╬ ;AMT. OF FREE MEMORY
- ╙╘┴ ╞╥┼┼═┼═
- ╠─┴ ╞╥┼┼═┼═+1
- ╙┬├ ═┴╠╠┼╬+1
- ╙╘┴ ╞╥┼┼═┼═+1
- ┬├╙ :╠20
- ─┼├ ╞╥┼┼═┼═+2
- :╠20 ╠─┴ ═┴╠═┼═╠
- ├═╨ ═┴╠╠┼╬
- ┬╬┼ :╠30
- ╠─┴ ═┴╠═┼═╠+1
- ╙┬├ ═┴╠╠┼╬+1
- ┬┼╤ ═┴╠╫╚╧╠┼ ;╔F ═┴╠═┼═╠=═┴╠╠┼╬, JUST GRAB WHOLE CHUNK
- :╠30 ╙┼├
- ╠─┴ ═┴╠═┼═╠ ;╧THERWISE, SUBTRACT WHAT WE'LL TAKE
- ╙┬├ ═┴╠╠┼╬
- ╙╘┴ ═┴╠═┼═╠
- ╠─┴ ═┴╠═┼═╠+1
- ╙┬├ ═┴╠╠┼╬+1
- ╙╘┴ ═┴╠═┼═╠+1
- ╠─╪ #═┴╠╬╪╘╨╘ ;╙AVE THAT INFO TO THE NOW
- ╠─┘ #$05 ; SMALLER FREE CHUNK
- ╩╙╥ ┌╨╙╘╧╥┼
-
- ├╠├
- ╠─┴ ┌╨1 ;┴DD THAT RESIDUAL LENGTH TO OUR
- ┴─├ ═┴╠═┼═╠ ; CURRENT POINTER TO JUST POINT TO
- ╙╘┴ ┌╨1 ; THE LAST ═┴╠╠┼╬ BYTES
- ╠─┴ ┌╨1+1
- ┴─├ ═┴╠═┼═╠+1
- ╙╘┴ ┌╨1+1
- ├╠├ ;├╠├ FOR SUCCESSFUL
- ╥╘╙ ;(╬O NEED TO CHANGE ═┴╠╠╧├╚─)
-
- *-------------------------------
- ═┴╠╫╚╧╠┼ ╠─┴ ═┴╠╠╧├╤+2 ;╔S PREVIOUS POINTER NULL?
- ├═╨ #┬╦╬╒╠╠
- ┬╬┼ :╠20
- ╠─╪ #$02
- ]╠10 ╠─┴ ═┴╠╬╪╘╨╘,╪ ;╔F SO, POINT ═┴╠╠╧├╚─ TO THE
- ╙╘┴ ═┴╠╠╧├╚─,╪ ; NEXT CHUNK AFTER WHOLE ONE
- ─┼╪ ; WE'RE GRABBING
- ┬╨╠ ]╠10
- ├╠├
- ╥╘╙
-
- :╠20 ╠─╪ #$02
- ]╠30 ╠─┴ ┌╨1,╪
- ╠─┘ ═┴╠╠╧├╤,╪
- ╙╘┴ ═┴╠╠╧├╤,╪ ;╨OINT PREVIOUS TO CURRENT
- ╙╘┘ ┌╨1,╪ ; AND VICE VERSA
- ─┼╪
- ┬╨╠ ]╠30
-
- ╠─╪ #═┴╠╬╪╘╨╘ ;SET "NEXT" POINTER OF CHUNK BEFORE ONE
- ╠─┘ #$03 ; WE'RE GRABBING TO CHUNK AFTER ONE
- ╩╙╥ ┌╨╙╘╧╥┼ ; WE'RE GRABBING
-
- ╠─╪ #$02 ;╨OINT ┌╨1 BACK TO CURRENT CHUNK
- ]╠40 ╠─┴ ═┴╠╠╧├╤,╪
- ╙╘┴ ┌╨1,╪
- ─┼╪
- ┬╨╠ ]╠40
- ├╠├ ;┼XIT WITHOUT EXITING (HUH? -ED)
- ╥╘╙
-
- ********************************
- *-------------------------------
- ********************************
- * ╞╥┼┼( [ZP1]=╞AR╨OINTER, .┴┘=╠ENGTH ) (ALTERS [ZP1])
- ********************************
- ╞╥┼╬╪╘╨╘ = ╙┘╙╫╧╥╦ ;╨OINTS TO CHUNK AFTER CURRENT
- ╞╥┼═┼═╠ = ╙┘╙╫╧╥╦+3 ;╠ENGTH OF CURRENT CHUNK
- ╞╥┼╠┼╬ = ╙┘╙╫╧╥╦+5 ;╠ENGTH OF BLOCK FREEING
- ╞╥┼╬┼╫╨╘ = ╙┘╙╫╧╥╦+7 ;╔NPUT PARAM: NEW CHUNK TO BE FREED
- ╞╥┼┼╤ = ╙┘╙╫╧╥╦+10 ;╨REV. POINTER
-
- ╔╞╥┼┼ ├╠├ ;╬ORMALIZE TO 8
- ┴─├ #$07
- ┬├├ :╠10
- ╔╬┘
- :╠10 ┴╬─ #$╞8
- ╙╘┴ ╞╥┼╠┼╬ ;╙TORE LENGTH OF BLOCK FREEING
- ╙╘┘ ╞╥┼╠┼╬+1 ; TO ╞╥┼╠┼╬
- ╠─╪ #$02
- ]╠20 ╠─┴ ┌╨1,╪
- ╙╘┴ ╞╥┼╬┼╫╨╘,╪ ;╞╥┼╬┼╫╨╘ HAS THE CHUNK WE WANNA FREE;
- ╠─┴ ═┴╠╠╧├╚─,╪ ; POINT ┌╨1 TO 1ST FREE CHUNK ON LIST
- ╙╘┴ ┌╨1,╪
- ╠─┴ #$╞╞
- ╙╘┴ ╞╥┼┼╤,╪ ;╨OINT ╤ TO NULL
- ─┼╪
- ┬╨╠ ]╠20
-
- ╞╥┼╙╥├╚ ╠─┴ ┌╨1+2 ;╞REE╙EARCH╠OOP
- ├═╨ #$╞╞ ;╔F CURRENT IS NULL,
- ┬┼╤ ├╧┴╠╤ ; TRY TO COALESCE W/ ╤
- ╠─┴ ╞╥┼╬┼╫╨╘+2 ;╔F CURRENT>NEW ("HIGHER" BANKS = HIGHER #)
- ├═╨ ┌╨1+2 ; STOP SEARCHING
- ┬├├ ├╧┴╠╤ ;├OALESCE WITH ╤
- ┬╬┼ :╠10
- ╠─┴ ┌╨1
- ├═╨ ╞╥┼╬┼╫╨╘
- ╠─┴ ┌╨1+1
- ╙┬├ ╞╥┼╬┼╫╨╘+1
- ┬├╙ ├╧┴╠╤ ;╔F CURRENT<NEW, COALESCE W/╤
-
- :╠10 ╠─╪ #╞╥┼╬╪╘╨╘ ;╠OAD ┌╨1'S NEXT POINTER
- ╠─┘ #$03 ; INTO ╞╥┼╬╪╘╨╘
- ╩╙╥ ┌╨╠╧┴─
- ╠─╪ #$02
- ]╠20 ╠─┴ ┌╨1,╪ ;╨OINT ╤ TO CURRENT...
- ╙╘┴ ╞╥┼┼╤,╪
- ╠─┴ ╞╥┼╬╪╘╨╘,╪ ; ...AND CURRENT TO NEXT
- ╙╘┴ ┌╨1,╪
- ─┼╪
- ┬╨╠ ]╠20
- ┬═╔ ╞╥┼╙╥├╚ ;├ONTINUE SEARCHING!
-
- ├╧┴╠╤ ╠─╪ #$02 ;╘RY TO COALESCE ╤ AND NEW
- ]╠10 ╠─┴ ╞╥┼┼╤,╪
- ╙╘┴ ┌╨1,╪ ;╨OINT ZP1 TO ╤
- ─┼╪
- ┬╨╠ ]╠10
-
- ╠─┴ ┌╨1+2 ;IS ╤ NULL?
- ├═╨ #$╞╞
- ┬╬┼ :╠30
- ╠─╪ #$02 ;╔F SO, POINT NEW'S NEXT TO ═┴╠╠╧├╚─
- ]╠20 ╠─┴ ═┴╠╠╧├╚─,╪ ; AND ═┴╠╠╧├╚─ TO NEW
- ╙╘┴ ╞╥┼╬╪╘╨╘,╪
- ╠─┴ ╞╥┼╬┼╫╨╘,╪
- ╙╘┴ ═┴╠╠╧├╚─,╪
- ─┼╪
- ┬╨╠ ]╠20
- ╠─┴ ╞╥┼╠┼╬ ;╙ET LENGTH OF CURRENT FREE CHUNK AS THE
- ╠─┘ ╞╥┼╠┼╬+1 ; LENGTH OF THE NEW FREE CHUNK
- ╙╘┴ ╞╥┼═┼═╠ ;(─ID ╔ GET THIS RIGHT? ═Y BRAIN HAS STOPPED
- ╙╘┘ ╞╥┼═┼═╠+1 ; WORKING --╥┴╦)
- ╩═╨ ├╧┴╠╨ ;╘RY TO COALESCE WITH THE NEXT CHUNK
-
- :╠30 ╠─╪ #╞╥┼╬╪╘╨╘ ;╘HERE IS A ╤
- ╠─┘ #$05 ;╟ET ╤'S HEADER
- ╩╙╥ ┌╨╠╧┴─
- ╠─┴ ┌╨1+2 ;├HECK IF ╤ & NEW
- ├═╨ ╞╥┼╬┼╫╨╘+2 ; HAVE SAME BANK
- ┬╬┼ :╠40 ;╔F NO, CAN'T COALESCE 'EM
- ├╠├
- ╠─┴ ┌╨1 ;─OES ╤+SIZE(╤) = NEW?
- ┴─├ ╞╥┼═┼═╠
- ╘┴╪
- ╠─┴ ┌╨1+1
- ┴─├ ╞╥┼═┼═╠+1
- ├═╨ ╞╥┼╬┼╫╨╘+1
- ┬╬┼ :╠40 ;╔F NOT, CAN'T COALESCE 'EM
- ├╨╪ ╞╥┼╬┼╫╨╘
- ┬╬┼ :╠40
-
- ├╠├ ;┴CTUALLY DO THE COALESCING
- ╠─┴ ╞╥┼═┼═╠
- ┴─├ ╞╥┼╠┼╬
- ╙╘┴ ╞╥┼═┼═╠ ;┴DD NEW SIZE TO ╤ SIZE
- ╠─┴ ╞╥┼═┼═╠+1
- ┴─├ ╞╥┼╠┼╬+1
- ╙╘┴ ╞╥┼═┼═╠+1
- ╠─╪ #$02
- ]╠50 ╠─┴ ╞╥┼┼╤,╪ ;╨OINT NEW TO ╤
- ╙╘┴ ╞╥┼╬┼╫╨╘,╪
- ─┼╪
- ┬╨╠ ]╠50
- ┬═╔ ├╧┴╠╨ ;╞REE├OALESCE╬EW┴ND╨
-
- :╠40 ╠─╪ #╞╥┼╬┼╫╨╘ ;├AN'T COALESCE
- ╠─┘ #$03
- ╩╙╥ ┌╨╙╘╧╥┼ ;╙TORE POINTER TO NEW AS ╤'S NEXT
- ╠─┴ ╞╥┼╠┼╬
- ╠─┘ ╞╥┼╠┼╬+1
- ╙╘┴ ╞╥┼═┼═╠ ;╬EW CHUNK LENGTH = REQUEST LENGTH [?]
- ╙╘┘ ╞╥┼═┼═╠+1
-
- ├╧┴╠╨ ╠─┴ ╞╥┼╬┼╫╨╘+2 ;├HECK IF NEXT AND NEW SAME BANK
- ├═╨ ╞╥┼╬╪╘╨╘+2
- ┬╬┼ :╠10 ;╔F NO, CAN'T COALESCE 'EM
- ├╠├
- ╠─┴ ╞╥┼╬┼╫╨╘ ;╔F NEW+SIZE(NEW) = NEXT, COALESCE
- ┴─├ ╞╥┼═┼═╠
- ╘┴╪
- ╠─┴ ╞╥┼╬┼╫╨╘+1
- ┴─├ ╞╥┼═┼═╠+1
- ├═╨ ╞╥┼╬╪╘╨╘+1
- ┬╬┼ :╠10
- ├╨╪ ╞╥┼╬╪╘╨╘
- ┬╬┼ :╠10
-
- ╠─╪ #$02 ;┴CTUALLY COALESCE
- ]╠5 ╠─┴ ╞╥┼╬╪╘╨╘,╪
- ╙╘┴ ┌╨1,╪
- ─┼╪
- ┬╨╠ ]╠5
- ╠─┴ ╞╥┼═┼═╠+1
- ╨╚┴
- ╠─┴ ╞╥┼═┼═╠
- ╨╚┴
- ╠─╪ #╞╥┼╬╪╘╨╘
- ╠─┘ #$05
- ╩╙╥ ┌╨╠╧┴─ ;╟ET HEADER OF NEXT
- ├╠├
- ╨╠┴
- ┴─├ ╞╥┼═┼═╠ ;┴DD LENGTH OF NEXT & NEW
- ╙╘┴ ╞╥┼═┼═╠
- ╨╠┴
- ┴─├ ╞╥┼═┼═╠+1
- ╙╘┴ ╞╥┼═┼═╠+1
-
- :╠10 ╠─╪ #$02
- ]╠20 ╠─┴ ╞╥┼╬┼╫╨╘,╪
- ╙╘┴ ┌╨1,╪
- ─┼╪
- ┬╨╠ ]╠20
- ╠─╪ #╞╥┼╬╪╘╨╘
- ╠─┘ #$05
- ╩╙╥ ┌╨╙╘╧╥┼ ;╙AVE HEADER OF NEW
- ├╠├
- ╠─┴ ╞╥┼┼═┼═ ;ADD AMOUNT OF MEMORY FREED TO
- ┴─├ ╞╥┼╠┼╬ ;FREE MEM COUNTER
- ╙╘┴ ╞╥┼┼═┼═
- ╠─┴ ╞╥┼┼═┼═+1
- ┴─├ ╞╥┼╠┼╬+1
- ╙╘┴ ╞╥┼┼═┼═+1
- ┬├├ :╠30
- ╔╬├ ╞╥┼┼═┼═+2
- :╠30 ├╠├ ;╬O ERROR
- ╥╘╙ ;─ONE
-