1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- mes 2,2,4
- exp $top_size
- pro $top_size, 14
- ldl 0 ; s_brk
- lor 1 ; s_brk SP
- sbs 4 ; s_brk-SP
- ret 4 ; return size of block to be saved
- end 14
- exp $top_save
- pro $top_save, 0
- loe 0
- lde 4 ; load line number and file name
- lim ; ignore mask
- lor 0 ; LB
- ldl 0 ; size of block
- loc 4
- loc 2
- cuu
- dup 2
- stl 0 ; push & store size in 2 bytes
- lor 1 ; SP (the SP BEFORE pushing)
- lor 1 ; SP (address of stack top to save)
- ldl 4 ; area
- lol 0 ; size
- bls 2 ; move whole block
- asp 18 ; remove the lot from the stack
- loc 1
- ret 2 ; return 1
- end 0
- exp $top_load
- pro $top_load, 0
- ldl 0
- dup 4
- sde area ; copy area pointer from argument 0
- loi 4 ; load indirect to
- str 1 ; restore SP
- lde area ; load area, note that the SP is now correct
- lor 1 ; SP (the SP AFTER, see above)
- lde area
- lof 4 ; size of block
- bls 2 ; move block back (SP becomes the SP BEFORE again!)
- asp 2 ; drop size
- str 0 ; LB
- sim ; ignore mask
- sde 4
- ste 0 ; line and file
- loc 0
- ret 2 ; return 0
- end 0
- area
- bss 4,0,0
|