<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://oldwiki.cpcwiki.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nworc</id>
		<title>CPCWiki - THE Amstrad CPC encyclopedia! - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://oldwiki.cpcwiki.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nworc"/>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php/Special:Contributions/Nworc"/>
		<updated>2026-08-29T11:58:14Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=Programming:A_simple_disc_formatter_using_BDOS_functions&amp;diff=108484</id>
		<title>Programming:A simple disc formatter using BDOS functions</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=Programming:A_simple_disc_formatter_using_BDOS_functions&amp;diff=108484"/>
				<updated>2022-03-22T23:33:16Z</updated>
		
		<summary type="html">&lt;p&gt;Nworc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
;; A simple disc formatter which uses the BDOS functions.&lt;br /&gt;
;;&lt;br /&gt;
;; This example will work on CPC and CPC+.&lt;br /&gt;
;;&lt;br /&gt;
;; Format program supports:&lt;br /&gt;
;; - 40 track single sided disc drive ONLY&lt;br /&gt;
;; - Vendor and Data formats ONLY&lt;br /&gt;
;;&lt;br /&gt;
;; Comment Nworc, 23.02.2022: &lt;br /&gt;
;;   This code is useful as a learning experience, but be careful not to use it in a productive environment, because&lt;br /&gt;
;;   the formatting routine formats the sectors consecutively (e.g. C1 C2 C3 C4 ... for Data format). While this works,&lt;br /&gt;
;;   read and write performance is poor on a disk with such a format, as the disk needs to spin 9 times to write a full&lt;br /&gt;
;;   track instead of just 2 turns if the format would be interleaved. The format_track method need be changed to produce&lt;br /&gt;
;;   an interleaved format (e.g. C1 C6 C2 C7 ... for Data format) in order to fix this. Changing that is a nice exercise.&lt;br /&gt;
&lt;br /&gt;
org &amp;amp;2000&lt;br /&gt;
nolist&lt;br /&gt;
write&amp;quot;format.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------&lt;br /&gt;
;; operating system functions used&lt;br /&gt;
&lt;br /&gt;
.kl_find_command equ &amp;amp;bcd4&lt;br /&gt;
.txt_output equ &amp;amp;bb5a&lt;br /&gt;
.bdos_set_message equ 1&lt;br /&gt;
.bdos_format equ 6&lt;br /&gt;
.bdos_move_track equ 7&lt;br /&gt;
.bdos_set_retry_count equ 9&lt;br /&gt;
.bdos_get_status equ 8&lt;br /&gt;
.bdos_select_format equ 3&lt;br /&gt;
.km_read_char equ &amp;amp;bb09&lt;br /&gt;
.km_wait_char equ &amp;amp;bb06&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------&lt;br /&gt;
;; offsets into our data &lt;br /&gt;
&lt;br /&gt;
.DRIVE equ 0&lt;br /&gt;
.TRACK equ 1&lt;br /&gt;
.SECTOR_ID equ 2&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------&lt;br /&gt;
;; search roms to find commands required for format&lt;br /&gt;
&lt;br /&gt;
ld hl,disc_command&lt;br /&gt;
call kl_find_command&lt;br /&gt;
ret nc&lt;br /&gt;
&lt;br /&gt;
ld hl,format_command&lt;br /&gt;
call kl_find_command&lt;br /&gt;
ret nc&lt;br /&gt;
ld (format_cmd_data),hl&lt;br /&gt;
ld a,c&lt;br /&gt;
ld (format_cmd_data+2),a&lt;br /&gt;
&lt;br /&gt;
ld hl,select_format_command&lt;br /&gt;
call kl_find_command&lt;br /&gt;
ret nc&lt;br /&gt;
ld (select_format_cmd_data),hl&lt;br /&gt;
ld a,c&lt;br /&gt;
ld (select_format_cmd_data+2),a&lt;br /&gt;
&lt;br /&gt;
ld hl,move_track_command&lt;br /&gt;
call kl_find_command&lt;br /&gt;
ret nc&lt;br /&gt;
ld (move_track_cmd_data),hl&lt;br /&gt;
ld a,c&lt;br /&gt;
ld (move_track_cmd_data+2),a&lt;br /&gt;
&lt;br /&gt;
ld hl,set_retry_count_command&lt;br /&gt;
call kl_find_command&lt;br /&gt;
ret nc&lt;br /&gt;
ld (set_retry_count_cmd_data),hl&lt;br /&gt;
ld a,c&lt;br /&gt;
ld (set_retry_count_cmd_data+2),a&lt;br /&gt;
&lt;br /&gt;
ld hl,set_message_command&lt;br /&gt;
call kl_find_command&lt;br /&gt;
ret nc&lt;br /&gt;
ld (set_message_cmd_data),hl&lt;br /&gt;
ld a,c&lt;br /&gt;
ld (set_message_cmd_data+2),a&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ld ix,data&lt;br /&gt;
&lt;br /&gt;
;; display format question&lt;br /&gt;
ld hl,format_type_txt&lt;br /&gt;
call print&lt;br /&gt;
&lt;br /&gt;
.copy2&lt;br /&gt;
call flush_keyboard&lt;br /&gt;
call km_wait_char&lt;br /&gt;
and &amp;amp;df&lt;br /&gt;
cp &amp;quot;V&amp;quot;&lt;br /&gt;
ld c,&amp;amp;41&lt;br /&gt;
jr z,copy3&lt;br /&gt;
cp &amp;quot;D&amp;quot;&lt;br /&gt;
ld c,&amp;amp;c1&lt;br /&gt;
jr z,copy3&lt;br /&gt;
ld a,7&lt;br /&gt;
call txt_output&lt;br /&gt;
jp copy2&lt;br /&gt;
&lt;br /&gt;
.copy3&lt;br /&gt;
call txt_output&lt;br /&gt;
&lt;br /&gt;
ld (ix+SECTOR_ID),c&lt;br /&gt;
&lt;br /&gt;
call crlf&lt;br /&gt;
&lt;br /&gt;
;; display drive question&lt;br /&gt;
ld hl,sel_drive_txt&lt;br /&gt;
call print&lt;br /&gt;
ld hl,drive_txt&lt;br /&gt;
call print&lt;br /&gt;
&lt;br /&gt;
;; ask user to select drive&lt;br /&gt;
call get_drive&lt;br /&gt;
ld (ix+DRIVE),c&lt;br /&gt;
&lt;br /&gt;
ld hl,insert_disc_txt&lt;br /&gt;
call print&lt;br /&gt;
ld a,(ix+DRIVE)&lt;br /&gt;
add a,&amp;quot;A&amp;quot;&lt;br /&gt;
call txt_output&lt;br /&gt;
ld hl,any_key_txt&lt;br /&gt;
call print&lt;br /&gt;
&lt;br /&gt;
call flush_keyboard&lt;br /&gt;
call km_wait_char&lt;br /&gt;
&lt;br /&gt;
;; select the format (initialises some of the XDPB parameters that are required&lt;br /&gt;
;; by the format function)&lt;br /&gt;
ld a,(ix+SECTOR_ID)&lt;br /&gt;
call do_select_format&lt;br /&gt;
&lt;br /&gt;
;; do format&lt;br /&gt;
ld b,40&lt;br /&gt;
xor a&lt;br /&gt;
.format_disc&lt;br /&gt;
ld (ix+TRACK),a&lt;br /&gt;
push af&lt;br /&gt;
push bc&lt;br /&gt;
&lt;br /&gt;
ld hl,format_track_txt&lt;br /&gt;
call print&lt;br /&gt;
call disp_track&lt;br /&gt;
&lt;br /&gt;
call format_track&lt;br /&gt;
&lt;br /&gt;
pop bc&lt;br /&gt;
pop af&lt;br /&gt;
inc a&lt;br /&gt;
djnz format_disc&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------&lt;br /&gt;
;; remove all characters from keyboard input buffer&lt;br /&gt;
&lt;br /&gt;
.flush_keyboard&lt;br /&gt;
call km_read_char&lt;br /&gt;
jr nc,flush_keyboard&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;------------------------------------&lt;br /&gt;
;; Exit: C = drive index&lt;br /&gt;
&lt;br /&gt;
.get_drive&lt;br /&gt;
;; remove keys from keyboard buffer&lt;br /&gt;
call flush_keyboard&lt;br /&gt;
;; wait for next character from keyboard&lt;br /&gt;
call km_wait_char&lt;br /&gt;
;; convert to upper case&lt;br /&gt;
and &amp;amp;df&lt;br /&gt;
&lt;br /&gt;
cp &amp;quot;A&amp;quot;&lt;br /&gt;
ld c,0&lt;br /&gt;
jr z,gd2&lt;br /&gt;
cp &amp;quot;B&amp;quot;&lt;br /&gt;
ld c,1&lt;br /&gt;
jr z,gd2&lt;br /&gt;
&lt;br /&gt;
;; error (beep)&lt;br /&gt;
ld a,7&lt;br /&gt;
call txt_output&lt;br /&gt;
jr get_drive&lt;br /&gt;
&lt;br /&gt;
.gd2&lt;br /&gt;
call txt_output&lt;br /&gt;
call crlf&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;-------------------------&lt;br /&gt;
;; display CR,LF control codes (go to next line)&lt;br /&gt;
.crlf&lt;br /&gt;
ld a,13&lt;br /&gt;
call txt_output&lt;br /&gt;
ld a,10&lt;br /&gt;
call txt_output&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;-------------------------------------&lt;br /&gt;
;; display a message starting at memory address pointed to by HL. &lt;br /&gt;
;; (message is terminated with 0 character)&lt;br /&gt;
&lt;br /&gt;
.print&lt;br /&gt;
ld a,(hl)&lt;br /&gt;
inc hl&lt;br /&gt;
or a&lt;br /&gt;
ret z&lt;br /&gt;
call txt_output&lt;br /&gt;
jr print&lt;br /&gt;
&lt;br /&gt;
;;----------------------------------------------&lt;br /&gt;
;; output the number of the current track to the screen&lt;br /&gt;
&lt;br /&gt;
.disp_track&lt;br /&gt;
ld a,(ix+TRACK)&lt;br /&gt;
call print_decimal&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;----------------------------------------------&lt;br /&gt;
;; display a decimal number to the screen &lt;br /&gt;
&lt;br /&gt;
.print_decimal&lt;br /&gt;
ld e,1&lt;br /&gt;
ld b,100&lt;br /&gt;
call print_decimal_digit&lt;br /&gt;
ld b,10&lt;br /&gt;
call print_decimal_digit&lt;br /&gt;
dec e&lt;br /&gt;
ld b,1&lt;br /&gt;
&lt;br /&gt;
.print_decimal_digit&lt;br /&gt;
ld c,0&lt;br /&gt;
.dd&lt;br /&gt;
sub b&lt;br /&gt;
jr c,dd2&lt;br /&gt;
inc c&lt;br /&gt;
jr dd&lt;br /&gt;
.dd2&lt;br /&gt;
add a,b&lt;br /&gt;
push af&lt;br /&gt;
ld a,e&lt;br /&gt;
or a&lt;br /&gt;
ld a,c&lt;br /&gt;
jr z,dd4&lt;br /&gt;
or a&lt;br /&gt;
jr z,dd5&lt;br /&gt;
dec e&lt;br /&gt;
&lt;br /&gt;
.dd4&lt;br /&gt;
add a,&amp;quot;0&amp;quot;&lt;br /&gt;
call txt_output&lt;br /&gt;
.dd5&lt;br /&gt;
pop af&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;;-------------------------------------&lt;br /&gt;
&lt;br /&gt;
.do_set_retry_count&lt;br /&gt;
push ix&lt;br /&gt;
rst 3&lt;br /&gt;
defw set_retry_count_cmd_data&lt;br /&gt;
pop ix&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
.do_move_track&lt;br /&gt;
push ix&lt;br /&gt;
rst 3&lt;br /&gt;
defw move_track_cmd_data&lt;br /&gt;
pop ix&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
.do_format&lt;br /&gt;
push ix&lt;br /&gt;
rst 3&lt;br /&gt;
defw format_cmd_data&lt;br /&gt;
pop ix&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
.do_select_format&lt;br /&gt;
push ix&lt;br /&gt;
rst 3&lt;br /&gt;
defw select_format_cmd_data&lt;br /&gt;
pop ix&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
.do_set_message&lt;br /&gt;
push ix&lt;br /&gt;
rst 3&lt;br /&gt;
defw set_message_cmd_data&lt;br /&gt;
pop ix&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
.format_track&lt;br /&gt;
;; setup format data&lt;br /&gt;
ld hl,format_data&lt;br /&gt;
push hl&lt;br /&gt;
ld b,9&lt;br /&gt;
ld a,(ix+SECTOR_ID)&lt;br /&gt;
ld c,(ix+TRACK)&lt;br /&gt;
.wt1 &lt;br /&gt;
ld (hl),c&lt;br /&gt;
inc hl&lt;br /&gt;
ld (hl),0&lt;br /&gt;
inc hl&lt;br /&gt;
ld (hl),a&lt;br /&gt;
inc hl&lt;br /&gt;
ld (hl),2&lt;br /&gt;
inc hl&lt;br /&gt;
inc a&lt;br /&gt;
djnz wt1&lt;br /&gt;
pop hl&lt;br /&gt;
&lt;br /&gt;
ld e,(ix+DRIVE)&lt;br /&gt;
ld d,(ix+TRACK)&lt;br /&gt;
call do_move_track&lt;br /&gt;
&lt;br /&gt;
ld e,(ix+DRIVE)&lt;br /&gt;
ld d,(ix+TRACK)&lt;br /&gt;
call do_format&lt;br /&gt;
ret&lt;br /&gt;
&lt;br /&gt;
;;-------------------------------------&lt;br /&gt;
&lt;br /&gt;
.disc_command&lt;br /&gt;
defb &amp;quot;DIS&amp;quot;,&amp;quot;C&amp;quot;+&amp;amp;80&lt;br /&gt;
&lt;br /&gt;
.format_command&lt;br /&gt;
defb bdos_format+&amp;amp;80&lt;br /&gt;
&lt;br /&gt;
.select_format_command&lt;br /&gt;
defb bdos_select_format+&amp;amp;80&lt;br /&gt;
&lt;br /&gt;
.move_track_command&lt;br /&gt;
defb bdos_move_track+&amp;amp;80&lt;br /&gt;
&lt;br /&gt;
.set_retry_count_command&lt;br /&gt;
defb bdos_set_retry_count+&amp;amp;80&lt;br /&gt;
&lt;br /&gt;
.set_message_command&lt;br /&gt;
defb bdos_set_message+&amp;amp;80&lt;br /&gt;
&lt;br /&gt;
;;-------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.format_cmd_data&lt;br /&gt;
defw 0&lt;br /&gt;
defb 0&lt;br /&gt;
&lt;br /&gt;
.select_format_cmd_data&lt;br /&gt;
defw 0&lt;br /&gt;
defb 0&lt;br /&gt;
&lt;br /&gt;
.move_track_cmd_data&lt;br /&gt;
defw 0&lt;br /&gt;
defb 0&lt;br /&gt;
&lt;br /&gt;
.set_retry_count_cmd_data&lt;br /&gt;
defw 0&lt;br /&gt;
defb 0&lt;br /&gt;
&lt;br /&gt;
.set_message_cmd_data&lt;br /&gt;
defw 0&lt;br /&gt;
defb 0&lt;br /&gt;
&lt;br /&gt;
;;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
.format_type_txt&lt;br /&gt;
defb &amp;quot;Vendor or Data (V or D):&amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
.sel_drive_txt&lt;br /&gt;
defb &amp;quot;Drive &amp;quot;,0&lt;br /&gt;
.drive_txt&lt;br /&gt;
defb &amp;quot;(A or B):&amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
.insert_disc_txt&lt;br /&gt;
defb &amp;quot;Insert disc into drive &amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
.any_key_txt&lt;br /&gt;
defb &amp;quot; and press any key&amp;quot;,13,10,0&lt;br /&gt;
&lt;br /&gt;
.format_track_txt&lt;br /&gt;
defb 13,&amp;quot;Format track &amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
.data&lt;br /&gt;
defs 16&lt;br /&gt;
&lt;br /&gt;
.format_data&lt;br /&gt;
defs 9*4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>Nworc</name></author>	</entry>

	</feed>