jmp Main fst: db 0, 0, 0, 0 dU: db 0, 0, 0, 0 dD: db 0, 0, 0, 0 dC: db 0, 0, 0, 0 flr: db 0, 0, 0, 0 len: db 0, 0, 0, 0 run: // 1 - down, 2 - up db 0, 0, 0, 0 nextLen: db 0, 0, 0, 0 gofst: db 0, 0, 0, 0 //port1(in) - up button //port2(in) - down button //port3(out) - screen //port4(out) - length //port4(in) - default lenght //port5(in) - floor step //port5(out) - indicator //port3(in) - call button Wait://Delay(MS) mov ecx, eax CWait: idle dec ecx cmp ecx, 0 jg CWait ret SetIndicator: //0 - blue, 1 - green, 2 - red mul eax, 8 push ecx //save ecx mov ecx, eax //eax = ecx xor eax, eax //clean all eax bits mov eax, 255 bshl eax, ecx // eax = eax << ecx pop ecx //restore ecx mov port5, eax ret Main: //Set initial state of program cmp #fst, 0 jg next mov #run, 0 mov #fst, 1 mov #dU, 0 mov #dD, 0 mov #dC, 0 mov #gofst, 0 mov #flr, 1 mov #len, port4 mov #nextLen, port4 mov eax, 1 call SetIndicator next: //Up button interception cmp #gofst, 1 je skip3 cmp port1, 1 jne skip1 cmp port1, #dU je skip1; cmp #flr, 10 jge skip1 inc #flr mov port3, #flr add #nextLen, port5 mov #run, 1 jmp skip3 skip1://Down button interception cmp port2, 1 jne skip2 cmp port2, #dD je skip2 cmp #flr, 1 jle skip2 dec #flr mov port3, #flr sub #nextLen, port5 mov #run, 2 jmp skip3 skip2: cmp port3, 1 jne skip3 cmp port3, #dC je skip3 cmp #flr, 1 jle skip3 mov #gofst, 1 jmp skip3 skip3://checking, is lift running cmp #gofst, 1 jne not_fst cmp #flr, 1 je skip dec #flr mov port3, #flr sub #nextLen, port5 mov #run, 2 not_fst: cmp #run, 0 je skip go_elev: mov eax, 2 call SetIndicator elevate://choosing direction(1-up, 2-down) mov eax, 5 call Wait //delay for 5 ms cmp #run, 1 je up cmp #run, 2 je down up: cmp #len, #nextLen jge endelev add #len, 3 mov port4, #len jmp elevate down: cmp #len, #nextLen jle endelev sub #len, 3 mov port4, #len jmp elevate endelev: mov eax, 1 call SetIndicator mov #run, 0 skip://Backuping old values cmp #flr, 1 jne C mov #gofst, 0 C: push port1 push port2 push port3 pop #dC pop #dD pop #dU jmp Main
Comments