home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / cmossave / cmosput.asm < prev    next >
Assembly Source File  |  1987-05-17  |  4KB  |  99 lines

  1.            PAGE    ,132  ; (CTRL-OH)   IBM PC PRINTER CONDENSED MODE
  2.            TITLE   CMOSPUT - WRITE CMOS DATA CREATED BY CMOSGET BACK TO CMOS MEMORY
  3. ;                            SYNTAX = CMOSPUT < CMOS.DAT
  4. CSEG       SEGMENT PARA PUBLIC 'CODE'
  5.            ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG ;ALREADY SET BY DOS LOADER
  6.  
  7.            ORG  100H                    ;COM FILE FORMAT, SKIP TO END OF THE PSP
  8.  
  9. CMOS_ADR   EQU  70H                     ;ADDRESS PORT OF CMOS
  10. CMOS_DATA  EQU  71H                     ;DATA PORT OF CMOS
  11. NUM_BYTES  EQU  64                      ;NUMBER OF BYTES IN CMOS
  12.  
  13. MAIN       PROC NEAR
  14.  
  15.            MOV  CX,NUM_BYTES            ;NUMBER OF CMOS BYTES
  16.  
  17. GET_NEXT_BYTE:
  18.  
  19.            MOV  AH,7                    ;KEYBOARD INPUT W/O ECHO
  20.            INT  21H                     ;  THRU DOS
  21.            MOV  AH,AL                   ;SAVE BYTE IN AH
  22.  
  23.            MOV  AL,NUM_BYTES            ;CALCULATE
  24.            SUB  AL,CL                   ;          BYTE TO FETCH
  25.            CLI                          ;NO INTERRUPTS
  26.            OUT  CMOS_ADR,AL             ;ASK FOR THIS BYTE
  27.            JMP  SHORT $+2               ;DELAY FOR SLOW OUTPUT PORTS
  28.            MOV  AL,AH                   ;GET SAVED BYTE IN AH
  29.            OUT  CMOS_DATA,AL            ;SAY THIS BYTE IS COMING
  30.            STI                          ;ALLOW INTERRUPTS
  31.            LOOP GET_NEXT_BYTE           ;REPEAT UNTIL DONE
  32.  
  33. ;          UPDATE TIME AND DATE.  dOS GIVES VALUES IN HEX.  CMOS STORES DATA
  34. ;          IN BCD.  PERFORM THE TRANSFORMATION AND UPDATE CMOS WITH A BIOS CALL.
  35.  
  36.            MOV  AH,2CH                  ;GET TIME FN
  37.            INT  21H                     ;  THRU DOS
  38.  
  39.            CALL HEX2BCD                 ;CONVERT CH,CL,DH,DL TO BCD
  40.  
  41.            MOV  AH,3                    ;SET REALTIME CLOCK FN
  42.            MOV  DL,0                    ;0=NORMAL TIME
  43.            INT  1AH                     ;  THRU AT BIOS
  44.  
  45.            MOV  AH,2AH                  ;GET DATE FN
  46.            INT  21H                     ;  THRU DOS
  47.  
  48.            MOV  AX,CX                   ;CONVERT YEAR TO
  49.            MOV  CL,100                  ;  CENTURY:YEAR FORMAT
  50.            DIV  CL                      ;AH=YEAR, AL=CENTURY
  51.            XCHG AH,CL                   ;FIX ORDER
  52.  
  53.            MOV  CX,AX                   ;PREPARE FOR CONVERSION
  54.  
  55.            CALL HEX2BCD                 ;TRANSFORM CX, DX TO BCD
  56.  
  57.            MOV  AH,5                    ;SET REALTIME DATE FN
  58.            INT  1AH                     ;  THRU AT BIOS
  59.  
  60.            RET                             ;NEAR RETURN TO DOS
  61. MAIN       ENDP
  62.  
  63. ; CONVERT CH,CL,DH,DL FROM HEX TO BCD REPRESENTATION
  64.  
  65. HEX2BCD    PROC NEAR
  66.  
  67.            PUSH CX                      ;SAVE REGISTER ON STACK
  68.            MOV AX,DX                    ;CONVERT DX FIRST
  69.            CALL HB_1                    ;PERFORM 1ST CONVERSION
  70.            MOV DX,AX                    ;RETURN TO DX
  71.            POP AX                       ;GET 2ND ARG FROM STACK
  72.  
  73. HB_1:
  74.  
  75.            MOV  CX,0AH                  ;SET CH=0, CL=A (10)
  76.            XCHG AH,CH                   ;SET AH=0, SAVE HIGH BYTE
  77.            DIV  CL                      ;QUOTIENT IN AL, REM IN AH
  78.            MOV  CL,4
  79.            SHL  AL,CL                   ;CONVERT TO BCD
  80.  
  81.            OR   AL,AH                   ;  AND COMBINE
  82.            XCHG AL,CH                   ;SAVE
  83.  
  84.            XOR  AH,AH                   ;ZERO NUMERATOR HIGH BYTE
  85.            MOV  CL,0AH                  ;
  86.            DIV  CL                      ;DIVIDE BY 10
  87.            MOV  CL,4
  88.            SHL  AL,CL                   ;CONVERT TO BCD
  89.  
  90.            OR   AH,AL                   ;
  91.            MOV  AL,CH                   ;FULL RESULT IN AX
  92.            MOV  CX,AX                   ;  AND CX
  93.  
  94.            RET
  95. HEX2BCD    ENDP
  96.  
  97. CSEG       ENDS
  98.            END  MAIN
  99.