[A83] Interrupt troubles [83, Ion]


[Prev][Next][Index][Thread]

[A83] Interrupt troubles [83, Ion]




Could somebody tell me why this code interrupt code has this strange
side-effect? When you run a program with it, everything works allright, you
return back to ion, you can run other ion programs. But when you exit the
shell, you can't come back, without reinstalling Ion.

The strange thing is, I don't have this problem under Venus, everything
works correct there. And it isn't an error in the startupcode of the
program, other (non-greyscale) z88dk ion-programs run without this problem.

The code is included just a little after the ion-header, the z88dk uses a
different assembler than TASM, but you should understand the code btw.

-------
defc statvars    = $858F	; 531 bytes free $858F / $87A2
defc plotSScreen = $8E29	; 768 bytes free (normal screen buffer)
defc saveSScreen = $8265        ; 768 bytes free (APD buffer) $8265 / $8566
defc intcount    = $878A        ; 1 byte needed

; Memory usage in statvars:
;	
; $858F / $85FF - 113 bytes - free
; $8600 / $8700 - 256 bytes - IV table
; $8701 / $8786 - 134 bytes - free
; $8787 / $8789 -   3 bytes - JP IntProcStart
; $878A         -   1 byte  - intcount
; $878B / $87A2 -  24 bytes - free
	
	im	1			;
	res	6,(iy+9)		; stats not valid
	ld	a,$86			; locate vector table at $8600-$8700
	ld	i,a			;
	ld	bc,$0100		; vector table is 256 bytes 
	ld	h,a			;
	ld	l,c			; HL = $8600
	ld	d,a			;
	ld	e,b			; DE = $8601
	inc	a			; A  = $87
	ld	(hl),a			; interrupt "program" located at 8787h
	ldir				;
					;
	ld	h,a			; HL = $8787
	ld	l,a			;
	ld	(hl),$C3		; Put a JP IntProcStart at $8787
	inc	hl			;
	ld	(hl),IntProcStart&$FF	;
	inc	hl			;
	ld	(hl),IntProcStart/256	;
					;
	xor	a			;
	ld	(intcount),a		;
	jp	jump_over		; Jump over the interrupt code

;-----------------
; Actual interrupt
;-----------------
.IntProcStart
	di				;
	push	af			;
	push	hl			;
	push	de			;
	push	bc			;
					;
	in	a,(3)			; check vbl int
	and	@00000010		;
	jr	z,exit_interrupt	;
	ld	hl,intcount		; inc counter
	inc	(hl)			;
	ld	a,(hl)			;
	dec	a			; 1
	jr	z,Display_pic1		;
	dec	a			; 2
	jr	z,Display_pic2		;
	ld	(hl),0			; reset counter
.exit_interrupt				;
	in	a,(3)			; check on interrupt status
	rra				;
	ld	a,0			;
	adc	a,9			;
	out	(3),a			;
	ld	a,$0B			;
	out	(3),a			;
					;
	pop	bc			;
	pop	de			;
	pop	hl			;
	pop	af			;
	ei				;
	reti				;

.Display_pic1				;
	ld	hl,(graybit1)		;
	jr	DisplayPicture		;
.Display_pic2				;
	ld	hl,(graybit2)		;
.DisplayPicture				;
	ld	a,$80			; fastCopy routine
	out	($10),a			; (Joe Wingbermuehle)
	ld	a,$20			;
	ld	c,a			;
	ld	de,755			;
	add	hl,de			;
.fastCopyAgain				;
	ld	b,64			;
	inc	c			;
	ld	de,-(12*64)+1		;
	out	($10),a			;
	add	hl,de			;
	ld	de,10			;
.fastCopyLoop				;
	add	hl,de			;
	inc	hl			;
	inc	hl			;
	inc	de			;
	ld	a,(hl)			;
	out	($11),a			;
	dec	de			;
	djnz	fastCopyLoop		;
	ld	a,c			;
	cp	$2B+1			;
	jr	nz,fastCopyAgain	;
	jr	exit_interrupt		;

	XDEF	graybit1
	XDEF	graybit2

.graybit1	defw	plotSScreen
IF DEFINED_DontUseApdRam
.graybit2	defw	gbuf2
.gbuf2		DEFS	768
ELSE
.graybit2	defw	saveSScreen
ENDIF

.jump_over




Follow-Ups: