; 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
