AVRASM ver. 1.30 SUPRCLK2.ASM Tue Mar 23 11:25:02 2010 ;=========================================================================== ; ; Super Accurate Clock using TCXO ; suprclk2.asm ; ; Date 19/12/02 ; Version 0.2 ; Target AT90S2313-10PC ; ; sjr mods 23/03/10 #1 ; ; Software (C) Copyright M. Greenman 2000. All rights of the owner reserved. ; No performance promises are made or implied, and no responsibility will be ; accepted for misuse or failure of software to perform. ; ; DESCRIPTION ; ; Uses a cell-phone TCXO, 9.600, 12.800, 14.85 MHz to provide a really accurate ; UTC clock. Can use any crystal n x 50 kHz, (actually any crystal n x 1 kHz), ; although baud rate might be a challenge, and has outputs from 1 kHz down. ; Initial version uses 12 MHz crystal. LCD display in 4 bit mode. ; ; Time is set via serial command interpreter, and reported every second. ; Has a 1 sec tick output for precise sync to time sigs. Other outputs ; used as timing references. What's available depends on the TCXO used. ; ; Uses ICP as TV sync input in order to send phase of local ref. ; ; Intended to operate in sleep for minimum current drain. Uses NiCd etc backup. ; ;* History: ;* 10/11/02 First cut ;* 25/11/02 Several mods. PORTB corrected for LCD routines corrupting I/O ;* 19/12/02 ":" removed before phase in RS232 msg. ;* "<" and ">" commands replace "L" ;* Power fail detection added (PD2) ;* 02/01/03 Chime on hour added - also chimes every min when pwr failed ; ;=========================================================================== ; .device AT90S2313 .include "2313DEF.INC" ;Processor specific definitions ;*************************************************************************** ;* A P P L I C A T I O N N O T E F O R T H E A V R F A M I L Y ;* ;* Number :AVR000 ;* File Name :"2313def.inc" ;* Title :Register/Bit Definitions for the AT90S2313 ;* Date :99.01.28 ;* Version :1.30 ;* Support telephone :+47 72 88 43 88 (ATMEL Norway) ;* Support fax :+47 72 88 43 99 (ATMEL Norway) ;* Support E-Mail :avr@atmel.com ;* Target MCU :AT90S2313 ;* ;* DESCRIPTION ;* When including this file in the assembly program file, all I/O register ;* names and I/O register bit names appearing in the data book can be used. ;* ;* The Register names are represented by their hexadecimal addresses. ;* ;* The Register Bit names are represented by their bit number (0-7). ;* ;* Please observe the difference in using the bit names with instructions ;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc" ;* (skip if bit in register set/cleared). The following example illustrates ;* this: ;* ;* in r16,PORTB ;read PORTB latch ;* sbr r16,(1<" (inc local time hrs offset) 0000c3 f0a9 breq LOCALINC 0000c4 335c cpi XFR, 0x3C ;"<" (dec local time hrs offset) 0000c5 f0a9 breq LOCALDEC 0000c6 3552 cpi XFR, 0x52 ;"R" (reset) 0000c7 f0a9 breq RESETSECS 0000c8 325b cpi XFR, 0x2B ;"+" 0000c9 f0c9 breq PLUS 0000ca 325d cpi XFR, 0x2D ;"-" 0000cb f0f1 breq MINUS 0000cc cfe9 rjmp UDONE ;nothing else valid HOURS: 0000cd d06b rcall SEND 0000ce d021 rcall GETDATA 0000cf 2e45 mov UTCHR, XFR 0000d0 cfe5 rjmp UDONE MINUTES: 0000d1 d067 rcall SEND 0000d2 d01d rcall GETDATA 0000d3 2e55 mov UTCMIN, XFR 0000d4 cfe1 rjmp UDONE SECONDS: 0000d5 d063 rcall SEND 0000d6 d019 rcall GETDATA 0000d7 2e65 mov UTCSEC, XFR 0000d8 cfdd rjmp UDONE LOCALINC: 0000d9 9433 inc OFFSET 0000da cfdb rjmp UDONE LOCALDEC: 0000db 943a dec OFFSET 0000dc cfd9 rjmp UDONE RESETSECS: 0000dd d05b rcall SEND 0000de 2733 clr TEMP 0000df e05a ldi XFR, 0x0A 0000e0 0e75 add MSECL, XFR 0000e1 1e83 adc MSECH, TEMP ;gets the carry 0000e2 cfd3 rjmp UDONE PLUS: 0000e3 2d56 mov XFR, UTCSEC 0000e4 3559 cpi XFR, 0x59 ;can't increment 0000e5 f281 breq UDONE 0000e6 9553 inc XFR 0000e7 d02c rcall FIXBCD 0000e8 2e65 mov UTCSEC, XFR ;zero secs 0000e9 cfcc rjmp UDONE MINUS: 0000ea 2755 clr XFR 0000eb 0d56 add XFR, UTCSEC ;can't decrement 0000ec f249 breq UDONE 0000ed 955a dec XFR ; rcall FIXBCD ;fixed next sec 0000ee 2e65 mov UTCSEC, XFR ;zero secs 0000ef cfc6 rjmp UDONE GETDATA: ;get rest of command - two char 0000f0 d00b rcall NEXTCHAR ; rcall SEND 0000f1 d00f rcall UNASCII ;data in low nibble 0000f2 f0d0 brcs ERROR1 0000f3 9552 swap XFR 0000f4 2eb5 mov CMD, XFR ;high nibble loaded 0000f5 d006 rcall NEXTCHAR ; rcall SEND 0000f6 d00a rcall UNASCII 0000f7 f0a8 brcs ERROR1 0000f8 2ab5 or CMD, XFR ;now packed BCD data 0000f9 2d5b mov XFR, CMD 0000fa d021 rcall SENDBOTH 0000fb 9508 ret NEXTCHAR: ;waits for and gets one character from UART 0000fc b13b in TEMP, USR ;wait for byte ready 0000fd 1f33 rol TEMP 0000fe f7e8 brcc NEXTCHAR 0000ff b15c in XFR, UDR ;get byte 000100 9508 ret UNASCII: ; Converts ASCII char in XFR to low nibble binary in XFR. Returns error as carry 000101 3350 cpi XFR, 0x30 ;control char 000102 f050 brcs WRONG 000103 775f andi XFR, 0x7F ;remove top bit 000104 3650 cpi XFR, 0x60 ;lower case 000105 f008 brcs UOK 000106 5250 subi XFR, 0x20 ;make Upper Case UOK: 000107 3450 cpi XFR, 0x40 ;letter? 000108 f010 brcs NUMBS 000109 5357 subi XFR, 0x37 00010a c001 rjmp UARTDONE NUMBS: 00010b 5350 subi XFR, 0x30 ;make binary 0-9 UARTDONE: 00010c 9488 clc ;no error WRONG: ERROR1: 00010d 9508 ret ;===================================================================================== ; SUBROUTINES EEPR: ; Arrive with pointer to EEPROM location in R0. Returns value in XFR, and R0 is ; post-incremented. Allows repeated reads without messing with pointer. Destroys TEMP. 00010e ba0e out EEAR, R0 00010f e031 ldi TEMP, 1 000110 bb3c out EECR, TEMP ;Read 000111 b35d in XFR, EEDR ;Get data 000112 9403 inc R0 000113 9508 ret FIXBCD: ;Arrive with byte in XFR. Correct BCD (i.e. if LSB > 9, add one to MSB and sub 10 from LSB) ;Return result in XFR. Routine should work if XFR is (correct BCD)+1 to 5. Destroys TEMP 000114 e03f ldi TEMP, 0x0F 000115 2335 and TEMP, XFR 000116 303a cpi TEMP, 0x0A 000117 f408 brcc FIXNEEDED ;greater than 9 - needs correction FIXDONE: 000118 9508 ret FIXNEEDED: 000119 e036 ldi TEMP, 0x06 00011a 0f53 add XFR, TEMP ;adds 1 to MSB and subtracts 10 from LSB 00011b cffc rjmp FIXDONE SENDBOTH: 00011c 9552 swap XFR 00011d d003 rcall ASCII 00011e 9552 swap XFR 00011f d001 rcall ASCII 000120 9508 ret ASCII: ; ASCII print @ serial port. Arrive with low nibble in XFR, return ; Arrive with binary in low nibble of XFR, return with XFR unchanged, ; and low nibble sent to UART as ASCII. To send both nibbles, SWAP and call again. 000121 935f push XFR ;so we don't destroy XFR 000122 705f cbr XFR, 0xF0 ;clear MSBs 000123 305a cpi XFR, 0x0A ;sets carry if XFR is smaller than 0x0A 000124 f010 brcs ASCII2 ;to do the numbers 000125 e337 ldi TEMP, 0x37 ;magic number for A - F 000126 c001 rjmp ASCII3 000127 e330 ASCII2: ldi TEMP, 0x30 ;magic number for 0 - 9 000128 0f53 ASCII3: add XFR, TEMP ;to make ASCII 000129 b13b ASCII4: in TEMP, USR ;get UART TX status 00012a 1f33 rol TEMP 00012b 1f33 rol TEMP 00012c 1f33 rol TEMP ;TX status in carry 00012d f7d8 brcc ASCII4 ;wait for TX ready 00012e b95c out UDR, XFR ;no waiting, no delay! 00012f 915f pop XFR ;restore the char 000130 9508 ret TOASCII: ; just converts lower nibble of XFR to ASCII 000131 705f cbr XFR, 0xF0 ;clear MSBs 000132 305a cpi XFR, 0x0A ;sets carry if XFR is smaller than 0x0A 000133 f010 brcs TOA2 ;to do the numbers 000134 e337 ldi TEMP, 0x37 ;magic number for A - F 000135 c001 rjmp TOA3 TOA2: 000136 e330 ldi TEMP, 0x30 ;magic number for 0 - 9 TOA3: 000137 0f53 add XFR, TEMP 000138 9508 ret SEND: ; Send Character ; This subr will send any (already ASCII) byte to the UART, so ; a control char (space or CR) can be sent 000139 9b5d sbis USR, UDRE 00013a cffe rjmp SEND 00013b b95c out UDR, XFR 00013c 9508 ret SENDTIME: 00013d 2d54 mov XFR, UTCHR 00013e dfdd rcall SENDBOTH 00013f e35a ldi XFR, 0x3A ;colon ":" 000140 dff8 rcall SEND 000141 2d55 mov XFR, UTCMIN 000142 dfd9 rcall SENDBOTH 000143 e35a ldi XFR, 0x3A ;colon ":" 000144 dff4 rcall SEND 000145 2d56 mov XFR, UTCSEC 000146 dfd5 rcall SENDBOTH 000147 e250 ldi XFR, 0x20 000148 dff0 rcall SEND 000149 9508 ret DISPTIME: ; LCD display of UTC time, top line ; Data is in UTCHR, UTCMIN, UTCSEC, packed BCD 00014a e052 ldi XFR, 0x02 00014b d0dd rcall CURSOR 00014c 2d54 mov XFR, UTCHR 00014d d04b rcall PRINTB 00014e e35a ldi XFR, 0x3A ;colon ":" 00014f d0b2 rcall DATA_LCD 000150 2d55 mov XFR, UTCMIN 000151 d047 rcall PRINTB 000152 e35a ldi XFR, 0x3A ;colon ":" 000153 d0ae rcall DATA_LCD 000154 2d56 mov XFR, UTCSEC 000155 d043 rcall PRINTB 000156 e250 ldi XFR, 0x20 ;" UTC" 000157 d0aa rcall DATA_LCD 000158 e555 ldi XFR, 0x55 000159 d0a8 rcall DATA_LCD 00015a e554 ldi XFR, 0x54 00015b d0a6 rcall DATA_LCD 00015c e453 ldi XFR, 0x43 00015d d0a4 rcall DATA_LCD 00015e 9508 ret DISPLOCAL: ; LCD display of LOCAL time, lower line ; Data is in UTCHR, UTCMIN, UTCSEC, packed BCD 00015f e452 ldi XFR, 0x42 000160 d0c8 rcall CURSOR 000161 2d54 mov XFR, UTCHR 000162 0d53 add XFR, OFFSET 000163 dfb0 rcall FIXBCD 000164 3254 cpi XFR, 0x24 000165 f020 brcs L2 000166 ed3c ldi TEMP, 0xDC ;"-24" in packed BCD 000167 0f53 add XFR, TEMP ;add -24 and ignore carry 000168 f00d brhs L2 000169 5056 subi XFR, 0x06 ;fix for no half carry L2: 00016a dfa9 rcall FIXBCD 00016b 3152 cpi XFR, 0x12 00016c f070 brcs L3 ;time is PM 00016d ee3e ldi TEMP, 0xEE ;"-12" in packed BCD 00016e 0f53 add XFR, TEMP ;add -12 and ignore carry 00016f f00d brhs L2A 000170 5056 subi XFR, 0x06 ;fix for no half carry L2A: 000171 d027 rcall PRINTB 000172 e35a ldi XFR, 0x3A ;colon ":" 000173 d08e rcall DATA_LCD 000174 2d55 mov XFR, UTCMIN 000175 d023 rcall PRINTB 000176 e250 ldi XFR, 0x20 ;" pm" 000177 d08a rcall DATA_LCD 000178 e750 ldi XFR, 0x70 000179 d088 rcall DATA_LCD 00017a c009 rjmp L4 L3: ;time is AM 00017b d01d rcall PRINTB 00017c e35a ldi XFR, 0x3A ;colon ":" 00017d d084 rcall DATA_LCD 00017e 2d55 mov XFR, UTCMIN 00017f d019 rcall PRINTB 000180 e250 ldi XFR, 0x20 ;" am" 000181 d080 rcall DATA_LCD 000182 e651 ldi XFR, 0x61 000183 d07e rcall DATA_LCD L4: 000184 e65d ldi XFR, 0x6d 000185 d07c rcall DATA_LCD 000186 e250 ldi XFR, 0x20 ;" -" was " +" 0x20,0x2B 000187 d07a rcall DATA_LCD 000188 e25d ldi XFR, 0x2D 000189 d078 rcall DATA_LCD 00018a 2d53 mov XFR, OFFSET 00018b d00d rcall PRINTB 00018c 9508 ret SENDPHASE: ; HEX-ASCII reference phase to UART ; Data is in PHASEH, PHASEL, binary 00018d 2f5a mov XFR, PHASEH 00018e df8d rcall SENDBOTH 00018f 2f5b mov XFR, PHASEL 000190 df8b rcall SENDBOTH 000191 9508 ret DISPPHASE: ; LCD display of reference phase, bottom line ; Data is in PHASEH, PHASEL, binary ; changed cursor from 0x12 to 0x10 000192 e150 ldi XFR, 0x10 000193 d095 rcall CURSOR 000194 2f5a mov XFR, PHASEH 000195 d003 rcall PRINTB 000196 2f5b mov XFR, PHASEL 000197 d001 rcall PRINTB 000198 9508 ret PRINTB: ;prints both nibbles, high first 000199 9552 swap XFR 00019a d003 rcall PRINTNIB 00019b 9552 swap XFR 00019c d001 rcall PRINTNIB 00019d 9508 ret PRINTNIB: ; Prints lower nibble on LCD. Data arrives in lower nibble of XFR. Cursor ; must be already in the right place. Like ASCII, it restores XFR, and to ; send both nibbles, swap, send one, swap and send again. 00019e 935f push XFR 00019f 705f andi XFR, 0x0F ;Only lower nibble 0001a0 df90 rcall TOASCII ;XFR conv to ASCII 0001a1 d060 rcall DATA_LCD 0001a2 915f pop XFR 0001a3 9508 ret STUFF: ; debug subr for use in timer 0001a4 935f push XFR 0001a5 9563 inc DEBUG ;next register to report 0001a6 716f andi DEBUG, 0x1F ;only 0 - 31, and sets Z if zero 0001a7 f421 brne STUFF2 ;not zero 0001a8 e05d ldi XFR, 0x0D ;CR at end of line 0001a9 df8f rcall SEND 0001aa e05a ldi XFR, 0x0A ;LF at end of line 0001ab df8d rcall SEND 0001ac 27ff STUFF2: clr ZHI ;pointer 0001ad 2fe6 mov ZLO, DEBUG ;to register to report 0001ae 8150 ld XFR, Z ;in turn, get registers 0 - 15 (visible as RAM) 0001af 935f push XFR 0001b0 9552 swap XFR ;high nibble 0001b1 df6f rcall ASCII ;send it as ASCII 0001b2 915f pop XFR 0001b3 df6d rcall ASCII ;and send low nibble 0001b4 e250 ldi XFR, 0x20 ;space char 0001b5 df83 rcall SEND 0001b6 915f pop XFR 0001b7 9508 ret ;===================================================================================== ; LCD SUBROUTINES LCDSET: ; sets up display 0001b8 ef3a ldi TEMP, 250 ; Wait at least 15msec after powerup SET1: 0001b9 d02a rcall WAITN ; to display 0001ba 953a dec TEMP 0001bb f7e9 brne SET1 0001bc e338 ldi TEMP, system_set 0001bd 9532 swap TEMP 0001be bb38 out PORTB, TEMP 0001bf 9894 cbi PORTD, 4 ;Back to CMD mode 0001c0 9a95 sbi PORTD, 5 0001c1 0000 nop 0001c2 0000 nop ; Data write cycle must be >1 ms 0001c3 9895 cbi PORTD, 5 ; OE low to clock in data 0001c4 d022 rcall WAIT2 ; Wait 4 msec 0001c5 d021 rcall WAIT2 0001c6 e338 ldi TEMP, system_set ; And again 0001c7 9532 swap TEMP 0001c8 bb38 out PORTB, TEMP 0001c9 9894 cbi PORTD, 4 ;Back to CMD mode 0001ca 9a95 sbi PORTD, 5 0001cb 0000 nop 0001cc 0000 nop 0001cd 9895 cbi PORTD, 5 0001ce d018 rcall WAIT2 ; wait at least 100usec 0001cf e338 ldi TEMP, system_set ; 3rd time 0001d0 9532 swap TEMP 0001d1 bb38 out PORTB, TEMP 0001d2 9894 cbi PORTD, 4 ;Back to CMD mode 0001d3 9a95 sbi PORTD, 5 0001d4 0000 nop 0001d5 0000 nop 0001d6 9895 cbi PORTD, 5 0001d7 d00f rcall WAIT2 ; Wait at least 40usec (2 msec) 0001d8 e258 ldi XFR, function_set ; 4 bit mode, 2 lines 5X7 pixels 0001d9 d056 rcall CMD_LCD ; Write to display 0001da e054 ldi XFR, display_off ; Display off, cursor off and blink off 0001db d054 rcall CMD_LCD 0001dc e051 ldi XFR, display_clear 0001dd d052 rcall CMD_LCD 0001de d008 rcall WAIT2 ; Must wait 1.6 msec after clear 0001df e056 ldi XFR, entry_mode_set ; Increment RAM, dont shift display 0001e0 d04f rcall CMD_LCD 0001e1 e05c ldi XFR, display_on ; Display on, cursor/blink off 0001e2 d04d rcall CMD_LCD 0001e3 9508 ret WAITN: ; delay defined by val in TEMP 0001e4 933f push TEMP 0001e5 2f83 mov DELAY1, TEMP 0001e6 c003 rjmp W2_1 WAIT2: ; 2ms delay with 4/8/12/16 MHz clock 0001e7 933f push TEMP ; ldi TEMP, 0x0B ; ldi TEMP, 0x16 ;8 MHz 0001e8 e232 ldi TEMP, 0x22 ;12 MHz 0001e9 2f83 mov DELAY1, TEMP W2_1: 0001ea 2799 clr DELAY2 0001eb 959a dec DELAY2 ;start at 0xFF 0001ec 959a W2_2: dec DELAY2 0001ed f7f1 brne W2_2 0001ee 958a dec DELAY1 0001ef f7d1 brne W2_1 0001f0 913f pop TEMP 0001f1 9508 ret LCDBLURB: ; sign-op message 0001f2 e0f4 ldi ZHI, HIGH(2*TXT) 0001f3 e9ee ldi ZLO, LOW(2*TXT) 0001f4 95c8 L3A: lpm ;from prog mem into R0 0001f5 2d50 mov XFR, R0 0001f6 2355 tst XFR 0001f7 f409 brne L3B 0001f8 c008 rjmp L4A 0001f9 305d L3B: cpi XFR, 0x0D ;Look for CR in message (new line) 0001fa f419 brne L3C 0001fb ec50 ldi XFR, 0xC0 ;Cursor to position 0x40, start of 2nd line 0001fc d033 rcall CMD_LCD ;Sends command 0001fd c001 rjmp L3D 0001fe d003 L3C: rcall DATA_LCD 0001ff 9631 L3D: adiw ZLO, 1 ;Increment pointer. This neat instruction does 000200 cff3 rjmp L3A ;16 bit addition to pointer ZHI:ZLO. L4A: 000201 9508 ret ;All done now DATA_LCD: ; displays char as two byte ASCII on display 000202 935f push XFR 000203 933f push TEMP 000204 934f push TEMP2 000205 b348 in TEMP2, PORTB 000206 7f40 andi TEMP2, 0xF0 ;only the output pins 000207 2f35 mov TEMP, XFR 000208 7f50 andi XFR, 0xF0 ;Mask off lower 4 bits 000209 9552 swap XFR 00020a 2b54 or XFR, TEMP2 ;add the port bits to the LCD stuff 00020b bb58 out PORTB, XFR ;Write upper 4 bits to display 00020c 9a95 sbi PORTD, 5 ;OE bit high 00020d 9a94 sbi PORTD, 4 ;Data/command bit high 00020e 0000 nop ;Brief delay 00020f 0000 nop 000210 0000 nop 000211 0000 nop 000212 0000 nop 000213 9895 cbi PORTD, 5 ;OE low to clock data 000214 9894 cbi PORTD, 4 ;Back to default 000215 703f andi TEMP, 0x0F ;Masked off 000216 2b34 or TEMP, TEMP2 ;add the port bits to the LCD stuff 000217 bb38 out PORTB, TEMP ;Lower 4 bits to LCD 000218 9a95 sbi PORTD, 5 ;OE bit high 000219 9a94 sbi PORTD, 4 ;Data/command bit high 00021a 0000 nop 00021b 0000 nop 00021c 0000 nop 00021d 0000 nop 00021e 0000 nop 00021f 9895 cbi PORTD, 5 ;OE low to clock data 000220 9894 cbi PORTD, 4 ;Back to default ; ldi TEMP, 100 ; ldi TEMP, 200 ;8 MHz 000221 ef3f ldi TEMP, 255 ;12 MHz 000222 2f73 mov DELAY, TEMP ;50 usec DEL1: 000223 957a dec DELAY 000224 f7f1 brne DEL1 000225 914f pop TEMP2 000226 913f pop TEMP 000227 915f pop XFR 000228 9508 ret CURSOR: ; Moves the LCD display cursor 000229 6850 ori XFR, 0x80 ;Set MSB for address command 00022a d005 rcall CMD_LCD 00022b 9508 ret CLEAR: ; Clears the LCD display and restores the cursor to start - destroys XFR 00022c e051 ldi XFR, display_clear 00022d d002 rcall CMD_LCD 00022e dfb8 rcall WAIT2 00022f 9508 ret CMD_LCD: ; Low level command sends control info to display 000230 935f push XFR 000231 933f push TEMP 000232 934f push TEMP2 000233 2f35 mov TEMP, XFR 000234 7f50 andi XFR, 0xF0 ;Mask off lower 4 bits 000235 9552 swap XFR 000236 b348 in TEMP2, PORTB 000237 7f40 andi TEMP2, 0xF0 ;only the output pins 000238 2b54 or XFR, TEMP2 ;add the port bits to the LCD stuff 000239 bb58 out PORTB, XFR ;Send upper 4 bits to display (on lower 4 bits) 00023a 9894 cbi PORTD, 4 ;Back to CMD mode 00023b 9a95 sbi PORTD, 5 00023c 0000 nop ;Brief delay to give reasonable OE 00023d 0000 nop ;pulse width 00023e 9895 cbi PORTD,5 ;OE goes low to clock in data 00023f 2f53 mov XFR, TEMP ;Get data back 000240 705f andi XFR, 0x0F ;Lower 4 000241 2b54 or XFR, TEMP2 ;add the port bits to the LCD stuff 000242 bb58 out PORTB, XFR ;Write lower 4 bits to LCD 000243 9894 cbi PORTD, 4 ;Back to CMD mode 000244 9a95 sbi PORTD, 5 000245 0000 nop 000246 0000 nop 000247 9895 cbi PORTD,5 ;OE clock low ; ldi XFR, 100 ; ldi XFR, 200 ;8 MHz 000248 ef5f ldi XFR, 255 ;12 MHz ; ldi XFR, 100 ;50 usec approx DEL0: 000249 955a dec XFR 00024a f7f1 brne DEL0 00024b 914f pop TEMP2 00024c 913f pop TEMP 00024d 915f pop XFR 00024e 9508 ret TXT: .DB "*UTC SUPERCLOCK* ",0x0D 00024f 552a 000250 4354 000251 5320 000252 5055 000253 5245 000254 4c43 000255 434f 000256 2a4b 000257 0d20 .DB "(C) M. Greenman.",0x00 000258 4328 000259 2029 00025a 2e4d 00025b 4720 00025c 6572 00025d 6e65 00025e 616d 00025f 2e6e 000260 0000 Assembly complete with no errors.