; A few additional comments, 12 sep 2001:
; this is apparenly version 1.0 of NFDISK. Version 1.2 has been lost
; (which means that BERT tables are not properly supported;
; whereever BERT is mentioned, it is actually the 'Gouda extended format'
; which inadvertantly is NOT compatible with BERT for >2 partitions.
; Use NOVAXTAB.BAS to convert 'Gouda Extended'<->BERT)
;
; I translated a few comments into English because someone needed them.
;
; Complete credits for code:
; Roderik Muit (FCS) - most code
; Jeffrey Timmer (FCS) - windowing routines & maybe some other standard code
; Arjan Mels - math routines (calculating optimum nr of sec/cluster etc)
; Thanks to Jurgen Kramer (FCS; publisher of Novaxis SCSI ROM)
;
;
;
; Uiteindelijke versie die met gouda is meegeleverd
; NFDISK.GEN - 1-1995 RMt & AMs
;==============================
; NOG DOEN:
; Overal waar een regel begint met ;!! is een routine nog niet geschreven
; die nog moet worden toegevoegd.
;
; Diskerror-routines inbouwen?

; BIOS functions

CALSLT	equ	001ch
ENASLT	equ	0024h
KILBUF	equ	0156h
CHSNS	equ	009ch
CHGET	equ	009fh
BEEP	equ	00c0h

;Math-pack entry's
FRCINT: EQU	 2f8ah         ;DAC -> integer [op (DAC+2)]
RND:	EQU	 2bdfh

DAC:	equ	0f7f6h
VALTYP: equ	0f663h
JIFFY	equ	0fc9eh

BIOS	macro @adres
	ld	iy,(0fcc1h)
	ld	ix,@adres
	call	01ch
	endm

BDOS	macro @callnr
	ld	c,@callnr
	call	5
	endm

ld_de:	macro @dv, @ev
	ld	de, 256 * @dv + @ev
	endm

ld_hl:	macro @hv, @lv
	ld	hl, 256 * @hv + @lv
	endm

ld_bc:	macro @bv, @cv
	ld	bc, 256 * @bv + @cv
	endm

; NOVAXIS functions

SCSICALL	macro @addr
		ld    ix,@addr
		ld    iy,(SCSIslot-1)
		call  CALSLT
		endm

ReadBlocks	equ	07f89h
WriteBlocks	equ	07f8ch
Inquiry 	equ	07f92h
Capacity	equ	07f95h
GetUnitsOn	equ	07fc8h
GetHostID	equ	07fd4h
GetSense	equ	07fd7h

; ROM var.

SCSIROM equ	07f80h
NOVAROM equ	07ff0h
NOVAVER equ	07ff5h

; NFDISK

ID	equ	0a5h		; ID for NFDISK


; NOVAXIS utility file header
; Version 1.00 - (C) 1994 KMcs
; Written by Jurgen Kramer - 08/12/94 -

	jp	begin

	defb	'NOVAXIS'
	defb	ID			; ID for NFDISK
	defb	1,0			; NFDISK version 0.00
	defb	'NET'                     ; Landcode: NET
workver: defb  1,0			; Works with NOVAXIS version 1.00
	defw	0,0,0,0			; Reserved
	defw	0,0,0,0			; Reserved

bdos   equ 5

INQ_DATA:	equ 8000h      ; Table with (nr_devs) times:
		               ; - ID	      (1 byte)
		               ; - Inquiry data (24h bytes)
		               ;(max 7 entries)
MOVETABLE:	equ 8103h      ; Temp storate for routine which checks whether
		               ; een partitie geinitialiseerd wordt / idem van-
		               ; wege veranderde sector/cluster / blijft
tempw1: dw	0              ; Counters being used in this routine
tempw2: dw	0
tempw3: dw	0
tempw4: dw	0
CAPACITY:	equ 81F5h      ; 8 bytes of which first 4 contain last sectornr
		               ;	MSB first!  (use only lowest 3)
freespace:	equ 81FDh      ; Free space (= (CAPACITY)-1, or -2) LSB first
PARTSEC:	equ 9000h      ; First 2 sectors of HD
BOOTSEC:	equ 9200h      ; Buffer for reading/writing bootsectors
		               ; and another one for other sectors
DMAPDATA:	equ 9600h      ; Table specifying, for each drive, which 
		               ; partition nr. is mapped to it on startup
		               ; (only ext.MSX)
		               ; (0-15=part.nr. 255=nothing, further data
		               ; invalid)
BDMAPDATA:	equ 9608h      ; backup
PARTDATA:	equ 9618h      ; Table containing partition data (see bottom)
		               ; This label is 1 higher than start of table!!!
L_PARTDATA:	equ 37         ; length of 1 entry of that table
L_BPARTDATA:	equ L_PARTDATA+10
MAXNOPARTS:	equ 15

BPARTDATA:	equ MAXNOPARTS*L_PARTDATA+PARTDATA
HIGHMEM:	equ MAXNOPARTS*L_BPARTDATA+BPARTDATA
; HIGHMEM is being used for temporary storage of data w.r.t. moving partitions

nr_devs:	equ 9610h	; Nr. of direct access devices online
cur_dev:	db 0		; Currently selected device (0 - nr_devs-1)
dev_SCSIID	equ 9611h	; ID of currently selected device
SCSIID: 	equ 9612h	; Host-ID of computer
tabtype:	equ 9613h	; Partition table type
				; 0 = BERT/extended DOS partition
		                ; 1 = PC; 2 = MSX; 3=MAK 3.0
Btabtype:	equ 9614h	; backup (255=no table)
nr_parts:	equ 9615h	; Nr. of partitions
Bnr_parts:	equ 9616h	; backup

; Some explanation on the use of these tables/addresses:
;-INQ_DATA and nr_devs contain data of all devices, is only filled once
;-CAPAPCITY, like PARTSEC & BOOTS, is read whenever a harddisk is selected
; (cur_dev is filled then too.)
;-freespace is derived from CAPACITY at the beginning (every time after 
; selecting a device), but this needs to be done also when switching between
; CAPACITY afgeleid en geprint, maar dit moet ook gedaan worden als er van
; BERT <-> other type of partition table, and if a setting has been added/
; deleted from a BERT-table.
;-BPARTDATA, BDMAPDATA en Btabtype are only filled at the start. Its data
; are used as backup, so after editing we can check what has been changed
; => what should be written.
;-PARTDATA, DMAPDATA en tabtype are the data which are being edited.

begin:
	BDOS	6Fh
	or	a
	ret	nz	; No DOS
	ld	a,b
  cp	2
	jr	c,wrongver	; DOS1
  ld	hl,(6)
;	 ld	 de,HIGHMEM	; Not necessary; HIGHMEM <C000h
;	 call  dcompr
 ;	 jr	 c,nomem
	call	scrini
	CALL	MAINPR	;  MAIN PROGRAMME
EINDE:

;	 CALL  DSKEXI	 ; Remove error handler

;   LD	 A,(DOS2FL)
;	 OR	 A
;	 JP	 Z,0

	ld	a,(written)
	or	a
	jr	z,todos
	jr	todos ;;;;;;;;;;;;;;;;;;;;;;;;;;;!!

	di
	ld_bc 5,51	; Put window: reset
	ld	a,6
	call	putwin
	ld_hl 17,12
	ld	de,restxt
	call	print
	ei
	call	wtkey
	di
	call	getwin
	ei
	BIOS	 0

todos:	call	screxi
	LD	BC,62H
	CALL	bdos

;nomem:  ld	 bc,0DE62H	 ; Return with error code "Out of Memeory"
;	 call  bdos

wrongver: ld	de,wvertxt
	ld	c,9
	jp	bdos
wvertxt: db	"MSX-DOS 2 needed!",13,10,"$"

restxt: db	"     The partition data has been changed.",0
	db	"For safety reasons, you can not go back to DOS.",0
	db	"          Press any key to reboot...",255

; ==============
; Hoofdprogramma
; ==============
MAINPR:
	call Aboutwin	; Version/copyright melding
	call srch_scsi	; Find slot nr. of SCSI interface
	ret  c
	call CountDevs	; Count nr. of direct access devices
	ret  c		;  and put data in table
	dec  a
	jr   nz,mainp3
	ld   a,(INQ_DATA)
	ld	(dev_SCSIID),a
	add	a,"0"
	ld	(t_w71),a	; In te printen tekst
	jr	mmpp

mainp3: call ChooseDev	; If nr of devs >1 then pop up choice menu
	ret  c		; ESC: Back to DOS

mmpp:	call ReadPData	; Read partition data
	jr   c,mainp2

	call Iniscr	; put windows, print HD-gegevens

	call	Window1	; Print partitiegegevens in window

; Haal alle windows weg en terug naar keuzemenu als meer dan 1 device.
; Anders naar DOS.
mainp2: CALL	getwin
	or	a
	JR	NZ,mainp2
mainp4: ld	a,(nr_devs)
	dec	a	; <>1?
	jp	nz,mainp3
	ret

chatxt: db	"Changes have not been saved.",0
	db	"        Really quit?",0
	db	"         ",'Y'+128,"es    ",'N'+128,"o",255

Checkit:
	ld	a,(Btabtype)
	ld	b,a
	ld	a,(tabtype)
	cp	b
	ret	nz
	ld	a,(Bnr_parts)
	ld	b,a
	ld	a,(nr_parts)
	cp	b
	ret	nz
	ld	hl,BPARTDATA-1
	ld	de,PARTDATA-1
	ld	b,3
	call	checkchange
	ret	nz
	ld	a,(nr_parts)
	dec	a
	ld	b,a
	jr	z,chkit1
chkit2: push	bc
	ld	bc,10
	add	hl,bc
	ld	b,L_PARTDATA
	call	checkchange
	pop	bc
	ret	nz
	djnz	chkit2
chkit1: ld	c,10	;!B=0
	add	hl,bc
	ld	b,L_PARTDATA-3
	; call checkhange; ret

checkchange:
	ld	a,(de)
	cp	(hl)
	inc	de
	inc	hl
	ret	nz
	djnz	checkchange
	ret

; ---
Aboutwin: ; Geef copyright melding en wacht op toets
	di
	ld_bc 4,28		; Window 1 (About) op scherm zetten en na toets
	ld	a,6	;  weer weghalen
	call	putwin
	ld_hl 27,12
	ld	de,t_w1
	call	print
	ei
	call	wtkey
	di
	call	getwin
	ei
	ret


ReadPData: ; Read partition table (and free space)

; Read and write routines are completely tied up!

; Result: everything filled (CAPACITY, (B)PARTDATA, (B)DMAPDATA, (B)tabtype,
; (B)nr_parts)
; The only thing that's not initialised is the other data in PARTDATA for 
; non-'FAT12 (MSX)' partitions.

; Read free space
	ld	(stack),sp
	ld	a,(dev_SCSIID)
	ld	hl,CAPACITY
	SCSICALL Capacity
	ld	a,d
	or	a
	jr	nz,errorr

; Check 512 bytes/sec
	ld	hl,(CAPACITY+4)
	ld	e,0            ;!D=0
	call	dcompr
	jr	nz,readpe2
	ld	hl,(CAPACITY+6)
	ld	e,2
	call	dcompr
	jp	z,readp0
readpe2: ld	de,t_err1
	ld	a,37
	jr	readpe
errorr: ld	hl,t_errr
	jr	readpe
errorw: ld	hl,t_errw
readpe: push	de
	push	hl
	ld	a,(dev_SCSIID)
	SCSICALL GetSense
	pop	hl
	pop	de
	di
	push	bc
	push	af
	push	de
	push	hl
	ld_bc 8,44
	ld	a,4
	call	putwin
	pop	de
	ld_hl 35,10	; Read/write error
	call	print
	ld_hl 20,12	; Target status etc. message
	ld	de,t_erw1
	call	print
	pop	af	; Target status
	ld_hl 35,12
	call	PrintHex
	cp	2
	ld	de,t_ts2
	jr	z,err2
	cp	8
	ld	de,t_ts8
	jr	z,err2
	or	a
	ld	de,t_ts0
	jr	z,err2
	ld	de,t_
err2:	call	prtm2	 ; Print text without setting VRAM address
	pop	af	; Sense key
	ld_hl 31,13
	call	PrintHex
	ld	hl,tab_sk
	call	PrintMsg
	pop	af	; Sense code
	push	af
	ld_hl 32,14
	call	PrintHex
	pop	bc	; Additional sense code
	ld	a,c
	ld_hl 43,15
	call	PrintHex
	ei
	call	wtkey
	call	getwin
	scf
	ld	sp,(stack)
	ret

; Read sector 0
readp0: ld	a,(dev_SCSIID)
	ld	b,2
	ld	de,0
	ld	c,e
	ld	hl,PARTSEC
	SCSICALL ReadBlocks
	inc	d
	dec	d
	jp	nz,errorr

	ld	hl,(PARTSEC+1fEH) ; Partition table present at sector 0?
	ld	de,0EBEBh
	call	dcompr
	jr	z,redpm3	; Yes, MAK3
	ld	de,0AA55h
	call	dcompr
	jr	nz,readp2	; No
	ld	a,(PARTSEC+1D2h)
	sub	5		; 2nd partition = Extended?
	jr	z,readp6
	ld	hl,(PARTSEC+1A0h) ; If 0,0,1,0 in '1st entry' then MSX table
	ld	de,0
	call dcompr
	jr	nz,readp5
	ld	hl,(PARTSEC+1A2h)
	ld	e,1
	call dcompr
	jr	nz,readp5

	; MSX table
	ld	a,2
	ld	ix,PARTSEC+19Eh
	jr	readp4

readp5: ld	a,(PARTSEC+1D2h)	; 0 or 1 partition? extended format
	or	a
	jr	z,readp6

	; Standard (PC) table
	ld	a,1
	ld	ix,PARTSEC+1BEh
	jr	readp4

	; MAK3 table
redpm3: ld	a,3
	ld	ix,PARTSEC+100h

readp4: ld	(tabtype),a
	ld	(Btabtype),a
redp45: call	inidmap
	jr	fillp

readp2: ; No table found
	xor	a
	ld	(tabtype),a
	dec	a
	ld	(Btabtype),a
	call	inidmap
	xor	a
	jp	redpzx

readp6: ; BERT table
	ld	(tabtype),a	;!A=0
	ld	(Btabtype),a
	ld	ix,PARTSEC+1BEh
	ld	A,(PARTSEC+1F3h) ; Check 'Drv'
	cp	68
	jr	nz,redp45
	ld	hl,(PARTSEC+1F4h)
	ld	de,7672h
	call	dcompr
	jr	nz,redp45
	ld	hl,PARTSEC+1F6h ; Correct: copy drive table
	ld	de,BDMAPDATA
	ld	bc,8
	ldir


; Fill data in BPARTDATA
; IX = position in partition table (already filled)
; HL = position in BPARTDATA
; B = partition nr.
; A'DE = sector nr. of partition table (<>0 on BERT partitions)

fillp:	ld	hl,BPARTDATA-1
	ld	de,0
	xor	a
	ld	b,a

fillpl: push	bc
	push	af
	push	de
	ex	af,af'
	ld	c,(ix)	; Can be 'boot partition' of 'ID' value
	ld	(hl),c
	ld	a,(tabtype)
	cp	2
	push	af
	jr	nz,redp10
	ld	(hl),0	; so it wasn't 'bootpartitie' value
redp10: inc	hl
	ld	a,(ix+4)	; type
	or	a
	jp	z,redpzz
	ld	(hl),b	; old partition nr. (i.e. current one)
	inc	hl
	ld	(hl),a
	ld	bc,7	; skip 6 'max nr. of blabla' bytes
	add	hl,bc
	ld	c,(ix+8)	; start sector
	ld	b,(ix+9)
	ex	af,af'
	ex	de,hl
	add	hl,bc
	ex	de,hl
	adc	a,(ix+10)
	ld	(hl),e
	inc	hl
	ld	(hl),d
	inc	hl
	ld	(hl),a
	inc	hl
	ld  (hl),0
	inc	hl
	ex	de,hl	; nr. of sectors
	push	ix
	pop	hl
	ld	bc,12
	add	hl,bc
	ld	c,4
	ldir

	pop	af
	jr	z,fillp2	; MSX
	or	a
	jr	z,fillp1	; PC/MAK3
	push	ix		; BERT: code read/write ID
	pop	hl
	push	de
	ld	b,8
fillpm: dec	hl
	ld	a,(hl)
	cp	4
	jr	nc,filp1b	; IDs not correctly filled: ini
	cpl
	rrca		; write
	rl	d
	rrca		; read
	rl	e
	djnz	fillpm
	pop	hl
	ld	(hl),e	; fill IDs
	inc	hl
	ld	(hl),d
	jr	filp1c

fillp2: ex	de,hl	; MSX table: read ID = 255, write ID = byte
	ld	(hl),255
	inc	hl
	ld	b,(ix)
	srl	b
	inc	b
	ld	a,1
wid1a:	rrca
	djnz wid1a
	ld	(hl),a
	jr	filp1c

filp1b: pop	de
fillp1: ex	de,hl
	ld	(hl),255	; old DOS table: ID's 255
	inc	hl
	ld	a,(SCSIID)
	ld	(hl),a

filp1c: inc  hl
	ld	a,(ix+4)	; FAT12?
	dec	a
	jp	nz,redp00
	ld	a,(ix+14)	 ; check whether < 65536 sectors
	or	(ix+15)
	jp	nz,redp00

; Read boot sector and copy data, read volume name, calculate max nr. of 
; clusters/dir&FATsectors
; (To recap: IX = partition data, HL = BPARTDATA-entry (is now on volume name))

	ld	(temp),hl
	ld	(hl),255	; Put empty volume name
	push	ix
	push	hl	; Read start sector (not from partition sector!BERT)
	pop	iy
	ld	e,(iy-10)
	ld	d,(iy-9)
	ld	c,(iy-8)
	push	bc
	push	de
	ld	hl,BOOTSEC
	ld	b,1
	ld	a,(dev_SCSIID)
	SCSICALL ReadBlocks  ; Read boot sector
	inc	d
	dec	d
	jp	nz,errorr

; Bereken eerste dir-sector
	ld	a,(BOOTSEC+10h)  ; Nr. of FATs
	ld	hl,(BOOTSEC+16h) ; Nr. of sectors per FAT
	call	mult8_16
	ld	de,(BOOTSEC+0Eh) ; Nr. of reserved sectors
	add	hl,de	 	 ; First directory sector
	pop	de
	pop	bc
	add	hl,de	 	 ; First directory sector on HD
	ex	de,hl
	ld	hl,(BOOTSEC+11h) ; Nr. of directory entries
	ld	iy,0	 	 ; Nr. of used directory entries
	jr	nc,redsc1

redsc5: inc	c
redsc1: push	bc
	push	de
	push	hl
	ld	b,1
	ld	a,(dev_SCSIID)
	ld	hl,BOOTSEC+512

	push	iy
	SCSICALL ReadBlocks  ; Read directory sector
	inc	d
	dec	d
	jp	nz,errorr
	pop	iy
	pop  bc
	ld  ix,BOOTSEC+512
redsc4: ld	a,(ix)		; Search inside 1 directory sector
	or	a		; no more filled entries?
	jr	z,redsc3
	cp	0E5h		; deleted entry?
	jr	z,redsc2
	inc	iy		; increase number of entries
	ld	a,(ix+11)
	and	8		; volume name?
	jr	z,redsc2
	push	ix
	pop	hl
	ld	de,(temp)	; Move volume name
	push	bc
	ld	bc,11
	ldir
	pop	bc
redsc2: dec	bc             ; Was this last directory entry?
	ld	a,b
	or	c
	jr	z,redsc3
	ld	de,32
	add	ix,de
	push	ix
	pop	hl
;;;
;	 push  iy
;	 pop	 de
;	 ld	   a,80
;	 call  prient
;;;;;
	ld	de,BOOTSEC+400H
	call	dcompr
	jr	nz,redsc4
	ld	h,b
	ld	l,c
	pop	de             ; Next directory sector
	pop	bc
	inc	de
	ld	a,d
	or	e
	jr	nz,redsc1
	jr	redsc5

redsc3: pop	de
	pop	bc
	push	iy		; Max. nr. of needed directory entries
	pop	hl
	ld	de,15		; + 15, /16, check if 0
	add	hl,de
	ld	b,4
redsc6: srl	h
	rr	l
	djnz	redsc6
	ld	a,h
	or	l
	jr	nz,redsc7
	inc	l
redsc7: ld	iy,(temp)	; Max. nr. of needed directory sectors
	ld	(iy-16),l
	ld	(iy-15),h

	ld	hl,(temp)      ; Fill other boot sector data
	ld	bc,11
	add	hl,bc
	ex	de,hl
	ld	hl,BOOTSEC+3
	ld	c,8            ;!B=0 ; OEM name
	ldir
	inc	hl             ; sec/cluster, reserved sec, FATs, DIR entries
	inc	hl
	ld	c,6
	ldir
	inc	hl             ; medium descr, sec/FAT
	inc	hl
	ldi
	ldi
	ldi
	ex	de,hl
	pop	ix
	jr	redp01

redp00: ld	bc,28	; from write-ID to 'boot partition byte'
	add	hl,bc
redp01: ld	a,(tabtype)
	or	a
	jr	z,redp02
	ld	bc,16	; next partition
	add	ix,bc
	push	hl
	push	ix	; check last entry (outside of sector?)
	pop	hl
	ld	de,PARTSEC+1FEh
	call	dcompr
	pop	hl
	jr	c,redp03
redpbb: pop	de
	pop	af
	pop	bc
	inc	b
	jr	redpzv

redp02: ld	a,(PARTSEC+1D2h)
	cp	5
	jr	nz,redpbb	; Ready
	pop	de		; BERT: read new boot sector
	pop	af
	ld	c,(ix+24)
	ld	b,(ix+25)
	ex	de,hl
	add	hl,bc
	ex	de,hl
	adc  a,(ix+26)
	ld	c,a
	push	af
	push	de
	push	hl
	ld	b,1
	ld	hl,PARTSEC
	ld	a,(dev_SCSIID)
	SCSICALL ReadBlocks
	inc	d
	dec	d
	jp	nz,errorr
	ld	ix,PARTSEC+1BEh
	pop	hl
redp03: pop	de
	pop	af
	pop	bc
	inc	b
	jp	fillpl

redpzz: pop	af
	pop	de
	pop	af
	pop	bc
redpzv: ld	a,b
redpzx: ld	(nr_parts),a
	ld	(Bnr_parts),a
	ld	hl,BDMAPDATA	; Copy backup data
	ld	de,DMAPDATA
	ld	bc,8
	ldir
	or	a
	ret	z
	ld	hl,BPARTDATA-1
	ld	de,PARTDATA-1
redpzy: ldi
	ldi
	ldi
	ld	bc,10
	add	hl,bc
  ld	c,L_PARTDATA-3
	ldir
	dec	a
	jr	nz,redpzy
	;;!!
	ld	a,(nr_parts)
	ld  b,a
	ld	hl,PARTDATA
	ld	de,L_PARTDATA
zzzzzz: 	 ld    (HL),255
	add	hl,de
	djnz zzzzzz
	ld	a,(nr_parts)
	ld	b,a
	ld	hl,BPARTDATA
	ld	de,L_BPARTDATA
zzzzz:		ld    (HL),255
	add	hl,de
	djnz zzzzz
	;;!!
	ret

.comment &
redpzy: ldi
	ldi
	ldi
	ld	bc,10
	add	hl,bc
	ld	c,L_PARTDATA-3
	ldir
	dec	a
	jr	nz,redpzy
	ret
&

inidmap:
	ld	hl,BDMAPDATA	; Ini BDMAPDATA
	ld	b,8
redp22: ld	(hl),255
	inc	hl
	djnz	redp22
	ret


; --
stack:	dw	0
written: db	0	; 255: er is iets aan de partitiegrootte veranderd
		  ; en weggeschreven. Programma niet verlaten!
WriteHD: ; Schrijf alles weg op HD.
	ld	a,(toobig)
	or	a
	jr	z,writit
	ld	de,txtbig
	ld	a,33
	jp	textwin
txtbig: db	"You over-allocated harddisk-space",255

writxt: db	"All data on harddisk will be lost!",0
	db	"             Continue?",0
	db	"         ",'Y'+128,"es           ",'N'+128,"o",255

writit: di		; Sure Y/N?
	ld_bc 5,38
	ld	a,4
	call	putwin
	ld	de,writxt
	ld_hl 23,12
	call	print
	ei
	call	wtkey
	push	af
	di
	call	getwin
	ei
	pop	af
	and	%11011111
	cp	"Y"
	ret	nz

	ld  (stack),sp
	ld	a,255
	ld	(written),a
	call	MovePart	; Schuif alle data die bewaard moet blijven
			;  naar zijn goede plaats
	call	WritePData	; Schrijf partitietabel en bootsectoren weg

	ld	a,(tabtype)
	ld	(Btabtype),a
	ld	a,(nr_parts)	; Verplaats PARTDATA naar BPARTDATA
	ld	(Bnr_parts),a
	ld	hl,PARTDATA-1	; BEHALVE 10 DATA in BPARTDATA!!!!  ;;!!
	ld	de,BPARTDATA-1
aassf:	ldi
	ldi
	ldi
	ld	bc,10
	ex	de,hl
	add	hl,bc
	ex	de,hl
	ld	bc,L_PARTDATA-3
	ldir
	dec	a
  jr	nz,aassf
	ld	de,wrttxt
	ld	a,2
	jp	textwin
wrttxt: db	"OK",255


MovePart:	ret	;!!

partinidata:	db 0EBh,0FEh,90h,"SCSI_HD "
MAK3inidata:	db "FDISK 3.0",0,0

.COMMENT &   ; OUD
WritePData:	; Schrijf voor alle MSX-partities bootsectoren weg
		; Ini gereserveerde sectoren, FAT + DIR als dat moet
		; Schrijf partitietabel weg


	ld	de,0EBEBh
	ld	hl,MAK3inidata
	ld	a,(tabtype)	; Ini partitie-sector
	sub	3	; MAK3: Ini hele sector op MAK3 formaat
	jr	z,wrtpk
	ld	e,a
  ld	a,(Btabtype)
	sub	3
	jr	c,wrtpj
	ld	hl,partinidata	; Hiervoor geen of MAK3 tabel: ini hele sector
	ld	de,0AA55h	;  (ID en bytes+volumenaam)
wrtpk:	ld	(PARTSEC+1FEh),de
	ld	de,PARTSEC
	ld	bc,11
	ldir
	ld	bc,1F2h
	jr  wrtp9

wrtpj:	inc	a	; als tabtype of Btabtype = 2,
	ld	bc,5Fh	; dan 6 entries ini-en
	jr	z,wrtp9
	inc	e
	jr	z,wrtp9
	ld	bc,3Fh	; Anders 4 entries
wrtp9:	ld	hl,PARTSEC+1FDh
	ld	de,PARTSEC+1FCh
	ld	(hl),0
	lddr

	ld	hl,BOOTSEC+512	; Ini gebied met nullen voor FAT/DIR
	ld	de,BOOTSEC+513
	ld	(hl),c	;!C=0
	ld	bc,511
	ldir

; Kijk voor elke bootsector of 'ie moet worden weggeschreven
	ld	hl,1	; CHL = beginsector van partitie
	ld	c,0
	ld	de,PARTSEC+1BEh ; DE = pointer naar partitiedata
	ld	a,(tabtype)	; voor BERT / PC
	sub	2
	jr	c,wrtp3
	ld	de,PARTSEC+19Eh ; voor MSX
	jr	z,wrtp3
	ld	de,PARTSEC+100h ; voor MAK3
wrtp3:	ld	a,(nr_parts)
	ld	b,a	; B = teller
	ld	ix,PARTDATA+19	; op OEM naam
	push	de

wrtpl:

	;;;
;	 ld	 a,0
;	 call  prient
	;;;;
	ld	a,(ix-18)
	dec	a	;CP 1 (geen FAT12? doe niets)
	jp	nz,wrtp1
	ld	a,(ix-15)	; > 65535 sectoren? doe niets
	or	(ix-14)
	jp	nz,wrtp1

wrtp2:	; Verander bootsector-instellingen
	ex	de,hl
	push	de	; sectornr. + teller
	push	bc
	push	ix
	ld	a,(ix-19)	; Partitie ini-en? Dan nieuwe boot neerzetten
	inc	a	;255?
	jr	nz,wrtpp
	ld	hl,DOS2BOOT
	ld	de,BOOTSEC
	ld	bc,512
	ldir
	ld	h,40h	; Schakel Basic in voor MathPack
	ld	a,(0fcc1h)
	call	24h
	call	Random	; Random Vol-ID
	ld	(BOOTSEC+27h),HL
	call	Random
	ld	(BOOTSEC+29h),HL
	ld	h,40h
	ld	a,(curslot)
	call	24h
	jr	wrtpq
wrtpp:	ld	b,1  ; Lees sector
	ld	hl,BOOTSEC
	ld  a,(dev_SCSIID)
	SCSICALL ReadBlocks
	ld	a,d
	or	a
	jp	nz,errorr
wrtpq:
;	 ;;;;;**
;	 ld	 hl,jooop
;	 pop	 de
 ;	 push  de
;	 ld	 bc,17
;	 ldir
;	 jr wwwww
;jooop:  db "OEM_NAME",16,1,0,2,112,0,0f0h,12,0
;
;wwwww:
;;;;;;;;;;;;**
	pop	hl
	push	hl
	push	hl
	pop	ix
	ld	de,BOOTSEC+3	; Verander sector
	ld	bc,8	; OEM-naam
	ldir
	inc	de	; sec/cl, ger.sec, FATs, DIR entries
	inc	de
	ld	c,6
	ldir
	ld	a,(ix-17)	; aantal sectoren
	ld	(de),a
	inc	de
	ld	a,(ix-16)
	ld	(de),a
	inc	de
	ldi	  ; medium descr, sec/FAT
	ldi
	pop	hl
	pop	bc	; Schrijf sector weg
	pop	de	; CDE = sector
	push	de
	push	bc
	push	hl
	ld	hl,BOOTSEC
	ld	b,1
	ld  a,(dev_SCSIID)
	SCSICALL WriteBlocks
	ld	a,d
	or	a
	jp	nz,errorw
	pop	ix
	pop	bc
	pop	de

; Partitie ini-en?
	;;;
;   ld	 a,80
;	 call  prient
	;;;

	ld	a,(ix-19)
	inc	a	;255?
	jp	nz,wrtp1
; Ini gereserveerde sec, FAT en dir
	push	de
	push	bc
	ld	l,(ix+9)	; gereserveerde sectoren
	ld	h,(ix+10)
	call	Inisecb

  ld	a,(ix+11)	; FATs
wrtp6:	push	af
	ld	a,(ix+14)	; ini 3 eerste FAT-bytes
	ld	hl,BOOTSEC+512
	ld	(hl),a
	inc	hl
	ld	(hl),255
	inc	hl
	ld	(hl),255
	ld	hl,1
	call	Inisec
	ld	hl,BOOTSEC+512
	xor	a
	ld	(hl),a
	inc	hl
	ld	(hl),a
	inc	hl
	ld	(hl),a
	ld	l,(ix+15)
	ld	h,(ix+16)
	call	Iniseca
	pop	af
	dec	a
	jr	nz,wrtp6

	push	de	; Verplaats volumenaam?
	push	bc	;;;;!! eigenlijk moet je hier ook datum enz. invullen
	push	ix
	pop	hl
	ld	bc,11
	or	a
	sbc	hl,bc
	ld	a,(hl)
	inc	a
	jr	z,wrtpc		 ; Geen vol.naam ingevuld
	ld	de,BOOTSEC+512
	ldir
	ld	a,9
	ld	(de),a
wrtpc:	pop	bc
	pop	de
	ld	hl,1
	call	Inisec
	push	de
	push	bc
	ld	hl,BOOTSEC+524	; Maak weer leeg
	ld	de,BOOTSEC+523
	ld	bc,12
	lddr
	pop	bc
	pop	de

	ld	l,(ix+12)	; DIR-1 = (aantal entries-1)\16
	ld	h,(ix+13)
	dec	hl
	ld	b,4
wrtp8:	srl	h
	rr	l
	djnz	wrtp8
	;;;
;	  ld	  a,160
 ;    call  prient
	;;;
	ld	a,h
	or	l
	jr	z,wrtp7
	call	Inisec
wrtp7:	pop  bc
	pop	de
wrtp11: ex	de,hl
wrtp1:	pop	de

	call	FillPData	; Vul gegevens van deze partitie in p.tabel in
	push	de
	ld	e,(ix-17)	; Bereken beginsector volgende partitie
	ld	d,(ix-16)
	ld	a,(ix-15)
	add	hl,de
	adc	a,c
	ld	c,a
	ld	a,(tabtype)
	or	a
	jr	nz,wrtpa
	inc	hl	; BERT? Tel dan nog 1 op (partsec overslaan)
	ld	a,l
	or	h
	jr	nz,wrtpa
	inc	c
wrtpa:	ld	de,L_PARTDATA  ; Volgende entry
	add	ix,de
;;;
;	 ld	 a,240
 ;	 call  prient
	;;;
	dec	b
	jp	nz,wrtpl
	pop	de

	ld	a,(tabtype)    ; Schrijf partitietabel weg
	or	a	; Behalve bij BERT
	ret	z
	ld	a,(dev_SCSIID)
	ld	bc,100h
	ld	de,0
	ld	hl,PARTSEC
  SCSICALL WriteBlocks
	ld	a,d
	or	a
	jp	nz,errorw
	ret

Inisec: ; Schrijf HL sectoren weg, vanaf CDE
	; Uit: HL=0, CDE opgehoogd
	push	bc
	push	de
	push	hl
	push	ix
	ld	hl,BOOTSEC+512
	ld	b,1
	ld	a,(dev_SCSIID)
	SCSICALL WriteBlocks
	ld	a,d
	or	a
	jp	nz,errorw
	pop	ix
	pop	hl
	pop	de
	pop	bc
Inisecb: inc	 de	; sneaky calls om 1 sector minder te schrijven
	ld	a,e
	or	d
	jr	nz,Iniseca
	inc	c
Iniseca: dec	 hl
	ld	a,h
	or	l
	jr	nz,Inisec
	ret

FillPData: ; Vul entry in partitietabel met data
	; In: DE = begin entry, IX = PARTDATA+19+x, CHL = beginsector
	; Uit: BC,HL,IX onveranderd, DE = volgende entry

	push	hl
	push	bc
	ld	a,(tabtype)
	push	af
	cp	2
	ld	b,(ix-20)	; BERT/PC/MAK3: 'bootpartitie' byte
	jr	nz,filpd2
	ld	a,(ix-12)	; MSX part: Write ID, reken om naar MAK waarde
	ld	b,255
filpd1: inc	b
	rlca
	jr	nc,filpd1
	sla	b
filpd2: ex	de,hl
	ld	(hl),b
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	ld	a,(ix-18)	; type
	ld	(hl),a
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	pop	af
	or	a
	push	af
	jr	nz,filpdy
	ld	(hl),1	; BERT: beginsect = 1
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	jr	filpdz
filpdy: call	fillstsec	; vul beginsect.
filpdz: ex	de,hl
	push	ix	; aantal sect
	pop	hl
	ld	bc,-17
	add	hl,bc
	ld	bc,4
  ldir
;;;;;;;;;;;
;	 ld	 a,40
;	 call  prient
	;;;;;;
	pop	af
	pop	bc
	pop	hl
	ret	nz	; geen BERT

	push	ix
	push	hl
	push	bc
	dec	b	; laatste partitie?
	jr	z,filpd7
	ld	a,c
	ex	de,hl	; Vul data volgende partitiesector in
	ld  bc,4
	add	hl,bc
	ld	(hl),5  ; type
	add	hl,bc
	ld	e,(ix-17)	; Beginsec=aantal partitiesec+1
	ld	d,(ix-16)
	ld	c,(ix-15)
	inc	de
	ld	a,d
	or	e
	jr	nz,filpdx
	inc	c
filpdx: call	fillstsec	; vul in
	ld	(hl),1	; aantal sectoren=1
	jr	filpd6
filpd7: ld	h,d	; Ini 2e entry (laatste partitie)
	ld	l,e
	inc	de	; (HL)=0
	ld	c,12	;!B=0
	ldir
filpd6: ld	hl,PARTSEC+1BEh ; Vul read/write ID's in
	ld	d,(ix-13)	; read ID
	ld	e,(ix-12)	; write ID
	ld	b,8
filpd4: xor	a
	sla	d
	rla
  sla	e
	rla
	xor	3
	dec	hl
	ld	(hl),a
	djnz	filpd4

	pop	bc
	pop	de
	push	de
	push	bc
	dec  de	; partitie-sector = Beginsector-1
	ld	a,e	; 0?
	or	d
	or	c
	jr  nz,filpd3
	ld	a,(DMAPDATA)
	inc	a
	jr	z,filpd5	; Staan er waarden in?
	push	de
	push	bc
	ld	hl,PARTSEC+1F3h ; kopieer dan DMAPDATA
	ld	(hl),'D'
	inc	hl
	ld	(hl),'r'
	inc	hl
	ld	(hl),'v'
	inc	hl
	ex	de,hl
	ld	hl,DMAPDATA
	ld	bc,8
	ldir
	pop	bc
	pop	de
	jr	filpd5
filpd3: ld	a,d	; DE=FFFF? dan C=C-1
	and	e
	inc	a
	jr	nz,filpd5
	dec	c
filpd5: ld	hl,PARTSEC	; Schrijf sector weg
	ld	a,(dev_SCSIID)
	ld	b,1
	SCSICALL WriteBlocks
	ld	a,d
	or	a
	jp	nz,errorw
	ld	hl,PARTSEC+1F2h ; Wis (evt.) drive-data
	ld	de,PARTSEC+1F3h
	ld	bc,11
	ldir
	pop	bc
	pop	hl
	pop	ix
	ld	de,PARTSEC+1BEh
	ret


fillstsec: ; Vul sectornr (CDE) in (HL) in. Uit: HL=HL+4
	ld	(hl),e
	inc	hl
	ld	(hl),d
	inc	hl
	ld	(hl),c
	inc	hl
	ld	(hl),0
	inc	hl
	ret

Random: ld	a,2	 ;DAC is integer
	ld	(VALTYP),a
	ld	hl,1	 ;Neem RND(1)
	ld	a,(FlagRnd)	 ;Routine al aangeroepen?
	or	a
	jr  nz,RndCont
	dec	a
	ld	(FlagRnd),a
	ld	hl,(JIFFY)	 ;hl=TIME
	set	7,h
RndCont: ld	(DAC+2),hl
	BIOS	RND
	BIOS	FRCINT
	ld	hl,(DAC+2)
	ret
FlagRnd:	  db     0			;Wordt 255 na eerste aanroep

; --
& ; OUDDDDDD


.comment &
; --
stack:	dw	0
written: db	0 ; 255: er is iets aan de partitiegrootte veranderd
		  ; en weggeschreven. Programma niet verlaten!
WriteHD: ; Schrijf alles weg op HD.
	ld	(stack),sp
	call	CheckW
	ld	a,255	; Geef aan dat diskinhoud veranderd is.
	ld	(written),a
	call	MovePart	; Schuif alle data die bewaard moet blijven
			;  naar zijn goede plaats
	call	WritePData	; Schrijf partitietabel en bootsectoren weg

	ld	a,(tabtype)
	ld	(Btabtype),a
	ld	a,(nr_parts)	; Verplaats PARTDATA naar BPARTDATA
	ld	(Bnr_parts),a
	ld	hl,PARTDATA-1	; BEHALVE 10 DATA in BPARTDATA!!!!  ;;!!
	ld	de,BPARTDATA-1
aassf:	ldi
	ldi
	ldi
	ld	bc,10
	ex	de,hl
	add	hl,bc
	ex	de,hl
	ld	bc,L_PARTDATA-3
	ldir
	dec	a
	jr	nz,aassf
	ld	de,wrttxt
	ld	a,2
	jp	textwin
wrttxt: db	"OK",255


CheckW: ; Check numerous things and display textwindows and things like that
	ld	a,(nr_parts)
	or	a
	jp	z,whdret
	call	Checkit	; No data changed? Then don't write
	jr	nz,whd0
	ld	de,txtnoc
	ld	a,24
	jp	textwin0
txtnoc: db	"No data has been changed",255

whd0:	ld	a,(toobig)	; Over-allocated space?
	or	a
	jr	z,whd1
	ld	de,txtbig
	ld	a,33
	jp	textwin
txtbig: db	"You over-allocated harddisk-space",255

whd1:	;!!	Routine that sanity-checks bootsector-entries
	;!! No! Has to be at loading, cause otherwise you will have to
	; build checks in every calculating routine.

whd2:	; Routine that checks which partitions have to be moved.

;;!! to be done: check on the begin-datasector sector

	ld	hl,0
	ld	b,0
	exx
	ld	hl,MOVETABLE+127
	ld	de,MOVETABLE+126
	ld	bc,127
	ld	(hl),b
	lddr
	ld	c,8	;!B=0
	ld	(tempw1),hl
	add	hl,bc
	ld	(tempw2),hl
	add	hl,bc
	ld	(tempw3),hl
	add	hl,bc
	ld	(tempw4),hl
	ld	ix,PARTDATA-1
	ld	de,BPARTDATA+O_BACK+O_SC
	inc	b	;!B=0

whdl0:	ld	a,(ix+O_OLDP)
	inc	a	;255?
	jr	nz,whd21
	ld	hl,(tempw1)	; Ini partition
	ld	(hl),b
	inc	hl
	ld	(tempw1),hl
	jr	whdl1
whd21:	ld	a,(de)
	cp	(ix+O_SC)
	jr	z,whd22
	ld	hl,(tempw2)	; Ini partition because changed sec/cluster
	ld	(hl),b
	inc	hl
	ld	(tempw2),hl
	jr	whdl1
whd22:	exx
	push	bc
	push	hl
  push	bc	; Bereken begin-datasector
	push	hl
	call	NoResSec
	pop	hl
	pop	bc
	add	hl,de
	jr	nc,whd24
	inc	b
whd24:	push	bc	; Bereken begin-datasector van oude partitie
	push	hl
	push	ix
	ld	b,(IX+O_OLDP)	; (<255)
	inc	b
	ld	ix,BPARTDATA-L_BPARTDATA+O_BACK
	ld	de,L_BPARTDATA
whdl3:	add	ix,de
	djnz	whdl3
	call	NoResSec	; Offset van datasector
	ld	l,(ix-O_BACK+6) ; Startsector
	ld	h,(ix-O_BACK+7)
	ld	a,(ix-O_BACK+8)
	add	hl,de
	adc	a,0
	ex	de,hl
	pop	ix
	pop	hl
	pop	bc
	cp	b	; Compare BHL (datasec) with ADE (old datasec)
	jr	nz,whd26
	call	dcompr
	jr	nz,whd26
	ld	hl,(tempw3)	; Partition remains intact
	ld	(hl),b
	inc	hl
	ld	(tempw3),hl
	jr	whdl1
whd26:	ld	hl,(tempw4)	; Partition remains intact if moved
	ld	(hl),b
	inc	hl
	ld	(tempw4),hl
whdl1:
	exx		; BHL' = BHL' + length (= startsector next part)
	ld	e,(IX+O_LENG)
	ld	d,(IX+O_LENG+1)
	add	hl,de
	jr	nc,whd23
	inc	b
whd23:	exx
	ex	de,hl
	ld	de,L_PARTDATA
	add	ix,de
	ld	de,L_BPARTDATA
	add	hl,de
	ex	de,hl
	ld	a,(nr_parts)
	cp	b
	inc	b
	jp	c,whdl0

; Print window that gives summary
	ld	a,2
	ld_hl 3,0
	ld_bc 26,74
	call	putwin
	ld	de,t_whd0	; 'Summary:'
	ld_hl 5,1
	call	print

	ld_hl 1,2	; L=ycoord, H=number (1-4)
whd3l0: push	hl
	ld	b,h	; Next group
	ld	hl,MOVETABLE-32
	ld	de,32
	add	hl,de
	ld	a,(hl)	; Entries in this group?
	or  a
  jp	z,whd30	; No

	pop	de
	push	de
	ld	a,d
	ld	b,14	; B = max nr of partitions printed next to each
	sub	3	; other
	jr	c,whd32
	ld	b,4
	jr	z,whd32
	ld	b,2
whd32:
	push	bc
	push	hl
	ld	h,5	; Print 'Partitions:'
	ld	l,e	;!E saved from 'pop de'
	ld	de,t_whdp
	call	print
	pop	hl
whd311: pop	bc
	pop	de
	ld	a,d
	push	de
	ld	c,0
whd3l1: push	bc
	push	hl
	push	af
	ld	l,(hl)
	ld	h,0
	ld	a,' '
	out	(98h),a
	ld	de,dectab-4
	ld	b,2
	call	decprt00
	pop	af
	sub	3	; Print some other things if necessary
	jr	c,whd34
	pop	hl
	push	hl
	push	af
	ld	b,(hl)
	push	bc
	ld	de,t_whdw	; ' (was '
	call	print_
	pop	bc
	inc	b
	ld	ix,PARTDATA-L_PARTDATA
whd35:	add	ix,bc
	djnz	whd35
	ld	l,(ix+O_OLDP)
	ld	h,0
	ld	de,dectab-4
	ld	b,2
	call	decprt00
	pop	af
	jr	z,whd36	; If not necessary to move, print only ')'
	ld	a,' '           ; Print chars
	out	(98h),a
	ld	a,'-'
	out	(98h),a
	ld	a,' '
	out	(98h),a
	ld	b,(ix+O_OLDP)	; Print number of datasec to be moved
	inc	b
	ld	ix,BPARTDATA-L_BPARTDATA
	ld	de,L_BPARTDATA
whdl4:	add	ix,de
	djnz	whdl4
	ld	l,(ix+4)
	ld	h,(ix+5)
	ld	b,2
	ld	de,dectab-10
	call	decprt00	; print ' datasectors)'
	ld	de,t_whdd
	call	print_
whd36:	ld	a,')'
	out	(98h),a
whd34:	pop	hl
	pop	bc
	inc	hl	; More entries in this group?
	ld	a,(hl)
	or	a
	jr	z,whd31
	ld	a,','
	out	(98h),a
	inc	c	; More entries on this line?
	ld	a,c
	cp	b
	jr	c,whd3l1
	pop	hl	; Increase ycoord, set write-address
	inc	l
	push	hl
	push	bc
	ld	h,16
	call	setwrt_xy
	jp	whd311

whd31:	pop	hl	; DE = text to be printed
	push	hl
	ld	e,h
	sla	e
	ld	d,0
	ld	hl,whd3t-2
	add	hl,de
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	pop	hl	; Increase Y (till line after) and print text
	inc	l
	inc	l
	push	hl
	dec	l
	ld	h,6
	call	print

whd30:	pop	hl
	inc	h
	ld	a,5
	cp	h
	jp	nc,whd3l0



whd3t:	dw	t_whd1,t_whd2,t_whd3,t_whd4
t_whd0: db	"SUMMARY:",255
t_whdp: db	"Partitions ",255
t_whdw: db	" (was ",255
t_whdd: db	" datasec",255
t_whd1: db	"will be initialised because you have specified this",255
t_whd2: db	"will be initialised because of a changed number of sectors per cluster",255
t_whd3: db	"will remain intact",255
t_whd4: db	"will remain intact if the datasectors are moved.",0
	db	"This can take a long time!",255

writxt: db	"All data on harddisk will be lost!",0
	db	"             Continue?",0
	db	"         ",'Y'+128,"es           ",'N'+128,"o",255

writit: di		; Sure Y/N?
	ld_bc 5,38
	ld	a,4
	call	putwin
	ld	de,writxt
	ld_hl 23,12
	call	print
	ei
	call	wtkey
	push	af
	di
	call	getwin
	ei
	pop	af
	and	%11011111
	cp	"Y"
	ret	z
whdret: ld	sp,(stack)
	ret


MovePart:	ret	;!!

partinidata:	db 0EBh,0FEh,90h,"SCSI_HD "
MAK3inidata:	db "FDISK 3.0",0,0

&	; NIEUW


WritePData:	; Schrijf voor alle MSX-partities bootsectoren weg
		; Ini gereserveerde sectoren, FAT + DIR als dat moet
		; Schrijf partitietabel weg


	ld	de,0EBEBh
	ld	hl,MAK3inidata
	ld	a,(tabtype)	; Ini partitie-sector
	sub	3	; MAK3: Ini hele sector op MAK3 formaat
	jr	z,wrtpk
	ld	e,a
	ld	a,(Btabtype)
	sub	3
	jr	c,wrtpj
	ld	hl,partinidata	; Hiervoor geen of MAK3 tabel: ini hele sector
	ld	de,0AA55h	;  (ID en bytes+volumenaam)
wrtpk:	ld	(PARTSEC+1FEh),de
	ld	de,PARTSEC
	ld	bc,11
	ldir
	ld	bc,1F2h
	jr  wrtp9

wrtpj:	inc	a	; als tabtype of Btabtype = 2,
	ld	bc,5Fh	; dan 6 entries ini-en
	jr	z,wrtp9
	inc	e
	jr	z,wrtp9
	ld	bc,3Fh	; Anders 4 entries
wrtp9:	ld	hl,PARTSEC+1FDh
	ld	de,PARTSEC+1FCh
	ld	(hl),0
	lddr

	ld	hl,BOOTSEC+512	; Ini gebied met nullen voor FAT/DIR
	ld	de,BOOTSEC+513
	ld	(hl),c	;!C=0
	ld	bc,511
	ldir

; Kijk voor elke bootsector of 'ie moet worden weggeschreven
	ld	hl,1	; CHL = beginsector van partitie
	ld	c,0
	ld	de,PARTSEC+1BEh ; DE = pointer naar partitiedata
	ld	a,(tabtype)	; voor BERT / PC
	sub	2
	jr	c,wrtp3
	ld	de,PARTSEC+19Eh ; voor MSX
	jr	z,wrtp3
	ld	de,PARTSEC+100h ; voor MAK3
wrtp3:	ld	a,(nr_parts)
	ld	b,a	; B = teller
	ld	ix,PARTDATA+19	; op OEM naam
	push	de

wrtpl:

	;;;
;	 ld	 a,0
;	 call  prient
	;;;;
	ld	a,(ix-18)
	dec	a	;CP 1 (geen FAT12? doe niets)
	jp	nz,wrtp1
	ld	a,(ix-15)	; > 65535 sectoren? doe niets
	or	(ix-14)
	jp	nz,wrtp1

wrtp2:	; Verander bootsector-instellingen
	ex	de,hl
	push	de	; sectornr. + teller
	push	bc
	push	ix
	ld	a,(ix-19)	; Partitie ini-en? Dan nieuwe boot neerzetten
	inc	a	;255?
	jr	nz,wrtpp
	ld	hl,DOS2BOOT
	ld	de,BOOTSEC
	ld	bc,512
	ldir
	ld	h,40h	; Schakel Basic in voor MathPack
	ld	a,(0fcc1h)
	call	24h
	call	Random	; Random Vol-ID
	ld	(BOOTSEC+27h),HL
	call	Random
	ld	(BOOTSEC+29h),HL
	ld  h,40h
	ld	a,(curslot)
	call	24h
	jr	wrtpq
wrtpp:	ld	b,1  ; Lees sector
	ld	hl,BOOTSEC
	ld  a,(dev_SCSIID)
	SCSICALL ReadBlocks
	inc	d
	dec	d
	jp	nz,errorr
wrtpq:	pop	hl
	push	hl
	push	hl
	pop	ix
	ld	de,BOOTSEC+3	; Verander sector
	ld	bc,8	; OEM-naam
	ldir
	inc	de	; sec/cl, ger.sec, FATs, DIR entries
	inc	de
	ld	c,6
	ldir
	ld	a,(ix-17)	; aantal sectoren
	ld	(de),a
	inc	de
	ld	a,(ix-16)
	ld	(de),a
  inc	de
	ldi	  ; medium descr, sec/FAT
	ldi
	pop	hl
	pop	bc	; Schrijf sector weg
	pop	de	; CDE = sector
	push	de
	push	bc
	push	hl
	ld	hl,BOOTSEC
	ld	b,1
	ld  a,(dev_SCSIID)
	SCSICALL WriteBlocks
	inc	d
	dec	d
	jp	nz,errorw
	pop	ix
	pop	bc
	pop	de

; Partitie ini-en?
	;;;
;   ld	 a,80
;	 call  prient
	;;;

	ld	a,(ix-19)
	inc	a	;255?
	jp	nz,wrtp1
; Ini gereserveerde sec, FAT en dir
	push	de
	push	bc
	ld	l,(ix+9)	; gereserveerde sectoren
	ld	h,(ix+10)
	call	Inisecb

	ld	a,(ix+11)	; FATs
wrtp6:	push	af
	ld	a,(ix+14)	; ini 3 eerste FAT-bytes
	ld	hl,BOOTSEC+512
	ld	(hl),a
	inc	hl
	ld	(hl),255
	inc	hl
	ld	(hl),255
	ld	hl,1
	call	Inisec
	ld	hl,BOOTSEC+512
	xor	a
	ld	(hl),a
	inc	hl
	ld	(hl),a
	inc	hl
	ld	(hl),a
	ld	l,(ix+15)
	ld	h,(ix+16)
	call	Iniseca
	pop	af
	dec	a
	jr	nz,wrtp6

	push	de	; Verplaats volumenaam?
	push	bc	;;;;!! eigenlijk moet je hier ook datum enz. invullen
	push	ix
	pop	hl
	ld	bc,11
	or	a
	sbc	hl,bc
	ld	a,(hl)
	inc	a
	jr	z,wrtpc		 ; Geen vol.naam ingevuld
	ld	de,BOOTSEC+512
	ldir
	ld	a,9
	ld	(de),a
wrtpc:	pop	bc
	pop	de
	ld	hl,1
	call	Inisec
	push	de
	push	bc
	ld	hl,BOOTSEC+524	; Maak weer leeg
	ld	de,BOOTSEC+523
	ld	bc,12
  lddr
	pop	bc
	pop	de

	ld	l,(ix+12)	; DIR-1 = (aantal entries-1)\16
	ld	h,(ix+13)
	dec	hl
	ld	b,4
wrtp8:	srl	h
	rr	l
	djnz	wrtp8
	;;;
;	  ld	  a,160
 ;    call  prient
	;;;
	ld	a,h
	or	l
	jr	z,wrtp7
	call	Inisec
wrtp7:	pop  bc
	pop	de
wrtp11: ex	de,hl
wrtp1:	pop	de

	call	FillPData	; Vul gegevens van deze partitie in p.tabel in
	push	de
	ld	e,(ix-17)	; Bereken beginsector volgende partitie
	ld	d,(ix-16)
	ld	a,(ix-15)
	add	hl,de
	adc	a,c
	ld	c,a
	ld	a,(tabtype)
	or	a
	jr	nz,wrtpa
	inc	hl	; BERT? Tel dan nog 1 op (partsec overslaan)
	ld	a,l
	or	h
	jr	nz,wrtpa
	inc	c
wrtpa:	ld	de,L_PARTDATA  ; Volgende entry
	add	ix,de
;;;
;	 ld	 a,240
 ;	 call  prient
	;;;
	dec	b
	jp	nz,wrtpl
	pop	de

	ld	a,(tabtype)    ; Schrijf partitietabel weg
	or	a	; Behalve bij BERT
	ret	z
	ld	a,(dev_SCSIID)
	ld	bc,100h
	ld	de,0
	ld	hl,PARTSEC
	SCSICALL WriteBlocks
	inc	d
	dec	d
	jp	nz,errorw
	ret

Inisec: ; Schrijf HL sectoren weg, vanaf CDE
	; Uit: HL=0, CDE opgehoogd
	push	bc
	push	de
	push	hl
	push	ix
	ld	hl,BOOTSEC+512
	ld	b,1
	ld	a,(dev_SCSIID)
	SCSICALL WriteBlocks
	inc	d
	dec	d
	jp	nz,errorw
	pop	ix
	pop	hl
	pop	de
	pop	bc
Inisecb: inc	 de	; sneaky calls om 1 sector minder te schrijven
	ld	a,e
	or	d
	jr	nz,Iniseca
	inc	c
Iniseca: dec	 hl
	ld	a,h
	or	l
	jr	nz,Inisec
	ret

FillPData: ; Vul entry in partitietabel met data
	; In: DE = begin entry, IX = PARTDATA+19+x, CHL = beginsector
	; Uit: BC,HL,IX onveranderd, DE = volgende entry

	push	hl
	push	bc
	ld	a,(tabtype)
	push	af
	cp	2
	ld	b,(ix-20)	; BERT/PC/MAK3: 'bootpartitie' byte
	jr	nz,filpd2
	ld	a,(ix-12)	; MSX part: Write ID, reken om naar MAK waarde
	ld	b,255
filpd1: inc	b
	rlca
	jr	nc,filpd1
	sla	b
filpd2: ex	de,hl
	ld	(hl),b
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	ld	a,(ix-18)	; type
	ld	(hl),a
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	pop	af
	or	a
	push	af
	jr	nz,filpdy
	ld	(hl),1	; BERT: beginsect = 1
	inc	hl
	inc	hl
	inc	hl
	inc	hl
	jr	filpdz
filpdy: call	fillstsec	; vul beginsect.
filpdz: ex	de,hl
	push	ix	; aantal sect
	pop	hl
	ld	bc,-17
	add	hl,bc
	ld	bc,4
  ldir
;;;;;;;;;;;
;	 ld	 a,40
;	 call  prient
	;;;;;;
	pop	af
	pop	bc
	pop	hl
	ret	nz	; geen BERT

	push	ix
	push	hl
	push	bc
	dec	b	; laatste partitie?
	jr	z,filpd7
	ld	a,c
	ex	de,hl	; Vul data volgende partitiesector in
	ld	bc,4
	add	hl,bc
	ld	(hl),5	; type
	add	hl,bc
	ld	e,(ix-17)	; Beginsec=aantal partitiesec+1
	ld	d,(ix-16)
	ld	c,(ix-15)
	inc	de
	ld	a,d
	or	e
	jr	nz,filpdx
	inc	c
filpdx: call	fillstsec	; vul in
	ld	e,(ix-17+L_PARTDATA)	 ; Aantal sec = aantal + 1
	ld	d,(ix-16+L_PARTDATA)
	ld	c,(ix-15+L_PARTDATA)
	inc	de
	ld	a,d
	or	e
  jr	nz,filpxx
	inc	c
filpxx: call	fillstsec	; vul in
	jr	filpd6
filpd7: ld	h,d	; Ini 2e entry (laatste partitie)
	ld	l,e
	inc	de	; (HL)=0
	ld	c,12	;!B=0
	ldir
filpd6: ld	hl,PARTSEC+1BEh ; Vul read/write ID's in
	ld	d,(ix-13)	; read ID
	ld	e,(ix-12)	; write ID
	ld	b,8
filpd4: xor	a
	sla	d
	rla
  sla	e
	rla
	xor	3
	dec	hl
	ld	(hl),a
	djnz	filpd4

	pop	bc
	pop	de
	push	de
	push	bc
	dec  de	; partitie-sector = Beginsector-1
	ld	a,e	; 0?
	or	d
	or	c
	jr  nz,filpd3
	ld	a,(DMAPDATA)
	inc	a
	jr	z,filpd5	; Staan er waarden in?
	push	de
	push	bc
	ld	hl,PARTSEC+1F3h ; kopieer dan DMAPDATA
	ld	(hl),'D'
	inc	hl
	ld	(hl),'r'
	inc	hl
	ld	(hl),'v'
	inc	hl
	ex	de,hl
	ld	hl,DMAPDATA
	ld	bc,8
	ldir
	pop	bc
	pop	de
	jr	filpd5
filpd3: ld	a,d	; DE=FFFF? dan C=C-1
	and	e
	inc	a
	jr	nz,filpd5
	dec	c
filpd5: ld	hl,PARTSEC	; Schrijf sector weg
	ld	a,(dev_SCSIID)
	ld	b,1
	SCSICALL WriteBlocks
	inc	d
	dec	d
	jp	nz,errorw
	ld	hl,PARTSEC+1F2h ; Wis (evt.) drive-data
	ld	de,PARTSEC+1F3h
	ld	bc,11
	ldir
	pop	bc
	pop	hl
	pop	ix
	ld	de,PARTSEC+1BEh
	ret


fillstsec: ; Vul sectornr (CDE) in (HL) in. Uit: HL=HL+4
	ld	(hl),e
	inc	hl
	ld	(hl),d
	inc  hl
	ld	(hl),c
	inc	hl
	ld	(hl),0
	inc	hl
	ret

Random: ld	a,2	 ;DAC is integer
	ld	(VALTYP),a
	ld	hl,1	 ;Neem RND(1)
	ld	a,(FlagRnd)   ;Routine al aangeroepen?
	or	a
	jr  nz,RndCont
	dec	a
	ld	(FlagRnd),a
	ld	hl,(JIFFY)	 ;hl=TIME
	set	7,h
RndCont: ld	(DAC+2),hl
	BIOS	RND
	BIOS	FRCINT
	ld	hl,(DAC+2)
	ret
FlagRnd:	  db     0			;Wordt 255 na eerste aanroep

; --

Iniscr: ; Zet windows op scherm, print gegevens HD
	di
	ld_hl 1,19		       ; Te gebruiken toetsen
	ld_bc 7,78
	ld	a,2
	call	putwin
	ld_hl 3,20
	ld	de,t_w3
	call	print
	ld_hl WINX,WINY	; Gegevens van partities
	ld_bc WINLY,WINLX
	ld	a,2
	call	putwin
	ld_hl 15,7
	ld	de,t_w4
  call	print
	ld_hl 4,0	; Window: Gegevens van HD/vrije ruimte
	ld_bc 5,73
	ld	a,2
	call	putwin

	ld_hl 6,1
	call	setwrt_xy
	ld	hl,INQ_DATA	; Vendor ID
	ld	a,(cur_dev)
	ld	e,a
	ld	d,0
	ld	b,25h
inscl1: add	hl,de
	djnz	inscl1
	push	hl
	ld	de,9
	add	hl,de
	ld	b,8
	call	PrintTxt
	ld	de,1*80+16
	push	hl
	call	inisc1	; bepaal VRAM-adres
  ex	(sp),hl
	ld	b,16
	call	PrintTxt	; Product ID
	ld	a,(hl)	; eerste teken van revision-veld spatie?
	cp	32
	jr	z,inisc3
	or	a	; of nul? (Voor stomme IBM Harddisx)
	jr	z,inisc3
	ex	(sp),hl	; Oude VRAM-adres+17
	ld	de,17
	add	hl,de
	ex	de,hl
	pop	hl	; begin revision-veld (bepaal VRAM-adres)
	push	hl
	call	inisc1
	ld	hl,revtxt
	ld	b,11
	call	PrintTxt	; , revision
	pop	hl
	ld	b,4
	call	PrintTxt
	db	3eh	;!sla pop over

inisc3: pop	hl
	ld_hl 6,2	; SCSI version:
	call	setwrt_xy
	ld	hl,vertxt
	ld	b,13
	call	PrintTxt
	pop	ix
	ld	a,(ix+3)
	ld	c,a
	ld	b,1	; (nog geen komma geprint)
	and	7	; Print verschillende SCSI versienrs.
	ld	hl,anstxt
	call	nz,inisc2
	ld	a,c
	rrca
	rrca
	rrca
	and  7
  ld	hl,ecmtxt
	call	nz,inisc2
	ld	a,c
	rlca
	rlca
	and	3
	call	nz,inis22

	ld_hl 6,3
	ld	a,(ix+2)	; Removable?
	rla
	ld	de,t_nonrem
	jr	nc,inisva
	ld	de,t_rem
inisva: call	print
	ld_hl 48,1	; Tekst vrije ruimte
	ld	de,t_w2
	call	print
	ld_hl 21,3
	ld	de,t_w7	; Target/Host ID
	call	print
	call	PrintCapac
	ei
	ret


inis22: ld	hl,isotxt
inisc2: push	hl
	ld	l,a
	ld	h,0
	ld	a,b	; Is er al een ander versienr. geprint? (B=0)
	or	a
	jr	nz,inisc4
	ld	a,","
	out	(98h),a
inisc4: ld	de,dectab-4	; getal
	push	bc
	call	decprt
	pop	bc
	pop	hl
	ld	b,7
	call	PrintTxt
	ret

inisc1: dec	hl		; Verlaag E (x-coordinaat) als laatste tekens
	dec	e	; spaties waren.
	ld	a,(hl)
	cp	32
	jr	z,inisc1
	ex	de,hl
	jp	setwrt

PrintCapac:
	ld	hl,1*80+65
	call	setwrt
	ld	hl,(CAPACITY+1) ; 'Bereken' vrije ruimte (MSB=0)
	ld	b,l
	ld	a,(CAPACITY+3)
	ld	l,a		; BHL = laatste sectornr.
	ld	a,(tabtype)		; BERT: vr = lb - (np-1); als np=0 dan vr=lb
	or	a		; (2 gereserveerde sectoren), anders vr=lb
	ld	a,b
	jr	nz,inisc7
	ld	a,(nr_parts)
	or	a
	ld	de,1
	ld	a,b
	jp	z,inisc7
	ld	a,(nr_parts)
	dec	a
	ld	e,a
	ld	d,0
	ld	a,b
	sbc	hl,de
	sbc	a,d
inisc7: ld	(freespace),hl
	ld	(freespace+2),a
	push	af
	push	hl
	call	PrintMB	; Print capaciteit

	ld	hl,2*80+65
	call	setwrt
	ld	de,0		; Bepaal totale gealloceerde grootte
	xor	a
	ex	af,af'
	ld	a,(nr_parts)
	or	a
	ld	hl,0
	jp	z,inisc6va
	ld	hl,PARTDATA+2
capac2: ex	af,af'
	ld	c,(hl)	; Tel grootte bij ADE op
	inc	hl
	ld	b,(hl)
	inc	hl
	ex	de,hl
	add	hl,bc
	ex	de,hl
	adc	a,(hl)
	ld	bc,L_PARTDATA-2 ; volgende plaats in tabel & loopen?
	add	hl,bc
  ex  af,af'
	dec	a
	jr	nz,capac2
	ex	af,af'
	ex	de,hl
inisc6va:
	push	af
	push	 hl
	call	PrintMB	; Print gealloceerde MB

	ld	hl,3*80+64
	call	setwrt
	pop	de		; Bepaal vrije aantal MB (totale - gealloceerde)
	pop	bc
  pop	hl
	pop	af
	or	a
	sbc	hl,de
	sbc	a,b
	ld	b,a
	jr	nc,capac3
	cpl			; Negatief: maak getal positief en print -.
	ld	b,a
	ld	a,h
	cpl
	ld	h,a
	ld	a,l
	neg
	ld	l,a
	ld	a,"-"
	db	11h		; ! LD DE,
capac3: ld	a,32
	sub	32	; Dit is even heeeel knullig,ik weet het....
	ld	(toobig),a	; <> 0 : ruimte over-gealloceerd
	add	a,32
	out	(98h),a
	ld	a,b
	jp	PrintMB	; Print vrije ruimte
toobig: db	0
; ---
t_nonrem: db	"non-"
t_rem:	db	"removable",255
vertxt: db	"SCSI version:"
revtxt: db	", revision"    ;! spatie hierna!
anstxt: db	" (ANSI)"
ecmtxt: db	" (ECMA)"
isotxt: db	" (ISO)"        ;! spatie hierna!
t_w1:	db	" NFDISK v1.0 by RMt & AMs",0
	db	"(c) 5-1995 MSX Club Gouda",255
t_w2:	db	"total capacity:    0.000 MB",0
	db	"in use        :    0.000 MB",0
	db	"free          :    0.000 MB",255
t_w7:	db	"Target ID: "
t_w71:	db	"-  Host ID: "
t_w72:	db	"-",255
t_w3:	db	"Use cursors and spacebar to select and change values",0
	db	"                                 W = write new partition table to harddisk",0
	db	"INS   = insert a partition       P = select other type partion table",0
	db	"DEL   = delete a partition                                              ",0
	db	"                                 ESC = select other device or quit",255
;;&& t_w4:   db    " Nr Old Type         Sectors = MB    Volume name",0
t_w4:	db	" Nr WID Type         Sectors = MB    Volume name",0
t_w4a:	ds	t_w4a-t_w4,"-"
	db  255


Window1:
	xor	a
	ld	(firstpart),a
	ld	(cur_field),a
	ld	(old_field),a
	ld	(cur_part),a
	call	PrintPData
	call	MaxPart
	ld	a,b
	ld	(maxnoparts),a
	ld	a,WINY+3
	ld  (cur_reg),a
	ld	(old_reg),a
	ei
w1_loop2:
	call	filold
	call	filnew
w1_loop1:
	call	wtkey

	cp	28		;cursor naar rechts
	jp	z,w1_curright
	cp	29		;cursor naar links
	jp	z,w1_curleft
	cp	30		;cursor naar boven
	jp	z,w1_curup
	cp	31		;cursor naar beneden
	jp	z,w1_curdown
	cp	"p"
	jp	z,SelPartType
	cp	"P"
	jp	z,SelPartType
	cp	"w"
	call	z,WriteHD
	cp	"W"
	call	z,WriteHD

	cp	18
	jp	z,w1_inspart

	cp	#1b
	jp	z,BBack
	ex	af,af'
	ld	a,(cur_part)
	ld	b,a
	ld	a,(nr_parts)
	cp	b
	jp	z,w1_loop1
	ex	af,af'

	cp	127
	jp	z,w1_delpart
	cp	11
	jp	z,w1_initpar
	cp	32
	jp	z,w1_edit

	jp	w1_loop1

BBack:	ld	a,(cur_field)
	ld	(old_field),a
	ld	a,(cur_reg)
	ld	(old_reg),a
	call	filold
	call	Checkit	; Wijzigingen gemaakt?
	ret	z
	di
	ld_bc 5,32
	ld	a,4
	call	putwin
	ld	de,chatxt
	ld_hl 26,12
	call	print
	ei
	call	wtkey
	push	af
	di
	call	getwin
	ei
	pop	af
	and	%11011111
	cp	"Y"
	ret	z
	jp	Window1



filold: ld	b,1		;vul oude blok met window kleur
	ld	ix,xl_partgeg

	ld	a,(old_field)
	inc	a	;;&&&
	sla	a
	ld	e,a
	ld	d,0
	add	ix,de
	ld	a,(ix+1)
	ld	c,a
	ld	a,(ix)
	ld	h,a
	ld	a,(old_reg)
	ld	l,a
	ld	a,255
	di
	call	filcol
	ei
	ret

filnew	ld	b,1		;vul nieuwe blok met achtergrond kleur
	ld	ix,xl_partgeg

	ld	a,(cur_field)
	inc	a	;;&&&
	sla	a
	ld	e,a
	ld	d,0
	add	ix,de
	ld	a,(ix+1)
	ld	c,a
	ld	a,(ix)
	ld	h,a
	ld	a,(cur_reg)
	ld	l,a
	xor	a
	di
	call	filcol
	ei
	ret

w1_curright:
	ld	a,(cur_field)
	cp	2
	jp	z,w1_loop1	;als al maximum, dan terug
	ld	(old_field),a
	inc	a	;verhoog veld met een
	ld	(cur_field),a
	ld	a,(cur_reg)	;zet oude regel op huidige
	ld	(old_reg),a
	jp	w1_loop2

w1_curleft:
	ld	b,0
	ld	a,(tabtype)
  cp	1
	jr	z,ddDd
	cp	3
	jr	z,ddDd
	dec	b
ddDd:	ld	a,(cur_field)
	cp	b	;als al nul, dan terug
	jp	z,w1_loop1
	ld	(old_field),a
	dec	a	;verlaag veld met een
  ld	(cur_field),a
	ld	a,(cur_reg)	;zet oude regel op huidige
	ld	(old_reg),a
	jp	w1_loop2

w1_curup:
	ld	a,(cur_part)
	or	a	;als partitienummer al nul dan terug
	jp	z,w1_loop1
	dec	a	;verlaag partitienummer
	ld	(cur_part),a
	ld	a,(cur_reg)
	cp	WINY+3  ;controleer of pos. op scherm al minumum
	jp	z,w1_scrup	; zo ja dan scrollen
	ld	(old_reg),a
	dec	a	; zo nee dan regel hoger
	ld	(cur_reg),a
	ld	a,(cur_field)  ;zet oude field op nieuwe veld
	ld	(old_field),a
	jp	w1_loop2
w1_scrup:
  ld	a,(firstpart)	;verlaag als eerste af te beelden partitie
	dec	a
	ld	(firstpart),a
	call	PrintPData
	jp	w1_loop1

w1_curdown:
	ld	a,(maxnoparts)
	ld	b,a	;controleer of nr of parts.=maxpart
	ld	a,(nr_parts)	;zoja dan niet op lege regel gaan staan
	ld	c,a
	cp	b
	jp	nz,w1_notdec
	dec	c
w1_notdec:
	ld	a,(cur_part)
	cp	c
	jp	z,w1_loop1	;als partitienummer al gelijk aan hoogste dan
	inc	a	;terug
	ld	(cur_part),a
	ld	a,(cur_reg)
	cp	WINY+3+7
	jp	z,w1_scrdown	;controleer of op onderste regel, ja dan scroll
	ld	(old_reg),a
	inc	a	; nee dan regel lager
	ld	(cur_reg),a
	ld	a,(cur_field)	;zet oude veld op nieuwe waarde
	ld	(old_field),a
	jp	w1_loop2
w1_scrdown:
	ld	a,(firstpart)	;als eerste af te beelden partitie verhogen
	inc	a
	ld	(firstpart),a
	call	PrintPData
	jp	w1_loop1

w1_inspart:
	ld	a,(maxnoparts)
	ld	b,a
	ld	a,(nr_parts)
	cp	b
	jp	nz,w1_ipver	;controleer of maximum al bereikt is
	di		;als maximum al bereikt dan FOUT!
	ld	de,w1_errt2
	ld	a,w1_errt3-w1_errt2-1+128
	call	textwin
	ei
	jp	w1_loop1
w1_ipver:
	inc	a	; verhoog het aantal partities
	ld	(nr_parts),a
	ld	a,(cur_part)
	cpl		; -partitienummer
	add	a,MAXNOPARTS	; max. aantal - partitienummer = aantal op te schuiven

	ld	hl,PARTDATA+L_PARTDATA*(MAXNOPARTS-1)-2
			; Laatste byte van 1-na-laatse tabel-entry
	jp	z,w1_ipnmov

	push	hl
	ld	hl,L_PARTDATA	;schuif de rest van PARTDATA op
	call	mult8_16
	ex	(sp),hl	; HL = laatste byte
	pop	bc	; BC = lengte
	ld	de,PARTDATA+L_PARTDATA*MAXNOPARTS-2 ; DE = HL+L_PARTDATA
	lddr
w1_ipnmov:		; HL = eerste byte van entry - 1


	ld	a,(tabtype)	;set Write ID op SCSIID als MAK/HSH anders 255
	cp	2
;	 ld	 a,255
;	 jp	 nz,w1_ipver2
	ld	a,(SCSIID)
w1_ipver2:
	ld	(ee_wrID),a
	ld	b," "           ;zet nummer partitie in VOLUME
	ld	a,(cur_part)
	add	a,"0"+1
	cp	"9"+1
	jp	c,w1_ipok
	sub	10
	ld	b,"1"
w1_ipok:ld	(ee_p1+1),a
	ld	a,b
	ld	(ee_p1),a
	inc	hl
	push	hl	; eerste byte van PARTDATA entry
	ex	de,hl
	ld	hl,empty_entry-1 ;verplaats de lege entry naar het goede gebied
	ld	bc,L_PARTDATA
	ldir

	call	PrintPData	; Print data, zet balk goed
	ld	a,(cur_field)
	ld	(old_field),a
	ld	a,(cur_reg)
	ld	(old_reg),a
	call	filold
	ld	a,1
	ld	(cur_field),a
	ld	(old_field),a
	call	filnew
	pop	ix	; IX = PARTDATA-entry (in ieder geval voor edit)
	inc	ix
	ld	h,WINX5
	ld  a,(cur_reg)
	ld  l,a
	di
	push	hl
	call	setwrt_xy
	ld	b,7
w1_edilp1:
	ld	a,32	; maak veld leeg
	out	(#98),a
	djnz	w1_edilp1
	ei
	pop	hl
	ld	a,255	; edit grootte
	ld	(insflag),a
	call	w1_edMB
	ld	a,(insflag)
	or	a
	jr	z,ohoh
	xor	a
	ld	(insflag),a
	di
	call	PrintCapac
	ei
	jp	w1_curdown

insflag:	db 0

w1_delpart:
	ld	c,w1_wart1s-w1_wart1+3	;verwijder een partitie
	ld	b,4
	ld	a,4
	di
	call	putwin		;vraag om bevestiging
	ld	b,2
	ld	c,w1_wart1s-w1_wart1-1
	call	PUTMID
	ld	de,w1_wart1
	call	print
	BIOS	BEEP
	ei
	call	wtkey
	push	af
	di
	call	getwin
	ei
	pop	af
	and	%11011111	;als "Y" of "y" gekozen dan verwijderen
	cp	"Y"
	jp	nz,w1_loop1
ohoh:	ld	a,(cur_part)	;schuif de rest van de partities op
	cp	MAXNOPARTS-1
	jp	z,w1_nmovd
	ld	b,a
	inc	b
	ld	a,MAXNOPARTS	; A = Max. aantal partities - partitienummer
	sub	b
	ld	hl,PARTDATA-L_PARTDATA-1
	ld	de,L_PARTDATA
ojoj:	add	hl,de
	djnz	ojoj
	ex	de,hl
	push	hl
	push	de
	call	mult8_16
	pop	de	; DE = Plaats in PARTDATA
	ex	(sp),hl	; HL = Lengte
	pop	bc	; BC = lengte te kopieren stuk
	add	hl,de	; HL = plaats in PARTDATA + L_PARTDATA
	ldir
w1_nmovd:
	ld	a,(nr_parts)
	dec	a
	ld	(nr_parts),a
	call	PrintPData
	di
	call	PrintCapac
	ei
	jp	w1_loop1

w1_initpar:
	ld	a,(cur_part)	; Initialiseren partitie
	ld	hl,L_PARTDATA
	call	mult8_16
	ld	de,PARTDATA
	add	hl,de
	push	hl
	pop	ix
	ld	a,(ix)
	cp	255
	jp	z,w1_loop1
	ld	a,(ix+1)	; Is het een FAT 12?
	dec	a
	jp	nz,w1_inmsx
	ld	a,(ix+4)	; FAT12? controleer of <= 65535 sectoren
	or	(ix+5)
	jp	nz,w1_inmsx
  push	ix
	call	askinit	; Vraag om bevestiging
	pop	ix
	jp	nz,w1_loop1
	ld	(ix),255
	call	PrintPData
	jp	w1_loop1
w1_inmsx:
	ld	a,w1_errt2-w1_errt1-1+128
	ld	de,w1_errt1	; Geen MSX partitie, dus foutmelding
	di
	call	textwin
	ei
	jp	w1_loop1

w1_edit:
	ld	a,(cur_part)	; Het editten
	ld	hl,L_PARTDATA
	call	mult8_16
	ld	de,PARTDATA
	add	hl,de
	push	hl
	pop	ix
	ld	a,(ix+1)	;Controleer of het een FAT12 is
	dec	a
	jp	nz,w1_ednmsx
	ld	a,(ix+5)	; FAT12? controleer of <= 65535 sectoren
	or	(ix+4)
	jp	nz,w1_ednmsx
;	 ld	 a,(ix)	 ; Bekijk of de partitie al geinitializeerd was
;	 cp	 255
;	 jp	 z,w1_edskask
;	 ld	 a,(cur_field)
;	 cp	 2
;	 jp	 z,w1_edskask	 ; Als volumenaam geedit wordt geen bevestiging
;	 push  ix	 ; Vraag om bevestiging
;	 call  askinit
;	 pop	 ix
;	 jp	 nz,w1_loop1
w1_edskask:
	ld	a,(cur_field)	;Haal coordinaten
	inc	a	;;&&&
	add	a,a
	ld	e,a
	ld	d,0
	ld	hl,xl_partgeg
	add	hl,de
	ld	c,(hl)
	inc	hl
	ld	b,(hl)
	ld  h,c
	ld	a,(cur_reg)
	ld	l,a
	di
	call	setwrt_xy
	exx
w1_edlp1:
	ld	a,32		;maak veld leeg
	out	(#98),a
	djnz	w1_edlp1
	ei
	ld	de,w1_edrt	;ga naar desbetreffende edit routine
	push	de
	ld	a,(cur_field)
	cp	255	;;&&
	jr	z,edWID	;;&&
	cp  2
	jp	z,w1_edvol
	cp	1
	jp	z,w1_edMB
	cp	0
	jp	z,w1_edsec

w1_edrt:
	jp	w1_loop1

;;;;;;;;&&&&&&&&&&&
edWID:
	ld	b,1
	ld	a,254
	ld	(w1_ebc1),a
	inc	a
	ld	(w1_ebc2),a
	push	ix
	call	w1_edbuf
	pop	de
	jr	c,edWIDesc
	ld	a,(editbuffer)
	cp	"8"
	jr	nc,edWIDesc
	sub	"0"
	ld	b,a
	inc	b
	ld	a,128
edWID1: rlca
	djnz	edWID1
	ld	hl,7
	add	hl,de
	ld	(hl),a

edWIDesc:
	jp	PrintPData


w1_edvol:
	ld	b,11	;Het aanpassen van de VOLUME naam
	push	ix
  ld	a,#18  ;Zet controle in edit routine goed
	ld	(w1_ebc1),a
	call	w1_edbuf
	pop  de
	jp	c,w1_evv	;Als ESCAPE dan oude naam terug
	ld	a,c
	or	a
	jp	nz,w1_evv2
	dec	a
	ld	(editbuffer),a
w1_evv2:
	ld	hl,8		;Copieer editbuffer naar PARTDATA
	add	hl,de
	ex	de,hl
	ld	hl,editbuffer
	ld	bc,11
	ldir
w1_evv: jp	PrintPData

w1_edMB:
	ld	a,#fe
	ld	(w1_ebc1),a
	ld	a,"."
	ld	(w1_ebc2),a
	ld	a,255
	ld	(w1_scMBfl),a
	jp	w1_edscMB

w1_scMBfl:
	db	0

w1_edsec:
	ld	a,#fe	;Zet controle in editroutine goed
	ld	(w1_ebc1),a
	ld	a,255
	ld	(w1_ebc2),a
  xor	a
	ld  (w1_scMBfl),a
w1_edscMB
	ld	a,(ix+2)	;Editten van grootte in sectoren
	ld	(temp),a  ;Bewaar de oude grootte
	ld	a,(ix+3)
	ld	(temp+1),a
	ld	a,(ix+4)
	ld	(temp+2),a
  xor	a
	ld	(ix+2),a	;Zet grootte op nul
	ld	(ix+3),a
	ld	(ix+4),a
	di
	push	hl
	call	PrintCapac
	pop	de
	push	af		;Bewaar vrije grootte
	push	hl
	push	ix
	ei
	ld	b,6
	ld	a,(w1_scMBfl)
	or	a
	jp	nz,w1_edsmv
	dec	b
w1_edsmv:
	ex	de,hl
	call	w1_edbuf	;Laat grootte editten
	pop	ix
	pop	hl
	ex	af,af'
	pop	af
	ex	af,af'
	jp	c,w1_esesc	;Als ESCAPE dan oude grootte herstellen
	ld	a,c
	or	a
	jp	z,w1_esmax	;Als lengte nul, dan maximale grootte bekijken
	ld	a,(w1_scMBfl)
	or	a
	ld	de,editbuffer
	jp	nz,conv_MB

	call	conv_asciino	;Zet getal in ASCII om naar reg.paar HL
	jr	nc,w1_chlow	;Als te groot dan op 32MB
w1_es32MB: ld    hl,0FFFFh
w1_chlow:
	ld	(ix),255	;Zet op geinitialiseerd
	ld	a,(ix+4)
	or	a
	jp	nz,w1_esv2
	ld	a,h	;controleer of de partitie groter is dan tien
	or	a	;sectoren
	jp	nz,w1_esv2
	ld	a,l
	cp  10
	jp	nc,w1_esv2
	ld	l,10
w1_esv2:
	ld	(ix+2),l	;zet nieuwe grootte
	ld	(ix+3),h
	call	Adjust_PARTDATA
w1_esv3: push  ix
	di
	call	PrintCapac
	ei
	call	PrintPData
	pop	ix
	ret

w1_esmax: ; Alloceer zelf partitiegrootte
	ld  a,(toobig)	; ruimte over-gealloceerd? Dan oude waarde/niks
	or	a
	jr	nz,w1_esesc
	ex	af,af'          ; vrije ruimte >32MB? Dan 32MB
	or	a
	jr	nz,w1_es32MB
	or	h	; 0 vrij? Dan oude waarde/niks
	or	l
	jr	nz,w1_chlow  ; Alloceer totale vrije ruimte

w1_esesc:	; Herstel oude grootte
	ld	a,(insflag)	; routine aangeroepen tijdens insert?
	or	a
	ld	a,0
	ld	(insflag),a
	ret	nz
	ld	a,(temp+2)	;herstel oude grootte
	ld	(ix+4),a
	ld	hl,(temp)
	ld	(ix+2),l	;zet nieuwe grootte
	ld  (ix+3),h
	jp	w1_esv3

w1_edbuf:			;Het editten van de buffer
;	In:	B=lengte te editten stuk
;		HL=coordinaten waar geedit moet worden
;		(w1_ebc1)=#fe, als alleen cijfers toeg., anders #18
;		(w1_ebc2)="."als punt toegestaan,255 als niet toegestaan
;	Uit:	Editbuffer gevuld
;		Carryflag gezet als beeindigd met ESCAPE
;
	push	hl
	ld  a,b	;Maak de buffer leeg
	ld	hl,editbuffer
	ld	(hl),32
	ld	de,editbuffer+1
	ld	bc,14
	ldir
	BIOS	KILBUF
	ld	b,a
	ld	c,0
	xor	a
  ld  (w1_ebdfl),a
  ld  de,editbuffer
	pop	hl
w1_ebl1:
	di
	call	setwrt_xy
	exx

	ld	a,(JIFFY)	;Bekijk of streepje of spatie als cursor
	and	4	; dus een knipper effect
	ld	a,32
	jp	z,w1_ebv
	ld	a,"_"
w1_ebv: out	(#98),a
	ei
	BIOS	CHSNS
	jp	z,w1_ebl1
	BIOS	CHGET

	cp	27		;als ESCAPE, zet dan de carry vlag
	scf
	ret	z
	cp	13
	ret	z		;als RETURN, dan zonder carryflag terug
	cp	8
	jp	z,w1_ebbs
w1_ebc1:
  jr  w1_edv3 ;als cijfers en punt toegestaan, dan cp i.p.v. jr
w1_ebc2:equ	$+1		;als punt niet toegestaan, dan cp 255 i.p.v. "."
	cp	"."
	jp	z,w1_ebdot
  cp	"0"
	jp	c,w1_ebl1
	cp	"9"+1
	jp	nc,w1_ebl1

w1_edv3:
	cp	"/"
	jp	z,w1_ebl1

	cp	32
	jp	c,w1_ebl1
  jp	nz,w1_edv2
	ld	a,c		;Alleen spaties tussenin toegestaan
	or	a
	ld	a,32
	jp	z,w1_ebl1
w1_edv2:
  ex	af,af'
	ld	a,c
	cp	b
	jp	z,w1_ebl1	;Als veld vol dan terug
	ex	af,af'
	push	af
	di			;Print karakter en zet in buffer
	call	setwrt_xy
	exx
	pop	af
	out	(#98),a
	ei
	ld	(de),a
	inc	de
	inc	c
	inc	h
	jp	w1_ebl1
w1_ebdot:
	ld	a,(w1_ebdfl)
	cp	255
	jp	z,w1_ebl1
	ld	a,255
	ld	(w1_ebdfl),a
	ld	a,"."
	jp	w1_edv2

w1_ebdfl:
	db	0
w1_ebbs:
	ld  a,c		;Niets in buffer, dan terug
	or	a
	jp	z,w1_ebl1
	di
	call	setwrt_xy
	exx
	ld	a,32		;Haal cursor van scherm. (laatste karakter
	out	(#98),a	; gaat vanzelf, de cursor gaat daar nl. overheen)
	ei
	dec	h
	dec	c
	dec	de
	ld	a,(de)
	cp	"."
	jp	nz,w1_ebbv
	xor	a
	ld	(w1_ebdfl),a
w1_ebbv:
	ld	a,32
	ld	(de),a	;Wis karakter in buffer
	jp	w1_ebl1

conv_asciino: 		;zet ASCII getal om
;	In:	DE=adres van ASCII getal
;	Uit:	HL=getal
;		A=eerste teken na getal, als carryflag niet gezet is
;		Carryflag bij te groot getal

	ld	hl,0
ca_loop:
	ld	a,(de)
	sub	"0"
	jp	c,ca_einde
	cp	10
	jp	nc,ca_einde
	add	hl,hl
	ret	c
	push	hl
	pop	bc
	add	hl,hl
	ret	c
	add	hl,hl
	ret  c
	add	hl,bc
	ret	c
	ld	b,0
	ld	c,a
	add	hl,bc
  ret	c
	inc	de
	jp  ca_loop

ca_einde:
	add	a,"0"
	or	a
	ret

conv_MB:
	call	conv_asciino	; Eerste deel van getal
	jp	c,w1_es32MB
	ld	c,a
  ld	a,h	; Groter dan 31?
	or	a
	jp	nz,w1_es32MB
	ld	a,l
	cp	32
	jp	nc,w1_es32MB
	add  a,a	; *8  (Eigenlijk *2048)
	add	a,a
	add	a,a
	ld	l,h	;!H=0
	ld	h,a
	ld	a,c
	cp	"."
	jp  nz,w1_chlow
	push	hl
	ld	h,l
	ld	b,3	; Tweede deel van getal: doe precies 3 digits
cvMB4:	inc	de
	ld	a,(de)
	sub	"0"
	jr	c,cvMB3
	cp	10
	jr	nc,cvMB3
	call	keer10
	add  a,l
	ld	l,a
	jr	nc,cvMB6
	inc	h
cvMB6:	djnz	cvMB4
  jr	cvMB5
keer10: push	bc
	add	hl,hl
	ld	b,h
	ld	c,l
	add	hl,hl
	add	hl,hl
	add	hl,bc
	pop	bc
	ret
cvMB3:	call	keer10
	djnz	cvMB3

cvMB5:	ld	a,131	; Doe getal keer 2,048 (= 2,0Ch = 4*0,10000011b)
	call	mult8_16
	add	hl,hl
	adc	a,a
	add	hl,hl
	adc	a,a
	pop	bc	; Tel getal boven komma op
	add	a,b	; (overflow is hier nergens mogelijk)
	ld	l,h
	ld	h,a
	jp	w1_chlow


Adjust_PARTDAT:
; Calculate number of sectors per cluster and number of sectors per FAT
; Problem is you don't know the exact number of datasectors, because sec/FAT
; is unknown.
; The way I did it:
; Start with 12 sec/FAT (most ever needed for 4096 clusters)
; Then calculate datasectors, sec/cluster, free clusters, needed sec/FAT
; Decrease numbers of sec/FAT to start with, and do calculation again.
; Stop loop & take old values if:
; 1.) Number of sec/cluster suddenly is bigger
; 2.) Needed number of sec/FAT is bigger than startvalue sec/FAT

; In:  IX = pointer to table. number of sectors / FATs / dir.entries /
;	    reserved sectors filled
; Out: IX same, number of S/C and S/F filled

	ld	l,16
	ld	b,12
adjpl:	push	hl	; H,L = old calculated value of sec/fat, sec/clus
	push	bc
	call	CalcSF	; L = sectors/cluster, H = sectors/FAT
	pop	af
	pop	de
	inc	a	; 1.) H (needed sec/FAT) > A (initial value)?
	cp	h
	jr	nc,adjend
	ld	b,a
	ld	a,e	; 2.) Sec/clus > previous sec/clus?
	cp	l
	jr	nc,adjpl
adjend: ld	(ix+O_SC),e	; If 1.) or 2.), then fill previous values
	ld	(ix+O_SF),d
	ld	(ix+O_SF+1),0
	ret

CalcSF: ; Calculate number of sectors/FAT, sectors/cluster

	ld	h,0
	ld	l,a
	call	NoResSec1	; DE = reserved+FAT+DIR
	ld	l,(ix+O_LENG)
	ld	h,(ix+O_LENG+1)
	or	a
	sbc	hl,de	; HL = datasec
	ld	a,h	; HL\4096
	rrca
	rrca
	rrca
	rrca
	and	15
	ld	b,a	; round up to power of 2
	ld	a,1	; (look at each power of 2 until >= B
csfl1:	rlca		;  should be bigger than 1)
	cp	b
	jr	c,csfl1
	ld	b,a	; B = sec/cluster
	rrca
csfl2:	srl	h	; datasec \ sec/cluster = free clusters
	rr	l
	rrca
	jr	nc,csfl2
	inc	hl	; (HL*3/2+3) = (HL+2)*3/2 = nr. of FAT bytes
	inc	hl
	ld	a,3
	call	mult8_16
	srl	h
	rr	l
	jr	nc,csf1	; round up
	inc	hl
csf1:	dec	hl	; HL/512, round up, = (HL+511)\512 =
	srl	h	; = (HL-1)\512+1 = nr. of FAT sectors
	inc	h
	ld	l,b
	ret


.comment #
	xor	a
adjpl:	inc	a
	push	af
	call	CalcSF	; Fill in S/C, H=S/F
;	 xor	 a
;	 call  prient
	pop	af
	cp	h	; A < H? Then once again
	jr	c,adjpl
	ld	(ix+O_SF),a
	ld	(ix+O_SF+1),0
	ret

CalcSF:
	ld	h,0
	ld	l,a
	call	NoResSec1	; DE = reserved+FAT+DIR
	ld	l,(ix+O_LENG)
	ld	h,(ix+O_LENG+1)
	or	a
	sbc	hl,de	; HL = datasec
	ld	a,h	; HL\4096
	rrca
	rrca
	rrca
	rrca
	and	15
	ld	b,a	; round up to power of 2
	ld	a,1	; (look at each power of 2 until >= B
csfl1:	rlca		;  should be bigger than 1)
	cp	b
	jr  c,csfl1
	ld	(IX+O_SC),a	; A = sec/cluster
	rrca
csfl2:	srl	h  ; datasec \ sec/cluster = free clusters
	rr	l
	rrca
	jr	nc,csfl2
;	 push  hl
;	 pop	 de	 ;!!alleen voor nakijken!!!
	inc	hl	; (HL*3/2+3) = (HL+2)*3/2 = nr. of FAT bytes
	inc	hl
	ld	a,3
	call	mult8_16
	srl	h
	rr	l
	jr	nc,csf1	; round up
	inc	hl
csf1:	;push  hl	 ;;;;;;;
	;pop	 bc	 ;;;;;;;
	dec	hl  ; HL/512, round up, = (HL+511)\512 =
	srl	h	; = (HL-1)\512+1 = nr. of FAT sectors
	inc	h
	ret
#
NoResSec:
;	in:	ix=PARTDATA
;	uit:	de=aantal geres. sectoren + aantal dir-secs + aantal Fatsecs
	ld	l,(IX+O_SF)
	ld	h,(IX+O_SF+1)
NoResSec1:
	ld	a,(IX+O_FATS)
	call	mult8_16

NoResSec2:
;	in:	ix=PARTDATA
;	in:	hl=offset
;	uit:	de=aantal gereserveerde sectoren+ aantal dir-secs+hl

	ld	e,(ix+28)
	ld	d,0
	add	hl,de
	xor	a
	push	hl
	ld	e,15
	ld	l,(ix+31)
	ld	h,(ix+32)
	add	hl,de
	ld	b,4
NR_loop1:
	srl  h
	rr	l
	djnz	NR_loop1
	ex	de,hl
	pop	hl
	xor	a
	add	hl,de
	ex	de,hl
	ret



editbuffer:	defs 15
temp:		defs 5

w1_ednmsx:
	ld	a,w1_errt4-w1_errt3-1+128
	ld	de,w1_errt3
	di
	call	textwin
	ei
  jp	w1_loop1

askinit:
	di
  ld	b,4
	ld	a,4
	ld	c,w1_wart2s-w1_wart2+3
	call	putwin
	ld	b,2
	ld	c,w1_wart2s-w1_wart2-1
	call	PUTMID
	ld	de,w1_wart2
	call	print
	BIOS	BEEP
	ei
	call	wtkey
	push	af
	di
	call	getwin
	ei
	pop	af
	and	%11011111
	cp	"Y"
	ret

	defb	0
empty_entry:
	defb	255			;nieuwe partitie ID
	defb	1			;altijd MSX ID
	defw	0,0			;grote (80tracks*9secs*2zijden)
	defb	255			;read ID
ee_wrID defb	255			;write ID (voor MAK/HSH 128)
	defb	"Partition"               ;volume naam
ee_p1	defb	0,0			;nummer van partitie invullen
	defb	"RMt&AMs!"                ;OEM naam
  defb	2			;sectoren per cluster		   #
	defw	1			;aantal gereserveerde sectoren	  *
	defb	2			;no FATS			 (*)
	defw	112			;aantal dir entries		  *
	defb	0f8h			;medium descriptor
	defw	3			;secs/FAT			   #


cur_part:	db 0
cur_field:	db 0
cur_reg:	db 0
old_field:	db 0
old_reg:	db 0
maxnoparts	db 0

w1_errt1:	db "Only MSX partitions can be initialized!",255
w1_errt2:	db "Partion table is full!",255
w1_errt3:	db "Only MSX partitions can be edited!",255
w1_errt4:
w1_wart1:	db "Partion will be deleted!",0
w1_wart1s:	db "  Continue? ","Y"+128,"es or ","N"+128,"o",255
w1_wart2:	db "Partion will be initialized!",0
w1_wart2s:	db "    Continue? ","Y"+128,"es or ","N"+128,"o",255
w1_wart3:
WINX  equ 14		; Coordinaten van window met partitie-gegevens
WINY  equ 6
WINLX equ t_w4a-t_w4+2
WINLY equ 12		; Y-lengte van window (= aantal regels met part.gegevens+4)

; X-coordinaten van gegevens, gebruikt bij printroutine en cursor-routine
WINX1 equ WINX+2	; nummer
WINX2 equ WINX+5	; oud nummer (of 'new') ;;&& write ID
WINX3 equ WINX+9	; type
WINX4 equ WINX+22	; sectoren
WINX5 equ WINX+30	; MB
WINX6 equ WINX+38	; vol.name

xl_partgeg:	; X-coordinaat en lengte van alle gegevens.
			; Nodig voor cursor-routine
;	 db	 WINX1,2	 ;  nummer
;	 db	 WINX2,3	 ;  oude nummer
	db  WINX2+1,1	;;&& Write ID
;	 db	 WINX3,11	 ;  type
	db	WINX4,7	;  sectoren
	db	WINX5,7	;  MB (kan maar tot 999, dus sectoren maar 6 cijfers)
	db	WINX6,11	;  vol.name

; -------------------
firstpart: db 0			; Partitienummer dat op bovenste regel van window staat


; Print de gegevens van de partities in het window. Gegevens staan in de tabel
; PARTDATA ingevuld.
; Onder de laatste regel met gegevens wordt nog een lege regel geprint.
; (De regels daaronder zijn altijd al leeg.)

PrintPData:
	ld	a,(firstpart)
	ld	l,WINY+3
pr_partg:  ; Print gegevens vanaf partitie A, y-coord. L
	ld	c,a
	ld	ix,PARTDATA
	ld	e,a
	ld	d,0
	ld	b,L_PARTDATA
prpard	add	ix,de
	djnz	prpard
	di
prpar0: ld	a,(nr_parts)	; partitienr. < aantal part: print volgende.
	cp  c
	jr	z,prpar3
prpar1: push	bc
	inc	c
	ld	h,WINX1	; nummer partitie
	call	PrintNr
	ld	a,32	; spatie tussendoor
	out	(98h),a
	call	PrintOld	; oud nummer partitie, of 'new'
	exx		; Zet L' (= y-coord) weer terug in L
	call	print_type
	exx
	call	print_sec_MB
	exx
	ld	de,pr_parv	;zet goede return adres voor komende routines
	push	de
	ld	a,(ix+1)
	dec	a
  jp	nz,pr_evname
	ld	a,(ix+5)
	or	(ix+4)
	jp	nz,pr_evname
	jp	print_vname
pr_parv exx
	pop	bc
	inc	c	; Verhoog partitienr, Y-coord en tabelpointer
	inc	l
	ld  de,L_PARTDATA
	add	ix,de
	ld	a,WINY+WINLY-1	; Is de Y-coordinaat de onderste van het window?
	cp	l
	jr	nz,prpar0
	ei
	ret
prpar3: ld	h,WINX1        ; print lege regel.
	call	setwrt_xy
	exx
	ld	b,47
prpar2: ld	a,32
	out	(98h),a
	djnz prpar2	; paar extra cycles wachten met extra ld a,32
	inc  l
	ld   a,WINY+WINLY-1
	cp   l
	jp   nz,prpar3
	ei
	ret

txtnew: db	'new'
PrintOld: ; Print oud partitienr. of 'new'
;;&& Niet; print Write-ID
	ld	a,(tabtype)
	or	a
	jr	z,ppqq0
	cp	2
	jr	z,ppqq0
	ld	a,32
	out	(98h),a
	ld	a,"-"
	out  (98h),a
	jr	ppqq2

ppqq0:	ld	a,(ix+7)
	ld	l,255
ppqq1:	inc	l
	rrca
	jr  nc,ppqq1
	call PrintNr2
ppqq2:	ld   a,32
	out  (#98),a
	ret

;;&& de oude PRINTOLD
	ld	a,(ix+0)
	inc	l
	ld  l,a
	cp	16
	jr	c,POget
	ld	hl,txtnew
	ld	b,3
PrintTxt:
; Print B bytes met ASCII-tekst, (behalve als je 0 tegenkomt), vanaf HL
; VRAM-adres is al gezet.
prtt8:	ld   a,(hl)
	or   a
	ret  z
	out  (98h),a
	inc  hl
	djnz prtt8
	ret

POget:	inc  l
	call PrintNr2
	ld   a,32
	out  (#98),a
	ret

PrintNr: ; Print 2-cijferig getal op scherm
;	   In: H,L=x,y-coord., C = nummer
	push	bc
	call	setwrt_xy
	pop	hl
PrintNr2: ; L = nummer, VRAM-adres al goed
	ld	h,0
	ld	de,dectab-4
	jp	decprt

print_type:
; Print type
; In: L=y-coord, IX=PARTDATA-entry
	ld	h,WINX3
	call	setwrt_xy
	ld	a,(ix+1)
	dec	a
	ld	de,partMSX
	jr	z,prtm2
	ld	c,a
	ld	a,(ix+5)	; FAT12? controleer of <= 65535 sectoren
	or	(ix+4)
	jr	nz,prtm2
	ld	a,c

prtt3:	ld	hl,typenames-2


PrintMsg:	;Print message from table
	  ; In: HL = table, (HL) = Number of entries, A = number (0-..)
		;(if A >= (HL) then "?" is printed)
		; (VRAM address should already be set)
	cp	(hl)
	jr	nc,PrintMsg1
	inc	hl
	add	a,a
	ld	e,a
	ld	d,0
	add	hl,de
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
prtm2:	ld	a,(de)	; Entry for printing text from DE
	ld	c,a
	and	127
	out	(98h),a
	inc	de
	or	c
	jp	p,prtm2
	ret
PrintMsg1:
	ld	a,'?'
	out	(98h),a
	ret

typenames:	db 6
	dw  parttype1,parttype2,parttype3,parttype4,parttype5,parttype6
parttype1: dc 'FAT12      '
parttype2: dc 'XENIX      '
parttype3: dc 'XENIX      '
parttype4: dc 'FAT16      '
parttype5: dc 'MS-DOS 3.3 '
parttype6: dc 'MS-DOS 4.0 '

partMSX:   dc 'FAT12 (MSX)'

print_sec_MB:
; Print aantal sectoren & MB
; In: L=y-coord., IX=tabel
  ld  h,WINX4
  call	setwrt_xy
	call	dcpr32
	ld	a,32
	out	(#98),a
; Print aantal MB
	exx
  ld	h,WINX5
	call	setwrt_xy
	ld	l,(ix+2)       ; Print voor komma
	ld	h,(ix+3)       ; (ix+5) is 0, anders klopt het toch niet
	ld	a,(ix+4)

PrintMB: ; Print aantal MB, 3 cijfers voor en 3 achter punt.
;	   In: AHL=aantal bytes / vram-adres al gezet.
	push	hl
	push	af
	push	hl
	ld	l,h
  ld	h,a
	srl	h	; deel door 8 (= deel getal door 2048)
	rr	l
	srl  h
	rr	l
	srl  h
	rr	l
	ld	de,dectab-6
	call	decprt	; voor komma
	ld	a,'.'
	out	(98h),a
	; Achter komma: vermenig rest (0-2047) met 1000/2048 = 0,7Dh
	; Hier komt een getal 0<=x<1000 uit. (getal niet naar boven afronden!)
	pop  hl
	ld	a,h
  and	7
	ld	h,a
	ld	a,7Dh
	call	mult8_16
	ld	l,h	; print getal
	ld	h,a
	ld	de,dectab-6
	ld	b,0
	call	decprt00
	ld	a,32
	out	(#98),a
  pop	af
	pop	hl
	ret

print_vname:
	ld	h,WINX6	;print volume naam
	call	setwrt_xy
	push	ix
	ld	de,8
  pop	hl
	add	hl,de
	ld	b,11
	ld  a,(hl)	;als eerste byte 0 of 255 dan leeg vname printen
	or	a
	jp	z,pr_evl
	inc	a
	jp	z,pr_evl
	call	PrintTxt
	ld	a,32
	out	(#98),a
	ret

pr_evname:
	ld	h,WINX6
	call	setwrt_xy
	ld	b,11
pr_evl: ld	a,32
	out	(#98),a
	djnz	pr_evl
	ret


SelPartType:
	ld	a,(cur_field)
	ld	(old_field),a
	ld  a,(cur_reg)
	ld	(old_reg),a
	call	filold
	di
	ld	c,ST_t2-ST_t1+4
	ld	b,9
	ld	a,6
	call	putwin
	ld	h,(80-(ST_t2-ST_t1))/2
	ld	l,10
	call	setwrt_xy
	ld	hl,ST_t1
	ld	b,ST_t2-ST_t1
	call	PrintTxt
	ld	h,(80-15)/2
	ld	l,11
	call	setwrt_xy
	ld	a,(tabtype)
	add	a,a
	add	a,a
	add	a,a
	add	a,a
	ld	hl,ST_t3
	add	a,l
	ld	l,a
	ld  a,0
	adc	a,h
	ld	h,a
	ld	b,15
	call	PrintTxt
	ld	h,(80-(ST_t2-ST_t1))/2
	ld	l,12
	call	setwrt_xy
	ld	hl,ST_t2
	ld	b,ST_t2-ST_t1
	call	PrintTxt
	ld	l,13
	ld  h,(80-15)/2
	ld	de,ST_t3
	call	print
	ei
	xor	a
	ld	(SP_temptt),a
SP_loop1:
	ld	e,0
	call	SP_Beam

SP_key:
	BIOS	CHSNS
	jp	z,SP_key

	BIOS	CHGET
	cp	27
	jr	z,SP_Escape
	sub	30
	jr	z,SP_up
	dec	a
	jr	z,SP_down
	dec	a
	jr	nz,SP_key
	ld	e,255
	call	SP_Beam
	ld	a,(SP_temptt)
	ld	e,a
	call	MP2
	ld	a,(nr_parts)
	inc	b
	cp	b
	jp	nc,SP_Ack
SP_Ackv:
	ld	a,e
	ld	(tabtype),a
SP_Escape:
	call	getwin
	di
	call	PrintCapac
	ei
	jp	Window1

SP_up:	ld	a,(SP_temptt)
	or	a
	jp	z,SP_key
	ld	e,255
	call	SP_Beam
	ld	a,(SP_temptt)
	dec	a
	ld	(SP_temptt),a
	jp	SP_loop1
SP_down ld	a,(SP_temptt)
	cp	3
	jp	z,SP_key
	ld	e,255
	call	SP_Beam
	ld	a,(SP_temptt)
	inc	a
	ld	(SP_temptt),a
  jp	SP_loop1

SP_Beam:
	ld	a,(SP_temptt)
	add	a,13
	ld	bc,#0110
	ld	h,(80-15)/2
	ld	l,a
	ld	a,e
	di
	call	filcol
	ei
	ret

SP_Ack: push	de
	ld	c,SP_wart1s-SP_wart1+3	;kort aantal partities in
	ld	b,4
	ld	a,4
	di
	call	putwin		;vraag om bevestiging
	ld	b,2
  ld	c,SP_wart1s-SP_wart1-1
	call	PUTMID
	ld	de,SP_wart1
	call	print
	BIOS	BEEP
	ei
	call	wtkey
	push	af
	di
	call	getwin
	ei
	pop	af
	ld	b,a
	pop	de
	ld	a,b
	and	%11011111	;als "Y" of "y" gekozen dan verwijderen
	cp	"Y"
	jp	nz,SP_Escape
	ld	a,e
	call	MP2
	ld  a,b
	ld	(nr_parts),a
	jp	SP_Ackv

SP_temptt:
	defb	0
ST_t1	defb "Current table sort is:"
ST_t2	defb "Select new table sort:",0
ST_t3	defb "Extended       ",0
	defb "(old) PC       ",0
	defb "(old) MSX      ",0
	defb "MAK 3.0        ",255
SP_wart1:	db "There will be partitions/a partition lost!",0
SP_wart1s:	db "     Continue? ","Y"+128,"es or ","N"+128,"o",255

t_errr: db	"Read error",255
t_errw: db	"Write error",255
t_erw1: db	"Target status:",0,"Sense key:",0,"Sense code:",0
	db	"Additional sense code:",255
t_err1: db	"Number of bytes per sector is not 512",255
t_ts0:	db	"Good",255
t_ts2:	db	"Check condition",255
t_ts8:	db	"Busy",255
t_sk0:	dc	"No sense"
t_sk1:	dc	"Recovered error"
t_sk2:	dc	"Not ready"
t_sk3:	dc	"Medium error"
t_sk4:	dc	"Hardware error"
t_sk5:	dc	"Illegal request"
t_sk6:	dc	"Unit attention"
t_sk7:	dc	"Data protect"
t_sk8:	dc	"Blank check"
t_ska:	dc	"Copy aborted"
t_skb:	dc	"Aborted command"
t_skc:	dc	"Equal"
t_skd:	dc	"Volume overflow"
t_ske:	dc	"Miscompare"
t_:	dc	"?"

tab_sk: db	15
	dw	t_sk0,t_sk1,t_sk2,t_sk3,t_sk4,t_sk5,t_sk6,t_sk7
	dw	t_sk8,t_,t_ska,t_skb,t_skc,t_skd,t_ske

PrintHex: ; Print hex number with superseding 'H '
	; In:       A = number, HL = X,Y
	; Modifies: All except A
	push	af
	call	setwrt_xy
	pop	af
	push	af
	rrca
	rrca
	rrca
	rrca
	call	prth1
	pop	af
	push	af
	call	prth1
	ld	a,'H'
	out	(98h),a
	ld	a,32
	out	(98h),a
	pop  af
	ret
prth1:	and	15
	add	a,'0'
	cp	'9'+1
	jr	c,prth2
	add	a,'A'-'0'-10
prth2:	out	(98h),a
	ret


MaxPart: ; Haal maximale aantal parts voor huidige tabtype
;	   Uit: B=maximum aantal parts
;	   Verander:  AF
	ld	a,(tabtype)	;haal maximaal aantal partities uit tabel
MP2:	ld	b,15
	or	a
	ret	z
	dec	a
	ld	b,4
	ret	z
  dec	a
	ld	b,6
	ret	z
	ld	b,8
	ret


;================================
; Algemene subs & window routines
;================================

;===== Alg.

; Naam	   : DCOMPR
; Functie  : Vergelijk DE met HL
; Invoer   : geen
; Uitvoer  : some flags
;	     Geen carry als HL > DE
;	     Zero flag als HL = DE
;	     Carry flag als HL < DE
; Verandert: AF
dcompr: LD	A,H
	SUB	D
	RET	NZ
	LD	A,L
	SUB	E
	RET

; Naam	   : setrd
; Functie  : Zet de VDP op lezen
; Invoer   : HL met het adres
; Uitvoer  : geen
; Verandert: AF
; Opmerking: Kan alleen de eerste 64 Kb van het VRAM aan
setrd:	LD	A,H
	AND	11000000B
	RLCA
	RLCA
	OUT	(99H),A
	LD  A,14+128
	OUT	(99H),A
	LD	A,L
	OUT	(99H),A
	LD	A,H
	AND	00111111B
	OUT	(99H),A
	RET


setwrt_xy:   call xy2adr
; Naam	   : setwrt
; Functie  : Zet de VDP op schrijven
; Invoer   : HL met het adres
; Uitvoer  : geen
; Verandert: AF
; Opmerking: Kan alleen de eerste 64 Kb van het VRAM aan
setwrt: LD	A,H
	AND	11000000B
	RLCA
	RLCA
	OUT	(99H),A
	LD	A,14+128
	OUT	(99H),A
	LD	A,L
	OUT	(99H),A
	LD  A,H
	AND	00111111B
	OR	01000000B
	OUT	(99H),A
	RET

decprt: ; Print getal, met voorloopspaties.
; In: HL = getal
;     DE = plaats in dectab voor het tiental waarmee begonnen wordt
;     (-2 = 1, -4 = 10, -6 = 100,...)
; Verandert: AF,BC,DE,HL

	LD	B,1
decprt00:  ; Dit is de ingang voor als:
	;-er geen beginspaties maar -nullen moeten worden geprint. In: B=0
	;-er niets aan begin moet worden geprint. In: B>1
	PUSH	DE
	JR	DECPR1

DECPR0: POP	DE	;A=0!
	ret

DECPR5: LD	B,0	; B<>0
DECPR2: ADD	A,'0'
DECPR3: out	(98h),a	; Zet cijfer op scherm
DECPR1: EX	(SP),HL	; Zet volgende 'tiental' in DE
	LD	A,(HL)
	OR	A
	JR	Z,DECPR0	; Eind
	LD	E,A
	INC	HL
	LD	D,(HL)
	INC	HL
	EX	(SP),HL

	XOR	A	; Trek 'tientallen' van getal af
DECPR4: SBC	HL,DE	;CY=0!
	INC	A
	JR	NC,DECPR4
	ADD	HL,DE
	DEC	A
	JR	NZ,DECPR5

	OR	B	; Cijfer = 0. Al cijfers geprint?
	JR	Z,DECPR2
	ex	(sp),hl	; Nee. Is laatste cijfer?
	ld	a,(hl)
	ex	(sp),hl
	or	a
	jr	z,DECPR2	; Ja. print 0, anders spatie.
	ld	a,b
  dec	a
	jr	nz,DECPR1
	LD	A,32
	JR	DECPR3

	DEFW	10000
	DEFW	1000
	DEFW	100
	DEFW	10
	DEFW	1
dectab: DEFB	0	; Geeft einde tabel aan

; Invoer   : (IX+5) = adres waar getal in geheugen opgeslagen staat (LSB eerst)
; Uitvoer  : Niets		  (HL(')=0,DE=1,BC=&HFF00)
; Verandert: AF,HL,DE,H',BC',DE'  (L' wordt expres bewaard)
dcpr32: LD	(DCPRSP),SP
	LD	SP,HL
	ld	l,(ix+2)
  ld  h,(ix+3)
	EXX
	ld	e,l
	ld	l,(ix+4)
	ld	h,(ix+5)
	LD	SP,DCTAB
	LD	D,1	;pointer
	JR	DCPR1

DCPR0:	OR	D		;A=0!
	ld	l,e
	EXX
	LD	SP,(DCPRSP)
	RET


DCPR2:	LD	D,0
DCPR5:	ADD	A,"0"
DCPR3:	out	(98h),a	; Zet cijfer op scherm
DCPR1:	POP	BC	; Zet volgende 'tiental' in BCDE
	LD	A,B
	INC	A
	JR	Z,DCPR0	; Eind
	EXX
	POP	DE

	XOR	A	; Trek 'tientallen' van getal af
DCPR4:	SBC	HL,DE	;l
	EXX
	SBC  HL,BC	;h
	EXX
	INC	A
	JR	NC,DCPR4
	ADD	HL,DE
	EXX
	ADC	HL,BC
	DEC	A
	JR	NZ,DCPR2       ; Cijfer = geen 0
	OR	D	; pointer: D=0: er zijn al cijfers geprint
	JR	Z,DCPR5
	EXX
	LD	A,E
	CP	1
	LD	A,0
	EXX
  JP	Z,DCPR5
	LD	A,32		; Nog geen cijfers geprint: spatie i.p.v. 0
	JR	DCPR3

DCPRSP: DW	0	; Opslag SP
DCTAB:	;Tabel met alle 'tientallen'.
;	 Volgorde van bytes (oplopende significantie): 3/4/1/2!
;	DEFB	154,59,0,202	;1000000000
;	DEFB	245,5,0,225	; 100000000
;	DEFB	152,0,128,150	;  10000000
	DEFB	15,0,64,66	;   1000000
	DEFB	1,0,160,134	;    100000
	DEFB	0,0,16,39	;     10000
	DEFB	0,0,232,3	;      1000
	DEFB	0,0,100,0	;       100
	DEFB	0,0,10,0	;  10
  DEFB	0,0,1,0	; 	1
	DEFB	0,255	;Eind


; ======== Windows en zo

; Naam	   : xy2adr
; Functie  : Berekent X,Y naar ADRES vanaf 0
; Invoer   : H  = X coor.
;	   : L  = Y coor.
; Uitvoer  : HL = Adres
; Verandert: AF,BC,DE,HL
; Opm	   : HL' = HL (X,Y), DE'=DE, BC'=BC
xy2adr: LD	A,L	; Verm Y-as met 80
	EXX
  LD  HL,0
	LD	DE,80
	LD	B,8
LIN1:	ADD	HL,HL
	ADD	A,A
	JR	NC,LIN2
	ADD	HL,DE
LIN2:	DJNZ	LIN1
	EXX
	LD	A,H
	EXX
	LD	E,A
	LD	D,0
	ADD	HL,DE	; Tel de X-as er bij op
	RET

; wtkey: Haalt toetsenbordbuffer leeg en wacht tot er een toets ingedrukt wordt
; Uit:	     A = toets
; Verandert: AF

wtkey:	BIOS	KILBUF	; keyboardbuffer leeghalen
wtkey1: BIOS	CHSNS	; wacht op toets in buffer (en haal die eruit)
	jr	z,wtkey1
	BIOS	CHGET
	ret

; Naam	    : PRINT
; Functie   : Drukt een tekst af op het scherm
; Invoer    : H=X-positie
;		L=Y-Positie
;		DE=Adres text
; Uitvoer   : Geen
; Verandert : Alles
; Opmerking : Tekst moet eindigen met de waarde 255
;		Einde regel aangeven met 0
;		OK-Button: zet een chr 1 in tekst
;		Cancel-button: zet een chr 2 in tekst

print:
	PUSH	DE
	CALL	setwrt_xy
	POP	DE
print_: LD	BC,0
PRINT1: LD	A,(DE)
	OR	A	; waarde = 0
	JR	NZ,PRINT3	; nee, dan verder
	PUSH	DE
	LD	DE,80	; ja, een regel verder
	ADD	HL,DE
	CALL	setwrt
	LD	B,0
	POP	DE
	INC	DE
	INC	C
	JR	PRINT1
PRINT2:
	OUT	(98H),A
	INC	DE
	INC	B
	JR	PRINT1
PRINT3:
	CP	255
	JR	Z,PRINT4
	CP	10
	JR	NC,PRINT2
	LD	B,A
	ADD	A,2
	OUT	(98H),A
	INC	DE
PRINT5: LD	A,(DE)
	CP	B
	JR	NZ,PRINT6	; verder met gewone tekst
	ADD	A,2
	JR	PRINT2
PRINT6: SET	7,A
	OUT	(98H),A
	INC	DE
	JR	PRINT5
PRINT4:
	RET

; Naam	   : PRNLIN
; Functie  : Print een regel uit het geheugen
; Invoer   : HL = VDP-adres
;	   : DE = geheugen adres
; Uitvoer  : geen
; Verandert: -
; Opmerking: De routine stopt als hij 255 tegen komt in het geheugen
PRNLIN: PUSH	AF
	PUSH	BC
	PUSH	DE
	POP  DE
	PUSH	DE
  PUSH	HL
	CALL	setwrt
PRNLN2: LD	A,(DE)
	INC	DE
	CP	255
	JR	PRNLN3
	OUT	(98H),A
	JR	PRNLN2
PRNLN3:
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	RET


; Naam	   : PRNLNB
; Functie  : Print een regel uit het geheugen
; Invoer   : HL = VDP-adres
;	     DE = geheugen adres
;	     A  = lengte
; Uitvoer  : geen
; Verandert: -
PRNLNB: PUSH	BC
	LD	B,A
	PUSH	AF
	PUSH	DE
	PUSH	HL
	DI
	CALL	setwrt
PRNLB2: LD	A,(DE)
	INC	DE
	OUT	(98H),A
	DJNZ	PRNLB2
	POP	HL
	POP	DE
	POP	AF
	POP	BC
	RET


; Naam	   : putwin
; Functie  : Plaats window
; Invoer   : H  = X-coor.
;	   : L  = Y-coor.
;	   : B  = lengte Y-as (Met border (2 karak))
;	   : C  = lengte X-as (Met border (2 karak))
;	   : DE = Text pointer als noodzakelijk
;	   : A  = bit 0 = 0 zonder text / 1 met text (hele bovenste border
;	   :				      zelf invullen)
;	   :	    bit 1 = 0 niet gevuld / 1 wel gevuld
;	   :	    Bit 2 = 1 Window op midden van scherm neerzetten (HL onnodig)
; Uitvoer  : HL=X-Y Coord.
; Verandert: Alles
putwin:
	PUSH	AF
	EX	AF,AF'
	POP	AF
	BIT	2,A
	CALL	NZ,PUTMID
	PUSH	HL
	CALL	xy2adr
	CALL	MEMLKA
	LD	DE,(MEMALG)
	LD	(IX+4),D
	LD	(IX+5),E
	LD	(IX+0),H
	LD	(IX+1),L
	EXX
	LD	(IX+2),B
	LD	(IX+3),C
	PUSH	DE
	PUSH	BC
	EXX
	POP	BC
	CALL	CK2MM
	LD	(MEMALG),DE
	POP	DE
	CALL	setwrt
	PUSH	BC
	LD	B,C
	EX	AF,AF'
	BIT	0,A
	JR	Z,NOTEXT
	EX	AF,AF'
PUTWN0: LD	A,(DE)
	INC  DE
	OUT	(98H),A
	DJNZ	PUTWN0
	JR	PUTWN2
NOTEXT: EX	AF,AF'
	LD	A,24
	OUT	(98H),A
	DEC	B
	DEC	B
	LD	A,21
PUTWN1: OUT	(98H),A
	DJNZ	PUTWN1
	LD	A,25
	OUT	(98H),A
PUTWN2: LD	DE,80
	ADD	HL,DE
	CALL	setwrt
	POP	BC
	DEC	B
	DEC	B
	DEC	C
	DEC	C
	PUSH	BC
PUTWN3: PUSH	BC
	LD	A,20
	OUT	(98H),A
	LD	B,C
	LD	A," "
PUTWN4: OUT	(98H),A
  DJNZ	PUTWN4
	LD	A,22
	OUT	(98H),A
	ADD	HL,DE
	CALL	setwrt
	POP	BC
	DJNZ	PUTWN3
	POP  BC
	LD	A,26
	OUT	(98H),A
	LD	B,C
	LD	A,23
PUTWN5: OUT	(98H),A
	DJNZ	PUTWN5
	LD	A,27
	OUT	(98H),A
	EXX
	LD	E,0
	EX	AF,AF'
	BIT	1,A
	JR	Z,PUTWN6
	LD	E,255
PUTWN6: LD  A,E
	CALL	filcol
	POP	HL
	RET

PUTMID: PUSH	AF
	PUSH	BC
	SRL	C
  LD	A,40
	SUB	C
	LD	H,A
  SRL	B
	LD	A,13
	SUB	B
	LD	L,A
	POP	BC
	POP	AF
	RET

textwin0: ld	sp,(stack)
textwin: ; Zet (niet filled) window met 1 regel tekst neer, wacht op toets
  ;  en haal weer weg.
  ; In: A = lengte van tekst, DE = tekst.
  ; Verandert: ???
	push	de
	push	af
	res	7,a
	add	a,4
	ld	c,a
	ld	b,3
	ld	a,4
	call	putwin
	pop	hl
	push	hl
	res  7,h
	srl	h	; x-coord = 40 - lengte/2
  ld	a,40
	sub	h
	ld	h,a
	ld	l,13
	pop	af
	pop	de
	push	af
	call	print
	ei
	pop	af
	rlca
	jp	nc,tw_ver
	BIOS	BEEP
tw_ver: call	wtkey
	di
;	 jp	 getwin

; Naam	   : getwin
; Functie  : Haal window weg
; Invoer   : Geen
; Uitvoer  : A = 0 geen succes / 255 wel succes
; Verandert: Alles
getwin: LD	IX,MEMPNT-6
	LD	A,(MEMNUM)
	AND	A
	RET	Z
	LD	B,A
	LD	DE,6
MEMLB2: ADD	IX,DE
	DJNZ	MEMLB2
	DEC	A
	LD	(MEMNUM),A
	LD	H,(IX+0)
	LD	L,(IX+1)
	LD	B,(IX+2)
	LD	C,(IX+3)
	LD	D,(IX+4)
	LD	E,(IX+5)
	LD	(MEMALG),DE
	DI
	call	MM2CK
	ld	a,255
	ret

MEMLKA: LD	IX,MEMPNT-6
	LD	A,(MEMNUM)
	INC	A
	LD	(MEMNUM),A
	LD	B,A
	LD	DE,6
MEMLA2: ADD	IX,DE
	DJNZ	MEMLA2
	RET

; Naam	   : CK2MM
; Functie  : Plaats colors en karakters in het geheugen
; Invoer   : DE = geheugen adres
;	   : HL = VRAM adres
;	   : B  = lengte Y-as
;	   : C  = lengte X-as
; Uitvoer  : DE = Nieuw geheugen adres
; Verandert: AF,DE
CK2MM:	PUSH	BC
	PUSH	HL
	PUSH	BC
CK2MM3: PUSH	BC
	CALL	setrd
	LD	B,C
CK2MM4: IN	A,(98H)
	LD	(DE),A
	INC	DE
	DJNZ	CK2MM4
	LD	BC,80
	ADD	HL,BC
	POP	BC
	DJNZ	CK2MM3
	POP	BC
	POP	HL
	PUSH	HL
	PUSH	BC
	XOR	A
	SRL	H
	RR  L
	RRA
	SRL	H
	RR  L
	RRA
	SRL	H
	RR	L
	RLA
	RLA
	RLA
	LD	BC,0A00H
	ADD	HL,BC
	POP	BC
	DEC	C
	ADD	A,C
	SRL	A
	SRL	A
	SRL	A
  INC	A
	LD  C,A
CK2MM1: PUSH	BC
	CALL	setrd
	LD	B,C
CK2MM2: IN	A,(98H)
	LD	(DE),A
	INC	DE
	DJNZ	CK2MM2
	LD  BC,10
	ADD	HL,BC
	POP	BC
	DJNZ	CK2MM1
	POP	HL
	POP	BC
	RET

; Naam	   : MM2CK
; Functie  : Plaats colors en karakters in het VRAM uit het geheugen
; Invoer   : DE = geheugen adres
;	   : HL = VRAM adres
;	   : B  = lengte Y-as
;	   : C  = lengte X-as
; Uitvoer  : DE = Nieuw geheugen adres
; Verandert: AF,DE
MM2CK:	PUSH	BC
	PUSH	HL
	PUSH	BC
MM2CK3: PUSH	BC
	CALL	setwrt
	LD	B,C
MM2CK4: LD	A,(DE)
	INC	DE
	OUT  (98H),A
	DJNZ	MM2CK4
	LD	BC,80
	ADD	HL,BC
	POP	BC
	DJNZ	MM2CK3
	POP	BC
	POP	HL
	PUSH	HL
	PUSH	BC
	XOR	A
	SRL  H
	RR	L
	RRA
	SRL	H
	RR  L
	RRA
	SRL	H
	RR	L
	RLA
	RLA
	RLA
	LD	BC,0A00H
  ADD	HL,BC
	POP	BC
	DEC	C
	ADD	A,C
	SRL	A
	SRL	A
	SRL	A
	INC	A
	LD	C,A
MM2CK1: PUSH	BC
	CALL	setwrt
	LD	B,C
MM2CK2: LD	A,(DE)
	INC	DE
	OUT	(98H),A
	DJNZ	MM2CK2
	LD	BC,10
	ADD	HL,BC
	POP	BC
	DJNZ	MM2CK1
  POP	HL
	POP	BC
	RET

; Naam	   : filcol
; Functie  : Maak een color blok fill
; Invoer   : H  = X coor.
;	   : L  = Y coor.
;	   : B  = lengte Y-as
;	   : C  = lengte X-as
;	   : A  = 255 gekleurd / 0 niet gekleurd
; Uitvoer  : geen
; Verandert: AF,AF',BC',DE',HL'
filcol: LD	(ANDORG+1),A
	AND	A
	JR  Z,FILCE1
	XOR	A		; NOP
	LD	(ANDOR1),A
	LD	(ANDOR3),A
	LD	A,0B1H	; OR C
	JR	FILCE2
FILCE1: LD	A,2FH	; CPL
	LD	(ANDOR1),A
	LD	(ANDOR3),A
	LD	A,0A1H	; AND C
FILCE2: LD	(ANDOR2),A
	LD	(ANDOR4),A
	PUSH	BC
	CALL	xy2adr
	POP	BC
	XOR	A
	SRL  H
	RR	L
	RRA
	SRL  H
	RR	L
	RRA
	SRL	H
	RR	L
	RLA
	RLA
	RLA
	LD	DE,0A00H
	ADD	HL,DE
	PUSH	AF
	ADD	A,C
	CP	9
	JR	C,FILCB1
	LD	A,C
	SUB	8
	LD	C,A
	LD	A,11111111B
	POP	DE
	INC	D
	DEC	D
	JR	Z,FILCA2
FILCA1: SRL	A
	INC	C
	DEC	D
	JR	NZ,FILCA1
FILCA2: PUSH	BC
ANDOR1: NOP
	LD	C,A
	LD	DE,10
	PUSH	HL
FILCA3: CALL	setrd
	IN	A,(98H)
ANDOR2: OR  C
	EX	AF,AF'
	CALL	setwrt
	EX	AF,AF'
	OUT	(98H),A
	ADD	HL,DE
	DJNZ	FILCA3
	POP	HL
	INC	HL
	POP	BC
	LD	A,C
	LD	E,0
FILCA4: INC	E
	SUB	8
	JR	NC,FILCA4
	DEC	E
	JR  Z,FILCA7
	ADD	A,8
	LD	C,A
	PUSH	BC
	LD	C,E
	LD	DE,10
	PUSH	HL
FILCA5: PUSH	BC
	LD	B,C
	CALL	setwrt
ANDORG: LD	A,255
FILCA6: OUT	(98H),A
	DJNZ	FILCA6
	ADD	HL,DE
	POP  BC
	DJNZ	FILCA5
	POP	HL
	LD	B,0
	ADD	HL,BC
	POP	BC
FILCA7: LD	E,10000000B
	LD	A,C
	AND	A
	JR	NZ,FILCA8
	EXX
	RET
FILCB1: POP	DE
	INC	D
	LD	E,00000001B
FILCB2: RRC	E
	DEC	D
	JR	NZ,FILCB2
FILCA8: XOR	A
FILCB3: OR	E
	RRC	E
	DEC	C
	JR	NZ,FILCB3
ANDOR3: NOP
	LD	C,A
	LD	DE,10
FILCB4: CALL	setrd
	IN	A,(98H)
ANDOR4: OR	C
  EX	AF,AF'
	CALL	setwrt
	EX	AF,AF'
	OUT	(98H),A
	ADD	HL,DE
	DJNZ	FILCB4
	EXX
	RET


MEMALG: DEFW	MEMBGN	; Geheugen pointer
MEMNUM: DEFB	0  ; Window nummer

; =============
; rekenroutines
; =============

mult8_16:; in: A = 8-bit getal
	;	 (= 'check-waarde', wordt per bit gecheckt dus naar rechts geschoven)
	;	HL = 16-bit getal (CDE = 'schuif-waarde', wordt naar links geschoven)
	; uit:AHL = 24-bits getal

	ex	de,hl
	ld	hl,0
	ld	c,0
	ex	af,af'
	xor	a
	ex	af,af'
	ld	b,8
m816l:	rra
	jp	nc,m816v
	ex	af,af'
	add	hl,de
	adc	a,c
	ex	af,af'
m816v:	ex	de,hl
	add	hl,hl
	ex	de,hl
	rl	c
	djnz	m816l
	ex	af,af'
	ret


; ================
; ini/exi routines
; ================

  ; CLS SCREEN 0

scrini: DI
  LD	HL,0	; Naamtabel leeg
	CALL	setwrt
	LD	BC,27*80
CLSSC2: LD	A,32
	OUT	(98H),A
	DEC	BC
	LD	A,B
	OR	C
	JR	NZ,CLSSC2
	LD	HL,0A00H	; Kleurtabel leeg
	CALL	setwrt
	LD	BC,10*27
CLSSC3: XOR	A
	OUT	(98H),A
	DEC	BC
	LD	A,B
	OR	C
	JR	NZ,CLSSC3

	; INI SCREEN 0

	LD	A,(0FFE8H)  ; 212 lijnen
	SET	7,A
	LD	(SCRVDP+9),A
	XOR  A  ; Zet VDP-registers 0-14 (Ini screen 0 enz.)
	OUT	(99H),A
	LD	A,17+128
	OUT	(99H),A
	LD	HL,SCRVDP
	LD  BC,0F9BH
	OTIR
	LD  A,1	; Ini palet
	OUT	(99H),A
	LD	A,16+128
	OUT	(99H),A
	LD	HL,COLTAB
	LD  BC,069AH
	OTIR

	; INI KARAKTERSET

	LD	HL,1000H	; Verplaats karset naar VRAM
	CALL	setwrt
	LD	BC,2048
	LD	HL,KARSET
INIAL1: LD	A,(HL)
	INC	HL
	OUT  (98H),A
	DEC	BC
	LD	A,B
	OR	C
	JR	NZ,INIAL1
	EI
	ret

screxi: DI
	CALL	getwin
	or	a
	JR	nZ,screxi
	LD	A,00000000B	; Blinkmode uit
	OUT	(99H),A
	LD	A,12+128
	OUT	(99H),A
	LD	A,00000000B
	OUT	(99H),A
	LD	A,13+128
	OUT  (99H),A
	LD	A,(0FCAFH)	; Oude screenmode terug
	BIOS	5FH
	EI
	ret

SCRVDP: DEFB	00000100B	; Reg. 00
	DEFB	01110000B	; Reg. 01
	DEFB	3	; Reg. 02
	DEFB	47	; Reg. 03
	DEFB	00000010B	; Reg. 04
	DEFB	239	; Reg. 05
	DEFB	31	; Reg. 06
	DEFB	31H	; Reg. 07
	DEFB	00001000B  ; Reg. 08
	DEFB	10000000B	; Reg. 09
	DEFB	0	; Reg. 10
	DEFB	0  ; Reg. 11
	DEFB	32H	; Reg. 12
	DEFB	10H	; Reg. 13
	DEFB	0	; Reg. 14
COLTAB: DEFB	23H,2
	DEFB	45H,4
	DEFB	77H,7

srch_scsi: ; Zoek SCSI bios, zoek NOVAXIS BIOS, controleer versienummer.
	   ; Geef evt. foutmeldingen.

	ld	ix,7f80h
	ld	iy,D_SCSI
	call	hslt_page1     ; Zoek slotnr van SCSI BIOS (en zoek eerst huidige slotcode)
	call	zoek
	jr	z,srch2
	ld	(SCSIslot),a

	ld	hl,(NOVAROM)		; Check 'KMcs' (NOVAXIS ROM ID)
	ld	de,4D4Bh
	call	dcompr
	jr	nz,srch3
	ld	hl,(NOVAROM+2)
	ld	de,7363h
	call	dcompr
	jr	nz,srch3
	ld	hl,(NOVAVER)	; check versienummer
	ld	de,(workver)
	ld	a,l
	cp	e
	jr	c,srch4
	jr	nz,srch0
	ld	a,h
	cp	d
	jr	nc,srch0

srch4:	ld	de,t_errs4	; Verkeerd versienr
	ld	a,34
srcher: call	textwin	; Als error: window printen + weghalen
	scf
srch0:	push	af
	call	GetHostID
	ld	b,a
	add	a,"0"           ; Zet in te printen tekst
	ld	(t_w72),a
	inc  b
	ld	a,128	; Zet ID (0-7) om in 1/2/4/8/...)
srchl:	rlca
	djnz	srchl
	ld	(SCSIID),a
	ld	a,(curslot)
	ld	h,40h
	call	24h
	pop	af
	ret

srch2:	ld	de,t_errs2
	ld	a,18
	jr	srcher
srch3:	ld  de,t_errs3
	ld	a,20
	jr	srcher
t_errs2: db	"No SCSI BIOS found",255
t_errs3: db	"No NOVAXIS SCSI BIOS",255
t_errs4: db	"Wrong version of NOVAXIS SCSI BIOS",255

hslt_page1:	;Vind huidige slotcode in page 1. Wordt ingevuld in (curslot)
	IN	A,(0A8H)
	RRA
	RRA
	AND	3
	LD	B,A
	ADD	A,0C1H
	LD	H,0FCH
	LD	L,A  ;!A bit 7=1
	AND	(HL)
	JP	P,JJ0
	IN	A,(0A8H)	; Slot is uitgebreid
;	 LD	 C,A
	RLCA
	RLCA
	AND	0FCH
	OR	B
  RRCA
	RRCA
	OUT	(0A8H),A
	LD	A,(0FFFFH)
	CPL
	AND	12
	ADD  A,B
	OR	128
	LD  B,A
;	 LD  A,C
;	 OUT	 (0A8H),A
JJ0:	LD  A,B
	ld  (curslot),a
	ret
D_SCSI: db	3,"HD#"

; Zoek tekst in statement-uitbreidingen in page 1
; In: IX=adres in de ROM
;     IY=adres van (lengte,'tekst')
; Uit: niet gevonden: A=0	 , Z=1
;      gevonden     : A=slot-id, Z=0
; Opm: Slot-id is, niet zo netjes op zich, altijd uitgebreid. (bit 7 = 1)

zoek:	LD	HL,0FCCAh
	XOR	A
ZOEK0:	LD	B,4
ZOEK1:	PUSH	BC
	PUSH	AF
	BIT	5,(HL)
	JR	NZ,zoehoek		; Statement-uitbreiding aanwezig
ZOEK2:	POP	AF
	ADD	A,4	; Volgend sec. slot
	INC	HL
	INC	HL
	INC	HL
	INC	HL
	POP	BC
	DJNZ	ZOEK1
	INC  A	; Volgend pr. slot
	AND	3
  JR	NZ,ZOEK0
	XOR	A	; Niet gevonden
	RET
zoehoek:
	PUSH	HL
	PUSH	IX
	PUSH	IY
	OR	128
	LD	H,40h
	CALL	24h  ; Schakel slot
  POP	IY
	POP	IX
	POP	HL
	LD	B,(IY+0)
ZOEK4:	LD	A,(IY+1)
	CP	(IX+0)
	JR	NZ,ZOEK2	; Niet gevonden: volgende
	INC	IY
	INC	IX
	DJNZ	ZOEK4
	POP	AF	; Gevonden!
	POP	BC
	OR	128
	RET
SCSIslot: db 0
curslot:  db 0

; CountDevs: Controleer of er Device van het type 0 aangesloten en online zijn
;	     Zet van al deze devices het ID-nummer en de 24 bytes 'inquiry'
;	     data in tabel INQ_DATA.
; Input : -
; Output: A=(nr_devs) = aantal aangesloten devices
; Modify:

CountDevs:
	SCSICALL GetUnitsOn
	and	a
	jr	z,NoDev
	xor	a	; huidig SCSI ID
  ld	b,a	; aantal Direct access devices
	ld	hl,INQ_DATA+1
ChkNxt: srl  c
  jr	nc,NextID

	push	af	; SCSI device aanwezig. Is het een Direct Access?
	push	bc
	push	hl
	SCSICALL Inquiry
	ld	a,d
	pop	hl
	pop	bc
	pop  de
	or  a
	jr	nz,NoType0	; !!! Fout wordt niet netjes afgehandeld.
			; Fout opgetreden: sla device gewoon over.
	ld	a,(hl)
	and  00011111b	; Extract device type
	jr	nz,NoType0	; No Direct Access Device
	ld	a,(hl)
	and	11100000b
	jr	nz,NoType0	; Device niet aangesloten, ofzo
	dec	hl
	ld	(hl),d	; Store ID of Dir. Acc. Dev.
	inc	b
	ld	a,d
	ld	de,26h
	add	hl,de
	ld	d,a
NoType0: ld	a,d
NextID: inc	a
	cp	8
	jr	nz,ChkNxt

	ld	a,b
	ld	(nr_devs),a    ; Aantal aanwezige Direct Access devices
	or	a
	ret	nz

NoDev:	ld	de,t_errg1
	ld	a,38
	call	textwin
	scf
	ret
t_errg1: db	"No 'direct access' SCSI devices online",255

ChooseDev: ; Zet keuzemenuutje op scherm om tussen verschillende SCSI devices
	   ; te kunnen kiezen.
; In:	   (nr_devs)=aantal devices; (cur_dev) = huidige keuze
;	   gegevens ingevuld in INQ_DATA
; Uit:	   Cy=1: terug naar DOS. Anders (cur_dev)=huidige device
;	   (dev_SCSIID) = ID van huidige device; (t_w71) ingevuld

	di
	ld_hl 24,0           ; Window: Gegevens van HD's.
	ld	a,(nr_devs)
	add	a,4
	ld  b,a
	ld	c,32
	ld	a,2
	call	putwin
	ld_hl 25,1
	ld	de,t_w_ChDev1
	call	print
	ld_hl 16,22          ; Window: Tekst
	ld_bc 4,48
	ld	a,2
	call	putwin
	ld_hl 18,23
	ld	de,t_w_ChDev2
	call	print

; Vul HD-gegevens-window
	ld	a,(nr_devs)
	ld	b,a
	ld	c,3
	ld	hl,INQ_DATA
printDev1:
	push	bc
	push	hl
	ld	a,(hl)	; ID
	ld	h,26
	ld	l,c
	ld	c,a
	call	PrintNr
	ld	a,32  ; spatie tussendoor
	out	(98h),a
	pop  hl	; Vendor (VRAM-adres staat al ingesteld)
	ld	de,9
	add	hl,de
	ld	b,8
	call	PrintTxt
	ld	a,32	; spatie
	out	(98h),a
	ld  b,16	; Product name
	call	PrintTxt
	ld	de,4
	add	hl,de
  pop  bc
	inc	c
	djnz	printDev1

ChDev1: ld	a,(cur_dev)
	ld	e,0
	call	ChDev_balk
	ei
ChDev_key:
	BIOS	CHSNS
	jp	z,ChDev_key

	BIOS	CHGET
	cp	27
	scf
	jr  z,Chback
	sub	30
	jr	z,ChDev_up
	dec	a
	jr	z,ChDev_down
	dec	a
	jr	nz,ChDev_key
Chback: push	af
	call	getwin	; Spatie: haal 2 windows weg
	call	getwin
	ld	a,(cur_dev)	; Haal SCSI ID van huidige device
	ld	b,a
	inc	b
	ld	hl,INQ_DATA-25h
	ld	de,25h
Chbv:	add	hl,de
	djnz	Chbv
	ld	a,(hl)
	ld	(dev_SCSIID),a
	add	a,"0"
	ld	(t_w71),a	; In te printen tekst
	pop	af		; CY=1 als esc, 0 als spatie
	ret

ChDev_down:
	ld	a,(nr_devs)	; (ch_dev)+1 < (nr_devs)? anders terug.
	ld	b,a
	ld  a,(cur_dev)
	inc	a
	cp	b
	jr	nc,ChDev_key
	ld	(cur_dev),a
	dec	a
ChDev2: ld	e,255	; Wis balk
	di
	call	ChDev_balk
	jr	ChDev1
ChDev_up:
	ld	a,(cur_dev)	; Cursor omhoog. Terug als huidige = 0
	or	a
	jr	z,ChDev_key
	dec	a
	ld	(cur_dev),a
	inc	a
	jr	ChDev2



ChDev_balk: ; E=255 filled 0 niet / A=positie
	add	a,3	; Print balk
	ld	l,a
	ld	h,26
	ld_bc 1,28
	ld	a,e
	jp	filcol

t_w_ChDev1: db " ID Vendor   Product name",0
	    db "------------------------------",255
t_w_ChDev2: db "Select SCSI device with cursors and spacebar",0
	    db "ESC = Back to DOS",255

;;;;;; ====================
; code voor debuggen. Kan weg.

; 2 keer PRTHEX - routine die waarde op beeld print. Handig voor debuggen.

; SUBS:


PRINT_:  push  af
	rrca
	rrca
	rrca
	rrca
	call	prtdig
	pop	af
	call	prtdig
	ld	a,32
	out	(98h),a
	ret
prtdig: and	15
	ld	c,"0"
	cp	10
	jr	c,prtdi2
	ld	c,"A"-10
prtdi2: add	a,c
	out	(98h),a
	ret

; PRTHEX (1): print byte in A, VRAM-adres HL

prthex1: di
	push af
	push bc
	push hl
	push af
	call setwrt
	pop  af
	call PRINT_
	pop  hl
	pop  bc
	pop  af
	ei
	ret


; PRTHEX (2): Print B(1) rijtjes met B(2)  bytes vanaf DE, VRAM-adres HL

prthex: di
	push	hl
	push	de
	push	bc
	push	af
prthe2: push	bc
	call	setwrt
	ld	b,4	;;;
prthe1: ld	a,(de)
	call	PRINT_
	inc	de
	djnz	prthe1

	ld	bc,80
	add	hl,bc
	pop	bc
	djnz	prthe2

	pop	af
	pop  bc
	pop	de
	pop	hl
	ei
	ret

prient: push	de
	push	hl
	push	ix
	push	de
	push	hl
	push	ix	;ix
	pop	de
	ld	h,0
	ld	l,a
	ld	a,d
	call	prthex1
	inc	hl
	inc  hl
	ld  a,e
	call	prthex1

	pop	de	; hl
	inc	hl
	inc	hl
	inc	hl
	ld	a,d
	call	prthex1
	inc	hl
	inc	hl
	ld  a,e
	call	prthex1

	pop	de	; de
	inc	hl
	inc	hl
	inc	hl
	ld  a,d
	call	prthex1
	inc	hl
	inc	hl
	ld	a,e
	call	prthex1

		; bc
	inc	hl
	inc	hl
	inc	hl
	ld	a,b
	call	prthex1
	inc	hl
	inc	hl
	ld	a,c
	call	prthex1
	push	iy
	BIOS	9fh
	pop	iy
	pop  ix
	pop	hl
	pop	de
	ret

CODEEND:
DOS2BOOT	equ CODEEND	; Bootsector voor nieuwe partities
KARSET		equ CODEEND+512 ; karakterset
MEMPNT		equ KARSET	; steeds 6 bytes voor elk opgeslagen window:
			; X,Y,lX,lY,adres in RAM
MEMBGN		equ MEMPNT+72

O_BACK: equ	10
O_BOOT: equ	-1
O_OLDP: equ	0
O_TYPE: equ	1
O_LENG: equ	2
O_RDID: equ	6
O_WRID: equ	7
O_VNAM: equ	8
O_OEM:	equ	19
O_SC:	equ	27
O_RESE: equ	28
O_FATS: equ	30
O_DIRS: equ	31
O_MEDI: equ	33
O_SF:	equ	34
	end

Table (B)PARTDATA consists of: 
(=: only in BPARTDATA, not in PARTDATA)

- 'boot partition or not'; 0 if MSX-table                    1 byte        -1
- old partition nr. (label PARTDATA is at this byte!)	     1 byte (*1)   0
- type							     1		   1
= min. nr. DIR sectors without data being lost               2
= min. nr. FAT sectors  "                            "       2
= highest taken cluster nr.				     2
= start sector	 					     4
- nr. of sectors            (MSB always assumed to be 0)     4		   2
- read ID						     1	    (*2)   6
- write ID						     1	    (*2)   7
- volume name						    11	    (*2)   8
- OEM name (in boot)					     8	    (*2)   19
- sectors/cluster           (power of 2)		     1	    (*2)   27
- reserved sectors          (min. 1, for boot sector)	     2	    (*2)   28
- nr. of  FATs	 					     1	    (*2)   30
- nr. of dir. entries					     2	    (*2)   31
- medium descriptor					     1	    (*2)   33
- sectors/FAT					     2	    (*2)   34


(*1): Old partition number can be:
- 255: New partition, or partitie must be re-initialised
- 0-15: old partition number, before NFDISK was started
  Bit 7=1: Write DOS2-bootprogramme (i.e. do not take old boot sector contents)

(*2): Only defined for FAT12 partitions with <= 65535 sectoren


Layout extended MSX partition table: (located on sector 1)
+00	 : 'KMcs' (ID)
+04	 : Nr. of partitions
+05 - +0C: 8 bytes for drive A:-H: which partition nr. is mapped on starup
	   (values 0-15)
	   255 means: This drive is not used by the HD and the remaining bytes
	   are 255 too
+0D - ...: (+04) * 11 bytes: - partition type	1 byte	(1 = MSX)
		             - start sector	4
		             - nr. of sectors	4
		             - read ID		1
		             - write ID   	1




.comment %

Veranderd in deze versie:

- Extra byte in PARTDATA-tabel toegevoegd. Hier staat bij PC-tabel
  of BERT-tabel het eerste byte uit de partitiegegevens.
  (Kan volgens de documentatie zijn: 0 = inactieve partitie, 80h = boot-part.
   wordt op MSX niet gebruikt.)
  Bij MSX tabel wordt deze byte in de partitiegegevens gebruikt voor het
  write-ID; de byte in PARTDATA wordt op 0 geinitialiseerd.
  Om jou niet in problemen te laten komen heb ik deze byte toegevoegd VOOR
  het 'oude partitienummer'. Let op: het label PARTDATA staat nu op de
  2e byte van de tabel!
* De waarde voor 'te initialiseren partitie' is niet meer 16, maar 255!
  Kijk dit A.U.B. even na en verander dit waar nodig in je code...
* In de PARTDATA-tabel zijn nu toch 2 bytes gereserveerd voor het aantal
  sectoren per FAT i.p.v. 1. Het maakt me niet uit als je het aantal maximaal
  255 (of wat dan ook) maakt, maar het is toch veiliger om in de inlees-
  en wegschrijf/initialiseer-routines er rekening mee te houden dat er evt.
  een waarde >256 ZOU KUNNEN staan... Dat heb ik dus gedaan/ga ik doen.
  Zou je de 2e byte ook op 0 willen zetten bij initialiseren? Thanx...
- De routine print_type is iets veranderd, zodat er gecontroleerd wordt op
  grootte >65536 sectoren i.p.v. >65535. dit is dus niet meer
  ld a,(ix+bla); or (ix+bla+1); jr z,niet_goed. Ook de waarde 00010000H wordt
  nu als MSX partitie geaccepteerd.
  Bij het nakijken zag ik dat jij deze controle ook 2 keer in een routine hebt
  zitten. Ik ben zo vrij geweest op je code daar aan te passen.
  (2 labels extra: w1_edymsx en w1_iymsx)
- SCSIID wordt ingevuld
- paar labels veranderd: BOOTS is BOOTSEC (is geen hele tabel meer), BPARTDATA
  / BDMAPDATA is er bij gekomen, (B)PMAPDATA / (B)tab2type is weg,
  (B)tabtype heeft iets andere betekenis
%

