Difference between revisions of "Thermostat listing file"
From Just in Time
(New page: Here is the code for thermostat.lst <pre> 1 ;======================================================================= 2 ;TITLE: <filetitl...) |
m (1 revision: copying content from old site) |
(No difference)
|
Latest revision as of 22:07, 12 July 2010
Here is the code for thermostat.lst
1 ;======================================================================= 2 ;TITLE: <filetitle.src> 3 ; 4 ;PURPOSE: <brief description of program's purpose and use> 5 ; <rest of brief description> 6 ; 7 ;AUTHOR: <name>, <company>. 8 ; 9 ;REVISIONS: 10 ; <mm/dd/yy> - <details of revision> 11 ; <more details of same revision> 12 ; 13 ;CONNECTIONS: 14 ; <I/O pin connections and purpose> 15 ; 16 ;DETAILS: 17 ; <very descriptive details about the purpose and operation of the 18 ; program, special options, modification notes, etc> 19 ;======================================================================= 20 21 22 ;-------------------------- DEVICE DIRECTIVES -------------------------- 23 24 07F8 0F7F DEVICE SX28,OSCHS1,TURBO 25 07F8 0F7F DEVICE STACKX, OPTIONX 26 27 =00000000 IRC_CAL IRC_SLOW 28 29 07FF 0B00 RESET Initialize 30 31 ;------------------------------ CONSTANTS ------------------------------ 32 ;SIMULATION EQU 1 33 =003D0900 Frequency EQU 4_000_000 ; clock frequency 34 =00002580 BaudRate EQU 9600 ; serial port baudrate 35 =00000003 InterruptsPerBit EQU 3 ; samples per serial bit 36 37 ; uncomment the following EQU if using a MAX232, since we need to 38 ; reverse the rs-232 signals while not using a MAX232 39 ;UsingMAX232 EQU 1 ; we're using a max232 40 41 ;------------------------------ --------- ------------------------------ 42 ; some derived constants (derived from the ones above) 43 ; These are not meant to be changed manually. 44 ; 45 ; clock ticks per interrupt 46 =0000008B InterruptPeriod EQU Frequency/(InterruptsPerBit * BaudRate) + 1 47 ; value to put in W to obtain the clock ticks per interrupt 48 ; formulated in this particular way to get rid of 'Literal 49 ; truncated to 8 bits' warning 50 =00000075 RetiwValue EQU 256-InterruptPeriod 51 52 53 =00000006 SerialOut EQU rb.0 ; 54 ;SerialIn EQU rb.0 ; input respectively. 55 56 ;------------------------------ VARIABLES ------------------------------ 57 =00000008 ORG $08 58 =00000008 spi_bank EQU $ 59 =00000008 spi_value DS 2 60 =0000000A spi_bit DS 1 61 62 =00000007.7 spi_clock EQU rc.7 63 =00000007.6 spi_cs EQU rc.6 64 =00000007.5 spi_so EQU rc.5 65 66 =00000010 ORG $10 67 =00000010 WAIT = $ 68 =00000010 cnt0 DS 1 69 =00000011 cnt1 DS 1 70 =00000012 cnt2 DS 1 71 =00000050 ORG $50 72 =00000050 SERIAL = $ ;UART bank 73 =00000050 tx_high ds 1 ;hi byte to transmit 74 =00000051 tx_low ds 1 ;low byte to transmit 75 =00000052 tx_count ds 1 ;number of bits sent 76 =00000053 tx_divide ds 1 ;xmit timing (/16) counter 77 =00000054 rx_count ds 1 ;number of bits received 78 =00000055 rx_divide ds 1 ;receive timing counter 79 =00000056 rx_byte ds 1 ;buffer for incoming byte 80 =00000057 flags ds 1 ;only contains the rx_flag 81 =00000057 rx_flag EQU flags.0 82 =00000058 string ds 1 ;used by send_string to store the address in memory 83 =00000059 byte ds 1 ;used by serial routines 84 85 ; These macros control whether our serial line is high-active 86 ; or low-active. 87 Rs232Up MACRO pin 88 IFDEF UsingMAX232 THEN 89 setb pin 90 ELSE 91 clrb pin 92 ENDIF 93 ENDM 94 95 Rs232Down MACRO pin 96 IFDEF UsingMAX232 THEN 97 clrb pin 98 ELSE 99 setb pin 100 ENDIF 101 ENDM 102 103 ; transfer the state of the rs232 input pin to the carry flag 104 Rs232PinToCarry MACRO pin 105 sb pin ;get current rx bit 106 IFDEF UsingMAX232 THEN 107 clc 108 ELSE 109 stc 110 ENDIF 111 snb pin ; 112 IFDEF UsingMAX232 THEN 113 stc 114 ELSE 115 clc 116 ENDIF 117 ENDM 118 119 120 ;---------------------------- DEBUG SETTINGS --------------------------- 121 122 =003D0900 FREQ Frequency 123 124 125 =0000000A WKED_W equ $0A ;Write MIWU/RB Interrupt edge setup, 0 = falling, 1 = rising 126 =0000000B WKEN_W equ $0B ;Write MIWU/RB Interrupt edge setup, 0 = enabled, 1 = disabled 127 =0000000C ST_W equ $0C ;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled 128 =0000000D LVL_W equ $0D ;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled 129 =0000000E PLP_W equ $0E ;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled 130 =0000000F DDIR_W equ $0F ;Write Port Direction 131 132 =000000FF RA_latch equ %11111111 ;SX18/20/28/48/52 port A latch init 133 =000000FF RA_DDIR equ %11111111 ;see under pin definitions for port A DDIR value 134 =00000000 RA_LVL equ %00000000 ;SX18/20/28/48/52 port A LVL value 135 =000000FF RA_PLP equ %11111111 ;SX18/20/28/48/52 port A PLP value 136 137 =00000000 RB_latch equ %00000000 ;SX18/20/28/48/52 port B latch init 138 =000000FE RB_DDIR equ %11111110 ;SX18/20/28/48/52 port B DDIR value 139 =000000FF RB_ST equ %11111111 ;SX18/20/28/48/52 port B ST value 140 =00000000 RB_LVL equ %00000000 ;SX18/20/28/48/52 port B LVL value 141 =000000FF RB_PLP equ %11111111 ;SX18/20/28/48/52 port B PLP value 142 143 =00000000 RC_latch equ %00000000 ;SX18/20/28/48/52 port C latch init 144 =0000003F RC_DDIR equ %00111111 ;SX18/20/28/48/52 port C DDIR value 145 =000000FF RC_ST equ %11111111 ;SX18/20/28/48/52 port C ST value 146 =00000020 RC_LVL equ %00100000 ;SX18/20/28/48/52 port C LVL value 147 =000000FF RC_PLP equ %11111111 ;SX18/20/28/48/52 port C PLP value 148 149 ;-------------------------- INTERRUPT ROUTINE -------------------------- 150 =00000000 ORG 0 151 152 =00000000 Interrupt 153 =00000000 SerialVP 154 0000 001A bank SERIAL ;switch to serial register bank 155 0001 02F3 :transmit decsz tx_divide ;only execute the transmit routine 156 0002 0A10 jmp EndInterrupt ; 157 0003 0C03 mov w,#InterruptsPerBit ; 158 0004 0033 mov tx_divide,w ; 159 0005 0232 test tx_count ;are we sending? 160 0006 0643 snz ; 161 0007 0A10 jmp EndInterrupt ; 162 0008 0503 stc ;yes, ready stop bit 163 0009 0330 rr tx_high ; and shift to next bit 164 000A 0331 rr tx_low ; 165 000B 00F2 dec tx_count ;decrement bit counter 166 000C 06D1 snb tx_low.6 ;output next bit 167 Rs232Up SerialOut ; 168 m IFDEF UsingMAX232 THEN 169 m setb SerialOut 170 m ELSE 171 000D 0406 m clrb SerialOut 172 m ENDIF 174 000E 07D1 sb tx_low.6 ; 175 Rs232Down SerialOut ; 176 m IFDEF UsingMAX232 THEN 177 m clrb SerialOut 178 m ELSE 179 000F 0506 m setb SerialOut 180 m ENDIF 182 0010 0C75 EndInterrupt mov w, #RetiwValue 183 0011 000F retiw 184 185 186 ;------------------------ INITIALIZATION ROUTINE ----------------------- 187 =00000100 org $0100 188 =00000100 Initialize 189 0100 005C mov m, #ST_W ;point MODE to write ST register 190 0101 0CFF mov !rb,#RB_ST ;Setup RB Schmitt Trigger, 0 = enabled, 1 = disabled 0102 0006 191 0103 0CFF mov !rc,#RC_ST ;Setup RC Schmitt Trigger, 0 = enabled, 1 = disabled 0104 0007 192 193 0105 005D mov m, #LVL_W ;point MODE to write LVL register 194 0106 0C00 mov !ra,#RA_LVL ;Setup RA CMOS or TTL levels, 0 = TTL, 1 = CMOS 0107 0005 195 0108 0C00 mov !rb,#RB_LVL ;Setup RB CMOS or TTL levels, 0 = TTL, 1 = CMOS 0109 0006 196 010A 0C20 mov !rc,#RC_LVL ;Setup RC CMOS or TTL levels, 0 = TTL, 1 = CMOS 010B 0007 197 198 010C 005E mov m, #PLP_W 199 010D 0CFF mov !ra,#RA_PLP ;Setup RA Weak Pull-up, 0 = enabled, 1 = disabled 010E 0005 200 010F 0CFF mov !rb,#RB_PLP ;Setup RB Weak Pull-up, 0 = enabled, 1 = disabled 0110 0006 201 0111 0CFF mov !rc,#RC_PLP ;Setup RC Weak Pull-up, 0 = enabled, 1 = disabled 0112 0007 202 203 0113 0CFF mov ra,#RA_latch ;Initialize RA data latch 0114 0025 204 0115 0C00 mov rb,#RB_latch ;Initialize RB data latch 0116 0026 205 0117 0C00 mov rc,#RC_latch ;Initialize RC data latch 0118 0027 206 207 0119 005F mov m, #DDIR_W ;point MODE to write DDIR register 208 011A 0CFF mov !ra,#RA_DDIR ;Setup RA Direction register, 0 = output, 1 = input 011B 0005 209 011C 0CFE mov !rb,#RB_DDIR ;Setup RB Direction register, 0 = output, 1 = input 011D 0006 210 011E 0C3F mov !rc,#RC_DDIR ;Setup RC Direction register, 0 = output, 1 = input 011F 0007 211 212 213 ; zero all ram (SX28) 214 0120 0064 clr fsr ;reset all ram banks 215 0121 0784 :zero_ram sb fsr.4 ;are we on low half of bank? 216 0122 0564 setb fsr.3 ;If so, don't touch regs 0-7 217 0123 0060 clr ind ;clear using indirect addressing 218 0124 03E4 incsz fsr ;repeat until done 219 0125 0B21 jmp :zero_ram 220 221 0126 001A bank SERIAL 222 0127 0C03 mov tx_divide, #InterruptsPerBit 0128 0033 223 0129 0C9F mov !option,#%10011111 ;enable rtcc interrupt 012A 0002 224 225 ;---------------------------- MAIN PROGRAM ----------------------------- 226 =0000012B BREAK MainLoop 227 =0000012B Main 228 IFNDEF SIMULATION 229 012B 0C00 mov w, #OpeningMessage // 256 230 012C 0012 call @send_string 012D 090A 231 ENDIF 232 =0000012E MainLoop 233 012E 0011 call @SpiRead 012F 0900 234 0130 0648 jb spi_value.2, :no_sensor 0131 0B49 235 236 0132 0403 clc 237 0133 0329 rr spi_value + 1 238 0134 0328 rr spi_value 239 0135 0403 clc 240 0136 0329 rr spi_value + 1 241 0137 0328 rr spi_value 242 0138 0403 clc 243 0139 0329 rr spi_value + 1 244 013A 0328 rr spi_value 245 013B 0403 clc 246 013C 0329 rr spi_value + 1 247 013D 0328 rr spi_value 248 013E 0403 clc 249 013F 0329 rr spi_value + 1 250 0140 0328 rr spi_value 251 252 IFDEF SIMULATION 253 mov spi_value, #23 254 mov spi_value + 1, #0 255 ENDIF 256 0141 0011 call @send_decimal 0142 0912 257 0143 0C46 mov w, #CRLF // 256 258 0144 0012 call @send_string 0145 090A 259 0146 0012 call @WaitASec 0147 0925 260 0148 0B2E jmp MainLoop 261 262 0149 0C3D :no_sensor mov w, #NoSensorMessage // 256 263 014A 0012 call @send_string 014B 090A 264 014C 0012 call @WaitASec 014D 0925 265 014E 0B2E jmp MainLoop 266 267 268 SpiDelay MACRO 269 ENDM 270 271 SpiClock MACRO clock_bit 272 setb clock_bit 273 nop 274 clrb clock_bit 275 nop 276 ENDM 277 278 SpiShift MACRO so_bit, register 279 sb so_bit 280 clc 281 snb so_bit 282 stc 283 rl register 284 rl register + 1 285 ENDM 286 287 =00000200 org $0200 288 =00000200 SpiRead 289 0200 0018 bank spi_bank 290 0201 04C7 clrb spi_cs ; lower ~CS, this will give us the first bit. 291 SpiDelay 293 0202 0C10 mov spi_bit, #16 ; reading 16 bits 0203 002A 294 =00000204 :bit_loop 295 SpiShift spi_so, spi_value ; read bit-value 296 0204 07A7 m sb spi_so 297 0205 0403 m clc 298 0206 06A7 m snb spi_so 299 0207 0503 m stc 300 0208 0368 m rl spi_value 301 0209 0369 m rl spi_value + 1 303 SpiClock spi_clock ; move to next bit 304 020A 05E7 m setb spi_clock 305 020B 0000 m nop 306 020C 04E7 m clrb spi_clock 307 020D 0000 m nop 309 SpiDelay 311 020E 02EA djnz spi_bit, :bit_loop ; do next bit 020F 0A04 312 0210 05C7 setb spi_cs ; set ~CS 313 0211 000D retp 314 315 =00000009 HI EQU spi_value + 1 316 =00000008 LO EQU spi_value 317 =0000000A temp EQU spi_bit 318 =00000212 send_decimal: 319 320 ; by Rich Leggitt with tweaks by Scott Dattalo and bugfix by Dmitry Kiryashov and Nikolai Golovchenko and Ted Inoue. 321 ; given 16 bit data in HI and LO, extract decimal digits 322 ; requires one Output register called temp, HI and LO are destroyed. 323 ; 42 instructions and less than 290 instructions executed 324 0212 006A clr temp 325 0213 0602 skip 326 0214 02AA sub10k inc temp 327 0215 0C10 mov W, #10000 & 255 328 0216 00A8 sub LO, W 329 330 ;Scott Dattalo says: 331 ;If you have a ram location that's known to be zero, then 332 ;the following [the IF] can be replaced with [the ELSE] 333 334 IFNDEF known_zero 335 0217 0C27 mov W, #10000 >> 8 336 0218 0703 sb C 337 0219 0C28 mov W, #(10000 >> 8)+1 338 ELSE 339 mov W, << known_zero 340 add W, #(1000 >> 8) + 1 341 ENDIF 342 021A 00A9 sub HI, W 343 021B 0603 jc sub10k ;11*7=77 inst in loop for 60900 (worst) 021C 0A14 344 021D 020A mov w, temp 345 021E 0012 call @send_digit 021F 0900 346 347 0220 0C0A mov W, #10 348 0221 002A mov temp, W 349 0222 00EA add1K dec temp 350 0223 0CE8 mov W, #1000 & 255 351 0224 01E8 add LO, W 352 353 ;Scott Dattalo says: 354 ;If you have a ram location that's known to be zero, then 355 ;the following [the IF] can be replaced with [the ELSE] 356 357 IFNDEF known_zero 358 0225 0C03 mov W, #1000 >> 8 359 0226 0603 snb C 360 0227 0C04 mov W, #(1000 >> 8)+1 361 ELSE 362 mov W, << known_zero 363 add W, #1000 > > 8 364 ENDIF 365 0228 01E9 add HI, W 366 0229 0703 jnc add1k ;10*10=100 inst in loop for 60900 022A 0A22 367 022B 020A mov w, temp 368 022C 0012 call @send_digit 022D 0900 369 370 371 ;Scott takes over here 372 022E 006A clr temp 373 022F 0C64 mov W, #100 374 0230 0702 skip 375 =00000231 sub100 376 0231 02AA inc temp 377 0232 00A8 sub LO, W 378 0233 0603 snb C 379 0234 0A31 jmp sub100 380 381 0235 00E9 dec HI 382 0236 07E9 sb HI.7 ;Check msb instead of carry for underflow. 383 0237 0A31 jmp sub100 ;4 inst per loop to 200 then 7 per loop to 900. 384 ;Total 64(?) in loop for worst case 385 386 ;at this point, HI = 0xff, and 0 <= LO <= 99 387 388 0238 020A mov w, temp 389 0239 0012 call @send_digit 023A 0900 390 391 023B 0C0A mov W, #10 392 023C 002A mov temp, W 393 023D 00EA add10 dec temp 394 023E 01E8 add LO, W 395 023F 0703 jnc add10 ;40 inst in loop for worst case. 0240 0A3D 396 0241 020A mov w, temp 397 0242 0012 call @send_digit 0243 0900 398 0244 0208 mov w, LO 399 0245 0012 call @send_digit 0246 0900 400 0247 000D retp 401 402 =00000400 ORG $400 403 ;***************************************************************************************** 404 ; UART Subroutines 405 ;***************************************************************************************** 406 407 ;********************************************************************************* 408 ; Function: send_byte 409 ; Send byte via serial port 410 ; INPUTS: 411 ; w - The byte to be sent via RS-232 412 ; OUTPUTS: 413 ; outputs the byte via RS-232 414 ;********************************************************************************* 415 0400 0D30 send_digit or w, #'0' 416 0401 001A send_byte bank SERIAL 417 418 0402 0232 :wait test tx_count ;wait for not busy 419 0403 0743 sz 420 0404 0A02 jmp :wait ; 421 422 0405 0030 mov tx_high,w ; store data byte 423 0406 04F1 clrb tx_low.7 ; set up start bit 424 0407 0C0A mov w,#10 ;1 start + 8 data + 1 stop bit 425 0408 0032 mov tx_count,w 426 0409 000D retp ;leave and fix page bits 427 428 ;********************************************************************************* 429 ; Function: send_string 430 ; Send string pointed to by address in W register 431 ; INPUTS: 432 ; w - The address of a null-terminated string in program 433 ; memory 434 ; OUTPUTS: 435 ; outputs the string via RS-232 436 ;********************************************************************************* 437 040A 001A send_string bank SERIAL 438 040B 0038 mov string,w ;store string address 439 040C 0218 :loop mov w,string ;read next string character 440 040D 0055 mov m,#(StringPage>>8) ;with indirect addressing 441 040E 0041 iread ;using the mode register 442 040F 0D00 test w ;are we at the last char? 443 0410 0643 snz ;if not=0, skip ahead 444 0411 0A15 jmp :exit ;yes, leave & fix page bits 445 0412 0901 call send_byte ;not 0, so send character 446 0413 02B8 inc string ;point to next character 447 0414 0A0C jmp :loop ;loop until done 448 0415 005F :exit mov m,#$0f ;reset the mode register 449 0416 000D retp 450 451 0417 001A send_word bank SERIAL 452 0418 0C10 mov spi_bit, #16 0419 002A 453 041A 0368 :bit_loop rl spi_value 454 041B 0369 rl spi_value + 1 455 041C 0C31 mov w, #'1' 456 041D 0703 sc 457 041E 0C30 mov w, #'0' 458 041F 0901 call send_byte 459 0420 02EA djnz spi_bit, :bit_loop 0421 0A1A 460 0422 0C0A mov w, #10 461 0423 0901 call send_byte 462 0424 000D retp 463 464 =00000425 WaitASec 465 IFNDEF SIMULATION 466 0425 0018 bank WAIT 467 0426 0070 clr cnt0 468 0427 0071 clr cnt1 469 0428 0C0A mov cnt2, #10 0429 0032 470 042A 02F0 :loop djnz cnt0, :loop 042B 0A2A 471 042C 02F1 djnz cnt1, :loop 042D 0A2A 472 042E 02F2 djnz cnt2, :loop 042F 0A2A 473 ENDIF 474 0430 000D retp 475 476 ;***************************************************************************************** 477 ; String constants 478 ;***************************************************************************************** 479 =00000500 org $500 480 =00000500 StringPage EQU $ 481 0500 0054 OpeningMessage DW 'Temperature Sensor', 13, 10, 'Copyright (c) 2006,2007 Danny Havenith', 13, 10, 0 0501 0065 006D 0070 0065 0505 0072 0061 0074 0075 0509 0072 0065 0020 0053 050D 0065 006E 0073 006F 0511 0072 000D 000A 0043 0515 006F 0070 0079 0072 0519 0069 0067 0068 0074 051D 0020 0028 0063 0029 0521 0020 0032 0030 0030 0525 0036 002C 0032 0030 0529 0030 0037 0020 0044 052D 0061 006E 006E 0079 0531 0020 0048 0061 0076 0535 0065 006E 0069 0074 0539 0068 000D 000A 0000 482 483 053D 004E NoSensorMessage DW 'No Sensor' 053E 006F 0020 0053 0065 0542 006E 0073 006F 0072 484 0546 000D CRLF DW 13, 10, 0 0547 000A 0000 485 486 Cross Reference 92 symbols Symbol Type Value Line __SASM DATA 00000001 0000 __SX_BREAK ADDR 0000012B 0226 __SX_FREQ DATA 003D0900 0122 __SX_IRC_CAL DATA 00000000 0027 __SX_RESET RESB 00000B00 0029 add10 ADDR 0000023D 0393 add1K ADDR 00000222 0349 BaudRate DATA 00002580 0034 byte MEMV 00000059 0083 C RESB 00000003 0336 cnt0 MEMV 00000010 0068 cnt1 MEMV 00000011 0069 cnt2 MEMV 00000012 0070 CRLF ADDR 00000546 0484 DDIR_W DATA 0000000F 0130 EndInterrupt ADDR 00000010 0182 flags MEMV 00000057 0080 Frequency DATA 003D0900 0033 fsr RESV 00000004 0214 HI DATA 00000009 0315 ind RESV 00000000 0217 Initialize ADDR 00000100 0188 Initialize:zero_ram ADDR 00000121 0215 Interrupt ADDR 00000000 0152 InterruptPeriod DATA 0000008B 0046 InterruptsPerBit DATA 00000003 0035 LO DATA 00000008 0316 LVL_W DATA 0000000D 0128 Main ADDR 0000012B 0227 MainLoop ADDR 0000012E 0232 MainLoop:no_sensor ADDR 00000149 0262 NoSensorMessage ADDR 0000053D 0483 OpeningMessage ADDR 00000500 0481 PLP_W DATA 0000000E 0129 ra RESV 00000005 0203 RA_DDIR DATA 000000FF 0133 RA_latch DATA 000000FF 0132 RA_LVL DATA 00000000 0134 RA_PLP DATA 000000FF 0135 rb RESV 00000006 0053 RB_DDIR DATA 000000FE 0138 RB_latch DATA 00000000 0137 RB_LVL DATA 00000000 0140 RB_PLP DATA 000000FF 0141 RB_ST DATA 000000FF 0139 rc RESV 00000007 0062 RC_DDIR DATA 0000003F 0144 RC_latch DATA 00000000 0143 RC_LVL DATA 00000020 0146 RC_PLP DATA 000000FF 0147 RC_ST DATA 000000FF 0145 RetiwValue DATA 00000075 0050 rx_byte MEMV 00000056 0079 rx_count MEMV 00000054 0077 rx_divide MEMV 00000055 0078 rx_flag DATA 00000057 0081 send_byte ADDR 00000401 0416 send_byte:wait ADDR 00000402 0418 send_decimal ADDR 00000212 0318 send_digit ADDR 00000400 0415 send_string ADDR 0000040A 0437 send_string:exit ADDR 00000415 0448 send_string:loop ADDR 0000040C 0439 send_word ADDR 00000417 0451 send_word:bit_loop ADDR 0000041A 0453 SERIAL VAR 00000050 0072 SerialOut DATA 00000006 0053 SerialVP ADDR 00000000 0153 SerialVP:transmit ADDR 00000001 0155 spi_bank DATA 00000008 0058 spi_bit MEMV 0000000A 0060 spi_clock DATA 00000007.7 0062 spi_cs DATA 00000007.6 0063 spi_so DATA 00000007.5 0064 spi_value MEMV 00000008 0059 SpiRead ADDR 00000200 0288 SpiRead:bit_loop ADDR 00000204 0294 ST_W DATA 0000000C 0127 string MEMV 00000058 0082 StringPage DATA 00000500 0480 sub100 ADDR 00000231 0375 sub10k ADDR 00000214 0326 temp DATA 0000000A 0317 tx_count MEMV 00000052 0075 tx_divide MEMV 00000053 0076 tx_high MEMV 00000050 0073 tx_low MEMV 00000051 0074 WAIT VAR 00000010 0067 WaitASec ADDR 00000425 0464 WaitASec:loop ADDR 0000042A 0470 WKED_W DATA 0000000A 0125 WKEN_W DATA 0000000B 0126