53 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  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
 |