Z8ASM 3.03 LOG OBJCODE STMT SOURCE STATEMENT 1 ekrtest module 2 3 constant 4 ADANZEIGE := 1 !WENN ADWWERTE ZUM TEST ANGEZEIGT WERDEN SOLLEN! 5 p0 := 0 !portadressen! 6 p1 := 1 7 p2 := 2 8 p3 := 3 9 10 LEDBUF := %10 11 LEDBUFLO := %11 12 KEYBUF := %12 13 KEYBUFLO := %13 14 ADWERT := %14 15 ADWERTLO := %15 16 DAWERT := %16 17 DAWERTLO := %17 18 DIGTTCTR := %18 19 KEYTEMP := %19 20 KEYTEMP1 := %1A 21 KEYTEMP2 := %1B 22 KEYTEMP3 := %1C 23 XTEMP4 := %1D 24 SEGTEMP := %1E 25 KEYPOS := %1F 26 27 DATENPTR := %40 28 24 internal P 0000 30 interrupttabelle prooedure 31 entry P 0000 000C' 32 irq0; wval main !nicht verwendet! P 0002 000C' 33 irq1: wval main !nicht verwendet! P 0004 000C' 34 irq2; wval main !nicht verwendet! P 0006 0169' 35 irq3; wval sioinit !Interrupt SIO-Empfang! P 0008 000C' 36 irq4: wval main !nicht verwendet! P 000A 005D' 37 irq5: wval t1int !Interrupt Zeitgeber 1! P 000C 38 end interrupttabelle 39 40 41 global 42 P 000C 43 main procedure 44 entry P 000C 31 00 45 srp #%00 !unterer registersatz! 46 !initialisieren der steuerregister! P 000E AC 00* 47 ld r10,#hi initab !Adr der initialisierungstabelle! P 0010 BC 20* 48 ld r11,#lo initab P 0012 CC F2 49 ld r12,#%2f2 !1. register fuer ini (nicht tmr)! P 0014 DC 0E 50 ld r13,#14 !anzahl register! 51 iniloop: P 0016 C3 CA 52 ldci @r12,@rr10 !in register schreiben! P 0018 DA FC 53 djnz r13,iniloop !wdhlg., bis alle register! P 001A E6 F1 0F 54 ld tmr,#%(2)00001111 !kein Tout, kein Tin, enable t1, 55 !load t1 & pre1! 56 !enable t0, load t0 & pre0! P 001D 9F 57 ei P 001E 8B 0E 58 jr iniend 59 initab: P 0020 47 60 bval 71 !t1: teiler 71! P 0021 37 61 bval %(2)00110111 !pre1: vort. 13; int. takt, cont! P 0022 05 62 bval 5 !t0: teiler 2 (SIO 9600 Baud)! P 0023 0D 63 bval %(2)00001101 !pre0: vort. 3, contin. zaehler! P 9024 00 64 bval %(2 00000000 !p2m: port 2 alles ausgang! P 0025 01 65 bval %(2)11000001 !p3m: ung. par.; sio; p31-33 e;! 66 !pull up aktiv! P 0026 40 67 bval %(2)01001100 !p01m: p0h e; n. zylc.;p1 e; p01 a! P 0027 34 66 bval %(2)00110100 !ipr: sioin hoechste prioritaet! P 0028 00 69 bval %0 !irq: keine requests anliegend! P 0029 28 70 bval %(2)00101000 !imr: global-di; sioi-ei; t1-ei! P 002A 00 71 bval %0 !flags; 0! P 002B 00 72 bval %0 !rp: registersatz 0! P 002C 00 73 bval %0 !sph: frei (stack intern)! P 002D 80 74 bval %80 !spl! 75 iniend: P 002E E6 18 06 76 ld DIGITCTR,#6 77 ! ! P 0031 E6 20 FF 78 ld %20,#0-1 !fuer datest; (bei 8 Bit)! P 0034 E6 16 00 79 ld DAWERT,#0 P 0037 E6 17 00 80 ld DAWERTLO,#0 81 ! ! P 003A E4 FF 40 82 ld DATENPTR,nodfuestatus 83 do P 003D 76 03 04 84 tm p3,#%(2)00000100 85 IF z P 0040 ED 004C' 86 THEN ld LEDBUF,KEYBUF P 0043 E4 12 10 P 0046 E4 13 11 87 ld LEDBUFLO,KEYBUFLO P 0049 8D 005B' 88 ELSE 89 . IF ADANZEIGE 90 THEN P 004C E4 14 04 91 ld 4, AWERT P 004F E4 15 05 92 ld 5, AllWERTLO P 0052 D6 0209' 93 ca11 d2b4u P 0055 E4 07 10 94 ld LEDBUF,7 P 0058 E4 08 11 95 ld LEDBUFLO,8 96 ELSE 97 di 98 ld LEDBUF,%30 99 swap LEDBUF 100 or LEDBUF.%31 101 ld LEDBUFLO,%32 102 swap LEDBUFLO 103 or LEDBUFLO,%33 104 ei 105 FI 106 FI 107 !endlosschleife! P 005B 8B E0 108 od P 005D 109 end main 110 111 !-----------------------------------------------------! 112 constant 113 ledbuf := r0 !anzeigepuffer [2 byte]! 114 ledbuflo .= r1 115 keybuf := r2 !tastaturpuffer [2 byte]! 116 keybuflo := r3 117 adwert := r4 !ad-wert [2 byte]! 118 adwertlo := r5 119 dawert := r6 !da-wert [2 byte]! 120 dawertlo := r7 121 digitctr .= r8 !aktuelle digitposition [1 byte]! 122 keytemp := r9 !zwischensp. tastatureinlesen [4 byte]! 123 keytempl := r10 124 keytemp2 := r11 125 keytemp3 := r12 126 xtemp := r13 !allg. zwischenspeicher [1 byte]! 127 segtemp := r14 !zwischensp. segmentausgabe [1 byte]! 128 keypos := r15 !zwischensp. schalterpos. [1 byte]! 129 130 internal P 005D 131 t1ini procedure 132 entry P 005D 56 FB DF 133 and imp,#%(2)11011111 !t1-Int sperren! P 0060 9F 134 ei P 0061 70 FD 135 push rp P 0063 31 10 136 srp #%10 137 !FUER TESTZWECKE DAWERT ERHOEHEN! P 0065 76 03 04 138 tm p3,#%(2)00000100 P 0068 ED 009D' 139 IF z THEN P 006B 76 FE 01 140 tm sph,#1 P 006E ED 0087' 141 IF z THEN P 0071 06 E7 40 142 add dawertlo,#%40 P 0074 FD 0084' 143 IF c THEN P 0077 06 E6 01 144 add dawert,#1 P 007A FD 0084' 145 IF c THEN P 007D 6C FF 146 ld dawert,#%ff P 007F 7C FF 147 ld datvertlo,#%ff P 0081 46 FE 01 148 or sph,#1 149 FI 150 FI P 0084 8D 009A' 151 ELSE P 0087 26 E7 40 152 sub dawertlo,#%40 P 008A FD 009A' 153 IF c THEN P 008D 26 E6 01 154 sub dawert,#%1 P 0090 FD 009A' 155 IF c THEN P 0093 B0 E6 156 clr dawert P 0095 B0 E7 157 clr dawertlo P 0097 56 FE FE 158 and sph,#%fe 159 FI 160 FI 161 FI P 009A 8D 00C6' 162 ELSE P 009D E6 00 0D 163 ld p0,#(6 shl 1)+1 P 00A0 FF 164 nop P 00A1 FF 165 nop P 00A2 E4 01 19 166 1d KEYTEMP,p1 P 00A5 56 E9 F0 167 and keytemp,#%f0 168 IF keytemp P 00A8 A6 E9 90 169 CASE #%90 THEN P 00AB ED 00B5' P 00AE 6C FF 170 ld dawert,#%ff P 00B0 7C FF 171 1d dawertlo,#%ff P 00B2 8D 00C6' 172 CASE #%10 THEN P 00B5 A6 E9 10 P 00B8 ED 00C2' F 00BB B0 E6 173 clr dawert clr dawertlo P 00BD B0 E7 P 00BF 8D 00C6' 174 ELSE P 00C2 6C 7F 175 ld dawert,#%7f P 00C4 7C FF 176 ld dawertlo,#%ff 177 FI 178 FI 179 !zaehler auf naeohstea digit! P 00C6 8E 180 inc digitctr P 00C7 8E 181 inc digitctr P 00C8 A6 E8 0C 182 cp digitctr,#12 P 00CB 3D 00D0' 183 IF ugt THEN P 00CE 8C 06 184 ld digitctr,#6 , 185 FI 186 !digit auswaehlen! P 00D0 A6 E8 08 187 cp digitctr,#8 188 IF ule P 00D3 BD 00DB' 189 THEN ld segtemp,ledbuf P 00D6 E8 B0 P 00D8 8D 00DD' 190 ElSE ld segtemp,ledbuflo P 00DB E8 E1 191 FI P 00DD 76 E8 02 192 tm digitclr, #%(2)00000010 !test, ob unterstes bit! 193 IF z P 00E0 ED 00E5' 194 THEN swap segtemp P 00E3 F0 EE 195 FI 196 !l-nibbel von da-wert eintragen! P 00E5 56 EE F0 197 and segtemp,#%f0 !unteres nibbel = 0! P 00E8 F8 E7 198 ld keypos,dawertlo !keypos als zwischenspeich.! P 00EA F0 EF 199 swap keypos P 00EC 56 EF 0F 200 and keypos,#%0f !oberes nibbel = 0! P 00EF 42 EF . 201 or segtemp,keypos 202 !tasten einlesen! P 00F1 E6 00 07 203 ld p0,#7 P 00F4 FF 204 nop P 00F5 FF 205 nop P 00F6 E4 01 19 204 ld KEYTEMP,p1 P 00F9 E6 00 09 207 ld p0,#9 P 00FC FF 208 nop P 00FD FF 209 nop P 00FE E4 01 1A 210 ld KEYTEMP1,p1 P 0101 E6 00 0B 211 ld p0,#11 P 0104 FF 212 nop P 0105 FF 213 nop P 0106 E4 01 1B 214 ld KEYTEMP,p1 P 0109 E6 00 0D 215 ld p0,#13 P 010C FF 216 nop P 010D FF 217 nop P 010E E4 01 1C 218 ld KEYTEMP3,p1 219 ! ANZEIGE AKTUALISIEREN ! P 0111 ?9 02 ?? 220 ld p2,segtemp P 0113 56 00 01 221 and p0,#%1 P 0116 46 00 02 222 or p0,#%2 ! strobe ! P 0119 56 00 01 223 and p0,#%1 P 011C 44 E8 00 224 or p0,digitctr 225 !ad-wandler einlesen! P 011F 46 00 01 226 or p0,#%(2)00000001 !l-teil, spaeter Tausch! P 0122 48 01 227 ld adwert,p 1 P 0124 56 00 FE 226 and p0,#%(2)11111110 !h-teil! P 0127 58 01 229 ld adwertlo,p1 230 ! dawert ausgeben ! P 0129 69 02 231 ld p2,dawert P 012B 46 03 10 232 or p3,#%(2)00010000 P 0128 56 03 EF 233 and p3,#%(2)11101111 234 !tastenwerte umrechnen und abspeichern! P 0131 56 E9 F0 235 and keytemp,#%f0 P 0134 56 EA F0 236 and keytemp1,#%f0 P 0137 56 EB F0 237 and keytemp2,#%f0 P 013A 56 EC F0 238 and keytemp3,#%f0 P 013D F0 EA 239 swap keytemp1 P 013F 28 E9 240 ld keybuf, keytemp P 0141 42 2A 241 or keybuf,keytempl P 0143 F0 EC 242 swap keytemp3 P 0145 38 EB 243 ld keybuflo,keytemp2 P 0147 42 3C 244 or keybuflo,keytemp3 245 !ad-wert umrechnen! , P 0149 46 03 20 246 or p3,#%(2)00100000 !ad-wandler loeschen! P 014C F0 E4 247 swap adwert P 014E 10 E4 248 rlc adwert P 0150 10 E4 249 rlc adwert P 0152 10 E4 250 rlc adwert P 0154 10 E5 251 rlc adwertlo P 0156 10 E4 252 rlc adwert P 0158 10 E5 253 rlc adwertlo P 015A 10 E4 254 rlc adwert P 015C 56 E4 03 255 and adwert,#%(2)00000011 !obere bits 0! P 015F 56 03 DF 256 and p3,#%(2)11011111 !ad-wandler frei! 257 ! ! P 0162 50 FD 258 pop rp P 0164 8F 259 di P 0165 46 FB 20 260 or imr,#%(2)00100000 !t1-Int frei! P 0168 BF 261 iret P 0169 262 eud t1int 263 264 !--------------------------------------------------! 265 constant 266 dfueregistersatz := %40 267 datenptr := r0 268 siopuffer := r1 269 chksumber := r1 !doppelte Verwendung von r1! 270 datlgtpuffer := dfueregistersatz + 2 ! = r2 ! 271 chksumempf := r15 272 273 !Aufbau eines Datensatzes: 274 /.... 275 r2 r3 r4 (max. r14 r15) ! 276 277 errorstatus := %fd !flag DFUE-Fehlerl 278 auswertstatus := %fe !Flag Auswertung laeuft! 279 nodfuestatus := %ff !flag keine DFUE! 280 281 okquittung := '0' 282 errorquittung := '9' 283 284 maxlength := 14 !Maximallaenge Datensatz 285 einschl. Laenge und Pruefsumme ! 286 287 internal P 0169 288 sioinint procecture 289 entry P 0169 70 FD 290 push rp P 016B 31 40 291 srp #dfueregistersatz 292 !--- Zeichen lesen --- ! P 016D 18 F0 293 ld siopuffer,sio !Zeichen zwischenspeichern! 294 !--- Empfaenger frei ? ---! P 016F A6 E0 FE 295 cp datenptr,#auswertstatus !noch Auswertung?! P 0162 6B 5C 296 jr z,endsioin !wenn ja --> ignorieren! 297 298 !*** empfangenes Zeichen auswerten ***! P 0174 A6 E1 2F 299 cp siopuffer,#'/' !Start-Zeichen ?! P 0177 EB 04 300 jr nz,¤1 301 !--- Startzeichen erkannt ---! P 0179 0C 00 302 ld datenptr,#%0 !ja --> PTR auf Anfangl P 017B 8B 53 303 jr endsioin 304 ¤1: 305 !--- nicht Startzeiohen ---! P 017D A6 E1 0D 306 cp siopuffer, #%r' !Ende-Zeichen ?! P 0180 EB 32 307 jr nz,¤5 308 309 !*** Endezeichen erkannt ***! 310 !--- war bereits Fehlar erkannt ? ---! P 0182 76 E0 80 311 tm datenptr,#%(2)10000000 P 0185 6B 07 312 jr z,¤3 313 ¤2: 314 !--- Fehlermeldung senden, DFUE; ruecksetzen ---! P 0187 E6 F0 39 315 ld sio,#errorquittung !Fehler! P 018A 0C FF 316 ld datenptr,#nodfuestatus P 018C 8B 42 317 jr endsioin 318 ¤3: 319 !--- Test, ob Laengenvorgabe eingehalten ---! P 018E 26 EO 02 320 sub datenptr,#%02 !weg. Laengen- u Pruefsummenbyte! P 0191 A4 42 E0 321 cp datenptr,datlgtpuffer P 0194 EB 13 F1 322 jr ne,¤02 !Negativquittung (falsche Laenge)! 323 !--- Pruefsumme kontrollieren --- ! P 0196 06 E0 43 324 add datenptr,#dfueregistersatz+3 325 !Adresse Pruefsumme! P 0199 E3 F0 326 ld chksumempf,@datenptr !Pruefsumme speichern! P 019B 1C 00 327 ld chksumber,#%00 !Zw.sp, fuer Pruefs. berechn.! P 019D 00 E0 328 dec datenptr !Adr. letztes Datenbyte! 329 ¤4: P 019F 03 10 330 add chksumber,@datenptr !auf Pruefsumme add.! P 01A1 00 E0 331 dec datenptr !vorheriges Datum! P 01A3 A6 E0 41 332 cp datenptr,#datlgtpuffer-1 !Laenge erreicht? ! P 01A6 EB F7 333 jr nz,¤4 !nein --> naechstes Byte! P 01A8 56 E1 0F 33l and chksumber,#%f !H-Teil ausblenden! P 01AB A2 1F 335 cp chksumber,chksummempf !Pruefsumme gleich ? ! P 01AD EB D8 336 jr nz,¤2 !Fehler! 337 338 !Auswertung der Nachricht ***! P 01AF D6 01FB' 339 call auswertung P 01B2 8B 1C 340 jr endsioin 341 342 ¤5: 343 !*** Datenzeichen gelesen ***! 344 (--- Test, ob Laenge ok und kein Fehler --- ! P 01B4 A6 E0 0E 345 cp datenptr,#maxlength P 01B7 FB 15 346 jr nc,¤6 !wenn Laenge ueberschritten! P 01B9 66 E0 40 347 tcm datenptr,#%(2)10000000 P 01BC 6B 12 348 jr z,endsioin !Fehler oder kein Start! P 01BE A6 E1 20 349 cp siopuffer,#' ' P 01C1 7B 0D 350 jr c,endsioin !Steuerzeiohen ignorieren! P 01C3 D6 01D3' 351 call convertasciitonibble P 01C6 7B 06 352 jr c,¤6 !wenn keine Hex-ziffer! 353 !--- Datenzeichen speichern --- ! P 01C8 B7 10 42 354 ld datlgtpuffur(datenptr),siopuffer P 01CB CE 355 inc datenptr P 01CC 8B 02 356 jr endsioin 357 ¤6: 358 !--- Fehler --- ! P 01CE 0C FD 359 ld datenptr,errorstatus . 360 361 !*** Ende Empfaenger-Interrupt ***! 362 andsioin: P 01D0 50 FD 363 pop rp : P 01D2 BF 364 iret P 01D3 365 end sioinit 366 367 convertasciitonibble procedure 368 !Umsetzen eines ASCII-Zeichens im SIO-Puffer in die 369 entsprechende Hex-Ziffer; CY-Flag wird gesetzt, 370 wenn es keine gueltige Ziffer ist ! 371 local 372 upcase, upmask, badhex label P 01D3 373 entry P 01D3 A6 E1 30 374 cp siopuffer,#'0' P 01D6 1B 21 375 jr lt,badhex P 01D8 A6 E1 39 376 cp siopuffer,#'9' P 01DB 2B 17 377 jr le,upmask P 01DD A6 E1 378 cp siopuffer, #'A' P 0lE0 1B 17 379 jr lt,badhex P 01E2 A6 E1 46 380 cp siopuffer, #'F' P 01E5 2B 0A 381 jr le,upcase P 01E7 A6 E1 61 382 cp siopuffer, #'a' p 01EA 1B 0D 383 jp lt,badhex P 01EC A6 E1 66 384 cp siopuffer, #'f' P 01EF AB 08 385 jr gt,badhex 386 upcase: P 01F1 26 E1 07 387 sub siopuffer,#%07 !alpha-zeichen! 388 upmask: P 01F4 56 E1 0F 389 and siopuffer,#%0f P 01F7 CF 390 rcf P 01F8 AF 391 ret 392 badhex: P 01F9 DF 393 scf P 01FA AF 394 ret P 01FB 395 end convertasciitonibble 396 P 01FB 397 auswertung procedure 398 entry P 01FB 39 30 399 ld %30,r3 P 01FD 49 31 400 ld %31,r4 P 01FF 59 32 401 ld %32,r5 P 0201 69 33 402 ld %33,r6 P 0203 E6 F0 30 403 ld sio,#okquittung P 0206 00 FF 404 ld datenptr,#nodfuestatus P 0208 AF 405 ret P 0209 406 end auswertung 407 408 ! ----------------------------------------------------- ! P 0209 409 d2b4u PROCEDUR 410 ! Binaer-BCD-Wandlung 411 Eintritt: Reg. 4,5 = Binaerzahl 412 Austritt: Reg. 6, 7, 8 = BCD-Zahl 413 ENTRY P 0209 70 FB 414 PUSH RP P 020B 31 00 415 SRP #0 P 020D FC 10 416 LD R15,#%10 P 020F 6C 00 417 LD R6,#0 P 0211 7C 00 418 LD R7,#0 P 0213 8C 00 419 LD R8,#0 P 0215 10 05 420 db1: RLC 5 P 0217 10 04 421 RLC 4 P 0219 10 08 422 RLC 8 P 021B 10 07 423 RLC 7 P 021D 10 06 424 RLC 6 P 021F 00 0F 425 DEC 15 P 0221 6B 17 426 JR Z,db2 P 0223 98 E8 427 LD R9,R8 P 0225 D6 023D' 428 CALL dbup P 0228 88 E9 429 LD R8,R9 P 022A 98 E7 430 LD R9,R7 P 022C D6 023D' 431 CALL dbup P 022F 78 E9 432 LD R7,R9 P 0231 98 E6 433 LD R9,R6 P 0233 D6 023D' 434 CALL dbup P 0236 68 E9 435 LD R6,R9 P 0238 8B DB 436 JR db1 P 023A 50 FD 437 db2: POP RP P 023C AF 438 RET 439 P 023D A8 E9 440 dbup: LD R10,R9 P 023F 56 EA 0F 441 AND R10,#%0F P 0242 A6 EA 05 442 CP R10,#5 P 0245 7B 03 443 JR C,dbup1 P 0247 06 E9 03 444 ADD R9,#3 P 024A A6 E9 50 445 dbup1: CP R9,#%50 P 024D 7B 03 446 JR C,dbup2 P 024F 06 E9 30 447 ADD R9,#%30 P 0252 AF 448 dbup2: RET 449 P 0253 450 END d2b4u 451 452 ! -------------------------------------------------------------- ! 453 end ekrtest