CP/M RMAC ASSEM 1.1	#001	BANK & MOVE MODULE FOR CP/M3 LINKED BIOS

                	title 'bank & move module for CP/M3 linked BIOS'
                
                	; letzte Aenderung am:
                	; 02.11.1984 (Joachim)	
                
                	cseg
                
                	public ?move,?xmove,?bank
                	extrn @cbnk
                
                	maclib z80
                
                	maclib cdef
                
                	maclib syspage
                
                ?xmove:
                	sbcd	sbank		; lege source und dest. bank ab
 0000+ED43      	DB	0EDH,43H
 0002+0A00      	DW	SBANK
 0004 3EFF      	mvi	a,0ffh		; setze flag fuer xmove
 0006 320C00    	sta	x$flg		;
 0009 C9        	ret
                
 000A 00        sbank	db	0		; source bank fuer xmove
 000B 00        dbank	db	0		; destination bank fuer xmove
 000C 00        x$flg	db	0		; flag fuer xmove aktiv
 000D 0000      sadrs	dw	0		; zwischenspeicher fuer xmove
 000F 0000      dadrs	dw	0		;
 0011 0000      length	dw	0		;
                
                ?move:
 0013 EB        	xchg			; we are passed source in DE and dest in HL
 0014 3A0C00    	lda	x$flg		; xmove aktiv?
 0017 3C        	inr	a		;
                	jrz	xmv		; sprung wenn ja
 0018+2804      	DB	28H,XMV-$-1
                	ldir			; use Z80 block move instruction
 001A+EDB0      	DB	0EDH,0B0H
 001C EB        	xchg			; need next addresses in same regs
 001D C9        	ret
                
                xmv:	sded	dadrs		; save destination
 001E+ED53      	DB	0EDH,53H
 0020+0F00      	DW	DADRS
                	sbcd	length		; save length
 0022+ED43      	DB	0EDH,43H
 0024+1100      	DW	LENGTH
 0026 3A0A00    	lda	sbank		; switch to source bank
 0029 CDD700    	call	?bank		;
 002C 115700    	lxi	d,xmv$buff	; ziel ist buffer
                	ldir			; uebertrage
 002F+EDB0      	DB	0EDH,0B0H
 0031 220D00    	shld	sadrs		;
 0034 3A0B00    	lda	dbank		; switch to dest. bank
 0037 CDD700    	call	?bank		;
CP/M RMAC ASSEM 1.1	#002	BANK & MOVE MODULE FOR CP/M3 LINKED BIOS

                	lded	dadrs		;
 003A+ED5B      	DB	0EDH,5BH
 003C+0F00      	DW	DADRS
                	lbcd	length		;
 003E+ED4B      	DB	0EDH,4BH
 0040+1100      	DW	LENGTH
 0042 215700    	lxi	h,xmv$buff	;
                	ldir			;
 0045+EDB0      	DB	0EDH,0B0H
 0047 3A0000    	lda	@cbnk		; orginal bank ein
 004A CDD700    	call	?bank		;
 004D EB        	xchg			;
                	lded	sadrs		;
 004E+ED5B      	DB	0EDH,5BH
 0050+0D00      	DW	SADRS
 0052 AF        	xra	a		;
 0053 320C00    	sta	x$flg		;
 0056 C9        	ret
                
 0057           xmv$buff:	ds	128
                
                ?bank:
 00D7 D5        	push	d		;
 00D8 C5        	push	b		;
 00D9 326FFF    	sta	current$bank	; wichtig fuer cinit u. csysgen
 00DC 01DE00    	lxi	b,p$ram$table	; schalte angewaehlte
 00DF 1610      	mvi	d,16		; bank bis zur commongrenze ein
 00E1 E607      	ani	00000111b	; (nur bank 0 bis bank 5 moeglich)
 00E3 C602      	adi	2		; Offset fuer PROF-80 RAM Dekodierung
 00E5 5F        	mov	e,a		; ausgewaehlte bank in e
                bank1	outp	e		; setze eine kachel
 00E6+ED59      	DB	0EDH,E*8+41H
 00E8 78        	mov	a,b		; erhoehe kachel adresse
 00E9 82        	add	d		;
 00EA 47        	mov	b,a		;
 00EB FE80      	cpi	80h		; gleich 80 hex?
                	jrnz	bank2		;
 00ED+2004      	DB	20H,BANK2-$-1
 00EF 7B        	mov	a,e		; dann oberer 32k block anwaehlen
 00F0 F608      	ori	00001000b	;
 00F2 5F        	mov	e,a		;
 00F3 78        bank2	mov	a,b		;
 00F4 FEF0      	cpi	com$page	; commengrenze erreicht?
                	jrnz	bank1		;
 00F6+20EE      	DB	20H,BANK1-$-1
 00F8 C1        	pop	b		;
 00F9 D1        	pop	d		;
 00FA C9        	ret
                
                
 00FB           	end
