.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