ack/mach/arm/libmon/svc.s
1990-11-12 17:13:45 +00:00

906 lines
11 KiB
ArmAsm

.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