Tue Jan 12 1993 15:50 Page 1 2500 A.D. 8748 Macro Assembler - Version 4.03a ------------------------------------------------ Input Filename : clock.asm Output Filename : clock.obj 1 ;****************** 2 ;Kentucky Department for the Blind 3 ;427 Versailles Road 4 ;Frankfort, Ky 40601 5 ;502-573-4754 6 7 ;Wayne D. Thompson, P.E. 8 ;February 25, 1992 9 10 ;This software is for the braille digital clock/calendar 11 ;designed by the Kentucky Department for the Blind. 12 13 ;File -- \drawing\brlclock\clock.asm 14 ;Version 1.0 -- 12-2-92 15 16 ;Basic operation -- The 8749 single chip microcomputer is 17 ;interrupted once each second by the Dallas DS1287 Real Time 18 ;Clock chip. During each interrupt this program reads the 19 ;time and updates the Tiflotel 500/N6/PZ 6-cell piezoelectric 20 ;braille display. Also, the program checks for alarm condition 21 ;and constantly monitors the user switches for mode changes and 22 ;other user commands. 23 24 ;NOTE: All code related to the stopwatch feature is for 25 ;possible future implementation and is currently incomplete. 26 27 pl 59 ;(set page length for list file) 28 29 30 ;****************** 31 ;8749 register assignments 32 33 ;register bank 0 34 ;R7 -- general purpose use 35 ;R6 -- general purpose use 36 ;R5 -- general purpose use 37 ;R4 -- general purpose use 38 ;R3 -- general purpose use 39 ;R2 -- general purpose use 40 ;R1 -- RAM pointer 41 ;R0 -- RAM pointer 42 43 ;register bank 1 (used only during interrupts) 44 ;R7 -- general purpose use Tue Jan 12 1993 15:50 Page 2 45 ;R6 -- 46 ;R5 -- 47 ;R4 -- 48 ;R3 -- 49 ;R2 -- save accum here on interrupt 50 ;R1 -- RAM pointer to clock chip register copies 51 ;R0 -- RAM pointer to clock chip registers 52 53 ;****************** 54 ;8749 RAM data upper memory map (32 bytes, volatile) 55 56 0020 BRLDAT equ 20h ;1st of 6 bytes of data for braille 57 ;display, cells 1 thru 6 58 0026 CMODE equ 26h ;current Mode 59 ;(one high bit indicates selection) 60 ;bit 0 = View Mode 61 ;bit 1 = Set Mode 62 0027 CFUNCTION equ 27h ;current Function 63 ;(one high bit indicates selection) 64 ;bit 0 = Time Function 65 ;bit 1 = Alarm Function 66 ;bit 2 = Date Function 67 ;bit 3 = Stopwatch Function (not 68 ; implemented) 69 0028 CSELECT equ 28h ;current cell or item to "Set" 70 ;(one high bit indicates selection) 71 ;bit 0 thru 5 = cells 1 thru 6 72 ;bit 6 = am/pm 73 ; (or stopwatch count up/down) 74 ;bit 7 = alarm enabled/disabled 75 ; (or stopwatch auto retime on/off) 76 ;no high bits = weekday 77 0029 SWHOUR equ 29h ;stopwatch hour value (BCD 0-99) 78 0030 SWMIN equ 30h ;stopwatch minute value (BCD 0-59) 79 0031 SWSEC equ 31h ;stopwatch second value (BCD 0-59) 80 81 82 83 ;****************** 84 ;8749 I/O port assignments 85 86 ;P10 -- output to Tiflotel's "data in" input 87 ;P11 -- output to Tiflotel's "clock" input 88 ;P12 -- output to Tiflotel's "strobe" input 89 ;P13 -- spare 90 ;P14 -- spare 91 ;P15 -- spare 92 ;P16 -- spare 93 ;P17 -- spare 94 95 ;P20 -- output to audio indicator for alarm (0=alarm sounding) 96 ;P21 -- spare 97 ;P22 -- spare 98 ;P23 -- spare Tue Jan 12 1993 15:50 Page 3 99 100 ;Lines P24-P27 are inputs from user pushbuttons and are 101 ;coded 0=pressed, 1=not pressed. 102 ;P24 -- CHANGE switch (increments thru values; reset stopwatch) 103 ;P26 -- SELECT switch (toggles hours/min/sec or 104 ; month/day/year; am/pm; alarm on/off) 105 ;P26 -- FUNCTION switch (toggles time/alarm/date/stopswatch) 106 ;P27 -- MODE switch (toggles view/set) 107 108 ;T0 -- spare 109 ;T1 -- spare 110 111 ;****************** 112 ;DS1287 Clock Chip memory map (64 bytes total, non-volatile) 113 114 ;these first 14 location 0-0dh are pre-assigned by Dallas 115 0000 SEC_ equ 00h ;seconds (BCD 00-59) 116 0001 SECA_ equ 01h ;seconds alarm (BCD 00-59) 117 0002 MIN_ equ 02h ;minutes (BCD 00-59) 118 0003 MINA_ equ 03h ;minutes alarm (BCD 00-59) 119 0004 HOUR_ equ 04h ;hours (BCD 01-12am, 81-92pm) 120 0005 HOURA_ equ 05h ;hours alarm (BCD 01-12am, 81-92pm) 121 0006 WKDAY_ equ 06h ;weekday (BCD 01-07, sunday=1) 122 0007 DAY_ equ 07h ;day of month (BCD 01-31) 123 0008 MONTH_ equ 08h ;month (BCD 01-12) 124 0009 YEAR_ equ 09h ;year (BCD 00-99) 125 000A REGA_ equ 0ah ;control & status register A 126 000B REGB_ equ 0bh ;control & status register B 127 000C REGC_ equ 0ch ;control & status register C 128 000D REGD_ equ 0dh ;control & status register D 129 130 000E SPARE1 equ 0eh ;unused 131 000F SPARE2 equ 0fh ;unused 132 133 ;These next 14 locations are my copies of the clock's first 134 ;14 locations 0-0dh. These are recopied during the 135 ;interrupt once every second. 136 0010 SEC equ 10h ;seconds (BCD 00-59) 137 0011 SECA equ 11h ;seconds alarm (BCD 00-59) 138 0012 MIN equ 12h ;minutes (BCD 00-59) 139 0013 MINA equ 13h ;minutes alarm (BCD 00-59) 140 0014 HOUR equ 14h ;hours (BCD 01-12am, 81-92pm) 141 0015 HOURA equ 15h ;hours alarm (BCD 01-12am, 81-92pm) 142 0016 WKDAY equ 16h ;weekday (BCD 01-07, sunday=1) 143 0017 DAY equ 17h ;day of month (BCD 01-31) 144 0018 MONTH equ 18h ;month (BCD 01-12) 145 0019 YEAR equ 19h ;year (BCD 00-99) 146 001A REGA equ 1ah ;control & status register A 147 001B REGB equ 1bh ;control & status register B 148 001C REGC equ 1ch ;control & status register C 149 001D REGD equ 1dh ;control & status register D 150 151 001E SPARE3 equ 1eh ;unused 152 001F SPARE4 equ 1fh ;unused Tue Jan 12 1993 15:50 Page 4 153 154 155 156 ;****************** 157 ;power on reset 158 159 0000 org 0 160 0000 84 00 jmp start 161 162 163 164 ;****************** 165 ;Real Time Clock chip interrupt routine. Called once per 166 ;second immediately after each clock chip internal update, 167 ;or, upon alarm condition. Must be out within 999 msec. 168 169 0003 org 3 170 171 0003 D5 int sel rb1 ;use register bank 1 during interrupt 172 0004 AA mov r2,a ;save accum 173 0005 B8 0C mov r0,#REGC_ ;determine source of interrupt 174 0007 80 movx a,@r0 ; by reading register C 175 0008 B2 1C jb5 int2 ;jump if Alarm caused interrupt 176 000A 92 0E jb4 int0 ;jump if Update Ended caused interrupt 177 000C 04 25 jmp int9 ;otherwise, abort 178 179 int0 ;Read & copy all registers from the 180 ; Real Time Clock chip 181 000E B8 00 mov r0,#SEC_ ;init RAM pointers 182 0010 B9 10 mov r1,#SEC 183 0012 BF 0E mov r7,#14 ;init counter to read all 14 registers 184 0014 80 int1 movx a,@r0 ;read register contents 185 0015 91 movx @r1,a ;copy it to my location 186 0016 18 inc r0 187 0017 19 inc r1 188 0018 EF 14 djnz r7,int1 ;read next register until done 189 001A 04 25 jmp int9 190 191 001C B8 0B int2 mov r0,#REGB_ ;alarm enabled? 192 001E 80 movx a,@r0 193 001F B2 23 jb5 int3 ;yes 194 0021 04 25 jmp int9 ;no 195 0023 9A FE int3 anl p2,#0feh ;sound alarm 196 197 0025 FA int9 mov a,r2 ;recover accum 198 0026 C5 sel rb0 199 0027 93 retr 200 201 202 ;****************** 203 ;Initialize things 204 205 0028 init 206 0028 B8 0A mov r0,#REGA_ ;init clock register A Tue Jan 12 1993 15:50 Page 5 207 002A 23 20 mov a,#00100000b 208 002C 90 movx @r0,a 209 002D B8 0B mov r0,#REGB_ ;init clock register B 210 002F 80 movx a,@r0 ;first, get current alarm status 211 0030 B2 36 jb5 init1 ;jump if enabled 212 0032 23 11 mov a,#00010001b ;keep it disabled 213 0034 04 38 jmp init2 214 0036 23 31 init1 mov a,#00110001b ;keep it enabled 215 0038 90 init2 movx @r0,a 216 0039 8A F1 orl p2,#0f1h ;set alarm sounding to off 217 003B B8 26 mov r0,#CMODE 218 003D B0 01 mov @r0,#1 ;set MODE to VIEW 219 003F B8 27 mov r0,#CFUNCTION 220 0041 B0 01 mov @r0,#1 ;set FUNCTION to TIME 221 0043 B8 28 mov r0,#CSELECT 222 0045 B0 01 mov @r0,#1 ;set SELECT to cell 1 223 0047 83 ret 224 225 226 ;****************** 227 ;Enter with message number in accum. 228 ;Send message to braille display. 229 0048 AB message mov r3,a ;init message pointer page 3 loc 230 0049 23 3A mov a,#58 231 004B 03 06 mess0 add a,#6 232 004D EB 4B djnz r3,mess0 233 004F AC mov r4,a ;save start of message pointer 234 0050 B9 20 mov r1,#BRLDAT ;init buffer pointer 235 0052 BA 06 mov r2,6 ;init char counter 236 0054 FC mess1 mov a,r4 ;get char 237 0055 E3 movp3 a,@a 238 0056 A1 mov @r1,a ;put it in buffer 239 0057 19 inc r1 240 0058 1C inc r4 241 0059 EA 54 djnz r2,mess1 ;copy remaining chars 242 005B 34 B2 call bral_it ;send message to braille display 243 005D 83 ret 244 245 246 ;****************** 247 ;wait for all user pushbuttons to be released 248 005E 0A keyup in a,p2 ;wait for all buttons up 249 005F 37 cpl a 250 0060 53 F0 anl a,#0f0h 251 0062 96 5E jnz keyup 252 0064 83 ret 253 254 255 ;****************** 256 ;freeze real time clock data copy transfers 257 0065 B8 0B freeze mov r0,#REGB_ 258 0067 80 movx a,@r0 259 0068 43 80 orl a,#80h ;disable update transfers 260 006A 90 movx @r0,a Tue Jan 12 1993 15:50 Page 6 261 006B B8 1B mov r0,#REGB 262 006D 90 movx @r0,a ;save copy too 263 006E 83 ret 264 265 266 ;****************** 267 ;allow real time clock data copy transfers 268 006F B8 0B unfreeze mov r0,#REGB_ 269 0071 80 movx a,@r0 270 0072 53 7F anl a,#07fh ;enable update transfers 271 0074 43 10 orl a,#10h ;re-enable UIE bit 4 272 0076 90 movx @r0,a 273 0077 B8 1B mov r0,#REGB 274 0079 90 movx @r0,a ;save copy too 275 007A 83 ret 276 277 278 ;***************** 279 ;Load selected item into the braille display buffer and 280 ;send it to the braille display. 281 282 007B display 283 007B B8 28 mov r0,#CSELECT ;get select setting 284 007D F0 mov a,@r0 285 007E C6 9B jz dis7 286 0080 D2 97 jb6 dis5 287 0082 F2 99 jb7 dis6 288 ;selected item must be cells 1-6 289 0084 B8 27 mov r0,#CFUNCTION ;what function is selected? 290 0086 F0 mov a,@r0 291 0087 12 8F jb0 dis0 292 0089 32 91 jb1 dis1 293 008B 52 93 jb2 dis2 294 008D 72 95 jb3 dis3 295 296 008F 04 9D dis0 jmp d_time ;time 297 0091 04 D5 dis1 jmp d_alm ;alarm 298 0093 24 0D dis2 jmp d_date ;date 299 0095 24 45 dis3 jmp d_sw ;stopwatch (not yet implemented) 300 0097 24 7D dis5 jmp d_ampm ;am/pm 301 0099 24 A0 dis6 jmp d_onoff ;on/off 302 009B 24 97 dis7 jmp d_wkday ;weekday 303 304 305 ;display time items 306 009D B9 21 d_time mov r1,#BRLDAT+1 ;init braille buffer pointer 307 009F B8 14 mov r0,#HOUR ;get time hours in BCD 308 00A1 80 movx a,@r0 309 00A2 53 0F anl a,#0fh 310 00A4 03 30 add a,#30h ;convert to ASCII 311 00A6 A1 mov @r1,a ;save one's digit 312 00A7 C9 dec r1 313 00A8 80 movx a,@r0 314 00A9 53 70 anl a,#070h ;strip bits 7 and 0-3 Tue Jan 12 1993 15:50 Page 7 315 00AB 47 swap a 316 00AC 03 30 add a,#30h ;convert to ASCII 317 00AE A1 mov @r1,a ;save ten's digit 318 319 00AF B9 23 mov r1,#BRLDAT+3 ;init braille buffer pointer 320 00B1 B8 12 mov r0,#MIN ;get time minutes in BCD 321 00B3 80 movx a,@r0 322 00B4 53 0F anl a,#0fh 323 00B6 03 30 add a,#30h ;convert to ASCII 324 00B8 A1 mov @r1,a ;save one's digit 325 00B9 C9 dec r1 326 00BA 80 movx a,@r0 327 00BB 53 F0 anl a,#0f0h ;strip bits 0-3 328 00BD 47 swap a 329 00BE 03 30 add a,#30h ;convert to ASCII 330 00C0 A1 mov @r1,a ;save ten's digit 331 332 00C1 B9 25 mov r1,#BRLDAT+5 ;init braille buffer pointer 333 00C3 B8 10 mov r0,#SEC ;get time seconds in BCD 334 00C5 80 movx a,@r0 335 00C6 53 0F anl a,#0fh 336 00C8 03 30 add a,#30h ;convert to ASCII 337 00CA A1 mov @r1,a ;save one's digit 338 00CB C9 dec r1 339 00CC 80 movx a,@r0 340 00CD 53 F0 anl a,#0f0h ;strip bits 0-3 341 00CF 47 swap a 342 00D0 03 30 add a,#30h ;convert to ASCII 343 00D2 A1 mov @r1,a ;save ten's digit 344 345 00D3 24 AF jmp d_exit 346 347 ;display alarm items 348 00D5 B9 21 d_alm mov r1,#BRLDAT+1 ;init braille buffer pointer 349 00D7 B8 15 mov r0,#HOURA ;get alarm hours in BCD 350 00D9 80 movx a,@r0 351 00DA 53 0F anl a,#0fh 352 00DC 03 30 add a,#30h ;convert to ASCII 353 00DE A1 mov @r1,a ;save one's digit 354 00DF C9 dec r1 355 00E0 80 movx a,@r0 356 00E1 53 70 anl a,#070h ;strip bits 7 and 0-3 357 00E3 47 swap a 358 00E4 03 30 add a,#30h ;convert to ASCII 359 00E6 A1 mov @r1,a ;save ten's digit 360 361 00E7 B9 23 mov r1,#BRLDAT+3 ;init braille buffer pointer 362 00E9 B8 13 mov r0,#MINA ;get alarm minutes in BCD 363 00EB 80 movx a,@r0 364 00EC 53 0F anl a,#0fh 365 00EE 03 30 add a,#30h ;convert to ASCII 366 00F0 A1 mov @r1,a ;save one's digit 367 00F1 C9 dec r1 368 00F2 80 movx a,@r0 Tue Jan 12 1993 15:50 Page 8 369 00F3 53 F0 anl a,#0f0h ;strip bits 0-3 370 00F5 47 swap a 371 00F6 03 30 add a,#30h ;convert to ASCII 372 00F8 A1 mov @r1,a ;save ten's digit 373 374 00F9 B9 25 mov r1,#BRLDAT+5 ;init braille buffer pointer 375 00FB B8 11 mov r0,#SECA ;get alarm seconds in BCD 376 00FD 80 movx a,@r0 377 00FE 53 0F anl a,#0fh 378 0100 03 30 add a,#30h ;convert to ASCII 379 0102 A1 mov @r1,a ;save one's digit 380 0103 C9 dec r1 381 0104 80 movx a,@r0 382 0105 53 F0 anl a,#0f0h ;strip bits 0-3 383 0107 47 swap a 384 0108 03 30 add a,#30h ;convert to ASCII 385 010A A1 mov @r1,a ;save ten's digit 386 387 010B 24 AF jmp d_exit 388 389 ;display date items 390 010D B9 21 d_date mov r1,#BRLDAT+1 ;init braille buffer pointer 391 010F B8 18 mov r0,#MONTH ;get date month in BCD 392 0111 80 movx a,@r0 393 0112 53 0F anl a,#0fh 394 0114 03 30 add a,#30h ;convert to ASCII 395 0116 A1 mov @r1,a ;save one's digit 396 0117 C9 dec r1 397 0118 80 movx a,@r0 398 0119 53 F0 anl a,#0f0h ;strip bits 0-3 399 011B 47 swap a 400 011C 03 30 add a,#30h ;convert to ASCII 401 011E A1 mov @r1,a ;save ten's digit 402 403 011F B9 23 mov r1,#BRLDAT+3 ;init braille buffer pointer 404 0121 B8 17 mov r0,#DAY ;get date day in BCD 405 0123 80 movx a,@r0 406 0124 53 0F anl a,#0fh 407 0126 03 30 add a,#30h ;convert to ASCII 408 0128 A1 mov @r1,a ;save one's digit 409 0129 C9 dec r1 410 012A 80 movx a,@r0 411 012B 53 F0 anl a,#0f0h ;strip bits 0-3 412 012D 47 swap a 413 012E 03 30 add a,#30h ;convert to ASCII 414 0130 A1 mov @r1,a ;save ten's digit 415 416 0131 B9 25 mov r1,#BRLDAT+5 ;init braille buffer pointer 417 0133 B8 19 mov r0,#YEAR ;get date year in BCD 418 0135 80 movx a,@r0 419 0136 53 0F anl a,#0fh 420 0138 03 30 add a,#30h ;convert to ASCII 421 013A A1 mov @r1,a ;save one's digit 422 013B C9 dec r1 Tue Jan 12 1993 15:50 Page 9 423 013C 80 movx a,@r0 424 013D 53 F0 anl a,#0f0h ;strip bits 0-3 425 013F 47 swap a 426 0140 03 30 add a,#30h ;convert to ASCII 427 0142 A1 mov @r1,a ;save ten's digit 428 429 0143 24 AF jmp d_exit 430 431 ;display stopwatch items 432 0145 B9 21 d_sw mov r1,#BRLDAT+1 ;init braille buffer pointer 433 0147 B8 29 mov r0,#SWHOUR ;get stopwatch hours in BCD 434 0149 F0 mov a,@r0 435 014A 53 0F anl a,#0fh 436 014C 03 30 add a,#30h ;convert to ASCII 437 014E A1 mov @r1,a ;save one's digit 438 014F C9 dec r1 439 0150 F0 mov a,@r0 440 0151 53 F0 anl a,#0f0h ;strip bits 0-3 441 0153 47 swap a 442 0154 03 30 add a,#30h ;convert to ASCII 443 0156 A1 mov @r1,a ;save ten's digit 444 445 0157 B9 23 mov r1,#BRLDAT+3 ;init braille buffer pointer 446 0159 B8 30 mov r0,#SWMIN ;get stopwatch minutes in BCD 447 015B F0 mov a,@r0 448 015C 53 0F anl a,#0fh 449 015E 03 30 add a,#30h ;convert to ASCII 450 0160 A1 mov @r1,a ;save one's digit 451 0161 C9 dec r1 452 0162 F0 mov a,@r0 453 0163 53 F0 anl a,#0f0h ;strip bits 0-3 454 0165 47 swap a 455 0166 03 30 add a,#30h ;convert to ASCII 456 0168 A1 mov @r1,a ;save ten's digit 457 458 0169 B9 25 mov r1,#BRLDAT+5 ;init braille buffer pointer 459 016B B8 31 mov r0,#SWSEC ;get stopwatch seconds in BCD 460 016D F0 mov a,@r0 461 016E 53 0F anl a,#0fh 462 0170 03 30 add a,#30h ;convert to ASCII 463 0172 A1 mov @r1,a ;save one's digit 464 0173 C9 dec r1 465 0174 F0 mov a,@r0 466 0175 53 F0 anl a,#0f0h ;strip bits 0-3 467 0177 47 swap a 468 0178 03 30 add a,#30h ;convert to ASCII 469 017A A1 mov @r1,a ;save ten's digit 470 471 017B 24 AF jmp d_exit 472 473 474 ;display am/pm setting 475 017D d_ampm 476 017D B8 27 mov r0,#CFUNCTION ;time or alarm function? Tue Jan 12 1993 15:50 Page 10 477 017F F0 mov a,@r0 478 0180 12 88 jb0 d_ampm3 ;time 479 0182 B8 15 mov r0,#HOURA 480 0184 32 8A jb1 d_ampm4 ;alarm 481 0186 24 95 jmp d_ampm5 ;neither 482 0188 B8 14 d_ampm3 mov r0,#HOUR ;am or pm? 483 018A 80 d_ampm4 movx a,@r0 484 018B F2 91 jb7 d_ampm1 ;jump if pm 485 018D 23 08 mov a,#8 ;am 486 018F 24 93 jmp d_ampm2 487 0191 23 09 d_ampm1 mov a,#9 ;pm 488 0193 14 48 d_ampm2 call message ;display am or pm 489 0195 24 B1 d_ampm5 jmp d_exit1 490 491 492 ;display weekday name 493 0197 d_wkday 494 0197 B8 16 mov r0,#WKDAY ;get weekday code 1-7 495 0199 80 movx a,@r0 496 019A 03 09 add a,#9 ;adjust to message # 497 019C 14 48 call message ;display weekday 498 019E 24 B1 jmp d_exit1 499 500 501 ;display alarm on/off setting 502 01A0 d_onoff 503 01A0 B8 1B mov r0,#REGB ;alarm on or off? 504 01A2 80 movx a,@r0 505 01A3 B2 A9 jb5 d_onoff1 ;jump if on 506 01A5 23 12 mov a,#18 ;off 507 01A7 24 AB jmp d_onoff2 508 01A9 23 11 d_onoff1 mov a,#17 ;on 509 01AB 14 48 d_onoff2 call message ;display alarm on or off 510 01AD 24 B1 jmp d_exit1 511 512 513 ;exit 514 01AF 34 B2 d_exit call bral_it ;braille bcd data in buffer 515 01B1 83 d_exit1 ret 516 517 518 519 ;****************** 520 ;Send the six ASCII bytes in the BRLDAT buffer to the 6-cell 521 ;braille display. 522 523 01B2 B9 20 bral_it mov r1,#BRLDAT ;init buffer pointer 524 01B4 BB 01 mov r3,#1 ;init for 6 bytes to send (start 525 ; with bit 0 high and shift left) 526 01B6 F1 bra3 mov a,@r1 ;get ASCII data 527 01B7 34 EF call ascbrl ;convert to braille 528 01B9 AA mov r2,a ;save braille char 529 01BA B8 26 mov r0,#CMODE ;in SET mode? 530 01BC F0 mov a,@r0 Tue Jan 12 1993 15:50 Page 11 531 01BD 12 D0 jb0 bra5 ;no, jump 532 01BF B8 28 mov r0,#CSELECT ;yes. This cell SELECTED for SET? 533 01C1 F0 mov a,@r0 534 01C2 DB xrl a,r3 535 01C3 96 D0 jnz bra5 ;no, jump 536 01C5 0A in a,p2 ;MODE or FUNCTION key down? 537 01C6 37 cpl a 538 01C7 F2 D0 jb7 bra5 ;yes, jump 539 01C9 D2 D0 jb6 bra5 ;yes, jump 540 01CB FA mov a,r2 ;no, recover char 541 01CC 43 C0 orl a,#0c0h ;raise bits 6 & 7 (dots 7 & 8) 542 01CE 24 D1 jmp bra4 543 01D0 FA bra5 mov a,r2 ;recover char 544 01D1 BA 08 bra4 mov r2,#8 545 01D3 67 bra0 rrc a 546 01D4 F6 DA jc bra1 547 01D6 99 FE anl p1,#0feh ;set data bit low 548 01D8 24 DC jmp bra2 549 01DA 89 01 bra1 orl p1,#01h ;set data bit high 550 01DC 89 02 bra2 orl p1,#02h ;raise clock line to send bit 551 01DE 99 FD anl p1,#0fdh ;lower clock line 552 01E0 EA D3 djnz r2,bra0 ;send remaining bits 553 01E2 19 inc r1 ;point to next ASCII digit 554 01E3 FB mov a,r3 ;adjust cell counter 555 01E4 E7 rl a 556 01E5 AB mov r3,a 557 01E6 D2 EA jb6 bra6 ;jump if done 558 01E8 24 B6 jmp bra3 ;get next cell 559 bra6 ;all bits are now in the braille display 560 01EA 89 04 orl p1,#04h ;raise strobe line to write all cells 561 01EC 99 FB anl p1,#0fbh ;lower strobe line 562 01EE 83 ret 563 564 565 ;****************** 566 ;Enter with ASCII code (32-95 only) in accum. Exit with 567 ;equivalent braille code in accum. 568 569 01EF AA ascbrl mov r2,a ;save ASCII code 570 01F0 23 20 mov a,#32 ;subtract 32 from ASCII code 571 01F2 37 cpl a ; (form one's complement) 572 01F3 03 01 add a,#1 ; (form two's complement) 573 01F5 6A add a,r2 ; (add to get difference) 574 01F6 E3 movp3 a,@a ;get braille code from TABLE 575 01F7 83 ret 576 577 578 579 580 ;****************** 581 ;****************** 582 0300 org 300h 583 584 Tue Jan 12 1993 15:50 Page 12 585 586 ;**************************** 587 ;ASCII TO BRAILLE CONVERSION TABLE 588 ;TABLE PAGE 'POSITION + 32' IS THE ASCII DECIMAL CODE FOR 589 ;THE EQUIV BRAILLE TABLE 'VALUE'. 590 ;To get braille code, subtract 32 from the ASCII code and use 591 ;that as pointer into this table. 592 0300 593 0300 00 TABLE DB 00H ;#32 SPACE 594 0301 2E DB 2EH ;#33 ! 595 0302 10 DB 10H ;#34 " 596 0303 3C DB 3CH ;#35 # 597 0304 2B DB 2BH ;#36 $ 598 0305 29 DB 29H ;#37 % 599 0306 2F DB 2FH ;#38 & 600 0307 04 DB 04H ;#39 ' 601 0308 37 DB 37H ;#40 ( 602 0309 3E DB 3EH ;#41 ) 603 030A 21 DB 21H ;#42 * 604 030B 2C DB 2CH ;#43 + 605 030C 20 DB 20H ;#44 , 606 030D 24 DB 24H ;#45 - 607 030E 28 DB 28H ;#46 . 608 030F 0C DB 0CH ;#47 / 609 0310 34 DB 34H ;#48 0 610 0311 02 DB 02H ;#49 1 611 0312 06 DB 06H ;#50 2 612 0313 12 DB 12H ;#51 3 613 0314 32 DB 32H ;#52 4 614 0315 22 DB 22H ;#53 5 615 0316 16 DB 16H ;#54 6 616 0317 36 DB 36H ;#55 7 617 0318 26 DB 26H ;#56 8 618 0319 14 DB 14H ;#57 9 619 031A 31 DB 31H ;#58 : 620 031B 30 DB 30H ;#59 ; 621 031C 23 DB 23H ;#60 < 622 031D 3F DB 3FH ;#61 = 623 031E 1C DB 1CH ;#62 > 624 031F 39 DB 39H ;#63 ? 625 0320 08 DB 08H ;#64 @ ` NULL 626 0321 01 DB 01H ;#65 A a SOH 627 0322 03 DB 03H ;#66 B b STX 628 0323 09 DB 09H ;#67 C c ETX 629 0324 19 DB 19H ;#68 D d EOT 630 0325 11 DB 11H ;#69 E e ENQ 631 0326 0B DB 0BH ;#70 F f ACK 632 0327 1B DB 1BH ;#71 G g BELL 633 0328 13 DB 13H ;#72 H h BS 634 0329 0A DB 0AH ;#73 I i HT 635 032A 1A DB 1AH ;#74 J j LF 636 032B 05 DB 05H ;#75 K k VT 637 032C 07 DB 07H ;#76 L l FF 638 032D 0D DB 0DH ;#77 M m CR Tue Jan 12 1993 15:50 Page 13 639 032E 1D DB 1DH ;#78 N n SO 640 032F 15 DB 15H ;#79 O o SI 641 0330 0F DB 0FH ;#80 P p DLE 642 0331 1F DB 1FH ;#81 Q q DC1 643 0332 17 DB 17H ;#82 R r DC2 644 0333 0E DB 0EH ;#83 S s DC3 645 0334 1E DB 1EH ;#84 T t DC4 646 0335 25 DB 25H ;#85 U u NAK 647 0336 27 DB 27H ;#86 V v SYNC 648 0337 3A DB 3AH ;#87 W w ETB 649 0338 2D DB 2DH ;#88 X x CAN 650 0339 3D DB 3DH ;#89 Y y EM 651 033A 35 DB 35H ;#90 Z z SUB 652 033B 2A DB 2AH ;#91 [ { ESC 653 033C 33 DB 33H ;#92 \ | FS 654 033D 3B DB 3BH ;#93 ] } GS 655 033E 18 DB 18H ;#94 ^ ~ RS 656 033F 38 DB 38H ;#95 _ DEL US 657 658 659 ;****************** 660 ;ASCII messages for the braille display (6 chars each) 661 0340 56 49 45 57 20 view_m db "VIEW " ;message #1 0345 20 662 0346 53 45 54 20 20 set_m db "SET " ;#2 034B 20 663 034C 20 20 20 20 20 db " " ;#3 0351 20 664 0352 54 49 4D 45 20 time_m db "TIME " ;#4 0357 20 665 0358 41 4C 41 52 4D alarm_m db "ALARM " ;#5 035D 20 666 035E 44 41 54 45 20 date_m db "DATE " ;#6 0363 20 667 0364 53 54 4F 50 57 stopw_m db "STOPW " ;#7 0369 20 668 036A 41 4D 20 20 20 am_m db "AM " ;#8 036F 20 669 0370 50 4D 20 20 20 pm_m db "PM " ;#9 0375 20 670 0376 53 55 4E 44 41 sun_m db "SUNDAY" ;#10 037B 59 671 037C 4D 4F 4E 44 41 mon_m db "MONDAY" ;#11 0381 59 672 0382 54 55 45 53 44 tue_m db "TUESDA" ;#12 0387 41 673 0388 57 45 4E 53 44 wed_m db "WENSDA" ;#13 038D 41 674 038E 54 48 55 52 44 thur_m db "THURDA" ;#14 0393 41 675 0394 46 52 49 44 41 fri_m db "FRIDAY" ;#15 0399 59 676 039A 53 41 54 44 41 sat_m db "SATDAY" ;#16 039F 59 Tue Jan 12 1993 15:50 Page 14 677 03A0 41 4C 4D 20 4F alm_on_m db "ALM ON" ;#17 03A5 4E 678 03A6 41 4C 4D 4F 46 alm_off_m db "ALMOFF" ;#18 03AB 46 679 680 681 ;****************** 682 ;****************** 683 0400 org 400h 684 685 686 687 ;****************** 688 ;main routine 689 690 0400 C5 start sel rb0 691 0401 14 28 call init 692 0403 05 en i 693 694 0404 14 7B start0 call display ;send data to the braille display 695 0406 0A in a,p2 ;watch for first button press 696 0407 37 cpl a 697 0408 53 F0 anl a,#0f0h 698 040A C6 04 jz start0 699 040C F2 14 jb7 start1 ;MODE button down 700 040E D2 16 jb6 start2 ;FUNCTION button down 701 0410 B2 18 jb5 start3 ;SELECT button down 702 0412 92 1A jb4 start4 ;CHANGE button down 703 704 0414 84 1C start1 jmp mode 705 0416 84 4A start2 jmp function 706 0418 84 82 start3 jmp select 707 041A A4 00 start4 jmp change 708 709 710 711 712 ;****************** 713 ;MODE button is pressed first 714 041C 8A F1 mode orl p2,#0f1h ;silence alarm (if sounding) 715 041E B8 26 mov r0,#CMODE ;get current mode setting 716 0420 F0 mov a,@r0 717 0421 12 25 jb0 mode0 ;view mode selected 718 0423 32 29 jb1 mode1 ;set mode selected 719 720 0425 23 01 mode0 mov a,#1 ;load view message pointer 721 0427 84 2B jmp mode3 722 0429 23 02 mode1 mov a,#2 ;load set message pointer 723 724 042B 14 48 mode3 call message ;display current mode setting 725 042D 0A in a,p2 ;wait for all buttons up or 726 042E 37 cpl a ; CHANGE button down 727 042F 53 F0 anl a,#0f0h 728 0431 C6 48 jz mode7 ;jump, all buttons are up Tue Jan 12 1993 15:50 Page 15 729 0433 92 37 jb4 mode4 ;jump, CHANGE button down 730 0435 84 1C jmp mode 731 0437 B8 26 mode4 mov r0,#CMODE ;get current mode setting again 732 0439 F0 mov a,@r0 733 043A E7 rl a ;advance to next mode 734 043B 52 44 jb2 mode6 ;jump to wrap high bit 735 043D A0 mov @r0,a ;save new mode 736 043E 0A mode5 in a,p2 ;wait for CHANGE button up 737 043F 37 cpl a 738 0440 92 3E jb4 mode5 739 0442 84 1C jmp mode 740 0444 B0 01 mode6 mov @r0,#1 ;wrap advance back to bit 0 741 0446 84 3E jmp mode5 742 0448 84 04 mode7 jmp start0 743 744 745 ;****************** 746 ;FUNCTION button is pressed first 747 044A function 748 044A B8 27 mov r0,#CFUNCTION ;get current function setting 749 044C F0 mov a,@r0 750 044D 12 55 jb0 fun0 ;time function selected 751 044F 32 59 jb1 fun1 ;alarm function selected 752 0451 52 5D jb2 fun2 ;date function selected 753 0453 72 61 jb3 fun22 ;stopwatch function selected (not 754 ; yet implemented) 755 756 0455 23 04 fun0 mov a,#4 ;load time message pointer 757 0457 84 63 jmp fun3 758 0459 23 05 fun1 mov a,#5 ;load alarm message pointer 759 045B 84 63 jmp fun3 760 045D 23 06 fun2 mov a,#6 ;load date message pointer 761 045F 84 63 jmp fun3 762 0461 23 07 fun22 mov a,#7 ;load stopwatch message pointer 763 764 0463 14 48 fun3 call message ;display current function setting 765 0465 0A fun7 in a,p2 ;wait for all buttons up or 766 0466 37 cpl a ; CHANGE button down 767 0467 53 F0 anl a,#0f0h 768 0469 C6 80 jz fun8 ;jump, all buttons are up 769 046B 92 6F jb4 fun4 ;jump, CHANGE button down 770 046D 84 65 jmp fun7 771 046F B8 27 fun4 mov r0,#CFUNCTION ;get current function setting 772 0471 F0 mov a,@r0 773 0472 E7 rl a ;advance to next function 774 0473 72 7C jb3 fun6 ;jump to wrap high bit (change to 775 ; jb4 when stopwatch code is done) 776 0475 A0 mov @r0,a ;save new function 777 0476 0A fun5 in a,p2 ;wait for CHANGE button up 778 0477 37 cpl a 779 0478 92 76 jb4 fun5 780 047A 84 4A jmp function 781 047C B0 01 fun6 mov @r0,#1 ;wrap advance back to bit 0 782 047E 84 76 jmp fun5 Tue Jan 12 1993 15:50 Page 16 783 0480 84 04 fun8 jmp start0 784 785 786 ;****************** 787 ;SELECT button is pressed first 788 ;Action taken depends on which one of the 8 789 ;combinations of MODE & FUNCTION is currently active. 790 ;SELECT toggles thru all display items for a given 791 ;MODE/FUNCTION setting. In SET MODE a cursor 792 ;(dots 7 & 8) is also displayed under the item 793 ;currently selected. 794 795 0482 B8 26 select mov r0,#CMODE ;get current mode setting 796 0484 F0 mov a,@r0 797 0485 12 89 jb0 s0 ;view mode on 798 0487 32 94 jb1 s1 ;set mode on 799 800 0489 B8 27 s0 mov r0,#CFUNCTION ;get current function setting 801 048B F0 mov a,@r0 802 048C 12 AD jb0 svt ;view/time 803 048E 32 CE jb1 sva ;view/alarm 804 0490 52 E2 jb2 svd ;view/date 805 0492 72 CE jb3 svs ;view/stopwatch 806 807 0494 B8 27 s1 mov r0,#CFUNCTION ;get current function setting 808 0496 F0 mov a,@r0 809 0497 12 9F jb0 sst ;set/time 810 0499 32 C7 jb1 ssa ;set/alarm 811 049B 52 E2 jb2 ssd ;set/date 812 049D 72 C7 jb3 sss ;set/stopwatch 813 814 815 ;select set/time items 816 049F sst 817 049F B8 28 mov r0,#CSELECT ;get current SELECT value 818 04A1 F0 mov a,@r0 ;step to next value 819 04A2 96 A8 jnz sst1 820 04A4 23 01 mov a,#1 821 04A6 84 AA jmp sst2 822 04A8 97 sst1 clr c 823 04A9 F7 rlc a 824 04AA A0 sst2 mov @r0,a ;save it 825 04AB 84 EF jmp sel_end 826 827 ;select view/time items 828 04AD svt 829 04AD B8 28 mov r0,#CSELECT ;get current SELECT value 830 04AF F0 mov a,@r0 ;step to next value (but 831 04B0 C6 BA jz svt1 ; not each digit of time) 832 04B2 D2 BE jb6 svt2 833 04B4 F2 C2 jb7 svt3 834 04B6 23 40 mov a,#40h ;select bit 6 835 04B8 84 C4 jmp svt4 836 04BA 23 01 svt1 mov a,#1 ;select bit 1 Tue Jan 12 1993 15:50 Page 17 837 04BC 84 C4 jmp svt4 838 04BE 23 80 svt2 mov a,#80h ;select bit 7 839 04C0 84 C4 jmp svt4 840 04C2 23 00 svt3 mov a,#0 ;select bit none (weekday) 841 04C4 A0 svt4 mov @r0,a ;save it 842 04C5 84 EF jmp sel_end 843 844 ;select set/alarm or set/stopwatch 845 04C7 ssa 846 04C7 sss 847 04C7 B8 28 mov r0,#CSELECT ;get current SELECT value 848 04C9 F0 mov a,@r0 ;step to next value 849 04CA E7 rl a 850 04CB A0 mov @r0,a ;save it 851 04CC 84 EF jmp sel_end 852 853 ;select view/alarm or view/stopwatch items 854 04CE sva 855 04CE svs 856 04CE B8 28 mov r0,#CSELECT ;get current SELECT value 857 04D0 F0 mov a,@r0 ;step to next value (but 858 04D1 F2 D9 jb7 sva1 ; not each digit of time) 859 04D3 D2 DD jb6 sva2 860 04D5 23 40 mov a,#40h ;select bit 6 861 04D7 84 DF jmp sva3 862 04D9 23 01 sva1 mov a,#1 ;select bit 1 863 04DB 84 DF jmp sva3 864 04DD 23 80 sva2 mov a,#80h ;select bit 7 865 04DF A0 sva3 mov @r0,a ;save it 866 04E0 84 EF jmp sel_end 867 868 ;select view/date or set/date items 869 04E2 svd 870 04E2 ssd 871 04E2 B8 28 mov r0,#CSELECT ;get current SELECT value 872 04E4 F0 mov a,@r0 ;step to next value 873 04E5 E7 rl a 874 04E6 D2 EB jb6 ssd1 875 04E8 A0 ssd2 mov @r0,a ;save it 876 04E9 84 EF jmp sel_end 877 04EB 23 01 ssd1 mov a,#1 878 04ED 84 E8 jmp ssd2 879 880 881 ;exit select commands here 882 04EF 14 5E sel_end call keyup ;wait for SELECT button up 883 04F1 84 04 jmp start0 884 885 886 887 ;****************** 888 ;****************** 889 0500 org 500h 890 Tue Jan 12 1993 15:50 Page 18 891 892 893 ;****************** 894 ;CHANGE button is pressed first 895 ;Action taken depends on which one of the 8 896 ;combinations of MODE & FUNCTION is currently active. 897 898 0500 B8 26 change mov r0,#CMODE ;get current mode setting 899 0502 F0 mov a,@r0 900 0503 12 07 jb0 c0 ;view mode on 901 0505 32 12 jb1 c1 ;set mode on 902 903 0507 B8 27 c0 mov r0,#CFUNCTION ;get current function setting 904 0509 F0 mov a,@r0 905 050A 12 25 jb0 cvt ;view/time 906 050C 32 25 jb1 cva ;view/alarm 907 050E 52 25 jb2 cvd ;view/date 908 0510 72 27 jb3 cvs ;view/stopwatch 909 910 0512 B8 27 c1 mov r0,#CFUNCTION ;get current function setting 911 0514 F0 mov a,@r0 912 0515 12 1D jb0 c3 ;set/time 913 0517 32 1F jb1 c4 ;set/alarm 914 0519 52 21 jb2 c5 ;set/date 915 051B 72 23 jb3 c6 ;set/stopwatch 916 917 051D A4 29 c3 jmp cst 918 051F C4 2C c4 jmp csa 919 0521 E4 00 c5 jmp csd 920 0523 E4 A2 c6 jmp css 921 922 ;silence alarm 923 0525 cvt 924 0525 cva 925 0525 E4 A2 cvd jmp ch_end 926 927 ;start or stop stopwatch timing 928 cvs ;(code not yet done) 929 0527 E4 A2 jmp ch_end 930 931 932 ;***** 933 ;change set/time items 934 0529 14 65 cst call freeze 935 052B 0A in a,p2 ;what item is currently selected? 936 052C B8 28 mov r0,#CSELECT 937 052E F0 mov a,@r0 938 052F 12 41 jb0 cst0 939 0531 32 43 jb1 cst1 940 0533 52 45 jb2 cst2 941 0535 72 47 jb3 cst3 942 0537 92 49 jb4 cst4 943 0539 B2 4B jb5 cst5 944 053B D2 4D jb6 cst6 Tue Jan 12 1993 15:50 Page 19 945 053D F2 4F jb7 cst7 946 053F C6 51 jz cst8 947 948 0541 A4 53 cst0 jmp cst_hrs10 ;hours tens digit 949 0543 A4 62 cst1 jmp cst_hrs1 ;hours ones digit 950 0545 A4 79 cst2 jmp cst_min10 ;minutes tens digit 951 0547 A4 90 cst3 jmp cst_min1 ;minutes ones digit 952 0549 A4 A7 cst4 jmp cst_sec10 ;seconds tens digit 953 054B A4 BE cst5 jmp cst_sec1 ;seconds ones digit 954 054D C4 00 cst6 jmp cst_ampm ;am/pm 955 054F C4 0B cst7 jmp cst_alm ;alarm enabled/disabled 956 0551 C4 1C cst8 jmp cst_weekday ;weekday 957 958 ;increment hours tens digit 959 0553 B8 04 cst_hrs10 mov r0,#HOUR_ ;get hours 960 0555 80 movx a,@r0 961 0556 03 10 add a,#10h ;increment tens digit (upper nibble) 962 0558 92 5C jb4 cst_hrs10a ;jump if tens digit is now 1 963 055A 53 0F anl a,#0fh ;otherwise, make it 0 964 055C 90 cst_hrs10a movx @r0,a ;save new hours ten's value 965 055D B8 14 mov r0,#HOUR 966 055F 90 movx @r0,a ;save copy too 967 0560 E4 A2 jmp ch_end 968 969 ;increment hours ones digit 970 0562 B8 04 cst_hrs1 mov r0,#HOUR_ ;get hours 971 0564 80 movx a,@r0 972 0565 03 01 add a,#01h ;increment ones digit (lower nibble) 973 0567 AF mov r7,a ;temp save it 974 0568 53 0F anl a,#0fh ;is new value = 10 975 056A D3 0A xrl a,#10 976 056C 96 72 jnz cst_hrs1a ;no 977 056E FF mov a,r7 ;yes. change it to 0 978 056F 53 F0 anl a,#0f0h 979 0571 AF mov r7,a 980 0572 FF cst_hrs1a mov a,r7 ;recover new value 981 0573 90 movx @r0,a ;save new hours ones value 982 0574 B8 14 mov r0,#HOUR 983 0576 90 movx @r0,a ;save copy too 984 0577 E4 A2 jmp ch_end 985 986 ;increment minutes tens digit 987 0579 B8 02 cst_min10 mov r0,#MIN_ ;get minutes 988 057B 80 movx a,@r0 989 057C 03 10 add a,#10h ;increment tens digit (upper nibble) 990 057E AF mov r7,a ;temp save it 991 057F 53 F0 anl a,#0f0h ;is new value = 6 992 0581 D3 60 xrl a,#60h 993 0583 96 89 jnz cst_min10a ;no 994 0585 FF mov a,r7 ;yes. change it to 0 995 0586 53 0F anl a,#0fh 996 0588 AF mov r7,a 997 0589 FF cst_min10a mov a,r7 ;recover new value 998 058A 90 movx @r0,a ;save new minutes ten's value Tue Jan 12 1993 15:50 Page 20 999 058B B8 12 mov r0,#MIN 1000 058D 90 movx @r0,a ;save copy too 1001 058E E4 A2 jmp ch_end 1002 1003 ;increment minutes ones digit 1004 0590 B8 02 cst_min1 mov r0,#MIN_ ;get minutes 1005 0592 80 movx a,@r0 1006 0593 03 01 add a,#01h ;increment ones digit (lower nibble) 1007 0595 AF mov r7,a ;temp save it 1008 0596 53 0F anl a,#0fh ;is new value = 10 1009 0598 D3 0A xrl a,#10 1010 059A 96 A0 jnz cst_min1a ;no 1011 059C FF mov a,r7 ;yes. change it to 0 1012 059D 53 F0 anl a,#0f0h 1013 059F AF mov r7,a 1014 05A0 FF cst_min1a mov a,r7 ;recover new value 1015 05A1 90 movx @r0,a ;save new minutes ones value 1016 05A2 B8 12 mov r0,#MIN 1017 05A4 90 movx @r0,a ;save copy too 1018 05A5 E4 A2 jmp ch_end 1019 1020 ;increment seconds tens digit 1021 05A7 B8 00 cst_sec10 mov r0,#SEC_ ;get seconds 1022 05A9 80 movx a,@r0 1023 05AA 03 10 add a,#10h ;increment tens digit (upper nibble) 1024 05AC AF mov r7,a ;temp save it 1025 05AD 53 F0 anl a,#0f0h ;is new value = 6 1026 05AF D3 60 xrl a,#60h 1027 05B1 96 B7 jnz cst_sec10a ;no 1028 05B3 FF mov a,r7 ;yes. change it to 0 1029 05B4 53 0F anl a,#0fh 1030 05B6 AF mov r7,a 1031 05B7 FF cst_sec10a mov a,r7 ;recover new value 1032 05B8 90 movx @r0,a ;save new seconds ten's value 1033 05B9 B8 10 mov r0,#SEC 1034 05BB 90 movx @r0,a ;save copy too 1035 05BC E4 A2 jmp ch_end 1036 1037 ;set seconds ones digit to zero 1038 05BE B8 00 cst_sec1 mov r0,#SEC_ ;get seconds 1039 05C0 80 movx a,@r0 1040 05C1 53 F0 anl a,#0f0h ;change it to 0 1041 05C3 90 movx @r0,a ;save new seconds ones value 1042 05C4 B8 10 mov r0,#SEC 1043 05C6 90 movx @r0,a ;save copy too 1044 05C7 E4 A2 jmp ch_end 1045 1046 1047 ;******************* 1048 ;******************* 1049 0600 org 600h 1050 1051 1052 Tue Jan 12 1993 15:50 Page 21 1053 ;toggle between AM & PM 1054 0600 B8 04 cst_ampm mov r0,#HOUR_ ;get hours data 1055 0602 80 movx a,@r0 1056 0603 03 80 add a,#80h ;toggle bit 7 to toggle am/pm 1057 0605 90 movx @r0,a ;save new am/pm setting 1058 0606 B8 14 mov r0,#HOUR 1059 0608 90 movx @r0,a ;save copy too 1060 0609 E4 A2 jmp ch_end 1061 1062 ;toggle alarm between enabled & disabled 1063 060B B8 0B cst_alm mov r0,#REGB_ ;get alarm enabled/disabled status 1064 060D 80 movx a,@r0 1065 060E B2 14 jb5 cst_alm1 ;jump if currently enabled 1066 0610 43 20 orl a,#20h ;enable alarm 1067 0612 C4 16 jmp cst_alm2 1068 0614 53 DF cst_alm1 anl a,#0dfh ;disable alarm 1069 0616 90 cst_alm2 movx @r0,a ;save new alarm setting 1070 0617 B8 1B mov r0,#REGB 1071 0619 90 movx @r0,a ;save copy too 1072 061A E4 A2 jmp ch_end 1073 1074 ;increment thru weekday choices (1-7, 1=sunday) 1075 061C B8 06 cst_weekday mov r0,#WKDAY_ ;get weekday value 1076 061E 80 movx a,@r0 1077 061F 17 inc a ;increment it 1078 0620 72 24 jb3 cst_wd1 ;jump if new value = 8 1079 0622 C4 26 jmp cst_wd2 1080 0624 23 01 cst_wd1 mov a,#1 ;reset to 1 (sunday) 1081 0626 90 cst_wd2 movx @r0,a ;save new weekday value 1082 0627 B8 16 mov r0,#WKDAY 1083 0629 90 movx @r0,a ;save copy too 1084 062A E4 A2 jmp ch_end 1085 1086 1087 ;***** 1088 ;change set/alarm items 1089 062C 14 65 csa call freeze 1090 062E 0A in a,p2 ;what item is currently selected? 1091 062F B8 28 mov r0,#CSELECT 1092 0631 F0 mov a,@r0 1093 0632 12 44 jb0 csa0 1094 0634 32 46 jb1 csa1 1095 0636 52 48 jb2 csa2 1096 0638 72 4A jb3 csa3 1097 063A 92 4C jb4 csa4 1098 063C B2 4E jb5 csa5 1099 063E D2 50 jb6 csa6 1100 0640 F2 52 jb7 csa7 1101 0642 E4 A2 jmp ch_end 1102 1103 0644 C4 54 csa0 jmp csa_hrs10 ;hours tens digit 1104 0646 C4 63 csa1 jmp csa_hrs1 ;hours ones digit 1105 0648 C4 7A csa2 jmp csa_min10 ;minutes tens digit 1106 064A C4 91 csa3 jmp csa_min1 ;minutes ones digit Tue Jan 12 1993 15:50 Page 22 1107 064C C4 A8 csa4 jmp csa_sec10 ;seconds tens digit 1108 064E C4 BF csa5 jmp csa_sec1 ;seconds ones digit 1109 0650 C4 D6 csa6 jmp csa_ampm ;am/pm 1110 0652 C4 E1 csa7 jmp csa_alm ;alarm enabled/disabled 1111 1112 ;increment hours tens digit 1113 0654 B8 05 csa_hrs10 mov r0,#HOURA_ ;get hours 1114 0656 80 movx a,@r0 1115 0657 03 10 add a,#10h ;increment tens digit (upper nibble) 1116 0659 92 5D jb4 csa_hrs10a ;jump if tens digit is now 1 1117 065B 53 0F anl a,#0fh ;otherwise, make it 0 1118 065D 90 csa_hrs10a movx @r0,a ;save new hours ten's value 1119 065E B8 15 mov r0,#HOURA 1120 0660 90 movx @r0,a ;save copy too 1121 0661 E4 A2 jmp ch_end 1122 1123 ;increment hours ones digit 1124 0663 B8 05 csa_hrs1 mov r0,#HOURA_ ;get hours 1125 0665 80 movx a,@r0 1126 0666 03 01 add a,#01h ;increment ones digit (lower nibble) 1127 0668 AF mov r7,a ;temp save it 1128 0669 53 0F anl a,#0fh ;is new value = 10 1129 066B D3 0A xrl a,#10 1130 066D 96 73 jnz csa_hrs1a ;no 1131 066F FF mov a,r7 ;yes. change it to 0 1132 0670 53 F0 anl a,#0f0h 1133 0672 AF mov r7,a 1134 0673 FF csa_hrs1a mov a,r7 ;recover new value 1135 0674 90 movx @r0,a ;save new hours ones value 1136 0675 B8 15 mov r0,#HOURA 1137 0677 90 movx @r0,a ;save copy too 1138 0678 E4 A2 jmp ch_end 1139 1140 ;increment minutes tens digit 1141 067A B8 03 csa_min10 mov r0,#MINA_ ;get minutes 1142 067C 80 movx a,@r0 1143 067D 03 10 add a,#10h ;increment tens digit (upper nibble) 1144 067F AF mov r7,a ;temp save it 1145 0680 53 F0 anl a,#0f0h ;is new value = 6 1146 0682 D3 60 xrl a,#60h 1147 0684 96 8A jnz csa_min10a ;no 1148 0686 FF mov a,r7 ;yes. change it to 0 1149 0687 53 0F anl a,#0fh 1150 0689 AF mov r7,a 1151 068A FF csa_min10a mov a,r7 ;recover new value 1152 068B 90 movx @r0,a ;save new minutes ten's value 1153 068C B8 13 mov r0,#MINA 1154 068E 90 movx @r0,a ;save copy too 1155 068F E4 A2 jmp ch_end 1156 1157 ;increment minutes ones digit 1158 0691 B8 03 csa_min1 mov r0,#MINA_ ;get minutes 1159 0693 80 movx a,@r0 1160 0694 03 01 add a,#01h ;increment ones digit (lower nibble) Tue Jan 12 1993 15:50 Page 23 1161 0696 AF mov r7,a ;temp save it 1162 0697 53 0F anl a,#0fh ;is new value = 10 1163 0699 D3 0A xrl a,#10 1164 069B 96 A1 jnz csa_min1a ;no 1165 069D FF mov a,r7 ;yes. change it to 0 1166 069E 53 F0 anl a,#0f0h 1167 06A0 AF mov r7,a 1168 06A1 FF csa_min1a mov a,r7 ;recover new value 1169 06A2 90 movx @r0,a ;save new minutes ones value 1170 06A3 B8 13 mov r0,#MINA 1171 06A5 90 movx @r0,a ;save copy too 1172 06A6 E4 A2 jmp ch_end 1173 1174 ;increment seconds tens digit 1175 06A8 B8 01 csa_sec10 mov r0,#SECA_ ;get seconds 1176 06AA 80 movx a,@r0 1177 06AB 03 10 add a,#10h ;increment tens digit (upper nibble) 1178 06AD AF mov r7,a ;temp save it 1179 06AE 53 F0 anl a,#0f0h ;is new value = 6 1180 06B0 D3 60 xrl a,#60h 1181 06B2 96 B8 jnz csa_sec10a ;no 1182 06B4 FF mov a,r7 ;yes. change it to 0 1183 06B5 53 0F anl a,#0fh 1184 06B7 AF mov r7,a 1185 06B8 FF csa_sec10a mov a,r7 ;recover new value 1186 06B9 90 movx @r0,a ;save new seconds ten's value 1187 06BA B8 11 mov r0,#SECA 1188 06BC 90 movx @r0,a ;save copy too 1189 06BD E4 A2 jmp ch_end 1190 1191 ;increment seconds ones digit 1192 06BF B8 01 csa_sec1 mov r0,#SECA_ ;get seconds 1193 06C1 80 movx a,@r0 1194 06C2 03 01 add a,#01h ;increment ones digit (lower nibble) 1195 06C4 AF mov r7,a ;temp save it 1196 06C5 53 0F anl a,#0fh ;is new value = 10 1197 06C7 D3 0A xrl a,#10 1198 06C9 96 CF jnz csa_sec1a ;no 1199 06CB FF mov a,r7 ;yes. change it to 0 1200 06CC 53 F0 anl a,#0f0h 1201 06CE AF mov r7,a 1202 06CF FF csa_sec1a mov a,r7 ;recover new value 1203 06D0 90 movx @r0,a ;save new seconds ones value 1204 06D1 B8 11 mov r0,#SECA 1205 06D3 90 movx @r0,a ;save copy too 1206 06D4 E4 A2 jmp ch_end 1207 1208 ;toggle between AM & PM 1209 06D6 B8 05 csa_ampm mov r0,#HOURA_ ;get hours data 1210 06D8 80 movx a,@r0 1211 06D9 03 80 add a,#80h ;toggle bit 7 to toggle am/pm 1212 06DB 90 movx @r0,a ;save new am/pm setting 1213 06DC B8 15 mov r0,#HOURA 1214 06DE 90 movx @r0,a ;save copy too Tue Jan 12 1993 15:50 Page 24 1215 06DF E4 A2 jmp ch_end 1216 1217 ;toggle alarm between enabled & disabled 1218 06E1 B8 0B csa_alm mov r0,#REGB_ ;get alarm enabled/disabled status 1219 06E3 80 movx a,@r0 1220 06E4 B2 EA jb5 csa_alm1 ;jump if currently enabled 1221 06E6 43 20 orl a,#20h ;enable alarm 1222 06E8 C4 EC jmp csa_alm2 1223 06EA 53 DF csa_alm1 anl a,#0dfh ;disable alarm 1224 06EC 90 csa_alm2 movx @r0,a ;save new alarm setting 1225 06ED B8 1B mov r0,#REGB 1226 06EF 90 movx @r0,a ;save copy too 1227 06F0 E4 A2 jmp ch_end 1228 1229 1230 1231 ;***************** 1232 ;***************** 1233 0700 org 700h 1234 1235 1236 1237 ;***** 1238 ;change set/date items 1239 0700 14 65 csd call freeze 1240 0702 0A in a,p2 ;what item is currently selected? 1241 0703 B8 28 mov r0,#CSELECT 1242 0705 F0 mov a,@r0 1243 0706 12 14 jb0 csd0 1244 0708 32 16 jb1 csd1 1245 070A 52 18 jb2 csd2 1246 070C 72 1A jb3 csd3 1247 070E 92 1C jb4 csd4 1248 0710 B2 1E jb5 csd5 1249 0712 E4 A2 jmp ch_end 1250 1251 0714 E4 20 csd0 jmp csd_mon10 ;month tens digit 1252 0716 E4 2F csd1 jmp csd_mon1 ;month ones digit 1253 0718 E4 46 csd2 jmp csd_day10 ;day tens digit 1254 071A E4 5D csd3 jmp csd_day1 ;day ones digit 1255 071C E4 74 csd4 jmp csd_yr10 ;year tens digit 1256 071E E4 8B csd5 jmp csd_yr1 ;year ones digit 1257 1258 ;increment month tens digit 1259 0720 B8 08 csd_mon10 mov r0,#MONTH_ ;get month 1260 0722 80 movx a,@r0 1261 0723 03 10 add a,#10h ;increment tens digit (upper nibble) 1262 0725 92 29 jb4 csd_mon10a ;jump if tens digit is now 1 1263 0727 53 0F anl a,#0fh ;otherwise, make it 0 1264 0729 90 csd_mon10a movx @r0,a ;save new month ten's value 1265 072A B8 18 mov r0,#MONTH 1266 072C 90 movx @r0,a ;save copy too 1267 072D E4 A2 jmp ch_end 1268 Tue Jan 12 1993 15:50 Page 25 1269 ;increment month ones digit 1270 072F B8 08 csd_mon1 mov r0,#MONTH_ ;get month 1271 0731 80 movx a,@r0 1272 0732 03 01 add a,#01h ;increment ones digit (lower nibble) 1273 0734 AF mov r7,a ;temp save it 1274 0735 53 0F anl a,#0fh ;is new value = 10 1275 0737 D3 0A xrl a,#10 1276 0739 96 3F jnz csd_mon1a ;no 1277 073B FF mov a,r7 ;yes. change it to 0 1278 073C 53 F0 anl a,#0f0h 1279 073E AF mov r7,a 1280 073F FF csd_mon1a mov a,r7 ;recover new value 1281 0740 90 movx @r0,a ;save new month ones value 1282 0741 B8 18 mov r0,#MONTH 1283 0743 90 movx @r0,a ;save copy too 1284 0744 E4 A2 jmp ch_end 1285 1286 ;increment day tens digit 1287 0746 B8 07 csd_day10 mov r0,#DAY_ ;get day 1288 0748 80 movx a,@r0 1289 0749 03 10 add a,#10h ;increment tens digit (upper nibble) 1290 074B AF mov r7,a ;temp save it 1291 074C 53 F0 anl a,#0f0h ;is new value = 4 1292 074E D3 40 xrl a,#40h 1293 0750 96 56 jnz csd_day10a ;no 1294 0752 FF mov a,r7 ;yes. change it to 0 1295 0753 53 0F anl a,#0fh 1296 0755 AF mov r7,a 1297 0756 FF csd_day10a mov a,r7 ;recover new value 1298 0757 90 movx @r0,a ;save new day ten's value 1299 0758 B8 17 mov r0,#DAY 1300 075A 90 movx @r0,a ;save copy too 1301 075B E4 A2 jmp ch_end 1302 1303 ;increment day ones digit 1304 075D B8 07 csd_day1 mov r0,#DAY_ ;get day 1305 075F 80 movx a,@r0 1306 0760 03 01 add a,#01h ;increment ones digit (lower nibble) 1307 0762 AF mov r7,a ;temp save it 1308 0763 53 0F anl a,#0fh ;is new value = 10 1309 0765 D3 0A xrl a,#10 1310 0767 96 6D jnz csd_day1a ;no 1311 0769 FF mov a,r7 ;yes. change it to 0 1312 076A 53 F0 anl a,#0f0h 1313 076C AF mov r7,a 1314 076D FF csd_day1a mov a,r7 ;recover new value 1315 076E 90 movx @r0,a ;save new day ones value 1316 076F B8 17 mov r0,#DAY 1317 0771 90 movx @r0,a ;save copy too 1318 0772 E4 A2 jmp ch_end 1319 1320 ;increment year tens digit 1321 0774 B8 09 csd_yr10 mov r0,#YEAR_ ;get year 1322 0776 80 movx a,@r0 Tue Jan 12 1993 15:50 Page 26 1323 0777 03 10 add a,#10h ;increment tens digit (upper nibble) 1324 0779 AF mov r7,a ;temp save it 1325 077A 53 F0 anl a,#0f0h ;is new value = 10 1326 077C D3 A0 xrl a,#0a0h 1327 077E 96 84 jnz csd_yr10a ;no 1328 0780 FF mov a,r7 ;yes. change it to 0 1329 0781 53 0F anl a,#0fh 1330 0783 AF mov r7,a 1331 0784 FF csd_yr10a mov a,r7 ;recover new value 1332 0785 90 movx @r0,a ;save new year ten's value 1333 0786 B8 19 mov r0,#YEAR 1334 0788 90 movx @r0,a ;save copy too 1335 0789 E4 A2 jmp ch_end 1336 1337 ;increment year ones digit 1338 078B B8 09 csd_yr1 mov r0,#YEAR_ ;get year 1339 078D 80 movx a,@r0 1340 078E 03 01 add a,#01h ;increment ones digit (lower nibble) 1341 0790 AF mov r7,a ;temp save it 1342 0791 53 0F anl a,#0fh ;is new value = 10 1343 0793 D3 0A xrl a,#0ah 1344 0795 96 9B jnz csd_yr1a ;no 1345 0797 FF mov a,r7 ;yes. change it to 0 1346 0798 53 F0 anl a,#0f0h 1347 079A AF mov r7,a 1348 079B FF csd_yr1a mov a,r7 ;recover new value 1349 079C 90 movx @r0,a ;save new year ones value 1350 079D B8 19 mov r0,#YEAR 1351 079F 90 movx @r0,a ;save copy too 1352 07A0 E4 A2 jmp ch_end 1353 1354 1355 ;***** 1356 ;change set/stopwatch items 1357 css ;(not yet implemented) 1358 1359 1360 1361 ;***** 1362 ;exit CHANGE button action 1363 07A2 14 5E ch_end call keyup ;wait for CHANGE button up 1364 07A4 14 6F call unfreeze 1365 07A6 84 04 jmp start0 1366 Tue Jan 12 1993 15:50 Page 27 Defined Symbol Name Value References 665 alarm_m 0358 678 alm_off_m 03A6 677 alm_on_m 03A0 668 am_m 036A 569 ascbrl 01EF 527 545 bra0 01D3 552 549 bra1 01DA 546 550 bra2 01DC 548 526 bra3 01B6 558 544 bra4 01D1 542 543 bra5 01D0 531 535 538 539 559 bra6 01EA 557 523 bral_it 01B2 242 514 56 BRLDAT = 0020 234 306 319 332 348 361 374 390 403 416 432 445 458 523 903 c0 0507 900 910 c1 0512 901 917 c3 051D 912 918 c4 051F 913 919 c5 0521 914 920 c6 0523 915 62 CFUNCTION = 0027 219 289 476 748 771 800 807 903 910 898 change 0500 707 1363 ch_end 07A2 925 929 967 984 1001 1018 1035 1044 1060 1072 1084 1101 1121 1138 1155 1172 1189 1206 1215 1227 1249 1267 1284 1301 1318 1335 1352 58 CMODE = 0026 217 529 715 731 795 898 Pre CODE 0000 1089 csa 062C 918 1103 csa0 0644 1093 1104 csa1 0646 1094 1105 csa2 0648 1095 1106 csa3 064A 1096 1107 csa4 064C 1097 1108 csa5 064E 1098 1109 csa6 0650 1099 1110 csa7 0652 1100 1218 csa_alm 06E1 1110 1223 csa_alm1 06EA 1220 1224 csa_alm2 06EC 1222 1209 csa_ampm 06D6 1109 1124 csa_hrs1 0663 1104 1113 csa_hrs10 0654 1103 1118 csa_hrs10a 065D 1116 1134 csa_hrs1a 0673 1130 1158 csa_min1 0691 1106 1141 csa_min10 067A 1105 1151 csa_min10a 068A 1147 1168 csa_min1a 06A1 1164 1192 csa_sec1 06BF 1108 1175 csa_sec10 06A8 1107 1185 csa_sec10a 06B8 1181 1202 csa_sec1a 06CF 1198 1239 csd 0700 919 Tue Jan 12 1993 15:50 Page 28 Defined Symbol Name Value References 1251 csd0 0714 1243 1252 csd1 0716 1244 1253 csd2 0718 1245 1254 csd3 071A 1246 1255 csd4 071C 1247 1256 csd5 071E 1248 1304 csd_day1 075D 1254 1287 csd_day10 0746 1253 1297 csd_day10a 0756 1293 1314 csd_day1a 076D 1310 1270 csd_mon1 072F 1252 1259 csd_mon10 0720 1251 1264 csd_mon10a 0729 1262 1280 csd_mon1a 073F 1276 1338 csd_yr1 078B 1256 1321 csd_yr10 0774 1255 1331 csd_yr10a 0784 1327 1348 csd_yr1a 079B 1344 69 CSELECT = 0028 221 283 532 817 829 847 856 871 936 1091 1241 1357 css 07A2 920 934 cst 0529 917 948 cst0 0541 938 949 cst1 0543 939 950 cst2 0545 940 951 cst3 0547 941 952 cst4 0549 942 953 cst5 054B 943 954 cst6 054D 944 955 cst7 054F 945 956 cst8 0551 946 1063 cst_alm 060B 955 1068 cst_alm1 0614 1065 1069 cst_alm2 0616 1067 1054 cst_ampm 0600 954 970 cst_hrs1 0562 949 959 cst_hrs10 0553 948 964 cst_hrs10a 055C 962 980 cst_hrs1a 0572 976 1004 cst_min1 0590 951 987 cst_min10 0579 950 997 cst_min10a 0589 993 1014 cst_min1a 05A0 1010 1038 cst_sec1 05BE 953 1021 cst_sec10 05A7 952 1031 cst_sec10a 05B7 1027 1080 cst_wd1 0624 1078 1081 cst_wd2 0626 1079 1075 cst_weekday 061C 956 924 cva 0525 906 925 cvd 0525 907 928 cvs 0527 908 923 cvt 0525 905 Pre DATA 0000 666 date_m 035E Tue Jan 12 1993 15:50 Page 29 Defined Symbol Name Value References 143 DAY = 0017 404 1299 1316 122 DAY_ = 0007 1287 1304 296 dis0 008F 291 297 dis1 0091 292 298 dis2 0093 293 299 dis3 0095 294 300 dis5 0097 286 301 dis6 0099 287 302 dis7 009B 285 282 display 007B 694 348 d_alm 00D5 297 475 d_ampm 017D 300 487 d_ampm1 0191 484 488 d_ampm2 0193 486 482 d_ampm3 0188 478 483 d_ampm4 018A 480 489 d_ampm5 0195 481 390 d_date 010D 298 514 d_exit 01AF 345 387 429 471 515 d_exit1 01B1 489 498 510 502 d_onoff 01A0 301 508 d_onoff1 01A9 505 509 d_onoff2 01AB 507 432 d_sw 0145 299 306 d_time 009D 296 493 d_wkday 0197 302 257 freeze 0065 934 1089 1239 675 fri_m 0394 756 fun0 0455 750 758 fun1 0459 751 760 fun2 045D 752 762 fun22 0461 753 764 fun3 0463 757 759 761 771 fun4 046F 769 777 fun5 0476 779 782 781 fun6 047C 774 765 fun7 0465 770 783 fun8 0480 768 747 function 044A 705 780 140 HOUR = 0014 307 482 965 982 1058 141 HOURA = 0015 349 479 1119 1136 1213 120 HOURA_ = 0005 1113 1124 1209 119 HOUR_ = 0004 959 970 1054 205 init 0028 691 214 init1 0036 211 215 init2 0038 213 171 int 0003 179 int0 000E 176 184 int1 0014 188 191 int2 001C 175 195 int3 0023 193 197 int9 0025 177 189 194 248 keyup 005E 251 882 1363 231 mess0 004B 232 Tue Jan 12 1993 15:50 Page 30 Defined Symbol Name Value References 236 mess1 0054 241 229 message 0048 488 497 509 724 764 138 MIN = 0012 320 999 1016 139 MINA = 0013 362 1153 1170 118 MINA_ = 0003 1141 1158 117 MIN_ = 0002 987 1004 714 mode 041C 704 730 739 720 mode0 0425 717 722 mode1 0429 718 724 mode3 042B 721 731 mode4 0437 729 736 mode5 043E 738 741 740 mode6 0444 734 742 mode7 0448 728 144 MONTH = 0018 391 1265 1282 123 MONTH_ = 0008 1259 1270 671 mon_m 037C 669 pm_m 0370 146 REGA = 001A 125 REGA_ = 000A 206 147 REGB = 001B 261 273 503 1070 1225 126 REGB_ = 000B 191 209 257 268 1063 1218 148 REGC = 001C 127 REGC_ = 000C 173 149 REGD = 001D 128 REGD_ = 000D Pre RSECT 0000 800 s0 0489 797 807 s1 0494 798 676 sat_m 039A 136 SEC = 0010 182 333 1033 1042 137 SECA = 0011 375 1187 1204 116 SECA_ = 0001 1175 1192 115 SEC_ = 0000 181 1021 1038 795 select 0482 706 882 sel_end 04EF 825 842 851 866 876 662 set_m 0346 130 SPARE1 = 000E 131 SPARE2 = 000F 151 SPARE3 = 001E 152 SPARE4 = 001F 845 ssa 04C7 810 870 ssd 04E2 811 877 ssd1 04EB 874 875 ssd2 04E8 878 846 sss 04C7 812 816 sst 049F 809 822 sst1 04A8 819 824 sst2 04AA 821 690 start 0400 160 694 start0 0404 698 742 783 883 1365 704 start1 0414 699 705 start2 0416 700 706 start3 0418 701 Tue Jan 12 1993 15:50 Page 31 Defined Symbol Name Value References 707 start4 041A 702 667 stopw_m 0364 670 sun_m 0376 854 sva 04CE 803 862 sva1 04D9 858 864 sva2 04DD 859 865 sva3 04DF 861 863 869 svd 04E2 804 855 svs 04CE 805 828 svt 04AD 802 836 svt1 04BA 831 838 svt2 04BE 832 840 svt3 04C2 833 841 svt4 04C4 835 837 839 77 SWHOUR = 0029 433 78 SWMIN = 0030 446 79 SWSEC = 0031 459 593 TABLE 0300 674 thur_m 038E 664 time_m 0352 672 tue_m 0382 268 unfreeze 006F 1364 661 view_m 0340 673 wed_m 0388 142 WKDAY = 0016 494 1082 121 WKDAY_ = 0006 1075 145 YEAR = 0019 417 1333 1350 124 YEAR_ = 0009 1321 1338 Lines Assembled : 1366 Assembly Errors : 0