home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / mslang / as / clock.asm < prev    next >
Assembly Source File  |  1985-02-28  |  4KB  |  139 lines

  1.  
  2. CGROUP     GROUP VECTOR,CODESEG
  3. VECTOR     SEGMENT AT 0H
  4.      DB    6CH DUP(?)        ;FILLER
  5. TIME_LO  DW    ?            ;DOS TIME
  6. TIME_HI  DW    ?            ;DOS TIME
  7. VEC_IP     DW                ;CLOCK UPDATE VECTOR IP
  8. VEC_CS     DW                ;CLOCK UPDATE VECTOR CS
  9. VECTOR     ENDS
  10.  
  11. CODESEG  SEGMENT PARA
  12.      ASSUME CS:CODESEG,DS:CGROUP
  13.      ORG   100H
  14. CLK     PROC  FAR
  15.      JMP   SETUP            ;ATTACH TO DOS
  16. INTRPT     LABEL DWORD
  17. INT_IP     DW    0            ;OLD UPDATE VECTOR IP
  18. INT_CS     DW    0            ;OLD UPDATE VECROR CS
  19. TICKS     DW    0            ;TICK COUNTER
  20. SCR_OFF  DB    0,0            ;SCREEN OFFSET IN BUFFER
  21. CRT_PORT DW    0            ;SCREEN STATUS PORT
  22. flag     db    0
  23. TIME     DB    8 DUP(':',0BH)       ;TIME SAVE AREA
  24. CLK_INT  LABEL NEAR
  25.      PUSH  AX            ;SAVE REGISTERS
  26.      PUSH  CX
  27.      PUSH  DI
  28.      PUSH  SI
  29.      PUSH  DS
  30.      PUSH  ES
  31.      PUSHF                ; AND FLAGS
  32.      CALL  CS:[INTRPT]        ;DO OLD UPDATE INTERRUPT
  33.      MOV   CX,0040H         ;GET SEGMENT OF DOS TABLE
  34.      MOV   DS,CX            ;PUT IN DS
  35.      MOV   CX,CS:TICKS        ;GET TICK COUNT
  36.      INC   CX            ;INCREMENT IT
  37.      CMP   CX,20        ;01F4H           ;HAS A MINUTE GONE BY?
  38.      JB    NO_MINUTE        ;NO, MOVE ON
  39.      CALL  UPDATE            ;YES, UPDATE CLOCK AND
  40.      MOV   CX,0            ; RESET TICK COUNTER
  41. NO_MINUTE:
  42.      MOV   CS:TICKS,CX        ;SAVE UPDATED TICK COUNT
  43.      MOV   CX,0B000H        ;GET VIDEO SEGMENT
  44.      MOV   ES,CX            ;PUT IN ES
  45.      MOV   DX,CS:CRT_PORT        ;GET CRT STATUS PORT ADDR
  46.      MOV   DI,WORD PTR CS:SCR_OFF  ;GET SCREEN BUFFER OFFSET
  47.      LEA   SI,CS:TIME        ;GET DOS TIME
  48.      MOV   CX,16            ;SET UP TO MOVE 10 BYTES
  49.      CLI                ;DISABLE OTHER INTERRUPTS
  50. WAIT1:     IN    AL,DX            ;READ CRT STATUS
  51.      TEST  AL,1            ;CHECK FOR VERTICAL RETRACE
  52.      JNZ   WAIT1            ;WAIT FOR RETRACE LOW
  53.      MOV   AH,CS:[SI]        ;GET FIRST BYTE TO MOVE
  54. WAIT2:     IN    AL,DX            ;GET CRT STATUS
  55.      TEST  AL,1            ;CHECK FOR VERTICAL RETRACE
  56.      JZ    WAIT2            ;WAIT FOR RETRACE HIGH
  57.      MOV   ES:[DI],AH        ;MOVE BYTE TO SCREEN
  58.      INC   DI            ;INCREMENT INDEX
  59.      INC   SI
  60.      LOOP  WAIT1            ;MOVE NEXT BYTE
  61.      STI                ;ENABLE INTERRUPTS
  62.      POP   ES            ;RESTORE REGISTERS
  63.      POP   DS
  64.      POP   SI
  65.      POP   DI
  66.      POP   CX
  67.      POP   AX
  68.      IRET                ;RETURN FROM INTERRUPT
  69. CLK     ENDP
  70. UPDATE     PROC  NEAR
  71.      PUSH  AX            ;SAVE REGISTERS
  72.      PUSH  BX
  73.      PUSH  CX
  74.      PUSH  DX
  75.      PUSH  DS
  76.      MOV   AX,0040H         ;GET ADDRESS OF DOS TABLE
  77.      MOV   DS,AX            ;PUT IN DS
  78.      MOV   AX,TIME_HI        ;GET HIGH BYTE OF DOS TIME
  79.      mov   flag,0            ;am flag
  80. HOUR:     CMP   AX,0CH            ;CONVERT TO HOURS
  81.      JLE   H1
  82.      mov   flag,1            ;set to pm
  83.      SUB   AX,0CH
  84.      JMP   HOUR
  85. H1:     AAM                ;CONVERT TO ASCII
  86.      ADD   AX,3030H
  87.      LEA   BX,CS:TIME        ;GET ADDRESS OF TIME AREA
  88.      MOV   CS:[BX],AH        ;SAVE HOURS FIRST DIGIT
  89.      MOV   CS:[BX+2],AL        ;SAVE HOURS SECOND DIGIT
  90.      MOV   AX,TIME_LO        ;GET DOS TIME LOW BYTE
  91.      MOV   CX,8H            ;CONVERT TO MINUTES
  92.      SHR   AX,CL
  93.      MOV   DX,3CH
  94.      MUL   DL
  95.      SHR   AX,CL
  96.      AAM                ;CONVERT TO ASCII
  97.      ADD   AX,3030H
  98.      MOV   CS:[BX+6],AH        ;SAVE MINUTES FIRST DIGIT
  99.      MOV   CS:[BX+8],AL        ;SAVE MINUTES SECOND DIGIT
  100.      mov   byte ptr cs:[bx+12],'a'
  101.      cmp   flag,0            ;is it am?
  102.      jz    goahead
  103.      mov   byte ptr cs:[bx+12],'p'
  104. goahead:
  105.      mov   byte ptr cs:[bx+14],'m'
  106.      POP   DS            ;RESTORE REGISTERS
  107.      POP   DX
  108.      POP   CX
  109.      POP   BX
  110.      POP   AX
  111.      RET
  112. UPDATE     ENDP
  113. SETUP:     MOV   AX,0            ;GET ADDRESS OF VECTOR TABLE
  114.      MOV   DS,AX            ;PUT IN DS
  115.      CLI                ;DISABLE FURTHER INTERRUPTS
  116.      MOV   AX,[VEC_IP]        ;GET ADDRESS OF OLD UPDATE IP
  117.      MOV   CS:[INT_IP],AX        ;SAVE IT
  118.      MOV   AX,[VEC_CS]        ;GET ADDRESS OF OLD UPDATE CS
  119.      MOV   CS:[INT_CS],AX        ;SAVE IT
  120.      MOV   VEC_IP,OFFSET CLK_INT ;PUT ADDRESS OF CLK IN VECTOR IP
  121.      MOV   VEC_CS,CS        ;PUT CS OF CLK IN VECTOR CS
  122.      STI                ;ENABLE INTERRUPTS
  123.      MOV   AH,0FH            ;READ VIDEO STATUS
  124.      INT   10H
  125.      SUB   AH,8            ;SUBTRACT 8 CHAR TIME FROM NCOLS
  126.      SHL   AH,1            ;MULTIPLY BY 2 FOR ATTRIBUTE
  127.      MOV   CS:SCR_OFF,AH        ;SAVE SCREEN TIME LOCATION
  128.      MOV   WORD PTR CS:CRT_PORT,03BAH  ;SAVE MONO STATUS PORT ADDR
  129.      TEST  AL,4            ;CHECK FOR COLOR MONITOR
  130.      JNZ   MONO            ;IF MONO, MOVE ON
  131.      ADD   WORD PTR CS:SCR_OFF,8000H   ;ADD COLOR OFFSET TO TIME OFFSET
  132.      MOV   WORD PTR CS:CRT_PORT,03DAH  ;SAVE COLOR STATUS PORT ADDR
  133. MONO:     CALL  UPDATE            ;DO FIRST UPDATE & PRINT TIME
  134.      MOV   DX,OFFSET SETUP        ;GET END ADDRESS OF NEW INTERRUPT
  135.      INT   27H            ;TERMINATE AND REMAIN RESIDENT
  136.      DB    117 DUP(0)        ;FILLER
  137. CODESEG  ENDS
  138.      END   CLK
  139.