diff --git a/VersionASM b/VersionASM index ec88ecd2277e58042df142045d8a168a38d0ccb1..edc5fc06be94df33ce52cfe0e1eb349bebe402e7 100644 --- a/VersionASM +++ b/VersionASM @@ -8,11 +8,13 @@ GBLS Module_FullVersion GBLS Module_ApplicationDate2 GBLS Module_ApplicationDate4 -Module_MajorVersion SETS "5.35" -Module_Version SETA 535 + GBLS Module_HelpVersion +Module_MajorVersion SETS "5.36" +Module_Version SETA 536 Module_MinorVersion SETS "" -Module_Date SETS "08 Sep 2000" -Module_ApplicationDate2 SETS "08-Sep-00" -Module_ApplicationDate4 SETS "08-Sep-2000" -Module_FullVersion SETS "5.35" +Module_Date SETS "10 Oct 2000" +Module_ApplicationDate2 SETS "10-Oct-00" +Module_ApplicationDate4 SETS "10-Oct-2000" +Module_FullVersion SETS "5.36" +Module_HelpVersion SETS "5.36 (10 Oct 2000)" END diff --git a/VersionNum b/VersionNum index df2d35eaaf17b633179746c1bd3eabd3cd1ff372..5740ea57bcab647fc354793292273049d37c3db4 100644 --- a/VersionNum +++ b/VersionNum @@ -1,18 +1,19 @@ -/* (5.35) +/* (5.36) * * This file is automatically maintained by srccommit, do not edit manually. * */ -#define Module_MajorVersion_CMHG 5.35 +#define Module_MajorVersion_CMHG 5.36 #define Module_MinorVersion_CMHG -#define Module_Date_CMHG 08 Sep 2000 +#define Module_Date_CMHG 10 Oct 2000 -#define Module_MajorVersion "5.35" -#define Module_Version 535 +#define Module_MajorVersion "5.36" +#define Module_Version 536 #define Module_MinorVersion "" -#define Module_Date "08 Sep 2000" +#define Module_Date "10 Oct 2000" -#define Module_ApplicationDate2 "08-Sep-00" -#define Module_ApplicationDate4 "08-Sep-2000" +#define Module_ApplicationDate2 "10-Oct-00" +#define Module_ApplicationDate4 "10-Oct-2000" -#define Module_FullVersion "5.35" +#define Module_FullVersion "5.36" +#define Module_HelpVersion "5.36 (10 Oct 2000)" diff --git a/s/ChangeDyn b/s/ChangeDyn index 963524bcb1e630437fd5a2890286b7d02dbc9384..356af2c1431245c27f2c3059308d08bd9aefa33d 100644 --- a/s/ChangeDyn +++ b/s/ChangeDyn @@ -1946,6 +1946,10 @@ AreaShrink BNE %BT25 30 + [ EarlierReentrancyInDAShrink + MOV r4, #0 ; indicate no page block (and ptr to semaphore) + STR r4, [r4, #CDASemaphore] ; OK to reenter now (we've done the damage) + ] BL CallPostShrink RSB r1, r2, #0 LDR r0, [r11, #DANode_Number] ; reload dynamic area number diff --git a/s/GetAll b/s/GetAll index c9fb42887bdf0e99b2cdd6117a968d2ba1c38e70..268bae5788813b4d37312807e1bcea729dd83876 100644 --- a/s/GetAll +++ b/s/GetAll @@ -220,6 +220,9 @@ ShadowROM SETL {FALSE} ; &FF800000 Interruptible32bitModes SETL {TRUE} ;if true, limited 32-bit mode code support (interrupt handler does not assume ; 26-bit foreground), also allows faster, 32-bit APCS version of FPEmulator + GBLL EarlierReentrancyInDAShrink ; fix for RAMFS and new FileCore (causes reentrant DA shrink/remove) +EarlierReentrancyInDAShrink SETL {TRUE} + GBLL OnlyKernelCanAccessHardwareVectors OnlyKernelCanAccessHardwareVectors SETL {TRUE} ; if true, only the Kernel is permitted to write to the hardware vectors ; while in 26-bit mode. If false, the whole ROM can (including BASIC diff --git a/s/MemInfo b/s/MemInfo index 6eee62db43dc0dfa1a141612cbd7fb319bd550b6..b3ee5f19460bde24df57e40159d1a6c70f999058 100644 --- a/s/MemInfo +++ b/s/MemInfo @@ -60,6 +60,9 @@ MemReturn B MemoryReadPhys B MemoryAmounts B MemoryIOSpace + B %BT20 ; Reason code 10 reserved (for MemoryFreePoolLock). + B %BT20 ; Reason code 11 reserved (for PCImapping). + B RecommendPage 40 @@ -410,7 +413,7 @@ MemoryReadPhys ROUT LDR r3, =NotPresent :OR: NotAvailable BL fill_words - ; &02000000 to &02200000 is VRAM or not present. + ; &02000000 to &02400000 is VRAM or not present. MOV r4, #0 LDR r4, [r4, #VRAMSize] ; Get amount of VRAM (in bytes). TEQ r4, #0 @@ -510,10 +513,11 @@ fill_words ; In: r0 = flags ; bit meaning ; 0-7 8 (reason code) -; 8-11 1=return amount of DRAM +; 8-11 1=return amount of DRAM (excludes any soft ROM) ; 2=return amount of VRAM ; 3=return amount of ROM ; 4=return amount of I/O space +; 5=return amount of soft ROM (ROM loaded into hidden DRAM) ; 12-31 reserved (set to 0) ; ; Out: r1 = number of pages of the specified type of memory @@ -527,6 +531,19 @@ MemoryAmounts ROUT BICS lr, r0, #&FF ; Get type of memory required (leave bits 12-31, non-zero => error). BEQ %FT30 ; Don't understand 0 (so the spec says). + TEQ lr, #5:SHL:8 ; Check for soft ROM + BNE %FT10 + LDR r1, =L1PT + MOV r2, #ROM + ADD r1, r1, r2, LSR #(20-2) ; L1PT address for ROM + LDR r2, [r1] + MOV r2, r2, LSR #12 + TEQ r2, #PhysROM :SHR: 12 ; see if we have hard or soft ROM + MOVEQ r1, #0 ; no soft ROM + MOVNE r1, #OSROM_ImageSize*1024 ; this much soft ROM + B %FT20 + +10 TEQ lr, #4:SHL:8 ; Check for IO space. LDREQ r1, =136*1024*1024 ; Just return 136M (includes VIDC and EASI space). BEQ %FT20 @@ -631,4 +648,109 @@ easi_space_table DCD PhysSpace + IOMD_EASI_Base7 ] +;---------------------------------------------------------------------------------------- +; MemoryFreePoolLock +; +; See code on Ursula branch + +;---------------------------------------------------------------------------------------- +;PCImapping - reserved for Acorn use (PCI manager) +; +; See code on Ursula branch + + +;---------------------------------------------------------------------------------------- +;RecommendPage +; +; In: r0 bits 0..7 = 12 (reason code 12) +; r0 bits 8..31 = 0 (reserved flags) +; r1 = size of physically contiguous RAM region required (bytes) +; r2 = log2 of required alignment of base of region (eg. 12 = 4k, 20 = 1M) +; +; Out: r3 = page number of first page of recommended region that could be +; grown as specific pages by dynamic area handler (only guaranteed +; if grow is next page claiming operation) +; - or error if not possible (eg too big, pages unavailable) +; +RecommendPage ROUT + Push "r0-r2,r4-r10,lr" + CMP r2,#30 + BHI RP_failed ;refuse to look for alignments above 1G +; + ADD r1,r1,#&1000 + SUB r1,r1,#1 + MOV r1,r1,LSR #12 + MOVS r1,r1,LSL #12 ;size rounded up to whole no. of pages +; + CMP r2,#12 + MOVLO r2,#12 ;log2 alignment must be at least 12 (4k pages) + MOV r0,#1 + MOV r4,r0,LSL r2 ;required alignment-1 +; + MOV r0,#PhysRamTable + MOV r3,#0 ;page number, starts at 0 + LDR r5,=CamEntriesPointer + LDR r5,[r5] + ADD r5,r5,#4 ; [r5,<page no.>,LSL #3] addresses flags word in CAM + LDMIA r0!,{r7,r8} ;address,size of video chunk (skip this one) +; +RP_nextchunk + ADD r3,r3,r8,LSR #12 ;page no. of first page of next chunk + LDMIA r0!,{r7,r8} ;address,size of next physical chunk + CMP r8,#0 + BEQ RP_failed +; + ADD r6,r7,r4 + SUB r6,r6,#1 ;round up + MOV r6,r6,LSR r2 + MOV r6,r6,LSL r2 + SUB r6,r6,r7 ;adjustment to first address of acceptable alignment + CMP r6,r8 + BHS RP_nextchunk ;negligible chunk + ADD r7,r3,r6,LSR #12 ;first page number of acceptable alignment + SUB r9,r8,r6 ;remaining size of chunk +; +;find first available page +RP_nextpage + CMP r9,r1 + BLO RP_nextchunk + LDR r6,[r5,r7,LSL #3] ;page flags from CAM + ;must not be marked Unavailable or Required + TST r6,#PageFlags_Unavailable :OR: PageFlags_Required + BEQ RP_checkotherpages +RP_nextpagecontinue + CMP r9,r4 + BLS RP_nextchunk + ADD r7,r7,r4,LSR #12 ;next page of suitable alignment + SUB r9,r9,r4 + B RP_nextpage +; +RP_checkotherpages + ADD r10,r7,r1,LSR #12 + SUB r10,r10,#1 ;last page required +RP_checkotherpagesloop + LDR r6,[r5,r10,LSL #3] ;page flags from CAM + TST r6,#PageFlags_Unavailable :OR: PageFlags_Required + BNE RP_nextpagecontinue + SUB r10,r10,#1 + CMP r10,r7 + BHI RP_checkotherpagesloop +; +;success! +; + MOV r3,r7 + Pull "r0-r2,r4-r10,pc" + +RP_failed + MOV r3,#0 + ADR r0,RP_error + SETV + STR r0,[sp] + Pull "r0-r2,r4-r10,pc" + +RP_error + DCD 0 + DCB "No chunk available (OS_Memory 12)",0 + ALIGN + END