I put some useful subprograms of the monitor here. These subprograms
can be used by the assembler command CALL followed by the entry
point address.
The contents of the registers shown by "Protected registers" in the
following descriptions will remain unchanged by the associated subprogram,
while the contents of registers not shown must be saved first if necessary
by the use of the assembler command PUSH reg prior to the call
of the subprogram and must be restored by the assembler command POP
reg when the subprogram terminates.
Entrypoint |
$0000 |
Function |
start monitor |
Symbolic name |
MONIT |
Protected registers |
none |
Description
|
This is the entry point to the monitor program after resetting
the MZ-700 or after switching the power on.
Invoking this subroutine will take the same effect like pressing
the RESET key: the MZ-700 restarts. Note, the workarea will be cleared and some other functions are performed too. To
this see the monitor's source
code ( 50KB ).
This entry of the monitor program may be used by a CALL instruction
but no control will be given back to the caller. There will be
no difference between using a CALL instruction or a JP instruction
in your program to go to this entry. An example using this entry
follows.
To modify something in the monitor's code the ROM is to copy
to the RAM and then the monitor program is to restart:
B000 210000 LD HL,$0000 ;copy from ROM $0000
B003 110012 LD DE,$1200 ;to RAM $1200
B006 010008 LD BC,$0800 ;in the length of $0800
B009 EDB0 LDIR ;do the copy now
B00B D3E0 OUT ($E0),A ;bank switch ROM to RAM
B00D 210012 LD HL,$1200 ;and copy from RAM $1200
B010 110000 LD DE,$0000 ;to RAM $0000
B013 010008 LD BC,$0800 ;in the length of $0800
B016 EDB0 LDIR ;do copy
B018 C30000 JP $0000 ;go to monitor (reset)
First the monitor's ROM is to copy into any RAM location. I have
chosen the RAM area from $1200 to $19FF. Use another location
if needed. The move will be done by the instructions at locations
$B000, $B003, $B006, and $B009.
When the copy is completed the ROM area must be switched
to the RAM area ( done by the instruction at location $B00B
). The contents of the ROM previous copied to the RAM up from
location $1200 can be removed now to its executable location up
from $0000 but in the RAM ( $B00D, $B010, $B013, and $B016 ).
Then the monitor in the RAM will be executed by the instruction
at location $B018.
The monitor exists now in the RAM, executes in the RAM, and can
be modified for own purposes by the command M. This area can be saved every time if needed by the monitor's command L. Follow
the previous links for a detailed description of the commands M or L.
|
Entrypoint |
$0003 |
Function |
get line |
Symbolic name |
GETL |
Protected registers |
all |
Description
|
This subroutine waits for a keyboard input string up to max.
80 characters in length.
The characters typed in will be stored starting up from the memory
location specified by the register DE. The register DE must point
to an input area of 80 bytes in length and must be established
before calling this subroutine.
The execution of this routine stops by pressing CR or
by pressing SHIFT and BREAK coincidentally.
If the CR key is used the string entered will be suffixed
by $0D. If no string was entered but the CR key,
then the key code of CR ( $0D ) only is placed in the input
area addressed by DE.
If SHIFT andBREAK were pressed coincidentally then the
input area contains the break key code $1B followed by
the CR key code $0D, so any program can take effect to
this condition.
Because all registers are protected / saved by this subroutine
no information about the length of the character string that was
entered is available on return from this subroutine. If the caller
of this subroutine needs the length of the input string all characters
must be counted until the key code $0D in the input area will
be found. This is done by the following example.
Example:
B000 1100C5 LD DE,$C500 ;at $C500 is my input area 80 bytes
;in length
B003 CD0300 NON: CALL $0003 ;execute monitor's GETL subroutine
B006 1A LD A,(DE) ;get 1st character of string if any
B007 FE1B CP $1B ;check for break key code
B008 CAxxxx JP Z,BREAK ;if break go to the BREAK routine
B00B FE0D CP $0D ;check if none input
B00D CAxxxx JP Z,NONE ;I don't allow no input, again user
B010 0600 LD B,$00 ;init counter of string length
B012 FE0D CNT: CP $0D ;end of string?
B014 2805 JR Z,STRE ;yes, go to process string.
;B contains length of the string
B016 04 INC B ;counter + 1
B017 13 INC DE ;address to next character
B018 1A LD A,(DE) ;get it
B019 18F7 JR CNT ;check next character
B01B STRE: ;at this point I can process the string
Subroutine BREAK not shown.
|
Entrypoint |
$0006 |
Function |
2 new lines |
Symbolic name |
LETNL |
Protected registers |
all except AF |
Description
|
This subroutine sets the cursor to the first column of the line
after the next line ( spaces 1 line ).
Example:
B000 CD0600 CALL $0006 ;new line
B003 C3AD00 JP $00AD ;goback to monitor
No more instructions were needed.
|
Entrypoint |
$0009 |
Function |
new line |
Symbolic name |
NL |
Protected registers |
all except AF |
Description
|
This subroutine sets the cursor to the first column of the next
line.
Example:
B000 CD0900 CALL $0009 ;new line
B003 C3AD00 JP $00AD ;goback to monitor
No more instructions were needed.
|
Entrypoint |
$000C |
Function |
print space |
Symbolic name |
PRNTS |
Protected registers |
all except AF |
Description
|
This subroutine prints a space character at the current cursor
position.
Example:
B000 CD0C00 CALL $000C ;print single space character
B003 C3AD00 JP $00AD ;goback to monitor
No more instructions were needed.
|
Entrypoint |
$000F |
Function |
print TAB |
Symbolic name |
PRNTT |
Protected registers |
all except AF |
Description
|
This subroutine sets the cursor to the next tabulator position
depending on the current cursor position. Tabulator positions
are the columns 1, 11, 21, and 31.
For example, if the current cursor position is 25 then the cursor
will be set to column 31. The next output of a print command starts
printing at column 31.
Example:
B000 CD0F00 CALL $000F ;set cursor to next tab position
B003 C3AD00 JP $00AD ;goback to monitor
No more instructions were needed.
|
Entrypoint |
$0012 |
Function |
print character |
Symbolic name |
PRNT |
Protected registers |
all except AF |
Description
|
This subroutine displays at the current cursor position the ASCII
character stored in the accumulator register A .
The conversion from ASCII code to the display code will be done
internally. Additional all cursor control characters will take effect to its associated function.
Example:
B000 3E16 LD A,$16 ;force clear screen
B002 CD1200 CALL $0012 ;print clear screen
B005 3E43 LD A,$43 ;load character "B"
B007 CD1200 CALL $0012 ;print character
B00A C3AD00 JP $00AD ;goback to monitor
First the screen will be cleared by the instruction sequence
from $B000 to $B002, then the letter "B" will be printed
by $B005 and $B007.
|
Entrypoint |
$0015 |
Function |
print message |
Symbolic name |
MSG |
Protected registers |
all |
Description
|
This subroutine displays a character string at the current cursor
location. The string is contained in a memory area and the start
of this area must be pointed to by the register DE .
The end of the character string must be indicated by the carriage
return control character $0D, but no carriage return will take
effect on the screen.
Any other cursor control characters $11 - $16 contained in the
character string will take effect like pressing its associated
key function ( e.g. cursor control keys or clear screen key ).
A new line function cannot be invoked by this subroutine. If
a new line function is needed the message must be split into two
print messages and the new line control function must be invoked
between the print functions of the two messages.
Example:
B000 1100AF LD DE,$AF00 ;pointer to string 1
B003 CD1500 CALL $0015 ;print string 1
B006 CD0900 CALL $0009 ;new line
B009 1107AF LD DA,$AF07 ;pointer to string 2
B00C CD1500 CALL $0015 ;print string 2
B00F C3AD00 JP $00AD ;goback to monitor
AF00 16 46 49 52 53 54 0D 53 .FIRST.S
AF08 45 43 4F 4E 44 0D xx xx ECOND...
The register DE points to an ASCII string to be printed from
the memory. The register DE will be established by the instruction
at $B000 and the print function will be done by the CALL at location
$B003.
First, the screen will be cleared by printing the control character
$16 contained in the first position of the string. Next, the string
"FIRST" at location $AF01 will be printed at the top
of the screen. The CR control character at location $AF06 indicates
the end of this string and will not be printed but the print function
of this string will be terminated by this.
A new line will be printed by the CALL at location $B006. The
string "SECOND" is addressed by the instruction at $B009
and printed out at this new line by the CALL at location $B00C.
The print function ends by the CR at location $AF0D.
|
Entrypoint |
$0018 |
Function |
print message |
Symbolic name |
MSGX |
Protected registers |
all |
Description
|
This subroutine displays a character string at the current cursor
location. The string is contained in a memory area and the start
of this area must be pointed to by the register DE .
The end of the character string must be indicated by the carriage
return control character $0D, but no carriage return will take
effect on the screen.
Any other cursor control characters $11 - $16 contained in the
character string will be printed as a character ( e.g. cursor
down = $11 is displayed as ), no other control character function is performed.
Example:
B000 1100AF LD DE,$AF00 ;pointer to string
B003 CD1800 CALL $0018 ;print string
B006 C3AD00 JP $00AD ;goback to monitor
AF00 16 44 45 46 47 48 0D xx .DEFGH..
The register DE points to an ASCII string to be printed from
the memory. First, the character $16 will be printed as and no other control key function will be performed. Next, the
string "DEFGH" at location $AF01 will be printed at
the current cursor position.
|
Entrypoint |
$001B |
Function |
get key |
Symbolic name |
GETKY |
Protected registers |
all except AF |
Description
|
This subroutine scans the keyboard but it doesn't wait for any
key input.
If no key was active the accumulator register A contains $00
on return to the caller, otherwise the accumulator register A
contains the ASCII code of the associated key.
The code of an active key neither will be displayed on screen
nor any control function ( e.g. clear screen ) will be performed.
The control keys return the following codes in the accumulator
register A ( additional display code is shown for further information
):
Key(s) |
Contents of
the accumulator
register A |
Display
code |
cursor down
|
$11 |
$C1 |
cursor up
|
$12 |
$C2 |
cursor right
|
$13 |
$C3 |
cursor left
|
$14 |
$C4 |
home
|
$15 |
$C5 |
clear
|
$16 |
$C6 |
DEL |
$60 |
$C7 |
INST |
$61 |
$C8 |
ALPHA |
$62 |
$C9 |
GRAPH |
$63 |
$CA |
SHIFT+BREAK |
$64 |
$CB |
CR |
$66 |
$CD |
Example:
B000 CD1B00 CALL $001B ;get key
B003 C4C303 CALL NZ,$03C3 ;display key code if register A not $00
;2 digits hexadecimal notation
B006 C300B0 JP $B000 ;loop until hard reset
The keyboard will be scanned by CALL $001B. The contents of register
A will be displayed at the current cursor position and will be
shown in a 2-digits hexadecimal notation by a conditional CALL
NZ,$03C3. The condition 'no key pressed' is suppressed by this
call. That means $00 will not be displayed.
Note, this routine loops until the reset key is activated.
|
Entrypoint |
$001E |
Function |
check control keys BRK / SHIFT
/ CTRL |
Symbolic name |
BRKEY |
Protected registers |
all except AF |
Description
|
This subroutine tests if a control key or a combination of the SHIFT key and the BREAK key is pressed coincidentally
but it doesn't wait for any key input.
If one or more of the control keys were used the zero flag is
set ( Z = 1 ), otherwise it is reset ( Z = 0 ).
The following table will help to determine which key(s) is /
are pressed:
Key(s) |
Contents of the
accumulator
register A |
Carry
flag ? |
Zero
flag ? |
no key |
$7F |
no |
no |
BREAK |
$3F |
no |
no |
SHIFT |
$40 |
yes |
no |
CTRL |
$20 |
yes |
no |
SHIFT+BRK |
$00 |
no |
yes |
Example:
This example determines which control key was used and invokes
the associated routine.
B000 CD1E00 CALL $001E ;check break
B003 CAxxxx JP Z,BRK ;break condition
; ;SHIFT and BREAK used
B006 DA00B1 JP C,OTHER ;SHIFT or BREAK key used
B009 FE3F CP $3F ;BREAK key pressed?
B00B CAxxxx JP Z,BRK ;yes, break condition 2 allowed
B00E ; at this point no control key was pressed
B00E ; normal processing follows here.
; identify which key used, SHIFT or BREAK
B100 FE20 OTHER: CP $20 ;CTRL key?
B102 CAxxxx JP Z,CTRL ;yes, do CTRL procedure
B105 C3xxxx JP SHIFT ;no, do SHIFT procedure
Executing the subroutine $001E by a CALL $001E sets the zero
flag, the carry flag, and the accumulator register as necessary.
The zero flag is set only by pressing the SHIFT and BREAK keys,
so this condition is noticed by the command JP Z,BRK.
The carry flag is set by pressing the CTRL key or the SHIFT key,
further checks to determine which key was used follow by the routine
named OTHER. To this, the routine named OTHER is invoked by a
single command JP C,OTHER.
At least 2 conditions remain: using the BREAK key alone or using
no control key. CP $3F checks if the BREAK key was used alone
and the following command JP Z,BRK will be executed if this condition
is true.
The routines BRK, CTRL, and SHIFT are not shown, any coding may
follow.
|
Entrypoint |
$0021 |
Function |
write header info |
Symbolic name |
WRINF |
Protected registers |
all except AF |
Description
|
This subroutine writes the tape header on tape.
The tape header is located at $10F0. All information needed
must be written to the tape header prior to the execution of this
subroutine. For further information see the structure
of the tape header.
The user will be prompted to press the RECORD.PLAY button at the data recorder to start the tape if not already done.
Then the message "Writing filename" will be shown on the screen.
The carry flag is set on return to the caller if the break condition
did occur during the execution of this subroutine ( SHIFT+BRK
keys pressed ).
Please take a note of the description of the tape
data processing too.
Example:
B000 CD2100 CALL $0021 ;write tape header
B003 DAxxxx JP C,BREAK ;break condition occurred during write
10F0 01 20 51 44 52 4F 4D 0D . QDROM.
10F8 20 20 20 20 20 20 20 20
1100 20 20 00 08 00 E8 AD 00 ....ü.
1108 00 00 00 00 00 00 00 00 ........
1110 00 00 00 00 00 00 00 00 ........
1118 00 00 00 00 00 00 00 00 ........
1120 00 00 00 00 00 00 00 00 ........
1128 00 00 00 00 00 00 00 00 ........
1130 05 01 00 12 43 64 00 00 ....C...
1138 00 00 FF 00 00 06 00 00 ........
1140 00 06 01 00 05 00 00 EA ........
1148 10 00 00 00 00 00 00 00 ........
1150 00 00 00 00 00 00 00 00 ........
1158 00 00 00 00 00 00 00 00 ........
1160 00 00 00 00 00 00 00 00 ........
1168 00 00 00 00 00 00 00 00 ........
The complete information must be stored into the tape header
before invoking the routine by CALL $0021. You'll find the information
needed to construct the tape header here.
To write the data of a file to tape see the next subroutine $0024.
|
Entrypoint |
$0024 |
Function |
write data |
Symbolic name |
WRDAT |
Protected registers |
all except AF |
Description
|
This subroutine stores the data to be saved on the tape.
The carry flag is set on return to the caller if the break condition
did occur while executing this subroutine.
Please take a note of the description of the tape
data processing too.
Example:
B000 CD2100 CALL $0021 ;write tape header
B003 DAxxxx JP C,BREAK ;break condition occurred during write
B006 CD2400 CALL $0024 ;write file data to tape
B009 DAxxxx JP C,BREAK ;break condition occurred during write
B00C C3AD00 JP $00AD ;goback to monitor
Note, the tape header must be written to tape before writing
a file by CALL $0024. To this, see the subroutine $0021.
|
Entrypoint |
$0027 |
Function |
read header info |
Symbolic name |
RDINF |
Protected registers |
all except AF |
Description
|
This subroutine reads the next tape header found on tape and
copies it to the memory beginning at $10F0.
Click on the following link for further details about the structure
of the tape header.
The user will be prompted to press the PLAY button at the data recorder to start the tape if necessary.
The following conditions can occur on the return to the caller:
Contents of the
accumulator
register A |
Contents
of the
carry flag |
Meaning |
$00 |
0 |
normal end of process |
$01 |
1 |
read error on tape occurred |
$02 |
1 |
break condition |
Please take a note of the description of the tape
data processing too.
Example:
B000 CD2700 CALL $0027 ;read tape header
B003 B7 OR A ;set flags
B004 CAxxxx JP Z,OK ;header read without any problem
B007 3D DEC A ;A = A - 1
B008 CAxxxx JP Z,RDERROR ;A = 1 means error during read
B00B C3xxxx JP BREAK ;break condition occurred during read
Read the tape header prior to the data to get the information
needed about the file ( e.g. length of the file, target location
in the storage ).
|
Entrypoint |
$002A |
Function |
read data |
Symbolic name |
RDDAT |
Protected registers |
all except AF |
Description
|
This subroutine reads the next data file of a tape.
The file will be stored to the storage location as defined by
the tape header. To this, see the structure
of the tape header.
The possible conditions on return to the caller are the same
as previously defined at the subroutine $0027.
The tape header should be read prior to the execution of this
subroutine.
Please take a note of the description of the tape
data processing too.
Example:
B000 CD2A00 CALL $002A ;read file
B003 B7 OR A ;set flags
B004 CAxxxx JP Z,OK ;no error, no break
B007 3D DEC A ;A = A - 1
B008 CAxxxx JP Z,RDERROR ;A = 1 means error during read
B00B C3xxxx JP BREAK ;break condition occurred during read
Read the tape header prior to the data to get the information
needed about the file ( e.g. length of the file, target location
in the storage ).
|
Entrypoint |
$002D |
Function |
verify |
Symbolic name |
VERFY |
Protected registers |
all except AF |
Description
|
This subroutine verifies the data stored on tape and must immediately
subfollow a save process.
The possible conditions on return to the caller are the same
as previously defined at the subroutine $0027.
Please take a note of the description of the tape
data processing too.
Example:
B000 CD2D00 CALL $002D ;read file
B003 B7 OR A ;set flags
B004 CAxxxx JP Z,OK ;no error, no break
B007 3D DEC A ;A = A - 1
B008 CAxxxx JP Z,RDERROR ;A = 1 means verify error
B00B C3xxxx JP BREAK ;break condition occurred during read
If a verify error occurs the file must be resaved.
|
Entrypoint |
$0030 |
Function |
play melody |
Symbolic name |
MELDY |
Protected registers |
all except AF |
Description
|
This subroutine plays a melody defined by a character string
pointed to by DE.
The character string must be defined like the definitions of
the BASIC command MUSIC and must be terminated by $0D or $C8.
On return to the caller the carry flag is set to 0 normally.
If the execution of the melody subroutine is terminated by BREAK
then the carry flag is set at return to caller.
See the subroutine $0041 to play
the melody by a specified tempo.
Valid notes are C, D, E, F, G, A, B, and additional a preceding # to play
a seminote is valid, for example, #C, #D, #F, #G, and #A.
Code R to rest between notes. A numeric suffix from 0 to 9 is valid and specifies the time of the note /
rest to be played. See the following table:
Suffix
value |
Meaning
|
0
|
1 / 32 note |
1
|
1 / 16 note |
2
|
Dotted 1 / 16 note |
3
|
1 / 8 note |
4
|
Dotted 1 / 8 note |
5
|
1 / 4 note |
6
|
Dotted 1 / 4 note |
7
|
1 / 2 note |
8
|
Dotted 1 / 2 note |
9
|
Whole note |
A preceding - or + specifies the octave. Code - for the lower octave and + for the upper octave.
Nothing specified plays the normal / middle octave. $CF specifies the lower octave too. $D7 specifies the upper
octave too.
The volume can be controlled only by the volume control
( potentiometer ) at the reverse side of the MZ-700.
Try this example:
B000 1150B0 LD DE,$B050 ;address to string to be played
B003 CD3000 CALL $0030 ;execute music play
B006 C3AD00 JP $00AD ;return to monitor
and set the area starting from $B050 to the following values
by the "M"-command:
B050 2B 41 33 2B 23 46 31 2B +A3+#F1+
B058 41 2B 42 33 41 2B 44 2B A+B3A+D+
B060 23 46 31 41 2B 44 33 41 #F1A+D3A
B068 2B 44 2B 23 46 31 41 2B +D+#F1A+
B070 44 33 2B 23 46 31 41 2B D3+#F1A+
B078 44 2B 45 2B 23 46 2B 47 D+E+#F+G
B080 2B 41 33 52 0D +A3R.
Now execute the jump command JB000 and Beethoven's sonata D major
( opus 25 ) should be played, sure, not at all :-) The tempo can
be set by $0041.
Please refer to the description of the 8253 too ( how to play a melody ).
|
Entrypoint |
$0033 |
Function |
set time |
Symbolic name |
TIMST |
Protected registers |
all except AF |
Description
|
This subroutine sets and starts the internal clock.
On entrance the register DE must contain the time in seconds.
The maximum value accepted is $A8C0 or 43,200 seconds ( 12 hours
).
To indicate AM or PM set the accumulator register to a value
shown by the following table:
Contents of the
accumulator
register A |
Meaning
|
$00 |
AM |
$01 |
PM |
Please take a note of the description of the internal
clock too.
Example:
To set the time to 05:32:12 PM you have to compute this time
in seconds.
First set the accumulator to the PM value of $01.
Compute the hours: 5 x 60 minutes x 60 seconds result into 18,000
seconds. Now you have to compute the minutes. There are 32 minutes
x 60 seconds per minute result into 1,920 seconds. Add the remaining
12 seconds and the other two values: 18,000 + 1,920 +12 = 19,932
seconds. At last compute this decimal value into a hex value (
$4DDC ) and load DE with this value:
B000 3E01 LD A,$01 ;PM value to the accu
B002 11DC4D LD DE,$4DDC ;time value to DE (05:32:12)
B005 CD3300 CALL $0033 ;invoke time set subroutine
B008 C3AD00 JP $00AD ;goback to monitor
The clock is set now and works. If you have to convert other
values use my calculator written in Java ( activate JavaScript and Java
applets of your browser ).
|
Entrypoint |
$0038 |
Function |
interrupt routine |
Symbolic name |
none |
Protected registers |
all |
Description
|
This subroutine invokes the interrupt routine as pointed to by
the location $1038.
During the startup of the monitor this storage location was initiated
with $C38D03. The translated mnemonic to this is: JMP $038D. The
subroutine starting at $038D toggles the AM / PM value for the
internal clock and reinitiates the clock to 12:00h. The toggled
AM / PM-value is located at $119B.
Changing the address of the jump command at location $1038 enables
you to write your own interrupt routine located anywhere in the
memory. Set the timer to any value needed.
For example, you can write a program that will take effect to
any self programmed function key F1 - F10.
To this, the timer must be set to an acceptable value. This means,
if you store a low value into the timer the function key will
be processed quick but then there may be a high rate of interrupts
and by this your system processing time slows down.
If the rate of interrupts is reduced by a higher timer value
then it may be the time a function key will be noticed is too
slow. Tuning must be done to get an acceptable timer value between
system processing time and the time when a function key stroke
will be noticed. May be some time critical subroutines ( e.g.
write / read tape and so on ) may not function correct.
Please take a note of the description of the time
interrupt too.
|
Entrypoint |
$003B |
Function |
read time |
Symbolic name |
TIMRD |
Protected registers |
all except AF and DE |
Description
|
This subroutine reads the internal clock.
On exit the register DE contains the time in seconds. The maximum
value returned can be $A8C0 or 43,200 seconds ( 12 hours ).
The monitor subroutine indicates AM or PM by the accumulator
register A and to this it contains one of the values shown by
the following table:
Contents of the
accumulator
register A |
Meaning
|
$00 |
AM |
$01 |
PM |
Please take a note of the description of the internal
clock too.
Example:
The returned value contained in the register DE must be computed
from seconds into hours, minutes, and seconds. To this you can
use my calculator written in Java ( activate JavaScript and Java
applets of your browser ).
You can download an example ( 7KB ) that displays the current time. The clock counts from
00:00:00 to 23:59:59.
The ZIP-file to download contains the source code for this routine,
an assembler output listing, and an executable MZF-formatted file.
The source is completely documented by my comments for each instruction
sequence.
The clock will not be set by my program. Maybe, you'll program
an input routine that prompts the user for the time to be set
and that computes the time to seconds before setting the time
by a CALL $0033. ;) Then combine both programs and... don't forget
to post me your
result ;-)
|
Entrypoint |
$003E |
Function |
activate bell |
Symbolic name |
BELL |
Protected registers |
all except AF |
Description
|
Performing this subroutine a beep tone ( upper octave note A
1 / 32 note = +A0, 880 Hz ) will come over the loudspeaker.
Please take a note of the description of the sound
functions too.
Example:
B000 CD3E00 CALL $003E ;beep
B003 C3AD00 JP $00AD ;goback to monitor
No more instructions were needed.
|
Entrypoint |
$0041 |
Function |
set tempo |
Symbolic name |
XTEMP |
Protected registers |
all except AF |
Description
|
This subroutine sets the tempo ( speed ) to play music by the
subroutine $0030.
The accumulator register must be established by the appropriate
value:
Contents of the
accumulator
register A |
Meaning |
$01 |
slow ( Lento, Adagio ) |
$04 |
medium ( Moderato ) |
$07 |
quick ( Molto Allegro, Presto ) |
Please take a note of the description of the sound
functions too.
Example:
B000 3E07 LD A,$07 ;presto
B002 CD4100 CALL $0041 ;set tempo
B005 1150B0 LD DE,$B050 ;address to string to be played
B008 CD3000 CALL $0030 ;play melody
B00B C3AD00 JP $00AD ;goback to monitor
B050 2B 41 33 2B 23 46 31 2B +A3+#F1+
B058 41 2B 42 33 41 2B 44 2B A+B3A+D+
B060 23 46 31 41 2B 44 33 41 #F1A+D3A
B068 2B 44 2B 23 46 31 41 2B +D+#F1A+
B070 44 33 2B 23 46 31 41 2B D3+#F1A+
B078 44 2B 45 2B 23 46 2B 47 D+E+#F+G
B080 2B 41 33 52 0D +A3R.
Please take a kindly note of the description of the subroutine $0030 too.
|
Entrypoint |
$0044 |
Function |
start a continuous audible tone |
Symbolic name |
MSTA |
Protected registers |
BC and DE |
Description
|
This subroutine starts a continuos tone which is audible by the
loudspeaker.
The frequency of the tone is computed by:
f = 1108.8 kHz / nn'
nn' is a 2 bytes hex value to be stored into the storage
at locations $11A1 and $11A2. n is the high order byte and must be stored into location
$11A2 and n' is the low order byte and must be stored into
location $11A1.
The value of 1108.8 kHz = 1.1088 MHz ( kilo-Hertz, kilocycles;
Mega-Hertz, Mega cycles ) can vary by your MZ-700. I measured
a value of 1.108372 MHz of my MZ-731 with a frequency counter.
Note, your program must stop the tone by the following subroutine $0047 or by your own subroutine before your
program invokes the next tone otherwise an unpredictable frequency
value is invoked.
Please take a note of the description of the sound
functions too.
Example:
A continuos tone of 100 Hz is to invoke. For computations and
conversions use my calculator written in Java ( activate JavaScript and Java
applets of your browser ).
nn' = 1108.8 kHz / f ( f = 100 Hz )
nn' = 1108.8 * 103 Hz / 100 Hz = 11,088
11.088 is to convert into hex, that is $2B50 and this value is
to load into $11A1 / $11A2.
B000 21502B LD HL,$2B50 ;load counter value
B003 22A111 LD ($11A1),HL ;into memory
B006 CD4400 CALL $0044 ;start tone of 100 Hz
B009 C3AD00 JP $00AD ;goback to monitor
At this point a tone of 100 Hz is audible. To stop the tone use
the subroutine $0047.
|
Entrypoint |
$0047 |
Function |
stop audible tone |
Symbolic name |
MSTP |
Protected registers |
all except AF |
Description
|
This subroutine stops the tone started by $0044.
Please take a note of the description of the sound
functions too.
Example:
B000 CD4700 CALL $0047 ;stop the tone
B003 C3AD00 JP $00AD ;goback to monitor
At this point no tone is audible.
|
Entrypoint |
$004A |
Function |
start the monitor |
Symbolic name |
START |
Protected registers |
none |
Description
|
This is the entrypoint of the monitor.
Transferring control to this location takes the same effect like
executing the subroutine $0000. See the description of the subroutine $0000.
|
Entrypoint |
$00AD |
Function |
warm start of the monitor |
Symbolic name |
ST1 |
Protected registers |
none |
Description
|
This is the warm start address of the monitor.
If your own subroutine terminates and transfers back the control
to the monitor by a assembler JP $00AD command then you should
set the stack pointer to $10F0 prior to the termination of your
subroutine.
Example:
C530 31F010 LD SP,$10F0 ;set up stack pointer
C533 c3AD00 JP $00AD ;goback to monitor
The stack pointer is set to the top of its stack and then the
control is transferred to the warm start entry of the monitor.
|
Entrypoint |
$018F |
Function |
plot character |
Symbolic name |
LPRNT |
Protected registers |
DE and HL |
Description
|
This subroutine plots the ASCII-character contained in the accumulator
register A.
.Example:
B000 3E41 LD A,$41 ;char "A" to accu
B002 CD8F01 CALL $018F ;plot char
B005 C3AD00 JP $00AD ;goback to monitor
The letter "A" is loaded into the accu A and then
plotted by $018F.
|
Entrypoint |
$01A5 |
Function |
plot character string |
Symbolic name |
PMSG |
Protected registers |
all |
Description
|
This subroutine plots an ASCII character string which is stored
in the memory.
The register DE must point to the string on entry to $01A5.
The character string must be terminated by $0D.
Example:
B000 1124C1 LD DE,$C124 ;address to char string
B002 CDA501 CALL $01A5 ;plot char string
B005 C3AD00 JP $00AD ;goback to monitor
C124 41 42 43 44 0D xx xx xx ABCD.....
The address of the string ABCD is $C124 and loaded into DE.
Then the string is plotted by $01A5.
|
Entrypoint |
$01C7 |
Function |
play melody |
Symbolic name |
?MELDY |
Protected registers |
all except AF |
Description
|
This subroutine is referenced by the vector $0030.
Please follow the previous link for a detailed description.
|
Entrypoint |
$02A6 |
Function |
DE = DE + 4 |
Symbolic name |
.4DE |
Protected registers |
all except DE |
Description
|
This subroutine increments the register DE 4 times.
Example:
B000 CDA602 CALL $02A6 ;adds 4 to DE
No more instructions were needed. On return from $02A6 the register
DE is incremented four times, that means DE = DE + 4.
|
Entrypoint |
$02AB |
Function |
start the melody |
Symbolic name |
MLDST |
Protected registers |
BC and DE |
Description
|
This subprogram is referenced by the vector MSTA at $0044.
Please follow the previous link for a detailed description.
Please take a note of the description of the sound
functions too.
|
Entrypoint |
$02BE |
Function |
stop the melody |
Symbolic name |
MLDSP |
Protected registers |
all except AF |
Description
|
This subprogram is referenced by the vector MSTP at $0047.
Please follow the previous link for a detailed description.
Please take a note of the description of the sound
functions too.
|
Entrypoint |
$02C8 |
Function |
controls tempo and time periods |
Symbolic name |
RYTHM |
Protected registers |
C ( B is used ), DE |
Description
|
RYTHM is used to control the tempo a melody is to be played and
to control the time periods for a note / rest.
This routine is used by the routine MELDY / ?MLDY which plays a melody. Follow one
or both of the previous links for a detailed description.
Please take a note of the description of the sound
functions too.
|
Entrypoint |
$02E5 |
Function |
set tempo |
Symbolic name |
?TEMP |
Protected registers |
all except AF |
Description
|
?TEMP sets the tempo of a melody to be played.
This subprogram is referenced by the vector $0041 and is described in detail there.
Please take a note of the description of the sound
functions too.
|
Entrypoint |
$030B |
Function |
set time |
Symbolic name |
?TMST |
Protected registers |
all except AF |
Description
|
?TMST sets the time.
This subprogram is referenced by the vector $0033 and is described in detail there.
Please take a note of the description of the internal
clock too.
|
Entrypoint |
$0352 |
Function |
bell data |
Symbolic name |
?BELD |
Protected registers |
No machine instruction code. |
Description
|
This is a data area used by the BELL subroutine.
0352 D7 41 30 0D xx xx xx xx .A0.....
$D7 defines the upper octave for the note A ( $41 ) and the note
A will be played by a rest of 0 ( $30 ).
See the description of the BELL routine for more details.
|
Entrypoint |
$0358 |
Function |
read time |
Symbolic name |
?TMRD |
Protected registers |
all except AF, DE |
Description
|
?TMRD reads the internal clock.
This subprogram is referenced by the vector $003B and is described in detail there.
Please take a note of the description of the internal
clock too.
|
Entrypoint |
$038D |
Function |
time interrupt routine |
Symbolic name |
TIMIN |
Protected registers |
all |
Description
|
This subroutine invokes the interrupt routine as defined at the
location $1038. See the description of $0038 for more details.
Please take a note of the complete description of the time
interrupt too.
|
Entrypoint |
$03B1 |
Function |
display space and a byte converted
into 2 display characters. |
Symbolic name |
SPHEX |
Protected registers |
all except AF |
Description
|
This subroutine prints a space at the current cursor position.
Additional one byte pointed to by HL will be converted into its
2-digits hexadecimal display codes which are then displayed on
the screen.
This means, the upper four bits of the byte will be converted
first into a display character in the range from 0 to 9 ( display
code $20 - $29 ) and from A to F ( display code $01 - $06 ). The
result is put into the video RAM at the current cursor location
and by this it becomes visible. Next the lower four bits are converted
and displayed next ( same ranges, of course ).
You can use this routine to display any byte from the memory
in hexadecimal notation separated by a single space character.
Example:
B000 2135A0 LD HL,$A035 ;points to char
B003 CDB103 CALL $03B1 ;print space & char in hex
B006 C3AD00 JP $00AD ;goback to monitor
A035 A1 xx xx xx xx xx xx a.......
First, a space will be printed at the current cursor position.
Next, the byte at location $A035 will be displayed on the screen
in display code notation and split into 2 display codes, i.e.
"A1" is displayed. The display code is $01 $21 which
is put into the character part of the video RAM at the current
cursor position becomes visible as "A1" preceded by
a single space.
|
Entrypoint |
$03BA |
Function |
display contents of the register
HL in a 4-digits hex notation. |
Symbolic name |
PRTHL |
Protected registers |
all except AF |
Description
|
This subroutine displays the contents of HL in a 4-digit hexadecimal
notation.
To this the upper 4 bits of register H are converted into a displayable
hexadecimal digit in the range from 0 to 9 ( display code $20
- $29 ) or A to F ( display code $01 - $06 ). It will be put into
the character video RAM at the current cursor position and by
this it becomes visible.
Next, the lower four bits of register H will be converted and
displayed by the same procedure as described.
At last the contents of the register L will be displayed by the
same procedure as used for the register H.
On exit of this subroutine 4 characters in hexadecimal notation
are displayed on the screen which represent the contents of the
register HL in hexadecimal notation. The high order half of the
register HL, this is the register H, is displayed first and next
the register L.
You can use this routine to display the contents of the register
HL in hexadecimal notation. To get the contents of another register
or if you want to display an address located in the memories load
it into the register HL before executing this subroutine.
Example:
B000 2A35A0 LD HL,($A035) ;load memory contents of $A035
B003 CDB103 CALL $03BA ;print "35A1"
B006 C3AD00 JP $00AD ;goback to monitor
A035 A1 35 xx xx xx xx xx a!......
Two bytes from the location $A035 are split into 4 display codes
The display code is $23 $25 $01 $21 which is put into the video
RAM at the current cursor position and by this it becomes visible
as 35A1.
|
Entrypoint |
$03C3 |
Function |
display contents of the accumulator
register A in 2-digits hex notation.. |
Symbolic name |
PRTHX |
Protected registers |
all except AF |
Description
|
The contents of the register A will be converted into its 2-digits
hexadecimal display codes which are displayed on the screen.
This means, the upper four bits of register A will be converted
first and the result of the conversion is a display character
in the range from 0 to 9 ( display code $20 - $29 ) and from A
to F ( display code $01 - $06 ) which will be displayed. Next
the lower four bits are converted and displayed ( same ranges,
of course ).
You can use this subroutine to display the contents of the accumulator
register A in hexadecimal notation.
You can use this subroutine too to display the contents of any
byte located in the memory if you load it into the accumulator
register A prior to the execution of this subroutine.
If you load another register half into the accumulator register
A it will be displayed too as described above.
Example:
B000 7B LD A,E ;load register E into accumulator A
B001 CDB103 CALL $03C3 ;print contents of accu (same as register E)
B004 C3AD00 JP $00AD ;goback to monitor
The contents of register E is to display in 2-digits hexadecimal
notation. To this, first the contents of the register E is loaded
into the accumulator register A ( $B000 ). The contents of the
accumulator register A is split into 2 display codes. The display
codes will be put into the character part of the video RAM at
the current cursor position and by this it becomes visible ( all
done by the CALL $03B1 at $B001 ).
|
Entrypoint |
$03DA |
Function |
display contents of the 4 lower
bits of the accumulator register A in hex notation. |
Symbolic name |
ASC |
Protected registers |
all except AF |
Description
|
This subroutine converts the four lower bits of the accumulator
register A into its associated ASCII character.
The accumulator register contains this value on return to the
caller.
Example:
B000 3E0E LD A,$0E ;load char to convert
B002 CDDA03 CALL $03DA ;convert $0E to $45
B005 CD1200 CALL $0012 ;print ASCII "E" ($45)
B008 C3AD00 JP $00AD ;goback to monitor
The four lower bits of the accu ( 1110 of 0000 1110 ) are converted
to the ASCII-character $45 by the CALL $003DA and stored back
into the accu. By this the upper four bits of the accu are lost.
The following CALL $0012 will print the contents of the accu as
"E" at the current cursor position.
|
Entrypoint |
$03F9 |
Function |
puts the ASCII hex value contained
in the accu into the 4 lower bits of the accumulator register. |
Symbolic name |
HEX |
Protected registers |
all except AF |
Description
|
This subroutine converts an ASCII hexadecimal number contained
in the accu A into a 4-digit binary value. The result of the conversion
is stored back into the four lower bits of the accu A. The four
upper bits of the accu A are set to zero.
If the accu A contains a non-hex character on entry to $03F9
the carry flag is set. In this case no conversion can be done
and the returned value of the accu A is invalid.
Example:
B000 3E45 LD A,$45 ;load char to convert
B002 CDF903 CALL $03F9 ;convert $45 to $0E
B005 DAxxxx JP C,NOHEX ;no hex char in accu
B008 CDC303 CALL $03C3 ;print ASCII $30 $45 (ASCII 0E)
B00B C3AD00 JP $00AD ;goback to monitor
The ASCII-character $45 is converted into $E by the CALL $003F9
and stored back into the four lower bits of the accu A. The upper
four bits of the accu are set to zero. The following CALL $03C3
will print the contents of the accu as "0E" at the current
cursor position.
|
Entrypoint |
$0410 |
Function |
puts an 4-digits ASCII hex value
into HL. |
Symbolic name |
HLHEX |
Protected registers |
BC, DE |
Description
|
This subroutine stores 4 ASCII characters representing 4 hex
digits into HL.
On entry to this subroutine the register DE must point to the
memory location of the 4 ASCII characters. Valid ASCII characters
are 0 - 9 ( $30 - $39 ), and A - F ( $41 - $46 ), otherwise the
carry flag will be set on return to the caller.
Example:
B000 1120B0 LD DE,$B020 ;load address of string
B003 CD1004 CALL $0410 ;convert $41314539 to $A1E9
;and store to HL
B006 DAxxxx JP C,NOHEX ;invalid char found in string
B009 C3AD00 JP $00AD ;goback to monitor
B020 41 31 45 39 xx xx xx xx A1E9....
The ASCII string pointed to by DE will be converted into a 4-digits
hex value and this 16 bits binary value will be stored into HL.
The first 2 ASCII characters are converted and stored into H,
the last 2 ASCII characters are converted and stored into L.
|
Entrypoint |
$041F |
Function |
puts an 2-digits ASCII hex value
into the accu A. |
Symbolic name |
2HEX |
Protected registers |
all except AF |
Description
|
This subroutine stores two ASCII characters representing two
hex digits into the accu A.
On entry to this subroutine the register DE must point to the
memory location of the two ASCII characters. Valid ASCII characters
are 0 - 9 ( $30 - $39 ), and A - F ( $41 - $46 ), otherwise the
carry flag will be set on return to the caller.
Example:
B000 1120B0 LD DE,$B020 ;load address of string
B003 CD1F04 CALL $041F ;convert $4131 to $A1
;and store to accu
B006 DAxxxx JP C,NOHEX ;invalid char found in string
B009 C3AD00 JP $00AD ;goback to monitor
B020 41 31 xx xx xx xx xx xx A1......
The ASCII string pointed to by DE will be converted into a 2-digits
hex value and this 8 bits binary value will be stored into the
accu A. The first ASCII character is converted and stored into
the upper 4 bits, the last ASCII character is converted and stored
into the lower 4 bits.
|
Entrypoint |
$0577 |
Function |
activate bell. |
Symbolic name |
?BEL |
Protected registers |
all except AF |
Description
|
A beep tone ( upper octave note A 1 / 32 note = +A0, 880 Hz )
will come over the loudspeaker performing this subroutine.
This subroutine is referenced by the vector $003E.
Click on the previous link for more information.
Please take a note of the description of the sound
functions too.
|
Entrypoint |
$09B3 |
Function |
waits until a key is pressed. |
Symbolic name |
??KEY |
Protected registers |
all except AF |
Description
|
This subroutine waits until any key is pressed.
On return to caller the accumulator register contains the display
code of the key pressed. To see the display code for the control
keys click here.
Example:
B000 CDB309 CALL $09B3 ;wait on key
B003 CD4A09 CALL $094A ;print
B006 C300B0 JP $B000 ;loop until reset
CALL $09B§ waits on a key input and the next CALL to $094A
will print its associated value at the current cursor position.
Note, this example loops until hard reset.
|
Entrypoint |
$0BB9 |
Function |
ASCII code to display code conversion. |
Symbolic name |
?ADCN |
Protected registers |
all except AF |
Description
|
This subroutine translates the MZ-700 ASCII code to the display
code.
Put the ASCII code into the accumulator register and call this
subroutine. On return to the caller the accumulator register contains
the display code, but it will not be displayed by this.
Example:
B000 3E45 LD A,$45 ;load ASCII "E"
B002 CDB90B CALL $0BB9 ;convert to display code $05
B005 CD4A09 CALL $094A ;print
B008 C3AD00 JP $00AD ;goback to monitor
The ASCII character "E" will be converted into its
display code $01 by the instruction sequence $B000 - B002. The
next CALL $094A will display it on screen.
|
Entrypoint |
$0BCE |
Function |
ASCII code to display code conversion. |
Symbolic name |
?DACN |
Protected registers |
all except AF |
Description
|
This subroutine translates the display code to the MZ-700 ASCII
code
Put the display code into the accumulator register and call this
subroutine. On return to the caller the accumulator register contains
the ASCII code, but it will not be displayed by this.
Example:
B000 3E01 LD A,$01 ;load display code $01
B002 CDCE0B CALL $0BCE ;convert to ASCII code $41
B005 CD1200 CALL $0012 ;print
B008 C3AD00 JP $00AD ;goback to monitor
The display code $01 will be converted into its ASCII code $41
( character "A" ) by the instruction sequence $B000
- B002. The next CALL $094A will display it on screen.
|
Entrypoint |
$0DA6 |
Function |
wait on VBLK |
Symbolic name |
?BLNK |
Protected registers |
all |
Description
|
This subroutine waits on the start of a vertical blanking signal
( VBLK ). This will be when writing
of a new line of the screen begins.
This subroutine may be useful for programming an application
using joysticks.
Example:
B000 CDA60D CALL $0DA6 ;wait on VBLK
On return to the caller the signal VBLK is active.
|
Entrypoint |
$0FB1 |
Function |
puts address of cursor position
into HL |
Symbolic name |
?PONT |
Protected registers |
BC, DE |
Description
|
On return to the caller the register HL contains the address
of the current cursor position in the character RAM starting at
location $D000.
You can add $800 to HL to get the current color
information byte associated to this character.
Example:
B000 CDB10F CALL $0FB1 ;get address of cursor in char VRAM
B003 ; address of cursor now available in register HL.
; you can set bit 3 of register H to point to color VRAM
; by SET 3,H and back by RES 3,H
No more instructions were needed.
|
|