;
; BeerMon sourcecode, FreeWare
;
version=46
rev="c"
chksum=$20630d26	;the value you get in D0 after 'j chkmon'
;
; note: use ASM-ONE V1.02 (huuu, why doesn't ODD work correctly?)
;       or any improved version of it. After assembling, use 'e' to
;       include that damn brilliant logo :-) bevor saving the executable.
;
; you may modify as much as you want, but PLEASE don't rape
; it corrupt...
;
; (C) by Carnivore/BeerMacht, Jun 93 - Blessed are the sick.
;
; "With my art I am the fist in the face of god"

>extern "beermon.bitmap",dostrkbuf
			
CloseLibrary		= -414
FindResident		= -96
OldOpenLibrary		= -408
OpenLibrary		= -552
Supervisor		= -30

Forbid			= -132
GetMsg			= -372
ReplyMsg		= -378
WaitPort		= -384

work512		=$074000
work1mb		=$0f4000
work1.5mb	=$174000
work2mb		=$1f4000

ddmfmwords=$18d0
hdmfmwords=$18e0*2
xchars=80
xpixel=xchars*8
dsksize=hdmfmwords*2	;bytes
sprsize=76
copsize=16*4
miscsize=dsksize+sprsize+copsize

histnum= 10		;number of history lines
brkpnum= 10		;number of breakpoints
mtchnum= 100		;number of matchbuffer entries
sndintstep=$10
fkeylen=20
retry=3
stepcount	=  3000*100/141		;stepdelay 3ms
settlecount	= 15000*100/141		;settledelay 15ms
time1ms		=  1000*100/141		;disk test intervall 1ms

ImploderID = "IMP!"
LF	= 10		;line feed

movec_sfc.d0	= $4e7a0000
movec_dfc.d0	= $4e7a0001
movec_cacr.d0	= $4e7a0002
movec_cacr.d7	= $4e7a7002
movec_cacr.a5	= $4e7ad002
movec_vbr.d0	= $4e7a0801
movec_vbr.a5	= $4e7ad801
movec_caar.d0	= $4e7a0802
movec_caar.a5	= $4e7ad802
movec_msp.a5	= $4e7ad803
movec_urp.a5	= $4e7ad806	;68040

movec_d0.sfc	= $4e7b0000
movec_d0.dfc	= $4e7b0001
movec_d0.cacr	= $4e7b0002
movec_d7.cacr	= $4e7b7002
movec_a5.cacr	= $4e7bd002
movec_a5.vbr	= $4e7bd801
movec_a5.caar	= $4e7bd802

cinva_bc	= $f4d8		;68040
cpusha_bc	= $f4f8		;68040

fmovem_fp0_7.a2 = $f212f0ff
fmovem_a2.fp0_7 = $f212d0ff
fmovem_fpcx.a2  = $f212bc00	;fpcr/fpsr/fpiar
fmovem_a2.fpcx  = $f2129c00	;fpcr/fpsr/fpiar
fsave_sp	= $f327
frestore_sp	= $f35f
fmove.x_a3.fp0	= $f2134800	;fmove.x (a3),fp0
fmove.p_fp0.a3	= $f2136c11	;fmove.p fp0,(a3){$11}
fmove_fpsr.d1	= $f201a800	;fmove.l fpsr,d1

pmovefd_a0.tt0	= $f0100900	;long
pmovefd_a0.tt1	= $f0100d00	;long
pmovefd_a0.tc	= $f0104100	;long
pmovefd_a0.srp	= $f0104900	;quad
pmovefd_a0.crp	= $f0104d00	;quad
pmove_a2.tt0	= $f0120800	;long
pmove_a2.tt1	= $f0120c00	;long
pmove_a2.tc	= $f0124000	;long
pmove_a2.drp	= $f0124400	;quad	;68851
pmove_a2.srp	= $f0124800	;quad
pmove_a2.crp	= $f0124c00	;quad
pmove_a2.mmusr	= $f0126000	;word
pmove_tt0.a2	= $f0120a00	;long
pmove_tt1.a2	= $f0120e00	;long
pmove_tc.a2	= $f0124200	;long
pmove_drp.a2	= $f0124600	;quad	;68851
pmove_srp.a2	= $f0124a00	;quad
pmove_crp.a2	= $f0124e00	;quad
pmove_mmusr.a2	= $f0126200	;word

base=*+$c000
run:	movem.l a6,-(a7)		;the jmp entry,flags ok
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	movem.l d0-d7/a0-a5,regs-base(a6)
	sub.l a1,a1			;'x' resets/returns to cli
	bra.b mutil0

thehit:	movem.l a6,-(a7)		;interrupt entry,flags ok
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	movem.l d0-d7/a0-a5,regs-base(a6)
	movem.l 4+2(a7),a4		;the pc
	lea -1.w,a1			;'x' returns into prg
mutil0:	movem.w a1,frzflag-base(a6)
	movem.l (a7)+,a0		;a6
	movem.l a0/a7,regs+56-base(a6)	;a6/a7

	lea $bfe000,a1
	lea 3.w,a3			;don't change any flags
	lea 2.w,a2
	movem.w a3,$0200(a1)		;$bfe201:lmouse,ovl
	movem.w a2,(a1)			;$bfe001

	lea stackend-$7ffe-base(a6),a3
	lea $7ffe(a3),a7		;lea $80000,a7 (usp|isp|msp)
	bsr.w getvbr
	move.l a5,vbreg-base(a6)

	move.l a7,a3
	lea $10.w,a0		;illegal vec
	add.l vbreg-base(a6),a0
	move.l (a0),a1		;old illegal vec
	lea savereg(pc),a2	;uses d0
	movem.l a2,(a0)			;?flags ok
	illegal				;store sr,noint,go sv
	move.l a7,regs+64+4-base(a6)	;isp
	move usp,a7
	move.l a7,regs+64-base(a6)	;usp
	move.l a3,a7

	tst.b frzflag-base(a6)
	bne.b setpc
	sub.l a4,a4			;clear pc
setpc:	movem.l a4,regs+64+24-base(a6)	;pc

	lea $de0000,a2
	move.w (a2),timeout-base(a6)
	and.w #$7f7f,(a2)	;enable timeout, DSACK

	lea illtrap(pc),a2
	move.l a2,(a0)
	moveq #0,d6			;68000
	dc.l movec_vbr.a5 		;68010?
	move.l a5,regs+64+12-base(a6)	;vbr
	dc.l movec_sfc.d0
	move.b d0,sfcdfc+0-base(a6)
	dc.l movec_dfc.d0
	move.b d0,sfcdfc+1-base(a6)	;sfcdfc
	moveq #1,d6			;68010
	dc.l movec_msp.a5		;68020
	move.l a5,regs+64+8-base(a6)	;msp
	dc.l movec_cacr.a5
	move.l a5,regs+64+16-base(a6)	;cacr
	move.l a5,d7
	bset #4,d7
	bclr #0,d7	
	dc.l movec_d7.cacr
	dc.l movec_cacr.d7
	dc.l movec_a5.cacr		;restore cacr
	moveq #2,d6		;68020
	btst #4,d7		;68020/30
	beq.b illt20
	moveq #3,d6		;68030
illt20:	dc.l movec_urp.a5
	moveq #4,d6		;68040
illtrap:move.l a3,a7			;restore isp
	move.l a1,(a0)			;restore illegal vec
	move.b d6,cpu-base(a6)
	subq.b #2,d6		;68020?
	beq.b getcaar
	subq.b #1,d6		;68030?
	bne.b nocaar
getcaar:dc.l movec_caar.a5		;68020/30 only
	move.l a5,regs+64+20-base(a6)	;caar
nocaar:	
	move.w regs+64+28-base(a6),d0	;start sr
	lea regs+60-base(a6),a1		;ptr start a7
	move.l (a1)+,a0			;start a7
	btst #13,d0
	beq.b fixa7			;start usermode
	addq.w #4,a1			;skip usp,set isp
	btst #12,d0
	beq.b fixa7
	addq.w #4,a1			;skip isp,set msp
fixa7:	move.l a0,(a1)

	moveq #0,d6		;no fpu
	lea $2c.w,a0		;line-f vector
	add.l vbreg-base(a6),a0
	move.l (a0),a1
	lea fpuline(pc),a2
	move.l a2,(a0)
	dc.w fsave_sp		;68881/2
	cmp.b #4,cpu-base(a6)	;68040?
	bne.b no40fpu
	moveq #3,d6		;68040fpu
	bra.b fpurest
no40fpu:moveq #1,d6		;68881
	cmp.b #$18,1(a7)	;68881
	beq.b fpurest
	moveq #2,d6		;68882
fpurest:dc.w frestore_sp
fpuline:move.l a3,a7
	move.b d6,fpu-base(a6)

	moveq #0,d6		;no mmu
	tst.b econflg-base(a6)
	bne.b mmuline		;economy cpu
	lea mmuline(pc),a2
	move.l a2,(a0)
	cmp.b #4,cpu-base(a6)	;68040?
	bne.b nommu40
	moveq #3,d6		;68040 mmu
	bra.b mmuline
nommu40:lea mmutt0-base(a6),a2	;dummybuf
	dc.l pmove_tc.a2	;dummycmd
	moveq #1,d6		;68851
	dc.l pmove_tt0.a2	;dummycmd
	moveq #2,d6		;68030 mmu
mmuline:move.l a3,a7
	move.l a1,(a0)		;restore line-f
	move.b d6,mmu-base(a6)

	bsr.w savemmu
	bsr.w savefpu

	move.l regs+64-base(a6),startusp-base(a6)
	move.l regs+64+4-base(a6),startisp-base(a6)
	move.l regs+64+8-base(a6),startmsp-base(a6)
	move.l regs+64+12-base(a6),startvbr-base(a6)
	move.l regs+64+16-base(a6),startcacr-base(a6)
	move.l regs+64+20-base(a6),startcaar-base(a6)
	move.w regs+64+28-base(a6),startsr-base(a6)
	move.w sfcdfc-base(a6),startsfcdfc-base(a6)
	
;init

	lea $dff002,a1
wtblt:	btst #6,(a1)
	bne.b wtblt			;blitter still busy

	lea rdff002-base(a6),a0
	moveq #7,d0		;set the setbit
	move.w (a1),(a0)+	;rdff002
	bset d0,-2(a0)
	move.w $0e(a1),(a0)+	;rdff010
	bset d0,-2(a0)
	move.w $1a(a1),(a0)+	;rdff01c
	bset d0,-2(a0)
	move.w $1c(a1),(a0)+	;rdff01e
	bset d0,-2(a0)

	move.l #$7fff7fff,$98(a1)	;$dff09a
	move.w #$7fff,$94(a1)		;$dff096 all dma off
	moveq #0,d0
	move.w d0,$34(a1)		;$dff036 clr.w forbidden!
	move.w d0,$17e(a1)		;$dff180

	move.w $7c(a1),d0
	cmp.b #$f8,d0		;aga?
	bne.b noaga
	move.w #0,$1fc(a1)	;reset sprites
noaga:
	moveq #0,d1
	move.b modeflg-base(a6),d1
	move.b rowstab(pc,d1.w),d0
	move.b d0,d1
	mulu #xchars*8,d1
	move.l d1,scrsize-base(a6)
	add.l #miscsize,d1
	move.l d1,wrksize-base(a6)
	move.b d0,rows-base(a6)
	subq.b #1,d0
	move.b d0,rowsm1-base(a6)
	subq.b #1,d0
	move.b d0,rowsm2-base(a6)
	bra.b rowsok
rowstab:dc.b 32,64,25,50,60,32
rowsok:

	moveq #$08,d3		;move.l #$80000,d3; 512K chip?
	swap d3
	move.l d3,himem-base(a6)
	move.l #work512,defwork-base(a6)
	btst #5,2(a1)		;$dff004
	beq.b nobig
	bsr.w memtest		;test if 1mb, bufadr useless
	beq.b nobig
	moveq #$10,d3		;move.l #$100000,d3; 1M chip
	swap d3
	move.l d3,himem-base(a6)
	move.l #work1mb,defwork-base(a6)
	bsr.w memtest
	beq.b nobig
	moveq #$18,d3		;move.l #$180000,d3; 1.5M chip
	swap d3
	move.l d3,himem-base(a6)
	move.l #work1.5mb,defwork-base(a6)
	bsr.w memtest
	beq.b nobig
	move.l #$200000,himem-base(a6)	;2M chip
	move.l #work2mb,defwork-base(a6)
nobig:

	move.l defwork-base(a6),a0	;in chipmem
	lea progend-base,a1
	cmp.l a0,a1		;code/absworkspace overlap?
	bls.b memsave
	add.l wrksize-base(a6),a0
	lea run(pc),a1
	cmp.l a0,a1
	bcc.b memsave	
	sub.l wrksize-base(a6),a1
	move.l a1,defwork-base(a6)
memsave:
	st abswork-base(a6)	;absolute workspace, not memlist
	bsr.w chkexec
	bne.b absmem

	move.l $142(a0),a1	;memheader
	moveq #1,d1		;chipmem
	bsr.w grabmem
	beq.b nogchip
	move.l himem-base(a6),d0
	sub.l wrksize-base(a6),d0
	cmp.l d0,a1		;memlist out of highmem
	bhi.b nogchip	
	move.l a1,defwork-base(a6)	;use entry as workspace
	sf abswork-base(a6)
nogchip:clr.l bufadr-base(a6)
	move.l $142(a0),a1	;memheader
	moveq #2,d1		;fastmem
	bsr.w grabmem
	beq.b nogfast
	move.l a1,bufadr-base(a6)	;use entry as buffer
nogfast:	
absmem:

	st absbuf-base(a6)	;absolute buffer
	move.l bufadr-base(a6),d4
	move.l #$f00002+progend-run,d3 ;no mousetst if in mod
	bsr.b memtest		;modifies bufadr
	bne.w mem1
	move.l d4,bufadr-base(a6)

mem7:	lea $bfe001,a0		;if left mouse during startup
	btst #6,(a0)		;no backup is done
	bne.b mem4 
	clr.l bufadr-base(a6)	;clr bufadr if no buf wanted
	lea $dff006,a1
	lea $017a(a1),a2	;$dff180
mem5:	move.b (a1),(a2)
	btst #6,(a0)	
	beq.b mem5
	bra.w mem1
mem4:	tst.l bufadr-base(a6)	;memlist:fastmem?
	seq absbuf-base(a6)	;memlist buffer
	bne.w mem1
	move.l #$274000,d3	;512k banks
	bsr.b memtest
	bne.b mem1
	move.l #$c74000,d3
	bsr.b memtest
	bne.b mem1
	cmp.w #$8,himem-base(a6);512K chip:work f4000,no backup at all
	bne.b mem1
	move.l #$f4000,d3	;buffer on '1MB' A1000s without mod
	pea mem1(pc)
memtest:move.l d3,a2		;datacache must be inactive!
	and.l #$f80000,d3
	clr.l bufadr-base(a6)
	sub.l a1,a1
	move.l d3,a0
	move.l (a0),d6
	move.l (a1),d7
	move.l #"beer",d3	;the ramtest values...
	move.l #"gore",d1
	move.l d3,(a1)
	move.l d1,(a0)
	bsr.w pushcache
	bsr.w invcache
	cmp.l (a0),d1
	bne.b memfail
	cmp.l (a1),d3
	bne.b memfail
	move.l a2,bufadr-base(a6)
memfail:move.l d6,(a0)
	move.l d7,(a1) 
	bsr.w pushcache
	bsr.w invcache
	tst.l bufadr-base(a6)
	rts

mem1:	move.l bufadr-base(a6),para+8-base(a6)
	beq.b mem2
	move.l defwork-base(a6),a0
	move.l a0,para-base(a6)
	add.l wrksize-base(a6),a0
	move.l a0,para+4-base(a6)
	moveq #3,d3
	bsr.w t			;transfer workspace to backupmem

mem2:	move.l vbreg-base(a6),a0
	lea intvecs-base(a6),a1
	moveq #$100/4-1,d0
saveexc:move.l (a0)+,(a1)+
	dbf d0,saveexc

	lea $bfd100,a0
	st $200(a0)		;ddr
	st (a0)			;all drives off
	nop
	move.b #%10000111,(a0)
	nop
	st (a0)
	moveq #-1,d0
	move.l d0,drivcyl-base(a6)

	lea mtchbuf-base(a6),a0
	move.w #mtchnum-1,d0
clrmbuf:clr.l (a0)+		;init matchbuffer
	dbf d0,clrmbuf

	lea helptxt-$7ffe(pc),a1
	lea $7ffe(a1),a1
	move.l a1,helpadr-base(a6)
	sf insmode-base(a6)
	sf hilight-base(a6)
	sf row-base(a6)
	move.l defwork-base(a6),d0
	bra.w calchip		;jmp warm

warm:	lea stackend-4-$7ff8-base(a6),a2
	lea $7ff8(a2),a7
	move.l regs+64+24-base(a6),para-base(a6)	;set pc for disasm
	clr.l breakpc-base(a6)
	clr.l lastcmd-base(a6)

	lea $dff000,a2
	move.l #$7fff7fff,$9a(a2)
	move.w #$0c00,$34(a2)	;r. mouse

	lea $bfd000,a0		;set cia regs
	move.b #3,$1201(a0)	;$bfe201 l. mouse,ovl
	st $1301(a0)		;$bfe301 printer port
	st $0300(a0)		;$bfd300 drive port
	sf $1c01(a0)			;$bfec01
	move.b #$80,$1e01(a0)		;$bfee01
	move.b #$88,$1d01(a0)		;$bfed01
	tst.b $1d01(a0)			;$bfed01
	sf $0e00(a0)		;$bfde00 ciab cra
	move.b #$7f,$0d00(a0)	;$bfdd00 ciab icr
	tst.b $0d00(a0)		;$bfdd00

	lea except(pc),a0
	lea $8.w,a1
	add.l vbreg-base(a6),a1
	moveq #[$100-8]/4-1,d0
setex:	move.l a0,(a1)+
	add.w #2,a0		;bsr.b xx
	dbf d0,setex

	sf ascii-base(a6)
	sf dontbuf-base(a6)
	lea $68.w,a1
	add.l vbreg-base(a6),a1
	lea keyint(pc),a3	;$68
	lea vblint(pc),a4	;$6c
	lea audint(pc),a5	;$70
	movem.l a3-a5,(a1)
	lea thehit(pc),a0
	move.l a0,$14(a1)	;$7c level 7 intvec

	lea mousespr-base(a6),a0
	move.l spradr-base(a6),a1
	moveq #34+4-1,d0	;34/2=sprhigh
cpspr:	move.w (a0)+,(a1)+
	dbf d0,cpspr

	bsr initcop
	bsr gencop

	bsr.w pushcache

	move.w #$c028,$9a(a2)
waitvbl:btst #5,$1f(a2)
	beq.b waitvbl

	tst.b frzflag-base(a6)	;set coplist if jmpmode
	bne.b mutil4		;or interruptlist if breakmode
	btst #0,modeflg-base(a6)
	beq.b nolac
nolong:	tst.w 4(a2)
	bpl.b nolong
nolac:	move.w #$0080,$96(a2)	;cop off
	move.l copadr-base(a6),$80(a2)
	tst.w $88(a2)		;strobe
	move.w #$8080,$96(a2)	;cop on
mutil4:	move.w #$8340,$96(a2)	;bpl/blt on

	move #$2000,sr		;allow ints

	sf hilight-base(a6)
	sf col-base(a6)
	moveq #0,d3
	bsr.w r			;output registers

	bsr.b chkmon
	lea constend-$7ffe(pc),a0
	lea $7ffe(a0),a0
	cmp.l (a0),d0
	beq.b chkok
	lea warntxt(pc),a1
	bsr msgout
chkok:
	bsr.w rprompt		;>
	bsr curson
	clr.w buflen-base(a6)
loop:	tst.w buflen-base(a6)
	beq.b loop
	bsr cursoff
	clr.w d1
	lea keybuf-base(a6),a0
dobuf:	move.b (a0,d1.w),d0
	bsr prtasc
	addq.w #1,d1
	cmp.w buflen-base(a6),d1
	bcs.b dobuf

	clr.w buflen-base(a6)
	bsr curson
	bra.b loop

chkmon:	moveq #0,d0
	lea run(pc),a0
	move.w #(constend-run)/4-1,d1
chkcorr:add.l (a0)+,d0
	dbf d1,chkcorr
	rts
warntxt:dc.b "Warning:BeerMon is corrupted"!$80
	even


initcop:lea $dff000,a5

	move.w rgb0-base(a6),$180(a5)
	move.w rgb1-base(a6),$182(a5)
	move.w #$0f00,$1a2(a5)
	move.w #$0000,$1a4(a5)
	move.w #$00f0,$1a6(a5)

	lea copdata(pc),a0
	moveq #0,d0
	move.b modeflg-base(a6),d0
	mulu #copdlen,d0
	add.l d0,a0
	move.l (a0)+,$8e(a5)
	move.l (a0)+,$92(a5)
	move.w (a0)+,$1dc(a5)
	move.w (a0)+,$100(a5)
	move.w (a0)+,$108(a5)

	move.w #$0000,$102(a5)
	move.w #$0000,$1fc(a5)

	cmp.b #4,modeflg-base(a6)
	bne.w nomscan
	move.w #$0071,$1c0(a5)
	move.w #$0008,$1c4(a5)
	move.w #$000e,$1de(a5)
	move.w #$001c,$1c2(a5)
	move.w #$001e,$1c6(a5)
	move.w #$0046,$1e2(a5)
	move.w #$020c,$1c8(a5)
	move.w #$0000,$1cc(a5)
	move.w #$0003,$1e0(a5)
	move.w #$0200,$1e4(a5)
	move.w #$0005,$1ca(a5)
	move.w #$001d,$1ce(a5)
	move.w #$0012,$104(a5)
	move.w #$0c21,$106(a5)

	movem.w rgb0-base(a6),d0-d1
	bsr.w mapcol
	move.l d3,$180(a5)
	move.l d2,$188(a5)

	lea $1a0(a5),a0
	moveq #0,d0
cpycols:move.l hmscols(pc,d0.w),(a0)+
	addq.w #4,d0
	cmp.w #8*4,d0
	bne.b cpycols

nomscan:
	rts
hmscols:dc.l $00000c00,$000000c0,$03000f00,$030003c0	;mapped colours
	dc.l $00000c00,$000000c0,$0030c030,$00300030	;multiscan mode

	;    $008e0090  ,$00920094  ,$01dc,$0100,$108  
copdata:dc.w $2c81,$2cc1,$003c,$00d4,$0020,$9200,$00000	;pal
copdlen=*-copdata
	dc.w $2c81,$2cc1,$003c,$00d4,$0020,$9204,xchars	;pal lace
	dc.w $2c81,$f4c1,$003c,$00d4,$0000,$9200,$00000	;ntsc
	dc.w $2c81,$f4c1,$003c,$00d4,$0000,$9204,xchars	;ntsc lace
	dc.w $2c45,$0ce5,$0020,$0068,$1b88,$1241,$00000	;multiscan

mapcol:	movem.l d4/d6-d7,-(a7)
	move.w d0,d6
	move.w d1,d7
	moveq #4-1,d4
	moveq #0,d2
	moveq #0,d3
codecol:move.w d7,d0
	bsr.b codenib
	move.w d0,d1
	mulu #5,d0
	and.w #$fff0,d7
	or.b d0,d7
	move.b d0,d3
	move.w d6,d0
	bsr.b codenib
	sub.w d0,d1
	mulu #5,d0
	and.w #$fff0,d6
	or.b d0,d6
	move.b d0,d2
	add.w d1,d2
	ror.l #4,d2
	sub.w d1,d3
	ror.l #4,d3
	ror.w #4,d6
	ror.w #4,d7
	dbf d4,codecol
	move.w d7,d2
	move.w d6,d3
	swap d3
	movem.l (a7)+,d4/d6-d7
	rts
codenib:andi.l #$0f,d0
	addq.w #2,d0
	divu #5,d0
	rts

gencop:	move.l copadr-base(a6),a0
	moveq #-2,d0
	move.l scradr-base(a6),d1
	move.l a0,a1
	swap d1
	move.w #$00e0,(a0)+
	move.w d1,(a0)+
	swap d1
	move.w #$00e2,(a0)+
	move.w d1,(a0)+
	btst #0,modeflg-base(a6)
	beq.b genendc

	moveq #12,d2
	add.l a0,d2
	move.w #$0080,(a0)+
	swap d2
	move.w d2,(a0)+
	move.w #$0082,(a0)+
	swap d2
	move.w d2,(a0)+
	move.l d0,(a0)+

	add.l #xchars,d1
	swap d1
	move.w #$00e0,(a0)+
	move.w d1,(a0)+
	swap d1
	move.w #$00e2,(a0)+
	move.w d1,(a0)+

	move.l a1,d2
	move.w #$0080,(a0)+
	swap d2
	move.w d2,(a0)+
	move.w #$0082,(a0)+
	swap d2
	move.w d2,(a0)+
genendc:move.l d0,(a0)+
	rts

exit:	moveq #4-1,d2
	move.l drivcyl-base(a6),d3
resetcy:tst.b d3
	bmi.b noresc
	moveq #3,d0
	add.b d2,d0
	move.b d0,drvbit-base(a6)
	bsr motondt
	bsr trk0
resetst:subq.b #1,d3
	bmi.b noresc2
	bsr stepup
	bra.b resetst
noresc2:bsr motoff
noresc:	ror.l #8,d3
	dbf d2,resetcy

	move.w #$7fff,$dff096
	move.w #$4000,$dff09a

	move.w timeout-base(a6),$de0000

	move.l bufadr-base(a6),d0
	beq.b mem3
	move.l d0,para-base(a6)
	add.l wrksize-base(a6),d0
	move.l d0,para+4-base(a6)
	move.l scradr-base(a6),para+8-base(a6)
	moveq #3,d3
	bsr.w t			;retransfer workspace, if any
mem3:
	lea intvecs-base(a6),a0
	move.l startvbr-base(a6),a1
	moveq #$100/4-1,d0
resetex:move.l (a0)+,(a1)+
	dbf d0,resetex

	bsr.w loadmmu
	bsr.w loadfpu

	tst.b frzflag-base(a6)	;freezemode?
	bne.w endfrz

	lea run(pc),a0	;in module? then reset
	cmp.l #$f00002,a0
	beq.w doreset

	move #$3700,sr		;use isp|(68020+:msp)
	move.l startmsp-base(a6),a7	;msp
	move #$2700,sr			;use isp
	move.l startisp-base(a6),a7	;isp

	tst.b cpu-base(a6)	;68010+ ?
	beq.b nomsp3
	move.l startvbr-base(a6),a5	;vbr
	dc.l movec_a5.vbr
	move.b startsfcdfc-base(a6),d0
	dc.l movec_d0.sfc
	move.b startsfcdfc+1-base(a6),d0
	dc.l movec_d0.dfc
	cmp.b #2,cpu-base(a6)	;68020+ ?
	bcs.b nomsp3
	move.l startcacr-base(a6),a5	;cacr
	dc.l movec_a5.cacr
	cmp.b #4,cpu-base(a6)	;68040?
	beq.b nomsp3
	move.l startcaar-base(a6),a5	;caar
	dc.l movec_a5.caar
nomsp3:
	move.l startusp-base(a6),a0	;restore initial? regs
	move.l a0,usp

;	move.b modeflg-base(a6),d0
;	beq.b noforce
;	subq.b #3,d0
;	beq.b noforce
;	bsr.b beamcon		;restore beamcon0 reg
;noforce:

	lea $dff000,a4
	move.w #$0080,$96(a4)

	bsr display
	move.w #$8080,$96(a4)
	move.w #$83f0,$96(a4)
	move.w #$e02c,$9a(a4)
	bclr #1,$bfe001

	move.l regs-base(a6),d0
	subq.l #1,d0
	beq.b fakebst		;oh...
	addq.l #1,d0
fakebst:move.w startsr-base(a6),sr
	movem.l regs+4-base(a6),d1-d7/a0-a6
	rts

LoadView=-222
WaitTOF=-270
display:move.l a6,-(a7)
	move.l 4.w,a6
	lea gfxname(pc),a1
	jsr OldOpenLibrary(a6)
	move.l d0,a6
	tst.l d0
	beq.b nogfx
	move.l 34(a6),d2	;ActiView
	sub.l a1,a1
	jsr LoadView(a6)
	jsr WaitTOF(a6)
	jsr WaitTOF(a6)
	move.l d2,a1
	jsr LoadView(a6)
	move.l 38(a6),$dff080
	move.w d0,$dff088
	
	move.l a6,a1
	move.l 4.w,a6
	jsr CloseLibrary(a6)
nogfx:	move.l (a7)+,a6
	rts
gfxname:dc.b "graphics.library",0
	even
	
chkexec:move.l 4.w,a0
	move.l a0,d1
	btst #0,d1		;even?
	bne.b failexc
	add.l $26(a0),d1	;checkbase
	not.l d1
	bne.b failexc
	lea $22(a0),a1
	moveq #($54-$22)/2-1,d0
execsum:add.w (a1)+,d1
	dbf d0,execsum	
	not.w d1
	;bne.b failexc
failexc:rts			;bne.b badexec

grabmem:move.l a1,d0		;a1:execbase,d2:attributebit
nxtmlst:btst #0,d0
	bne.b nograb
	move.w $0e(a1),d0	;attributes
	btst d1,d0
	bne.b memchip
	move.l (a1),a1
	move.l a1,d0
	bne.b nxtmlst
	bra.w nograb
memchip:move.l $10(a1),a1
	move.l a1,d0
	beq.b nograb
scanml:	btst #0,d0
	bne.b nograb
	btst #0,7(a1)	;even size?
	bne.b nograb
	moveq #8,d0
	add.l wrksize-base(a6),d0
	cmp.l 4(a1),d0
	bls.b useml
	move.l (a1),a1
	move.l a1,d0
	bne.b scanml
	bra.b nograb
useml:	;addq.l #8,a1			;don't trash ptr/size
	add.l 4(a1),a1	;end of chunk
	sub.l wrksize-base(a6),a1
	moveq #-1,d0
	rts
nograb:	moveq #0,d0
	rts

endfrz:	move #$3700,sr		;use isp|(68020+:msp)
	move.l startmsp-base(a6),a7	;msp
	move #$2700,sr		;use isp
	move.l startisp-base(a6),a7	;isp

	tst.b cpu-base(a6)	;68010+ ?
	beq.b nomsp4
	move.l startvbr-base(a6),a5	;vbr
	dc.l movec_a5.vbr
	move.b startsfcdfc-base(a6),d0
	dc.l movec_d0.sfc
	move.b startsfcdfc+1-base(a6),d0
	dc.l movec_d0.dfc
	cmp.b #2,cpu-base(a6)	;68020+ ?
	bcs.b nomsp4
	move.l startcacr-base(a6),a5	;cacr
	dc.l movec_a5.cacr
	cmp.b #4,cpu-base(a6)		;68040?
	beq.b nomsp4
	move.l startcaar-base(a6),a5	;caar
	dc.l movec_a5.caar
nomsp4:
	move.l startusp-base(a6),a0	;restore initial? regs
	move.l a0,usp
	lea $dff000,a2
	move.w #$7fff,d0
	move.w d0,$96(a2)
	move.w d0,$9e(a2)
	move.w d0,$9a(a2)
	move.w d0,$9c(a2)
xxx:	move.w $6(a2),$180(a2)	;nice, eh?
	dbf d0,xxx
	move.w rdff002-base(a6),$96(a2)
	move.w rdff010-base(a6),$9e(a2)
	move.w rdff01c-base(a6),$9a(a2)
	move.w rdff01e-base(a6),$9c(a2)
	movem.l regs-base(a6),d0-d7/a0-a6
	rte

savereg:move.w (a7),d0		;the trick to grab the system
	move.w #$2700,(a7)		;stay in sv,no ints
	move.w d0,regs+64+28-base(a6)		;sr
	move.l 2(a7),regs+64+24-base(a6)	;pc
	addq.l #2,2(a7)		;skip illegal
	rte

savefpu:tst.b fpu-base(a6)
	beq.b nofpu0
	lea fpuregs-base(a6),a2
	dc.l fmovem_fp0_7.a2
	lea fpcr-base(a6),a2
	dc.l fmovem_fpcx.a2
nofpu0:	rts
loadfpu:tst.b fpu-base(a6)
	beq.b nofpu1
	lea fpuregs-base(a6),a2
	dc.l fmovem_a2.fp0_7
	lea fpcr-base(a6),a2
	dc.l fmovem_a2.fpcx
nofpu1:	rts
savemmu:tst.b mmu-base(a6)	;nommu
	beq.b savemm0
	cmp.b #3,mmu-base(a6)	;68040mmu
	beq.b savemm0
	cmp.b #1,mmu-base(a6)
	beq.b mmu51
	lea mmutt0-base(a6),a2
	dc.l pmove_tt0.a2
	addq.w #mmutt1-mmutt0,a2
	dc.l pmove_tt1.a2
	bra.b no851
mmu51:	lea mmudrp-base(a6),a2		;68851
	dc.l pmove_drp.a2
no851:	lea mmutt0+8-base(a6),a2
	dc.l pmove_tc.a2
	addq.w #mmusrp-mmutc,a2
	dc.l pmove_srp.a2
	addq.w #mmucrp-mmusrp,a2
	dc.l pmove_crp.a2
	addq.w #mmusr-mmucrp,a2
	dc.l pmove_mmusr.a2
savemm0:rts
loadmmu:tst.b mmu-base(a6)	;nommu
	beq.b loadmm0
	cmp.b #3,mmu-base(a6)	;68040mmu
	beq.b loadmm0
	lea $e0.w,a1		;mmu config error trap
	add.l vbreg-base(a6),a1
	move.l (a1),-(a7)	;old trapvec
	lea mmutrap(pc),a2
	move.l a2,(a1)
	cmp.b #1,mmu-base(a6)
	beq.b mmu512
	lea mmutt0-base(a6),a2
	dc.l pmove_a2.tt0	;pmovefd?
	addq.w #mmutt1-mmutt0,a2
	dc.l pmove_a2.tt1
	bra.b no8512
mmu512:	lea mmudrp-base(a6),a2		;68851
	dc.l pmove_a2.drp
no8512:	lea mmutt0+8-base(a6),a2
	dc.l pmove_a2.tc
	addq.w #mmusrp-mmutc,a2
	dc.l pmove_a2.srp
	addq.w #mmucrp-mmusrp,a2
	dc.l pmove_a2.crp
	addq.w #mmusr-mmucrp,a2
	dc.l pmove_a2.mmusr
	move.l (a7)+,(a1)
loadmm0:rts
mmutrap:rte	;ignore

getvbr:	sub.l a5,a5
	bsr.w chkexec
	bne.b badexec
	move.l a6,d0
	move.l 4.w,a6
	btst #0,$129(a6)
	beq.b novbr
	lea getit(pc),a5
	jsr Supervisor(a6)
novbr:	move.l d0,a6
badexec:rts
getit:	dc.l movec_vbr.a5
	rte	

	; well, it looks funny, but there are SOME entries here
except:	bsr.b incexc	;08
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc	;3c

	bsr.b incexc	;40
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc	;7c

	bsr.b incexc	;80
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc	;bc

	bsr.b incexc	;c0
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc
	bsr.b incexc	;fc
	nop	
incexc:	move.l a6,-(a7)
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	move.l (a7)+,regs+8-base(a6)
	movem.l d0-d1,regs-base(a6)
	move.l (a7)+,d1		;return address
	lea except(pc),a6
	sub.l a6,d1
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	lsr.b #1,d1
	move.b d1,excnum-base(a6)	;$08:1,$0c:2...$fc:3e
	
	move.w (a7),d1			;sr
	tst.b cpu-base(a6)		
	bne.b tp680x0			;68000 exception?
	cmp.b #2,excnum-base(a6)	;adr/bus err
	bhi.b sh68000
	move.l 2(a7),excadr-base(a6)
	move.w 6(a7),excinstr-base(a6)
	move.w 8(a7),exceptsr-base(a6)
	move.l 10(a7),exceptpc-base(a6)

	move.w 8(a7),d1		;sr
	lea $0e(a7),a7
	bra.w quitexc
sh68000:move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)
	addq.w #06,a7 
	bra.w quitexc

; MC68010 + exception processing
tp680x0:move.w 6(a7),d0		;formatcode
	and.w #%1111000000000000,d0
	beq.b isshort
	cmp.w #%0001000000000000,d0	;int format
	bne.b nshort
isshort:move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)
	addq.w #08,a7
;exception type		pc
;interrupt,trap #n	next
;format error		rte, frestore
;illegal,linea,linef	illegal,linea,linef
;privilege violation	1st word causing violation
;fp pre-instruction	fp instruction that returned fp pre-instruction
nshort:	cmp.w #%0010000000000000,d0	;instr exception
	bne.b ninex
	move.w (a7),exceptsr-base(a6)
	move.l 8(a7),exceptpc-base(a6)	;address
	cmp.b #9,excnum-base(a6)	;linea?
	beq.b unimpfp
	cmp.b #2,excnum-base(a6)	;address error?
	bne.b ninex2
unimpfp:move.l 2(a7),exceptpc-base(a6)	;instruction address
	move.l 8(a7),excadr-base(a6)	;referenced address
ninex2:	lea $0c(a7),a7
;exception type				pc	address
;chk,chk2,trapcc,ftrapcc,trapv,		next	instr address
;trace,zero divide				"	"
;unimplemented fp instr			next	calculated fp ea
;address error				instr	referenced address
ninex:	cmp.w #%0011000000000000,d0	;fp post instr exception (40)
	bne.b nfppost
	move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)
	move.l 8(a7),excadr-base(a6)
	lea $0c(a7),a7
;exception type		pc	address
;fp post-instruction	next	referenced address
nfppost:cmp.w #%0111000000000000,d0	;access error (40)
	bne.b naccerr
	move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)	;next instr
	move.l 20(a7),excadr-base(a6)	;fault address
	lea $3c(a7),a7
;exception type			pc
;access fault, bus error	next instr
naccerr:cmp.w #%1000000000000000,d0	;68010 buserror
	bne.b n10berr
	move.l 10(a7),excadr-base(a6)
	move.w 24(a7),excinstr-base(a6)
	move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)
	lea $3a(a7),a7
n10berr:cmp.w #%1001000000000000,d0	;coprocessor midinstr
	bne.b ncpmid
	move.w (a7),exceptsr-base(a6)
	move.l 2(a7),excadr-base(a6)	;next word
	move.l 8(a7),exceptpc-base(a6)	;instr address
	lea $14(a7),a7
;exception type		pc		address
;coprocessor mid instr	next word	instruction address
;protocol violation	next word	instruction address
;int during copro instr	next word	instruction address
ncpmid:	cmp.w #%1010000000000000,d0	;short buserror
	bne.b nshberr
	move.l 20(a7),excadr-base(a6)	;internal reg
	move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)
	lea $20(a7),a7
;exception type		pc
;address, bus error	next instr
nshberr:cmp.w #%1011000000000000,d0	;long buserror
	bne.b nlgberr
	move.l 36(a7),excadr-base(a6)	;stage b address
	move.w 30(a7),excinstr-base(a6)	;internal reg
	move.w (a7),exceptsr-base(a6)
	move.l 2(a7),exceptpc-base(a6)	;instruction address
	lea $5c(a7),a7
;exception type		pc
;address, bus error	executed instr when fault occured
nlgberr:
quitexc:and.w #$3fff,d1		;clr tracebits
	move.w d1,sr
	
	lea g1(pc),a6
	cmp.l (a7),a6		;sp changed?
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	bne.b newsp
	addq.w #4,a7		;remove return adr
newsp:	move.w d1,ccr
	movem.l regs-base(a6),d0-d1/a6
	bra.w g1

prtasc:	
	bsr.b doctrl
	tst.b d7
	beq.b prtasc0
	tst.b insmode-base(a6)
	beq.b noinsm
	bsr insert
noinsm:	bra.w rawchr
prtasc0:rts

doctrl:	sf d7			;no a0,d1,d7 allowed down here
	cmp.b #$13,d0
	beq.w csright
	cmp.b #$12,d0
	beq.w csleft
	cmp.b #$11,d0
	beq.w csdownroll
	cmp.b #$10,d0
	beq.w csup
	cmp.b #1,d0	;sh-csup
	beq.w cstop
	cmp.b #2,d0
	beq.w csbot
	cmp.b #3,d0
	beq.w csbeg
	cmp.b #4,d0
	beq.w csend
	cmp.b #$0d,d0
	beq.w enter
	cmp.b #$0e,d0
	beq.w shenter
	cmp.b #$07,d0	;sh-bs
	beq.w clrhome
	cmp.b #$08,d0	;bs
	beq.w backspc
	cmp.b #$09,d0	;del
	beq.w del
	cmp.b #$0a,d0	;sh-del
	beq.w insert
	cmp.b #6,d0
	beq.w help
	cmp.b #11,d0
	beq.w swapbuf
	cmp.b #$05,d0
	beq.b tab	;tab	
	cmp.b #$14,d0
	beq.w lnclr	;sh-tab	
	cmp.b #$15,d0
	beq.w histbk
	cmp.b #$16,d0
	beq.w histfw
	cmp.b #$19,d0
	beq.w kphome
	cmp.b #$1a,d0
	beq.w kpend
	cmp.b #12,d0	;sh-ins
	beq.b instogl

	cmp.b #$80,d0
	bcs.b nofkey
	cmp.b #$89,d0
	bls.b dofkey
nofkey:	st d7
	rts

instogl:not.b insmode-base(a6)
	rts

dofkey:	move.w #1,buflen-base(a6)	;funky keys..
	lea fkeybuf-base(a6),a5
	sub.b #$80,d0
	ext.w d0
	mulu #fkeylen,d0
	lea (a5,d0.w),a5
	moveq #fkeylen-1,d2
dofk0:	move.b (a5)+,d0
	beq.b dofk1
	cmp.b #"|",d0			;more than one cmd?
	bne.b dofk2
	moveq #13,d0
dofk2:	bsr.w bufit
	dbf d2,dofk0
dofk1:	rts
;	moveq #13,d0
;	bra.w bufit

tab:	bsr.b tab0			;skips spaces 'til next data
	bne.b tab
tab1:	cmp.b #xchars-1,col-base(a6)
	beq.b tab2
	bsr.b tab0
	beq.b tab1
	cmp.b #"'",(a5)
	beq.b tab1
	rts
tab2:	sf col-base(a6)
tab0:	bsr.w csright
	bsr.w crsrtxt
	cmp.b #" ",(a5)
	rts

lnclr:	move.w row-base(a6),d3	;row&col
	moveq #xchars-1,d4
	sub.b d3,d4		;col
lnloop:	bsr.w del
	dbf d4,lnloop
lnend:	move.w d3,row-base(a6)
	rts

histfw:	moveq #1,d2
	bra.b hist2
histbk:	moveq #-1,d2
hist2:	lea histlin-base(a6),a1
	move.b (a1),d3
	moveq #histnum-1,d0
	add.b d2,(a1)		;up/down
	bmi.b hist1
	move.b (a1),d0
	divu #histnum,d0
	swap d0
hist1:	move.b d0,(a1)
	movem.l d1/a0,-(a7)
	lea histbuf-base(a6),a0
	ext.w d0
	mulu #xchars-1,d0
	add.l d0,a0
	tst.b (a0)
	bne.b hist3
	move.b d3,(a1)		;histlin
	bra.b hist4
hist3:	lea linebuf-base(a6),a1
	move.b #">",(a1)+
	moveq #xchars-1-1,d1
hist0:	move.b (a0)+,(a1)+
	dbf d1,hist0	
	bsr.w rawout		;del:d0,d1,a0
hist4:	movem.l (a7)+,d1/a0
	rts

kphome:	bsr.b cstop
csbeg:	move.b #1,col-base(a6)
	rts
cstop:	tst.b row-base(a6)
	beq.b pageup
	sf row-base(a6)
	rts
kpend:	bsr.b csbeg
csbot:	move.b rowsm1-base(a6),d2
	cmp.b row-base(a6),d2
	beq.w pagedwn
	move.b d2,row-base(a6)
csr0:	rts
pageup:	move.b col-base(a6),d2
	movem.l d1-d2/d7/a0,-(a7)
	lea txtscr-base(a6),a5
	lea 2(a5),a3			;addrstart
	bsr.w atolong			;get top addr
	moveq #$40,d1
	cmp.w #">;",(a5)		;ascii dump
	lea acore(pc),a4
	beq.w dopageu
	moveq #$10,d1
	cmp.w #">:",(a5)		;hex dump
	lea mcore(pc),a4
	beq.w dopageu

	cmp.b #">",(a5)
	bne.b nobpgu
	move.b 1(a5),d2
	bsr binsize		;returns d1
	beq.b nobpgu
	lea bincore(pc),a4
	bra.b dopageu

nobpgu:	moveq #4,d1
	cmp.w #">.",(a5)		;copper dump
	lea ccore(pc),a4
	beq.b dopageu
	cmp.w #">_",(a5)		;6502 disasm
	lea dis6502(pc),a3
	lea pgdis65(pc),a4
	beq.b dopcpu
	lea disasm(pc),a3
	lea pgdis(pc),a4
	cmp.w #">,",(a5)		;disasm
	bne.b nopageu
	btst #0,d0
	bne.b nopageu

dopcpu:	lea dostrkbuf-base(a6),a0
	move.l a0,-(a7)
	move.l d0,a5
	sub.w #400,a5
	move.l a5,d1
	bpl.b dpag0
	sub.l a5,a5
dpag0:	move.l a5,(a0)+
	jsr (a3)
	cmp.l a5,d0
	bhi.b dpag0
	moveq #0,d0
	move.b rowsm2-base(a6),d0
	lsl.w #2,d0
	sub.l d0,a0
	move.l (a7)+,a1
	cmp.l a0,a1
	bls.b nounder
	move.l a1,a0
nounder:move.l (a0),d0
	moveq #0,d1
dopageu:sf row-base(a6)
	moveq #0,d6
	move.b rowsm2-base(a6),d6
	move.w d6,-(a7)
	mulu d1,d6
	sub.l d6,d0
	bpl.b pgupos
	moveq #0,d0
pgupos:	move.l d0,a5
	move.l d0,para-base(a6)
	move.w (a7)+,d6
pguloop:jsr (a4)
	dbf d6,pguloop
	moveq #">",d0
	bsr rawchr
nopageu:movem.l (a7)+,d1-d2/d7/a0
	move.b d2,col-base(a6)
	sf row-base(a6)
	rts

pagedwn:lea txtscr-base(a6),a5	;bottom+1 line
	moveq #0,d2
	move.b rowsm2-base(a6),d2
	mulu #xchars,d2
	add.l d2,a5
	move.b col-base(a6),d2
	movem.l d1-d2/d7/a0,-(a7)

	lea 2(a5),a3			;addrstart
	bsr.w atolong			;get top addr
	cmp.w #">;",(a5)		;ascii dump
	lea acore(pc),a4
	beq.b dopage
	cmp.w #">:",(a5)		;hex dump
	lea mcore(pc),a4
	beq.b dopage

	cmp.b #">",(a5)
	bne.b nobpg
	move.b 1(a5),d2
	bsr binsize		;returns d1
	beq.b nobpg
	lea bincore(pc),a4
	bra.b dopage

nobpg:	cmp.w #">.",(a5)		;copper dump
	lea ccore(pc),a4
	beq.b dopage
	cmp.w #">_",(a5)		;6502 disasm
	lea pgdis65(pc),a4
	beq.b dopage
	
	btst #0,d0			;even disasm adr?
	bne.b nopage
	lea pgdis(pc),a4
	cmp.w #">,",(a5)		;disassemble
	bne.b nopage

dopage:	move.l d0,para-base(a6)
	move.l d0,a5
	move.b #">",linebuf-base(a6)
	bsr rawout
	sf row-base(a6)
	moveq #0,d6
	move.b rowsm2-base(a6),d6
pgloop:	move.b rowsm1-base(a6),d0
	cmp.b row-base(a6),d0
	beq.b pgfull
	jsr (a4)
pgfull:	dbf d6,pgloop
nopage:	movem.l (a7)+,d1-d2/d7/a0
	move.b d2,col-base(a6)
	rts
pgdis:	bsr disasm
	bsr hlbrkpt
	bsr rawline
	bsr hdlline
	move.l a5,para-base(a6)
	rts
pgdis65:bsr dis6502
	move.l a5,para-base(a6)
	bra rawline

csright:addq.b #1,col-base(a6)
	cmp.b #xchars,col-base(a6)
	bne.w csr0
	sf col-base(a6)
csdown:	addq.b #1,row-base(a6)
	move.b rows-base(a6),d0
	cmp.b row-base(a6),d0
	bne.w csr0
	subq.b #1,row-base(a6)
	bra.w scroll
csdownroll:
	addq.b #1,row-base(a6)
	move.b rows-base(a6),d0
	cmp.b row-base(a6),d0
	bne.w csr0
	subq.b #1,row-base(a6)
	sf rolltop-base(a6)
	bra.b rollscr

csleft:	tst.b col-base(a6)
	beq.b csl0
	subq.b #1,col-base(a6)
	rts
csl0:	tst.b row-base(a6)
	beq.b csl1
	subq.b #1,row-base(a6)
	move.b #xchars-1,col-base(a6)
csl1:	rts
csup:	st rolltop-base(a6)
	tst.b row-base(a6)
	beq.b rollscr		;beq.b csu0
	subq.b #1,row-base(a6)
csu0:	rts

csend:	move.b #xchars,col-base(a6)
	bsr crsrtxt
	move.l a5,a4
	moveq #xchars-3,d0
csend1:	cmp.b #";",-(a4)
	bne.b csend2
	move.l a4,a5
	bra.b csend0
csend2:	subq.b #1,col-base(a6)
	dbf d0,csend1

	move.b #xchars,col-base(a6)
	subq.w #1,a5
	moveq #xchars-3,d0
csend0:	subq.b #1,col-base(a6)
	cmp.b #" ",-(a5)
	dbne d0,csend0
	rts

rollscr:tst.b rolltop-base(a6)
	beq.b rollsc0
	bsr.w scrdown			;scroll screen down
	lea txtscr+xchars-base(a6),a5
	bra.b rollsc1
rollsc0:bsr.w scroll
	move.b rowsm2-base(a6),row-base(a6)
	lea txtscr-base(a6),a5		;*****
	moveq #0,d2
	move.b rows-base(a6),d2
	subq.w #3,d2
	mulu #xchars,d2
	add.l d2,a5
rollsc1:move.b col-base(a6),d2
	movem.l d1-d2/d7/a0,-(a7)

	lea 2(a5),a3			;addrstart
	bsr.w atolong			;get top addr
	pea endup(pc)
	cmp.w #">;",(a5)		;ascii dump
	beq.w upascii
	cmp.w #">:",(a5)		;hex dump
	beq.w uphex
	cmp.w #">|",(a5)
	beq.w upbinb
	cmp.w #">]",(a5)
	beq.b upbinw
	cmp.w #">[",(a5)
	beq.b upbinl
	cmp.w #">}",(a5)
	beq.b upbint
	cmp.w #">{",(a5)
	beq.b upbinq

	cmp.w #">.",(a5)		;copper dump
	beq.b upcop
	cmp.w #">_",(a5)		;6502 disasm
	beq.w up6502
	
	btst #0,d0			;even disasm adr?
	bne.b noupdis
	cmp.w #">,",(a5)		;disassemble
	beq.w updis
noupdis:subq.w #4,a7			;remove endup from stack
membeg:	addq.w #8,a7			;remove endup/subroutine
endup:	sf row-base(a6)
	tst.b rolltop-base(a6)
	bne.b endup2
	move.b rowsm1-base(a6),row-base(a6)
endup2:	sf col-base(a6)
	bsr.w rprompt			;>
	movem.l (a7)+,d1-d2/d7/a0
	move.b d2,col-base(a6)
	rts

upbinq:	moveq #8,d1
	pea binq(pc)
	bra.b setpara
upbint:	moveq #6,d1
	pea bint(pc)
	bra.b setpara
upbinl:	moveq #4,d1
	pea binl(pc)
	bra.b setpara
upbinw:	moveq #2,d1
	pea binw(pc)
	bra.b setpara
upbinb:	moveq #1,d1
	pea binb(pc)
	bra.b setpara
upcop:	moveq #4,d1
	pea copper(pc)
	bra.b setpara
uphex:	moveq #16,d1
	pea m(pc)
	bra.b setpara
upascii:moveq #64,d1
	pea a(pc)
setpara:add.l d1,d0
	tst.b rolltop-base(a6)
	beq.b setpar0
	sub.l d1,d0
	sub.l d1,d0
	bmi.b membeg
setpar0:move.l d0,para-base(a6)
	add.l d1,d0
	move.l d0,para+4-base(a6)
	moveq #2,d3
	rts

up6502:	tst.b rolltop-base(a6)
	beq.b down65
	moveq #3*5+3,d1		;max opcode len 6502: 3 bytes
upred65:subq.w #1,d1
	beq.b endup65
	move.l d0,a5
	sub.l d1,a5
	move.l a5,d4		;start below 0?
	bpl.b upd652
	sub.l a5,a5	
upd652:	moveq #3*5-1,d4		;maxbyte(3):minbyte(1)=3
upd65m:	bsr.w dis6502
	cmp.l d0,a5		;disassembly matching?
	beq.b upd650
	bhi.b upd651
	dbf d4,upd65m
upd651:	bra.b upred65
upd650:	bsr.b downrl
	sf row-base(a6)
endup65:rts
down65:	move.l d0,a5
	bsr.w dis6502
	bsr.w dis6502
	move.l a5,para-base(a6)
downrl:	bra.w rawline

updis:	tst.b rolltop-base(a6)
	beq.b downdis
	moveq #10*5+2,d1	;max opcode len MC68000: 10 bytes
upredis:subq.w #2,d1
	beq.b endupd
	move.l d0,a5
	sub.l d1,a5
	move.l a5,d4		;start below 0?
	bpl.b updis2
	sub.l a5,a5	
updis2:	moveq #5*5-1,d4		;maxbyte(10):minbyte(2)=5
updsm:	move.l a5,para-base(a6)
	bsr.w disasm
	cmp.l d0,a5		;disassembly matching?
	beq.b updis0
	bhi.b updis1
	dbf d4,updsm
updis1:	bra.b upredis
updis0:	bsr hlbrkpt

	bsr.w hdltest		;2 lines?
	bne.b noline
	bsr.w scrdown
noline:	bsr.w rawline
	bsr.w hdlline
	sf row-base(a6)
endupd:	rts
downdis:move.l d0,a5

	bsr.w disasm
	move.l a5,para-base(a6)
	bsr.w disasm
	bsr hlbrkpt
	bsr rawline
	bsr hdlline
	move.l a5,para-base(a6)
	rts

clrhome:pea rprompt(pc)		;>	
clrscr:	move.l scradr-base(a6),a5	;the lame stuff...
	moveq #0,d0
	moveq #0,d5
	move.b rows-base(a6),d5
	mulu #xchars*8/4,d5
	subq.w #1,d5
ch0:	move.l d0,(a5)+
	dbf d5,ch0
	lea txtscr-base(a6),a5
	moveq #" ",d0
	moveq #0,d5
	move.b rows-base(a6),d5
	mulu #xchars,d5
	subq.w #1,d5
ch1:	move.b d0,(a5)+
	dbf d5,ch1
	lea linebuf-base(a6),a5
	moveq #xchars-1,d5
ch2:	move.b d0,(a5)+
	dbf d5,ch2
	sf row-base(a6)
	sf col-base(a6)
	rts

insert:	bsr.w crsrtxt
	move.l a5,a4
	bsr.w crsrbm
	moveq #xchars-1-1,d2
	move.b col-base(a6),d3
	ext.w d3
	sub.w d3,d2
	lea (a5,d2.w),a5
	lea (a4,d2.w),a4
	bcs.b ins2
ins0:	moveq #8-1,d3
ins3:	move.b (a5),1(a5)
	lea xpixel/8(a5),a5
	dbf d3,ins3
	lea -xpixel-1(a5),a5
	move.b (a4)+,(a4)
	subq.w #2,a4
	dbf d2,ins0
ins2:	moveq #8-1,d5
ins1:	sf 1(a5)
	lea xpixel/8(a5),a5
	dbf d5,ins1
	move.b #" ",1(a4)
bs0:	rts			;two
backspc:;tst.b col-base(a6)
	;beq.b bs0
	cmp.b #1,col-base(a6)
	bls.s bs0
	bsr.w csleft
del:	bsr.w crsrtxt
	move.l a5,a4
	bsr.w crsrbm
	moveq #xchars-1-1,d2
	sub.b col-base(a6),d2
	bcs.b del2
del0:	moveq #8-1,d5
del4:	move.b 1(a5),(a5)
	lea xpixel/8(a5),a5
	dbf d5,del4
	lea -xpixel+1(a5),a5
	move.b 1(a4),(a4)+
	dbf d2,del0
del2:	moveq #8-1,d5
del3:	sf (a5)
	lea xpixel/8(a5),a5
	dbf d5,del3
	move.b #" ",(a4)
	rts

swapbuf:movem.l d1/a0,-(a7)		;no a0,d1,d7
	move.w row-base(a6),-(a7)
	lea txtscr-base(a6),a1
	moveq #0,d2
	move.b rows-base(a6),d2
	mulu #xchars/4,d2
	subq.w #1,d2
swpbuf:	move.l txtback-txtscr(a1),d3
	move.l (a1),txtback-txtscr(a1)
	move.l d3,(a1)+
	dbf d2,swpbuf
	sf row-base(a6)
	lea txtscr-base(a6),a1
	moveq #0,d2
	move.b rowsm1-base(a6),d2
swplp:	lea linebuf-base(a6),a0
	moveq #xchars-1,d0
cpybck:	move.b (a1)+,(a0)+
	dbf d0,cpybck
	bsr.w rawout
	addq.b #1,row-base(a6)
	dbf d2,swplp
	move.w rowback-base(a6),row-base(a6)
	move.w (a7)+,rowback-base(a6)	;row,col
	movem.l (a7)+,d1/a0
	rts

help:	movem.l d1/a0,-(a7)
	bsr.w clrhome
	sf col-base(a6)
	moveq #0,d2
	move.b rowsm2-base(a6),d2
	move.l helpadr-base(a6),a1
hlp0:	tst.b (a1)
	beq.b endhlp
	lea linebuf-base(a6),a0
	bsr.w txttobuf
	lea linebuf+22-base(a6),a0
	bsr.w txttobuf
	tst.b (a1)
	beq.b endhlp2
	lea linebuf+39-base(a6),a0
	move.b #"|",(a0)+
	bsr.w txttobuf
	lea linebuf+62-base(a6),a0
	bsr.w txttobuf
endhlp2:bsr.w rawline
	dbf d2,hlp0
	tst.b (a1)
	bne.b hlp2
endhlp:	lea helptxt-$7ffe(pc),a1
	lea $7ffe(a1),a1
hlp2:	move.l a1,helpadr-base(a6)
	bsr.w rprompt		;>
	movem.l (a7)+,d1/a0
	rts
enter:	movem.l d1/d7/a0,-(a7)
	move.b col-base(a6),d6
	sf col-base(a6)
	bsr.w csdown
	bsr.w crsrtxt	;a5 !
	lea -xchars(a5),a5

	cmp.b #">",(a5)
	bne.w igncmd

	lea cmd(pc),a3
	lea cmdjmp-2(pc),a4
scanagn:sf d2
	lea 1(a5),a0
	cmp.b #" ",(a0)
	beq.b scancmd
	lea lastcmd-base(a6),a1
	move.b (a0)+,(a1)+
	move.b (a0)+,(a1)+
	move.b (a0)+,(a1)+
	move.b (a0),(a1)
	subq.w #3,a0
scancmd:move.b (a3),d0
	beq.w igncmd
	move.b (a0)+,d1
	tst.b d2
	bne.b nomatch
	bclr #7,d0
	cmp.b d0,d1
	sne d2
nomatch:btst #7,(a3)+
	beq.b scancmd
	addq.w #2,a4
	tst.b d2
	bne.b scanagn
	move.w (a4),d3
	lea cmdjmp(pc),a4
	add.w d3,a4

	cmp.b #" ",1(a5)
	beq.b inhist1		;no cmd
	lea histcnt-base(a6),a1
	lea histbuf-base(a6),a2
	moveq #0,d3
	move.b (a1),d3			;histcnt
	divu #histnum,d3
	swap d3
	mulu #xchars-1,d3
	add.l d3,a2
	moveq #xchars-1-1,d2
inhist:	move.b 1(a5,d2.w),(a2,d2.w)	;skip >
	dbf d2,inhist
	add.b #1,(a1)			;histcnt
	cmp.b #histnum,(a1)		;histcnt
	bne.b inhist0
	sf (a1)				;histcnt
inhist0:move.b (a1),histlin-histcnt(a1)	;histcnt->histlin
inhist1:

	lea para-base(a6),a3
	sub.l a2,a2
	moveq #0,d3
skpblk:	lea xchars-1(a5),a1
ah3:	cmp.b #"'",(a0)
	beq.b ah5
	cmp.b #" ",(a0)
	bne.b endskip
	addq.w #1,a0
	cmp.l a0,a1
	bne.b ah3
endskip:
	moveq #8-1,d2		;maxlen	; convert cmd data
	moveq #0,d0
ah0:	cmp.l a0,a1
	beq.b endline
	move.b (a0)+,d1
	cmp.b #" ",d1
	beq.b ah1
	sub.b #"0",d1
	bcs.b ah5
	cmp.b #9,d1
	ble.b ah2
	bclr #5,d1
	cmp.b #"A"-"0",d1
	blt.b ah5
	cmp.b #"F"-"0",d1
	bgt.b ah5
	subq.b #"A"-"0"-10,d1	
ah2:	lsl.l #4,d0
	or.b d1,d0
	dbf d2,ah0
ah1:	move.l d0,(a3)+

	addq.b #1,d3
ah4:	cmp.b #16,d3
	bne.b ah3
ah5:
	sf d7
	subq.w #1,a0

	move.l a5,a2
ah6:	cmp.b #34,(a2)+
	beq.b ah7
	cmp.l a2,a1
	bne.b ah6
	sub.l a2,a2
ah7:

endline:move.l a5,lineend-base(a6)
	moveq #xchars,d0
	add.l d0,lineend-base(a6)
		
	;d3:#para,d6:oldcol,a0:stop,a2:quote,a5:cmdtxt / st d7:ok
	jsr (a4)	;execute cmd...

	tst.b d7
	bne.b truecmd

	moveq #"?",d0
	bsr.w rawchr
igncmd:	moveq #"?",d0
	bsr.w rawchr
shent:	bsr.w csdown
	sf col-base(a6)
truecmd:tst.b col-base(a6)
	bne.b nnspec
	bsr.w rprompt		;>
nnspec:	movem.l (a7)+,d1/d7/a0
	rts
shenter:movem.l d1/d7/a0,-(a7)	;no cmd execution
	bra.b shent

cursoff:bset #0,nocrsr-base(a6)
	btst #1,nocrsr-base(a6)
	beq.b coff0
coff1:	bra.w chgcrsr
curson:	btst #1,nocrsr-base(a6)
	bne.b crson0
	bsr.b coff1
crson0:	bclr #0,nocrsr-base(a6)
coff0:	rts

rawprt:	move.l d1,-(a7)
	moveq #xchars-1,d1		;print onto printer if online
	lea linebuf-base(a6),a0
rp0:	btst #0,$bfd000
	bne.b noprt
	move.b (a0)+,d0
	bsr.b chrprt
	dbf d1,rp0
	moveq #13,d0		;CR
	bsr.b chrprt
	moveq #11,d0		;LF
	bsr.b chrprt
	move.l (a7)+,d1
	rts
chrprt:	move.b d0,$bfe101
	moveq #100,d0
waitprt:tst.b 4.w
	dbf d0,waitprt
wprt2:	btst #0,$bfd000
	beq.b noprt
	btst #2,$dff016
	bne.b wprt2
noprt:	rts
	
rawline:tst.b prtflag-base(a6)	;col = 0 !
	beq.b noprint
	bsr.b rawprt
noprint:			;del: d0,a0
	bsr.b rawout
	lea linebuf-base(a6),a0
	sf col-base(a6)
	bra.w csdown

rawout:	movem.l d1/d2/d3/a1-a5,-(a7)	;del: d0,a0
	move.l a6,-(a7)
	lea linebuf-base(a6),a0
	lea font-base(a6),a1
	move.l scradr-base(a6),a2
	move.l a1,d3
	moveq #0,d0
	move.b row-base(a6),d0
	mulu #xchars,d0
	lea txtscr-base(a6),a6
	add.w d0,a6
	lsl.l #3,d0
	add.l d0,a2
	lea xpixel/8(a2),a3
	lea xpixel/8(a3),a4
	lea xpixel/8(a4),a5
	
	moveq #xchars-1,d2
rl0:	moveq #0,d0
	move.b (a0),d0		;char

	moveq #$60,d1
	and.b d0,d1		;0-1f,80-9f?
	bne.b rln1
	moveq #" ",d0
rln1:	moveq #" ",d1
	move.b d0,(a6)+		;ascii
	bpl.b rln2
	sub.b d1,d0
rln2:	sub.b d1,d0		;fontindex

	move.b d1,(a0)+		;" ",clr linebuf

	lsl.w #3,d0
	move.l d3,a1
	add.w d0,a1

	move.b (a1)+,(a2)+
	move.b (a1)+,(a3)+
	move.b (a1)+,(a4)+
	move.b (a1)+,(a5)+
	move.b (a1)+,xpixel/8*4-1(a2)
	move.b (a1)+,xpixel/8*4-1(a3)
	move.b (a1)+,xpixel/8*4-1(a4)
	move.b (a1),xpixel/8*4-1(a5)
	dbf d2,rl0

	move.l (a7)+,a6
	tst.b hilight-base(a6)
	beq.b nohighl
	moveq #8-1,d2
	lea -xchars+2(a2),a2
rlhigh:	not.l (a2)
	not.l 4(a2)
	lea xchars(a2),a2
	dbf d2,rlhigh
	sf hilight-base(a6)
nohighl:movem.l (a7)+,d1/d2/d3/a1-a5

	bra pushcache

crsrtxt:lea txtscr-base(a6),a5	;gimme pointers
	moveq #0,d5
	move.b col-base(a6),d5
	add.l d5,a5
	move.b row-base(a6),d5
	mulu #xchars,d5
	add.l d5,a5
	rts

rprompt:moveq #">",d0
rawchr:	movem.l d0-d1/d5/a2/a5,-(a7)
	bsr.b crsrtxt

	moveq #$60,d1
	and.b d0,d1		;0-1f,80-9f?
	bne.b rc1
	moveq #" ",d0
rc1:	moveq #" ",d1
	move.b d0,(a5)		;ascii
	bpl.b rc2
	sub.b d1,d0
rc2:	sub.b d1,d0	
	and.w #$ff,d0		;fontindex

	bsr.b crsrbm
	lea font-base(a6),a2
	lsl.w #3,d0
	add.w d0,a2

	moveq #xpixel/8,d5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2)+,(a5)
	add.w d5,a5
	move.b (a2),(a5)

	bsr.w csright
	movem.l (a7)+,d0-d1/d5/a2/a5
	bra pushcache
	
crsrbm:	move.l scradr-base(a6),a5	;more pointers
	moveq #0,d5
	move.b col-base(a6),d5
	add.l d5,a5
	move.b row-base(a6),d5
	mulu #xpixel/8*8,d5
	add.l d5,a5
	rts
scroll:	movem.l d0/a1-a2,-(a7)
	lea $dff000,a2
	bsr.w waitblt
waitfrm:btst #0,5(a2)			;$dff005, screen done?
	bne.b waitfrm
	move.l #$09f00000,$40(a2)	;$dff040 scroll up
	moveq #-1,d0	
	move.l d0,$44(a2)		;$dff044
	moveq #0,d0
	move.l d0,$64(a2)		;$dff064 clr.l forbidden!
	move.l scradr-base(a6),a1
	move.l a1,$54(a2)		;$dff054
	lea xpixel/8*8(a1),a1
	move.l a1,$50(a2)		;$dff050
	move.b rowsm1-base(a6),d0	;word
	ror.w #7,d0
	add.w #xchars/2,d0
	move.w d0,$58(a2)	;$dff058 start blit

	lea txtscr-base(a6),a1
	moveq #0,d0
	move.b rowsm1-base(a6),d0
	mulu #xchars/4,d0
	subq.w #1,d0
scup2:	move.l xchars(a1),(a1)+
	dbf d0,scup2
	moveq #xchars-1,d0
scup3:	move.b #" ",(a1)+
	dbf d0,scup3

	bsr.b waitblt

	moveq #0,d0
	move.w d0,$74(a2)		;$dff074 clr.w forbidden
	move.l #$01f00000,$40(a2)	;$dff040 clr bottom
	move.l scradr-base(a6),a1
	moveq #0,d0
	move.b rowsm1-base(a6),d0
	mulu #xchars*8,d0
	add.l d0,a1
	move.l a1,$54(a2)		;$dff054
	move.w #8*64+40,$58(a2)		;$dff058

	bsr.b waitblt
	movem.l (a7)+,d0/a1-a2
	rts
waitblt:
	;move.w #$8400,$96(a2)		;$dff096, we are nasty
waibl:	btst #14,$02(a2)		;$dff002
	bne.b waibl
	;move.w #$0400,$96(a2)		;$dff096, we are neat
	rts

scrdown:movem.l d0/a1-a2,-(a7)
	lea $dff000,a2
	bsr.b waitblt
wfrm0:	btst #0,5(a2)			;$dff005, screen done?
	bne.b wfrm0
	move.l #$09f00002,$40(a2)	;$dff040 scroll down
	moveq #-1,d0	
	move.l d0,$44(a2)		;$dff044
	moveq #0,d0
	move.l d0,$64(a2)		;$dff064 clr.l forbidden!
	move.l scradr-base(a6),a1
	move.b rowsm1-base(a6),d0
	mulu #xchars*8,d0
	subq.w #2,d0
	add.l d0,a1
	move.l a1,$50(a2)		;$dff050
	lea xpixel/8*8(a1),a1
	move.l a1,$54(a2)		;$dff054
	moveq #0,d0
	move.b rowsm1-base(a6),d0	;word
	ror.w #7,d0
	add.w #xchars/2,d0
	move.w d0,$58(a2)		;$dff058 start blit

	lea txtscr-base(a6),a1
	moveq #0,d0
	move.b rowsm1-base(a6),d0
	mulu #xchars,d0
	add.l d0,a1
	lsr.w #2,d0
	subq.w #1,d0
scdw2:	move.l -(a1),xchars(a1)
	dbf d0,scdw2
	moveq #xchars-1,d0
scdw3:	move.b #" ",(a1)+
	dbf d0,scdw3

	bsr.w waitblt

	moveq #0,d0
	move.w d0,$74(a2)		;$dff074 clr.w forbidden
	move.l #$01f00000,$40(a2)	;$dff040 clr top
	move.l scradr-base(a6),a1
	move.l a1,$54(a2)		;$dff054
	move.w #8*64+40,$58(a2)		;$dff058

	bsr.w waitblt
	movem.l (a7)+,d0/a1-a2
	rts

audint:	movem.l d0/d1/a0/a1/a6,-(a7)	;the soundint
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	lea $dff000,a0			;play any length(>128k!)

	moveq #127,d0
au0:	tst.b 4.w
	dbf d0,au0

	move.l para+4-base(a6),d1
	move.l para-base(a6),d0
	sub.l d0,d1
	bls.b au1

	moveq #sndintstep,d0
	cmp.l d0,d1
	bls.b au3
	move.l d0,d1
au3:	move.l para-base(a6),$a0(a0)	;$dff0a0
	move.l para-base(a6),$b0(a0)	;$dff0b0
	add.l d1,para-base(a6)	;the online counter...
	lsr.l #1,d1
	move.w d1,$a4(a0)	;$dff0a4
	move.w d1,$b4(a0)	;$dff0b4

	move.w para+10-base(a6),d0
	moveq #124,d1
	cmp.w d1,d0
	bcc.b au4
	move.w d1,d0
au4:	move.w d0,$a6(a0)	;$dff0a6
	move.w d0,$b6(a0)	;$dff0b6
	moveq #64,d0		;volume
	move.w d0,$a8(a0)	;$dff0a8
	move.w d0,$b8(a0)	;$dff0b8
	move.w #$8003,$96(a0)	;$dff096
	bra.b au2
	
au1:	clr.l para+4-base(a6)
	move.w #$0080,$9a(a0)	;$dff09a
au2:	move.w #$0080,$9c(a0)	;$dff09c clr sndint
	movem.l (a7)+,d0/d1/a0/a1/a6
	rte

vblint:	movem.l d0-d7/a0-a6,-(a7)
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	lea $dff000,a5

	tst.b frzflag-base(a6)		;did we freeze?
	beq.b mutil3

	moveq #0,d0
	btst #0,modeflg-base(a6)
	beq.b vblnlc
	tst.w 4(a5)
	bmi.b vblnlc
	moveq #xchars,d0
vblnlc:	add.l scradr-base(a6),d0
	move.l d0,$e0(a5)	;cpu=copper?
	bsr initcop
mutil3:
	lea $bfe001,a4
	move.l spradr-base(a6),a0
	lea $120(a5),a1		;$dff120
	move.l a0,(a1)+
	lea 72(a0),a0
	moveq #7-1,d0
sprptr:	move.l a0,(a1)+
	dbf d0,sprptr

	move.b $0a(a5),d0	;$dff00a set mousecursor
	move.b mousexy+1-base(a6),d1
	move.b d0,mousexy+1-base(a6)
	sub.b d1,d0
	ext.w d0
	add.w d0,msypos-base(a6)
	move.w d0,d1
	muls d0,d0		;parabolic
	cmp.w #25,d0
	bhi.b mou6
	tst.w d1
	bpl.b mou5
	neg.w d0
	bra.b mou5
mou6:	move.w d1,d0
	muls #5,d0		;linear
mou5:	muls #xpixel/8,d0
	sub.l d0,msycnt-base(a6)
	move.b $0b(a5),d0	;$dff00b
	move.b mousexy-base(a6),d1
	move.b d0,mousexy-base(a6)
	sub.b d1,d0
	ext.w d0
	ext.l d0
	move.l d0,d1
	;divs #2,d0
	add.w d0,msxpos-base(a6)
	sub.l d1,msycnt-base(a6)
	bpl.b mou4
	clr.l msycnt-base(a6)
mou4:	move.w msypos-base(a6),d0
	cmp.w #40,d0
	bhi.b mou2
	moveq #40,d0
mou2:	moveq #0,d1
	move.b modeflg-base(a6),d1
	add.w d1,d1
	move.w msymax(pc,d1.w),d1
	bra.b moucmp
msymax:	dc.w 256+39,256+39,200+39,200+39,480+39
moucmp:	cmp.w d1,d0
	bls.b mou3
	move.w d1,d0
mou3:	move.w d0,msypos-base(a6)
	move.w msxpos-base(a6),d1
	cmp.w #60,d1
	bhi.b mou0
	moveq #60,d1
mou0:	cmp.w #219,d1
	bls.b mou1
	move.w #219,d1
mou1:	move.w d1,msxpos-base(a6)

	btst #0,nocrsr-base(a6)
	bne.w nosetcs
	move.w #$0020,$96(a5)	;$dff096
	moveq #0,d0
	move.l d0,$144(a5)	;$dff144
	move.w $0a(a5),d0	;$dff00a
	cmp.w lastms-base(a6),d0
	beq.b noblnk
	move.w d0,lastms-base(a6)
	move.b #100,msdel-base(a6)
noblnk:	tst.b msdel-base(a6)
	beq.w nosetcs
	subq.b #1,msdel-base(a6)
	move.w #$8020,$96(a5)	;$dff096

	moveq #-60,d1
	add.w msxpos-base(a6),d1
	lsr.b #1,d1

	moveq #-40,d2
	add.w msypos-base(a6),d2
	btst #0,modeflg-base(a6)
	beq.b mounlc2
	add.w d2,d2
mounlc2:lsr.w #3,d2

	btst #0,nocrsr-base(a6)	;ignore snap if no cursor blink
	bne.b nosnap
	btst #10,$16(a5)	;$dff016
	bne.b norms
	st rmsflag-base(a6)
	bra.b nosnap
norms:	tst.b rmsflag-base(a6)
	beq.b nosnap
	
	bsr.w cursoff
	sf rmsflag-base(a6)
	mulu #xpixel/8,d2		;csrrow
snap0:	lea txtscr-base(a6),a0
	add.w d1,a0		;csrcol
	add.w d2,a0
	move.b (a0),d0
	cmp.b #" ",d0		;eot
	beq.b noseton
	cmp.b #":",d0		;skip :
	beq.b snap1
	cmp.b #"$",d0		;skip $
	beq.b snap1
	cmp.b #"-",d0		;skip -
	bne.b snap2
	moveq #" ",d0
snap2:	bsr.w rawchr
snap1:	addq.b #1,d1		;col
	cmp.b #xchars-1,d1
	bls.b snap0
	bsr.w curson
	
nosnap:	btst #6,(a4)		;$bfe001
	bne.b nosetcs
	bsr.w cursoff
	move.b d1,col-base(a6)
	move.b d2,row-base(a6)
noseton:bsr.w curson
nosetcs:
	move.l spradr-base(a6),a0	;setspr
	move.w msypos-base(a6),d0
	sf 3(a0)
	btst #8,d0
	beq.b mvert0
	bset #2,3(a0)
mvert0:	move.b d0,(a0)
	add.w #17,d0
	btst #9,d0		;multiscan, lower border
	beq.b mvert2
	move.w #$1ff,d0
mvert2:	btst #8,d0
	beq.b mvert1
	bset #1,3(a0)
mvert1:	move.b d0,2(a0)
	move.b msxpos+1-base(a6),d0
	cmp.b #4,modeflg-base(a6)
	bne.b nmsmous
	addq.b #4,d0
	btst #0,d0
	beq.b bit0zer
	bset #0,3(a0)
bit0zer:lsr.b #1,d0
nmsmous:move.b d0,1(a0)

	move.b ascii-base(a6),d0;keysub,delay and repeat...
	beq.b rk0
	cmp.b #$1b,d0		;escape
	beq.b rk0
	cmp.b prvkey-base(a6),d0
	bne.b rk1
	cmp.b #20,repdel-base(a6)
	beq.b rk2
	addq.b #1,repdel-base(a6)
	bra.b rk3
rk2:	cmp.b #1,d0			;sh-csup fast key repeat
	beq.b rkfast
	cmp.b #2,d0			;sh-csdown fast key repeat
	beq.b rkfast
	cmp.b #$10,d0			;csup fast key repeat
	beq.b rkfast
	cmp.b #$11,d0			;csdown
	beq.b rkfast
	cmp.b #$0d,d0			;return
	beq.b rkfast
	addq.b #1,keydel-base(a6)	;slow key repeat
	move.b rateflg-base(a6),d1
	cmp.b keydel-base(a6),d1
	bcc.b rk3
rkfast:	sf keydel-base(a6)
	bsr.b bufit
	bra.b rk3
rk1:	move.b d0,prvkey-base(a6)
rk0:	sf repdel-base(a6)
rk3:
	bsr.b cursor

	tst.w count-base(a6)
	beq.b vbltime
	subq.w #1,count-base(a6)
vbltime:move.w #$0070,$9c(a5)	;$dff09c
	movem.l (a7)+,d0-d7/a0-a6
	rte

cursor:	btst #0,nocrsr-base(a6)
	bne.b crsr0
	subq.b #1,crsrdel-base(a6)
	bne.b crsr0
	move.b #10,crsrdel-base(a6)
chgcrsr:movem.l d5/a5,-(a7)
	bsr.w crsrbm
	moveq #8-1,d5
chgcsln:not.b (a5)
	lea xpixel/8(a5),a5
	dbf d5,chgcsln
	bchg #1,nocrsr-base(a6)
	movem.l (a7)+,d5/a5
crsr0:	rts

bufit:	movem.l d0-d1/a0,-(a7)
	tst.b dontbuf-base(a6)
	bne.b ign0
	lea keybuf-base(a6),a0
	move.w buflen-base(a6),d1
	beq.b bufit0
	cmp.w #40,d1
	bge.b ign0
	cmp.b #1,d0		;shift-csup?
	beq.b bufit1
	cmp.b #2,d0		;shift-csdown?
	beq.b bufit1
	cmp.b #13,d0
	bne.b bufit0
bufit1:	cmp.b -1(a0,d1.w),d0
	beq.b ign0
bufit0:	move.b d0,(a0,d1.w)
	addq.w #1,buflen-base(a6)
ign0:	movem.l (a7)+,d0-d1/a0
	rts

keyint:	movem.l d0/d1/a0/a4/a6,-(a7)
	lea $dff006,a4
	move.w #$0008,$9a-6(a4)	;$dff09a
	lea base-$7ffe(pc),a6
	lea $7ffe(a6),a6
	btst #3,$bfed01		;ciaa icr sp?
	beq.w key0
	moveq #0,d0
	move.b $bfec01,d0
	bset #6,$bfee01		;cia sp out
	st $bfec01
	not.b d0
	lsr.w #1,d0
	bcs.b keyoff
	cmp.b #$60,d0		;any shifting?
	blt.b key2
	cmp.b #$67,d0
	bhi.b key3
	bset d0,shflag-base(a6)
	bra.b key3
key2:	moveq #7,d1
	and.b shflag-base(a6),d1
	beq.b key4
	cmp.b #$45,d0		;rawcode esc
	bne.b key7
	cmp.b #"g",lastcmd-base(a6)
	bne.b key7
	lea gg1(pc),a0		;stack cleanup
	move.l 5*4+2(a7),breakpc-base(a6)
	move.l a0,5*4+2(a7)
	bra.b key3
key7:	add.w #$60,d0
key4:	lea keytab-base(a6),a0
	move.b (a0,d0.w),d0
	beq.b key3
	move.b d0,ascii-base(a6)
	cmp.b #$1b,d0		;escape
	beq.b key3
	bsr.w bufit
	bra.b key3
keyoff:	cmp.b #$60,d0		;any shifting?
	blt.b key5
	cmp.b #$67,d0
	bhi.b key3
	bclr d0,shflag-base(a6)
	bra.b key3
key5:	sf ascii-base(a6)

key3:	moveq #4-1,d0
key6:	move.b (a4),d1
key1:	cmp.b (a4),d1
	beq.b key1
	dbf d0,key6
	bclr #6,$bfee01		;ciaa sp in
key0:
	move.w #$0008,$9c-6(a4)	;$dff09c
	move.w #$8008,$9a-6(a4)	;$dff09a
	movem.l (a7)+,d0/d1/a0/a4/a6
	rte
; here come the commands..
	dc.b "$VER:BeerMon 0."
	dc.b version/10+"0",-version/10*10+version+"0",0
cmd:	dc.b "S"!$80
	dc.b "L"!$80
	dc.b "verify"!$80
	dc.b "vc"!$80
	dc.b "v"!$80
	dc.b "smd2raw"!$80
	dc.b "famiplay"!$80
	dc.b "rawplay"!$80
	dc.b "smdplay"!$80
	dc.b "settt0"!$80
	dc.b "settt1"!$80
	dc.b "settc"!$80
	dc.b "setsrp"!$80
	dc.b "setcrp"!$80
	dc.b "setdrp"!$80
	dc.b "setmmusr"!$80
	dc.b "s"!$80
	dc.b "l"!$80
	dc.b "D"!$80
	dc.b "accu"!$80
	dc.b "index"!$80
	dc.b "auto"!$80
	dc.b "install"!$80
	dc.b "info"!$80
	dc.b "imp"!$80
	dc.b "i"!$80
	dc.b "p"!$80
	dc.b "gary"!$80
	dc.b "g"!$80
	dc.b "h"!$80
	dc.b "?"!$80
	dc.b "ramsey"!$80
	dc.b "r"!$80
	dc.b "R"!$80
	dc.b "match"!$80
	dc.b "mmuon"!$80
	dc.b "mmuoff"!$80
	dc.b "mmu"!$80
	dc.b "mk"!$80
	dc.b "megasum"!$80
	dc.b "famisum"!$80
	dc.b "m"!$80
	dc.b ":"!$80
	dc.b "a"!$80
	dc.b ";"!$80
	dc.b "x"!$80
	dc.b "X"!$80
	dc.b "ow"!$80
	dc.b "ol"!$80
	dc.b "o"!$80
	dc.b "exp"!$80
	dc.b "ew"!$80
	dc.b "el"!$80
	dc.b "e"!$80
	dc.b "cd"!$80
	dc.b "cls"!$80
	dc.b "cop"!$80
	dc.b "config"!$80
	dc.b "custom"!$80
	dc.b "c"!$80
	dc.b "format"!$80
	dc.b "fi"!$80
	dc.b "fmode"!$80
	dc.b "f"!$80
	dc.b "F"!$80
	dc.b "time"!$80
	dc.b "type"!$80
	dc.b "t"!$80
	dc.b "/"!$80
	dc.b "V"!$80
	dc.b "."!$80
	dc.b "W"!$80
	dc.b "datasum"!$80
	dc.b "del"!$80
	dc.b "dir"!$80
	dc.b "ds"!$80
	dc.b "dm"!$80
	dc.b "dv"!$80
	dc.b "d"!$80
	dc.b "u"!$80
	dc.b "_"!$80
	dc.b "N"!$80
	dc.b "nop"!$80
	dc.b ","!$80
	dc.b "n"!$80
	dc.b "K"!$80
	dc.b "B"!$80
	dc.b "bootsum"!$80
	dc.b "bitsum"!$80
	dc.b "binw"!$80
	dc.b "]"!$80
	dc.b "binl"!$80
	dc.b "["!$80
	dc.b "bint"!$80
	dc.b "}"!$80
	dc.b "binq"!$80
	dc.b "{"!$80
	dc.b "bin"!$80
	dc.b "|"!$80
	dc.b "bc"!$80
	dc.b "bs"!$80
	dc.b "bl"!$80
	dc.b "b"!$80
	dc.b "M"!$80
	dc.b "P"!$80
	dc.b "kicksum"!$80
	dc.b "k"!$80
	dc.b " "!$80,0
	even
cmdjmp:	dc.w save-cmdjmp,load-cmdjmp,verify-cmdjmp
	dc.w srcsync-cmdjmp,syncw-cmdjmp
	dc.w smd2raw-cmdjmp,famplay-cmdjmp,rawplay-cmdjmp,smdplay-cmdjmp
	dc.w settt0-cmdjmp,settt1-cmdjmp,settc-cmdjmp,setsrp-cmdjmp
	dc.w setcrp-cmdjmp,setdrp-cmdjmp,setmusr-cmdjmp
	dc.w sblk-cmdjmp,lblk-cmdjmp,drive-cmdjmp
	dc.w accu-cmdjmp,index-cmdjmp,auto-cmdjmp
	dc.w install-cmdjmp,info-cmdjmp,implode-cmdjmp,i-cmdjmp,p-cmdjmp
	dc.w gary-cmdjmp,g-cmdjmp,hunk-cmdjmp
	dc.w calc-cmdjmp,ramsey-cmdjmp,r-cmdjmp,rfpu-cmdjmp
	dc.w match-cmdjmp
	dc.w mmuon-cmdjmp,mmuoff-cmdjmp,rmmu-cmdjmp
	dc.w makedir-cmdjmp,megasum-cmdjmp,famisum-cmdjmp
	dc.w m-cmdjmp,mm-cmdjmp,a-cmdjmp,aa-cmdjmp,x-cmdjmp,xclr-cmdjmp
	dc.w ow-cmdjmp,ol-cmdjmp,ob-cmdjmp
	dc.w explode-cmdjmp,ew-cmdjmp,el-cmdjmp,eb-cmdjmp
	dc.w cd-cmdjmp,cls-cmdjmp,huntcop-cmdjmp
	dc.w config-cmdjmp,custom-cmdjmp,c-cmdjmp,format-cmdjmp
	dc.w fd-cmdjmp,fmode-cmdjmp,f-cmdjmp,frel-cmdjmp
	dc.w time-cmdjmp,type-cmdjmp,t-cmdjmp
	dc.w sysinfo-cmdjmp,copper-cmdjmp,copass-cmdjmp
	dc.w work-cmdjmp,dtsum-cmdjmp
	dc.w delete-cmdjmp,catalog-cmdjmp
	dc.w ds-cmdjmp,dm-cmdjmp,dv-cmdjmp,d-cmdjmp
	dc.w d6502-cmdjmp,n6502-cmdjmp,nass65-cmdjmp
	dc.w nopit-cmdjmp,n-cmdjmp,nass-cmdjmp,setkey-cmdjmp,color-cmdjmp
	dc.w btsum-cmdjmp,bisum-cmdjmp
	dc.w binw-cmdjmp,edbinw-cmdjmp,binl-cmdjmp,edbinl-cmdjmp
	dc.w bint-cmdjmp,edbint-cmdjmp
	dc.w binq-cmdjmp,edbinq-cmdjmp,binb-cmdjmp,edbinb-cmdjmp
	dc.w bpclr-cmdjmp,bpset-cmdjmp,bplist-cmdjmp,bpl-cmdjmp
	dc.w map-cmdjmp,print-cmdjmp,kisum-cmdjmp,setmap-cmdjmp
	dc.w spc-cmdjmp

x:	bra.w exit
save:	lea 2(a5),a0
	bsr.w getfilename	;a0:txt>a0:endname,a2:name,d4.w:len
	move.w d4,para+12-base(a6)
	beq.w svq
	cmp.w #30,d4
	bhi.w svq
	bsr.w skipspc
	bhi.w svq
	move.l a0,a3
	bsr.w atolong
	move.l d0,para-base(a6)
	move.l a3,a0
	bsr.w skipspc
	bhi.w svq
	move.l a0,a3
	bsr.w atolong
	move.l d0,para+4-base(a6)
	beq.w svq
	move.l para-base(a6),d1
	cmp.l d0,d1
	bhi.w svq
	move.l d1,para+8-base(a6)

	st wrcmd-base(a6)
	st wrflag-base(a6)

	bsr.w initdosdrive	;reads root/dir
	bne.w sv1

	move.l a2,a0
	bsr.w fnhash		;a0:str,d4.w:fnlen>d4.w:rootidx,d5:blk
	beq.b sv5		;hash entry zero?

	bsr.w searchfile	;d5:1st hash,a2:fname
				;>prevchain,a4:header
	beq.b sv5
	bsr.w fexists
	bra.w sv1
	
sv5:	tst.b dskerr-base(a6)
	bne.w sv1

	bsr.w cntfree
	beq.w savfull
	movem.l para-base(a6),d0-d1
	sub.l d0,d1
	beq.b sv19
	bsr maxfile
	cmp.l d0,d1
	bls.b sv19
	bsr notenou
	bra.w sv1

sv19:	bsr.w getfreehead	;fileheader
	beq.w savfull
	move.l d0,a3		;headerkey
	move.l d0,fheader-base(a6)
	clr.w datanum-base(a6)	;cnt datablk

	lea header-base(a6),a5
	move.l a5,a0
	moveq #512/4-1,d6
sv2:	clr.l (a0)+
	dbf d6,sv2

	lea $149(a5),a1		;bcpl filenote
	move.l a1,a0
	move.l para-base(a6),d0
	bsr.w longtoa_
	move.b #"-",(a0)+
	move.l para+4-base(a6),d0
	bsr.w longtoa_
	sub.l a1,a0
	move.w a0,d0
	move.b d0,-(a1)		;strlen
	
	bsr.w getclok
	move.l days-base(a6),$1a4(a5)
	move.l mins-base(a6),$1a8(a5)
	move.l ticks-base(a6),$1ac(a5)

	lea linebuf+1-base(a6),a0
	lea savetxt-base(a6),a1
	bsr.w txttobuf
	move.w para+12-base(a6),d0	;fnlen!
	subq.w #1,d0
	lea $1b1(a5),a1		;copy bcplname
sv4:	move.b (a2),(a1)+
	move.b (a2)+,(a0)+
	addq.b #1,$1b0(a5)
	dbf d0,sv4
	move.b #34,(a0)+
	bsr.w rawline
	bsr.w csdown
;;;
	move.l roothash-base(a6),a1
	clr.l linkkey-base(a6)
	move.l (a1),d5		;root entry free?
	beq.b fhroot
sortfh:	cmp.l fheader-base(a6),d5	;root entry higher?
	bhi.b fhroot
	move.l d5,linkkey-base(a6)
	lea rootblk-base(a6),a4
	move.l a4,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w sv1
	move.l $1f0(a4),d5	;hashchain
	bne.b sortfh
fhroot:	move.l d5,$1f0(a5)	;set hashchain
;;;
	move.l dirkey-base(a6),$1f4(a5)	;fileheader parent

	move.l para+4-base(a6),d0
	sub.l para-base(a6),d0
	move.l d0,$144(a5)	;filesize
	move.l d0,filesiz-base(a6)
	beq.b sv14		;empty file:no datablk

	bsr.w getfree
	beq.w savfull
	move.l d0,d4

;;;;;;;	take care of registers...
sv14:	moveq #2,d6
sv18:	move.l d6,(a5)		;primary type fheader
	moveq #-3,d6
	move.l d6,$1fc(a5)	;secondary type fileheader
	move.l a3,4(a5)		;own key

	lea $134+4(a5),a4	;1st data
	tst.l filesiz-base(a6)	;empty?
	move.l para+4-base(a6),a1	;set eof
	beq.w svempty

sv8:	move.l d4,-(a4)
	addq.l #1,8(a5)		;datas in this header (OFS)

	lea rootblk+512-base(a6),a0	;rootblk=datablkbuffer
	moveq #512/4-1,d6	
sv9:	clr.l -(a0)
	dbf d6,sv9

	move.l para+4-base(a6),d0
	sub.l para+8-base(a6),d0
	subq.l #1,d0
	divu datasiz-base(a6),d0
	tst.w d0		;another data?
	beq.b sv17
	
	bsr.w getfree
	beq.w savfull
	move.l d0,d4
	move.l d4,$10(a0)	;nextdata (OFS)	
	
sv17:	move.l para+8-base(a6),a1
	move.l a0,a2
	moveq #0,d0		;bytecnt
	tst.b ffs-base(a6)
	bne.b sv10
	lea $18(a0),a2		;OFS dataoffset
sv10:	cmp.l para+4-base(a6),a1
	bcc.b sv11
	move.b (a1)+,(a2)+
	addq.w #1,d0		;bytes inblk
	cmp.w datasiz-base(a6),d0	;has been cleared
	bne.b sv10

sv11:	move.l a1,para+8-base(a6)
	pea rootblk-base(a6)	;\
	move.l (a7)+,d6		;/
	move.l (a4),d5		;datakey !!
	tst.b ffs-base(a6)
	bne.b svffs

	move.l d0,12(a0)		;# databytes in this blk
	moveq #8,d0			;OFS!
	move.l d0,(a0)			;type
	addq.w #1,datanum-base(a6)
	move.w datanum-base(a6),8+2(a0)	;datanum
	move.l fheader-base(a6),4(a0)	;dataownkey=fileheader!
	bsr.w datasum
	move.l d3,20(a0)

svffs:	bsr.w putsec		;save data
	tst.b dskerr-base(a6)
	bne.w sv1

svempty:lea linebuf+1-base(a6),a0
	move.l para-base(a6),d0
	move.l para+8-base(a6),d1
	bsr.w csup
	bsr.w twolong_
	bsr.w rawline
	bsr.w stopit
	beq.w sv1

	cmp.l para+4-base(a6),a1	;next filelist or eof?
	beq.b sv15

	moveq #72,d6
	cmp.l 8(a5),d6		;(OFS)!
	bne.b sv12

	bsr.w getfree		;filelist between datablk
	beq.w savfull
	move.l d0,a3
	move.l d0,$1f8(a5)	;filelist

sv15:	move.l a5,a0
	move.l $134(a0),$10(a0)	;1st data
	bsr.w datasum
	move.l d3,20(a0)
	move.l 4(a0),d5
	move.l a0,d6
	bsr.w putsec		;save header
	tst.b dskerr-base(a6)
	bne.b sv1

	cmp.l para+4-base(a6),a1	;eof
	beq.b sv16

	moveq #512/4-1,d6
sv13:	clr.l (a0)+
	dbf d6,sv13
	move.l fheader-base(a6),$1f4(a5)
	moveq #$10,d6		;primary type:filelist
	bra.w sv18

sv12:	cmp.l para+4-base(a6),a1	;eof
	bcs.w sv8
	
sv16:	lea rootblk-base(a6),a2
	move.l a2,d6			;rootblk/dirblk
	lea rootblk+$1f0-base(a6),a2	;hashchain
	move.l linkkey-base(a6),d5
	bne.b sortfhd
	move.l roothash-base(a6),a2
	move.l dirkey-base(a6),d5
sortfhd:bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b sv1

	move.l fheader-base(a6),(a2)		;insert fileheader
	lea rootblk-base(a6),a0			;root/fheader chk
	bsr.w datasum
	move.l d3,20(a0)
	bsr.w putsec			;write root/fheader
	tst.b dskerr-base(a6)
	bne.b sv1

	bsr.w bitsum
	lea bitmap-base(a6),a0
	move.l a0,d6
	move.l bitsec-base(a6),d5
	bsr.w putsec
	tst.b dskerr-base(a6)
	bne.b sv1

	bsr.w updatedisk
sv1:	bsr.w motoff
	st d7
svq:	rts
savfull:bsr.w dskfull
	bra.b sv1

freeblk:cmp.l lastkey-base(a6),d0	;too much is too much...
	bhi.b freeb0
	lea bitmap-base(a6),a0
	subq.l #2,d0
	bmi.b freeb0
	move.l d0,d1
	lsr.w #5,d1
	add.w d1,d1
	add.w d1,d1		;lsl.w #2,d1	
	move.l 4(a0,d1.w),d2
	bset d0,d2
	bne.b freeb0
	move.l d2,4(a0,d1.w)
	moveq #-1,d0
	rts
freeb0:	moveq #0,d0
	rts

getfreehead:move.l rootkey-base(a6),d0	;collect the headers a bit..
	bsr.b getf2
	beq.b getfree
	rts
getfree:moveq #0,d0		;d0,d1,d2>d0
getf2:	move.l a0,-(a7)
	lea bitmap-base(a6),a0
getf1:	move.w d0,d1
	lsr.w #5,d1
	add.w d1,d1		;lsl.w #2,d1
	add.w d1,d1
	move.l 4(a0,d1.w),d2
	bclr d0,d2
	bne.b getf0
	addq.l #1,d0
	cmp.l lastkeym1-base(a6),d0
	bne.b getf1
	moveq #-2,d0
getf0:	move.l d2,4(a0,d1.w)
	move.l (a7)+,a0
	addq.l #2,d0		;beq.b nofree
	rts

bitsum:	lea bitmap-base(a6),a0		;a0:bitmap
bitsum2:lea 4(a0),a1
	moveq #0,d1
	moveq #512/4-1-1,d0
bms0:	sub.l (a1)+,d1
	dbf d0,bms0
	move.l d1,(a0)
	rts

getfilename:
	clr.w d4
	bsr.b skipspc
	bhi.b fnquo2
	move.l a0,a2
	cmp.b #34,(a0)
	bne.b fnquo0
	clr.w d4
	addq.w #1,a2
	addq.w #1,a0
fnquo1:	cmp.b #34,(a0)+
	beq.b fnquo2
	addq.w #1,d4
	bra.b fnquo1
fnquo0:	bsr.b findspc
	bhi.b fnquo2
	move.l a0,d4
	sub.l a2,d4	;fnlen
fnquo2:	tst.w d4
	rts
skipspc:cmp.b #" ",(a0)
	bne.b fnspc0
	addq.w #1,a0
	bra.b skipspc
findspc:cmp.b #" ",(a0)
	beq.b fnspc0
	addq.w #1,a0
	bra.b findspc
fnspc0:	cmp.l lineend-base(a6),a0	;bhi.b eol
	rts

type:	st typeflg-base(a6)
	lea 5(a5),a0		;type a file
	bra.b dotype
load:	sf typeflg-base(a6)
	lea 2(a5),a0		;load a file, usual stuff...
dotype:	bsr.b getfilename	;a0:txt>a0:endname,a2:name,d4.w:len
	move.w d4,para+12-base(a6)
	beq.w ldq
	cmp.w #30,d4
	bhi.w ldq

	moveq #1,d0		;dummy destadr
	tst.b typeflg-base(a6)
	bne.b dotype0

	bsr.b skipspc
	bhi.w ldq
	move.l a0,a3
	bsr.w atolong
dotype0:move.l d0,para-base(a6)
	move.l d0,para+4-base(a6)
	beq.w ldq

	sf wrcmd-base(a6)
	sf wrflag-base(a6)
	bsr.w initdosdrive	;reads root/dir
	bne.w ld1

	move.l a2,a0
	bsr.w fnhash	;a0:str,d4.w:fnlen>d4.w:rootidx,d5:blk
	beq.b ld5	;hash entry zero?

	bsr.w searchfile	;d5:1st hash,a2:fname
				;>prevchain,a4:header
	bne.b ld3

ld5:	bsr.w fnotfnd
	bra.w ld1

ld3:	tst.b dskerr-base(a6)
	bne.w ld1

	move.l $1fc(a4),d0
	subq.l #2,d0		;2:dir
	beq.b ld12
	subq.l #2,d0		;4:linked dir
	beq.b ld12
	addq.l #7,d0		;-3:file
	beq.b ld2
	addq.l #1,d0		;-4:linked file
	bne.w ld1		;illegal type	
	move a4,d6		;header
	move.l $1d4(a4),d5	;hardlink
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w ld1
	bra.b ld2

ld12:	bsr.w fisdir
	bra.w ld1

ld2:	lea linebuf+1-base(a6),a0
	lea typetxt-base(a6),a1
	tst.b typeflg-base(a6)
	bne.b dotype3
	lea loadtxt-base(a6),a1
dotype3:bsr.w txttobuf
	move.w para+12-base(a6),d0		;fnlen!
	subq.w #1,d0
	move.l a2,a1
ld4:	move.b (a1)+,(a0)+
	dbf d0,ld4
	move.b #34,(a0)+
	bsr.w rawline
	bsr.w csdown

	move.l $144(a4),filesiz-base(a6)

ld6:	moveq #72,d3		;max #datablk in header
	lea $134+4(a4),a3	;blkmap

ld8:	tst.b typeflg-base(a6)
	bne.b dotype1
	lea linebuf+1-base(a6),a0
	move.l para-base(a6),d0
	move.l para+4-base(a6),d1
	bsr.w twolong_
	bsr.w csup
	bsr.w rawline

dotype1:bsr.w stopit
	beq.w ld1

	subq.l #1,d3
	bmi.w ld7
	move.l -(a3),d5
	lea rootblk-base(a6),a0
	move.l a0,d6		;databuf

	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w ld1
	
	move.l filesiz-base(a6),d0	;filesize
	beq.w ld1		;empty file
	sub.l para+4-base(a6),d0	;\
	add.l para-base(a6),d0		;/loaded bytes
	beq.w ld1

	subq.l #1,d0
	divu datasiz-base(a6),d0
	tst.w d0
	bne.b ldblk
	swap d0
	addq.w #1,d0
	bra.b ldrest
ldblk:	move.w datasiz-base(a6),d0
ldrest:
	
	tst.b ffs-base(a6)
	bne.b ldffs
	lea $18(a0),a0		;datastart
ldffs:	tst.b typeflg-base(a6)
	beq.b doload

	ext.l d0
	add.l d0,para+4-base(a6)
	move.l d0,d1
ldtype0:subq.w #1,d1
	bmi.b ldtype1

	bsr.w stopit
	beq.b ld1
	cmp.b #xchars,col-base(a6)
	bne.b ldtype5
	addq.w #1,d1
	bra.b ldtype4
ldtype5:move.b (a0)+,d0
	cmp.b #LF,d0
	bne.b ldtype2
ldtype4:sf col-base(a6)
	bsr csdown
	bra.b ldtype3
ldtype2:bsr.w rawchr
ldtype3:bra.b ldtype0
ldtype1:
	bra.w ld8

doload:	move.l para+4-base(a6),a1
ld10:	subq.w #1,d0
	bmi.b ld11
	move.b (a0)+,(a1)+
	bra.b ld10
ld11:	move.l a1,para+4-base(a6)
	bra.w ld8

ld7:	move.l $1f8(a4),d5	;file extension
	beq.b ld1
	move.l a4,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b ld1
	bra.w ld6

ld1:	tst.b typeflg-base(a6)
	beq.b dotype2
	sf col-base(a6)
	bsr csdown
dotype2:bsr.w motoff
	st d7
ldq:	rts

searchfile:			;d5:1st hash,a2:fname
	lea header-base(a6),a4	;>prevchain,a4:header
	move.l a4,d6
	clr.l prevchain-base(a6)	;rootchain!
srfile2:bsr.w getsec
	tst.b dskerr-base(a6)		;!!
	bne.b srerr
	lea $1b0(a4),a0		;filename
	move.b (a0)+,d0
	move.l a2,a1
srfile0:subq.b #1,d0
	bmi.b srfile1
	move.b (a0)+,d2
	bsr.w upcase
	move.b d2,d3
	move.b (a1)+,d2
	bsr.w upcase
	cmp.b d2,d3
	beq.b srfile0
	move.l 4(a4),prevchain-base(a6)		;prevchain
	move.l $1f0(a4),d5
	bne.b srfile2
srerr:	moveq #0,d0		;beq.b notfnd
	rts
srfile1:moveq #-1,d0
	rts

bmaperr:lea bittxt-base(a6),a1	;the errors are cummin'
	bra.b fnf0
notenou:lea nenotxt-base(a6),a1
	bra.b fnf0
dskfull:lea dskftxt-base(a6),a1
	bra.b fnf0
dnotmt:	lea dnmtxt-base(a6),a1
	bra.b fnf0
dexists:lea dextxt-base(a6),a1
	bra.b fnf0
disfile:lea diftxt-base(a6),a1
	bra.b fnf0
dnotfnd:lea dnftxt-base(a6),a1
	bra.b fnf0
fexists:lea fextxt-base(a6),a1
	bra.b fnf0
fisdir:	lea fidtxt-base(a6),a1
	bra.b fnf0
fnotfnd:lea fnftxt-base(a6),a1
fnf0:
msgout:	lea linebuf+1-base(a6),a0	;a1:txt->a0:linebuf
	bsr.w txttobuf
	bra.w rawline

fnhash:	move.l d4,d0
	clr.w d2
	subq.w #1,d0
fn1:	mulu #13,d4
	move.b (a0)+,d2
	bsr.b hashcnv
	add.w d2,d4
	and.w #$7ff,d4
	dbf d0,fn1
	divu #72,d4
	swap d4
	addq.w #6,d4
	add.w d4,d4		;lsl.w #2,d4
	add.w d4,d4
	lea rootblk-base(a6),a0
	lea (a0,d4.w),a0
	move.l a0,roothash-base(a6)
	move.l (a0),d5
	rts
hashcnv:tst.b int-base(a6)
	beq.b upcase
	cmp.b #$f7,d2		;international filenames
	beq.b hashcv0
	movem.l d0/d1,-(a7)
	move.b d2,d0
	move.l #"~`za",d1	;$7e607a61
	bclr #7,d2
	beq.b hashcv1
	swap d1
hashcv1:cmp.b d1,d2
	blt.b hashcv2
	lsr.l #8,d1
	cmp.b d1,d2
	bgt.b hashcv2
	bclr #5,d0
hashcv2:move.b d0,d2
	movem.l	(a7)+,d0/d1
hashcv0:rts
upcase:	cmp.b #"a",d2
	bcs.b upcas0
	cmp.b #"z",d2
	bhi.b upcas0
	bclr #5,d2
upcas0:	rts

syncw:	cmp.b #1,d3		;yo, we have a new syncword
	bhi.b syq
	tst.b d3
	beq.b sy0
	move.w para+2-base(a6),sync-base(a6)
sy0:	lea linebuf+1-base(a6),a0
	lea synctxt(pc),a1
	bsr.w txttobuf
	move.w sync-base(a6),d0
	move.w d0,d4
	bsr.w wordtoa_

	moveq #15-1,d0
	moveq #%11,d2
	bra.b sy5
sy6:	add.w d2,d2
sy5:	move.w d4,d1
	not.w d1
	and.w d2,d1
	dbeq d0,sy6
	beq.b sy3	;%11 invalid

	moveq #13-1,d0
	moveq #%1111,d2
	bra.b sy7
sy8:	add.w d2,d2
sy7:	move.w d4,d1
	and.w d2,d1
	dbeq d0,sy8
	beq.b sy3	;%0000 invalid

	moveq #14-1,d0
	moveq #%111,d2		;a valid sync?
	bra.b sy4
sy1:	add.w d2,d2
sy4:	move.w d4,d1
	and.w d2,d1
	dbeq d0,sy1
	beq.b sy2	;%000 suitable

sy3:	lea invltxt(pc),a1
	bsr.w txttobuf

sy2:	bsr.w rawline

	st d7
syq:	rts

srcsync:moveq #0,d5		;default trk0
	subq.b #1,d3		;vc
	bmi.b sync11
	bhi.w syq
	move.l para-base(a6),d5
	cmp.l #82*2-1,d5
	bhi.w syq
sync11:
	bsr.w motondt		;stays selected
	bsr.w stepup
	bsr.w stepdwn
	sf dskerr-base(a6)
	bsr.w trk0
	tst.b dskerr-base(a6)
	bne.w sync7
	sf wrflag-base(a6)
	bsr.w testindrive	;wrflag?
	bne.w sync7

	move.l d5,d1
	bsr.w dotrk

	move.l dskadr-base(a6),a3
	moveq #-1,d0
	move.w readlen-base(a6),d1
	lsr.w #1,d1
	bra.b sync2
sync8:	move.l d0,(a3)+
sync2:	dbf d1,sync8

	bsr.w readmfmindex

	moveq #16-1,d5
rotloop:
	move.l dskadr-base(a6),a3
	move.w readlen-base(a6),d0
	add.w d0,d0
	lea (a3,d0.w),a4 		;dmaend

	lea linebuf-base(a6),a0
	move.b #"-",(a0)+

sync1:	cmp.l a4,a3
	bcc.b sync4
	cmp.w #$aaaa,(a3)+		;find $aaaa
	bne.b sync1

sync5:	cmp.w #$aaaa,(a3)		;skip $aaaa
	bne.w sync3
	addq.w #2,a3
	bra.b sync5

sync3:	move.w (a3)+,d3
	
	moveq #%111,d2
	moveq #7-1,d1
syncmsk:move.w d3,d0
	and.w d2,d0
	beq.b issync1
	add.w d2,d2
	add.w d2,d2
	dbf d1,syncmsk
	bra.b sync1

issync1:tst.w d1		;last mask?
	beq.b issync
issync0:add.w d2,d2
	add.w d2,d2
	move.w d3,d0		;more than 1 sync pattern?
	and.w d2,d0
	beq.b sync1		;skip
	dbf d1,issync0

issync:	cmp.l a4,a3
	bhi.b sync4

	lea linebuf+xchars-6-base(a6),a1
	cmp.l a1,a0		;too many 'syncs' = trash
	bhi.b sync9
	
	move.w d3,d0
	bsr.w wordtoa
	addq.w #1,a0
	bra.b sync1

sync4:	lea linebuf+1-base(a6),a1
	cmp.l a1,a0
	beq.b sync6
	bsr.w rawline

sync9:	lea linebuf-base(a6),a0
	move.b #"-",(a0)+

sync6:	move.l dskadr-base(a6),a3
	move.w readlen-base(a6),d0
	move.w -2(a4),d1
	lsr.w #1,d1
	bra.w sync0
rotate:	roxr.w (a3)+
sync0:	dbf d0,rotate 
	dbf d5,rotloop

sync7:	bsr.w motoff
	bsr.b clrlbuf
	st d7
	rts

clrlbuf:lea linebuf-base(a6),a0
	moveq #xchars-1,d0
clrlb0:	move.b #" ",(a0)+
	dbf d0,clrlb0
	rts

megasum:subq.l #1,d3
	bne.b megaq
	move.l para-base(a6),d4
	btst #0,d4
	bne.b megaq	
	move.l d4,a0
	move.l $1a4(a0),d1	;endaddress
	cmp.l #$1fffff,d1	;max 16Mbit
	bhi.b nomod
	addq.l #1,d1
	move.l d1,d0
	and.w #$1fff,d0		;min 8kb
	bne.b nomod
	sub.l #$200,d1
	moveq #0,d3
	lea $200(a0),a1	
megchk:	add.w (a1)+,d3
	subq.l #2,d1	
	bne.b megchk
	move.w $18e(a0),d2
	move.w d3,$18e(a0)
	
	lea linebuf+1-base(a6),a0
	lea chktxt1(pc),a1
	bsr.w txttobuf
	move.w d2,d0
	bsr.w wordtoa_
	lea chktxt2(pc),a1
	bsr.w txttobuf
	move.w d3,d0
	bsr.w wordtoa_
	bsr.w rawline
nomgd:	st d7
megaq:	rts
nomod:	lea nmgdtxt(pc),a1
	bsr.w msgout
	bra.b nomgd

famiq:	rts	
famisum:subq.l #1,d3
	bne.b famiq
	move.l para-base(a6),d0
	btst #0,d0
	bne.b famiq
	move.l d0,a2
	cmp.w #$aabb,8(a2)	;header?
	bne.b nohead
	lea $200(a2),a2		;skip header
nohead:	lea linebuf+1-base(a6),a0
	lea nametxt(pc),a1
	bsr.w txttobuf
	lea $7fc0(a2),a3
	moveq #22-1,d0
famitit:move.b (a3)+,(a0)+
	dbf d0,famitit
	addq.w #1,a0
	move.b (a3)+,d5		;$7fc0+22=$7fd6
	moveq #0,d1
	move.b (a3)+,d1		;$7fd7 romsize
	moveq #10,d0
	add.b d1,d0
	moveq #0,d4
	bset d0,d4		;romlen
	moveq #0,d0
	bset d1,d0
	bsr.w hextod
	lea mromtxt(pc),a1
	bsr.w txttobuf
	move.b (a3)+,d1		;$7fd8 ramsize
	subq.b #1,d5		;type
	bmi.b faminf1
	lea mramtxt(pc),a1
	beq.b faminf2
	lea backtxt(pc),a1
faminf2:moveq #0,d0
	bset d1,d0	
	bsr.w hextod
	move.b #"K",(a0)+
	move.b #"B",(a0)+
	bsr.w txttobuf
faminf1:lea manutxt(pc),a1
	bsr.w txttobuf
	move.b (a3)+,d0		;$7fd9
	lsl.w #8,d0
	move.b (a3)+,d0		;$7fda
	bsr.w wordtoa_
	bsr.w txttobuf
	move.b (a3)+,d0		;$7fdb
	bsr.w bytetoa_
	bsr.w rawline

	move.l (a3),d2		;$7fdc checksum
	clr.l (a3)
	not.w (a3)

	moveq #0,d0
	moveq #0,d1
	move.l a2,a0
famis1:	add.b (a0)+,d0
	bcc.b famis0
	addq.b #1,d1
famis0:	subq.l #1,d4
	bne.b famis1
	lsl.w #8,d0
	move.b d1,d0
	move.w d0,d3
	not.w d3
	swap d3
	move.w d0,d3
	move.l d3,(a3)
	bra.b sumout

btsum:	lea bootsub(pc),a2
	bra.b check
dtsum:	lea datasub(pc),a2
	bra.b check
bisum:	lea bitsub(pc),a2
	bra.b check
kisum:	lea kicksub(pc),a2
check:	subq.l #1,d3		;lets calc some checksums
	bne.b chkq
	move.l para-base(a6),d4
	btst #0,d4
	bne.b chkq
	move.l d4,a0
	jsr (a2)

sumout:	lea linebuf+1-base(a6),a0
	lea chktxt1(pc),a1
	bsr.w txttobuf
	move.l d2,d0
	bsr.w longtoa_
	lea chktxt2(pc),a1
	bsr.w txttobuf
	move.l d3,d0
	bsr.w longtoa_
chk2:	bsr.w rawline

	st d7
chkq:	rts

bootsub:bsr.b bootsum		;d2:old,d3:new
	move.l d3,4(a0)
	rts
datasub:bsr.w datasum
	move.l d3,20(a0)	;d2:old,d3:new
	rts
bitsub:	move.l (a0),d2		;old
	bsr.w bitsum2		;2!  d1:new
	move.l d1,d3
	rts

kicksub:moveq #-6,d0
	and.w (a0),d0
	cmp.w #$1110,d0		;$1111,$1114
	bne.b kicks1
	moveq #4,d3
	swap d3
	cmp.l -20(a0,d3.l),d3
	beq.b kicks0
	add.l d3,d3
	cmp.l -20(a0,d3.l),d3
	beq.b kicks0
kicks1:	st d7
	addq.w #4,a7
	lea nkicktx(pc),a1
	bra.w msgout
kicks0:	move.l -24(a0,d3.l),d2
	moveq #24,d0
	moveq #0,d5	
kicks2:	cmp.l d0,d3
	beq.b kicks3
	sub.l (a0),d5
	bcc.b kicks3
	subq.l #1,d5
kicks3:	addq.w #4,a0
	subq.l #4,d3
	bne.b kicks2
	move.l d5,d3
	cmp.l -24(a0),d3	;not changed
	beq.b kicks4
	move.l d3,-24(a0)	;d2:old,d3:new
kicks4:	rts

bootsum:move.l a0,-(a7)
	move.l (a0)+,d3
	move.l (a0),d2
	clr.l (a0)+
	move.w #$ff-2,d1
boots0:	add.l (a0)+,d3
	bcc.b boots1
	addq.l #1,d3
boots1:	dbf d1,boots0
	not.l d3
	move.l (a7)+,a0
	rts

sblk:	st wrcmd-base(a6)	; we want to load/save tracks
	bra.b rds6
lblk:	sf wrcmd-base(a6)
rds6:	cmp.b #1,d3
	bls.w rdsq
	cmp.b #3,d3
	bhi.w rdsq
	move.l para-base(a6),d6	;loadadr
	btst #0,d6
	bne.w rdsq

	move.l para+4-base(a6),d5
	moveq #1,d4
	cmp.b #3,d3
	bne.b rds0
	move.l para+8-base(a6),d4
rds0:	move.w cylsec-base(a6),d0	;22/44
	cmp.b #"s",(a0)		;para=sectors?
	beq.b rds9
	mulu d0,d4	;numcyl
	mulu d0,d5	;1st cyl
rds9:	moveq #83,d3
	mulu d0,d3
	cmp.l d3,d5
	bcc.b rdsq

	add.l d5,d4
	cmp.l d3,d4
	bls.b rds1
	move.l d3,d4
rds1:
	bsr.w motondt	;stays selected
	bsr.w stepup
	bsr.w stepdwn
	sf dskerr-base(a6)
	bsr.w trk0
	tst.b dskerr-base(a6)
	bne.b rds7
	sf truebuf-base(a6)
	clr.l secinbuf-base(a6)
	move.b wrcmd-base(a6),wrflag-base(a6)
	bsr.w testindrive
	bne.b rds7

rds3:	cmp.l d5,d4
	bls.b rds2

	tst.b wrcmd-base(a6)
	bne.b rds4
	bsr.w getsec	;d5.l:blk,d6:adr ;del:d0,d1,a1;dskerr
	bra.b rds5
rds4:	bsr.w putsec		;d5.l:blk,d6:adr

rds5:
	tst.b dskerr-base(a6)
	bne.b rds7

	move.l d6,d0		;loadadr
	bsr.b thsinfo

	lea $200.w,a0
	add.l a0,d6
	addq.l #1,d5

	bsr.w stopit
	bne.b rds3

rds2:	bsr.w updatedisk
rds7:	bsr.w motoff		;deselect
	st d7
rdsq:	rts

thsinfo:move.l d0,d1
	lea $200.w,a0
	add.l a0,d1
	lea linebuf+1-base(a6),a0
	bsr.w twolong_
	bsr.b thsbuf
	lea blktxt(pc),a1
	bsr.w txttobuf
	move.w d5,d0
	bsr.w wordtoa_
	move.b #"=",(a0)+
	bsr.w wordtod
	bra.w rawline

thsbuf:	lea trktxt(pc),a1
	bsr.w txttobuf
	move.b trk-base(a6),d0
	lsr.b #1,d0
	bsr.w bytetod
	lea hedtxt-base(a6),a1
	bsr.w txttobuf
	move.b trk-base(a6),d0
	and.b #1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	lea sectxt(pc),a1
	bsr.w txttobuf
	move.b sec-base(a6),d0
	bra.w bytetod

calcts:	move.l d5,d0
	divu trksec-base(a6),d0	;11/22
	move.b d0,d1		;trk
	cmp.b trk-base(a6),d1
	beq.b cal1
	sf truebuf-base(a6)
cal1:	swap d0
	move.b d0,sec-base(a6)
	rts

testindrive:
	btst #2,$bfe001
	bne.b tid0
	lea nodisk(pc),a1
tid2:	lea linebuf-base(a6),a0
	bsr.w drvnum
	bsr.w txttobuf
	bsr.w rawline
	moveq #-1,d0
	rts		;bne.b error
tid0:	tst.b wrflag-base(a6)
	beq.b tid1
	lea wrdisk(pc),a1
	btst #3,$bfe001
	beq.b tid2
tid1:	moveq #0,d0
	rts		;bne.b error

testdosdsk:
	lea rootblk-base(a6),a0
	move.l a0,d6
	moveq #0,d5		;bootblock
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b tdd3

	move.l rootblk-base(a6),d0
	move.w #488,d5
	bclr #0,d0
	sne ffs-base(a6)	;FFS
	beq.b tdd5
	move.w #512,d5
tdd5:	bclr #1,d0
	sne int-base(a6)	;"DOS",2|"DOS",3
	cmp.l dosofs-base(a6),d0
	beq.b tdd0

nodos:	lea ndostxt(pc),a1
nodos2:	lea linebuf-base(a6),a0
	bsr.w drvnum
	bsr.w txttobuf
	bsr.w rawline
tdd3:	moveq #-1,d0		;bne.b error
	rts

tdd0:	move.w d5,datasiz-base(a6)
	move.l rootkey-base(a6),d5
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b tdd3
	move.b rootblk+$138+3-base(a6),valflag-base(a6)	;save bitmapflag

	move.l d6,a0
	bsr.b datasum		;d2:old,d3:new
	cmp.l d3,d2
	lea chktxt(pc),a1
	bne nodos2
	cmp.l lastchk-base(a6),d2
	beq.b tdd4
	move.l d2,lastchk-base(a6)
	move.l rootkey-base(a6),dirkey-base(a6)	;rootdir on diskchange
tdd4:	tst.b wrcmd-base(a6)
	beq.b tdd1
	tst.l $138(a0)
	lea dskvtxt(pc),a1
	beq.b nodos2
tdd1:	move.l $13c(a0),d5	;read bitmap blk
	move.l d5,bitsec-base(a6)
	lea bitmap-base(a6),a1
	move.l a1,d6
	bsr.w getsec 	
	tst.b dskerr-base(a6)
	bne.b tdd3
	moveq #0,d0	;bne.b error
	rts		

datasum:move.l a0,-(a7)
	moveq #512/4-1,d1
	move.l 20(a0),d2
	clr.l 20(a0)
	moveq #0,d3
datsum0:sub.l (a0)+,d3
	dbf d1,datsum0
	move.l (a7)+,a0
	rts
	
putsec:	movem.l d0-d7/a0-a6,-(a7)	;puts sectors into buffer
	sf dskerr-base(a6)
	st wrflag-base(a6)

	move.l d5,d0		;blk
	divu trksec-base(a6),d0	;11/22
	cmp.b trk-base(a6),d0	;do we change tracks?
	beq.b puts1
	
	tst.l secinbuf-base(a6)
	beq.b puts1		;nutin' to write
	bsr.w updatedisk	;sets dskerr
	clr.l secinbuf-base(a6)

puts1:	move.l d6,a0
	move.l d5,d4
	divu trksec-base(a6),d4	;11/22
	swap d4
	move.l secinbuf-base(a6),d0
	bset d4,d0
	move.l d0,secinbuf-base(a6)
	move.w #$200,d0
	mulu d4,d0
	lea dostrkbuf-base(a6),a1
	add.l d0,a1
	moveq #512/4-1,d0
puts5:	move.l (a0)+,(a1)+
	dbf d0,puts5
puts4:	bsr.w calcts		;d5
	bsr.w dotrk
	movem.l (a7)+,d0-d7/a0-a6
	rts

updatedisk:movem.l d0-d7/a0-a6,-(a7)
	st wrflag-base(a6)
	sf truebuf-base(a6)
	sf dskerr-base(a6)

	tst.l secinbuf-base(a6)	;reads in missing sectors and writes
	beq.b updat3

	lea dostrkbuf-base(a6),a1
	move.l a1,d6
	moveq #0,d5
	move.b trk-base(a6),d5
	mulu trksec-base(a6),d5	;11/22
	moveq #0,d4
updat0:	bsr.w calcts		;d5.l>d1.b=trk;del:d0
	bsr.w dotrk		;del:a1,d1,d0
	tst.b dskerr-base(a6)	;removed?
	bne.b updat3
	move.l secinbuf-base(a6),d0
	btst d4,d0
	bne.b updat2

	bsr.w readsec		;d6:adr
	tst.b dskerr-base(a6)
	bne.b updat3

updat2:	addq.l #1,d5
	lea $200.w,a1
	add.l a1,d6
	addq.w #1,d4
	cmp.w trksec-base(a6),d4	;11/22
	bne.b updat0

	bsr writeit	;sets dskerr
	bsr.w stepdel	;wait >2.0 ms before sel/step/...
updat3:	movem.l (a7)+,d0-d7/a0-a6
	rts

getsec:	tst.l secinbuf-base(a6)	;get a sector (and write buffer)
	beq.b gets1
	bsr.w updatedisk
	clr.l secinbuf-base(a6)
gets1:	sf wrflag-base(a6)
	bsr.w calcts		;d5.l>d1.b=trk;del:d0
	bsr.w dotrk		;del:a1,d1,d0
	tst.b dskerr-base(a6)
	beq.b readsec		;d6:adr
	rts

cmpsec:	movem.l d0-d7/a0-a3,-(a7)
	moveq #1,d5		;$80000000:1 try
	ror.l #1,d5
	bra.b cmps0

readsec:cmp.b #30,dskerr-base(a6)
	bne.b iscall
	movem.l d0-d3/a1,-(a7)
	move.b trk-base(a6),d3
	sf dskerr-base(a6)
	bsr trk0		;recal
;	tst.b dskerr-base(a6)
;	bne.b rsnocal		;keep cyl unchanged
	move.b d3,d1
	bsr dotrk
	movem.l (a7)+,d0-d3/a1
iscall:	bsr rdsec
	tst.b dskerr-base(a6)
	beq.b rdsnerr
	movem.l d0/a0-a1,-(a7)
	lea rerrtxt-base(a6),a1
	lea linebuf+1-base(a6),a0
	bsr txttobuf
	move.b dskerr-base(a6),d0
	bsr.w bytetod
	move.b #")",(a0)+
	bsr thsbuf	
	addq.w #8,a0
	lea retrytx(pc),a1
	bsr txttobuf
	bsr rawline
	movem.l (a7)+,d0/a0-a1

	bsr mstest
	beq.b readsec	;retry
	bpl.b rdsnerr	;abort
;	bmi.b rdsigno	;ignore
rdsigno:sf dskerr-base(a6)
rdsnerr:rts
rdsec:	movem.l d0-d7/a0-a3,-(a7)
	moveq #retry,d5
cmps0:	move.l mask55-base(a6),d7
rsec7:	tst.b truebuf-base(a6)
	bne.b rsec1
	bsr.w readmfm		;del:d0,a2
	tst.b truebuf-base(a6)
	beq.w rsec0
rsec1:	move.l dskadr-base(a6),a2
	move.w readlen-base(a6),a3
	add.w a3,a3
	add.l a2,a3
	move.w trksecm1-base(a6),d2	;#10/21
rsec2:	move.w sync-base(a6),d0
	cmp.l a3,a2
	bhi.w rsec8		;no sync found
	cmp.w (a2)+,d0
	bne.b rsec2
	cmp.w (a2),d0
	beq.b rsec2
	bsr.w getlong
	move.l d0,d1
	move.l d0,d4		;save for chksum
	rol.l #8,d1
	not.b d1
	beq.b rsfbok
	sf truebuf-base(a6)
	move.b #23,dskerr-base(a6)	;(BadSecID)
rsfbok:	rol.l #8,d1
	cmp.b trk-base(a6),d1
	beq.b rstrkok
	sf truebuf-base(a6)
	move.b #30,dskerr-base(a6)	;(SeekError)
rstrkok:
	lsr.w #8,d0
			;cmp.b #10,d0,bhi.b >11 sec
	cmp.b sec-base(a6),d0
	beq.b rsec4
	lea $43c-8(a2),a2	;skip blk
	bra.b rsec5
rsec4:	subq.w #8,a2		;format,trk,sec,secgap
	moveq #0,d4
	moveq #10-1,d3
rslabel:move.l (a2)+,d0		;header chk
	and.l d7,d0
	eor.l d0,d4
	dbf d3,rslabel
	bsr.b getlong
	cmp.l d0,d4	
	beq.b rshead
	sf truebuf-base(a6)
	move.b #24,dskerr-base(a6) ;(BadHdrSum)
rshead:	bsr.b getlong		;data chk
	move.l d0,-(a7)

	move.l d6,a0
	moveq #128-1,d3
	moveq #0,d4
	lea 512(a2),a1
	tst.l d5
	bpl.b rsec3

	tst.l (a7)+
cmps3:	move.l (a1)+,d1
	eor.l d1,d4
	and.l d7,d1
	move.l (a2)+,d0
	eor.l d0,d4
	and.l d7,d0
	add.l d0,d0
	or.l d1,d0
	cmp.l (a0)+,d0
	dbne d3,cmps3
	beq.b rsec0
	move.b #20,dskerr-base(a6)	;verify error (NotSpecified)
	bra.b rsec6

rsec3:	move.l (a1)+,d1
	eor.l d1,d4
	and.l d7,d1
	move.l (a2)+,d0
	eor.l d0,d4
	and.l d7,d0
	add.l d0,d0
	or.l d1,d0
	move.l d0,(a0)+	
	dbf d3,rsec3
	and.l d7,d4
	cmp.l (a7)+,d4		;chk
	beq.b rsec0
	move.b #25,dskerr-base(a6)	;data chksum wrong (BadSecSum)
	bra.b rsec6
rsec5:	dbf d2,rsec2
rsec8:	move.b #21,dskerr-base(a6)	;no sync found (NoSecHdr)
rsec6:	sf truebuf-base(a6)
	dbf d5,rsec7

rsec0:	movem.l (a7)+,d0-d7/a0-a3
	rts

getlong:movem.l (a2)+,d0-d1
	and.l d7,d0		;convert some gore
	add.l d0,d0
	and.l d7,d1
	or.l d1,d0
	rts

codemfm:movem.l d0-d7/a0-a4,-(a7)	;haha, this builds mfmbuffer
	move.l dskadr-base(a6),a1
	move.w #$440,d0
	mulu trksec-base(a6),d0	;11/22
	addq.w #4,d0
	neg.w d0
	add.w readlen-base(a6),d0
	add.w readlen-base(a6),d0
	lsr.w #2,d0
	move.l maskaa-base(a6),d1
	bra.b mfmlp3
mfmlp2:	move.l d1,(a1)+
mfmlp3:	dbf d0,mfmlp2
	clr.b d1		;startsecnum
	move.w trksecm1-base(a6),d3	;10/21
	move.w trksec-base(a6),d2	;sec till gap 11/22
mfmlp1:	move.l maskaa-base(a6),(a1)+
	move.w sync-base(a6),(a1)+
	move.w sync-base(a6),(a1)+
;	st d7			;format byte
;	lsl.w #8,d7
	moveq #$ffffffff,d7	;format byte
	move.b trk-base(a6),d7	;track 0-159
	lsl.l #8,d7
	move.b d1,d7		;secnum	
	lsl.l #8,d7
	move.b d2,d7		;sec till gap
	move.l a1,a2
	bsr.b makelong
	move.l d6,(a1)+
	move.l d7,(a1)+
	moveq #1,d5
	bsr.w setclock		;we DO need clockbits...
	eor.l d6,d7
	move.l a1,a2
	clr.l (a1)+
	clr.l (a1)+
	clr.l (a1)+
	clr.l (a1)+
	clr.l (a1)+
	clr.l (a1)+
	clr.l (a1)+
	clr.l (a1)+
	bsr.b makelong
	move.l d6,(a1)+		;headerchk
	move.l d7,(a1)+
	moveq #5,d5
	bsr.b setclock
	move.l a1,a3
	addq.w #8,a1		;skip datachk
	move.l a1,a4

	lea 512(a1),a2
	move.l mask55-base(a6),d0
	moveq #512/4-1,d5
	moveq #0,d4
mfmlp0:	move.l (a0)+,d7		;get data
	move.l d7,d6
	and.l d0,d7
	move.l d7,(a2)+
	eor.l d7,d4
	lsr.l #1,d6
	and.l d0,d6
	move.l d6,(a1)+
	eor.l d6,d4		;build chksum
	dbf d5,mfmlp0
	move.l d4,d7
	bsr.w makelong
	move.l a3,a2
	move.l d6,(a3)+		;write datachk
	move.l d7,(a3)
	moveq #1,d5
	bsr.b setclock
	move.l a4,a2
	move.w #512/4,d5
	bsr.b setclock
	addq.b #1,d1
	subq.b #1,d2
	lea $200(a1),a1
	dbf d3,mfmlp1
	move.l maskaa-base(a6),(a1)	;famous last words
	movem.l (a7)+,d0-d7/a0-a4
	rts
makelong:move.l d7,d6
	lsr.l #1,d6
	and.l mask55-base(a6),d6
	and.l mask55-base(a6),d7
	rts
setclock:movem.l d0-d6/a2,-(a7)	;well this is quite nasty down here
	add.w d5,d5
	subq.w #1,d5
	move.l mask55-base(a6),d6
	move.b -1(a2),d0
setclk0:move.l (a2),d4
	move.l d4,d1
	move.l d4,d2
	not.l d1
	and.l d6,d1
	add.l d1,d1		;asl.l #1,d1
	move.l d1,d3
	roxr.b #1,d0
	roxr.l #1,d4		;you know what I do?
	eor.l d4,d1
	and.l d3,d1
	or.l d1,d2
	move.l d2,(a2)+
	move.b d2,d0
	dbf d5,setclk0
	movem.l (a7)+,d0-d6/a2
	rts

writeit:movem.l d6/a0/a1,-(a7)
write1:	lea dostrkbuf-base(a6),a0
	bsr codemfm
	bsr writemfm
	tst.b dskerr-base(a6)
	bne.b write0

	btst #4,langflg-base(a6)	;verify?
	bne.b write0			;no

	sf truebuf-base(a6)
	move.w trksecm1-base(a6),d1
wmf1:	move.b d1,sec-base(a6)
	move.w #$200,d6
	mulu d1,d6
	lea dostrkbuf-base(a6),a0
	add.l a0,d6
	bsr cmpsec
	tst.b dskerr-base(a6)
	beq.b write2

	lea veritxt-base(a6),a1
	lea linebuf+1-base(a6),a0
	bsr txttobuf
	move.b dskerr-base(a6),d0
	bsr.w bytetod
	move.b #")",(a0)+
	bsr thsbuf	
	addq.w #8,a0
	lea retrytx(pc),a1
	bsr txttobuf
	bsr rawline

	bsr.b mstest
	beq.b write1	;retry
	bpl.b write0	;abort
;	bmi.b write2	;ignore

write2:	sf dskerr-base(a6)
	dbf d1,wmf1	
write0:	movem.l (a7)+,d6/a0/a1
	rts	

mstest:	st dontbuf-base(a6)
	clr.w buflen-base(a6)
mst2:	cmp.b #"r",ascii-base(a6)
	beq.b mst0			;beq retry
	cmp.b #$1b,ascii-base(a6)
	beq.b mst1
	cmp.b #"a",ascii-base(a6)
	beq.b mst1
	cmp.b #"i",ascii-base(a6)
	bne.b mst2
	move.w #8,ccr			;bmi ignore
	bra.b mst0	
mst1:	move.w #0,ccr			;bne abort
mst0:	sf dontbuf-base(a6)
	rts

writemfm:
	move.b #29,dskerr-base(a6)
	lea $dff09e,a2
	bsr.w dskrdy
	tst.w d0
	beq.w rmfm0
	move.w #$4000,d0
	move.w #$7fff,(a2)		;$dff09e
	move.w #$9100,(a2)		;$dff09e syncwait off
	bra.b wmfm

readmfmindex:
	move.b #29,dskerr-base(a6)
	lea $dff09e,a2
	bsr.w dskrdy			;timeout
	tst.w d0
	beq.w rmfm0
	clr.w d0
	move.w #$7fff,(a2)		;$dff09e
	move.w #$9100,(a2)		;$dff09e syncwait off
dindex:	btst #4,$bfdd00
	bne.b dindex
	bra.b wmfm
readmfm:move.b #29,dskerr-base(a6)
	lea $dff09e,a2
	bsr.w dskrdy			;timeout
	tst.w d0
	beq.b rmfm0
	clr.w d0
	move.w #$7fff,(a2)		;$dff09e
	move.w #$9500,(a2)		;$dff09e syncwait on
wmfm:	cmp.b #80,trk-base(a6)
	bls.b precomp			;precomp00
	move.w #$a000,(a2)		;precomp01
precomp:bsr.w pushcache
	move.w #$4000,$24-$9e(a2)	;$dff024
	move.w #$8010,$96-$9e(a2)	;$dff096 disk dma on	
	move.l dskadr-base(a6),$20-$9e(a2)	;$dff020
	move.w sync-base(a6),$7e-$9e(a2)	;$dff07e
	move.w #$0002,$9c-$9e(a2)	;$dff09c
	or.w readlen-base(a6),d0
	bset #15,d0
	move.w d0,$24-$9e(a2)		;$dff024		
	move.w d0,$24-$9e(a2)		;$dff024		

	move.b #26,dskerr-base(a6)
	move.w #300,d0			;timeout 300ms
	tst.b hddrive-base(a6)
	beq.b rmfm2
	add.w d0,d0			;150rpm drive
rmfm2:	bsr.b wait1ms
	subq.w #1,d0
	beq.b rmfm1
	btst #1,$1f-$9e(a2)		;$dff01f
	beq.b rmfm2
rmfm1:	move.w #$4000,$24-$9e(a2)	;$dff024
	bsr.w invcache
	tst.w d0			;timeout error?
	beq.b rmfm0
	sf dskerr-base(a6)
	st truebuf-base(a6)
rmfm0:	rts
wait1ms:move.l a1,-(a7)
	lea $bfdd00,a1
	move.b #$7f,(a1)		;$bfdd00 clr int
	bclr #5,$e00-$d00(a1)		;$bfde00 count 02
	bset #3,$e00-$d00(a1)		;$bfde00 oneshot
	move.b #time1ms&255,$400-$d00(a1)	;$bfd400 timerlo
	move.b #time1ms/256,$500-$d00(a1)	;$bfd500 timerhi
w1ms0:	btst #0,(a1)			;$bfdd00 wait timerint
	beq.b w1ms0
	move.l (a7)+,a1
	rts

initdosdrive:			;do some init stuff
	bsr.w motondt
	bsr.w stepup
	bsr.w stepdwn
	sf dskerr-base(a6)
	bsr.w trk0
	tst.b dskerr-base(a6)
	bne.b inidd0
	clr.l secinbuf-base(a6)
	sf truebuf-base(a6)
	bsr.w testindrive
	bne.b inidd0
	bsr.w testdosdsk	;reads root
	bne.b inidd0
	pea rootblk-base(a6)
	move.l (a7)+,d6
	move.l dirkey-base(a6),d5
	bsr.w getsec
	tst.b dskerr-base(a6)
inidd0:	rts			;bne.b error

cd:	lea 3(a5),a0
	bsr.w getfilename
	beq.b cdqq
	cmp.w #30,d4
	bhi.b cdqq

	cmp.b #":",(a2)		;back to the roots..
	bne.b cd3
	move.l rootkey-base(a6),dirkey-base(a6)
	addq.w #1,a2
	subq.w #1,d4
	beq.b cdq

cd3:	sf wrflag-base(a6)
	sf wrcmd-base(a6)
	bsr.b initdosdrive
	bne.b cdq

	move.l a2,a0
	bsr.w fnhash		;a0:str,d4.w:len>d4.w:rootidx,d5:blk
	beq.b cd1		;hash entry zero?

	bsr.w searchfile	;d5:1st hash,a2:fname
				;>prevchain,a4:header
	beq.b cd1
	move.l $1fc(a4),d0
	addq.l #3,d0		;-3:file
	beq.b cd4
	addq.l #1,d0		;-4:linked file
	beq.b cd4
	move.l 4(a4),d1		;ownkey/dirkey
	subq.l #6,d0		;2:dir
	beq.b cd2
	move.l $1d4(a4),d1	;hardlink/dirkey
	subq.l #2,d0
	beq.b cd2
	bra.b cdq		;illegal type
	
cd4:	bsr.w disfile
	bra.b cdq
cd2:	move.l d1,dirkey-base(a6)

cdq:	bsr.w motoff
	st d7
cdqq:	rts
cd1:	bsr.w dnotfnd
	bra.b cdq

delete:	lea 4(a5),a0
	bsr.w getfilename
	move.w d4,para+12-base(a6)
	beq.w deleteq
	cmp.w #30,d4
	bhi.w deleteq

	st wrflag-base(a6)
	st wrcmd-base(a6)
	bsr.w initdosdrive
	bne.w delete0

	move.l a2,a0
	clr.l prevchain-base(a6);default:fh in root
	bsr.w fnhash		;a0:str,d4.w:len>d4.w:rootidx,d5:blk
	beq.b delete1		;hash entry zero?

	bsr.w searchfile	;d5:1st hash,a2:fname
				;>prevchain,a4:header
	bne.b delete2

delete1:bsr.w fnotfnd
	bra.w delete0

delete2:move.l 4(a4),d0
	bsr.w freeblk
	beq.w delbm

	move.l $1fc(a4),d0
	subq.l #2,d0		;2:userdir?
	beq.b delmain
	addq.l #5,d0		;-3:file
	beq.b delmain
	subq.l #7,d0		;4:linked dir
	beq.b islink
	addq.l #8,d0		;-4:linked file
	bne.w delete0	;illegal type
islink:	move.l 4(a4),d4		;ownkey
	lea rootblk-base(a6),a5	;temp buffer
	move.l $1d4(a4),d5	;true header
delink:	move.l a5,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w delete0
	move.l $1d8(a5),d0
	cmp.l d4,d0
	bne.b notme
	move.l $1d8(a4),$1d8(a5)	;delink header
	move.l a5,a0
	bsr.w datasum
	move.l d3,20(a0)	;chksum
	bsr.w putsec
	tst.b dskerr-base(a6)
	bne.w delete0
	bra.w delete8
	;move.l $1fc(a4),d0	;remove header from hashchain
	;subq.l #4,d0		;4:linked dir
	;beq.w delete8
	;addq.l #8,d0		;-4:linked file
	;bne.b delete0		;illegal type
	;bra.b delfile
notme:	move.l d0,d5
	bra.b delink

delmain:move.l $1d8(a4),d5		;hardlink
	beq.b nolnkhd
	move.l d5,d4			;new main file/dir
	lea rootblk-base(a6),a5
	move.l a5,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w delete0
	lea 8(a4),a0
	lea 8(a5),a1
	moveq #($1a4-8)/4-1,d0
cpyhead:move.l (a0)+,(a1)+
	dbf d0,cpyhead
	move.l $1f8(a4),$1f8(a5)	;fhextension|reserved
	move.l $1fc(a4),$1fc(a5)	;type:no linked
	clr.l $1d4(a5)			;main hardlink
	move.l a5,a0
fixlink:bsr.w datasum
	move.l d3,20(a0)
	bsr.w putsec			;write new main hd
	tst.b dskerr-base(a6)
	bne.w delete0
	move.l $1d8(a5),d5
	beq.b endlink
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w delete0
	move.l d4,$1d4(a5)	;main hardlink
	bra.b fixlink
endlink:bra.b delete8		;delink old header

nolnkhd:move.l $1fc(a4),d0
	subq.l #2,d0		;2:userdir?
	beq.b delete5
	;addq.l #5,d0		;-3:file
	;bne.b delet0
delfile:move.l a4,a5
delete9:lea $134+4(a5),a3
	moveq #72,d3		;max #datablk (FFS)
	tst.b ffs-base(a6)
	bne.b delete7
	move.l 8(a5),d3		;#datablk in this file (OFS)
delete7:subq.l #1,d3
	bmi.b delete6
	move.l -(a3),d0
	beq.b delete7		;empty entry (FFS)
	bsr.w freeblk
	beq.w delbm
	bra.b delete7

delete6:move.l $1f8(a5),d5	;extension block?
	beq.b delete8		;eof
	lea rootblk-base(a6),a5
	move.l a5,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b delete0
	move.l d5,d0
	bsr.w freeblk
	beq.b delbm
	bra.b delete9

delete5:lea $18(a4),a0		;dir empty?
	moveq #72-1,d0
delete4:tst.l (a0)+
	bne.b delnmt
	dbf d0,delete4

delete8:lea rootblk-base(a6),a0
	move.l a0,d6

	lea $1f0(a0),a3
	move.l prevchain-base(a6),d5		;filehd in chain or root?
	bne.b ischain
	move.l dirkey-base(a6),d5
	move.l roothash-base(a6),a3

ischain:bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b delete0

	move.l $1f0(a4),(a3)		;hashchain/roothash

	move.l d6,a0
	bsr.w datasum
	move.l d3,20(a0)
	bsr.w putsec
	tst.b dskerr-base(a6)
	bne.b delete0

	bsr.w bitsum	;>a0:bitmap
	move.l a0,d6
	move.l bitsec-base(a6),d5
	bsr.w putsec
	tst.b dskerr-base(a6)
	bne.b delete0

	bsr.w updatedisk

delete0:bsr.w motoff
	st d7
deleteq:rts
delnmt:	bsr.w dnotmt
	bra.b delete0
delbm:	bsr.w bmaperr
	bra.b delete0

makedir:lea 3(a5),a0
	bsr.w getfilename
	move.w d4,para+12-base(a6)
	beq.w mdq
	cmp.w #30,d4
	bhi.w mdq

	st wrflag-base(a6)
	st wrcmd-base(a6)
	bsr.w initdosdrive
	bne.w md0

	move.l a2,a0
	bsr.w fnhash		;a0:str,d4.w:len>d4.w:rootidx,d5:blk
	beq.b md1		;hash entry zero?

	bsr.w searchfile	;d5:1st hash,a2:fname,
				;>prevchain,a4:header
	beq.b md1
	bsr.w dexists
	bra.w md0
md1:	bsr.w getfreehead
	beq.w mdfull
	move.l d0,d4

	lea header-base(a6),a4
	move.l a4,a0
	moveq #512/4-1,d6
md2:	clr.l (a0)+
	dbf d6,md2
;;
	move.l roothash-base(a6),a1
	clr.l linkkey-base(a6)
	move.l (a1),d5		;root entry free?
	beq.b usdroot
sortus:	cmp.l d4,d5		;root entry higher?
	bhi.b usdroot
	move.l d5,linkkey-base(a6)
	lea rootblk-base(a6),a5
	move.l a5,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w md0
	move.l $1f0(a5),d5	;hashchain
	bne.b sortus
usdroot:move.l d5,$1f0(a4)	;set hashchain
;;
	bsr.w getclok
	move.l days-base(a6),$1a4(a4)
	move.l mins-base(a6),$1a8(a4)
	move.l ticks-base(a6),$1ac(a4)

	moveq #2,d6
	move.l d6,(a4)		;type
	move.l (a4),$1fc(a4)	;type
	move.l d4,4(a4)		;ownkey
	move.l dirkey-base(a6),$1f4(a4)	;parent key
	lea $1b1(a4),a0
	move.w para+12-base(a6),d0
	subq.w #1,d0
md3:	move.b (a2)+,(a0)+
	addq.b #1,$1b0(a4)
	dbf d0,md3
	move.l a4,a0
	bsr.w datasum
	move.l d3,20(a0)
	move.l 4(a4),d5
	move.l a4,d6
	bsr.w putsec
	tst.b dskerr-base(a6)
	bne.b md0
;;
	lea rootblk-base(a6),a2
	move.l a2,d6			;rootblk/dirblk
	lea rootblk+$1f0-base(a6),a2	;hashchain
	move.l linkkey-base(a6),d5
	bne.b sortusr
	move.l roothash-base(a6),a2
	move.l dirkey-base(a6),d5
sortusr:bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b md0

	move.l d4,(a2)			;insert userdir
	lea rootblk-base(a6),a0		;root/userdir chk
	bsr.w datasum
	move.l d3,20(a0)
	bsr.w putsec			;write root/userdir
	tst.b dskerr-base(a6)
	bne.b md0
;;
	bsr.w bitsum		;>a0:bitmap
	move.l a0,d6
	move.l bitsec-base(a6),d5
	bsr.w putsec
	tst.b dskerr-base(a6)
	bne.b md0

	bsr.w updatedisk
md0:	bsr.w motoff
	st d7
mdq:	rts
mdfull:	bsr.w dskfull
	bra.b md0

info:	sf d7
	bra.b domap
map:	st d7			;bitmap
domap:	sf wrflag-base(a6)
	sf wrcmd-base(a6)
	bsr.w initdosdrive
	bne.w mapq

	tst.b d7
	bne.w domap0
	lea linebuf+1-base(a6),a0
	lea maptxt(pc),a1
	bsr.w txttobuf
	moveq #"D",d0
	tst.b hddrive-base(a6)
	beq.b domap1
	moveq #"H",d0
domap1:	move.b d0,-14(a0)

	tst.b valflag-base(a6)	;from TestDosDsk
	beq.b isnval
	addq.w #2,a1		;inValid
isnval:	bsr.w txttobuf

	move.l bitsec-base(a6),d0
	bsr.w wordtoa_
	move.b #"=",(a0)+
	bsr.w wordtod
	move.b #")",(a0)+
	move.b #",",(a0)+
	bsr.w numfree		;a0:txtbuf;->d4:free blk
	
	addq.w #1,a0
	lea filesys(pc),a1
	bsr.w txttobuf
	tst.b int-base(a6)
	beq.b isnoint
	addq.w #4,a1
isnoint:bsr.w txttobuf
	moveq #"O",d0
	tst.b ffs-base(a6)
	beq.b isoldfs
	moveq #"F",d0
isoldfs:move.b d0,-5(a0)	;xFS

	bsr maxfile
	lea dskftxt(pc),a1
	beq.b dskful0
	bsr.w hextoa_
	move.b #"=",(a0)+
	bsr.w hextod
	lea bytetxt(pc),a1
dskful0:bsr txttobuf
	bsr rawline
	bra.w mapq

domap0:	bsr.w clrscr
	lea linebuf-base(a6),a0
	sf d2
	bsr.b maphead
	st d2
	pea map0(pc)
maphead:moveq #80-1,d1
maphd0:	moveq #79,d0
	sub.l d1,d0
	divu #10,d0
	tst.b d2
	beq.b maphd1
	swap d0
maphd1:	add.b #"0",d0
	move.b d0,(a0)+
	dbf d1,maphd0
	bra.w rawline
map0:
	move.l scradr-base(a6),a0
	lea xchars*8*2(a0),a0
	move.w cylsecm1-base(a6),d4	;21/43
map7:	moveq #80-1,d3
	move.w cylsecm1-base(a6),d0	;21/43
	ext.l d0
	subq.w #2,d0
	sub.w d4,d0
	bpl.b map5
	moveq #%00101010,d6
	move.b d6,(a0)+
	move.b d6,xchars*2-1(a0)
	add.w d6,d6
	bra.b map1
map5:	moveq #%01111110,d6
	move.b d6,(a0)+
	move.b d6,xchars*2-1(a0)
	bsr.b tstfree
	beq.b map1
	moveq #%01000010,d6
map1:	move.b d6,xchars-1(a0)

map6:	add.w cylsec-base(a6),d0	;22/44
	dbf d3,map5

	lea xchars*3(a0),a0
	cmp.w trksec-base(a6),d4	;11/22
	bne.w map8
	lea xchars(a0),a0
map8:	dbf d4,map7
	move.w trksec-base(a6),d0
	add.b d0,row-base(a6)

mapq:	bsr.w motoff
	st d7
	rts
tstfree:move.l a0,-(a7)
	lea bitmap-base(a6),a0
	move.l d0,d1
	lsr.w #5,d1
	add.w d1,d1			;lsl.w #2,d1
	add.w d1,d1
	move.l 4(a0,d1.w),d2
	btst d0,d2
	move.l (a7)+,a0
	rts

maxfile:movem.l d1/d4,-(a7)
	moveq #0,d0		;d4:free blocks;->d0:free bytes
maxfil2:subq.l #1,d4
	bmi.b maxfil1
	beq.b maxfil1
	moveq #72-1,d1
maxfil0:addq.w #1,d0
	subq.l #1,d4
	beq.b maxfil1
	dbf d1,maxfil0
	bra.b maxfil2
maxfil1:movem.l (a7)+,d1/d4
	mulu datasiz-base(a6),d0	;beq.b diskfull
	rts

catalog:move.l a5,a0
	move #xchars-1,d0
fndfopt:cmp.b #"f",(a0)+
	dbeq d0,fndfopt
	move.b d0,catopt-base(a6)	;bmi.b noopt

	clr.l lastcmd-base(a6)
	sf wrflag-base(a6)
	sf wrcmd-base(a6)
	bsr.w initdosdrive
	bne.w catq

	lea rootblk-base(a6),a3
	lea linebuf+2-base(a6),a0
	lea voltxt(pc),a1
	bsr.w txttobuf
	lea $1b0(a3),a1
	bsr.w bcpltobuf
	move.b #34,(a0)

	lea linebuf+41-base(a6),a0
	bsr.w numfree

	lea header-base(a6),a4
	lea 24(a3),a2
	moveq #72-1,d2
cat0:	move.l (a2)+,d5
	beq.w cat1
cat2:	move.l a4,d6
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w catq

	move.b #">",(a0)+
	addq.w #4,a0
	
	move.b #34,(a0)+
	lea $1b0(a4),a1
	bsr.w bcpltobuf		;file/dirname
	move.b #34,(a0)+

	lea linebuf+38-base(a6),a0
	move.l $1fc(a4),d3	;type
	subq.l #2,d3		;+2:dir
	beq.b notlink
	addq.l #5,d3		;-3:fileheader
	beq.b notlink
	subq.l #7,d3		;+4:linked dir
	lea dlnktxt(pc),a1
	beq.b filelnk
	addq.l #8,d3		;-4:linked fileheader
	lea flnktxt(pc),a1
	bne.w catq		;illegal type
filelnk:bsr.w txttobuf
	lea bitmap-base(a6),a1
	move.l a1,d6		;buffer for linksec
	move.l $1d4(a4),d5	;hardlink
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.w catq
	lea bitmap+$1b0-base(a6),a1
	bsr.w bcpltobuf		;file/dirname
	move.b #34,(a0)
	move.b bitmap+$143-base(a6),$143(a4)	;copy protection flags
	bra.w cat3

notlink:lea $148(a4),a1		;filecomment
	bsr.w bcpltobuf
	lea linebuf+38-base(a6),a0
	cmp.b #"$",(a0)
	bne.b nocomm
	moveq #" ",d0		;strip "$xx-$" if saved with bm
	move.b d0,(a0)
	move.b d0,9(a0)
	move.b d0,10(a0)
nocomm:
	lea linebuf+60-base(a6),a0
	move.l $1fc(a4),d3
	moveq #-3,d0
	cmp.l d0,d3		;file
	bne.b cat4
	move.l $144(a4),d0	;filesize, use only 24 bit
	bsr.w adrtoa_
	addq.w #1,a0
	bsr.w hextod
	lea linebuf+75-base(a6),a0
	tst.l d0
	beq.b catempt
	subq.l #1,d0
	divu datasiz-base(a6),d0
	move.w d0,d3
	ext.l d3
	beq.b catnols		;filled datablk?
	divu #72,d3		;datablk/fileheader/list
	add.w d3,d0
catnols:addq.w #1,d0		;rest of datablk
catempt:addq.w #1,d0		;fileheader
	ext.l d0
	bsr.w hextod
cat4:	moveq #2,d0
	cmp.l d0,d3		;dir
	bne.b cat3
	lea dirtxt(pc),a1
	bsr.w txttobuf

cat3:	bsr.w rawline

	tst.b catopt-base(a6)
	bmi.w nocatop

	lea linebuf+1-base(a6),a0
	move.l $1a4(a4),d0
	bsr.w todate
	lea linebuf+25-base(a6),a0
	move.l $1a8(a4),d0
	divu #60,d0
	bsr.w bytetod
	swap d0
	move.b #":",(a0)+
	bsr.w bytetod
	move.l $1ac(a4),d0
	divu #50,d0
	move.b #":",(a0)+
	bsr.w bytetod

	lea linebuf+34-base(a6),a0
	move.b $143(a4),d0
	eor.b #%1111,d0		;hspa:1=set,rwed:0=set
	move.l #"hspa",d3
	bsr.w protcnv
	move.l #"rwed",d3
	bsr.w protcnv
	lea linebuf+43-base(a6),a0
	move.l 4(a4),d0		;fileheader/userdir
	bsr.w longtoa_
	addq.w #1,a0
	move.l $1f8(a4),d0	;fileheaderextension
	beq.b nofhext
	bsr.w longtoa_
nofhext:move.l $10(a4),d0	;first data
	beq.b noentry
	lea linebuf+63-base(a6),a0
	bsr.w longtoa_
noentry:bsr.w rawline

nocatop:bsr.w stopit
	beq.b cat5
	
	move.l $1f0(a4),d5	;follow hashchain
	bne.w cat2
cat1:	dbf d2,cat0
cat5:
catq:	bsr.w motoff
	st d7
	rts

cntfree:lea bitmap+4-base(a6),a1	;how many free blk?
	moveq #0,d0
	move.l lastkey-base(a6),d2
	subq.l #2,d2		;reserved
cat8:	move.l (a1)+,d3
	moveq #0,d1
cat6:	btst d1,d3
	bne.b cat7
	addq.l #1,d0
cat7:	subq.l #1,d2
	bmi.b cnt0
	addq.w #1,d1
	cmp.b #32,d1
	bne.b cat6
	bra.b cat8
cnt0:	move.l lastkey-base(a6),d4		;bootblocks:reserved
	sub.l #1,d4
	sub.l d0,d4		;beq.b nofree
	rts
numfree:bsr.b cntfree
	addq.w #2,a0
	bsr.w hextod
	lea usdtxt(pc),a1
	bsr.w txttobuf
	move.l d4,d0
	bsr.w hextod
	lea fretxt(pc),a1
	bsr.w txttobuf
	bra.w rawline

protcnv:moveq #4-1,d1
prot:	rol.l #8,d3
	add.b d0,d0
	bcs.b protst1
	move.b #"-",d3
protst1:move.b d3,(a0)+
	dbf d1,prot
	rts

getclok:movem.l d0-d3/a0-a1,-(a7)
	clr.l days-base(a6)
	clr.l mins-base(a6)
	clr.l ticks-base(a6)
	lea $dc0000,a0		;baseadr
	moveq #15,d1
	move.b $3f(a0),d0
	and.b d1,d0
	subq.b #4,d0
	beq.b clkold1
	clr.b $3f(a0)
	clr.b $3b(a0)
	move.b #9,$37(a0)	;new chip off
	move.b #5,$33(a0)	
	move.b $33(a0),d0
	and.b d1,d0
	bne.b ncorbad
	move.b $37(a0),d0
	and.b d1,d0
	cmp.b #9,d0
	bne.b ncorbad
	move.b $2b(a0),d0
	btst #0,d0
	beq.b ncorbad
	sf $37(a0)		;new chip on
	moveq #4,d0		;skip one longword
	lea $34(a0),a0		;$dc0034
	bsr.b clkget		;returns a0:$dc0000!
	move.b #9,$37(a0)	;new chip off
	bra.b exitclk
clkold1:moveq #1,d0
	move.w #$190,d1
clkbusy:move.b d0,$37(a0)	;hold
	btst d0,$37(a0)
	beq.b bsyout
	sf $37(a0)
	dbf d1,clkbusy
	bra.b ncorbad
bsyout:	moveq #0,d0		;don't skip anything
	lea $30(a0),a0		;$dc0030
	bsr.b clkget		;returns a0:$dc0000!
	sf $37(a0)
ncorbad:
exitclk:movem.l (a7)+,d0-d3/a0-a1
	rts
clkget:	bsr.b getclk
	sub.w #78,d2		;year<1978?
	bcc.w clkget0
	add.w #100,d2		;eoc
clkget0:move.l d2,d3
	mulu #365,d3
	addq.l #1,d2		;leap
	divu #4,d2
	add.w d2,d3
	swap d2
	move.b #28,month+1-base(a6)	;feb
	cmp.b #3,d2
	bne.b noleap
	addq.b #1,month+1-base(a6)
noleap:	lea month-base(a6),a1
	bsr.b getclk
nextmon:subq.b #1,d2		;timeout
	beq.b jan
	move.b (a1)+,d1
	add.w d1,d3
	bra.w nextmon
jan:	bsr.b getclk
	subq.l #1,d2
	add.w d2,d3		;d3=days
	move.l d3,days-base(a6)
	sub.w d0,a0		;A500/2000:0,A3000/4000:4
	bsr.b getclk
	divu #40,d2		;skip am/pm
	clr.w d2
	swap d2
	move.l d2,d3		;d3=hours
	lsl.l #4,d3		;*60
	sub.l d2,d3
	lsl.l #2,d3
	bsr.b getclk
	add.l d2,d3		;d3=mins
	move.l d3,mins-base(a6)
	bsr.b getclk
	mulu #50,d2		;d3=secs
	move.l d2,ticks-base(a6)
	rts
getclk:	moveq #15,d1
	and.l -(a0),d1
	moveq #15,d2
	and.l -(a0),d2
	add.l d1,d2
	add.l d1,d2
	lsl.l #3,d1
	add.l d1,d2
	rts
dayname:dc.b "Sunday"!$80
	dc.b "Monday"!$80
	dc.b "Tuesday"!$80
	dc.b "Wednesday"!$80
	dc.b "Thursday"!$80
	dc.b "Friday"!$80
	dc.b "Saturday"!$80
	even
todate:	movem.l d0-d4,-(a7)	;funky code, not easy...
	move.l d0,d4
	lea 28431.w,a1		;d0:days since 1.1.78
	add.l a1,d0
	lsl.l #2,d0
	move.l d0,d2
	subq.l #1,d2
	divu #1461,d2
	and.l #$0000ffff,d2
	addq.l #3,d0
	move.l d2,d3
	mulu #1461,d3
	sub.l d3,d0
	lsr.l #2,d0
	move.l d0,d3
	lsl.l #2,d0
	add.l d3,d0		;5*days
	move.l d0,d1
	subq.l #3,d1
	divu #153,d1
	and.l #$0000ffff,d1
	addq.l #2,d0
	move.l d1,d3
	mulu #153,d3
	sub.l d3,d0
	divu #5,d0
	and.l #$0000ffff,d0
	moveq #10,d3
	cmp.l d3,d1
	bge.b date1
	addq.l #3,d1		;month+3
	bra.b date2
date1:	subq.l #8,d1
	subq.l #1,d1		;month-9
	addq.l #1,d2		;year+1
date2:	bsr.w bytetod
	lea months(pc),a1
	move.w d1,d0
	add.w d0,d0
	add.w d1,d0
	lea -3(a1,d0.w),a1
	move.b #"-",(a0)+
	move.b (a1)+,(a0)+	;the month
	move.b (a1)+,(a0)+
	move.b (a1)+,(a0)+
	move.b #"-",(a0)+
	move.l d2,d0
	add.w #1900,d0
	bsr.w wordtod
	addq.w #1,a0
	move.b #"[",(a0)+
	divu #7,d4
	swap d4
	move.w d4,d0
	lea dayname(pc),a1
	cmp.b #6,d0
	bsr.w indextx
	move.b #"]",(a0)+
	movem.l (a7)+,d0-d4
	rts

drive:	cmp.b #1,d3
	bhi.w drvq
	tst.b d3
	beq.b drv0
	move.l para-base(a6),d0
drv1:	moveq #3,d1
	cmp.l d1,d0
	bhi.w drvq
	addq.b #3,d0
	move.b d0,drvbit-base(a6)
drv0:	bsr.b drvinit

;	bsr.w moton
;	bsr.w stepup
;	bsr.w trk0
;	tst.b dskerr-base(a6)
;	bne.b error
;	bsr.w motoff
	st d7
drvq:	rts

drvi:	move.b d0,drvbit-base(a6)
drvinit:lea linebuf-base(a6),a0
	bsr.w drvnumx
	bsr.b drvtype	;>d4:drivetype
	lea logtxt(pc),a1
	not.l d4
	bne.b con2
	cmp.b #3,d1		;df0:
	seq d4
	beq.b con2
	lea mnttxt(pc),a1	;no drive
con2:	bsr.w txttobuf
	bsr.w rawline
	tst.l d4
	bne.b drv2		;drive is present
	moveq #3,d0
	cmp.b drvbit-base(a6),d0
	bne.b drvi
drv2:	clr.l secinbuf-base(a6)
	move.l rootkey-base(a6),dirkey-base(a6)
	sf truebuf-base(a6)
	rts

drvtype:lea $bfd100,a1
	st (a1)
	move.b drvbit-base(a6),d1
	moveq #7,d3
	bclr d3,(a1)
	bsr.b relax
	bclr d1,(a1)
	bsr.b relax
	bset d1,(a1)
	bsr.b relax
	bset d3,(a1)
	bsr.b relax
	bclr d1,(a1)
	bsr.b relax
	bset d1,(a1)

	moveq #31,d3
con0:	bclr d1,(a1)
	bsr.b relax
	move.b $0f01(a1),d2	;$bfe001
	lsl.b #3,d2
	roxl.l #1,d4		;get the drive msg
	bset d1,(a1)
	dbf d3,con0		;d4:$ffffffff:not mounted
	move.w #ddmfmwords,readlen-base(a6)
	moveq #11,d3		;dd sectors
	cmp.l #$aaaaaaaa,d4
	seq hddrive-base(a6)
	bne.b ddroot
	move.w #hdmfmwords,readlen-base(a6)
	add.l d3,d3		;hd sectors 
ddroot:	move.w d3,trksec-base(a6)	;11/22
	subq.w #1,d3
	move.w d3,trksecm1-base(a6)
	addq.w #1,d3
	add.l d3,d3
	move.w d3,cylsec-base(a6)	;22/44
	subq.w #1,d3
	move.w d3,cylsecm1-base(a6)
	addq.w #1,d3
	mulu #40,d3
	move.l d3,rootkey-base(a6)	;880/1760
	add.l d3,d3
	subq.l #1,d3
	move.l d3,lastkey-base(a6)	;1759/3519
	subq.l #1,d3
	move.l d3,lastkeym1-base(a6)	;1758/3518
	rts

relax:	nop
	nop
	rts

motondt:movem.l d1-d4,-(a7)
	bsr.w drvtype
	
	lea $bfd100,a1
	bclr #7,(a1)
	bset #0,(a1)	;nostep
sel:	move.b drvbit-base(a6),d0
	bclr d0,(a1)

	movem.l (a7)+,d1-d4
	rts

motoff:	lea $bfd100,a1
	bset #7,(a1)
	bsr.b relax
	or.b #%01111000,(a1)
	bsr.b relax
	and.b #%10000111,(a1)
	bsr.b relax
	or.b #%01111000,(a1)
	rts

dskrdy:	move.w #1500,d0		;timeout 1.5 sec
drdynms:bsr.w wait1ms
	subq.w #1,d0
	beq.b mot2
	btst #5,$bfe001
	bne.b drdynms
mot2:	rts

trk0:	movem.l d0-d1/a0-a1,-(a7)
	bsr.b dskrdy
	moveq #81+20,d0		;maxcyl
	moveq #0,d1
	lea $bfd100,a1
trk2:	btst #4,$0f01(a1)	;$bfe001
	beq.b trk1
	addq.w #1,d1
	bsr.b stepdwn
	dbf d0,trk2
	lea trk0txt(pc),a1
	bsr msgout
	move.b #30,dskerr-base(a6)	;(SeekError)
trk1:	lea drivcyl-3-base(a6),a1
	move.b drvbit-base(a6),d0
	ext.w d0
	add.w d0,a1
	tst.b (a1)
	bpl.b trk3	;startcyl valid
	move.b d1,(a1)
trk3:	sf trk-base(a6)
	movem.l (a7)+,d0-d1/a0-a1
	rts
	
stepup:	bclr #1,(a1)
	addq.b #2,trk-base(a6)
	bra.b dostep
stepdwn:bset #1,(a1)		;down
	subq.b #2,trk-base(a6)
dostep:	sf truebuf-base(a6)
	bclr #0,(a1)
	bsr.w relax
	bset #0,(a1)
stepdel:movem.l a1/d2,-(a7)
	move.w #stepcount,d2
	bra.b stp1
setldel:movem.l a1/d2,-(a7)
	move.w #settlecount,d2
stp1:	lea $bfdd00,a1
	move.b #$7f,(a1)		;$bfdd00 clr int
	bclr #5,$e00-$d00(a1)		;$bfde00 count 02
	bset #3,$e00-$d00(a1)		;$bfde00 oneshot
	move.b d2,$400-$d00(a1)		;$bfd400 timerlo
	lsr.w #8,d2
	move.b d2,$500-$d00(a1)		;$bfd500 timerhi
stp0:	btst #0,(a1)			;$bfdd00 wait timerint
	beq.b stp0
	movem.l (a7)+,a1/d2
	rts

dotrk:	lea $bfd100,a1	
	moveq #0,d0
	btst d0,d1
	beq.b dtrk6
	bclr #2,(a1)
	bset d0,trk-base(a6)
	bra.b dtrk0
dtrk6:	bset #2,(a1)
	bclr d0,trk-base(a6)
dtrk0:	lsr.b #1,d1
	cmp.b #82,d1
	bls.b dtrk2
	move.b #82,d1
dtrk2:	moveq #-1,d0
dtrk1:	move.b trk-base(a6),d0
	lsr.b #1,d0
	cmp.b d0,d1
	beq.b dtrk3
	bhi.b dtrk5
	bsr.w stepdwn
	bra.b dtrk7
dtrk5:	bsr.w stepup
dtrk7:	moveq #0,d0
	bra.b dtrk1

dtrk3:	tst.w d0		;moved head?
	bpl.b dtrk8
	bsr.w stepdel
	bra.b dtrk9
dtrk8:	bsr.w setldel
dtrk9:	btst #2,$0f01(a1)	;$bfe001,disk removed ?
	bne.b dtrk4
	move.b #29,dskerr-base(a6)	;(DiskChanged)
dtrk4:	rts

drvnumx:moveq #8,d1
	bra.b drvnum0
drvnum:	moveq #0,d1
drvnum0:move.l a1,-(a7)
	lea drvtxt(pc),a1
	add.l d1,a1
	bsr.w txttobuf
	moveq #"0"-3,d0
	add.b drvbit-base(a6),d0
	move.b d0,-6(a0)
	move.l (a7)+,a1
	rts

format:	lea 7(a5),a0
	bsr.w getfilename
	beq.w frmq	;empty
	cmp.w #30,d4	;len
	bhi.w frmq

	sf d6
	bsr.w skipspc	;no eol check! 
	cmp.b #"q",(a0)
	bne.b notkwik
	st d6
	addq.w #1,a0
	bsr.w skipspc	;no eol check! 
notkwik:move.l dosofs-base(a6),d5
	moveq #-"0",d0
	add.b (a0),d0		;0:ofs,1:ffs,2:iofs,3:iffs
	cmp.b #3,d0
	bhi.b notffs
	move.b d0,d5
notffs:	move.l d5,formdos-base(a6)
	lea rootblk-base(a6),a0
	clr.l $1b0(a0)
	lea $1b1(a0),a1		;copy bcplname
	subq.w #1,d4		;d4:len
fmnam:	move.b (a2)+,(a1)+	;a2:name
	addq.b #1,$1b0(a0)
	dbf d4,fmnam

	bsr.w motondt		;stays selected
	bsr.w stepup
	bsr.w stepdwn
	sf dskerr-base(a6)
	bsr.w trk0
	tst.b dskerr-base(a6)
	bne.w frm7
	st wrflag-base(a6)
	bsr.w testindrive	;wrflag?
	bne.w frm7

	lea dostrkbuf-base(a6),a0
	move.w #512/4*11*2-1,d0	;hd size
	moveq #0,d1
clrtrkb:move.l d1,(a0)+
	dbf d0,clrtrkb

	moveq #80,d5
	tst.b d6
	bne.b frm0		;quick!
	move.w #159,d5
frm0:	move.w d5,d1
	bsr.w dotrk
	tst.b dskerr-base(a6)
	lea fabotxt(pc),a1
	bne.w frm8		;disk removed

	lea dostrkbuf-base(a6),a0
	tst.w d5
	bne.b nocyl00
	move.l formdos-base(a6),(a0)
nocyl00:cmp.w #80,d5
	bne.w nocyl40

	moveq #2,d0		;type
	move.l d0,(a0)
	moveq #$48,d0		;hashtabsize
	move.l d0,$0c(a0)
	moveq #-1,d0		;valid bm
	move.l d0,$138(a0)
	move.l rootkey-base(a6),d0
	addq.l #1,d0
	move.l d0,$13c(a0)	;bm block

	bsr.w getclok
	move.l days-base(a6),$1a4(a0)	;change
	move.l mins-base(a6),$1a8(a0)
	move.l ticks-base(a6),$1ac(a0)
	move.l days-base(a6),$1e4(a0)	;create
	move.l mins-base(a6),$1e8(a0)
	move.l ticks-base(a6),$1ec(a0)

	move.l a0,-(a7)
	lea rootblk+$1b0-base(a6),a1
	lea $1b0(a0),a0
	move.b (a1),(a0)+
	bsr.w bcpltobuf
	move.l (a7)+,a0

	moveq #1,d0
	move.l d0,$1fc(a0)	;secondary type
	bsr.w datasum
	move.l d3,$14(a0)	;data chksum
	lea $200(a0),a1
	move.l #$3b990984,d1	;dd chksum :-)
	moveq #$e0/4-1-1,d0
	tst.b hddrive-base(a6)
	beq.b makehd0
	move.l #$3b9849bb,d1	;hd chksum :-)
	moveq #$1bc/4-1-1,d0
makehd0:move.l d1,(a1)+
	moveq #-1,d1
makebm: move.l d1,(a1)+
	dbf d0,makebm
	moveq #$3f,d0
	tst.b hddrive-base(a6)
	bne.b makehd
	move.b d0,$272(a0)	;root
makehd:	move.b d0,$2dc(a0)	;unused
	lea carbeer(pc),a1	;16! chr
	lea $3f0(a0),a0		;end of bitmap
	bsr.w txttobuf
nocyl40:lea linebuf+1-base(a6),a0
	lea formtxt(pc),a1
	bsr txttobuf
	btst #0,d5
	beq.b low
	addq.b #1,-(a0)		;"1"
low:
	move.b d5,d0
	lsr.b  #1,d0
	lea linebuf+18-base(a6),a0
	bsr.w bytetod
	bsr rawline
	bsr.w csup

	bsr writeit		;sets dskerr
	bsr.w stepdel		;wait >1.2 ms before sel/step/...

	lea fabotxt(pc),a1
	tst.b dskerr-base(a6)
	bne.b frm8		;disk removed, abort

	cmp.w #80,d5
	bne.b noclrb

	lea dostrkbuf-base(a6),a0
	move.w #512/4*2-1,d0
	moveq #0,d1
clrbtrk:move.l d1,(a0)+		;clr 2 sectors
	dbf d0,clrbtrk

	tst.b d6		;quick?
	beq.b nokwik
	moveq #1,d5		;next cyl: 0
nokwik:
noclrb:	bsr.w stopit
	beq.b frm8
	dbf d5,frm0
	lea fcpltxt(pc),a1
frm8:	bsr.w msgout
frm7:	bsr.w motoff
	st d7
frmq:	rts
carbeer:dc.b "CarnivoreBeerMon"!$80		;16! chrs

bootb13:dc.w boot13len		;wb 1.3 bootblock
	dc.l 0			;checksum
	dc.l 880
	lea doscod0(pc),a1
	jsr FindResident(a6)
	tst.l d0
	beq.b doscod1
	move.l d0,a0
	move.l $16(a0),a0
	moveq #0,d0
doscod2:rts
doscod1:moveq #-1,d0
	bra.b doscod2
doscod0:dc.b "dos.library",0
	dc.w 0
	dc.l "BEER"
boot13len=*-bootb13-3	;dbf,size.w

bootb20:dc.w boot20len		;wb 2.0 bootblock (ofs/ffs)
	dc.l 0
	dc.l 880
	lea expname(pc),a1
	moveq #37,d0
	jsr OpenLibrary(a6)
	tst.l d0
	beq.b no20exp
	move.l d0,a1
	bset #6,$22(a1)
	jsr CloseLibrary(a6)
no20exp:lea dos20nm(pc),a1
	jsr FindResident(a6)
	tst.l d0
	beq.b no20res
	move.l d0,a0
	move.l $16(a0),a0
	moveq #0,d0
	rts
no20res:moveq #-$1,d0
	rts
dos20nm:dc.b "dos.library",0
expname:dc.b "expansion.library",0
	dc.w 0
	dc.l "BEER"
boot20len=*-bootb20-3	;dbf,size.w

install:subq.b #1,d3
	bmi.b usetype	;no para
	bne.w instq	

	move.l dosofs-base(a6),d4
	lea bootb13+2(pc),a5	;wb 1.3 ofs bb
	move.l para-base(a6),d0
	moveq #4,d1
	cmp.l d1,d0
	bhi.w instq
	beq.b bootok
	move.b d0,d4
usetype:lea bootb20+2(pc),a5	;wb 2.0 bb
bootok:

	st wrcmd-base(a6)	; we want to load/save tracks
	bsr.w motondt		;stays selected
	bsr.w stepup
	bsr.w stepdwn
	sf dskerr-base(a6)
	bsr.w trk0
	tst.b dskerr-base(a6)
	bne.w inst7
	sf truebuf-base(a6)
	clr.l secinbuf-base(a6)
	move.b wrcmd-base(a6),wrflag-base(a6)
	bsr.w testindrive
	bne.w inst7

	lea rootblk-base(a6),a4
	tst.b d3
	bpl.b inst8		;para given?
	move.l a4,d6
	moveq #0,d5		;bootblock
	bsr.w getsec
	tst.b dskerr-base(a6)
	bne.b inst7
	move.l (a4),d4		;maintain dostype
	moveq #-4,d0
	and.l d4,d0
	cmp.l dosofs-base(a6),d0	;dostype unknown
	beq.b inst8	
	bsr.w nodos	;disk in drive...
	bra.b inst7
inst8:
	move.l a4,a0
	moveq #$400/4/2-1,d0
clrboot:clr.l (a0)+	
	clr.l (a0)+
	dbf d0,clrboot

	move.l a4,a1
	move.l d4,(a1)+		;dostype
	move.w -2(a5),d0	;size-1
dcodcpy:move.b (a5)+,(a1)+
	dbf d0,dcodcpy
	
	move.l a4,a0
	bsr.w bootsum
	move.l -(a1),4(a0)
	move.l d3,(a1)

	move.l a4,d6
	moveq #0,d5
	bsr.w putsec		;d5.l:blk,d6:adr
	tst.b dskerr-base(a6)
	bne.b inst7
	lea $200(a4),a0
	move.l a0,d6
	moveq #1,d5
	bsr.w putsec		;d5.l:blk,d6:adr
	tst.b dskerr-base(a6)
	bne.b inst7

	bsr.w updatedisk
	tst.b dskerr-base(a6)
	bne.b inst7
	
	lea insttxt(pc),a1
	bsr.w msgout
inst7:	bsr.w motoff		;deselect
	st d7
instq:	rts

config:	lea conftxt(pc),a1
	bsr.w msgout

	lea $200000,a4	;8mb area
	lea $e90000,a5	;board area

	sf d6	
nextbd:	lea $e8000c,a3	;must be 0
	bsr.w getcnf
	bne.w noboard
	lea $e80010,a3	;manufacturer
	bsr.w getcnf4
	tst.l d0	;=0?
	beq.w noboard

	lea $e80000,a3		;config area
	bsr.w getcnf
	not.b d0		;invert bits
	move.w d0,d5
	add.b d5,d5
	lea unkntxt(pc),a1	;type 00,01
	bcc.b bdtxt
	add.b d5,d5
	lea zorro3(pc),a1	;type 10
	bcc.b bdtxt
	lea zorro2(pc),a1	;type 11
bdtxt:	lea linebuf+1-base(a6),a0
	bsr.w txttobuf

	lea linebuf+35-base(a6),a0
	and.w #%111,d0
	bne.b no8mb
	moveq #%1000,d0
no8mb:	moveq #5,d1
	add.w d0,d1
	moveq #0,d0
	bset d1,d0
	move.l d0,d2		;size
	mulu #$400,d2
	moveq #"K",d1
	cmp.w #512,d0
	bls.b nomeg
	moveq #"M",d1
	rol.w #6,d0
nomeg:	bsr.w hextod		;boardsize
	move.b d1,(a0)+

	lea linebuf+48-base(a6),a0
	bsr.w getcnf		;product
	bsr.w bytetoa_

	lea linebuf+41-base(a6),a0
	bsr.w getcnf
	bsr.w bytetoa_
	move.l #" ram",d3
	btst #7,d0
	bne.b to8mb
	move.l #" hd ",d3
	move.l a5,d0
	add.l d2,a5
	move.l a5,d1
	bra.b toboard
to8mb:	move.l a4,d0
	add.l d2,a4
	move.l a4,d1
toboard:move.l d0,d2		;startaddr
	lea linebuf+10-base(a6),a0
	move.l d3,(a0)+
	addq.w #1,a0
	subq.l #1,d1		;$xxxx0000-$xxyyffff
	bsr.w twolong_

	swap.w d2		;000000xy
	lsl.w #8,d2		;0000xy00
	move.w d2,d0		;----xy00
	lsl.w #4,d0		;----y000
	swap d2			;xy000000
	move.w d0,d2		;xy00y000	the config value
				;    ^ official
				; ^supra bugsync needs it here

	addq.w #4,a3		;skip c/e

	lea linebuf+54-base(a6),a0
	bsr.b getcnf2		;manufacturer
	bsr.w wordtoa_
	addq.w #1,a0
	bsr.b getcnf4		;serial#
	bsr.w longtoa_
	addq.w #1,a0
	bsr.b getcnf2		;rom offset
	bsr.w wordtoa_
	move.w d2,$e8004a	;config board,low nibble
	swap d2
	move.w d2,$e80048	;high nibble
	st d6
	pea nextbd(pc)		;config next board
	bra.w rawline

noboard:tst.b d6
	bne.b endbd
	lea nobdtxt(pc),a1
	bsr.w msgout
endbd:	st d7
	rts
	
getcnf4:bsr.b getcnf2
	swap d0
getcnf2:bsr.b getcnf
	lsl.w #8,d0
	move.w d0,-(a7)
	bsr.b getcnf
	or.w (a7)+,d0
	rts
getcnf:	move.w (a3)+,d0
	and.w #$f000,d0
	lsr.w #8,d0
	move.w d0,-(a7)
	move.w (a3)+,d0
	and.w #$f000,d0
	rol.w #4,d0
	or.w (a7)+,d0
	not.b d0
	rts

smd2q:	rts	
smd2raw:subq.l #1,d3
	bne.b smd2q
	move.l para-base(a6),d5
	btst #0,d5
	bne.b smd2q
	sf fami-base(a6)
	move.l d5,a0
	bsr.b smdhead
	beq.b smd2q
	lea $200(a0),a3
	move.l d5,a5
smdcv3:	lea linebuf+1-base(a6),a0
	lea smdxfer(pc),a1
	bsr.w txttobuf
	move.l a5,d0
	bsr.w longtoa_
	lea smdtogo(pc),a1
	bsr.w txttobuf
	move.b d6,d0
	bsr.w bytetoa_
	bsr.w rawline
	bsr.w csup

	lea dostrkbuf-base(a6),a4	;$2000 bytes used
	move.w #$1ff,d4
smdcv1:	movem.l (a3)+,d0-d3
	movem.l d0-d3,(a4)
	lea $10(a4),a4
	dbf d4,smdcv1
	lea dostrkbuf-base(a6),a4
	move.w #$1fff,d4
smdcv2:	move.b (a3)+,d0
	lsl.w #8,d0
	move.b (a4)+,d0
	move.w d0,(a5)+
	dbf d4,smdcv2
	subq.b #1,d6
	bne.b smdcv3
	moveq #$200/4-1,d0
smdcv4:	move.l mask55-base(a6),(a5)+	;invalidate buffer
	dbf d0,smdcv4
	lea smdcvco(pc),a1
	bra.w msgout
smdhead:st d7
;	cmp.w #$aabb,8(a0)	;obsolete
;	bne.b smdp1
	move.b (a0),d6		;number of blocks
	bne.b smdp2
smdp1:	lea smdinva(pc),a1
	bsr.w msgout
	moveq #0,d0
smdp2:	rts		;beq.b error
rawplay:sf fami-base(a6)
	st smdraw-base(a6)
	subq.l #1,d3
	bne.w smdpq
	move.l para-base(a6),d5
	btst #0,d5
	bne.w smdpq
	lea rootblk+$200-base(a6),a0
	moveq #512/4-1,d0
rawpl0:	clr.l -(a0)
	dbf d0,rawpl0	
	move.w #$0003,(a0)
	move.l #$aabb0600,8(a0)
	move.l d5,a1
	move.l $1a4(a1),d6
	addq.l #1,d6		;romlen?
	moveq #14,d1
	lsr.l d1,d6		;# blocks
	move.b d6,(a0)
	bra.b smdply0

famplay:st fami-base(a6)
	bra.b smdply2
smdplay:sf fami-base(a6)
smdply2:sf smdraw-base(a6)
	subq.l #1,d3
	bne.w smdpq
	move.l para-base(a6),d5
	btst #0,d5
	bne.w smdpq

	move.l d5,a0
	bsr.w smdhead
	beq.w smdpq

smdply0:move.b $bfd200,d0
	and.b #$f8,d0
	or.b #4,d0
	move.b d0,$bfd200
	st $bfe301
	move.l a7,a5		;exit sp :-)
	move.w #$dc00,d1
	move.l #$200,d2
	tst.b smdraw-base(a6)
	bne.b smdply1
	add.l d2,d5		;bufptr
	tst.b fami-base(a6)
	bne.b famply0
smdply1:bsr.w sendblk		;a0:sendbuffer
	lea smdmisc-base(a6),a0
	sf (a0)
	move.w #$2001,d1
	moveq #1,d2
	bsr.w sendblk
famply0:clr.w smdcnt-base(a6)
smdp3:	bsr.w stopit
	lea smdabor(pc),a1
	beq.w smdperr
	lea linebuf+1-base(a6),a0
	lea smdxfer(pc),a1
	bsr.w txttobuf
	move.l d5,d0
	bsr.w longtoa_
	lea smdtogo(pc),a1
	bsr.w txttobuf
	move.b d6,d0
	bsr.w bytetoa_
	bsr.w rawline
	bsr.w csup
	move.w smdcnt-base(a6),d0
	bsr.b sendpre
	move.l d5,a0
	move.w #$8000,d1
	move.l #$2000,d2
	tst.b fami-base(a6)
	bne.b famply3
	add.l d2,d2
famply3:add.l d2,d5		;bufptr
	bsr.w blksend
	addq.w #1,smdcnt-base(a6)
	subq.b #1,d6
	bne.b smdp3
	tst.b fami-base(a6)
	beq.b smdply3
	move.l para-base(a6),a0
	move.w #$400,d1
	move.w #$200,d2
	bsr.w sendblk
	moveq #6,d0
	move.b 2(a0),d1
	lsl.w #8,d1
	or.b #1,d1
	moveq #0,d2
	bsr.b send02
	bra.b famply2
smdply3:lea smdmisc-base(a6),a0
	move.b #3,(a0)
	move.w #$2001,d1
	move.w #1,d2
	bsr.w sendblk
famply2:lea smdcomp(pc),a1
smdperr:bsr.w msgout
	st d7
smdpq:	rts

;	movem.l	d0/d3/d4,-(a7)
;	bsr.b sendini
;	move.w	d0,d1
;	moveq	#4,d0
;	bra.b	lbC000282
sendpre:movem.l	d0/d3/d4,-(a7)
	moveq	#0,d1
	move.b	d0,d1
	moveq	#5,d0
lbC000282:	moveq #0,d2
	bsr.b send02
	movem.l (a7)+,d0/d3/d4
	rts

send02:	movem.l	d3/d4,-(a7)	;init,d0.b,d1.w,d2.w,crc.b
	bsr.b sendini
	moveq #$ffffff81,d3	;chksum
	move.b d0,d4
	bsr.b sendmeg
	move.w d1,d4
	bsr.b sendmeg
	lsr.w #8,d4
	bsr.b sendmeg
	move.w d2,d4
	bsr.b sendmeg
	lsr.w #8,d4
	bsr.b sendmeg
	move.b d3,d4		;chksum
	bsr.b sendmeg
	movem.l	(a7)+,d3/d4
	rts
sendini:moveq #$ffffffd5,d4
	bsr.b sendmeg
	moveq #$ffffffaa,d4
	bsr.b sendmeg
	moveq #$ffffff96,d4
sendmeg:eor.b d4,d3
	move.l #$400000,d7
shake:	subq.l #1,d7
	beq.b noshake
	btst #0,$bfd000
	bne.b shake
	move.b d4,$bfe101
	eor.b #4,$bfd000
	rts
noshake:move.l a5,a7
	lea smdtime(pc),a1
	bra.w smdperr

blksend:movem.l	d0-d4/a0,-(a7)
	moveq #0,d0
	tst.b smdraw-base(a6)
	beq.b sendit
	bsr.b send02
	moveq #$ffffff81,d3
	bsr.b blksnd0
	lea -$4001(a0),a0	;adjust to highbyte
	pea sendit2(pc)		;continue with crc
blksnd0:move.w #$1fff,d2
sendlp1:addq.w #1,a0		;lowbytes first
	move.b (a0)+,d4
	bsr.b sendmeg
	dbf d2,sendlp1
	rts

;	movem.l	d0-d4/a0,-(a7)
;	moveq	#2,d0
;	bra.b sendit
sendblk:movem.l d0-d4/a0,-(a7)
	moveq #0,d0
sendit:	bsr.w send02
	subq.w	#1,d2
	moveq #$ffffff81,d3
sendlp0:move.b (a0)+,d4
	bsr.b sendmeg
	dbf d2,sendlp0
sendit2:move.b d3,d4	;crc
	bsr.b sendmeg
	movem.l	(a7)+,d0-d4/a0
	rts


i:	tst.b d3
	bne.w iq

	lea linebuf+1-base(a6),a0	;info about agnus regs/cpu vectors
	lea $dff096,a1
	move.l a1,d0
	bsr.w adrtoa_
	moveq #":",d4
	move.b d4,(a0)+
	move.w rdff002-base(a6),d0
	bsr.w wordtoa_

	addq.w #2,a0
	addq.w #4,a1		;$dff09a
	move.l a1,d0
	bsr.w adrtoa_
	move.b d4,(a0)+
	move.w rdff01c-base(a6),d0
	bsr.w wordtoa_

	addq.w #2,a0
	addq.w #2,a1		;$dff09c
	move.l a1,d0
	bsr.w adrtoa_
	move.b d4,(a0)+
	move.w rdff01e-base(a6),d0
	bsr.w wordtoa_

	addq.w #2,a0
	addq.w #2,a1		;$dff09e
	move.l a1,d0
	bsr.w adrtoa_
	move.b d4,(a0)+
	move.w rdff010-base(a6),d0
	bsr.w wordtoa_
	bsr.w rawline
	bsr.w csdown

	lea intvecs-base(a6),a1		;$0-$1f,$20-$3f...
	moveq #8-1,d3
i1:	addq.w #1,a0
	moveq #7,d0
	sub.l d3,d0
	lsl.l #5,d0
	bsr.w wordtoa
	move.b #":",(a0)+
	moveq #8-1,d2
i0:	addq.w #1,a0
	move.l (a1)+,d0
	bsr.w longtoa
	dbf d2,i0	
	bsr.w rawline
	dbf d3,i1
	st d7
iq:	rts

p:	cmp.b #2,d3
	bcs.w pq
	cmp.b #3,d3
	bhi.w pq
	beq.b p2
	move.w #256,para+10-base(a6)	;default period
p2:	moveq #0,d0
	btst d0,para+3-base(a6)
	bne.b pq
	btst d0,para+7-base(a6)
	bne.b pq

	move.l para-base(a6),d0
	cmp.l para+4-base(a6),d0
	bcc.b pq

	cmp.l himem-base(a6),d0	;sound in chipmem!
	bcc.b pq
	move.l para+4-base(a6),d1
	cmp.l himem-base(a6),d1
	bhi.b pq

	move.l #$80808080,$dff09a

p0:	bsr.b sndpos
p3:	cmp.b #$1b,ascii-base(a6)
	beq.b p1
	tst.l para+4-base(a6)
	bne.b p0
	btst #7,$dff01f
	beq.b p0
p1:	move.l #$00800080,$dff09a
	move.w #$0003,$dff096
	bsr.b sndpos
	bsr.w csdown
	st d7
pq:	rts
sndpos:	lea linebuf+1-base(a6),a0
	lea sndtxt(pc),a1
	bsr.w txttobuf
	move.l para-base(a6),d0
	bsr.w adrtoa_		;chipmem, use only 24 bit
	bsr.w rawline
	bra.w csup
	
g:	cmp.b #1,d3
	bne.w gq

	move.l para-base(a6),d0
	btst #0,d0
	bne.w gq

	lea mmuoffb(pc),a0
	bsr.w mmujob
	move.l d0,bmmmutc-base(a6)
	bsr.w dobrkp		;insert bp

	bsr.w loadmmu
	bsr.w loadfpu

	move #$3700,sr		;use isp|(68020+:msp)
	move.l regs+64+8-base(a6),a7	;msp
	move #$2700,sr		;use isp
	move.l regs+64+4-base(a6),a7	;isp

	tst.b cpu-base(a6)	;68010+ ?
	beq.b nomsp2
	move.l regs+64+12-base(a6),a5	;vbr
	dc.l movec_a5.vbr
	move.b sfcdfc-base(a6),d0
	dc.l movec_d0.sfc
	move.b sfcdfc+1-base(a6),d0
	dc.l movec_d0.dfc
	cmp.b #2,cpu-base(a6)	;68020+ ?
	bcs.b nomsp2

	move.l regs+64+16-base(a6),a5	;cacr
	dc.l movec_a5.cacr
	bsr.w pushcache

	cmp.b #4,cpu-base(a6)		;68040?
	beq.b nomsp2
	move.l regs+64+20-base(a6),a5	;caar
	dc.l movec_a5.caar
nomsp2:	move.l regs+64-base(a6),a0	;usp
	move.l a0,usp

	move.w regs+64+28-base(a6),d0
	and.w #$3fff,d0			;clr tracebits
	move.w d0,sr
	pea g1(pc)
	move.l para-base(a6),-(a7)
	move.w regs+64+28-base(a6),ccr
	movem.l regs-base(a6),d0-d7/a0-a6	
	rts
gg1:	add.l #4,a7
g1:	movem.l a6,-(a7)		;flags ok
	lea base(pc),a6
	movem.l d0-d7/a0-a5,regs-base(a6)
	movem.l (a7)+,a0		;a6
	movem.l a0/a7,regs+56-base(a6)	;a6/a7

	lea stackend-base(a6),a7	;lea $80000,a7 (usp|isp|msp)
	move.l a7,a3
	lea $10.w,a0		;illegal vec
	add.l vbreg-base(a6),a0
	move.l (a0),a1		;old illegal vec
	lea savereg(pc),a2	;uses d0
	movem.l a2,(a0)			;?flags ok
wrongpc:illegal				;store sr,pc,noint,go sv
	move.l a1,(a0)			;restore illegal vec
	move.l a7,regs+64+4-base(a6)	;isp
	move usp,a7
	move.l a7,regs+64-base(a6)	;usp
	move.l a3,a7

	tst.b cpu-base(a6)	;68010+ ?
	beq.b nomsp
	dc.l movec_vbr.a5	
	move.l a5,regs+64+12-base(a6)	;vbr
	dc.l movec_dfc.d0
	move.w d0,-(a7)
	dc.l movec_sfc.d0
	lsl.w #8,d0
	or.w (a7)+,d0
	move.w d0,sfcdfc-base(a6)	;sfcdfc

	cmp.b #2,cpu-base(a6)	;68020+ ?
	bcs.b nomsp
	dc.l movec_msp.a5
	move.l a5,regs+64+8-base(a6)	;msp
	dc.l movec_cacr.a5
	move.l a5,regs+64+16-base(a6)	;cacr
	cmp.b #4,cpu-base(a6)		;68040?
	beq.b nomsp
	dc.l movec_caar.a5
	move.l a5,regs+64+20-base(a6)	;caar
nomsp:	move.w regs+64+28-base(a6),d0	;start sr
	lea regs+60-base(a6),a1		;ptr start a7
	move.l (a1)+,a0			;start a7
	btst #13,d0
	beq.b fixa72			;start usermode
	addq.w #4,a1			;skip usp,set isp
	btst #12,d0
	beq.b fixa72
	addq.w #4,a1			;skip isp,set msp
fixa72:	move.l a0,(a1)

	bsr.w savemmu
	bsr.w savefpu

	lea mmuoffh(pc),a0
	bsr.b mmujob
	bsr.b dobrkp		;remove bp
	move.l bmmmutc-base(a6),d0
	lea mmurest(pc),a0
	bsr.b mmujob

	lea wrongpc(pc),a1
	cmp.l regs+64+24-base(a6),a1	;pc?
	bne.b g3
	move.l breakpc-base(a6),regs+64+24-base(a6)
g3:	bra.w warm
gq:	rts

mmujob:	tst.b mmu-base(a6)	;nommu
	beq.b mmujob0
	cmp.b #3,mmu-base(a6)	;68040mmu
	beq.b mmujob0
	lea mmujbuf-base(a6),a2 
	dc.l pmove_tc.a2
	jsr (a0)
	dc.l pmove_a2.tc
mmujob0:rts
mmuoffb:move.l (a2),d0
mmuoffh:bclr #7,(a2)
	rts
mmurest:move.l d0,(a2)
	rts
mmuonh:	bset #7,(a2)
	rts

dobrkp:	moveq #brkpnum-1,d0
	lea brkpadr-base(a6),a0
	lea brkpbuf-base(a6),a1
dbrk0:	move.l (a0)+,a2
	move.l a2,d1
	beq.b dbrk1
	move.w (a2),-(a7)
	move.w (a1),(a2)
	move.w (a7)+,(a1)+
dbrk1:	dbf d0,dbrk0
pushcache:
	cmp.b #4,cpu-base(a6)	;68040?
	bne.b dbrk4
	dc.w cpusha_bc
dbrk4:	rts
invcache:cmp.b #4,cpu-base(a6)
	bne.b invcac0
;	dc.w cinva_bc
	rts	
invcac0:cmp.b #2,cpu-base(a6)	;68020+ ?
	bcs.b dbrk2
	move.l d0,-(a7)
	dc.l movec_cacr.d0
	or.w #%0000100000001000,d0	;clr data/instr cache
	dc.l movec_d0.cacr
	move.l (a7)+,d0
dbrk2:	rts

hunk:	movem.l para-base(a6),d2/d4-d6	;start,end,(dest),(jmp)
	btst #0,d2
	bne.b hunkq
	subq.l #2,d3	;start,end
	bmi.b hunkq
	bne.b hn3
	move.l d2,d5	;dest=start
hn3:	subq.l #2,d3
	bmi.b hn0
	beq.b hn5
hunkq:	rts
hn0:	move.l d5,d6	;jmp=dest
hn5:	lea $100.w,a0
	cmp.l a0,d2
	bcs.b hunkq
	move.l d4,d3
	sub.l d2,d3	;size
	bmi.b hunkq

	move.l d3,d0	;prgbytes
	move.l d4,a0
	move.l d2,a1
hn1:	subq.l #1,d0
	bmi.b hn2
	move.b -(a0),hunkend-hunkdata(a0)	
	bra.b hn1
hn2:	lea hunkdata(pc),a0
	moveq #hunkend-hunkdata-1,d0
hn4:	move.b (a0)+,(a1)+
	dbf d0,hn4

	move.l d2,a0
	move.l d3,hunksiz+2-hunkdata(a0)	;size
	move.l d5,hunkmem+2-hunkdata(a0)	;dest
	move.l d6,hunkjmp+2-hunkdata(a0)	;jmp

	addq.l #3,d3		;size+3
	lsr.l #2,d3
	moveq #(hunkend-hunkmov)/4,d0
	add.l d0,d3
	move.l d3,hunklong1-hunkdata(a0)
	move.l d3,hunklong2-hunkdata(a0)
	lsl.l #2,d3
	add.l d2,d3
	lea (hunkmov-hunkdata).w,a3
	add.l d3,a3
	lea $3f2.w,a0
	move.l a0,(a3)+
	move.l a0,(a3)+

	lea linebuf+1-base(a6),a0
	lea objtxt(pc),a1
	bsr.w txttobuf
	move.l d2,d0
	move.l a3,d1
	bsr.w twolong_
	bsr.w rawline
	st d7
hnq:	rts
hunkdata:dc.l $3f3,0,1,0,0	;datalen=:4!
hunklong1:dc.l 0,$3e9
hunklong2:dc.l 0
hunkmov:move.l #$7fff7fff,$dff09a	;you may edit this
	move.w #$0000,$dff096		;after hunking data
hunksiz:move.l #0,d7		;sizeinbytes
	lea hunkend(pc),a4
hunkmem:lea $000000,a5		;prgdest
	lea $80000,a7		;this mostly is the USP
hunkjmp:pea $000000
	movem.w mover(pc),d0-d4
	cmp.l a5,a4
	bhi.b mvdown
	eor.w #$01f8,d2		;move.b -(a4),-(a5)
	add.l d7,a4
	add.l d7,a5
mvdown:	lea $100.w,a1		;we have MC68851/81/82 traps :-)
	movem.w d0-d4,(a1)
	jmp (a1)
	dc.b "BEER1993"		;don't change size, better nothing
mover:	subq.l #1,d7		;this is located somewhere at $100...
	bmi.b endmov
	move.b (a4)+,(a5)+
	bra.b mover
endmov:	rts		;prgstart
hunkend:

calc:	lea linebuf+1-base(a6),a0
	lea 2(a5),a3
	bsr.b getval
	move.l d0,d5

calc1:	bsr.b skipit
	beq.b calcout
	move.b (a3)+,d4

	lea calc_op(pc),a4
	lea calccpu-4(pc),a1
calc0:	move.b (a4)+,d0
	beq.w calcerr
	addq.w #4,a1
	cmp.b d4,d0
	bne.b calc0

	bsr.b getval
	move.l d0,d6
	jsr (a1)
	bra.b calc1

skipit:	cmp.b #" ",(a3)
	bne.b calc2
	addq.w #1,a3
	lea xchars(a5),a1
	cmp.l a1,a3
	bcs.b skipit		;beq.b endtxt
calc2:	rts

getval:	bsr.b skipit
	move.b (a3),d1
	cmp.b #34,d1	;"
	beq.b calc9
	cmp.b #39,d1	;'
	bne.b calc8
calc9:	addq.w #1,a3
	moveq #0,d0
	moveq #4+1-1,d2
calc10:	cmp.b (a3)+,d1
	beq.b calc11
	lsl.l #8,d0
	move.b -1(a3),d0
	dbf d2,calc10	
	addq.w #4,a7
calc11:	rts
calc8:	cmp.b #"#",(a3)
	bne.b calc3
	addq.w #1,a3
	bra.w atodlong
calc3:	bra.w atolong

calcout:move.l d5,d0
	bsr longtoa_

	bsr.w chr4buf
	dc.l " = #"
	
	move.l d5,d0
	bpl.b calc6
	move.b #"-",(a0)+
	neg.l d0
calc6:	bsr hextod

	bsr.w chr4buf
	dc.l " = %"

	move.l d5,d0
	bsr hextob

	bsr.w chr4buf
	dc.l ' = "'

	move.l d5,d0
	moveq #4-1,d1
calc7:	rol.l #8,d0
	move.b d0,(a0)+
	dbf d1,calc7
	move.b #34,(a0)+

calc4:	bsr rawline
	st d7
calcerr:rts

calc_op:dc.b '+-*!&=<>/',0
	even
calccpu:add.l	d6,d5
	rts
	sub.l	d6,d5
	rts
	muls	d6,d5
	rts
	or.l	d6,d5
	rts
	and.l	d6,d5
	rts
	eor.l	d6,d5
	rts
	lsl.l	d6,d5
	rts
	lsr.l	d6,d5
	rts
	tst.w	d6
	beq.b	calcovl
	divs	d6,d5
	bvs.b	calcovl
	ext.l	d5
	rts
calcovl:addq.w	#4,a7
	lea	calctxt(pc),a1
	bsr	txttobuf
	bra.b	calc4

r:	lea regs-base(a6),a2
	cmp.b #2,d3
	bhi.w rq
	tst.b d3
	beq.w r0

	cmp.b #1,d3
	bne.w r6

	moveq #0,d2
	moveq #4-1,d0
	bclr #5,(a0)
	cmp.b #"R",(a0)
	bne.b r7
	subq.w #3,a0		;cacr/caar
r7:	move.b (a0)+,d1
	cmp.b #" ",d1
	beq.b r8
	bclr #5,d1
	lsl.l #8,d2
	or.b d1,d2
	dbf d0,r7
r8:	lea 64(a2),a1		;uspadr
	move.l para-base(a6),d0
	cmp.l #"USP",d2
	beq.b r9
	addq.w #4,a1
	cmp.l #"ISP",d2
	beq.b r9
	addq.w #4,a1
	cmp.l #"MSP",d2
	beq.b r9
	addq.w #4,a1
	cmp.l #"VBR",d2
	beq.b r9
	addq.w #4,a1
	cmp.l #"CACR",d2
	beq.b r9b
	addq.w #4,a1
	cmp.l #"CAAR",d2
	beq.b r9b
	addq.w #4,a1
	cmp.l #"PC",d2
	bne.b r10
r9:	bclr #0,d0
r9b:	move.l d0,(a1)
r10:	moveq #7,d1
	cmp.l #"SFC",d2
	bne.b rsfc
	cmp.l d1,d0
	bhi.w rq
	move.b d0,sfcdfc-base(a6)
rsfc:	cmp.l #"SR",d2
	bne.b r0
	move.w d0,64+28(a2)
	bra.b r0

r6:	move.w para+6-base(a6),d1		;d0-a7
	cmp.w #$dfc,d1
	bne.b rrx
	move.l para-base(a6),d0
	moveq #7,d2
	cmp.l d2,d0
	bhi.w rq
	move.b d0,sfcdfc+1-base(a6)
	bra.b r0
rrx:	and.w #%1111111111111000,d1
	cmp.w #$a0,d1
	beq.b r5
	cmp.w #$d0,d1
	bne.w rq
r5:	move.w para+6-base(a6),d1
	sub.w #$d0,d1
	bcc.b r4
	add.w #$38,d1	
r4:	add.w d1,d1			;lsl.w #2,d1
	add.w d1,d1
	move.l para-base(a6),(a2,d1.w)	;write value
	cmp.w #60,d1			;a7?
	bne.b r0
	lea 64(a2),a1			;uspadr
	btst #13,64+28(a2)		;sr
	beq.b r23
	addq.w #4,a1
	btst #12,64+28(a2)		;sr
	beq.b r23
	addq.w #4,a1
r23:	move.l para-base(a6),(a1)		;store usp/isp/msp
r0:	tst.b excnum-base(a6)
	beq.b r21
	move.w exceptsr-base(a6),64+28(a2)	;sr
	move.l exceptpc-base(a6),64+24(a2)	;pc
	move.l exceptpc-base(a6),para-base(a6)

r21:	move.l 64(a2),d0	;usp
	btst #13,64+28(a2)	;a7:usp?
	beq.b r22
	move.l 64+4(a2),d0	;isp
	btst #12,64+28(a2)
	beq.b r22
	move.l 64+8(a2),d0	;msp
r22:	move.l d0,64-4(a2)	;a7

	lea linebuf-base(a6),a0
	move.l #" D0:",d4
	moveq #16-1,d6
r1:	move.l d4,(a0)+
r2:	move.l (a2)+,d0
	bsr.w longtoa
	addq.w #1,a0
	moveq #7,d0
	and.b d6,d0
	dbeq d6,r2
	bsr.w rawline
	move.l #" A0:",d4
	dbf d6,r1

	cmp.b #1,cpu-base(a6)
	beq.b r68010
	bcs.w r68000
	cmp.b #4,cpu-base(a6)		;68040?
	beq.b r68040
	move.w #" C",(a0)+		;68020+
	move.l #"AAR:",(a0)+
	move.l regs+64+20-base(a6),d0	;caar
	bsr longtoa
r68040:	addq.w #2,a0
	move.l #"MSP:",(a0)+
	move.l regs+64+8-base(a6),d0		;msp
	bsr longtoa
r68010:	addq.w #2,a0			;68010+
	move.l #"VBR:",(a0)+
	move.l regs+64+12-base(a6),d0	;vbr
	bsr longtoa
	addq.w #3,a0	
	bsr.w chr4buf
	dc.l "SFC:"
	moveq #"0",d0
	add.b sfcdfc-base(a6),d0
	move.b d0,(a0)+
	addq.w #1,a0
	bsr.w chr4buf
	dc.l "DFC:"
	moveq #"0",d0
	add.b sfcdfc+1-base(a6),d0
	move.b d0,(a0)+
	bsr.w rawline

	cmp.b #1,cpu-base(a6)
	bls.b r68000
	move.w #" C",(a0)+		;68020+
	move.l #"ACR:",(a0)+
	move.l regs+64+16-base(a6),d0	;cacr
	move.l d0,d2			;bitcacr
	bsr.w longtoa
	addq.w #2,a0
	bsr.w cacrbit
	bsr.w rawline

r68000:	addq.w #2,a0
	move.l #"USP:",(a0)+
	move.l regs+64-base(a6),d0		;usp
	bsr longtoa
	addq.w #2,a0
	move.l #"ISP:",(a0)+
	move.l regs+64+4-base(a6),d0		;isp
	bsr longtoa
	addq.w #2,a0
	move.l #" SR:",(a0)+
	move.w regs+64+28-base(a6),d0	;sr
	move.w d0,d2
	bsr wordtoa
	addq.w #2,a0

	move.b #"T",(a0)+
	moveq #"1",d0
	moveq #15,d3
	bsr.w bitstat		;15
	cmp.b #1,cpu-base(a6)
	bls.b rbs1
	move.b #"T",(a0)+	;68020+
	moveq #"0",d0
	bsr.w bitstat		;14
rbs1:	moveq #13,d3
	moveq #"S",d0
	bsr.w bitstat		;13
	cmp.b #1,cpu-base(a6)
	bls.b rbs0
	moveq #"M",d0		;68020+
	bsr.w bitstat		;12
rbs0:	moveq #4,d3
	moveq #"X",d0
	bsr.w bitstat		;4
	moveq #"N",d0
	bsr.w bitstat		;3
	moveq #"Z",d0
	bsr.w bitstat		;2
	moveq #"V",d0
	bsr.w bitstat		;1
	moveq #"C",d0
	bsr.w bitstat		;0
	bsr.w rawline

rbp0:	cmp.b #3,excnum-base(a6)	;illegal instr|bp?
	bne.b rbp1
	lea brkpadr-base(a6),a0
	move.l exceptpc-base(a6),d1
	moveq #brkpnum-1,d0
rbp2:	cmp.l (a0)+,d1
	bne.b rbp3
	lea brktxt(pc),a1
	lea linebuf+1-base(a6),a0
	bsr.w txttobuf
	bra.b rexc1
rbp3:	dbf d0,rbp2

rbp1:	move.b excnum-base(a6),d0
	beq.b r14
	lea linebuf+1-base(a6),a0
	lea exctxt(pc),a1
	cmp.b (a1)+,d0
	bsr.w indextx
	lea excext(pc),a1
	move.b -(a0),d0
	cmp.b (a1),d0
	bhi.b rexc1
	move.b #" ",(a0)
	cmp.b (a1)+,d0
	bsr.w indextx
rexc1:
	cmp.b #2,excnum-base(a6)	;adr err
	bne.b r18
	lea linebuf+29-base(a6),a0
	move.w excinstr-base(a6),d0
	bsr.w wordtoa
	lea linebuf+43-base(a6),a0
	move.l excadr-base(a6),d0
	bsr.w longtoa_
r18:	bsr.w rawline
	sf excnum-base(a6)

r14:	move.l regs+64+24-base(a6),a5	;pc
	bsr.w disasm
	bsr.w rawline

	st d7
rq:	rts
bitstat:move.b d0,(a0)+
bitcacr:move.b #"=",(a0)+
	btst d3,d2		;d2:sr,d3:bit#
	seq (a0)
	add.b #"1",(a0)
	addq.w #2,a0
	subq.b #1,d3	
	rts

cacrbit:cmp.b #4,cpu-base(a6)
	beq.b cacr40
	moveq #3,d3		;ci
	lea cacrtx2(pc),a1
	cmp.b #2,cpu-base(a6)	;68020
	beq.b bitlp0
	lea cacrtxt(pc),a1
	moveq #13,d3		;wa
bitlp0:	bsr.b txttst
	bmi.b endcacr
	cmp.b #7,d3		;wa-ed
	bne.b bitlp0
	subq.b #3,d3		;ibe-ei
	bra.b bitlp0
endcacr:rts
cacr40:	moveq #31,d3
	lea cacrtx3(pc),a1
	bsr.b txttst
	moveq #15,d3
txttst:	bsr.w txttobuf
	bra.b bitcacr
fpcrbit:lea fpcrtxt(pc),a1
	moveq #15,d3		;bsun
bitlp1:	bsr.b txttst
	cmp.b #7,d3		;bsun-inex2,prec-rnd
	bne.b bitlp1
	rts
fpsrbit:lea fpsrtxt(pc),a1
	moveq #27,d3		;n
bitlp2:	bsr.b txttst
	cmp.b #2,d3		;iop-inex
	beq.b endfpsr
	cmp.b #22,d3		;n-s
	bne.b bitlp2
	bsr.w chr2buf
	dc.w "Q="
	move.l d2,d0
	swap d0
	moveq #%01111111,d1
	and.l d1,d0
	bsr.w bytetoa
	addq.w #1,a0
	sub.b #15,d3		;iop-inex
	bra.b bitlp2
endfpsr:rts
mttxbit:lea mttxtxt(pc),a1
	bsr.w txttobuf		;31-24
	move.l d2,d0
	rol.l #8,d0
	bsr.w bytetoa
	bsr.w txttobuf		;23-16
	rol.l #8,d0
	bsr.w bytetoa
	addq.w #1,a0
	moveq #15,d3		;e
	moveq #"E",d0
	bsr.w bitstat
	moveq #10,d3		;ci
bitlp3:	bsr.w txttobuf
	bsr.w bitcacr
	cmp.b #7,d3		;ci-rwm
	bne.b bitlp3
	bsr.w txttobuf
	moveq #%1110000,d0	;fc
	and.l d2,d0
	lsr.b #4,d0
	bsr.w nibtoa
	bsr.w txttobuf
	moveq #%111,d0		;fcm
	and.l d2,d0
	bra.w nibtoa
mtcbit:	lea mtctxt(pc),a1
	moveq #31,d3		;e
	moveq #"E",d0
	bsr.w bitstat
	moveq #25,d3		;sre
	bsr.w txttobuf
	bsr.w bitcacr
	bsr.w txttobuf		;fcl
	bsr.w bitcacr
	bsr.w txttobuf		;ps
	move.l d2,d0
	swap d0
	and.w #%01110000,d0
	lsr.w #2,d0
	move.b mmups+0(pc,d0.w),(a0)+
	move.b mmups+1(pc,d0.w),(a0)+
	move.b mmups+2(pc,d0.w),(a0)+
	move.b mmups+3(pc,d0.w),(a0)+
	moveq #5-1,d3		;is,tia-tid
	move.l d2,d0
	swap d0			;19-16:3-0
mtcb0:	bsr.w txttobuf
	bsr.w nibtod
	rol.l #4,d0		;15-12
	dbf d3,mtcb0
	rts
mmups:	dc.l "256B","512B","1 KB","2 KB","4 KB","8 KB","16KB","32KB"

cacrtxt:dc.b "WA"!$80,"DBE"!$80,"CD"!$80,"CED"!$80
	dc.b "FD"!$80,"ED"!$80,"IBE"!$80
cacrtx2:dc.b "CI"!$80
	dc.b "CEI"!$80,"FI"!$80,"EI"!$80
cacrtx3:dc.b "DE"!$80,"IE"!$80
fpcrtxt:dc.b "BSUN"!$80,"SNAN"!$80,"OPERR"!$80,"OVFL"!$80,"UNFL"!$80
	dc.b "DZ"!$80,"INEX1"!$80,"INEX2"!$80
fpsrtxt:dc.b "N"!$80,"Z"!$80,"I"!$80,"NAN"!$80,"S"!$80
	dc.b "IOP"!$80,"OVFL"!$80,"UNFL"!$80,"DZ"!$80,"INEX"!$80
mttxtxt:dc.b "LAB="!$80," LAM="!$80,"CI"!$80,"R/W"!$80,"RWM"!$80
	dc.b "FC="!$80," FCM="!$80
mtctxt:	dc.b "SRE"!$80,"FCL"!$80,"PS="!$80," IS="!$80
	dc.b " TIA="!$80," TIB="!$80," TIC="!$80," TID="!$80
	even

rfpu:	lea fpuregs-base(a6),a2
	tst.b d3
	bne.w rfpuq
rf0:	move.l #"FP0:",d4
	moveq #8-1,d2		;8 regs
rf1:	moveq #12/2-1,d1	;80+16 bit
	lea linebuf+2-base(a6),a0
	move.l d4,(a0)+
	move.l a2,a3
rf2:	move.w (a2)+,d0
	bsr.w wordtoa
	dbf d1,rf2
	addq.w #2,a0
	bsr.w realtoa
	bsr.w rawline
	add.w #$100,d4
	dbf d2,rf1

	move.w #" F",(a0)+
	move.l #"PCR:",(a0)+
	move.l fpcr-base(a6),d2
	move.l d2,d0		;fpcrbit
	bsr.w wordtoa		;upper word=0

	addq.w #1,a0		;even
	move.b #"P",(a0)+
	move.l #"REC=",(a0)+

	moveq #0,d0
	move.b d2,d0
	lsr.w #6,d0		;prec
	move.b fprec(pc,d0.w),(a0)+

	addq.w #1,a0		;even
	move.l #"RND=",(a0)+

	moveq #%00110000,d0
	and.w d2,d0
	lsr.w #4,d0		;rnd
	move.b frnd(pc,d0.w),(a0)+	

	addq.w #1,a0
	
	bsr.w fpcrbit		;exception enable
	bsr.w rawline

	move.w #" F",(a0)+
	move.l #"PSR:",(a0)+
	move.l fpsr-base(a6),d2
	move.l d2,d0
	bsr.w longtoa

	lea linebuf+24-base(a6),a0
	bsr.w fpcrbit		;exception status
	bsr.w rawline

	move.w #"FP",(a0)+
	move.l #"IAR:",(a0)+
	move.l fpiar-base(a6),d0
	bsr.w longtoa

	addq.w #8,a0
	move.l fpsr-base(a6),d2
	bsr.w fpsrbit
	bsr.w rawline

	st d7
rfpuq:	rts
fprec:	dc.b "XSD?"
frnd:	dc.b "NZMP"

realtoa:tst.b fpu-base(a6)
	lea nofpu(pc),a1
	beq.b fpnan
	cmp.b #3,fpu-base(a6)	;68040fpu ?
	beq.w endfp		;no scientific notation

	dc.l fmove.x_a3.fp0
	lea bcdbuf-base(a6),a3
	dc.l fmove.p_fp0.a3

	moveq #" ",d0
	tst.b (a3)
	bpl.b fppos
	moveq #"-",d0
fppos:	move.b d0,(a0)+
	move.w (a3)+,d0
	ori.w #$8000,d0
	addq.w #1,d0
	bne.b fpok
	addq.w #2,a3
	lea nan(pc),a1
	btst #6,(a3)
	bne.b fpnan
	move.l (a3)+,d1
	lea infin(pc),a1
	or.l (a3),d1
	beq.b fpnan
	lea snan(pc),a1
fpnan:	bsr.w txttobuf
	bra.b endfp
	
fpok:	addq.w	#1,a3
	move.b (a3)+,d0
	bsr.w nibtoa
	move.b #".",(a0)+
	moveq #8-1,d1
fpman0:	move.b (a3),d0
	lsr.b #4,d0
	bsr.w nibtoa
	move.b (a3)+,d0
	bsr.w nibtoa
	dbf d1,fpman0
	move.b #"E",(a0)+

	lea bcdbuf-base(a6),a3
	moveq #"+",d0
	btst #6,(a3)
	beq.b fppos1
	moveq #"-",d0
fppos1:	move.b d0,(a0)+

	dc.l fmove_fpsr.d1
	moveq #0,d0
	btst #13,d1
	beq.b nooperr
	move.b 2(a3),d0
	lsr.b #4,d0
nooperr:bsr.w nibtoa
	move.b (a3)+,d0
	bsr.w nibtoa
	move.b (a3),d0
	lsr.b #4,d0
	bsr.w nibtoa
	move.b (a3),d0
	bsr.w nibtoa
endfp:	rts
nofpu:	dc.b "No FPU!"!$80
snan:	dc.b "S"
nan:	dc.b "NAN"!$80
infin:	dc.b "INFINITY"!$80
	even

settt0:	moveq #mmutt0-mmutt0,d0
	bra.b setmmu1
settt1:	moveq #mmutt1-mmutt0,d0
	bra.b setmmu1
settc:	moveq #mmutc-mmutt0,d0
	bra.b setmmu1
setmusr:moveq #mmusr-mmutt0,d0
	moveq #-1,d1	;1 word para
	bra.b setmmu
setsrp:	moveq #mmusrp-mmutt0,d0
	bra.b setmmu2
setcrp:	moveq #mmucrp-mmutt0,d0
	bra.b setmmu2
setdrp:	cmp.b #1,mmu-base(a6)
	lea nmmutx1(pc),a1
	bne.b setmmue
	moveq #mmudrp-mmutt0,d0
;	bra.b setmmu2
setmmu2:moveq #2,d1
	bra.b setmmu
setmmu1:moveq #1,d1	;1 lw para
setmmu:	lea nmmutxt(pc),a1	;no mmu
	tst.b mmu-base(a6)
	beq.b setmmue
	lea nmmutx2(pc),a1	;not supported
	cmp.b #3,mmu-base(a6)
	beq.b setmmue

	movem.l para-base(a6),d4-d5
	lea mmutt0-base(a6),a0
	add.l d0,a0
	move.l d3,d0

	subq.l #1,d0	;1 para?
	bne.b setmmn1
	cmp.l d1,d3
	bne.b setmmn0
	move.l d4,(a0)
	bra.b setmmu4
setmmn0:addq.l #1,d1
	bne.b setmmuq
	move.w d4,(a0)
	bra.b setmmu4
setmmn1:subq.l #1,d0	;2 para?
	bne.b setmmuq
	cmp.l d1,d3
	bne.b setmmuq
	movem.l d4-d5,(a0)

setmmu4:bsr loadmmu
	bra.b rmmuout

setmmue:bsr msgout
	st d7
setmmuq:rts
rmmu:	tst.b d3
	bne.b setmmuq	;rmmuq
rmmuout:bsr savemmu

	st d7
	tst.b mmu-base(a6)
	lea nmmutxt(pc),a1
	beq.w msgout
	cmp.b #3,mmu-base(a6)
	lea nmmutx2(pc),a1
	beq.w msgout

	lea mmutt0-base(a6),a2
	move.l #"TT0:",d4
	moveq #2-1,d5		;2 regs
rm1:	lea linebuf+2-base(a6),a0
	move.l d4,(a0)+
	move.l (a2),d0
	bsr.w longtoa
	addq.w #2,a0
	move.l (a2)+,d2
	bsr.w mttxbit
	bsr.w rawline
	add.w #$100,d4
	dbf d5,rm1

	addq.w #2,a0
	move.l #" TC:",(a0)+
	move.l (a2),d0
	bsr.w longtoa
	addq.w #2,a0
	move.l (a2)+,d2
	bsr.w mtcbit
	bsr.w rawline

	cmp.b #1,mmu-base(a6)	;68851
	bne.b no8513
	move.l a2,-(a7)
	lea mmudrp-base(a6),a2
	move.l #"DRP:",d0
	bsr.b doXrp
	move.l (a7)+,a2
no8513:	move.l #"SRP:",d0
	bsr.b doXrp
	move.l #"CRP:",d0
	bsr.b doXrp

	move.w #"MM",(a0)+
	move.l #"USR:",(a0)+
	move.w (a2),d2
	move.w d2,d0
	bsr.w wordtoa
	addq.w #6,a0
	moveq #15,d3
	moveq #"B",d0
	bsr.w bitstat		;15
	moveq #"L",d0
	bsr.w bitstat		;14
	moveq #"S",d0
	bsr.w bitstat		;13
	subq.w #1,d3
	moveq #"W",d0
	bsr.w bitstat		;11
	moveq #"I",d0
	bsr.w bitstat		;10
	moveq #"M",d0
	bsr.w bitstat		;9
	subq.w #2,d3
	moveq #"T",d0
	bsr.w bitstat		;6
	bsr.w chr2buf
	dc.w "N="
	moveq #%111,d0	;0-7
	and.w d2,d0
	bsr.w nibtoa
	bsr.w rawline

rmmuq:	rts	
doXrp:	addq.w #2,a0
	move.l d0,(a0)+
	move.l (a2),d0
	bsr.w longtoa
	addq.w #1,a0
	move.l 4(a2),d0
	bsr.w longtoa
	addq.w #1,a0

	move.w #"L/",(a0)+	;even
	moveq #"U",d0
	moveq #15,d3
	move.w (a2)+,d2
	bsr.w bitstat
	bsr.w chr4buf
	dc.l "LMT="
	move.w #$7fff,d0
	and.w d2,d0
	bsr.w wordtoa
	bsr.w chr4buf
	dc.l " DT="
	moveq #%11,d0
	and.w (a2)+,d0
	bsr.w nibtoa	
	bsr.w chr4buf
	dc.l " TA="
	moveq #-4,d0		;%..11100
	and.l (a2)+,d0
	bsr.w longtoa
	bra.w rawline

mmuon:	lea mmuonh(pc),a0
	bra.b mmuon0
mmuoff:	lea mmuoffh(pc),a0
mmuon0:	st d7
	tst.b mmu-base(a6)
	lea nmmutxt(pc),a1
	beq.w msgout
	cmp.b #3,mmu-base(a6)
	lea nmmutx2(pc),a1
	beq.w msgout
	bra.w mmujob

ontxt:	dc.b "on "!$80
offtxt:	dc.b "off"!$80
chips:	dc.b "1MBit*1"!$80,0	;a3000/a4000 onboard chipsize
	dc.b "4MBit*4"!$80,0
	dc.b "256 K*4"!$80,0
	dc.b "1MBit*4"!$80,0
refresh:dc.b "123o"		;a3000/a4000 refresh rates
	dc.b "538f"
	dc.b "480f"
ramsey:	lea linebuf+1-base(a6),a0
	lea a3info(pc),a1
	bsr.b rtxtbuf
	move.b $de0043,d0	;version
	bsr bytetoa_
	move.b $de0003,d0
	moveq #0,d1
	lea linebuf+1+(a3stc-a3info)-base(a6),a0
	bsr.b onoff		;bit0
	addq.w #a3burst-a3stc-3,a0
	bsr.b onoff		;bit1
	addq.w #a3bwrap-a3burst-3,a0
	bsr.b onoff		;bit2
	moveq #%00011000,d1	;bit3,4
	and.w d0,d1
	addq.w #a3chips-a3bwrap-3,a0
	lea chips(pc,d1.w),a1
	bsr.b rtxtbuf
	moveq #%01100000,d1
	and.w d0,d1
	rol.b #3,d1
	lea a3refr-a3chips-7(a0),a0
	move.b refresh+0(pc,d1.w),(a0)+
	move.b refresh+4(pc,d1.w),(a0)+
	move.b refresh+8(pc,d1.w),(a0)+

rams0:	st d7
	bra rawline
onoff:	btst d1,d0
doonoff:lea ontxt(pc),a1
	bne.b ison
	addq.w #offtxt-ontxt,a1
ison:	addq.b #1,d1
rtxtbuf:bra.w txttobuf

gary:	lea $de0000,a4
	lea linebuf+1-base(a6),a0
	lea a3info2(pc),a1
	bsr.b rtxtbuf
	tst.b 1(a4)	;timeout disable
	bmi.b timdis
	addq.w #a3dsack-a3disab,a1
	tst.b (a4)	;timeout control
	bpl.b timdis
	addq.w #a3berr-a3dsack,a1
timdis:	bsr.b rtxtbuf
	lea a3kbrst(pc),a1
	bsr.b rtxtbuf
	moveq #"n",d0
	tst.b $1001(a4)	;kb reset enable
	bpl.b kbrston
	moveq #"f",d0
	move.b d0,(a0)+
kbrston:move.b d0,(a0)+
	bsr.b rtxtbuf
	lea $1002(a4),a3	;garyID
	sf (a3)			;init ID mode
	moveq #8-1,d1
garyid1:tst.b (a3)
	bpl.b garyid0
	addq.b #1,d0
garyid0:add.b d0,d0
	dbf d1,garyid1
	bsr bytetoa_
;	bsr.b rtxtbuf
;	moveq #%100,d0
;	lea $dd0004,a4		;DMAC
;	move.l d0,(a4)
;	and.l (a4),d0
;	bne.b dmacold
;	subq.w #3,a0
;	bsr.b rtxtbuf		;new
;dmacold:
	bra.w rams0

setkey:	cmp.b #1,d3
	bhi.w setkq
	tst.b d3
	beq.b setk0
	move.l para-base(a6),d0
	lea $f1.w,a0
	sub.l a0,d0
	bmi.w setkq
	lea $f10-$f1.w,a0
	cmp.l a0,d0
	bne.b setk1
	moveq #9,d0
setk1:	moveq #9,d1
	cmp.l d1,d0
	bhi.w setkq

	lea 2(a5),a2
	moveq #xchars-2-1,d1
setk8:	cmp.b #34,(a2)
	beq.b setk9
	cmp.b #39,(a2)
	beq.b setk9
	addq.w #1,a2
	dbf d1,setk8
	bra.b setkq
setk9:	move.b (a2)+,d4

	lea fkeybuf-base(a6),a0
	mulu #fkeylen,d0
	lea (a0,d0.w),a0
	moveq #fkeylen-1,d1
setk2:	cmp.b (a2),d4
	beq.b setk3
	move.b (a2)+,(a0)+
	dbf d1,setk2
setk3:	tst.w d1
	bmi.b setk0
	sf (a0)
setk0:	lea fkeybuf-base(a6),a2
	moveq #10-1,d2
setk6:	move.l a2,a1
	lea linebuf+1-base(a6),a0
	move.b #"F",(a0)+
	moveq #10,d0
	sub.b d2,d0
	bsr.w nibtod
	lea linebuf+5-base(a6),a0
	moveq #39,d0
	move.b d0,(a0)+
	moveq #fkeylen-1,d3
setk4:	move.b (a1)+,(a0)+
	dbeq d3,setk4
	bne.b setk7
	subq.w #1,a0
setk7:	move.b d0,(a0)
	lea fkeylen(a2),a2
	bsr.w rawline
	dbf d2,setk6
	st d7
setkq:	rts
color:	subq.b #2,d3
	bne.b colorq
	movem.l para-base(a6),d0-d1
	movem.w d0-d1,rgb0-base(a6)
	movem.w d0-d1,$dff180

	cmp.b #4,modeflg-base(a6)
	bne.b colorok
	bsr.w mapcol
	move.l d3,$dff180
	move.l d2,$dff188

colorok:st d7
colorq:	rts

print:	lea linebuf+1-base(a6),a0
	lea prttxt(pc),a1
	bsr.w txttobuf
	not.b prtflag-base(a6)	;toggle printer
	bra.b verif0

verify:	lea linebuf+1-base(a6),a0
	lea vfytxt(pc),a1
	bsr.w txttobuf
	bchg #4,langflg-base(a6)	;toggle verify
verif0:	bsr.w doonoff
	bsr.w rawline
	st d7
	rts


setmap:	bsr.b swapmap
	lea linebuf+1-base(a6),a0
	lea smaptxt(pc),a1
	bsr.w txttobuf
	tst.b keytab+$90-base(a6)	;german keymap?
	beq.b isusa
	subq.w #3,a0
	bsr.w txttobuf
isusa:	bsr.w rawline
	st d7
	rts

swapmap:lea keytab+$0a-base(a6),a0		;swaps german and usa keymap
	eor.l #"0ß'\"~"0-=\",(a0)
	eor.w #"tz"~"ty",$14-$0a(a0)
	eor.w #"ü+"~"[]",$1a-$0a(a0)
	eor.l #"löä#"~["l;'"*256],$28-$0a(a0)
	eor.w #"<y"~"z",$30-$0a(a0)	
	eor.w #"- "~"/ ",$3a-$0a(a0)

	eor.w #34*256+"§"~"@#",$62-$0a(a0)
	eor.l #"&/()"~"^&*(",$66-$0a(a0)
	eor.l #"=?`|"~")_+|",$6a-$0a(a0)
	eor.w #"TZ"~"TY",$74-$0a(a0)
	eor.w #"Ü*"~"{}",$7a-$0a(a0)
	eor.l #"LÖÄ^"~['L:"'*256],$88-$0a(a0)	;$00ece65e
	eor.w #">Y"~"Z",$90-$0a(a0)
	eor.l #";:_ "~"<>? ",$98-$0a(a0)
	rts

cls:	st d7
	bra.w clrhome

bplist:	lea brkpadr-base(a6),a2
	moveq #brkpnum-1,d2
bplst0:	move.l (a2)+,d0
	beq.b bplst1
	move.l d0,a5
	bsr.w disasm
	bsr.w rawline
bplst1:	dbf d2,bplst0
	st d7
bplstq:	rts
bpset:	moveq #0,d2
	subq.b #1,d3
	bne.w bpsetq
	move.l para-base(a6),d3
	beq.w bpsetq
	btst d2,d3	;even?
	bne.b bpsetq
	lea brkpadr-base(a6),a2
	moveq #brkpnum-1,d1
bpset0:	tst.l (a2)
	bne.b bpset2
	move.l a2,d2
bpset2:	cmp.l (a2)+,d3
	dbeq d1,bpset0
	lea bpextxt(pc),a3
	beq.b bpset1
	lea bpfltxt(pc),a3
	tst.l d2
	beq.b bpset1
	lea mmuoffb(pc),a0
	bsr.w mmujob		;->d0:oldmmutc
	move.l d0,-(a7)
	move.l d3,a0
	move.l (a0),d1
	move.l #"BeEr",(a0)
	bsr.w pushcache
	move.l (a0),a1
	move.l d1,(a0)
	lea bpnoram(pc),a3
	cmp.l #"BeEr",a1
	bne.b bpset3
	move.l d2,a2	
	move.l d3,(a2)
	lea bpstxt(pc),a3
bpset3:	move.l (a7)+,d0
	lea mmurest(pc),a0	;d0:mmutc to use
	bsr.w mmujob
bpset1:	lea linebuf+1-base(a6),a0
	lea brktxt(pc),a1
	bsr.w txttobuf
	move.l a3,a1
	bsr.w txttobuf
	bsr.w rawline
	st d7
bpsetq:	rts
bpclr:	moveq #0,d2
	subq.b #1,d3
	bne.b bpsetq
	lea brkpadr-base(a6),a2
	moveq #brkpnum-1,d1
	move.l para-base(a6),d0
	beq.b bpclr1
	btst d2,d0	;even?
	bne.b bpsetq
bpclr0:	cmp.l (a2)+,d0
	dbeq d1,bpclr0
	lea bpnftxt(pc),a3
	bne.b bpset1
	clr.l -(a2)
	lea bprmtxt(pc),a3
	bra.b bpset1
bpclr1:	clr.l (a2)+		;clear all bp
	dbf d1,bpclr1
	lea bpbctxt(pc),a3
	bra.b bpset1

spc:	moveq #0,d3
	bsr.w csup
	move.b lastcmd-base(a6),d0
	cmp.b #"a",d0			;these can be repeated
	beq.w a
	cmp.b #"m",d0
	beq.w m
	cmp.b #"d",d0
	beq.w d
	cmp.b #"u",d0
	beq.w d6502
	cmp.b #"V",d0
	beq.w copper
	
	cmp.w #"bi",lastcmd-base(a6)
	bne.b nobind
	move.w lastcmd+2-base(a6),d0
	
	cmp.w #"nw",d0
	beq.b binw
	cmp.w #"nl",d0
	beq.b binl
	cmp.w #"nt",d0
	beq.b bint
	cmp.w #"nq",d0
	beq.b binq
	sf d0
	cmp.w #"n"<<8,d0
	beq.b binb

nobind:	bsr.w csdown
	st d7
	rts

binq:	moveq #"{",d2
	bra.b binit
bint:	moveq #"}",d2
	bra.b binit
binl:	moveq #"[",d2
	bra.b binit
binw:	moveq #"]",d2
	bra.b binit
binb:	moveq #"|",d2
binit:	cmp.b #2,d3
	bgt.l bdq

	bsr.b binsize
	moveq #16-1,d5
bd1:	bsr.b bincore

	bsr.w stopit
	beq.b bd3

	cmp.b #2,d3
	bne.b bd2
	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.w bd1
	bra.b bd3

bd2:	dbf d5,bd1
bd3:	st d7
bdq:	rts

binsize:moveq #8,d1
	cmp.b #"{",d2
	beq.b binok
	moveq #6,d1
	cmp.b #"}",d2
	beq.b binok
	moveq #4,d1
	cmp.b #"[",d2
	beq.b binok
	moveq #2,d1
	cmp.b #"]",d2
	beq.b binok
	moveq #1,d1
	cmp.b #"|",d2
	beq.b binok
	moveq #0,d1
binok:	tst.l d1
	rts

bincore:movem.l d1-d4,-(a7)
	lea linebuf-base(a6),a0
	move.b #">",(a0)+
	move.b d2,(a0)+

	move.l para-base(a6),d0
	bsr longtoa
	addq.w #1,a0

	move.l para-base(a6),a1
	move.w d1,d4
	subq.w #1,d4
bd4:	move.b (a1)+,d3
	bsr bytetob
	subq.w #1,a0
	dbf d4,bd4

	move.l a1,para-base(a6)
	bsr rawline
	movem.l (a7)+,d1-d4
	rts

edbinq:	moveq #8+1,d6
	bra.b edbin
edbint:	moveq #6+1,d6
	bra.b edbin
edbinl:	moveq #4+1,d6
	bra.b edbin
edbinw:	moveq #2+1,d6
	bra.b edbin
edbinb:	moveq #1+1,d6
edbin:	cmp.l d3,d6
	bne.b edbq

	move.b 1(a5),d2		;bincore
	subq.w #2,d6

	move.w d6,d0
	lea para+4-base(a6),a0
edb1:	move.l (a0)+,d1
	and.l #$eeeeeeee,d1
	bne.b edbq
	dbf d0,edb1

	move.w d6,d0
	lea para-base(a6),a0
	move.l (a0)+,a1
edb0:	move.l (a0)+,d3
	moveq #8-1,d5
edb2:	add.b d1,d1
	rol.l #4,d3
	btst #0,d3
	beq.b edb3
	addq.b #1,d1
edb3:	dbf d5,edb2	
	move.b d1,(a1)+
	dbf d0,edb0	

	bsr.w csup
	move.w d6,d1
	addq.w #1,d1
	bsr.w bincore

	st d7
edbq:	rts

m:	cmp.b #2,d3
	bgt.l mq

	moveq #16-1,d5
m1:	bsr.b mcore
	bsr.w stopit
	beq.b m3

	cmp.b #2,d3
	bne.b m2
	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.w m1
	bra.b m3

m2:	dbf d5,m1
m3:	st d7
mq:	rts

mcore:	lea linebuf-base(a6),a0
	move.w #">:",(a0)+
	move.l para-base(a6),d0
	bsr longtoa
	addq.w #1,a0
	moveq #8-1,d2
	move.l para-base(a6),a1
m0:	move.b #" ",(a0)+
	move.b (a1)+,d0
	lsl.w #8,d0
	move.b (a1)+,d0
	bsr wordtoa
	dbf d2,m0
	addq.w #2,a0
	move.b #"'",(a0)+
	move.l para-base(a6),a1
	moveq #".",d2
	moveq #16-1,d1
m4:	move.b (a1)+,d0
	bmi.b m5
	cmp.b #" ",d0
	blt.b m5
	move.b d0,(a0)+		;$20-$7f
	dbf d1,m4
	bra.b m6
m5:	move.b d2,(a0)+		;$00-$1f,$80-$ff
	dbf d1,m4
m6:	move.b #"'",(a0)+
	moveq #$10,d0
	add.l d0,para-base(a6)
	bra rawline

mm:	cmp.b #9,d3
	bne.w mm1
	lea para-base(a6),a0
	move.l (a0),a1
	cmp.b #54,d6		;asc edit ?
	bge.b mm2

	addq.w #6,a0
	moveq #8-1,d0
mm0:	move.b (a0)+,(a1)+
	move.b (a0)+,(a1)+
	addq.w #2,a0
	dbf d0,mm0
mm1:	clr.w d5
	clr.b d3
	bsr.w csup
	bra.w m1
mm2:	moveq #16-1,d0
	moveq #54,d6		;beg asc edit
mm3:	move.b (a5,d6.w),d1
	cmp.b #".",d1		;skip it
	beq.b mm4
	move.b d1,(a1)
mm4:	addq.w #1,d6
	addq.w #1,a1
	dbf d0,mm3
	bra.b mm1

a:	cmp.b #2,d3
	bgt.l adq

	moveq #16-1,d5
ad1:	bsr.b acore
	bsr.w stopit
	beq.b ad3

	cmp.b #2,d3
	bne.b ad2
	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.w ad1
	bra.b ad3
ad2:	dbf d5,ad1
ad3:	st d7
adq:	rts
acore:	lea linebuf-base(a6),a0
	move.w #">;",(a0)+
	move.l para-base(a6),d0
	bsr longtoa
	addq.w #2,a0
	move.b #"'",(a0)+
	move.l para-base(a6),a1
	moveq #".",d2
	moveq #64-1,d1
ad4:	move.b (a1)+,d0
	bmi.b ada0
	cmp.b #" ",d0
	blt.b ada0
	move.b d0,(a0)+		;$20-$7f
	dbf d1,ad4
	bra.b ada1
ada0:	move.b d2,(a0)+		;$00-$1f,$80-$ff
	dbf d1,ad4
ada1:	move.b #"'",(a0)+
	moveq #$40,d0
	add.l d0,para-base(a6)
	bra rawline

aa:	cmp.b #1,d3
	bne.b aaq
	cmp.b #"'",12(a5)
	bne.b aaq

	move.l para-base(a6),a1
	moveq #64-1,d0
	moveq #13,d6		;beg asc edit
aa0:	move.b (a5,d6.w),d1
	cmp.b #".",d1		;skip it
	beq.b aa1
	move.b d1,(a1)
aa1:	addq.w #1,d6
	addq.w #1,a1
	dbf d0,aa0

	st d7
aaq:	rts


xclr:	move.w #$7fff,$dff096	;no dma
	move #$2700,sr		;no int
	moveq #-1,d0		;fill value
	sub.l a4,a4		;noguru&clrmem
	move.l himem-base(a6),a0	;end of chipmem
	lea xclr-base(a6),a1
	cmp.l a0,a1		;prog within fillarea?
	bhi.b fillchp
	lea endclr(pc),a3
fillch2:move.l d0,(a3)+
	cmp.l a3,a0
	bhi.b fillch2

	move.l a1,a0
fillchp:move.l d0,(a4)+		
	cmpa.l a4,a0
	bhi.b fillchp
	
	nop		;longword aligned
	
doreset:lea $40000,a7	;code in ramcard
	lea $fc00fe,a4	;kick 1.2/1.3 resetentry
	cmp.l #$80000,$ffffec
	bne.b onelong
	lea $400.w,a7
	lea $f80000,a0
	move.l a0,a4
	moveq #-1,d1
	moveq #1,d2
	moveq #0,d5	
dores0:	add.l (a0)+,d5
	bcc.b dores1
	addq.l #1,d5
dores1:	dbf d1,dores0
	dbf d2,dores0
dores2:	cmp.l #$4ee90002,(a4)+	;jmp 2(a1)
	beq.b onelong
	subq.w #2,a4
	bra.b dores2
			;lea $f8010c,a4	;kick 2.0 resetentry
onelong:reset		;longword aligned if LoadSeg, module: don't care
	jmp (a4)	;reset, no moduletest
endclr:

bpl:	moveq #0,d0
	cmp.b #1,d3
	bhi.w bplq
	bne.b bpl1
	move.l para-base(a6),d0
bpl1:	move.l d0,msycnt-base(a6)
	move.w #$0020,$dff096
	moveq #0,d0
	move.l d0,$dff144	
bpl0:
	lea linebuf+1-base(a6),a0
	lea bpltxt(pc),a1
	bsr.w txttobuf

bpl9:	move.l msycnt-base(a6),d0
	bclr #0,d0
	move.l d0,a4
	moveq #0,d1
	move.b rows-base(a6),d1
	mulu #xchars*8,d1
bpl3:	lea $c80000,a1
	sub.l d1,a1
	cmp.l a1,d0
	bls.b bpl8
	lea $f00000,a5
	cmp.l a5,d0
	bcc.b bpl8
	move.l a1,d2
	add.l a5,d2
	lsr.l #1,d2
	cmp.l d2,d0
	bls.b bpl14		;lower or upper memblock?
	move.l a5,a1
bpl14:	move.l a1,msycnt-base(a6)
	bra.b bpl9

bpl8:	add.l d0,d1
	bsr.w twolong_

	move.l scradr-base(a6),a5
	lea font-[32*8]-base(a6),a1	;start=spc
	moveq #8-1,d2
bpl11:	moveq #25-1,d1
	lea linebuf-base(a6),a0
	lea [80-25](a5),a5
bpl10:	moveq #0,d0
	move.b (a0)+,d0
	lsl.w #3,d0
	move.b (a1,d0.w),(a5)+
	dbf d1,bpl10	
	addq.w #1,a1
	dbf d2,bpl11

	move.l scradr-base(a6),a5
	moveq #8-1,d2
bpl7:	moveq #80-25-1,d1
	moveq #0,d0
	move.b rowsm1-base(a6),d0
	lsl.w #4,d0
	subq.w #1,d0
bpl6:	move.b (a4)+,(a5)+
	dbf d1,bpl6
	lea 25(a4),a4
	lea 25(a5),a5
	dbf d2,bpl7

bpl2:	movem.l (a4)+,d1-d7/a0-a2
	movem.l d1-d7/a0-a2,(a5)
	lea 40(a5),a5
	dbf d0,bpl2
	cmp.b #$1b,ascii-base(a6)
	bne.w bpl0

	bsr.w clrhome
	st d7
bplq:	rts

work:	cmp.b #1,d3	;we change the workspace, restore the old
	bhi.w woq
	tst.b d3
	beq.w wo0
	move.l para-base(a6),d0
	lea $100.w,a0
	cmp.l a0,d0
	bcs.w woq
	move.l himem-base(a6),d1
	sub.l wrksize-base(a6),d1
	cmp.l d1,d0
	bhi.w woq
	btst #0,d0
	bne.w woq

	move.w #$0180,$dff096		;cop/bpl off
	move.w #$4000,$dff09a		;ughh, celtic frost
	tst.l bufadr-base(a6)
	beq.b calchip

	move.l scradr-base(a6),a1		;old
	move.l d0,a2			;new
	move.l bufadr-base(a6),a3		;buf
	lea $dff006,a4
	lea $017a(a4),a5	;$dff180
	move.l wrksize-base(a6),d2
	cmp.l a1,a2
	beq.b calchip
	bhi.b cpyrev		;we go up or down?
swapup:	move.b (a2)+,d1		;new
	move.b (a3),(a1)+	;buf to old
	move.b d1,(a3)+		;new to buf
	move.b (a4),(a5)
	subq.l #1,d2
	bne.b swapup
	bra.b calchip

cpyrev:	add.l d2,a1		;old
	add.l d2,a2		;new
	add.l d2,a3		;buf
swapdwn:move.b -(a2),d1		;new
	move.b -(a3),-(a1)	;buf to old
	move.b d1,(a3)		;new to buf
	move.b (a4),(a5)
	subq.l #1,d2
	bne.b swapdwn

calchip:move.l d0,a0
	move.l a0,scradr-base(a6)
	add.l scrsize-base(a6),a0
	move.l a0,dskadr-base(a6)
	lea dsksize(a0),a0
	move.l a0,spradr-base(a6)
	lea sprsize(a0),a0
	move.l a0,copadr-base(a6)
	sf prtflag-base(a6)	;printer off
	bsr.w rawline
	bsr.w cursoff
	bsr.w clrscr
	sf col-base(a6)
	tst.b pic-base(a6)
	beq.b nopic
	sf pic-base(a6)
	lea dostrkbuf-base(a6),a1	;temp picsource
	move.l scradr-base(a6),a2
	lea 20(a2),a2		;center pic
	moveq #64-1,d0		;hight
copylog:moveq #40-1,d1		;width
copylin:move.b (a1)+,(a2)+
	dbf d1,copylin
	lea 40(a2),a2		;modulo
	dbf d0,copylog
	move.b #9,row-base(a6)

	tst.b keytab+$90-base(a6)	;0:american
	bne.b noswap
	bsr.w swapmap
noswap:	btst #0,langflg-base(a6)		;0:german
	beq.b keygerm
	bsr.w swapmap
keygerm:

nopic:
	lea linebuf+1-base(a6),a0
	lea initxt(pc),a1
	lea txttobuf(pc),a3
	jsr (a3)
	moveq #"0",d0
	add.b cpu-base(a6),d0
	move.b d0,(a0)+
	jsr (a3)
	move.l a1,-(a7)
	lea mmutxt(pc),a1
	move.b mmu-base(a6),d0
	bsr tsstate
	move.b #",",(a0)+
	lea fputxt(pc),a1
	move.b fpu-base(a6),d0
	bsr tsstate
	move.b #",",(a0)+
	lea chiptxt-4(pc),a1
	move.w himem-base(a6),d0	;$8,$10,$18,$20
	lsr.w #1,d0
	add.w d0,a1
	jsr (a3)
	move.l (a7)+,a1
	jsr (a3)
	move.l a1,-(a7)
	lea muttxt(pc),a1
	tst.b frzflag-base(a6)
	beq.b mutil1
	lea frztxt(pc),a1
mutil1:	jsr (a3)		;xx mode
	move.l (a7)+,a1
	jsr (a3)
	bsr rawline

	bsr.w wo0

	move.b #3,drvbit-base(a6)
	bsr.w drvinit		;set df0:

	bsr csdown
	bra.w warm

wo0:	lea linebuf+1-base(a6),a0
	lea worktxt(pc),a1
	bsr.w txttobuf
	lea abstxt(pc),a1	;Workspace(ABS)
	tst.b abswork-base(a6)
	bne.b wo1
	addq.w #systxt-abstxt,a1;Workspace(SYS)
wo1:	bsr.w txttobuf
	move.l scradr-base(a6),d0
	move.l d0,d1
	add.l wrksize-base(a6),d1
	bsr.w twoadr_		;chipmem use 24 bit

	lea codetxt(pc),a1
	bsr.w txttobuf
	lea run(pc),a1
	move.l a1,d0
	lea progend-$4000-base(a6),a1
	lea $4000(a1),a1
	move.l a1,d1
	bsr.w twolong_

	lea buftxt(pc),a1	;no Buffer
	bsr.w txttobuf
	lea navltxt(pc),a1
	move.l bufadr-base(a6),d0
	beq.b wo2
	lea abstxt(pc),a1	;Buffer(ABS)
	tst.b absbuf-base(a6)
	bne.b wo2
	addq.w #systxt-abstxt,a1;Buffer(SYS)
wo2:	bsr.w txttobuf
	move.l d0,d1
	beq.b nobufm
	add.l wrksize-base(a6),d1
	bsr.w twolong_
nobufm:	sf col-base(a6)
	bsr.w rawline
	st d7
woq:	rts

d:	cmp.b #2,d3
	bhi.b dq

	moveq #16-1,d5
dd0:	move.l para-base(a6),d0
	btst #0,d0
	bne.b dq
	move.l d0,a5

	bsr.w disasm
	bsr hlbrkpt

	bsr.w rawline
	bsr.b hdlline
	move.l a5,para-base(a6)

	bsr.w stopit
	beq.b dd3

	cmp.b #2,d3
	bne.b dd2
	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.w dd0
	bra.b dd3

dd2:	dbf d5,dd0
dd3:	st d7
dq:	rts

hdltest:move.l para-base(a6),a0
	move.w (a0),d0
	sub.w #$4e73,d0		;$4e73:rte
	beq.b isjmp
	subq.w #1,d0		;$4e74:rtd
	beq.b isjmp
	subq.w #1,d0		;$4e75:rts
	beq.b isjmp
	subq.w #2,d0		;$4e77:rtr
	beq.b isjmp
	moveq #-16,d0		;$fff0
	and.w (a0),d0
	cmp.w #$06c0,d0		;rtm
	beq.b isjmp	
	moveq #-64,d0		;$ffc0
	and.w (a0),d0
	cmp.w #$4ec0,d0		;jmp
	beq.b isjmp
	cmp.b #$60,(a0)		;bra.x
isjmp:	rts

hdlline:bsr.b hdltest
	bne.b nojmp
	move.l a0,d0
	lea linebuf-base(a6),a0
	move.w #">,",(a0)+
	bsr.w longtoa
	addq.w #1,a0
	moveq #48,d0
linelp:	move.b #"-",(a0)+
	dbf d0,linelp
	bsr.w rawline
nojmp:	rts

ds:	moveq #0,d0
	bra.b dchg
dm:	moveq #1,d0
	bra.b dchg
dv:	moveq #2,d0
dchg:	bchg d0,dissign-base(a6)
	st d7
	rts
	
s67 =$0000
s6  =$0100
s8  =$0200
stab=$0300
snop=$0400
s9a_=$0500	;68020 cas
s9a =$0600	;68020 chk2,cmp2

nass:	tst.b d3
	beq.b nassq
	move.l para-base(a6),d0
	btst #0,d0
	bne.b nassq
	lea linebuf-base(a6),a0
	move.w #">,",(a0)+
	bsr.w longtoa
	bra.w newdis
nassq:	rts

n:	tst.b d3
	beq.b nassq
	move.l a5,a0
	addq.w #2,a0		;skip >,
	bsr.w skipspc		;check obsolete
nn0:	cmp.l lineend-base(a6),a0
	bhi.b nassq
	cmp.b #" ",(a0)+	;search spc
	bne.b nn0
nn1:	cmp.l lineend-base(a6),a0	
	bhi.w endn
	cmp.b #" ",(a0)		;skip spc
	bne.b nn1_
	addq.w #1,a0
	bra.b nn1
nn1_:	move.l a0,a5		;cmdadr!
nn3:	cmp.l lineend-base(a6),a0
	bhi.b nn4
	move.b (a0)+,d0
	cmp.b #"Z",d0
	bhi.b nn3
	cmp.b #"A",d0
	bcs.b nn3
	bset #5,d0
	move.b d0,-1(a0)
	bra.b nn3
nn4:	
	lea instr(pc),a4
nn7:	btst #0,para+3-base(a6)
	bne.b nassq
	cmp.b #"-",(a5)	;line?
	beq.w ignline
	move.l a5,a0
	lea 6(a4),a1
nn6:	move.b (a1),d0
	bclr #7,d0
	cmp.b (a0)+,d0
	bne.w nn5
	btst #7,(a1)+
	beq.b nn6

	lea op68000-2-base(a6),a1
	clr.l lginstr-base(a6)	;0:2byte instr,2:4byte (mulx.l...)
	clr.w (a1)+		;oplen!
	clr.w (a1)
	move.w 4(a4),d0		;info
	and.w #$700,d0
	cmp.w #snop,d0
	beq.w nnsnop
	cmp.w #stab,d0
				;bne.b nnstab
	beq.w nn9
nnstab:	cmp.b #".",(a0)+
	bne.w nn5
	cmp.w #s67,d0
	bne.b nns67
	sf imsize-base(a6)	;%00
	cmp.b #"b",(a0)+	;op68000:0
	beq.w nn9
	addq.b #1,imsize-base(a6)	;%01
	move.w #%01000000,(a1)
	cmp.b #"w",-1(a0)
	beq.w nn9
	addq.b #1,imsize-base(a6)	;%10
	move.w #%10000000,(a1)
	cmp.b #"l",-1(a0)
	beq.w nn9	
nns67:	cmp.w #s9a_,d0			;68020 cas
	bne.b nns9a_
	sf imsize-base(a6)	;%00
	move.w #%01000000000,(a1)	;68020
	cmp.b #"b",(a0)+	;op68000:0
	beq.w nn9
	addq.b #1,imsize-base(a6)	;%01
	move.w #%10000000000,(a1)
	cmp.b #"w",-1(a0)
	beq.w nn9
	addq.b #1,imsize-base(a6)	;%10
	move.w #%11000000000,(a1)
	cmp.b #"l",-1(a0)
	beq.b nn9	
nns9a_:	cmp.w #s9a,d0			;68020 chk2,cmp2
	bne.b nns9a
	sf imsize-base(a6)	;%00
	cmp.b #"b",(a0)+	;op68000:0
	beq.b nn9
	addq.b #1,imsize-base(a6)	;%01
	move.w #%01000000000,(a1)
	cmp.b #"w",-1(a0)
	beq.b nn9
	addq.b #1,imsize-base(a6)	;%10
	move.w #%10000000000,(a1)
	cmp.b #"l",-1(a0)
	beq.b nn9	
nns9a:	cmp.w #s6,d0
	bne.b nns6
	move.b #%01,imsize-base(a6)
	cmp.b #"w",(a0)+
	beq.b nn9
	addq.b #1,imsize-base(a6)	;%10
	move.w #%1000000,(a1)
	cmp.b #"l",-1(a0)
	beq.b nn9
nns6:	cmp.w #s8,d0
	bne.b nn5		;ill instrtab or cmd
	move.b #%01,imsize-base(a6)
	cmp.b #"w",(a0)+
	beq.b nn9
	addq.b #1,imsize-base(a6)	;%10
	move.w #%100000000,(a1)
	cmp.b #"l",-1(a0)
	bne.b nn5
nn9:	cmp.b #" ",(a0)
	bne.b nn5
nn10:	addq.w #1,a0
	cmp.l lineend-base(a6),a0
	bhi.b nn5
	cmp.b #" ",(a0)
	beq.b nn10

nnsnop:	st d7
	move.l a0,a3
	move.w 4(a4),d0
	ext.w d0			 ;no a4,a5
	add.w d0,d0
	lea assoffs(pc),a0
	move.w (a0,d0.w),d0
	lea assubs(pc),a0

	jsr (a0,d0.w)	;a4:instrtabentry,a5:cmdtxt,a3:cnttxt
			;a6:notmodify!!
	tst.b d7	
	bne.b nn8
nn5:	sf d7
	tst.l (a4)
	beq.b nretry		;unknown
	lea 14(a4),a4
	bra.w nn7
nn8:	
	lea op68000-2-base(a6),a0
	move.w (a0)+,d0		;oplen!
	move.l para-base(a6),a1
	move.l a1,a5
	move.w (a0),d1
	or.w 2(a4),d1
	move.w d1,(a0)
nnmem:	move.w (a0)+,(a1)+
	dbf d0,nnmem
	bsr.w csup
	bsr.w disasm
	bsr.w rawline
	bsr hdlline
	move.l a5,para-base(a6)
	bsr.w disasm
newdis:	bsr.w rawline
nretry:	bsr.w csup
ignline:move.b #11,col-base(a6)
endn:	st d7
nq:	rts

accu:	lea accu8-base(a6),a2
	bra.b acc0
index:	lea idxy8-base(a6),a2
acc0:	subq.l #1,d3
	bne.b indexq
	moveq #$16,d0
	sub.l para-base(a6),d0
	beq.b ind16
	cmp.b #$16-8,d0
	bne.b indexq
	st d0
ind16:	move.b d0,(a2)
	sf autosel-base(a6)
	st d7
indexq:	rts
auto:	st autosel-base(a6)
	sf accu8-base(a6)
	sf idxy8-base(a6)
	st d7
	rts

d6502:	cmp.b #2,d3
	bhi.b d65q

	moveq #16-1,d5
d650:	move.l para-base(a6),d0
	move.l d0,a5
	bsr.w dis6502
	move.l a5,para-base(a6)
	bsr.w rawline

	bsr.w stopit
	beq.b d653

	cmp.b #2,d3
	bne.b d652
	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.w d650
	bra.b d653

d652:	dbf d5,d650
d653:	st d7
d65q:	rts

nass65:	subq.l #1,d3
	bne.b nass65q
	move.l para-base(a6),d0
	lea linebuf-base(a6),a0
	move.w #">_",(a0)+
	bsr.w longtoa
	bra.w n65new
nass65q:rts
n6502:	tst.b d3
	beq.w n65q
	move.l a5,a0
	moveq #xchars-1,d1
n65n3:	move.b (a0)+,d0
	cmp.b #"Z",d0
	bhi.b n65n4
	cmp.b #"A",d0
	bcs.b n65n4
	bset #5,d0
	move.b d0,-1(a0)
n65n4:	dbf d1,n65n3
	lea txt6502(pc),a1
	lea 25(a5),a0
	moveq #0,d5
n655:	moveq #3-1,d0
n651:	move.b (a0,d0.w),d1
	bset #5,d1
	cmp.b (a1,d0.w),d1
	dbne d0,n651
	beq.b n652
	addq.w #3,a1
	tst.b (a1)
	bmi.w n65rtr
	addq.w #1,d5
	bra.b n655
n652:	lea tab6502(pc),a1
	moveq #-1,d3
n654:	addq.l #1,d3
	cmp.b (a1)+,d5
	beq.b n653
	addq.w #1,a1
	tst.b (a1)
	bmi.w n65rtr
	bra.b n654
n653:
	lea 3(a0),a3
n65n1:	cmp.l lineend-base(a6),a3	
	bhi.w n65n1_
	cmp.b #" ",(a3)		;skip spc
	bne.b n65n1_
	addq.w #1,a3
	bra.b n65n1
n65n1_:
	moveq #0,d0
	move.b (a1)+,d0
	add.w d0,d0
	move.w n65mode(pc,d0.w),d0
	st d7
	moveq #1,d4
	move.l a3,-(a7)
	jsr n65subs(pc,d0.w)
	cmp.l (a7)+,a3
	beq.b n654
	tst.b d7
	beq.b n654
	move.l para-base(a6),a5
	move.b d3,(a5)
	subq.b #1,d4
	beq.b n656
	move.b d0,1(a5)
	subq.b #1,d4
	beq.b n656
	move.b d1,2(a5)
	subq.b #1,d4
	beq.b n656
	move.b d2,3(a5)
n656:	
	bsr.w csup
	bsr.w dis6502
	move.l a5,para-base(a6)
	bsr.w rawline
	bsr.w dis6502
n65new:	bsr.w rawline
n65rtr:	bsr.w csup
	move.b #25,col-base(a6)
	st d7
n65q:	rts
n65subs:
n65mode:dc.w n65nop-n65subs	;0
	dc.w n65imi-n65subs	;1
	dc.w n65word-n65subs	;2
	dc.w n65byte-n65subs	;3
	dc.w n65acu-n65subs	;4
	dc.w n65zpix-n65subs	;5
	dc.w n65zpiy-n65subs	;6
	dc.w n65zpx-n65subs	;7
	dc.w n65adrx-n65subs	;8
	dc.w n65adry-n65subs	;9
	dc.w n65zpy-n65subs	;10
	dc.w n65jmpi-n65subs	;11
	dc.w n65brel-n65subs	;12
	dc.w n65dummy-n65subs	;13
	dc.w n65zpl-n65subs	;14
	dc.w n65zply-n65subs	;15
	dc.w n65zpi-n65subs	;16
	dc.w n65srel-n65subs	;17
	dc.w n65sriy-n65subs	;18
	dc.w n65adlg-n65subs	;19
	dc.w n65adlx-n65subs	;20
	dc.w n65brlg-n65subs	;21
	dc.w n65jpix-n65subs	;22
	dc.w n65imac-n65subs	;23
	dc.w n65imxy-n65subs	;24
n65imxy:tst.b idxy8-base(a6)
	bra.b n65im
n65imac:tst.b accu8-base(a6)
n65im:	beq.b n65imw
n65imi:	cmp.b #"#",(a3)+
	bne.b n65fail
	bra.b n65byte
n65imw:	cmp.b #"#",(a3)+
	bne.w fail
n65word:bsr.b n65adr
	bra.b n65spc
;n65db:	bsr.b n65byte	;dc.b changed to wdm instruction
;	moveq #1,d4
;	move.b d0,d3
;	rts
n65byte:bsr.b n65zp
n65spc:	cmp.b #" ",(a3)+	
	bne.b n65fail
n65dummy:rts
n65zp:	moveq #2,d4
	cmp.b #"$",(a3)
	beq.w atobyte_
	bra.w atodnib
n65acu:	cmp.b #"a",(a3)+
	beq.b n65nop
n65fail:sf d7
n65nop:	addq.w #1,a3
	rts
n65zpix:cmp.b #"(",(a3)+
	bne.b n65fail
	bsr.b n65zp
	bsr.b n65x
n65brac:cmp.b #")",(a3)+
	bne.b n65fail
	rts
n65zpi:	pea n65spc(pc)
n65zi:	cmp.b #"(",(a3)+
	bne.b n65fail
	bsr.b n65zp
	bra.b n65brac
n65zpiy:bsr.b n65zi
n65y:	cmp.b #",",(a3)+
	bne.b n65fail
	cmp.b #"y",(a3)+
	bne.b n65fail
	rts

n65zpx:	bsr.b n65zp
	bra.b n65x
n65adr:	cmp.b #"$",(a3)
	beq.b n65adr0
	bsr.w atodnib
	bra.b n65adr1
n65adr0:bsr.w atoword_
n65adr1:moveq #3,d4
	move.w d0,d1
	lsr.w #8,d1
	rts
n65adrx:bsr.b n65adr
n65x:	cmp.b #",",(a3)+
	bne.b n65fail
	cmp.b #"x",(a3)+
	bne.b n65fail
	rts
n65adry:bsr.b n65adr
	bra.b n65y
n65zpy:	bsr.b n65zp
	bra.b n65y
n65jpix:cmp.b #"(",(a3)+
	bne.b n65fail
	bsr.b n65adr
	bsr.b n65x
	bra.b n65brac
n65jmpi:cmp.b #"(",(a3)+
	bne.b n65fail
	bsr.b n65adr
	bra.b n65brac

n65brlg:bsr.b n65bre
	sub.l para-base(a6),d0
	subq.l #3,d0
	move.l #$7fff,d1
	cmp.l d1,d0
	bls.b n65adr1
	not.l d1
	cmp.l d0,d1
	bls.b n65adr1
	bra.b n65fai2
n65bre:	cmp.b #"$",(a3)
	beq.w atolong_
	bra.w atodnib
n65brel:moveq #2,d4
	bsr.b n65bre
	sub.l para-base(a6),d0
	subq.l #2,d0
	moveq #127,d1
	cmp.l d1,d0
	bls.b n65bre2
	moveq #-128,d1
	cmp.l d0,d1
	bls.b n65bre2
n65fai2:sf d7
n65bre2:rts
n65zpl:	pea n65spc(pc)
n65zlg:	cmp.b #"[",(a3)+
	bne.b n65fai2
	bsr.w n65zp
	cmp.b #"]",(a3)+
	bne.b n65fai2
	rts
n65zply:bsr.b n65zlg
	bra.w n65y
n65srel:pea n65spc(pc)
n65sr:	bsr.w n65zp
	cmp.b #",",(a3)+
	bne.b n65fai2
	cmp.b #"s",(a3)+
	bne.b n65fai2
	rts
n65sriy:cmp.b #"(",(a3)+
	bne.b n65fai2
	bsr.b n65sr
	bsr.w n65brac
	bra.w n65y
n65adlg:pea n65spc(pc)
n65adl:	cmp.b #"$",(a3)
	beq.b n65adl0
	bsr.w atodnib
	bra.b n65adl1
n65adl0:bsr.w atolong_
n65adl1:moveq #4,d4
	move.l d0,d1
	lsr.l #8,d1
	move.l d0,d2
	swap d2
	cmp.w #$ff,d2
	bhi.b n65fai2
	rts
n65adlx:bsr.b n65adl
	bra.w n65x
		
c:	cmp.b #3,d3
	bne.b cq

	move.l para-base(a6),a1
	move.l para+4-base(a6),a2
	move.l para+8-base(a6),a3

	lea linebuf+1-base(a6),a0
	lea linebuf+74-base(a6),a4

c0:	move.b (a1)+,d0
	cmp.b (a3)+,d0
	beq.b c1

	move.l a1,para-base(a6)

	move.l a1,d6
	bsr bufaddr

	move.b outmode-base(a6),d0
	beq.b ctable
	movem.l a0-a2,-(a7)
	pea ccont(pc)
	subq.b #1,d0
	beq mcore
	bra acore
ccont:	movem.l (a7)+,a0-a2
	bra.b c1
	
ctable:	move.l a1,d0
	subq.l #1,d0
	bsr.w longtoa_
	addq.w #2,a0

	cmp.l a4,a0
	bcs.b c1
	
	bsr.w rawline
	addq.w #1,a0

c1:	bsr.w stopit
	beq.b c3

	cmp.l a2,a1
	bcs.b c0

c3:	lea linebuf+1-base(a6),a1
	cmp.l a1,a0
	beq.b c2
	bsr.w rawline
c2:	st d7
cq:	rts

fd:	cmp.b #2,d3
	bne.b fdq
	move.l a2,d0		;asc?
	beq.b fdq

	lea dostrkbuf-base(a6),a1	;to allow scrolling
	move.l a1,a0
fd6:	move.b (a2)+,d0
	cmp.b #34,d0
	beq.b fd7
	bset #5,d0		;lowercase
	move.b d0,(a0)+
	cmp.l lineend-base(a6),a2
	bhi.b fdq
	bra.b fd6
fd7:	move.b #"*",(a0)+
	sf (a0)
	move.l a1,a2		;matchstring

fd0:	move.l para-base(a6),d0
	btst #0,d0
	bne.b fdq

	move.l d0,d6		;match
	move.l d0,a5
	bsr.w disasm
	move.l a5,para-base(a6)

	lea lineeof-base(a6),a3
	moveq #xchars-11-1,d0
	moveq #" ",d1
fd4:	cmp.b -(a3),d1
	dbne d0,fd4		;set text,0
	sf 1(a3)
	lea linebuf+11-base(a6),a3	;disasm text

	bsr.b wildcmp
	bne.b fd1

	bsr bufaddr		;store match address
	bsr.w rawline

fd1:	bsr.w stopit
	beq.b fdab

	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.b fd0
fd3:	bsr.w clrlbuf
	st d7
fdq:	rts

fdab:	bsr.b fd3
	move.l a5,d0
doabort:lea linebuf+1-base(a6),a0
	lea abotxt(pc),a1
	bsr.w txttobuf
	bsr.w longtoa_
	bra.w rawline

MAXB	= 8
MAXB28	= 128	;MAXB*2*8
wildcmp:movem.l a2-a4,-(a7)
	lea bitmap-base(a6),a4	;a2:wild,a3:name->d0:0:match,1:nomatch
	moveq #0,d2
xwclp: 	moveq #0,d0
	move.b (a2),d1
	bne.b xw1
	tst.b (a3)
	beq.b xwcdone
xw1:	cmp.b #"*",d1
	bne.b xw10
	
	cmp.w #MAXB,d2
	bne.b xw2
	moveq #-1,d0		; error
	bra.b xwcdone
xw2:	move.w d2,d0		; back[bi][0] = w  i.e. back+bi*8
	lsl.w #3,d0		; back[bi][1] = n
	move.l a2,0(a4,d0.w)
	addq.w #1,a2
	move.l a3,4(a4,d0.w)
	addq.w #1,d2
	bra.b xwclp
xwgback:subq.w #1,d2
	bmi.b xw5
	move.w d2,d0
	lsl.w #3,d0
	move.l 4(a4,d0.w),a0
	tst.b (a0)
	beq.b xwgback
xw5:	tst.w d2
	bmi.b xwcret0
	move.w d2,d0
	lsl.w #3,d0
	move.l 0(a4,d0.w),a2
	addq.w #1,a2
	addq.l #1,4(a4,d0.w)
	addq.w #1,d2
	move.l 4(a4,d0.w),a3
	bra.b xwclp
xw10:	cmp.b #"?",d1
	bne.b xw20
	tst.b (a3)
	bne.b xwcbrk
	tst.w d2
	bne.b xwgback
	bra.b xwcret0
xw20: 	move.b (a3),d0
	cmp.b (a2),d0
	beq.b xwcbrk
	tst.w d2
	bne.b xwgback
	bra.b xwcret0
xwcbrk:	tst.b (a2)+
	bne.b xwcb1
	subq.w #1,a2
xwcb1:	tst.b (a3)+
	bne.b xwclp
	subq.w #1,a3
	bra.w xwclp
xwcret0:moveq #1,d0
xwcdone:movem.l (a7)+,a2-a4
	tst.w d0
	rts

fmode:	subq.l #1,d3
	bne.b fmodeq
	moveq #2,d1
	move.l para-base(a6),d0
	cmp.l d1,d0
	bhi.b fmodeq
	move.b d0,outmode-base(a6)	
	st d7
fmodeq:	rts

f:	move.l a2,d0		;asc ?
	beq.b f7

	cmp.b #2,d3
	bne.w fq

	lea para+8-base(a6),a1
	moveq #0,d0

	moveq #2,d3
f9:	move.b (a2)+,d0
	cmp.b #34,d0
	beq.b f7
	move.l d0,(a1)+	
	addq.w #1,d3
	cmp.b #16,d3
	bne.b f9

f7:	cmp.b #3,d3
	blt.l fq

	lea para+8-base(a6),a1
	lea linebuf-base(a6),a0
	move.l #" sea",(a0)+
	move.l #"rchi",(a0)+
	move.l #"ng f",(a0)+
	move.l #"or: ",(a0)+
	move.w d3,d2
	subq.w #3,d2
f5:	move.l (a1)+,d0
	bsr.w bytetoa_
	move.b #" ",(a0)+
	dbf d2,f5
	bsr.w rawline
	addq.w #1,a0

	move.l para-base(a6),a1
	move.l para+4-base(a6),a2
	move.b para+11-base(a6),d4

f0:	cmp.b (a1),d4			;quickfind
	bne.b f6

	move.l a1,a4
	
	lea para+11-base(a6),a3

	move.w d3,d2
	subq.w #3,d2
f4:	move.b (a4)+,d0
	cmp.b (a3),d0
	bne.b f1
	addq.w #4,a3
	dbf d2,f4

	move.l a1,para-base(a6)

	move.l a1,d6
	bsr bufaddr

	move.b outmode-base(a6),d0
	beq.b ftable
	movem.l a0-a2,-(a7)
	pea fcont(pc)
	subq.b #1,d0
	beq mcore
	bra acore
fcont:	movem.l (a7)+,a0-a2
	bra.b f1
	
ftable:	move.l a1,d0
	bsr.w longtoa_
	addq.w #2,a0

	lea linebuf+74-base(a6),a4
	cmp.l a4,a0
	bcs.b f1
	
	bsr.w rawline
	addq.w #1,a0

f1:	bsr.w stopit
	beq.b f3

f6:	addq.w #1,a1
	cmp.l a2,a1
	bcs.b f0

f3:	lea linebuf+1-base(a6),a1
	cmp.l a1,a0
	beq.b f2
	bsr.w rawline
f2:	st d7
fq:	rts

frel:	cmp.b #1,d3
	bne.w frq

	move.b (a0)+,d0
	lsl.w #8,d0
	move.b (a0),d0
	or.w #$2020,d0	;lowercase
	cmp.w #"pc",d0
	seq d4

	moveq #-2,d0
	and.l para-base(a6),d0
	move.l d0,a1

	sub.l a2,a2
	cmp.l #$8000,d0
	bls.b fr9
	lea -$8000(a1),a2	;min
fr9:	lea $7ffe(a1),a4	;max
fr1:	tst.b d4
	bne.b fr4

	move.w (a2),d1
	and.w #%1111000011111000,d1
	cmp.w #%0101000011001000,d1		;dbxx
	beq.b fr5

	move.b (a2),d1
	and.w #%11110000,d1
	cmp.w #%01100000,d1	;bxx.x
	bne.b fr0

	move.b 1(a2),d1
	ext.w d1
	beq.b fr5		;bxx.w
	bra.b fr6		;bxx.s

fr4:	
	moveq #%111111,d1
	and.w (a2),d1		;adr(pc)
	cmp.w #%111010,d1
	bne.b fr0
fr5:	move.w 2(a2),d1
fr6:	lea 2(a2,d1.w),a3
	cmp.l para-base(a6),a3
	bne.b fr0

	move.l a2,d6
	bsr bufaddr
	
	move.l a2,a5
	bsr.w disasm
	bsr.w rawline

fr0:	bsr.w stopit
	beq.b fr8

	addq.w #2,a2
	cmp.l a2,a4
	bcc.b fr1

fr8:	st d7
frq:	rts

time:	bsr.w getclok
	
	lea linebuf+1-base(a6),a0
	move.l days-base(a6),d0
	bsr.w todate
	lea linebuf+25-base(a6),a0
	move.l mins-base(a6),d0
	divu #60,d0
	bsr.w bytetod
	move.b #":",(a0)+
	swap d0
	bsr.w bytetod
	move.b #":",(a0)+
	move.l ticks-base(a6),d0
	divu #50,d0
	bsr.w bytetod

	lea linebuf+1-base(a6),a0
	bsr.w rawline

	st d7
timeq:	rts
	
t:	cmp.b #3,d3
	bne.b tq

	move.l para-base(a6),a0
	move.l para+4-base(a6),a1
	cmp.l a1,a0
	bcc.b tq
	move.l para+8-base(a6),a2
	cmp.l a0,a2
	bcc.b t0

t1:	move.b (a0)+,(a2)+
	cmp.l a1,a0
	bcs.b t1
	bra.b t2

t0:	add.l a1,a2
	sub.l a0,a2
t3:	move.b -(a1),-(a2)
	cmp.l a0,a1
	bne.b t3		;t 0 x x

t2:	st d7
tq:	rts

sysinfo:cmp.b #1,d3
	bhi.w sysq

	btst #0,4+3.w
	bne.w syscorr
	tst.l 4.w
	beq.w syscorr
	move.l 4.w,a4

	lea memtxt(pc),a1
	lea $142(a4),a3		;0:memlist
	move.l para-base(a6),d0
	beq.b dolist

	lea rsrctxt(pc),a1
	lea $150(a4),a3		;1:resourcelist
	subq.l #1,d0
	beq.b dolist

	lea exectxt(pc),a1
	lea $15e(a4),a3		;2:devicelist
	subq.l #1,d0
	beq.b dolist

	lea intrtxt(pc),a1
	lea $16c(a4),a3		;3:intlist
	subq.l #1,d0
	beq.b dolist

	lea exectxt(pc),a1
	lea $17a(a4),a3		;4:liblist
	subq.l #1,d0
	beq.b dolist

	lea porttxt(pc),a1
	lea $188(a4),a3		;5:portlist
	subq.l #1,d0
	beq.b dolist

	lea tasktxt(pc),a1
	lea $196(a4),a3		;6:taskready
	subq.l #1,d0
	beq.b dolist

	lea tasktxt(pc),a1
	lea $1a4(a4),a3		;7:taskwaiting
	subq.l #1,d0
	beq.b dolist

	lea tasktxt(pc),a1
	lea $114(a4),a3		;8:thistask
	subq.l #1,d0
	beq.b dolist

	lea rsndtxt(pc),a1
	lea $12c(a4),a3		;9:resident list
	subq.l #1,d0
	beq.w dorslst
	bra.w sysq	

dolist:	bsr.w msgout

	move.l (a3)+,a2
nextlst:addq.w #1,a0
	cmp.l a3,a2
	beq.w endlist

	move.l a2,d0		;addr
	beq.w syscorr
	btst #0,d0
	bne.w syscorr
	bsr.w longtoa_

	move.l para-base(a6),d0
	bne.w nomeml

	lea linebuf+1-base(a6),a0	;overwrite addr
	move.l $14(a2),d0	;lower
	bsr.w longtoa_

	addq.w #1,a0
	move.l $10(a2),d0	;first
	bsr.w longtoa_

	addq.w #1,a0
	move.l $18(a2),d0	;upper
	bsr.w longtoa_

	addq.w #1,a0
	move.l $1c(a2),d0	;free	use only 24 bit
	bsr.w adrtoa_

	addq.w #1,a0
	move.w $e(a2),d0	;attr
	bsr.w wordtoa_

	move.b 9(a2),d0		;pri
	bsr.w dopri
	bra.w namelst

nomeml:	subq.l #2,d0		;devlist
	beq.b dodevl
	subq.l #2,d0		;liblist
	bne.b nolibl
dodevl:
	addq.w #1,a0

	moveq #0,d0
	move.w $20(a2),d0	;opencount
	bsr.w hextod

	lea linebuf+17-base(a6),a0
	move.w $14(a2),d0	;version
	bsr.w hextod

	lea linebuf+23-base(a6),a0
	move.w $16(a2),d0	;revision
	bsr.w hextod

	lea linebuf+29-base(a6),a0
	move.w $10(a2),d0	;negsize
	bsr.w hextod

	lea linebuf+35-base(a6),a0
	move.w $12(a2),d0	;possize
	bsr.w hextod

	lea linebuf+41-base(a6),a0
	move.w $1c(a2),d0	;chksum
	bsr.w wordtoa_
	bra.w namelst

nolibl:	subq.l #1,d0
	bne.b noportl

	move.l #" Sig",d1
	move.l #"nal ",d2
	move.b $e(a2),d0	;flag
	beq.b flagsig
	move.l #" Sof",d1
	move.l #"tint",d2
	subq.b #1,d0
	beq.b flagsig
	move.l #" Ign",d1
	move.l #"ore ",d2
flagsig:move.l d1,(a0)+
	move.l d2,(a0)+

	addq.w #2,a0
	moveq #0,d0
	move.b $f(a2),d0	;sigbit
	bsr.w hextod

	lea linebuf+24-base(a6),a0
	move.l $10(a2),a1	;task
	move.l a1,d0
	beq.b nonamec
	btst #0,d0
	bne.w syscorr
	move.l $a(a1),a1	;taskname
	move.l a1,d0
	beq.b nonamec
	moveq #22-1,d0
namecpy:move.b (a1)+,(a0)+
	dbeq d0,namecpy
	bra.b namecp2
nonamec:move.l #"----",(a0)
	move.l (a0)+,(a0)
namecp2:bra.w namelst	

noportl:subq.l #1,d0		;6:taskready
	beq.b taskrdy
	subq.l #1,d0		;7:taskwaiting
	beq.b taskrdy
	subq.l #1,d0		;8:thistask
	bne.w notaskl
	
taskrdy:addq.w #1,a0
	lea typetab(pc),a1
	move.b $8(a2),d0	;type
	cmp.b #14,d0
	bsr.w indextx

	lea linebuf+19-base(a6),a0
	move.b 9(a2),d0		;pri
	bsr.w dopri

	lea linebuf+24-base(a6),a0
	lea statetb(pc),a1
	move.b $f(a2),d0	;state
	cmp.b #6,d0
	bsr.w indextx

	lea linebuf+32-base(a6),a0
	move.l $3a(a2),d0	;splower
	bsr.w longtoa_

	addq.w #1,a0
	move.l $3e(a2),d0
	sub.l $3a(a2),d0	;size 
	bsr.w hextod

	lea linebuf+48-base(a6),a0
	move.l $3e(a2),d0
	sub.l $36(a2),d0	;used
	bsr.w hextod

	nop
notaskl:	
namelst:lea linebuf+54-base(a6),a0
	move.l $a(a2),a1
	move.l a1,d0
	beq.b nolstn
	moveq #26-1,d0
lstname:move.b (a1)+,(a0)+
	dbeq d0,lstname
	bra.b lstnam0
nolstn:	move.l #"----",(a0)
	move.l (a0)+,(a0)
lstnam0:bsr.w rawline

	move.l (a2),a2
	move.l a2,d0
	beq.b endlist
	btst #0,d0
	bne.b syscorr
	lea $114+4(a4),a1	;thistask=node, no list
	cmp.l a3,a1
	bne.w nextlst

endlist:
	st d7
sysq:	rts	
syscorr:bsr.w clrlbuf
	st d7
	lea corrtxt(pc),a1
	bra.w msgout

indextx:bls.b tsstate
	moveq #0,d0
tsstate:subq.b #1,d0
	bmi.b fndind
endind:	btst #7,(a1)+
	beq.b endind
	bra.b tsstate
fndind:	bra.w txttobuf

dopri:	addq.w #2,a0
	ext.w d0
	ext.l d0
	bpl.b rsdpri
	move.b #"-",-1(a0)
	neg.l d0
rsdpri:	bra.w hextod
dorslst:bsr.w msgout
	move.l (a3),a3
nextrsl:addq.w #1,a0
rslind:	move.l (a3)+,d0
	beq.b endrsl
	bclr #31,d0
	beq.b rslnorm
	move.l d0,a3
	bra.b rslind
rslnorm:move.l d0,a2
	bsr.w longtoa_

	addq.w #1,a0
	lea typetab(pc),a1
	moveq #0,d0
	move.b $c(a2),d0	;type
	cmp.b #14,d0
	bsr.b indextx

	lea linebuf+19-base(a6),a0
	move.b $d(a2),d0	;pri
	bsr.b dopri

	lea linebuf+40-base(a6),a0
	move.l $12(a2),a1
	move.l a1,d0
	beq.b norsdn
	moveq #40-1,d0
rsdname:move.b (a1)+,(a0)+
	dbeq d0,rsdname
	bra.b rsdnam0
norsdn:	move.l #"----",(a0)
	move.l (a0)+,(a0)
rsdnam0:

	bsr.w rawline
	bra.b nextrsl
endrsl:	st d7
	rts

custom:	tst.l d3
	bne.w customq
	bsr clrscr

	lea linebuf-base(a6),a4
	lea custnam(pc),a2
	lea cust2nm(pc),a3
	moveq #0,d6
custom2:move.l a4,a0

	move.l #$dff000,d0
	add.w d6,d0
	add.w d6,d0
	bsr adrtoa_
	addq.w #1,a0

	cmp.b (a2),d6
	bne.b custom1

	lea 1(a2),a1
	bsr txttobuf
	move.l a1,a2
	bra.b custom6
	
custom1:move.l a3,a1
custom5:cmp.b 1(a1),d6
	bhi.b custom3
	moveq #0,d2
	move.b d6,d2
	sub.b (a1),d2
	bcs.b custom3
	moveq #0,d1
	move.b 2(a1),d1
	divu d1,d2
	swap d2
	tst.w d2
	bne.b custom3

	addq.w #3,a1
custom4:move.b (a1)+,(a0)+
	cmp.b #" ",(a1)
	bhi.b custom4
	swap d2
	add.b (a1)+,d2
	moveq #0,d0
	move.b d2,d0
	bsr hextod
	bsr txttobuf
	bra.b custom6
custom3:addq.w #3,a1
custom7:btst #7,(a1)+
	beq.b custom7
	cmp.b #-1,(a1)
	bne.b custom5
	bra.b custom8
custom6:lea 20(a4),a4
	lea linebuf+60-base(a6),a0
	cmp.l a0,a4
	bls.b custom8
	bsr rawline
	move.l a0,a4
custom8:

	move.b row-base(a6),d0
	cmp.b rowsm1-base(a6),d0
	bne.b customa
	bsr waitrmb
	beq.b custom9
	bsr clrscr
customa:addq.w #1,d6
	cmp.w #$100,d6
	bne.w custom2
	
custom9:st d7
customq:rts

MinCopCom = 5		; Minimum amount of MOVE commands for coplist
MaxWait	  = 11		; Maximum amount of adjacent wait/skip commands
huntcop:sub.l a4,a4
	move.l himem-base(a6),a5
	tst.l d3
	beq.b huntchp
	subq.l #2,d3
	bne.w huntcq
	movem.l para-base(a6),a4-a5
	cmp.l a4,a5
	bls.w huntcq
	move.l a4,d0
	btst d3,d0	;d3:0
	bne.w huntcq
	move.l a5,d0
	btst d3,d0
	bne.b huntcq

huntchp:move.l	#$0088008a,d2	;strobe regs
huntlp:	cmp.l a4,a5		;reached end yet?
	beq.b endhunt
	move.w (a4)+,d0
	cmp.w d0,d2
	beq.b huntstp		;find strobe
	swap d2
	cmp.w d0,d2
	beq.b huntstp
	addq.w #1,d0		;$ffff
	bne.b huntlp
	cmp.w #$fffe,(a4)
	bne.b huntlp
huntstp:addq.w #2,a4		;next time continue search from here
	lea -4(a4),a3		;end of coplist
	moveq #-MinCopCom,d3	;minimum amount of commands
cntsrch:moveq #-MaxWait,d1	;maximum amount wait/skip commands
srchlp:	subq.b #1,d1
	beq.b endsrch
	moveq #2,d0		;-$fffffffe
	add.l -(a3),d0		;get data
	beq.b endsrch
	subq.l #2,d0
	swap d0
	btst #0,d0		;ignore wait/skip commands
	bne.b srchlp
	cmp.w d2,d0		;strobe?
	beq.b endsrch
	swap d2
	cmp.w d2,d0		;strobe?
	beq.b endsrch
	cmp.w #$020,d0		;read only
	bcs.b endsrch
	cmp.w #$1fe,d0		;copnop
	bhi.b endsrch
	addq.l #1,d3		;inc mincounter
	move.l a3,d4		;save current
	bra.b cntsrch
endsrch:tst.l d3
	bmi.b badlist
	lea linebuf+1-base(a6),a0
	move.l d4,d0
	move.l a4,d1
	bsr twolong_
	bsr rawline		
	bsr stopit
	beq.b endhunt
badlist:bra.b huntlp

endhunt:st d7
huntcq:	rts

copper:	cmp.b #2,d3
	bgt.b copq

	moveq #16-1,d5
discop:	
cop1:	bsr.b ccore

	bsr.w stopit
	beq.b cop3

	cmp.b #2,d3
	bne.b cop2
	move.l para-base(a6),a0
	cmp.l para+4-base(a6),a0
	bcs.b cop1
	bra.b cop3

cop2:	dbf d5,cop1
cop3:	st d7
copq:	rts

ccore:	lea linebuf-base(a6),a0
	move.w #">.",(a0)+
	move.l para-base(a6),d0
	move.l d0,a2
	btst #0,d0		;even addr
	bne.w copq
	bsr.w longtoa		;chipmem, but use 32 bit
	add.w #1,a0
	move.l (a2),d1
	moveq #-2,d0
	cmp.l d0,d1
	bne.b ncopend
	lea copendl(pc),a1
	bsr.w txttobuf
	bra.w cop0
ncopend:move.l d1,d0
	and.l #$10001,d0
	cmp.l #$10000,d0
	bne.b nowait
	lea copwait(pc),a1
	bra.b dohvpos
nowait:	cmp.l #$10001,d0
	bne.b noskip
	lea copskip(pc),a1
dohvpos:bsr.w txttobuf
	addq.w #4,a0
	moveq #8,d2
	rol.l d2,d1
	move.b d1,d0		;vert
	bsr.w bytetoa_
	move.b #",",(a0)+
	rol.l d2,d1
	move.b d1,d0
	lsr.b #1,d0		;horiz
	bsr.w bytetoa_
	move.b #",",(a0)+
	rol.l d2,d1
	moveq #"0",d0
	bclr #7,d1		;waitblt disable
	beq.b wasclr	
	moveq #"1",d0
wasclr:	move.b d0,(a0)+
	move.b #",",(a0)+
	move.b d1,d0		;vert mask
	bsr.w bytetoa_
	move.b #",",(a0)+
	rol.l d2,d1
	move.b d1,d0
	lsr.b #1,d0		;horiz mask
	bsr.w bytetoa_
	bra.w cop0
noskip:	lea copmove(pc),a1
	bsr.w txttobuf
	addq.w #4,a0
	move.b #"#",(a0)+
	move.w d1,d0		;value
	bsr.w wordtoa_	
	move.b #",",(a0)+
	moveq #0,d0
	move.w (a2),d1		;dest
	cmp.w #$3e,d1
	bls.w hexdest
	cmp.w #$1fe,d1
	bhi.b hexdest
	move.w d1,d0
	lsr.w #1,d0		;$040-$1fe /2 
	lea copname(pc),a1
cntcop:	cmp.b (a1),d0
	bne.b copsrch
	addq.w #1,a1
cpycnam:move.b (a1)+,(a0)	;name found
	bclr #7,(a0)+
	beq.b cpycnam
	bra.b cop0
copsrch:cmp.b #$1fe/2,(a1)+		;unknown dest
	beq.b copdis2
findnxt:btst #7,(a1)+
	beq.b findnxt
	bra.b cntcop	
copdis2:lea cp2name(pc),a1
cntcop2:cmp.b (a1),d0		;first
	bcs.b copsrc2
	cmp.b 1(a1),d0		;last
	bhi.b copsrc2
	moveq #0,d2		;numbercnt
	move.b d0,d4
copnxt:	cmp.b (a1),d4
	beq.b fndcop
	addq.b #1,d2
	sub.b 2(a1),d4		;period
	cmp.b (a1),d4		;last
	bcc.b copnxt
	bra.b copsrc2
fndcop:	addq.w #3,a1
cpycnm2:move.b (a1)+,d0
	cmp.b #1,d0
	bhi.b copasci
	add.b d0,d2
	move.l d2,d0
	bsr.w hextod
	bra.b cpycnm2
copasci:move.b d0,(a0)	;name found
	bclr #7,(a0)+
	beq.b cpycnm2
	bra.b cop0
copsrc2:cmp.b #-1,(a1)		;unknown dest
	beq.b hexdest
	addq.w #3,a1		;skip infobytes
findn2:	btst #7,(a1)+		;skip name
	beq.b findn2
	bra.b cntcop2	
hexdest:move.w d1,d0
	bsr.w wordtoa_	 
cop0:	addq.l #4,para-base(a6)
	bra rawline

copaq:
copass:	tst.b d3
	beq.w copaq
	btst #0,para+3-base(a6)
	bne.b copaq
	move.l a5,a0

	addq.w #2,a0		;skip >,
	bsr.w skipspc		;check obsolete
copa0:	cmp.l lineend-base(a6),a0
	bhi.w copq
	cmp.b #" ",(a0)+	;search spc
	bne.b copa0
copa1:	cmp.l lineend-base(a6),a0	
	bhi.w endcopa
	cmp.b #" ",(a0)		;skip spc
	bne.b copa1_
	addq.w #1,a0
	bra.b copa1
copa1_:	move.l a0,a2		;cmdadr!
copa3:	cmp.l lineend-base(a6),a0
	bhi.b copa4
	move.b (a0)+,d0
	cmp.b #"Z",d0
	bhi.b copa3
	cmp.b #"A",d0
	bcs.b copa3
	bset #5,d0		;lcase all
	move.b d0,-1(a0)
	bra.b copa3
copa4:	lea copmove(pc),a1
	bsr.w copcmp		;a2:cmdadr,>a3:nexttxt
	bne.w nocopmv
	cmp.b #"#",(a3)+
	bne.w copassy
	st d7
	bsr.w atoword_
	tst.b d7
	beq.w copassy
	move.w d0,d6		;value
	cmp.b #",",(a3)+
	bne.w copassy
	cmp.b #"$",(a3)
	bne.b destsym
	bsr.w atoword_
	tst.b d7
	beq.w copassy
	btst #0,d0		;moveflag
	bne.w copassy
copmv4:	swap d0			;abs dest
	move.w d6,d0
	move.l d0,d6
	bra.w copmake
destsym:lea copname(pc),a1
copmv3:	move.l a3,a0
	moveq #0,d0
	move.b (a1)+,d0
copmv1:	move.b (a1),d1
	bset #5,d1		;to lcase
	bclr #7,d1
	cmp.b (a0)+,d1		
	bne.b copmv0
	btst #7,(a1)+
	beq.b copmv1
	add.w d0,d0		;regadr
	bra.b copmv4
copmv0:	cmp.b #$1fe/2,d0	;end of tab
	beq.b ncopkey
copmv2:	btst #7,(a1)+		;next entry
	beq.b copmv2
	bra.b copmv3
ncopkey:
	lea cp2name(pc),a1
copmv5:	move.l a3,a0
	moveq #0,d0
	move.b (a1)+,d0		;1st
	moveq #0,d2
	move.b (a1)+,d2		;last
	moveq #0,d3
	move.b (a1)+,d3		;step
copmv7:	move.b (a1),d1
	cmp.b #1,d1		;nameindex?
	bhi.b copmv9
	moveq #0,d4
	move.b (a0),d4
	sub.b #"0",d4
	bcs.w copmv9	;assy
	cmp.b #9,d4
	bhi.w copmv9	;assy
	addq.w #1,a0
	move.b (a0),d5
	sub.b #"0",d5
	bcs.b copmv10		;1digit
	cmp.b #9,d5
	bhi.b copmv10
	addq.w #1,a0
	mulu #10,d4		;2digit
	add.b d5,d4
copmv10:sub.b d1,d4		;numoffset
	bmi.w copassy		;too low
	add.w d3,d3
	mulu d3,d4		;regoffset
	add.w d0,d0
	add.w d0,d4		;regdest
	add.w d2,d2
	cmp.w d2,d4
	bhi.w copassy		;too high
	bra.b copmv11
copmv9:	bset #5,d1		;to lcase
	bclr #7,d1
	cmp.b (a0)+,d1		
	bne.b copmv8
copmv11:btst #7,(a1)+
	beq.b copmv7
	move.w d4,d0		;regdest
	bra.w copmv4
copmv8:	cmp.b #-1,d0		;end of tab
	beq.w copassy	;ncopkey
copmv6:	btst #7,(a1)+		;next entry
	beq.b copmv6
	bra.w copmv5

nocopmv:lea copwait(pc),a1
	bsr.w copcmp
	bne.b nocopwt
	move.l #$10000,d6
	bra.b waitskp

nocopwt:lea copskip(pc),a1
	bsr.w copcmp
	bne.b nocopsk
	move.l #$10001,d6
waitskp:st d7
	bsr.w atobyte_
	tst.b d7
	beq.w copassy
	move.b d0,d4		;vert
	lsl.l #8,d4
	cmp.b #",",(a3)+
	bne.w copassy
	bsr.w atobyte_
	tst.b d7
	beq.w copassy
	add.b d0,d0
	bcs.w copassy		;horiz
	move.b d0,d4
	lsl.l #8,d4
	cmp.b #",",(a3)+
	bne.b copassy
	move.b (a3)+,d0		;bltwait disable
	moveq #"0",d1
	cmp.b d0,d1
	beq.b bltwait
	moveq #"1",d1
	cmp.b d0,d1
	bne.b copassy
	bset #7,d4
bltwait:cmp.b #",",(a3)+
	bne.b copassy
	bsr.w atobyte_
	tst.b d7
	beq.b copassy
	cmp.b #$7f,d0		;vert mask
	bhi.b copassy
	or.b d0,d4
	lsl.l #8,d4
	cmp.b #",",(a3)+
	bne.b copassy
	bsr.w atobyte_
	tst.b d7
	beq.b copassy
	add.b d0,d0		;horiz mask
	bcs.b copassy
	move.b d0,d4
	or.l d4,d6
	bra.b copmake

nocopsk:lea copendl(pc),a1
	bsr.b copcmp
	bne.b nocopel
	moveq #-2,d6		;endlist
	bra.b copmake

nocopel:lea copdcl(pc),a1
	bsr.b copcmp
	bne.b nocopdc
	st d7
	bsr.w atolong_
	tst.b d7
	beq.b copassy
	move.l d0,d6
	bra.b copmake

nocopdc:bra.b copassy

copmake:move.l para-base(a6),a0
	move.l d6,(a0)

	bsr.w csup
	moveq #1,d3
	moveq #2-1,d5
	bsr.w discop

copassy:bsr.w csup
	move.b #11,col-base(a6)
endcopa:st d7
	rts

copcmp:	move.l a2,-(a7)
copcmp0:move.b (a1),d0
	bset #5,d0	;to lcase
	bclr #7,d0
	cmp.b (a2)+,d0
	bne.b copdif
	btst #7,(a1)+
	beq.b copcmp0	
	move.l a2,a0
	bsr.w skipspc	;eol check?
	move.l a0,a3
	moveq #0,d0
copdif:	move.l (a7)+,a2
	rts		;a3:nextptr,bne.b diff, beq.b equal

ob:	moveq #0,d4
	bra.b odoit
ow:	moveq #1,d4
	bra.b odoit
ol:	moveq #2,d4
	bra.b odoit
eb:	moveq #3,d4
	bra.b edoit
ew:	moveq #4,d4
	bra.b edoit
el:	moveq #5,d4
edoit:	lea eortxt(pc),a2
	bra.b odo0
odoit:	lea filltxt(pc),a2
odo0:	move.b lpinfo(pc,d4.w),d5
	cmp.b #8,d5
	beq.b obyte
	cmp.b #2,cpu-base(a6)
	bcc.b obyte		;odd word/longword
	btst #0,para+3-base(a6)
	bne.b owq
obyte:	subq.l #3,d3	;3 parameters
	bne.b owq
	bset d5,d3	;overflow
	movem.l para-base(a6),d0/d1/d2
	tst.b d5
	beq.b olong
	cmp.l d3,d2	;argument to large
	bcc.b owq
olong:	move.l d0,a0
	add.w d4,d4	;2bytes/ptr
	lea lptoa_(pc),a4
	add.w lptoa_(pc,d4.w),a4
	lsl.w #2,d4	;8bytes/subroutine
	jsr lpsubs(pc,d4.w)
	move.l a0,d1		;d0:start,a0:end
	lea linebuf+1-base(a6),a0
	bsr.w twolong_
	move.l a2,a1
	bsr.w txttobuf
	move.l d2,d0
	jsr (a4)
	bsr.w rawline

	st d7
owq:	rts
lptoa_:	dc.w bytetoa_-lptoa_,wordtoa_-lptoa_,longtoa_-lptoa_
	dc.w bytetoa_-lptoa_,wordtoa_-lptoa_,longtoa_-lptoa_
lpinfo:	dc.b 8,16,0,8,16,0	;used bits,0:32

lpsubs:	move.b d2,(a0)+
	cmp.l d1,a0
	bcs.b *-4
	rts
	move.w d2,(a0)+
	cmp.l d1,a0
	bcs.b *-4
	rts
	move.l d2,(a0)+
	cmp.l d1,a0
	bcs.b *-4
	rts
	eor.b d2,(a0)+
	cmp.l d1,a0
	bcs.b *-4
	rts
	eor.w d2,(a0)+
	cmp.l d1,a0
	bcs.b *-4
	rts
	eor.l d2,(a0)+
	cmp.l d1,a0
	bcs.b *-4
	rts

nopit:	subq.l #2,d3
	bne.b nopitq
	movem.l para-base(a6),d0-d1
	btst d3,d0
	bne.b nopitq
	move.l d0,a0
nopit1:	subq.l #1,d1
	bmi.b nopit0
	move.w #$4e71,(a0)+
	bra.b nopit1
nopit0:	st d7
nopitq:	rts

implode:subq.l #2,d3
	bmi.b noimpl
	movem.l para-base(a6),d0-d2
	subq.l #1,d3
	beq.b impmode
	moveq #0,d2
impmode:moveq #11,d3
	cmp.l d3,d2
	bhi.b noimpl
	swap d2
	btst #0,d0
	bne.b noimpl
	move.l d0,a0		;start
	sub.l d0,d1
	bls.b noimpl
	move.l d1,d0		;length
	move.l d0,d3

	sub.l a1,a1
	move.l d2,d1		;mode
	bsr.b doimp

	lea linebuf+1-base(a6),a0
	lea impetxt(pc),a1
	move.l d0,d1
	beq.b imperr
	lea impatxt(pc),a1
	bmi.b imperr
	lea gaintxt+1(pc),a1
	bsr txttobuf
	sub.l d1,d3
	move.l d3,d0	
	bsr hextoa_
	lea impotxt(pc),a1
	bsr txttobuf
	move.l para-base(a6),d0
	add.l d0,d1
	bsr twolong_
	bra.b impok
imperr:	bsr txttobuf
impok:	bsr rawline

	st d7
noimpl:	rts

;
; implode:
;
; In:	a0.l=*buffer
;	d0.l=data length
;	d1.l=crunch mode
;
; Out:	d0.l=<0:user break; 0:error; <>0:crunched length
;

doimp:
im00:	movem.l	d2-d7/a2-a6,-(sp)
	moveq	#$57,d2
im01:	clr.w	-(sp)
	dbf	d2,im01
	move.l	sp,a6
;	move.l	a5,2(a6)	;obsolete
	cmp.l	#$40,d0
	blo	im23
	lsr.l	#8,d1
	scs	(a6)
	lsr.l	#8,d1
	cmp.b	#12,d1
	blo.s	im02
	moveq	#0,d1
im02:
;	move.l	a1,6(a6)	;obsolete
	move.l	a0,10(a6)
	move.l	a0,$22(a6)
	move.l	a0,$26(a6)
	move.l	d0,$12(a6)
	add.l	d0,a0
	move.l	a0,14(a6)
	lea	imtab0(pc),a0
	lsl.w	#2,d1
	move.l	0(a0,d1.w),d1
	addq.l	#1,d1
	cmp.l	d0,d1
	bls.s	im03
	move.l	d0,d1
	subq.l	#1,d1
im03:	move.l	d1,$1A(a6)
	subq.l	#1,d1
	moveq	#0,d0
im04:	cmp.l	(a0)+,d1
	bls.s	im05
	addq.b	#1,d0
	bra.s	im04
im05:	move.b	d0,1(a6)
	lea	$A4(a6),a1
	moveq	#12,d1
	mulu	d1,d0
	lea	imtab1(pc),a0
	add.l	d0,a0
	subq.w	#1,d1
im06:	move.b	(a0)+,(a1)+
	dbf	d1,im06
	lea	$74(a6),a1
	lea	$A4(a6),a0
	moveq	#11,d1
im07:	move.b	(a0)+,d0
	moveq	#0,d2
	bset	d0,d2
	move.l	d2,(a1)+
	dbf	d1,im07
	lea	$74(a6),a0
	lea	$84(a6),a1
	moveq	#7,d1
im08:	move.l	(a0)+,d0
	add.l	d0,(a1)+
	dbf	d1,im08
	tst.b	(a6)
	beq.s	im11
	lea	$74(a6),a1
	moveq	#7,d0
im09:	move.l	(a1)+,d1
	move.w	d1,(a2)+
	dbf	d0,im09
	lea	$A4(a6),a1
	moveq	#11,d0
im10:	move.b	(a1)+,(a2)+
	dbf	d0,im10
im11:	move.b	#7,$2D(a6)
im12:	bsr	im26
	beq	im22
	bsr	im28
	beq.s	im15
	bsr	im55
	bne.s	im13

;	move.l	$22(a6),a0
;	move.l	$26(a6),a1
;	move.b	(a0),(a1)
;	addq.l	#1,$22(a6)
;	addq.l	#1,$26(a6)
;	addq.l	#1,$30(a6)
;	addq.l	#1,$1E(a6)
;	cmp.l	#$4012,$30(a6)
	lea $1e(a6),a5
	addq.l #1,(a5)+		;$1e
	move.l (a5),a0		;$22
	addq.l #1,(a5)+		;$22
	move.l (a5),a1		;$26
	move.b (a0),(a1)
	addq.l #1,(a5)		;$26
	addq.l #1,$30(a6)	;$30	
	cmp.l #$4012,$30(a6)
	blo.s	im12
	bra.s	im15
im13:	move.b	$5C(a6),d0
	move.l	$60(a6),d1
	bsr	im37
	move.b	$5E(a6),d0
	move.w	$66(a6),d1
	bsr	im37
	move.b	$5D(a6),d0
	move.w	$64(a6),d1
	cmp.b	#13,d0
	bne.s	im14
	move.l	$26(a6),a0
	move.b	d1,(a0)+
	move.l	a0,$26(a6)
	moveq	#5,d0
	moveq	#$1F,d1
im14:	bsr	im37
	moveq	#0,d0
	move.l d0,$30(a6)	;clr.l	$30(a6)
	move.b	$2E(a6),d0
	add.l	d0,$22(a6)
	bra	im12
im15:	bsr	im26
	beq	im22

;	move.l	$22(a6),a0
;	move.l	$26(a6),a1
;	move.b	(a0),(a1)
;	addq.l	#1,$22(a6)
;	addq.l	#1,$26(a6)
;	addq.l	#1,$30(a6)
;	addq.l	#1,$1E(a6)

	lea $1e(a6),a5
	addq.l #1,(a5)+		;$1e
	move.l (a5),a0		;$22
	addq.l #1,(a5)		;$22
	move.l (a5)+,d0		;$22
	move.l (a5),a1		;$26
	move.b (a0),(a1)
	addq.l #1,(a5)		;$26
	addq.l #1,$30(a6)	;$30
;	move.l	$22(a6),d0
	cmp.l	14(a6),d0
	bne.s	im15
	bsr	im26
	beq	im22
	tst.b	(a6)
	bne	im19
	move.l	$26(a6),d0
	sub.l	10(a6),d0
	moveq #12,d1
	cmp.l d1,d0		;cmp.l #12,d0
	blo	im23

	move.l	$12(a6),d1
	sub.l	d0,d1
	moveq #$36,d7
	cmp.l d7,d1		;cmp.l	#$36,d1
	bls	im23
	move.l	10(a6),a1
	move.l	$26(a6),a0
	move.w #$ff00,d7	;move.l	#$FF00,d7
	btst	#0,d0
	beq.s	im16
	moveq	#0,d7
	addq.l	#1,d0
	clr.b	(a0)+
im16:	move.l	(a1),8(a0)
	move.l	#ImploderID,(a1)
	move.l	4(a1),4(a0)
	move.l	$12(a6),4(a1)
	move.l	8(a1),(a0)
	move.l	d0,8(a1)
	moveq #$2e,d1
	add.l d1,d0		;add.l	#$2E,d0
	move.l	d0,$16(a6)
	move.l	$30(a6),12(a0)
	move.b	$2C(a6),d1
	and.w	#$FE,d1
	move.b	$2D(a6),d0
	bset	d0,d1
	or.w	d7,d1
	move.w	d1,$10(a0)
	lea	$74(a6),a1
	add.w	#$12,a0
	moveq	#7,d0
im17:	move.l	(a1)+,d1
	move.w	d1,(a0)+
	dbf	d0,im17
	lea	$A4(a6),a1
	moveq	#11,d0
im18:	move.b	(a1)+,(a0)+
	dbf	d0,im18
	bra.s	im23
im19:	move.l	$26(a6),d0
	sub.l	10(a6),d0
	move.l	$12(a6),d1
	sub.l	d0,d1
	moveq #6,d2
	cmp.l d2,d1		;cmp.l	#6,d1
	bls.s	im23
	move.b	$2C(a6),d1
	and.b	#$FE,d1
	move.b	$2D(a6),d2
	bset	d2,d1
	move.l	$26(a6),a0
	btst	#0,d0
	beq.s	im20
	move.b	d1,(a0)+
	move.l	$30(a6),(a0)
	bra.s	im21
im20:	move.l	$30(a6),(a0)+
	move.b	d1,(a0)
im21:	addq.l	#5,d0
	move.l	d0,$16(a6)
	bra.s	im23
im22:	moveq	#-1,d0
	bra.s	im24
im23:	move.l	$16(a6),d0
im24:	moveq	#$57,d2
im25:	clr.w	(sp)+
	dbf	d2,im25
	movem.l	(sp)+,d2-d7/a2-a6
	tst.l	d0
	rts

imtab0:	dc.l	128,256,512,1024,1792,3328,5376,9472,20736,37376,67840,67840
imtab1:	dc.l	$5050505,$5050505,$6060606,$5060707,$6060606,$7070606
	dc.l	$5060707,$7070707,$8080808,$5060708,$7070808,$8080909
	dc.l	$6070708,$7080909,$8090A0A,$6070708,$709090A,$80A0B0B
	dc.l	$6070808,$709090A,$80A0B0C,$6070808,$709090A,$90A0C0D
	dc.l	$6070708,$709090C,$90A0C0E,$6070809,$7090A0C,$90B0D0F
	dc.l	$6070808,$70A0B0B,$90C0D10,$6080809,$70B0C0C,$90D0E11
imtab2:	dc.l	$2060E,$1020304
imtab3:	dc.l	$1010101,$2030304,$405070E
imtab4:	dc.l	$20002,$20002,$6000A,$A0012,$16002A,$8A4012

im26:	lea base(pc),a5
	tst.w count-base(a5)
	bne.b impno
	move.w #10,count-base(a5)
	bra.b im27
impno:	rts			;beq.b abort

im27:	movem.l d0-d1/a0-a1/a6,-(a7)

	move.l	14(a6),d0
	sub.l	$22(a6),d0	;togo
	move.l	$22(a6),d1
	sub.l	$26(a6),d1	;saved

	lea base(pc),a6
	lea linebuf+1-base(a6),a0
	lea togotxt(pc),a1
	bsr txttobuf
	bsr hextoa_
	bsr txttobuf
	move.l d1,d0
	bsr hextoa_
	bsr rawline
	bsr csup	

	bsr stopit
	movem.l (a7)+,d0-d1/a0-a1/a6
	rts

im28:	move.l	$22(a6),a5
	move.l	14(a6),d4
	move.l	a5,d0
	addq.l	#1,d0
	add.l	$1A(a6),d0
	cmp.l	d4,d0
	bls.s	im29
	move.l	d4,d0
	move.l	d0,d1
	sub.l	a5,d1
	cmp.l	#3,d1
	bcc.s	im29
	moveq	#0,d0
	rts
im29:	move.l	d0,d5
	move.l	a5,a2
	addq.l	#1,a2
	move.l	a2,a4
	moveq	#1,d7
	move.b	(a5),d3
	lea	$34(a6),a3
im30:	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.b	(a2)+,d3
	beq.s	im32
	cmp.l	a2,d5
	bhi.s	im30
im31:	moveq	#-1,d0
	rts
im32:	cmp.l	a2,d5
	bls.s	im31
	move.l	a4,a0
	move.l	a2,a1
	cmpm.b	(a0)+,(a1)+
	bne.s	im30
	cmpm.b	(a0)+,(a1)+
	bne.s	im35
	cmpm.b	(a0)+,(a1)+
	bne.s	im34
	move.w	#251,d0
im33:	cmpm.b	(a0)+,(a1)+
	dbne	d0,im33
im34:	cmp.l	d4,a1
	bls.s	im35
	move.l	d4,a1
im35:	move.l	a1,d6
	sub.l	a2,d6
	cmp.w	d6,d7
	bcc.s	im30
	move.w	d6,d7
	cmp.w	#8,d6
	bhi.s	im36
	tst.b	-2(a3,d6.w)
	bne	im30
	move.b	d6,-2(a3,d6.w)
	move.l	a2,d0
	sub.l	a5,d0
	subq.l	#2,d0
	move.w	d6,d1
	lsl.w	#2,d1
	move.l	d0,0(a3,d1.w)
	bra	im30
im36:	move.b	d6,7(a3)
	move.l	a2,d0
	sub.l	a5,d0
	subq.l	#2,d0
	move.l	d0,$24(a3)
	cmp.b	#$FF,d6
	bne	im30
	bra.s	im31
im37:	move.b	$2C(a6),d2
	move.b	$2D(a6),d3
	move.l	$26(a6),a0
im38:	lsr.l	#1,d1
	roxr.b	#1,d2
	subq.b	#1,d3
	bpl.s	im39
	moveq	#7,d3
	move.b	d2,(a0)+
	moveq	#0,d2
im39:	subq.b	#1,d0
	bne.s	im38
	move.l	a0,$26(a6)
	move.b	d3,$2D(a6)
	move.b	d2,$2C(a6)
	rts
im40:	and.l	#$FF,d0
	cmp.b	#13,d0
	bhi.s	im42
	cmp.b	#5,d0
	bhi.s	im41
	lea	imtab2(pc),a0
	move.b	-2(a0,d0.w),$71(a6)
	move.b	2(a0,d0.w),$69(a6)
	bra.s	im44
im41:	subq.b	#6,d0
	or.b	#$F0,d0
	move.b	d0,$71(a6)
	move.b	#8,$69(a6)
	bra.s	im43
im42:	move.b	#$1F,$70(a6)
	move.b	d0,$71(a6)
	move.b	#13,$69(a6)
im43:	moveq	#5,d0
im44:	subq.b	#2,d0
	move.l	$30(a6),d2
	lea	imtab3(pc),a1
	lea	imtab4(pc),a0
	add.l	d0,a0
	add.l	d0,a0
	cmp.w	(a0),d2
	bcc.s	im45
	move.b	0(a1,d0.w),d6
	move.b	d6,d3
	addq.b	#1,d3
	sf $73(a6)		;move.b	#0,$73(a6)
	moveq	#0,d4
	bra.s	im48
im45:	cmp.w	8(a0),d2
	bcc.s	im46
	move.b	4(a1,d0.w),d6
	move.b	d6,d3
	addq.b	#2,d3
	move.b	#2,$73(a6)
	move.w	(a0),d4
	bra.s	im48
im46:	cmp.w	$10(a0),d2
	blo.s	im47
	moveq	#0,d0
	rts
im47:	move.b	8(a1,d0.w),d6
	move.b	d6,d3
	addq.b	#2,d3
	move.b	#3,$73(a6)
	move.w	8(a0),d4
im48:	move.b	d3,$6A(a6)
	sub.w	d4,d2
	moveq	#$10,d5
	sub.b	d6,d5
	lsl.w	d5,d2
im49:	add.w	d2,d2
	roxl	$72(a6)
	subq.b	#1,d6
	bne.s	im49
	lea	$A4(a6),a1
	lea	$74(a6),a0
	add.w	d0,a0
	add.w	d0,a0
	add.w	d0,a0
	add.w	d0,a0
	cmp.l	(a0),d1
	bcc.s	im50
	move.b	0(a1,d0.w),d6
	move.b	d6,d3
	addq.b	#1,d3
	moveq	#0,d7
	moveq	#0,d4
	bra.s	im53
im50:	cmp.l	$10(a0),d1
	bcc.s	im51
	move.b	4(a1,d0.w),d6
	move.b	d6,d3
	addq.b	#2,d3
	moveq	#2,d7
	move.l	(a0),d4
	bra.s	im53
im51:	cmp.l	$20(a0),d1
	blo.s	im52
	moveq	#0,d0
	rts
im52:	move.b	8(a1,d0.w),d6
	move.b	d6,d3
	addq.b	#2,d3
	moveq	#3,d7
	move.l	$10(a0),d4
im53:	move.b	d3,$68(a6)
	sub.l	d4,d1
	moveq	#$20,d5
	sub.b	d6,d5
	lsl.l	d5,d1
im54:	add.l	d1,d1
	addx.l	d7,d7
	subq.b	#1,d6
	bne.s	im54
	move.l	d7,$6C(a6)
	moveq	#-1,d0
	rts
im55:	clr.w	$2A(a6)
	clr.b	$2E(a6)
	lea	$34(a6),a4
	lea	$3C(a6),a5
im56:	move.l	(a5)+,d1
	move.b	(a4)+,d0
	beq.s	im58
	bsr	im40
	beq.s	im58
	moveq	#0,d0
	moveq	#0,d1
	move.b	-1(a4),d0
	lsl.w	#3,d0
	add.b	$69(a6),d1
	add.b	$68(a6),d1
	add.b	$6A(a6),d1
	sub.w	d1,d0
	bmi.s	im58
	cmp.w	$2A(a6),d0
	blo.s	im58
	move.w	d0,$2A(a6)
	move.b	-1(a4),$2E(a6)
	lea	$5C(a6),a0
	lea	$68(a6),a1
	moveq	#12,d1
im57:	move.b	(a1)+,(a0)+
	dbf	d1,im57
im58:	move.l	a4,d0
	sub.l	a6,d0
	cmp.w	#$3C,d0
	bne.s	im56
	clr.l	-(a4)
	clr.l	-(a4)
	tst.w	$2E(a6)
	rts


explode:subq.l #1,d3
	bne.b exploq
	move.l para-base(a6),d0
	btst #0,d0
	bne.b exploq
	move.l d0,a0
	move.l a0,d2		;dest
	move.l 4(a0),d3		;decrunched length

	bsr doexp
	tst.l d0
	lea linebuf+1-base(a6),a0
	lea expetxt(pc),a1
	beq.b experr
	lea expotxt(pc),a1
	bsr txttobuf
	move.l d2,d0
	move.l d2,d1
	add.l d3,d1
	bsr twolong_
	bra.b expok
experr:	bsr txttobuf
expok:	bsr rawline
	st d7
exploq:	rts

;
; explode:
;
; Die entkomprimierten Daten werden in den gleichen Bereich geschrieben, in
; dem die komprimierten Daten stehen (dieser Bereich muß deshalb groß genug sein).
;
; In:	a0.l=*buffer
;
; Out:	d0.l=0:Error; -1:Ok
;

doexp:	movem.l	d2-d5/a2-a4,-(sp)
	move.l	a0,a3
	move.l	a0,a4
	cmp.l	#ImploderID,(a0)+
	bne.s	ex05
	add.l	(a0)+,a4
	add.l	(a0)+,a3
	move.l	a3,a2
	move.l	(a2)+,-(a0)
	move.l	(a2)+,-(a0)
	move.l	(a2)+,-(a0)
	move.l	(a2)+,d2
	move.w	(a2)+,d3
	bmi.s	ex00
	subq.l	#1,a3
ex00:	lea	-28(sp),sp
	move.l	sp,a1
	moveq	#6,d0
ex01:	move.l	(a2)+,(a1)+
	dbf	d0,ex01
	move.l	sp,a1
	moveq	#0,d4
ex02:	tst.l	d2
	beq.s	ex04
ex03:	move.b	-(a3),-(a4)
	subq.l	#1,d2
	bne.s	ex03
ex04:	cmp.l	a4,a0
	blo.s	ex07
	lea	28(sp),sp
	moveq	#-1,d0
	cmp.l	a3,a0
	beq.s	ex06
ex05:	moveq	#0,d0
ex06:	movem.l	(sp)+,d2-d5/a2-a4
	tst.l	d0
	rts
ex07:	add.b	d3,d3
	bne.s	ex08
	move.b	-(a3),d3
	addx.b	d3,d3
ex08:	bcc.s	ex20
	add.b	d3,d3
	bne.s	ex09
	move.b	-(a3),d3
	addx.b	d3,d3
ex09:	bcc.s	ex19
	add.b	d3,d3
	bne.s	ex10
	move.b	-(a3),d3
	addx.b	d3,d3
ex10:	bcc.s	ex18
	add.b	d3,d3
	bne.s	ex11
	move.b	-(a3),d3
	addx.b	d3,d3
ex11:	bcc.s	ex17
	add.b	d3,d3
	bne.s	ex12
	move.b	-(a3),d3
	addx.b	d3,d3
ex12:	bcc.s	ex13
	move.b	-(a3),d4
	moveq	#3,d0
	bra.s	ex21
ex13:	add.b	d3,d3
	bne.s	ex14
	move.b	-(a3),d3
	addx.b	d3,d3
ex14:	addx.b	d4,d4
	add.b	d3,d3
	bne.s	ex15
	move.b	-(a3),d3
	addx.b	d3,d3
ex15:	addx.b	d4,d4
	add.b	d3,d3
	bne.s	ex16
	move.b	-(a3),d3
	addx.b	d3,d3
ex16:	addx.b	d4,d4
	addq.b	#6,d4
	moveq	#3,d0
	bra.s	ex21
ex17:	moveq	#5,d4
	moveq	#3,d0
	bra.s	ex21
ex18:	moveq	#4,d4
	moveq	#2,d0
	bra.s	ex21
ex19:	moveq	#3,d4
	moveq	#1,d0
	bra.s	ex21
ex20:	moveq	#2,d4
	moveq	#0,d0
ex21:	moveq	#0,d5
	move.w	d0,d1
	add.b	d3,d3
	bne.s	ex22
	move.b	-(a3),d3
	addx.b	d3,d3
ex22:	bcc.s	ex25
	add.b	d3,d3
	bne.s	ex23
	move.b	-(a3),d3
	addx.b	d3,d3
ex23:	bcc.s	ex24
	move.b	extab0(pc,d0.w),d5
	addq.b	#8,d0
	bra.s	ex25
ex24:	moveq	#2,d5
	addq.b	#4,d0
ex25:	move.b	extab1(pc,d0.w),d0
ex26:	add.b	d3,d3
	bne.s	ex27
	move.b	-(a3),d3
	addx.b	d3,d3
ex27:	addx.w	d2,d2
	subq.b	#1,d0
	bne.s	ex26
	add.w	d5,d2
	moveq	#0,d5
	move.l	d5,a2
	move.w	d1,d0
	add.b	d3,d3
	bne.s	ex28
	move.b	-(a3),d3
	addx.b	d3,d3
ex28:	bcc.s	ex31
	add.w	d1,d1
	add.b	d3,d3
	bne.s	ex29
	move.b	-(a3),d3
	addx.b	d3,d3
ex29:	bcc.s	ex30
	move.w	8(a1,d1.w),a2
	addq.b	#8,d0
	bra.s	ex31
ex30:	move.w	0(a1,d1.w),a2
	addq.b	#4,d0
ex31:	move.b	$10(a1,d0.w),d0
ex32:	add.b	d3,d3
	bne.s	ex33
	move.b	-(a3),d3
	addx.b	d3,d3
ex33:	addx.l	d5,d5
	subq.b	#1,d0
	bne.s	ex32
	addq.w	#1,a2
	add.l	d5,a2
	add.l	a4,a2
ex34:	move.b	-(a2),-(a4)
	subq.b	#1,d4
	bne.s	ex34
	bra	ex02
extab0:	dc.l	$60A0A12
extab1:	dc.l	$1010101,$2030304,$405070E


stopit:	cmp.b #$1b,ascii-base(a6)
	beq.b stopit0
	btst #10,$dff016
	beq.b stopit
	rts			;bne.b noquit
stopit0:clr.w buflen-base(a6)	;beq.b exitall
	rts
waitrmb:cmp.b #$1b,ascii-base(a6)
	beq.b stopit0
	btst #10,$dff016
	bne.b waitrmb
	move.w #5,count-base(a6)
waitit1:tst.w count-base(a6)
	bne.b waitit1
waitit0:btst #10,$dff016
	beq.b waitit0
	rts			;beq.b exitall
		

twolong_:
	bsr.b longtoa_
	move.b #"-",(a0)+
	move.l d1,d0
	bra.b longtoa_
twoadr_:bsr.b adrtoa_
	move.b #"-",(a0)+
	move.l d1,d0
	bra.b adrtoa_
nibtoa_:move.b #"$",(a0)+
nibtoa:	movem.l d0-d2,-(a7)
	moveq #1-1,d2
	ror.l #4,d0
	bra.b lta0
bytetoa_:move.b #"$",(a0)+
bytetoa:movem.l d0-d2,-(a7)
	moveq #2-1,d2
	ror.l #8,d0
	bra.b lta0
wordtoa_:move.b #"$",(a0)+
wordtoa:movem.l d0-d2,-(a7)
	moveq #4-1,d2
	swap d0
	bra.b lta0
adrtoa_:move.b #"$",(a0)+
adrtoa:	movem.l d0-d2,-(a7)
	moveq #6-1,d2
	lsl.l #8,d0
	bra.b lta0
longtoa_:move.b #"$",(a0)+
longtoa:movem.l d0-d2,-(a7)
	moveq #8-1,d2
lta0:	rol.l #4,d0
	moveq #$0f,d1
	and.w d0,d1
	move.b l2ascii(pc,d1.w),(a0)+
	dbf d2,lta0
	movem.l (a7)+,d0-d2
	rts
l2ascii:dc.b "0123456789abcdef"
hextoa_:movem.l d0-d3,-(a7)
	moveq #9,d2
	cmp.l d2,d0
	bls.b hta3
	move.b #"$",(a0)+
hta3:	sf d3
	moveq #8-1,d2
hta0:	rol.l #4,d0
	moveq #$0f,d1
	and.w d0,d1
	bne.b hta1
	tst.w d2
	beq.b hta1
	tst.b d3
	beq.b hta2
hta1:	st d3
	move.b l2ascii(pc,d1.w),(a0)+
hta2:	dbf d2,hta0			
	movem.l (a7)+,d0-d3
	rts
wordtod:move.l d0,-(a7)
	ext.l d0
	divu #1000,d0
	add.b #"0",d0
	move.b d0,(a0)+
	clr.w d0
	swap d0
	divu #100,d0
	add.b #"0",d0
	move.b d0,(a0)+
	swap d0
	bra.b btd0
bytetod:move.l d0,-(a7)
btd0:	cmp.b #99,d0
	bls.b btd1
	moveq #99,d0	
btd1:	ext.w d0
	ext.l d0
	divu #10,d0
	bra.b ntd1
nibtod:	move.l d0,-(a7)
	moveq #%1111,d0
	and.l (a7),d0
	divu #10,d0
	beq.b ntd0
ntd1:	add.b #"0",d0
	move.b d0,(a0)+
ntd0:	swap d0
	add.b #"0",d0
	move.b d0,(a0)+
	move.l (a7)+,d0
	rts
hextod:	movem.l d0-d4/a1,-(a7)
	lea divtab(pc),a1
	moveq #10-1,d1
	sf d4
hd0:	moveq #"0",d2
	move.l (a1)+,d3
hd1:	cmp.l d3,d0
	bcs.b hd2
	st d4
	sub.l d3,d0
	addq.b #1,d2
	bra.b hd1
hd2:	tst.w d1
	beq.b hd4
	tst.b d4
	beq.b hd3
hd4:	move.b d2,(a0)+
hd3:	dbf d1,hd0
	movem.l (a7)+,d0-d4/a1
	rts
divtab:	dc.l 1000000000,100000000,10000000,1000000
	dc.l 100000,10000,1000,100,10,1

hextob:	movem.l d0-d4,-(a7)
	sf d4
	bsr.b hb3	
	bsr.b hb3	
	bsr.b hb3	
	st d4
	bsr.b hb3	
	movem.l (a7)+,d0-d4
	rts
hb3:	rol.l #8,d0
	move.b d0,d3
	bne.b hb2
	tst.b d4
	beq.b hb4
hb2:	st d4
bytetob:moveq #8-1,d2
hb0:	moveq #"0",d1
	add.b d3,d3
	bcc.b hb1
	moveq #"1",d1
hb1:	move.b d1,(a0)+
	dbf d2,hb0
	move.b #" ",(a0)+
hb4:	rts

atolong_:cmp.b #"$",(a3)
	bne.b atolong
	addq.w #1,a3
atolong:moveq #8-1,d2
	bra.b atob2
atoword_:cmp.b #"$",(a3)
	bne.b atoword
	addq.w #1,a3
atoword:moveq #4-1,d2
	bra.b atob2
atobyte_:cmp.b #"$",(a3)
	bne.b atobyte
	addq.w #1,a3
atobyte:moveq #2-1,d2
atob2:	moveq #0,d0
atob1:	move.b (a3),d1
	cmp.b #"f",d1
	bhi.b atob3
	sub.b #"0",d1
	bcs.b atob3
	cmp.b #9,d1
	bls.b atob0
	cmp.b #"a"-"0",d1
	bcs.b atob3
	sub.b #"a"-"0"-10,d1
atob0:	lsl.l #4,d0
	or.b d1,d0
	addq.w #1,a3
	dbf d2,atob1
atob3:	tst.l d0
	rts
atodnib:moveq #0,d0		;0-99
	move.b (a3),d1
	sub.b #"0",d1
	bcs.b atdnb0
	cmp.b #9,d1
	bhi.b atdnb0
	addq.w #1,a3
	move.b d1,d0
	move.b (a3),d1
	sub.b #"0",d1
	bcs.b atdnb0
	cmp.b #9,d1
	bhi.b atdnb0
	addq.w #1,a3
	mulu #10,d0
	add.b d1,d0
atdnb0:	tst.b d0
	rts
atodlong:
	moveq #0,d0
	moveq #0,d1
	moveq #10-1,d2
atol1:	move.b (a3),d1
	sub.b #"0",d1
	bcs.b atodl0
	cmp.b #9,d1
	bhi.b atodl0
	addq.w #1,a3
	add.l d0,d0		;*2
	move.l d0,-(a7)
	lsl.l #2,d0		;*2*4
	add.l (a7)+,d0
	add.l d1,d0
	dbf d2,atol1
atodl0:	rts

dis6502:movem.l d0-d2/a0-a1/a4,-(a7)
	move.l a5,d2
	bsr.w clrlbuf
	lea linebuf-base(a6),a0
	move.w #">_",(a0)+
	move.l a5,d0
	bsr.w longtoa

	moveq #$ffffffdf,d0
	and.b (a5),d0
	cmp.b #$c2,d0
	bne.b nseprep
	btst #5,(a5)
	sne d1
	
	moveq #%00110000,d0
	and.b 1(a5),d0
	beq.b nseprep
	move.b 1(a5),d0
	lea linebuf+40-base(a6),a0
	move.b #";",(a0)+
	btst #5,d0
	beq.b noaccu
	move.b #"a",(a0)+
	move.b #":",(a0)+
	tst.b autosel-base(a6)
	beq.b noaccu
	move.b d1,accu8-base(a6)
noaccu:	btst #4,d0
	beq.b noindx
	btst #5,d0
	beq.b noac0
	move.b #",",-1(a0)
noac0:	move.b #"x",(a0)+
	move.b #",",(a0)+
	move.b #"y",(a0)+
	move.b #":",(a0)+
	tst.b autosel-base(a6)
	beq.b noindx
	move.b d1,idxy8-base(a6)
noindx:	lsl.b #3,d1
	moveq #16,d0
	add.b d1,d0
	bsr.w hextod
	move.b #"b",(a0)+
	move.b #"i",(a0)+
	move.b #"t",(a0)
nseprep:
	lea linebuf+25-base(a6),a0
	moveq #0,d0
	move.b (a5)+,d0
	add.w d0,d0
	lea tab6502(pc),a4
	add.w d0,a4
	moveq #0,d1
	move.b (a4)+,d1
	mulu #3,d1
	moveq #0,d0
	move.b (a4)+,d0
	lea txt6502(pc),a4
	add.w d1,a4
	move.b (a4)+,(a0)+
	move.b (a4)+,(a0)+
	move.b (a4)+,(a0)
	addq.w #2,a0
	add.w d0,d0
	move.w d65mode(pc,d0.w),d0
	jsr d65subs(pc,d0.w)
	lea linebuf+12-base(a6),a0
	lea linebuf+70-base(a6),a1
	move.b #";",(a1)+
	move.l d2,a4
	sub.l a5,d2
d02hex:	move.b (a4)+,d0
	bsr.w bytetoa
	moveq #$60,d1
	and.b d0,d1
	bne.b d02asc
	moveq #".",d0
d02asc:	move.b d0,(a1)+
	addq.w #1,a0
	addq.b #1,d2
	bne.b d02hex
	movem.l (a7)+,d0-d2/a0-a1/a4
	rts
d65mode:dc.w d65nop-d65subs	;0
	dc.w d65imi-d65subs	;1
	dc.w d65adr-d65subs	;2
	dc.w d65zp-d65subs	;3
	dc.w d65acu-d65subs	;4
	dc.w d65zpix-d65subs	;5
	dc.w d65zpiy-d65subs	;6
	dc.w d65zpx-d65subs	;7
	dc.w d65adrx-d65subs	;8
	dc.w d65adry-d65subs	;9
	dc.w d65zpy-d65subs	;10
	dc.w d65jmpi-d65subs	;11
	dc.w d65brel-d65subs	;12
	dc.w d65dummy-d65subs	;13
	dc.w d65zpl-d65subs	;14
	dc.w d65zply-d65subs	;15
	dc.w d65zpi-d65subs	;16
	dc.w d65srel-d65subs	;17
	dc.w d65sriy-d65subs	;18
	dc.w d65adlg-d65subs	;19
	dc.w d65adlx-d65subs	;20
	dc.w d65brlg-d65subs	;21
	dc.w d65jpix-d65subs	;22
	dc.w d65imac-d65subs	;23
	dc.w d65imxy-d65subs	;24

d65subs:
d65adlx:pea d65x(pc)
d65adlg:moveq #0,d0
	move.b 2(a5),d0
	lsl.w #8,d0
	move.b 1(a5),d0
	lsl.l #8,d0
	move.b (a5),d0
	addq.w #3,a5
	bra.b d65hex
d65imxy:tst.b idxy8-base(a6)
	bra.b d65im
d65imac:tst.b accu8-base(a6)
d65im:	beq.b d65imw
d65imi:	move.b #"#",(a0)+
d65byte:bra.b d65zp
d65imw:	move.b #"#",(a0)+
d65adr:	cmp.b #$20,-1(a5)	;jsr abs
	beq.b d65adr2
	cmp.b #$4c,-1(a5)	;jmp abs
	beq.b d65adr2
	pea dsnesio(pc)		;comment io reg
d65adr2:moveq #0,d0
	move.b 1(a5),d0
	lsl.l #8,d0
	move.b (a5),d0
	addq.w #2,a5
	bra.b d65hex
d65zp:	moveq #0,d0
	move.b (a5)+,d0
d65hex:	bra.w hextoa_
d65acu:	move.b #"a",(a0)+
d65nop:	rts
d65zpix:move.b #"(",(a0)+
	bsr.b d65zp
	bsr.b d65x
d65brac:move.b #")",(a0)+
	rts
d65zpi:	move.b #"(",(a0)+
	bsr.b d65zp
	bra.b d65brac
d65zpiy:bsr.b d65zpi
d65y:	move.b #",",(a0)+
	move.b #"y",(a0)+
	rts
d65zpx:	bsr.b d65zp
	bra.b d65x
d65adrx:bsr.b d65adr
d65x:	move.b #",",(a0)+
	move.b #"x",(a0)+
	rts
d65adry:bsr.b d65adr
	bra.b d65y
d65zpy:	bsr.b d65zp
	bra.b d65y
d65jpix:move.b #"(",(a0)+
	bsr.b d65adr2		;no io reg comment
	bsr.b d65x
	bra.b d65brac
d65jmpi:move.b #"(",(a0)+
	bsr.b d65adr2		;no io reg comment
	bra.b d65brac
d65brel:move.b (a5)+,d0
	ext.w d0
	ext.l d0
	add.l a5,d0
	bra.b d65hex
d65brlg:move.b 1(a5),d0
	lsl.w #8,d0
	move.b (a5),d0
	addq.w #2,a5
	ext.l d0
	add.l a5,d0
	bra.b d65hex
;d65db:	move.b -1(a5),d0	;dc.b changed to wdm instruction
;	bra.w bytetoa_
d65zply:pea d65y(pc)
d65zpl:	move.b #"[",(a0)+
	bsr.w d65zp
	move.b #"]",(a0)+
d65dummy:rts
d65srel:bsr.w d65zp
	move.b #",",(a0)+
	move.b #"s",(a0)+
	rts
d65sriy:move.b #"(",(a0)+
	bsr.b d65srel
	move.b #")",(a0)+
	bra.w d65y

dsnesio:movem.l d0-d2/a0-a1,-(a7)
	move.w d0,d1
	sf d1
	cmp.w #$4300,d1		;dma special
	bne.b dsnes2
	move.b d0,d1
	lsr.b #4,d1
	add.b #"0",d1
	and.w #$ff8f,d0		;xx0x-$xx7x
dsnes2:	lea snesadr(pc),a1
	lea snesreg(pc),a0
dsnes3:	tst.w (a1)
	bmi.b dsnes0
	cmp.w (a1)+,d0
	bcs.b dsnes0
	cmp.w (a1),d0
	bls.b dsnes1
	move.w (a1),d2
	sub.w -(a1),d2
	addq.w #1,d2
	addq.w #4,a1
	lsl.w #3,d2	;8chr/entry
	add.w d2,a0
	bra.b dsnes3
dsnes1:
	sub.w -(a1),d0
	lsl.w #3,d0
	lea (a0,d0.w),a1
	lea linebuf+40-base(a6),a0
	move.b #";",(a0)+
	moveq #8-1,d2
dsnes4:	move.b (a1)+,(a0)+
	bne.b dsnes5
	move.b d1,-1(a0)
dsnes5:	dbf d2,dsnes4
dsnes0:	movem.l (a7)+,d0-d2/a0-a1
	rts

hlbrkpt:movem.l d0/d1/a0,-(a7)
	lea brkpadr-base(a6),a0
	moveq #brkpnum-1,d0
	bsr.b matchit
	bpl.b hlit0

	lea mtchbuf-base(a6),a0
	move.w #mtchnum-1,d0
	bsr.b matchit
;	bpl.b hlit0

hlit0:	movem.l (a7)+,d0/d1/a0
	rts

matchit:
hlbp1:	move.l (a0)+,d1
	beq.b hlbp0
	cmp.l hililow-base(a6),d1
	bcs.b hlbp0
	cmp.l hiliupp-base(a6),d1
	bcc.b hlbp0
	st hilight-base(a6)
	bra.b hlbp2
hlbp0:	dbf d0,hlbp1
hlbp2:	tst.w d0	;bpl.b matched
	rts

bufaddr:movem.l d0/d1/a0,-(a7)
	lea mtchbuf-base(a6),a0
	move.w #mtchnum-1,d0
bufadr0:move.l (a0)+,d1
	bne.b bufadr1
	move.l d6,-(a0)
	bra.b bufadr2
bufadr1:cmp.l d6,d1
	dbeq d0,bufadr0
bufadr2:movem.l (a7)+,d0/d1/a0
	rts

match:	lea linebuf-base(a6),a4
	lea mtchbuf-base(a6),a1
	subq.l #1,d3
	bmi.b match0
	bne.b matchq
	tst.l para-base(a6)
	bne.b matchq
	move.l a1,a0
	move.w #mtchnum-1,d0
match5:	clr.l (a0)+
	dbf d0,match5

match0:	move.l a4,a0
	lea 70(a0),a2
	move.w #mtchnum-1,d2
match1:	move.l (a1)+,d0
	beq.b match2
	addq.w #1,a0
	bsr longtoa_
	cmp.l a2,a0
	bls.b match2
	bsr rawline
match2:	dbf d2,match1
	cmp.l a0,a4
	beq.b match3
	bsr rawline
match3:	st d7
matchq:	rts

disasm:	movem.l d0-d7/a0-a4/a6,-(a7)	;yo, funky again...
	lea instr(pc),a4	;a5:pc
	move.l a5,d6
	move.l a5,hililow-base(a6)
dis2:	moveq #xchars/4-1,d0		;redis
	lea linebuf-base(a6),a0
	move.l #"    ",d1	;fill linebuf
dis3:	move.l d1,(a0)+
	dbf d0,dis3
	sf ea2nd-base(a6)		;begin with 1st eapos
	move.l d6,a5
	move.w (a5)+,d1		;instr.w
dis0:	move.w d1,d0
	and.w (a4)+,d0		;mask
	cmp.w (a4),d0		;instrframe
	lea 14-2(a4),a4
	bne.b dis0		;scan instr
	move.w 4-14(a4),d2		;info.w
	move.l d6,d0
	lea linebuf-base(a6),a0
	move.w #">,",(a0)+
	bsr.w longtoa
	addq.w #1,a0

	lea -14+6(a4),a1
dis1:	move.b (a1)+,(a0)+
	bpl.b dis1
	bclr #7,-1(a0)		;end

	st d7
	move.w d2,d4
	and.w #$ff00,d4		;sizeopt
	cmp.w #s67,d4
	bne.b nos67
	bsr.w size67
nos67:	cmp.w #s9a_,d4
	bne.b nos9a_
	bsr.w size9a_
nos9a_:	cmp.w #s9a,d4
	bne.b nos9a
	bsr.w size9a
nos9a:	cmp.w #s6,d4
	bne.b nos6
	bsr.w size6
nos6:	cmp.w #s8,d4
	bne.b nos8
	bsr.w size8
nos8:	cmp.w #stab,d4
	bne.b nostab
	bsr.w opspos
nostab:	;cmp.w #snop,d4
	;bne.b nosnop
nosnop:
	lea disoffs(pc),a1
	ext.w d2		;clr sizeopt
	add.w d2,d2
	move.w (a1,d2.w),d2
	move.l d6,-(a7)
	jsr dissubs(pc,d2.w)		;no d7,a4
	move.l (a7)+,d6
	tst.b d7
	beq.w dis2

	move.l a5,hiliupp-base(a6)
	movem.l (a7)+,d0-d7/a0-a4/a6
	rts

dissubs:
opfail=*-dissubs
	moveq #-1,d0
opf0:	move.w d0,$dff180
	dbf d0,opf0
noops=*-dissubs
	rts	

dcwop=*-dissubs
	move.w d1,d0
	bra.w wordtoa_

eatoccr=*-dissubs
	sf imsize-base(a6)
	bsr.w doea
	bra.w optoccr

eatosr=*-dissubs
	move.b #1,imsize-base(a6)
	bsr.w doea
	bra.w optosr

ccrtoea=*-dissubs
	bsr.w opccr
	bra.b dissrea
srtoea=*-dissubs
	bsr.w opsr
dissrea:bra.w dotoea

fpufmt2:dc.b "lsxpwdbp"
dfmvmem:lea movetxt+1(pc),a1	;fmove
	bsr txttobuf
	move.b #".",(a0)+
	move.w d6,d0
	rol.w #6,d0
	and.w #%111,d0
	move.b fpufmt2(pc,d0.w),(a0)+
	bsr opspos
	moveq #%111000,d2
	and.w d1,d2
	bne.b no2dreg		;dn ?
	tst.b d0	;%000.l
	beq.b no2dreg
	subq.b #1,d0	;%001.s
	beq.b no2dreg	
	subq.b #3,d0	;%100.w
	beq.b no2dreg
	subq.b #2,d0	;%110.b
	bne.b dmvfail
no2dreg:cmp.b #%001000,d2	;an ?
	beq.b dmvfail
	moveq #%01111111,d5
	and.w d6,d5		;k factor
	moveq #1,d3		;static k
	subq.b #%011,d0		;p{#k}
	beq.b dfmvk0
	moveq #2,d3		;dynamic k
	subq.b #%111-%011,d0	;p{dn}
	beq.b dfmvk0
	tst.b d5
	bne.b dmvfail		;k factor>0 ?
	moveq #0,d3		;no k factor
dfmvk0:	move.w d6,d0
	lsr.w #7,d0
	and.w #%111,d0
	bsr.w dfp5		;fpn
	bsr dotoea
	subq.b #1,d3		;k factor ?
	bmi.b dfmvk1
	move.b #"{",(a0)+
	tst.b d3		;static ?
	beq.b dfmvkp0
	moveq #%1111,d0
	and.b d5,d0
	bne.b dmvfail		;unused bits
	move.b #"d",(a0)+
	lsr.b #4,d5 
	bra.b dfmvkp
dfmvkp0:move.b #"#",(a0)+
	btst #6,d5
	beq.b dfmvkp
	bset #7,d5
	neg.b d5
	move.b #"-",(a0)+
dfmvkp:	move.l d5,d0
	bsr.w hextod
	move.b #"}",(a0)+
dfmvk1:	rts
dmvfail:bra fail

dfpu=*-dissubs
	move.w (a5)+,d6		;fpu extension word
	move.w #$e000,d0
	and.w d6,d0
	cmp.w #$6000,d0
	beq.w dfmvmem
	move.w #$a000,d0
	and.w d6,d0
	bne.b dffail
	btst #14,d6		;r/m
	bne.b dfp0
	tst.b d1		;ea field=0?
	bne.b dffail
dfp0:	lea fpuinst(pc),a1
	moveq #%01111111,d0
	and.w d6,d0
dfp2:	move.b (a1)+,d2
	bclr #7,d2
	sne d3		;0:fp0,ff:fp0,fp0
	moveq #%01111000,d4
	and.b d6,d4
	cmp.b #%00110000,d4	;sincos
	seq d4
	beq.b dfp1
	cmp.b d2,d0
	beq.b dfp1
	addq.w #6,a1
	tst.b (a1)
	bne.b dfp2		
dffail:	sf d7
	rts
fpufmt:	dc.b "lsxpwdb*"
fpuims:	dc.b %010,%010,%110,%110,%001,%100,%000,-1
dfp1:	bsr.w txttobuf
	move.b #".",(a0)+
	move.w d6,d0
	rol.w #6,d0
	and.w #%111,d0
	btst #14,d6
	beq.b dfp3
	cmp.w #%111,d0
	beq.b dffail
	move.b fpufmt(pc,d0),(a0)+		 
	move.b fpuims(pc,d0.w),imsize-base(a6)
	bsr.w opspos
	moveq #%111000,d2
	and.w d1,d2	;src:datareg?
	bne.b dfp8
	tst.b d0	;%000.l
	beq.b dfp8
	subq.b #1,d0	;%001.s
	beq.b dfp8	
	subq.b #3,d0	;%100.w
	beq.b dfp8
	subq.b #2,d0	;%110.b
	bne.b dffail
dfp8:	cmp.b #%001000,d2	;an
	beq.b dffail
	bsr.w doea	;imsize!!!
	st d0		;dest fpureg
	sf d3
	bra.b dfp6
dfp3:	move.b #"x",(a0)+
	bsr.w opspos
	bsr.b dfp5
dfp6:	moveq #%01111111,d2
	and.w d6,d2
	cmp.b #%00111010,d2
	bne.b dftst
	and.w #$0380,d6		;ftst:dst=0
	bne.w fail
	rts
dftst:	tst.b d4
	beq.b dsncs
	moveq #%111,d2
	and.w d6,d2
	bsr.b dfp7
	move.b #":",(a0)+
	move.w d6,d0
	lsr.w #7,d0
	and.w #%111,d0
	bra.b dfp5
dsncs:	move.w d6,d2
	lsr.w #7,d2
	and.w #%111,d2
	tst.b d3
	bne.b dfp7	;show fp0,fp0
	cmp.b d0,d2
	beq.b dfp4
dfp7:	move.w d2,d0
	move.b #",",(a0)+
dfp5:	move.b #"f",(a0)+
	move.b #"p",(a0)+
	moveq #"0",d2
	add.b d0,d2
	move.b d2,(a0)+	
dfp4:	rts			

dfmovemx=*-dissubs
	move.w #$c700,d0
	and.w (a5),d0
	cmp.w #$c000,d0		;fmovem fpx?
	bne.w fail
	move.w (a5)+,d3
	btst #13,d3
	bne.b dfmovm1
	bsr doea
	move.b #",",(a0)+
	bra dofprx
dfmovm1:bsr dofprx
	bra dotoea
dfmoveml=*-dissubs
	st d5
	bra.b dfmovem

dfmovel=*-dissubs
	sf d5			;no fmovem
dfmovem:move.w #$c3ff,d0
	and.w (a5),d0
	cmp.w #$8000,d0
	bne.w fail
	move.b #%010,imsize-base(a6)	;long
	move.w (a5)+,d6
	eor.w d0,d6
	btst #10,d6
	sne d4
	btst #11,d6
	sne d0
	add.b d0,d4
	btst #12,d6
	sne d0
	add.b d0,d4		;singleflag:0:0,-1:1,-2:2,-3:3
	beq.w fail		;0 fpcr
	moveq #%111000,d0
	and.w d1,d0		;Dn?
	bne.b nofdreg
	cmp.b #-1,d4		;1 fpcr?
	bne.w fail
nofdreg:subq.w #%001000,d0	;An?
	bne.b nofareg
	cmp.b #-1,d4		;1 fpcr?
	bne.w fail	
	btst #10,d6		;fpcr=fpiar?
	beq.w fail
nofareg:bclr #13,d6
	beq.b tofpcr
	bsr.b dofpcr
	bra dotoea		
tofpcr:	bsr doea
	move.b #",",(a0)+
dofpcr:	move.b #"f",(a0)+
	move.b #"p",(a0)+
	moveq #"c",d0
	bclr #12,d6
	bne.b fpcr0
	moveq #"s",d0
	bclr #11,d6
	bne.b fpcr0
	move.b #"i",(a0)+
	moveq #"a",d0
	bclr #10,d6
	beq.w fail
fpcr0:	move.b d0,(a0)+
	move.b #"r",(a0)+
	tst.w d6
	beq.b fpsingl
	tst.b d5		;fmovem?
	beq.w fail
	move.b #"/",(a0)+
	bra.b dofpcr
fpsingl:rts

dfmovecr=*-dissubs
	move.w (a5),d0
	and.w #$fc40,d0
	cmp.w #$5c00,d0	
	bne.w fail
	moveq #$003f,d0
	and.w (a5),d0
	move.w d0,d1
	beq.b dfmk1x
	cmp.b #$30,d0
	bcc.w dfmk3x
	cmp.b #$0f,d0
	bhi.w fail
	cmp.b #$0b,d0
	bcs.w fail
	sub.b #$0b-1,d1
	bra.b dfmk1x
dfmk3x:	sub.b #$30-($0f-$0b)-2,d1
dfmk1x:	move.b #"#",(a0)+
	bsr.w hextoa_
	move.w (a5)+,d0
	bsr.w optofpx79
	lea linebuf+40-base(a6),a0
	move.b #";",(a0)+
	lea fmconst(pc),a1
	cmp.b #10,d1	;Pi..100
	bls.b skipcr
	bsr.b dfmk0
	moveq #0,d0
	sub.b #9,d1	;1E4..1E4096
	bset d1,d0
	bra.w hextod
skipcr:	tst.b (a1)+
	bpl.b skipcr
	dbf d1,skipcr
dfmk0:	bra.w txttobuf
	
dpccodewordrel=*-dissubs
	moveq #-16,d0		;$fff0 16 mmu ccodes
	and.w (a5),d0
	bne.w fail
	move.w (a5)+,d0
	bsr.w dopcc
	bra.b dfcc0
dfccodewordrel=*-dissubs
	moveq #-32,d0		;$ffe0 32 fpu ccodes
	and.w (a5),d0
	bne.w fail
	move.w (a5)+,d0
	bsr.w dofcc
dfcc0:	bsr.w opspos
	bsr.w opdx02
	move.b #",",(a0)+
	move.w (a5)+,d0
	lea -2(a5,d0.w),a1	;instrlen:4bytes (oma bug)
	bra.b wbx2
ccodewordrel=*-dissubs
	move.w d1,d0
	bsr.w docc
wbx4:	bsr.w opspos
	bsr.w opdx02
	move.b #",",(a0)+
	bra.b wbx3
wordcc=*-dissubs
	move.w d1,d0
	bsr.w docc
wordcc0:bsr.w chr2buf
	dc.w ".w"		;bxx.w
	bsr.w opspos
wordbxx=*-dissubs
wbx3:	move.w (a5)+,d0
	lea -2(a5,d0.w),a1
wbx2:	move.l a1,d0
	bra.w hextoa_			;bra.w longtoa_
longcc=*-dissubs
	move.w d1,d0
	bsr.w docc
longcc0:bsr.w chr2buf
	dc.w ".l"		;bxx.l
	bsr.w opspos
longbxx=*-dissubs
	move.l (a5)+,d0
	lea -4(a5,d0.l),a1
	bra.b wbx2
	
shortcc=*-dissubs
	move.w d1,d0
	bsr.w docc
	bsr.w chr2buf
	dc.w ".b"
	bsr.w opspos
shortbxx=*-dissubs
	move.b d1,d0
	ext.w d0
	lea (a5,d0.w),a1
	bra.b wbx2

dbrapcc=*-dissubs
	move.w d1,d0
	bsr.w dopcc
	bra.b dbra0
dbrafcc=*-dissubs
	move.w d1,d0
	bsr.w dofcc
dbra0:	btst #6,d1
	beq.b wordcc0
	bra.b longcc0
		
eatoax=*-dissubs
	bsr.w doea
	bra.w optoax9b

ea2todx=*-dissubs
	move.b #2,imsize-base(a6)	;68020:chk.l #i.l,<ea>
	bra.b ea2dx
eatodx=*-dissubs
	move.b #1,imsize-base(a6)
ea2dx:
size67eatodx=*-dissubs
	bsr.w doea
	bra.w optodx9b

dxtoea=*-dissubs		;no im possible
	bsr.w opdx9b
	move.w #$f1c0,d0
	and.w d1,d0
	cmp.w #$0100,d0		;btst: pcrel allowed
	beq.b dxtea0
	bra.w dotoea

dxtea0:	move.b #",",(a0)+
	bra.w doea

iwordtoccr=*-dissubs
	move.b #"#",(a0)+		;8/16?
	moveq #0,d0
	move.b (a5)+,d0
	bne.w fail
	move.b (a5)+,d0
	bsr.w hextoa_			;bsr.w bytetoa_
	bra.w optoccr

iwordtosr=*-dissubs
	bsr.b iwrd
	bra.w optosr

toiword:move.b #",",(a0)+
iword=*-dissubs
iwrd:	move.b #"#",(a0)+
	moveq #0,d0
	move.w (a5)+,d0
	bra.w hextoa_			;bra.w wordtoa_

dlpstop=*-dissubs
	cmp.w #$01c0,(a5)+
	beq.b iwrd
	bra.w fail  	
dtbl=*-dissubs
	move.w (a5),d0
	and.w #$8238,d0
	bne.w fail
	move.w (a5),d0
	moveq #"s",d3
	btst #11,d0
	bne.b dtbls
	moveq #"u",d3
dtbls:	move.b d3,(a0)+
	btst #10,d0
	beq.b dtblr
	move.b #"n",(a0)+
dtblr:	bsr.w siz67d0		;sets imsize,del:d0
	move.w (a5)+,d3
	btst #8,d3		;datareg|eamode
	beq.b dtbldat
	moveq #%111111,d0	
	and.w d3,d0
	bne.w fail	
	bsr.w doea
	bra.b dtblreg	
dtbldat:bsr.w opdx02
	move.b #":",(a0)+
	move.b #"d",(a0)+
	move.w d3,d0
	bsr.w op0xx02	
dtblreg:move.w d3,d0
	rol.w #4,d0
	move.b #",",(a0)+
	move.b #"d",(a0)+
	bra.w op0xx02

inibtoea=*-dissubs
	move.b #"#",(a0)+
	move.w (a5)+,d0
	and.l #%11111,d0		;#0-31(7)
	bsr.w hextod
	move.w #$ffc0,d0
	and.w d1,d0
	cmp.w #$0800,d0		;btst: pcrel allowed
	beq.b inibea0
	bra.w dotoea

inibea0:move.b #",",(a0)+
	bra.w doea
dpccodeea=*-dissubs
	moveq #-16,d0
	and.w (a5),d0
	bne.w fail
	move.w (a5)+,d0
	bsr.w dopcc
	bra.b ccode0
fccodeea=*-dissubs
	moveq #-32,d0
	and.w (a5),d0
	bne.w fail
	move.w (a5)+,d0
	bsr.w dofcc
	bra.b ccode0
ccodeea=*-dissubs
	move.w d1,d0
	bsr.w docc
ccode0:	bsr.w opspos
srcea=*-dissubs
	bra.w doea
imoves=*-dissubs
	move.w (a5)+,d3
	move.w #$07ff,d0
	and.w d3,d0
	bne.w fail
	bclr #11,d3
	bne.b mvsrx
	bsr.w doea
	move.b #",",(a0)+
	bra.w mvcrxcf
mvsrx:	bsr.w mvcrxcf
	bra.w dotoea		

size67ixtoea=*-dissubs
	bsr.w immediate
	bra.w dotoea

size67i9btoea=*-dissubs
	bsr.w opi9b
	bra.w dotoea

size67x9btodx02=*-dissubs
	btst #5,d1
	beq.b shi9b
	bsr.w opdx9b
	bra.b shdx9b
shi9b:	bsr.w opi9b
shdx9b:	bra.w optodx02

itrap=*-dissubs
	move.b #"#",(a0)+
	move.w d1,d0
	bra.w nibtod

srcdx02=*-dissubs
	bra.w opdx02

imusp=*-dissubs
	btst #3,d1
	beq.b imusp0
	bsr.w opusp
	bra.w optoax02
imusp0:	bsr.w opax02
	bra.w optousp

dpmovefd=*-dissubs			;68030mmu only
	move.w (a5),d0
	cmp.w #$4100,d0			;40:tc
	beq.w dpmvfd
	eor.w #%0000100100000000,d0	;08:tt0,0c:tt1,48:srp,4c:crp
	and.w #%1011101111111111,d0
	bne.w fail
	bra.b dpmvfd	;bit9=0
dpmove=*-dissubs
	move.w #$01ff,d0
	and.w (a5),d0
	bne.w fail
dpmvfd:	move.w (a5)+,d3
	bclr #8,d3	;pmovefd bit
	bclr #9,d3
	bne.b pmvtoea
	bsr.w doea
	move.b #",",(a0)+
	bra.b pmvreg
pmvtoea:bsr.b pmvreg
	bra.w dotoea
pmvreg:	lea pregs(pc),a1
	lsr.w #8,d3
pmvlp:	move.b (a1)+,d0
	beq.w fail
	cmp.b d3,d0
	beq.b pmvfnd
pmvscan:btst #7,(a1)+
	beq.b pmvscan
	bra.b pmvlp
pmvfnd:	bra.w txttobuf
didbcac=*-dissubs	;68040
didb0:	lsr.w #6,d1
	moveq #3,d0
	and.w d1,d0
	move.b idctx(pc,d0.w),(a0)+
	move.b #"c",(a0)+
	rts	
idctx:	dc.l "ndib"	;nc,dc,ic,bc
didbind=*-dissubs
	move.w d1,-(a7)
	bsr.b didb0
	move.w (a7)+,d1
	bra.w toaindirect
dpflush40=*-dissubs		;pflush,ptestr,ptestw
	bra.w aindirect

imovec=*-dissubs
	move.w (a5)+,d3
	btst #0,d1
	bne.b toctrl
	bsr.b mvcregs
	move.b #",",(a0)+
	bra.b mvcrxcf
toctrl:	bsr.b mvcrxcf
	move.b #",",(a0)+
mvcregs:lea cregs(pc),a1
	move.w d3,d1
	and.w #$0fff,d1
nxtctrl:cmp.w (a1),d1
	beq.b mvcctrl
	tst.w (a1)
	addq.w #6,a1
	bne.b nxtctrl	
	bra.w fail
mvcctrl:addq.w #2,a1
	move.b (a1)+,(a0)+
	move.b (a1)+,(a0)+
	tst.b (a1)
	beq.b ctrl3ch
	move.b (a1)+,(a0)+
	tst.b (a1)
	beq.b ctrl3ch
	move.b (a1),(a0)+
ctrl3ch:rts
mvcrxcf:move.w d3,d0		;movec,moves
dbfireg:and.w #$f000,d0		;bitfield
	rol.w #4,d0
dbytreg:add.b #"0",d0
	move.b #"a",(a0)+
	bclr #3,d0
	bne.b mvcax 
	addq.b #"d"-"a",-1(a0)
mvcax:	move.b d0,(a0)+
	rts
dbfieldtodx=*-dissubs
	move.w (a5)+,d2
	btst #15,d2
	bne.w fail
	bsr.b dbfi3
	move.b #",",(a0)+
	move.w d2,d0
	bra.b dbfireg
ddxtobfield=*-dissubs
	move.w (a5),d0
	btst #15,d0
	bne.w fail
	bsr.b dbfireg
	move.b #",",(a0)+
	move.w (a5)+,d2
	bra.b dbfi3
dbfield=*-dissubs
	move.w (a5)+,d2
	move.w d2,d0
	and.w #$f000,d0
	bne.w fail
dbfi3:	bsr.w doea
	move.b #"{",(a0)+
	move.w d2,d0
	lsr.w #6,d0
	bsr.b dbfi2
	move.b #":",(a0)+
	move.w d2,d0
	bsr.b dbfi2
	move.b #"}",(a0)+
	rts
dbfi2:	btst #11-6,d0
	bne.b dbfi1
	and.b #%11111,d0
	bne.b no32
	moveq #32,d0
no32:	bra.w bytetod	
dbfi1:	btst #10-6,d0		;y00xxxy00xxx
	bne.w fail
	btst #9-6,d0
	bne.w fail
	move.b #"d",(a0)+
	and.b #%111,d0
	add.b #"0",d0
	move.b d0,(a0)+
	rts
dbkpt=*-dissubs
	move.b #"#",(a0)+
	bra.w opxx02
dpack=*-dissubs
	btst #3,d1
	beq.b dpadx
	bsr.w chr2buf
	dc.w "-("
	bsr.w opax02
	bsr.w chr4buf
	dc.l "),-("
	bsr.w opax9b
	move.b #")",(a0)+
	bra.b dpad0
dpadx:	bsr.w opdx02
	bsr.w optodx9b
dpad0:	bra.w toiword
dmov16=*-dissubs
	move.w (a5),d2
	and.w #$8fff,d2	
	cmp.w #$8000,d2
	bne.w fail
	bsr.w aindirectpost
	move.w (a5)+,d1
	rol.w #4,d1
	bra.w toaindirectpost
dmov162=*-dissubs
	moveq #%010000,d2	;(ax)
	bclr #4,d1
	bne.b dmov1
	moveq #%011000,d2	;(ax)+
dmov1:	bclr #3,d1
	beq.b dmov0
	bsr.b dmov2
	or.w d2,d1
	bra.w dotoea
dmov0:	or.w d2,d1
	bsr.w doea
	move.b #",",(a0)+
dmov2:	bra.w abslong
	
imove=*-dissubs
	move.w d1,d0
	and.w #%0011000000000000,d0
	rol.w #4,d0
	bne.b imo0
	sf d7
	rts
imo0:	lea sizemov(pc),a1
	move.b (a1,d0.w),(a0)+
	move.b 4(a1,d0.w),imsize-base(a6)

	bsr.w opspos
	bsr.w doea

	move.w d1,d0
	rol.w #7,d0
	and.w #%111,d0
	move.w d1,d3
	lsr.w #3,d3
	and.w #%111000,d3
	or.w d3,d0

	move.w d0,d1
	bra.w dotoea

imoveq=*-dissubs
	move.b #"#",(a0)+
	moveq #0,d0
	move.b d1,d0
	bsr.w hextoa_			;bsr.w bytetoa_
	bra.w optodx9b	

icallm=*-dissubs
	tst.b (a5)
	bne.w fail
	move.w d1,-(a7)
	move.b #"#",(a0)+
	moveq #0,d0
	move.b (a5)+,d0
	bne.w fail
	move.b (a5)+,d0
	bsr.w hextoa_			;bsr.w bytetoa_
	move.w (a7)+,d1
	bra.w dotoea

dcas=*-dissubs
	bsr.w opspos
	move.w (a5),d0
	and.w #$0e38,d0
	bne.w fail
	move.w (a5),d0
	move.b #"d",(a0)+
	bsr.w op0xx02
	move.b #",",(a0)+
	move.w (a5)+,d0
	lsr.w #6,d0
	move.b #"d",(a0)+
	bsr.w op0xx02
	bra.w dotoea

dcas2=*-dissubs
	moveq #"w",d2
	btst #9,d1
	beq.b dca0
	moveq #"l",d2
dca0:	move.b d2,(a0)+
	bsr.w opspos
	move.l (a5),d2
	and.l #$0e380e38,d2
	bne.w fail
	move.l (a5),d2
	bsr.b casop
	move.b #",",(a0)+
	lsr.l #6,d2
	bsr.b casop
	bsr.w chr2buf
	dc.w ",("
	move.w (a5)+,d0
	bsr.w dbfireg
	bsr.w chr3buf
	dc.l "):("<<8
	move.w (a5)+,d0
	bsr.w dbfireg
	move.b #")",(a0)+
	rts	
casop:	move.l d2,d0
	swap d0
	move.b #"d",(a0)+
	bsr.w op0xx02
	move.w d2,d0
	bsr.w chr2buf
	dc.w ":d"
	bra.w op0xx02

dchk2=*-dissubs
	move.w (a5)+,d2
	btst #11,d2
	beq.w fail
	bra.b dchkcmp
dcmp2=*-dissubs
	move.w (a5)+,d2
	btst #11,d2
	bne.w fail
dchkcmp:bsr.w doea
	move.b #",",(a0)+
	move.w d2,d0
	bra.w dbfireg

drtm=*-dissubs
	moveq #$0f,d0
	and.w d1,d0
	bra.w dbytreg

dtpccsize=*-dissubs
	move.w d1,d0
	bsr.w docc
dtpc2:	move.b #".",(a0)+
	moveq #"w",d0
	btst #0,d1
	beq.b dtpc1
	moveq #"l",d0
dtpc1:	move.b d0,(a0)+
	bsr.w opspos
	move.b #"#",(a0)+
	moveq #0,d0
	btst d0,d1
	bne.b dtpc0
	move.w (a5)+,d0
	bra.w hextoa_			;bra.w wordtoa_
dtpc0:	move.l (a5)+,d0
	bra.w hextoa_			;bra.w longtoa_
dtpcc=*-dissubs
	move.w d1,d0
	bra.w docc
dtpfccsize=*-dissubs
	bsr.b dtpfcc0
	bra.b dtpc2
dtpfcc=*-dissubs
dtpfcc0:moveq #-32,d0		;$ffe0	;32 fpu ccodes
	and.w (a5),d0
	bne.w fail
	move.w (a5)+,d0
	bra.w dofcc
dtppccsize=*-dissubs
	bsr.b dtppcc0
	bra.b dtpc2
dtppcc=*-dissubs
dtppcc0:moveq #-16,d0		;$fff0 ;16 mmu ccodes
	and.w (a5),d0
	bne.w fail
	move.w (a5)+,d0
	bra.w dopcc

dfnop=*-dissubs
	tst.w (a5)+		;4byte command
	seq d7
	rts
dpvalid=*-dissubs
	moveq #-8,d0
	and.w (a5),d0
	cmp.w #$2c00,d0
	bne.w fail
	move.w (a5)+,d0
	move.b #"a",(a0)+
	bsr.w op0xx02
	bra.w dotoea

dpflusha=*-dissubs
	cmp.w #$2400,(a5)+
	seq d7
	rts
dpflushr=*-dissubs
	cmp.w #$a000,(a5)+
	bne.w fail
	bra.w doea
dpflushs=*-dissubs
	cmp.b #$34,(a5)
	beq.b dpfl4
dpfl5:	bra.w fail
dpflush=*-dissubs
	cmp.b #$30,(a5)
	bne.b dpfl5
dpfl4:	move.w (a5)+,d0
	moveq #%00011000,d1
	and.w d0,d1
	bne.b dpfl1
	moveq #%00000111,d1
	moveq #"s",d2
	and.w d0,d1
	beq.b dpfl2
	moveq #"d",d2
	subq.b #1,d1
	bne.w fail
dpfl2:	move.b d2,(a0)+
	bsr.w chr2buf
	dc.w "fc"
	bra.b dpfl3
dpfl1:	cmp.w #%00011000,d1	;illegal
	beq.w fail
	moveq #"#",d1
	bclr #3,d0	
	beq.b dpfl0
	moveq #"d",d1
dpfl0:	move.b d1,(a0)+
	bsr.w nibtoa
dpfl3:	bsr.w chr2buf
	dc.w ",#"
	lsr.w #5,d0
	bra.w op0xx02
dpload=*-dissubs
	move.w (a5),d0
	and.w #$fdf8,d0
	cmp.w #$2010,d0
	bne.w fail
dpte0:	move.w (a5)+,d0
	move.b #"r",(a0)
	btst #9,d0
	bne.b dplo0
	addq.b #"w"-"r",(a0)
dplo0:	bsr.w opspos
	move.b #"#",(a0)+
	bsr.w nibtoa
	bra.w dotoea
dptest=*-dissubs
	move.w (a5),d0
	and.w #$e118,d0
	cmp.w #$8110,d0
	bne.w fail
	move.w (a5),d2
	bsr.b dpte0
	bsr.w chr2buf
	dc.w ",#"
	move.w d2,d0
	rol.w #6,d0
	moveq #%111,d2
	and.b d0,d2
	beq.w fail	;level 0
	bsr.w nibtoa
	bsr.w chr2buf
	dc.w ",a"
	rol.w #5,d0
	bclr #3,d0
	bra.w nibtoa

ddivsll=*-dissubs
	move.w (a5)+,d2
	bchg #10,d2		;dn:dm mode,set g=1
	bne.w fail	
	bsr.b dmul5
	bra.b ddivl
ddivull=*-dissubs
	move.w (a5)+,d2
	bchg #10,d2		;dn:dm mode,set g=1
	bne.w fail	
	bsr.b dmul4
ddivl:	sub.b d2,d1
	and.b #%111,d1		;dm=dn
	beq.w fail
	rts
dmulsl=*-dissubs
dmul3:	move.w (a5)+,d2
dmul5:	btst #11,d2
	beq.w fail
	bra.b dmul1
dmulul=*-dissubs
dmul2:	move.w (a5)+,d2
dmul4:	btst #11,d2
	bne.w fail
dmul1:	move.w #$83f8,d0
	and.w d2,d0
	bne.w fail
	move.b #%10,imsize-base(a6)	;longwords
	bsr.w doea
	move.b #",",(a0)+
	move.w d2,d1
	btst #10,d2
	beq.b dmul0
	bsr.w opdx02
	move.b #":",(a0)+
	rol.w #4,d1
	bra.w opdx02

dmul0:	rol.w #4,d1
	bsr.w opdx02
	sub.b d2,d1
	and.b #%111,d1		;mulxl ea,dn:dm=dn	
	bne.w fail
	rts

icmpm=*-dissubs
	bsr.w aindirectpost
	rol.w #7,d1		;(ax)+
	bra.w toaindirectpost

xbcd=*-dissubs
	bclr #14,d1
	bclr #3,d1		;dx
	beq.b xbcdx	
	bset #5,d1		;-(ax)
	bset #14,d1
xbcdx:	bsr.w doea		;no im possible
	rol.w #7,d1
	bra.w dotoea

size67adsbx=*-dissubs
	bclr #14,d1
	bclr #12,d1
	bclr #3,d1		;dx
	beq.b adsbxdx
	bset #14,d1		;-(ax)
	bset #5,d1
adsbxdx:bsr.w doea
	rol.w #7,d1
	bra.w dotoea	

size6movep=*-dissubs
	bset #5,d1		;d(ax)
	btst #7,d1
	beq.b mptodx
	bsr.w opdx9b
	bra.w dotoea
mptodx:	bsr.w doea
	bra.w optodx9b

imovem=*-dissubs
	move.w (a5)+,d3		;regbits
	btst #10,d1		;dir
	bne.b torx
	bsr.w dorx
	bra.w dotoea
torx:	bsr.w doea
	move.b #",",(a0)+
	bra.w dorx

dx9btodx02=*-dissubs
	bsr.w opdx9b
	bra.w optodx02
ax9btoax02=*-dissubs
	bsr.w opax9b
	bra.w optoax02
dx9btoax02=*-dissubs
	bsr.w opdx9b
	bra.w optoax02

dlinklg=*-dissubs
	bsr.b iunl0
	bsr.w chr2buf
	dc.w ",#"
	bra.w dtpc0
ilink=*-dissubs
	bsr.b iunl0
	bra.w toiword
iunlk=*-dissubs
iunl0:	bra.w opax02

size8eatoax9b=*-dissubs
	bsr.w doea
	bra.b optoax9b

size8:	btst #8,d1
	beq.b siz60
	bra.b siz61
size6:	btst #6,d1
	bne.b siz61
siz60:	moveq #"w",d0
	move.b #1,imsize-base(a6)
	bra.b siz62
siz61:	moveq #"l",d0
	move.b #2,imsize-base(a6)
siz62:	move.b #".",(a0)+
	move.b d0,(a0)
	bra.b opspos
size9a_:move.w d1,d0			;01.b,10.w,11.l,00.*
	lsr.w #3,d0
	sub.w #%01000000,d0	
	bra.b si9a
size9a:	move.w d1,d0			;00.b,01.w,10.l,11.*
	lsr.w #3,d0
	bra.b si9a
size67:	move.w d1,d0
siz67d0:
si9a:	and.w #%11000000,d0
	cmp.w #%11000000,d0
	beq.w fail
	lsr.w #6,d0
	move.b d0,imsize-base(a6)	;00.b,01.w,10.l,11.*
	move.b #".",(a0)+
	move.b sizetxt(pc,d0.w),(a0)
opspos:	lea linebuf+23-base(a6),a0		;ftrapngle.l
	rts
sizetxt:dc.l "bwl*"

opi9b:	move.b #"#",(a0)+
	move.w d1,d0
	and.w #%111000000000,d0
	rol.w #7,d0
	bne.b i9b0
	moveq #8,d0
i9b0:	bra.w nibtod
optoax9b:move.b #",",(a0)+
opax9b:	move.b #"a",(a0)+
	bra.b opxx
optodx9b:move.b #",",(a0)+
opdx9b:	move.b #"d",(a0)+
opxx:	move.w d1,d0
	and.w #%111000000000,d0
	rol.w #7,d0
	add.b #"0",d0
	move.b d0,(a0)+
	rts
optoax02:move.b #",",(a0)+
opax02:	move.b #"a",(a0)+
	bra.b opxx02
optodx02:move.b #",",(a0)+
opdx02:	move.b #"d",(a0)+
opxx02:	move.w d1,d0
op0xx02:and.w #%111,d0
	add.b #"0",d0
	move.b d0,(a0)+
	rts
optofpx79:move.b #",",(a0)+
opfpx79:bsr.b chr2buf
	dc.w "fp"
	lsr.w #7,d0
	bra.b op0xx02
optousp:move.b #",",(a0)+
opusp:	lea usptxt(pc),a1
	bra.b txttobuf
optoccr:move.b #",",(a0)+
opccr:	lea ccrtxt(pc),a1
	bra.b txttobuf
optosr:	move.b #",",(a0)+
opsr:	lea srtxt(pc),a1
txttobuf:
	move.b (a1)+,(a0)
	bclr #7,(a0)+
	beq.b txttobuf
txtq:	rts	
chr2buf:move.l a1,-(a7)		;copies 2 chrs below bsr chr2buf
	move.l 4(a7),a1
	move.b (a1)+,(a0)+
	move.b (a1)+,(a0)+
	move.l (a7)+,a1
	addq.l #2,(a7)
	rts
chr3buf:			;copies 3 chrs below bsr chr3buf
chr4buf:move.l a1,-(a7)		;copies 4 chrs below bsr chr4buf
	move.l 4(a7),a1
	move.b (a1)+,(a0)+
	move.b (a1)+,(a0)+
	move.b (a1)+,(a0)+
	tst.b (a1)
	beq.b chr0
	move.b (a1)+,(a0)+
chr0:	move.l (a7)+,a1
	addq.l #4,(a7)
	rts

bcpltobuf:move.b (a1)+,d0
bcpl0:	subq.b #1,d0
	bmi.b bcpl1
	move.b (a1)+,(a0)+
	bra.b bcpl0		
bcpl1:	rts

dorx:	move.w d1,d0
	and.w #%111000,d0
	cmp.w #%100000,d0	;-(ax)
	bne.b drx8
	moveq #16-1,d2
drx9:	lsr.w #1,d3
	roxl.w #1,d0
	dbf d2,drx9	
	move.w d0,d3
drx8:	sf d5
	clr.w d2
	moveq #"d",d0
	bsr.b drx0
	moveq #"a",d0
drx0:	moveq #8,d4
drx1:	tst.w d4
	beq.b drx5
	btst d2,d3
	bne.b drx2
	addq.w #1,d2
	subq.w #1,d4
	bra.b drx1
drx2:	tas d5
	beq.b drx3
	move.b #"/",(a0)+
drx3:	move.b d0,(a0)+
	move.b d2,(a0)
	add.b #"0",(a0)
	bclr #3,(a0)+
	sf d6
drx4:	addq.w #1,d2
	subq.w #1,d4
	beq.b drx6
	btst d2,d3
	beq.b drx6
	st d6
	bra.b drx4
drx6:	tst.b d6
	beq.b drx7
	move.b #"-",(a0)+
	move.b d0,(a0)+
	move.b d2,(a0)
	add.b #"0"-1,(a0)
	bclr #3,(a0)+
drx7:	tst.w d4
	beq.b drx5
	subq.w #1,d4
	addq.w #1,d2
	bra.b drx1
drx5:	rts

dofprx:	move.w d1,d0
	and.w #%111000,d0
	beq.w fail		;Dn
	cmp.w #%001000,d0	;An
	beq.w fail
	moveq #%01110000,d6
	and.l d3,d6		;pos
	cmp.b d3,d6
	beq.b dfprxa
	moveq #-1,d6		;neg:bad dynamic mask
dfprxa:	lsr.b #4,d6
	add.b #"0",d6		;dynamic mask
	cmp.w #%100000,d0	;-(ax)
	bne.b dfprx8
	btst #13,d3	;dr field
	beq.w fail	;to FPx?
	btst #12,d3	;mode
	bne.w fail	;no predec mode?
	moveq #8-1,d2
dfprx9:	lsr.b #1,d3
	roxl.b #1,d0
	dbf d2,dfprx9	
	move.b d0,d3
	bra.b dfprx0
dfprx8:	btst #12,d3	;mode
	beq.w fail	;predec mode?
dfprx0:	btst #11,d3
	beq.b dfpstat
	tst.l d6
	bmi.w fail	;bad dynamic mask
	move.b #"d",(a0)+
	move.b d6,(a0)+
dfprx5:	rts
dfpstat:sf d0
	moveq #8-1,d2
dfprx1:	tst.w d2
	bmi.b dfprx5
	btst d2,d3
	bne.b dfprx2
	subq.w #1,d2
	bra.b dfprx1
dfprx2:	tas d0
	beq.b dfprx3
	move.b #"/",(a0)+
dfprx3:	move.b #"f",(a0)+
	move.b #"p",(a0)+
	move.b #"7",(a0)
	sub.b d2,(a0)+
	sf d6
dfprx4:	subq.w #1,d2
	bmi.b dfprx6
	btst d2,d3
	beq.b dfprx6
	st d6
	bra.b dfprx4
dfprx6:	tst.b d6
	beq.b dfprx7
	move.b #"-",(a0)+
	move.b #"f",(a0)+
	move.b #"p",(a0)+
	move.b #"7"-1,(a0)
	sub.b d2,(a0)+
dfprx7:	tst.w d2
	bmi.b dfprx5
	subq.w #1,d2
	bra.b dfprx1

docc:	lea ccodetxt(pc),a1
	and.w #%111100000000,d0
	lsr.w #7,d0
	lea (a1,d0.w),a1
	move.b (a1)+,(a0)+
	tst.b (a1)
	beq.b docc0
	move.b (a1)+,(a0)+
docc0:	rts
dopcc:	lea pccodetxt(pc),a1
	and.w #%001111,d0
	add.w d0,d0
	lea (a1,d0.w),a1
	move.b (a1)+,(a0)+
	move.b (a1)+,(a0)+
	rts
dofcc:	lea fccodetxt(pc),a1
	and.w #%011111,d0
	add.w d0,d0
	add.w d0,d0
	lea (a1,d0.w),a1
	move.b (a1)+,(a0)+	;1..4 chars
	tst.b (a1)
	beq.b dofcc0
	move.b (a1)+,(a0)+
	tst.b (a1)
	beq.b dofcc0
	move.b (a1)+,(a0)+
	tst.b (a1)
	beq.b dofcc0
	move.b (a1)+,(a0)+
dofcc0:	rts



dotoea:	move.w d1,d0
	and.w #%111111,d0
	cmp.w #%111001,d0	;dest:(pc),d(pc),#xx invalid
	bls.b doto0
	sf d7 
	rts
doto0:	move.b #",",(a0)+

doea:	moveq #%111000,d0
	and.w d1,d0
	lsr.w #2,d0
	pea eatab(pc)
	move.w eatab(pc,d0.w),d0	;ext.l obsolete
	add.l d0,(a7)
	rts

eatab:	dc.w ddirect-eatab
	dc.w adirect-eatab
	dc.w aindirect-eatab
	dc.w aindirectpost-eatab
	dc.w aindirectpre-eatab
	dc.w aindirectdisp-eatab
	dc.w aindirectindex-eatab
	dc.w mode7-eatab
ddirect:move.b #"d",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	rts
adirect:move.b #"a",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	rts
toaindirect:
	move.b #",",(a0)+
aindirect:
	move.b #"(",(a0)+
	move.b #"a",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	move.b #")",(a0)+
	bsr.w setbase
	bra.w eaval
toaindirectpost:
	move.b #",",(a0)+
aindirectpost:
	move.b #"(",(a0)+
	move.b #"a",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	move.b #")",(a0)+
	move.b #"+",(a0)+
	bsr.w setbase
	bra.w eaval
aindirectpre:
	move.b #"-",(a0)+
	move.b #"(",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b #"a",(a0)+
	move.b d0,(a0)+
	move.b #")",(a0)+
	bsr.w setbase
	bra.w eaval
aindirectdisp:
	move.b #"(",(a0)+
	move.w (a5),d0
	bsr.w swordtoa_
	move.b #",",(a0)+
	move.b #"a",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	move.b #")",(a0)+
	bsr.w setbase
	move.w (a5)+,d0
	ext.l d0
	add.l d0,basereg-base(a6)
	bra.w eaval
aindirectindex:
	btst #0,(a5)
	bne.w indfull
	bsr.w setbase
	move.b #"(",(a0)+
	move.w (a5),d0
	bsr.w sbytetoa_
	ext.w d0
	ext.l d0
	add.l d0,basereg-base(a6)
	move.b #",",(a0)+
	move.b #"a",(a0)+
	moveq #%000111,d0
	and.w d1,d0
	add.b #"0",d0
	move.b d0,(a0)+
	move.b #",",(a0)+
	moveq #"d",d0
	btst #7,(a5)
	beq.b ind0
	moveq #"a",d0
ind0:	move.b d0,(a0)+
	moveq #%01110000,d0
	and.b (a5),d0
	lsr.b #4,d0
	add.b #"0",d0
	move.b d0,(a0)+
	movem.l d1/a1,-(a7)
	move.w #%11110000,d0
	and.b (a5),d0
	lsr.b #2,d0
	lea regs-base(a6),a1
	move.l (a1,d0.w),d1
	move.b #".",(a0)+
	moveq #"l",d0
	btst #3,(a5)
	bne.b ind1
	moveq #"w",d0
	ext.l d1
ind1:	move.b d0,(a0)+
	moveq #%00000110,d0
	and.b (a5),d0
	beq.b ind2
	lsr.b #1,d0
	move.b #"*",(a0)+
	move.b scale(pc,d0.w),(a0)+
ind2:	lsl.l d0,d1
	add.l d1,basereg-base(a6)
	move.b #")",(a0)+
	movem.l (a7)+,d1/a1
	addq.w #2,a5
	bra.w eaval
scale:	dc.l "1248"
pcindfull:
indfull:moveq #%00001000,d0
	and.w (a5),d0
	bne.w reserved		;fail
	moveq #%01000111,d0
	and.w (a5),d0
	cmp.b #%01000100,d0
	bcc.w reserved
	cmp.b #%00000100,d0
	beq.w reserved
	moveq #%00110000,d0
	and.w (a5),d0
	beq.w reserved

	move.w d2,-(a7)
	move.w (a5)+,d2		;full format extension
	move.b #"(",(a0)+
	moveq #%00000111,d0
	and.w d2,d0
	beq.b nomemind
	move.b #"[",(a0)+
nomemind:		

	moveq #%111111,d0
	and.w d1,d0
	cmp.w #%111011,d0	;pc indirect?
	bne.b nopcind

	moveq #%00110000,d0
	and.w d2,d0
	lsr.w #4,d0
	btst #7,d2
	beq.b nozpc
	bsr.w displace
	cmp.b #"[",-1(a0)
	beq.b noidisp
	move.b #",",(a0)+
noidisp:move.b #"z",(a0)+
	bra.b dozpc
nozpc:	subq.b #1,d0
	beq.b dozpc
	subq.b #1,d0
	beq.b nozpc1
	move.l a5,d0
	add.l (a5)+,d0
	subq.l #2,d0
	bsr.w hextoa_
;	move.b #".",(a0)+
;	move.b #"l",(a0)+
	bra.b nozpc0
nozpc1:	move.w (a5)+,d0
	ext.l d0
	add.l a5,d0
	subq.l #4,d0
	bsr.w hextoa_
	move.b #".",(a0)+
	move.b #"w",(a0)+
nozpc0:	move.b #",",(a0)+
dozpc:	move.b #"p",(a0)+
	move.b #"c",(a0)+
	bra.b baseok
nopcind:moveq #%00110000,d0	;base displacement
	and.w d2,d0
	lsr.w #4,d0
	bsr.w displace
	moveq #%000111,d0
	and.w d1,d0
	btst #7,d2		;bs
	bne.b basesupr
	cmp.b #"[",-1(a0)
	beq.b noidis2
	cmp.b #"(",-1(a0)
	beq.b noidis2
	move.b #",",(a0)+
noidis2:move.b #"a",(a0)+
	add.b #"0",d0
	move.b d0,(a0)+
	bra.b baseok	
basesupr:
	tst.b d0
	bne.w basfail
baseok:	
	btst #2,d2		;postindex?
	beq.b nopost
	move.b #"]",(a0)+
nopost:	btst #6,d2
	bne.b indsupr
	cmp.b #"[",-1(a0)
	beq.b indpre
	cmp.b #"(",-1(a0)
	beq.b indpre
	move.b #",",(a0)+
indpre:	moveq #"d",d0
	tst.w d2
	bpl.b dindx
	moveq #"a",d0
dindx:	move.b d0,(a0)+
	move.w #%0111000000000000,d0
	and.w d2,d0
	rol.w #4,d0
	add.b #"0",d0
	move.b d0,(a0)+
	move.b #".",(a0)+
	moveq #"l",d0
	btst #11,d2
	bne.b dind1
	moveq #"w",d0
dind1:	move.b d0,(a0)+
	move.w #%0000011000000000,d0
	and.w d2,d0
	beq.b dind2
	rol.w #7,d0
	move.b #"*",(a0)+
	move.b scale3(pc,d0.w),(a0)+
dind2:	bra.b indok
scale3:	dc.l "1248"
indsupr:move.w #%1111111000000000,d0
	and.w d2,d0
	bne.b indfail
indok:	moveq #%00000111,d0
	and.w d2,d0
	beq.b nopre
	btst #2,d2
	bne.b nopre 
	move.b #"]",(a0)+
nopre:
	moveq #%00000011,d0	;outer displacement
	and.w d2,d0
	beq.b nomemind2
	cmp.b #1,d0
	beq.b nokoma
	move.b #",",(a0)+
nokoma:	bsr.b displace
nomemind2:	
	move.b #")",(a0)+
indquit:move.w (a7)+,d2
	rts
indfail:
basfail:sf d7
	bra.b indquit

displace:
	subq.b #1,d0
	beq.b nullouter
	subq.b #1,d0
	beq.b wordouter
	move.l (a5)+,d0
	bsr.w hextoa_
;	move.b #".",(a0)+
;	move.b #"l",(a0)+
	rts
wordouter:
	move.w (a5)+,d0		;upper word=0
	bsr.w hextoa_
	move.b #".",(a0)+
	move.b #"w",(a0)+
nullouter:
	rts

mode7:	moveq #%000111,d0
	and.w d1,d0
	add.w d0,d0
	pea mod7tab(pc)
	move.w mod7tab(pc,d0.w),d0
	add.l d0,(a7)
	rts
mod7tab:dc.w absshort-mod7tab
	dc.w abslong-mod7tab
	dc.w pcindirect-mod7tab
	dc.w pcindex-mod7tab
	dc.w immediate-mod7tab
	dc.w reserved-mod7tab
	dc.w reserved-mod7tab
	dc.w reserved-mod7tab

absshort:
	move.b #"(",(a0)+
	moveq #0,d0
	move.w (a5)+,d0
	bsr.w hextoa_
	move.b #")",(a0)+
	move.b #".",(a0)+
	move.b #"w",(a0)+
	rts
abslong:move.b #"(",(a0)+
	move.l (a5)+,d0
	bsr.w hextoa_
	move.b #")",(a0)+
	rts
pcindirect:
	move.b #"(",(a0)+
	moveq #-2,d0
	add.w (a5)+,d0
	ext.l d0
	add.l a5,d0
	bsr.w hextoa_
	move.b #",",(a0)+
	move.b #"p",(a0)+
	move.b #"c",(a0)+
	move.b #")",(a0)+
	rts
pcindex:btst #0,(a5)
	bne.w pcindfull
	move.b #"(",(a0)+
	move.w (a5),d0
	ext.w d0
	ext.l d0
	add.l a5,d0
	move.l d0,basereg-base(a6)
	bsr.w hextoa_
	move.b #",",(a0)+
	move.b #"p",(a0)+
	move.b #"c",(a0)+
	move.b #",",(a0)+
	moveq #"d",d0
	btst #7,(a5)
	beq.b pcind0
	moveq #"a",d0
pcind0:	move.b d0,(a0)+
	moveq #%01110000,d0
	and.b (a5),d0
	lsr.b #4,d0
	add.b #"0",d0
	move.b d0,(a0)+
	movem.l d1/a1,-(a7)
	move.w #%11110000,d0
	and.b (a5),d0
	lsr.b #2,d0
	lea regs-base(a6),a1
	move.l (a1,d0.w),d1
	move.b #".",(a0)+
	moveq #"l",d0
	btst #3,(a5)
	bne.b pcind1
	moveq #"w",d0
	ext.l d1
pcind1:	move.b d0,(a0)+
	moveq #%00000110,d0
	and.b (a5),d0
	beq.b pcind2
	lsr.b #1,d0
	move.b #"*",(a0)+
	move.b scale2(pc,d0.w),(a0)+
pcind2:	lsl.l d0,d1
	add.l d1,basereg-base(a6)
	move.b #")",(a0)+
	movem.l (a7)+,d1/a1
	addq.w #2,a5
	bra.w eaval
scale2:	dc.l "1248"

immediate:
	move.b #"#",(a0)+
	moveq #0,d0
	move.w (a5)+,d0
	tst.b imsize-base(a6)
	bne.b imword
	cmp.w #$ff,d0
	bhi.b reserved		;fail
	bra.w hextoa_
imword:	cmp.b #%001,imsize-base(a6)
	bne.b imlong
	bra.w hextoa_
imlong:	cmp.b #%010,imsize-base(a6)
	bne.b fpu4wrd
	swap d0
	move.w (a5)+,d0
	bra.w hextoa_
imresvd:cmp.b #%011,imsize-base(a6)
	beq.b reserved
fpu4wrd:cmp.b #%100,imsize-base(a6)	;%1xx fpu imsize
	bne.b fpu5wrd
fpu4w0:	swap d0
	move.w (a5)+,d0
	bsr.w longtoa_
fpu2w0:	move.l (a5)+,d0
	bra.w longtoa
fpu5wrd:cmp.b #%101,imsize-base(a6)
	beq.b reserved
fpu6wrd:cmp.b #%110,imsize-base(a6)
	bne.b reserved
	bsr.b fpu4w0
	bra.b fpu2w0

reserved:
	sf d7
	rts

setbase:move.l a1,-(a7)
	lea regs-base(a6),a1
	moveq #%000111,d0
	and.w d1,d0
	lsl.w #2,d0
	move.l 8*4(a1,d0.w),basereg-base(a6)	;contents An
	move.l (a7)+,a1
	rts
eaval:	btst #2,dissign-base(a6)
	beq.b eaval1
	move.l a0,-(a7)
	move.l basereg-base(a6),d0
	lea linebuf+60-base(a6),a0		;longest movem.l .... !
	move.b #";",(a0)+
	tst.b ea2nd-base(a6)
	beq.b eaval0 
	lea 10(a0),a0
eaval0:	bsr.w longtoa_
	st ea2nd-base(a6)
	move.l (a7)+,a0
eaval1:	rts

sbytetoa_:move.l d0,-(a7)
	btst #0,dissign-base(a6)
	beq.b sby0
	tst.b d0
	bpl.b sby0
	neg.b d0	
	move.b #"-",(a0)+
sby0:	and.l #$ff,d0
	btst #1,dissign-base(a6)
	beq.b sby1
	bsr.w hextod
	bra.b sby2
sby1:	bsr.w hextoa_			;bsr.w bytetoa_
sby2:	move.l (a7)+,d0
	rts

swordtoa_:move.l d0,-(a7)
	btst #0,dissign-base(a6)
	beq.b swo0
	tst.w d0
	bpl.b swo0
	neg.w d0
	move.b #"-",(a0)+	
swo0:	and.l #$ffff,d0
	btst #1,dissign-base(a6)
	beq.b swo1
	bsr.w hextod
	bra.b swo2
swo1:	bsr.w hextoa_			;bsr.w wordtoa_
swo2:	move.l (a7)+,d0
	rts

assubs:
aopfail=*-assubs
anoops=*-assubs
	rts
adcwop=*-assubs
	bsr.w atoword_
	move.w d0,op68000-base(a6)
	rts
aeatoccr=*-assubs
	sf imsize-base(a6)
	bsr.w assea
	lea toccrtxt(pc),a0
	bra.w cmptxt
aeatosr=*-assubs
	move.b #1,imsize-base(a6)
	bsr.w assea
	lea tosrtxt(pc),a0
	bra.w cmptxt

accrtoea=*-assubs
	lea ccrtxt(pc),a0
	bra.b assrea
asrtoea=*-assubs
	lea srtxt(pc),a0
assrea:	bsr.w cmptxt
	bra.w asstoea

abrapcc=*-assubs
	bsr.w asspccode
	bra.b abraf0
abrafcc=*-assubs
	bsr.w assfccode
abraf0:	or.w d0,op68000-base(a6)
	cmp.b #".",(a3)+
	bne.w fail
	cmp.b #"w",(a3)+
	beq.b awdcc0
	bset #6,op68000+1-base(a6)	;long
	cmp.b #"l",-1(a3)
	beq.b algcc0
	bra.b awdbxx1		;fail
awordcc=*-assubs
	bsr.w assccode
	cmp.b #".",(a3)+
	bne.b awdbxx1		;fail
	cmp.b #"w",(a3)+	;bxx.w
	bne.b awdbxx1		;fail
awdcc0:	bsr.w asstab
awordbxx=*-assubs
awdrel:	bsr.w atolong_
	subq.l #2,d0
	sub.l lginstr-base(a6),d0	;fdbx dx,lab...
	sub.l para-base(a6),d0
	move.l d0,d1
	;beq.b awdbxx1		;beq.w *+2
	bpl.b awdbxx0
	not.l d1
awdbxx0:cmp.l #$7fff,d1
	bhi.b awdbxx1
	bra.w storeword 
awdbxx1:sf d7
	rts
alongcc=*-assubs
	bsr.w assccode
	cmp.b #".",(a3)+
	bne.b awdbxx1		;fail
	cmp.b #"l",(a3)+	;bxx.l
	bne.b awdbxx1		;fail
algcc0:	bsr.w asstab
alongbxx=*-assubs
	bsr.w atolong_
	subq.l #2,d0
	sub.l para-base(a6),d0
	bra.w storelong

ashortcc=*-assubs
	bsr.w assccode
	cmp.b #".",(a3)+
	bne.b ashbxx1		;fail
	moveq #"b",d0
	sub.b (a3)+,d0
	beq.b ashort0
	cmp.b #"b"-"s",d0	;clone
	bne.b ashbxx1		;fail
ashort0:bsr.w asstab
ashortbxx=*-assubs
ashbxx:	bsr.w atolong_
	subq.l #2,d0
	sub.l para-base(a6),d0
	or.b d0,op68000+1-base(a6)
	beq.b ashbxx1
	bpl.b ashbxx0
	not.l d0
ashbxx0:moveq #$7f,d1
	cmp.l d1,d0
	bls.b ashbxx2
ashbxx1:sf d7
ashbxx2:rts

aeatoax=*-assubs
	bsr.w assea
	bra.w asstoax9b

aea2todx=*-assubs
	move.b #2,imsize-base(a6)
	bra.b aea2dx
aeatodx=*-assubs
	move.b #1,imsize-base(a6)
aea2dx:
asize67eatodx=*-assubs
	bsr.w assea
	bra.w asstodx9b

adxtoea=*-assubs
	bsr.w assdx9b
	bra.w asstoea

aiwordtoccr=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atobyte_
	bsr.w storeword
	lea toccrtxt(pc),a0
	bra.w cmptxt
aiwordtosr=*-assubs
	bsr.b aiwrd
	lea tosrtxt(pc),a0
	bra.w cmptxt
aiword=*-assubs
aiwrd:	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atoword_
	bra.w storeword
alpstop=*-assubs
	move.w #$01c0,d0
	bsr.w storeinstr
	bra.b aiwrd
atbl=*-assubs
	moveq #0,d0	;unsigned
	moveq #"u",d1
	sub.b (a3)+,d1
	beq.b atblu
	add.b #"s"-"u",d1
	bne.w fail
	bset #11,d0	;signed
atblu:	cmp.b #"n",(a3)
	bne.b atbln
	bset #10,d0	;round
	addq.w #1,a3
atbln:	cmp.b #".",(a3)+
	bne.w fail
	moveq #"b",d1
	sub.b (a3)+,d1
	beq.b atblb
	bset #6,d0
	cmp.b #"b"-"w",d1
	beq.b atblb
	cmp.b #"b"-"l",d1
	bne.w fail
	eor.b #%11000000,d0
atblb:	bsr.w storeinstr	
	bsr.w asstab
	cmp.b #"d",(a3)+
	bne.b atblea
	bsr.w assxx02
	cmp.b #":",(a3)+
	bne.w fail
	bsr.w assdn02
	or.b d0,op68000+3-base(a6)
	bra.b atbld	
atblea:	subq.w #1,a3
	bsr.w assea
	bset #0,op68000+2-base(a6)
atbld:	cmp.b #",",(a3)+
	bne.w fail
	bsr.w assdn02
	rol.w #4,d0
	or.b d0,op68000+2-base(a6)
	rts	
afpu=*-assubs
	sf d7
	rts
afmovemx=*-assubs
	moveq #0,d0
	bsr.w storeinstr
	cmp.b #"d",(a3)
	beq.b afmvmx0		;dynamic mask
	cmp.b #"f",(a3)
	beq.b afmvmx0
	bsr assea
	cmp.b #",",(a3)+
	bne.w fail
	bra assfprx
afmvmx0:bset #13,op68000+2-base(a6)
	bsr assfprx
	bsr asstoea
	moveq #%111000,d0
	and.w op68000-base(a6),d0
	beq.w fail		;dn
	cmp.b #%001000,d0	;an
	beq.w fail
	cmp.b #%111100,d0	;#
	beq.w fail
	cmp.b #%100000,d0	;-(an)?
	bne.b afmvmx1
	move.b op68000+3-base(a6),d1	;rl
	moveq #8-1,d0
afmvmx2:lsr.b #1,d1
	roxl.b #1,d2
	dbf d0,afmvmx2
	move.b d2,op68000+3-base(a6)
	bclr #12,op68000+2-base(a6)	;predec mode
afmvmx1:rts	
	

afmoveml=*-assubs
	st d5
	bra.b afmovem
afmovel=*-assubs
	sf d5			;fmovem flag
afmovem:moveq #0,d4		;fpcr counter
	move.w #$8000,d0
	bsr.w storeinstr
	move.b #%010,imsize-base(a6)	;long
	pea fpiar0(pc)		;fpiar,An check
	cmp.b #"f",(a3)
	bne.b afpcr1
	bset #13,op68000+2-base(a6)
	bsr.b afpcr
	bra asstoea
afpcr1:	bsr assea
	cmp.b #",",(a3)+
	bne.b fpfail
afpcr:	cmp.b #"f",(a3)+
	bne.b fpfail
	cmp.b #"p",(a3)+
	bne.b fpfail
	moveq #12,d2
	cmp.b #"c",(a3)
	beq.b afpcr0
	moveq #11,d2
	cmp.b #"s",(a3)
	beq.b afpcr0
	moveq #10,d2
	cmp.b #"i",(a3)+
	bne.b fpfail
	cmp.b #"a",(a3)
	bne.b fpfail
afpcr0:	addq.w #1,a3
	cmp.b #"r",(a3)+
	bne.b fpfail
	bset d2,op68000+2-base(a6)
	addq.b #1,d4		;fpcr counter
	cmp.b #"/",(a3)
	bne.b afpcr2
	tst.b d5		;fmovem flag
	beq.b fpfail	
	addq.w #1,a3
	bra.b afpcr
afpcr2:	rts
fpiar0:	moveq #%111000,d0
	and.b op68000+1-base(a6),d0	;ea field
	bne.b fpiar1			;Dn?
	cmp.b #1,d4			;1 fpcr?
	bne.b fpfail
fpiar1:	subq.b #%001000,d0		;An
	bne.b fpcrok
	cmp.b #1,d4			;1 fpcr?
	bne.b fpfail
	btst #10,op68000+2-base(a6)	;fpiar?
	bne.b fpcrok
fpfail:	sf d7
fpcrok:	rts

afmovecr=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atobyte_
	beq.b amfk0
	cmp.b #$3f,d0
	bhi.w fail
	cmp.b #$0b,d0
	bcs.w fail
	cmp.b #$0f,d0
	bls.b amfk0
	cmp.b #$30,d0
	bcs.w fail 
amfk0:	or.w #$5c00,d0
	bsr.w storeword
	bra.w asstofpx79

assfprx:move.w #$d000,d0	;postincr/cntrl mode
	cmp.b #"d",(a3)	;dynamic mask?
	bne.b arxmvm2
	addq.w #1,a3
	move.b (a3)+,d0
	sub.b #"0",d0
	bcs.b arxfail
	cmp.b #7,d0
	bhi.b arxfail
	lsl.b #4,d0
	bset #11,d0	;dynamic
	bra.b arxmvm1	
arxmvm2:cmp.b #"f",(a3)+
	bne.b arxfail
	cmp.b #"p",(a3)+
	bne.b arxfail
	move.b (a3)+,d1
	sub.b #"0",d1
	bcs.b arxfail
	cmp.b #7,d1
	bhi.b arxfail
	moveq #7,d3
	sub.b d1,d3
	bset d3,d0
arxmvm4:cmp.b #",",(a3)
	beq.b arxmvm1
	cmp.b #"/",(a3)+
	beq.b arxmvm2
	cmp.b #"-",-1(a3)
	bne.b arxmvm1
	cmp.b #"f",(a3)+
	bne.b arxfail
	cmp.b #"p",(a3)+
	bne.b arxfail
	move.b (a3)+,d2
	sub.b #"0",d2
	bcs.b arxfail
	cmp.b #7,d2
	bhi.b arxfail
	cmp.b d1,d2
	bls.b arxfail
arxmvm3:addq.b #1,d1
	moveq #7,d3
	sub.b d1,d3
	bset d3,d0	
	cmp.b d1,d2
	bne.b arxmvm3
	bra.b arxmvm4
arxmvm1:or.w d0,op68000+2-base(a6)
	rts
arxfail:bra fail
	
apccodewordrel=*-assubs
	bsr.w asspccode
	bra.b accode1
afccodewordrel=*-assubs
	bsr.w assfccode
accode1:bsr.w storeinstr	;instr
	bra.b accode0		;4bytes instrlen ok (oma bug)
accodewordrel=*-assubs
	bsr.w assccode
accode0:bsr.w asstab
	bsr.w assdx02
	cmp.b #",",(a3)+
	beq.w awdrel
	sf d7
	rts
ainibtoea=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atodnib
	cmp.b #31,d0
	bhi.w fail
	bsr.w storeinstr
	bra.w asstoea

apccodeea=*-assubs
	bsr.w asspccode
	bra.b asrc1
afccodeea=*-assubs
	bsr.w assfccode
asrc1:	bsr.w storeinstr
	bra.b asrc0
accodeea=*-assubs
	bsr.w assccode
asrc0:	bsr.w asstab
asrcea=*-assubs
	bra.w assea

aimoves=*-assubs
	bsr.w storeinstr	;space
	moveq #0,d3
	cmp.b #",",2(a3)	;xx,<ea>
	bne.b actlmvs
	bset #11,d3
	bsr.w amvcreg
	addq.w #1,a3
	bsr.w assea
	bra.b aimvs0
actlmvs:bsr.w assea
	cmp.b #",",(a3)+
	bne.w fail
	bsr.w amvcreg
aimvs0:	move.w d3,op68000+2-base(a6)
	rts

asize8eatoax9b=*-assubs
	bsr.w assea
	bra.w asstoax9b

asize67ixtoea=*-assubs
	cmp.b #"#",(a3)
	bne.w fail
	bsr.w assea		;#$xx.x
	bra.w asstoea		;clr previous ea !

asize67i9btoea=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atobyte
	beq.w fail
	cmp.b #8,d0
	bhi.w fail	
	bne.b ai9b0
	sf d0
ai9b0:	add.b d0,d0
	or.b d0,op68000-base(a6)
	bra.w asstoea

asize67x9btodx02=*-assubs
	cmp.b #"#",(a3)+
	bne.b ashft0
	bsr.w atobyte
	beq.w fail
	cmp.b #8,d0
	bhi.w fail
	bne.b ashft1
	sf d0
ashft1:	add.b d0,d0
	or.b d0,op68000-base(a6)
	bra.w asstodx02
ashft0:	bset #5,op68000+1-base(a6)
	subq.w #1,a3
	bsr.w assdx9b
	bra.w asstodx02

aitrap=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atodnib
	cmp.b #15,d0
	bhi.w fail
	or.b d0,op68000+1-base(a6)
	rts
asrcdx02=*-assubs
	bra.w assdx02
aimusp=*-assubs
	lea usptxt(pc),a0
	cmp.b #"a",(a3)
	beq.b aimusp0
	bset #3,op68000+1-base(a6)
	bsr.b aimusp1
	cmp.b #",",(a3)+
	bra.w assax02
aimusp0:bsr.w assax02
	cmp.b #",",(a3)+
	bne.w fail
aimusp1:bra.w cmptxt

apmovefd=*-assubs			;68030mmu only
	move.w #$0100,d0
	bsr.b apmvfd
	move.w op68000+2-base(a6),d0
	cmp.w #$4100,d0			;40:tc
	beq.w apfdok
	eor.w #%0000100100000000,d0	;08:tt0,0c:tt1,48:srp,4c:crp
	and.w #%1011101111111111,d0
	bne.w fail
apfdok:	rts
apmove=*-assubs
	bsr.b apreg
	move.l a1,a3		;restore ptr
	tas d7			;fail?, ignore fail
	beq.b afromea
apmv2ea:move.w #$200,d0
	bsr.w storeinstr
	bsr.b apreg
	bra.w asstoea
afromea:moveq #0,d0
apmvfd:	bsr.w storeinstr
	bsr.w assea
	cmp.b #",",(a3)+
	bne.w fail
apreg:	lea pregs(pc),a0
	move.l a3,a1
aprglp:	move.b (a0)+,d1
	beq.w fail
aprgcmp:moveq #$7f,d0
	and.b (a0),d0
	cmp.b (a3)+,d0
	bne.b aprgskp
	tst.b (a0)+
	bpl.b aprgcmp
	bra.b aprok
aprgskp:tst.b (a0)+
	bpl.b aprgskp
	move.l a1,a3
	bra.b aprglp
aprok:	or.b d1,op68000+2-base(a6)
	rts
aidbcac=*-assubs
aidb3:	move.b (a3)+,d1
	cmp.b #"c",(a3)+
	bne.b aidb2
	moveq #4-1,d0
	lea idctx(pc),a0
aidb1:	cmp.b (a0,d0.w),d1
	beq.b aidb0
	dbf d0,aidb1
aidb2:	bra.w fail
aidb0:	lsl.w #6,d0
	or.w d0,op68000-base(a6) 
	rts
aidbind=*-assubs
	bsr.b aidb3
	cmp.b #",",(a3)+
	bne.w fail
apflush40=*-assubs
	cmp.b #"(",(a3)+
	bne.w fail
	bsr.w assax02
	cmp.b #")",(a3)+
	bne.w fail
	rts

aimovec=*-assubs
	moveq #0,d3
	cmp.b #"t",(a3)		;movec tc, (68040)
	beq.b actlmvc
	cmp.b #",",2(a3)	;xx,xxx(x)
	bne.b actlmvc
	bset #0,op68000+1-base(a6)
	bsr.b amvcreg
	addq.w #1,a3	;cmp.b #",",(a3)+ bne.w fail
	bsr.b actrlmv
	bra.b aimvc0
actlmvc:bsr.b actrlmv
	cmp.b #",",(a3)+
	bne.w fail
	bsr.b amvcreg
aimvc0:	move.w d3,d0
	bra.w storeword
actrlmv:lea cregs-6(pc),a2
actrl1:	addq.w #6,a2
	tst.b (a2)
	bmi.w actrl4
	moveq #0,d1
actrl2:	move.b 2(a2,d1.w),d0
	beq.b actrl0
	cmp.b (a3,d1.w),d0
	bne.b actrl1
	addq.b #1,d1
	cmp.b #4,d1
	bne.b actrl2	
actrl0:	or.w (a2),d3
	add.w d1,a3
	rts
actrl4:	sf d7		;fail
	rts
amvcreg:move.b (a3)+,d0
	cmp.b #"d",d0
	beq.b mvcdx
	bset #15,d3	;ax
	cmp.b #"a",d0
	bne.w actrl4
mvcdx:	bsr.w assrn02
	ror.w #4,d0
	or.w d0,d3	;ax/dx
	rts

abfieldtodx=*-assubs
	bsr.b abfi3
	cmp.b #",",(a3)+
	bne.w fail
	cmp.b #"d",(a3)+
	bne.w fail
	moveq #0,d3
	bsr.b mvcdx
	or.w d3,op68000+2-base(a6)
	rts
adxtobfield=*-assubs
	cmp.b #"d",(a3)+
	bne.w fail
	moveq #0,d3
	bsr.b mvcdx
	cmp.b #",",(a3)+
	bne.w fail
	bsr.b abfi3
	or.w d3,op68000+2-base(a6)
	rts
abfield=*-assubs
abfi3:	bsr.w storeinstr
	bsr.w assea
	cmp.b #"{",(a3)+
	bne.w fail
	bsr.b abfi2
	and.w #%111111,d0
	lsl.w #6,d0
	move.w d0,d2
	cmp.b #":",(a3)+
	bne.w fail
	bsr.b abfi2
	and.w #%111111,d0
	or.w d2,d0
	cmp.b #"}",(a3)+
	bne.w fail
	move.w d0,op68000+2-base(a6)
	rts
abfi2:	cmp.b #"d",(a3)
	beq.b abfi1
	bsr.w atodnib
	beq.w fail
	cmp.b #32,d0
	bhi.w fail
	bclr #5,d0	;bitfield32=0
	rts
abfi1:	addq.w #1,a3
	move.b (a3)+,d0
	sub.b #"0",d0
	bcs.w fail
	cmp.b #7,d0
	bhi.w fail
	bset #5,d0
	rts
abkpt=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bra.w assxx02
apack=*-assubs
	cmp.b #"-",(a3)
	bne.b apadx
	addq.w #1,a3
	cmp.b #"(",(a3)+
	bne.w fail
	bsr.w assax02
	lea xbcdtxt(pc),a0
	bsr.w cmptxt
	bsr.w assax9b
	cmp.b #")",(a3)+
	bne.w fail
	bset #3,op68000+1-base(a6)
	bra.b apad0
apadx:	bsr.w assdx02
	bsr.w asstodx9b
apad0:	cmp.b #",",(a3)+
	bne.w fail
	bra.w aiwrd
amov16=*-assubs
	cmp.b #"(",(a3)+
	bne.w fail
	bsr.w assax02
	lea cmpmtxt(pc),a0
	bsr.w cmptxt
	bsr.w assan02
	ror.w #4,d0
	or.w #$8000,d0
	bra.w storeinstr
amov162=*-assubs
	cmp.b #"a",1(a3)	;(ax)
	bne.b amov0
	cmp.b #"(",(a3)+
	bne.w fail
	bsr.w assax02
	cmp.b #")",(a3)+
	bne.w fail
	moveq #%000000,d1
	cmp.b #"+",(a3)+
	beq.b amov1
	subq.w #1,a3
	moveq #%010000,d1
amov1:	cmp.b #",",(a3)+
	bne.w fail
	or.b d1,op68000+1-base(a6)
amov2:	move.w op68000-base(a6),-(a7)
	bsr.w assea
	moveq #%111111,d0
	and.w op68000-base(a6),d0
	move.w (a7)+,op68000-base(a6)
	cmp.w #%111001,d0
	bne.w fail
	rts
amov0:	bsr.b amov2
	cmp.b #",",(a3)+
	bne.w fail
	cmp.b #"(",(a3)+
	bne.w fail
	bsr.w assax02
	cmp.b #")",(a3)+
	bne.w fail
	moveq #%001000,d1
	cmp.b #"+",(a3)+
	beq.b amov3
	moveq #%011000,d1
amov3:	or.b d1,op68000+1-base(a6)
	rts

aimove=*-assubs
	moveq #%01,d0
	sf imsize-base(a6)
	cmp.b #"b",(a3)
	beq.b aimov0
	moveq #%11,d0
	addq.b #1,imsize-base(a6)
	cmp.b #"w",(a3)
	beq.b aimov0
	moveq #%10,d0
	addq.b #1,imsize-base(a6)
	cmp.b #"l",(a3)
	bne.w fail
aimov0:	lsl.b #4,d0
	or.b d0,op68000-base(a6)
	addq.w #1,a3
	bsr.w asstab
	bsr.w assea
	move.w op68000-base(a6),-(a7)
	bsr.w asstoea
	move.w op68000-base(a6),d1
	move.w (a7)+,op68000-base(a6)
	move.w d1,d0
	and.w #%111,d0
	ror.w #7,d0
	or.w d0,op68000-base(a6)
	and.w #%111000,d1
	lsl.w #3,d1
	or.w d1,op68000-base(a6)
	rts
aimoveq=*-assubs
	sf imsize-base(a6)
	bsr.w assea
	move.w op68000-base(a6),d0
	clr.l oplen-base(a6)
	and.w #%111111,d0	;#x
	cmp.w #%111100,d0
	bne.w fail
	move.b op68000+3-base(a6),op68000+1-base(a6)
	bra.w asstodx9b
aicallm=*-assubs
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atobyte_		;d0.l
	bsr.w storeinstr
	bra.w asstoea

acas=*-assubs
	bsr.b assdn02
	move.w d0,d2
	cmp.b #",",(a3)+
	bne.w fail
	bsr.b assdn02
	lsl.w #6,d0
	or.w d2,d0
	bsr.w storeinstr
	bra.w asstoea

assan02:cmp.b #"a",(a3)+
	bne.w fail
	bra.b assrn02
assdn02:cmp.b #"d",(a3)+
	bne.w fail
assrn02:move.b (a3)+,d0
	sub.b #"0",d0
	bcs.w fail
	cmp.b #7,d0
	bhi.w fail
	ext.w d0
	rts
acas2=*-assubs
	cmp.b #"w",(a3)
	beq.b aca0	
	cmp.b #"l",(a3)
	bne.w fail
	bset #9,op68000-base(a6)
aca0:	addq.w #1,a3
	bsr.w asstab
	bsr.b assdn02
	swap d0
	cmp.b #":",(a3)+
	bne.b cas2fl
	bsr.b assdn02
	move.l d0,d1
	cmp.b #",",(a3)+
	bne.b cas2fl
	bsr.b assdn02
	swap d0
	cmp.b #":",(a3)+
	bne.b cas2fl
	bsr.b assdn02
	lsl.l #6,d0
	or.l d0,d1
	cmp.b #",",(a3)+
	bne.b cas2fl
	cmp.b #"(",(a3)+
	bne.b cas2fl
	moveq #0,d3
	bsr.w amvcreg
	cmp.b #")",(a3)+
	bne.b cas2fl
	cmp.b #":",(a3)+
	bne.b cas2fl
	cmp.b #"(",(a3)+
	bne.b cas2fl
	swap d3
	bsr.w amvcreg
	cmp.b #")",(a3)+
	bne.b cas2fl
	or.l d1,d3
	move.l d3,d0
	bra.w storelong
cas2fl:	sf d7
	rts
achk2=*-assubs
	move.w #$0800,d3
	bra.b achkcmp
acmp2=*-assubs
	moveq #0,d3
achkcmp:bsr.w storeinstr
	bsr.w assea
	cmp.b #",",(a3)+
	bne.b cas2fl
	bsr.w amvcreg	;or.w ?,d3
	move.w d3,op68000+2-base(a6)
	rts

artm=*-assubs
	moveq #0,d3
	bsr.w amvcreg
	rol.w #4,d3
	or.w d3,op68000-base(a6)	;0000ynnn
	rts

atppccsize=*-assubs
	bsr.w asspccode
	bra.b atpc2
atpfccsize=*-assubs
	bsr.w assfccode
atpc2:	bsr.w storeinstr
	bra.b atpc1
atpccsize=*-assubs
	bsr.w assccode
atpc1:	cmp.b #".",(a3)+
	bne.w fail
	move.b (a3)+,d0
	bsr.w asstab
	cmp.b #"w",d0
	beq.w aiwrd
	cmp.b #"l",d0
	bne.w fail
	bset #0,op68000+1-base(a6)
atpc0:	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w atolong_
	bra.w storelong
atpcc=*-assubs
	bsr.w assccode
	cmp.b #" ",(a3)+
	bne.w fail
	rts

apvalid=*-assubs
	bsr.w assan02
	or.w #$2c00,d0
	bsr.b afstore
	bra.w asstoea
atppcc=*-assubs
	bsr.w asspccode
	bra.b afst0
atpfcc=*-assubs
	bsr.w assfccode
afst0:	cmp.b #" ",(a3)+
	bne.w fail
afstore:bra.w storeinstr

afnop=*-assubs
	moveq #0,d0		;4byte command
	bra.b afstore
apflusha=*-assubs
	move.w #$2400,d0
	bra.b afstore
apflushr=*-assubs
	move.w #$a000,d0
	bsr.b afstore
	bra.w assea
apflushs=*-assubs
	move.w #$3400,d3	
	bra.b apfl3
apflush=*-assubs
	move.w #$3000,d3	
apfl3:	move.b (a3)+,d2
	cmp.b #"f",(a3)
	bne.b apfl1
	addq.w #1,a3
	cmp.b #"c",(a3)+
	bne.w fail
	moveq #%00000000,d1
	cmp.b #"s",d2
	beq.b apfl2
	moveq #%00000001,d1
	cmp.b #"d",d2
	beq.b apfl2
	bra.w fail
apfl1:	moveq #%00010000,d1
	moveq #"#",d0
	sub.b d2,d0
	beq.b apfl0
	cmp.b #"#"-"d",d0
	bne.w fail
	moveq #%00001000,d1
apfl0:	bsr.w assrn02
	or.w d0,d1
apfl2:	cmp.b #",",(a3)+
	bne.w fail
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w assrn02
	lsl.w #5,d0
	or.w d1,d0
	or.w d3,d0	;$3000|$3400
	bra.b afstore
apload=*-assubs
	move.w #$2010,d1
apte0:	moveq #"w",d0
	sub.b (a3)+,d0
	beq.b aplo0
	bset #9,d1
	subq.b #"w"-"r",d0
	bne.w fail
aplo0:	bsr.w asstab
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w assrn02
	or.w d1,d0
	bsr.w afstore	
	bra.w asstoea
aptest=*-assubs
	move.w #$8110,d1
	bsr.b apte0
	cmp.b #",",(a3)+
	bne.w fail
	cmp.b #"#",(a3)+
	bne.w fail
	bsr.w assrn02
	ror.w #6,d0
	beq.w fail	;level 0?
	move.w d0,d1
	cmp.b #",",(a3)+
	bne.w fail
	cmp.b #"a",(a3)+
	bne.w fail
	bsr.w assrn02
	rol.w #5,d0
	or.w d1,d0
	or.w d0,op68000+2-base(a6)
	rts
	
adivsll=*-assubs
	move.w #$800,d0
	bra.b adivs0
adivull=*-assubs
	moveq #0,d0
adivs0:	bsr.w storeinstr
	move.b #%10,imsize-base(a6)
	bsr.w assea
	cmp.b #",",(a3)+
	bne.w fail
	bsr.w assdn02		;d0.w
	move.w d0,d3
	cmp.b #":",(a3)+
	bne.w fail
	bsr.w assdn02
	cmp.b d0,d3
	beq.w fail
	bra.b notwo	
amulsl=*-assubs
	move.w #$800,d0
	bra.b amuls0
amulul=*-assubs
	moveq #0,d0
amuls0:	bsr.w storeinstr
	move.b #%10,imsize-base(a6)
	bsr.w assea
	cmp.b #",",(a3)+
	bne.w fail
	bsr.w assdn02		;d0.w
	move.w d0,d3
	cmp.b #":",(a3)+
	bne.b notwo
	bset #10,d3
	bsr.w assdn02
notwo:	ror.w #4,d0		;mulx.l ea,dm:dm=dn
	or.w d0,d3
	or.w d3,op68000+2-base(a6)	
	rts

aicmpm=*-assubs
	cmp.b #"(",(a3)+
	bne.w fail
	bsr.w assax02
	lea cmpmtxt(pc),a0
	bsr.w cmptxt
	bsr.w assax9b
	cmp.b #")",(a3)+
	bne.w fail
	cmp.b #"+",(a3)+
	bne.w fail
	rts

asize67adsbx=*-assubs		;same!
axbcd=*-assubs
aasxbcd:cmp.b #"-",(a3)+
	bne.b axbcd0
	bset #3,op68000+1-base(a6)
	cmp.b #"(",(a3)+
	bne.b axbcd2		;fail
	bsr.w assax02
	lea xbcdtxt(pc),a0
	bsr.w cmptxt
	bsr.w assax9b
	cmp.b #")",(a3)+
	beq.b axbcd1		;no fail
axbcd2:	sf d7
axbcd1:	rts
axbcd0:	subq.w #1,a3
	bsr.w assdx02
	bra.w asstodx9b

asize6movep=*-assubs
	cmp.b #"d",(a3)
	beq.b amovp0
	bsr.w assea
	move.w op68000-base(a6),d0
	bclr #5,op68000+1-base(a6)
	and.w #%111000,d0
	cmp.w #%101000,d0
	bne.w fail
	bra.w asstodx9b
amovp0:	bset #7,op68000+1-base(a6)
	bsr.w assdx9b
	bsr.w asstoea
	move.w op68000-base(a6),d0
	bclr #5,op68000+1-base(a6)
	and.w #%111000,d0
	cmp.w #%101000,d0
	bne.w fail
	rts
aimovem=*-assubs
	moveq #0,d0
	bsr storeinstr
	cmp.b #"d",(a3)
	beq.b aimovm0
	cmp.b #"a",(a3)
	beq.b aimovm0
	bset #10,op68000-base(a6)
	bsr.w assea
	cmp.b #",",(a3)+
	bne.w fail
	bsr.b assrx
	bra.b aimovm7
aimovm0:bsr.b assrx
	bsr.w asstoea
aimovm7:moveq #%111000,d0
	and.w op68000-base(a6),d0
	cmp.w #%100000,d0	;-(an)
	bne.b aimovm8
	move.w op68000+2-base(a6),d1	;rl
	moveq #16-1,d0
aimovm9:lsr.w #1,d1
	roxl.w #1,d2
	dbf d0,aimovm9
	move.w d2,op68000+2-base(a6)
aimovm8:rts
assrx:	clr.w d0
aimovm2:move.b 1(a3),d1
	sub.b #"0",d1
	bcs.w fail
	cmp.b #7,d1
	bhi.w fail
	cmp.b #"d",(a3)
	beq.b aimovm5
	cmp.b #"a",(a3)
	bne.w fail
	addq.b #8,d1
aimovm5:addq.w #2,a3
	bset d1,d0
aimovm4:cmp.b #",",(a3)
	beq.b aimovm1
	cmp.b #"/",(a3)+
	beq.b aimovm2
	cmp.b #"-",-1(a3)
	bne.b aimovm1
	move.b 1(a3),d2
	sub.b #"0",d2
	bcs.w fail
	cmp.b #7,d2
	bhi.w fail
	cmp.b #"d",(a3)
	beq.b aimovm6
	cmp.b #"a",(a3)
	bne.w fail
	addq.b #8,d2
aimovm6:addq.w #2,a3
	cmp.b d1,d2
	bls.w fail
aimovm3:addq.b #1,d1
	bset d1,d0	
	cmp.b d1,d2
	bne.b aimovm3
	bra.b aimovm4
aimovm1:move.w d0,op68000+2-base(a6)
	rts

adx9btodx02=*-assubs
	bsr.b assdx9b
	bra.b asstodx02
aax9btoax02=*-assubs
	bsr.b assax9b
	bra.b asstoax02
adx9btoax02=*-assubs
	bsr.b assdx9b
	bra.b asstoax02
aiunlk=*-assubs
	bra.b assax02
alinklg=*-assubs
	bsr.b assax02
	cmp.b #",",(a3)+
	bne.b fail
	bra.w atpc0
ailink=*-assubs
	bsr.b assax02
	cmp.b #",",(a3)+
	bne.b fail
	bra.w aiwrd

asstoax9b:cmp.b #",",(a3)+
	bne.b fail
assax9b:cmp.b #"a",(a3)+
	beq.b assxx9b
	bra.b fail
asstodx9b:cmp.b #",",(a3)+
	bne.b fail
assdx9b:cmp.b #"d",(a3)+
	bne.b fail
assxx9b:move.b (a3)+,d0
	sub.b #"0",d0
	bcs.b fail
	cmp.b #7,d0
	bhi.b fail	
	lsl.w #8,d0
	add.w d0,d0			;asl.w #1,d0
	or.w d0,op68000-base(a6)
	rts
asstoax02:cmp.b #",",(a3)+
	bne.b fail
assax02:cmp.b #"a",(a3)+
	bne.b fail
	bra.b assxx02
asstodx02:cmp.b #",",(a3)+
	bne.b fail
assdx02:cmp.b #"d",(a3)+
	bne.b fail
assxx02:move.b (a3)+,d0
	sub.b #"0",d0
	bcs.b fail
	cmp.b #7,d0
	bhi.b fail
	or.b d0,op68000+1-base(a6)
	rts
fail:	sf d7
	rts
asstofpx79:
	cmp.b #",",(a3)+
	bne.b fail
assfpx79:cmp.b #"f",(a3)+
	bne.b fail
	cmp.b #"p",(a3)+
	bne.b fail
	move.b (a3)+,d0
	sub.b #"0",d0
	bcs.b fail
	cmp.b #7,d0
	bhi.b fail
	ext.w d0
	lsl.w #7,d0
	or.w d0,op68000+2-base(a6)	;fpu instr!
	rts
assccode:clr.w d0
	lea ccodetxt(pc),a0
asscc0:	move.b (a3),d1
	lsl.w #8,d1
	move.b 1(a3),d1
	tst.b 1(a0)		;"t",0;"f",0
	bne.b asscc2
	sf d1
asscc2:	cmp.w (a0)+,d1
	beq.b asscc1
	add.w #$0100,d0
	cmp.w #$1000,d0
	bne.b asscc0
	bra.b fail
asscc1:	addq.w #1,a3
	tst.b d1		;"t",0;"f",0
	beq.b asscc3
	addq.w #1,a3
asscc3:	or.w d0,op68000-base(a6)
	rts

assfccode:
	moveq #[32-1]*4,d0
assfcc2:lea fccodetxt(pc),a0
	lea (a0,d0.w),a0
	move.l a3,-(a7)
	moveq #4-1,d1
assfcc0:cmpm.b (a3)+,(a0)+
	bne.b assfcc1
	tst.b (a0)
	dbeq d1,assfcc0
	cmp.b #"e",(a3)		;ngle preference
	beq.b assfcc1
	addq.w #4,a7		;remove a3
	lsr.w #2,d0
	rts		
assfcc1:move.l (a7)+,a3
	subq.w #4,d0
	bpl.b assfcc2
	bra.w fail

asspccode:
	move.b (a3)+,d1
	lsl.w #8,d1
	move.b (a3)+,d1
	lea pccodetxt(pc),a0
	moveq #[16-1]*2,d0
asspcc0:cmp.w (a0,d0.w),d1
	beq.b asspcc1
	subq.w #2,d0
	bpl.b asspcc0
	bra.w fail
asspcc1:lsr.w #1,d0
	rts

cmpt0:	cmp.b (a3)+,d0
	bne.w fail
cmptxt:	move.b (a0)+,d0
	bclr #7,d0
	beq.b cmpt0
	cmp.b (a3)+,d0
	bne.w fail
	rts

storeinstr:addq.l #2,lginstr-base(a6)
storeword:
	lea op68000-2-base(a6),a0
	move.w (a0),d1		;oplen!
	addq.w #1,(a0)+
	add.w d1,d1
	move.w d0,2(a0,d1.w)
	rts
storelong:
	lea op68000-2-base(a6),a0
	move.w (a0),d1		;oplen!
	addq.w #2,(a0)+
	add.w d1,d1
	move.l d0,2(a0,d1.w)
	rts

asstab:	cmp.l lineend-base(a6),a3
	bhi.w fail
	cmp.b #" ",(a3)+
	beq.b asstab
asstab0:subq.w #1,a3
	rts	

asstoea:cmp.b #",",(a3)+
	bne.w fail
assea:	and.w #$ffc0,op68000-base(a6)
	cmp.b #"d",(a3)			;dx
	beq.w assdx02
	or.w #$0008,op68000-base(a6)
	cmp.b #"a",(a3)			;ax
	beq.w assax02
	and.w #$ffc0,op68000-base(a6)
	cmp.b #"(",(a3)			;(ax)|(ax)+
	bne.b assea0
	cmp.b #"a",1(a3)
	bne.b assea0
	addq.w #1,a3
	or.w #$0010,op68000-base(a6)
	bsr.w assax02
	cmp.b #")",(a3)+
	bne.w fail
	cmp.b #"+",(a3)
	bne.b assea1
	addq.w #1,a3
	or.w #$0018,op68000-base(a6)
assea1:	rts
assea0:	cmp.b #"-",(a3)		;-(ax)
	bne.b assea2
	cmp.b #"(",1(a3)
	bne.w fail
	addq.w #2,a3
	or.w #$0020,op68000-base(a6)
	bsr.w assax02
	cmp.b #")",(a3)+
	bne.w fail
	rts
assea2:	cmp.b #"#",(a3)
	bne.b assea3
	addq.w #1,a3
	or.w #$003c,op68000-base(a6)
	cmp.b #34,(a3)
	bne.b assea16
	addq.w #1,a3
	moveq #0,d0
	moveq #5-1,d1
assea18:cmp.b #34,(a3)+
	beq.b assea17
	lsl.l #8,d0
	move.b -1(a3),d0
	dbf d1,assea18
	bra.w fail
assea16:cmp.b #"$",(a3)
	beq.b assea22
	bsr.w atodlong
	bra.b assea17
assea22:bsr.w atolong_
assea17:move.b imsize-base(a6),d1
	beq.b assea13

	cmp.b #%01,d1
	beq.b assea14
	cmp.b #%10,d1
	bne.w fail
	swap d0
	bsr.b assea15
	swap d0
	bra.b assea15
assea13:cmp.l #$ff,d0
	bhi.w fail
assea14:cmp.l #$ffff,d0
	bhi.w fail
assea15:bra.w storeword	

assea3:	cmp.b #"(",(a3)+	;(x.l),(x.w),(d,ax,rx.x)
	bne.w fail
	sf d2
	cmp.b #"-",(a3)		;sign?
	bne.b assea19
	addq.w #1,a3
	st d2
assea19:move.w d2,-(a7)
	cmp.b #"$",(a3)
	beq.b assea24
	bsr.w atodlong
	bra.b assea23
assea24:bsr.w atolong_
assea23:move.w (a7)+,d2
	cmp.b #",",(a3)		;d(	!(d,	?
	bne.w assea4
	tst.b d2
	beq.b assea20
	neg.l d0
assea20:addq.w #1,a3
	cmp.b #"a",(a3)		;d(ax	!(d,ax
	bne.w assea5
	move.l d0,-(a7)
	bsr.w assax02
	move.l (a7)+,d0
	move.l d0,d1
	bpl.b assea21
	neg.l d1
assea21:cmp.b #")",(a3)+	;d(ax)	!(d,ax)
	bne.b assea6
	or.w #$0028,op68000-base(a6)
	cmp.l #$ffff,d1		;abs(d0)
	bhi.w fail
	bra.w storeword
assea6:	cmp.b #",",-1(a3)	;	!(d,ax,rx.x)
	bne.w fail
	or.w #$0030,op68000-base(a6)
	cmp.l #$ff,d1		;abs(d0)
	bhi.w fail
assea9:	and.w #$ff,d0
	cmp.b #"d",(a3)+
	beq.b assea7
	cmp.b #"a",-1(a3)
	bne.w fail
	bset #15,d0
assea7:	move.b (a3)+,d1
	sub.b #"0",d1
	bcs.w fail		
	cmp.b #7,d1
	bhi.w fail
	ext.w d1
	ror.w #4,d1
	or.w d1,d0
	cmp.b #".",(a3)+
	bne.w fail
	cmp.b #"w",(a3)+
	beq.b assea8
	cmp.b #"l",-1(a3)
	bne.w fail
	bset #11,d0
assea8:	cmp.b #"*",(a3)
	bne.b assea8b
	addq.w #1,a3
	moveq #-"1",d1
	add.b (a3)+,d1
	beq.b assea8b
	or.w #%01000000000,d0
	subq.b #1,d1
	beq.b assea8b
	eor.w #%11000000000,d0
	subq.b #2,d1
	beq.b assea8b
	eor.w #%01000000000,d0
	subq.b #4,d1
	bne.w fail		
assea8b:cmp.b #")",(a3)+	;d(ax,rx.x)	!(d,ax,rx.x)
	bne.w fail
	bra.w storeword
assea5:	cmp.b #"p",(a3)+
	bne.w fail
	cmp.b #"c",(a3)+
	bne.w fail
	cmp.b #")",(a3)+		;d(pc)	!(d,pc)
	bne.b assea10
	or.w #$003a,op68000-base(a6)
	subq.l #2,d0			;fixed instr len
	sub.l lginstr-base(a6),d0		;extension (mulx.l,cas2...)
	sub.l para-base(a6),d0
	bsr.w storeword
	move.l d0,d1
	ext.l d1
	cmp.l d0,d1
	bne.w fail
	rts
assea10:or.w #$003b,op68000-base(a6)
	subq.l #2,d0			;fixed instr len
	sub.l lginstr-base(a6),d0		;extension (mulx.l,cas2...)
	sub.l para-base(a6),d0
	move.b d0,d1
	ext.w d1
	ext.l d1
	cmp.l d1,d0
	bne.b assfail
	cmp.b #",",-1(a3)
	beq.w assea9			;d(pc,rx.x)	!(d,pc,rx.x)
assfail:sf d7
	rts
assea4:	cmp.b #")",(a3)+
	bne.w fail
	cmp.b #".",(a3)
	beq.b assea11
	or.w #$0039,op68000-base(a6)
	swap d0
	bsr.w storeword
	swap d0
	bra.w storeword
assea11:addq.w #1,a3
	cmp.b #"w",(a3)+	
	bne.w fail
	or.w #$0038,op68000-base(a6)
	cmp.l #$ffff,d0
	bhi.w fail
	bra.w storeword

;gfxname:dc.b "graphics.library",0
	even
;hang the pope
	dc.b version
initxt:	dc.b "BeerMon V0."
	dc.b version/10+"0",-version/10*10+version+"0",rev
	dc.b " 680"!$80,"0,"!$80
	dc.b " GfxMem,"!$80
	dc.b " mode, morbid version"!$80
mmutxt:	dc.b "NoMMU"!$80,"68851"!$80,"(MMU)"!$80,"(MMU)"!$80
fputxt:	dc.b "NoFPU"!$80,"68881"!$80,"68882"!$80,"(FPU)"!$80
chiptxt:dc.b "512K"!$80,"1 MB"!$80,"1.5M"!$80,"2 MB"!$80
muttxt:	dc.b "mutilating"!$80
frztxt:	dc.b "deep frost"!$80		;one of the celtic ones?

trktxt:	dc.b ": track "!$80
hedtxt:	dc.b " head "!$80
sectxt:	dc.b " sector "!$80
blktxt:	dc.b " block "!$80
drvtxt:	dc.b " Disk in drive DFn: is "!$80
nodisk:	dc.b "not present"!$80
ndostxt:dc.b "not a dos disk"!$80
dskvtxt:dc.b "not validated"!$80
filesys:dc.b "Filesystem: "!$80,"not international nFS, "!$80
chktxt:	dc.b "without correct checksum"!$80
wrdisk:	dc.b "writeprotected"!$80
logtxt:	dc.b "logged"!$80
mnttxt:	dc.b "not mounted"!$80
bpltxt:	dc.b "Mem: "!$80
worktxt:dc.b "Scr"!$80
abstxt:	dc.b "(ABS) "!$80
systxt:	dc.b "(SYS) "!$80
codetxt:dc.b " Code "!$80
buftxt:	dc.b " Exg"!$80
navltxt:dc.b " not available"!$80
filltxt:dc.b " filled with "!$80
eortxt:	dc.b " exored with "!$80
abotxt:	dc.b "function aborted at "!$80
objtxt:	dc.b "object created: "!$80
expetxt:dc.b "cannot decrunch data"!$80
expotxt:dc.b "decrunched data: "!$80
impetxt:dc.b "cannot crunch data"!$80
impatxt:dc.b "crunch aborted"!$80
impotxt:dc.b ", crunched data: "!$80
togotxt:dc.b "to go:"!$80		;\
gaintxt:dc.b " gained:"!$80		;/
nmmutxt:dc.b "You don't have a MMU!"!$80
nmmutx1:dc.b "You don't have a 68851 MMU!"!$80
nmmutx2:dc.b "68040 MMU is not supported yet!"!$80
brktxt:	dc.b "Breakpoint "!$80
bpnoram:dc.b "not in RAM!"!$80
bpextxt:dc.b "exists"!$80
bpnftxt:dc.b "not found"!$80
bpstxt:	dc.b "set"!$80
bprmtxt:dc.b "removed"!$80
bpfltxt:dc.b "buffer full"!$80
bpbctxt:dc.b "buffer cleared"!$80
chktxt1:dc.b "old chksum: "!$80
chktxt2:dc.b " new chksum: "!$80
nkicktx:dc.b "No Kickstart!"!$80
nmgdtxt:dc.b "No Megadrive ROM!"!$80
smdinva:dc.b "Invalid header"!$80
smdxfer:dc.b "Current address "!$80
smdtogo:dc.b ", blocks to go "!$80
smdcvco:dc.b "Conversion completed"!$80
smdabor:dc.b "Transfer aborted"!$80
smdcomp:dc.b "Transfer completed"!$80
smdtime:dc.b "Transfer timeout"!$80
nametxt:dc.b "Name:"!$80
mromtxt:dc.b "KB ROM, "!$80
backtxt:dc.b " backed up"	;\
mramtxt:dc.b " RAM, "!$80	;/
manutxt:dc.b "manu:"!$80	;\
mvertxt:dc.b ", v:"!$80		;/
maptxt:	dc.b "Mode:nD, Bitmap is "!$80,"invalid ("!$80
synctxt:dc.b "Sync: "!$80
invltxt:dc.b " (invalid)"!$80
voltxt:	dc.b "Volume: ",34!$80
dirtxt:	dc.b "(Dir)"!$80
dlnktxt:dc.b "dirlink:  ",34!$80
flnktxt:dc.b "hardlink: ",34!$80
usdtxt:	dc.b " used blocks, "!$80
fretxt:	dc.b " free blocks"!$80
bytetxt:dc.b " free bytes"!$80
savetxt:dc.b "saving: ",34!$80
loadtxt:dc.b "loading: ",34!$80
typetxt:dc.b "typing: ",34!$80
rerrtxt:dc.b "read error ("!$80
veritxt:dc.b "verify error ("!$80
retrytx:dc.b "(r)etry, (i)gnore, (a)bort"!$80
trk0txt:dc.b "seek error (30), track 0 not found"!$80
bittxt:	dc.b "bad bitmap"!$80
dskftxt:dc.b "disk full"!$80
nenotxt:dc.b "not enough free space"!$80
dnmtxt:	dc.b "directory not empty"!$80
dextxt:	dc.b "directory exists"!$80
diftxt:	dc.b "directory is a file"!$80
dnftxt:	dc.b "directory not found"!$80
fextxt:	dc.b "file exists"!$80
fidtxt:	dc.b "file is a directory"!$80
fnftxt:	dc.b "file not found"!$80
formtxt:dc.b "Formatting track nn head 0"!$80
fcpltxt:dc.b "Formatting completed"!$80 
fabotxt:dc.b "Formatting aborted"!$80 
insttxt:dc.b "disk installed"!$80
smaptxt:dc.b "Active keymap: usa"!$80,"german"!$80
calctxt:dc.b "Overflow"!$80
prttxt:	dc.b "Printer "!$80
vfytxt:	dc.b "Verify "!$80
sndtxt:	dc.b "Soundaddress "!$80
memtxt:	dc.b " lower     first     upper     size    attr pri      name"!$80
rsrctxt:dc.b "address                                              name"!$80
intrtxt:dc.b "address                                              name"!$80
exectxt:dc.b "address   open  ver   rev   nsize psize chksum       name"!$80
porttxt:dc.b "address   flag  sigbit sigtask                       name"!$80
tasktxt:dc.b "address   type     pri state   splower   size  used  name"!$80
rsndtxt:dc.b "address   type      pri                name"!$80
corrtxt:dc.b "exec lists corrupt"!$80
conftxt:dc.b "board    type address-range       size flags product manu "
	dc.b " serialnum romoffset"!$80
nobdtxt:dc.b "no unconfigured boards found!"!$80
unkntxt:dc.b "unknown"!$80
zorro2:	dc.b "zorro-II"!$80
zorro3:	dc.b "zorro-III"!$80
a3info:	dc.b "Page Detect:"
a3stc:	dc.b "nnn Burst:"
a3burst:dc.b "nnn Wrap:"
a3bwrap:dc.b "nnn Chips:"
a3chips:dc.b "nnnnnnn Refresh Rate:"
a3refr:	dc.b "nnn Version:"!$80
a3info2:dc.b "Timeout:"!$80
a3disab:dc.b "disabled"!$80
a3dsack:dc.b "DSACK"!$80
a3berr:	dc.b "BERR"!$80
a3kbrst:dc.b " Keyboard Reset:o"!$80," ID:"!$80
;	dc.b" DMAC:old"!$80,"new"!$80
resvtxt:dc.b "reserved"!$80
months:	dc.b "JanFebMarAprMayJunJulAugSepOctNovDec"

exctxt:	dc.b $3e,$80
	dc.b "BUS ERROR",$87
	dc.b "ADDRESS ERROR: INSTRUCTION $     ACCESSED"!$80
	dc.b "ILLEGAL",$81
	dc.b "DIVISION BY ZERO"!$80
	dc.b "CHK",$81
	dc.b "TRAPV",$81
	dc.b "PRIVILEGE",$84
	dc.b "TRACE MODE"!$80
	dc.b "LINE-A",$83
	dc.b "LINE-F",$83
	dc.b "($30)",$88
	dc.b "PROTOCOLL",$84
	dc.b "FORMAT ERROR",$87
	dc.b "UNINITIALISED",$82
	dc.b "($40)",$88
	dc.b "($44)",$88
	dc.b "($48)",$88
	dc.b "($4C)",$88
	dc.b "($50)",$88
	dc.b "($54)",$88
	dc.b "($58)",$88
	dc.b "($5C)",$88
	dc.b "SPURIOUS",$82
	dc.b "LEVEL 1",$82
	dc.b "LEVEL 2",$82
	dc.b "LEVEL 3",$82
	dc.b "LEVEL 4",$82
	dc.b "LEVEL 5",$82
	dc.b "LEVEL 6",$82
	dc.b "LEVEL 7",$82
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b $85
	dc.b "BRANCH/UNORDERED",$86
	dc.b "INEXACT RESULT",$86
	dc.b "DIVISION BY ZERO",$86
	dc.b "UNDERFLOW",$86
	dc.b "OPERAND ERROR",$86
	dc.b "OVERFLOW",$86
	dc.b "SIGNAL NAN",$86
	dc.b "UNIMPLEMENTED DATA TYPE",$86
	dc.b "MMU SETUP",$87
	dc.b "68851_1",$87
	dc.b "68851_2",$87
	dc.b "($EC)",$88
	dc.b "($F0)",$88
	dc.b "($F4)",$88
	dc.b "($F8)",$88
	dc.b "($FC)",$88
excext:	dc.b $08,$80			;$80
	dc.b " INSTRUCTION"!$80		;$81
	dc.b " INTERRUPT"!$80		;$82
	dc.b " EMULATION"!$80		;$83
	dc.b " VIOLATION"!$80		;$84
	dc.b "TRAP INSTRUCTION"!$80	;$85
	dc.b " FPU EXCEPTION"!$80	;$86
	dc.b " EXCEPTION"!$80		;$87
	dc.b " RESERVED"!$80		;$88

copmove:dc.b "Move"!$80
copskip:dc.b "Skip"!$80
copwait:dc.b "Wait"!$80
copendl:dc.b "EndList"!$80
copdcl:	dc.b "dc.l"!$80
		even
ccodetxt:	dc.b "t",0,"f",0,"hilscccsneeqvcvsplmigeltgtle"	;even!
pccodetxt:	dc.b "bsbclslcssscasacwswcisicgsgccscc"	;even!
fccodetxt:	dc.l "f"<<24	;fpu condition codes
		dc.l "eq"<<16
		dc.l "ogt"<<8
		dc.l "oge"<<8
		dc.l "olt"<<8
		dc.l "ole"<<8
		dc.l "ogl"<<8
		dc.l "or"<<16
		dc.l "un"<<16
		dc.l "ueq"<<8
		dc.l "ugt"<<8
		dc.l "uge"<<8
		dc.l "ult"<<8
		dc.l "ule"<<8
		dc.l "ne"<<16
		dc.l "t"<<24
		dc.l "sf"<<16
		dc.l "seq"<<8
		dc.l "gt"<<16
		dc.l "ge"<<16
		dc.l "lt"<<16
		dc.l "le"<<16
		dc.l "gl"<<16
		dc.l "gle"<<8
		dc.l "ngle"
		dc.l "ngl"<<8
		dc.l "nle"<<8
		dc.l "nlt"<<8
		dc.l "nge"<<8
		dc.l "ngt"<<8
		dc.l "sne"<<8
		dc.l "st"<<16

fmconst:dc.b "1E"!$80,"Pi"!$80,"Log10(2)"!$80,"e"!$80,"Log2(e)"!$80
	dc.b "Log10(e)"!$80,"0.0"!$80,"ln(2)"!$80,"ln(10)"!$80
	dc.b "1"!$80,"10"!$80,"100"!$80

usptxt:		dc.b "usp"!$80
toccrtxt:	dc.b ","
ccrtxt:		dc.b "ccr"!$80
tosrtxt:	dc.b ","
srtxt:		dc.b "sr"!$80
xbcdtxt:	dc.b "),-("!$80
cmpmtxt:	dc.b ")+,("!$80
		even
cregs:		dc.b $08,$07,"srp",0	;68040
		dc.b $08,$06,"urp",0	;68040
		dc.b $08,$05,"mmur"	;68040
		dc.b $08,$04,"isp",0
		dc.b $08,$03,"msp",0
		dc.b $08,$02,"caar"	;68020/30 only
		dc.b $08,$01,"vbr",0
		dc.b $08,$00,"usp",0
		dc.b $00,$07,"dtt1"	;68040
		dc.b $00,$06,"dtt0"	;68040
		dc.b $00,$05,"itt1"	;68040
		dc.b $00,$04,"itt0"	;68040
		dc.b $00,$03,"tc",0,0	;68040
		dc.b $00,$02,"cacr"
		dc.b $00,$01,"dfc",0
		dc.b $00,$00,"sfc",0
		dc.b $80
pregs:		dc.b $08,"tt0"!$80
		dc.b $0c,"tt1"!$80
		dc.b $40,"tc"!$80
		dc.b $44,"drp"!$80	;68851 only
		dc.b $48,"srp"!$80
		dc.b $4c,"crp"!$80
		dc.b $50,"cal"!$80	;68851 only
		dc.b $58,"scc"!$80	;68851 only
		dc.b $5c,"ac"!$80	;68851 only
		dc.b $60,"mmusr"!$80	;68030 mmusr = 68851 psr
		dc.b $60,"psr"!$80	;68030 mmusr = 68851 psr
		dc.b $64,"pcsr"!$80	;68851 only
		dc.b $ac,"val"!$80,0	;68851 only

sizemov:	dc.b "*blw",%11,%00,%10,%01
dcbtxt:		dc.b "dc.b "!$80

gortxt:	dc.b "holy hell,death to us,god is slaughtered,drink his blood"

typetab:	dc.b "Unknown"!$80
		dc.b "Task"!$80
		dc.b "Interpt."!$80
		dc.b "Device"!$80
		dc.b "MsgPort"!$80
		dc.b "Message"!$80
		dc.b "FreeMsg"!$80
		dc.b "ReplyMsg"!$80
		dc.b "Resource"!$80
		dc.b "Library"!$80
		dc.b "Memory"!$80
		dc.b "SoftInt"!$80
		dc.b "Font"!$80
		dc.b "Process"!$80
		dc.b "Semaphor"!$80
statetb:	dc.b "Invalid"!$80
		dc.b "Added"!$80
		dc.b "Running"!$80
		dc.b "Ready"!$80
		dc.b "Waiting"!$80
		dc.b "Except"!$80
		dc.b "Removed"!$80
	
helptxt:dc.b 'm <s><e>'!$80
	dc.b 'Memory Dump'!$80
	dc.b 'a <s><e>'!$80
	dc.b 'ASCII Dump'!$80
	dc.b 'bin<wltq> <s><e>'!$80
	dc.b 'Binary Dump'!$80
	dc.b 't [s][e][target]'!$80
	dc.b 'TransferMem'!$80
	dc.b 'c [s][e][target]'!$80
 	dc.b 'CompareMem'!$80
	dc.b 'o [s][e][byte]'!$80
	dc.b 'Occupy Mem'!$80
	dc.b 'ow [s][e][word]'!$80
	dc.b 'Occupy Mem'!$80
	dc.b 'ol [s][e][longword]'!$80
	dc.b 'Occupy Mem'!$80
	dc.b 'e [s][e][byte]'!$80
	dc.b 'EXOR Mem'!$80
	dc.b 'ew [s][e][word]'!$80
	dc.b 'EXOR Mem'!$80
	dc.b 'el [s][e][longword]'!$80
	dc.b 'EXOR Mem'!$80
	dc.b 'nop [adr][num]'!$80
	dc.b 'Fill With NOP'!$80
	dc.b 'imp [s][e]<mode>'!$80
	dc.b 'Implode Memory'!$80
	dc.b 'exp [addr]'!$80
	dc.b 'Explode Memory'!$80
	dc.b 'f [s][e][b]<..>'!$80
	dc.b 'Find Bytes'!$80
	dc.b 'f [s][e]["text"]'!$80
	dc.b 'Find Text'!$80
	dc.b 'fmode [0|1|2]'!$80
	dc.b 'Show Tab|Hex|Text'!$80
	dc.b 'fi [s][e]["?*text"]'!$80
	dc.b 'Find Instr.'!$80
	dc.b 'F [addr]'!$80
	dc.b 'Find Branch'!$80
	dc.b 'F [addr] pc'!$80
	dc.b 'Find PC-rel.'!$80
	dc.b 'match [0]'!$80
	dc.b 'Show/Clr MatchBuf'!$80
	dc.b 'p [s][e]<period>'!$80
	dc.b 'Play Sample'!$80
	dc.b 'b <addr>'!$80
	dc.b 'View Bitplane'!$80
	dc.b 'cls'!$80
	dc.b 'Clear Screen'!$80
	dc.b 'B [rgb1] [rgb2]'!$80
	dc.b 'Set Colors'!$80
	dc.b 'W <addr>'!$80
	dc.b 'Move Workspace'!$80
	dc.b 'r <value register>'!$80
	dc.b 'Load CPU'!$80
	dc.b 'R'!$80
	dc.b 'Show FPU'!$80
	dc.b 'mmu'!$80
	dc.b 'Show MMU'!$80
	dc.b 'mmuon'!$80
	dc.b 'Enable MMU'!$80
	dc.b 'mmuoff'!$80
	dc.b 'Disable MMU'!$80
	dc.b 'settt0 [x]'!$80
	dc.b 'modify TT0 (MMU)'!$80
	dc.b 'settt1 [x]'!$80
	dc.b 'modify TT1 (MMU)'!$80
	dc.b 'settc [x]'!$80
	dc.b 'modify TC (MMU)'!$80
	dc.b 'setsrp [x y]'!$80
	dc.b 'modify SRP (MMU)'!$80
	dc.b 'setcrp [x y]'!$80
	dc.b 'modify CRP (MMU)'!$80
	dc.b 'setdrp [x y]'!$80
	dc.b 'modify DRP (MMU)'!$80
	dc.b 'setmmusr [x]'!$80
	dc.b 'modify SR (MMU)'!$80
	dc.b 'bl'!$80
	dc.b 'List Breakpoints'!$80
	dc.b 'bs [addr]'!$80
	dc.b 'Set Breakpoint'!$80
	dc.b 'bc [0|addr]'!$80
	dc.b 'Clr Breakpoint'!$80
	dc.b 'g [addr]'!$80
	dc.b 'Start Program'!$80
	dc.b 'i'!$80
	dc.b 'Display Vectors'!$80
	dc.b 'd <s><e>'!$80
	dc.b 'Disassemble 680x0'!$80
	dc.b 'dm'!$80
	dc.b 'Toggle Dec/Hex'!$80
	dc.b 'ds'!$80
	dc.b 'Toggle Signed'!$80
	dc.b 'dv'!$80
	dc.b 'Toggle Eff.Addr'!$80
	dc.b 'n [addr]'!$80
	dc.b 'Assemble 680x0'!$80
	dc.b 'u <s><e>'!$80
	dc.b 'Disassemble 65816'!$80
	dc.b 'N [addr]'!$80
	dc.b 'Assemble 65816'!$80
	dc.b 'accu [8|16]'!$80
	dc.b '65816 Accu Size'!$80
	dc.b 'index [8|16]'!$80
	dc.b '65816 Index Size'!$80
	dc.b 'auto'!$80
	dc.b '65816 Auto Size'!$80
	dc.b 'K <Fn ',39,'text1|text2..',39,'>'!$80
 	dc.b 'Set FKey'!$80
	dc.b 'D <n>'!$80
	dc.b 'Select Drive'!$80
	dc.b 'dir <f>'!$80
	dc.b 'Show Directory'!$80
	dc.b 'bootsum [addr]'!$80
	dc.b 'Bootblk Checksum'!$80
	dc.b 'datasum [addr]'!$80
	dc.b 'Datablk Checksum'!$80
	dc.b 'bitsum [addr]'!$80
	dc.b 'Bitmap Checksum'!$80
	dc.b 'kicksum [addr]'!$80
	dc.b 'Kickstart Chk'!$80
	dc.b 'megasum [addr]'!$80
	dc.b 'Sega MD Checksum'!$80
	dc.b 'famisum [addr]'!$80
	dc.b 'Famicon Checksum'!$80
	dc.b 'rawplay [addr]'!$80
	dc.b 'Transfer Raw'!$80
	dc.b 'smdplay [addr]'!$80
	dc.b 'Transfer SMD'!$80
	dc.b 'famiplay [addr]'!$80
	dc.b 'Transfer SMC'!$80
	dc.b 'smd2raw [addr]'!$80
	dc.b 'Convert To Raw'!$80
	dc.b 'v <sync>'!$80
	dc.b 'Set Sync Word'!$80
	dc.b 'vc <track>'!$80
	dc.b 'Search Sync Word'!$80
	dc.b 'format [name]<q><0..3>'!$80
	dc.b 'Format Disk'!$80
	dc.b 'install <0..3|4>'!$80
	dc.b 'Install DOS\n|1.3'!$80
	dc.b 'verify'!$80
	dc.b 'Toggle Verify'!$80
	dc.b 'info'!$80
	dc.b 'Report Diskinfo'!$80
	dc.b 'M'!$80
	dc.b 'Show Block Map'!$80
	dc.b 'l [addr][cyl]<num>'!$80
	dc.b 'Read Cylinder'!$80
	dc.b 's [addr][cyl]<num>'!$80
	dc.b 'Write Cylinder'!$80
	dc.b 'l [addr][sec]<num> s'!$80
	dc.b 'Read Sector'!$80
	dc.b 's [addr][sec]<num> s'!$80
	dc.b 'Write Sector'!$80
	dc.b 'type "file"'!$80
	dc.b 'Type File'!$80
	dc.b 'L "file" [addr]'!$80
	dc.b 'Load File'!$80
	dc.b 'S "file" [s][e]'!$80
	dc.b 'Save File'!$80
	dc.b 'cd :'!$80
	dc.b 'Go To Rootdir'!$80
	dc.b 'cd [subdir]'!$80
	dc.b 'Change Dir'!$80
	dc.b 'mk [subdir]'!$80
	dc.b 'Make Directory'!$80
	dc.b 'del "file/dir"'!$80
	dc.b 'Delete File/Dir'!$80
	dc.b 'k'!$80
	dc.b 'Toggle Keymap'!$80
	dc.b 'config'!$80
	dc.b 'Config Boards'!$80
	dc.b 'gary'!$80
	dc.b 'A3000/A4000 Info'!$80
	dc.b 'ramsey'!$80
	dc.b 'A3000/A4000 Info'!$80
	dc.b 'P'!$80
	dc.b 'Toggle Printer'!$80
	dc.b 'h [beg][end]<dst><jmp>'!$80
	dc.b 'Create Hunk'!$80
	dc.b 'time'!$80
	dc.b 'Show Date/Time'!$80
	dc.b '/ [n]'!$80
	dc.b 'Show Systeminfo'!$80
	dc.b 'V <s><e>'!$80
	dc.b 'Disasm Copper'!$80
	dc.b 'cop <s e>'!$80
	dc.b 'Find Copperlists'!$80
	dc.b 'custom'!$80
	dc.b 'Customreg Help'!$80
	dc.b '? [value] <exp value>'!$80
	dc.b 'Calculator'!$80
	dc.b 'x'!$80
	dc.b 'quit'!$80
	dc.b 0

custnam:dc.b $0/2,"BltDDat"!$80
	dc.b $2/2,"DMAConR"!$80
	dc.b $4/2,"VPosR"!$80
	dc.b $6/2,"VHPosR"!$80
	dc.b $8/2,"DskDatR"!$80
	dc.b $e/2,"ClxDat"!$80
	dc.b $10/2,"ADKConR"!$80
	dc.b $16/2,"PotGoR"!$80
	dc.b $18/2,"SerDatR"!$80
	dc.b $1a/2,"DskBytR"!$80
	dc.b $1c/2,"IntEnaR"!$80
	dc.b $1e/2,"IntReqR"!$80
	dc.b $20/2,"DskPth"!$80
	dc.b $22/2,"DskPtl"!$80
	dc.b $24/2,"DskLen"!$80
	dc.b $26/2,"DskDat"!$80
	dc.b $28/2,"RefPtr"!$80
	dc.b $2a/2,"VPosW"!$80
	dc.b $2c/2,"VHPosW"!$80
	dc.b $2e/2,"CopCon"!$80
	dc.b $30/2,"SerDat"!$80
	dc.b $32/2,"SerPer"!$80
	dc.b $34/2,"PotGo"!$80
	dc.b $36/2,"JoyTest"!$80
	dc.b $38/2,"StrEqu"!$80
	dc.b $3a/2,"StrVbl"!$80
	dc.b $3c/2,"StrHor"!$80
	dc.b $3e/2,"StrLong"!$80
copname:dc.b $44/2,"BltAFWM"!$80
	dc.b $46/2,"BltALWM"!$80
	dc.b $48/2,"BltCPth"!$80
	dc.b $4a/2,"BltCPtl"!$80
	dc.b $4c/2,"BltBPth"!$80
	dc.b $4e/2,"BltBPtl"!$80
	dc.b $50/2,"BltAPth"!$80
	dc.b $52/2,"BltAPtl"!$80
	dc.b $54/2,"BltDPth"!$80
	dc.b $56/2,"BltDPtl"!$80
	dc.b $58/2,"BltSize"!$80
	dc.b $5a/2,"BltCon2"!$80	;big agnus
	dc.b $5c/2,"BltSizV"!$80	;big agnus
	dc.b $5e/2,"BltSizH"!$80	;big agnus
	dc.b $60/2,"BltCMod"!$80
	dc.b $62/2,"BltBMod"!$80
	dc.b $64/2,"BltAMod"!$80
	dc.b $66/2,"BltDMod"!$80
	dc.b $70/2,"BltCDat"!$80
	dc.b $72/2,"BltBDat"!$80
	dc.b $74/2,"BltADat"!$80
	dc.b $78/2,"SprHDat"!$80	;big agnus
	dc.b $7c/2,"DeniseID"!$80	;big agnus
	dc.b $7e/2,"DskSync"!$80
	dc.b $8c/2,"CopIns"!$80 ;no effect
	dc.b $8e/2,"DiwStrt"!$80
	dc.b $90/2,"DiwStop"!$80
	dc.b $92/2,"DDFStrt"!$80
	dc.b $94/2,"DDFStop"!$80
	dc.b $96/2,"DMACon"!$80
	dc.b $98/2,"ClxCon"!$80
	dc.b $9a/2,"IntEna"!$80
	dc.b $9c/2,"IntReq"!$80
	dc.b $9e/2,"AdkCon"!$80
	dc.b $10c/2,"BplCon4"!$80	;aga
	dc.b $10e/2,"ClxCon2"!$80	;aga
	dc.b $1c0/2,"HTotal"!$80	;big agnus
	dc.b $1c2/2,"HSStop"!$80	;big agnus
	dc.b $1c4/2,"HBStrt"!$80	;big agnus
	dc.b $1c6/2,"HBStop"!$80	;big agnus
	dc.b $1c8/2,"VTotal"!$80	;big agnus
	dc.b $1ca/2,"VSStop"!$80	;big agnus
	dc.b $1cc/2,"VBStrt"!$80	;big agnus
	dc.b $1ce/2,"VBStop"!$80	;big agnus
	dc.b $1d0/2,"SprHStrt"!$80	;big agnus
	dc.b $1d2/2,"SprHStop"!$80	;big agnus
	dc.b $1d4/2,"BplHStrt"!$80	;big agnus
	dc.b $1d6/2,"BplHStop"!$80	;big agnus
	dc.b $1d8/2,"HHPosW"!$80	;big agnus
	dc.b $1da/2,"HHPosR"!$80	;big agnus
	dc.b $1dc/2,"BeamCon0"!$80	;big agnus
	dc.b $1de/2,"HSStrt"!$80	;big agnus
	dc.b $1e0/2,"VSStrt"!$80	;big agnus
	dc.b $1e2/2,"HCenter"!$80	;big agnus
	dc.b $1e4/2,"DiwHigh"!$80	;big agnus
	dc.b $1e6/2,"BplHMod"!$80	;big agnus
	dc.b $1e8/2,"SprHPth"!$80	;big agnus
	dc.b $1ea/2,"SprHPtl"!$80	;big agnus
	dc.b $1ec/2,"BplHPth"!$80	;big agnus
	dc.b $1ee/2,"BplHPtl"!$80	;big agnus
	dc.b $1fc/2,"FMode"!$80		;aga
	dc.b $1fe/2,"CopNOP"!$80	;needed

cust2nm:dc.b $a/2,$c/2,2/2,"Joy",0,"Dat"!$80		;0,1
	dc.b $12/2,$14/2,2/2,"Pot",0,"Dat"!$80		;0,1
cp2name:	;first,last,step,name,nameindex,name!$80
	dc.b $40/2,$42/2,2/2,"BltCon",0," "!$80		;0,1
	dc.b $80/2,$84/2,4/2,"Cop",1,"Lch"!$80		;1,2
	dc.b $82/2,$86/2,4/2,"Cop",1,"Lcl"!$80		;1,2
	dc.b $88/2,$8a/2,2/2,"CopJmp",1," "!$80		;1,2
	dc.b $a0/2,$d0/2,16/2,"Aud",0,"Lch"!$80 	;0-3
	dc.b $a2/2,$d2/2,16/2,"Aud",0,"Lcl"!$80		;0-3
	dc.b $a4/2,$d4/2,16/2,"Aud",0,"Len"!$80		;0-3
	dc.b $a6/2,$d6/2,16/2,"Aud",0,"Per"!$80		;0-3
	dc.b $a8/2,$d8/2,16/2,"Aud",0,"Vol"!$80		;0-3
	dc.b $aa/2,$da/2,16/2,"Aud",0,"Dat"!$80		;0-3
	dc.b $e0/2,$fc/2,4/2,"Bpl",1,"Pth"!$80		;1-8
	dc.b $e2/2,$fe/2,4/2,"Bpl",1,"Ptl"!$80		;1-8
	dc.b $100/2,$106/2,2/2,"BplCon",0," "!$80	;0-3(ecs)
	dc.b $108/2,$10a/2,2/2,"Bpl",1,"Mod"!$80	;1,2
	dc.b $110/2,$11e/2,2/2,"Bpl",1,"Dat"!$80 ;1-8 no effect
	dc.b $120/2,$13c/2,4/2,"Spr",0,"Pth"!$80	;0-7
	dc.b $122/2,$13e/2,4/2,"Spr",0,"Ptl"!$80	;0-7
	dc.b $140/2,$178/2,8/2,"Spr",0,"Pos"!$80	;0-7
	dc.b $142/2,$17a/2,8/2,"Spr",0,"Ctl"!$80	;0-7
	dc.b $144/2,$17c/2,8/2,"Spr",0,"DatA"!$80	;0-7
	dc.b $146/2,$17e/2,8/2,"Spr",0,"DatB"!$80	;0-7
	dc.b $180/2,$1be/2,2/2,"Color",0," "!$80	;0-31
	dc.b -1

xopfail=0			;dummy
xnoops=1
xdcwop=2
xeatoccr=3
xeatosr=4
xsrtoea=5
xwordbxx=6
xwordcc=7
xshortbxx=8
xshortcc=9
xeatoax=10
xeatodx=11
xdxtoea=12
xiwordtoccr=13
xiwordtosr=14
xiword=15
xccodewordrel=16
xinibtoea=17
xccodeea=18
xsrcea=19
xsize67eatodx=20
xsize8eatoax9b=21
xsize67adsbx=22
xsize67ixtoea=23
xsize67i9btoea=24
xsize67x9btodx02=25
xitrap=26
xsrcdx02=27
ximusp=28
ximove=29
ximoveq=30
xicmpm=31
xxbcd=32
xsize6movep=33
ximovem=34
xdx9btodx02=35
xax9btoax02=36
xdx9btoax02=37
xiunlk=38
xilink=39
ximovec=40
xccrtoea=41
xmoves=42
xbfield=43
xbfieldtodx=44
xdxtobfield=45
xbkpt=46
xlongbxx=47
xlongcc=48
xcallm=49
xcas=50
xcas2=51
xchk2=52
xcmp2=53
xrx03=54
xccode=55
xccodesize=56
xilinklg=57
xmulul=58
xmulsl=59
xdivull=60
xdivsll=61
xpack=62
xea2todx=63	;chk.l
xfccode=64
xfccodesize=65
xfccodewordrel=66
xfccodeea=67
xfnop=68
xfmovecr=69
xpmove=70
xpmovefd=71
xpflusha=72
xpflush=73
xpload=74
xptest=75
xidbcac=76
xidbind=77
xmov16=78
xpccodeea=79
xpccodewordrel=80
xpccode=81
xpccodesize=82
xbrapcc=83
xbrafcc=84
xpflushs=85
xpflushr=86
xpvalid=87
xpflush40=88
xmov162=89
xlpstop=90
xtbl=91
xfpu=92
xfmovel=93
xfmoveml=94
xfmovemx=95

	even
disoffs:dc.w opfail,noops,dcwop,eatoccr,eatosr,srtoea,wordbxx,wordcc
	dc.w shortbxx,shortcc,eatoax,eatodx,dxtoea,iwordtoccr
	dc.w iwordtosr,iword,ccodewordrel,inibtoea,ccodeea,srcea
	dc.w size67eatodx,size8eatoax9b,size67adsbx,size67ixtoea
	dc.w size67i9btoea,size67x9btodx02,itrap,srcdx02,imusp
	dc.w imove,imoveq,icmpm,xbcd,size6movep
	dc.w imovem,dx9btodx02,ax9btoax02,dx9btoax02
	dc.w iunlk,ilink,imovec,ccrtoea,imoves,dbfield,dbfieldtodx
	dc.w ddxtobfield,dbkpt,longbxx,longcc,icallm,dcas,dcas2
	dc.w dchk2,dcmp2,drtm,dtpcc,dtpccsize,dlinklg,dmulul,dmulsl
	dc.w ddivull,ddivsll,dpack,ea2todx,dtpfcc,dtpfccsize
	dc.w dfccodewordrel,fccodeea,dfnop,dfmovecr,dpmove,dpmovefd
	dc.w dpflusha,dpflush,dpload,dptest,didbcac,didbind,dmov16
	dc.w dpccodeea,dpccodewordrel,dtppcc,dtppccsize,dbrapcc,dbrafcc
	dc.w dpflushs,dpflushr,dpvalid,dpflush40,dmov162,dlpstop
	dc.w dtbl,dfpu,dfmovel,dfmoveml,dfmovemx
assoffs:dc.w aopfail,anoops,adcwop,aeatoccr,aeatosr,asrtoea
	dc.w awordbxx,awordcc
	dc.w ashortbxx,ashortcc,aeatoax,aeatodx,adxtoea,aiwordtoccr
	dc.w aiwordtosr,aiword,accodewordrel,ainibtoea,accodeea,asrcea
	dc.w asize67eatodx,asize8eatoax9b,asize67adsbx,asize67ixtoea
	dc.w asize67i9btoea,asize67x9btodx02,aitrap,asrcdx02,aimusp
	dc.w aimove,aimoveq,aicmpm,axbcd,asize6movep
	dc.w aimovem,adx9btodx02,aax9btoax02,adx9btoax02
	dc.w aiunlk,ailink,aimovec,accrtoea,aimoves,abfield,abfieldtodx
	dc.w adxtobfield,abkpt,alongbxx,alongcc,aicallm,acas,acas2
	dc.w achk2,acmp2,artm,atpcc,atpccsize,alinklg,amulul,amulsl
	dc.w adivull,adivsll,apack,aea2todx,atpfcc,atpfccsize
	dc.w afccodewordrel,afccodeea,afnop,afmovecr,apmove,apmovefd
	dc.w apflusha,apflush,apload,aptest,aidbcac,aidbind,amov16
	dc.w apccodeea,apccodewordrel,atppcc,atppccsize,abrapcc,abrafcc
	dc.w apflushs,apflushr,apvalid,apflush40,amov162,alpstop
	dc.w atbl,afpu,afmovel,afmoveml,afmovemx
	;     xyyyyyyy	0:fp0,1:fp0,fp0
fpuinst:dc.b %10110000,"sincos"!128	;order!
	dc.b %00011000,"abs"!128,0,0,0
	dc.b %01011000,"sabs"!128,0,0
	dc.b %01011100,"dabs"!128,0,0
	dc.b %00011100,"acos"!128,0,0
	dc.b %10100010,"add"!128,0,0,0
	dc.b %11100010,"sadd"!128,0,0
	dc.b %11100110,"dadd"!128,0,0
	dc.b %00001100,"asin"!128,0,0
	dc.b %00001010,"atan"!128,0,0
	dc.b %00001101,"atanh"!128,0
	dc.b %10111000,"cmp"!128,0,0,0
	dc.b %00011101,"cos"!128,0,0,0
	dc.b %00011001,"cosh"!128,0,0
	dc.b %10100000,"div"!128,0,0,0
	dc.b %11100000,"sdiv"!128,0,0
	dc.b %11100100,"ddiv"!128,0,0
	dc.b %00010000,"etox"!128,0,0
	dc.b %00011110,"getexp"!128
	dc.b %00011111,"getman"!128
	dc.b %00000001,"int"!128,0,0,0
	dc.b %00000011,"intrz"!128,0
	dc.b %00010101,"log10"!128,0
	dc.b %00010110,"log2"!128,0,0
	dc.b %00010100,"logn"!128,0,0
	dc.b %00000110,"lognp1"!128	
	dc.b %10100001,"mod"!128,0,0,0
movetxt:dc.b %10000000,"move"!128,0,0
	dc.b %11000000,"smove"!128,0
	dc.b %11000100,"dmove"!128,0
	dc.b %10100011,"mul"!128,0,0,0
	dc.b %11100011,"smul"!128,0,0
	dc.b %11100111,"dmul"!128,0,0
	dc.b %00011010,"neg"!128,0,0,0
	dc.b %01011010,"sneg"!128,0,0
	dc.b %01011110,"dneg"!128,0,0
	dc.b %10100101,"rem"!128,0,0,0
	dc.b %10100110,"scale"!128,0
	dc.b %10100100,"sgldiv"!128
	dc.b %10100111,"sglmul"!128
	dc.b %00001110,"sin"!128,0,0,0
	dc.b %00000010,"sinh"!128,0,0
	dc.b %00000100,"sqrt"!128,0,0
	dc.b %01000001,"ssqrt"!128,0
	dc.b %01000101,"dsqrt"!128,0
	dc.b %10101000,"sub"!128,0,0,0
	dc.b %11101000,"ssub"!128,0,0
	dc.b %11101100,"dsub"!128,0,0
	dc.b %00001111,"tan"!128,0,0,0
	dc.b %00001001,"tanh"!128,0,0
	dc.b %00010010,"tentox"!128
	dc.b %00111010,"tst"!128,0,0,0
	dc.b %00010001,"twotox"!128
	dc.b 0	
	even	
instr:	dc.w $ffff,$4afc,snop!xnoops
	dc.b "illegal"!128,0
	dc.w $ffff,$4e70,snop!xnoops
	dc.b "reset"!128,0,0,0
	dc.w $ffff,$4e71,snop!xnoops
	dc.b "nop"!128,0,0,0,0,0
	dc.w $ffff,$4e73,snop!xnoops
	dc.b "rte"!128,0,0,0,0,0
	dc.w $ffff,$4e75,snop!xnoops
	dc.b "rts"!128,0,0,0,0,0
	dc.w $ffff,$4e77,snop!xnoops
	dc.b "rtr"!128,0,0,0,0,0
	dc.w $ffff,$4afa,snop!xnoops		;cpu32 only
	dc.b "bgnd"!128,0,0,0,0

	dc.w $ffc0,$f200,snop!xfpu		;68881
	dc.b "f"!128,0,0,0,0,0,0,0
	dc.w $ffc0,$f200,stab!xfmovel		;68881
	dc.b "fmove.l"!128,0
	dc.w $ffc0,$f200,stab!xfmoveml		;68881
	dc.b "fmovem.l"!128
	dc.w $ffc0,$f200,stab!xfmovemx		;68881
	dc.b "fmovem.x"!128
	dc.w $ffff,$f200,stab!xfmovecr		;68881
	dc.b "fmovecr"!128,0
	dc.w $ffff,$f280,snop!xfnop		;68881
	dc.b "fnop"!128,0,0,0,0
	dc.w $ffff,$f510,snop!xnoops		;68040 only!
	dc.b "pflushan"!128
	dc.w $ffff,$f518,snop!xnoops		;68040 only!
	dc.b "pflusha!"!128
	dc.w $ffff,$f000,snop!xpflusha		;68020 order!
	dc.b "pflusha"!128,0
	dc.w $ffff,$f000,stab!xpflushs		;68851 only order!
	dc.b "pflushs"!128,0
	dc.w $ffc0,$f000,stab!xpflushr		;68851 only order!
	dc.b "pflushr"!128,0
	dc.w $fff8,$f500,stab!xpflush40		;68040 only!
	dc.b "pflushn"!128,0
	dc.w $fff8,$f508,stab!xpflush40		;68040 only!
	dc.b "pflush"!128,0,0
	dc.w $fff8,$f548,stab!xpflush40		;68040 only!
	dc.b "ptestw"!128,0,0
	dc.w $fff8,$f568,stab!xpflush40		;68040 only!
	dc.b "ptestr"!128,0,0

	dc.w $ffff,$f000,stab!xpflush		;68020 order!
	dc.b "pflush"!128,0,0
	dc.w $ffc0,$f000,stab!xpvalid		;68851 only
	dc.b "pvalid"!128,0,0
		
	dc.w $ffff,$003c,stab!xiwordtoccr
	dc.b "ori"!128,0,0,0,0,0
	dc.w $ffff,$023c,stab!xiwordtoccr
	dc.b "andi"!128,0,0,0,0
	dc.w $ffff,$0a3c,stab!xiwordtoccr
	dc.b "eori"!128,0,0,0,0

	dc.w $ffff,$007c,stab!xiwordtosr
	dc.b "ori"!128,0,0,0,0,0
	dc.w $ffff,$027c,stab!xiwordtosr
	dc.b "andi"!128,0,0,0,0
	dc.w $ffff,$0a7c,stab!xiwordtosr
	dc.b "eori"!128,0,0,0,0

	dc.w $f1f8,$c140,stab!xdx9btodx02
	dc.b "exg"!128,0,0,0,0,0
	dc.w $f1f8,$c148,stab!xax9btoax02
	dc.b "exg"!128,0,0,0,0,0
	dc.w $f1f8,$c188,stab!xdx9btoax02
	dc.b "exg"!128,0,0,0,0,0

	dc.w $fff8,$4e58,stab!xiunlk
	dc.b "unlk"!128,0,0,0,0
	dc.w $fff8,$4808,stab!xilinklg		;68020
	dc.b "link.l"!128,0,0
	dc.w $fff8,$4e50,stab!xilink
	dc.b "link"!128,0,0,0,0

	dc.w $fff8,$4848,stab!xbkpt		;68020
	dc.b "bkpt"!128,0,0,0,0

	dc.w $f1f0,$8140,stab!xpack		;68020
	dc.b "pack"!128,0,0,0,0
	dc.w $f1f0,$8180,stab!xpack		;68020
	dc.b "unpk"!128,0,0,0,0

	dc.w $fff0,$4e40,stab!xitrap
	dc.b "trap"!128,0,0,0,0

	dc.w $f100,$7000,stab!ximoveq
	dc.b "moveq"!128,0,0,0

	dc.w $ffff,$f800,stab!xlpstop		;cpu32 only
	dc.b "lpstop"!128,0,0	
	dc.w $ffff,$4e72,stab!xiword
	dc.b "stop"!128,0,0,0,0
	dc.w $ffff,$4e74,stab!xiword		;68010
	dc.b "rtd"!128,0,0,0,0,0

	dc.w $fdff,$0cfc,snop!xcas2		;68020
	dc.b "cas2."!128,0,0,0

	dc.w $fff8,$4840,stab!xsrcdx02
	dc.b "swap"!128,0,0,0,0
	dc.w $fff8,$49c0,stab!xsrcdx02		;68020
	dc.b "extb"!128,0,0,0,0
	dc.w $ffb8,$4880,s6!xsrcdx02
	dc.b "ext"!128,0,0,0,0,0

	dc.w $fff0,$06c0,stab!xrx03		;68020
	dc.b "rtm"!128,0,0,0,0,0
;????
	dc.w $fffe,$f07a,snop!xpccodesize	;68851 only order!
	dc.b "ptrap"!128,0,0,0
	dc.w $ffff,$f07c,snop!xpccode		;68851 only order!
	dc.b "ptrap"!128,0,0,0
	dc.w $fffe,$f27a,snop!xfccodesize	;68881 order!
	dc.b "ftrap"!128,0,0,0
	dc.w $ffff,$f27c,snop!xfccode		;68881 order!
	dc.b "ftrap"!128,0,0,0
	dc.w $f0fe,$50fa,snop!xccodesize	;68020 order!
	dc.b "trap"!128,0,0,0,0
	dc.w $f0ff,$50fc,snop!xccode		;68020 order!
	dc.b "trap"!128,0,0,0,0
	dc.w $ffff,$4e76,snop!xnoops		;order!
	dc.b "trapv"!128,0,0,0
;????
	dc.w $ff3f,$f418,stab!xidbcac		;68040
	dc.b "cinva"!128,0,0,0
	dc.w $ff38,$f408,stab!xidbind		;68040
	dc.b "cinvl"!128,0,0,0
	dc.w $ff38,$f410,stab!xidbind		;68040
	dc.b "cinvp"!128,0,0,0
	dc.w $ff3f,$f438,stab!xidbcac		;68040
	dc.b "cpusha"!128,0,0
	dc.w $ff38,$f428,stab!xidbind		;68040
	dc.b "cpushl"!128,0,0
	dc.w $ff38,$f430,stab!xidbind		;68040
	dc.b "cpushp"!128,0,0
	dc.w $fff8,$f620,stab!xmov16		;68040 order!
	dc.b "move16"!128,0,0
	dc.w $ffe0,$f600,stab!xmov162		;68040
	dc.b "move16"!128,0,0

	dc.w $f138,$b108,s67!xicmpm
	dc.b "cmpm"!128,0,0,0,0

	dc.w $f1f0,$c100,stab!xxbcd
	dc.b "abcd"!128,0,0,0,0
	dc.w $f1f0,$8100,stab!xxbcd
	dc.b "sbcd"!128,0,0,0,0

	dc.w $f130,$d100,s67!xsize67adsbx
	dc.b "addx"!128,0,0,0,0
	dc.w $f130,$9100,s67!xsize67adsbx
	dc.b "subx"!128,0,0,0,0

	dc.w $ffc0,$f000,stab!xpmovefd		;68030 only
	dc.b "pmovefd"!128,0
	dc.w $ffc0,$f000,stab!xpmove		;68020
	dc.b "pmove"!128,0,0,0
	dc.w $ffc0,$f000,snop!xpload		;68020
	dc.b "pload"!128,0,0,0
	dc.w $ffc0,$f000,snop!xptest		;68020
	dc.b "ptest"!128,0,0,0

	dc.w $ffc0,$e8c0,stab!xbfield		;68020
	dc.b "bftst"!128,0,0,0
	dc.w $ffc0,$eac0,stab!xbfield		;68020
	dc.b "bfchg"!128,0,0,0
	dc.w $ffc0,$ecc0,stab!xbfield		;68020
	dc.b "bfclr"!128,0,0,0
	dc.w $ffc0,$eec0,stab!xbfield		;68020
	dc.b "bfset"!128,0,0,0
	dc.w $ffc0,$e9c0,stab!xbfieldtodx	;68020
	dc.b "bfextu"!128,0,0
	dc.w $ffc0,$ebc0,stab!xbfieldtodx	;68020
	dc.b "bfexts"!128,0,0
	dc.w $ffc0,$edc0,stab!xbfieldtodx	;68020
	dc.b "bfffo"!128,0,0,0
	dc.w $ffc0,$efc0,stab!xdxtobfield	;68020
	dc.b "bfins"!128,0,0,0

	dc.w $ffc0,$06c0,stab!xcallm		;68020
	dc.b "callm"!128,0,0,0
	
	dc.w $ffc0,$40c0,stab!xsrtoea
	dc.b "move"!128,0,0,0,0
	dc.w $ffc0,$42c0,stab!xccrtoea		;68010
	dc.b "move"!128,0,0,0,0
	dc.w $ffc0,$44c0,stab!xeatoccr
	dc.b "move"!128,0,0,0,0
	dc.w $ffc0,$46c0,stab!xeatosr
	dc.b "move"!128,0,0,0,0

	dc.w $fff0,$4e60,stab!ximusp
	dc.b "move"!128,0,0,0,0

	dc.w $fffe,$4e7a,stab!ximovec		;68010
	dc.b "movec"!128,0,0,0

	dc.w $fb80,$4880,s6!ximovem
	dc.b "movem"!128,0,0,0

	dc.w $f138,$0108,s6!xsize6movep
	dc.b "movep"!128,0,0,0

	dc.w $ffc0,$f800,snop!xtbl		;cpu32 only
	dc.b "tbl"!128,0,0,0,0,0

	dc.w $f1c0,$41c0,stab!xeatoax
	dc.b "lea"!128,0,0,0,0,0

	dc.w $ffff,$60ff,stab!xlongbxx		;68020
	dc.b "bra.l"!128,0,0,0
	dc.w $ffff,$61ff,stab!xlongbxx		;68020
	dc.b "bsr.l"!128,0,0,0
	dc.w $ffff,$6000,stab!xwordbxx
	dc.b "bra.w"!128,0,0,0
	dc.w $ffff,$6100,stab!xwordbxx
	dc.b "bsr.w"!128,0,0,0
	dc.w $ff00,$6000,stab!xshortbxx		;order !
	dc.b "bra.b"!128,0,0,0
	dc.w $ff00,$6000,stab!xshortbxx		;order !
	dc.b "bra.s"!128,0,0,0			;clone
	dc.w $ff00,$6100,stab!xshortbxx
	dc.b "bsr.b"!128,0,0,0
	dc.w $ff00,$6100,stab!xshortbxx
	dc.b "bsr.s"!128,0,0,0			;clone
	dc.w $ffb0,$f080,snop!xbrapcc		;68851 only
	dc.b "pb"!128,0,0,0,0,0,0
	dc.w $ffa0,$f280,snop!xbrafcc		;68881
	dc.b "fb"!128,0,0,0,0,0,0
	dc.w $f0ff,$60ff,snop!xlongcc		;68020
	dc.b "b"!128,0,0,0,0,0,0,0
	dc.w $f0ff,$6000,snop!xwordcc
	dc.b "b"!128,0,0,0,0,0,0,0
	dc.w $f000,$6000,snop!xshortcc
	dc.b "b"!128,0,0,0,0,0,0,0

	dc.w $fff8,$f048,snop!xpccodewordrel	;68851 only
	dc.b "pdb"!128,0,0,0,0,0
	dc.w $ffc0,$f040,snop!xpccodeea		;68851 only
	dc.b "ps"!128,0,0,0,0,0,0
	dc.w $fff8,$f248,snop!xfccodewordrel	;68881
	dc.b "fdb"!128,0,0,0,0,0
	dc.w $ffc0,$f240,snop!xfccodeea		;68881
	dc.b "fs"!128,0,0,0,0,0,0

	dc.w $f0f8,$50c8,snop!xccodewordrel	;order !
	dc.b "db"!128,0,0,0,0,0,0
	dc.w $f0c0,$50c0,snop!xccodeea
	dc.b "s"!128,0,0,0,0,0,0,0

	dc.w $ffc0,$4800,stab!xsrcea
	dc.b "nbcd"!128,0,0,0,0
	dc.w $ffc0,$4840,stab!xsrcea
	dc.b "pea"!128,0,0,0,0,0
	dc.w $ffc0,$4ac0,stab!xsrcea
	dc.b "tas"!128,0,0,0,0,0
	dc.w $ffc0,$4e80,stab!xsrcea
	dc.b "jsr"!128,0,0,0,0,0
	dc.w $ffc0,$4ec0,stab!xsrcea
	dc.b "jmp"!128,0,0,0,0,0
	dc.w $ffc0,$e0c0,stab!xsrcea
	dc.b "asr"!128,0,0,0,0,0
	dc.w $ffc0,$e1c0,stab!xsrcea
	dc.b "asl"!128,0,0,0,0,0
	dc.w $ffc0,$e2c0,stab!xsrcea
	dc.b "lsr"!128,0,0,0,0,0
	dc.w $ffc0,$e3c0,stab!xsrcea
	dc.b "lsl"!128,0,0,0,0,0
	dc.w $ffc0,$e4c0,stab!xsrcea
	dc.b "roxr"!128,0,0,0,0
	dc.w $ffc0,$e5c0,stab!xsrcea
	dc.b "roxl"!128,0,0,0,0
	dc.w $ffc0,$e6c0,stab!xsrcea
	dc.b "ror"!128,0,0,0,0,0
	dc.w $ffc0,$e7c0,stab!xsrcea
	dc.b "rol"!128,0,0,0,0,0
	dc.w $ffc0,$f100,stab!xsrcea		;68851 only
	dc.b "psave"!128,0,0,0
	dc.w $ffc0,$f140,stab!xsrcea		;68851 only
	dc.b "prestore"!128
	dc.w $ffc0,$f300,stab!xsrcea		;68881
	dc.b "fsave"!128,0,0,0
	dc.w $ffc0,$f340,stab!xsrcea		;68881
	dc.b "frestore"!128

	dc.w $ffc0,$4c40,stab!xdivull		;68020
	dc.b "divul.l"!128,0
	dc.w $ffc0,$4c40,stab!xdivsll		;68020
	dc.b "divsl.l"!128,0
	dc.w $ffc0,$4c40,stab!xmulul		;68020
	dc.b "divu.l"!128,0,0
	dc.w $ffc0,$4c40,stab!xmulsl		;68020
	dc.b "divs.l"!128,0,0
	dc.w $ffc0,$4c00,stab!xmulul		;68020
	dc.b "mulu.l"!128,0,0
	dc.w $ffc0,$4c00,stab!xmulsl		;68020
	dc.b "muls.l"!128,0,0

	dc.w $f1c0,$80c0,stab!xeatodx
	dc.b "divu"!128,0,0,0,0
	dc.w $f1c0,$81c0,stab!xeatodx
	dc.b "divs"!128,0,0,0,0
	dc.w $f1c0,$c0c0,stab!xeatodx
	dc.b "mulu"!128,0,0,0,0
	dc.w $f1c0,$c1c0,stab!xeatodx
	dc.b "muls"!128,0,0,0,0
	dc.w $f1c0,$4180,stab!xeatodx
	dc.b "chk.w"!128,0,0,0
	dc.w $f1c0,$4100,stab!xea2todx		;68020
	dc.b "chk.l"!128,0,0,0

	dc.w $f0c0,$90c0,s8!xsize8eatoax9b
	dc.b "suba"!128,0,0,0,0
	dc.w $f0c0,$b0c0,s8!xsize8eatoax9b
	dc.b "cmpa"!128,0,0,0,0
	dc.w $f0c0,$d0c0,s8!xsize8eatoax9b
	dc.b "adda"!128,0,0,0,0

	dc.w $f100,$8000,s67!xsize67eatodx
	dc.b "or"!128,0,0,0,0,0,0
	dc.w $f100,$9000,s67!xsize67eatodx
	dc.b "sub"!128,0,0,0,0,0
	dc.w $f100,$b000,s67!xsize67eatodx
	dc.b "cmp"!128,0,0,0,0,0
	dc.w $f100,$c000,s67!xsize67eatodx
	dc.b "and"!128,0,0,0,0,0
	dc.w $f100,$d000,s67!xsize67eatodx
	dc.b "add"!128,0,0,0,0,0

	dc.w $f100,$8100,s67!xdxtoea
	dc.b "or"!128,0,0,0,0,0,0
	dc.w $f100,$9100,s67!xdxtoea
	dc.b "sub"!128,0,0,0,0,0
	dc.w $f100,$b100,s67!xdxtoea
	dc.b "eor"!128,0,0,0,0,0
	dc.w $f100,$c100,s67!xdxtoea
	dc.b "and"!128,0,0,0,0,0
	dc.w $f100,$d100,s67!xdxtoea
	dc.b "add"!128,0,0,0,0,0

	dc.w $ffc0,$0800,stab!xinibtoea
	dc.b "btst"!128,0,0,0,0
	dc.w $ffc0,$0840,stab!xinibtoea
	dc.b "bchg"!128,0,0,0,0
	dc.w $ffc0,$0880,stab!xinibtoea
	dc.b "bclr"!128,0,0,0,0
	dc.w $ffc0,$08c0,stab!xinibtoea
	dc.b "bset"!128,0,0,0,0

	dc.w $f9c0,$08c0,s9a_!xcas		;68020
	dc.b "cas"!128,0,0,0,0,0
	dc.w $f9c0,$00c0,s9a!xchk2		;68020
	dc.b "chk2"!128,0,0,0,0
	dc.w $f9c0,$00c0,s9a!xcmp2		;68020
	dc.b "cmp2"!128,0,0,0,0

	dc.w $f100,$5000,s67!xsize67i9btoea
	dc.b "addq"!128,0,0,0,0
	dc.w $f100,$5100,s67!xsize67i9btoea
	dc.b "subq"!128,0,0,0,0

	dc.w $f118,$e000,s67!xsize67x9btodx02
	dc.b "asr"!128,0,0,0,0,0
	dc.w $f118,$e008,s67!xsize67x9btodx02
	dc.b "lsr"!128,0,0,0,0,0
	dc.w $f118,$e010,s67!xsize67x9btodx02
	dc.b "roxr"!128,0,0,0,0
	dc.w $f118,$e018,s67!xsize67x9btodx02
	dc.b "ror"!128,0,0,0,0,0
	dc.w $f118,$e100,s67!xsize67x9btodx02
	dc.b "asl"!128,0,0,0,0,0
	dc.w $f118,$e108,s67!xsize67x9btodx02
	dc.b "lsl"!128,0,0,0,0,0
	dc.w $f118,$e110,s67!xsize67x9btodx02
	dc.b "roxl"!128,0,0,0,0
	dc.w $f118,$e118,s67!xsize67x9btodx02
	dc.b "rol"!128,0,0,0,0,0

	dc.w $ff00,$0000,s67!xsize67ixtoea
	dc.b "ori"!128,0,0,0,0,0
	dc.w $ff00,$0200,s67!xsize67ixtoea
	dc.b "andi"!128,0,0,0,0
	dc.w $ff00,$0400,s67!xsize67ixtoea
	dc.b "subi"!128,0,0,0,0
	dc.w $ff00,$0600,s67!xsize67ixtoea
	dc.b "addi"!128,0,0,0,0
	dc.w $ff00,$0a00,s67!xsize67ixtoea
	dc.b "eori"!128,0,0,0,0
	dc.w $ff00,$0c00,s67!xsize67ixtoea
	dc.b "cmpi"!128,0,0,0,0

	dc.w $f1c0,$0100,stab!xdxtoea
	dc.b "btst"!128,0,0,0,0
	dc.w $f1c0,$0140,stab!xdxtoea
	dc.b "bchg"!128,0,0,0,0
	dc.w $f1c0,$0180,stab!xdxtoea
	dc.b "bclr"!128,0,0,0,0
	dc.w $f1c0,$01c0,stab!xdxtoea
	dc.b "bset"!128,0,0,0,0

	dc.w $ff00,$0e00,s67!xmoves		;68010
	dc.b "moves"!128,0,0,0

	dc.w $ff00,$4000,s67!xsrcea
	dc.b "negx"!128,0,0,0,0
	dc.w $ff00,$4200,s67!xsrcea
	dc.b "clr"!128,0,0,0,0,0
	dc.w $ff00,$4400,s67!xsrcea
	dc.b "neg"!128,0,0,0,0,0
	dc.w $ff00,$4600,s67!xsrcea
	dc.b "not"!128,0,0,0,0,0
	dc.w $ff00,$4a00,s67!xsrcea
	dc.b "tst"!128,0,0,0,0,0

	dc.w $c000,$0000,snop!ximove
	dc.b "move."!128,0,0,0

	dc.w $f000,$a000,stab!xdcwop
	dc.b "line-a"!128,0,0
	dc.w $f000,$f000,stab!xdcwop
	dc.b "line-f"!128,0,0
	dc.w $0000,$0000,stab!xdcwop
	dc.b "dc.w"!128,0,0,0,0

tab6502:dc.b brk65,1	;2 byte instruction
	dc.b ora65,5
	dc.b cop65,1
	dc.b ora65,17
	dc.b tsb65,3
	dc.b ora65,3
	dc.b asl65,3
	dc.b ora65,14
	dc.b php65,0
	dc.b ora65,23
	dc.b asl65,4
	dc.b phd65,0
	dc.b tsb65,2
	dc.b ora65,2
	dc.b asl65,2
	dc.b ora65,19
	dc.b bpl65,12
	dc.b ora65,6
	dc.b ora65,16
	dc.b ora65,18
	dc.b trb65,3
	dc.b ora65,7
	dc.b asl65,7
	dc.b ora65,15
	dc.b clc65,0
	dc.b ora65,9
	dc.b inc65,4
	dc.b tcs65,0
	dc.b trb65,2
	dc.b ora65,8
	dc.b asl65,8
	dc.b ora65,20
	dc.b jsr65,2
	dc.b and65,5
	dc.b jsl65,19
	dc.b and65,17
	dc.b bit65,3
	dc.b and65,3
	dc.b rol65,3
	dc.b and65,14
	dc.b plp65,0
	dc.b and65,23
	dc.b rol65,4
	dc.b pld65,0
	dc.b bit65,2
	dc.b and65,2
	dc.b rol65,2
	dc.b and65,19
	dc.b bmi65,12
	dc.b and65,6
	dc.b and65,16
	dc.b and65,18
	dc.b bit65,7
	dc.b and65,7
	dc.b rol65,7
	dc.b and65,15
	dc.b sec65,0
	dc.b and65,9
	dc.b dec65,4
	dc.b tsc65,0
	dc.b bit65,8
	dc.b and65,8
	dc.b rol65,8
	dc.b and65,20
	dc.b rti65,0
	dc.b eor65,5
	dc.b wdm65,1	;was: dc.b(13)dummy, 1:immediate
	dc.b eor65,17
	dc.b mvp65,2
	dc.b eor65,3
	dc.b lsr65,3
	dc.b eor65,14
	dc.b pha65,0
	dc.b eor65,23
	dc.b lsr65,4
	dc.b phk65,0
	dc.b jmp65,2
	dc.b eor65,2
	dc.b lsr65,2
	dc.b eor65,19
	dc.b bvc65,12
	dc.b eor65,6
	dc.b eor65,16
	dc.b eor65,18
	dc.b mvn65,2
	dc.b eor65,7
	dc.b lsr65,7
	dc.b eor65,15
	dc.b cli65,0
	dc.b eor65,9
	dc.b phy65,0
	dc.b tcd65,0
	dc.b jmp65,19
	dc.b eor65,8
	dc.b lsr65,8
	dc.b eor65,20
	dc.b rts65,0
	dc.b adc65,5
	dc.b per65,21
	dc.b adc65,17
	dc.b stz65,3
	dc.b adc65,3
	dc.b ror65,3
	dc.b adc65,14
	dc.b pla65,0
	dc.b adc65,23
	dc.b ror65,4
	dc.b rtl65,0
	dc.b jmp65,11
	dc.b adc65,2
	dc.b ror65,2
	dc.b adc65,19
	dc.b bvs65,12
	dc.b adc65,6
	dc.b adc65,16
	dc.b adc65,18
	dc.b stz65,7
	dc.b adc65,7
	dc.b ror65,7
	dc.b adc65,15
	dc.b sei65,0
	dc.b adc65,9
	dc.b ply65,0
	dc.b tdc65,0
	dc.b jmp65,22
	dc.b adc65,8
	dc.b ror65,8
	dc.b adc65,20
	dc.b bra65,12
	dc.b sta65,5
	dc.b brl65,21
	dc.b sta65,17
	dc.b sty65,3
	dc.b sta65,3
	dc.b stx65,3
	dc.b sta65,14
	dc.b dey65,0
	dc.b bit65,23
	dc.b txa65,0
	dc.b phb65,0
	dc.b sty65,2
	dc.b sta65,2
	dc.b stx65,2
	dc.b sta65,19
	dc.b bcc65,12
	dc.b sta65,6
	dc.b sta65,16
	dc.b sta65,18
	dc.b sty65,7
	dc.b sta65,7
	dc.b stx65,10
	dc.b sta65,15
	dc.b tya65,0
	dc.b sta65,9
	dc.b txs65,0
	dc.b txy65,0
	dc.b stz65,2
	dc.b sta65,8
	dc.b stz65,8
	dc.b sta65,20
	dc.b ldy65,24
	dc.b lda65,5
	dc.b ldx65,24
	dc.b lda65,17
	dc.b ldy65,3
	dc.b lda65,3
	dc.b ldx65,3
	dc.b lda65,14
	dc.b tay65,0
	dc.b lda65,23
	dc.b tax65,0
	dc.b plb65,0
	dc.b ldy65,2
	dc.b lda65,2
	dc.b ldx65,2
	dc.b lda65,19
	dc.b bcs65,12
	dc.b lda65,6
	dc.b lda65,16
	dc.b lda65,18
	dc.b ldy65,7
	dc.b lda65,7
	dc.b ldx65,10
	dc.b lda65,15
	dc.b clv65,0
	dc.b lda65,9
	dc.b tsx65,0
	dc.b tyx65,0
	dc.b ldy65,8
	dc.b lda65,8
	dc.b ldx65,9
	dc.b lda65,20
	dc.b cpy65,24
	dc.b cmp65,5
	dc.b rep65,1
	dc.b cmp65,17
	dc.b cpy65,3
	dc.b cmp65,3
	dc.b dec65,3
	dc.b cmp65,14
	dc.b iny65,0
	dc.b cmp65,23
	dc.b dex65,0
	dc.b wai65,0
	dc.b cpy65,2
	dc.b cmp65,2
	dc.b dec65,2
	dc.b cmp65,19
	dc.b bne65,12
	dc.b cmp65,6
	dc.b cmp65,16
	dc.b cmp65,18
	dc.b pei65,16
	dc.b cmp65,7
	dc.b dec65,7
	dc.b cmp65,15
	dc.b cld65,0
	dc.b cmp65,9
	dc.b phx65,0
	dc.b stp65,0
	dc.b jml65,11
	dc.b cmp65,8
	dc.b dec65,8
	dc.b cmp65,20
	dc.b cpx65,24
	dc.b sbc65,5
	dc.b sep65,1
	dc.b sbc65,17
	dc.b cpx65,3
	dc.b sbc65,3
	dc.b inc65,3
	dc.b sbc65,14
	dc.b inx65,0
	dc.b sbc65,23
	dc.b nop65,0
	dc.b xba65,0
	dc.b cpx65,2
	dc.b sbc65,2
	dc.b inc65,2
	dc.b sbc65,19
	dc.b beq65,12
	dc.b sbc65,6
	dc.b sbc65,16
	dc.b sbc65,18
	dc.b pea65,2
	dc.b sbc65,7
	dc.b inc65,7
	dc.b sbc65,15
	dc.b sed65,0
	dc.b sbc65,9
	dc.b plx65,0
	dc.b xce65,0
	dc.b jsr65,22
	dc.b sbc65,8
	dc.b inc65,8
	dc.b sbc65,20
	dc.b -1
adc65=0
and65=1
asl65=2
bcc65=3
bcs65=4
beq65=5
bit65=6
bmi65=7
bne65=8
bpl65=9
brk65=10
bvc65=11
bvs65=12
clc65=13
cli65=14
cld65=15
clv65=16
cmp65=17
cpx65=18
cpy65=19
dec65=20
dex65=21
dey65=22
eor65=23
inc65=24
inx65=25
iny65=26
jmp65=27
jsr65=28
lsr65=29
lda65=30
ldx65=31
ldy65=32
nop65=33
ora65=34
pha65=35
php65=36
pla65=37
plp65=38
rol65=39
ror65=40
rti65=41
rts65=42
sbc65=43
sec65=44
sed65=45
sei65=46
sta65=47
stx65=48
sty65=49
tax65=50
tay65=51
tsx65=52
txa65=53
txs65=54
tya65=55
wdm65=56
xba65=57
wai65=58
stp65=59
rtl65=60
xce65=61
tyx65=62
txy65=63
tsc65=64
tdc65=65
tcs65=66
tcd65=67
ply65=68
plx65=69
pld65=70
plb65=71
phy65=72
phx65=73
phk65=74
phd65=75
phb65=76
sep65=77
rep65=78
jml65=79
cop65=80
bra65=81
tsb65=82
trb65=83
pea65=84
pei65=85
per65=86
brl65=87
jsl65=88
mvp65=89
mvn65=90
stz65=91
txt6502:dc.b "adc"
	dc.b "and"
	dc.b "asl"
	dc.b "bcc"
	dc.b "bcs"
	dc.b "beq"
	dc.b "bit"
	dc.b "bmi"
	dc.b "bne"
	dc.b "bpl"
	dc.b "brk"
	dc.b "bvc"
	dc.b "bvs"
	dc.b "clc"
	dc.b "cli"
	dc.b "cld"
	dc.b "clv"
	dc.b "cmp"
	dc.b "cpx"
	dc.b "cpy"
	dc.b "dec"
	dc.b "dex"
	dc.b "dey"
	dc.b "eor"
	dc.b "inc"
	dc.b "inx"
	dc.b "iny"
	dc.b "jmp"
	dc.b "jsr"
	dc.b "lsr"
	dc.b "lda"
	dc.b "ldx"
	dc.b "ldy"
	dc.b "nop"
	dc.b "ora"
	dc.b "pha"
	dc.b "php"
	dc.b "pla"
	dc.b "plp"
	dc.b "rol"
	dc.b "ror"
	dc.b "rti"
	dc.b "rts"
	dc.b "sbc"
	dc.b "sec"
	dc.b "sed"
	dc.b "sei"
	dc.b "sta"
	dc.b "stx"
	dc.b "sty"
	dc.b "tax"
	dc.b "tay"
	dc.b "tsx"
	dc.b "txa"
	dc.b "txs"
	dc.b "tya"
	dc.b "wdm"
	dc.b "xba"
	dc.b "wai"
	dc.b "stp"
	dc.b "rtl"
	dc.b "xce"
	dc.b "tyx"
	dc.b "txy"
	dc.b "tsc"
	dc.b "tdc"
	dc.b "tcs"
	dc.b "tcd"
	dc.b "ply"
	dc.b "plx"
	dc.b "pld"
	dc.b "plb"
	dc.b "phy"
	dc.b "phx"
	dc.b "phk"
	dc.b "phd"
	dc.b "phb"
	dc.b "sep"
	dc.b "rep"
	dc.b "jml"
	dc.b "cop"
	dc.b "bra"
	dc.b "tsb"
	dc.b "trb"
	dc.b "pea"
	dc.b "pei"
	dc.b "per"
	dc.b "brl"
	dc.b "jsl"
	dc.b "mvp"
	dc.b "mvn"
	dc.b "stz"
	dc.b -1

snesadr:dc.w $2100,$2143
	dc.w $2180,$2183
	dc.w $4016,$4017
	dc.w $4200,$421f
	dc.w $4300,$430a
	dc.w -1
snesreg:dc.b "scrnfade"		;2100
	dc.b "oam_size"		;2101
	dc.b "oam_addr"		;2102
	dc.b "oam_adhi"		;2103
	dc.b "oam_data"		;2104
	dc.b "vscrnmod"		;2105
	dc.b "mozaik  "		;2106
	dc.b "playf0_a"		;2107
	dc.b "playf1_a"		;2108
	dc.b "playf2_a"		;2109
	dc.b "playf3_a"		;210a
	dc.b "tile01_a"		;210b
	dc.b "tile23_a"		;210c
	dc.b "scrollx0"		;210d
	dc.b "scrolly0"		;210e
	dc.b "scrollx1"		;210f
	dc.b "scrolly1"		;2110
	dc.b "scrollx2"		;2111
	dc.b "scrolly2"		;2112
	dc.b "scrollx3"		;2113
	dc.b "scrolly3"		;2114
	dc.b "vportcon"		;2115
	dc.b "vportadr"		;2116
	dc.b "vportadh"		;2117
	dc.b "vportdat"		;2118
	dc.b "vportdhi"		;2119
	dc.b "mod7init"		;211a
	dc.b "mod7rega"		;211b
	dc.b "mod7regb"		;211c
	dc.b "mod7regc"		;211d
	dc.b "mod7regd"		;211e
	dc.b "mod7regx"		;211f
	dc.b "mod7regy"		;2120
	dc.b "paletpnt"		;2121
	dc.b "paletdat"		;2122
	dc.b "wi12mask"		;2123
	dc.b "wi34mask"		;2124
	dc.b "wind_obj"		;2125
	dc.b "wind0pos"		;2126
	dc.b "wind1pos"		;2127
	dc.b "wind2pos"		;2128
	dc.b "wind3pos"		;2129
	dc.b "wind1log"		;212a
	dc.b "wind2log"		;212b
	dc.b "playfflg"		;212c
	dc.b "sscrnflg"		;212d
	dc.b "winmaskm"		;212e
	dc.b "winmasks"		;212f
	dc.b "colsinit"		;2130
	dc.b "colstval"		;2131
	dc.b "colstdat"		;2132
	dc.b "ilaceflg"		;2133
	dc.b "result_l"		;2134
	dc.b "result_m"		;2135
	dc.b "result_h"		;2136
	dc.b "hv_latch"		;2137
	dc.b "oamrddat"		;2138
	dc.b "vrrddatl"		;2139
	dc.b "vrrddath"		;213a
	dc.b "palrddat"		;213b
	dc.b "ho_count"		;213c
	dc.b "ve_count"		;213d
	dc.b "ppusta77"		;213e
	dc.b "ppusta78"		;213f
	dc.b "audireg0"		;2140
	dc.b "audireg1"		;2141
	dc.b "audireg2"		;2142
	dc.b "audireg3"		;2143

	dc.b "wm_data "		;2180
	dc.b "wmaddrlo"		;2181
	dc.b "wmaddrme"		;2182
	dc.b "wmdatahi"		;2183

	dc.b "ctr13dat"		;4016
	dc.b "ctr24dat"		;4017

	dc.b "nmitmflg"		;4200
	dc.b "ioprtout"		;4201
	dc.b "multican"		;4202
	dc.b "multiplr"		;4203
	dc.b "dividlow"		;4204
	dc.b "divid_hi"		;4205
	dc.b "divisor "		;4206
	dc.b "hcountlo"		;4207
	dc.b "hcounthi"		;4208
	dc.b "vcountlo"		;4209
	dc.b "vcounthi"		;420a
	dc.b "dmaonflg"		;420b
	dc.b "hdmaonfl"		;420c
	dc.b "memselec"		;420d
	dc.b "reserved"		;420e
	dc.b "reserved"		;420f
	dc.b "nmivblfl"		;4210
	dc.b "irg_flag"		;4211
	dc.b "hvjoy_on"		;4212
	dc.b "ioprtinp"		;4213
	dc.b "divquolo"		;4214
	dc.b "divquohi"		;4215
	dc.b "multprlo"		;4216
	dc.b "multprhi"		;4217
	dc.b "pad_1_lo"		;4218
	dc.b "pad_1_hi"		;4219
	dc.b "pad_2_lo"		;421a
	dc.b "pad_2_hi"		;421b
	dc.b "pad_3_lo"		;421c
	dc.b "pad_3_hi"		;421e
	dc.b "pad_4_lo"		;421e
	dc.b "pad_4_hi"		;421f

	dc.b "dma",0,"parm"	;4300...4370
	dc.b "dma",0,"dest"	;4301
	dc.b "dma",0,"srcl"	;4302
	dc.b "dma",0,"srcm"	;4303
	dc.b "dma",0,"srch"	;4304
	dc.b "dma",0,"sizl"	;4305
	dc.b "dma",0,"sizh"	;4306
	dc.b "dma",0,"hmmm"	;4307
	dc.b "dma",0,"tabl"	;4308
	dc.b "dma",0,"tabh"	;4309
	dc.b "hdma",0,"lin"	;430a

	even
font:	;thanx for the font must go to the terminator/trsi (you rule)
dc.l $00000000,$00000000,$18181818,$18001800,$6c6c0000,$00000000 
dc.l $6666ff66,$ff666600,$183e603c,$067c1800,$c3c60c18,$3063c300 
dc.l $386c6876,$dccc7600,$18183000,$00000000,$0c183030,$30180c00 
dc.l $30180c0c,$0c183000,$00663cff,$3c660000,$0018187e,$18180000 
dc.l $00000000,$00181830,$0000007e,$00000000,$00000000,$00181800 
dc.l $03060c18,$3060c000,$3c666e7e,$76663c00,$18381818,$18181800 
dc.l $3c66060c,$18307e00,$7e060c1c,$06663c00,$1c3c6ccc,$fe0c0c00 
dc.l $7e607c06,$06663c00,$0c18307c,$66663c00,$7e06060c,$18181800 
dc.l $3c66663c,$66663c00,$3c66663e,$0c183000,$00181800,$00181800 
dc.l $00001818,$00181830,$0c183060,$30180c00,$00007e00,$007e0000 
dc.l $30180c06,$0c183000,$3c66060c,$18001800,$3e636f6f,$6f603e00 
dc.l $3c66667e,$66666600,$7c66667c,$66667c00,$3c666060,$60663c00 
dc.l $786c6666,$666c7800,$3e60607c,$60603e00,$3e60607c,$60606000 
dc.l $3c66606e,$66663e00,$6666667e,$66666600,$18181818,$18181800 
dc.l $06060606,$06663c00,$66666c78,$6c666600,$60606060,$60603e00 
dc.l $63777f6b,$63636300,$66767e6e,$66666600,$3c666666,$66663c00 
dc.l $7c66667c,$60606000,$3c666666,$666e3c06,$7c66667c,$786c6600 
dc.l $3c66603c,$06663c00,$7e181818,$18181800,$66666666,$66663c00 
dc.l $66666666,$6c787000,$6363636b,$7f776300,$6363361c,$36636300 
dc.l $6666663c,$18181800,$7e060c18,$30607e00,$3c303030,$30303c00 
dc.l $c0603018,$0c060300,$3c0c0c0c,$0c0c3c00,$10386cc6,$00000000 
dc.l $00000000,$0000fe00,$18180c00,$00000000,$00003c66,$7e666600 
dc.l $60607c66,$66667c00,$00003c66,$60663c00,$06063e66,$66663e00 
dc.l $00003e60,$7e603e00,$1c303c30,$30303000,$00003e66,$663e063c 
dc.l $60606666,$7e666600,$18001818,$18181800,$18001818,$18181870 
dc.l $6060666c,$786c6600,$30303030,$30301c00,$00006377,$7f6b6300 
dc.l $00006676,$7e6e6600,$00003c66,$66663c00,$00007c66,$667c6060 
dc.l $00003e66,$663e0606,$00007c66,$7c6c6600,$00003e60,$3c067c00 
dc.l $00007e18,$18181800,$00006666,$66663c00,$00006666,$6c787000 
dc.l $0000636b,$6b363600,$00006336,$1c366300,$00006666,$663e063c 
dc.l $00007e0c,$18307e00,$0e181870,$18180e00,$18181808,$18181800 
dc.l $7018180e,$18187000,$729c0000,$00000000,$cc33cc33,$cc33cc33 
dc.l $00000000,$00000000,$18001818,$18181800,$0c3e6c6c,$3e0c0000 
dc.l $1c363078,$30307e00,$423c663c,$42000000,$c3663c18,$3c183c00 
dc.l $18181800,$18181800,$3c403c66,$3c023c00,$66000000,$00000000 
dc.l $7e81bdb1,$bd817e00,$78d8d87c,$00fc0000,$003366cc,$66330000 
dc.l $7e060000,$00000000,$00007e7e,$00000000,$7e81bda5,$b9ad817e 
dc.l $7e000000,$00000000,$3c663c00,$00000000,$18187e18,$18007e00 
dc.l $f0183060,$f8000000,$f0183018,$f0000000,$18300000,$00000000 
dc.l $0000c6c6,$c6eefac0,$7ef4f474,$14141400,$00000018,$18000000 
dc.l $00000000,$00001830,$30703030,$30000000,$70888870,$00f80000 
dc.l $00cc6633,$66cc0000,$40c64c58,$3266cf02,$60e66c78,$3f6bc60f 
dc.l $c023662c,$d9336701,$18001830,$60663c00,$30083c66,$7e666600 
dc.l $0c103c66,$7e666600,$18243c66,$7e666600,$324c3c66,$7e666600 
dc.l $663c6666,$7e666600,$3c663c66,$7e666600,$7fccccff,$cccccf00 
dc.l $3c666060,$663c0830,$30083e60,$7c603e00,$0c103e60,$7c603e00 
dc.l $18243e60,$7c603e00,$66003e60,$7c603e00,$30081818,$18181800 
dc.l $0c101818,$18181800,$18241818,$18181800,$66001818,$18181800 
dc.l $786c66f6,$666c7800,$324c767e,$6e666600,$30083c66,$66663c00 
dc.l $0c103c66,$66663c00,$18243c66,$66663c00,$324c3c66,$66663c00 
dc.l $663c6666,$66663c00,$00006336,$1c366300,$3d666e7e,$7666bc00 
dc.l $30086666,$66663c00,$0c106666,$66663c00,$18246666,$66663c00 
dc.l $cc00cccc,$cccc7800,$06086666,$3c181800,$60607c66,$667c6060 
dc.l $7c66666c,$66666c60,$3008003c,$667e6600,$0c10003c,$667e6600 
dc.l $1824003c,$667e6600,$324c003c,$667e6600,$66003c66,$7e666600 
dc.l $3c663c3c,$667e6600,$00007fcc,$ffcccf00,$00003c66,$60663c10 
dc.l $18041e30,$3e301e00,$0c101e30,$3e301e00,$0c121e30,$3e301e00 
dc.l $36001e30,$3e301e00,$30080018,$18181800,$0c100018,$18181800 
dc.l $18240018,$18181800,$66000018,$18181800,$307c183c,$66663c00 
dc.l $324c0076,$7e6e6600,$3008003c,$66663c00,$0c10003c,$66663c00 
dc.l $1824003c,$66663c00,$324c003c,$66663c00,$66003c66,$66663c00 
dc.l $0018007e,$00180000,$00013e67,$6b733e40,$30080066,$66663c00 
dc.l $0c100066,$66663c00,$18240066,$66663c00,$00660066,$66663c00 
dc.l $0c100066,$663e063c,$30303c36,$363c3030,$66006666,$663e063c 
constend:dc.l chksum

;;;;;;;;;;;;;;;;;
; variable area ;
;;;;;;;;;;;;;;;;;

	even	; yo that's true
keytab:	dc.b "`1234567890ß'\",0,"0"	;keycodes increase...
	dc.b "qwertzuiopü+",0,"123"	;all this is patched...
	dc.b "asdfghjklöä#",0,"456"
	dc.b "<yxcvbnm,.-",0,".789"
	dc.b " ",8,5,13,13,$1b,9,0,0,0,"-",0,$10,$11,$13,$12
	dc.b $80,$81,$82,$83,$84,$85,$86,$87,$88,$89,"[]/*+",6

	dc.b "~!",34,"§$%&/()=?`|",0,12		;$60...
	dc.b "QWERTZUIOPÜ*",0,$1a,$16,0
	dc.b "ASDFGHJKLÖÄ^",0,0,0,0
	dc.b ">YXCVBNM;:_",0,0,$19,$15,0
	dc.b " ",7,$14,0,14,0,10,0,0,0,"-",0,1,2,4,3
	dc.b 0,0,0,0,0,0,0,0,0,0,"{}/*+",11
	even
mousespr:
	dc.w $8080,$9200
	dc.l $00000000,$00000000,$00000000,$000001c0,$008001c0,$00800140 
	dc.l $00800140,$00800140,$00800140,$00800140,$00800140,$00800770 
	dc.l $03e00410,$00800770,$00800140,$000001c0,$00000000,$00000000 

scradr:	dc.l 0
dskadr:	dc.l 0
spradr:	dc.l 0
copadr:	dc.l 0

	;mod
regs:	blk.l 16+6+1+1,0	;regs/usp/isp/msp/vbr/cacr/caar/pc/sr.w
vbreg=regs+[19*4]
sfcdfc:	dc.w 0			;00000xxx00000yyy
fpuregs:blk.l 8*12,0		;fp0..7:80+16bit
fpcr:	dc.l 0			;\
fpsr:	dc.l 0			; )union
fpiar:	dc.l 0			;/
mmutt0:	dc.l 0			;\
mmutt1:	dc.l 0			; \
mmutc:	dc.l 0			;  )union
mmusrp:	dc.l 0,0		;  )
mmucrp:	dc.l 0,0		; /
mmusr:	dc.w 0			;/
mmudrp:	dc.l 0,0		;68851 only
bmmmutc:dc.l 0			;beermon private mmu tc
mmujbuf:dc.l 0			;private buffer
startusp:	dc.l 0		;prgstart
startisp:	dc.l 0		;prgstart
startmsp:	dc.l 0		;prgstart
startvbr:	dc.l 0		;prgstart
startcacr:	dc.l 0		;prgstart
startcaar:	dc.l 0		;prgstart
startsr:	dc.w 0		;prgstart
startsfcdfc:	dc.w 0		;prgstart
rdff002:dc.w 0			;prgstart union
rdff010:dc.w 0			;prgstart   "
rdff01c:dc.w 0			;prgstart   "
rdff01e:dc.w 0			;prgstart   "
timeout:dc.w 0			;prgstart a3000 ramtimeout
lastms:	dc.w 0
mousexy:dc.w 0
msxpos:	dc.w 0
msypos:	dc.w 0
msycnt:	dc.l 0
count:	dc.w 0			;vbl timer
smdcnt:	dc.w 0
buflen:	dc.w 0
lastcmd:dc.l 0			;1-4 chrs of last command
hililow:dc.l 0			;lower highlight address \
hiliupp:dc.l 0			;upper highlight address /
helpadr:dc.l 0			;current helptext adr
bcdbuf:	dc.l 0,0,0		;fpu reg conversion
excinstr:dc.w 0			;except info instr
excadr:	dc.l 0			;except info adr
exceptsr:dc.w 0			;except info sr
exceptpc:dc.l 0			;except info pc
excnum:	dc.b 0			;0=no exc
cpu:	dc.b 0			;0:68000,1:68010,2:68020,3:68030,4:68040
fpu:	dc.b 0			;0:nofpu,1:68881,2:68882,3:68040
mmu:	dc.b 0			;0:nommu,1:68851,2:68030mmu,3:68040mmu
	even
row:	dc.b 0			;\
col:	dc.b 0			;/union
rowback:dc.b 0			;\	second screen
colback:dc.b 1			;/union	second screen
rows:	dc.b 0			;32:pal,24:ntsc
rowsm1:	dc.b 0			;31:pal,23:ntsc
rowsm2:	dc.b 0			;30:pal,22:ntsc
hilight:dc.b 0			;0:normal,ff:inverse address
insmode:dc.b 0			;0:overwrite,ff:insert
outmode:dc.b 0			;0:table,1:memdump,2:asciidump
imsize:	dc.b 0			;%00.b,%01.w,%10.l,%11.*,%100.x
dissign:dc.b %101 ;bit0:nosign/sign,bit1:hex/dez,bit2:no eaval/eaval
ea2nd:	dc.b 0			;0:1st eavalue,ff:2nd eavalue
rmsflag:dc.b 0			;right mouse has been pressed
bplflag:dc.b 0			;0:medres,ff:lores
rolltop:dc.b 0			;0:roll csdown,ff:roll csup
drvbit:	dc.b 0			;3:df0
trk:	dc.b 0			;trk 0-159 of sel drv
sec:	dc.b 0			;0-10/21
hddrive:dc.b 0			;0:dd drive,ff:hddrive
truebuf:dc.b 0			;0:reread mfm
dskerr:	dc.b 0			;25:datachk,21:sec not found
				;29:dsk removed,26:timeout
wrflag:	dc.b 0			;0:read,ff:write
wrcmd:	dc.b 0			;blkread/wr cmd
typeflg:dc.b 0			;0:load,ff:type
catopt:	dc.b 0			;bmi:noopt catalog
ffs:	dc.b 0			;0:OFS,ff:FFS
int:	dc.b 0			;0:AmigaDOS,ff:international filenames
valflag:dc.b 0			;0:invalid,>0:valid bitmap
pic:	dc.b -1			;0:no pic in dosktrkbuf
abswork:dc.b 0			;0:memlist,-1:abolute workspace
absbuf:	dc.b 0			;0:memlist,-1:abolute buffer,if any
smdmisc:dc.b 0
smdraw:	dc.b 0			;0:smd data,-1:raw data
fami:	dc.b 0			;0:smd,-1:famicon
accu8:	dc.b 0			;0:16,-1:8 bit accu
idxy8:	dc.b 0			;0:16,-1:8 bit index x,y
autosel:dc.b -1			;0:normal,-1:automatic 8/16bit
keydel:	dc.b 0
repdel:	dc.b 0
crsrdel:dc.b 1
nocrsr:	dc.b 0
msdel:	dc.b 0
prvkey:	dc.b 0
ascii:	dc.b 0
dontbuf:dc.b 0			;-1:don't buf characters
shflag:	dc.b 0
prtflag:dc.b 0
histlin:dc.b 0			;history cursor
histcnt:dc.b 0			;history entry
keybuf:	blk.b 40,0
month:	dc.b 31,28,31,30,31,30,31,31,30,31,30,31	;feb gets patched

	;     01234567890123456789
	even
	dc.l "PTCH"		;patch area
	dc.b 0,0,0,0		;reserved
econflg:dc.b 0		;0:complete cpu,1:economy cpu
modeflg:dc.b 0		;0:pal,1:pal lace,2:ntsc,3:ntsc lace,4:multiscan
langflg:dc.b %00000000	;bit0:0:german,1:american
			;bit4:0:verify,1:noverify
rateflg:dc.b 1		;0:fast,1:medium,2:slow
rgb0:	dc.w $bbb
rgb1:	dc.w $222
fkeybuf:dc.b "l 40000 0 2 s|",0,0,0,0,0,0
	dc.b "a 40000|",0,0,0,0,0,0,0,0,0,0,0,0
	dc.b "d 40000|",0,0,0,0,0,0,0,0,0,0,0,0
	dc.b "L oi 40000|",0,0,0,0,0,0,0,0,0
	dc.b "cd:|dir|",0,0,0,0,0,0,0,0,0,0,0,0
	blk.b [10-5]*fkeylen,0
	even
lginstr:dc.l 0			;2byte instr:0,4byte instr:2
oplen:	dc.w 0			;0:noop,1.w,2.l,3.wl,4.ll;union!
op68000:dc.w 0,0,0,0,0		;68000 rawopcode+paras
mask55:	dc.l $55555555
maskaa:	dc.l $aaaaaaaa
sync:	dc.w $4489
readlen:dc.w 0			;number of mfm words incl. gap
rootkey:dc.l 0			;key of rootblck #880/1760
lastkey:dc.l 0			;last standard key
lastkeym1:
	dc.l 0			;last standard key -1
trksec:	dc.w 0			;numsec of track #11/22
trksecm1:
	dc.w 0			;numsec of track -1 #10/21
cylsec:	dc.w 0			;numsec of cyl #22/44
cylsecm1:
	dc.w 0			;numsec of cyl -1 #21/43
bitsec:	dc.l 0			;key of bitmap
fheader:dc.l 0			;key of fileHEADER
dirkey:	dc.l 0			;key of subdir/root
prevchain:
	dc.l 0			;0:filehd in root,>0:previous chain
roothash:
	dc.l 0			;absadr of filehash in root
linkkey:dc.l 0			;0:new header into root,>0:insert key
datanum:dc.w 0			;cnt datablk
datasiz:dc.w 0			;ofs:488,ffs:512
filesiz:dc.l 0			;length of file $144(fhd)
dosofs:	dc.b "DOS",0		;bootblock entry OFS
formdos:dc.l 0			;ofs:$444f5300,ffs:$444f5301
lastchk:dc.l 0			;datachecksum of last rootblk
secinbuf:
	dc.l 0			;%1:read sec before update
drivcyl:dc.l 0			;drives:0-3,-1.b:cyl invalid
frzflag:dc.w 0			;0:normal start,-1:freeze!
bufadr:	dc.l 0			;adr swapmem
himem:	dc.l 0			;max workspc end
defwork:dc.l 0			;start of screenmem: work1/work2
scrsize:dc.l 0			;number of bytes per screen
wrksize:dc.l 0			;number of bytes for workspace
lineend:dc.l 0			;end of cmdline
basereg:dc.l 0			;effective address accu
days:	dc.l 0			;\  days since 1.1.1978
mins:	dc.l 0			; > mins of today
ticks:	dc.l 0			;/  ticks of this minute
breakpc:dc.l 0			;address of interrupted prog
para:	blk.l 16,0
intvecs:blk.l $100/4,0
brkpadr:blk.l brkpnum,0		;pointer to brkpoint
brkpbuf:blk.w brkpnum,$4afc	;old opcode
linebuf:blk.b xchars,0		;even !
lineeof:dc.b 0
histbuf:blk.b histnum*[xchars-1],0

	even
mtchbuf:blk.l mtchnum,0		;match buffer
txtscr:	blk.l xchars*32*2/4,0
txtback:dc.b ">"
	blk.b xchars*32*2-1," "
	even
rootblk:blk.b 512,0			;\bootblkbuffer
header:	blk.b 512,0			;/
bitmap:	blk.b 512,0
stacksize=$1000				;magic
stack:	blk.b stacksize,0
stackend:
dostrkbuf:blk.b 512*11*2,0		;hd size,even!
progend:
