Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 1 PC Object I Line Source A 1 ; Zilog Z8 Encore! ANSI C Compiler Release 3.60 A 2 ; -nofastcall -const=RAM -model=L -nooptlink -regvar A 3 ; -noreduceopt -debug -revaa -peephole -localcse -optsize A 4 ; -alias A 5 DEFINE servo_TEXT,SPACE=ROM A 6 FILE ".\SERVO.C" A 7 .debug "C" A 8 SEGMENT ROM_DATA A 9 A 10 A 11 ;**************************** _clockin *************************** A 12 ;Name Addr/Register Size Type A 13 A 14 A 15 ; Aggregate Stack Size: 0 (words) A 16 A 17 A 18 .FRAME _n_clockin,?_n_clockin,RDATA A 19 .FRAME _f_clockin,?_f_clockin,EDATA A 20 SEGMENT servo_TEXT 000000 A 21 _clockin: A 22 .define "_clockin" A 23 .value _clockin A 24 .class 2 A 25 .type 65 A 26 .type 0 A 27 .endef A 28 .begfunc "clockin",7,"_clockin" A 29 ; 1 #include A 30 ; 2 A 31 ; 3 // Servo Controller Data Comm A 32 ; 4 A 33 ; 5 // Clock in data to async port A 34 ; 6 void clockin(void) A 35 ; 7 { A 36 ; 8 PBOUT &=0xDF; //clock low A 37 .line 8 000000 59DF0FD7 A 38 ANDX 4055,#223 A 39 ; 9 while((PBIN &0x10)==0x10); // wait until ack received 000004 A 40 _1_L_1: A 41 .line 9 000004 69100FD6 A 42 TCMX 4054,#16 000008 6B FA A 43 JR Z,_1_L_1 A 44 ; 10 PBOUT |= 0x20; A 45 .line 10 00000A 49200FD7 A 46 ORX 4055,#32 A 47 ; 11 while((PBIN &0x10)==0); //wait until ack is high 00000E A 48 _1_L_4: A 49 .line 11 00000E 79100FD6 A 50 TMX 4054,#16 000012 6B FA A 51 JR Z,_1_L_4 A 52 ; 12 } Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 2 PC Object I Line Source servo.src A 53 .line 12 000014 AF A 54 RET A 55 .endfunc "clockin",12,"_clockin" A 56 SEGMENT ROM_DATA A 57 A 58 A 59 ;**************************** _servo_out *************************** A 60 ;Name Addr/Register Size Type A 61 ;i RR2 1 variable A 62 ;motcom R0 0 variable A 63 ;param R15+8 1 parameter A 64 ;com R15+6 1 parameter A 65 ;mot RR0 1 parameter A 66 A 67 A 68 ; Aggregate Stack Size: -3 (words) A 69 A 70 A 71 .FRAME _n_servo_out,?_n_servo_out,RDATA A 72 .FCALL _n_clockin A 73 .FRAME _f_servo_out,?_f_servo_out,EDATA A 74 .FCALL _f_clockin A 75 SEGMENT servo_TEXT 000015 A 76 _servo_out: A 77 .define "_servo_out" A 78 .value _servo_out A 79 .class 2 A 80 .type 65 A 81 .type 0 A 82 .endef A 83 .begfunc "servo_out",15,"_servo_out" 000015 5C03 A 84 LD R5,#3 000017 D6 0000 A 85 CALL __b_frameset0 00001A 880E04 A 86 LDX R0,4(RR14) 00001D 881E05 A 87 LDX R1,5(RR14) A 88 .define "mot" A 89 .class 17 A 90 .reg 17 A 91 .type 3 A 92 .type 0 A 93 .endef A 94 .define "com" A 95 .class 9 A 96 .value 6 A 97 .type 3 A 98 .type 0 A 99 .endef A 100 .define "param" A 101 .class 17 A 102 .reg -1 A 103 .type 3 A 104 .type 0 Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 3 PC Object I Line Source servo.src A 105 .endef A 106 ; 13 A 107 ; 14 void servo_out(int mot,int com,int param) A 108 ; 15 { A 109 .define "motcom" A 110 .class 4 A 111 .reg 1 A 112 .type 2 A 113 .type 0 A 114 .endef A 115 .define "i" A 116 .class 4 A 117 .reg 18 A 118 .type 3 A 119 .type 0 A 120 .endef A 121 ; 16 A 122 ; 17 A 123 ; 18 char motcom; A 124 ; 19 int i; A 125 ; 20 A 126 ; 21 // select servo driver IC A 127 ; 22 A 128 ; 23 if(mot<9) PBOUT &= 0xFE; A 129 .line 23 000020 A6E109 A 130 CP R1,#9 000023 1FA6E000 A 131 CPC R0,#-0 000027 9B 04 A 132 JR GE,_2_L_9 000029 59FE0FD7 A 133 ANDX 4055,#254 00002D A 134 _2_L_9: A 135 ; 24 A 136 ; 25 if(mot>=9) A 137 .line 25 00002D A6E109 A 138 CP R1,#9 000030 1FA6E000 A 139 CPC R0,#-0 000034 1B 13 A 140 JR LT,_2_L_12 A 141 ; 26 if(mot<17) A 142 .line 26 000036 A6E111 A 143 CP R1,#17 000039 1FA6E000 A 144 CPC R0,#-0 00003D 9B 0A A 145 JR GE,_2_L_12 A 146 ; 27 { A 147 ; 28 PBOUT &=0xFD; A 148 .line 28 00003F 59FD0FD7 A 149 ANDX 4055,#253 A 150 ; 29 mot=mot-8; A 151 .line 29 000043 06E1F8 A 152 ADD R1,#248 000046 16E0FF A 153 ADC R0,#255 A 154 ; 30 } 000049 A 155 _2_L_12: A 156 .line 30 Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 4 PC Object I Line Source servo.src A 157 ; 31 if(mot>=17) A 158 .line 31 000049 A6E111 A 159 CP R1,#17 00004C 1FA6E000 A 160 CPC R0,#-0 000050 1B 13 A 161 JR LT,_2_L_14 A 162 ; 32 if(mot<25) A 163 .line 32 000052 A6E119 A 164 CP R1,#25 000055 1FA6E000 A 165 CPC R0,#-0 000059 9B 0A A 166 JR GE,_2_L_14 A 167 ; 33 { A 168 ; 34 PBOUT &=0xFB; A 169 .line 34 00005B 59FB0FD7 A 170 ANDX 4055,#251 A 171 ; 35 mot=mot-16; A 172 .line 35 00005F 06E1F0 A 173 ADD R1,#240 000062 16E0FF A 174 ADC R0,#255 A 175 ; 36 } 000065 A 176 _2_L_14: A 177 .line 36 A 178 ; 37 if(mot>= 25) A 179 .line 37 000065 A6E119 A 180 CP R1,#25 000068 1FA6E000 A 181 CPC R0,#-0 00006C 1B 0A A 182 JR LT,_2_L_15 A 183 ; 38 { A 184 ; 39 PBOUT &=0xF7; A 185 .line 39 00006E 59F70FD7 A 186 ANDX 4055,#247 A 187 ; 40 mot=mot-24; A 188 .line 40 000072 06E1E8 A 189 ADD R1,#232 000075 16E0FF A 190 ADC R0,#255 A 191 ; 41 } 000078 A 192 _2_L_15: A 193 .line 41 A 194 ; 42 A 195 ; 43 //merge command and motor number A 196 ; 44 motcom=mot; A 197 .line 44 000078 E4E1E0 A 198 LD R0,R1 A 199 ; 45 motcom <<=4; // transfer to high nibble A 200 .line 45 00007B 56E00F A 201 AND R0,#15 00007E F0E0 A 202 SWAP R0 A 203 ; 46 motcom &= 0xF0; A 204 .line 46 000080 56E0F0 A 205 AND R0,#240 A 206 ; 47 motcom = motcom | com; // add command A 207 .line 47 000083 881E07 A 208 LDX R1,7(RR14) Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 5 PC Object I Line Source servo.src 000086 4201 A 209 OR R0,R1 000088 B0E2 A 210 CLR R2 00008A 3C01 A 211 LD R3,#1 A 212 ; 48 A 213 ; 49 for(i=1;i<9;++i) A 214 .line 49 00008C 8B 39 A 215 JR _2_L_21 00008E A 216 _2_L_19: A 217 ; 50 { A 218 ; 51 if((param & 0x01)==1) A 219 .line 51 00008E 881E09 A 220 LDX R1,9(RR14) 000091 66E101 A 221 TCM R1,#1 000094 EB 06 A 222 JR NE,_2_L_17 A 223 ; 52 PDOUT |= 0x01; A 224 .line 52 000096 49010FDF A 225 ORX 4063,#1 A 226 ; 53 else A 227 .line 53 00009A 8B 04 A 228 JR _2_L_18 00009C A 229 _2_L_17: A 230 ; 54 PDOUT &= 0xFE; A 231 .line 54 00009C 59FE0FDF A 232 ANDX 4063,#254 0000A0 A 233 _2_L_18: A 234 ; 55 param >>=1; A 235 .line 55 0000A0 881E08 A 236 LDX R1,8(RR14) 0000A3 884E09 A 237 LDX R4,9(RR14) 0000A6 D0E1 A 238 SRA R1 0000A8 C0E4 A 239 RRC R4 0000AA 89E108 A 240 LDX 8(RR14),R1 0000AD 89E409 A 241 LDX 9(RR14),R4 A 242 ; 56 clockin(); A 243 .line 56 0000B0 89E0FF A 244 LDX -1(RR14),R0 0000B3 89E2FE A 245 LDX -2(RR14),R2 0000B6 89E3FD A 246 LDX -3(RR14),R3 0000B9 D6 0000 A 247 CALL _clockin 0000BC 883EFD A 248 LDX R3,-3(RR14) 0000BF 882EFE A 249 LDX R2,-2(RR14) 0000C2 880EFF A 250 LDX R0,-1(RR14) A 251 ; 57 A 252 ; 58 } A 253 .line 58 0000C5 A0E2 A 254 INCW RR2 0000C7 A 255 _2_L_21: A 256 .line 49 0000C7 A6E309 A 257 CP R3,#9 0000CA 1FA6E200 A 258 CPC R2,#-0 0000CE 1B BE A 259 JR LT,_2_L_19 0000D0 B0E2 A 260 CLR R2 Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 6 PC Object I Line Source servo.src 0000D2 3C01 A 261 LD R3,#1 A 262 ; 59 A 263 ; 60 for(i=1;i<9;++i) A 264 .line 60 0000D4 8B 28 A 265 JR _2_L_27 0000D6 A 266 _2_L_25: A 267 ; 61 { A 268 ; 62 if((motcom &0x01)==0x01) A 269 .line 62 0000D6 66E001 A 270 TCM R0,#1 0000D9 EB 06 A 271 JR NE,_2_L_23 A 272 ; 63 PDOUT |= 0x01; A 273 .line 63 0000DB 49010FDF A 274 ORX 4063,#1 A 275 ; 64 else A 276 .line 64 0000DF 8B 04 A 277 JR _2_L_24 0000E1 A 278 _2_L_23: A 279 ; 65 PDOUT &= 0xFE; A 280 .line 65 0000E1 59FE0FDF A 281 ANDX 4063,#254 0000E5 A 282 _2_L_24: A 283 ; 66 A 284 ; 67 motcom >>=1; A 285 .line 67 0000E5 D0E0 A 286 SRA R0 A 287 ; 68 clockin(); A 288 .line 68 0000E7 89E0FF A 289 LDX -1(RR14),R0 0000EA 89E2FE A 290 LDX -2(RR14),R2 0000ED 89E3FD A 291 LDX -3(RR14),R3 0000F0 D6 0000 A 292 CALL _clockin 0000F3 883EFD A 293 LDX R3,-3(RR14) 0000F6 882EFE A 294 LDX R2,-2(RR14) 0000F9 880EFF A 295 LDX R0,-1(RR14) A 296 ; 69 } A 297 .line 69 0000FC A0E2 A 298 INCW RR2 0000FE A 299 _2_L_27: A 300 .line 60 0000FE A6E309 A 301 CP R3,#9 000101 1FA6E200 A 302 CPC R2,#-0 000105 1B CF A 303 JR LT,_2_L_25 A 304 ; 70 A 305 ; 71 PBOUT |= 0x0F; A 306 .line 71 000107 490F0FD7 A 307 ORX 4055,#15 A 308 ; 72 } A 309 .line 72 00010B D6 0000 A 310 CALL __b_framereset 00010E AF A 311 RET A 312 .endfunc "servo_out",72,"_servo_out" Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 7 PC Object I Line Source servo.src A 313 SEGMENT ROM_DATA A 314 A 315 A 316 ;**************************** _move *************************** A 317 ;Name Addr/Register Size Type A 318 ;speed R15+8 1 parameter A 319 ;pos R15+6 1 parameter A 320 ;mot R15+4 1 parameter A 321 A 322 A 323 ; Aggregate Stack Size: 0 (words) A 324 A 325 A 326 .FRAME _n_move,?_n_move,RDATA A 327 .FCALL _n_servo_out A 328 .FRAME _f_move,?_f_move,EDATA A 329 .FCALL _f_servo_out A 330 SEGMENT servo_TEXT 00010F A 331 _move: A 332 .define "_move" A 333 .value _move A 334 .class 2 A 335 .type 65 A 336 .type 0 A 337 .endef A 338 .begfunc "move",77,"_move" A 339 .define "mot" A 340 .class 9 A 341 .value 4 A 342 .type 3 A 343 .type 0 A 344 .endef A 345 .define "pos" A 346 .class 17 A 347 .reg -1 A 348 .type 3 A 349 .type 0 A 350 .endef A 351 .define "speed" A 352 .class 17 A 353 .reg -1 A 354 .type 3 A 355 .type 0 A 356 .endef 00010F D6 0000 A 357 CALL __b_frameset00 A 358 ; 73 A 359 ; 74 //// move to position //// A 360 ; 75 A 361 ; 76 void move(int mot,int pos,int speed) A 362 ; 77 { A 363 ; 78 speed=speed+128; //speed 129 minimum A 364 .line 78 Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 8 PC Object I Line Source servo.src 000112 881E08 A 365 LDX R1,8(RR14) 000115 880E09 A 366 LDX R0,9(RR14) 000118 06E080 A 367 ADD R0,#128 00011B 16E100 A 368 ADC R1,#0 00011E 89E108 A 369 LDX 8(RR14),R1 000121 89E009 A 370 LDX 9(RR14),R0 A 371 ; 79 A 372 ; 80 pos=(pos*100/90)+150; // convert to degrees A 373 .line 80 000124 B0E2 A 374 CLR R2 000126 3C64 A 375 LD R3,#100 000128 880E06 A 376 LDX R0,6(RR14) 00012B 881E07 A 377 LDX R1,7(RR14) 00012E D6 0000 A 378 CALL __b_swmul 000131 E4E2E0 A 379 LD R0,R2 000134 E4E3E1 A 380 LD R1,R3 000137 B0E2 A 381 CLR R2 000139 3C5A A 382 LD R3,#90 00013B D6 0000 A 383 CALL __b_swdiv 00013E B0E3 A 384 CLR R3 000140 2C96 A 385 LD R2,#150 000142 0221 A 386 ADD R2,R1 000144 1230 A 387 ADC R3,R0 000146 89E306 A 388 LDX 6(RR14),R3 000149 89E207 A 389 LDX 7(RR14),R2 A 390 ; 81 A 391 ; 82 servo_out(mot,2,pos); A 392 .line 82 00014C 880E06 A 393 LDX R0,6(RR14) 00014F 881E07 A 394 LDX R1,7(RR14) 000152 70E1 A 395 PUSH R1 000154 70E0 A 396 PUSH R0 000156 B0E0 A 397 CLR R0 000158 1C02 A 398 LD R1,#2 00015A 70E1 A 399 PUSH R1 00015C 70E0 A 400 PUSH R0 00015E 880E04 A 401 LDX R0,4(RR14) 000161 881E05 A 402 LDX R1,5(RR14) 000164 70E1 A 403 PUSH R1 000166 70E0 A 404 PUSH R0 000168 D6 0015 A 405 CALL _servo_out 00016B 50E0 A 406 POP R0 00016D 50E0 A 407 POP R0 00016F 50E0 A 408 POP R0 000171 50E0 A 409 POP R0 000173 50E0 A 410 POP R0 000175 50E0 A 411 POP R0 A 412 ; 83 servo_out(mot,1,speed); A 413 .line 83 000177 880E08 A 414 LDX R0,8(RR14) 00017A 881E09 A 415 LDX R1,9(RR14) 00017D 70E1 A 416 PUSH R1 Zilog Z8 Encore! Macro Assembler Version 2.50 (08031703) 13-Oct-08 14:30:23 page: 9 PC Object I Line Source servo.src 00017F 70E0 A 417 PUSH R0 000181 B0E0 A 418 CLR R0 000183 1C01 A 419 LD R1,#1 000185 70E1 A 420 PUSH R1 000187 70E0 A 421 PUSH R0 000189 880E04 A 422 LDX R0,4(RR14) 00018C 881E05 A 423 LDX R1,5(RR14) 00018F 70E1 A 424 PUSH R1 000191 70E0 A 425 PUSH R0 000193 D6 0015 A 426 CALL _servo_out 000196 50E0 A 427 POP R0 000198 50E0 A 428 POP R0 00019A 50E0 A 429 POP R0 00019C 50E0 A 430 POP R0 00019E 50E0 A 431 POP R0 0001A0 50E0 A 432 POP R0 A 433 ; 84 } A 434 .line 84 0001A2 D6 0000 A 435 CALL __b_framereset 0001A5 AF A 436 RET A 437 .endfunc "move",84,"_move" A 438 XREF __b_swdiv:ROM A 439 XREF __b_swmul:ROM A 440 XREF __b_framereset:ROM A 441 XREF __b_frameset0:ROM A 442 XREF __b_frameset00:ROM A 443 XDEF _move A 444 XDEF _servo_out A 445 XDEF _clockin A 446 END Errors: 0 Warnings: 0 Lines Assembled: 447