Pengguna:ArdWar/digiclock

code_seg segment
assume cs:code_seg,ds:code_seg,ss:code_seg
org 100h
;PA0   = Start/Reset timer
;PA1   = Delay set
;PC0   = Servo ctrl
;PB0-7 = Minute indicator

start:
    mov al,98h                    ;A=IN B=OUT
    out 03h,al                    ;
    mov ax,02h
    push ax
    mov dx,02h
inp:
    call debounce
    in ax,00h                    ;pool port A                          14
    cmp ax,02h                    ;00000010
    je hlds
    cmp ax,01h
    je hldr
    jmp inp
hlds:
    call debounce
    in ax,00h                    ;pool port A
    cmp ax,02h                    ;PA0 = start
    je hlds                        ;repeat hold
    add cx,60d
    pop ax
    shl ax,1
    out 02h,ax
    push ax
rlss:
    call debounce
    in ax,00h                    ;pool port A
    cmp ax,00h                    ;release
    jne rlss                    ;wait for PA0 release
    jmp inp
hldr:
    call debounce
    in ax,00h                    ;pool port A
    cmp ax,01h                    ;PA0 = start
    je hldr                        ;repeat hold
    add cx,60d
rlsr:
    call debounce
    in ax,00h                    ;pool port A
    cmp ax,00h                    ;release
    jne rlsr                    ;wait for PA0 release
timer:
    push cx
    mov cx,60d
    onemin:
        push cx                    ;store second timer                             15
        mov cx,50d                    ;                                                4
        onesec:                        ;1s PC0 indicator
            push cx                ;                                                15
            mov cx,1948d            ;9,75u x 1948 =  18,993m                         4            
            lowspace:                ;19ms servo space                                39            9,75u
                in ax,00h            ;pool port A                                    14
                cmp ax,01h            ;reset                                             4
                je inp                ;jump if reset                                     4
                loop lowspace        ;loop 1688x                                        17
            mov al,01h                ;toggle servo hi                                 4
            out dx,al                ;PC0 high                                        14
            mov cx,102d              ;mark timer                                      4
            lowmark:                ;1ms servo mark                                 39
                in ax,00h            ;pool port A
                cmp ax,01h            ;reset
                je inp                ;jump if reset
                loop lowmark        ;loop 1ms
            mov al,00h                ;toggle servo low
            out dx,al                ;PC0 low
            pop cx                    ;return second timer
            loop onesec
        pop cx
        mov al,cl
        and al,0001b
        out 01h,al
        loop onemin
    pop cx
    pop ax
    shr ax,1
    out 01h,ax
    push ax
    loop timer                    ;loopback servo ctr
endtimer:
    mov cx,1846d                ;loop 18ms
    highspace:
        in ax,00h                ;pool port A
        cmp ax,01h                ;reset
        je rlss
    loop highspace
    mov al,01h                    ;toggle servo high
    out dx,al                    ;port B high
    mov cx,205d                ;loop 2ms
    highmark:
        in ax,00h                ;pool port A
        cmp ax,01h                ;reset
        je rlss
    loop highmark
    mov al,00h                    ;toggle servo low
    out dx,al                    ;port B low
    jmp endtimer

debounce proc near
    push cx
    mov cx,0ffffh
    del:
    loop del
    pop cx
    ret
debounce endp
org 20f0h
db 0eah
dw 100h
dw 0fdf0h
code_seg ends
end start