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]