|
|
1.1 root 1: |* sizmem.s - sizmem */
2:
3: MEMMAP = 0x400000
4: GCR = 0xe40000
5: TPAT = 0x5533
6: |*------------------------------------------------------------------------
7: |* sizmem -- size memory, placing highest valid address in _maxaddr
8: |* for ATT7300, all possible 4M acts real even if not there--
9: |* have to detect wrapped memory addresses. So write a test pattern
10: |* to location 0 (not used for reset vector on this system), and
11: |* then check each start of .5M block for same pattern. When
12: |* it shows up again, that's not really memory, just a reflection
13: |* of prior memory. This works for up to 2M of onboard memory.
14: |* If you need more than that for Xinu, you're serious enough to
15: |* know how to fix this for more memory.
16: |*------------------------------------------------------------------------
17: .text
18: .globl _sizmem
19: _sizmem:
20: clrl d0
21: movl d0,a0 | moving pointer
22: movw #TPAT,0 | put test pattern in loc 0
23: movw #TPAT,d0 | and in d0
24: sizloop:
25: addl #0x80000,a0 | next .5M block
26: cmpl #0x200000,a0 | up to 2M of mem
27: bge sizdone
28: cmpw a0@,d0 | ck for wrapped val showing up
29: bne sizloop
30: sizdone:movl a0,d0 | here with wrap detected or 2M OK
31: subl #4,d0 | Xinu wants last valid word, not first invalid
32: movl d0,_maxaddr
33: rts
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.