; generated by Norcroft RISC OS ARM C vsn 5.06 (Acorn Computers Ltd) [May 25 1995] ; Silly buggery because we want to export fp, sp and pc ! a1 RN 0 a2 RN 1 a3 RN 2 a4 RN 3 v1 RN 4 v2 RN 5 v3 RN 6 z_fp RN 7 z_sp RN 8 z_pc RN 9 sl RN 10 fp RN 11 ip RN 12 sp RN 13 lr RN 14 pc RN 15 FUNCTION * 0 PROCEDURE * 1 GET hdr.options GET hdr.apcs AREA |Asm$$code|, CODE, READONLY IMPORT gasp IMPORT load_operand IMPORT load_operand_s IMPORT z_picture_table IMPORT z_log_shift IMPORT z_art_shift IMPORT z_set_font IMPORT z_draw_picture IMPORT z_picture_data IMPORT z_erase_picture IMPORT z_set_margins IMPORT z_save_undo IMPORT z_restore_undo IMPORT z_print_unicode IMPORT z_check_unicode IMPORT z_set_true_colour [ :DEF:ZSPEC11DRAFT IMPORT z_sound_data ] IMPORT z_move_window IMPORT z_window_size IMPORT z_window_style IMPORT z_get_wind_prop IMPORT z_scroll_window IMPORT z_pop_stack IMPORT z_read_mouse IMPORT z_mouse_window IMPORT z_push_stack IMPORT z_put_wind_prop IMPORT z_print_form IMPORT z_make_menu IMPORT z_check_arg_count IMPORT z_je IMPORT z_jl IMPORT z_jg IMPORT z_dec_chk IMPORT z_inc_chk IMPORT z_jin ; IMPORT z_test ; IMPORT z_or ; IMPORT z_and IMPORT z_test_attr IMPORT z_set_attr IMPORT z_clear_attr IMPORT z_store IMPORT z_insert_obj IMPORT z_loadw IMPORT z_loadb IMPORT z_get_prop IMPORT z_get_prop_addr IMPORT z_get_next_prop ; IMPORT z_add ; IMPORT z_sub ; IMPORT z_mul ; IMPORT z_div ; IMPORT z_mod IMPORT z_set_colour IMPORT z_throw IMPORT z_storew IMPORT z_storeb IMPORT z_put_prop IMPORT z_read IMPORT z_print_char IMPORT z_print_num IMPORT z_random IMPORT z_push IMPORT z_pull IMPORT z_split_window IMPORT z_set_window IMPORT z_erase_window IMPORT z_erase_line IMPORT z_set_cursor IMPORT z_get_cursor IMPORT z_set_text_style IMPORT z_buffer_mode IMPORT z_output_stream IMPORT z_input_stream IMPORT z_sound_effect IMPORT z_read_char IMPORT z_scan_table IMPORT z_tokenise IMPORT z_encode_text IMPORT z_copy_table IMPORT z_print_table IMPORT z_not IMPORT z_jz IMPORT z_get_sibling IMPORT z_get_child IMPORT z_get_parent IMPORT z_get_prop_len IMPORT z_inc IMPORT z_dec IMPORT z_print_addr ; IMPORT z_call IMPORT z_remove_obj IMPORT z_print_obj IMPORT z_jump IMPORT z_print_paddr IMPORT z_load IMPORT z_piracy IMPORT z_print IMPORT z_print_ret IMPORT z_save IMPORT z_restore IMPORT z_restart ; IMPORT z_ret IMPORT z_catch IMPORT z_new_line IMPORT z_show_status IMPORT z_verify IMPORT z_buffer_screen IMPORT fatal IMPORT msgs_lookup IMPORT store_operand IMPORT h_type IMPORT interrupt_finished IMPORT datap EXPORT z_rtrue EXPORT z_rfalse EXPORT interpret interpret MOV ip,sp STMFD sp!,{v1-v3,fp,ip,lr,pc} SUB fp,ip,#4 SUB sp,sp,#32 MOV v3,#8192 01 [ TRACING IMPORT __iob IMPORT _fprintf LDR a4,=datap LDR a4,[a4] LDR a1,=__iob+2*40 ADR a2,trace_fmt SUB a3,z_pc,a4 BL _fprintf B %FT222 trace_fmt = "%05X\n",0 ALIGN 222 ] LDRB v2,[z_pc],#1 SUBS v3,v3,#1 MOVEQ v3,#4096 BLEQ gasp [ {FALSE} LDR v2,=datap LDR v2,[v2] ADD v2,v2,#&7100 ADD v2,v2,#&007A TEQ a1,v2 BNE %FT88 SWI &107 ] [ ALLOW_OPCOUNT LDR lr,=opcount LDR ip,[lr,v2,LSL #2] ADD ip,ip,#1 STR ip,[lr,v2,LSL #2] ] CMPS v2,#128 BLO load_2OP CMPS v2,#176 BLO single_op CMPS v2,#192 BLO zero_op B load_vari_op IMPORT globalp IMPORT conditional_jump_eq load_2OP ; Two operand class, load both operands LDRB a1,[z_pc],#1 ; a1 = next byte (operand 1) LDRB a2,[z_pc],#1 ; a2 = next byte (operand 2) TSTS v2,#&40 ; EQ = byte; NE = variable BEQ |2OP_next_operand| TEQS a1,#0 LDREQ a1,[z_sp],#4 ; var 0 => pop stack BEQ |2OP_next_operand| SUBS lr,a1,#16 LDRLT a1,[z_fp,-a1,LSL #2] BLT |2OP_next_operand| LDR a1,=globalp LDR a3,[a1] LDRB a1,[a3,lr,LSL #1]! LDRB lr,[a3,#1] ORR a1,lr,a1,LSL #8 |2OP_next_operand| TSTS v2,#&20 ; EQ = byte; NE = variable BEQ |2OP_go| TEQS a2,#0 LDREQ a2,[z_sp],#4 ; var 0 => pop stack BEQ |2OP_go| SUBS lr,a2,#16 LDRLT a2,[z_fp,-a2,LSL #2] BLT |2OP_go| LDR a2,=globalp LDR a3,[a2] LDRB a2,[a3,lr,LSL #1]! LDRB lr,[a3,#1] ORR a2,lr,a2,LSL #8 |2OP_go| AND v2,v2,#&1F ADR lr,%98 ADD pc,pc,v2,LSL #3 NOP ; 2OP:0 B call_fatal NOP ; 2OP:1 - je TEQS a1,a2 B conditional_jump_eq ; 2OP:2 - jl B z_jl NOP ; 2OP:3 - jg B z_jg NOP ; 2OP:4 - dec_chk B z_dec_chk NOP ; 2OP:5 - inc_chk B z_inc_chk NOP ; 2OP:6 - jin B z_jin NOP ; 2OP:7 - test z_test BICS a1,a2,a1 B conditional_jump_eq ; 2OP:8 - or z_or ORR a1,a1,a2 B store_operand ; 2OP:9 - and z_and AND a1,a1,a2 B store_operand ; 2OP:10 - test_attr B z_test_attr NOP ; 2OP:11 - set_attr B z_set_attr NOP ; 2OP:12 - clear_attr B z_clear_attr NOP ; 2OP:13 - store B z_store NOP ; 2OP:14 - insert_obj B z_insert_obj NOP ; 2OP:15 - loadw B z_loadw NOP ; 2OP:16 - loadb B z_loadb NOP ; 2OP:17 - get_prop B z_get_prop NOP ; 2OP:18 - get_prop_addr B z_get_prop_addr NOP ; 2OP:19 - get_next_prop B z_get_next_prop NOP ; 2OP:20 - add z_add ADD a1,a1,a2 B store_operand ; 2OP:21 - sub z_sub SUB a1,a1,a2 B store_operand ; 2OP:22 - mul z_mul MUL a1,a2,a1 B store_operand ; 2OP:23 - div B z_div NOP ; 2OP:24 - mod B z_mod NOP ; 2OP:25 - call_2s MOV a3,#FUNCTION B do_call_2 ; 2OP:26 - call_2n MOV a3,#PROCEDURE B do_call_2 ; 2OP:27 - set_colour STMIA sp,{a1,a2} B set_colour_2 ; 2OP:28 - throw B z_throw NOP ; 2OP:29 - xor z_xor EOR a1,a1,a2 B store_operand ; 2OP:30 B call_fatal NOP ; 2OP:31 B call_fatal do_call_2 STMIA sp,{a1,a2} MOV a1,#2 MOV a2,sp B z_call set_colour_2 MOV a1,#2 MOV a2,sp B z_set_colour extended_op LDRB v2,[z_pc],#1 [ ALLOW_OPCOUNT LDR lr,=opcount+256*4 LDR ip,[lr,v2,LSL #2] ADD ip,ip,#1 STR ip,[lr,v2,LSL #2] ] LDRB a4,[z_pc],#1 MOV v1,#0 ADD v2,v2,#256-192 ORR a4,a4,#&C0000000 MOV a4,a4,ROR #6 B %FT07 ; Variable operand class, load operand specifier load_vari_op TEQS v2,#236 TEQNES v2,#250 ; Extended CALL instruction LDRB a4,[z_pc],#1 LDREQB lr,[z_pc],#1 MOV v1,#0 ORREQ a4,a4,lr,LSL #24 ORRNE a4,a4,#&C0000000 ORREQ a4,a4,#&00C00000 MOV a4,a4,ROR #6 SUB v2,v2,#192 07 AND a1,a4,#3 TEQS a1,#3 BEQ do_two_or_mult_op BL load_operand STR a1,[sp,v1,LSL #2] ADD v1,v1,#1 MOV a4,a4,ROR #30 B %B07 98 LDR a1,=interrupt_finished LDR a1,[a1] TEQS a1,#0 BEQ %B01 Return "v1-v3",fpbased do_two_or_mult_op ADR lr,%98 MOV a1,v1 ; Required to fit all cases into 2 instructions (!) CMPS v2,#256+29-192 ADDLS pc,pc,v2,LSL #3 ; EXT:29+ ; spec says to ignore B %98 ; VAR:192 B call_fatal NOP ; VAR:193 MOV a2,sp B z_je ; VAR:194 LDMIA sp,{a1,a2} B z_jl ; VAR:195 LDMIA sp,{a1,a2} B z_jg ; VAR:196 LDMIA sp,{a1,a2} B z_dec_chk ; VAR:197 LDMIA sp,{a1,a2} B z_inc_chk ; VAR:198 LDMIA sp,{a1,a2} B z_jin ; VAR:199 LDMIA sp,{a1,a2} B z_test ; VAR:200 LDMIA sp,{a1,a2} B z_or ; VAR:201 LDMIA sp,{a1,a2} B z_and ; VAR:202 LDMIA sp,{a1,a2} B z_test_attr ; VAR:203 LDMIA sp,{a1,a2} B z_set_attr ; VAR:204 LDMIA sp,{a1,a2} B z_clear_attr ; VAR:205 LDMIA sp,{a1,a2} B z_store ; VAR:206 LDMIA sp,{a1,a2} B z_insert_obj ; VAR:207 LDMIA sp,{a1,a2} B z_loadw ; VAR:208 LDMIA sp,{a1,a2} B z_loadb ; VAR:209 LDMIA sp,{a1,a2} B z_get_prop ; VAR:210 LDMIA sp,{a1,a2} B z_get_prop_addr ; VAR:211 LDMIA sp,{a1,a2} B z_get_next_prop ; VAR:212 LDMIA sp,{a1,a2} B z_add ; VAR:213 LDMIA sp,{a1,a2} B z_sub ; VAR:214 LDMIA sp,{a1,a2} B z_mul ; VAR:215 LDMIA sp,{a1,a2} B z_div ; VAR:216 LDMIA sp,{a1,a2} B z_mod ; VAR:217 - call_2s MOV a3,#FUNCTION B do_call_1b ; VAR:218 - call_2n MOV a3,#PROCEDURE B do_call_1b ; VAR:219 MOV a2,sp B z_set_colour ; VAR:220 LDMIA sp,{a1,a2} B z_throw ; VAR:221 LDMIA sp,{a1,a2} B z_xor ; VAR:222 B call_fatal NOP ; VAR:223 B call_fatal NOP ; VAR:224 - call_vs MOV a3,#FUNCTION B do_call_1b ; VAR:225 LDMIA sp,{a1-a3} B z_storew ; VAR:226 LDMIA sp,{a1-a3} B z_storeb ; VAR:227 LDMIA sp,{a1-a3} B z_put_prop ; VAR:228 MOV a2,sp B z_read ; VAR:229 LDR a1,[sp] B z_print_char ; VAR:230 LDR a1,[sp] B z_print_num ; VAR:231 LDR a1,[sp] B z_random ; VAR:232 LDR a1,[sp] B z_push ; VAR:233 MOV a2,sp B z_pull ; VAR:234 LDR a1,[sp] B z_split_window ; VAR:235 LDR a1,[sp] B z_set_window ; VAR:236 - call_vs2 MOV a3,#FUNCTION B do_call_1b ; VAR:237 LDR a1,[sp] B z_erase_window ; VAR:238 LDR a1,[sp] B z_erase_line ; VAR:239 MOV a2,sp B z_set_cursor ; VAR:240 LDR a1,[sp] B z_get_cursor ; VAR:241 LDR a1,[sp] B z_set_text_style ; VAR:242 LDR a1,[sp] B z_buffer_mode ; VAR:243 LDMIA sp,{a2-a4} B z_output_stream ; VAR:244 LDR a1,[sp] B z_input_stream ; VAR:245 MOV a2,sp B z_sound_effect ; VAR:246 MOV a2,sp B z_read_char ; VAR:247 MOV a2,sp B z_scan_table ; VAR:248 LDR a1,[sp] B z_not ; VAR:249 - call_vn MOV a3,#PROCEDURE B do_call_1b ; VAR:250 - call_vn2 MOV a3,#PROCEDURE B do_call_1b ; VAR:251 MOV a2,sp B z_tokenise ; VAR:252 LDMIA sp,{a1-a4} B z_encode_text ; VAR:253 LDMIA sp,{a1-a3} B z_copy_table ; VAR:254 MOV a2,sp B z_print_table ; VAR:255 LDR a1,[sp,#0] B z_check_arg_count ; EXT:0 - save MOV a2,sp B z_save ; EXT:1 - restore MOV a2,sp B z_restore ; EXT:2 - log_shift LDMIA sp,{a1,a2} B z_log_shift ; EXT:3 - art_shift LDMIA sp,{a1,a2} B z_art_shift ; EXT:4 - set_font MOV a2,sp B z_set_font ; EXT:5 - draw_picture MOV a2,sp B z_draw_picture ; EXT:6 - picture_data LDMIA sp,{a1,a2} B z_picture_data ; EXT:7 - erase_picture MOV a2,sp B z_erase_picture ; EXT:8 - set_margins MOV a2,sp B z_set_margins ; EXT:9 - save_undo B z_save_undo NOP ; EXT:10 - restore_undo B z_restore_undo NOP ; EXT:11 - print_unicode LDR a1,[sp,#0] B z_print_unicode ; EXT:12 - check_unicode LDR a1,[sp,#0] B z_check_unicode ; EXT:13 - set_true_colour MOV a2,sp B z_set_true_colour [ :DEF:ZSPEC11DRAFT ; EXT:14 - sound_data LDMIA sp,{a1,a2} B z_sound_data | ; EXT:14 - B call_fatal NOP ] ; EXT:15 - B call_fatal NOP ; EXT:16 - move_window LDMIA sp,{a1-a3} B z_move_window ; EXT:17 - window_size LDMIA sp,{a1-a3} B z_window_size ; EXT:18 - window_style MOV a2,sp B z_window_style ; EXT:19 - get_wind_prop LDMIA sp,{a1,a2} B z_get_wind_prop ; EXT:20 - scroll_window LDMIA sp,{a1,a2} B z_scroll_window ; EXT:21 - pop_stack MOV a2,sp B z_pop_stack ; EXT:22 - read_mouse LDR a1,[sp,#0] B z_read_mouse ; EXT:23 - mouse_window LDR a1,[sp,#0] B z_mouse_window ; EXT:24 - push_stack MOV a2,sp B z_push_stack ; EXT:25 - put_wind_prop LDMIA sp,{a1-a3} B z_put_wind_prop ; EXT:26 - print_form LDR a1,[sp,#0] B z_print_form ; EXT:27 - make_menu LDMIA sp,{a1-a2} B z_make_menu ; EXT:28 - picture_table LDR a1,[sp,#0] B z_picture_table ; EXT:29 - buffer_screen LDR a1,[sp,#0] B z_buffer_screen single_op AND a1,v2,#&30 CMP a1,#&10 BL load_operand_s ANDS a2,v2,#&F ADR lr,%98 ADDNE pc,pc,a2,LSL #2 ; 1OP:128 - jz TEQS a1,#0 B conditional_jump_eq ; 1OP:129 B z_get_sibling ; 1OP:130 B z_get_child ; 1OP:131 B z_get_parent ; 1OP:132 B z_get_prop_len ; 1OP:133 B z_inc ; 1OP:134 B z_dec ; 1OP:135 B z_print_addr ; 1OP:136 - call_1s B do_call_1 ; 1OP:137 B z_remove_obj ; 1OP:138 B z_print_obj ; 1OP:139 B z_ret ; 1OP:140 B z_jump ; 1OP:141 B z_print_paddr ; 1OP:142 B z_load ; 1OP:143 - call_1n or not LDR a2,=h_type LDRB a2,[a2] CMPS a2,#4 BLE z_not MOV a3,#PROCEDURE STR a1,[sp] MOV a1,#1 do_call_1b MOV a2,sp B z_call do_call_1 MOV a3,#FUNCTION MOV a2,sp STR a1,[sp] MOV a1,#1 B z_call zero_op ANDS a1,v2,#&f ADR lr,%98 ADDNE pc,pc,a1,LSL #2 ; 0OP:176 z_rtrue MOV a1,#1 B z_ret ; 0OP:177 B z_rfalse ; 0OP:178 B z_print ; 0OP:179 B z_print_ret ; 0OP:180 - nop B %98 ; 0OP:181 B do_save ; 0OP:182 B do_restore ; 0OP:183 B z_restart ; 0OP:184 B z_ret_popped ; 0OP:185 B z_catch ; 0OP:186 - quit Return "v1-v3",fpbased ; 0OP:187 B z_new_line ; 0OP:188 B z_show_status ; 0OP:189 B z_verify ; 0OP:190 B extended_op ; 0OP:191 B z_piracy do_save MOV a2,#0 MOV a1,#0 B z_save do_restore MOV a2,#0 MOV a1,#0 B z_restore Illegal_Operation = "IllOp", 0 ALIGN call_fatal ADR a1,Illegal_Operation BL msgs_lookup B fatal IMPORT datap EXPORT z_call EXPORT z_ret z_call LDR ip,[a2,#0] ; address [ TRACING STMFD sp!,{a1-a4,ip,lr} LDR a1,=__iob+2*40 ADR a2,call_trace_fmt MOV a3,ip BL _fprintf LDMFD sp!,{a1-a4,ip,lr} B %FT333 call_trace_fmt = "call %04X\n",0 ALIGN 333 ] TEQS ip,#0 BEQ z_call_0 LDR a4,=|x$dataseg| SUB a1,a1,#1 ORR a3,a1,a3,LSL #8 STMFD z_sp!,{a3,z_fp,z_pc} LDR a3,[a4,#0] MOV z_fp,z_sp ADD a3,a3,#1 STR a3,[a4,#0] LDMIB a4,{a3,z_pc} ; story_shift,h_routines_offset LDR a4,=datap LDR a4,[a4] ADD z_pc,z_pc,ip,LSL a3 ADD z_pc,a4,z_pc LDRB ip,[z_pc],#1 ; locals STRB ip,[z_fp,#2] SUBS ip,ip,#1 Return ,LinkNotStacked,LO LDR a4,=h_type LDRB a4,[a4] CMP a4,#5 BLO args_V4 args_V5 SUBS a1,a1,#1 BLO no_more_args_V5 04 LDR a4,[a2,#4]! SUBS ip,ip,#1 STR a4,[z_sp,#-4]! Return ,LinkNotStacked,LO SUBS a1,a1,#1 BHS %04 no_more_args_V5 MOV a4,#0 08 STR a4,[z_sp,#-4]! SUBS ip,ip,#1 BHS %08 Return ,LinkNotStacked args_V4 ADD z_pc,z_pc,a1,LSL #1 ; skip over unneeded defaults SUBS a1,a1,#1 BLO no_more_args_V4 12 LDR a4,[a2,#4]! SUBS ip,ip,#1 STR a4,[z_sp,#-4]! Return ,LinkNotStacked,LO SUBS a1,a1,#1 BHS %12 no_more_args_V4 16 LDRB a3,[z_pc],#1 LDRB a4,[z_pc],#1 SUBS ip,ip,#1 ORR a4,a4,a3,LSL #8 STR a4,[z_sp,#-4]! BHS %16 Return ,LinkNotStacked z_call_0 TEQS a3,#FUNCTION Return ,LinkNotStacked,NE MOV a1,#0 B store_operand z_ret_popped LDR a1,[z_sp],#4 B z_ret z_rfalse MOV a1,#0 z_ret LDR a4,=|x$dataseg| ADD z_sp,z_fp,#12 LDR a3,[a4,#0] LDMIA z_fp,{a2,z_fp,z_pc} SUB a3,a3,#1 STR a3,[a4,#0] ANDS a2,a2,#&0000FF00 BEQ store_operand TEQ a2,#PROCEDURE << 8 Return ,LinkNotStacked,EQ LDR a4,=interrupt_finished STR a1,[z_sp,#-4]! LDR a2,[a4] ADD a2,a2,#1 STR a2,[a4] Return ,LinkNotStacked IMPORT __rt_sdiv ; Can use v2 (opcode) in these two... z_div MOV a3,a1,ASL #16 MOV a4,a2,ASL #16 MOV a2,a3,ASR #16 MOVS a1,a4,ASR #16 [ {CONFIG}=26 MOVNE v2,lr BLNE __rt_sdiv MOVNE lr,v2 BNE store_operand B div0 | BEQ div0 MOV v2,lr BL __rt_sdiv MOV lr,v2 B store_operand ] z_mod MOV a3,a1,ASL #16 MOV a4,a2,ASL #16 MOV a2,a3,ASR #16 MOVS a1,a4,ASR #16 [ {CONFIG}=26 MOVNE v2,lr BLNE __rt_sdiv MOVNE lr,v2 MOVNE a1,a2 BNE store_operand B div0 | BEQ div0 MOV v2,lr BL __rt_sdiv MOV lr,v2 MOV a1,a2 B store_operand ] IMPORT fatal_lookup div0 ADR a1,div0_string B fatal_lookup div0_string = "DivZero",0 EXPORT story_shift EXPORT frame_number EXPORT h_routines_offset AREA |Asm$$zidata|,DATA,NOINIT |x$dataseg| frame_number % 4 story_shift % 4 h_routines_offset % 4 [ ALLOW_OPCOUNT EXPORT opcount opcount % 512*4 ] END