On Apr 17, 22:09, Peter Pachla wrote:
> It's a
nice machine, but of little use with nothing but the OS
>installed. :-(
> True :-) I've possibly got things that you might have a use for. It
>depends on what you're interested, obviously. What would you like to
do?
Initially, the main things I'm interested in are learning about the
system
architecture and getting an assembler for it so I can
try out ARM
assembly
language.
Ah, well I might have an assembler somewhere -- there were two flavours:
one produced executable object code directly (I think) and the other
produced object modules which could be linked with modules produced by
high-level languages such as C, Fortran, and Pascal. I'm sure some of the
remaining Acorn web and/or FTP sites, like Stuttgart or HENSA, still have
instruction set lists.
But you don't even need that to get going -- BBC BASIC V contains a
reasonable 2-pass ARM assembler. It works just like the 6502 assembler in
BBC BASIC II (et al). Here's a sample so you seen what I mean (don't ask
me exactly how it works, it's intimatley bound up with the interactions
between the desktop palette, the OS palette, and the hardware palette, and
anyway I wrote this 12 years ago :-)):
REM part of palette control program for RISC OS 2.0
DIM code% 408
PROCassemble
REM main program loop here
REM followed by several other procedures/functions
DEF PROCsupremacy
CALL getpal : REM read actual colour mapping
D%=colour% : REM R3=colour%
H%=windowhandle% : REM R7=windowhandle%
CALL do_sup
ENDPROC
DEF PROCassemble
LOCAL cnt,sup,bm,sptr,vptr,val,ptr,ccol,sp,link,pass%
ptr=1 : ccol=3 : cnt=6 : sp=13 : link=14 : REM windowhandle passed in
R7
sup=10 : bm=4 : sptr=5 : vptr=8 : val=9 : REM arbitrary register
choice
log=0 : phys=1 : bpp=4 : wptr=5 : tmp=9
FOR pass%=0 TO 2 STEP 2
P%=code%
[ OPT pass%
.do_sup STMFD (sp)!, {link}
ADR sptr, supremacy% ; set up pointers
ADR vptr, vpalette%
LDR sup, [sptr] ; get supremacy word
MOV bm, #&80 ; supremacy bit mask
MOV R0, #12 ; for OSWORD 12
; In case of moving from 16-colour mode to 256-colour mode,
; we need all the clrs separate from all the sets - because
; several colours may share one physical palette register
ADD ptr, vptr, #95 ; ptr to last vpalette entry
MOV cnt, #19 ; counter
.clr TST sup, bm, LSL cnt ; s-bit for this palette entry
LDRB val, [ptr, #1]
AND val, val, #&7F
STRB val, [ptr, #1]
SWI "OS_Word"
SUB ptr, ptr, #5
SUBS cnt, cnt, #1
BPL clr
; Do sets after clrs to ensure that if any colour in a group
; is set, all will be. If we did set/clr together, might
; finish a group with a clear.
ADD ptr, vptr, #95 ; ptr to last vpalette entry
MOV cnt, #19 ; counter
.set TST bm, sup, LSR cnt ; s-bit for this palette entry
LDRNEB val, [ptr, #1]
ORRNE val, val, #&80
STRNEB val, [ptr, #1]
SWINE "OS_Word"
.next SUB ptr, ptr, #5
SUBS cnt, cnt, #1
BPL set
; If there is a current colour, and it should be clear, then
; we need to clear it explicitly in case it's been set as part
; of a group which is set
TST ccol, ccol ; see if there IS a current colour
BMI newsup
ADD ptr, ccol, ccol, ASL#2 ; if so, point to vpalette%+ccol*5
ADD ptr, ptr, vptr
LDRB val, [ptr, #1] ; get logical colour
ORR val, val, #&80
TST sup, bm, LSL ccol ; should it be set ?
ANDEQ val, val, #&7F ; clear supremacy if not
STRB val, [ptr, #1]
SWI "OS_Word"
; now we re-get supremacy in case of interactions above
.newsup ADD vptr, vptr, #95 ; ptr to final vpalette entry
MOV cnt, #19 ; counter
MOV val, #0
.nsloop LDRB R0, [vptr] ; logical colour
LDRB R1, [vptr, #1] ; supremacy+programming info
AND R1, R1, #&7F ; just programming info
SWI "OS_ReadPalette"
AND R2, R2, #&80 ; return just supremacy
ADD val, R2, val, LSL#1 ; shift into new supremacy word
AND R0, bm, sup, LSR cnt ; corresponding bit in old word
TEQ R0, R2 ; see if same
BLNE toggle
SUB vptr, vptr, #5
SUBS cnt, cnt, #1
BPL nsloop
STR val, [sptr]
LDMFD (sp)!, {PC} ; pop PC to return
.toggle ADR R1, wimp%+1024
SUB R1, R1, #1024
STR R7, [R1] ; wimp%!0=windowhandle%
STR cnt, [R1, #4] ; wimp%!4=icon% or cnt (ie R6)
CMP cnt, #16
MOVLT R11, #&00000005 ; depending on which icon,
MOVGE R11, #&77000000 ; change different things
STR R11, [R1, #8] ; wimp%!8=icon flags EOR word
MOV R11, #0
STR R11, [R1, #12] ; wimp%!12=icon flags clear word
SWI "Wimp_SetIconState"
MOVS pc, link
.getpal MVN R0, #0 ; get bits-per-pixel for mode#-1
MOV R1, #9
SWI "OS_ReadModeVariable"
MOV bpp, R2 ; save Log2BPP
ADR wptr, wpalette%
MOV R1, wptr
SWI "Wimp_ReadPalette" ; get wimp palette mappings
ADR vptr, vpalette%
ADD vptr, vptr, #95
MOV cnt, #19
.pal CMP cnt, #16
LDRMIB log, [wptr, cnt, LSL#2] ; get colour programming info
ANDPL log, cnt, #7 ; for 16-19, log=cnt MOD 16
MOVMI phys, #16
MOVEQ phys, #24
MOVHI phys, #25
BPL lc_ok
CMP bpp, #3 ; if 256 colours, GCOL => LogColNo
ANDEQ tmp, log, #&40
ANDEQ log, log, #7
ADDEQ log, log, tmp, LSR#3
.lc_ok STRB log, [vptr]
SWI "OS_ReadPalette"
BIC R2, R2, #&1F ; correct physical colour
ADD R2, R2, phys
MOV tmp, #3
.byte STRB R2, [vptr, #1]! ; save RGB, prog info, supremacy
MOV R2, R2, LSR#8
SUBS tmp, tmp, #1
BPL byte
SUB vptr, vptr, #9
SUBS cnt, cnt, #1
BPL pal
MOV pc, link
; claims upcall to permit OS_ChangeDynamicArea
; as it does no checking, it must only be enabled immediately prior
; to calling OS_ChangeDynamicArea, and disabled immediately
thereafter
.upcall MOV R0, #0
LDMFD R13!, {PC}
]
NEXT pass%
ENDPROC
--
Pete Peter Turnbull
Dept. of Computer Science
University of York