Автор: Ian D. Turtle
Год: 1984
Издатели: Your Spectrum
Языки:
Английский
Формат:
TAP лента
Требования:
ZX Spectrum 48K
Ссылки:
Страница на ZXArt
Страница на World Of Spectrum
Страница на Spectrum Computing
Скриншоты:
Год: 1984
Издатели: Your Spectrum
Языки:
Формат:
Требования:
Ссылки:
Скриншоты:
Alarm Clock (Clock This) - Ian Turtle (Your Spectrum-Issue 2-Page 93)
Have you ever got so engrossed in your programming that the
hours just ticked by and you missed that important appointment?
Well, type in this program and one worry at least will
be over.
The Basic program which performs this amazing feat
includes two machine code routines as well as a self-
performing checksum, which should ensure that you type the
program in correctly . However,just to take all precautions,
it would be wise to SAVE the program once typed in, before
running it.
This done, now let's try it out. One of two things will
happen. At worst, it'll respond with an 'Error in data' message,
and list the DATA lines where the error occurs. You should
now check these lines, restore the program to good health,
SAVE the listing to tape and start over.
Should the program run correctly first time, you will be
greeted with an 'OK' message and prompted to input the time
(in hours and minutes) that you'd like the alarm to be set off.
That done, the computer NEWs itself. Don't panic at this
stage - the program has not crashed; it's merely waiting for
you to start the countdown.
To initiate the timer, simply type RANDOMIZE USR
65120, to which the response should be 'OK', indicating that
all is going according to plan. This instruction executes a
small machine code routine to set up the interrupt. When
your time is up, the program blanks the screen, turning it a
glorious shade of red. Again, nothing to panic about - just
press the Enter key and you'll find all the work you've been
doing is still in memory waiting to be SAVEd so it can be
continued at a later date.
Once the timer has been set, you are free to start your
programming - up until whenever the alarm is due to go off.
Basic programs will not affect the alarm, and most machine
code programs should also work (as long as they don't use
interrupts nor occupy addresses 65120 upwards).
Don't worry if at any time during your programming you
NEW the computer - you won't clear the Spectrum Alarm.
However, you will need to reset the interrupt by typing in
RANDOMIZE USR 65120 again. The timer will thus
begin where it left off. Also, PAUSEs, BEEPs, and all
LOADing and SAVEing operations, will cause the alarm to
stop. But once finished, the alarm automatically resets itself,
so you shouldn't lose too much time.
If you'd like a continuous on-screen printout of the time
remaining before the alarm goes off, type in this Basic one-
liner:
10 PRINT AT 0,0; PEEK 65532;":"; PEEK 65533;":"; PEEK 65534;" ": GO TO 10
Line 10 Lowers RAMTOP and restores data.
Lines 15-20 Print the on-screen message, and set the checksum and
data counters.
Lines 30-60 Read the machine code for the interrupt routine and POKE it
into memory. When all the interrupt machine code is
installed, check to see whether an error has occurred.
Lines 70-90 This area of the program carries out the same task as lines
30-60 for the alarm call machine code.
Lines 100-210 Set the alarm time, POKE it into memory and then NEWs
the computer.
Line 300 The machine code for the interrupt routine.
Lines 310-350 The machine code for the alarm call routine.
Here is a disassembled listing of the main service routine, which is
included in lines 310-350 of the Basic program.
The Alarm Call routine
Machine Code Assembler Comments
10 CLOCK RST 56 Performs the keyboard scan which
had been diverted.
20 DI Disable the interrupts, ie. ensure
this routine cannot be interrupted,
30 PUSH AF and save the only register used onto
the stack.
The addresses used are:
65532 - count of hours remaining.
65533 - count of minutes remaining
in the present hour.
65534 - count of seconds remaining
in the present minute.
65535 - count of 1/50 second remaining
in the present minute.
40 LD A,(65535) Check if the 1/50 of a second counter
50 CP 0 has gone down to zero.
60 JR Z,BMPSEC If so, jumps to line 100 onwards which
causes a decrement in seconds.
70 DEC A If not, simply decrements the 1/50 of
80 LD (65535),A a second counter and jumps to the
90 JR END returning part of the routine
(lines 430-450).
--------------------------------------------------------------------------------
100 BMPSEC LD A,49 Decrement the seconds counter and jump
110 LD (65535),A to the minutes decrementer (if required).
120 LD A,(65534)
130 CP 0
140 JR Z,BMPMIN
150 DEC A
160 LD (65534),A
170 JR END
--------------------------------------------------------------------------------
180 BMPMIN LD A,59 Decrement the minutes counter and jump
190 LD (65534),A to the hours decrementer (if required).
200 LD A,(65533)
210 CP 0
220 JR Z,BMPHOU
230 DEC A
240 LD (65533),A
250 JR END
--------------------------------------------------------------------------------
260 BMPHOU LD A,59 Decrement the hours counter. If this
270 LD (65533),A has already reached zero, it causes a
280 LD A,(65532) call to the alarm routine.
290 CP 0
300 JR Z,ALARM
310 DEC A
320 LD (65532),A
330 JR END
--------------------------------------------------------------------------------
340 ALARM LD A,2 Set the BORDER colour red.
350 CALL #229B
360 LD A,23 Set the attribute colours to PAPER 2:
370 LD (23693),A INK 7: FLASH 0: BRIGHT 0.
380 CALL #0D4D
390 CALL #0D6B A ROM call to effect a cleared screen.
400 LD A,62 Reset the interrupts to the previous
410 LD I,A mode.
420 IM 1
--------------------------------------------------------------------------------
430 END POP AF Restore the A register, re-enable the
440 EI interrupts and return.
450 RET
For those in the know, the data in line 300 of the Basic program generates a
short routine to set up the interrupts, its task being to make the computer
service the routine at address 65129. Here is the disassembled listing.
The Interrupt routine
10 LD A,9
20 LD I,A
30 IM 2
40 RET
------------------------------------------------------------------------------
letter from Your Spectrum #3 (May'84)
CLOCK THAT
Further to the Clock This program (issue 2), I have re-written the alarm
routine as, after much thought, I consider the whole screen turning red
to be unsatisfactory. Instead, the border still turns red and a two-toned
BEEP sounds for 20 seconds - a bit more like an alarm. (The new listing
is shown alongside.)
Ian Turtle, Loughborough
[This alternative version is included in ALARMCLK.TAP. JimG]
Have you ever got so engrossed in your programming that the
hours just ticked by and you missed that important appointment?
Well, type in this program and one worry at least will
be over.
The Basic program which performs this amazing feat
includes two machine code routines as well as a self-
performing checksum, which should ensure that you type the
program in correctly . However,just to take all precautions,
it would be wise to SAVE the program once typed in, before
running it.
This done, now let's try it out. One of two things will
happen. At worst, it'll respond with an 'Error in data' message,
and list the DATA lines where the error occurs. You should
now check these lines, restore the program to good health,
SAVE the listing to tape and start over.
Should the program run correctly first time, you will be
greeted with an 'OK' message and prompted to input the time
(in hours and minutes) that you'd like the alarm to be set off.
That done, the computer NEWs itself. Don't panic at this
stage - the program has not crashed; it's merely waiting for
you to start the countdown.
To initiate the timer, simply type RANDOMIZE USR
65120, to which the response should be 'OK', indicating that
all is going according to plan. This instruction executes a
small machine code routine to set up the interrupt. When
your time is up, the program blanks the screen, turning it a
glorious shade of red. Again, nothing to panic about - just
press the Enter key and you'll find all the work you've been
doing is still in memory waiting to be SAVEd so it can be
continued at a later date.
Once the timer has been set, you are free to start your
programming - up until whenever the alarm is due to go off.
Basic programs will not affect the alarm, and most machine
code programs should also work (as long as they don't use
interrupts nor occupy addresses 65120 upwards).
Don't worry if at any time during your programming you
NEW the computer - you won't clear the Spectrum Alarm.
However, you will need to reset the interrupt by typing in
RANDOMIZE USR 65120 again. The timer will thus
begin where it left off. Also, PAUSEs, BEEPs, and all
LOADing and SAVEing operations, will cause the alarm to
stop. But once finished, the alarm automatically resets itself,
so you shouldn't lose too much time.
If you'd like a continuous on-screen printout of the time
remaining before the alarm goes off, type in this Basic one-
liner:
10 PRINT AT 0,0; PEEK 65532;":"; PEEK 65533;":"; PEEK 65534;" ": GO TO 10
Line 10 Lowers RAMTOP and restores data.
Lines 15-20 Print the on-screen message, and set the checksum and
data counters.
Lines 30-60 Read the machine code for the interrupt routine and POKE it
into memory. When all the interrupt machine code is
installed, check to see whether an error has occurred.
Lines 70-90 This area of the program carries out the same task as lines
30-60 for the alarm call machine code.
Lines 100-210 Set the alarm time, POKE it into memory and then NEWs
the computer.
Line 300 The machine code for the interrupt routine.
Lines 310-350 The machine code for the alarm call routine.
Here is a disassembled listing of the main service routine, which is
included in lines 310-350 of the Basic program.
The Alarm Call routine
Machine Code Assembler Comments
10 CLOCK RST 56 Performs the keyboard scan which
had been diverted.
20 DI Disable the interrupts, ie. ensure
this routine cannot be interrupted,
30 PUSH AF and save the only register used onto
the stack.
The addresses used are:
65532 - count of hours remaining.
65533 - count of minutes remaining
in the present hour.
65534 - count of seconds remaining
in the present minute.
65535 - count of 1/50 second remaining
in the present minute.
40 LD A,(65535) Check if the 1/50 of a second counter
50 CP 0 has gone down to zero.
60 JR Z,BMPSEC If so, jumps to line 100 onwards which
causes a decrement in seconds.
70 DEC A If not, simply decrements the 1/50 of
80 LD (65535),A a second counter and jumps to the
90 JR END returning part of the routine
(lines 430-450).
--------------------------------------------------------------------------------
100 BMPSEC LD A,49 Decrement the seconds counter and jump
110 LD (65535),A to the minutes decrementer (if required).
120 LD A,(65534)
130 CP 0
140 JR Z,BMPMIN
150 DEC A
160 LD (65534),A
170 JR END
--------------------------------------------------------------------------------
180 BMPMIN LD A,59 Decrement the minutes counter and jump
190 LD (65534),A to the hours decrementer (if required).
200 LD A,(65533)
210 CP 0
220 JR Z,BMPHOU
230 DEC A
240 LD (65533),A
250 JR END
--------------------------------------------------------------------------------
260 BMPHOU LD A,59 Decrement the hours counter. If this
270 LD (65533),A has already reached zero, it causes a
280 LD A,(65532) call to the alarm routine.
290 CP 0
300 JR Z,ALARM
310 DEC A
320 LD (65532),A
330 JR END
--------------------------------------------------------------------------------
340 ALARM LD A,2 Set the BORDER colour red.
350 CALL #229B
360 LD A,23 Set the attribute colours to PAPER 2:
370 LD (23693),A INK 7: FLASH 0: BRIGHT 0.
380 CALL #0D4D
390 CALL #0D6B A ROM call to effect a cleared screen.
400 LD A,62 Reset the interrupts to the previous
410 LD I,A mode.
420 IM 1
--------------------------------------------------------------------------------
430 END POP AF Restore the A register, re-enable the
440 EI interrupts and return.
450 RET
For those in the know, the data in line 300 of the Basic program generates a
short routine to set up the interrupts, its task being to make the computer
service the routine at address 65129. Here is the disassembled listing.
The Interrupt routine
10 LD A,9
20 LD I,A
30 IM 2
40 RET
------------------------------------------------------------------------------
letter from Your Spectrum #3 (May'84)
CLOCK THAT
Further to the Clock This program (issue 2), I have re-written the alarm
routine as, after much thought, I consider the whole screen turning red
to be unsatisfactory. Instead, the border still turns red and a two-toned
BEEP sounds for 20 seconds - a bit more like an alarm. (The new listing
is shown alongside.)
Ian Turtle, Loughborough
[This alternative version is included in ALARMCLK.TAP. JimG]