home *** CD-ROM | disk | FTP | other *** search
- ; -----------------------------------------------------------------------------
- ; This program will convert a basic source with FN_ADR etc. into a clean
- ; new source for use with extASM.
- ;
- ; The current settings will fix source written using my BasLib into fresh
- ; new text, ready to run through extASM.
- ;
- ; The basic source must be converted to text first (StrongED ?) and please
- ; remember to strip off the BASIC parts surrounding the assembler part.
- ;
- ; © Eivind Hagen, July 1993
- ; -----------------------------------------------------------------------------
-
- #name convert
-
- .Code_Start
- B Start
-
- .New_Stack_Start
- DBB 1024
- .New_Stack_End
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Patch_Search DCD 0
- .Patch_Replace DCD 0
-
- .Patch_Instructions
- DCB "FN_ADR? (*)",0
- DCB "ADR * ",0
-
- DCB "FN_LDR? (*)",0
- DCB "LDR * ",0
-
- DCB "FN_STR? (*)",0
- DCB "STR * ",0
-
- DCB "FN_SWP (*)",0
- DCB "EXG * ",0
-
- DCB "FN_MOV (*,*)",0
- DCB "MOV *,#*",0
-
- DCB "FN_DIVS (*,*,*,*)",0 ; div is sooooo simple to use new ;-)
- DCB "DIV *,*,* ",0
-
- DCB "EQUS",0 ; Silly silly...
- DCB "DCB ",0
-
- DCB "FN_BLK(*)",0 ; This is now called DBB (Declare Block of Bytes)
- DCB "DBB *,0",0
-
- DCB "FN_FILL(*,*)",0 ; This is now called DBB (Declare Block of Bytes)
- DCB "DBB *,*",0
-
- DCB "FN_Tag(",34,"*",34,",*)",0 ; Tagging (!) done easier
- DCB "DCB ",34,"*",34," : ALIGN",0
-
- DCB "FN_WIMPERROR",0 ; FN_WIMPERROR macro not available in extASM yet
- DCB ";FN_WIMPERROR",0
-
- DCB "SWI*",34,"*",34,0 ; No fnutts around swi names, that's lame
- DCB "SWI** ",0
-
- DCB "#ASC(",34,"*",34,")",0 ; mov r3,#ASC("X") nah, mov r3,#"X"
- DCB "#",34,"*",34," ",0
-
- DCB "#ASC",34,"*",34,0 ; mov r3,#ASC"X" nah, mov r3,#"X"
- DCB "#",34,"*",34," ",0
-
- DCB ":=",0 ; This is JUST SILLY Mr. R. Wilson ;-))
- DCB ",",0
-
- DCB ".Loop",0 ; Make all .Loop label local (may cause trouble!)
- DCB "._Loop",0
-
- DCB " Loop",0 ; Make all .Loop label local (may cause trouble!)
- DCB " _Loop",0
-
- DCB "TIME$",0 ; TIME$ does not work in extASM (yet...)
- DCB 34,"NO-TIME",34,0
-
- DCB 1 ; terminator
-
- ALIGN
-
- ; >============================================================<
- ; > START <
- ; >============================================================<
-
- .Start
- STR R13,Old_Stack
- ADR R13,New_Stack_End
- STMFD R13!,{R0-R12,R14}
- ; >-------------------------------------------------------------<
-
- BL Install_ExceptionHandler
- BL Initialize
-
- ; >-------------------------------------------------------------<
-
- .Main
- BL Load_Source
- BL Patch
- BL Save_Source
-
- ; >-------------------------------------------------------------<
-
- .The_End
- BL DeInstall_ExceptionHandler
- B Quit
-
- ; >=============================================================<
-
- .Exception_Old
- DCD 6
- DCD 0
- DCD 0
- DCD 0
-
- .Install_ExceptionHandler
- STMFD R13!,{R0-R3,R10,R14}
- MOV R0,#6
- ADR R1,ExceptionHandler
- MOV R2,#0
- ADR R3,Exception_PC
- SWI OS_ChangeEnvironment
- ADR R10,Exception_Old
- STMIA R10,{R0-R3}
- LDMFD R13!,{R0-R3,R10,PC}^
-
- .DeInstall_ExceptionHandler
- STMFD R13!,{R0-R3,R10,R14}
- ADR R10,Exception_Old
- LDMIA R10,{R0-R3}
- SWI OS_ChangeEnvironment
- LDMFD R13!,{R0-R3,R10,PC}^
-
- .ExceptionHandler
- ADR R1,Exception_Msg
- ._Loop
- LDRB R0,[R1],#1
- CMP R0,#0
- BNE _Loop
- MOV R0,#" "
- STRB R0,[R1,#-1]
-
- LDR R0,Exception_PC
- BIC R0,R0,#%11111100000000000000000000000000
- BIC R0,R0,#%00000000000000000000000000000011
- MOV R2,#10
- SWI OS_ConvertHex8
-
- ADR R0,Exception_Code
- MOV R1,#%00000111
- ADR R2,Task_Name
- SWI Wimp_ReportError
- CMP R1,#1
- BAL Core_Dump
-
- ADR R0,Exception_Msg
- MOV R1,#&58454241
- MOV R2,#0
- SWI OS_Exit
-
- .Exception_PC
- DCD 0
- .Exception_Code
- DCD 0
- .Exception_Msg
- DCB " "
- DCB " "
- DCB 0
- ALIGN
-
- ; >=============================================================<
- ; --------------------------------------------------------------
- ; | #### ##### # # ##### #### ### # |
- ; | # # ## # # # # # # # |
- ; | # ## ### # # # ### #### ##### # |
- ; | # # # # ## # # # # # # |
- ; | ### ##### # # ##### # # # # ##### |
- ; --------------------------------------------------------------
-
- ; >============================================================<
- ; > GENERAL DATA <
- ; >============================================================<
-
- .Task_Name
- DCB "Converter",0
-
- ALIGN
-
- ; >============================================================<
- ; > GENERAL VARIABLES <
- ; >============================================================<
-
- .Old_Stack DCD 0
-
- .Param_Length DCD 0
- .Param_Num DCD 0
-
- ; >============================================================<
- ; > GENERAL ROUTINES <
- ; >============================================================<
-
- .Initialize
- STMFD R13!,{R14}
-
- MOV R0,#4 ; Flex #0 = Original text
- BL Flex_Create
-
- SWI OS_GetEnv ; R0-> Address of *command
- ._Loop
- LDRB R2,[R0],#1
- CMP R2,#0
- BNE _Loop ; R0-> End of CommandLine
- SUB R0,R0,R1 ; R0 = Parameter Length
- STR R0,Param_Length
- SWI OS_GetEnv ; R0-> Address of *command
- MVN R1,#0 ; R1 = -1 (Scanning)
- BL Parse_String ;_R2 = Number of parameters
- STR R2,Param_Num
-
- LDR R0,Param_Num
- BL Print_Register
-
- MOV R14,#0 ;~R14 = Error code (0=OK)
- LDMFD R13!,{PC}
-
- ; >-------------------------------------------------------------<
-
- .Quit
- LDMFD R13!,{R0-R12,R14}
- LDR R13,Old_Stack
- SWI OS_Exit
-
- ; >=============================================================<
- ; > Entry | R0-> String to parse
- ; > | R1 = Parameter[number] to return
- ; >
- ; > Exit | R0-> Parameter
- ; > | R1 = 0 if found, <> 0 if not found
- ; > | R2 = Parameters scanned during parse
-
- .Parse_String
- STMFD R13!,{R3-R12,R14}
- MOV R2,#0 ;*R2 = Number of parameters
-
- .Parse_Leading_Space
- LDRB R11,[R0],#1 ; R11 = Char
- CMP R11,#0
- BEQ Parse_End
- CMP R11,#" "
- BEQ Parse_Leading_Space
-
- .Parse_Parameter
- LDRB R11,[R0],#1 ; R11 = Char
- CMP R11,#0
- BEQ Parse_End
- ADD R2,R2,#1 ; New Parameter (first letter)
- SUBS R1,R1,#1
- BEQ Parse_Found ; Escape if Param is found
- .Parse_Parameter_Word
- LDRB R11,[R0],#1 ; R11 = Char
- CMP R11,#0
- BEQ Parse_End
- CMP R11,#" "
- BNE Parse_Parameter_Word
- .Parse_Parameter_Space
- LDRB R11,[R0],#1 ; R11 = Char
- CMP R11,#0
- BEQ Parse_End
- CMP R11,#" "
- BEQ Parse_Parameter_Space
- SUB R0,R0,#1 ; R0-> First letter of next parameter
- B Parse_Parameter
-
- .Parse_Found
- SUB R0,R0,#1 ; R0-> First letter of parameter
-
- .Parse_End
- LDMFD R13!,{R3-R12,PC}^
-
- ; >-------------------------------------------------------------<
-
- .Param_Insert_Zero ; R0-> Param to zero terminate
- STMFD R13!,{R0-R1,R14}
-
- ._Loop
- LDRB R1,[R0],#1
- CMP R1,#0
- BEQ Param_Insert_Zero_End
- CMP R1,#" "
- BNE _Loop
- MOV R1,#0
- STRB R1,[R0,#-1]
-
- .Param_Insert_Zero_End
- LDMFD R13!,{R0-R1,PC}^
-
- ; >-------------------------------------------------------------<
-
- .Param_Remove_Zero ; R0-> Param to un-zero terminate
- STMFD R13!,{R0-R1,R14}
-
- ._Loop
- LDRB R1,[R0],#1
- CMP R1,#" "
- BEQ Param_Remove_Zero_End
- CMP R1,#0
- BNE _Loop
- MOV R1,#" "
- STRB R1,[R0,#-1]
-
- .Param_Remove_Zero_End
- LDMFD R13!,{R0-R1,PC}^
-
- ; >-------------------------------------------------------------<
-
- .Print_Register ; R0 = Value to print
- STMFD R13!,{R0-R12,R14}
-
- MOV R9,R0 ; R9 = Backup copy
- SUB R1,R13,#256 ; String buffer on stack
- MOV R2,#32 ; 32 bytes max
- SWI OS_ConvertInteger4 ; R0-> String
- SWI OS_Write0
-
- SWI OS_WriteS
- DCB " [&",0
- ALIGN
-
- MOV R0,R9 ; R9 = Backup copy
- SUB R1,R13,#256 ; String buffer on stack
- MOV R2,#32 ; 32 bytes max
- SWI OS_ConvertHex8 ; R0-> String
- SWI OS_Write0
- SWI OS_WriteS
- DCB "]",0
- ALIGN
-
- SWI OS_WriteS
- DCB 13,10,0
- ALIGN
-
- LDMFD R13!,{R0-R12,PC}^
-
- ; >-------------------------------------------------------------<
-
- .Load_Source
- STMFD R13!,{R0-R12,R14}
-
- SWI OS_GetEnv
- MOV R1,#2
- BL Parse_String ;_R0-> Parameter[2]
- MOV R1,R0 ;*R1-> Source Filename
- BL Param_Insert_Zero
-
- STMFD R13!,{R1}
- MOV R0,#17
- SWI XOS_File ; R4 = File size
- ADD R0,R4,#4 ; Need some chars to NULL-terminate source
- MOV R1,#0 ; Flex #0 = Source code
- BL Flex_Resize
- MOV R1,#0 ; Flex #0 = Source code
- BL Flex_Adr ;_R1-> Source block
- MOV R2,R1 ;*R2-> Source block
- LDMFD R13!,{R1}
-
- MOV R0,#16
- MOV R3,#0
- SWI XOS_File
- BLVS File_Error ;\
- BL Param_Remove_Zero ; ERROR HANDLING
- BVS Load_Source_Failed ;/
-
- ;------> Check source, MUST NOT contain any NULL chars
-
- MOV R1,#0 ; Flex #0 = Source code
- BL Flex_Adr ;_R1-> Source block
- MOV R2,R4
- .NULL_Scan_Loop
- SUBS R2,R2,#1
- BLT NULL_Scan_End
- LDRB R0,[R1],#1
- CMP R0,#&00
- BNE NULL_Scan_Loop
- .NULL_Scan_End ; R2 = 0 if there were NO NULL's
- CMP R2,#0
- BLT NULL_Terminate
-
- .Load_Source_Failed
- MOV R14,#1 ;~R14 = Error code (1=Failure)
- LDMFD R13!,{R0-R12,PC}^
-
- .NULL_Terminate
- MOV R0,#0
- STRB R0,[R1]
-
- .Load_Source_End
- MOV R14,#0 ;~R14 = Error code (0=OK)
- LDMFD R13!,{R0-R12,PC}^
-
- ; >-------------------------------------------------------------<
-
- .Save_Source
- STMFD R13!,{R0-R12,R14}
-
- MOV R1,#0 ; Flex #0 = Source code
- BL Flex_Adr ;_R1-> Source block
- MOV R4,R1 ;*R4-> Start of data
- MOV R5,R4
- ._Loop
- LDRB R6,[R5,#1]!
- CMP R6,#0
- BNE _Loop
-
- SWI OS_GetEnv
- MOV R1,#3
- BL Parse_String ;_R0-> Parameter[3]
- MOV R1,R0 ;*R1-> NewSource Filename
- BL Param_Insert_Zero
-
- MOV R0,#10
- MOV R2,#&FFF
- MOV R3,#0
- SWI XOS_File
- BLVS File_Error ;\
- BL Param_Remove_Zero ; ERROR HANDLING
- BVS Save_Source_Failed ;/
-
- .Save_Source_Failed
- MOV R14,#1 ;~R14 = Error code (1=Failure)
- LDMFD R13!,{R0-R12,PC}^
-
- .Save_Source_End
- MOV R14,#0 ;~R14 = Error code (0=OK)
- LDMFD R13!,{R0-R12,PC}^
-
- ; >-------------------------------------------------------------<
-
- .File_Error
- STMFD R13!,{R0-R1,R14}
-
- ADR R1,FE_Error
- CMP R0,#0
- ADREQ R1,FE_NotFound
- CMP R0,#2
- ADREQ R1,FE_DirFound
- MOV R0,R1
- SWI OS_Write0
-
- LDMFD R13!,{R0-R1,PC}^
-
- .FE_Error DCB "File error (not found?)",13,10,0
- .FE_NotFound DCB "File not found",13,10,0
- .FE_DirFound DCB "Filename is a directory",13,10,0
-
- ALIGN
-
- ; >-------------------------------------------------------------<
-
- .Patch_Wildcards_Adr DCD 0
-
- .Patch
- STMFD R13!,{R0-R12,R14}
-
- ADR R0,Patch_Instructions
- .Patch_Loop
- LDRB R1,[R0]
- CMP R1,#1
- LDMEQFD R13!,{R0-R12,PC}^
- MOV R1,R0
- ._Loop
- LDRB R9,[R0],#1
- CMP R9,#0
- BNE _Loop ; End of search instruction
- MOV R2,R0
- ._Loop
- LDRB R9,[R0],#1
- CMP R9,#0
- BNE _Loop ; End of replace instruction
- STR R1,Patch_Search
- STR R2,Patch_Replace
- BL Convert
- B Patch_Loop
-
-
- .Convert
- STMFD R13!,{R0-R12,R14}
-
- MOV R1,#0 ; Flex #0 = Original text
- BL Flex_Locate
- LDR R0,[R2] ; R0 = Block #0 size
- ADD R0,R0,R0,ASR #2 ; Flex #1 = Patched text (Max 1.5 * size of original)
- ADD R0,R0,#1024 ; Pluss some extra space
- BL Flex_Create
- MOV R0,#1024 ; Flex #2 = Wildcard strings
- BL Flex_Create
- STR R0,Patch_Wildcards_Adr
-
- MOV R1,#0 ; Flex #0 = Source code
- BL Flex_Adr ;_R1-> Source block
- MOV R10,R1 ;*R10-> Source text
- MOV R1,#1 ; Flex #1 = Source code
- BL Flex_Adr ;_R1-> Source block
- MOV R7,R1 ;*R7-> Patched text
-
- .Convert_Line
- LDR R11,Patch_Search ;*R11-> Search string
- LDR R12,Patch_Replace ;*R12-> Replace string
- LDRB R0,[R10],#1
- BL Skip_Blanks
- LDRB R1,[R11],#1 ; R1 = First char in search string
- .Conv_Search
- CMP R0,R1
- BLEQ Conv_Compare
- CMP R0,#0
- STRNEB R0,[R7],#1 ; Write char if NOT NULL (after replace)
- LDRB R0,[R10],#1 ; R0 = New char
- CMP R0,#&00
- CMPNE R0,#&0A
- BNE Conv_Search
-
- ;------> Next Line
-
- BL Flush_Line
- STRB R0,[R7],#1 ; Write char
- CMP R0,#&00
- BNE Convert_Line
-
- ;------> Memory fuck
-
- MOV R1,#2 ; Flex #2 = Wildcard strings
- BL Flex_Delete
- MOV R1,#0 ; Flex #0 = Original text
- BL Flex_Delete
- MOV R1,#0 ; Flex #0 = Patched text
- BL Flex_Adr ; R1-> Text
- MOV R2,R1
- ._Loop
- LDRB R0,[R2],#1
- CMP R0,#0
- BNE _Loop
- SUB R0,R2,R1
- MOV R1,#0
- BL Flex_Resize
- LDMFD R13!,{R0-R12,PC}^
-
-
- .Conv_Compare ; First character matches
- STMFD R13!,{R1,R10-R12,R14}
- SUB R9,R10,#1 ;*R9-> First char
- LDR R6,Patch_Wildcards_Adr ;*R6-> Found wildcards
- .CMP_Loop
- LDRB R1,[R11],#1 ; Next search char
- CMP R1,#&00
- BEQ Conv_Replace ; End of search string, replace!
- LDRB R2,[R10],#1 ; Next text char
- CMP R2,#&00
- BEQ CMP_End ; End of text
- CMP R1,#"*" ; String wildcard *
- BNE CMP_Wild_Single
- .CMP_Wild_String
- LDRB R1,[R11],#1 ; Next search char
- .CMPWS_Loop
- CMP R2,R1
- MOVEQ R1,#0
- STREQB R1,[R6],#1 ; Terminate wildcard string
- BEQ CMP_Loop ; Wildcard string found, continue searching
- STRB R2,[R6],#1 ; Extract wildcard string
- LDRB R2,[R10],#1 ; Next text char
- CMP R2,#&00 ; EOL
- CMPNE R1,#&00 ; EOT
- LDMEQFD R13!,{R1,R10-R12,PC}^ ; No match, return - R0 = Entry value
- B CMPWS_Loop
- .CMP_Wild_Single
- CMP R1,#"?" ; Single wildcard ?
- BEQ CMP_Loop
- CMP R2,R1
- BEQ CMP_Loop
- .CMP_End
- LDMFD R13!,{R1,R10-R12,PC}^ ; No match, return
-
- .Conv_Replace
- LDR R11,[R13,#8] ;*R11-> Second search char
- LDR R12,[R13,#12] ;*R12-> First replace char
- LDR R6,Patch_Wildcards_Adr ;*R6-> Found wildcards
- .REP_Loop
- LDRB R0,[R12],#1
- CMP R0,#&00
- LDMEQFD R13!,{R1,R9,R11,R12,PC}^ ; End of replace string, return - R10 not popped!
- CMP R0,#"*" ; Replace wildcard ?
- BEQ REP_Wild_String
- STRB R0,[R7],#1 ; Write char
- B REP_Loop
- .REP_Wild_String
- LDRB R0,[R6],#1
- CMP R0,#&00
- BEQ REP_Loop ; Wild string done, continue replace
- STRB R0,[R7],#1
- B REP_Wild_String
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Skip_Blanks ;_R0 = Blankish char or REAL char
- CMP R0,#" "
- CMPNE R0,#&09
- STREQB R0,[R7],#1 ; Write char
- LDREQB R0,[R10],#1
- BEQ Skip_Blanks
- MOVS PC,R14
-
- .Flush_Line
- CMP R0,#&0A
- CMPNE R0,#&00
- STRNEB R0,[R7],#1 ; Write char
- LDRNEB R0,[R10],#1
- BNE Flush_Line
- MOVS PC,R14
-
- ; >-------------------------------------------------------------<
- ; > ##### # ##### # #
- ; > # # # # #
- ; > ### # ### #
- ; > # # # # #
- ; > # ##### ##### # #
- ; >-------------------------------------------------------------<
- ; > 00 - 03 | Size of this block (offset to next block)
- ; > 04 - ?? | Data
-
- .Flex_Status
- STMFD R13!,{R0-R12,R14}
-
- LDMFD R13!,{R0-R12,PC}^
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Flex_Adr ;_R1 = Block number, ~R1-> Block [data]
- STMFD R13!,{R2-R3,R14}
-
- ADR R2,Flex_Heap
- ._Loop
- CMP R1,#0
- BLE FA_Found
- LDR R3,[R2],#4 ; Read (and skip) header
- ADD R2,R2,R3
- SUB R1,R1,#1
- B _Loop
- .FA_Found ;~R2-> Block header
- ADD R1,R2,#4
-
- LDMFD R13!,{R2-R3,PC}^
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Flex_Locate ;_R1 = Block number, ~R2-> Block [header]
- STMFD R13!,{R1,R3,R14}
-
- ADR R2,Flex_Heap
- ._Loop
- CMP R1,#0
- BLE FL_Found
- LDR R3,[R2],#4 ; Read (and skip) header
- ADD R2,R2,R3
- SUB R1,R1,#1
- B _Loop
- .FL_Found ;~R2-> Block header
-
- LDMFD R13!,{R1,R3,PC}^
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Flex_Create ;_R0 = Size of new block, ~R0-> New block [data]
- STMFD R13!,{R1-R12,R14}
-
- TST R0,#%11 ; Ensure block is word sized
- BICNE R0,R0,#%011
- ADDNE R0,R0,#%100
-
- LDR R2,Flex_Blocks
- ADR R1,Flex_Heap
- ._Loop
- CMP R2,#0
- BLE FC_New
- LDR R3,[R1],#4 ; Read (and skip) header
- ADD R1,R1,R3
- SUB R2,R2,#1
- B _Loop
- .FC_New ; R1-> Free space for new block
- MOV R10,R0 ; R10 = Size of new block
- MOV R11,R1 ; R11-> New block
- ADD R12,R1,R0
- ADD R12,R12,#4 ; R12-> End of new block (including header)
- SUB R0,R12,#&8000 ; R0 = Requested slot size
- MVN R1,#0 ; R1 = -1, just read
- SWI Wimp_SlotSize ; R0 = New slot size ?
- ADD R0,R0,#&8000 ; R0-> End of new block ?
- CMP R0,R12
- BLT FC_Error
- ;------> Now create the block
- LDR R9,Flex_Blocks
- ADD R9,R9,#1
- STR R9,Flex_Blocks
- STR R10,[R11],#4 ; Write Size (header)
- MOV R0,R11 ;~R0-> Block [data]
- ;------> Clear all data in block
- MOV R9,#0
- ._Loop
- CMP R10,#0
- BLE FC_End
- STR R9,[R11],#4
- SUB R10,R10,#4
- B _Loop
-
- .FC_Error
- SWI OS_WriteS
- DCB "Not enough memory for new Flex block",0
- ALIGN
- .FC_End
- LDMFD R13!,{R1-R12,PC}^
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Flex_Resize ;_R0 = New size, _R1 = Block number
- STMFD R13!,{R0-R12,R14}
-
- MOV R10,R1 ;*R10 = Block number (to resize)
-
- TST R0,#%11 ; Ensure block is word sized
- BICNE R0,R0,#%011
- ADDNE R0,R0,#%100
-
- BL Flex_Locate ;_R2-> Block
-
- LDR R1,[R2] ; R1 = Old size
- CMP R0,R1
- BGT FR_Bigger
- BLT FR_Smaller
- B FR_End ; Same as before, then don't worry
-
- .FR_Bigger ; R0 = New size, R1 = Old size, R2-> Block to resize
- ;------> Increase by adding a new bummy block at the end
- LDR R3,Flex_Blocks ; R3 = Blocks before dummy
- STMFD R13!,{R0-R3}
- SUB R0,R0,R1 ; R0 = Extra space needed
- MOV R9,R0 ;*R9 = Offset to move other blocks with
- SUB R0,R0,#4 ; Header also gets space
- BL Flex_Create
- LDMFD R13!,{R0-R3} ; ***** VITAL INFORMATION
- LDR R4,Flex_Blocks ; R4 = Blocks after dummy
- CMP R3,R4
- BEQ FR_Error ; If no extra block, short of memory
- STMFD R13!,{R0-R2} ; ***** HERE IT'S PUSHED BACK
- ;------> Extra space is there, now waste dummy block
- SUB R4,R4,#1
- STR R4,Flex_Blocks ; R4 = Blocks when dummy is removed
- ;------> Then move data after current block
- ADD R1,R10,#1 ; R1 = Block after current
- BL Flex_Locate ;_R2 -> After current block
- MOV R11,R2 ;*R11-> After current block
- LDR R1,Flex_Blocks
- BL Flex_Locate ;_R2 -> After last block
- MOV R12,R2 ;*R12-> Source, After last block
- SUB R10,R12,R11 ;*R10 = Number bytes to move
- ADD R11,R12,R9 ;*R11-> Destination, After dummy block
- ._Loop
- CMP R10,#0
- BLE FR_Big_Move
- LDR R8,[R12,#-4]!
- STR R8,[R11,#-4]!
- SUB R10,R10,#4
- B _Loop
- .FR_Big_Move
- ;------> Clear the gap
- MOV R8,#0
- ._Loop
- STR R8,[R11,#-4]!
- SUBS R9,R9,#4
- BGT _Loop
- B FR_Set_Size
-
-
- .FR_Smaller ; R0 = New size, R1 = Old size, R2-> Block to resize
- STMFD R13!,{R0-R2} ; ***** VITAL INFORMATION
- ;------> Move higher blocks down
- SUB R9,R1,R0 ;*R9 = Offset to move other blocks with
- ADD R1,R10,#1
- BL Flex_Locate ;_R2-> Block
- MOV R11,R2 ;*R11-> Source, After current block
- LDR R1,Flex_Blocks
- BL Flex_Locate ;_R2-> Block
- MOV R12,R2 ;*R12-> After last block
- SUB R10,R12,R11 ;*R10 = Number bytes to move
- SUB R12,R11,R9 ;*R12-> Destination, New location of [current+1] block
- ._Loop
- CMP R10,#0
- BLE FR_Small_Move
- LDR R8,[R11],#4
- STR R8,[R12],#4
- SUB R10,R10,#4
- B _Loop
- .FR_Small_Move ; R12-> After last byte needed
- ;------> Now set slotsize down
- SUB R0,R12,#&8000 ; R0 = Required slot size
- MVN R1,#0 ; R1 = -1, just read
- SWI Wimp_SlotSize ; R0 = New slot size ?
- B FR_Set_Size
-
-
- .FR_Error
- SWI OS_WriteS
- DCB "Not enough memory to resize block",0
- ALIGN
- LDMFD R13!,{R0-R12,PC}^
-
- .FR_Set_Size
- LDMFD R13!,{R0-R2}
- STR R0,[R2] ; Set New block size
- .FR_End
- LDMFD R13!,{R0-R12,PC}^
-
- ; >- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<
-
- .Flex_Delete ; R1 = Block number to delete
- STMFD R13!,{R0-R12,R14}
-
- MOV R10,R1
- ADD R1,R10,#1
- BL Flex_Locate ;_R2-> Block after the one to delete
- LDR R11,[R2] ;_R11 = Size of next block
-
- MOV R1,R10
- MOV R0,#-4
- BL Flex_Resize
-
- ;------> Remove block, one less
- LDR R4,Flex_Blocks
- SUB R4,R4,#1
- STR R4,Flex_Blocks
-
- MOV R1,R10 ; R1 = Next block
- SUB R2,R4,#1 ; R2 = Last block
- CMP R1,R4
- BGT FD_End
- BL Flex_Locate ;_R2-> Block after the one deleted
- STR R11,[R2] ; Set size, destroyed in previous resize...
-
- .FD_End
- LDMFD R13!,{R0-R12,PC}^
-
- ; >-------------------------------------------------------------<
-
- .Core_Dump
- MVN R0,#0
- MVN R1,#0
- SWI Wimp_SlotSize
- ADD R5,R0,#&8000
-
- MOV R0,#0
- ADR R1,Core_File
- MOV R2,#&8000
- MOV R3,#&8000
- MOV R4,#&8000
- SWI XOS_File
- SWI XOS_WriteS
- DCB 13,10,13,10
- DCB "Core dumped",13,10,13,10,0
- ALIGN
- SWI XOS_Exit
-
- .Core_File
- DCB "CORE",0
- ALIGN
- .Flex_Blocks DCD 0
- DCB "HEAP"
-
- ; >-------------------------------------------------------------<
-
-
- .Flex_Heap
-