*/beginfile QDOS4_asm
; --------------------------------------------------------------
; QDOS4_asm - The QDOS kernel
;	   - last modified 27/11/96
; QDOS-Amiga sources by Rainer Kowallik
;    ...latest changes by Mark J Swift
; --------------------------------------------------------------

; --------------------------------------------------------------
; microdrive routines to switch on & off motor and read & write
; sectors used to reside here, various 8049 routines also.
; also patch out polled task for keyboard reading (PLIST)
; and schedular task for serial I/O (SHLST1)

L029FC:

; --------------------------------------------------------------
;*/beginoverlay
FS_FIX:
	MOVEA.L	4(A4),A4 	; get address after link

	CMPI.B	#$46,D0		; FS.HEADS
	BEQ.S	FS_FIX1

	CMPI.B	#$49,D0		; FS.SAVE
	BNE.S	FS_FIX2

FS_FIX1:
	BSR.S	CLRALL

FS_FIX2:
	JSR	(A4)		; call I/O device driver to
				; execute TRAP #3 with D0
	CMPI.B	#$47,$13(A0)	; FS.HEADR
	BEQ.S	FS_FIX3

	CMPI.B	#$48,$13(A0)	; FS.LOAD
	BNE.S	MSG_FIX1

FS_FIX3:
	BRA	CLRALL

MSG_FIX:
	movem.l	d0-d2/a0,-(a7)
	moveq	#0,d0
	trap	#1
	move.l	$14A(a0),a2
	move.w	0(a2,d5.w),d5
	lea	0(a2,d5.w),a2
	movem.l	(a7)+,d0-d2/a0

MSG_FIX1:
	rts

;*/endoverlay
; --------------------------------------------------------------

; --------------------------------------------------------------
;*/beginoverlay
;*/beginfilling
NOP02FAE:
	DCB.w	($2FAE-(NOP02FAE-ORGN))/2,$4E71
L02FAE:
;*/endfilling
;*/endoverlay
; --------------------------------------------------------------
; allocate common heap
MM_ALCHP:
	LEA	$08(A6),A0	;SV.CHPFR First free space
				; in common heap area
	MOVEQ	#$0F,D2
	JSR	L03106(PC)	;*/undomodify BSR L03106
				; allocate area in heap
				; (D1 bytes)
	BLT.S	L02FD6
	LEA	$4(A6),A2	;SV.CHEAP Base of common
				; heap area
	CMPA.L	A1,A2
	BEQ.S	L02FC6
	CLR.L	$0008(A1)
L02FC6:
	MOVE.L	D1,D0
	ADDQ.W	#4,A0		;*/undomend ADDQ.L #4,A0
	SUBQ.L	#4,D0
; --------------------------------------------------------------
;*/beginundoinsert
;	BCLR	#2,$28002	; This flag bit has  been
				; added to provide
;	BNE.S	L0HILF		; memory allocation without
				; destroying data
;*/endundoinsert
; --------------------------------------------------------------
L02FCC:
	CLR.L	(A0)+
	SUBQ.L	#4,D0
	BGT.S	L02FCC
	SUBA.L	D1,A0		; A0= base of reserved space
	BRA.S	L02FF8
; --------------------------------------------------------------
;*/beginundoinsert
L0HILF:
;	CLR.L	(A0)+
;	CLR.L	(A0)+
;	SUBQ.L	#8,D0
;	ADD.L	D0,A0
;	SUBA.L	D1,A0
;	MOVEQ	#0,D0
;	BRA.S	L02FF8
;*/endundoinsert
; --------------------------------------------------------------
; allocate memory in transient program area
L02FD6:
	MOVE.L	D1,-(A7)
	ADDA.L	(A0),A1
	CMPA.L	$0C(A6),A1	;SV.FREE    Base of free
				; area
	BNE.S	L02FE2
	SUB.L	(A0),D1
L02FE2	JSR	L0324E(PC)	;*/undomodify BSR L0324E
	BNE.S	L02FF6
	SUBA.L	D1,A0
	LEA	$8(A6),A1	;SV.CHPFR   First free space
				; in common heap area
	JSR	L0315E(PC)	;*/undomodify BSR L0315E
	MOVE.L	(A7)+,D1
	BRA.S	MM_ALCHP
L02FF6	ADDQ.W	#4,A7		;*/undomend ADDQ.L #4,A7
L02FF8	RTS
RESERVD1 ; reserve D1 bytes in transient programm area
	LEA	$18(A6),A0	;SV.TRNFR First free space
				; in Trans. Prog. Area
	MOVEQ	#$0F,D2
	MOVEQ	#1,D0
	JSR	L03134(PC)	;*/undomodify BSR L03134
	TST.L	D2
	BGT.S	L03032
	MOVE.L	D1,-(A7)
	LEA	$14(A6),A1	; base of transient program
				; area
	ADDA.L	4(A1),A1
	CMPA.L	$14(A6),A1	; base of transient program
				; area
	BNE.S	L0301C
	SUB.L	(A1),D1
L0301C	JSR	L031B8(PC)	;*/undomodify BSR L031B8
				; allocate memory
	BNE.S	L0305A
	SUB.L	D1,$14(A6)	; base of transient program
				; area
	LEA	$18(A6),A1	; first free space in
				; transient program area
	JSR	L0315E(PC)	;*/undomodify BSR L0315E
	MOVE.L	(A7)+,D1
	BRA.S	RESERVD1
L03032	MOVEA.L	A2,A0
	ADDA.L	4(A2),A0
	MOVE.L	(A0),D3
	CMP.L	D1,D3
	BGT.S	L0304E
	MOVE.L	4(A0),D3
	BEQ.S	L03048
	ADD.L	A0,D3
	SUB.L	A2,D3
L03048	MOVE.L	D3,$0004(A2)
	BRA.S	L03056
L0304E	SUB.L	D1,D3
	MOVE.L	D3,(A0)
	ADDA.L	D3,A0
	MOVE.L	D1,(A0)
L03056	MOVEQ	#0,D0
	RTS
L0305A	ADDQ.W	#4,A7		;*/undomend ADDQ.L #4,A7
	RTS
MM_RECHP:
	MOVE.L	(A0),D1
	LEA	8(A6),A1 	; first free space in common
				; heap aerea
	JSR	L0315E(PC)	;*/undomodify BSR L0315E
	MOVE.L	(A1),D2
	ADDA.L	D2,A1
	CMPA.L	$0C(A6),A1	;SV.FREE    Base of free
				; area
	BNE.S	L03088
	MOVE.L	D2,D1
	JSR	L03282(PC)	;*/undomodify BSR L03282
	SUB.L	D1,D2
	BEQ.S	L03084
	ADDA.L	$0004(A2),A2
	MOVE.L	D2,(A2)
	BRA.S	L03088
L03084	CLR.L	4(A2)
L03088	MOVEQ	#0,D0
	RTS
RELE_MEM ; release memory
	MOVE.L	(A0),D1
	LEA	$18(A6),A1	; first free space in
				; transient prog. area
	JSR	L0315E(PC)	;*/undomodify BSR L0315E
	LEA	$14(A6),A2	; base of transient program
				; area
	ADDA.L	4(A2),A2
	CMPA.L	$14(A6),A2	;SV.TRNSP   Base of
				; transient program area
	BNE.S	L030DE
	MOVE.L	4(A2),-(A7)
	MOVE.L	(A2),D2
	MOVE.L	D2,D1
	JSR	L031C8(PC)	;*/undomodify BSR L031C8
				; release memory
	ADD.L	D1,$14(A6)	;SV.TRNSP   Base of
				; transient program area
	SUB.L	D1,D2
	BEQ.S	L030D2
	MOVEA.L	(A7)+,A1
	ADDA.L	D1,A2
	ADD.L	D1,$18(A6)	;SV.TRNFR   First free space
				; in TPA
	MOVE.L	D2,(A2)
	CLR.L	8(A2)
	MOVE.L	A1,$0004(A2)
	BEQ.S	L030DE
	SUB.L	D1,4(A2)
	BRA.S	L030DE
L030D2	MOVE.L	(A7)+,D2
	BEQ.S	L030DA
	ADD.L	$18(A6),D2	;SV.TRNFR   First free space
				; in TPA
L030DA	MOVE.L	D2,$18(A6)	;SV.TRNFR   First free space
				; in TPA
L030DE	RTS
MT_FREE:
	MOVEQ	#1,D0
	MOVEQ	#0,D1
	LEA	$18(A6),A0	; first free space in
				; transient prog. area
	JSR	L03134(PC)	;*/undomodify BSR.S L03134
				;*/undomodify nop
	MOVEA.L	$10(A6),A0	; base of basic stack
	SUBA.W	#$200,A0 	;*/undomend SUBA.L #$200,A0
	SUBA.L	$C(A6),A0	; base of free area
	MOVE.L	A0,D1
	CMP.L	D1,D2
	BLE.S	L03100
	MOVE.L	D2,D1
L03100	BRA	RET_CLD0
MM_ALLOC ; allocate D1 bytes in A0
	MOVEQ	#7,D2
L03106	MOVEQ	#0,D0
	JSR	L03134(PC)	;*/undomodify BSR.S L03134
				;*/undomodify nop
	CMP.L	D1,D2
	BEQ.S	L03122
	BGT.S	L03116
	MOVEQ	#-3,D0		;out of memory
	RTS
L03116	ADD.L	D1,4(A1)
	MOVEA.L	A0,A1
	ADDA.L	D1,A1
	SUB.L	D1,D3
	MOVE.L	D3,(A1)
L03122	MOVE.L	$0004(A0),D2
	BEQ.S	L0312C
	ADD.L	A0,D2
	SUB.L	A1,D2
L0312C	MOVE.L	D2,$0004(A1)
	MOVE.L	D1,(A0)
	RTS
L03134	; general memory allocation
	SUBQ.W	#4,A0		;*/undomend SUBQ.L #4,A0
	ADD.L	D2,D1
	NOT.B	D2
	AND.B	D2,D1
	MOVEQ	#0,D2
	MOVEA.L	D2,A2
L03140	MOVEA.L	A0,A1
	MOVE.L	4(A0),D3
	BEQ.S	L0315C
	ADDA.L	D3,A0
	MOVE.L	(A0),D3
	CMP.L	D1,D3
	BLT.S	L03140
	MOVEA.L	A1,A2
	CMP.L	D2,D3
	BLE.S	L03158
	MOVE.L	D3,D2
L03158	TST.B	D0
	BNE.S	L03140
L0315C	RTS
; link free space to task
L0315E	CLR.L	8(A0)
MM_LNKFR:
	SUBQ.W	#4,A1		;*/undomend SUBQ.L #4,A1
	SUBA.L	A2,A2
L03166	MOVEA.L	A2,A3
	MOVEA.L	A1,A2
	MOVE.L	$0004(A1),D2
	BEQ.S	L0317A
	ADDA.L	D2,A1
	CMPA.L	A0,A1
	BLE.S	L03166
	SUBA.L	A0,A1
	BRA.S	L0317C
L0317A	MOVEA.L	D2,A1
L0317C	MOVE.L	A0,D2
	SUB.L	A2,D2
	MOVE.L	D2,$0004(A2)
	MOVE.L	D1,(A0)+
	MOVE.L	A1,(A0)
L03188	MOVEA.L	A2,A1
	MOVEA.L	A3,A2
L0318C	MOVE.L	4(A1),D2

	ifd	DoCache
; --------------------------------------------------------------
;*/beginoverlay
	beq.s	L0315C		;*/modify BEQ.S  L031B6
	endif
	ifnd	DoCache
	BEQ.S	L031B6
	endif

	MOVEA.L	A2,A3
	MOVEA.L	A1,A2
	ADDA.L	D2,A1
	MOVE.L	A3,D2
	BEQ.S	L0318C
	MOVE.L	(A2),D2
	ADD.L	A2,D2
	CMP.L	A1,D2
	BNE.S	L0318C
	MOVE.L	4(A1),D2
	BEQ.S	L031AC
	ADD.L	(A2),D2
L031AC	MOVE.L	D2,4(A2)
	MOVE.L	(A1),D2
	ADD.L	D2,(A2)
	BRA.S	L03188

	ifd	DoCache
				;*/removecode L031B6   RTS
	endif
	ifnd	DoCache
L031B6	RTS
	endif

L031B8	; test against memory base, used to allocate memory
	JSR	L0323A(PC)	;*/undomodify BSR  L0323A

	ifd	DoCache
	bne.s	L0315C		;*/modify BNE.S  L031DE
	endif
	ifnd	DoCache
	BNE.S	L031DE
	endif

	BSR.S	L031E0
L031C0	MOVE.L	(A1)+,(A0)+
	SUBQ.L	#4,D0
	BNE.S	L031C0
	BRA.S	L031DE
L031C8	; test against top of memory, used to release memory
	JSR	L03276(PC)	;*/undomodify BSR L03276
	NEG.L	D1

	ifd	DoCache
	beq.s	L0315C		;*/modify BEQ.S L031DE
	endif
	ifnd	DoCache
	BEQ.S	L031DE
	endif

	BSR.S	L031E0
	NEG.L	D1
	ADDA.L	D0,A0
	ADDA.L	D0,A1
L031D8	MOVE.L	-(A1),-(A0)
	SUBQ.L	#4,D0
	BNE.S	L031D8

	ifd	DoCache
L031DE:
	bra	CLRALL		;*/modify L031DE	 RTS
;*/endoverlay
; --------------------------------------------------------------
	endif
	ifnd	DoCache
L031DE	RTS
	endif

; update A6 and A7 for Basic
L031E0:
	MOVEA.L	$68(A6),A3	; SV.JBBAS Pointer to base
				; of job table
	MOVE.L	A0,(A3)
	ADDA.L	D1,A0
	SUB.L	D1,$58(A0)
	SUB.L	D1,$5C(A0)
	MOVEA.L	A0,A1
	SUBA.L	D1,A0
	MOVE.L	$14(A6),D0	; SV.TRNSP Base of
				; transient program area
	SUB.L	A1,D0
	CMPA.L	$64(A6),A3	; SV.JBPNT Pointer to
				; current job table entry
	BNE.S	L0320A
	SUB.L	D1,8(A5)
	MOVE.L	USP,A3
	SUBA.L	D1,A3
	MOVE.L	A3,USP
L0320A	RTS
L0320C	ADDI.L	#$1FF,D1 	; 512 bytes round
L03212	ANDI.W	#$FE00,D1	;*/undomend ANDI.L#$FFFFFE00
				;*/note high word unaltered
	RTS
; calculate new position of server block
L03218:
	MOVEA.L	$10(A6),A0	;SV.BASIC Base o BASIC stack
	MOVEQ	#-8,D3
	BRA.S	L03226
L03220:
	MOVEA.L	$0C(A6),A0	;SV.FREE Base of free area
	MOVEQ	#8,D3
L03226:
	MOVE.L	A0,D0
	SUB.L	A6,D0
	LSR.L	#6,D0		; number of 512 byte  blocks
	MOVEA.L	$58(A6),A1	; SV.BTBAS Pointer to base
				; of slave block table
	ADDA.L	D0,A1		;*/mend ADDA.W D0,A1
	MOVE.L	D1,D0
	LSR.L	#6,D0		; /512
	LSR.L	#3,D0
	RTS
; Expand BASIC area and update server block
L0323A:
	BSR.S	L0320C
	BSR.S	L03218
	SUBA.L	D1,A0
; do we intrude beyond SV.FREE - base of free area?
	CMPA.L	$0C(A6),A0	;*/undomodify
				; LEA -$200(A0),A2
				; CMPA.L $0C(A6),A2
				;*/note would be safer
	ble.s	L0329E
	MOVE.L	A0,$10(A6)	;SV.BASIC Base o BASIC stack
	ADDA.L	D3,A1
	bra.s	L03270
; Expand HEAP space and update server block
L0324E:
	BSR.S	L0320C
	BSR.S	L03220
	ADDA.L	D1,A0
; do we intrude beyond SV.BASIC - base of BASIC stack?
	CMPA.L	$10(A6),A0	;*/undomodify
				; LEA $200(A0),A2
				; CMPA.L $10(A6),A2
				;*/note would be safer
	bge.s	L0329E
	MOVE.L	A0,$0C(A6)	; SV.FREE Base of free area
	bra.s	L03270
L03260:
;?	CMP.L   $58(A6),A1 ; below base of slaveblock table ?
;?	BLT     L0329A
;?	CMP.L   $5C(A6),A1 ; behind top of slaveblock table ?
;?	BGE     L0329A
	MOVEQ	#$0C,D2
	AND.B	(A1),D2
	BEQ.S	L0326C
	JSR	L0352A(PC)	;*/undomodify BSR L0352A
				; forced slaving ?
	BRA.S	L03260
L0326C:
	CLR.B	(A1)		; mark server block as
				; unavailable
	ADDA.W	D3,A1		;*/undomend ADDA.L D3,A1
L03270:
	DBF	D0,L03260
	bra.s	L0329A
L03276:
	BSR.S	L03212
	BSR.S	L03218
	ADD.L	D1,A0
	MOVE.L	A0,$10(A6)	;SV.BASIC Base of BASIC
				; stack
	bra.s	L03296
; reclaim slave blocks
L03282:
	BSR.S	L03212
	BSR.S	L03220
	SUBA.L	D1,A0
	MOVE.L	A0,$0C(A6)	;SV.FREE Base of free area
	SUBA.W	D3,A1		;*/undomend SUBA.L D3,A1
	BRA.S	L03296
L03290:
	MOVE.B	#1,(A1)
	SUBA.W	D3,A1		;*/undomend SUBA.L D3,A1
L03296:
	DBF	D0,L03290
L0329A:
	MOVEQ	#0,D0
	BRA.S	L032A0
L0329E:
	MOVEQ	#-3,D0		; out of memory error
L032A0:
	RTS
; ***********************************************************
; * TRAP #2 , I/O open, close, format calls		      *
; ***********************************************************
DO_TRAP2 ; supervisor of TRAP 2
	MOVEA.L	$64(A6),A1	;SV.JBPNT   Pointer to
				; current job table entry
	MOVEA.L	(A1),A1		; base of job table
	BCLR	#7,$16(A1)	; Relative addressing (TRAP
				; #4 ?)
	BEQ.S	L032B4
	ADDA.L	8(A5),A0 	; add A6 of Basic to A0 (A5
				; points to saved regs)
L032B4	SUBQ.B	#1,D0
	BEQ.S	IO_OPEN
	SUBQ.B	#1,D0
	BEQ	IO_CLOSE
	SUBQ.W	#1,D0
	BEQ	IO_FORMT
	SUBQ.W	#1,D0
	BEQ	IO_DELET
	MOVEQ	#-15,D0		; Bad parameter error
	BRA	RET_TRAP
L032D0:
IO_OPEN:
; --------------------------------------------------------------
*/beginundoinsert
; The code that had been inserted here was to provide a
; searchlist for all OPEN_IN (old file) calls.
; The routine first tried the supplied name, and if the file
; was not found, it then tried the following paths:
; RAM1_ ,RAM2_ , FLP1_ , FLP2_ , JAN1_
*/endundoinsert
; --------------------------------------------------------------
	MOVEM.L	A1-A4,-(A7)	;*/undomend MOVEM.L D7/A1-A4,-(A7)
	MOVEA.L	A0,A1
	JSR	GETJOBID(PC)	;*/undomodify BSR GETJOBID
				; Base address of job -> A0
	EXG	A0,A1		; channel ID -> A0 / Job
				; address -> A1
	MOVEA.L	$78(A6),A3	;SV.CHBAS   Pointer to base
				; of channel table
L032E0	TST.B	(A3)
	BLT.S	L032F0
	ADDQ.W	#4,A3		;*/undomend ADDQ.L #4,A3
	CMPA.L	$7C(A6),A3	;SV.CHTOP Pointer to top of
				; channel table
	BLT.S	L032E0
	MOVEQ	#-6,D0		; channel not found error
	BRA.S	L0334C		; return
L032F0	MOVEA.L	$44(A6),A2	;SV.DRLST Pointer to list of
				; device drivers
L032F4	MOVEM.L	D1-D7/A1-A6,-(A7)
	LEA	-$18(A2),A3
	MOVEA.L	8(A2),A4
	JSR	(A4)
	MOVEM.L	(A7)+,D1-D7/A1-A6
	TST.L	D0
	BEQ.S	L0331E
	CMPI.W	#-7,D0		; not found error
	BNE.S	L0334C		; return if not -7
	MOVEA.L	(A2),A2		; try next device driver
	MOVE.L	A2,D0
	BGT.S	L032F4		; continue
	JSR	L0355A(PC)	;*/undomodify BSR L0355A
				; now check Directory device
				; drivers
	TST.L	D0
	BNE.S	L0334C		; return with this result
L0331E	; channel opened without error
	MOVE.L	A0,(A3)
	MOVE.W	$70(A6),D2	;SV.CHTAG   Current value of
				; channel tag
	ADDQ.W	#1,$70(A6)	; increment channel tag
	ADDQ.W	#4,A0		;*/undomend ADDQ.L #4,A0
	MOVE.L	A2,(A0)+ 	; store address of driver
	MOVE.L	D1,(A0)+ 	; owner job
	MOVE.L	A3,(A0)+ 	; address to be sent when
				; space released
	MOVE.W	D2,(A0)+ 	; store channel Tag= channel
				; ID
	CLR.W	(A0)+		; clear status (OK) and
				; action for waiting job
	CLR.L	(A0)+		; job waiting on IO
	SWAP	D2
	SUBA.L	$78(A6),A3	;SV.CHBAS Pointer to base of
				; channel table
	MOVE.W	A3,D2
	LSR.W	#2,D2
	MOVEA.L	D2,A0
	CMP.W	$72(A6),D2	;SV.CHMAX Highest current
				; channel number
	BLS.S	L0334C
	MOVE.W	D2,$72(A6)	; update Highest current
				; channel number
L0334C	MOVEM.L	(A7)+,A1-A4	;*/undomend MOVEM.L (A7)+,D7/A1-A4
	BRA.S	L03378		;*/undomodify RTS
IO_CLOSE:
	MOVE.L	A0,D7		; Store channel ID
	JSR	L03476(PC)	;*/undomodify BSR L03476
				; verify channel ID and get
				; linkage block of ID
	MOVEM.L	D1-D7/A1-A6,-(A7)
	MOVEA.L	4(A0),A4 	; Address of driver for
				; channel
	LEA	-$18(A4),A3	; get start of linkage block
				; (including all)
	MOVEA.L	$C(A4),A4	; close routine of driver
	JSR	(A4)		; call close routine of
				; driver
	MOVEM.L	(A7)+,D1-D7/A1-A6
	LSL.W	#2,D7		; stored channel ID*4
	MOVEA.L	$78(A6),A0	;SV.CHBAS   Pointer to base
				; of channel table
	ADDA.W	D7,A0		; get address of channel def
				; block pointer
	ST	(A0)		; set flag for closed
				; channel
L03378	BRA	RET_TRAP
; --------------------------------------------------------------
;  TRAP #3 handling
; --------------------------------------------------------------
;*/beginoverlay
	ifd	NoTas
L0337C:
DO_TRAP3:
	MOVE.L	A0,D7
	BSR	L03476		;*/modify JSR $3476(PC)
				; verify channel ID and get
				; linkage block for ID
	BSET	#7,$12(A0)	;*/mend TAS $12(A0)
				;*/note won't work on AMIGA
	BNE	o03414
	MOVEM.L	D2-D7/A2-A6,-(A7)
	CLR.L	-(A7)
	ANDI.L	#$7F,D0
	CMPI.B	#$49,D0		; highest possible routine
				; number
	BGT.S	o033B0
	CMPI.B	#$46,D0		; FS.HEADS / FS.HEADR /
				; FS.LOAD / FS.SAVE
	BGE.S	o033AE
	CMPI.B	#$07,D0		; separate SD.xx (screen
				; output) calls
	BGT.S	o033B0
	BTST	#1,D0
	BEQ.S	o033B0
o033AE:
	MOVEQ	#0,D1
o033B0:
	MOVEA.L	$64(A6),A3	; pointer to current
				; jobtable entry
	MOVEA.L	(A3),A3		; get job control block
	BCLR	#7,$16(A3)	; relative addressing flag
	BEQ.S	o033C4
	MOVE.L	8(A5),(A7)
	ADDA.L	(A7),A1
o033C4:
	MOVEA.L	4(A0),A4 	; address of I/O driver
	MOVE.B	D0,$13(A0)	;store action for waiting
				; job as D0 at call time
	MOVEQ	#0,D3
	LEA	-$18(A4),A3
;	 MOVEA.L  4(A4),A4	 ; get address after link
;	 JSR	 (A4)		 ; call I/O device driver to
				; execute TRAP #3 with D0
	bsr	FS_FIX		;*/mend
	nop

	SUBA.L	(A7),A1
	CMPI.W	#-1,D0		; error ?
	BNE.S	o03422
	MOVE.W	$A(A7),D3
	BEQ.S	o03422
	MOVEA.L	$2C(A7),A6
	BSR	JOBID_ME
	MOVE.L	D0,$14(A0)	; job status
	LEA	$12(A0),A0	; jobs accumulated priority
	TST.L	(A7)+
	BNE.S	o033FC
	ST	(A0)
o033FC:
	MOVE.L	A0,$C(A3)
	MOVE.W	D3,$14(A3)
	SF	$12(A3)
	MOVEQ	#-1,D0
	MOVEM.L	(A7)+,D2-D7/A2-A6
o0340E:
	MOVEA.L	D7,A0
	BRA	L00936
o03414:
	TST.W	D3
	BEQ.S	o0341E
	SUBQ.L	#2,$000E(A7)
	BRA.S	o0340E
o0341E:
	MOVEQ	#-$01,D0
	BRA.S	o0342C
o03422:
	ADDQ.L	#4,A7
	MOVEM.L	(A7)+,D2-D7/A2-A6
	SF	$12(A0)		; jobs accumulated priority
o0342C:
	MOVEA.L	D7,A0
	BRA.S	L0347C		;*/modify BRA RET_TRAP
				;*/note to save space only
; --------------------------------------------------------------
;  TRAP #4
; --------------------------------------------------------------
L03432:
DO_TRAP4:
	MOVE.L	A3,-(A7)
	MOVEA.L	$64(A6),A3	;SV.JBPNT   Pointer to
				; current job table entry
	MOVEA.L	(A3),A3
	BSET	#7,$16(A3)	;*/mend TAS $16(A3)
				;*/note won't work on AMIGA
	MOVEA.L	(A7)+,A3
	BRA.S	L0347C		;*/modify BRA RET_TRAP
				;*/note to save space only
	endc
	ifnd	NoTas
L0337C:
DO_TRAP3:
	MOVE.L	A0,D7
	JSR	L03476(PC)
	TAS	$12(A0)
	BNE	L03414
	MOVEM.L	D2-D7/A2-A6,-(A7)
	CLR.L	-(A7)
	ANDI.L	#$7F,D0
	CMPI.B	#$49,D0
	BGT.S	L033B0
	CMPI.B	#$46,D0
	BGE.S	L033AE
	CMPI.B	#$07,D0
	BGT.S	L033B0
	BTST	#1,D0
	BEQ.S	L033B0
L033AE:
	MOVEQ	#0,D1
L033B0:
	MOVEA.L	$64(A6),A3
	MOVEA.L	(A3),A3
	BCLR	#7,$16(A3)
	BEQ.S	L033C4
	MOVE.L	8(A5),(A7)
	ADDA.L	(A7),A1
L033C4:
	MOVEA.L	4(A0),A4
	MOVE.B	D0,$13(A0)
	MOVEQ	#0,D3
	LEA	-$18(A4),A3
	MOVEA.L	4(A4),A4
	JSR	(A4)
	SUBA.L	(A7),A1
	CMPI.W	#-1,D0
	BNE.S	L03422
	MOVE.W	$A(A7),D3
	BEQ.S	L03422
	MOVEA.L	$2C(A7),A6
	JSR	JOBID_ME(PC)
	MOVE.L	D0,$14(A0)
	LEA	$12(A0),A0
	TST.L	(A7)+
	BNE.S	L033FC
	ST	(A0)
L033FC:
	MOVE.L	A0,$C(A3)
	MOVE.W	D3,$14(A3)
	SF	$12(A3)
	MOVEQ	#-1,D0
	MOVEM.L	(A7)+,D2-D7/A2-A6
L0340E:
	MOVEA.L	D7,A0
	BRA	L00936
L03414:
	TST.W	D3
	BEQ.S	L0341E
	SUBQ.L	#2,$000E(A7)
	BRA.S	L0340E
L0341E:
	MOVEQ	#-$01,D0
	BRA.S	L0342C
L03422:
	ADDQ.L	#4,A7
	MOVEM.L	(A7)+,D2-D7/A2-A6
	SF	$12(A0)
L0342C:
	MOVEA.L	D7,A0
	BRA.L	RET_TRAP
; --------------------------------------------------------------
;  TRAP #4
; --------------------------------------------------------------
L03432:
DO_TRAP4:
	MOVE.L	A3,-(A7)
	MOVEA.L	$64(A6),A3
	MOVEA.L	(A3),A3
	TAS	$16(A3)
	MOVEA.L	(A7)+,A3
	BRA	RET_TRAP
	endc
*/endoverlay
; --------------------------------------------------------------
; verify wether channel is open and belongs to job
L03444:
	MOVE.L	A0,-(A7)
	MOVE.L	D0,-(A7)
	MOVE.L	A0,D0
	CMP.W	$72(A6),D0	;SV.CHMAX Highest current
				; channel number
	BHI.S	L0346E		; -> Channel not found
	LSL.W	#2,D0
	MOVEA.L	$78(A6),A0	;SV.CHBAS Pointer to base of
				; channel table
	ADDA.W	D0,A0
	TST.B	(A0)		; channel closed ?
	BLT.S	L0346E		; -> Channel not found
	MOVEA.L	(A0),A0		; get linkage block of
				; channel
	SWAP	D0
	CMP.W	$10(A0),D0	; TAG for job
	BNE.S	L0346E
	MOVE.L	(A7)+,D0
	ADDQ.W	#4,A7		;*/undomend ADDQ.L #4,A7
	CMP.B	D0,D0
L0346C:
	RTS
L0346E:
	ADDQ.W	#4,A7		;*/undomend ADDQ.L #4,A7
	MOVEQ	#-6,D0		; channel not found
	MOVEA.L	(A7)+,A0
	RTS
L03476:
	BSR.S	L03444		; verify channel ID and get
				; linkage block for ID
	BEQ.S	L0346C
	ADDQ.W	#4,A7		;*/undomend ADDQ.W #4,A7
L0347C:
	BRA	RET_TRAP
SHLST2	DC.L	0		; last item in list of
				; scheduler tasks
	DC.L	L03488-ORG0
L03488	MOVEA.L	$74(A6),A1	; pointer to last channel
				; checked
	MOVEA.W	$72(A6),A2	; highest current channel
				; number
	ADDA.W	A2,A2
	ADDA.W	A2,A2
	ADDA.L	$78(A6),A2	; pointer to base of channel
				; table
	MOVEA.L	A1,A3
L0349A	ADDQ.W	#4,A1		;*/undomend ADDQ.L #4,A1
	CMPA.L	A2,A1
	BLE.S	L034A4
	MOVEA.L	$78(A6),A1	; pointer to base of channel
				; table
L034A4	TST.B	(A1)
	BLT.S	L034B0
	MOVEA.L	(A1),A0
	MOVE.B	$12(A0),D4	; jobs accumulated priority
	BNE.S	L034B6
L034B0	CMPA.L	A1,A3
	BNE.S	L0349A
	BRA.S	L03522
L034B6:
	MOVE.L	A1,$74(A6)	;SV.CHPNT   Pointer to last
				; channel checked
				;*/undoinsert MOVEQ #0,D1
				;*/note not necessary
	MOVE.L	$14(A0),D1	;*/undomodify MOVE.W $16(A0),D1
	LSL.W	#2,D1		;*/undomodify LSL.L #2,D1
	MOVEA.L	$68(A6),A4	;SV.JBBAS   Pointer to base
				; of job table
	ADDA.W	D1,A4		;*/undomend ADDA.L D1,A4
				;*note D1 sign exten long
	TST.B	(A4)
	BLT.S	L03524
	MOVEA.L	(A4),A4
	SWAP	D1		;*/undomodify MOVE.W $14(A0),D1
	CMP.W	$10(A4),D1
	BLT.S	L03524
	MOVEQ	#0,D0
	MOVE.B	$13(A0),D0	; jobs priority increment
	MOVEQ	#-1,D3
	MOVEM.L	$0024(A4),D1-D2
	MOVEM.L	$0044(A4),A1-A2
	MOVE.L	A4,-(A7)
	CLR.L	-(A7)
	ADDQ.B	#1,D4
	BEQ.S	L034F6
	MOVE.L	$0058(A4),(A7)
	ADDA.L	(A7),A1
L034F6:
	MOVEA.L	$0004(A0),A4
	LEA	-$0018(A4),A3
	MOVEA.L	$0004(A4),A4
	JSR	(A4)
	SUBA.L	(A7)+,A1
	MOVEA.L	(A7)+,A4
	MOVE.L	D1,$0024(A4)
	MOVE.L	A1,$0044(A4)
	CMPI.B	#$FF,D0
	BEQ.S	L03522
	MOVE.L	D0,$0020(A4)
	CLR.B	$12(A0)		; jobs accumulated priority
	CLR.W	$14(A4)		; job status = not suspended
L03522	RTS
L03524	CLR.B	$12(A0)		; jobs accumulated priority
	RTS
L0352A	; used to switch MDV Motor on
	MOVEM.L	D0-D3/A0-A4,-(A7)
	MOVEQ	#0,D1
	MOVE.B	(A1),D1
	LSR.B	#4,D1
	LSL.B	#2,D1
	LEA	$100(A6),A2	; SV.FSDEF pointer to file
				; system physical def.
	MOVEA.L	0(A2,D1.W),A2
	MOVEA.L	$10(A2),A4
	LEA	-$18(A4),A3
	MOVEA.L	$10(A4),A4
	JSR	(A4)
	MOVEM.L	(A7)+,D0-D3/A0-A4
	RTS
IO_DELET ; Delete file which channel ID is in A0
	ST	D3		; signal DELETE operation
	BSR.S	L03564		; and continue like OPEN
	BRA	RET_TRAP
; IO_OPEN continue for directory device drivers
L0355A:
	CMPI.B	#4,D3		; 5 possible parameters : 2
				; old, 2 new, dir
	BLS.S	L03564
	MOVEQ	#-15,D0		; bad parameter
	RTS
L03564:
	MOVEM.L	D1-D6/A3-A6,-(A7)
	MOVEA.L	A0,A5
	MOVE.L	#$A0,D1		; allocate 160 bytes
	JSR	MM_ALCHP(PC)	;*/undomodify BSR MM_ALCHP
	BNE	L0368A
	ADDA.W	#$18,A0		;*/undomend ADDA.L #$18,A0
				;*/note #$18 sign exten long
	LEA	$140(A6),A1	;SV.FSLIST pointer to list
				; of file channel defs.
	JSR	UT_LINK(PC)	;*/undomodify BSR UT_LINK
	LEA	(A5),A1
	JSR	L036D4(PC)	;*/undomodify BSR L036D4
	BNE	L0366E		; give back allocated space
				; for channel
	MOVEQ	#$0F,D2
	MOVEQ	#-1,D0
	LEA	$140(A6),A4	;SV.FSLIST pointer to list
				; of file channel defs.
L03596:
	MOVE.L	-(A4),D3
	BNE.S	L0359E
	MOVE.W	D2,D0		; highest number so far
	BRA.S	L035AC
L0359E:
	MOVEA.L	D3,A1
	CMP.B	$14(A1),D1
	BNE.S	L035AC
	CMPA.L	$10(A1),A2
	BEQ.S	L035DC
L035AC:
	DBF	D2,L03596	; continue with next number
	MOVE.W	D0,D2
	BLT	L0366C		; no number found
	MOVEM.L	D1-D2/A0/A2,-(A7)
	MOVE.L	$20(A2),D1
	JSR	MM_ALCHP(PC)	;*/undomodify BSR MM_ALCHP
	MOVEM.L	(A7)+,D1-D2/A1-A2
	EXG	A0,A1
	BNE	L0366E		; give back allocated space
				; in case of error
	MOVE.L	A2,$10(A1)
	MOVE.B	D1,$14(A1)
				;*/undoinsert CLR.L D0
	MOVE.W	D2,D0
	LSL.W	#2,D0		;*/undomodify LSL.L #2,D0
	ADDA.W	D0,A4		;*/undomend ADDA.L D0,A4
				;*/note D0 sign exten long
	MOVE.L	A1,(A4)
L035DC:
	MOVE.B	D2,5(A0)
	MOVE.B	$B(A7),4(A0)
	LEA	$1A(A0),A4
	MOVE.W	(A5)+,D0 	; get legth of filename
				;*/undoinsert CLR.L D3
	MOVE.W	$24(A2),D3
	ADDQ.W	#2,D3		;*/undomodify ADDQ.L #2,D3
	ADDA.W	D3,A5		;*/undomnd ADDA.L D3,A5
				;*/note D3 sign exten long
	SUB.W	D3,D0
	BLT.S	L03660		; -> bad name error
	CMPI.W	#$24,D0		; length of filename too
				; long ?
	BGT.S	L03660		; -> bad name error
	MOVE.W	D0,(A4)+
	BRA.S	L03604
L03602:
	MOVE.B	(A5)+,(A4)+	; copy filename
L03604:
	DBF	D0,L03602
	MOVEA.L	A1,A5
	MOVEA.L	A0,A1
; look for device driver with supplied name
L0360C:
	MOVEA.L	(A1),A1		; get next driver in list
	MOVE.L	A1,D0
	BEQ.S	L03652		; end of list
	CMP.B	5(A1),D2
	BNE.S	L0360C
	MOVEQ	#1,D0
	MOVEA.W	#$1A,A6		;*/undomend MOVEA.L #$1A,A6
				;*/note #$1A sign exten long
				; offset to filename
	JSR	UT_CSTR(PC)	;*/undomodify BSR UT_CSTR
				; compare strings
				; (A6,A0) - (A6,A1)
	MOVEA.L	$24(A7),A6	; restore A6
	BNE.S	L0360C		; try next driver
	CMPI.B	#2,4(A0) 	; open new file ? (mode 2)
	BEQ.S	L03664		; allready exists error
	CMPI.B	#1,4(A0) 	; open old file ? (mode 0
				; and 1)
	BNE.S	L03668		; in use error (old
				; exclusive)
	CMPI.B	#1,4(A1) 	; other file exclusive opend
				; ?
	BNE.S	L03668		; in use error
	MOVE.W	6(A1),6(A0)
	MOVE.L	$C(A1),$C(A0)
	MOVE.W	#$40,$A(A0)
L03652:
	MOVEA.L	A5,A1
	TST.W	6(A0)
	BEQ.S	L03690
	SUBA.W	#$18,A0		;*/undomend SUBA.L #$18,A0
				;*/note #$18 sign exten long
	BRA.S	L03684
L03660:
	MOVEQ	#-12,D0		; bad name error
	BRA.S	L0366E		; give back allocated space
L03664:
	MOVEQ	#-8,D0		; already exists error
	BRA.S	L0366E
L03668:
	MOVEQ	#-9,D0		; in use error
	BRA.S	L0366E
L0366C:
	MOVEQ	#-6,D0		; channel not found error
; give back allocated space in the case of an error
L0366E:
	LEA	$140(A6),A1	;SV.FSLIST pointer to list
				; of file channel defs.
	JSR	MT_UNLNK(PC)	;*/undomodify BSR MT_UNLNK
	SUBA.W	#$18,A0		;*/undomend SUBA.L #$18,A0
				;*/note #$18 sign exten long
	MOVE.L	D0,D4
	JSR	MM_RECHP(PC)	;*/undomodify BSR MM_RECHP
	MOVE.L	D4,D0
	BRA.S	L0368A
L03684:
	ADDQ.B	#1,$22(A1)
	MOVEQ	#0,D0
L0368A:
	MOVEM.L	(A7)+,D1-D6/A3-A6
	RTS
; Look for MDV directory
L03690:
	SUBA.W	#$18,A0		;*/undomend SUBA.L #$18,A0
				;*/note #$18 sign exten long
	MOVE.L	A1,-(A7)
	MOVE.L	A2,-(A7)
	LEA	-$18(A2),A3	; start of linkage block
	MOVEA.L	8(A2),A4 	; address to open a channel
	JSR	(A4)		; call open routine
	MOVEA.L	(A7)+,A2
	MOVEA.L	(A7)+,A1
	TST.B	$1C(A0)
	BLT.S	L036B0
	TST.L	D0
	BEQ.S	L03684
L036B0:
	ADDA.W  #$18,A0		;*/undomend ADDA.L #$18,A0
				;*/note #$18 sign exten long
				; if error, then give back
				; space
	BRA.S	L0366E		; give back allocated space
; Format medium (pointer to name in A0)
L036B6:
IO_FORMT:
	MOVEM.L	D3-D7/A1-A5,-(A7)
	MOVEA.L	A0,A1
	JSR	L036D4(PC)	;*/undomodify BSR.S L036D4
				;*/undomodify nop
	BLT.S	L036CC
	LEA	-$18(A2),A3
	MOVEA.L	$1C(A2),A4
	JSR	(A4)
L036CC:
	MOVEM.L	(A7)+,D3-D7/A1-A5
	BRA	RET_TRAP
; verify name
L036D4:
	MOVEM.L	A1/A4,-(A7)
	MOVEA.L	$48(A6),A2	;SV.DDLST Pointer to list of
				; directory device driver
L036DC:
	LEA	$24(A2),A4
	MOVE.W	(A4)+,D0
	MOVEA.L	(A7),A1
	ADDQ.W	#2,A1		;*/undomend ADDQ.L #2,A1
L036E6:
	MOVE.B	(A1)+,D1
	BCLR	#5,D1
	CMP.B	(A4)+,D1
	BNE.S	L036F6
	SUBQ.W	#1,D0
	BGT.S	L036E6
	BRA.S	L036FE
L036F6:
	MOVEA.L	(A2),A2
	MOVE.L	A2,D0
	BNE.S	L036DC
	BRA.S	L03718
L036FE:
	MOVEQ	#0,D1
	MOVE.B	(A1)+,D1
	SUBI.B	#$30,D1
	BLE.S	L03718
	CMPI.B	#$09,D1
	BGE.S	L03718
	CMPI.B	#$5F,(A1)
	BNE.S	L03718
	MOVEQ	#0,D0
	BRA.S	L0371A
L03718:
	MOVEQ	#-$07,D0
L0371A:
	MOVEM.L	(A7)+,A1/A4
	RTS
; align address in A2
L03720:
A0_EVEN:
	MOVE.L	A2,D2
	ADDQ.L	#1,D2
	BCLR	#0,D2
	MOVEA.L	D2,A2
	RTS
; analyse syntax
L0372C:
IO_NAME:
	MOVEA.L	(A7),A2
	ADDQ.W	#6,A2		;*/undomend ADDQ.L #6,A2
	MOVEM.L	D4/D7/A0/A3,-(A7)
	MOVEQ	#0,D7
	MOVE.W	(A0)+,D7
	ADD.L	A0,D7
	MOVE.W	(A2)+,D2
L0373C:
	BSR.S	L037B6
	CMP.B	(A2)+,D1
	BNE.S	L037A6
	SUBQ.B	#1,D2
	BNE.S	L0373C
	BSR.S	A0_EVEN
	MOVE.W	(A2)+,D4
	BRA.S	L03790
L0374C:
	BSR.S	A0_EVEN
	MOVE.B	(A2)+,D1
	BEQ.S	L03778
	BLT.S	L03760
	BSR.S	L037B6
	CMP.B	(A2)+,D1
	BEQ.S	L03762
	SUBQ.W	#1,A0		;*/undomend SUBQ.L #1,A0
	MOVE.W	(A2)+,(A3)+
	BRA.S	L03790
L03760:
	ADDQ.W	#1,A2		;*/undomend ADDQ.L #1,A2
L03762:
	MOVEA.L	A7,A1
	MOVE.W	(A2)+,-(A7)
	SUBA.L	A6,A0
	SUBA.L	A6,A1
	SUB.L	A6,D7
	JSR	CN_DTOI(PC)	;*/undomodify BSR CN_DTOI
	ADDA.L	A6,A0
	ADD.L	A6,D7
	MOVE.W	(A7)+,(A3)+
	BRA.S	L03790
L03778:
	MOVE.B	(A2)+,D2
	EXT.W	D2
				;*/undoinsert EXT.L D2
	ADDA.W	D2,A2		;*/undomend ADDA.L D2,A2
				;*/note D2 sign exten long
	MOVE.L	A2,-(A7)
	BSR.S	L037B6
L03782:
	CMP.B	-(A2),D1
	BEQ.S	L0378C
	SUBQ.W	#1,D2
	BNE.S	L03782
	SUBQ.W	#1,A0
L0378C:
	MOVE.W	D2,(A3)+
	MOVEA.L	(A7)+,A2
L03790:
	DBF	D4,L0374C
	CMP.L	A0,D7
	BNE.S	L0379C
	MOVEQ	#$04,D1
	BRA.S	L037AE
L0379C:
	MOVEM.L	(A7)+,D4/D7/A0/A3
	ADDQ.L	#2,(A7)
	MOVEQ	#-12,D0		; bad name
	RTS
L037A6:
	MOVEM.L	(A7)+,D4/D7/A0/A3
	MOVEQ	#-$07,D0
	RTS
L037AE:
	MOVEM.L	(A7)+,D4/D7/A0/A3
	ADDQ.L	#4,(A7)
	RTS
L037B6:
	MOVEQ	#0,D1
	CMP.L	A0,D7
	BEQ.S	L037C8
	MOVE.B	(A0),D1
	CMPI.B	#$60,D1
	BLT.S	L037C8
	SUBI.B	#$20,D1
L037C8:
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	RTS
; Direct file handling
L037CC:
IO_SERQ:
	LEA	$18(A0),A2	; Pointer to input queue
	CMPI.B	#3,D0
	BLS.S	L037D8
	ADDQ.W	#4,A2		;*/undomend ADDQ.L #4,A2
				; output operation
				; => output queue
L037D8:
	TST.L	(A2)
	BEQ.S	L037F0
	MOVEA.L	(A2),A2
	JSR	IO_SERIO(PC)	;*/undomodify BSR IO_SERIO
RLOC0C	DC.L	IO_QTEST-ORG0
	DC.L	IO_QOUT-ORG0
	DC.L	IO_QIN-ORG0	; put a byte (D1) into a
				; queue (A2)
	RTS
L037F0	MOVEQ	#-15,D0		; bad parameter
	RTS
; install file and place extensions
L037F4:
IO_QSET:
	LEA	$10(A2,D1.W),A3
	CLR.L	(A2)+
	MOVE.L	A3,(A2)+
	SUBQ.W	#1,A3		;*/undomend SUBQ.L #1,A3
	MOVE.L	A3,(A2)+
	MOVE.L	A3,(A2)+
	SUBA.L	#$10,A2
	RTS
L0380A:
IO_QTEST:
	MOVEQ	#-$11,D2
	ADD.L	4(A2),D2
	SUB.L	A2,D2
	MOVE.L	8(A2),D0
	MOVEA.L	12(A2),A3
	MOVE.B	(A3),D1
	SUB.L	A3,D0
	BGT.S	L03832
	BLT.S	L0382E
	TST.B	(A2)
	BLT.S	L0382A
	MOVEQ	#-1,D0		; not complete
	RTS
L0382A:
	MOVEQ	#-10,D0		; end of file error
	RTS
L0382E:
	ADD.L	D2,D0
	ADDQ.L	#1,D0
L03832:
	SUB.L	D0,D2
	MOVEQ	#0,D0
	RTS
; Put byte (D1) into queue (A2)
L03838:
IO_QIN:
	TST.B	(A2)
	blt.s	L0385A		;*/mend BNE.S    L0385A
	MOVEA.L	8(A2),A3
	MOVE.B	D1,(A3)+
	CMPA.L	4(A2),A3
	BLT.S	L0384C
	LEA	$0010(A2),A3
L0384C:
	CMPA.L	$000C(A2),A3
	BNE.S	L03856
	MOVEQ	#-1,D0
	RTS
L03856:
	MOVE.L	A3,$0008(A2)
L0385A:
	MOVEQ	#0,D0
	RTS
L0385E:
; --------------------------------------------------------------
;*/beginoverlay
	ifd	NoTas
IO_QOUT:
	MOVEA.L	$C(A2),A3
	CMPA.L	$8(A2),A3
	BNE.S	o03874		;*/modify BNE.S $3874
	TST.B	(A2)
	BLT.S	L0382A		;*/modify BLT.S $3870
	MOVEQ	#-1,D0		; not complete error
	RTS
L03870:
				;*/removecode MOVEQ #-$0A,D0
				;*/removecode RTS
o03874:
	MOVE.B	(A3)+,D1
	CMPA.L	$4(A2),A3
	BLT.S	o03880		;*/modify BLT.S $3880
	LEA	$10(A2),A3
o03880:
	MOVE.L	A3,$C(A2)
	MOVEQ	#0,D0
	RTS
o03888:
IO_QEOF:
	BSET	#7,(A2)		;*/mend TAS (A2)
				;*/note won't work on AMIGA
	RTS
;*/beginfilling
NOP0388C:
	DCB.w	($388C-(NOP0388C-ORGN))/2,$4E71
L0388C:
;*/endfilling
	endc
	ifnd	NoTas
IO_QOUT:
	MOVEA.L	$C(A2),A3
	CMPA.L	$8(A2),A3
	BNE.S	L03874
	TST.B	(A2)
	BLT.S	L03870
	MOVEQ	#-1,D0		; not complete error
	RTS
L03870:
	MOVEQ	#-$0A,D0
	RTS
L03874:
	MOVE.B	(A3)+,D1
	CMPA.L	$4(A2),A3
	BLT.S	L03880
	LEA	$10(A2),A3
L03880:
	MOVE.L	A3,$C(A2)
	MOVEQ	#0,D0
	RTS
L03888:
IO_QEOF:
	TAS	(A2)
	RTS
	endc
;*/endoverlay
; --------------------------------------------------------------
; after the BSR there must be 3 long words (test/fetch/send)
IO_SERIO:
	ADDI.L	#$C,(A7)
	MOVEA.L	(A7),A4
	MOVE.L	D2,D4
	MOVE.L	D1,D5
	CMPI.W	#$45,D0		; separate file read or
				; write operation
	BHI.S	L038B2
	CMPI.W	#7,D0		; Separate I/O call
	BHI.S	SERIO_BAdpar
	ANDI.L	#$0000FFFF,D4
	MOVE.B	L038C0(PC,D0.W),D0
	JMP	L038C0(PC,D0.W)
L038B2:
	CMPI.B	#$49,D0		; FS.SAVE is the last
				; defined routine number
	BHI.S	SERIO_BAdpar
	MOVE.B	L038C0-$3E(PC,D0.W),D0
	JMP	L038C0(PC,D0.W)
L038C0:
	DC.B	SERIO_PEnd-L038C0
	DC.B	SERIO_FByte-L038C0
	DC.B	SERIO_FLine-L038C0
	DC.B	SERIO_FStrg-L038C0
	DC.B	SERIO_BAdpar-L038C0
	DC.B	SERIO_SByte-L038C0
	DC.B	SERIO_BAdpar-L038C0
	DC.B	SERIO_SStrg-L038C0
	DC.B	SERIO_SHead-L038C0
	DC.B	SERIO_RHead-L038C0
	DC.B	SERIO_LOad-L038C0
	DC.B	SERIO_SAve-L038C0
L038CC:
SERIO_FLine:
	MOVE.L -8(A4),A4
L038D0:
	CMP.L	D5,D4
	BLS.S	L03918
	BSR.S	L03922
	BNE.S	L0391E
	MOVE.B	D1,(A1)+
	ADDQ.L	#1,D5
	CMPI.B	#$0A,D1
	BNE.S	L038D0
	BRA.S	L0391E
L038E4:
SERIO_SStrg:
SERIO_SAve:
	MOVEA.L	-4(A4),A4
L038E8:
	CMP.L	D5,D4
	BLS.S	L0391C
	MOVE.B	(A1),D1
	BSR.S	L03922
	BNE.S	L0391E
	ADDQ.W	#1,A1		;*/undomend ADDQ.L #1,A1
	ADDQ.L	#1,D5
	BRA.S	L038E8
L038F8:
SERIO_FStrg:
SERIO_LOad:
	MOVEA.L	-8(A4),A4
L038FC:
	CMP.L	D5,D4
	BLS.S	L0391C
	BSR.S	L03922
	BNE.S	L0391E
	MOVE.B	D1,(A1)+
	ADDQ.L	#1,D5
	BRA.S	L038FC
L0390A:
SERIO_PEnd:
	SUBQ.W #4,A4		;*/undomend SUBQ.L #4,A4
L0390C:
SERIO_FByte:
	SUBQ.W #4,A4		;*/undomend SUBQ.L #4,A4
L0390E:
SERIO_SByte:
	MOVEA.L -4(A4),A4
	BRA.S	L03922
; Bad IO call
L03914:
SERIO_BAdpar:
	MOVEQ	#-15,D0
	BRA.S	L0392C
L03918:
	MOVEQ	#-5,D0
	BRA.S	L0391E
L0391C:
	MOVEQ	#0,D0
L0391E:
	MOVE.L	D5,D1
	BRA.S	L0392C
L03922:
	MOVEM.L	D4-D5/A1/A4,-(A7)
	JSR	(A4)
	MOVEM.L	(A7)+,D4-D5/A1/A4
L0392C:
	TST.L	D0
	RTS
L03930:
SERIO_SHead:
	MOVEA.L	-4(A4),A4
	MOVEQ	#$0F,D4
	TST.W	D5
	BGT.S	L038E8
	ST	D1
	BSR.S	L03922
	BNE.S	L0391E
	MOVEQ	#1,D5
	BRA.S	L038E8
L03944:
SERIO_RHead:
	MOVEQ	#$0F,D4
	TST.W	D5
	BGT.S	SERIO_FStrg
	MOVEA.L	-12(A4),A4
	BSR.S	L03922
	BNE.S	L0391E
	ADDQ.B	#1,D1
	BNE.S	SERIO_BAdpar	;*/mend BNE.S SERIO_SStrg !
	MOVEA.L	(A7),A4
	BSR.S	SERIO_FByte
	MOVEQ	#1,D5
	BRA.S	L038FC
L0395E:
UT_ERR0:
	MOVE.L	A0,-(A7)
	SUBA.L	A0,A0
	BSR.S	UT_ERR
	MOVEA.L	(A7)+,A0
	RTS
L03968:
UT_ERR:
	TST.L	D0
	BGE.S	L0398E
	movem.l	d0-d3/d5/a1-a2,-(a7) ;*/modify MOVEM.L  D0-D3/A1,-(A7)
	MOVEA.L	D0,A1
	ADD.L	D0,D0
	BVS.S	L03986
	NEG.W	D0
	move.w	d0,d5		;*/insert
	bsr	MSG_FIX		;*/mend MOVEA.L  $2814A,A1
				;*/modify MOVE.W	 0(A1,D0.W),D0
	move.l	a2,a1		;*/modify LEA	 0(A1,D0.W),A1

L03986:
	JSR	UT_MTEXT(PC)	;*/undomodify BSR.S UT_MTEXT
				;*/undomodify nop
	movem.l	(a7)+,d0-d3/d5/a1-a2 ;*/modify MOVEM.L  (A7)+,D0-D3/A1
L0398E:
	RTS

;*/beginfilling
NOP03990:
	DCB.w	($3990-(NOP03990-ORGN))/2,$4E71
;*/endfilling

L03990:
UT_MINT:
	MOVE.L	A6,-(A7)
	SUBA.L	A6,A6
	MOVEA.L	A7,A1
	SUBQ.W	#8,A7		;*/undomend SUBQ.L #8,A7
	MOVE.L	A0,-(A7)
	LEA	4(A7),A0
	MOVE.W	D1,-(A1)
	JSR	CN_ITOD(PC)	;*/undomodify BSR CN_ITOD
	MOVEA.L	(A7)+,A0
	MOVEA.L	A7,A1
	MOVE.W	D1,D2
	BSR.S	L039B4
	ADDQ.W	#8,A7		;*/undomodify ADDQ.L #8,A7
	MOVEA.L	(A7)+,A6
	RTS
L039B2:
UT_MTEXT:
	MOVE.W	(A1)+,D2
L039B4:
	MOVEQ	#7,D0		; IO.SSTRG send string of
				; bytes
	MOVE.L	A0,D3
	BEQ.S	L039BE
	MOVEQ	#-1,D3
	BRA.S	L039C4
L039BE:
	SF	$28033		; screen status (0=active)
L039C4:
	TRAP	#3
	CMPI.W	#$FFFF,D0
	BNE.S	L039D8
	MOVEA.L	#$00010001,A0	; Basic screen channel #1
	MOVEQ	#7,D0		; IO.SSTRG sends a string of
				; bytes
	TRAP	#3
	SUBA.L	A0,A0
L039D8:
	TST.L	D0
	RTS
L039DC:
UT_LINK:
	MOVE.L	(A1),(A0)
	MOVE.L	A0,(A1)
	RTS
L039E2:
MT_UNLNK:
	CMPA.L	(A1),A0
	BEQ.S	L039EE
	TST.L	(A1)
	BEQ.S	L039F0
	MOVEA.L	(A1),A1
	BRA.S	MT_UNLNK
L039EE:
	MOVE.L	(A0),(A1)
L039F0:
	RTS
UT_WINDW:
	BSR.S	OPE_WNDW
	BRA.S	L03A0C
UT_CON:
	LEA	CON_STR(PC),A0
	BRA.S	L03A00
UT_SCR:
	LEA	SCR_STR(PC),A0
L03A00	BSR.S	OPE_WNDW
L03A02	addq.w	#4,a1		;*/undomend ADDQ.L #4,A1
	MOVEQ	#$0D,D0		; SD.WDEF redefines a window
	MOVEQ	#0,D2
	BSR.S	L03A36
	SUBQ.W	#4,A1		;*/undomend SUBQ.L #4,A1
L03A0C	MOVEQ	#$0C,D0		; SD.BORDR Sets border width
				; and colour
	MOVE.B	(A1)+,D1
	MOVE.B	(A1)+,D2
	BSR.S	L03A36
	MOVEQ	#$27,D0		; SD.SETPA set paper colour
	MOVE.B	(A1),D1
	BSR.S	L03A36
	MOVEQ	#$28,D0		; SD.SETST set strip colour
	MOVE.B	(A1)+,D1
	BSR.S	L03A36
	MOVEQ	#$29,D0		; SD.SETIN sets ink colour
	MOVE.B	(A1),D1
	BSR.S	L03A36
	MOVEQ	#$20,D0		; SD.CLEAR clears all of a
				; window
	BRA.S	L03A36
OPE_WNDW ; Open window
	MOVE.L	A1,-(A7)
	MOVEQ	#1,D0		; IO.OPEN
	MOVEQ	#-1,D1
	MOVEQ	#0,D3		; old file or device
	TRAP	#2
	BRA.S	L03A3A
L03A36	; window trap
	MOVE.L	A1,-(A7)
	TRAP	#3
L03A3A	MOVEA.L	(A7)+,A1
	TST.L	D0
	BEQ.S	L03A42
	ADDQ.W	#4,A7		;*/undomend ADDQ.L #4,A7
L03A42	RTS
CON_STR	DC.B	0,3,'CON',0
SCR_STR	DC.B	0,3,'SCR',0
L03A50	; set pointer for string comparision
	MOVEQ	#0,D4
	MOVE.B	D0,D4
	ROR.L	#1,D4
	SUBQ.B	#2,D4
	MOVE.W	0(A6,A0.L),D0
	ADDQ.W	#2,A0		;*/undomend ADDQ.L #2,A0
	LEA	0(A0,D0.W),A2
	MOVE.W	0(A6,A1.L),D1
	ADDQ.W	#2,A1		;*/undomend ADDQ.L #2,A1
	LEA	0(A1,D1.W),A3
	RTS
L03A6E	; find position of string 2 in string 1
	MOVEM.L	D4/A0-A4,-(A7)
	BSR.S	L03A50
	LEA	0(A1,D0.W),A4
	EXG	A4,A3
	MOVEQ	#0,D1
L03A7C	CMPA.L	A4,A3
	BGT.S	L03A8C
	ADDQ.L	#1,D1
	BSR.S	L03A96
	BEQ.S	L03A90
	ADDQ.W	#1,A1		;*/undomend ADDQ.L #1,A1
	ADDQ.W	#1,A3		;*/undomend ADDQ.L #1,A3
	BRA.S	L03A7C
L03A8C	MOVEQ	#0,D1
	MOVEQ	#0,D0
L03A90	MOVEM.L	(A7)+,D4/A0-A4
	RTS
L03A96	MOVEM.L	D1-D5/A0-A3,-(A7)
	BRA.S	L03AA2
UT_CSTR	MOVEM.L	D1-D5/A0-A3,-(A7)
	BSR.S	L03A50
L03AA2	CMPA.L	A2,A0
	BNE.S	L03AAC
	CMPA.L	A3,A1
	BNE.S	L03AC8
	BRA.S	L03ACC
L03AAC	CMPA.L	A3,A1
	BEQ.S	L03AD0
	BSR.S	L03AE8
	CMP.B	D4,D0
	BEQ.S	L03B2C
	CMP.B	D3,D2
	BNE.S	L03AC6
	TST.B	D0
	BLE.S	L03AA2
	TST.L	D4
	BLT.S	L03AA2
	CMPI.B	#$02,D0
L03AC6	BGT.S	L03AD0
L03AC8	MOVEQ	#-1,D0
	BRA.S	L03AD2
L03ACC	MOVEQ	#0,D0
	BRA.S	L03AD2
L03AD0	MOVEQ	#1,D0
L03AD2	MOVEM.L	(A7)+,D1-D5/A0-A3
	RTS
L03AD8	; table of results of string comparision
	DC.W	0,0,$FF,0,0,1,0,$300
L03AE8	; compare bytes of string
	EXG	A1,A0
	EXG	A3,A2
	BSR.S	L03B04
	EXG	A1,A0
	EXG	A3,A2
	MOVE.B	D0,D1
	MOVE.B	D2,D3
	BSR.S	L03B04
	LSL.B	#2,D0
	ADD.B	D1,D0
	EXT.W	D0
	MOVE.B	L03AD8(PC,D0.W),D0 ; get result of string
				 ; comparision
	RTS
L03B04	; correct decimal values (3.5)
	MOVE.B	0(A6,A0.L),D2
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	BSR	L03BFA
	CMPI.B	#$CE,D2
	BNE.S	L03B2A
	CMPA.L	A2,A0
	BEQ.S	L03B28
	CMPI.B	#$30,0(A6,A0.L)
	BLT.S	L03B28
	CMPI.B	#$39,0(A6,A0.L)
	BLE.S	L03B2A
L03B28	CLR.B	D0
L03B2A	RTS
L03B2C	; compare two ASCII numbers
	BSR.S	L03B96
	MOVE.W	D3,D2
	MOVE.W	D1,D3
	EXG	A1,A0
	EXG	A3,A2
	BSR.S	L03B96
	CMP.W	D1,D3
L03B3A	BNE.S	L03AC6
	SUBA.W	D1,A0		;!!! word length may cause
				; errors !!!
	SUBA.W	D1,A1
	BRA.S	L03B50
L03B42	MOVE.B	0(A6,A1.L),D5
	ADDQ.W	#1,A1		;*/undomend ADDQ.L #1,A1
	CMP.B	0(A6,A0.L),D5
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	BNE.S	L03B3A
L03B50	DBF	D1,L03B42
	BSR.S	L03BCC
	MOVE.W	D3,-(A7)
	MOVE.W	D1,-(A7)
	EXG	A1,A0
	EXG	A3,A2
	BSR.S	L03BCC
	MOVE.W	(A7)+,D0
	MOVE.W	(A7)+,D2
	SUB.W	D2,D3
	BGT.S	L03B6A
	ADD.W	D3,D2
L03B6A	TST.W	D2
	BEQ.S	L03B8C
	SUBA.W	D1,A0		;!!! word length may cause
				; errors !!!
	SUBA.W	D0,A1
	SUB.W	D2,D1
	SUB.W	D2,D0
L03B76	MOVE.B	0(A6,A0.L),D5
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	CMP.B	0(A6,A1.L),D5
	ADDQ.W	#1,A1		;*/undomend ADDQ.L #1,A1
	BNE.S	L03B3A
	SUBQ.W	#1,D2
	BNE.S	L03B76
	ADDA.W	D1,A0		;!!! word length may cause
				; errors !!!
	ADDA.W	D0,A1
L03B8C	TST.W	D3
	BNE	L03AC6
	BRA	L03AA2
L03B96	MOVEQ	#0,D1
L03B98	CMPI.B	#$D0,D2
	BNE.S	L03BB0
	CMPA.L	A2,A0
	BEQ.S	L03BCA
	MOVE.B	0(A6,A0.L),D2
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	BSR.S	L03BFA
	SUBQ.B	#1,D0
	BNE.S	L03BC8
	BRA.S	L03B98
L03BB0	CMPI.B	#$CE,D2
	BEQ.S	L03BC8
	ADDQ.W	#1,D1		;*/undomend ADDQ.L #1,D1
	CMPA.L	A2,A0
	BEQ.S	L03BCA
	MOVE.B	0(A6,A0.L),D2
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	BSR.S	L03BFA
	SUBQ.B	#1,D0
	BEQ.S	L03BB0
L03BC8	SUBQ.W	#1,A0		;*/undomend SUBQ.L #1,A0
L03BCA	RTS
L03BCC	MOVEQ	#0,D1
	MOVEQ	#0,D3
L03BD0	CMPA.L	A2,A0
	BEQ.S	L03BF8
	MOVE.B	0(A6,A0.L),D2
	BSR.S	L03BFA
	SUBQ.B	#1,D0
	BNE.S	L03BF8
	CMPI.B	#$CE,D2
	BNE.S	L03BEA
	TST.L	D1
	BNE.S	L03BF8
	MOVEQ	#-$01,D1
L03BEA	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	ADDQ.W	#1,D1
	CMPI.B	#$D0,D2
	BEQ.S	L03BD0
	MOVE.W	D1,D3
	BRA.S	L03BD0
L03BF8	RTS
L03BFA	MOVE.B	D2,D0
	BLT.S	L03C14
	CMPI.B	#$2E,D0
	BEQ.S	L03C18
	EXT.W	D0
	ADDI.W	#$002E,D0
	MOVE.B	L03BFA(PC,D0.W),D0
	BEQ.S	L03C14
	SUBQ.B	#2,D0
	BLE.S	L03C18
L03C14	CLR.B	D0
	RTS
L03C18	MOVE.B	D2,D0
	ADDI.B	#$A0,D2
	BCC.S	L03C24
	SUBI.B	#$20,D2
L03C24	LSR.B	#5,D0
	RTS
L03C28	; this table defines type of ASCII code
	DC.L	$00000000,$00000000,$00000000,$00000000
	DC.L	$00000000,$00000000,$00000000,$00000000
	DC.L	$20030000,$24250003,$00000000,$03000000
	DC.L	$02020202,$02020202,$02020003,$00000000
	DC.L	$00010101,$01010101,$01010101,$01010101
	DC.L	$01010101,$01010101,$01010100,$00000001
	DC.L	$00010101,$01010101,$01010101,$01010101
	DC.L	$01010101,$01010101,$01010100,$00000000
L03CA8	; test sign of number to convert to floatinpoint number
	CMP.L	A0,D7
	BEQ.S	L03CCA
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
L03CAE	CMPI.B	#$20,0(A6,A0.L)
	BEQ.S	L03CA8
	MOVEQ	#0,D5
	MOVEQ	#$2B,D6
	SUB.B	0(A6,A0.L),D6
	BEQ.S	L03CC8
	ADDQ.B	#2,D6
	BNE.S	L03CCA
	BSET	#$1F,D5
L03CC8	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
L03CCA	RTS
L03CCC	; convert ASCII to decimal
	MOVEQ	#0,D6
	CMP.L	A0,D7
	BEQ.S	L03CEA
	MOVE.B	0(A6,A0.L),D6
	SUBI.W	#'0',D6
	BLT.S	L03CE6
	CMPI.W	#9,D6
	BGT.S	L03CE6
	ADDQ.L	#2,(A7)
	BRA.S	L03CEA
L03CE6	ADDI.W	#$0030,D6
L03CEA	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	RTS
L03CEE	; convert entire number from ASCII to decimal
	BSR.S	L03CAE
	BSR.S	L03CCC		; convert ASCII to decimal
	BRA.S	L03D08		; error
	MOVE.L	D6,D3
L03CF6	BSR.S	L03CCC		; convert ASCII to decimal
	BRA.S	L03D0C		; error
	MULU	#10,D3
	ADD.L	D6,D3
	CMPI.L	#$00007FFF,D3
	BLE.S	L03CF6
L03D08	MOVEQ	#-17,D0		; Error in expression
	RTS
L03D0C	; test sign + / -
	TST.L	D5
	BPL.S	L03D12
	NEG.W	D3
L03D12	MOVEQ	#0,D0
	RTS
CN_DTOF	; vector $100 : convert ASCII to floatingpoint
	MOVEM.L	D3-D6/A0-A1,-(A7)
	MOVEQ	#0,D4
	BSR.S	L03CAE
	SUBQ.W	#6,A1		;*/undomend SUBQ.L #6,A1
	CLR.L	2(A6,A1.L)
	CLR.W	0(A6,A1.L)
L03D28	BSR.S	L03CCC		; convert ASCII to decimal
	BRA.S	L03D48
	MOVE.B	#$DF,D5
	TST.W	D4
	BEQ.S	L03D36
	ADDQ.W	#1,D4
L03D36	BSR.S	L03DB6
	JSR	RI_MULT(PC)	;*/undomodify BSR RI_MULT
	BNE.S	L03DB0
	MOVE.L	D6,D1
	BSR.S	L03DB8
	JSR	RI_ADD(PC)	;*/undomodify BSR RI_ADD
	BRA.S	L03D28
L03D48	CMPI.B	#$2E,D6
	BNE.S	L03D56
	TST.W	D4
	BNE.S	L03DAE
	MOVEQ	#$01,D4
	BRA.S	L03D28
L03D56	TST.B	D5
	BEQ.S	L03DAE
	TST.L	D5
	BPL.S	L03D62
	JSR	RI_NEG(PC)	;*/undomodify BSR RI_NEG
L03D62	MOVEQ	#0,D3
	AND.B	D5,D6
	CMPI.B	#$45,D6
	BNE.S	L03D70
	BSR.S	L03CEE
	BNE.S	L03DB0
L03D70	TST.W	D4
	BEQ.S	L03D76
	SUBQ.W	#1,D4
L03D76	SUB.W	D3,D4
	BVS.S	L03DAE
	BEQ.S	L03DA2
	SGE	D5
	BGE.S	L03D82
	NEG.W	D4
L03D82	BSR.S	L03DB6
	SUBQ.W	#2,A1		;*/undomend SUBQ.L #2,A1
	MOVE.W	D4,0(A6,A1.L)
	JSR	L047DC(PC)	;*/undomodify BSR L047DC
	BNE.S	L03DB0
	TST.B	D5
	BEQ.S	L03D9C
	JSR	RI_DIV(PC)	;*/undomodify BSR RI_DIV
	BNE.S	L03DB0
	BRA.S	L03DA2
L03D9C	JSR	RI_MULT(PC)	;*/undomodify BSR RI_MULT
	BNE.S	L03DB0
L03DA2	MOVEM.L	(A7)+,D3-D6
	SUBQ.W	#1,A0		;*/undomodify SUBQ.L #1,A0
	ADDQ.W	#8,A7		;*/undomodify ADDQ.L #8,A7
	MOVEQ	#0,D0
	RTS
L03DAE	MOVEQ	#-$11,D0
L03DB0	MOVEM.L	(A7)+,D3-D6/A0-A1
	RTS
L03DB6	MOVEQ	#$0A,D1
L03DB8	MOVE.L	#$0000081F,D0
	JMP	L04830(PC)	;*/undomodify BRA L04830
CN_DTOI	; vector $102 : convert number to ASCII
	MOVEM.L	D3-D6/A0-A1,-(A7)
	BSR	L03CEE
	BNE.S	L03DB0
	SUBQ.W	#2,A1		;*/undomend SUBQ.L #2,A1
	MOVE.W	D3,0(A6,A1.L)
	BRA.S	L03DA2
CN_HTOIB:
	MOVEQ	#$02,D2
	BRA.S	CN_HTOI
CN_HTOIW:
	MOVEQ	#$04,D2
	BRA.S	CN_HTOI
CN_HTOIL:
	MOVEQ	#$08,D2
CN_HTOI:
	MOVEM.L	D3-D6/A0-A1,-(A7)
	MOVE.L	D2,D4
	LSR.B	#1,D4
	SUBQ.W	#2,A1		;*/undomend SUBQ.L #2,A1
	MOVE.B	D4,$01(A6,A1.L)
	MOVE.B	#$0F,0(A6,A1.L)
	MOVEQ	#$04,D4
L03DF4	MOVE.L	D2,D5
	MOVEQ	#0,D3
L03DF8	BSR	L03CCC		; convert ASCII to decimal
	BRA.S	L03E00		; error
	BRA.S	L03E0E		; ok
L03E00	ANDI.B	#$DF,D6
	SUBI.B	#'A',D6
	BLT.S	L03E1E
	ADDI.B	#10,D6
L03E0E	CMP.B	0(A6,A1.L),D6
	BHI.S	L03E1E
	LSL.L	D4,D3
	ADD.L	D6,D3
	DBF	D2,L03DF8
	BRA.S	L03E30
L03E1E	MOVE.B	$01(A6,A1.L),D4
	ADDQ.L	#2,A1
	MOVE.L	D3,-$04(A6,A1.L)
	SUBA.L	D4,A1
	CMP.W	D2,D5
	BGT	L03DA2
L03E30	BRA	L03DAE
CN_BTOIB:
	MOVEQ	#$08,D2
	BRA.S	L03E3E
CN_BTOIW:
	MOVEQ	#$10,D2
	BRA.S	L03E3E
CN_BTOIL:
	MOVEQ	#$20,D2
L03E3E	MOVEM.L	D3-D6/A0-A1,-(A7)
	MOVE.L	D2,D4
	LSR.B	#3,D4
	SUBQ.W	#2,A1		;*/undomend SUBQ.L #2,A1
	MOVE.B	D4,$01(A6,A1.L)
	MOVEQ	#$01,D4
	MOVE.B	D4,0(A6,A1.L)
	BRA.S	L03DF4
CN_ITOD	MOVE.L	A2,-(A7)
	MOVE.L	A0,-(A7)
	MOVEQ	#0,D0
	MOVE.W	0(A6,A1.L),D0
	ADDQ.W	#2,A1		;*/undomend ADDQ.L #2,A1
	BGE.S	L03E6C
	MOVE.B	#$2D,0(A6,A0.L)
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	NEG.W	D0
L03E6C	MOVE.L	A0,-(A7)
	ADDQ.W	#5,A0		;*/undomend ADDQ.L #5,A0
L03E70	DIVU	#10,D0
	SWAP	D0
	ADDI.B	#$30,D0
	SUBQ.W	#1,A0		;*/undomend SUBQ.L #1,A0
	MOVE.B	D0,0(A6,A0.L)
	CLR.W	D0
	SWAP	D0
	BNE.S	L03E70
	MOVE.L	(A7)+,D1
	SUB.L	A0,D1
	MOVE.W	D1,D0
	ADDQ.W	#4,D0
L03E8E	LEA	0(A0,D1.W),A2
	MOVE.B	0(A6,A0.L),0(A6,A2.L)
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	DBF	D0,L03E8E
	ADD.L	A0,D1
	MOVEA.L	D1,A0
	SUB.L	(A7)+,D1
	MOVEA.L	(A7)+,A2
	RTS
CN_ITOHL:
	bsr.l	CN_ITOHW 	; not possible to have short
				; branch to next instruction
CN_ITOHW:
	bsr.l	CN_ITOHB 	; ditto
CN_ITOHB:
	MOVE.B	0(A6,A1.L),D0
	LSR.B	#4,D0
	BSR.S	L03EC0
	MOVEQ	#$0F,D0
	AND.B	0(A6,A1.L),D0
	ADDQ.W	#1,A1		;*/undomend ADDQ.L #1,A1
L03EC0	ADDI.B	#$30,D0
	CMPI.B	#$39,D0
	BLS.S	L03ECC
	ADDQ.B	#7,D0
L03ECC	MOVE.B	D0,0(A6,A0.L)
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	RTS
CN_ITOBL:
	bsr.l	CN_ITOBW 	; not possible to have short
				; branch to next instruction
CN_ITOBW:
	bsr.l	CN_ITOBB 	; ditto
CN_ITOBB:
	MOVEQ	#7,D0
L03EDE	BTST	D0,0(A6,A1.L)
	SEQ	0(A6,A0.L)
	ADDI.B	#$31,0(A6,A0.L)
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	DBF	D0,L03EDE
	ADDQ.W	#1,A1		;*/undomend ADDQ.L #1,A1
	RTS
CN_FTOD:
	MOVEM.L	D2-D5,-(A7)
	MOVE.L	A0,-(A7)
	TST.L	$02(A6,A1.L)
	BEQ	L04000

; --------------------------------------------------------------
;*/beginoverlay
; modified to allow for eight digit precision
; based on hack by S N Goodwin

	MOVEQ	#$07,D4		;*/modify MOVEQ #$06,D4
	MOVE.L	D4,D5		;*/insertcode
	TST.B	$02(A6,A1.L)
	BGE.S	L03F18
	MOVE.B	#$2D,0(A6,A0.L)
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	JSR	RI_NEG(PC)	;*/undomodify BSR RI_NEG

L03F18	CMPI.L	#$081E7736,0(A6,A1.L) ;*/modify CMPI.L #$081B5F60,0(A6,A1.L) about 1E8
				; new top, about 1E9
	BLT.S	L03F2C
	ADDQ.W	#1,D4
	BSR.S	L03F40
	JSR	RI_DIV(PC)	;*/undomodify BSR RI_DIV
	BRA.S	L03F18

L03F2C	CMPI.L	#$081B5F5F,0(A6,A1.L) ;*/modify CMPI.L #$08184C4C,0(A6,A1.L) about 1E7
				; new bottom, about 1E8
	BGE.S	L03F6C
	SUBQ.W	#1,D4
	BSR.S	L03F40
	JSR	RI_MULT(PC)	;*/undomodify BSR RI_MULT
	BRA.S	L03F2C
L03F40	SUBQ.W	#6,A1		;*/undomend SUBQ.L #6,A1
	MOVE.L	#$08045000,0(A6,A1.L) ; 10.0
	CLR.W	4(A6,A1.L)
	RTS
L03F50	MOVEQ	#0,D0
	SWAP	D1
	MOVE.W	D1,D0
	DIVU	#10,D0
	SWAP	D0
	MOVE.W	D0,D1
	SWAP	D1
	DIVU	#10,D1
	MOVE.W	D1,D0
	SWAP	D1
	EXG	D0,D1
	RTS

L03F6C	MOVEQ	#$1F,D0
	SUB.W	0(A6,A1.L),D0
	MOVE.L	2(A6,A1.L),D1
	LSR.L	D0,D1
	ADDQ.W	#6,A1		;*/undomend ADDQ.L #6,A1
L03F7A	ADDQ.L	#5,D1
	BSR.S	L03F50
	ADDQ.W	#1,D4
	CMPI.L	#$05F5E100,D1 ;*/modify CMPI.L #$00989680,D1
			     ; long int scaling limit, 1E8
	BGE.S	L03F7A

	LEA	2(A0,D5.L),A0	;*/modify ADDQ.W #8,A0
				;*/modify MOVEQ #6,D2
	MOVE.L	A0,D2		;*/insertcode
	MOVE.L	D5,D3		;*/insertcode

L03F8C	BSR.S	L03F50
	ADDI.B	#$30,D0
	SUBQ.W	#1,A0
	MOVE.B	D0,0(A6,A0.L)
	DBF	D5,L03F8C	;*/modify DBF D2,L03F8C

	CMP.W	D3,D4		;*/modify CMPI.W #5,D4
	BGT.S	L03FAC

	CMPI.W	#$FFFF,D4
	BLT.S	L03FAC

	MOVEQ	#0,D5
	BRA.S	L03FB0

L03FAC	MOVE.L	D4,D5
	MOVEQ	#0,D4
L03FB0	ADDQ.W	#1,D4
				;*/removecode MOVE.L A0,D2
	BRA.S	L03FBE

L03FB6	MOVE.B	0(A6,A0.L),-1(A6,A0.L)
	ADDQ.W	#1,A0
L03FBE	DBF	D4,L03FB6

	MOVE.B	#'.',-1(A6,A0.L)	; Decimal point

	MOVEA.L	D2,A0
				;*/removecode ADDQ.W #7,A0
;*/endoverlay
; --------------------------------------------------------------
L03FCC	SUBQ.W	#1,A0		;*/undomend SUBQ.L #1,A0
	CMPI.B	#'0',0(A6,A0.L)	; 0
	BEQ.S	L03FCC
	CMPI.B	#'.',0(A6,A0.L)	; .
	BEQ.S	L03FE0
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
L03FE0	TST.W	D5
	BEQ.S	L03FF6
	MOVE.B	#'E',0(A6,A0.L)	; exponent E
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	SUBQ.W	#2,A1		;*/undomend SUBQ.L #2,A1
	MOVE.W	D5,0(A6,A1.L)
	JSR	CN_ITOD(PC)	;*/undomodify BSR CN_ITOD
L03FF6	MOVE.L	A0,D1
	SUB.L	(A7)+,D1
	MOVEM.L	(A7)+,D2-D5
	RTS
L04000	MOVE.B	#'0',0(A6,A0.L)	; 0
	ADDQ.W	#1,A0		;*/undomend ADDQ.L #1,A0
	ADDQ.W	#6,A1		;*/undomend ADDQ.L #6,A1
	BRA.S	L03FF6
L0400C	MOVEM.L	D0/D5,-(A7)
	CMPI.W	#10,D0
	BGE.S	L04034
L04016	SUBQ.W	#1,D5
	BLE.S	L04024
	MOVE.B	#'0',0(A6,A1.L)	; 0
	ADDQ.L	#1,A1
	BRA.S	L04016
L04024	ADDI.W	#'0',D0		; calculate ASCII digit from
				; number
	MOVE.B	D0,0(A6,A1.L)
	ADDQ.L	#1,A1
	MOVEM.L	(A7)+,D0/D5
	RTS
L04034	ANDI.L	#$0000FFFF,D0
	DIVU	#10,D0
	SUBQ.W	#1,D5
	BSR.S	L0400C
	SWAP	D0
	BRA.S	L04024
L04046	BSR.S	L0400C
	MOVE.B	#' ',0(A6,A1.L)
	ADDQ.L	#1,A1
	RTS
L04052	BSR.S	L0400C
	MOVE.B	#':',0(A6,A1.L)
	ADDQ.L	#1,A1
	RTS

; --------------------------------------------------------------
;*/beginoverlay

CN_DATE:
	MOVEM.L	D1-D5/A2,-(A7)
	BSR	L040F6
	SUBA.L	#$16,A1
	MOVE.W	#$14,0(A6,A1.L)
	ADDQ.L	#2,A1
	MOVE.W	D2,D0
	MOVEQ	#4,D5
	BSR.S	L04046
	MULU	#3,D4
	moveq	#$3A,d5		;*/mend MOVEA.L  $2814A,A2
	bsr	MSG_FIX		;*/mend MOVE.W   #$3A(A2),D0
				;*/mend LEA      0(A2,D0.W),A2
	ADDA.W	D4,A2		;*/undomend ADDA.L D4,A2
	BSR.S	L040E8
	MOVE.B	#$20,0(A6,A1.L)
	ADDQ.L	#1,A1
	MOVEQ	#2,D5
	MOVE.W	D1,D0
	BSR.S	L04046
	SWAP	D2
	MOVE.W	D2,D0
	BSR.S	L04052
	MOVE.W	D3,D0
	BSR.S	L04052
	SWAP	D3
	MOVE.W	D3,D0
	BSR	L0400C
	SUBA.L	#$16,A1
L040B6	MOVEM.L	(A7)+,D1-D5/A2
	MOVEQ	#0,D0
	RTS
CN_DAY:
	MOVEM.L	D1-D5/A2,-(A7)
	BSR.S	L040F6
	SUBQ.L	#6,A1
	MOVE.W	#3,0(A6,A1.L)
	ADDQ.L	#2,A1
	MULU	#3,D0
	moveq	#$38,d5		;*/mend MOVEA.L  $2814A,A2
	bsr	MSG_FIX		;*/mend MOVE.W   #$38(A2),D0
				;*/mend LEA      0(A2,D0.W),A2
	ADDA.W	D0,A2		;*/undomodify ADDA.L D0,A2
	BSR.S	L040E8
	SUBQ.L	#5,A1
	BRA.S	L040B6
;*/beginfilling
NOP040E8:
	DCB.w	($40E4-(NOP040E8-ORGN))/2,$4E71
;*/endfilling
;*/note routines moved -4 bytes to make room for RI.EXEC fix (later)
L040E8	MOVEQ	#2,D0
L040EA	MOVE.B	(A2)+,0(A6,A1.L)
	ADDQ.L	#1,A1
	DBF	D0,L040EA
	RTS
L040F6	MOVE.W	#$3C,D2
	BSR	L0417E
	MOVE.W	D0,D3
	SWAP	D3
	BSR.S	L0417E
	MOVE.W	D0,D3
	DIVU	#$18,D1
	MOVE.L	D1,D2
	ANDI.L	#$FFFF,D1
	MOVE.L	D1,D0
	DIVU	#7,D0
	SWAP	D0
	DIVU	#$05B5,D1
	MOVE.W	D1,D2
	ASL.W	#2,D2
	ADDI.W	#$07A9,D2
	CLR.W	D1
	SWAP	D1
	DIVU	#$016D,D1
	MOVEQ	#0,D4
	CMPI.W	#4,D1
	BNE.S	L0413C
	SUBQ.W	#1,D1
	MOVE.W	#$016D,D4
L0413C	ADD.W	D1,D2
	SWAP	D1
	ADD.W	D4,D1
	MOVEQ	#0,D5
	MOVE.W	D2,D4
	ANDI.W	#3,D4
	BNE.S	L0414E
	MOVEQ	#1,D5
L0414E	MOVE.W	D5,D4
	ADDI.W	#$003A,D4
	CMP.W	D4,D1
	BLE.S	L0415C
	ADDQ.W	#2,D1
	SUB.W	D5,D1
L0415C	MOVE.W	D1,D5
	ADDI.W	#$005C,D5
	MULU	#$0064,D5
	DIVU	#$0BEF,D5
	MOVE.W	D5,D4
	ADDI.W	#$005C,D1
	MULU	#$0BEF,D5
	DIVU	#$0064,D5
	SUB.W	D5,D1
	SUBQ.W	#3,D4
	RTS
L0417E	MOVEQ	#0,D0
	SWAP	D1
	MOVE.W	D1,D0
	DIVU	D2,D0
	SWAP	D0
	MOVE.W	D0,D1
	SWAP	D1
	DIVU	D2,D1
	MOVE.W	D1,D0
	SWAP	D1
	EXG	D0,D1
	RTS
; --------------------------------------------------------------
;*/endoverlay
;*/endfile
