Appendix E
Root Module of Relocatable BIOS for CP/M 3

All the listings in Appendixes E through I are assembled with
RMAC, the cP/M Relocating Macro Assembler, and cross-referenced 
with
XREFtm , an assembly language cross-reference program used with 
RMAC.
These listings are output from the XREF program.  The assembly
language sources are on your distribution disk as  ASM files.
	1				title   'Root module of relocatable BIOS for CP/M 3.0'
	2
	3				' version 1.0 15 Sept 82
	4
	5	FFFF	=	true	equ -l
	6	0000	=	false	equ not true
	7
	8	FFFF	=	banked	equ true
	9
	10
	11			;	          Copyright (C) ' 1982
	12			;	         Digital Research, Inc
	13			'	             P.O. Box 579
	14			;	        Pacific Grove, CA  93950
	15
	16
	17			;   This is the invariant portion of the modular BIOS and is
	18			;	distributed as source for informational purposes only.
	19			;	All desired modifications should be performed by
	20			;	adding or changing externally defined modules.
	21			;	This allows producing "standard" I/O modules that
	22			'	can be combined to support a particular system
	23			;	configuration.
	24
	25	000d	.	cr	equ 13
	26	OOOA	=	1f	equ 10
	27	000'	=	bell	equ 7
	28	0011	.	ctlQ	equ 'Q'-'@'
	29	0013	=	ctlS	equ 'S'-'@'
	30
	31	0100	.	ccp	equ 0100h       ; Console Command Processor gets loaded 
into the TPA
	32
	33				cseg            ; GENCPM puts CSEG stuff in common memory
	34
	35
	36			    ; variables in system data page
	37
	38				extrn @covec,@civec,@aovec.@aivec,@lovec ; I/O redirection 
vectors
	39				extrn @mxtpa                            ; addr of system entry 
point
	40				extrn @bnkbf                            ' 128 byte scratch 
buffer
	41
	42			    ; initialization
	43
	44				extrn ?init                     ; general initialization and 
signon
	45				extrn ?ldccp,?rlccp             ; load & reload CCP for BOOT & 
WBOOT
	46
	47			    ; user defined character I/O routines
	48
	49				extrn 7ci,?co,?cist,?cost       ; each take device in <B>
	50				extrn ?cinlt                     ; (re)initialize device in <C>
	51				extrn @ctbl                      ; physical character device 
table
	52
	53			    ; disk communication data items
	54
	55				extrn @dtbl                      ; table of pointers to xdPHs
	56				public @adrv,@rdrv,@trk,@sect   ; parameters for disk I/O
	57				public @dma,@dbnk,@cnt           .    ',             '     '
	58
	59			    ; memory control



Listing E-1.  Root Module of Relocatable BIOS for cP/M 3
CP/M 3 System Guide	E  Root Module of Relocatable BIOS
60
	61				public @cbnk			; current bank
	62				extrn ?xmove,?move			; select move bank, and block move
	63				extrn ?bank			; select CPU bank
	64
	65			    ; clock		support
	66
	67				extrn ?time			; siqnal time operation
	68
	69			    ; general utility routines
	70
	71				public ?pmsg,?pdec      ; print message, print number from 0 to 
65535
	72				public ?pderr		        ; print BIOS disk error message header
	73
	74				maclib modebaud		        ; define mode bits
	75
	76
	77			    ; External names for BIOS entry points
	78
	79				public ??boot,?wboot,?const,?conin,?cono,?list,?auxo,?auxi
	80				public ?home,?sldsk,?sttrk ,?stsec,?stdma,7read,?write
	81				public ?lists,?sctrn
	82				public ?conos,?auxis,?auxos,?dvtbl,?devin,?drtbl
	83				public 7mltio,?flush,?mov,7tim,?bnksl,7stbnk,?xmov
	84
	85
	86			    ; BIOS Jump vector
	87
	58					    ' All BIOS routines are invoked by calling these
	89					    ;	entry points.
	90
	91	0000	C30000	?boot:	jmp	boot	; initial entry on cold start
	92	0003	C36C00	?wboot.	jmp	wboot	; reentry on program exit, warm start
	93
	94	0006	C37701	?const.	jmp	const	; return console input Status
	95	0009	C39201	?conin:	jmp	conin	; return console input character
	96	000C	C3OAOO	?cono:	jmp	conout	; send console output character
	97	000F	C3E600	?list:	jmp	list	; send list output character
	98	0012	C3EOOO	?auxo:	jmp	auxout	; send auxilliary output character
	99	0015	C39801	?auxi:	jmp	auxin	; return auxilliary input character
	100
	101	0018	C36E00	?home:	jmp	home	; met disks to logical home
	102	001b	C33F00	?sldsk:	jmp	seldek	; select disk drive, return disk 
parameter info
	103	OOlE	C37100	?sttrk:	jmp	settrk	; Set disk track
	104	0021	C37700	?stsec:	jmp	setsec	; set disk sector
	105	0024	C37000	?stdma:	jmp	setdma	; set disk I/O memory address
	106	0027	C39400	?read:	jmp	read	; read physical block(s)
	107	002A	C3AAOO	?write:	jmp	write	; write physical block(s)
	108
	109	002d	C31201	?lists:	jmp	listat	; return list device Status
	110	0030	C38900	?sctrn:	jmp	sectrn	; translate logical to physical 
sector
	111
	112	0033	C30601	?conos:	jmp	conost	; return console output status
	113	0036	C37D01	?auxis:	jmp	auxibt	; return aux input status
	114	0039	C3OCO1	?auxoS:	jmp	auxost	; return aux output status
	115	003C	C3d200	?dvtbl:	jmp	devtbl	; return address of device def table
	116	003F	C30000	?devin:	jmp	?cinit	; change baud rate of device
	117
	118	0042	C30600	?drtbl:	jmp	getdrv	; return address of disk drive table
	119	0045	C3CBOO	?mltio:	jmp	multio	; Set multiple record count for disk 
I/O
	120	0048	C3CFOO	?flush:	jmp	flush	; flush BIOS maintained disk caching
	121
	122	004B	C30000	?mov:	jmp	?move	; block move memory to memory
	123	004E	C30000	?tim:	jmp	?time	; Signal Time and date operation
	124	0051	C32502	?bnksl:	jmp	bnksel	; select bank for code execution and 
default dMA
	125	0054	C38500	?stbnk:	jmp	setbnk	; select different bank for disk I/O 
DMA operations.
	126	0057	C30000	?xmov:	jmp	?xmove	; set source and destination banks 
for one operation
	127
	128	005a	C30000		jmp	0	; reserved for system implementor
	129	0050	C30000		jmp	0	; reserved for future expansion
	130	0060	C30000		jmp	0	; reserved for future expansion
	131
	132
	133				; BOOT
	134				;	    Initial	entry point for SyStem startup.
	135
	136				dseg     ; this part can be banked
	137
	138			boot:
	139	0000	310200		lxi	sp,boot$stack
	140	0003	OEOF		mvi	c,15	; initialize all 16 character devices
	141			c$init$loop:
	142	0005	C5CDOOOOC1		push b ! call ?cinit ! pop b
	143	OOOA	OdF2OSOO		dcr	c ! jp c$init$loop



Listing E-1.  (continued)



118
CP/M 3 System Guide	E  Root Module of Relocatable BIOS

144
	145	OOOE	CDOOOO	call ?init      ; perform any additiunal system 
initialization
	146			                 ; and print signon message
	147
	148	0011	0100102100	lxi b,16*256+0 ! lxi h,@dtbl	; Init all 16 
logical disk drives
	149		           d$init$loop:
	150	0017	C5	push b           ; save remaining count and abs drive
	151	0018	5E235623	mov e,m ! inx h ! mov d,m ! inx b		; grab @drv entry
	152	OOIC	7BB2CA3600	mov a,e ! ora d ! jz d$init$next		; if null, no 
drive
	153	0021	E5	push h		; save @drv pointer
	154	0022	EB	xchg		; XDPH address in <HL>
	155	0023	2B2B7E32EE	dcx h ! dcx h ! mov a,m ! sta @RDRV		; get 
relative drive code
	156	0029	7932ED00	mov a,c ! sta @ADRV		; get absolute drive code
	157	002D	2B	dcx h		; point to init pointer
	158	002E	562B5E	mov d,m ! dcx h ! mov e,m		; get init pointer
	159	0031	EBCDB6Dl	xchg ! call ipchl		; call init routine
	160	0035	El	pop h		; recover @drv pointer
	161		          d$init$next:
	162	0036	C1	pop b		; recover counter and drive #
	163	0037	0C05C21700	inr c ! dcr b ! jnz d$init$loop		; and loop for 
each drive
	164	003C	C36300	jmp boot$l
	165
	166			cseg    ; following in resident memory
	167
	168		           boot$l:
	169	0063	CD7800	call set$jumps
	170	0066	CDOOOO	call ?ldccp		; fetch CCP for first time
	171	0069	C30001	jmp ccp
	172
	173
	174			; WBOOT
	175			;        Entry for system restarts.
	176
	177		          wboot
	178	006C	31D200	lxi sp,boot$stack
	179	006F	CD7800	call set$jumps           ; initialize page zero
	180	0072	CDOOOO	call ?rlccp              ; reload CCP
	181	0075	C30001	jmp ccp                  ; then reset jmp vectors 
and exit to ccp
	182
	183
	184		          set$jumps:
	185
	186		             if banked
	187	0078	3EO1CDSlOO	mvi a,1 ! call ?bnksl
	188		            endif
	189
	190	007D	3EC3	mvi a,JMP
	191	007F	3200003205	sta 0 ! sta 5            ; met up jumps in page 
zero
	192	0085	2103002201	lxi h,?wboot ! shld I   ; BIOS warm start entry
	193	0085	2A00002206	lhld @MXTPA ! shld 6    ; BDOS system call entry
	194	0091	C9	ret
	195
	196
	197	0092		        ds 64
	198	00D2	=         boot$stack      equ $
	199
	200
	201			; DEVTBL
	202			;        Return address of character device table
	203
	204		          devtbl:
	205	00D2	210000C9	lxi h,@ctbl ! ret
	206
	207
	208			; GETDRV
	209			;        Return address of drive table
	210
	211		          getdrv:
	212	00D6	210000C9	lxi h,@dtbl ! ret
	213
	214
	215]
	216			; CONOUT
	217			;       Console Output.  Send character		in <C>
	218			                         to all selected		devices
	2 19
	220		          conout;
	221
	222	OODA	2A0000	IbId @covec     ; fetch console output bit vector
	223	OODD	C3E900	jmp out$scan
224



Listing E-1.  (continued)
CP/M 3 System Guide	E  Root Module of Relocatable BIOS

225
	226				; AUxOUT
	227				;	Auxiliary Output. Send character in <C>
	228					                to all selected devices
	229
	230			auxout
	231	OOEO	2A0000		lhld @aovec     ; fetch aux output bit vector
	232	00E3	C3K900		jmp out$Scan
	233
	234
	235				; LIST
	236				,	List Output.  Send character in <C>
	237					                 to all selected devices.
	238
	239			list:
	240	00E6	2A0000		lhld @lovec     ; fetch list output bit vector
	241
	242			out$scan:
	243	00E9	0600		mvi b,O	        ; Start with device 0
	244			co$next:
	245	OOEB	29		dad h	         ; shift out next bit
	246	OOEC	D2FFOO		jnc not$out$device
	247	OOEF	E5		push h	        ; save the vector
	248	OOFO	C5		puSh b	        ; save the count and character
	249			not$out$ready:
	250	OOFl	CD2COIB7CA		call coster ! ora a ! jz not$out$ready
	25]l	00F8	CIC5		pop b !	puSh b  ; restore and resave the character and 
device
	252	OOFA	CDOOOO		call ?co        ; if device selected, print it
	253	OOFD	C1		pop b	        ; recover count and character
	254	OOFE	El		pop h	        ; recover the rest of the vector
	255			not$out$device:
	256	00FF	04		inr b	         ; next device number
	257	0100	7CBS		mov a,h	! ora 1 ; see if any devices left
	258	0102	C2EBOO		jnz co$next     ; and go find them. . .
	259	0105	C9		ret
	260
	261
	262				; CONOST
	263				;	Console Output Status.  Return true if
	264				;	        all selected console output devices
	265				;	        are ready.
	266
	267			conost:
	268	0106	2A0000		lhld @covec     ; get console output bit vector
	269	0109	C31501		jmp ost$scan
	270
	271
	272				; AUXOST
	273				;	Auxiliary Output Status.  Return true if
	274				;	         all selected auxiliary output devices
	275				;	         are ready.
	276
	277			auxost:
	278	OlOC	2A0000		lhld @aovec     ; get aux output bit vector
	279	OIOF	C31501		jmp ost$scan
	280
	281
	282				; LISTST
	283				,	List Output Status.  Return true if
	284				;	        all selected list output devices
	285				;	        are ready.
	286
	287			listst:
	288	0112	2A0000		lhld @lovec      ; get list output bit vector
	289
	290			ost$scan:
	291	0115	0600		mvi b,0	        ; start with device 0
	292			cos$next:
	293	0117	29		dad h	        ; check next bit
	294	0118	E5		push h	        ; save the vector
	295]	0119	C5		push b	        ; save the count
	296	0llA	3EFF		mvi a,OFFh      ; assume device ready
	297	011C	DC2COI		cc coster        ; check status for this device
	298	0llF	C1		pop b	        ; recover count
	299	0120	El		pop h	        ; recover bit vector
	300	0121	B7		ora a	        ; see if device ready
	301	0122	C8		rz	        ; if any not ready, return false
	302	0123	05		dcr b	        ; drop device number
	303	0124	7CB5		mov a,b	! ora 1 ; see if any more selected devices
	304	0126	C21701		jnz cos$next
	305	0129	F6FF		ori 0FFh         ; all selected were ready, return 
true
	306	012B	C9		ret
	307
					 Listing E-1   (continued)
CP/M 3 System Guide	E  Root Module of Relocatable BIOS
	308		          coster:		   ; check for output device ready. including 
optional
	309				    ;        xon/xorf support
	310	012C	682600	mov	l,b ! mvi h,O	; make device code 16 bits
	311	012F	E5	push h		; save it in stack
	312	0130	292929	dad	h ! dad h ! dad h	; create offset into device 
characteristics tbl
	313	0133	11060019	lxi	d,@ctbl+6 ! dad d	; make address of mode byte
	314	0137	7EE610	mov	a,m ! ani mb$xonxoff
	315	013A	El	pop	h	; recover console number in <HL>
	316	013B	CAOOOO	jz	?cost	; not a xon device, go get output status 
direct
	317	013E	11280219	lxi	d,xofflist ! dad d	; make pointer to proper 
xon/xoff flag
	318	0142	CD5DOl	call cisti		; see if this keyboard has character
	319	0145	7EC46F01	mov	a,m ! cnz cii	; get flag or read key if mny
	320	0149	FEIIC25OOI	cpi	ctlq ! jnz not$q	; if its a ctl-Q,
	321	014E	3EFF	mvi	a,OFFh	,        set the flag ready
	322		          not$g:
	323	0150	FE13C25701	cpi	ctls ! jnz not$s	; if its a ctl-S,
	324	0155	3E00	mvi	a,OOh	,        clear the flag
	325		          not$s:
	326	0157	77	mov	m,a	; save the flag
	327	0158	CD6601	call costl		; get the actual output status,
	328	0158	A6	ana	m	; and mask with ctl-Q/ctl-S flag
	329	O1SC	C9	ret		; return this am the status
	330
	331		          cistl:		             , get input status with <BC> and 
(NL> saved
	332	O1SD	CSES	push b ! push h
	333	015F	CDOOOO	call ?cist
	334	0162	ElCI	pop	h ! pop b
	335	0164	87	ora	a
	336	0165	C9	ret
	337
	338		          costl		             ; get output status, saving <BC> & 
<HL>
	339	0166	CSE5	push b ! push h
	340	0168	CDOOOO	call ?cost
	341	0168	E1Cl	pop	h ! pop b
	342	016D	87	ora	a
	343	016E	C9	ret
	344
	345		          cil:		             . get input, saving <BC> & <HL>
	346	016F	CSES	push b ! push h
	347	0171	CDOOOO	call ?ci
	348	0174	ElC1	pop	h ! pop b
	349	0176	C9	ret
	350
	351
	352			; CONST
	353			;	    Console Input Status.  Return true if
	354			;	            any selected console input device
	355			;	            has an available character.
	356
	357		          const
	358	0177	2A0000	lhld @civec     ; get console input hit vector
	359	017A	C38001	jmp	ist$scan
	360
	361
	362			; AUXIST
	363			;	    Auxiliary Input	Status.  Return true if
	364			;	            any selected auxiliary input device
	365			;	            has an available character.
	366
	367		          auxist:
	368	017D	2A0000	lhld @aivec     ; get aux input bit vector
	369
	370		           ist$scan:
	371	0180	0600	mvi	b,0          ; start	with device 0
	372		          cis$next:
	373	0182	29	dad	h            ; check	next hit
	374	0183	3E00	mvi	a,O          , assume device not ready
	375	0185	DCSDOl	cc cistl         ; check		status for this device
	376	0188	B7C0	ora	a ! rnz     ; if any ready, return true
	377	O18A	04	inr	b            ; next device number
	378	0188	7CB5	mov	a,h ! ora 1 ; see if any more selected devices
	379	0180	C28201	jnz	cis$next
	380	0190	AF	xra	a            ; all selected were not ready. return 
false
	381	0191	C9	ret
	382
	383
	384			; CONIN
	385			,	    Console Input.	Return character from first
	386			;	            ready console input device.
	387
	388		          conin:
	389	0192	2A0000	lhld @Civec
	390	0195	C39B01	jmp	in$scan
	Listing E-1	(continued)
cP/M 3 System Guide	E  Root Module of Relocatable BIOS

391
392
	393			        ; AUXIN
	394			        ;       Auxiliary Input.  Return character from	first
	395]			        ;               ready auxiliary input device.
	396
	397			auxin:
	398	0198	2A0000	        lhld @aivec
	399
	400			in$scan:
	401	0198	E5	        push h           ; save bit vector
	402	019C	0600	        mvi b,0
	403			ci$next:
	404	0191	29	        dad h            ; shift out next bit
	405	019F	3100	        mvi a,0          ; insure zero a  (nonexiatant 
device not ready) .
	406	OlAl	DC5]DOl	        cc cisti         ; see if the device haB a 
character
	407	01A4	B7	        ora a
	408	OlA5	C2B201	        jnz ci$rdy      ; this device has a 
character
	409	01A8	05	        dcr b            ; else, next device
	410	01A9	7CB5	        mov a,h ! ora 1 ; see if any more devices
	411	OlAB	C29E01	        jnz ci$next     ; go look at them
	412	OIAE	El	        pop h            ; recover bit vector
	413	OlAF	C39B01	        jmp in$scan     ; loop til we find a 
character
	414
	415]			ci$rdy:
	416	0152	El	        pop h            ; discard extra stack
	417	0183	C30000	        jmp ?ci
	418
	419
	421			;        Utility Subroutines
	421
	422
	423			ipchl:            ; vectored CALL point
	424	01B6	E9	         pchl
	425
	426
	427			?pmsg:            ; print message @<HL> up to a null
	428			                  ; saves <BC> & <DE>
	429	01B7	C5	         push b
	430	01B8	D5	         push d
	431			pmsg$loop:
	4 432	01B9	7EB7CAC8OI         mov a,m ! ora a ! jz pmsg$exit
	433	01BE	4FE5	         mov c,a ! push h
	434	01C0	CDOCOOE1	         call ?cono ! pop h
	435	01C4	23C3B901	         inx h ! jmp pmsg$loop
	436			pmsg$exit:
	437	01C8	Dl	         pop d
	438	01C9	C1	         pop h
	439	OlCA	C9	         ret
	440
	441			?pdec:            ; print binary number 0-65535 from <HL>
	442	OICB	01F30111F0         lxi b,tablel0! lxi d,-1O0O0
	443			next:
	444	01D1	3E2F	         mvi a, 'O'-l
	445			pdecl:
	446	01D1	E53Cl9D2DE         push h! inr a! dad d! jnc stoploop
	44?	0109	3333C3D301         inx sp! inx sp! jmp pdecl
	448			stoploop:
	449	01DE	D5C5	         push d! push b
	450	01E0	4FCDOCOO	         mov c,a! call ?cono
	451	01E4	C1D1	         pop b! pop d
	452			nextdigit:
	453	01E6	El	         pop h
	454	01E7	OASFO3	         Idax b! mov e,a! inx b
	455	0llA	0A5703	         ldax b! mov d,a! inx b
	456	01E0	7BB2C20101         mov a,e! ora d! jnz next
	457	01F2	C9	         ret
	458
	459			tabel10:
	460	01F3	l8FC9CFFF6         dw       -l000,-l00,-10,-l,0
	461
	462			?pderr:
	463	O1FD	210100CD87         lxi h,drive$msg ! call ?pmsg		; error 
header
	464	0203	3AE000C641         lda @adrv ! adi 'A'  ! mov c,a ! call 
?cono		; drive code
	469	020C	211300C0B7         lxi h,track$msg ! call ?pmsg		. track 
header
	466	0212	2AEFOOCDCB         lhld @trk ! call ?pdec		; track number
	467	0218	211800C0B7         lxi h,sector$msg ! call ?pmsg		; sector 
header
	468	0211	2AFIOOCDCB         lhld @sect ! call ?pdec		; sector number
	469	0224	C9	         ret
	470
	471
	472			         : BNKSEL
	473			        ;        Bank Select.  Select CPU bank for further 
execution.
474

Listing E-1.  (continued)
CP/M 3 System Guide	E  Root Module of Relocatable BIOS
	475]		          bnksel
	476   0225] 323B02			sta @cbnk                       ; remember 
current bank
	477	0228	C30000	jmp ?bank                        ; and go exit 
through users
	478			                                  ; physical bank select 
routine
	479
	480
	481	0228	FFFFFFFFFFxoff1ist         db      -1,-1,-1,-l,-l,-1,-l,-1		 
        ; ctl-s clears to zero
	482	0233	FFFFFFFFFF	          db       -1,-1,-1,-1,-1,-1 ,-1,-1
	483
	484
	485
	486			dseg    ; following resides in banked memory
	487
	488
	489
	490		           ;	Disk I/O interface routines
	491
	492
	493			; SELDSK
	494			;       Select Disk Drive.  Drive code	in <C>.
	495			;                Invoke login procedure	for drive
	496			'                if this is first select.  Return
	497			'                address of disk psrameter header
	498			;                 in <HL>
	499
	500		             seldsk:
	501	003F	7932ED00	mov a,c ! sta @adrv	; save drive select code
	502	0043	69260029	mov l,c ! mvi h,0 ! dad h	; create index from drive 
code
	503	0047	01000009	lxi h,@dtbl ! dad b	; get pointer to dispatch table
	504	0045	7E23666F	mov a,m !  inx h ! mov h,m ! mov l,a	; point at 
disk descriptor
	505	004F	54C8	ora h ! rz	; if no entry in table, no disk
	506	0051	7BE601C26D	mov a,e ! ani 1 ! jnz not$first$select	; examine 
login bit
	507	0057	E5EB	push h ! xchg	; put pointer in stack & <DE>
	508	0059	2lFEFF197E	lxi h,-2 ! dad d ! mov a,m ! sta @RDRV	; get 
relative drive
	509	0061	2IFAFFI9	lxi h,-6 ! dad d	; find LOGIN addr
	510	0065	7E23666F	mov a,m !  inx h ! mov h,m ! mov l,a	; get address 
of LOGIN routine
	511	0069	CDB6Ol	call ipchl	; call LOGIN
	112	006C	El	pop h	; recover DPH pointer
	513		           not$first$select:
	514	006D	C9	ret
	515
	516
	517			; HOME
	518			;        Home selected drive.  Treated as SETTRK(0).
	519
	520		          home:
	521	006E	010000	lxi b,0          ; same as set track zero
	522
	523
	524			; SETTRK
	525			;       Set Track. Saves track address from <BC>
	526			;                in @TRE for further operations.
	527
	528		           settrk:
	529	0071	6960	mov l,c ! mov h,b
	530	0073	22EF00	shld @trk
	531	0076	C9	ret
	532
	533
	534			; SETSEC
	135]			;       Set Sector.  Saves sector number	from <BC>
	536			;                in @mect for further operations.
	537
	538		          setsec
	539	007?	6960	mov l,c ! mov h,b
	540	0079	22F100	shld @sect
	541	007C	C9	ret
	542
	543
	544			; SETDMA
	545			;       Set Disk Memory Address.  Saves	DMA address
	546			;                from <BC> in @DMA and sets @DBNK to @CBNK
	547			;                so that further disk operations take place
	548			;                in current bank.
	549
	550		           setdma
	551	0070	6960	mov l,c ! mov h,b
	552	007F	22F300	shld @dma
	553
	554	0082	3A3B02	lda @cbnk        ; default DMA bank is current hank
	555			                 ; fall through to set DMA bank



Listing E-1.  (continued)
