; FILE: Source:modules/romfixes.ASM          REV: 14 --- misc rom bugfixes
; History
;  0      Started 10th Dec 1999: got idea from Fixes dir in MMULib.lha
;  1      12th Dec: console device fix accidently bsr'ed two bytes off
;         -> strange console update problems & cyberguard hits, fixed
;  2      Added shell Resident patch. froze 1.19.
;  3      Fixed ramlib stack patch for V37 rom
;  4      Added ramlib msgport sigbit patch
;  5      3rd Jan 2000: Disabled resident patch, it's bugged!
;  6      7th Jan 2000: Bugfixed resident patch. No longer freezes if
;         user says `resident c:program' without `ADD' switch.
;         froze 1.20.
;  7      11th Sep 2000: Added exec/Alert() enable bugfix.
;  8      20th Oct 2000: Added graphics/WriteChunkyPixels(),
;         graphics/WritePixelArray8(), graphics/WritePixelLine8() and
;         exec/FreePooled() bugfixes. These are also fixed by standard
;         SetPatch.
;  9      2nd Nov 2000: No longer fail if exec can't be patched. Don't
;         ask me why. :-)
;  10     9th Dec 2000: Added exec/ReleaseSemaphore bugfix.
;  11     13th Dec 2000: Added 68000/68010 utility/UMult64 bugfix.
;  12     1st Feb 2001: No longer barf on V44+ console.device.
;  13     8th Feb 2001: Added A4000/A4000T IDE scsi.device initroutine
;         bugfix.
;  14     31th Jul 2001: Added graphics/InitArea() bugfix.
;

;
; romfixes patch for BlizKick ("patch" Module)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
; This patch fixes some bugs in current rom versions (including V40!)
;
; - console.device window resize bug (ever wondered why KingCON shell
;   having review buffer and menus enabled crashes on window resize?-)
;   (idea from Thor's util/boot/ConsoleFix.lha)
; - increase ram disk stack size (idea from Thor's util/boot/PatchRAM.lha)
; - increase ramlib stack size from 2k to 8k
; - make ramlib msgport use sigbit SIGBREAKB_CTRL_E instead of SIGB_SINGLE
;   (idea from Eddy Carroll's SnoopDos source code)
; - shell Resident command bug, see CyberGuard.notes / 1.11beta3
; - fix harmless "bug" from exec/Alert() -call. It does 'tst.l (IDNestCnt,a6)'
;   when it should do 'tst.b (IDNestCnt,a6)'.
; - graphics/WriteChunkyPixels() bugfix, the function trashed a2/a6 with
;   Akiko chip.
; - fix graphics/WritePixelArray8() and graphics/WritePixelLine8() source
;   trashing bug.
; - fix exec/ReleaseSemaphore() problem with simultanous pending Procure()
;   and ObtainSemaphore().
; - fix 68000/68010 utility/UMult64() swapped d0 and d1 result registers.
;   (also fixes utility/SMult64())
; - fix A4000/A4000T IDE scsi.device initroutine peeking random memory.
; - fix graphics/InitArea() bug, AreaEllipse() crashed if buffer wasn't
;   explicitly zeroed & maxvectors was limited to 8191.
;
; Written by Harry "Piru" Sintonen.
; This source code is Public Domain.


	include	"blizkickmodule.i"	; Some required...

	SECTION	PATCH,CODE
_DUMMY_LABEL
	BK_PTC

; Code is run with following incoming parameters:
;
; a0=ptr to ROM start (buffer)	eg. $1DE087B8
; a1=ptr to ROM start (ROM)	eg. $00F80000 (do *not* access!)
; d0=ROM lenght in bytes	eg. $00080000
; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
;    CALL: jsr (a2)
;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
;     OUT: d0=ptr to resident (buf) or NULL
; a3=ptr to _InstallModule routine (can be used to plant a "module"):
;    CALL: jsr (a3)
;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
;     OUT: d0=success
; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
;    CALL: jsr (a4)
;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
;     OUT: -
; d6=dosbase, a6=execbase
;
; Code should return:
;
; d0=true if succeeded, false if failed.
; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)

	moveq	#0,d7

	cmp.w	#37,($C,a0)		; requires V37+ rom image
	blo	.exit

	lea	(regs,pc),a5
	movem.l	d0/a0-a4,(a5)

	lea	(.conname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.nocon,pc),a1
	tst.l	d0
	beq	.err

	move.l	d0,a2
	cmp.b	#44,(RT_VERSION,a2)	; check for OS 3.5+ console.device
	bhs	.noconbug

	IFGT	0
	move.l	(RT_INIT,a2),a2
	;test if inside rom bounds?
	move.l	(rom_log,pc),d0
	cmp.l	d0,a2
	blo.b	.nofix
	add.l	(rom_size,pc),d0
	cmp.l	d0,a2
	bhs.b	.nofix
	; inside rom, so generate ram buffer address
	sub.l	(rom_log,pc),a2		; -$f80000
	add.l	(rom_phys,pc),a2	; +buffer
.nofix
	ENDC

	lea	(.badcon,pc),a1
	lea	(8192,a2),a2
	move.w	#16384/2,d0
.find	addq.l	#2,a2
	subq.w	#1,d0
	beq	.err

	cmp.l	#$2C5F45EE,(a2)
	bne.b	.find
	cmp.l	#$0082614C,(4,a2)
	bne.b	.find
	cmp.l	#$24524A92,(8,a2)
	bne.b	.find
	cmp.l	#$66F841EE,(12,a2)
	bne.b	.find
	cmp.l	#$126E2F0E,(16,a2)
	bne.b	.find

	; patch console.device bug!

	lea	(.consoledev,pc),a0
	bsr	.patch
.noconbug


	lea	(.dosname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.nodos,pc),a1
	tst.l	d0
	beq	.err

	move.l	d0,a2
	lea	(.badram,pc),a1
	lea	(8192,a2),a2
	move.w	#16384/2,d0
.find2	addq.l	#2,a2
	subq.w	#1,d0
	beq	.err

	cmp.l	#$4878FFFF,(a2)		; pea	(-1).w
	bne.b	.find2
	cmp.l	#$4878000A,(4,a2)	; pea	(10).w
	bne.b	.find2
	cmp.l	#$487804B0,(8,a2)	; pea	(1200).w
	bne.b	.find2
	cmp.l	#$7000222B,(12,a2)	; moveq #0,d0 / move.l (x,a3),d1
	bne.b	.find2

	; patch ram disk stack size!
	move.w	#2048,(10,a2)


	lea	(.ramlibname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.noramlib,pc),a1
	tst.l	d0
	beq	.err

	move.l	d0,a3
	move.l	d0,a2

	lea	(.badramlib,pc),a1
	move.w	#2048/2,d0
.find3	addq.l	#2,a2
	subq.w	#1,d0
	beq.b	.try_37

	cmp.l	#$2608E48B,(a2)
	bne.b	.find3
	cmp.l	#$7808E19C,(4,a2)
	bne.b	.find3
	cmp.l	#$4EAEFF76,(8,a2)
	bne.b	.find3

	; patch ramlib stack size! (v39+)
	move.w	#$7820,(4,a2)
	bra.b	.was_39plus


.try_37	move.l	a3,a2
	move.w	#2048/2,d0
.find3_37	addq.l	#2,a2
	subq.w	#1,d0
	beq	.err

	cmp.l	#$283C0000,(a2)
	bne.b	.find3_37
	cmp.l	#$08004EAE,(4,a2)
	bne.b	.find3_37
	cmp.l	#$FF762C5F,(8,a2)
	bne.b	.find3_37

	; patch ramlib stack size! (v37)
	move.w	#$2000,(4,a2)
.was_39plus

	lea	(.badramlib_b,pc),a1
	move.w	#4096/2,d0
.find3b	addq.l	#2,a3
	subq.w	#1,d0
	beq	.err

	cmp.l	#$246E0114,(a3)
	bne.b	.find3b
	cmp.w	#$2B4A,(4,a3)
	bne.b	.find3b
	cmp.l	#$3B7C0004,(8,a3)
	bne.b	.find3b
	cmp.l	#$600841ED,(14,a3)
	bne.b	.find3b

	; patch ramlib msgport sigbit
	move.w	#14,(10,a3)		; SIGBREAKB_CTRL_E


	lea	(.shellname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.noshell,pc),a1
	tst.l	d0
	beq	.err

	move.l	d0,a2
	lea	(.badresident,pc),a1
	lea	(8192,a2),a2
	move.w	#12288/2,d0
.find4	addq.l	#2,a2
	subq.w	#1,d0
	beq	.err

	cmp.l	#$67164AAD,(a2)
	bne.b	.find4
	cmp.l	#$FFD06624,(4,a2)
	bne.b	.find4
	cmp.l	#$202B0004,(8,a2)
	bne.b	.find4
	cmp.l	#$4A806A08,(12,a2)
	bne.b	.find4
	cmp.l	#$0C80FFFF,(16,a2)
	bne.b	.find4
	cmp.l	#$FC196E14,(20,a2)
	bne.b	.find4
	cmp.l	#$4AADFFD4,(24,a2)
	bne.b	.find4
	cmp.l	#$660000B6,(28,a2)
	bne.b	.find4
	cmp.l	#$0CAB0000,(32,a2)
	bne.b	.find4
	cmp.l	#$00010004,(36,a2)
	bne.b	.find4

	; patch shell resident command

	lea	(.shell_resident,pc),a0
	bsr	.patch


	lea	(.execname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.noexec,pc),a1
	tst.l	d0
	beq	.err

	move.l	d0,a3
	lea	(.noalert,pc),a1
	lea	(8192,a3),a2
	move.w	#8192/2,d0
.find5	subq.w	#1,d0
	beq.b	.isfixed5
	addq.l	#2,a2
	cmp.l	#$4CDF6303,(4,a2)	'movem.l (sp)+,d0/d1/a0/a1/a5/a6'
	bne.b	.find5
	cmp.l	#$6C0833FC,(8,a2)	'bge.b *+$a / move.w #x,abs'
	bne.b	.find5
	cmp.l	#$41EE0202,(-12,a2)	'lea (LastAlert,a6),a0'
	bne.b	.find5
	cmp.l	#$20C720CD,(-8,a2)	'move.l d7,(a0)+ / move.l a5,(a0)+'
	bne.b	.find5
	cmp.w	#$4EB9,(-4,a2)		'jsr (x).l' (already ok!)
	beq.b	.isfixed5
	cmp.l	#$4AAE0126,(a2)		'tst.l IDNestCnt(a6)'
	bne.b	.find5

	; Fix Alert() enable bug (make it tst.b not tst.l)
	move.w	#$4A2E,(a2)
.isfixed5

	cmp.b	#39,(RT_VERSION,a3)	; requires V39+ exec
	blo	.no_v39exec

	lea	(.nofreepooled,pc),a1
	lea	(4096,a3),a2
	move.w	#8192/2,d0
.find6	subq.w	#1,d0
	beq.b	.isfixed6
	;beq	.err
	addq.l	#2,a2
	cmp.l	#$20290020,(a2)
	bne.b	.find6
	cmp.l	#$D0A90014,(4,a2)
	bne.b	.find6
	cmp.l	#$90A90018,(8,a2)
	bne.b	.find6
	cmp.l	#$67064E75,(12,a2)
	bne.b	.find6
	cmp.l	#$59895189,(16,a2)
	bne.b	.find6
	cmp.l	#$20092059,(20,a2)
	bne.b	.find6

	; Fix FreePooled() bug
	move.w	#$001C,(2,a2)
.isfixed6

	lea	(.noreleasesemaphore,pc),a1
	lea	(4096,a3),a2
	move.w	#8192/2,d0
.find9	subq.w	#1,d0
	beq	.isfixed9
	;beq	.err
	addq.l	#2,a2
	cmp.l	#$234A0014,(a2)
	bne.b	.find9
	cmp.l	#$526A000E,(4,a2)
	bne.b	.find9
	cmp.l	#$4EAEFE86,(8,a2)
	bne.b	.find9
	cmp.l	#$222A0028,(12,a2)
	bne.b	.find9
	cmp.l	#$201367DA,(16,a2)
	bne.b	.find9
	cmp.l	#$224B2640,(20,a2)
	bne.b	.find9
	cmp.l	#$20290008,(24,a2)
	bne.b	.find9
	cmp.l	#$6712B280,(28,a2)
	bne.b	.find9
	cmp.l	#$66EE2069,(32,a2)
	bne.b	.find9
	cmp.l	#$0004208B,(36,a2)
	bne.b	.find9
	cmp.l	#$27480004,(40,a2)
	bne.b	.find9
	cmp.l	#$224160B4,(44,a2)
	bne	.find9
	cmp.l	#$B2A90014,(48,a2)
	bne	.find9
	cmp.l	#$66DA2069,(52,a2)
	bne	.find9
	cmp.l	#$0004208B,(56,a2)
	bne	.find9
	cmp.l	#$27480004,(60,a2)
	bne	.find9
	cmp.l	#$526A000E,(64,a2)
	bne	.find9
	cmp.w	#$60BA,(68,a2)
	bne	.find9

	; Fix ReleaseSemaphore() bug
	move.w	#$60BE,(64,a2)

.isfixed9
.no_v39exec

	lea	(.gfxname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.nogfx,pc),a1
	tst.l	d0
	beq	.err

	move.l	d0,a3
	cmp.w	#40,(RT_VERSION,a3)	; WriteChunkyPixels is V40 only
	bne	.no_v40

	move.l	(rom_phys,pc),a0
	cmp.l	#(40<<16)|63,($C,a0)	; 40.63 doesn't have this bug since the WCP()
	beq	.no_v40			; function doesn't implement Akiko support.

	lea	(.badwcp,pc),a1
	lea	(2048,a3),a2
	move.w	#8192/2,d0
.find7	addq.l	#2,a2
	subq.w	#1,d0
	beq.b	.nowcp			; ignore possible error

	cmp.l	#$2F0E2F0A,(a2)
	bne.b	.find7
	cmp.l	#$2F082248,(4,a2)
	bne.b	.find7
	cmp.l	#$487A0020,(8,a2)
	bne.b	.find7
	cmp.l	#$4FEFFFF8,(12,a2)
	bne.b	.find7
	cmp.l	#$204F48A7,(16,a2)
	bne.b	.find7
	cmp.l	#$F000244F,(20,a2)
	bne.b	.find7
	cmp.l	#$2F042C6E,(24,a2)
	bne.b	.find7
	cmp.l	#$01C84EAE,(28,a2)
	bne.b	.find7
	cmp.l	#$FF284FEF,(32,a2)
	bne.b	.find7
	cmp.l	#$00242C5F,(36,a2)
	bne.b	.find7
	cmp.w	#$4E75,(40,a2)
	bne.b	.find7

	; patch graphics/WriteChunkyPixels()
	lea	(.writechunkypixels,pc),a0
	bsr	.patch
	bra.b	.no_v40
.nowcp	bsr	.print
.no_v40

	lea	(.badwpa8,pc),a1
	lea	(2048,a3),a2
	move.w	#16384/2,d0
.find8	addq.l	#2,a2
	subq.w	#1,d0
	beq	.nowpa			; ignore possible error

	cmp.l	#$944048C2,(a2)
	bne.b	.find8
	cmp.l	#$52822802,(4,a2)
	bne.b	.find8
	cmp.l	#$6F342E00,(8+8,a2)
	bne.b	.find8
	cmp.l	#$2A019641,(8+12,a2)
	bne.b	.find8
	cmp.l	#$48C35283,(8+16,a2)
	bne.b	.find8
	cmp.l	#$6F282648,(8+20,a2)
	bne.b	.find8
	cmp.l	#$20072205,(8+32,a2)
	bne.b	.find8
	cmp.l	#$224C4EB9,(8+36,a2)
	bne.b	.find8
	cmp.l	#$48E7FFFC,(8+70,a2)
	bne.b	.find8
	cmp.l	#$26690004,(8+74,a2)
	bne.b	.find8
	cmp.l	#$20024E75,(8+304,a2)	; v39/v40
	beq.b	.found8
	cmp.l	#$20024E75,(8+310,a2)	; v37
	bne.b	.find8
.found8
	addq.l	#8,a2
	; patch graphics/WritePixelArray8() & graphics/WritePixelLine8()
	lea	(.writepixelarray8,pc),a0
	bsr	.patch
	bra.b	.got_wpa
.nowpa	bsr	.print
.got_wpa

	lea	(.badinitarea,pc),a1
	lea	(1024,a3),a2
	move.w	#16384/2,d0
.findc	addq.l	#2,a2
	subq.w	#1,d0
	beq.b	.isfixedc

	cmp.l	#$21490004,(a2)
	bne.b	.findc
	moveq	#0,d1			; skip=0
	cmp.l	#$20893140,(4,a2)
	beq.b	.is_v39v40
	cmp.l	#$21490000,(4,a2)	; v37.x
	bne.b	.findc
	cmp.w	#$3140,(8,a2)		; v37.x
	bne.b	.findc
	moveq	#2,d1			; skip=2
.is_v39v40	cmp.l	#$0012E580,8(a2,d1.l)
	bne.b	.findc
	cmp.l	#$D2C02149,12(a2,d1.l)
	bne.b	.findc
	cmp.l	#$000C2149,16(a2,d1.l)
	bne.b	.findc
	cmp.l	#$00084268,20(a2,d1.l)
	bne.b	.findc
	cmp.l	#$00104E75,24(a2,d1.l)
	bne.b	.findc

	; patch graphics/InitArea()
	lea	(.initarea,pc),a0
	bsr	.patch
	bra.b	.got_initarea
.isfixedc	bsr	.print
.got_initarea


	lea	(.utilname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.noutil,pc),a1
	tst.l	d0
	beq	.err
	move.l	d0,a2

	cmp.b	#39,(RT_VERSION,a2)	; requires V39+ utility
	blo	.no_v39util

	lea	(.noumult64,pc),a1
	move.w	#8192/2,d0
.finda	subq.w	#1,d0
;	beq	.err
	beq	.isfixeda
	addq.l	#2,a2
	cmp.l	#$48E73800,(a2)
	bne.b	.finda
	cmp.l	#$2601C6C0,(4,a2)
	bne.b	.finda
	cmp.l	#$24014842,(8,a2)
	bne.b	.finda
	cmp.l	#$4840C4C0,(12,a2)
	bne.b	.finda
	cmp.l	#$48432801,(16,a2)
	bne.b	.finda
	cmp.l	#$C8C0D644,(20,a2)
	bne.b	.finda
	cmp.l	#$42444844,(24,a2)
	bne.b	.finda
	cmp.l	#$D5844840,(28,a2)
	bne.b	.finda
	cmp.l	#$48412801,(32,a2)
	bne.b	.finda
	cmp.l	#$C8C0D644,(36,a2)
	bne.b	.finda
	cmp.l	#$42444844,(40,a2)
	bne.b	.finda
	cmp.l	#$D5844843,(44,a2)
	bne.b	.finda
	cmp.l	#$20022203,(48,a2)
	bne	.finda
	cmp.l	#$4CDF001C,(52,a2)
	bne	.finda
	cmp.w	#$4E75,(56,a2)
	bne	.finda

	; Fix 68000/68010 UMult64() bug
	move.l	#$22022003,(48,a2)
.isfixeda
.no_v39util


	move.l	(rom_phys,pc),a0
	cmp.l	#(37<<16)|299,($C,a0)	; pre-37.299 doesn't have scsi.device, and thus no bug
	blo	.no_v37scsi

	lea	(.scsiname,pc),a1
	movem.l	(regs,pc),d0/a0
	move.l	(findresident,pc),a2
	jsr	(a2)
	lea	(.noscsi,pc),a1
	tst.l	d0
	beq	.err
	move.l	d0,a3

	cmp.b	#37,(RT_VERSION,a3)	; scsidisk 37+
	blo	.no_v37scsi

	lea	(.noscsiinit,pc),a1
	move.l	a3,a2
	moveq	#254/2,d0
.findb1	subq.w	#1,d0
;debug!	beq	.err
	beq	.isfixedb
	addq.l	#2,a2
	cmp.l	#$48E73F3C,(a2)
	bne.b	.findb1
	cmp.l	#$93C94EAE,(4,a2)
	bne.b	.findb1
	cmp.l	#$FEDA2A00,(8,a2)
	bne.b	.findb1
	cmp.l	#$70064EAE,(12,a2)
	bne.b	.findb1
	cmp.l	#$FCD64A80,(16,a2)
	bne.b	.findb1
	cmp.l	#$660E2E3C,(20,a2)
	bne.b	.findb1
	cmp.l	#$14030000,(24,a2)
	bne.b	.findb1
	cmp.l	#$4EAEFF94,(28,a2)
	bne.b	.findb1
	cmp.w	#$6000,(32,a2)
	bne.b	.findb1
	cmp.l	#$7C0049F9,(36,a2)
	bne.b	.findb1
	cmp.l	#$00DD2020,(40,a2)
	bne.b	.findb1
	cmp.l	#$2F007000,(44,a2)
	bne.b	.findb1
	cmp.w	#$6100,(48,a2)
	bne	.findb1
	cmp.l	#$2200201F,(52,a2)
	bne	.findb1
	cmp.l	#$4A816700,(56,a2)
	bne	.findb1
	cmp.w	#$2C40,(62,a2)
	bne	.findb1

	; find 'battmem.resource' string
	move.w	#10240/2,d0
	moveq	#2,d2
.findb2	subq.w	#1,d0
;debug!	beq	.err
	beq	.isfixedb
	addq.l	#2,d2
	cmp.l	#'batt',16+0(a2,d2.l)		; 16 is offset to 'lea (battmemname,pc),a1'
	bne.b	.findb2
	cmp.l	#'mem.',16+4(a2,d2.l)
	bne.b	.findb2
	cmp.l	#'reso',16+8(a2,d2.l)
	bne.b	.findb2
.errb2
	; find read_battmem routine
	move.w	#10240/2,d0
	moveq	#2,d1
.findb3	subq.w	#1,d0
;debug!	beq	.err
	beq	.isfixedb
	addq.l	#2,d1
	cmp.l	#$41ED0042,32+0(a2,d1.l)	; 32 is offset the 'bsr.w read_battmem'
	bne.b	.findb3
	cmp.l	#$70017201,32+4(a2,d1.l)
	bne.b	.findb3
	cmp.l	#$4EAEFFEE,32+8(a2,d1.l)
	bne.b	.findb3
	cmp.l	#$2C554E75,32+12(a2,d1.l)
	bne.b	.findb3

	move.w	(32+2,a2),d3			; .exitnull offset
	move.w	(48+2,a2),d4			; scsi_probescsi offset
	add.w	#32-50,d3			; adjust for the patch
	add.w	#48-42,d4

	; Patch A4000 scsi.device init bug

	move.l	a2,a3
	lea	(.a4000scsidev,pc),a0
	bsr	.patch
	move.w	d2,(16,a3)			; fix battmemname lea offset (ok!)
	move.w	d1,(32,a3)			; fix read_battmem bsr.w offset (ok!)
	move.w	d3,(50+2,a3)			; fix .exitnull beq.w offset
	move.w	d4,(42+2,a3)			; fix scsi_probescsi bsr.w offset (ok!)
.isfixedb
.no_v37scsi



	moveq	#1,d7

.err	tst.l	d7
	bne.b	.exit
.print	lea	(.errh,pc),a0
	move.l	a1,-(sp)
	move.l	sp,a1
	move.l	(printf,pc),a2
	jsr	(a2)
	addq.l	#4,sp
.exit	move.l	d7,d0
	rts



.patch	move.w	(a0)+,d0
.copy	move.w	(a0)+,(a2)+
	subq.w	#1,d0
	bne.b	.copy
	rts


PATCH	MACRO
.\1	dc.w	(.\1_END-*-2)>>1
	ENDM

	PATCH	consoledev
	dc.l	$2C5745EE
	dc.l	$00826002
	dc.l	$614A2452
	dc.l	$4A9266F8
	dc.l	$41EE126E
.consoledev_END

	PATCH	shell_resident
	dc.l	$671C4AAD
	dc.l	$FFD06624
	dc.l	$200B6720
	dc.l	$202B0004
	dc.l	$6A0C0C80
	dc.l	$FFFFFC19
	dc.l	$6E126002
	dc.l	$C0DE4AAD
	dc.l	$FFD46600
	dc.l	$00B05380
.shell_resident_END

.	PATCH	writechunkypixels
	dc.l	$48E700A2
	dc.l	$2248487A
	dc.l	$0022518F
	dc.l	$204F48A7
	dc.l	$F000244F
	dc.l	$2F042C6E
	dc.l	$01C84EAE
	dc.l	$FF284FEF
	dc.l	$001C4CDF
	dc.l	$4400588F
.writechunkypixels_END

	PATCH	writepixelarray8
	dc.l	$D87C000F
	dc.l	$7CFFC87C
	dc.l	$FFF06F2A
	dc.l	$2E002A01
	dc.l	$964148C3
	dc.l	$52836F1E
	dc.l	$7C002648
	dc.l	$2849204B
	dc.l	$20072205
	dc.l	$224C6122
	dc.l	$5285D5C4
	dc.l	$DC805383
	dc.l	$66EC4EAE
	dc.l	$FF1C2006
	dc.l	$4CDF1CFC
	dc.w	$4E75

	dc.l	$4E714E71
	dc.l	$4E714E71

	dc.l	$2F2EFF1E

	dc.w	$48E7
	dc.l	$FFFC48C2
	dc.l	$D47C000F
	dc.l	$C47CFFF0
	dc.l	$72102802
	dc.l	$4EAEFF1C

	dc.l	$206F0024
	dc.l	$26042068
	dc.l	$00049682
	dc.l	$10280005
	dc.l	$47F23800
	dc.l	$5088E68B
	dc.l	$4CDB30C0

	dc.l	$22587A00
	dc.l	$D3C31A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$16851A23
	dc.l	$E29D1685
	dc.l	$1A23E29D
	dc.l	$1685E3BD
	dc.l	$D7C132C5
	dc.l	$53006690

	dc.l	$48EB30C0
	dc.l	$FFF09481
	dc.l	$6E00FF6A

	dc.l	$700041EF
	dc.l	$00207200
	dc.l	$4CD7001C
	dc.l	$22587A01
	dc.l	$7CC02050
	dc.l	$4EAEFDD8
	dc.l	$4CDF3FFF
	dc.l	$20024E75
.writepixelarray8_END

	PATCH	initarea
	dc.l	$20C9C0FC
	dc.l	$000420C9
	dc.l	$D3C0E488
	dc.l	$20C920C9
	dc.l	$20806002
	dc.l	$421951C8
	dc.l	$FFFC4E75
.initarea_END

	PATCH	a4000scsidev
	dc.w	$48E7,$3F3C
	dc.w	$7C00

	dc.w	$42A7
	dc.w	$4FEF,$FFC0
	dc.w	$2A4F

	dc.w	$43FA,$0000
	dc.w	$4EAE,$FE0E
	dc.w	$4A80
	dc.w	$6708
	dc.w	$2A8E
	dc.w	$2C40
	dc.w	$6100,$0000

	dc.w	$49F9,$00DD,$2020
	dc.w	$7000
	dc.w	$6100,$0000
	dc.w	$4FEF,$0044
;;	dc.w	$4A80
	dc.w	$6700,$0000

	dc.w	$2A2E,$0114

	dc.w	$7006
	dc.w	$4EAE,$FCD6

	dc.w	$2C40
	dc.w	$4EAE,$FFD0
	dc.w	$2C78,$0004
.a4000scsidev_END


.errh	dc.b	'romfixes: couldn''t %s!',10,0

.nocon	dc.b	'find '
.conname	dc.b	'console.device',0
.badcon	dc.b	'patch console.device bug',0

.nodos	dc.b	'find '
.dosname	dc.b	'dos.library',0
.badram	dc.b	'patch ram disk stack size',0

.noramlib	dc.b	'find '
.ramlibname	dc.b	'ramlib',0
.badramlib	dc.b	'patch ramlib stack size',0
.badramlib_b	dc.b	'patch ramlib msgport sigbit',0

.noshell	dc.b	'find '
.shellname	dc.b	'shell',0
.badresident	dc.b	'patch Resident bug',0

.noexec	dc.b	'find '
.execname	dc.b	'exec.library',0
.noalert	dc.b	'patch exec/Alert() bug',0
.nofreepooled	dc.b	'patch exec/FreePooled() bug',0
.noreleasesemaphore
	dc.b	'patch exec/ReleaseSemaphore() bug',0

.nogfx	dc.b	'find '
.gfxname	dc.b	'graphics.library',0
.badwcp	dc.b	'patch graphics/WriteChunkyPixels() bug',0
.badwpa8	dc.b	'patch graphics/WritePixelArray8() & WritePixelLine8() bug',0
.badinitarea	dc.b	'patch graphics/InitArea() bug',0

.noutil	dc.b	'find '
.utilname	dc.b	'utility.library',0
.noumult64	dc.b	'patch utility/UMult64() bug',0

.noscsi	dc.b	'find '
.scsiname	dc.b	'scsi.device',0
.noscsiinit	dc.b	'patch A4000 scsi.device init bug',0

	CNOP	0,2
regs
rom_size	ds.l	1
rom_phys	ds.l	1
rom_log	ds.l	1
findresident	ds.l	1
installmodule	ds.l	1
printf	ds.l	1

	SECTION	VERSION,DATA

	dc.b	'$VER: romfixes_PATCH 1.8 (26.10.01)',0


	IFGT	0

	; shell/Resident bug
	; ------------------


	; fixed, 2nd try

.no_REM	move.l	a2,d0			;200A

	beq.b	.no_filepart		;671C
	tst.l	(-$0030,a5)		;4AADFFD0
	bne.b	.is_ADD			;6624
	move.l	a3,d0			;200B
	beq.b	.is_ADD			;6720
	move.l	(4,a3),d0		;202B0004
	bpl.b	.no_filepart		;6A0C
	cmp.l	#-999,d0		;0C80FFFFFC19
	bgt.b	.is_ADD			;6E12
	bra.b	.no_filepart		;6002
	dc.w	$C0DE			;C0DE
.no_filepart	tst.l	(-$002C,a5)		;4AADFFD4	REPLACE/S
	bne.w	.da_err			;660000B0
	subq.l	#1,d0			;5380

	ble.w	.da_err			;6F0000AA
.is_ADD	move.l	(-$0028,a5),d0		;202DFFD8	PURE/S



	; rom 39.106:

.no_REM	move.l	a2,d0			;200A

	beq.b	.no_filepart		;6716
	tst.l	(-$0030,a5)		;4AADFFD0
	bne.b	.is_ADD			;6624
	move.l	(4,a3),d0		;202B0004	;BUG! should test if a3=0 before!
	tst.l	d0			;4A80
	bpl.b	.no_filepart		;6A08
	cmp.l	#-999,d0		;0C80FFFFFC19
	bgt.b	.is_ADD			;6E14
.no_filepart	tst.l	(-$002C,a5)		;4AADFFD4	;REPLACE/S
	bne.w	.da_err			;660000B6
	cmp.l	#1,(4,a3)		;0CAB000000010004

	ble.w	.da_err			;6F0000AA
.is_ADD	move.l	(-$0028,a5),d0		;202DFFD8	;PURE/S



	; console.device bug
	; ------------------

	; fixed

	move.l	d7,-(sp)			;2F07
	lea	($126E,a6),a0			;41EE126E
	move.l	a6,-(sp)			;2F0E
	move.l	($0030,a6),a6			;2C6E0030
	jsr	(_LVOObtainSemaphore,a6)	;4EAEFDCC

	move.l	(sp),a6				;2C57
	lea	($0082,a6),a2			;45EE0082
	bra.b	.in				;6002
.loop	bsr.b	cd_processwindow		;614A
.in	move.l	(a2),a2				;2452
	tst.l	(a2)				;4A92
	bne.b	.loop				;66F8
	lea	($126E,a6),a0			;41EE126E

	move.l	($0030,a6),a6			;2C6E0030
	jsr	(_LVOReleaseSemaphore,a6)	;4EAEFDC6
	move.l	(sp)+,a6			;2C5F
	move.l	(sp)+,d7			;2E1F


	; rom 37.300:

	move.l	d7,-(sp)			;2F07	;start here:
	lea	($126E,a6),a0			;41EE126E
	move.l	a6,-(sp)			;2F0E
	move.l	($0030,a6),a6			;2C6E0030
	jsr	(_LVOObtainSemaphore,a6)	;4EAEFDCC

	move.l	(sp)+,a6			;2C5F
	lea	($0082,a6),a2			;45EE0082	;BUG: the console.device bug
.loop	bsr.b	cd_processwindow		;614C
	move.l	(a2),a2				;2452
	tst.l	(a2)				;4A92
	bne.b	.loop				;66F8
	lea	($126E,a6),a0			;41EE126E
	move.l	a6,-(sp)			;2F0E

	move.l	($0030,a6),a6			;2C6E0030
	jsr	(_LVOReleaseSemaphore,a6)	;4EAEFDC6
	move.l	(sp)+,a6			;2C5F
	move.l	(sp)+,d7			;2E1F


	; rom 40.68:

	move.l	d7,-(sp)			;2F07
	lea	($126E,a6),a0			;41EE126E
	move.l	a6,-(sp)			;2F0E
	move.l	($0030,a6),a6			;2C6E0030
	jsr	(_LVOObtainSemaphore,a6)	;4EAEFDCC

	move.l	(sp)+,a6			;2C5F
	lea	($0082,a6),a2			;45EE0082
.loop	bsr.b	cd_processwindow		;614C
	move.l	(a2),a2				;2452
	tst.l	(a2)				;4A92
	bne.b	.loop				;66F8
	lea	($126E,a6),a0			;41EE126E
	move.l	a6,-(sp)			;2F0E

	move.l	($0030,a6),a6			;2C6E0030
	jsr	(_LVOReleaseSemaphore,a6)	;4EAEFDC6
	move.l	(sp)+,a6			;2C5F
	move.l	(sp)+,d7			;2E1F



	; graphics/WriteChunkyPixels() bug
	; --------------------------------

	; fixed

	movem.w	d0/d1,-(sp)		;48A7C000	;4    {xstart, ystart}
	movem.l	a0/a2/a6,-(sp)		;48E700A2	;8    {rp, array, gfxbase} ***mod! -2
	move.l	a0,a1			;2248		;a1 = rp
	pea	(writechunkypixels_hook,pc) ;487A0022	;20	***mod! offs + 2
	subq.l	#8,sp			;518F		;28	***mod! - 2
	move.l	sp,a0			;204F		;a0 = hook
	movem.w	d0-d3,-(sp)		;48A7F000	;36   {xstart, ystart, xstop, ystop}
	move.l	sp,a2			;244F		;a2 = rect
	move.l	d4,-(sp)		;2F04		;40   bytesperrow
	move.l	(gb_LayersBase,a6),a6	;2C6E01C8
	jsr	(_LVODoHookClipRects,a6);4EAEFF28
	lea	(36-8,sp),sp		;4FEF001C
	movem.l	(sp)+,a2/a6		;4CDF4400	;***mod! + 2
	addq.l	#4,sp			;588F		;***mod! + 2
	rts				;4E75
writechunkypixels_hook


	; original (ROM 40.068_A1200)

	movem.w	d0/d1,-(sp)		;48A7C000	;4    {xstart, ystart}
	move.l	a6,-(sp)		;2F0E		;8    gfxbase
	move.l	a2,-(sp)		;2F0A		;12   array
	move.l	a0,-(sp)		;2F08		;16   rp
	move.l	a0,a1			;2248		;a1 = rp
	pea	(writechunkypixels_hook,pc) ;487A0020	;20
	lea	(-8,sp),sp		;4FEFFFF8	;28
	move.l	sp,a0			;204F		;a0 = hook
	movem.w	d0-d3,-(sp)		;48A7F000	;36   {xstart, ystart, xstop, ystop}
	move.l	sp,a2			;244F		;a2 = rect
	move.l	d4,-(sp)		;2F04		;40   bytesperrow
	move.l	(gb_LayersBase,a6),a6	;2C6E01C8
	jsr	(_LVODoHookClipRects,a6);4EAEFF28
	lea	(36,sp),sp		;4FEF0024
	move.l	(sp)+,a6		;2C5F
	rts				;4E75
writechunkypixels_hook

	; exec/FreePooled() bug
	; ---------------------

	; fixed (SetPatch)

_FreePooled	move.l	a0,d1		;2208
	beq.b	.exit		;675E
	move.l	a1,d1		;2209
	beq.b	.exit		;675A
	cmp.l	($0014,a0),d0	;B0A80014
	bcc.b	.big_free	;6456
	move.l	a3,-(sp)	;2F0B
	move.l	(a0),d1		;2210
.findmem	move.l	d1,a3		;2641
	move.l	(a3),d1		;2213
	beq.b	.nomem		;6762
	tst.l	(LN_TYPE,a3)	;4AAB0008
	beq.b	.nomem		;675C
	cmp.l	(MH_LOWER,a3),a1 ;B3EB0014
	bcs.b	.findmem	;65EE
	cmp.l	(MH_UPPER,a3),a1 ;B3EB0018
	bcc.b	.findmem	;64E8
	move.l	a3,a0		;204B
	jsr	(_LVODeallocate,a6) ;4EAEFF40
	move.l	(LN_PRED,a3),a1	;226B0004
	move.l	(LN_PRED,a1),d1	;22290004
	beq.b	.nope		;6716
	move.l	d1,a0		;2041
	move.l	a3,(a0)		;208B
	move.l	a0,(LN_PRED,a3)	;27480004
	move.l	a3,(LN_PRED,a1)	;234B0004
	move.l	(a3),a0		;2053
	move.l	a0,(a1)		;2288
	move.l	a1,(LN_PRED,a0)	;21490004
	move.l	a1,(a3)		;2689
.nope	move.l	a3,a1		;224B
	move.l	(sp)+,a3	;265F
	move.l	(MH_FREE,a1),d0	;2029001C	** fixed **
	add.l	(MH_LOWER,a1),d0 ;D0A90014
	sub.l	(MH_UPPER,a1),d0 ;90A90018
	beq.b	.free		;6706
.exit	rts			;4E75

.big_free	subq.l	#4,a1		;5989
	subq.l	#8,a1		;5189
.free	move.l	a1,d0		;2009
	move.l	(a1)+,a0	;2059
	move.l	(a1),a1		;2251
	move.l	a0,(a1)		;2288
	move.l	a1,(4,a0)	;21490004
	move.l	d0,a1		;2240
	jmp	(_LVOFreeVec,a6) ;4EEEFD4E

.nomem	move.l	(sp)+,a3	;265F
	move.l	d7,-(sp)	;2F07
	move.l	#$0100000F,d7	;2E3C0100000F
	jsr	(_LVOAlert,a6)	;4EAEFF94
	move.l	(sp)+,d7	;2E1F
	rts			;4E75


	; original (ROM39.106_A1200)

_LVOFreePooled	move.l	a0,d1		;2208
	beq.b	.exit		;675E
	move.l	a1,d1		;2209
	beq.b	.exit		;675A
	cmp.l	($0014,a0),d0	;B0A80014
	bcc.b	.big_free	;6456
	move.l	a3,-(sp)	;2F0B
	move.l	(a0),d1		;2210
.findmem	move.l	d1,a3		;2641
	move.l	(a3),d1		;2213
	beq.b	.nomem		;6762
	tst.l	(LN_TYPE,a3)	;4AAB0008
	beq.b	.nomem		;675C
	cmp.l	(MH_LOWER,a3),a1 ;B3EB0014
	bcs.b	.findmem	;65EE
	cmp.l	(MH_UPPER,a3),a1 ;B3EB0018
	bcc.b	.findmem	;64E8
	move.l	a3,a0		;204B
	bsr.w	_LVODeallocate	;6100F996
	move.l	(LN_PRED,a3),a1	;226B0004
	move.l	(LN_PRED,a1),d1	;22290004
	beq.b	.nope		;6716
	move.l	d1,a0		;2041
	move.l	a3,(a0)		;208B
	move.l	a0,(LN_PRED,a3)	;27480004
	move.l	a3,(LN_PRED,a1)	;234B0004
	move.l	(a3),a0		;2053
	move.l	a0,(a1)		;2288
	move.l	a1,(LN_PRED,a0)	;21490004
	move.l	a1,(a3)		;2689
.nope	move.l	a3,a1		;224B
	move.l	(sp)+,a3	;265F
	move.l	(MH_SIZE,a1),d0	;20290020	** bug, should be MH_FREE **
	add.l	(MH_LOWER,a1),d0 ;D0A90014
	sub.l	(MH_UPPER,a1),d0 ;90A90018
	beq.b	.free		;6706
.exit	rts			;4E75

.big_free	subq.l	#4,a1		;5989
	subq.l	#8,a1		;5189
.free	move.l	a1,d0		;2009
	move.l	(a1)+,a0	;2059
	move.l	(a1),a1		;2251
	move.l	a0,(a1)		;2288
	move.l	a1,(4,a0)	;21490004
	move.l	d0,a1		;2240
	jmp	(_LVOFreeVec,a6) ;4EEEFD4E

.nomem	move.l	(sp)+,a3	;265F
	move.l	d7,-(sp)	;2F07
	move.l	#$0100000F,d7	;2E3C0100000F
	jsr	(_LVOAlert,a6)	;4EAEFF94
	move.l	(sp)+,d7	;2E1F
	rts			;4E75


	; graphics/WritePuxelArray8 & WritePixelLine8 bug
	; -----------------------------------------------

	; fixed


	include	"exec/libraries.i"
	include	"graphics/gfx.i"
	include	"graphics/rastport.i"
	include	"graphics/graphics_lib.i"

WritePixelArray8
	movem.l	d2-d7/a2-a4,-(sp) ;48E73F38
	sub.w	d0,d2		;9440
	ext.l	d2		;48C2
	addq.l	#1,d2		;5282
	move.l	d2,d4		;2802
	add.w	#15,d4		;D87C000F		addi.w	#15,d4		;0644000F
	moveq	#-1,d6		;7CFF
	and.w	#-16,d4		;C87CFFF0		andi.w	#-16,d4		;0244FFF0
	ble.b	.exit2		;6F2A
	move.l	d0,d7		;2E00
	move.l	d1,d5		;2A01
	sub.w	d1,d3		;9641
	ext.l	d3		;48C3
	addq.l	#1,d3		;5283
	ble.b	.exit2		;6F1E
	moveq	#0,d6		;7C00
	move.l	a0,a3		;2648
	move.l	a1,a4		;2849

.dolines	move.l	a3,a0		;204B
	move.l	d7,d0		;2007
	move.l	d5,d1		;2205
	move.l	a4,a1		;224C
	bsr.b	_writepixelline8 ;6122
	addq.l	#1,d5		;5285
	add.l	d4,a2		;D5C4
	add.l	d0,d6		;DC80
	subq.l	#1,d3		;5383
	bne.b	.dolines	;66EC

	jsr	(_LVOWaitBlit,a6) ;4EAEFF1C
.exit2	move.l	d6,d0		;2006
.exit	movem.l	(sp)+,d2-d7/a2-a4 ;4CDF1CFC
	rts			;4E75

	dc.w	$4E71,$4E71,$4E71,$4E71
WritePixelLine8
	move.l	(_LVOWaitBlit+2,a6),-(sp) ;2F2EFF1E	+ 4

_writepixelline8
	movem.l	d0-d7/a0-a5,-(sp) ;48E7FFFC

	ext.l	d2		;48C2
	add.w	#15,d2		;D47C000F		addi.w	#15,d2		;0642000F
	and.w	#-16,d2		;C47CFFF0		andi.w	#-16,d2		;0242FFF0
	moveq	#16,d1		;7210
	move.l	d2,d4		;2802
	jsr	(_LVOWaitBlit,a6) ;4EAEFF1C

.oloop	move.l	(9*4,sp),a0	;206F0024		a1 (temprp) from stack
	move.l	d4,d3		;2604
	move.l	(rp_BitMap,a0),a0 ;20680004		move.l	(rp_BitMap,a1),a3 ;26690004
	sub.l	d2,d3		;9682
	move.b	(bm_Depth,a0),d0 ;1028 0005		move.b	(bm_Depth,a3),d0 ;102B0005
	lea	(a2,d3.l),a3	;47F23800
	addq.l	#bm_Planes,a0	;5088			lea	(bm_Planes,a3),a0 ;41EB0008
	lsr.l	#3,d3		;E68B
	movem.l	(a3)+,d6/d7/a4/a5 ;4CDB30C0

.iloop	move.l	(a0)+,a1	;2258
	moveq	#0,d5		;7A00
	add.l	d3,a1		;D3C3			lea	(a1,d3.l),a1	;43F13800
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	rol.l	d1,d5		;E3BD
	add.l	d1,a3		;D7C1
	move.w	d5,(a1)+	;32C5
	subq.b	#1,d0		;5300
	bne.b	.iloop		;668E

	movem.l	d6/d7/a4/a5,(-16,a3) ;48EB30C0FFF0

	sub.l	d1,d2		;9481
	bgt	.oloop		;6E00FF76

	moveq	#0,d0		;7000
	lea	(8*4,sp),a0	;41EF0020	; a0 & a1 from stack
	moveq	#0,d1		;7200
	movem.l	(sp),d2-d4	;4CD7001C
	move.l	(a0)+,a1	;2258		; a1 = rp
	moveq	#1,d5		;7A01
	moveq	#-$40,d6	;7CC0		; d6 = $ffffffc0
	move.l	(a0),a0		;2050		; a0 = temprp
	jsr	(_LVOClipBlit,a6) ;4EAEFDD8

	movem.l	(sp)+,d0-d7/a0-a5 ;4CDF3FFF
	move.l	d2,d0		;2002
	rts			;4E75


	; original (ROM 40.068_A1200)

	include	"exec/libraries.i"
	include	"graphics/gfx.i"
	include	"graphics/rastport.i"
	include	"graphics/graphics_lib.i"

__LVOWritePixelArray8
	movem.l	d2-d7/a2-a4,-(sp) ;48E73F38
	sub.w	d0,d2		;9440
	ext.l	d2		;48C2
	addq.l	#1,d2		;5282
	move.l	d2,d4		;2802
	add.w	#15,d4		;D87C000F
	and.w	#$FFF0,d4	;C87CFFF0
	ble.b	.error		;6F34
	move.l	d0,d7		;2E00
	move.l	d1,d5		;2A01
	sub.w	d1,d3		;9641
	ext.l	d3		;48C3
	addq.l	#1,d3		;5283
	ble.b	.error		;6F28
	move.l	a0,a3		;2648
	move.l	a1,a4		;2849
	moveq	#0,d6		;7C00
	bra.b	.goloop		;6014

.dolines	move.l	a3,a0		;204B
	move.l	d7,d0		;2007
	move.l	d5,d1		;2205
	move.l	a4,a1		;224C
	jsr	(__LVOWritePixelLine8).l ;4EB900F85F3A
	addq.l	#1,d5		;5285
	add.l	d4,a2		;D5C4
	add.l	d0,d6		;DC80
.goloop	dbra	d3,.dolines	;51CBFFEA
	move.l	d6,d0		;2006
	movem.l	(sp)+,d2-d7/a2-a4 ;4CDF1CFC
	rts			;4E75

.error	moveq	#-1,d0		;70FF
	movem.l	(sp)+,d2-d7/a2-a4 ;4CDF1CFC
	rts			;4E75

__LVOWritePixelLine8
	movem.l	d0-d7/a0-a5,-(sp) ;48E7FFFC
	move.l	(rp_BitMap,a1),a3 ;26690004
	moveq	#0,d1		;7200
	move.b	(bm_Depth,a3),d1 ;122B0005
	lsl.w	#2,d1		;E549
	lea	(bm_Planes,a3),a0 ;41EB0008
	ext.l	d2		;48C2
	add.w	#15,d2		;D47C000F
	and.w	#-16,d2		;C47CFFF0
	move.l	d2,d4		;2802
.oloop	move.l	d4,d3		;2604
	sub.l	d2,d3		;9682
	lea	(16,a2,d3.l),a3 ;47F23810
	lsr.l	#3,d3		;E68B
	move.l	(a3),d6		;2C13
	move.l	(4,a3),d7	;2E2B0004
	move.l	(8,a3),a4	;286B0008
	move.l	(12,a3),a5	;2A6B000C
	moveq	#0,d0		;7000
.iloop	move.l	(a0,d0.w),a1	;22700000
	lea	(a1,d3.l),a1	;43F13800
	moveq	#0,d5		;7A00
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	move.b	-(a3),d5	;1A23
	ror.l	#1,d5		;E29D
	move.b	d5,(a3)		;1685
	lea	(16,a3),a3	;47EB0010
	swap	d5		;4845
	move.w	d5,(a1)+	;32C5
	addq.b	#4,d0		;5800
	cmp.b	d0,d1		;B200
	bgt.b	.iloop		;6E88
	move.l	d6,(a3)		;2686
	move.l	d7,(4,a3)	;27470004
	move.l	a4,(8,a3)	;274C0008
	move.l	a5,(12,a3)	;274D000C
	subq.l	#8,d2		;5182
	subq.l	#8,d2		;5182
	bgt.w	.oloop		;6E00FF5A
	moveq	#0,d0		;7000
	moveq	#0,d1		;7200
	movem.l	(sp),d2-d4	;4CD7001C
	moveq	#1,d5		;7A01
	moveq	#3,d6		;7C03
	rol.l	#6,d6		;ED9E
	movem.l	(32,sp),a0/a1	;4CEF03000020
	exg	a0,a1		;C149
	jsr	(_LVOClipBlit,a6) ;4EAEFDD8
	jsr	(_LVOWaitBlit,a6) ;4EAEFF1C
	movem.l	(sp)+,d0-d7/a0-a5 ;4CDF3FFF
	move.l	d2,d0		;2002
	rts			;4E75



	; exec/ReleaseSemaphore bug
	; -------------------------

	; fixed

.mloop	move.l	a2,($0014,a1)	;234A0014
	addq.w	#1,(14,a2)	;526A000E
	jsr	(_LVOReplyMsg,a6) ;4EAEFE86
	move.l	($0028,a2),d1	;222A0028
.iloop	move.l	(a3),d0		;2013
	beq.b	lbC002E44	;67DA
	move.l	a3,a1		;224B
	move.l	d0,a3		;2640
	move.l	(8,a1),d0	;20290008
	beq.b	.nuller		;6712
	cmp.l	d0,d1		;B280
	bne.b	.iloop		;66EE
	move.l	(4,a1),a0	;20690004
	move.l	a3,(a0)		;208B
	move.l	a0,(4,a3)	;27480004
	move.l	d1,a1		;2241
	bra.b	lbC002E3A	;60B4

.nuller	cmp.l	($0014,a1),d1	;B2A90014
	bne.b	.iloop		;66DA
	move.l	(4,a1),a0	;20690004
	move.l	a3,(a0)		;208B
	move.l	a0,(4,a3)	;27480004
	bra.b	.mloop		;60B6


	; original (ROM 39.106_A1200)

.mloop	move.l	a2,($0014,a1)	;234A0014
	addq.w	#1,(14,a2)	;526A000E
	jsr	(_LVOReplyMsg,a6) ;4EAEFE86
	move.l	($0028,a2),d1	;222A0028
.iloop	move.l	(a3),d0		;2013
	beq.b	lbC002E44	;67DA
	move.l	a3,a1		;224B
	move.l	d0,a3		;2640
	move.l	(8,a1),d0	;20290008
	beq.b	.nuller		;6712
	cmp.l	d0,d1		;B280
	bne.b	.iloop		;66EE
	move.l	(4,a1),a0	;20690004
	move.l	a3,(a0)		;208B
	move.l	a0,(4,a3)	;27480004
	move.l	d1,a1		;2241
	bra.b	lbC002E3A	;60B4

.nuller	cmp.l	($0014,a1),d1	;B2A90014
	bne.b	.iloop		;66DA
	move.l	(4,a1),a0	;20690004
	move.l	a3,(a0)		;208B
	move.l	a0,(4,a3)	;27480004
	addq.w	#1,(14,a2)	;526A000E
	bra.b	.mloop		;60BA


	; utility/UMult64 bug
	; -------------------

	; fixed

_LVOUMult64	movem.l	d2-d4,-(sp)	;48E73800
	move.l	d1,d3		;2601
	mulu	d0,d3		;C6C0
	move.l	d1,d2		;2401
	swap	d2		;4842
	swap	d0		;4840
	mulu	d0,d2		;C4C0
	swap	d3		;4843
	move.l	d1,d4		;2801
	mulu	d0,d4		;C8C0
	add.w	d4,d3		;D644
	clr.w	d4		;4244
	swap	d4		;4844
	addx.l	d4,d2		;D584
	swap	d0		;4840
	swap	d1		;4841
	move.l	d1,d4		;2801
	mulu	d0,d4		;C8C0
	add.w	d4,d3		;D644
	clr.w	d4		;4244
	swap	d4		;4844
	addx.l	d4,d2		;D584
	swap	d3		;4843
	move.l	d2,d0		;2202		; ***
	move.l	d3,d1		;2003		; ***
	movem.l	(sp)+,d2-d4	;4CDF001C
	rts			;4E75


	; original (ROM 39.106_A1200)

_LVOUMult64	movem.l	d2-d4,-(sp)	;48E73800
	move.l	d1,d3		;2601
	mulu	d0,d3		;C6C0
	move.l	d1,d2		;2401
	swap	d2		;4842
	swap	d0		;4840
	mulu	d0,d2		;C4C0
	swap	d3		;4843
	move.l	d1,d4		;2801
	mulu	d0,d4		;C8C0
	add.w	d4,d3		;D644
	clr.w	d4		;4244
	swap	d4		;4844
	addx.l	d4,d2		;D584
	swap	d0		;4840
	swap	d1		;4841
	move.l	d1,d4		;2801
	mulu	d0,d4		;C8C0
	add.w	d4,d3		;D644
	clr.w	d4		;4244
	swap	d4		;4844
	addx.l	d4,d2		;D584
	swap	d3		;4843
	move.l	d2,d0		;2002
	move.l	d3,d1		;2203
	movem.l	(sp)+,d2-d4	;4CDF001C
	rts			;4E75




	; A4000 scsi.device initcode bug
	; ------------------------------

	; fixed

scsi_initcode	movem.l	d2-d7/a2-a5,-(sp)	;48E73F3C
	moveq	#0,d6			;7C00

	clr.l	-(sp)			;42A7		null by default
	lea	(-$40,sp),sp		;4FEFFFC0
	move.l	sp,a5			;2A4F

	lea	(battmemname,pc),a1	;43FAxxxx	try to open battmem.resource
	jsr	(_LVOOpenResource,a6)	;4EAEFE0E
	tst.l	d0			;4A80
	beq.b	.nobattres		;6708
	move.l	a6,(a5)			;2A8E		read the 2nd drive flag
	move.l	d0,a6			;2C40
	bsr.w	read_battmem		;6100xxxx
.nobattres
	lea	($00DD2020),a4		;49F900DD2020
	moveq	#0,d0			;7000
	bsr.w	scsi_probescsi		;6100xxxx
	lea	($44,sp),sp		;4FEF0044	release stack storage
;;	tst.l	d0			;4A80
	beq.w	.exitnull		;6700xxxx

	move.l	(ThisTask,a6),d5	;2A2E0114

	moveq	#6,d0			;7006
	jsr	(_LVOexecPrivate14,a6)	;4EAEFCD6

	move.l	d0,a6			;2C40
	jsr	(_LVAllocConfigDev,a6)	;4EAEFFD0
	move.l	(4).l,a6		;2C780004


	; original (ROM 40.68_A4000)

scsi_initcode	movem.l	d2-d7/a2-a5,-(sp)	;48E73F3C
	sub.l	a1,a1			;93C9
	jsr	(_LVOFindTask,a6)	;4EAEFEDA
	move.l	d0,d5			;2A00

	moveq	#6,d0			;7006
	jsr	(_LVOexecPrivate14,a6)	;4EAEFCD6
	tst.l	d0			;4A80
	bne.b	.got			;660E
	move.l	#$14030000,d7		;2E3C14030000
	jsr	(_LVOAlert,a6)		;4EAEFF94
	bra.w	.exitnull		;6000012E
.got
	moveq	#0,d6			;7C00
	lea	($00DD2020),a4		;49F900DD2020
	move.l	d0,-(sp)		;2F00
	moveq	#0,d0			;7000
	bsr.w	scsi_probescsi		;61002102
	move.l	d0,d1			;2200
	move.l	(sp)+,d0		;201F
	tst.l	d1			;4A81
	beq.w	.exitnull		;67000114

	move.l	d0,a6			;2C40 		34
	jsr	(_LVAllocConfigDev,a6)	;4EAEFFD0
	move.l	(4).l,a6		;2C7900000004


	; exec/CheckIO() BOOL return code "bug"
	; -------------------------------------

; - exec/CheckIO BOOL return code fix. SetPatch has a workaround for this,
;   but again better have this fixed in ROM already.
;  (this one is disable because of potential compatibility problems)

	; fixed

_LVOCheckIO	btst	#IOB_QUICK,(IO_FLAGS,a1);08290000001E
	bne.b	.ready			;660C
	cmp.b	#NT_REPLYMSG,(MN+LN_TYPE,a1) ;0C2900070008
	beq.b	.ready			;6704
	moveq	#0,d0			;7000
	rts				;4E75
.ready	moveq	#1,d0			;7001
	rts				;4E75


	; original (ROM 39.106_A1200)

_LVOCheckIO	btst	#IOB_QUICK,(IO_FLAGS,a1);08290000001E
	bne.b	.ready			;660C
	cmp.b	#NT_REPLYMSG,(MN+LN_TYPE,a1) ;0C2900070008
	beq.b	.ready			;6704
	moveq	#0,d0			;7000
	rts				;4E75
.ready	move.l	a1,d0			;2009
	rts				;4E75


	; graphics/InitArea() bug
	; -----------------------

	; fixed
_LVOInitArea
	move.l	a1,(a0)+		; 2 ai_VctrTbl
	mulu.w	#4,d0			; 4 get ptr to	note: mulu.w fill whole longword!
	move.l	a1,(a0)+		; 2 ai_VctrPtr
	adda.l	d0,a1			; 2 FlagTbl
	lsr.l	#2,d0			; 2 get original count
	move.l	a1,(a0)+		; 2 ai_FlagTbl
	move.l	a1,(a0)+		; 2 ai_FlagPtr
	move.l	d0,(a0)			; 2 ai_Count (=0) & ai_MaxCount
	bra.b	.goclr			; 2 clear the FlagTbl
.clr	clr.b	(a1)+			; 2
.goclr	dbf	d0,.clr			; 4
	rts				; 2 = 28

	;original (ROM 40.68_A1200), graphics 40.24:
_LVOInitArea
	move.l	a1,(ai_VctrPtr,a0)	; 4
	move.l	a1,(a0)			; 2 ai_VctrTbl
	move.w	d0,(ai_MaxCount,a0)	; 4 
	asl.w	#2,d0			; 2 get ptr to	note: because of below, limit d0 to 8191
	adda.w	d0,a1			; 2 GlagTbl	note: adda.w is signed, limit d0 to <32768
	move.l	a1,(ai_FlagPtr,a0)	; 4 
	move.l	a1,(ai_FlagTbl,a0)	; 4 
	clr.w	(ai_Count,a0)		; 4 
	rts				; 2 = 28

	ENDC
