Преглед изворни кода

Albert Koelmans latest version

ceriel пре 34 година
родитељ
комит
ad800075eb
4 измењених фајлова са 1017 додато и 0 уклоњено
  1. 3 0
      mach/arm/libmon/LIST
  2. 15 0
      mach/arm/libmon/Makefile
  3. 905 0
      mach/arm/libmon/svc.s
  4. 94 0
      mach/arm/libmon/swi.s

+ 3 - 0
mach/arm/libmon/LIST

@@ -0,0 +1,3 @@
+libros_s.a
+svc.s
+swi.s

+ 15 - 0
mach/arm/libmon/Makefile

@@ -0,0 +1,15 @@
+all:
+
+install:	
+		../../install libros_s.a tail_ros
+
+cmp:
+		-../../compare libros_s.a tail_ros
+
+clean:
+
+opr :
+	make pr | opr
+
+pr:
+	@arch pv libros_s.a | pr -h `pwd`/libros_s.a

+ 905 - 0
mach/arm/libmon/svc.s

@@ -0,0 +1,905 @@
+.define _EmMon, _EmTrp
+ 
+.sect .text
+ 
+_EmMon:
+ LDR R11,[R12]
+ CMP R11,#1
+ BNE _2
+!
+! EXIT
+!
+ LDR R2,[R12,#4]
+ MOV R1,#0x41
+ ADD R1,R1,#0x4200
+ ADD R1,R1,#0x450000
+ ADD R1,R1,#0x58000000
+ SWI 17  ! os_exit
+_2:
+ CMP R11,#3
+ BNE _3
+!
+! READ
+!
+ MOV R0,#4
+ LDR R1,[R12,#4]  !fildes
+ CMP R1,#5
+ BGE _22
+!
+! READ FROM THE KEYBOARD
+!
+ LDR R0,[R12,#8]  !buffer
+ MOV R10,R0
+ LDR R1,[R12,#12]  ! char count
+ CMP R1,#256
+ MOV.CS R1,#255   !OS_Readline max
+ MOV R2,#0
+ MOV R3,#126
+ SWI 14  !OS_READLINE
+! CR TO LF
+ LDR.B R0,[R10,R1]
+ CMP R0,#13
+ BNE _23
+ MOV R0,#10
+ STR.B R0,[R10,R1]
+_23:
+ ADD R1,R1,#1 ! INC BUFFER COUNT
+ STMFD R12<,{R1}
+ MOV R0,#0
+ STMFD R12<,{R0}
+ MOV R15,R14
+_22:
+! READ FROM A FILE
+ LDR R2,[R12,#8]
+ LDR R3,[R12,#12]
+ STR R5,_savreg
+ STR R4,_savreg2
+ MOV R5,R3
+ SWI 12  !os_gbpb
+ SUB R5,R5,R3
+ STMFD R12<,{R5}
+ MOV R5,#0
+ STMFD R12<,{R5}
+ LDR R5,_savreg
+ LDR R4,_savreg2
+ MOV R15,R14
+_3:
+ CMP R11,#4
+ BNE _4
+!
+! WRITE
+!
+ LDR R1,[R12,#4]
+ CMP R1,#5
+ BGE _33
+! WRITE TO THE SCREEN
+ LDR R0,[R12,#8]
+ LDR R1,[R12,#12]
+ SWI 70  !os_writeN
+! APPEND CR TO LINE ENDING WITH LF
+ LDR R0,[R12,#12]
+ SUB R0,R0,#1
+ LDR R1,[R12,#8]
+ LDR.B R2,[R1,R0]
+ CMP R2,#10
+ SWI.EQ 269  !OUTPUT CR
+ LDR R1,[R12,#12]
+ STMFD R12<,{R1}
+ MOV R1,#0
+ STMFD R12<,{R1}
+ MOV R15,R14
+_33:
+! WRITE TO A FILE
+ MOV R0,#2
+ LDR R2,[R12,#8]
+ LDR R3,[R12,#12]
+ STR R5,_savreg
+ STR R4,_savreg2
+ SWI 12  !os_gbpb
+ LDR R1,[R12,#12]   !always success
+ STMFD R12<,{R1}
+ LDR R5,_savreg
+ LDR R4,_savreg2
+ MOV R0,#0
+ STMFD R12<,{R0}
+ MOV R15,R14
+_4:
+ CMP R11,#5
+ BNE _5
+!
+! OPEN
+!
+ LDR R2,[R12,#8]
+ CMP R2,#0
+ BNE _46
+ MOV R0,#67  !READ ONLY
+ BAL _45
+_46:
+ CMP R2,#2
+ BNE _44
+ MOV R0,#195  !UPDATE, FILE MUST EXIST
+ BAL _45
+_44:
+ MOV R0,#131  !CREATE AND OPEN FOR UPDATE
+_45:
+ LDR R1,[R12,#4]  !FILE NAME
+ MOV R2,#0  !NO PATH
+ SWI 0x2000D  !Xos_find
+ MOV.VS R0,#0
+ CMP R0,#0 !MAP ERROR CODES
+ MOV.EQ R0,#-1
+ STMFD R12<,{R0}
+ MOV R2,#0
+ STMFD R12<,{R2}
+ MOV R15,R14
+_5:
+ CMP R11,#6
+ BNE _6
+!
+! CLOSE
+!
+ MOV R0,#0
+ LDR R1,[R12,#4]
+ CMP R1,#5
+ BLT _51  !IGNORE IF NOT FILE
+ SWI 0x2000D  !Xos_find (IGNORE ERRORS)
+_51:
+ MOV R0,#0
+! STMFD R12<,{R0}  !not sure...
+ STMFD R12<,{R0}
+ MOV R15,R14
+_6:
+ CMP R11,#8
+ BNE _7
+!
+! CREAT
+!
+ BAL _44
+_7:
+ CMP R11,#10
+ BNE _8
+!
+! UNLINK
+!
+! note that on UNIX, unlink may be
+! done on an open file. This would
+! cause an error on RiscOs, which is ignored
+ MOV R0,#6
+ LDR R1,[R12,#4]
+ STR R5,_savreg
+ STR R4,_savreg2
+ CMP R1,#5
+ SWI.GE 0x20008  !os_file
+ LDR R5,_savreg
+ LDR R4,_savreg2
+ MOV R8,#0
+! STMFD R12<,{R8}  ! not sure...
+ STMFD R12<,{R8}
+ MOV R15,R14
+_8:
+ CMP R11,#12
+ BNE _9
+!
+! CHDIR
+!
+ MOV R0,#0
+ LDR R1,[R12,#4]
+ SWI 41  !os_fscontrol
+ MOV R0,#0
+ STMFD R12<,{R0}  !not sure...
+ STMFD R12<,{R0}
+ MOV R15,R14
+_9:
+ CMP R11,#19
+ BNE _10
+!
+! LSEEK
+!
+ MOV R0,#0  !FIRST GET CURRENT PTR
+ LDR R1,[R12,#4]
+ SWI 9  !OS_ARGS
+ MOV R11,R2
+ LDR R3,[R12,#12]  !NOW DO THE LSEEK
+ CMP R3,#2
+ BEQ _92
+ CMP R3,#1
+ BEQ _91
+ LDR R1,[R12,#4]
+ LDR R2,[R12,#8]
+_90:
+ MOV R0,#1
+ SWI 9  !os_args
+ BAL _99
+_92:
+ MOV R0,#2
+ LDR R1,[R12,#4]
+ SWI 9  !os_args
+ LDR R8,[R12,#8]
+ ADD R2,R2,R8
+ LDR R1,[R12,#4]
+ BAL _90
+_91:
+ MOV R0,#0
+ LDR R1,[R12,#4]
+ SWI 9  !os_args
+ LDR R3,[R12,#8]
+ ADD R2,R1,R3
+ BAL _90
+_99:
+ STMFD R12<,{R11}
+ MOV R0,#0
+ STMFD R12<,{R0}
+ MOV R15,R14
+_10:
+ CMP R11, #54
+ BNE _1001
+!
+! IOCTL
+! always returns 0
+!
+ MOV R0, #0
+ STMFD R12<, {R0}
+ MOV R15, R14
+!
+! TIMES
+!
+_1001:
+ CMP R11, #43
+ BNE _1003
+ ADR R1,_17
+ MOV R0,#3
+ STR R0,[R1]
+ MOV R0,#14
+ SWI 7  !OS_WORD
+ ADR R0,_17
+ LDR R0,[R0]
+ MOV R1,#0
+ LDR R2,[R12,#4]
+ STR R0,[R2]
+ STR R0,[R2,#4] ! utime = stime
+ STR R1,[R2,#8]
+ STR R1,[R2,#12]
+ STMFD R12<,{R1}
+ MOV R15,R14
+!
+! GETPID
+! returns random number (clock ticks)
+!
+_1003:
+ CMP R11, #20
+ BNE _1002
+ ADR R1,_17
+ MOV R0,#3
+ STR R0,[R1]
+ MOV R0,#14
+ SWI 7  !OS_WORD
+ ADR R0,_17
+ LDR R0,[R0]
+ AND R0,R0,#0xFF
+ STMFD R12<,{R0}
+ MOV R15,R14
+!
+! EXECE
+! ONLY FIRST PARAMETER IS USED
+!
+_1002:
+ CMP R11, #59
+ BNE _1000
+ LDR R0,[R12,#4]
+ SWI 5  !OS_CLI
+ MOV R0,#0
+ STMFD R12<,{R0}
+ MOV R15,R14
+! 
+! NOT IMPLEMENTED CALLS
+! ---------------------
+! THESE CALLS MAY REQUIRE DIFFERENT
+! STACK HANDLING (THERE MAY BE BUGS HERE!!)
+! (the number of return values does not always
+! correspond to the Ack manual)
+!
+_1000:
+ CMP R11,#7
+ BNE _9726
+ ADR R0,_9607
+ BAL _9352
+_9726:
+ CMP R11,#26
+ BNE _9727
+ ADR R0,_9626
+ BAL _9352
+_9727:
+ CMP R11,#27
+ BNE _9741
+ ADR R0,_9627
+ BAL _9352
+_9741:
+ CMP R11,#41
+ BNE _9742
+ ADR R0,_9641
+ BAL _9352
+_9742:
+ CMP R11,#42
+ BNE _9748
+ ADR R0,_9642
+ BAL _9352
+_9748:
+ CMP R11,#48
+ BNE _9760
+ ADR R0,_9648
+ BAL _9352
+_9760:
+ CMP R11,#60
+ BNE _9709
+ ADR R0,_9660
+ BAL _9352
+_9709:
+ CMP R11,#9
+ BNE _9714
+ ADR R0,_9609
+ BAL _9351
+_9714:
+ CMP R11,#14
+ BNE _9715
+ ADR R0,_9614
+ BAL _9351
+_9715:
+ CMP R11,#15
+ BNE _9716
+ ADR R0,_9615
+ BAL _9351
+_9716:
+ CMP R11,#16
+ BNE _9718
+ ADR R0,_9616
+ BAL _9351
+_9718:
+ CMP R11,#18
+ BNE _9720
+ ADR R0,_9618
+ BAL _9351
+_9720:
+ CMP R11,#20
+ BNE _9721
+ ADR R0,_9620
+ BAL _9351
+_9721:
+ CMP R11,#21
+ BNE _9722
+ ADR R0,_9621
+ BAL _9351
+_9722:
+ CMP R11,#22
+ BNE _9723
+ ADR R0,_9622
+ BAL _9351
+_9723:
+ CMP R11,#23
+ BNE _9724
+ ADR R0,_9623
+ BAL _9351
+_9724:
+ CMP R11,#24
+ BNE _9725
+ ADR R0,_9624
+ BAL _9351
+_9725:
+ CMP R11,#25
+ BNE _9728
+ ADR R0,_9625
+ BAL _9351
+_9728:
+ CMP R11,#28
+ BNE _9729
+ ADR R0,_9628
+ BAL _9351
+_9729:
+ CMP R11,#29
+ BNE _9730
+ ADR R0,_9629
+ BAL _9351
+_9730:
+ CMP R11,#30
+ BNE _9733
+ ADR R0,_9630
+ BAL _9351
+_9733:
+ CMP R11,#33
+ BNE _9734
+ ADR R0,_9633
+ BAL _9351
+_9734:
+ CMP R11,#34
+ BNE _9735
+ ADR R0,_9634
+ BAL _9351
+_9735:
+ CMP R11,#35
+ BNE _9736
+ ADR R0,_9635
+ BAL _9351
+_9736:
+ CMP R11,#36
+ BNE _9737
+ ADR R0,_9636
+ BAL _9351
+_9737:
+ CMP R11,#37
+ BNE _9744
+ ADR R0,_9637
+ BAL _9351
+_9744:
+ CMP R11,#44
+ BNE 9746
+ ADR R0,_9644
+ BAL _9351
+_9746:
+ CMP R11,#46
+ BNE 9747
+ ADR R0,_9646
+ BAL _9351
+_9747:
+ CMP R11,#47
+ BNE 9751
+ ADR R0,_9647
+ BAL _9351
+_9751:
+ CMP R11,#51
+ BNE 9753
+ ADR R0,_9651
+ BAL _9351
+_9753:
+ CMP R11,#53
+ BNE 9756
+ ADR R0,_9653
+ BAL _9351
+_9756:
+ CMP R11,#56
+ BNE 9761
+ ADR R0,_9656
+ BAL _9351
+_9761:
+ ADR R0,_9661
+ BAL _9351
+
+ 
+.sect .data
+_14:
+.data4 0
+.data4 0
+_15:
+.asciz "Monitor call "
+.data4 0
+.align 4
+_16:
+.asciz ": not implemented"
+.data4 0
+.align 4
+_17:
+.data4 3
+.data4 0
+.align 4
+
+.sect .text
+
+_EmTrp:
+ SWI 3  !OS_NEWLINE
+ LDR R11,[R12]
+!
+! deal with ignore mask here
+! (not yet implemented)
+!
+ CMP R11,#0
+ BNE _9101
+ ADR R0,_9000
+ BAL _9200
+_9101:
+ CMP R11,#1
+ BNE _9102
+ ADR R0,_9001
+ BAL _9200
+_9102:
+ CMP R11,#2
+ BNE _9103
+ ADR R0,_9002
+ BAL _9200
+_9103:
+ CMP R11,#3
+ BNE _9104
+ ADR R0,_9003
+ BAL _9200
+_9104:
+ CMP R11,#4
+ BNE _9105
+ ADR R0,_9004
+ BAL _9200
+_9105:
+ CMP R11,#5
+ BNE _9106
+ ADR R0,_9005
+ BAL _9200
+_9106:
+ CMP R11,#6
+ BNE _9107
+ ADR R0,_9006
+ BAL _9200
+_9107:
+ CMP R11,#7
+ BNE _9108
+ ADR R0,_9007
+ BAL _9200
+_9108:
+ CMP R11,#8
+ BNE _9109
+ ADR R0,_9008
+ BAL _9200
+_9109:
+ CMP R11,#9
+ BNE _9110
+ ADR R0,_9009
+ BAL _9200
+_9110:
+ CMP R11,#10
+ BNE _9111
+ ADR R0,_9010
+ BAL _9200
+_9111:
+ CMP R11,#11
+ BNE _9112
+ ADR R0,_9011
+ BAL _9200
+_9112:
+ CMP R11,#12
+ BNE _9113
+ ADR R0,_9012
+ BAL _9200
+_9113:
+ CMP R11,#13
+ BNE _9114
+ ADR R0,_9013
+ BAL _9200
+_9114:
+ CMP R11,#14
+ BNE _9115
+ ADR R0,_9014
+ BAL _9200
+_9115:
+ CMP R11,#15
+ BNE _9116
+ ADR R0,_9015
+ BAL _9200
+_9116:
+ CMP R11,#16
+ BNE _9117
+ ADR R0,_9016
+ BAL _9200
+_9117:
+ CMP R11,#17
+ BNE _9118
+ ADR R0,_9017
+ BAL _9200
+_9118:
+ CMP R11,#18
+ BNE _9119
+ ADR R0,_9018
+ BAL _9200
+_9119:
+ CMP R11,#19
+ BNE _9120
+ ADR R0,_9019
+ BAL _9200
+_9120:
+ CMP R11,#20
+ BNE _9121
+ ADR R0,_9020
+ BAL _9200
+_9121:
+ CMP R11,#21
+ BNE _9122
+ ADR R0,_9021
+ BAL _9200
+_9122:
+ CMP R11,#22
+ BNE _9123
+ ADR R0,_9022
+ BAL _9200
+_9123:
+ CMP R11,#23
+ BNE _9124
+ ADR R0,_9023
+ BAL _9200
+_9124:
+ CMP R11,#24
+ BNE _9125
+ ADR R0,_9024
+ BAL _9200
+_9125:
+ CMP R11,#25
+ BNE _9126
+ ADR R0,_9025
+ BAL _9200
+_9126:
+ CMP R11,#26
+ BNE _9127
+ ADR R0,_9026
+ BAL _9200
+_9127:
+ CMP R11,#27
+ BNE _9128
+ ADR R0,_9027
+ BAL _9200
+_9128:
+ CMP R11,#127
+ BGT _9129
+ ADR R0,_9028
+ SWI 2  !OS_WRITE0
+ MOV R0,R11
+ ADR R1,_12
+ MOV R2,#5
+ SWI 217  !CONVERT
+ SUB R1,R1,R0
+ SWI 70  !WRITEN
+ BAL _9300
+_9129:
+ ADR R0,_11
+ SWI 2  !OS_WRITE0
+ MOV R0,R11
+ ADR R1,_12
+ MOV R2,#5
+ SWI 217  !CONVERT
+ SUB R1,R1,R0
+ SWI 70  !WRITEN
+ BAL _9300
+_9200: SWI 2
+_9300:
+ ADR R0, _Lineno
+ LDR R0,[R0]
+ CMP R0,#0
+ BEQ _9301
+ MOV R10,R0
+ ADR R0,_9050
+ SWI 2
+ MOV R0,R10
+ ADR R1,_12
+ MOV R2,#5
+ SWI 217
+ SUB R1,R1,R0
+ SWI 70
+ SWI 3
+ BAL _9302
+_9301:
+ ADR R0,_9501
+ SWI 2
+ SWI 3
+_9302:
+ MOV R0,#1
+ STMFD R12<,{R0}
+ STMFD R12<,{R0}
+ BAL.L _EmMon
+_9351:
+ SWI 2  !WRITE0
+ ADR R0,_16
+ SWI 2 !OS_WRITE0
+ SWI 3 !NEWLINE
+ MOV R0, #0
+ STMFD R12<,{R0}
+ MOV R15,R14
+_9352:
+ SWI 2  !WRITE0
+ ADR R0,_16
+ SWI 2 !OS_WRITE0
+ SWI 3 !NEWLINE
+ MOV R0, #0
+ STMFD R12<,{R0}
+ STMFD R12<,{R0}
+ MOV R15,R14
+
+
+.sect.data
+_11:
+.asciz "Trap "
+.align 4
+_12:
+.data4 0
+.data4 0
+_9000:
+.asciz "Array bound error "
+.align 4
+_9001:
+.asciz "Range bound error "
+.align 4
+_9002:
+.asciz "Set bound error "
+.align 4
+_9003:
+.asciz "Integer overflow "
+.align 4
+_9004:
+.asciz "Floating overflow "
+.align 4
+_9005:
+.asciz "Floating underflow "
+.align 4
+_9006:
+.asciz "Divide by 0 "
+.align 4
+_9007:
+.asciz "Divide by 0.0 "
+.align 4
+_9008:
+.asciz "Undefined integer "
+.align 4
+_9009:
+.asciz "Undefined float "
+.align 4
+_9010:
+.asciz "Conversion error "
+.align 4
+_9011:
+.asciz "unknown trap "
+.align 4
+_9012:
+.asciz "unknown trap "
+.align 4
+_9013:
+.asciz "unknown trap "
+.align 4
+_9014:
+.asciz "unknown trap "
+.align 4
+_9015:
+.asciz "unknown trap "
+.align 4
+_9016:
+.asciz "Stack overflow "
+.align 4
+_9017:
+.asciz "Heap overflow "
+.align 4
+_9018:
+.asciz "Illegal instruction "
+.align 4
+_9019:
+.asciz "Illegal size argument "
+.align 4
+_9020:
+.asciz "Case error "
+.align 4
+_9021:
+.asciz "Addressing non-existent memory "
+.align 4
+_9022:
+.asciz "Bad pointer used "
+.align 4
+_9023:
+.asciz "Program counter out of range "
+.align 4
+_9024:
+.asciz "Bad argument of LAE "
+.align 4
+_9025:
+.asciz "Bad monitor call "
+.align 4
+_9026:
+.asciz "Argument of LIN too high "
+.align 4
+_9027:
+.asciz "GOTO decriptor error "
+.align 4
+_9028:
+.asciz "Language run-time trap "
+.align 4
+_9501:
+.asciz " (line number unknown)"
+.align 4
+_9050:
+.asciz " at line "
+.align 4
+
+_9607:
+.asciz "Wait"
+.align 4
+_9609:
+.asciz "Link"
+.align 4
+_9614:
+.asciz "Mknod"
+.align 4
+_9615:
+.asciz "Chmod"
+.align 4
+_9616:
+.asciz "Chown"
+.align 4
+_9618:
+.asciz "Stat"
+.align 4
+_9620:
+.asciz "Getpid"
+.align 4
+_9621:
+.asciz "Mount"
+.align 4
+_9622:
+.asciz "Umount"
+.align 4
+_9623:
+.asciz "Setuid"
+.align 4
+_9624:
+.asciz "Getuid"
+.align 4
+_9625:
+.asciz "Stime"
+.align 4
+_9626:
+.asciz "Ptrace"
+.align 4
+_9627:
+.asciz "Alarm"
+.align 4
+_9628:
+.asciz "Fstat"
+.align 4
+_9629:
+.asciz "Pause"
+.align 4
+_9630:
+.asciz "Utime"
+.align 4
+_9633:
+.asciz "Access"
+.align 4
+_9634:
+.asciz "Nice"
+.align 4
+_9635:
+.asciz "Ftime"
+.align 4
+_9636:
+.asciz "Sync"
+.align 4
+_9637:
+.asciz "Kill"
+.align 4
+_9641:
+.asciz "Dup"
+.align 4
+_9642:
+.asciz "Pipe"
+.align 4
+_9644:
+.asciz "Profil"
+.align 4
+_9646:
+.asciz "Setgid"
+.align 4
+_9647:
+.asciz "Getgid"
+.align 4
+_9648:
+.asciz "Sigtrp"
+.align 4
+_9651:
+.asciz "Acct"
+.align 4
+_9653:
+.asciz "Lock"
+.align 4
+_9656:
+.asciz "Mpxcall"
+.align 4
+_9660:
+.asciz "Umask"
+.align 4
+_9661:
+.asciz "Chroot"
+.align 4
+
+.sect .data
+_savreg:
+.data4 0
+_savreg2:
+.data4 0
+
+

+ 94 - 0
mach/arm/libmon/swi.s

@@ -0,0 +1,94 @@
+.define _Swi, _Swix, _bbc_get, _bbc_vduw, _bbc_vdu
+.sect .text
+
+! Swi(code, regpt)
+
+_Swi:
+ ADR R11,_100
+ LDR R10,[R11]
+ LDR R9,[R12]
+ AND R10,R10,#0xFF000000
+ AND R9,R9,#0xFFFFFF
+ ORR R10,R10,R9
+ STR R10,[R11]
+ LDR R11,[R12,#4]  ! PT TO REGS
+ STMFD R12<,{R4,R5,R6,R7}
+ LDR R0,[R11,#0]
+ LDR R1,[R11,#4]
+ LDR R2,[R11,#8]
+ LDR R3,[R11,#12]
+ LDR R4,[R11,#16]
+ LDR R5,[R11,#20]
+ LDR R6,[R11,#24]
+ LDR R7,[R11,#28]
+ LDR R8,[R11,#32]
+ LDR R9,[R11,#36]
+_100:
+ SWI 0
+ STR R0,[R11,#0]
+ STR R1,[R11,#4]
+ STR R2,[R11,#8]
+ STR R3,[R11,#12]
+ STR R4,[R11,#16]
+ STR R5,[R11,#20]
+ STR R6,[R11,#24]
+ STR R7,[R11,#28]
+ STR R8,[R11,#32]
+ STR R9,[R11,#36]
+ LDMFD R12<,{R4,R5,R6,R7}
+ MOV.S R15,R14
+ 
+_Swix:
+ ADR R11,_101
+ LDR R10,[R11]
+ LDR R9,[R12]
+ AND R10,R10,#0xFF000000
+ AND R9,R9,#0xFFFFFF
+ ORR R10,R10,R9
+ ORR R10,R10,#0x20000
+ STR R10,[R11]
+ LDR R11,[R12,#4]
+ STMFD R12<,{R4,R5,R6,R7}
+ LDR R0,[R11,#0]
+ LDR R1,[R11,#4]
+ LDR R2,[R11,#8]
+ LDR R3,[R11,#12]
+ LDR R4,[R11,#16]
+ LDR R5,[R11,#20]
+ LDR R6,[R11,#24]
+ LDR R7,[R11,#28]
+ LDR R8,[R11,#32]
+ LDR R9,[R11,#36]
+_101:
+ SWI 0
+ STR R0,[R11,#0]
+ STR R1,[R11,#4]
+ STR R2,[R11,#8]
+ STR R3,[R11,#12]
+ STR R4,[R11,#16]
+ STR R5,[R11,#20]
+ STR R6,[R11,#24]
+ STR R7,[R11,#28]
+ STR R8,[R11,#32]
+ STR R9,[R11,#36]
+ MOV.VC R0, #0
+ LDMFD R12<,{R4,R5,R6,R7}
+ MOV.S R15,R14
+
+! the rest is for Acorn compatibility
+
+_bbc_get:
+ SWI 4    ! READC
+ MOV.S R15,R14
+
+_bbc_vduw:
+ LDR R0,[R12]
+ SWI 0    !WRITEC
+ MOV R0,R0,LSR #8
+ SWI 0
+ MOV.S R15,R14
+
+_bbc_vdu:
+ LDR R0,[R12]
+ SWI 0
+ MOV.S R15,R14